pax_global_header00006660000000000000000000000064137435012050014512gustar00rootroot0000000000000052 comment=f97f6e933a4ee3cf00b4e1ba4e3a1f05bc9de165 faad2-2_10_0/000077500000000000000000000000001374350120500127115ustar00rootroot00000000000000faad2-2_10_0/.gitignore000066400000000000000000000003031374350120500146750ustar00rootroot00000000000000*.o *.so *.a *.ncb *.plg *.aps *.opt *.aac *.wav *.lo *.in Makefile *.libs *.deps *.la project/msvc/.vs/ project/msvc/bin/ project/msvc/intermediate/ libfaad/win32_ver.h *.user /libfaad/faad2.pc faad2-2_10_0/AUTHORS000066400000000000000000000004701374350120500137620ustar00rootroot00000000000000 M. Bakker (mbakker(at)nero.com) - complete library Alexander Kurpiers (a.kurpiers(at)nt.tu-darmstadt.de) - HCR code - DRM stuff - lot's of bug fixes Volker Fischer (v.fischer(at)nt.tu-darmstadt.de) - DRM code - lot's of bug fixes Gian-Carlo Pascutto (gpascutto(at)nero.com) - DRM PS code - bugfixes faad2-2_10_0/COPYING000066400000000000000000000435401374350120500137520ustar00rootroot00000000000000 Any non-GPL usage of this software or parts of this software is strictly forbidden. Commercial non-GPL licensing of this software is possible. For more info contact Ahead Software through Mpeg4AAClicense@nero.com. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. faad2-2_10_0/ChangeLog000066400000000000000000000071321374350120500144660ustar00rootroot000000000000002.10.0: [ tatsuz ] * updated Visual Studio projects to VS 2019 (#54) [ Fabian Greffrath ] * mp4read.c: fix stack-buffer-overflow in stringin()/ftypin() * fix heap-buffer-overflow in mp4read.c [ Clayton Smith ] * Remove non-ASCII characters * Remove trailing whitespace [ Andrew Wesie ] * Check return value of ltp_data. * Restrict SBR frame length to 960 and 1024 samples. * Support object type 29. * Support implicit SBR signaling in frontend. * Fix PNS decoding when only right channel is noise. * Initialize element_id array with an invalid id. * Fix NULL pointer dereferences. * Fix infinite loop in adts_parse. * Fix infinite loop in huffman_getescape. * Check for error after each channel decode. * Check for inconsistent number of channels. 2.9.2: [ Michał Janiszewski ] * Only use x86-assembly when explicitly on x86 * Use unsigned integers correctly * Initialize pointers that might otherwise not be [ Fabian Greffrath ] * update README esp. WRT directory structure [ Rosen Penev ] * fix compilation without SBR/PS_DEC (#48) * fix compilation with LC_ONLY_DECODER (#47) [ Fabian Greffrath ] * fix "inline function 'cfftf1' declared but never defined" compiler warning * fix some inconsistencies in the frontend output * mp4read_open: add check for failed frame buffer allocation * stszin: add check for allocation error and integer overflow * add a pkg-config file [ Stefan Pöschel ] * frontend: address compile warning + add missing LF (#50) [ François Cartegnie ] * library name is faad (#52) * Unbreak PS audio (#51) 2.9.1: [ Fabian Greffrath ] * Include stdio.h in libfaad/ps_dec.c for stderr (Michael Fink) * Fix Tille -> Title typo in frontend/mp4read.c (Alexander Thomas) 2.9.0: [ Krzysztof Nikiel ] * Build system fixes and code clean-up [ LoRd_MuldeR ] * Fix compiler warnings and code indentation * Fix compilation with GCC <= 4.7.3 * MSVC solution file clean-up [ Cameron Cawley ] * Fix compilation with GCC 4.7.4 * Fix compilation with MinGW [ Michael Fink ] * MSVC 2017 project file update [ Hugo Lefeuvre ] * Fix crash with unsupported MP4 files (NULL pointer dereference, division by zero) * CVE-2019-6956: ps_dec: sanitize iid_index before mixing * CVE-2018-20196: sbr_fbt: sanitize sbr->M (should not exceed MAX_M) * CVE-2018-20199, CVE-2018-20360: specrec: better handle unexpected parametric stereo (PS) * CVE-2018-20362, CVE-2018-19504, CVE-2018-20195, CVE-2018-20198, CVE-2018-20358: syntax.c: check for syntax element inconsistencies * CVE-2018-20194, CVE-2018-19503, CVE-2018-20197, CVE-2018-20357, CVE-2018-20359, CVE-2018-20361: sbr_hfadj: sanitize frequency band borders [ Hugo Beauzée-Luyssen ] * CVE-2019-15296, CVE-2018-19502: Fix a couple buffer overflows [ Filip Roséen ] * Prevent crash on SCE followed by CPE [ Gianfranco Costamagna ] * Fix linking with GCC 9 and "-Wl,--as-needed" [ Fabian Greffrath ] * Enable the frontend to be built reproducibly 2.8.8: 2.8.7: - MSVC build fixes - fixed a coulple bugs 2.8.6: 2.8.5: - another package fix 2.8.4: - minor fix to released packages 2.8.3 - better autotools support 2.8.2 - PNS bug fixed - New MP4 input module - NeAACDecGetVersion: new api function to get version and copyright strings 2.8.1: - seeking support for MP4 files 2.8.0: - patches and fixed bugs 2009-02-02 - Version 2.7 * DAB+ support * Use public headers internally to prevent duplicate declarations * Explicitly typedef all types as signed * Made sure MAIN prediction can't be started after the first frame * Lot's of compilation issues solved * Bugfix in SBR envelope border calculation faad2-2_10_0/Makefile.am000066400000000000000000000003021374350120500147400ustar00rootroot00000000000000SUBDIRS = libfaad frontend plugins EXTRA_DIST = faad2.spec docs/libfaad.3 project utils rpm: Makefile make dist $(RPMBUILD) -ta $(PACKAGE)-$(VERSION).tar.gz rm $(PACKAGE)-$(VERSION).tar.gz faad2-2_10_0/NEWS000066400000000000000000000001431374350120500134060ustar00rootroot00000000000000 6 February 2004 - FAAD2 version 2.0 released 25 July 2003 - Release version with SBR decoding faad2-2_10_0/README000066400000000000000000000053021374350120500135710ustar00rootroot00000000000000 Freeware Advanced Audio (AAC) Decoder including SBR decoding http://www.audiocoding.com/ FAAD2 is a HE, LC, MAIN and LTP profile, MPEG2 and MPEG-4 AAC decoder. FAAD2 includes code for SBR (HE AAC) decoding. FAAD2 is licensed under the GPL. __________ COPYRIGHTS For FAAD2 the following license applies: ****************************************************************************** ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ****************************************************************************** Please note that the use of this software may require the payment of patent royalties. You need to consider this issue before you start building derivative works. We are not warranting or indemnifying you in any way for patent royalities! YOU ARE SOLELY RESPONSIBLE FOR YOUR OWN ACTIONS! ___________________ DIRECTORY STRUCTURE faad2 - top level directory. aacDECdrop - windows decoder/player with drag'n'drop functionality. docs - API documentation. frontend - command line frontend to the FAAD2 library, also supports MPEG-4 file decoding. include - inlude file for the FAAD2 library. libfaad - the FAAD2 AAC decoder library including SBR. codebook - Huffman codebooks. plugins - plugins for all kinds of pograms. mpeg4ip - plugin for the mpeg4ip player. QCD - Quintessential player AAC plugin. QCDMp4 - Quintessential player MP4 plugin. xmms - xmms AAC plugin. project/msvc - Visual Studio 2017 project files. utils/win32 - generate "win32_ver.h" from "configure.h". faad2-2_10_0/README.linux000066400000000000000000000006631374350120500147340ustar00rootroot00000000000000To compile under Linux. ---------------------- just run : ./configure --with-mp4v2 make sudo make install about the xmms plugin. --------------------- The xmms plugin need to be build after the install of the faad project. so after you have installed correctly faad (--with-xmms options) you need to configure and build the xmms plugin part in the plugins/xmms directory. Read the README and INSTALL files into the xmms directory. faad2-2_10_0/TODO000066400000000000000000000000171374350120500133770ustar00rootroot00000000000000 - Not much... faad2-2_10_0/aacDECdrop/000077500000000000000000000000001374350120500146365ustar00rootroot00000000000000faad2-2_10_0/aacDECdrop/Script.rc000066400000000000000000000167471374350120500164470ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "winres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Bitmap // IDB_TF01 BITMAP "resource/AAC01.bmp" IDB_TF02 BITMAP "resource/AAC02.bmp" IDB_TF03 BITMAP "resource/AAC03.bmp" IDB_TF04 BITMAP "resource/AAC04.bmp" IDB_TF05 BITMAP "resource/AAC05.bmp" IDB_TF06 BITMAP "resource/AAC06.bmp" IDB_TF07 BITMAP "resource/AAC07.bmp" IDB_TF08 BITMAP "resource/AAC08.bmp" #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""winres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Menu // IDR_MENU1 MENU BEGIN POPUP "Menu" BEGIN MENUITEM "&Decoder Options", IDM_VOLUME MENUITEM "&Stop Decoding", IDM_STOP_DEC MENUITEM "&About", IDM_ABOUT MENUITEM SEPARATOR MENUITEM "&Errors to Log File", IDM_LOGERR MENUITEM "&Always on Top", IDM_ONTOP MENUITEM SEPARATOR MENUITEM "E&xit\tAlt+F4", IDM_QUIT END MENUITEM SEPARATOR END ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_ICON1 ICON "resource/AAC01.ico" ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_VOLUME DIALOGEX 0, 0, 255, 257 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Decoder Options V1.2" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN GROUPBOX "Decoding Settings",IDC_STATIC,7,7,241,23 CONTROL "Playback",IDC_PLAYBACK,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,17,55,10 CONTROL "Decode to File",IDC_DECODE,"Button",BS_AUTORADIOBUTTON, 125,17,65,10 GROUPBOX "Output Format Settings",IDC_STATIC,7,31,241,50 CONTROL "Microsoft WAV",IDC_WAV,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,45,65,10 CONTROL "Apple/SGI AIFF",IDC_AIFF,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,125,45,65,10 CONTROL "Sun/NeXT AU",IDC_SUNAU,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,15,60,65,10 CONTROL "DEC AU",IDC_DECAU,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,125,60,65,10 GROUPBOX "Output Sample Format Settings",IDC_STATIC,7,82,241,91 CONTROL "16 bit PCM",IDC_16BIT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,15,96,65,10 CONTROL "24 bit PCM",IDC_24BIT,"Button",BS_AUTORADIOBUTTON,125, 96,65,10 CONTROL "32 bit PCM",IDC_32BIT,"Button",BS_AUTORADIOBUTTON,15, 111,65,10 CONTROL "32 bit floats",IDC_FLOATS,"Button",BS_AUTORADIOBUTTON, 125,111,65,10 CONTROL "16 bit PCM - Dithered",IDC_16BIT_DITHER,"Button", BS_AUTORADIOBUTTON,15,126,83,10 CONTROL "16 bit PCM - Dithered with",IDC_16BIT_L_SHAPE,"Button", BS_AUTORADIOBUTTON,125,126,98,10 CONTROL "16 bit PCM - Dithered with",IDC_16BIT_M_SHAPE,"Button", BS_AUTORADIOBUTTON,15,146,98,10 CONTROL "16 bit PCM - Dithered with",IDC_16BIT_H_SHAPE,"Button", BS_AUTORADIOBUTTON,125,146,98,10 LTEXT "LIGHT Noise Shaping",IDC_STATIC,138,136,70,8 LTEXT "HEAVY Noise Shaping",IDC_STATIC,138,156,73,8 LTEXT "MEDIUM Noise Shaping",IDC_STATIC,28,156,78,8 GROUPBOX "Object Type Settings",IDC_STATIC,7,174,241,50 CONTROL "Main",IDC_MAIN,"Button",BS_AUTORADIOBUTTON | WS_GROUP, 15,188,65,10 CONTROL "Low Complexity",IDC_LC,"Button",BS_AUTORADIOBUTTON,125, 188,65,10 CONTROL "Long Term Prediction",IDC_LTP,"Button", BS_AUTORADIOBUTTON,15,203,85,10 CONTROL "Low Delay",IDC_LD,"Button",BS_AUTORADIOBUTTON,125,203, 65,10 DEFPUSHBUTTON "Accept",IDC_BUTTON1,102,233,50,16 END IDD_ABOUT DIALOGEX 0, 0, 255, 194 STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About aacDECdrop V1.22" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN GROUPBOX "",IDC_STATIC,7,5,241,157 CTEXT "A decoder to decode/playback aac/Mpeg4 files.", IDC_STATIC,70,13,155,8 CTEXT "Copyright 2002 John Edwards.",IDC_STATIC,70,30,97,8 CTEXT "Utilises standard libfaad2 from Menno Bakker.", IDC_STATIC,70,46,145,8 LTEXT "This program is free software; you can redistribute it and/or modify it", IDC_STATIC,13,62,212,8 LTEXT "under the terms of the GNU Public Licence as published by the Free", IDC_STATIC,13,72,215,8 LTEXT "Software Foundation; either version 2 of the Licence, or (at your option)", IDC_STATIC,13,82,224,8 LTEXT "any later version.",IDC_STATIC,13,92,54,8 LTEXT "This program is distributed in the hope that it will be useful, but", IDC_STATIC,13,112,195,8 LTEXT "WITHOUT ANY WARRANTY; without even the implied warranty of", IDC_STATIC,13,122,213,8 LTEXT "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.", IDC_STATIC,13,132,218,8 LTEXT "See the GNU General Public Licence for more details.", IDC_STATIC,13,142,170,8 DEFPUSHBUTTON "OK",IDC_BUTTON6,102,171,50,16 CONTROL 112,IDC_STATIC,"Static",SS_BITMAP | SS_SUNKEN,12,13,43, 40 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_VOLUME, DIALOG BEGIN BOTTOMMARGIN, 256 END END #endif // APSTUDIO_INVOKED #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED faad2-2_10_0/aacDECdrop/aacDECdrop/000077500000000000000000000000001374350120500165635ustar00rootroot00000000000000faad2-2_10_0/aacDECdrop/aacDECdrop/aacDECdrop.sln000066400000000000000000000035101374350120500212250ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 9.00 # Visual C++ Express 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aacDECdrop", "aacDECdrop.vcproj", "{C23A88D7-4997-4026-BBDB-5B0B2B22FDFF}" ProjectSection(ProjectDependencies) = postProject {F470BB4A-7675-4D6A-B310-41F33AC6F987} = {F470BB4A-7675-4D6A-B310-41F33AC6F987} {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} = {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\..\libfaad\libfaad.vcproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mp4ff", "..\..\common\mp4ff\mp4ff.vcproj", "{F470BB4A-7675-4D6A-B310-41F33AC6F987}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {C23A88D7-4997-4026-BBDB-5B0B2B22FDFF}.Debug|Win32.ActiveCfg = Debug|Win32 {C23A88D7-4997-4026-BBDB-5B0B2B22FDFF}.Debug|Win32.Build.0 = Debug|Win32 {C23A88D7-4997-4026-BBDB-5B0B2B22FDFF}.Release|Win32.ActiveCfg = Release|Win32 {C23A88D7-4997-4026-BBDB-5B0B2B22FDFF}.Release|Win32.Build.0 = Release|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|Win32.ActiveCfg = Debug|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|Win32.ActiveCfg = Release|Win32 {F470BB4A-7675-4D6A-B310-41F33AC6F987}.Debug|Win32.ActiveCfg = Debug|Win32 {F470BB4A-7675-4D6A-B310-41F33AC6F987}.Debug|Win32.Build.0 = Debug|Win32 {F470BB4A-7675-4D6A-B310-41F33AC6F987}.Release|Win32.ActiveCfg = Release|Win32 {F470BB4A-7675-4D6A-B310-41F33AC6F987}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal faad2-2_10_0/aacDECdrop/aacDECdrop/aacDECdrop.vcproj000066400000000000000000000155711374350120500217460ustar00rootroot00000000000000 faad2-2_10_0/aacDECdrop/audio.c000066400000000000000000000350571374350120500161150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: audio.c,v 1.11 2004/02/06 10:23:27 menno Exp $ **/ #ifdef _WIN32 #include #endif #include #include #include #include #include #include "audio.h" audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask) { audio_file *aufile = malloc(sizeof(audio_file)); aufile->outputFormat = outputFormat; aufile->samplerate = samplerate; aufile->channels = channels; aufile->total_samples = 0; aufile->fileType = fileType; aufile->channelMask = channelMask; switch (outputFormat) { case FAAD_FMT_16BIT: aufile->bits_per_sample = 16; break; case FAAD_FMT_24BIT: aufile->bits_per_sample = 24; break; case FAAD_FMT_32BIT: case FAAD_FMT_FLOAT: aufile->bits_per_sample = 32; break; default: if (aufile) free(aufile); return NULL; } if(infile[0] == '-') { #ifdef _WIN32 setmode(fileno(stdout), O_BINARY); #endif aufile->sndfile = stdout; } else { aufile->sndfile = fopen(infile, "wb"); } if (aufile->sndfile == NULL) { if (aufile) free(aufile); return NULL; } if (aufile->fileType == OUTPUT_WAV) { if (aufile->channelMask) write_wav_extensible_header(aufile, aufile->channelMask); else write_wav_header(aufile); } return aufile; } int write_audio_file(audio_file *aufile, void *sample_buffer, int samples, int offset) { char *buf = (char *)sample_buffer; switch (aufile->outputFormat) { case FAAD_FMT_16BIT: return write_audio_16bit(aufile, buf + offset*2, samples); case FAAD_FMT_24BIT: return write_audio_24bit(aufile, buf + offset*4, samples); case FAAD_FMT_32BIT: return write_audio_32bit(aufile, buf + offset*4, samples); case FAAD_FMT_FLOAT: return write_audio_float(aufile, buf + offset*4, samples); default: return 0; } return 0; } void close_audio_file(audio_file *aufile) { if (aufile->fileType == OUTPUT_WAV) { fseek(aufile->sndfile, 0, SEEK_SET); if (aufile->channelMask) write_wav_extensible_header(aufile, aufile->channelMask); else write_wav_header(aufile); } fclose(aufile->sndfile); if (aufile) free(aufile); } static int write_wav_header(audio_file *aufile) { unsigned char header[44]; unsigned char* p = header; unsigned int bytes = (aufile->bits_per_sample + 7) / 8; float data_size = (float)bytes * aufile->total_samples; unsigned long word32; *p++ = 'R'; *p++ = 'I'; *p++ = 'F'; *p++ = 'F'; word32 = (data_size + (44 - 8) < (float)MAXWAVESIZE) ? (unsigned long)data_size + (44 - 8) : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); *p++ = 'W'; *p++ = 'A'; *p++ = 'V'; *p++ = 'E'; *p++ = 'f'; *p++ = 'm'; *p++ = 't'; *p++ = ' '; *p++ = 0x10; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; if (aufile->outputFormat == FAAD_FMT_FLOAT) { *p++ = 0x03; *p++ = 0x00; } else { *p++ = 0x01; *p++ = 0x00; } *p++ = (unsigned char)(aufile->channels >> 0); *p++ = (unsigned char)(aufile->channels >> 8); word32 = (unsigned long)(aufile->samplerate + 0.5); *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = aufile->samplerate * bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); *p++ = 'd'; *p++ = 'a'; *p++ = 't'; *p++ = 'a'; word32 = data_size < MAXWAVESIZE ? (unsigned long)data_size : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); return fwrite(header, sizeof(header), 1, aufile->sndfile); } static int write_wav_extensible_header(audio_file *aufile, long channelMask) { unsigned char header[68]; unsigned char* p = header; unsigned int bytes = (aufile->bits_per_sample + 7) / 8; float data_size = (float)bytes * aufile->total_samples; unsigned long word32; *p++ = 'R'; *p++ = 'I'; *p++ = 'F'; *p++ = 'F'; word32 = (data_size + (68 - 8) < (float)MAXWAVESIZE) ? (unsigned long)data_size + (68 - 8) : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); *p++ = 'W'; *p++ = 'A'; *p++ = 'V'; *p++ = 'E'; *p++ = 'f'; *p++ = 'm'; *p++ = 't'; *p++ = ' '; *p++ = /*0x10*/0x28; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; /* WAVE_FORMAT_EXTENSIBLE */ *p++ = 0xFE; *p++ = 0xFF; *p++ = (unsigned char)(aufile->channels >> 0); *p++ = (unsigned char)(aufile->channels >> 8); word32 = (unsigned long)(aufile->samplerate + 0.5); *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = aufile->samplerate * bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); /* cbSize */ *p++ = (unsigned char)(22); *p++ = (unsigned char)(0); /* WAVEFORMATEXTENSIBLE */ /* wValidBitsPerSample */ *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); /* dwChannelMask */ word32 = channelMask; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); /* SubFormat */ if (aufile->outputFormat == FAAD_FMT_FLOAT) { /* KSDATAFORMAT_SUBTYPE_IEEE_FLOAT: 00000003-0000-0010-8000-00aa00389b71 */ *p++ = 0x03; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x10; *p++ = 0x00; *p++ = 0x80; *p++ = 0x00; *p++ = 0x00; *p++ = 0xaa; *p++ = 0x00; *p++ = 0x38; *p++ = 0x9b; *p++ = 0x71; } else { /* KSDATAFORMAT_SUBTYPE_PCM: 00000001-0000-0010-8000-00aa00389b71 */ *p++ = 0x01; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x10; *p++ = 0x00; *p++ = 0x80; *p++ = 0x00; *p++ = 0x00; *p++ = 0xaa; *p++ = 0x00; *p++ = 0x38; *p++ = 0x9b; *p++ = 0x71; } /* end WAVEFORMATEXTENSIBLE */ *p++ = 'd'; *p++ = 'a'; *p++ = 't'; *p++ = 'a'; word32 = data_size < MAXWAVESIZE ? (unsigned long)data_size : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); return fwrite(header, sizeof(header), 1, aufile->sndfile); } static int write_audio_16bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; short *sample_buffer16 = (short*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { short r1, r2, r3, r4, r5, r6; r1 = sample_buffer16[i]; r2 = sample_buffer16[i+1]; r3 = sample_buffer16[i+2]; r4 = sample_buffer16[i+3]; r5 = sample_buffer16[i+4]; r6 = sample_buffer16[i+5]; sample_buffer16[i] = r2; sample_buffer16[i+1] = r3; sample_buffer16[i+2] = r1; sample_buffer16[i+3] = r6; sample_buffer16[i+4] = r4; sample_buffer16[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*2] = (char)(sample_buffer16[i] & 0xFF); data[i*2+1] = (char)((sample_buffer16[i] >> 8) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static int write_audio_24bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; long *sample_buffer24 = (long*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { long r1, r2, r3, r4, r5, r6; r1 = sample_buffer24[i]; r2 = sample_buffer24[i+1]; r3 = sample_buffer24[i+2]; r4 = sample_buffer24[i+3]; r5 = sample_buffer24[i+4]; r6 = sample_buffer24[i+5]; sample_buffer24[i] = r2; sample_buffer24[i+1] = r3; sample_buffer24[i+2] = r1; sample_buffer24[i+3] = r6; sample_buffer24[i+4] = r4; sample_buffer24[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*3] = (char)(sample_buffer24[i] & 0xFF); data[i*3+1] = (char)((sample_buffer24[i] >> 8) & 0xFF); data[i*3+2] = (char)((sample_buffer24[i] >> 16) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static int write_audio_32bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; long *sample_buffer32 = (long*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { long r1, r2, r3, r4, r5, r6; r1 = sample_buffer32[i]; r2 = sample_buffer32[i+1]; r3 = sample_buffer32[i+2]; r4 = sample_buffer32[i+3]; r5 = sample_buffer32[i+4]; r6 = sample_buffer32[i+5]; sample_buffer32[i] = r2; sample_buffer32[i+1] = r3; sample_buffer32[i+2] = r1; sample_buffer32[i+3] = r6; sample_buffer32[i+4] = r4; sample_buffer32[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*4] = (char)(sample_buffer32[i] & 0xFF); data[i*4+1] = (char)((sample_buffer32[i] >> 8) & 0xFF); data[i*4+2] = (char)((sample_buffer32[i] >> 16) & 0xFF); data[i*4+3] = (char)((sample_buffer32[i] >> 24) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static int write_audio_float(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; float *sample_buffer_f = (float*)sample_buffer; unsigned char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { float r1, r2, r3, r4, r5, r6; r1 = sample_buffer_f[i]; r2 = sample_buffer_f[i+1]; r3 = sample_buffer_f[i+2]; r4 = sample_buffer_f[i+3]; r5 = sample_buffer_f[i+4]; r6 = sample_buffer_f[i+5]; sample_buffer_f[i] = r2; sample_buffer_f[i+1] = r3; sample_buffer_f[i+2] = r1; sample_buffer_f[i+3] = r6; sample_buffer_f[i+4] = r4; sample_buffer_f[i+5] = r5; } } for (i = 0; i < samples; i++) { int exponent, mantissa, negative = 0 ; float in = sample_buffer_f[i]; data[i*4] = 0; data[i*4+1] = 0; data[i*4+2] = 0; data[i*4+3] = 0; if (in == 0.0) continue; if (in < 0.0) { in *= -1.0; negative = 1; } in = (float)frexp(in, &exponent); exponent += 126; in *= (float)0x1000000; mantissa = (((int)in) & 0x7FFFFF); if (negative) data[i*4+3] |= 0x80; if (exponent & 0x01) data[i*4+2] |= 0x80; data[i*4] = mantissa & 0xFF; data[i*4+1] = (mantissa >> 8) & 0xFF; data[i*4+2] |= (mantissa >> 16) & 0x7F; data[i*4+3] |= (exponent >> 1) & 0x7F; } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } faad2-2_10_0/aacDECdrop/audio.h000066400000000000000000000047231374350120500161160ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: audio.h,v 1.9 2004/02/06 10:23:27 menno Exp $ **/ #ifndef AUDIO_H_INCLUDED #define AUDIO_H_INCLUDED #ifdef __cplusplus extern "C" { #endif #define MAXWAVESIZE 4294967040LU #define OUTPUT_WAV 1 #define OUTPUT_RAW 2 typedef struct { int outputFormat; FILE *sndfile; unsigned int fileType; unsigned long samplerate; unsigned int bits_per_sample; unsigned int channels; unsigned long total_samples; long channelMask; } audio_file; audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask); int write_audio_file(audio_file *aufile, void *sample_buffer, int samples, int offset); void close_audio_file(audio_file *aufile); static int write_wav_header(audio_file *aufile); static int write_wav_extensible_header(audio_file *aufile, long channelMask); static int write_audio_16bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static int write_audio_24bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static int write_audio_32bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static int write_audio_float(audio_file *aufile, void *sample_buffer, unsigned int samples); #ifdef __cplusplus } #endif #endif faad2-2_10_0/aacDECdrop/decode.c000066400000000000000000000347531374350120500162410ustar00rootroot00000000000000/* ** FAAD - Freeware Advanced Audio Decoder ** Copyright (C) 2002 M. Bakker ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** $Id: decode.c,v 1.16 2004/04/03 19:08:37 menno Exp $ ** $Id: decode.c,v 1.16 2004/04/03 19:08:37 menno Exp $ **/ #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #define off_t __int64 #else #include #endif #include #include #include #include #include "audio.h" #include "decode.h" #include "misc.h" #include "wave_out.h" #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) #endif #define MAX_CHANNELS 8 /* make this higher to support files with more channels */ /* FAAD file buffering routines */ /* declare buffering variables */ #define DEC_BUFF_VARS \ int fileread, bytesconsumed, k; \ int buffercount = 0, buffer_index = 0; \ unsigned char *buffer; \ unsigned int bytes_in_buffer = 0; /* initialise buffering */ #define INIT_BUFF(file) \ fseek(file, 0, SEEK_END); \ fileread = ftell(file); \ fseek(file, 0, SEEK_SET); \ buffer = (unsigned char*)malloc(FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \ memset(buffer, 0, FAAD_MIN_STREAMSIZE*MAX_CHANNELS); \ bytes_in_buffer = fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, file); /* skip bytes in buffer */ #define UPDATE_BUFF_SKIP(bytes) \ fseek(infile, bytes, SEEK_SET); \ buffer_index += bytes; \ buffercount = 0; \ bytes_in_buffer = fread(buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, infile); /* update buffer */ #define UPDATE_BUFF_READ \ if (bytesconsumed > 0) { \ for (k = 0; k < (FAAD_MIN_STREAMSIZE*MAX_CHANNELS - bytesconsumed); k++) \ buffer[k] = buffer[k + bytesconsumed]; \ bytes_in_buffer += fread(buffer + (FAAD_MIN_STREAMSIZE*MAX_CHANNELS) - bytesconsumed, 1, bytesconsumed, infile); \ bytesconsumed = 0; \ } /* update buffer indices after NeAACDecDecode */ #define UPDATE_BUFF_IDX(frame) \ bytesconsumed += frame.bytesconsumed; \ buffer_index += frame.bytesconsumed; \ bytes_in_buffer -= frame.bytesconsumed; /* true if decoding has to stop because of EOF */ #define IS_FILE_END buffer_index >= fileread /* end buffering */ #define END_BUFF if (buffer) free(buffer); /* globals */ char *progName; extern int stop_decoding; int id3v2_tag(unsigned char *buffer) { if (strncmp(buffer, "ID3", 3) == 0) { unsigned long tagsize; /* high bit is not used */ tagsize = (buffer[6] << 21) | (buffer[7] << 14) | (buffer[8] << 7) | (buffer[9] << 0); tagsize += 10; return tagsize; } else { return 0; } } char *file_ext[] = { NULL, ".wav", ".aif", ".au", ".au", NULL }; /* MicroSoft channel definitions */ #define SPEAKER_FRONT_LEFT 0x1 #define SPEAKER_FRONT_RIGHT 0x2 #define SPEAKER_FRONT_CENTER 0x4 #define SPEAKER_LOW_FREQUENCY 0x8 #define SPEAKER_BACK_LEFT 0x10 #define SPEAKER_BACK_RIGHT 0x20 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 #define SPEAKER_BACK_CENTER 0x100 #define SPEAKER_SIDE_LEFT 0x200 #define SPEAKER_SIDE_RIGHT 0x400 #define SPEAKER_TOP_CENTER 0x800 #define SPEAKER_TOP_FRONT_LEFT 0x1000 #define SPEAKER_TOP_FRONT_CENTER 0x2000 #define SPEAKER_TOP_FRONT_RIGHT 0x4000 #define SPEAKER_TOP_BACK_LEFT 0x8000 #define SPEAKER_TOP_BACK_CENTER 0x10000 #define SPEAKER_TOP_BACK_RIGHT 0x20000 #define SPEAKER_RESERVED 0x80000000 long aacChannelConfig2wavexChannelMask(NeAACDecFrameInfo *hInfo) { if (hInfo->channels == 6 && hInfo->num_lfe_channels) { return SPEAKER_FRONT_LEFT + SPEAKER_FRONT_RIGHT + SPEAKER_FRONT_CENTER + SPEAKER_LOW_FREQUENCY + SPEAKER_BACK_LEFT + SPEAKER_BACK_RIGHT; } else { return 0; } } int decodeAACfile(char *sndfile, int def_srate, aac_dec_opt *opt) { int tagsize; unsigned long samplerate; unsigned char channels; void *sample_buffer; FILE *infile; audio_file *aufile; NeAACDecHandle hDecoder; NeAACDecFrameInfo frameInfo; NeAACDecConfigurationPtr config; int first_time = 1; /* declare variables for buffering */ DEC_BUFF_VARS infile = fopen(opt->filename, "rb"); if (infile == NULL) { /* unable to open file */ error_handler("Error opening file: %s\n", opt->filename); return 1; } INIT_BUFF(infile) tagsize = id3v2_tag(buffer); if (tagsize) { UPDATE_BUFF_SKIP(tagsize) } hDecoder = NeAACDecOpen(); /* Set the default object type and samplerate */ /* This is useful for RAW AAC files */ config = NeAACDecGetCurrentConfiguration(hDecoder); if (def_srate) config->defSampleRate = def_srate; config->defObjectType = opt->object_type; config->outputFormat = opt->output_format; NeAACDecSetConfiguration(hDecoder, config); if ((bytesconsumed = NeAACDecInit(hDecoder, buffer, bytes_in_buffer, &samplerate, &channels)) < 0) { /* If some error initializing occured, skip the file */ error_handler("Error initializing decoder library.\n"); END_BUFF NeAACDecClose(hDecoder); fclose(infile); return 1; } buffer_index += bytesconsumed; do { /* update buffer */ UPDATE_BUFF_READ sample_buffer = NeAACDecDecode(hDecoder, &frameInfo, buffer, bytes_in_buffer); /* update buffer indices */ UPDATE_BUFF_IDX(frameInfo) if (frameInfo.error > 0) { error_handler("Error: %s\n", NeAACDecGetErrorMessage(frameInfo.error)); } opt->progress_update((long)fileread, buffer_index); /* open the sound file now that the number of channels are known */ if (first_time && !frameInfo.error) { if(opt->decode_mode == 0) { if (Set_WIN_Params (INVALID_FILEDESC, samplerate, SAMPLE_SIZE, frameInfo.channels) < 0) { error_handler("\nCan't access %s\n", "WAVE OUT"); END_BUFF NeAACDecClose(hDecoder); fclose(infile); return (0); } } else { aufile = open_audio_file(sndfile, samplerate, frameInfo.channels, opt->output_format, opt->file_type, aacChannelConfig2wavexChannelMask(&frameInfo)); if (aufile == NULL) { END_BUFF NeAACDecClose(hDecoder); fclose(infile); return 0; } } first_time = 0; } if ((frameInfo.error == 0) && (frameInfo.samples > 0)) { if(opt->decode_mode == 0) WIN_Play_Samples((short*)sample_buffer, frameInfo.channels*frameInfo.samples); else write_audio_file(aufile, sample_buffer, frameInfo.samples, 0); } if (buffer_index >= fileread) sample_buffer = NULL; /* to make sure it stops now */ if(stop_decoding) break; } while (sample_buffer != NULL); NeAACDecClose(hDecoder); fclose(infile); if(opt->decode_mode == 0) WIN_Audio_close(); else { if (!first_time) close_audio_file(aufile); } END_BUFF return frameInfo.error; } int GetAACTrack(mp4ff_t *infile) { /* find AAC track */ int i, rc; int numTracks = mp4ff_total_tracks(infile); for (i = 0; i < numTracks; i++) { unsigned char *buff = NULL; int buff_size = 0; mp4AudioSpecificConfig mp4ASC; mp4ff_get_decoder_config(infile, i, &buff, &buff_size); if (buff) { rc = NeAACDecAudioSpecificConfig(buff, buff_size, &mp4ASC); free(buff); if (rc < 0) continue; return i; } } /* can't decode this */ return -1; } unsigned long srates[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; uint32_t read_callback(void *user_data, void *buffer, uint32_t length) { return fread(buffer, 1, length, (FILE*)user_data); } uint32_t seek_callback(void *user_data, uint64_t position) { return fseek((FILE*)user_data, position, SEEK_SET); } int decodeMP4file(char *sndfile, aac_dec_opt *opt) { int track; unsigned long samplerate; unsigned char channels; void *sample_buffer; mp4ff_t *infile; FILE *mp4File; int sampleId, numSamples; audio_file *aufile; NeAACDecHandle hDecoder; NeAACDecFrameInfo frameInfo; unsigned char *buffer; int buffer_size; int first_time = 1; /* initialise the callback structure */ mp4ff_callback_t *mp4cb = malloc(sizeof(mp4ff_callback_t)); mp4File = fopen(opt->filename, "rb"); mp4cb->read = read_callback; mp4cb->seek = seek_callback; mp4cb->user_data = mp4File; infile = mp4ff_open_read(mp4cb); if (!infile) { /* unable to open file */ error_handler("Error opening file: %s\n", opt->filename); return 1; } if ((track = GetAACTrack(infile)) < 0) { error_handler("Unable to find correct AAC sound track in the MP4 file.\n"); mp4ff_close(infile); free(mp4cb); fclose(mp4File); return 1; } buffer = NULL; buffer_size = 0; mp4ff_get_decoder_config(infile, track, &buffer, &buffer_size); hDecoder = NeAACDecOpen(); if(NeAACDecInit2(hDecoder, buffer, buffer_size, &samplerate, &channels) < 0) { /* If some error initializing occured, skip the file */ error_handler("Error initializing decoder library.\n"); NeAACDecClose(hDecoder); mp4ff_close(infile); free(mp4cb); fclose(mp4File); return 1; } if (buffer) free(buffer); numSamples = mp4ff_num_samples(infile, track); for (sampleId = 0; sampleId < numSamples; sampleId++) { int rc; /* get access unit from MP4 file */ buffer = NULL; buffer_size = 0; rc = mp4ff_read_sample(infile, track, sampleId, &buffer, &buffer_size); if (rc == 0) { error_handler("Reading from MP4 file failed.\n"); NeAACDecClose(hDecoder); mp4ff_close(infile); free(mp4cb); fclose(mp4File); return 1; } sample_buffer = NeAACDecDecode(hDecoder, &frameInfo, buffer, buffer_size); if (buffer) free(buffer); opt->progress_update((long)numSamples, sampleId); /* open the sound file now that the number of channels are known */ if (first_time && !frameInfo.error) { if(opt->decode_mode == 0) { if (Set_WIN_Params (INVALID_FILEDESC, samplerate, SAMPLE_SIZE, frameInfo.channels) < 0) { error_handler("\nCan't access %s\n", "WAVE OUT"); NeAACDecClose(hDecoder); mp4ff_close(infile); free(mp4cb); fclose(mp4File); return (0); } } else { aufile = open_audio_file(sndfile, samplerate, frameInfo.channels, opt->output_format, opt->file_type, aacChannelConfig2wavexChannelMask(&frameInfo)); if (aufile == NULL) { NeAACDecClose(hDecoder); mp4ff_close(infile); free(mp4cb); fclose(mp4File); return 0; } } first_time = 0; } if ((frameInfo.error == 0) && (frameInfo.samples > 0)) { if(opt->decode_mode == 0) WIN_Play_Samples((short*)sample_buffer, frameInfo.channels*frameInfo.samples); else write_audio_file(aufile, sample_buffer, frameInfo.samples, 0); } if (frameInfo.error > 0) { error_handler("Error: %s\n", NeAACDecGetErrorMessage(frameInfo.error)); break; } if(stop_decoding) break; } NeAACDecClose(hDecoder); mp4ff_close(infile); free(mp4cb); fclose(mp4File); if(opt->decode_mode == 0) WIN_Audio_close(); else { if (!first_time) close_audio_file(aufile); } return frameInfo.error; } int str_no_case_comp(char const *str1, char const *str2, unsigned long len) { signed int c1 = 0, c2 = 0; while (len--) { c1 = tolower(*str1++); c2 = tolower(*str2++); if (c1 == 0 || c1 != c2) break; } return c1 - c2; } int aac_decode(aac_dec_opt *opt) { int result; int def_srate = 0; int outfile_set = 0; int mp4file = 0; char *fnp; char audioFileName[MAX_PATH]; unsigned char header[8]; FILE *hMP4File; /* point to the specified file name */ strcpy(audioFileName, opt->filename); fnp = (char *)strrchr(audioFileName,'.'); if (fnp) fnp[0] = '\0'; strcat(audioFileName, file_ext[opt->file_type]); mp4file = 0; hMP4File = fopen(opt->filename, "rb"); if (!hMP4File) { return 1; } fread(header, 1, 8, hMP4File); fclose(hMP4File); if (header[4] == 'f' && header[5] == 't' && header[6] == 'y' && header[7] == 'p') mp4file = 1; if (mp4file) { result = decodeMP4file(audioFileName, opt); } else { result = decodeAACfile(audioFileName, def_srate, opt); } return 0; } faad2-2_10_0/aacDECdrop/decode.h000066400000000000000000000016471374350120500162420ustar00rootroot00000000000000/* * function: Header file for aacDECdrop * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards */ #ifndef __DECODE_H__ #define __DECODE_H__ #include typedef void (*progress_func)(long totalsamples, long samples); typedef void (*error_func)(char *errormessage); typedef struct { progress_func progress_update; error_func error; int decode_mode; int output_format; int file_type; int object_type; char *filename; } aac_dec_opt; int aac_decode(aac_dec_opt *opt); /* * Put this here for convenience */ typedef struct { char TitleFormat[32]; int window_x; int window_y; int always_on_top; int logerr; int decode_mode; int outputFormat; int fileType; int object_type; } SettingsAAC; /* * GLOBALS */ extern SettingsAAC iniSettings; #endif /* __DECODE_H__ */ faad2-2_10_0/aacDECdrop/decthread.c000066400000000000000000000063121374350120500167270ustar00rootroot00000000000000/* * function: Decoding thread for aacDECdrop * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards * * last mod: aacDecdrop decoder last updated 2002-03-14 */ #include #include #include #include "wave_out.h" #include "decode.h" #include "misc.h" extern int decoding_done; extern int animate; extern double file_complete; extern int totalfiles; extern int numfiles; int dec_mode; int outputFormat; int fileType; int object_type; extern char* fileName; int stop_decoding; typedef struct enclist_tag { char *filename; struct enclist_tag *next; } enclist_t; enclist_t *head = NULL; CRITICAL_SECTION mutex; DWORD WINAPI decode_thread(LPVOID arg); void decthread_init(void) { int thread_id; HANDLE thand; numfiles = 0; totalfiles = 0; file_complete = 0.0; InitializeCriticalSection(&mutex); thand = CreateThread(NULL, 0, decode_thread, NULL, 0, &thread_id); if (thand == NULL) { // something bad happened, might want to deal with that, maybe... } } void decthread_addfile(char *file) { char *filename; enclist_t *entry, *node; if (file == NULL) return; // create entry filename = strdup(file); entry = (enclist_t *)malloc(sizeof(enclist_t)); entry->filename = filename; entry->next = NULL; EnterCriticalSection(&mutex); // insert entry if (head == NULL) { head = entry; } else { node = head; while (node->next != NULL) node = node->next; node->next = entry; } numfiles++; totalfiles++; LeaveCriticalSection(&mutex); } /* * the caller is responsible for deleting the pointer */ char *_getfile() { char *filename; enclist_t *entry; EnterCriticalSection(&mutex); if (head == NULL) { LeaveCriticalSection(&mutex); return NULL; } // pop entry entry = head; head = head->next; filename = entry->filename; free(entry); LeaveCriticalSection(&mutex); return filename; } void decthread_set_decode_mode(int decode_mode) { dec_mode = decode_mode; } void decthread_set_outputFormat(int output_format) { outputFormat = output_format; } void decthread_set_fileType(int file_type) { fileType = file_type; } void decthread_set_object_type(int object_type) { object_type = object_type; } void _error(char *errormessage) { // do nothing } void _update(long total, long done) { file_complete = (double)done / (double)total; } DWORD WINAPI decode_thread(LPVOID arg) { char *in_file; while (!decoding_done) { while (in_file = _getfile()) { aac_dec_opt dec_opts; animate = 1; if(stop_decoding){ numfiles--; break; } set_filename(in_file); dec_opts.progress_update = _update; dec_opts.filename = in_file; dec_opts.decode_mode = dec_mode; dec_opts.output_format = outputFormat; dec_opts.file_type = fileType; dec_opts.object_type = object_type; fileName = in_file; aac_decode(&dec_opts); numfiles--; } /* Finished this file, loop around to next... */ file_complete = 0.0; animate = 0; totalfiles = 0; numfiles = 0; Sleep(500); } DeleteCriticalSection(&mutex); return 0; } /******************************** end of decthread.c ********************************/ faad2-2_10_0/aacDECdrop/decthread.h000066400000000000000000000010621374350120500167310ustar00rootroot00000000000000/* * function: Header file for decthread.c * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards */ #ifndef __DECTHREAD_H__ #define __DECTHREAD_H__ void decthread_init(void); void decthread_addfile(char *file); void decthread_set_decode_mode(int decode_mode); void decthread_set_outputFormat(int output_format); void decthread_set_fileType(int file_type); void decthread_set_object_type(int object_type); #endif /* __DECTHREAD_H__ */ faad2-2_10_0/aacDECdrop/main.c000066400000000000000000000471501374350120500157350ustar00rootroot00000000000000/* * function: Main control program for aacDECdrop * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards * * last mod: aacDECdrop decoder last updated 2002-03-14 */ #include #include #include #include #include #include "resource.h" #include "decthread.h" #include "decode.h" #include "misc.h" #define LOSHORT(l) ((SHORT)(l)) #define HISHORT(l) ((SHORT)(((DWORD)(l) >> 16) & 0xFFFF)) #define INI_FILE "aacDECdrop.ini" #define CREATEFONT(sz) \ CreateFont((sz), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ VARIABLE_PITCH | FF_SWISS, "") HANDLE event = NULL; int width = 130, height = 130; RECT bar1, bar2, vbrBR; int prog1 = 0, prog2 = 0; int moving = 0; POINT pt; HINSTANCE hinst; int frame = 0; HBITMAP hbm[12], temp; HMENU menu; int decoding_done = 0; int stop_decoding = 0; double file_complete; int totalfiles; int numfiles; HWND g_hwnd; HWND qcwnd; HFONT font2; char *fileName; SettingsAAC iniSettings; // iniSettings holds the parameters for the aacDECdrop configuration int animate = 0; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); BOOL CALLBACK QCProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) ; /* * Write the .ini file using the current aacDECdrop settings */ int WriteIniFile ( const char* Filename ) { FILE* fp; if ( (fp = fopen (Filename, "w")) == NULL ) return EOF; // could not open file fprintf (fp, "[aacDECdrop]\n"); fprintf (fp, "Window_X=%i\n" , iniSettings.window_x ); fprintf (fp, "Window_Y=%i\n" , iniSettings.window_y ); fprintf (fp, "Always_on_top=%i\n" , iniSettings.always_on_top); fprintf (fp, "Logerr=%i\n" , iniSettings.logerr ); fprintf (fp, "DecodeMode=%i\n" , iniSettings.decode_mode ); fprintf (fp, "OutputFormat=%i\n" , iniSettings.outputFormat ); fprintf (fp, "FileType=%i\n" , iniSettings.fileType ); fprintf (fp, "ObjectType=%i\n" , iniSettings.object_type ); return fclose (fp); } /* * Read the .ini file and set the aacDECdrop settings */ int ReadIniFile ( FILE* fp ) { char buff [256]; int val; rewind ( fp ); fgets ( buff, sizeof buff, fp ); if ( 0 != memcmp ( buff, "[aacDECdrop]", 12 ) ) return EOF; while ( fgets ( buff, sizeof buff, fp ) != NULL ) { if ( 1 == sscanf ( buff, "Window_X=%d" , &val ) ) iniSettings.window_x = val; else if ( 1 == sscanf ( buff, "Window_Y=%d" , &val ) ) iniSettings.window_y = val; else if ( 1 == sscanf ( buff, "Always_on_top=%d", &val ) ) iniSettings.always_on_top = val; else if ( 1 == sscanf ( buff, "Logerr=%d" , &val ) ) iniSettings.logerr = val; else if ( 1 == sscanf ( buff, "DecodeMode=%d" , &val ) ) iniSettings.decode_mode = val; else if ( 1 == sscanf ( buff, "OutputFormat=%d" , &val ) ) iniSettings.outputFormat = val; else if ( 1 == sscanf ( buff, "FileType=%d" , &val ) ) iniSettings.fileType = val; else if ( 1 == sscanf ( buff, "ObjectType=%d" , &val ) ) iniSettings.object_type = val; } return 0; } /* * Get aacDECdrop settings at startup, writes .ini file, if not present */ void GetAACdecSettings ( void ) { FILE* fp = NULL; char PathAndName [] = {INI_FILE}; // set default values iniSettings.window_x = 64; // default box position (x co-ord) iniSettings.window_y = 64; // default box position (y co-ord) iniSettings.always_on_top = 8; // default = on iniSettings.logerr = 0; // default = off iniSettings.decode_mode = 1; // default = 1 (decode to file) iniSettings.outputFormat = 1; // default = 1 (16 bit PCM) iniSettings.fileType = 1; // default = 1 (Microsoft WAV) iniSettings.object_type = 1; // default = 1 (Low Complexity) // Read INI_FILE if ( (fp = fopen (PathAndName, "r")) == NULL ) { // file does not exist: write it! WriteIniFile ( PathAndName ); } else { // file does exist: read it! ReadIniFile (fp); fclose (fp); } return; } void set_always_on_top(HWND hwnd, int v) { CheckMenuItem(menu, IDM_ONTOP, v ? MF_CHECKED : MF_UNCHECKED); SetWindowPos(hwnd, v ? HWND_TOPMOST : HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOMOVE); iniSettings.always_on_top = v; } void set_logerr(HWND hwnd, int v) { CheckMenuItem(menu, IDM_LOGERR, v ? MF_CHECKED : MF_UNCHECKED); iniSettings.logerr = v; set_use_dialogs(v); } void set_decode_mode(int v) { decthread_set_decode_mode(v); iniSettings.decode_mode = v; } void set_outputFormat(int v) { decthread_set_outputFormat(v); iniSettings.outputFormat = v; } void set_fileType(int v) { decthread_set_fileType(v); iniSettings.fileType = v; } void set_object_type(int v) { decthread_set_object_type(v); iniSettings.object_type = v; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { static char szAppName[] = "aacDECdrop"; HWND hwnd; MSG msg; WNDCLASS wndclass; const int width = 130; const int height = 130; int x; int y; hinst = hInstance; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON1)); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = szAppName; RegisterClass(&wndclass); GetAACdecSettings(); x = max(min(iniSettings.window_x, GetSystemMetrics(SM_CXSCREEN) - width), 0); y = max(min(iniSettings.window_y, GetSystemMetrics(SM_CYSCREEN) - height), 0); hwnd = CreateWindow(szAppName, "aacDECdrop", WS_POPUP | WS_DLGFRAME, x, y, width, height, NULL, NULL, hInstance, NULL); g_hwnd = hwnd; ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); font2 = CREATEFONT(10); SetTimer(hwnd, 1, 80, NULL); set_always_on_top(hwnd, iniSettings.always_on_top); set_logerr(hwnd, iniSettings.logerr); set_decode_mode(iniSettings.decode_mode); set_outputFormat(iniSettings.outputFormat); set_fileType(iniSettings.fileType); set_object_type(iniSettings.object_type); for (frame = 0; frame < 8; frame++) hbm[frame] = LoadImage(hinst, MAKEINTRESOURCE(IDB_TF01 + frame), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); frame = 0; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } for (frame = 0; frame < 8; frame++) DeleteObject(hbm[frame]); return msg.wParam; } void HandleDrag(HWND hwnd, HDROP hDrop) { int cFiles, i; char szFile[MAX_PATH]; char *ext; int flag = 0; cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); for (i = 0; i < cFiles; i++) { DragQueryFile(hDrop, i, szFile, sizeof(szFile)); if (ext = strrchr(szFile, '.')) { if (stricmp(ext, ".aac") == 0 || stricmp(ext, ".mp4") == 0 || stricmp(ext, ".m4a") == 0 || stricmp(ext, ".m4p") == 0) { flag = 1; decthread_addfile(szFile); stop_decoding = 0; } } } DragFinish(hDrop); if (flag) SetEvent(event); } LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc, hmem; static HDC offscreen; PAINTSTRUCT ps; RECT rect, rect2; BITMAP bm; POINT point; static POINT start; static int dragging = 0; HDC desktop; HBITMAP hbitmap; HANDLE hdrop; HFONT dfltFont; int dfltBGMode; double percomp; switch (message) { case WM_CREATE: menu = LoadMenu(hinst, MAKEINTRESOURCE(IDR_MENU1)); menu = GetSubMenu(menu, 0); offscreen = CreateCompatibleDC(NULL); desktop = GetDC(GetDesktopWindow()); hbitmap = CreateCompatibleBitmap(desktop, 200, 200); ReleaseDC(GetDesktopWindow(), desktop); SelectObject(offscreen, hbitmap); // Start the engines decthread_init(); // We accept drag&drop DragAcceptFiles(hwnd, TRUE); return 0; case WM_PAINT: hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &rect); width = rect.right + 1; height = rect.bottom + 1; FillRect(offscreen, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH)); DrawText(offscreen, "Drop Files Here", -1, &rect, DT_SINGLELINE | DT_CENTER); SetRect(&rect2, 0, height - 110, width, height - 25); DrawText(offscreen, "For Decoding", -1, &rect2, DT_SINGLELINE | DT_CENTER); hmem = CreateCompatibleDC(offscreen); SelectObject(hmem, hbm[frame]); GetObject(hbm[frame], sizeof(BITMAP), &bm); BitBlt(offscreen, width / 2 - 33, height / 2 - 31, bm.bmWidth, bm.bmHeight, hmem, 0, 0, SRCCOPY); DeleteDC(hmem); percomp = ((double)(totalfiles - numfiles) + 1 - (1 - file_complete)) / (double)totalfiles; SetRect(&vbrBR, 0, height - 35, width, height - 19); dfltBGMode = SetBkMode(offscreen, TRANSPARENT); dfltFont = SelectObject(offscreen, font2); SetRect(&bar1, 0, height - 23, (int)(file_complete * width), height - 13); SetRect(&bar2, 0, height - 12, (int)(percomp * width), height - 2); FillRect(offscreen, &bar1, (HBRUSH)GetStockObject(LTGRAY_BRUSH)); FillRect(offscreen, &bar2, (HBRUSH)GetStockObject(DKGRAY_BRUSH)); if (fileName) { char* sep; char fileCaption[80]; if ((sep = strrchr(fileName, '\\')) != 0) fileName = sep+1; (void) strcpy(fileCaption, " "); (void) strcat(fileCaption, fileName); DrawText(offscreen, fileCaption, -1, &bar1, DT_SINGLELINE | DT_LEFT); } SelectObject(offscreen, dfltFont); SetBkMode(offscreen, dfltBGMode); BitBlt(hdc, 0, 0, width, height, offscreen, 0, 0, SRCCOPY); EndPaint(hwnd, &ps); return DefWindowProc(hwnd, message, wParam, lParam); //return 0; case WM_TIMER: if (animate || frame) { frame++; if (frame > 7) frame -= 8; } else { frame = 0; } GetClientRect(hwnd, &rect); InvalidateRect(hwnd, &rect, FALSE); return 0; case WM_LBUTTONDOWN: start.x = LOWORD(lParam); start.y = HIWORD(lParam); ClientToScreen(hwnd, &start); GetWindowRect(hwnd, &rect); start.x -= rect.left; start.y -= rect.top; dragging = 1; SetCapture(hwnd); return 0; case WM_LBUTTONUP: if (dragging) { dragging = 0; ReleaseCapture(); } return 0; case WM_MOUSEMOVE: if (dragging) { point.x = LOSHORT(lParam); point.y = HISHORT(lParam); /* lParam can contain negative coordinates ! * point.x = LOWORD(lParam); * point.y = HIWORD(lParam); */ ClientToScreen(hwnd, &point); SetWindowPos(hwnd, 0, point.x - start.x, point.y - start.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_SHOWWINDOW); iniSettings.window_x = point.x - start.x; iniSettings.window_y = point.y - start.y; } return 0; case WM_CAPTURECHANGED: if (dragging) { dragging = 0; ReleaseCapture(); } return 0; case WM_RBUTTONUP: point.x = LOWORD(lParam); point.y = HIWORD(lParam); ClientToScreen(hwnd, &point); TrackPopupMenu(menu, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_QUIT: WriteIniFile(INI_FILE); decoding_done = 1; PostQuitMessage(0); break; case IDM_ONTOP: set_always_on_top(hwnd, ~GetMenuState(menu, LOWORD(wParam), MF_BYCOMMAND) & MF_CHECKED); break; case IDM_LOGERR: set_logerr(hwnd, ~GetMenuState(menu, LOWORD(wParam), MF_BYCOMMAND) & MF_CHECKED); break; case IDM_STOP_DEC: { int v = ~GetMenuState(menu, LOWORD(wParam), MF_BYCOMMAND) & MF_CHECKED; if(v == 8) stop_decoding = 1; break; } case IDM_VOLUME: { int value = DialogBox( hinst, MAKEINTRESOURCE(IDD_VOLUME), hwnd, QCProc); if (value == -2) break; break; } case IDM_ABOUT: { int value = DialogBox(hinst, MAKEINTRESOURCE(IDD_ABOUT), hwnd, QCProc); if (value == -7) break; break; } } // LOWORD(wParam) return 0; case WM_DROPFILES: hdrop = (HANDLE)wParam; HandleDrag(hwnd, hdrop); return 0; case WM_DESTROY: decoding_done = 1; PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam); } /* * Encode parameters dialog procedures. */ BOOL CALLBACK QCProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: if(iniSettings.decode_mode == 0) { CheckDlgButton(hwndDlg,IDC_PLAYBACK,TRUE); CheckDlgButton(hwndDlg,IDC_WAV,TRUE); if(iniSettings.outputFormat != 1 && iniSettings.outputFormat != 5 && iniSettings.outputFormat != 6 && iniSettings.outputFormat != 7 && iniSettings.outputFormat != 8) CheckDlgButton(hwndDlg,IDC_16BIT,TRUE); else if(iniSettings.outputFormat == 1) CheckDlgButton(hwndDlg,IDC_16BIT,TRUE); else if(iniSettings.outputFormat == 5) CheckDlgButton(hwndDlg,IDC_16BIT_DITHER,TRUE); else if(iniSettings.outputFormat == 6) CheckDlgButton(hwndDlg,IDC_16BIT_L_SHAPE,TRUE); else if(iniSettings.outputFormat == 7) CheckDlgButton(hwndDlg,IDC_16BIT_M_SHAPE,TRUE); else if(iniSettings.outputFormat == 8) CheckDlgButton(hwndDlg,IDC_16BIT_H_SHAPE,TRUE); CheckDlgButton(hwndDlg,IDC_WAV,TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_AIFF), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_SUNAU), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DECAU), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_24BIT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_32BIT), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_FLOATS), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_DITHER), TRUE); } else if(iniSettings.decode_mode == 1) { CheckDlgButton(hwndDlg,IDC_PLAYBACK,FALSE); if(iniSettings.outputFormat == 1) CheckDlgButton(hwndDlg,IDC_16BIT,TRUE); else if(iniSettings.outputFormat == 2) CheckDlgButton(hwndDlg,IDC_24BIT,TRUE); else if(iniSettings.outputFormat == 3) CheckDlgButton(hwndDlg,IDC_32BIT,TRUE); else if(iniSettings.outputFormat == 4) CheckDlgButton(hwndDlg,IDC_FLOATS,TRUE); else if(iniSettings.outputFormat == 5) CheckDlgButton(hwndDlg,IDC_16BIT_DITHER,TRUE); else if(iniSettings.outputFormat == 6) CheckDlgButton(hwndDlg,IDC_16BIT_L_SHAPE,TRUE); else if(iniSettings.outputFormat == 7) CheckDlgButton(hwndDlg,IDC_16BIT_M_SHAPE,TRUE); else if(iniSettings.outputFormat == 8) CheckDlgButton(hwndDlg,IDC_16BIT_H_SHAPE,TRUE); if(iniSettings.fileType == 1) CheckDlgButton(hwndDlg,IDC_WAV,TRUE); else if(iniSettings.fileType == 2) CheckDlgButton(hwndDlg,IDC_AIFF,TRUE); else if(iniSettings.fileType == 3) CheckDlgButton(hwndDlg,IDC_SUNAU,TRUE); else if(iniSettings.fileType == 4) CheckDlgButton(hwndDlg,IDC_DECAU,TRUE); } if(iniSettings.object_type == 0) CheckDlgButton(hwndDlg,IDC_MAIN,TRUE); else if(iniSettings.object_type == 1) CheckDlgButton(hwndDlg,IDC_LC,TRUE); else if(iniSettings.object_type == 3) CheckDlgButton(hwndDlg,IDC_LTP,TRUE); else if(iniSettings.object_type == 23) CheckDlgButton(hwndDlg,IDC_LD,TRUE); break; case WM_CLOSE: EndDialog(hwndDlg, -1); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_BUTTON1: { if (IsDlgButtonChecked(hwndDlg, IDC_PLAYBACK) == BST_CHECKED) set_decode_mode(0); // Playback else if (IsDlgButtonChecked(hwndDlg, IDC_DECODE) == BST_CHECKED) set_decode_mode(1); // Decode to File if (IsDlgButtonChecked(hwndDlg, IDC_WAV) == BST_CHECKED) set_fileType(1); // Microsoft WAV else if (IsDlgButtonChecked(hwndDlg, IDC_AIFF) == BST_CHECKED) set_fileType(2); // Apple/SGI AIFF else if (IsDlgButtonChecked(hwndDlg, IDC_SUNAU) == BST_CHECKED) set_fileType(3); // Sun/NeXT AU else if (IsDlgButtonChecked(hwndDlg, IDC_DECAU) == BST_CHECKED) set_fileType(4); // DEC AU if (IsDlgButtonChecked(hwndDlg, IDC_16BIT) == BST_CHECKED) set_outputFormat(1); // 16 bit PCM else if (IsDlgButtonChecked(hwndDlg, IDC_24BIT) == BST_CHECKED) set_outputFormat(2); // 24 bit PCM else if (IsDlgButtonChecked(hwndDlg, IDC_32BIT) == BST_CHECKED) set_outputFormat(3); // 32 bit PCM else if (IsDlgButtonChecked(hwndDlg, IDC_FLOATS) == BST_CHECKED) set_outputFormat(4); // 32 bit floats else if (IsDlgButtonChecked(hwndDlg, IDC_16BIT_DITHER) == BST_CHECKED) set_outputFormat(5); // 16 bit PCM dithered else if (IsDlgButtonChecked(hwndDlg, IDC_16BIT_L_SHAPE) == BST_CHECKED) set_outputFormat(6); // dithered LIGHT noise shaping else if (IsDlgButtonChecked(hwndDlg, IDC_16BIT_M_SHAPE) == BST_CHECKED) set_outputFormat(7); // dithered MEDIUM noise shaping else if (IsDlgButtonChecked(hwndDlg, IDC_16BIT_H_SHAPE) == BST_CHECKED) set_outputFormat(8); // dithered HEAVY noise shaping if (IsDlgButtonChecked(hwndDlg, IDC_MAIN) == BST_CHECKED) set_object_type(0); // Main else if (IsDlgButtonChecked(hwndDlg, IDC_LC) == BST_CHECKED) set_object_type(1); // Low Complexity else if (IsDlgButtonChecked(hwndDlg, IDC_LTP) == BST_CHECKED) set_object_type(3); // Long Term Prediction else if (IsDlgButtonChecked(hwndDlg, IDC_LD) == BST_CHECKED) set_object_type(23); // Low Delay EndDialog(hwndDlg, -2); return TRUE; } case IDC_BUTTON6: EndDialog(hwndDlg, -7); return TRUE; case IDC_PLAYBACK: CheckDlgButton(hwndDlg,IDC_WAV,TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_AIFF), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_SUNAU), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DECAU), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_24BIT), FALSE); CheckDlgButton(hwndDlg,IDC_24BIT,FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_32BIT), FALSE); CheckDlgButton(hwndDlg,IDC_32BIT,FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_FLOATS), FALSE); CheckDlgButton(hwndDlg,IDC_FLOATS,FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_DITHER), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_L_SHAPE), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_M_SHAPE), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_H_SHAPE), TRUE); if (IsDlgButtonChecked(hwndDlg, IDC_16BIT_DITHER) != BST_CHECKED && IsDlgButtonChecked(hwndDlg, IDC_16BIT_L_SHAPE) != BST_CHECKED && IsDlgButtonChecked(hwndDlg, IDC_16BIT_M_SHAPE) != BST_CHECKED && IsDlgButtonChecked(hwndDlg, IDC_16BIT_H_SHAPE) != BST_CHECKED) CheckDlgButton(hwndDlg,IDC_16BIT,TRUE); break; case IDC_DECODE: EnableWindow(GetDlgItem(hwndDlg, IDC_AIFF), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_SUNAU), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_DECAU), FALSE); EnableWindow(GetDlgItem(hwndDlg, IDC_24BIT), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_32BIT), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_FLOATS), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_DITHER), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_L_SHAPE), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_M_SHAPE), TRUE); EnableWindow(GetDlgItem(hwndDlg, IDC_16BIT_H_SHAPE), TRUE); break; default: break; } } return FALSE; } /******************************** end of main.c ********************************/ faad2-2_10_0/aacDECdrop/misc.c000066400000000000000000000042741374350120500157440ustar00rootroot00000000000000/* * function: Miscellaneous functions for aacDECdrop * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards */ #include #include #include #include #include "misc.h" static char *_filename; void (*error_handler)(const char *fmt, ...) = error_dialog; /* * Set the current input file name. */ void set_filename(char *filename) { _filename = filename; } /* * Display an error dialog, possibly adding system error information. */ void error_dialog(const char *fmt, ...) { va_list ap; char msgbuf[1024]; char *bufp = msgbuf; /* A really rough sanity check to protect against blatant buffer overrun */ if (strlen(fmt) > 750) { sprintf(msgbuf, "%s %s", " ", fmt); } else { if (_filename != NULL && strlen(_filename) < 255) { sprintf(msgbuf, "%s: ", _filename); bufp += strlen(msgbuf); } va_start(ap, fmt); vsprintf(bufp, fmt, ap); va_end(ap); if (errno != 0) { bufp = msgbuf + strlen(msgbuf); sprintf(bufp, " error is %s (%d)", strerror(errno), errno); errno = 0; } } MessageBox(NULL, msgbuf, "Error", 0); } void log_error(const char *fmt, ...) { va_list ap; FILE *fp; char msgbuf[1024]; char *bufp = msgbuf; /* A really rough sanity check to protect against blatant buffer overrun */ if (strlen(fmt) > 750) { sprintf(msgbuf, "%s %s", " ", fmt); } else { if (_filename != NULL && strlen(_filename) < 255) { sprintf(msgbuf, "%s : ", _filename); bufp += strlen(msgbuf); } va_start(ap, fmt); vsprintf(bufp, fmt, ap); va_end(ap); if (errno != 0) { bufp = msgbuf + strlen(msgbuf); sprintf(bufp, " error is: %s (%d)", strerror(errno), errno); errno = 0; } } va_start(ap, fmt); if ((fp = fopen("oggdrop.log", "a")) == (FILE *)NULL) return; fprintf(fp, "%s\n", msgbuf); fflush(fp); fclose(fp); va_end(ap); } void set_use_dialogs(int use_dialogs) { if (!use_dialogs) error_handler = error_dialog; else error_handler = log_error; } /******************************** end of misc.c ********************************/ faad2-2_10_0/aacDECdrop/misc.h000066400000000000000000000010521374350120500157400ustar00rootroot00000000000000/* * function: Header file for misc.c * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards */ #ifndef __MISC_H__ #define __MISC_H__ #include "decode.h" #include void set_filename(char *filename); extern void error_dialog(const char *fmt, ...); extern void log_error(const char *fmt, ...); extern void set_use_dialogs(int use_dialogs); extern void (*error_handler)(const char *fmt, ...); #endif /* __MISC_H__ */ faad2-2_10_0/aacDECdrop/resource.h000066400000000000000000000041261374350120500166410ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by Script.rc // #define IDD_VOLUME 101 #define IDD_ABOUT 102 #define IDB_TF01 112 #define IDB_TF02 113 #define IDB_TF03 114 #define IDB_TF04 115 #define IDB_TF05 116 #define IDB_TF06 117 #define IDB_TF07 118 #define IDB_TF08 119 #define IDR_MENU1 124 #define IDI_ICON1 130 #define IDC_BUTTON1 1001 #define IDC_PLAYBACK 1005 #define IDC_DECODE 1008 #define IDC_WAV 1014 #define IDC_AIFF 1015 #define IDC_SUNAU 1016 #define IDC_DECAU 1017 #define IDC_16BIT 1018 #define IDC_24BIT 1020 #define IDC_32BIT 1021 #define IDC_FLOATS 1022 #define IDC_MAIN 1023 #define IDC_LC 1024 #define IDC_LTP 1025 #define IDC_LD 1026 #define IDC_16BIT_DITHER 1027 #define IDC_16BIT_L_SHAPE 1028 #define IDC_16BIT_M_SHAPE 1029 #define IDC_16BIT_H_SHAPE 1030 #define IDC_BUTTON6 1033 #define IDM_VOLUME 40005 #define IDM_STOP_DEC 40006 #define IDM_ABOUT 40007 #define IDM_LOGERR 40008 #define IDM_ONTOP 40015 #define IDM_QUIT 40019 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NO_MFC 1 #define _APS_NEXT_RESOURCE_VALUE 134 #define _APS_NEXT_COMMAND_VALUE 40018 #define _APS_NEXT_CONTROL_VALUE 1031 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif faad2-2_10_0/aacDECdrop/resource/000077500000000000000000000000001374350120500164655ustar00rootroot00000000000000faad2-2_10_0/aacDECdrop/resource/AAC01.bmp000066400000000000000000000041261374350120500177150ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffPQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDEUDDDDDDEUEUDDDDDDEUEUUUUUUDDPTDEUDDDDDDEUEUDDDDDDEUEUUUUUUDDPTDEUTDDDDDUUEUTDGwDDUUEUUUUUUDDPTDDUTDDDDDUTDUTDDDDDUTEUTDDDDDDPTDDUUUUUUUUTDUUUUUUUUTEUTDDDtDDPTDDEUUUUUUUDDEUUUUUUUtEUTDDDDDDPTDDEUUUUUUUDDEUUUUUUUDEUTDDDDDDPTDDDUTDDDUWDDDUTDDDUWDEUTDDDDDDPTDDDUUDDEUTDDDUUDDEUTDEUTDDDDDDPTDDDEUDDEUDDDDEUDDEUDDEUTDDDDDDPWDDDEUTDUUDDDDEUTDUUDDEUTGDDDDDPWDDGDUTDUTDDDDDUTDUTDDEUTGDDDDDPWDDDDUUEUTDDDDDUUEUTDDEUTGDDDDDPWDDDDEUUUtDDDDDEUUUtDDEUTGDDDDDPTDDDDEUUUDDDDDDEUUUDDDEUTDDwtDDPTDDDGDUUTDDDDDDDUUTDDDEUWDDDDDDPTDDDDDUUTDDDDDDDUUTtDtEUUUUUUDDPTDDDDDEUDDDDDDDDEUDDDDEUUUUUUtDPTDDDG4EUDGwtGwwDEUDDDDEUUUUUUCDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPfaad2-2_10_0/aacDECdrop/resource/AAC01.ico000066400000000000000000000042761374350120500177170ustar00rootroot00000000000000 ( @@wKatW3-p0z|E{m,*DJb ?faad2-2_10_0/aacDECdrop/resource/AAC02.bmp000066400000000000000000000041261374350120500177160ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGDwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDGDDDDDDDDDDDDDDDDDDDPTDUWtDDDDwUWUTDDDDDDUTUUUUUUTDDPTDUWwDDDDwUWUTDDDDDDUTUUUUUUTDDPTDUUwDDDDuUWUUDDwtDEUTUUUUUUTDDPTDEUwDDDDuUwEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUwEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUWwDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTwDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtwDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDwDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDwDDUTDDUTDDUUDDDDDGDPWDDDUUDEUTDwDDUUDEUTDDUUDtDDDGDPWDDtEUDEUDDwDDEUDEUDDDUUDtDDDDDPWDDDEUTUUDDwDDEUTUUDDDUUDtDDDDDPWDDDDUUUWDDwtDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDwDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDwDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDwDDDEUUGDGDUUUUUUTDDPTDDDDDUTDDDwDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwwwwwtDUTDDDDUUUUUUT4DPTDDDDDDDDDGwDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/resource/AAC03.bmp000066400000000000000000000041261374350120500177170ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUUDDDDDEUTUUDDwtDEUTUUUUUUTDDPTDEUDDDDDEUDEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUDEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUWDDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTDDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtDDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDDDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDDDDUTDDUTDDUUDDDDDGDPTGDDUUDEUTDDDDUUDEUTDDUUDtDDDGDPTGDtEUDEUDDDDDEUDEUDDDUUDtDDDDDPTGDDEUTUUDDDDDEUTUUDDDUUDtDDDDDPTGDDDUUUWDDDDDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDDDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDDDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDDDDDEUUGDGDUUUUUUTDDPTDDDDDUTDDDDDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwwDwwtDUTDDDDUUUUUUT4DPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPffffffffffffbQQQR&ffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/resource/AAC04.bmp000066400000000000000000000041261374350120500177200ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTtDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUUDDDDDEUTUUDDwtDEUTUUUUUUTDDPTDEUDDDDDEUDEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUDEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUWDDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTDDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtDDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDDDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDDDDUTDDUTDDUUDDDDDGDPTDDDUUDEUTDDDDUUDEUTDDUUDtDDDGDPTDDtEUDEUDDDDDEUDEUDDDUUDtDDDDDPTDDDEUTUUDDDDDEUTUUDDDUUDtDDDDDPTDDDDUUUWDDDDDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDDDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDDDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDDDDDEUUGDGDUUUUUUTDDPTDDDDDUTDDDDDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwwDGwtDUTDDDDUUUUUUTtDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPfffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/resource/AAC05.bmp000066400000000000000000000041261374350120500177210ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUUDDDDDEUTUUDDwtDEUTUUUUUUTDDPTDEUDDDDDEUDEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUDEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUTDDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTDDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtDDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDDDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDDDDUTDDUTDDUUDDDDDGDPTDDDUUDEUTDDDDUUDEUTDDUUDtDDDGDPTDDtEUDEUDDDDDEUDEUDDDUUDtDDDDDPTDDDEUTUUDDDDDEUTUUDDDUUDtDDDDDPTDDDDUUUWDDDDDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDDDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDDDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDDDDDEUUGDGDUUUUUUTDDPTDDDDDUTDDDDDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwwDwwtDUTDDDDUUUUUUT4DPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPfffffffffffffQQQ&ffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`ffffffffffffbQQQVfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/resource/AAC06.bmp000066400000000000000000000041261374350120500177220ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTtDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUUDDDDDEUTUUDDwtDEUTUUUUUUTDDPTDEUDDDDDEUDEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUDEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUWDDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTDDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtDDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDDDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDDDDUTDDUTDDUUDDDDDGDPTDDDUUDEUTDDDDUUDEUTDDUUDtDDDGDPTDDtEUDEUDDDDDEUDEUDDDUUDtDDDDDPTDDDEUTUUDDDDDEUTUUDDDUUDtDDDDDPTDDDDUUUWDDDDDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDDDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDDDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDDDDDEUUGDGDUUUUUUTDDPTDDDDDUTDDDDDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwtDGwtDUTDDDDUUUUUUTtDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPfffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/resource/AAC07.bmp000066400000000000000000000041261374350120500177230ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTtDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUUDDDDDEUTUUDDwtDEUTUUUUUUTDDPTDEUDDDDDEUDEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUDEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUWDDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTDDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtDDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDDDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDDDDUTDDUTDDUUDDDDDGDPTDDDUUDEUTDDDDUUDEUTDDUUDtDDDGDPTDDtEUDEUDDDDDEUDEUDDDUUDtDDDDDPTDDDEUTUUDDDDDEUTUUDDDUUDtDDDDDPTDDDDUUUWDDDDDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDDDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDDDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDDDDDEUUGDGDUUUUUUTDDPTDDDDDUTDDDDDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwtDwwtDUTDDDDUUUUUUTtDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPffffffffffffbQQQR&ffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/resource/AAC08.bmp000066400000000000000000000041261374350120500177240ustar00rootroot00000000000000BMVv(?? lD D/  :fffffffffffffffeUffffffffffffff`fffffffffffffffUVfffffffffffff`ffffffffffffffeQUfffffffffffff`ffffffffffffffUQUVffffffffffff`fffffffffffffeQQQUffffffffffff`fffffffffffffUQQVfffffffffff`ffffffffffffeQQQUfffffffffff`ffffffffffffUQQQUVffffffffff`fffffffffffeQQQQQUffffffffff`fffffffffffUQQQQVfffffffff`ffffffffffeQQQQQUfffffffff`ffffffffbfPQQQQVffffffff`ffffffff&eQQQQQffffffff`fffffffbfUQQQQVfffffff`fffffff&eQQQQQUfffffff`ffffffffUQQQQVffffff`fffffffeUUUUUQUQUUUUUUffffff`fffffffffb&"bQQQR"&&&fffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQRfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`fffffffffffffQQQVfffffffffff`ffUUUUUUUUUUUQQQUUUUUUUUUUVf`feQQQUf`fUQQV`eUQQQUU`UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPTGDwGtwGtwGtwGttttwGtwGtwGtwGDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTtDPTDUTDDDDDDUTUTDDDDDDUTUUUUUUTDDPTDUUDDDDDEUTUUDDwtDEUTUUUUUUTDDPTDEUDDDDDEUDEUDDDDDEUDUUDDDDDDDPTDEUUUUUUUUDEUUUUUUUUDUUDDDGDDDPTDDUUUUUUUWDDUUUUUUUWDUUDDDDDDDPTDDUUUUUUUTDDUUUUUUUTDUUDDDDDDDPTDDEUDDDEUtDDEUDDDEUtDUUDDDDDDDPTDDEUTDDUUDDDEUTDDUUDGUUDDDDDDDPTDDDUTDDUTDDDDUTDDUTDDUUDDDDDGDPTDDDUUDEUTDDDDUUDEUTDDUUDtDDDGDPTDDtEUDEUDDDDDEUDEUDDDUUDtDDDDDPTDDDEUTUUDDDDDEUTUUDDDUUDtDDDDDPTDDDDUUUWDDDDDDUUUWDDDUUDtDDDDDPTDDDDUUUTDDDDDDUUUTDDDUUDDGwDDDPTDDDtEUUDDDDDDDEUUDDDDUUtDDDDDDPTDDDDEUUDDDDDDDEUUGDDDUUUUUUTDDPTDDDDDUTDDDDDDDDUTDDDDUUUUUUWGDPTDDDsDUTDwwDwwtDUTDDDDUUUUUUTtDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPTDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`ffffffffffffbQQQVfffffffffff`fffffffffffffQQQfffffffffff`fffffffffffffUUUUUUVfffffffffff`faad2-2_10_0/aacDECdrop/wave_out.c000066400000000000000000000117361374350120500166430ustar00rootroot00000000000000/* * function: Support for playing wave files - Win32 - ONLY * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards */ #include #include #include "wave_out.h" #define MAX_WAVEBLOCKS 32 static CRITICAL_SECTION cs; static HWAVEOUT dev = NULL; static int ScheduledBlocks = 0; static int PlayedWaveHeadersCount = 0; // free index static WAVEHDR* PlayedWaveHeaders [MAX_WAVEBLOCKS]; static int Box ( const char* msg ) { MessageBox ( NULL, msg, "Error Message . . .", MB_OK | MB_ICONEXCLAMATION ); return -1; } /* * This function registers already played WAVE chunks. Freeing is done by free_memory(), */ static void CALLBACK wave_callback ( HWAVE hWave, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ) { if ( uMsg == WOM_DONE ) { EnterCriticalSection ( &cs ); PlayedWaveHeaders [PlayedWaveHeadersCount++] = (WAVEHDR*) dwParam1; LeaveCriticalSection ( &cs ); } } static void free_memory ( void ) { WAVEHDR* wh; HGLOBAL hg; EnterCriticalSection ( &cs ); wh = PlayedWaveHeaders [--PlayedWaveHeadersCount]; ScheduledBlocks--; // decrease the number of USED blocks LeaveCriticalSection ( &cs ); waveOutUnprepareHeader ( dev, wh, sizeof (WAVEHDR) ); hg = GlobalHandle ( wh -> lpData ); // Deallocate the buffer memory GlobalUnlock (hg); GlobalFree (hg); hg = GlobalHandle ( wh ); // Deallocate the header memory GlobalUnlock (hg); GlobalFree (hg); } Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels ) { WAVEFORMATEX outFormat; UINT deviceID = WAVE_MAPPER; (void) dummyFile; if ( waveOutGetNumDevs () == 0 ) return Box ( "No audio device present." ); outFormat.wFormatTag = WAVE_FORMAT_PCM; outFormat.wBitsPerSample = BitsPerSample; outFormat.nChannels = Channels; outFormat.nSamplesPerSec = (unsigned long)(SampleFreq); outFormat.nBlockAlign = outFormat.nChannels * outFormat.wBitsPerSample/8; outFormat.nAvgBytesPerSec = outFormat.nSamplesPerSec * outFormat.nChannels * outFormat.wBitsPerSample/8; switch ( waveOutOpen ( &dev, deviceID, &outFormat, (DWORD)wave_callback, 0, CALLBACK_FUNCTION ) ) { case MMSYSERR_ALLOCATED: return Box ( "Device is already open." ); case MMSYSERR_BADDEVICEID: return Box ( "The specified device is out of range." ); case MMSYSERR_NODRIVER: return Box ( "There is no audio driver in this system." ); case MMSYSERR_NOMEM: return Box ( "Unable to allocate sound memory." ); case WAVERR_BADFORMAT: return Box ( "This audio format is not supported." ); case WAVERR_SYNC: return Box ( "The device is synchronous." ); default: return Box ( "Unknown media error." ); case MMSYSERR_NOERROR: break; } waveOutReset ( dev ); InitializeCriticalSection ( &cs ); SetPriorityClass ( GetCurrentProcess (), HIGH_PRIORITY_CLASS ); // SetPriorityClass ( GetCurrentProcess (), REALTIME_PRIORITY_CLASS ); return 0; } int WIN_Play_Samples ( const void* data, size_t len ) { HGLOBAL hg; HGLOBAL hg2; LPWAVEHDR wh; void* allocptr; do { while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); if ( ScheduledBlocks < sizeof(PlayedWaveHeaders)/sizeof(*PlayedWaveHeaders) ) // wait for a free block ... break; Sleep (26); } while (1); if ( (hg2 = GlobalAlloc ( GMEM_MOVEABLE, len )) == NULL ) // allocate some memory for a copy of the buffer return Box ( "GlobalAlloc failed." ); allocptr = GlobalLock (hg2); CopyMemory ( allocptr, data, len ); // Here we can call any modification output functions we want.... if ( (hg = GlobalAlloc (GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof (WAVEHDR))) == NULL ) // now make a header and WRITE IT! return -1; wh = GlobalLock (hg); wh->dwBufferLength = len; wh->lpData = allocptr; if ( waveOutPrepareHeader ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } if ( waveOutWrite ( dev, wh, sizeof (WAVEHDR)) != MMSYSERR_NOERROR ) { GlobalUnlock (hg); GlobalFree (hg); return -1; } EnterCriticalSection ( &cs ); ScheduledBlocks++; LeaveCriticalSection ( &cs ); return len; } int WIN_Audio_close ( void ) { if ( dev != NULL ) { while ( ScheduledBlocks > 0 ) { Sleep (ScheduledBlocks); while ( PlayedWaveHeadersCount > 0 ) // free used blocks ... free_memory (); } waveOutReset (dev); // reset the device waveOutClose (dev); // close the device dev = NULL; } DeleteCriticalSection ( &cs ); ScheduledBlocks = 0; return 0; } /******************************** end of wave_out.c ********************************/ faad2-2_10_0/aacDECdrop/wave_out.h000066400000000000000000000023461374350120500166450ustar00rootroot00000000000000/* * function: Header file for wave_out.c * * This program is distributed under the GNU General Public License, version 2. * A copy of this license is included with this source. * * Copyright (C) 2002 John Edwards */ #ifndef __WAVE_OUT_H__ #define __WAVE_OUT_H__ #include #include #define Cdecl __cdecl #define __attribute__(x) #define sleep(__sec) Sleep ((__sec) * 1000) #define inline __inline #define restrict /* * constants */ #define CD_SAMPLE_FREQ 44.1e3 #define SAMPLE_SIZE 16 #define SAMPLE_SIZE_STRING "" #define WINAUDIO_FD ((FILE_T)-128) #define FILE_T FILE* #define INVALID_FILEDESC NULL /* * Simple types */ typedef signed int Int; // at least -32767...+32767, fast type typedef unsigned int Uint; // at least 0...65535, fast type typedef long double Ldouble; // most exact floating point format /* * functions for wave_out.c */ Int Set_WIN_Params ( FILE_T dummyFile , Ldouble SampleFreq, Uint BitsPerSample, Uint Channels ); int WIN_Play_Samples ( const void* buff, size_t len ); int WIN_Audio_close ( void ); #endif /* __WAVE_OUT_H__ */ faad2-2_10_0/bootstrap000077500000000000000000000004531374350120500146560ustar00rootroot00000000000000#! /bin/sh case $OSTYPE in darwin*) LIBTOOLIZE=glibtoolize ;; *) LIBTOOLIZE=libtoolize ;; esac aclocal -I . && \ autoheader && \ $LIBTOOLIZE --automake && \ automake --add-missing && \ autoconf && \ echo "Ready to run ./configure" faad2-2_10_0/configure.ac000066400000000000000000000113551374350120500152040ustar00rootroot00000000000000dnl dnl This is the configure.in for faad2 related to unix creation dnl - libfaad.so dnl - libmp4ff.a (only static for moment) dnl - faad dnl - xmms input mp4/aac plugin dnl - mpeg4ip plugin (requires mpeg4ip's libmp4v2 to be installed) AC_PREREQ(2.50) AC_INIT(faad2, 2.10.0) AC_CONFIG_AUX_DIR(.) AM_INIT_AUTOMAKE([subdir-objects]) AC_PROG_LIBTOOL AC_SUBST(LIBTOOL_DEPS) dnl Checks for programs. AC_PROG_CC AM_PROG_CC_C_O AC_PROG_CPP dnl disable for mpeg4ip plugin AC_PROG_CXX AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET AC_CHECK_PROGS(RPMBUILD, rpmbuild, rpm) AC_CONFIG_HEADERS([config.h]) AC_ARG_WITH(xmms,[ --with-xmms compile XMMS-1 plugin], WITHXMMS=$withval, WITHXMMS=no) AC_ARG_WITH(drm,[ --with-drm compile libfaad with DRM support], WITHDRM=$withval, WITHDRM=no) AC_ARG_WITH(mpeg4ip, [ --with-mpeg4ip compile mpeg4ip plugin], WITHMPEG4IP=$withval, WITHMPEG4IP=no) dnl Checks for header files required for mp4.h AC_HEADER_STDC AC_CHECK_HEADERS(stdint.h inttypes.h) AC_CHECK_HEADERS(mathf.h) AC_CHECK_HEADERS(float.h) AC_CHECK_FUNCS(strchr memcpy) AC_CHECK_HEADERS(sys/time.h) AC_HEADER_TIME dnl DRMS AC_CHECK_HEADERS(errno.h sys/stat.h sys/types.h limits.h) AC_CHECK_HEADERS(sysfs/libsysfs.h) AC_CHECK_HEADERS(IOKit/IOKitLib.h, [AC_CHECK_LIB(IOKit, main, [AC_DEFINE(HAVE_IOKIT_IOKITLIB_H, 1, [Define if you have the IOKit API]) MP4FF_LIBS="-lIOKit" AC_SUBST(MP4FF_LIBS)])]) AC_CHECK_FUNCS(getpwuid) AC_C_INLINE AC_C_BIGENDIAN AC_TYPE_OFF_T AC_DEFUN([MY_CHECK_TYPEDEF_FROM_INCLUDE], [ AC_MSG_CHECKING([for $1]) AC_TRY_COMPILE([$2], [$1;], libfaad_ok=yes, libfaad_ok=no) if test $libfaad_ok = yes; then AC_DEFINE($3, 1, [Define if needed]) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi ]) dnl @synopsis AC_C99_FUNC_LRINTF dnl dnl Check whether C99's lrintf function is available. dnl @version 1.3 Feb 12 2002 dnl @author Erik de Castro Lopo dnl dnl Permission to use, copy, modify, distribute, and sell this file for any dnl purpose is hereby granted without fee, provided that the above copyright dnl and this permission notice appear in all copies. No representations are dnl made about the suitability of this software for any purpose. It is dnl provided "as is" without express or implied warranty. dnl AC_DEFUN([AC_C99_FUNC_LRINTF], [AC_CACHE_CHECK(for lrintf, ac_cv_c99_lrintf, [ lrintf_save_CFLAGS=$CFLAGS lrintf_save_LIBS=$LIBS CFLAGS="-O" LIBS="-lm" AC_TRY_LINK([ #define _ISOC9X_SOURCE 1 #define _ISOC99_SOURCE 1 #define __USE_ISOC99 1 #define __USE_ISOC9X 1 #include ], if (!lrintf(3.14159)) lrintf(2.7183);, ac_cv_c99_lrintf=yes, ac_cv_c99_lrintf=no) CFLAGS=$lrintf_save_CFLAGS LIBS=$lrintf_save_LIBS ]) if test "$ac_cv_c99_lrintf" = yes; then AC_DEFINE(HAVE_LRINTF, 1, [Define if you have C99's lrintf function.]) fi ])# AC_C99_FUNC_LRINTF AC_C99_FUNC_LRINTF MY_CHECK_TYPEDEF_FROM_INCLUDE([float32_t temp], [#include , #include ], [HAVE_FLOAT32_T]) AC_CHECK_FUNCS(strsep) AC_CHECK_PROG(external_mp4v2, mpeg4ip-config, yes, no) AM_CONDITIONAL(HAVE_MPEG4IP_PLUG, false) if test x$WITHMPEG4IP = xyes; then if test x$external_mp4v2 = xyes; then AM_CONDITIONAL(HAVE_MPEG4IP_PLUG, true) AC_MSG_NOTICE("Building MPEG4IP plugin") else AC_MSG_NOTICE("MPEG4IP libmp4v2 is required for MPEG4IP plugin") fi fi if test x$WITHXMMS = xyes; then AC_CHECK_PROGS(XMMS_CONFIG, xmms-config,"not_found") if test "$XMMS_CONFIG" = "not_found"; then AC_MSG_ERROR("*** xmms-config not found - xmms plugin can't be build") fi AC_CHECK_HEADER(pthread.h,, AC_MSG_ERROR(*** pthread headers support not installed or not found)) AC_CHECK_HEADER(id3.h,, AC_MSG_ERROR(*** id3lib headers support not installed or not found)) AC_CHECK_PROGS(GTK_CONFIG, gtk-config, "not_found") if test "$XGTK_CONFIG" = "not_found"; then AC_MSG_ERROR("*** gtk-config not found - xmms plugin can't be build without") fi AM_CONDITIONAL(HAVE_XMMS, true) else AC_MSG_NOTICE(no xmms build configured) AM_CONDITIONAL(HAVE_XMMS, false) fi if test x$WITHDRM = xyes; then AC_DEFINE(DRM, 1, [Define if you want to use libfaad together with Digital Radio Mondiale (DRM)]) AC_DEFINE(DRM_PS, 1, [Define if you want support for Digital Radio Mondiale (DRM) parametric stereo]) fi AC_CONFIG_FILES(libfaad/Makefile) AC_CONFIG_FILES(libfaad/faad2.pc) AC_CONFIG_FILES(plugins/Makefile) AC_CONFIG_FILES(plugins/xmms/Makefile) AC_CONFIG_FILES(plugins/xmms/src/Makefile) AC_CONFIG_FILES(plugins/mpeg4ip/Makefile) AC_CONFIG_FILES(faad2.spec) AC_CONFIG_FILES(frontend/Makefile) AC_CONFIG_FILES(Makefile) AC_OUTPUT faad2-2_10_0/docs/000077500000000000000000000000001374350120500136415ustar00rootroot00000000000000faad2-2_10_0/docs/Ahead AAC Decoder library documentation.doc000066400000000000000000002730001374350120500235060ustar00rootroot00000000000000ࡱ> ` d*bjbj .PA""  3333D4L E^2X4n4n4n4n4M5M5M5]]]]]]]$w_ha] 5I5M555]n4n4]BBB5(xn4 n4]B5]BB[ X ]n4L4 lF3;H\]^0E^`\b?b0]b ]M5a5Bo5 {5SM5M5M5]]AM5M5M5E^5555 )$ )   Ahead AAC Decoder library documentation Version 1.0.2.1, Menno Bakker ( HYPERLINK "mailto:mbakker@nero.com" mbakker@nero.com)  API specification This chapter describes the Ahead AAC library API functions and explains how to use them and in which order. NeAACDecGetCapabilities unsigned long NEAACAPI NeAACDecGetCapabilities(void); This function returns the capabilities of the decoder in a 32 bit unsigned integer. The bits that are set in the 32 bit unsigned integer define with which capabilities the library has been compiled. The following capabilities are defined (../include/neaacdec.h) #define LC_DEC_CAP (1<<0) /* Can decode LC */ #define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */ #define LTP_DEC_CAP (1<<2) /* Can decode LTP */ #define LD_DEC_CAP (1<<3) /* Can decode LD */ #define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ #define FIXED_POINT_CAP (1<<5) /* Fixed point */ This function can be called anytime. NeAACDecOpen NeAACDecHandle NEAACAPI NeAACDecOpen(void); Returns a handle to a decoder context. NeAACDecClose void NEAACAPI NeAACDecClose(NeAACDecHandle hDecoder); Closes a decoder context that has been opened by NeAACDecOpen. NeAACDecGetCurrentConfiguration NeAACDecConfigurationPtr NEAACAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); Returns the current decoder library configuration. NeAACDecSetConfiguration unsigned char NEAACAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config); Sets a new configuration structure for the decoder library. Return values: 0 Error, invalid configuration. 1 OK NeAACDecInit long NEAACAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels); Initialises the decoder library using information from the AAC file. The buffer parameter should hold a small part of the AAC file, so that the initialization can be done based on the ADTS or ADIF header. Buffer can also be NULL, but then default initialization parameters will be used. Return values: < 0 Error >= 0 Number of bytes read. This amount of bytes should be skipped by the program using the decoder library. This function fills the samplerate and channels parameters with the detected values. NeAACDecInit2 char NEAACAPI NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); Initialises the decoder library based on an AudioSpecificConfig as found inside a MP4 file. Return values: < 0 Error 0 - OK This function fills the samplerate and channels parameters with the detected values. NeAACDecDecode void* NEAACAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); Decodes the AAC data passed in buffer. Returns a pointer to a sample buffer or NULL. Info about the decoded frame is filled in in the NeAACDecFrameInfo structure. This structure holds information about errors during decoding, number of sample, number of channels and samplerate. The returned buffer contains the channel interleaved samples of the frame. Structures NeAACDecConfiguration typedef struct NeAACDecConfiguration { unsigned char defObjectType; unsigned long defSampleRate; unsigned char outputFormat; unsigned char downMatrix; unsigned char useOldADTSFormat; } NeAACDecConfiguration, *NeAACDecConfigurationPtr; Members: defObjectType: determines the default object type assumed when the library is initialized without any data from the AAC file (eg: when NULL is passed as buffer in NeAACDecInit()). Can be any of the following values: #define MAIN 1 /* MAIN */ #define LC 2 /* Low Complexity (default) */ #define SSR 3 /* Scalable SampleRate */ #define LTP 4 /* Long Term Predition */ #define HE_AAC 5 /* High Efficiency (SBR) */ #define ER_LC 17 /* Error Resilient Low Complexity */ #define ER_LTP 19 /* Error Resilient Long Term Prediction */ #define LD 23 /* Low Delay */ defSampleRate: determines the default samplerate assumed when the library is initialized. Default value is 44100. outputFormat: determines the output format returned by the decoder library. Can be any of the following values: #define FAAD_FMT_16BIT 1 /* 16 bit integers */ #define FAAD_FMT_24BIT 2 /* 24 bit values packed in 32 bit integers */ #define FAAD_FMT_32BIT 3 /* 32 bit integers */ #define FAAD_FMT_FLOAT 4 /* single precision floating point */ #define FAAD_FMT_DOUBLE 5 /* double precision floating point */ downMatrix: determines whether a 5.1 channel AAC file should be downmatrixed to 2 channel output (value: 1) or whether the output should stay as 5.1 channels (value: 0). useOldADTSFormat: determines whether the decoder should assume the currently defined 56 bit ADTS header (value: 0) or the 58 bit ADTS header (value: 1) defined in previous versions of the AAC standard. This value should normally always stay at the value 0, it only exists to provide playback capabilities for people that have AAC files with the old header format. All current encoders should output the new ADTS format. NeAACDecFrameInfo This structure is returned after decoding a frame and provides info about the decoded frame. typedef struct NeAACDecFrameInfo { unsigned long bytesconsumed; unsigned long samples; unsigned char channels; unsigned char error; unsigned long samplerate; unsigned char sbr; unsigned char object_type; unsigned char header_type; unsigned char num_front_channels; unsigned char num_side_channels; unsigned char num_back_channels; unsigned char num_lfe_channels; unsigned char channel_position[64]; unsigned char ps; } NeAACDecFrameInfo; Members: bytesconsumed: the number of bytes consumed for decoding this frame. samples: the number of audio samples in this frame. Each channel is counted separately. So when a single channel has 1024 samples and the file has 2 channels, this value will be 2*1024 = 2048. channels: number of audio channels in this frame error: contains an error value if an error occurred, 0 otherwise. samplerate: the samplerate of the frame. sbr: tells wether sbr is used in this file or not. Can contain any of the following values: #define NO_SBR 0 /* no SBR used in this file */ #define SBR_UPSAMPLED 1 /* upsampled SBR used */ #define SBR_DOWNSAMPLED 2 /* downsampled SBR used */ #define NO_SBR_UPSAMPLED 3 /* no SBR used, but file is upsampled by a factor 2 anyway */ object_type: contains the object type of the AAC file. Can be any of the values as defined in 1.9.1. header_type: contains the header type of the file that is being decoded. Can contain any of the following values: #define RAW 0 /* No header */ #define ADIF 1 /* single ADIF header at the beginning of the file */ #define ADTS 2 /* ADTS header at the beginning of each frame */ num_front_channels, num_side_channels, num_back_channels, num_lfe_channels: each of these values contain the number of channels of a certain type. channel_position[64]: contains the position of each of the channels that is returned by the frame decode function. Can contain any of the following values: #define FRONT_CHANNEL_CENTER (1) #define FRONT_CHANNEL_LEFT (2) #define FRONT_CHANNEL_RIGHT (3) #define SIDE_CHANNEL_LEFT (4) #define SIDE_CHANNEL_RIGHT (5) #define BACK_CHANNEL_LEFT (6) #define BACK_CHANNEL_RIGHT (7) #define BACK_CHANNEL_CENTER (8) #define LFE_CHANNEL (9) #define UNKNOWN_CHANNEL (0) ps: PS not used (0) or used (1). API usage The following pseudo-code describes how and in which order to use the different library functions. unsigned long cap = NeAACDecGetCapabilities(); // Check if decoder has the needed capabilities // Open the library NeAACDecHandle hAac = NeAACDecOpen(); // Get the current config NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(hAac); // // If needed change some of the values in conf // // Set the new configuration NeAACDecSetConfiguration(hAac, conf); // Initialise the library using one of the initialization functions char err = NeAACDecInit2(hAac, asc, asc_size, &samplerate, &channels); if (err != 0) { // // Handle error // } // Loop until decoding finished do { // // Put next frame in buffer // // Decode the frame in buffer samplebuffer = NeAACDecDecode(hAac, &hInfo, buffer, buffer_size); if ((hInfo.error == 0) && (hInfo.samples > 0)) { // // do what you need to do with the decoded samples // } else if (hInfo.error != 0) { // // Some error occurred while decoding this frame // } } while (more data available); NeAACDecClose(hAac); ./;<=>NOtuv  " # 0 ȴ{sskssY"h:dCJOJQJ^JaJmH sH h {mH sH h+xumH sH h:dh?~mH sH jh?~h8h`UmH sH hcq h?~0JmH sH #jhcq h?~UmH sH jh?~UmH sH hRQmH sH h:dmH sH h!#mH sH h?~hp5CJ(aJ(mH sH h?~h+xu5CJ(aJ(mH sH h?~mH sH / # Y Z ! ` a D | gd:dgd?~gd+xugd?~$a$gd?~gd?~A*c*0 6 : ? X Y Z ! 8 \ ` a      9 > G Z c h | } ~ DzoDzo"h:dCJOJQJ^JaJmH sH h:dOJQJ^JmH sH hRQmH sH h:dmH sH h+xuh+xumH sH h+xumH sH (h:dh:dCJOJQJ^JaJmH sH "h+xuCJOJQJ^JaJmH sH (h:dh+xuCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH +   9 G } ~ 9 : m ./>`gt01gd1egd?~gd:d   $ 8 9 : m r glt~0'+09>$%ǿǿ}uuuhrmH sH hRQh1emH sH "h1eCJOJQJ^JaJmH sH (h1eh1eCJOJQJ^JaJmH sH h1emH sH hRQmH sH h:dmH sH (h:dh:dCJOJQJ^JaJmH sH "h:dCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH .1@L%&5AH01XY>gddgd?~gdrgd?~gd1e%/01XH`fɷqqqqi]iiqh#hd6mH sH hdmH sH (hdhdCJOJQJ^JaJmH sH hdhdmH sH hmH sH hwLmH sH hrhrmH sH hRQhrmH sH "hrCJOJQJ^JaJmH sH (hrhrCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH hRQmH sH hrmH sH #>\Hy*r"p#gd#gd?~gdd-G\x%q)Cq!",puٻh#h#mH sH hRQmH sH h#h#6mH sH h#mH sH hdmH sH h#hd6mH sH "h#CJOJQJ^JaJmH sH (hdhdCJOJQJ^JaJmH sH "hdCJOJQJ^JaJmH sH /#  P Z y | ~ !)!B!]!x!!!!6"7"B""Dz똌xpxphemH sH hwLhe6mH sH hwLmH sH hwLh#6mH sH h#mH sH "h\ CJOJQJ^JaJmH sH (h#h\ CJOJQJ^JaJmH sH "h#CJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH (h#h#CJOJQJ^JaJmH sH &#>Zs 1Vz P y !C!y!!7""gd\ gd#""""#-#^#_###$$%%%%%%%g&{&&&&'!'<'A'b'ٽr`r`r`r`K(hPUhPUCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH (hPUhrCJOJQJ^JaJmH sH hrmH sH (heh\ CJOJQJ^JaJmH sH "h\ CJOJQJ^JaJmH sH  h\ h\ h\ h\ 6hemH sH hwLhe6mH sH "heCJOJQJ^JaJmH sH (heheCJOJQJ^JaJmH sH ""#_##$$$$%3%T%u%%%%%&f&g&&&&&'''c'd'gdrgd?~gdeb'c'''"(2(h(i(((()3)5)+*0*@*A*B*W*Z*b*c*d*ֲynjfb^ZnhA,hhsh?~h+xuhhmH sH "hCJOJQJ^JaJmH sH (hPUh {CJOJQJ^JaJmH sH "h {CJOJQJ^JaJmH sH "hPUCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH (hPUhPUCJOJQJ^JaJmH sH (hPUh1eCJOJQJ^JaJmH sH d'g'''''''"(i(w(y(}((((((((((((4)B)C) ^`gdgdrC)r)t)x)))))* * ***+*@*A*B*C*D*E*F*G*H*I*J*K*L*M* & Fgd>vgdr`gdPUM*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d* & Fgd>v,1h. A!"#$% DyK mbakker@nero.comyK 0mailto:mbakker@nero.comDd:$11T  C 0ANeroDigitalbf9xEPM  nf9xEPMPNG  IHDR2gAMAiCCPGray Gamma 1.8(c``$WR~  |B@TTd` 24\PTOJjq2H ;(Xd$e= vvH3+Iep/,L(QHT0TpLOJU,.I-VK/*/J,IMSpQ)/VJ-N-* 2@~JDC= PCXCa(v!ɥEepf<Å@ȦtPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~]} pHYs.#.#x?v1IDATx^m*; $  H@p$  H@8gYMtḭ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @q  ;\@#P Iq"z %@\*jcJ4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf lv'bػ{ 1r.O=;7qq`爱Nbz&bX6yG\!>[,:Zʛb1O!ׂ^. ax*;@K+踿JF^NM˫xp|ϫF&ˇCihJw_BYg]5yefyU󪈧3gӛKM'-b_dռ#y|ܮfy_ZAuU팋,/u\`ՓWĻIrxroa1a|wj>ԱiIzЮP.Ŏ<ŋf",}p=U}P-WY^@e}縵웭v!z?<]q.vd]:|=iK=H_?fmK$ j(CS[UzX#^p3W.pPw5쯦_dbG 3$8Onq rS!F<]8}HajnlŸWE躚8c'1[탾^cT؉Y^dJ2BAgۋ󟯩_)gJGkΩV<_Gep4}*1>k]/Ǎ)RL({1nKt]GL?_ҼٺCۺPHBa ݲ-_\%rNpoKlzol4]&8gm``rޤ4%GFW]W*y[W ػ&h˝ڔ[!a3R= `JQ똶w4/1wuڸyVzRn^&뉱'Sǔ7ː11-yxRtUQ.#r`&0Ϸwzc8hKiox_^zͨ_2Jsw9G˶\R_SLTĸӘ\f^rx3@X by3"]ȱ mf5n{ʝq׀Wo:du>b;K- ?;vzʟ^/'R\.^QxU.%=6b|o]H5vSeS?-ĸ!z ݰ ̯lF}WoL^Ft14ϔMKԟKw)c8n;]]"V muUci>IO+anfc/]Jqvy,% PŜէ̈XMUCcO;o4fqOgZInyhU&A $UvO_c8]cvT'!~nP*5KGy˱n b-Q zw[I;:z T-qg?d4E^O .`nL3.A%C"axݠ4$wƞA^e`RzVl1#Qު?25]"н ,٤>uEd1noLdT!ڃ~bMhTѱs1W RŸϐ3hevxjψø_qSsWsjb(Q+ I^R Dգdо+9iΫLN"~]zbܮ68܁Gƺ5z ;QxonJH$jdŤ1c1>7y\1,=F5Žˆ-1jIŗP2ָ+ǩ(a19+l}$<(C_KÞPcbRCp׬\CQ6XME3AW5[QͱW1n{f4pg+v⃪ Jn&cۖ苦GxW2<VTwB ߊqO}+E sĸ1uRU.ki5e?CSkcjn;9)s‰ 'nF=K1no߫ ĸyɈhBF6xZgŸ}q<&kZbB۷_վ0mC1ޛ/Ę@h%F ĺ3œަbP>1'^x.M+Y#%!o8m(rߪv'3_[{#0 =vKͳc8_V1G9Xqu5Eob|P0θe+ԄjӍx 1œRϼxc._Ql͉8bG'-+[+xUًa1^ί}۞O^ν #^ owpo2[_bbbů:XK SS꥛ccM&˕7v;_OHfC/f^eM.hszObHޤ{1>άW}Lv;H8wC:XN:EL~d&3Ę#p2隚=2w!ƎMS846"5#}+H?Tl}>xK D}UZTGIԸqR$_"_yUA{S]XwSԢdh^Xu$F]N4QBT1^X3j_Jуv3^ĸĘ^z^MτB1 ޴D^=?hև{9t3/MM G /6C^QMjOt"&^^͏9=o g]cY_Y1!~ *^nMqBC̗,c%I݇/K6j0wPu;1u쳮,'؅7v/%GKvv.b<`D7f;՞?k[eύ®[X S3_@CQ1WĈ5vw>eMگ[f811vwc>6}@(m1, hNdO$FgXqE ۺta I/ ƽD*O٭1Zqqa{13Jvkƅ1st4| ZAqa{1X-ؾ yPc_D:1$Pn "gS;q%f1剀4,zp'"hՃx>#ut7TM-*j]kƮp bK'1Zķ\gʻŜ# %vaX bO2=Md8i.Z^}tD`ۺLME? *ӴV bLM`mDQ6nFC:2c bo^B xc?w +G$2$5jAp)R^uU^I78 qަxhӗc#"jA1΀۔UH_>Cc@W B8ZoSΩaD:-Dc]BA1΀ݔsyZ,֛po,S﾿8@?;@@sUuD ΖW ~s~o\KcQ08<ֶpf R99-vH>pʭE+cШ( b\tuޜS:fF]ӟ@C]jlN M26UWz/V}P.wiw:"bܺ&BqڛDxyIp9:ȝnM_gHE&c6ݻKaATW"Ɲ0'vGV.: xjxCy.]>ݵ}2Agۇ)(Xo֍'?.Mud*ivX;ɲP+J/};_cRn?x+nzYoO9t8?@(~8rH=q뱗}#(b낛Hw?6敌-.)8%B>~Wմ-i!&nOc!yaV;0^o鰜9%uf?g8=: .|zfqbGիtPv#w 1iYv>O?$ISԂQ!=;vw&{c#4>ܮTԍyT`Eu1A_X7zPײn|ABU*?kwTl'r9NO!̓߁=Yk_?$K/OO~rq>[յ؃#n?!:py5?{ 7uBCO|w3?=g & ؃7A\$㚟79 n_n ґbR~ Ehoܓ$oyd_n<=NAU^XE4g'֑x8.R9~4vNܿiF}oc]OK2L/Atvӿǟz] 9^-m'D߯  `1^dsun|li]~j/Vs^Kjƍ壋t?xq3Ǐ!?c'տ r*̙ԯ_O{vkBWj\ָmuzp16{}W['7g]JkǶkϫ^opkc<۸˞X1vu*uEN'l? TZZKkZ",ƏC"bgvsy מ:i߽ϷǼ~`8s9tR}ـ|N$ Uk`1Y75}hܧin}lwwmv׻/ۑWXM"+>iC"DmavةJ|ݴiG+ W$ UkX1ŞG81^Tߞt)Ƌ2 kON'Rnol*!YE]Ϊ95:YN^)gT17"aT@d\9ĸ!eMy|8|l40/u&O[s .ݛ~Os[Z|yUGW>{g{l $E{ukOV7GS|6\!}\*_k)3sV-}LNs[g-8^[?Z.Ά]BxS?¿8f'fBQ!Y<ɉ5l$]l}NaJLjwqJ09<{*"0.ϖvoځ[csjg9݇; C,IIm vmB/.NN ْ.nϩ.VGv7Ɨgfl[\6cta-v΄ S;nn7ћ=_7\4FG-D/.N_|؞S;J~\ $oL?}1>a]F/skz-;\\ڶCυ8b[s2h`mO36ֲ2 ɑ8b1 sٞNC zHiuDꤞq`.~OAzKot6.^h; u\Q'Lֵ |JGDfOUpyB1nQ]JegVgGޗpvA]{_zwQ1}B=tFxHnHr(5z.~=yBޟ QAM7z~]J?t ן Qĸ)uj~_2?z9iU:mAٚ'ύ8ZsjC,wbz=<:k2Ȱ xx ZυʼE1^]ue~(Y|KUwɄ DTy[*C·bl˄.7t^mc+K`.Ce7Tk? o|<0Ho#<>ss(f?%0y `y2{ b p၀񩑃.,He Ư3bL%`]^oqqmhS,Θwf"D>wֲvb$?ӡSC/CA|8Yu/zWs NuA1OF}eKfǔ51⛿IJ3AG:6Lڎ {LK74fcy̯Sۋsg-]RK셪=`=&%+b>7cR j|YTS[q`q{({L*Z>x4)qK߭ =;Tm~ITX'wIfЬy2X7X U{*6*b>'SA[TDB AƔ L1G͘@WsAEb\PKq2f:O]li>zW+?ĸV Ħm^JX 4wXvپIv?NtNG]7VG+8#qo(hpUVcJ12X/o4FwEwŀ 2SAub*c͊[#W-tصOĸ} =@u*<'Pqj{1op rH$0~cz`kOZ_fi 7֡ b>x@op%b <@SJ88-%U@qF84'"Eib,!̔3;cu2 b\%}.ۧ3+T|7FCc("Zb,'P!˝,'wƥ71ВcŒ k!=:#ȎWFt#S _bg:8mKe&Xmߘ2)%P!|]f/1^<Ý!ٕ$  &px9u)]1xp1Ty2a[6OSXR8 1Cي@JA\X6ٮ0b\nҧ#+驛=~l'NA1/?+ ƎW|W-o7{I,~gz`mS#ĸ}*|I9{t/G:Oe b̝qF:2"94|fbCclk;c.b\2I:Vc!ƙ$|?ʽ4c>iF[m=@;!52Il9y{8xn:1JGwX\>4oq g՗MޢoW}]R`\DXN&/KaVej36 !jT\ U sBn=-־Zc]{6f:,S='r"ƋoRi6ڣ1{~kzT|8UQxپ):T*};1JG^, AͅKP@.43-{Dmɕ"fQ, Gc4{e,?u5[e{DqZXg;hU:xzZeE\LͧM9-1Qŗ!sޗFQk^1LK|ٓѢdXoԂ]/,|p|'j{bec-M-km`s[/p}UC5]-Fٝ?49~jJc, ;JMή⫅`0bAt Wlrݤ-js(7סqqU*vga= #xLY{XFubl'vb0b|q:pbXJa{j]9;bz8bl csSߖs>z'҈b(\v2üXX~~wzg|ZT1yÿ#R@6/C :s;c_ݫ<Ʀg9P"ӗ?cy%eΈ+LbcIWMO>Fw\@奔9#jӞIwY;;`. 5%Wm^/#C_4=e׷&yxw> Ʋ:*W-w MFA_ttE~bAs1֒Uxj.J=|4iy@'L?lK]@KJ47;+pp(1vq.k돢DqcQ vQXnsC?8ucsF}ej>sNfxK:5_.|@ I9ul1#\Nn}5+-#5j1[(֝sj>nfSFb_,Fl}%^-Z c16~;6kuA;L]O=σUV֞d.5b0ĸZ}c^h~L!%>όOGkDl1Zv4E^Ve>1qg\^bq˾jX(}/2&?QB T%b>5Lf&u׷8]"Z=bgY:Z-R>ߘ/^<k\G'LĸZKrSP d!/w,"a1a'n6<0T$ˣX1Uxĸ Ỡ钵Jv&N<6>NlvbY:q#Tx'?y1LkuvX3}ڹ<j;8rYqҪ0 vgqŕ[t"U8}_ l*yޤA)Ks߽jKֹ18'qFOɛҾ-Vy}DENՌcP/?y_WhqQ!w+a3p;LLr-WRk?jHk ^|UĸZKj߈.^; 0^~F;Z7S3bp^ ]WY_;9[:Z-I*-׺1Fs1֒HPk-98$o72v'wBe1vrk\"ݭM\141]mdRϝvE/^jj#s`1ݵR5O ;_p^b\M܈WhUOԯ.vYXȿ91*A;n%7,'7fb|Y:섓VSSltɾG1iWhu{5&{z0 ;tU|XíI _m;1~+4}cGg3={Y;ϊ?v8Zeg] ղԑ_<5 _]Z/cp}>ϧ?Ut0KOB*/c'1>zj7>n'ahp1v%SI=WESo*:7GW[>if?ȇMZYS{gZ$Wb|;KLK^0|\t1vaXoï۬OiWesu>A˒N0ۗzdP;g9Tבax1!?8TKj2k|]8?q4ޕ}7`͵'ƾ_hv7_a&E!YPIPsڿI580gZgR*ķ ,.7s#hTC]bzI6l+d0~[k91R~llFblOz f{x-ǐͲ_C/6Dpoۯ!25b[-;ìoc;"T-.s6 R"j !;j~"cG-~;>tb\%c kUWqgAP__6f"DeS1qpf/縺}W=Y-ώ!R֫sH|{<3D ۟v/oqg1b9afH 1K\TJC4G&#Ƽeb|_x+Za~מ.njIV*f~d*yB-엷x cJ`WBL$!ƿ G%I$0m"5oS "k(bm=덈w1j=Bc 1/ή}d?8%|>RK$Cq,-|dVOk 1~,Dj\>c@"ƈњSBo1~Vxqa:b8'1bCwhrj͜|"O 5.@/Z1F9ErΛ_@j\n1Ή"b@s՜B_A3Џ#9AD_4b3>D_jYM1Ή!b&N9u$ bP ňqNcjSH缻/ on7Չ@(+ӭZ;C&?JJ36X@sM8}i1w^' ƈUN*1Cj,3-Fe#O93gP9~_wyYbNj]cCi77"b$9rgxV^Gc&PO1NMq]h4,#Ng3ϟ3bll%v^̀\}ԪƲb<-oSm¼"Okp]q:a F$8ΐGqLM/T/+ 1N(<~n( B u=CSc^n7&qJiq:>Vy0ORZΘrR#cj i.i돊 rg\-Q{yfA,қ#bXx<8~Y<>sgĞP>K1\ڻI:ΫOaRI+날7'c |oަ GiE+{1N.<^$|~yf0B{B^ŘJBQt|D'5cAO(ڭ_ߪfWiBB%OU$oQ5N+TC$9VLS3: LcWOf>mD%jvP{b;XXxwȯ;.V! f17/XW iU3Fkzq'E]>&Ѭ'^zs̓guIJvfo$OtF"ODK.y~b|9-"6G8p9I=O?E g)rXb1Ϊo1ΐ)qVOș41懜Dg ľYglA<>wLܼ_.GΪRz-8iپ`q%`^ @ݯWԑz}kl`u.I8^f|^ fjX8qL_΁ ;Ģ1.)h 8]ΛNH56%[ƬrZi$_6f51."+W=Pĵn9b\$$W9VSA%dlwJa AgMo(i.V՞MbV2>4.1M.#Cĸb<:szTcreeL&ᮏ;{bfZi'XX poVv<_lȰEF`|Tro$ @GOFaY|DnG9~^y_.xR2ذ1I|8l7e.͞>awSeGP_p\a^*@7?\]V]owF3~<%[ז{I;19) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w+1^ A\E-+1.0T@@P 20ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@?mshoHKLCeA-##ȧA. 7i1q戠,\⌽~ه{KaY(7B Sfw8G񢸫)+K.p''nd ARu^dS?t,_VKrXw|3ui+#IUZ%'*\AWɣGʹ^ W봖~Yҗt= `]Htc?%tjr]_5CJYܡrC Htc?%tlRU#hp<~TLa r55FmXҗrw֠kaCr1]XOZ6t@!wa rUR*cvs%}9siD%#z:QrI.pn*5BjTo{+jry[[җ %ui.#IUZme{Y [4B*yTq{K䪬F*׵/L`OI.pn&܊ϛ nBw;$䪰Նʱ/V:ӿ#j /5TAŇ2+i[48+ٵ׏v{=LAJ{]jb܃#z.d/.&ۻa? 䪰ELkşŷ%蓍F(y˥\$A8VihBd3d4JU\^?*nR0Z<_TZҗkTL(\$A8VihBHӬw n{fvY{\ͩH9:7ǒ\! 7%%tiV.#IUZ}i'7 n{fvY{\Z^.sנ.Hi]ݔQO)eҩuyAM`.+`Sh4t]X3iguiR\$A8Vih߆n 7 n{fvY{\ͬIi;jI_6΂Y-]wHtcmXfD5A[,{{ea r5&5Xҗ`n՗sg[b!\|$p߶[X׏j=LAJ8nxeȰn`N$* -wM,ke${p}]a r5(5gXҗuۚMti(`)]ts"ǚ=^?|_;{\Gˡj,˪mlgƶ. b$ JC:ty5}oM뇇]V W+elXҗ~d]Htcu ,t"ÚeXw>^?t W+eNSM$̍3f =nys3lk)ºTnN1^*gJ<~$* -K 5A>^?P WKRq(I_Vξ/. A$* -Еw7 뇇]V W+e6fe'$l\$A8Vih_XJM7AK3({F0Z^d_Ne1KL\.F 4|/BL7/ Njx{@C{\ZҖ1;e8Z7J`b$ JC5ho#g\V$fK1NC:`$<{X>DTJD3U%X&b,P(X%[ͯOY*&ATVƠZaܸ,u˷A Dx6#;٩y4(V?,յm+o!; 5Ww@nq+,V?,؆9Йb,YS@%Apg_ ZOfDuuh} PŅ)ź/hJQ+nkWhPnG13CrҼ3[r}lň!<3V(b,ӧb|(OGƒW*<~g+Cn ɓsѽz؛ "ÔzW? "NՇPqkkm b\_ur"5b̝qqy|+ƒ+ucb,|@Zޭ 5#$Sւ]k1Fur- jl?!iK:A>PiOz#"PZږ<}aYKϛB`x\0=LAyf|Ǿn*ߘmI] M̷b ydz QV1Fwݖ)պ=,ƗT- XeH] M \N/KMeW{M`.+`Su{j(Ң;~Z/3&(zYuJQ48`^?<첒0ZzJN.ŸuGJ t1&x%`}|u^; 'g/# ~jݞ'C|9SBo&dbH[OJ&hba&XQK,]NLaWr6Njݞ'pZ5@wCM4#-b0uslb<\ GOr}TIG3aRWa rn8v~/w1@x%X2wd.lk;[ס5>oD$ۉvjݞ'pLb<uQ@eE-Zeoee?I?+GU_ WDcAT/;Y${Ƀ M̑SKs3 luYP]n~t$a{\Dew1;OJKA%,d^ S/<^ 8CҋbC2׏d{lS{K\.>.w'DAu]x|OA9cgMIu6^?:R=LAVy|1($߹+'XK,^cN2Z0H Vq:^?n-{\ݸo1^vʝ\sDb,iD>o4u5^?Q=LAVy";\ٗ{dE/D!^ •sDb,y›JYM ׏nP;jSX 'A;V) 4T"b$+*'xXP<5%g_9K7NǼ<ϲϻW W+uQ:V$W:JV.^ɺɮ$y%]ӿ$hpJ`Gv W+"!FE%+"ƈN%yX7Iछ?^?3P WgGA7.('ߩJCS 9` ϛdqt=^?\o_9{\d A7-Z~Duȝ1w*Y\^b7 |gw*blsgbz%`M0DpŝI7>~CIҍ2^?z!=LAVyjViBr 'z϶#o++'Xa#YnXT GU_ WoDDka|)U晱 WΕRkAuLp|MI,uyI%JK_=]mI7@'6\bp$XfblRPNMx%Kf!D;z[-/GmX{yzB%+:)`ᚉٷ5*ZDB}S/ŠzZZ>aF|Ah|,\313=)sz:tC+ۛ׏{=LbL.o|T"Zy v Đ),'v4xabOa t@JRkB|N-8,\11(('!>9t9"m7WGSTVLb<i &`hb5ˆqףi}$=:~a(:8^?]{BkAоn" ヌf(A$tNpܢUym-yGy4hi#͏Q)rUx֚CU&V`z9EA9fc#ͷ0&YMkMAA'Pk~ţ[{Q.e꘠v\Ԭջ8V& V.夗=i.K[fV\@y~FG?,=)HZ=Ot ٪Qd[F)(b,;.uiI"zmm Sbu) VpS1T )M2 b[k%fTYEHتhK5THZa j2;Ƶ UjɔEpLI3IS#qϏx^j^ :v׏|ߺiSPuzDrѽm#SYIf_ Iˀ{O&suU2vNmIU1A0ERMխ6bh>Dauj؍;Y)T7֪KghKu?ݍ@5iW4i>k: 2S# yC`\I%:߀8z߻?.4]xfKt],l5A9U3<5UA'9.F_/Q~$WFa ^u< $?C[N;!(zb,qJQڅVXƤQ^2X)(TK1fJ"o%Ƃ.ԚwōAPN #lv^:v]^ 뇗V@x gSxവtAzDPNXE,EWz8Ѓ]=VL{90âNNxz˦O7v81,lS51՗Eg)TI~o{ܔ\i!0|P'路CNxI"n(ɁC/Ih_گ̭=&t kbWִ5eIR^\|Z8A/z1P^C"gt.>L~crڤ[(9b<Jc>]}ޔ -j~hxى {="MXEȶ K;…n[&A ~hxى {ͫMxv[S.B/If`'uwQNe'6av,K JSd^vbfblUXdQiH)k %失[3ËCgM7J'`9i~hxى {!m 8?G/nY^o*}ۙF+$ Ɠ@ խ)'E)Tʮ -j~hxى {;xf|M9E3ԭ)ZZarRXkHv~,Mai:Xce'6aJG;XɆEz&+I?ѧ 뇆ذٝk1PukJЬ?Ee}.QMA_y9zx/#c؇ь)Z\˴uW4۰4UAS:Q;|8(b~hxى {šԸXoROVg v6ukJ'b^ts>Uig2G뇆ذٗ#ƓF^6CuC#1~@/{=jTkW_2q*wCNlJH'Sk82zI_*Ǐ"/>oLPcr /;a#16\aEoe2TE7z=B7ndz7]x'ȮVCAi^vbf?b\ڟOU֔"ƿы6'|EQ\r /;a1>/+LR5\nt. V%ǚG^hn2x5eH뇆ذ)\A֊71tss!A ƿZGeEoch~hxى {]qQ/^eH(=ܥ}x+|AQ־JCNl@O(ƓY7N~"-@dEifTU33uqe3^?4Ć=Lb|/\9֭)8$u~s}ٵޚ xh9e'6a:wŷ4YXi肍Hʩ`SekFe7}9W_ /;aS=Qg~Q?NnyZNR*u8yBї5/T84ie'6aj"JP߿֯=?zY9/uCeMϛEOE/ 2dFCNlÔUoIrIvm|AnM 1^.-U'cgYhr /;aӟYf/0|g$_ \M.FW[/"rg뇆ذ)t?żudHfpɺ$;KIT _ff.mm-֛]r6лe'6aM6b%"+>_>0 <KCVwkr*Yܥyڋ ئ~hxى `v(܄ `* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`y @ D1gdS @%8 SĘ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb?@8 N!@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  ˷.IENDB`@@@ NormalCJ_HaJmHsHtH b@b +xu Heading 1$ & F <@&5CJ KH OJQJ\^JaJ d@d +xu Heading 2$ & F <@& 56CJOJQJ\]^JaJ^@^ +xu Heading 3$ & F <@&5CJOJQJ\^JaJR@R ?~ Heading 4$ & F <@&5CJ\aJT@T ?~ Heading 5 & F <@&56CJ\]aJN@N ?~ Heading 6 & F <@&5CJ\aJ@@@ ?~ Heading 7 & F <@&F@F ?~ Heading 8 & F <@&6]T @T ?~ Heading 9 & F <@&CJOJQJ^JaJDA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k@(No List <m@<?~1 / 1.1 / 1.1.1 F6U@6 ?~ Hyperlink >*B*ph  !d"        !  !$      d"P/ #YZ!`a D|9G}~9:m./>`gt01@L  % & 5 A H 0 1 X Y  > \ Hy*r"p#>Zs 1VzPyCy7_3Tufgcdg" i w y } 4!B!C!r!t!x!!!!!" " "*"+"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"e"000000@0@0000 00 00 0 0 0 0 0 0 0 0 0 0 0 0  0000 0090909 0000 00m0m0m0m0m0m0m 00g0g0g0g0g0g0g0g0g 00 0 0 0 0 0 0 0  00 0 0 0 0  0( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0 0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p 0 0000000000000000000000000000000000000000000000000@0@00`000000000000000000000@0@00@000000000/ #Z!`a D|9G}~:m  % & H  > \ Hy*r1VzCy7Tug" e" @0@0 00Y* 0YY00p0p0p0p0000000* 0YY00* 0YYK0000*A 0YYK00K00K00K00$K00K00K00K00K00K00K0#0$$K0$0%`K0$0K0$0K0$0@0K0)0 *쐚K0)0K0)0K0)0K0$0K0$0@0K000K000K0$0@0K0405HgK040K040K0809g@0K090K0$0K0<0=(hK0<0@0K0$0@0K0A0BhK0A0K0A0K0$0K0$0K0$0%$K0$0K0$0K00K0(0)p$K0(0K0(0K00K0,0K0,0K00K0203{P0 %"b'd* "$ 1>#"d'C)M*d*!#%&'c*Nud"X8]^@]0(  B S  ?d"e"e"9*urn:schemas-microsoft-com:office:smarttagsplace  FL ":QT^ 9FUbcqrz-.6mgs9 G H P a h x  ` j " - = G   0 < P Z n ~ <>am ;D%>H",bnp! /CThxPZ`jy|-6al7B_qs{4<[\`; ? A D F N Q [ ! !!!!"!%!*!4!?!H!S!^!k!!!+"8"9"="A"e" #+IK 8GK~:l->_txU ! $ 1 W Y  " * B J ` h % ;C",'/BJ^fw5=Zb~#PZy|O] 64:U[go<\" & i k ! !C!E!!!!!+"9"A"e"33333333333333333333333333333333333333333333333333333333333333333333333333333333333/ #9Gm`t1?@L  & H r8opggi x z } ~ 4!C!r!s!u!w!!!!!!!" "+"@"A"e"A"e" x8v2  ?C(L0SF&n@z+V1_$V%  [e dh , x k^`ko(0^`0o(.0^`0o(..88^8`o(... `^``o( .... `^``o( ..... ^`o( ...... ^`o(....... pp^p`o(........k^`ko(0^`0o(.0^`0o(..88^8`o(... `^``o( .... `^``o( ..... ^`o( ...... ^`o(....... pp^p`o(........^`OJPJQJ^Jo(-^`OJQJ^Jo(hHopp^p`OJQJo(hH@ @ ^@ `OJQJo(hH^`OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHoPP^P`OJQJo(hH^`OJPJQJ^Jo(-^`OJQJ^Jo(hHopp^p`OJQJo(hH@ @ ^@ `OJQJo(hH^`OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHoPP^P`OJQJo(hH^`o(. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH. P^`PhH @@^@`hH. 0^`0hH.. ``^``hH... ^`hH .... ^`hH ..... ^`hH ......  `^``hH.......  00^0`hH........ hh^h`hH. P8^`PhH.. ^`hH... xp^`xhH.... @ ^`hH .....  X ^ `XhH ......  x^ `hH.......  8H^`8hH........  `^``hH.........^`o(. \ ^ `\o(.808^8`0o(..808^8`0o(... ^`o( .... ^`o( ..... `^``o( ...... `^``o(....... pp^p`o(........ hh^h`hH. P8^`PhH.. ^`hH... xp^`xhH.... @ ^`hH .....  X ^ `XhH ......  x^ `hH.......  8H^`8hH........  `^``hH......... @z+Vdh0SF?C[exxv2 _$V xS        Lr                          )(\ m "d!#"'A,,1F2\9V>wL_N8h`=c:d1eW"h+xu {}e=jf#PULRQpA3l0?~rr>vsU>@ 8*##d"P@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New;Wingdings"qhoz2%>!24d0"0" 2QHP)?+xu2'Ahead AAC Decoder library documentation Menno Bakker Menno Bakker0       Oh+'0 0< \ h t(Ahead AAC Decoder library documentationMenno Bakker Normal.dotMenno Bakker21Microsoft Office Word@"G,@Ҫ6@%՜.+,D՜.+,d  hp  Ahead Software AG>0" (Ahead AAC Decoder library documentation Title 8@ _PID_HLINKSAh*mailto:mbakker@nero.comg  !"#$%&'(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqstuvwxyz{|}~Root Entry F'KData )P1TablerbWordDocument.PSummaryInformation(DocumentSummaryInformation8CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89qfaad2-2_10_0/docs/Ahead AAC Decoder library documentation.pdf000066400000000000000000000720011374350120500235100ustar00rootroot00000000000000%PDF-1.3 % 29 0 obj<> endobj xref 29 19 0000000016 00000 n 0000000921 00000 n 0000000676 00000 n 0000001001 00000 n 0000001144 00000 n 0000001168 00000 n 0000001316 00000 n 0000001485 00000 n 0000001859 00000 n 0000001903 00000 n 0000001979 00000 n 0000002348 00000 n 0000002869 00000 n 0000003104 00000 n 0000003138 00000 n 0000005807 00000 n 0000006659 00000 n 0000006888 00000 n 0000014179 00000 n trailer <]>> startxref 0 %%EOF 31 0 obj<>stream xb```f``d(31 P9.000冰C@IF m)?OnT4f * WR  (&Cm `eS`=C[c${4.Y@&!/fbk"o(% endstream endobj 30 0 obj<> endobj 32 0 obj<> endobj 33 0 obj[34 0 R] endobj 34 0 obj<>/Subtype/Link/A 47 0 R>> endobj 35 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>> endobj 36 0 obj<> endobj 37 0 obj[/Indexed 42 0 R 255 44 0 R] endobj 38 0 obj<> endobj 39 0 obj<>stream HlKO0{L$B q@X\(uK)ERi8 _Z|;;yd“aY1jXJTo =H),毱|U i{x?lm mN鐺ڿ hBX9EfS쇜 )rdp.93s]! lBG@U՟iI|ڢ65E]1W]/nl]պ.kJp41(586;Q9/G#kq y.3(| n!dv2X%@~ hw endstream endobj 40 0 obj<> endobj 41 0 obj<> endobj 42 0 obj[/ICCBased 43 0 R] endobj 43 0 obj<>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 44 0 obj<>stream H""" Ƨ੩ooo^^^TTTPPPQQQ]]]fffwwwηqqqbbb[[[YYYaaalllů```XXXSSSvvvɔ000 !!!:::eeezzzMMM888}}}NNN@@@999===FFF\\\sss>>>&&& 222RRR~~~꭭ccc'''###͖+++666ggg((( CCC|||DDD ...)))---rrr111,,,iii555uuu***BBB777mmmWWWEEE䓓ppp<<<磣UUU%%% kkk{{{՝KKKAAA$$$hhhHHHZZZIIIjjjyyyVVV444腅nnn333dddJJJ???xxxOOO___ϲLLL///GGGttt;;; ~ endstream endobj 45 0 obj<> endobj 46 0 obj<>stream Hy\Ue/]LP%AEprP1eKp 5ƅ( TD(rGAPpG3-E\r4F\fƦ揁{A; |Y|9Q                     Dc̜0yYǎ-eFh5k}r`EvL A!;6d ؐ`Cvl A!;6d ؐ`Cvl A!;6d ؘھоMG[;;ێ:Хlٝu^.v\{ʽldǣR1;ۗ;2t^d7%;<|Fӭ?zX7K98"c3!.'ɲ #1&DM|˧Mi1zPf͞hXտqq?h<^`!8-\EmxۼWKw^X!.Ή#.|iOe 5eZ 'Бh;Vd8^넋Z Y+~6 QMM227j&\Cϒ̫;p:#?@nܼEn.ngA;fx$l xnΕkec!]I-ߎ~9YַhLL5gbrkp|ti}gWٱwS 6FvdQP@lĶ`ѩ븁c`E|+u(>kh%>¦R1`Ńl+kZȘ̿K8g}iGYضQ9FBiEYrcVֲeߏvElG~/?ƻkx3b'EaYpe8os#CfIE?۸ằBB:UH^Ym'x>&YR;/9yP;\Uv7ͱ`G2-x~ j9=Eb޺ 5Ў3Hv)ɑemL܎s =>}:WSE(w%6Kr.?W7a}U1n8xUVsrciqv ToYe>P$7n\y"n/Iy5|gjfcAvEH#Ae |~/"vjw{xk2v]U+YVaMչcZnGyUrSTƭz l_q[A9PZ'"*|NITԘL_1E:ȹC!dG3Q#I[|?XD?N;! ѳ-jdaήrVv=[ (,Wee cRCYJt ߘ`FNC)1O+az"<9 34%IYQcԅ{ݳZƢp>8Jr =YV塝 v<]4usMk75JP4>LS`'Z5BZVjb}ƓBvMs !$Fu,g_W$yr4z;5ﰭGmTp,]+=>t|% yq 3SǯN ~)B)4G*\IA塜}:܁2y5g,r wl 8N˛6:Z9C{:E,5Y?4;tOM\QUUs)Ñh?Bf35{w2z\8Iͤ;YISWl .Tk픘<;w5`+pwR1Y5e;Y)SOX.Vb{By<]\_fgE(tK%{T{pbOP_;{ZUw%w΋%vZ/8;;|yKvʹlİDTXm5u )%X@yw!J=ؗaz܁PFH(r@E>*N3ɮ;Е@*O^re(6SCZUur]i/xeerJThܿ$H-PujSԜ2j@hOTknt.svK̡̎=y}q+- 8QR,3Q,q״@F\m5;ͷsˤM=7'ܺ2wcRPxysfS:ť[)rl{wB߻YykF-q}y=A~>qQu~:ŭt>G|g]=7sFy迮y隸үL &I{Wѷ"wwwwwwwwwwwwwwwwwwwwwȨꎼ))))ǾXR_)wǎU T' 1Yib w,P%@u*;D* wHwȈE@FC@FC@F2b];d;d;dD! #! #Nb0ϑU8]7)vx.cWex;s#R}W v5 2;s%v;2I__5Ug+P̈mtNg g@D[&\(w*!<+JJo+-޺I(PGOa`+Je]*Sp`::9:YFnqMO?ǽ%X`:@\( d)=7\nES;_?n5M(厗`FۑsNX66'u0vѐvn m,YHR m3\at@0lMܱ v['jnN9yFE,@p,wtږuF;,/jD OV;q^.)fU!y؜Fܨ{<=xOպ;ܺ%yS;uk&a`@?\#'PNpV;p4)OLH['d+"khhowH\R-]#@ W3w[m2p#&+mo"X{ja]A7\Z';$,p=q,w 3|A{@MdZRunwH8YzXYM~1bDxV)pGF ;:`(SFf%ɖp=I#t4bpwH\Aj;n@G Cl/@H/>֕,ᗝf~ `YBR`fT>Y^Yg3 Dtӈp-°1ôuɊi*68V_ûcbh=6H$(|gٝBGqd DZwRLk0;J6,N$m_g &G5а[OyQQQc=;4=>:Lw6/z.t_5CԼܡq?Dv2Ÿ[܂ό|BMq:lw!&?eq( A",,](L<Ce(Rx0BBH,Cj!C^XRAAK芉`<3;swwwEa[_NN`ᓒrK,4vO*MtT(1K\-(.]l}i[in74} 2e/Y>fIk&9U{vkcQ@  qw \G,-k-JG2Jʹm1IsmKɒ%䉜dUlJ˳%Hۧciex;vܳC˙6(*Z-6'Kk>fpnݶ{ǥ9Q9f陗F7i;y4ܦkO]hKهT%~m0_l27ˁu}.Ϯo/1zEqW<ң";o4t[<Ѥ)1~ϫqo_gxGmCLڧQP#*L;#]м\r{m՞=D{Gh4?OZ$R܊b>ucE6ԇO_׶PSs59NauI~NL,q:ūh벳*OF϶> endobj 1 0 obj<> endobj 2 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj<>stream HWrF}+*/ed_`7lۅ%b@%JME! U6sN4/Ol`.n&+>:xnA2a;隮@u7ŀ9 rGbqT}җ*02i|cdv~PF3v>v`f7bbwӾ=Z]Bbx^̞wdơ8-W}c=M,=m"ќiGUD)[EU?~mk6aG=vpM_ϭ~ó"%ݦB|&$TVR<ְy,<΢9J!һXM4e,<< .-yy^2Ll^/kzY gߨX $ [)ߍkG;u[KXѲpuI4hv$vtɪImv_:x{0Q䴝t%)m.am*s "8[u5wo}ŧY_ ;-@˓b9XO俪dZfH3h\t<ڹcz ,:4(3Xeʪ3d\T1!NaUϤTG^|q(`3w~6!uE Amu-'L_~W]ff5w+]63Z]wcMpo@ˎ]s Wͦ">rhXF/ 䦞3ڞ,#i) 9 )7! endstream endobj 4 0 obj<> endobj 5 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 6 0 obj<>stream HVrF }Wq6S8qҦMlO>9J\ZLiR%:FݼDI?ܸpf/ً4 48or?r|Hg8lA>>n۪h QJ*h729xu&(U39^ X濦?ܐM/o@d!9BE]AA:?yQJ)~Zuy.0 ފF %ɽ].t u-#Euwdhe~|{tч%2bbB] V/^h!+A(^ ]7P7 lpxDV.y$e9EWd:=1јo'5d&DC:5k,R "<}_!!oؿu`<;O^vVs*PSzlJP ̙Zd 0{brV:9ۦ#(琢XH8FeDȟUǐwHsbl\[{)JU덨*G$6[Jtrb:$[Ҷ'Ke60NFC^'Z_F&.R.ڍG"XLe;~"(K`앆5pϯ"dR0} ]JjrtiRݘa'[l_UnQnr]뽃#. "gkgNLJq~f8CƄQ-nGUR7 6.+>Wuw P56UdX\5nDŽ~_Ȉ54Ũމx~D5Fza!3r 3C$醙88@VnAn]o2}Ppij?)!8IcuL6Ba>/O0<݄Wհd6E(*ptSS8j`[m"mM TM>VŤNCAj33ܓ& TX2;lt1 ^"loO1JUA54tpp >[mX5K!k81ոdIޡ]th-ZMfN܍&NoY.hc3r,֎%NRWh <.'Gi7}h@e[Y{gKޮ܋rPjDsLf"ts"BV<]$w]Xm L,Aq?6Z}ޚCal:M:DFl Cg+C^Mq?!\ʌ 289pry1&qp];%gs4LDt endstream endobj 7 0 obj<> endobj 8 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 9 0 obj<>stream HWMo6WEZԊm''竛",i0(%CE{gHJ,'YvL>g{3:!|tNqCt6&`jB#zdm6~K[K?Y"݆ON`MKkqJ&2 L jmN-+'bazUu.H}p!̱1*y`4lWxyW]jG2nUm؎,~ UY @3*kAh#K*(IrmN!/H*dxdx2YȓOU_BXdC9s('q"YY+#A,'ɴ-Hde*L}-\Ť0 6;HcatHcT٘6 M 3+؀/`6`Av$3Pضu,(pb⺬Tgv2ϟ3퓢A*HD]"N-)`%hp cWwGˢy2KؖICn dȊ 9]oLև7$ 0AhƝy D ۆ<4a|9$=j A?Zjq,}[6]' i4C5$uUAKw̚N!PD]@FVYmalUYКL|5M0>TD!~&%+kN^@ ޸J_,iCtn1)BF:Nji6 Ս;sOy o}^>1J .(ugLWs'`-φ}|!5-Eնw0ޏ9ڳ?qQr]dX`n N)UE^UY/s`UG]Ov}IܕWK'=ֿCFxO=];6w 23bdу}jJv}8|A:@D!Ý>!wU8+0 endstream endobj 10 0 obj<> endobj 11 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 12 0 obj<>stream HWnF}W З9Dȃ"ˉW6,y"STUݢ14s/,)(~y:.DHGۑNt߅pG^{Vh/aI |ח3Ci,FA%Dd%)O+lH"se M% *l+Y$`%Ƙj7n <(e;Iݳ~ObʳgLuRP)B HD'-0gCdG+ |kT1R0)$+d+TՅSo`&b836Ѵ =cy} Bi׭*TV#3-$DA'e%q&+Sv.°9>CޱF o&E, 5]vM/=D!JYp'[I\ 8௞Uw긺rfP@` ɹx"UE4'?@9tdpJ]giV4zC_y'ȳ>;e5t(-W gJ9k⩳[$eh^~~B?]_4Ci?*Nk~.kA ,?7r {#j &=yh` e H  hS2^Ƶ+ j8K( ^1fjfUgm~\kd_^4pj!y%*nt&o"VT~]cP.eECPzFÑcA5w}( C,y[p[R$~/5q"3NCPr0X# W?ڶIt>Mdt{<*+AC5ceY~o6IS 䔛w6ARq6 N)éӴè^9kl||$b#i7A`)I,J;6x':p"lڢ]fzL8NwLH&F~BK!m\ICV$eώ ?:gM`LKnt |xMwMHRkRex'Vq\YYy*ZJTa* ake:[A|׳b~ 0]ib~~V qWۘoKt{SÛ雟og0wl1'oEٳQ(o۵gS/-`鿽º||C&W|h =)ynab4Ppm/%lE\D<|IUwЉx> endobj 17 0 obj<> endobj 18 0 obj<> endobj 19 0 obj<> endobj 20 0 obj<> endobj 21 0 obj<> endobj 22 0 obj<> endobj 23 0 obj<> endobj 24 0 obj<> endobj 25 0 obj<> endobj 26 0 obj<> endobj 27 0 obj<>stream Menno BakkerAhead AAC Decoder library documentationAAC decoder library endstream endobj 28 0 obj<> endobj xref 0 29 0000000000 65535 f 0000014234 00000 n 0000014360 00000 n 0000014477 00000 n 0000015884 00000 n 0000016010 00000 n 0000016127 00000 n 0000017597 00000 n 0000017723 00000 n 0000017841 00000 n 0000019640 00000 n 0000019769 00000 n 0000019888 00000 n 0000021677 00000 n 0000021806 00000 n 0000021891 00000 n 0000022480 00000 n 0000022852 00000 n 0000023342 00000 n 0000023574 00000 n 0000023800 00000 n 0000024011 00000 n 0000024411 00000 n 0000024662 00000 n 0000025074 00000 n 0000025109 00000 n 0000025133 00000 n 0000025217 00000 n 0000028793 00000 n trailer <> startxref 116 %%EOF faad2-2_10_0/docs/libfaad.3000066400000000000000000000317531374350120500153200ustar00rootroot00000000000000.TH man 3 "15 Nov 2014" "The Debian Project" "libfaad Documentation" .SH "NAME" libfaad \- C library for AAC Decoding .SH "SYNOPSIS" .sp .ft B .nf #include .HP .BI "char NEAACDECAPI *NeAACDecGetErrorMessage(" "" "unsigned char " errcode ); .HP .B "unsigned long NEAACDECAPI NeAACDecGetCapabilities(void);" .HP .B "NeAACDecHandle NEAACDECAPI NeAACDecOpen(void);" .HP .B "NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(" .BI "NeAACDecHandle " hDecoder ");" .HP .B "unsigned char NEAACDECAPI NeAACDecSetConfiguration(" .BI "NeAACDecHandle " "hDecoder" ", NeAACDecConfigurationPtr " config ");" .HP /* Init the library based on info from the AAC file (ADTS/ADIF) */ .B "long NEAACDECAPI NeAACDecInit(" .BI "NeAACDecHandle " hDecoder ", unsigned char *" buffer ", unsigned long " "buffer_size" "," .BI "unsigned long *" "samplerate" ", unsigned char *" "channels" ");" .HP /* Init the library using a DecoderSpecificInfo */ .B "char NEAACDECAPI NeAACDecInit2(" .BI "NeAACDecHandle " "hDecoder" ", unsigned char *" "pBuffer" "," .BI "unsigned long " "SizeOfDecoderSpecificInfo" "," .BI "unsigned long *" "samplerate" ", unsigned char *"channels" ");" .HP /* Init the library for DRM */ .B "char NEAACDECAPI NeAACDecInitDRM(" .BI "NeAACDecHandle *" "hDecoder" ", unsigned long " "samplerate" ", unsigned char " "channels" ");" .HP .B "void NEAACDECAPI NeAACDecPostSeekReset(" .BI "NeAACDecHandle " "hDecoder" ", long "frame" ");" .HP .BI "void NEAACDECAPI NeAACDecClose(NeAACDecHandle " "hDecoder" ");" .HP .B "void NEAACDECAPI *NeAACDecDecode(" .BI "NeAACDecHandle " "hDecoder" ", NeAACDecFrameInfo *" "hInfo" "," .BI "unsigned char *" "buffer" "," .BI "unsigned long " "buffer_size" ");" .HP .B "void NEAACDECAPI *NeAACDecDecode2(" .BI "NeAACDecHandle " "hDecoder" ", NeAACDecFrameInfo *" "hInfo" "," .BI "unsigned char *" "buffer" ", unsigned long " "buffer_size" "," .BI "void **" "sample_buffer" ", unsigned long " "sample_buffer_size" ");" .HP .B "char NEAACDECAPI NeAACDecAudioSpecificConfig(" .BI "unsigned char *" "pBuffer" ", unsigned long " "buffer_size" "," .BI "mp4AudioSpecificConfig *" "mp4ASC" ");" .PP For normal use link it with the linker option \-lfaad\&. .PP For Digital Radio Mondiale link it with the linker option \-lfaad_drm\&. .sp .SH "DESCRIPTION" .PP .B NeAACDecGetErrorMessage .PP .B char NEAACDECAPI *NeAACDecGetErrorMessage(unsigned char errcode); .PP Convert an error code to text. .PP .B NeAACDecGetCapabilities .PP unsigned long NEAACAPI NeAACDecGetCapabilities(void); .PP .PP This function returns the capabilities of the decoder in a 32 bit unsigned integer. The bits that are set in the 32 bit unsigned integer define with which capabilities the library has been compiled. .PP The following capabilities are defined: .PP \ .PP #define LC_DEC_CAP \ \ \ \ \ (1<<0) /* Can decode LC */ .PP #define MAIN_DEC_CAP \ \ \ \ (1<<1) /* Can decode MAIN */ .PP #define LTP_DEC_CAP \ \ \ \ \ (1<<2) /* Can decode LTP */ .PP #define LD_DEC_CAP \ \ \ \ \ (1<<3) /* Can decode LD */ .PP #define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ .PP #define FIXED_POINT_CAP \ \ \ (1<<5) /* Fixed point */ .PP .PP This function can be called anytime. .PP .B NeAACDecOpen .PP NeAACDecHandle NEAACAPI NeAACDecOpen(void); .PP Returns a handle to a decoder context. .PP .B NeAACDecClose .PP void NEAACAPI NeAACDecClose(NeAACDecHandle hDecoder); .PP Closes a decoder context that has been opened by NeAACDecOpen. .PP .B NeAACDecGetCurrentConfiguration .PP NeAACDecConfigurationPtr NEAACAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); .PP Returns the current decoder library configuration. .PP .B NeAACDecSetConfiguration .PP unsigned char NEAACAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config); .PP .PP Sets a new configuration structure for the decoder library. .PP \ .PP Return values: .PP 0 \[en] Error, invalid configuration. .PP 1 \[en] OK .PP .B NeAACDecInit .PP long NEAACAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels); .PP .PP .PP Initialises the decoder library using information from the AAC file. The buffer parameter should hold a small part of the AAC file, so that the initialization can be done based on the ADTS or ADIF header. Buffer can also be NULL, but then default initialization parameters will be used. .PP Return values: .PP < 0 \[en] Error .PP >= 0 \[en] Number of bytes read. This amount of bytes should be skipped by the program using the decoder library. .PP This function fills the samplerate and channels parameters with the detected values. .PP .B NeAACDecInit2 .PP char NEAACAPI NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); .PP Initialises the decoder library based on an AudioSpecificConfig as found inside a MP4 file. .PP Return values: .PP < 0 \[en] Error .PP 0 \- OK .PP This function fills the samplerate and channels parameters with the detected values. .PP .B NeAACDecInitDRM .PP char NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, unsigned long samplerate, unsigned char channels); .PP Initialises the decoder library for Digital Radio Mondiale using the specified sample rate and a DRM specific channel configuration. .PP Return values: .PP < 0 \[en] Error .PP 0 \- OK .PP Values for the channel configuration: .PP #define DRMCH_MONO 1 .PP #define DRMCH_STEREO 2 .PP #define DRMCH_SBR_MONO 3 .PP #define DRMCH_SBR_STEREO 4 .PP #define DRMCH_SBR_PS_STEREO 5 .PP .B NeAACDecDecode .PP void* NEAACAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); .PP .PP Decodes the AAC data passed in buffer. .PP Returns a pointer to a sample buffer or NULL. Info about the decoded frame is filled in in the NeAACDecFrameInfo structure. This structure holds information about errors during decoding, number of sample, number of channels and samplerate. The returned buffer contains the channel interleaved samples of the frame. .PP .B NeAACDecDecode2 .PP void NEAACDECAPI *NeAACDecDecode2(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer, unsigned long sample_buffer_size); .PP .B NeAACDecAudioSpecificConfig .PP char NEAACDECAPI NeAACDecAudioSpecificConfig(unsigned char *pBuffer, unsigned long buffer_size, mp4AudioSpecificConfig *mp4ASC); .PP .B Structures .RS 4 .PP NeAACDecConfiguration .RE .PP typedef struct NeAACDecConfiguration .PP { .PP \ \ unsigned char defObjectType; .PP \ \ unsigned long defSampleRate; .PP \ \ unsigned char outputFormat; .PP \ \ unsigned char downMatrix; .PP \ \ unsigned char useOldADTSFormat; .PP } NeAACDecConfiguration, *NeAACDecConfigurationPtr; .PP .PP Members: .PP defObjectType: determines the default object type assumed when the library is initialized without any data from the AAC file (eg: when NULL is passed as buffer in NeAACDecInit()). Can be any of the following values: .PP #define MAIN \ \ \ 1 /* MAIN */ .PP #define LC \ \ \ \ 2 /* Low Complexity (default) */ .PP #define SSR \ \ \ \ 3 /* Scalable SampleRate */ .PP #define LTP \ \ \ \ 4 /* Long Term Predition */ .PP #define HE_AAC \ \ 5 /* High Efficiency (SBR) */ .PP #define ER_LC \ \ 17 /* Error Resilient Low Complexity */ .PP #define ER_LTP \ \ 19 /* Error Resilient Long Term Prediction */ .PP #define LD \ \ \ \ 23 /* Low Delay */ .PP #define DRM_ER_LC 27 /* special object type for DRM only if linking with \-lfaad_drm */ .PP defSampleRate: determines the default samplerate assumed when the library is initialized. Default value is 44100. .PP outputFormat: determines the output format returned by the decoder library. Can be any of the following values: .PP #define FAAD_FMT_16BIT \ 1 /* 16 bit integers */ .PP #define FAAD_FMT_24BIT \ 2 /* 24 bit values packed in 32 bit integers */ .PP #define FAAD_FMT_32BIT \ 3 /* 32 bit integers */ .PP #define FAAD_FMT_FLOAT \ 4 /* single precision floating point */ .PP #define FAAD_FMT_DOUBLE 5 /* double precision floating point */ .PP downMatrix: determines whether a 5.1 channel AAC file should be downmatrixed to 2 channel output (value: 1) or whether the output should stay as 5.1 channels (value: 0). .PP useOldADTSFormat: determines whether the decoder should assume the currently defined 56 bit ADTS header (value: 0) or the 58 bit ADTS header (value: 1) defined in previous versions of the AAC standard. This value should normally always stay at the value 0, it only exists to provide playback capabilities for people that have AAC files with the old header format. All current encoders should output the new ADTS format. NeAACDecFrameInfo\ .PP This structure is returned after decoding a frame and provides info about the decoded frame. .PP typedef struct NeAACDecFrameInfo .PP { .PP \ \ unsigned long bytesconsumed; .PP \ \ unsigned long samples; .PP \ \ unsigned char channels; .PP \ \ unsigned char error; .PP \ \ unsigned long samplerate; .PP \ \ unsigned char sbr; .PP \ \ unsigned char object_type; .PP \ \ unsigned char header_type; .PP \ \ unsigned char num_front_channels; .PP \ \ unsigned char num_side_channels; .PP \ \ unsigned char num_back_channels; .PP \ \ unsigned char num_lfe_channels; .PP \ \ unsigned char channel_position[64]; .PP \ \ unsigned char ps; .PP } NeAACDecFrameInfo; .PP \ .PP Members: .PP bytesconsumed: the number of bytes consumed for decoding this frame. .PP samples: the number of audio samples in this frame. Each channel is counted separately. So when a single channel has 1024 samples and the file has 2 channels, this value will be 2*1024 = 2048. .PP channels: number of audio channels in this frame .PP error: contains an error value if an error occurred, 0 otherwise. .PP samplerate: the samplerate of the frame. .PP sbr: tells whether sbr is used in this file or not. Can contain any of the following values: .PP #define NO_SBR \ \ \ \ \ 0 /* no SBR used in this file */ .PP #define SBR_UPSAMPLED \ \ 1 /* upsampled SBR used */ .PP #define SBR_DOWNSAMPLED \ 2 /* downsampled SBR used */ .PP #define NO_SBR_UPSAMPLED 3 /* no SBR used, but file is upsampled by a factor 2 anyway */ .PP object_type: contains the object type of the AAC file. Can be any of the values as defined in 1.9.1. .PP header_type: contains the header type of the file that is being decoded. Can contain any of the following values: .PP #define RAW \ \ \ \ 0 /* No header */ .PP #define ADIF \ \ \ 1 /* single ADIF header at the beginning of the file */ .PP #define ADTS \ \ \ 2 /* ADTS header at the beginning of each frame */ .PP num_front_channels, num_side_channels, num_back_channels, num_lfe_channels: each of these values contain the number of channels of a certain type. .PP channel_position[64]: contains the position of each of the channels that is returned by the frame decode function. Can contain any of the following values: .PP #define FRONT_CHANNEL_CENTER (1) .PP #define FRONT_CHANNEL_LEFT \ (2) .PP #define FRONT_CHANNEL_RIGHT \ (3) .PP #define SIDE_CHANNEL_LEFT \ \ (4) .PP #define SIDE_CHANNEL_RIGHT \ (5) .PP #define BACK_CHANNEL_LEFT \ \ (6) .PP #define BACK_CHANNEL_RIGHT \ (7) .PP #define BACK_CHANNEL_CENTER \ (8) .PP #define LFE_CHANNEL \ \ \ \ \ (9) .PP #define UNKNOWN_CHANNEL \ \ \ (0) .PP ps: PS not used (0) or used (1). API usage\ .PP The following pseudo\-code describes how and in which order to use the different library functions. .PP \ .PP unsigned long cap = NeAACDecGetCapabilities(); .PP // Check if decoder has the needed capabilities .PP \ .PP // Open the library .PP NeAACDecHandle hAac = NeAACDecOpen(); .PP \ .PP // Get the current config .PP NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(hAac); .PP \ .PP // .PP // If needed change some of the values in conf .PP // .PP \ .PP // Set the new configuration .PP NeAACDecSetConfiguration(hAac, conf); .PP .PP // Initialise the library using one of the initialization functions .PP char err = NeAACDecInit2(hAac, asc, asc_size, &samplerate, &channels); .PP if (err != 0) .PP { .PP \ // .PP \ // Handle error .PP \ // .PP } .PP \ .PP // Loop until decoding finished .PP do { .PP \ // .PP \ // Put next frame in buffer .PP \ // .PP \ .PP \ // Decode the frame in buffer .PP \ \ \ \ samplebuffer = NeAACDecDecode(hAac, &hInfo, buffer, .PP buffer_size); .PP \ .PP if ((hInfo.error == 0) && (hInfo.samples > 0)) .PP { .PP \ // .PP \ // do what you need to do with the decoded samples .PP \ // .PP } else if (hInfo.error != 0) { .PP \ // .PP \ // Some error occurred while decoding this frame .PP \ // .PP } .PP } while (more data available); .PP \ .PP NeAACDecClose(hAac); .SH "SEE ALSO" .PP \fBlibfaad_drm\fR(3), \fBlibfaac\fR(3)\&. .SH "AUTHOR" .PP Menno Bakker .PP Man Page by Julian Cable faad2-2_10_0/faad2.spec.in000066400000000000000000000133321374350120500151510ustar00rootroot00000000000000# option to compile without XMMS plugin %if %{?without_xmms:1}%{!?without_xmms:0} %define _without_xmms --without-xmms %else %define _with_xmms --with-xmms %endif # this has been taken from http://www.hyperborea.org/software/dillo/dillo.spec ################################################################################# # Identify which distribution we're building on. # This will determine any changes in menu structure or release number (i.e. .mdk) # Eventually, need to make this configurable from the rpmbuild command line. %define freedesktop %(if [ -e /usr/share/applications ]; then echo 1; else echo 0; fi;) %define conectiva %(if [ -e /etc/conectiva-release ]; then echo 1; else echo 0; fi;) %define mdk %(if [ -e /etc/mandrake-release ]; then echo 1; else echo 0; fi;) %define suse %(if [ -e /etc/SuSE-release ]; then echo 1; else echo 0; fi;) %define oldsuse 0 %if %{suse} %define oldsuse %(if [ `grep VERSION /etc/SuSE-release | sed -e "s/VERSION = //"` \\< 8.0 ]; then echo 1; else echo 0; fi;) %endif %define oldredhat %(if [ -e /etc/redhat-release ]; then echo 1; else echo 0; fi;) && !%{mdk} && !%{suse} && !%{conectiva} && !%{freedesktop} %define plain !%{mdk} && !%{suse} && !%{conectiva} && !%{oldredhat} && !%{freedesktop} Summary: C library and frontend for decoding MPEG2/4 AAC Name: faad2 Version: @VERSION@ Release: 1 License: GPL Group: Applications/Multimedia Source0: http://download.sourceforge.net/faad/%{name}-%{version}.tar.gz #Patch: faad2-%{version}.patch BuildRequires: autoconf, automake, libtool, gcc-c++ %if %{?_with_xmms:1}%{!?_with_xmms:0} BuildRequires: xmms-devel %endif URL: http://www.audiocoding.com/ ################################################################################# %if %{?_with_xmms:1}%{!?_with_xmms:0} # GTK Dependencies %if %{mdk} BuildRequires: libgtk+-devel >= 1.2.0 %endif %if %{suse} BuildRequires: gtk-devel >= 1.2.0 %endif %if !%{suse} && !%{mdk} BuildRequires: gtk+-devel >= 1.2.0 %endif %endif BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root Packager: a.kurpiers@nt.tu-darmstadt.de %description FAAD 2 is a LC, MAIN and LTP profile, MPEG2 and MPEG-4 AAC decoder, completely written from scratch. FAAD 2 is licensed under the GPL. Includes libmp4ff, a Quicktime library for UNIX in a freely redistributable, statically linkable library. %package devel Summary: Development libraries the FAAD 2 AAC decoder. Group: Development/Libraries Requires: %{name} %description devel Header files and development documentation for libfaad. %if %{?_with_xmms:1}%{!?_with_xmms:0} %package xmms Group: Applications/Multimedia Summary: AAC and MP4 input plugin for xmms Requires: %{name}, xmms %description xmms The AAC xmms input plugin for xmms recognizes AAC files by an .aac extension. This MP4 xmms plugin reads AAC files with and without ID3 tags (version 2.x). AAC files are MPEG2 or MPEG4 files that can be found in MPEG4 audio files (.mp4). MPEG4 files with AAC inside can be read by RealPlayer or Quicktime. %endif %prep #%setup -n %{name} %setup -n %{name}-%{version} #%patch -p0 %build #sh bootstrap ./configure --with-drm %{?_with_xmms} %{?_without_xmms} --prefix=/usr make %install rm -rf %{buildroot} # Hack to work around a problem with DESTDIR in libtool 1.4.x LIBRARY_PATH="%{buildroot}/usr/lib:${LIBRARY_PATH}" make install DESTDIR=%{buildroot} # install libmp4ff install -m 755 common/mp4ff/libmp4ff.a %{buildroot}%{_libdir} install common/mp4ff/mp4ff.h %{buildroot}%{_includedir} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig %clean rm -rf %{buildroot} %files %defattr(-, root, root) %doc AUTHORS COPYING ChangeLog NEWS README TODO %{_bindir}/* %{_libdir}/libfaad.so* %files devel %defattr(-, root, root) %{_libdir}/libfaad.a %{_libdir}/libfaad.la %{_includedir}/faad.h %{_includedir}/neaacdec.h %{_includedir}/mp4ff.h %{_libdir}/libmp4ff.a %if %{?_with_xmms:1}%{!?_with_xmms:0} %files xmms %defattr(-,root,root) %doc plugins/xmms/README %_libdir/xmms/Input/* %endif %changelog * Tue Jan 24 2006 Alexander Kurpiers - fix wrong function declaration in mp4ffint.h * Wed Nov 15 2005 Alexander Kurpiers - fix requirements for xmms plugin - add libmp4ff to devel package (only static library) * Sat Aug 13 2005 Alexander Kurpiers - fix dependencies for xmms plugin. libmp4v2/id3lib no longer needed * Sun Apr 24 2005 Alexander Kurpiers - make xmms plugin generation optional. Build with '--define "without_xmms 1"' * Tue Nov 02 2004 Alexander Kurpiers - remove libmp4ff and libmp4v2 from RPM - changes for new version of faad2 * Sat Apr 17 2004 Alexander Kurpiers - apply fix to make DRM support work - use "platform-independant" dependencies (taken from dillo.spec) * Fri Feb 06 2004 Alexander Kurpiers - remove seperate libmp4ff target * Wed Nov 05 2003 Alexander Kurpiers - include xmms plugins/libmp4v2/libmp4ff into RPM * Tue Aug 12 2003 Matthias Saou - Update to 2.0rc1. - Introduced LD_LIBRARY_PATH workaround. - Removed optional xmms plugin build, it seems mandatory now. - Added gtk+ build dep for the xmms plugin. * Wed May 14 2003 Matthias Saou - Added xmms plugin build. * Wed Apr 9 2003 Matthias Saou - Spec file cleanup. - Now exclude .la file. - Update to latest CVS checkout to fix compile problem. * Fri Aug 10 2002 Alexander Kurpiers - changes to compile v1.1 release * Tue Jun 18 2002 Alexander Kurpiers - First RPM. faad2-2_10_0/frontend/000077500000000000000000000000001374350120500145305ustar00rootroot00000000000000faad2-2_10_0/frontend/Makefile.am000066400000000000000000000004151374350120500165640ustar00rootroot00000000000000bin_PROGRAMS = faad dist_man1_MANS = faad.man AM_CPPFLAGS = -I$(top_srcdir)/include faad_LDADD = $(top_builddir)/libfaad/libfaad.la faad_SOURCES = mp4read.c audio.c main.c audio.h mp4read.h unicode_support.c unicode_support.h EXTRA_faad_SOURCES = getopt.c getopt.h faad2-2_10_0/frontend/audio.c000066400000000000000000000355641374350120500160120ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: audio.c,v 1.30 2015/01/22 09:40:52 knik Exp $ **/ #ifdef _WIN32 #include #endif #include #include #include #include #include #include #include "unicode_support.h" #include "audio.h" audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask) { audio_file *aufile = malloc(sizeof(audio_file)); aufile->outputFormat = outputFormat; aufile->samplerate = samplerate; aufile->channels = channels; aufile->total_samples = 0; aufile->fileType = fileType; aufile->channelMask = channelMask; switch (outputFormat) { case FAAD_FMT_16BIT: aufile->bits_per_sample = 16; break; case FAAD_FMT_24BIT: aufile->bits_per_sample = 24; break; case FAAD_FMT_32BIT: case FAAD_FMT_FLOAT: aufile->bits_per_sample = 32; break; default: if (aufile) free(aufile); return NULL; } if(infile[0] == '-') { #ifdef _WIN32 _setmode(_fileno(stdout), O_BINARY); #endif aufile->sndfile = stdout; aufile->toStdio = 1; } else { aufile->toStdio = 0; aufile->sndfile = faad_fopen(infile, "wb"); } if (aufile->sndfile == NULL) { if (aufile) free(aufile); return NULL; } if (aufile->fileType == OUTPUT_WAV) { if (aufile->channelMask) write_wav_extensible_header(aufile, aufile->channelMask); else write_wav_header(aufile); } return aufile; } int write_audio_file(audio_file *aufile, void *sample_buffer, int samples, int offset) { char *buf = (char *)sample_buffer; switch (aufile->outputFormat) { case FAAD_FMT_16BIT: return write_audio_16bit(aufile, buf + offset*2, samples); case FAAD_FMT_24BIT: return write_audio_24bit(aufile, buf + offset*4, samples); case FAAD_FMT_32BIT: return write_audio_32bit(aufile, buf + offset*4, samples); case FAAD_FMT_FLOAT: return write_audio_float(aufile, buf + offset*4, samples); default: return 0; } return 0; } void close_audio_file(audio_file *aufile) { if ((aufile->fileType == OUTPUT_WAV) && (aufile->toStdio == 0)) { fseek(aufile->sndfile, 0, SEEK_SET); if (aufile->channelMask) write_wav_extensible_header(aufile, aufile->channelMask); else write_wav_header(aufile); } if (aufile->toStdio == 0) fclose(aufile->sndfile); if (aufile) free(aufile); } static int write_wav_header(audio_file *aufile) { unsigned char header[44]; unsigned char* p = header; unsigned int bytes = (aufile->bits_per_sample + 7) / 8; float data_size = (float)bytes * aufile->total_samples; unsigned long word32; *p++ = 'R'; *p++ = 'I'; *p++ = 'F'; *p++ = 'F'; word32 = (data_size + (44 - 8) < (float)MAXWAVESIZE) ? (unsigned long)data_size + (44 - 8) : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); *p++ = 'W'; *p++ = 'A'; *p++ = 'V'; *p++ = 'E'; *p++ = 'f'; *p++ = 'm'; *p++ = 't'; *p++ = ' '; *p++ = 0x10; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; if (aufile->outputFormat == FAAD_FMT_FLOAT) { *p++ = 0x03; *p++ = 0x00; } else { *p++ = 0x01; *p++ = 0x00; } *p++ = (unsigned char)(aufile->channels >> 0); *p++ = (unsigned char)(aufile->channels >> 8); word32 = (unsigned long)(aufile->samplerate + 0.5); *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = aufile->samplerate * bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); *p++ = 'd'; *p++ = 'a'; *p++ = 't'; *p++ = 'a'; word32 = data_size < MAXWAVESIZE ? (unsigned long)data_size : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); return fwrite(header, sizeof(header), 1, aufile->sndfile); } static int write_wav_extensible_header(audio_file *aufile, long channelMask) { unsigned char header[68]; unsigned char* p = header; unsigned int bytes = (aufile->bits_per_sample + 7) / 8; float data_size = (float)bytes * aufile->total_samples; unsigned long word32; *p++ = 'R'; *p++ = 'I'; *p++ = 'F'; *p++ = 'F'; word32 = (data_size + (68 - 8) < (float)MAXWAVESIZE) ? (unsigned long)data_size + (68 - 8) : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); *p++ = 'W'; *p++ = 'A'; *p++ = 'V'; *p++ = 'E'; *p++ = 'f'; *p++ = 'm'; *p++ = 't'; *p++ = ' '; *p++ = /*0x10*/0x28; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; /* WAVE_FORMAT_EXTENSIBLE */ *p++ = 0xFE; *p++ = 0xFF; *p++ = (unsigned char)(aufile->channels >> 0); *p++ = (unsigned char)(aufile->channels >> 8); word32 = (unsigned long)(aufile->samplerate + 0.5); *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = aufile->samplerate * bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); /* cbSize */ *p++ = (unsigned char)(22); *p++ = (unsigned char)(0); /* WAVEFORMATEXTENSIBLE */ /* wValidBitsPerSample */ *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); /* dwChannelMask */ word32 = channelMask; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); /* SubFormat */ if (aufile->outputFormat == FAAD_FMT_FLOAT) { /* KSDATAFORMAT_SUBTYPE_IEEE_FLOAT: 00000003-0000-0010-8000-00aa00389b71 */ *p++ = 0x03; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x10; *p++ = 0x00; *p++ = 0x80; *p++ = 0x00; *p++ = 0x00; *p++ = 0xaa; *p++ = 0x00; *p++ = 0x38; *p++ = 0x9b; *p++ = 0x71; } else { /* KSDATAFORMAT_SUBTYPE_PCM: 00000001-0000-0010-8000-00aa00389b71 */ *p++ = 0x01; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x10; *p++ = 0x00; *p++ = 0x80; *p++ = 0x00; *p++ = 0x00; *p++ = 0xaa; *p++ = 0x00; *p++ = 0x38; *p++ = 0x9b; *p++ = 0x71; } /* end WAVEFORMATEXTENSIBLE */ *p++ = 'd'; *p++ = 'a'; *p++ = 't'; *p++ = 'a'; word32 = data_size < MAXWAVESIZE ? (unsigned long)data_size : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); return fwrite(header, sizeof(header), 1, aufile->sndfile); } static int write_audio_16bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; short *sample_buffer16 = (short*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { short r1, r2, r3, r4, r5, r6; r1 = sample_buffer16[i]; r2 = sample_buffer16[i+1]; r3 = sample_buffer16[i+2]; r4 = sample_buffer16[i+3]; r5 = sample_buffer16[i+4]; r6 = sample_buffer16[i+5]; sample_buffer16[i] = r2; sample_buffer16[i+1] = r3; sample_buffer16[i+2] = r1; sample_buffer16[i+3] = r6; sample_buffer16[i+4] = r4; sample_buffer16[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*2] = (char)(sample_buffer16[i] & 0xFF); data[i*2+1] = (char)((sample_buffer16[i] >> 8) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static int write_audio_24bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; int32_t *sample_buffer24 = (int32_t*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { long r1, r2, r3, r4, r5, r6; r1 = sample_buffer24[i]; r2 = sample_buffer24[i+1]; r3 = sample_buffer24[i+2]; r4 = sample_buffer24[i+3]; r5 = sample_buffer24[i+4]; r6 = sample_buffer24[i+5]; sample_buffer24[i] = r2; sample_buffer24[i+1] = r3; sample_buffer24[i+2] = r1; sample_buffer24[i+3] = r6; sample_buffer24[i+4] = r4; sample_buffer24[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*3] = (char)(sample_buffer24[i] & 0xFF); data[i*3+1] = (char)((sample_buffer24[i] >> 8) & 0xFF); data[i*3+2] = (char)((sample_buffer24[i] >> 16) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static int write_audio_32bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; int32_t *sample_buffer32 = (int32_t*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { long r1, r2, r3, r4, r5, r6; r1 = sample_buffer32[i]; r2 = sample_buffer32[i+1]; r3 = sample_buffer32[i+2]; r4 = sample_buffer32[i+3]; r5 = sample_buffer32[i+4]; r6 = sample_buffer32[i+5]; sample_buffer32[i] = r2; sample_buffer32[i+1] = r3; sample_buffer32[i+2] = r1; sample_buffer32[i+3] = r6; sample_buffer32[i+4] = r4; sample_buffer32[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*4] = (char)(sample_buffer32[i] & 0xFF); data[i*4+1] = (char)((sample_buffer32[i] >> 8) & 0xFF); data[i*4+2] = (char)((sample_buffer32[i] >> 16) & 0xFF); data[i*4+3] = (char)((sample_buffer32[i] >> 24) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static int write_audio_float(audio_file *aufile, void *sample_buffer, unsigned int samples) { int ret; unsigned int i; float *sample_buffer_f = (float*)sample_buffer; unsigned char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i < samples; i += aufile->channels) { float r1, r2, r3, r4, r5, r6; r1 = sample_buffer_f[i]; r2 = sample_buffer_f[i+1]; r3 = sample_buffer_f[i+2]; r4 = sample_buffer_f[i+3]; r5 = sample_buffer_f[i+4]; r6 = sample_buffer_f[i+5]; sample_buffer_f[i] = r2; sample_buffer_f[i+1] = r3; sample_buffer_f[i+2] = r1; sample_buffer_f[i+3] = r6; sample_buffer_f[i+4] = r4; sample_buffer_f[i+5] = r5; } } for (i = 0; i < samples; i++) { int exponent, mantissa, negative = 0 ; float in = sample_buffer_f[i]; data[i*4] = 0; data[i*4+1] = 0; data[i*4+2] = 0; data[i*4+3] = 0; if (in == 0.0) continue; if (in < 0.0) { in *= -1.0; negative = 1; } in = (float)frexp(in, &exponent); exponent += 126; in *= (float)0x1000000; mantissa = (((int)in) & 0x7FFFFF); if (negative) data[i*4+3] |= 0x80; if (exponent & 0x01) data[i*4+2] |= 0x80; data[i*4] = mantissa & 0xFF; data[i*4+1] = (mantissa >> 8) & 0xFF; data[i*4+2] |= (mantissa >> 16) & 0x7F; data[i*4+3] |= (exponent >> 1) & 0x7F; } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } faad2-2_10_0/frontend/audio.h000066400000000000000000000051521374350120500160050ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: audio.h,v 1.19 2007/11/01 12:33:29 menno Exp $ **/ #ifndef AUDIO_H_INCLUDED #define AUDIO_H_INCLUDED #ifdef __cplusplus extern "C" { #endif #define MAXWAVESIZE 4294967040LU #define OUTPUT_WAV 1 #define OUTPUT_RAW 2 typedef struct { int toStdio; int outputFormat; FILE *sndfile; unsigned int fileType; unsigned long samplerate; unsigned int bits_per_sample; unsigned int channels; unsigned long total_samples; long channelMask; } audio_file; audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask); int write_audio_file(audio_file *aufile, void *sample_buffer, int samples, int offset); void close_audio_file(audio_file *aufile); static int write_wav_header(audio_file *aufile); static int write_wav_extensible_header(audio_file *aufile, long channelMask); static int write_audio_16bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static int write_audio_24bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static int write_audio_32bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static int write_audio_float(audio_file *aufile, void *sample_buffer, unsigned int samples); #ifdef __cplusplus } #endif #endif faad2-2_10_0/frontend/faad.man000066400000000000000000000043071374350120500161240ustar00rootroot00000000000000.TH FAAD "1" "October 2006" "faad 2.5" "" .SH NAME faad \(em Process an Advanced Audio Codec stream .SH "SYNOPSIS" .B faad [options] [\-w | \-o | \-a ] input_filename .SH "DESCRIPTION" This utility provides a command line interface to libfaad2. This program reads in MPEG\(hy4 AAC files, processes, and outputs them in either Microsoft WAV, MPEG\(hy4 AAC ADTS, or standard PCM formats. .SH "OPTIONS" .TP .BI \-a " " ", \-\^\-adtsout" " " Sets the processing to output to the specified file in MPEG\(hy4 AAC ADTS format .TP .BI \-b " " ", \-\^\-bits" " " Set the output (individual) sample format. The number takes one of the following values: .RS .RS 1: 16\(hybit PCM data (default). .br 2: 24\(hybit PCM data. .br 3: 32\(hybit PCM data. .br 4: 32\(hybit floating\(hypoint data. .br 5: 64\(hybit floating\(hypoint data. .RE .RE .TP .B \-d ", \-\^\-downmix" Set the processing to downsample from 5.1 (surround sound and bass) channels to 2 channels (stereo). .TP .BI \-f " " ", \-\^\-format" " " Set the output file format. The number takes one of the following values: .RS .RS 1: Microsoft WAV format (default). .br 2: Raw PCM data. .RE .RE .TP .BI \-g Set the processing to not perform gapless decoding. .TP .B \-h ", \-\^\-help" Shows a usage summary. .TP .B \-i ", \-\^\-info" Shows information about the about the input file. .TP .BI \-l " " ", \-\^\-objecttype" " " Sets the MPEG\hy(4 profile and object type for the processing to use. The number takes one of the following values: .RS .RS 1: Main object type. .br 2: Low Complexity (LC) object type (default). .br 4: Long Term Prediction (LTP) object type. .br 23: Low Delay (LD) object type. .RE .RE .TP .BI \-o " " ", \-\^\-outfile" " " Sets the filename for processing output. .TP .B \-q ", \-\^\-quiet" Quiet \- Suppresses status messages during processing. .TP .B \-t ", \-\^\-oldformat" Sets the processing to use the old MPEG\(hy4 AAC ADTS format when outputting in said format. .TP .B \-w ", \-\^\-stdio" Sets the processing output to be sent to the standard out. .SH "AUTHOR" Matthew W. S. Bell .SH "SEE ALSO" \fBfaac\fP(1)faad2-2_10_0/frontend/getopt.c000066400000000000000000000540431374350120500162040ustar00rootroot00000000000000/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef __STDC__ # ifndef const # define const # endif #endif /* This tells Alpha OSF/1 not to define a getopt prototype in . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) || !__MacOSX__ /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #endif /* GNU C library. */ /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a long-named option. Because this is not POSIX.2 compliant, it is being phased out. */ /* #define GETOPT_COMPAT */ /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = 0; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* XXX 1003.2 says this must be 1 before any call. */ int optind = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ #define BAD_OPTION '\0' int optopt = BAD_OPTION; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #define my_strlen strlen #else /* Avoid depending on library functions or files whose names are inconsistent. */ #if __STDC__ || defined(PROTO) extern char *getenv(const char *name); extern int strcmp (const char *s1, const char *s2); static int my_strlen(const char *s); static char *my_index (const char *str, int chr); #else extern char *getenv (); #endif static int my_strlen (str) const char *str; { int n = 0; while (*str++) n++; return n; } static char * my_index (str, chr) const char *str; int chr; { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } #endif /* GNU C library. */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. To perform the swap, we first reverse the order of all elements. So all options now come before all non options, but they are in the wrong order. So we put back the options and non options in original order by reversing them again. For example: original input: a b c -x -y reverse all: -y -x c b a reverse options: -x -y c b a reverse non options: -x -y a b c */ #if __STDC__ || defined(PROTO) static void exchange (char **argv); #endif static void exchange (argv) char **argv; { char *temp, **first, **last; /* Reverse all the elements [first_nonopt, optind) */ first = &argv[first_nonopt]; last = &argv[optind-1]; while (first < last) { temp = *first; *first = *last; *last = temp; first++; last--; } /* Put back the options in order */ first = &argv[first_nonopt]; first_nonopt += (optind - last_nonopt); last = &argv[first_nonopt - 1]; while (first < last) { temp = *first; *first = *last; *last = temp; first++; last--; } /* Put back the non options in order */ first = &argv[first_nonopt]; last_nonopt = optind; last = &argv[last_nonopt-1]; while (first < last) { temp = *first; *first = *last; *last = temp; first++; last--; } } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return BAD_OPTION after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return BAD_OPTION. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal (argc, argv, optstring, longopts, longind, long_only) int argc; char *const *argv; const char *optstring; const struct option *longopts; int *longind; int long_only; { int option_index; optarg = 0; /* Initialize the internal data when the first call is made. Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ if (optind == 0) { first_nonopt = last_nonopt = optind = 1; nextchar = NULL; /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (getenv ("POSIXLY_CORRECT") != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; } if (nextchar == NULL || *nextchar == '\0') { if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Now skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && (argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) optind++; last_nonopt = optind; } /* Special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if ((argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) { if (ordering == REQUIRE_ORDER) return EOF; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Start decoding its characters. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } if (longopts != NULL && ((argv[optind][0] == '-' && (argv[optind][1] == '-' || long_only)) #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ )) { const struct option *p; char *s = nextchar; int exact = 0; int ambig = 0; const struct option *pfound = NULL; int indfound = 0; while (*s && *s != '=') s++; /* Test all options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, s - nextchar)) { if (s - nextchar == my_strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, "%s: option `%s' is ambiguous\n", argv[0], argv[optind]); nextchar += my_strlen (nextchar); optind++; return BAD_OPTION; } if (pfound != NULL) { option_index = indfound; optind++; if (*s) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = s + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, "%s: option `--%s' doesn't allow an argument\n", argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, "%s: option `%c%s' doesn't allow an argument\n", argv[0], argv[optind - 1][0], pfound->name); } nextchar += my_strlen (nextchar); return BAD_OPTION; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, "%s: option `%s' requires an argument\n", argv[0], argv[optind - 1]); nextchar += my_strlen (nextchar); return optstring[0] == ':' ? ':' : BAD_OPTION; } } nextchar += my_strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, "%s: unrecognized option `--%s'\n", argv[0], nextchar); else /* +option or -option */ fprintf (stderr, "%s: unrecognized option `%c%s'\n", argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; return BAD_OPTION; } } /* Look at and handle the next option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { #if 0 if (c < 040 || c >= 0177) fprintf (stderr, "%s: unrecognized option, character code 0%o\n", argv[0], c); else fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); #endif } optopt = c; return BAD_OPTION; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = 0; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { #if 0 fprintf (stderr, "%s: option `-%c' requires an argument\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: option requires an argument -- %c\n", argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = BAD_OPTION; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (argc, argv, optstring) int argc; char *const *argv; const char *optstring; { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } int getopt_long (argc, argv, options, long_options, opt_index) int argc; char *const *argv; const char *options; const struct option *long_options; int *opt_index; { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == EOF) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case BAD_OPTION: break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ faad2-2_10_0/frontend/getopt.h000066400000000000000000000106601374350120500162060ustar00rootroot00000000000000/* Declarations for getopt. Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif #ifndef __MacOSX__ /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #endif /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 //#if __STDC__ || defined(PROTO) #if defined(__GNU_LIBRARY__) /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #endif /* not __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); //#else /* not __STDC__ */ extern int getopt (int argc, char *const *argv, const char *shortopts); //extern int getopt_long (); //extern int getopt_long_only (); //extern int _getopt_internal (); //#endif /* not __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ faad2-2_10_0/frontend/main.c000066400000000000000000001173251374350120500156310ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: main.c,v 1.89 2015/01/19 09:46:12 knik Exp $ **/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #include #include #ifndef __MINGW32__ #define off_t __int64 #endif #else #include #endif #include #include #include #include #include #include #include #include "unicode_support.h" #include "audio.h" #include "mp4read.h" #ifdef HAVE_GETOPT_H # include #else # include "getopt.h" # include "getopt.c" #endif #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) #endif #define MAX_CHANNELS 6 /* make this higher to support files with more channels */ #define MAX_PERCENTS 384 static int quiet = 0; static void faad_fprintf(FILE *stream, const char *fmt, ...) { va_list ap; if (!quiet) { va_start(ap, fmt); vfprintf(stream, fmt, ap); va_end(ap); } #ifdef _WIN32 if (!_isatty(_fileno(stream))) { fflush(stream); /*ensure real-time progress output on Win32*/ } #endif } /* FAAD file buffering routines */ typedef struct { long bytes_into_buffer; long bytes_consumed; long file_offset; unsigned char *buffer; int at_eof; FILE *infile; } aac_buffer; static int fill_buffer(aac_buffer *b) { int bread; if (b->bytes_consumed > 0) { if (b->bytes_into_buffer) { memmove((void*)b->buffer, (void*)(b->buffer + b->bytes_consumed), b->bytes_into_buffer*sizeof(unsigned char)); } if (!b->at_eof) { bread = fread((void*)(b->buffer + b->bytes_into_buffer), 1, b->bytes_consumed, b->infile); if (bread != b->bytes_consumed) b->at_eof = 1; b->bytes_into_buffer += bread; } b->bytes_consumed = 0; if (b->bytes_into_buffer > 3) { if (memcmp(b->buffer, "TAG", 3) == 0) b->bytes_into_buffer = 0; } if (b->bytes_into_buffer > 11) { if (memcmp(b->buffer, "LYRICSBEGIN", 11) == 0) b->bytes_into_buffer = 0; } if (b->bytes_into_buffer > 8) { if (memcmp(b->buffer, "APETAGEX", 8) == 0) b->bytes_into_buffer = 0; } } return 1; } static void advance_buffer(aac_buffer *b, int bytes) { while ((b->bytes_into_buffer > 0) && (bytes > 0)) { int chunk = min(bytes, b->bytes_into_buffer); bytes -= chunk; b->file_offset += chunk; b->bytes_consumed = chunk; b->bytes_into_buffer -= chunk; if (b->bytes_into_buffer == 0) fill_buffer(b); } } static void lookforheader(aac_buffer *b) { int i = 0; while (!b->at_eof ) { if (b->bytes_into_buffer > 4) { if( ((b->buffer[0+i] == 0xff) && ((b->buffer[1+i] & 0xf6) == 0xf0)) || (b->buffer[0+i] == 'A' && b->buffer[1+i] == 'D' && b->buffer[2+i] == 'I' && b->buffer[3+i] == 'F')) { fill_buffer(b); break; } else { i++; b->file_offset += 1; b->bytes_consumed += 1; b->bytes_into_buffer -= 1; } } else { fill_buffer(b); i = 0; } } } static int adts_sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0}; static int adts_parse(aac_buffer *b, int *bitrate, float *length) { int frames, frame_length; int t_framelength = 0; int samplerate; float frames_per_sec, bytes_per_frame; /* Read all frames to ensure correct time and bitrate */ for (frames = 0; /* */; frames++) { fill_buffer(b); if (b->bytes_into_buffer > 7) { /* check syncword */ if (!((b->buffer[0] == 0xFF)&&((b->buffer[1] & 0xF6) == 0xF0))) break; if (frames == 0) samplerate = adts_sample_rates[(b->buffer[2]&0x3c)>>2]; frame_length = ((((unsigned int)b->buffer[3] & 0x3)) << 11) | (((unsigned int)b->buffer[4]) << 3) | (b->buffer[5] >> 5); if (frame_length == 0) break; t_framelength += frame_length; if (frame_length > b->bytes_into_buffer) break; advance_buffer(b, frame_length); } else { break; } } frames_per_sec = (float)samplerate/1024.0f; if (frames != 0) bytes_per_frame = (float)t_framelength/(float)(frames*1000); else bytes_per_frame = 0; *bitrate = (int)(8. * bytes_per_frame * frames_per_sec + 0.5); if (frames_per_sec != 0) *length = (float)frames/frames_per_sec; else *length = 1; return 1; } uint32_t read_callback(void *user_data, void *buffer, uint32_t length) { return fread(buffer, 1, length, (FILE*)user_data); } uint32_t seek_callback(void *user_data, uint64_t position) { return fseek((FILE*)user_data, position, SEEK_SET); } /* MicroSoft channel definitions */ #define SPEAKER_FRONT_LEFT 0x1 #define SPEAKER_FRONT_RIGHT 0x2 #define SPEAKER_FRONT_CENTER 0x4 #define SPEAKER_LOW_FREQUENCY 0x8 #define SPEAKER_BACK_LEFT 0x10 #define SPEAKER_BACK_RIGHT 0x20 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 #define SPEAKER_BACK_CENTER 0x100 #define SPEAKER_SIDE_LEFT 0x200 #define SPEAKER_SIDE_RIGHT 0x400 #define SPEAKER_TOP_CENTER 0x800 #define SPEAKER_TOP_FRONT_LEFT 0x1000 #define SPEAKER_TOP_FRONT_CENTER 0x2000 #define SPEAKER_TOP_FRONT_RIGHT 0x4000 #define SPEAKER_TOP_BACK_LEFT 0x8000 #define SPEAKER_TOP_BACK_CENTER 0x10000 #define SPEAKER_TOP_BACK_RIGHT 0x20000 #define SPEAKER_RESERVED 0x80000000 static long aacChannelConfig2wavexChannelMask(NeAACDecFrameInfo *hInfo) { if (hInfo->channels == 6 && hInfo->num_lfe_channels) { return SPEAKER_FRONT_LEFT + SPEAKER_FRONT_RIGHT + SPEAKER_FRONT_CENTER + SPEAKER_LOW_FREQUENCY + SPEAKER_BACK_LEFT + SPEAKER_BACK_RIGHT; } else { return 0; } } static char *position2string(int position) { switch (position) { case FRONT_CHANNEL_CENTER: return "Center front"; case FRONT_CHANNEL_LEFT: return "Left front"; case FRONT_CHANNEL_RIGHT: return "Right front"; case SIDE_CHANNEL_LEFT: return "Left side"; case SIDE_CHANNEL_RIGHT: return "Right side"; case BACK_CHANNEL_LEFT: return "Left back"; case BACK_CHANNEL_RIGHT: return "Right back"; case BACK_CHANNEL_CENTER: return "Center back"; case LFE_CHANNEL: return "LFE"; case UNKNOWN_CHANNEL: return "Unknown"; default: return ""; } return ""; } static void print_channel_info(NeAACDecFrameInfo *frameInfo) { /* print some channel info */ int i; long channelMask = aacChannelConfig2wavexChannelMask(frameInfo); faad_fprintf(stderr, " ---------------------\n"); if (frameInfo->num_lfe_channels > 0) { faad_fprintf(stderr, " | Config: %2d.%d Ch |", frameInfo->channels-frameInfo->num_lfe_channels, frameInfo->num_lfe_channels); } else { faad_fprintf(stderr, " | Config: %2d Ch |", frameInfo->channels); } if (channelMask) faad_fprintf(stderr, " WARNING: channels are reordered according to\n"); else faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " ---------------------"); if (channelMask) faad_fprintf(stderr, " MS defaults defined in WAVE_FORMAT_EXTENSIBLE\n"); else faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " | Ch | Position |\n"); faad_fprintf(stderr, " ---------------------\n"); for (i = 0; i < frameInfo->channels; i++) { faad_fprintf(stderr, " | %.2d | %-14s |\n", i, position2string((int)frameInfo->channel_position[i])); } faad_fprintf(stderr, " ---------------------\n"); faad_fprintf(stderr, "\n"); } static int FindAdtsSRIndex(int sr) { int i; for (i = 0; i < 16; i++) { if (sr == adts_sample_rates[i]) return i; } return 16 - 1; } static unsigned char *MakeAdtsHeader(int *dataSize, NeAACDecFrameInfo *hInfo, int old_format) { unsigned char *data; int profile = (hInfo->object_type - 1) & 0x3; int sr_index = ((hInfo->sbr == SBR_UPSAMPLED) || (hInfo->sbr == NO_SBR_UPSAMPLED)) ? FindAdtsSRIndex(hInfo->samplerate / 2) : FindAdtsSRIndex(hInfo->samplerate); int skip = (old_format) ? 8 : 7; int framesize = skip + hInfo->bytesconsumed; if (hInfo->header_type == ADTS) framesize -= skip; *dataSize = 7; data = malloc(*dataSize * sizeof(unsigned char)); memset(data, 0, *dataSize * sizeof(unsigned char)); data[0] += 0xFF; /* 8b: syncword */ data[1] += 0xF0; /* 4b: syncword */ /* 1b: mpeg id = 0 */ /* 2b: layer = 0 */ data[1] += 1; /* 1b: protection absent */ data[2] += ((profile << 6) & 0xC0); /* 2b: profile */ data[2] += ((sr_index << 2) & 0x3C); /* 4b: sampling_frequency_index */ /* 1b: private = 0 */ data[2] += ((hInfo->channels >> 2) & 0x1); /* 1b: channel_configuration */ data[3] += ((hInfo->channels << 6) & 0xC0); /* 2b: channel_configuration */ /* 1b: original */ /* 1b: home */ /* 1b: copyright_id */ /* 1b: copyright_id_start */ data[3] += ((framesize >> 11) & 0x3); /* 2b: aac_frame_length */ data[4] += ((framesize >> 3) & 0xFF); /* 8b: aac_frame_length */ data[5] += ((framesize << 5) & 0xE0); /* 3b: aac_frame_length */ data[5] += ((0x7FF >> 6) & 0x1F); /* 5b: adts_buffer_fullness */ data[6] += ((0x7FF << 2) & 0x3F); /* 6b: adts_buffer_fullness */ /* 2b: num_raw_data_blocks */ return data; } /* globals */ char *progName; static const char *file_ext[] = { NULL, ".wav", ".aif", ".au", ".au", ".pcm", NULL }; static void usage(void) { faad_fprintf(stdout, "\nUsage:\n"); faad_fprintf(stdout, "%s [options] infile.aac\n", progName); faad_fprintf(stdout, "Options:\n"); faad_fprintf(stdout, " -h Shows this help screen.\n"); faad_fprintf(stdout, " -i Shows info about the input file.\n"); faad_fprintf(stdout, " -a X Write MPEG-4 AAC ADTS output file.\n"); faad_fprintf(stdout, " -t Assume old ADTS format.\n"); faad_fprintf(stdout, " -o X Set output filename.\n"); faad_fprintf(stdout, " -f X Set output format. Valid values for X are:\n"); faad_fprintf(stdout, " 1: Microsoft WAV format (default).\n"); faad_fprintf(stdout, " 2: RAW PCM data.\n"); faad_fprintf(stdout, " -b X Set output sample format. Valid values for X are:\n"); faad_fprintf(stdout, " 1: 16 bit PCM data (default).\n"); faad_fprintf(stdout, " 2: 24 bit PCM data.\n"); faad_fprintf(stdout, " 3: 32 bit PCM data.\n"); faad_fprintf(stdout, " 4: 32 bit floating point data.\n"); faad_fprintf(stdout, " 5: 64 bit floating point data.\n"); faad_fprintf(stdout, " -s X Force the samplerate to X (for RAW files).\n"); faad_fprintf(stdout, " -l X Set object type. Supported object types:\n"); faad_fprintf(stdout, " 1: Main object type.\n"); faad_fprintf(stdout, " 2: LC (Low Complexity) object type.\n"); faad_fprintf(stdout, " 4: LTP (Long Term Prediction) object type.\n"); faad_fprintf(stdout, " 23: LD (Low Delay) object type.\n"); faad_fprintf(stdout, " -d Down matrix 5.1 to 2 channels\n"); faad_fprintf(stdout, " -w Write output to stdio instead of a file.\n"); faad_fprintf(stdout, " -g Disable gapless decoding.\n"); faad_fprintf(stdout, " -q Quiet - suppresses status messages.\n"); faad_fprintf(stdout, " -j X Jump - start output X seconds into track (MP4 files only).\n"); faad_fprintf(stdout, "Example:\n"); faad_fprintf(stdout, " %s infile.aac\n", progName); faad_fprintf(stdout, " %s infile.mp4\n", progName); faad_fprintf(stdout, " %s -o outfile.wav infile.aac\n", progName); faad_fprintf(stdout, " %s -w infile.aac > outfile.wav\n", progName); faad_fprintf(stdout, " %s -a outfile.aac infile.aac\n", progName); return; } static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_stdout, int def_srate, int object_type, int outputFormat, int fileType, int downMatrix, int infoOnly, int adts_out, int old_format, float *song_length) { int tagsize; unsigned long samplerate; unsigned char channels; void *sample_buffer; audio_file *aufile = NULL; FILE *adtsFile = NULL; unsigned char *adtsData; int adtsDataSize; NeAACDecHandle hDecoder; NeAACDecFrameInfo frameInfo; NeAACDecConfigurationPtr config; char percents[MAX_PERCENTS]; int percent, old_percent = -1; int bread, fileread; int header_type = 0; int bitrate = 0; float length = 0; int first_time = 1; int retval; int streaminput = 0; aac_buffer b; memset(&b, 0, sizeof(aac_buffer)); if (adts_out) { adtsFile = faad_fopen(adts_fn, "wb"); if (adtsFile == NULL) { faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); return 1; } } if (0 == strcmp(aacfile, "-")) { b.infile = stdin; #ifdef _WIN32 _setmode(_fileno(stdin), O_BINARY); #endif } else { b.infile = faad_fopen(aacfile, "rb"); if (b.infile == NULL) { /* unable to open file */ faad_fprintf(stderr, "Error opening file: %s\n", aacfile); return 1; } } retval = fseek(b.infile, 0, SEEK_END); #ifdef _WIN32 if (0 == strcmp(aacfile, "-")) { retval = -1; } #endif if (retval ) { faad_fprintf(stderr, "Input not seekable %s\n", aacfile); fileread = -1; streaminput = 1; } else { fileread = ftell(b.infile); fseek(b.infile, 0, SEEK_SET); }; if (!(b.buffer = (unsigned char*)malloc(FAAD_MIN_STREAMSIZE*MAX_CHANNELS))) { faad_fprintf(stderr, "Memory allocation error\n"); return 0; } memset(b.buffer, 0, FAAD_MIN_STREAMSIZE*MAX_CHANNELS); bread = fread(b.buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, b.infile); b.bytes_into_buffer = bread; b.bytes_consumed = 0; b.file_offset = 0; if (bread != FAAD_MIN_STREAMSIZE*MAX_CHANNELS) b.at_eof = 1; tagsize = 0; if (!memcmp(b.buffer, "ID3", 3)) { /* high bit is not used */ tagsize = (b.buffer[6] << 21) | (b.buffer[7] << 14) | (b.buffer[8] << 7) | (b.buffer[9] << 0); tagsize += 10; advance_buffer(&b, tagsize); fill_buffer(&b); } hDecoder = NeAACDecOpen(); /* Set the default object type and samplerate */ /* This is useful for RAW AAC files */ config = NeAACDecGetCurrentConfiguration(hDecoder); if (def_srate) config->defSampleRate = def_srate; config->defObjectType = object_type; config->outputFormat = outputFormat; config->downMatrix = downMatrix; config->useOldADTSFormat = old_format; //config->dontUpSampleImplicitSBR = 1; NeAACDecSetConfiguration(hDecoder, config); /* get AAC infos for printing */ header_type = 0; if (streaminput == 1) lookforheader(&b); if ((b.buffer[0] == 0xFF) && ((b.buffer[1] & 0xF6) == 0xF0)) { if (streaminput == 1) { int /*frames,*/ frame_length; int samplerate; float frames_per_sec, bytes_per_frame; channels = 2; samplerate = adts_sample_rates[(b.buffer[2]&0x3c)>>2]; frame_length = ((((unsigned int)b.buffer[3] & 0x3)) << 11) | (((unsigned int)b.buffer[4]) << 3) | (b.buffer[5] >> 5); frames_per_sec = (float)samplerate/1024.0f; bytes_per_frame = (float)frame_length/(float)(1000); bitrate = (int)(8. * bytes_per_frame * frames_per_sec + 0.5); length = 1; faad_fprintf(stderr, "Streamed input format samplerate %d channels %d.\n", samplerate, channels); } else { adts_parse(&b, &bitrate, &length); fseek(b.infile, tagsize, SEEK_SET); bread = fread(b.buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, b.infile); if (bread != FAAD_MIN_STREAMSIZE*MAX_CHANNELS) b.at_eof = 1; else b.at_eof = 0; b.bytes_into_buffer = bread; b.bytes_consumed = 0; b.file_offset = tagsize; } header_type = 1; } else if (memcmp(b.buffer, "ADIF", 4) == 0) { int skip_size = (b.buffer[4] & 0x80) ? 9 : 0; bitrate = ((unsigned int)(b.buffer[4 + skip_size] & 0x0F)<<19) | ((unsigned int)b.buffer[5 + skip_size]<<11) | ((unsigned int)b.buffer[6 + skip_size]<<3) | ((unsigned int)b.buffer[7 + skip_size] & 0xE0); length = (float)fileread; if (length != 0) { length = ((float)length*8.f)/((float)bitrate) + 0.5f; } bitrate = (int)((float)bitrate/1000.0f + 0.5f); header_type = 2; } *song_length = length; fill_buffer(&b); if ((bread = NeAACDecInit(hDecoder, b.buffer, b.bytes_into_buffer, &samplerate, &channels)) < 0) { /* If some error initializing occured, skip the file */ faad_fprintf(stderr, "Error initializing decoder library.\n"); if (b.buffer) free(b.buffer); NeAACDecClose(hDecoder); if (b.infile != stdin) fclose(b.infile); return 1; } advance_buffer(&b, bread); fill_buffer(&b); /* print AAC file info */ faad_fprintf(stderr, "%s file info:\n", aacfile); switch (header_type) { case 0: faad_fprintf(stderr, "RAW\n\n"); break; case 1: faad_fprintf(stderr, "ADTS, %.3f sec, %d kbps, %d Hz\n\n", length, bitrate, samplerate); break; case 2: faad_fprintf(stderr, "ADIF, %.3f sec, %d kbps, %d Hz\n\n", length, bitrate, samplerate); break; } if (infoOnly) { NeAACDecClose(hDecoder); if (b.infile != stdin) fclose(b.infile); if (b.buffer) free(b.buffer); return 0; } do { sample_buffer = NeAACDecDecode(hDecoder, &frameInfo, b.buffer, b.bytes_into_buffer); if (adts_out == 1) { int skip = (old_format) ? 8 : 7; adtsData = MakeAdtsHeader(&adtsDataSize, &frameInfo, old_format); /* write the adts header */ fwrite(adtsData, 1, adtsDataSize, adtsFile); /* write the frame data */ if (frameInfo.header_type == ADTS) fwrite(b.buffer + skip, 1, frameInfo.bytesconsumed - skip, adtsFile); else fwrite(b.buffer, 1, frameInfo.bytesconsumed, adtsFile); } /* update buffer indices */ advance_buffer(&b, frameInfo.bytesconsumed); /* check if the inconsistent number of channels */ if (aufile != NULL && frameInfo.channels != aufile->channels) frameInfo.error = 12; if (frameInfo.error > 0) { faad_fprintf(stderr, "Error: %s\n", NeAACDecGetErrorMessage(frameInfo.error)); } /* open the sound file now that the number of channels are known */ if (first_time && !frameInfo.error) { /* print some channel info */ print_channel_info(&frameInfo); if (!adts_out) { /* open output file */ if (!to_stdout) { aufile = open_audio_file(sndfile, frameInfo.samplerate, frameInfo.channels, outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } else { aufile = open_audio_file("-", frameInfo.samplerate, frameInfo.channels, outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } if (aufile == NULL) { if (b.buffer) free(b.buffer); NeAACDecClose(hDecoder); if (b.infile != stdin) fclose(b.infile); return 0; } } else { faad_fprintf(stderr, "Writing output MPEG-4 AAC ADTS file.\n\n"); } first_time = 0; } percent = min((int)(b.file_offset*100)/fileread, 100); if (percent > old_percent) { old_percent = percent; snprintf(percents, MAX_PERCENTS, "%d%% decoding %s.", percent, aacfile); faad_fprintf(stderr, "%s\r", percents); #ifdef _WIN32 SetConsoleTitle(percents); #endif } if ((frameInfo.error == 0) && (frameInfo.samples > 0) && (!adts_out)) { if (write_audio_file(aufile, sample_buffer, frameInfo.samples, 0) == 0) break; } /* fill buffer */ fill_buffer(&b); if (b.bytes_into_buffer == 0) sample_buffer = NULL; /* to make sure it stops now */ } while (sample_buffer != NULL); NeAACDecClose(hDecoder); if (adts_out == 1) { fclose(adtsFile); } if (b.infile != stdin) fclose(b.infile); if (!first_time && !adts_out) close_audio_file(aufile); if (b.buffer) free(b.buffer); return frameInfo.error; } static const unsigned long srates[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_stdout, int outputFormat, int fileType, int downMatrix, int noGapless, int infoOnly, int adts_out, float *song_length, float seek_to) { /*int track;*/ unsigned long samplerate; unsigned char channels; void *sample_buffer; long sampleId, startSampleId; audio_file *aufile = NULL; FILE *adtsFile = NULL; unsigned char *adtsData; int adtsDataSize; NeAACDecHandle hDecoder; NeAACDecConfigurationPtr config; NeAACDecFrameInfo frameInfo; mp4AudioSpecificConfig mp4ASC; char percents[MAX_PERCENTS]; int percent, old_percent = -1; int first_time = 1; /* for gapless decoding */ unsigned int useAacLength = 1; unsigned int framesize; unsigned decoded; if (strcmp(mp4file, "-") == 0 ) { faad_fprintf(stderr, "Cannot open stdin for MP4 input \n"); return 1; } if (!quiet) { mp4config.verbose.header = 1; mp4config.verbose.tags = 1; } if (mp4read_open(mp4file)) { /* unable to open file */ faad_fprintf(stderr, "Error opening file: %s\n", mp4file); return 1; } hDecoder = NeAACDecOpen(); /* Set configuration */ config = NeAACDecGetCurrentConfiguration(hDecoder); config->outputFormat = outputFormat; config->downMatrix = downMatrix; //config->dontUpSampleImplicitSBR = 1; NeAACDecSetConfiguration(hDecoder, config); if (adts_out) { adtsFile = faad_fopen(adts_fn, "wb"); if (adtsFile == NULL) { faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); return 1; } } if(NeAACDecInit2(hDecoder, mp4config.asc.buf, mp4config.asc.size, &samplerate, &channels) < 0) { /* If some error initializing occured, skip the file */ faad_fprintf(stderr, "Error initializing decoder library.\n"); NeAACDecClose(hDecoder); mp4read_close(); return 1; } framesize = 1024; useAacLength = 0; decoded = 0; if (mp4config.asc.size) { if (NeAACDecAudioSpecificConfig(mp4config.asc.buf, mp4config.asc.size, &mp4ASC) >= 0) { if (mp4ASC.frameLengthFlag == 1) framesize = 960; if (mp4ASC.sbr_present_flag == 1 || mp4ASC.forceUpSampling) framesize *= 2; } } /* print some mp4 file info */ faad_fprintf(stderr, "%s file info:\n\n", mp4file); { char *tag = NULL, *item = NULL; /*int k, j;*/ char *ot[6] = { "NULL", "MAIN AAC", "LC AAC", "SSR AAC", "LTP AAC", "HE AAC" }; float seconds; seconds = (float)mp4config.samples/(float)mp4ASC.samplingFrequency; *song_length = seconds; faad_fprintf(stderr, "%s\t%.3f secs, %d ch, %d Hz\n\n", ot[(mp4ASC.objectTypeIndex > 5)?0:mp4ASC.objectTypeIndex], seconds, mp4ASC.channelsConfiguration, mp4ASC.samplingFrequency); } if (infoOnly) { NeAACDecClose(hDecoder); mp4read_close(); return 0; } startSampleId = 0; if (seek_to > 0.1) startSampleId = (int64_t)(seek_to * mp4config.samplerate / framesize); mp4read_seek(startSampleId); for (sampleId = startSampleId; sampleId < mp4config.frame.ents; sampleId++) { /*int rc;*/ long dur; unsigned int sample_count; unsigned int delay = 0; if (mp4read_frame()) break; sample_buffer = NeAACDecDecode(hDecoder, &frameInfo, mp4config.bitbuf.data, mp4config.bitbuf.size); if (!sample_buffer) { /* unable to decode file, abort */ break; } if (adts_out == 1) { adtsData = MakeAdtsHeader(&adtsDataSize, &frameInfo, 0); /* write the adts header */ fwrite(adtsData, 1, adtsDataSize, adtsFile); fwrite(mp4config.bitbuf.data, 1, frameInfo.bytesconsumed, adtsFile); } dur = frameInfo.samples / frameInfo.channels; decoded += dur; if (decoded > mp4config.samples) dur += mp4config.samples - decoded; if (dur > framesize) { faad_fprintf(stderr, "Warning: excess frame detected in MP4 file.\n"); dur = framesize; } if (!noGapless) { if (useAacLength || (mp4config.samplerate != samplerate)) { sample_count = frameInfo.samples; } else { sample_count = (unsigned int)(dur * frameInfo.channels); if (sample_count > frameInfo.samples) sample_count = frameInfo.samples; } } else { sample_count = frameInfo.samples; } /* open the sound file now that the number of channels are known */ if (first_time && !frameInfo.error) { /* print some channel info */ print_channel_info(&frameInfo); if (!adts_out) { /* open output file */ if(!to_stdout) { aufile = open_audio_file(sndfile, frameInfo.samplerate, frameInfo.channels, outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } else { #ifdef _WIN32 _setmode(_fileno(stdout), O_BINARY); #endif aufile = open_audio_file("-", frameInfo.samplerate, frameInfo.channels, outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } if (aufile == NULL) { NeAACDecClose(hDecoder); mp4read_close(); return 0; } } first_time = 0; } percent = min((int)(sampleId*100)/mp4config.frame.ents, 100); if (percent > old_percent) { old_percent = percent; snprintf(percents, MAX_PERCENTS, "%d%% decoding %s.", percent, mp4file); faad_fprintf(stderr, "%s\r", percents); #ifdef _WIN32 SetConsoleTitle(percents); #endif } if ((frameInfo.error == 0) && (sample_count > 0) && (!adts_out)) { if (write_audio_file(aufile, sample_buffer, sample_count, delay) == 0) break; } if (frameInfo.error > 0) { faad_fprintf(stderr, "Warning: %s\n", NeAACDecGetErrorMessage(frameInfo.error)); } } NeAACDecClose(hDecoder); if (adts_out == 1) { fclose(adtsFile); } mp4read_close(); if (!first_time && !adts_out) close_audio_file(aufile); return frameInfo.error; } static int faad_main(int argc, char *argv[]) { int result; int infoOnly = 0; int writeToStdio = 0; int readFromStdin = 0; int object_type = LC; int def_srate = 0; int downMatrix = 0; int format = 1; int outputFormat = FAAD_FMT_16BIT; int outfile_set = 0; int adts_out = 0; int old_format = 0; int showHelp = 0; int mp4file = 0; int noGapless = 0; char *fnp; char *aacFileName = NULL; char *audioFileName = NULL; char *adtsFileName = NULL; float seekTo = 0; unsigned char header[8]; int bread; float length = 0; FILE *hMP4File; char *faad_id_string; char *faad_copyright_string; /* System dependant types */ #ifdef _WIN32 long begin; #else clock_t begin; #endif unsigned long cap = NeAACDecGetCapabilities(); /* begin process command line */ progName = argv[0]; while (1) { int c = -1; int option_index = 0; static struct option long_options[] = { { "quiet", 0, 0, 'q' }, { "outfile", 0, 0, 'o' }, { "adtsout", 0, 0, 'a' }, { "oldformat", 0, 0, 't' }, { "format", 0, 0, 'f' }, { "bits", 0, 0, 'b' }, { "samplerate", 0, 0, 's' }, { "objecttype", 0, 0, 'l' }, { "downmix", 0, 0, 'd' }, { "info", 0, 0, 'i' }, { "stdio", 0, 0, 'w' }, { "stdio", 0, 0, 'g' }, { "seek", 1, 0, 'j' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; c = getopt_long(argc, argv, "o:a:s:f:b:l:j:wgdhitq", long_options, &option_index); if (c == -1) break; switch (c) { case 'o': if (optarg) { outfile_set = 1; audioFileName = (char *) malloc(sizeof(char) * (strlen(optarg) + 1)); if (audioFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for audioFileName.\n"); return 1; } strcpy(audioFileName, optarg); } break; case 'a': if (optarg) { adts_out = 1; adtsFileName = (char *) malloc(sizeof(char) * (strlen(optarg) + 1)); if (adtsFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for adtsFileName.\n"); return 1; } strcpy(adtsFileName, optarg); } break; case 's': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { def_srate = 0; } else { def_srate = atoi(dr); } } break; case 'f': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { format = 1; } else { format = atoi(dr); if ((format < 1) || (format > 2)) showHelp = 1; } } break; case 'b': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { outputFormat = FAAD_FMT_16BIT; /* just use default */ } else { outputFormat = atoi(dr); if ((outputFormat < 1) || (outputFormat > 5)) showHelp = 1; } } break; case 'l': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { object_type = LC; /* default */ } else { object_type = atoi(dr); if ((object_type != LC) && (object_type != MAIN) && (object_type != LTP) && (object_type != LD)) { showHelp = 1; } } } break; case 'j': if (optarg) { seekTo = atof(optarg); } break; case 't': old_format = 1; break; case 'd': downMatrix = 1; break; case 'w': writeToStdio = 1; break; case 'g': noGapless = 1; break; case 'i': infoOnly = 1; break; case 'h': showHelp = 1; break; case 'q': quiet = 1; break; default: break; } } NeAACDecGetVersion(&faad_id_string, &faad_copyright_string); faad_fprintf(stderr, " *********** Ahead Software MPEG-4 AAC Decoder V%s ******************\n\n", faad_id_string); #ifndef BUILD_DATE #define BUILD_DATE __DATE__ #endif faad_fprintf(stderr, " Build: %s\n", BUILD_DATE); #undef BUILD_DATE faad_fprintf(stderr, "%s", faad_copyright_string); if (cap & FIXED_POINT_CAP) faad_fprintf(stderr, " Fixed point version\n"); else faad_fprintf(stderr, " Floating point version\n"); faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " This program is free software; you can redistribute it and/or modify\n"); faad_fprintf(stderr, " it under the terms of the GNU General Public License.\n"); faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " **************************************************************************\n\n"); /* check that we have at least two non-option arguments */ /* Print help if requested */ if (((argc - optind) < 1) || showHelp) { usage(); return 1; } #if 0 /* only allow raw data on stdio */ if (writeToStdio == 1) { format = 2; } #endif /* point to the specified file name */ aacFileName = (char *) malloc(sizeof(char) * (strlen(argv[optind]) + 1)); if (aacFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for aacFileName.\n"); return 1; } strcpy(aacFileName, argv[optind]); #ifdef _WIN32 begin = GetTickCount(); #else begin = clock(); #endif /* Only calculate the path and open the file for writing if we are not writing to stdout. */ if(!writeToStdio && !outfile_set) { audioFileName = (char *) malloc(sizeof(char) * (strlen(aacFileName) + strlen(file_ext[format]) + 1)); if (audioFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for audioFileName.\n"); return 1; } strcpy(audioFileName, aacFileName); fnp = (char *)strrchr(audioFileName,'.'); if (fnp) fnp[0] = '\0'; strcat(audioFileName, file_ext[format]); } /* check for mp4 file */ if (0 == strcmp(aacFileName, "-")) { faad_fprintf(stderr, "Reading from stdin: %s\n", aacFileName); readFromStdin = 1; hMP4File = stdin; #ifdef _WIN32 _setmode(_fileno(stdin), O_BINARY); #endif } else { mp4file = 0; hMP4File = faad_fopen(aacFileName, "rb"); if (!hMP4File) { faad_fprintf(stderr, "Error opening file: %s\n", aacFileName); return 1; } } bread = fread(header, 1, 8, hMP4File); if (! readFromStdin ) fclose(hMP4File); if (bread != 8) { faad_fprintf(stderr, "Error reading file.\n"); return 1; } if (header[4] == 'f' && header[5] == 't' && header[6] == 'y' && header[7] == 'p') mp4file = 1; if (!mp4file && seekTo != 0) { faad_fprintf(stderr, "Warning: can only seek in MP4 files\n"); } if (mp4file) { result = decodeMP4file(aacFileName, audioFileName, adtsFileName, writeToStdio, outputFormat, format, downMatrix, noGapless, infoOnly, adts_out, &length, seekTo); } else { if (readFromStdin == 1) { ungetc(header[7],hMP4File); ungetc(header[6],hMP4File); ungetc(header[5],hMP4File); ungetc(header[4],hMP4File); ungetc(header[3],hMP4File); ungetc(header[2],hMP4File); ungetc(header[1],hMP4File); ungetc(header[0],hMP4File); } result = decodeAACfile(aacFileName, audioFileName, adtsFileName, writeToStdio, def_srate, object_type, outputFormat, format, downMatrix, infoOnly, adts_out, old_format, &length); } if (audioFileName != NULL) free (audioFileName); if (adtsFileName != NULL) free (adtsFileName); if (!result && !infoOnly) { #ifdef _WIN32 float dec_length = (float)(GetTickCount()-begin)/1000.0; SetConsoleTitle("FAAD"); #else /* clock() grabs time since the start of the app but when we decode multiple files, each file has its own starttime (begin). */ float dec_length = (float)(clock() - begin)/(float)CLOCKS_PER_SEC; #endif faad_fprintf(stderr, "Decoding %s took: %5.2f sec. %5.2fx real-time.\n", aacFileName, dec_length, (dec_length > 0.01) ? (length/dec_length) : 0.); } if (aacFileName != NULL) free (aacFileName); return 0; } int main(int argc, char *argv[]) { #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 int argc_utf8, exit_code; char **argv_utf8; init_console_utf8(stderr); init_commandline_arguments_utf8(&argc_utf8, &argv_utf8); exit_code = faad_main(argc_utf8, argv_utf8); free_commandline_arguments_utf8(&argc_utf8, &argv_utf8); uninit_console_utf8(); return exit_code; #else return faad_main(argc, argv); #endif } faad2-2_10_0/frontend/mp4read.c000066400000000000000000000602721374350120500162370ustar00rootroot00000000000000/**************************************************************************** MP4 input module Copyright (C) 2017 Krzysztof Nikiel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ****************************************************************************/ #include #include #include #include #include #include #include "unicode_support.h" #include "mp4read.h" enum ATOM_TYPE { ATOM_STOP = 0 /* end of atoms */ , ATOM_NAME /* plain atom */ , ATOM_DESCENT, /* starts group of children */ ATOM_ASCENT, /* ends group */ ATOM_DATA, }; typedef struct { uint16_t opcode; void *data; } creator_t; mp4config_t mp4config = { 0 }; static FILE *g_fin = NULL; static inline uint32_t bswap32(const uint32_t u32) { #ifndef WORDS_BIGENDIAN #if defined (__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))) return __builtin_bswap32(u32); #elif defined (_MSC_VER) return _byteswap_ulong(u32); #else return (u32 << 24) | ((u32 << 8) & 0xFF0000) | ((u32 >> 8) & 0xFF00) | (u32 >> 24); #endif #else return u32; #endif } static inline uint16_t bswap16(const uint16_t u16) { #ifndef WORDS_BIGENDIAN #if defined (__GNUC__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8))) return __builtin_bswap16(u16); #elif defined (_MSC_VER) return _byteswap_ushort(u16); #else return (u16 << 8) | (u16 >> 8); #endif #else return u16; #endif } enum {ERR_OK = 0, ERR_FAIL = -1, ERR_UNSUPPORTED = -2}; static int datain(void *data, int size) { if (fread(data, 1, size, g_fin) != size) return ERR_FAIL; return size; } static int stringin(char *txt, int sizemax) { int size; for (size = 0; size < sizemax; size++) { if (fread(txt + size, 1, 1, g_fin) != 1) return ERR_FAIL; if (!txt[size]) break; } txt[sizemax-1] = '\0'; return size; } static uint32_t u32in(void) { uint32_t u32; datain(&u32, 4); u32 = bswap32(u32); return u32; } static uint16_t u16in(void) { uint16_t u16; datain(&u16, 2); u16 = bswap16(u16); return u16; } static int u8in(void) { uint8_t u8; datain(&u8, 1); return u8; } static int ftypin(int size) { enum {BUFSIZE = 40}; char buf[BUFSIZE]; uint32_t u32; buf[4] = 0; datain(buf, 4); u32 = u32in(); if (mp4config.verbose.header) fprintf(stderr, "Brand:\t\t\t%s(version %d)\n", buf, u32); stringin(buf, BUFSIZE); if (mp4config.verbose.header) fprintf(stderr, "Compatible brands:\t%s\n", buf); return size; } enum { SECSINDAY = 24 * 60 * 60 }; static char *mp4time(time_t t) { int y; // subtract some seconds from the start of 1904 to the start of 1970 for (y = 1904; y < 1970; y++) { t -= 365 * SECSINDAY; if (!(y & 3)) t -= SECSINDAY; } return ctime(&t); } static int mdhdin(int size) { // version/flags u32in(); // Creation time mp4config.ctime = u32in(); // Modification time mp4config.mtime = u32in(); // Time scale mp4config.samplerate = u32in(); // Duration mp4config.samples = u32in(); // Language u16in(); // pre_defined u16in(); return size; }; static int hdlr1in(int size) { uint8_t buf[5]; buf[4] = 0; // version/flags u32in(); // pre_defined u32in(); // Component subtype datain(buf, 4); if (mp4config.verbose.header) fprintf(stderr, "*track media type: '%s': ", buf); if (memcmp("soun", buf, 4)) { if (mp4config.verbose.header) fprintf(stderr, "unsupported, skipping\n"); return ERR_UNSUPPORTED; } else { if (mp4config.verbose.header) fprintf(stderr, "OK\n"); } // reserved u32in(); u32in(); u32in(); // name // null terminate u8in(); return size; }; static int stsdin(int size) { // version/flags u32in(); // Number of entries(one 'mp4a') if (u32in() != 1) //fixme: error handling return ERR_FAIL; return size; }; static int mp4ain(int size) { // Reserved (6 bytes) u32in(); u16in(); // Data reference index u16in(); // Version u16in(); // Revision level u16in(); // Vendor u32in(); // Number of channels mp4config.channels = u16in(); // Sample size (bits) mp4config.bits = u16in(); // Compression ID u16in(); // Packet size u16in(); // Sample rate (16.16) // fractional framerate, probably not for audio // rate integer part u16in(); // rate reminder part u16in(); return size; } static uint32_t getsize(void) { int cnt; uint32_t size = 0; for (cnt = 0; cnt < 4; cnt++) { int tmp = u8in(); size <<= 7; size |= (tmp & 0x7f); if (!(tmp & 0x80)) break; } return size; } static int esdsin(int size) { // descriptor tree: // MP4ES_Descriptor // MP4DecoderConfigDescriptor // MP4DecSpecificInfoDescriptor // MP4SLConfigDescriptor enum { TAG_ES = 3, TAG_DC = 4, TAG_DSI = 5, TAG_SLC = 6 }; // version/flags u32in(); if (u8in() != TAG_ES) return ERR_FAIL; getsize(); // ESID u16in(); // flags(url(bit 6); ocr(5); streamPriority (0-4)): u8in(); if (u8in() != TAG_DC) return ERR_FAIL; getsize(); if (u8in() != 0x40) /* not MPEG-4 audio */ return ERR_FAIL; // flags u8in(); // buffer size (24 bits) mp4config.buffersize = u16in() << 8; mp4config.buffersize |= u8in(); // bitrate mp4config.bitratemax = u32in(); mp4config.bitrateavg = u32in(); if (u8in() != TAG_DSI) return ERR_FAIL; mp4config.asc.size = getsize(); if (mp4config.asc.size > sizeof(mp4config.asc.buf)) return ERR_FAIL; // get AudioSpecificConfig datain(mp4config.asc.buf, mp4config.asc.size); if (u8in() != TAG_SLC) return ERR_FAIL; getsize(); // "predefined" (no idea) u8in(); return size; } static int sttsin(int size) { if (size < 16) //min stts size return ERR_FAIL; return size; } static int stszin(int size) { int cnt; uint32_t ofs; // version/flags u32in(); // Sample size u32in(); // Number of entries mp4config.frame.ents = u32in(); if (!(mp4config.frame.ents + 1)) return ERR_FAIL; mp4config.frame.data = malloc(sizeof(*mp4config.frame.data) * (mp4config.frame.ents + 1)); if (!mp4config.frame.data) return ERR_FAIL; ofs = 0; mp4config.frame.data[0] = ofs; for (cnt = 0; cnt < mp4config.frame.ents; cnt++) { uint32_t fsize = u32in(); ofs += fsize; if (mp4config.frame.maxsize < fsize) mp4config.frame.maxsize = fsize; mp4config.frame.data[cnt + 1] = ofs; if (ofs < mp4config.frame.data[cnt]) return ERR_FAIL; } return size; } static int stcoin(int size) { // version/flags u32in(); // Number of entries if (u32in() < 1) return ERR_FAIL; // first chunk offset mp4config.mdatofs = u32in(); // ignore the rest return size; } #if 0 static int tagtxt(char *tagname, const char *tagtxt) { //int txtsize = strlen(tagtxt); int size = 0; //int datasize = txtsize + 16; #if 0 size += u32out(datasize + 8); size += dataout(tagname, 4); size += u32out(datasize); size += dataout("data", 4); size += u32out(1); size += u32out(0); size += dataout(tagtxt, txtsize); #endif return size; } static int tagu32(char *tagname, int n /*number of stored fields*/) { //int numsize = n * 4; int size = 0; //int datasize = numsize + 16; #if 0 size += u32out(datasize + 8); size += dataout(tagname, 4); size += u32out(datasize); size += dataout("data", 4); size += u32out(0); size += u32out(0); #endif return size; } #endif static int metain(int size) { // version/flags u32in(); return ERR_OK; }; static int hdlr2in(int size) { uint8_t buf[4]; // version/flags u32in(); // Predefined u32in(); // Handler type datain(buf, 4); if (memcmp(buf, "mdir", 4)) return ERR_FAIL; datain(buf, 4); if (memcmp(buf, "appl", 4)) return ERR_FAIL; // Reserved u32in(); u32in(); // null terminator u8in(); return size; }; static int ilstin(int size) { enum {NUMSET = 1, GENRE, EXTAG}; int read = 0; static struct { char *name; char *id; int flag; } tags[] = { {"Album ", "\xa9" "alb"}, {"Album Artist", "aART"}, {"Artist ", "\xa9" "ART"}, {"Comment ", "\xa9" "cmt"}, {"Cover image ", "covr"}, {"Compilation ", "cpil"}, {"Copyright ", "cprt"}, {"Date ", "\xa9" "day"}, {"Disc# ", "disk", NUMSET}, {"Genre ", "gnre", GENRE}, {"Grouping ", "\xa9" "grp"}, {"Lyrics ", "\xa9" "lyr"}, {"Title ", "\xa9" "nam"}, {"Rating ", "rtng"}, {"BPM ", "tmpo"}, {"Encoder ", "\xa9" "too"}, {"Track ", "trkn", NUMSET}, {"Composer ", "\xa9" "wrt"}, {0, "----", EXTAG}, {0}, }; static const char *genres[] = { "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native US", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "Acapella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club - House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", "Synthpop", "Unknown", }; fprintf(stderr, "----------tag list-------------\n"); while(read < size) { int asize, dsize; uint8_t id[5]; int cnt; uint32_t type; id[4] = 0; asize = u32in(); read += asize; asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; for (cnt = 0; tags[cnt].id; cnt++) { if (!memcmp(id, tags[cnt].id, 4)) break; } if (tags[cnt].name) fprintf(stderr, "%s : ", tags[cnt].name); else { if (tags[cnt].flag != EXTAG) fprintf(stderr, "'%s' : ", id); } dsize = u32in(); asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; if (tags[cnt].flag != EXTAG) { if (memcmp(id, "data", 4)) return ERR_FAIL; } else { int spc; if (memcmp(id, "mean", 4)) goto skip; dsize -= 8; while (dsize > 0) { u8in(); asize--; dsize--; } if (asize >= 8) { dsize = u32in() - 8; asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; if (memcmp(id, "name", 4)) goto skip; u32in(); asize -= 4; dsize -= 4; } spc = 13 - dsize; if (spc < 0) spc = 0; while (dsize > 0) { fprintf(stderr, "%c",u8in()); asize--; dsize--; } while (spc--) fprintf(stderr, " "); fprintf(stderr, ": "); if (asize >= 8) { dsize = u32in() - 8; asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; if (memcmp(id, "data", 4)) goto skip; u32in(); asize -= 4; dsize -= 4; } while (dsize > 0) { fprintf(stderr, "%c",u8in()); asize--; dsize--; } fprintf(stderr, "\n"); goto skip; } type = u32in(); asize -= 4; u32in(); asize -= 4; switch(type) { case 1: while (asize > 0) { fprintf(stderr, "%c",u8in()); asize--; } break; case 0: switch(tags[cnt].flag) { case NUMSET: u16in(); asize -= 2; fprintf(stderr, "%d", u16in()); asize -= 2; fprintf(stderr, "/%d", u16in()); asize -= 2; break; case GENRE: { uint8_t gnum = u16in(); asize -= 2; if (!gnum) goto skip; gnum--; if (gnum >= 147) gnum = 147; fprintf(stderr, "%s", genres[gnum]); } break; default: while(asize > 0) { fprintf(stderr, "%d/", u16in()); asize-=2; } } break; case 0x15: //fprintf(stderr, "(8bit data)"); while(asize > 0) { fprintf(stderr, "%d", u8in()); asize--; if (asize) fprintf(stderr, "/"); } break; case 0xd: fprintf(stderr, "(image data)"); break; default: fprintf(stderr, "(unknown data type)"); break; } fprintf(stderr, "\n"); skip: // skip to the end of atom while (asize > 0) { u8in(); asize--; } } fprintf(stderr, "-------------------------------\n"); return size; }; static creator_t *g_atom = 0; static int parse(uint32_t *sizemax) { long apos = 0; long aposmax = ftell(g_fin) + *sizemax; uint32_t size; if (g_atom->opcode != ATOM_NAME) { fprintf(stderr, "parse error: root is not a 'name' opcode\n"); return ERR_FAIL; } //fprintf(stderr, "looking for '%s'\n", (char *)g_atom->data); // search for atom in the file while (1) { char name[4]; uint32_t tmp; apos = ftell(g_fin); if (apos >= (aposmax - 8)) { fprintf(stderr, "parse error: atom '%s' not found\n", (char *)g_atom->data); return ERR_FAIL; } if ((tmp = u32in()) < 8) { fprintf(stderr, "invalid atom size %x @%lx\n", tmp, ftell(g_fin)); return ERR_FAIL; } size = tmp; if (datain(name, 4) != 4) { // EOF fprintf(stderr, "can't read atom name @%lx\n", ftell(g_fin)); return ERR_FAIL; } //fprintf(stderr, "atom: '%c%c%c%c'(%x)", name[0],name[1],name[2],name[3], size); if (!memcmp(name, g_atom->data, 4)) { //fprintf(stderr, "OK\n"); break; } //fprintf(stderr, "\n"); fseek(g_fin, apos + size, SEEK_SET); } *sizemax = size; g_atom++; if (g_atom->opcode == ATOM_DATA) { int err = ((int (*)(int)) g_atom->data)(size - 8); if (err < ERR_OK) { fseek(g_fin, apos + size, SEEK_SET); return err; } g_atom++; } if (g_atom->opcode == ATOM_DESCENT) { long apos = ftell(g_fin);; //fprintf(stderr, "descent\n"); g_atom++; while (g_atom->opcode != ATOM_STOP) { uint32_t subsize = size - 8; int ret; if (g_atom->opcode == ATOM_ASCENT) { g_atom++; break; } fseek(g_fin, apos, SEEK_SET); if ((ret = parse(&subsize)) < 0) return ret; } //fprintf(stderr, "ascent\n"); } fseek(g_fin, apos + size, SEEK_SET); return ERR_OK; } static int moovin(int sizemax) { long apos = ftell(g_fin); uint32_t atomsize; creator_t *old_atom = g_atom; int err, ret = sizemax; static creator_t mvhd[] = { {ATOM_NAME, "mvhd"}, {0} }; static creator_t trak[] = { {ATOM_NAME, "trak"}, {ATOM_DESCENT}, {ATOM_NAME, "tkhd"}, {ATOM_NAME, "mdia"}, {ATOM_DESCENT}, {ATOM_NAME, "mdhd"}, {ATOM_DATA, mdhdin}, {ATOM_NAME, "hdlr"}, {ATOM_DATA, hdlr1in}, {ATOM_NAME, "minf"}, {ATOM_DESCENT}, {ATOM_NAME, "smhd"}, {ATOM_NAME, "dinf"}, {ATOM_NAME, "stbl"}, {ATOM_DESCENT}, {ATOM_NAME, "stsd"}, {ATOM_DATA, stsdin}, {ATOM_DESCENT}, {ATOM_NAME, "mp4a"}, {ATOM_DATA, mp4ain}, {ATOM_DESCENT}, {ATOM_NAME, "esds"}, {ATOM_DATA, esdsin}, {ATOM_ASCENT}, {ATOM_ASCENT}, {ATOM_NAME, "stts"}, {ATOM_DATA, sttsin}, {ATOM_NAME, "stsc"}, {ATOM_NAME, "stsz"}, {ATOM_DATA, stszin}, {ATOM_NAME, "stco"}, {ATOM_DATA, stcoin}, {0} }; g_atom = mvhd; atomsize = sizemax + apos - ftell(g_fin); if (parse(&atomsize) < 0) { g_atom = old_atom; return ERR_FAIL; } fseek(g_fin, apos, SEEK_SET); while (1) { //fprintf(stderr, "TRAK\n"); g_atom = trak; atomsize = sizemax + apos - ftell(g_fin); if (atomsize < 8) break; //fprintf(stderr, "PARSE(%x)\n", atomsize); err = parse(&atomsize); //fprintf(stderr, "SIZE: %x/%x\n", atomsize, sizemax); if (err >= 0) break; if (err != ERR_UNSUPPORTED) { ret = err; break; } //fprintf(stderr, "UNSUPP\n"); } g_atom = old_atom; return ret; } static creator_t g_head[] = { {ATOM_NAME, "ftyp"}, {ATOM_DATA, ftypin}, {0} }; static creator_t g_moov[] = { {ATOM_NAME, "moov"}, {ATOM_DATA, moovin}, //{ATOM_DESCENT}, //{ATOM_NAME, "mvhd"}, {0} }; static creator_t g_meta1[] = { {ATOM_NAME, "moov"}, {ATOM_DESCENT}, {ATOM_NAME, "udta"}, {ATOM_DESCENT}, {ATOM_NAME, "meta"}, {ATOM_DATA, metain}, {ATOM_DESCENT}, {ATOM_NAME, "hdlr"}, {ATOM_DATA, hdlr2in}, {ATOM_NAME, "ilst"}, {ATOM_DATA, ilstin}, {0} }; static creator_t g_meta2[] = { {ATOM_NAME, "meta"}, {ATOM_DATA, metain}, {ATOM_DESCENT}, {ATOM_NAME, "hdlr"}, {ATOM_DATA, hdlr2in}, {ATOM_NAME, "ilst"}, {ATOM_DATA, ilstin}, {0} }; int mp4read_frame(void) { if (mp4config.frame.current >= mp4config.frame.ents) return ERR_FAIL; mp4config.bitbuf.size = mp4config.frame.data[mp4config.frame.current + 1] - mp4config.frame.data[mp4config.frame.current]; if (fread(mp4config.bitbuf.data, 1, mp4config.bitbuf.size, g_fin) != mp4config.bitbuf.size) { fprintf(stderr, "can't read frame data(frame %d@0x%x)\n", mp4config.frame.current, mp4config.frame.data[mp4config.frame.current]); return ERR_FAIL; } mp4config.frame.current++; return ERR_OK; } int mp4read_seek(int framenum) { if (framenum > mp4config.frame.ents) return ERR_FAIL; if (fseek(g_fin, mp4config.mdatofs + mp4config.frame.data[framenum], SEEK_SET)) return ERR_FAIL; mp4config.frame.current = framenum; return ERR_OK; } static void mp4info(void) { fprintf(stderr, "Modification Time:\t\t%s\n", mp4time(mp4config.mtime)); fprintf(stderr, "Samplerate:\t\t%d\n", mp4config.samplerate); fprintf(stderr, "Total samples:\t\t%d\n", mp4config.samples); fprintf(stderr, "Total channels:\t\t%d\n", mp4config.channels); fprintf(stderr, "Bits per sample:\t%d\n", mp4config.bits); fprintf(stderr, "Buffer size:\t\t%d\n", mp4config.buffersize); fprintf(stderr, "Max bitrate:\t\t%d\n", mp4config.bitratemax); fprintf(stderr, "Average bitrate:\t%d\n", mp4config.bitrateavg); fprintf(stderr, "Samples per frame:\t%d\n", mp4config.framesamples); fprintf(stderr, "Frames:\t\t\t%d\n", mp4config.frame.ents); fprintf(stderr, "ASC size:\t\t%d\n", mp4config.asc.size); fprintf(stderr, "Duration:\t\t%.1f sec\n", (float)mp4config.samples/mp4config.samplerate); fprintf(stderr, "Data offset/size:\t%x/%x\n", mp4config.mdatofs, mp4config.mdatsize); } int mp4read_close(void) { #define FREE(x) if(x){free(x);x=0;} FREE(mp4config.frame.data); FREE(mp4config.bitbuf.data); return ERR_OK; } int mp4read_open(char *name) { uint32_t atomsize; int ret; mp4read_close(); g_fin = faad_fopen(name, "rb"); if (!g_fin) return ERR_FAIL; if (mp4config.verbose.header) fprintf(stderr, "**** MP4 header ****\n"); g_atom = g_head; atomsize = INT_MAX; if (parse(&atomsize) < 0) goto err; g_atom = g_moov; atomsize = INT_MAX; rewind(g_fin); if ((ret = parse(&atomsize)) < 0) { fprintf(stderr, "parse:%d\n", ret); goto err; } // alloc frame buffer mp4config.bitbuf.data = malloc(mp4config.frame.maxsize); if (!mp4config.bitbuf.data) goto err; if (mp4config.verbose.header) { mp4info(); fprintf(stderr, "********************\n"); } if (mp4config.verbose.tags) { rewind(g_fin); g_atom = g_meta1; atomsize = INT_MAX; ret = parse(&atomsize); if (ret < 0) { rewind(g_fin); g_atom = g_meta2; atomsize = INT_MAX; ret = parse(&atomsize); } } return ERR_OK; err: mp4read_close(); return ERR_FAIL; } faad2-2_10_0/frontend/mp4read.h000066400000000000000000000033351374350120500162410ustar00rootroot00000000000000/**************************************************************************** MP4 input module Copyright (C) 2017 Krzysztof Nikiel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ****************************************************************************/ #include typedef struct { uint32_t ctime, mtime; uint32_t samplerate; // total sound samples uint32_t samples; uint32_t channels; // sample depth uint32_t bits; // buffer config uint16_t buffersize; uint32_t bitratemax; uint32_t bitrateavg; uint32_t framesamples; struct { uint32_t *data; uint32_t ents; int current; int maxsize; } frame; // AudioSpecificConfig data: struct { uint8_t buf[10]; int size; } asc; uint32_t mdatofs; uint32_t mdatsize; struct { int size; uint8_t *data; } bitbuf; struct { int header; int tags; } verbose; } mp4config_t; extern mp4config_t mp4config; int mp4read_open(char *name); int mp4read_seek(int framenum); int mp4read_frame(void); int mp4read_close(void); faad2-2_10_0/frontend/unicode_support.c000066400000000000000000000104271374350120500201220ustar00rootroot00000000000000/* Copyright (c) 2004-2012 LoRd_MuldeR File: unicode_support.c This file was originally part of a patch included with LameXP, released under the same license as the original audio tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 #include "unicode_support.h" #include #include static UINT g_old_output_cp = ((UINT)-1); char *utf16_to_utf8(const wchar_t *input) { char *Buffer; int BuffSize = 0, Result = 0; BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); Buffer = (char*) malloc(sizeof(char) * BuffSize); if(Buffer) { Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL); } return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; } char *utf16_to_ansi(const wchar_t *input) { char *Buffer; int BuffSize = 0, Result = 0; BuffSize = WideCharToMultiByte(CP_ACP, 0, input, -1, NULL, 0, NULL, NULL); Buffer = (char*) malloc(sizeof(char) * BuffSize); if(Buffer) { Result = WideCharToMultiByte(CP_ACP, 0, input, -1, Buffer, BuffSize, NULL, NULL); } return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; } wchar_t *utf8_to_utf16(const char *input) { wchar_t *Buffer; int BuffSize = 0, Result = 0; BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize); if(Buffer) { Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize); } return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; } void init_commandline_arguments_utf8(int *argc, char ***argv) { int i, nArgs; LPWSTR *szArglist; szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); if(NULL == szArglist) { fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n"); exit(-1); } *argv = (char**) malloc(sizeof(char*) * nArgs); *argc = nArgs; if(NULL == *argv) { fprintf(stderr, "\nFATAL: Malloc failed\n\n"); exit(-1); } for(i = 0; i < nArgs; i++) { (*argv)[i] = utf16_to_utf8(szArglist[i]); if(NULL == (*argv)[i]) { fprintf(stderr, "\nFATAL: utf16_to_utf8 failed\n\n"); exit(-1); } } LocalFree(szArglist); } void free_commandline_arguments_utf8(int *argc, char ***argv) { int i = 0; if(*argv != NULL) { for(i = 0; i < *argc; i++) { if((*argv)[i] != NULL) { free((*argv)[i]); (*argv)[i] = NULL; } } free(*argv); *argv = NULL; } } FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8) { FILE *ret = NULL; wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8); wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8); if(filename_utf16 && mode_utf16) { ret = _wfopen(filename_utf16, mode_utf16); } if(filename_utf16) free(filename_utf16); if(mode_utf16) free(mode_utf16); return ret; } void init_console_utf8(FILE *const stream) { if (_isatty(_fileno(stream))) { g_old_output_cp = GetConsoleOutputCP(); SetConsoleOutputCP(CP_UTF8); } } void uninit_console_utf8(void) { if(g_old_output_cp != ((UINT)-1)) { SetConsoleOutputCP(g_old_output_cp); } } #endiffaad2-2_10_0/frontend/unicode_support.h000066400000000000000000000042301374350120500201220ustar00rootroot00000000000000/* Copyright (c) 2004-2012 LoRd_MuldeR File: unicode_support.h This file was originally part of a patch included with LameXP, released under the same license as the original audio tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UNICODE_SUPPORT_H_INCLUDED #define UNICODE_SUPPORT_H_INCLUDED #include #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 char *utf16_to_utf8(const wchar_t *input); char *utf16_to_ansi(const wchar_t *input); wchar_t *utf8_to_utf16(const char *input); void init_commandline_arguments_utf8(int *argc, char ***argv); void free_commandline_arguments_utf8(int *argc, char ***argv); FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8); void init_console_utf8(FILE *const stream); void uninit_console_utf8(void); #define faad_fopen(X,Y) fopen_utf8((X),(Y)) #else #define faad_fopen(X,Y) fopen((X),(Y)) #endif #endif //UNICODE_SUPPORT_H_INCLUDED faad2-2_10_0/in_mpeg4aac.nsi000066400000000000000000000013011374350120500155660ustar00rootroot00000000000000Name "AudioCoding.com MP4 Winamp plugin" OutFile in_mp4.exe CRCCheck on LicenseText "You must read the following license before installing." LicenseData COPYING ComponentText "This will install the AudioCoding.com MP4 Winamp plugin on your computer." InstType Normal AutoCloseWindow true SetOverwrite on SetDateSave on InstallDir $PROGRAMFILES\Winamp InstallDirRegKey HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\Winamp" "UninstallString" ;DirShow DirText "The installer has detected the path to Winamp. If it is not correct, please change." Section "AudioCoding.com MP4 Winamp plugin" SectionIn 1 SetOutPath $INSTDIR\Plugins File plugins\in_mp4\Release\in_mp4.dll SectionEnd faad2-2_10_0/include/000077500000000000000000000000001374350120500143345ustar00rootroot00000000000000faad2-2_10_0/include/faad.h000066400000000000000000000026601374350120500154040ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: faad.h,v 1.51 2007/11/01 12:33:29 menno Exp $ **/ /* warn people for update */ #pragma message("please update faad2 include filename and function names!") /* Backwards compatible link */ #include "neaacdec.h" faad2-2_10_0/include/neaacdec.h000066400000000000000000000207441374350120500162370ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: neaacdec.h,v 1.14 2012/03/02 15:29:47 knik Exp $ **/ #ifndef __NEAACDEC_H__ #define __NEAACDEC_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if 1 /* MACROS FOR BACKWARDS COMPATIBILITY */ /* structs */ #define faacDecHandle NeAACDecHandle #define faacDecConfiguration NeAACDecConfiguration #define faacDecConfigurationPtr NeAACDecConfigurationPtr #define faacDecFrameInfo NeAACDecFrameInfo /* functions */ #define faacDecGetErrorMessage NeAACDecGetErrorMessage #define faacDecSetConfiguration NeAACDecSetConfiguration #define faacDecGetCurrentConfiguration NeAACDecGetCurrentConfiguration #define faacDecInit NeAACDecInit #define faacDecInit2 NeAACDecInit2 #define faacDecInitDRM NeAACDecInitDRM #define faacDecPostSeekReset NeAACDecPostSeekReset #define faacDecOpen NeAACDecOpen #define faacDecClose NeAACDecClose #define faacDecDecode NeAACDecDecode #define AudioSpecificConfig NeAACDecAudioSpecificConfig #endif #ifdef _WIN32 #pragma pack(push, 8) #define NEAACDECAPI __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 #define NEAACDECAPI __attribute__((visibility("default"))) #else #define NEAACDECAPI #endif #define FAAD2_VERSION "unknown" /* object types for AAC */ #define MAIN 1 #define LC 2 #define SSR 3 #define LTP 4 #define HE_AAC 5 #define ER_LC 17 #define ER_LTP 19 #define LD 23 #define DRM_ER_LC 27 /* special object type for DRM */ /* header types */ #define RAW 0 #define ADIF 1 #define ADTS 2 #define LATM 3 /* SBR signalling */ #define NO_SBR 0 #define SBR_UPSAMPLED 1 #define SBR_DOWNSAMPLED 2 #define NO_SBR_UPSAMPLED 3 /* library output formats */ #define FAAD_FMT_16BIT 1 #define FAAD_FMT_24BIT 2 #define FAAD_FMT_32BIT 3 #define FAAD_FMT_FLOAT 4 #define FAAD_FMT_FIXED FAAD_FMT_FLOAT #define FAAD_FMT_DOUBLE 5 /* Capabilities */ #define LC_DEC_CAP (1<<0) /* Can decode LC */ #define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */ #define LTP_DEC_CAP (1<<2) /* Can decode LTP */ #define LD_DEC_CAP (1<<3) /* Can decode LD */ #define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ #define FIXED_POINT_CAP (1<<5) /* Fixed point */ /* Channel definitions */ #define FRONT_CHANNEL_CENTER (1) #define FRONT_CHANNEL_LEFT (2) #define FRONT_CHANNEL_RIGHT (3) #define SIDE_CHANNEL_LEFT (4) #define SIDE_CHANNEL_RIGHT (5) #define BACK_CHANNEL_LEFT (6) #define BACK_CHANNEL_RIGHT (7) #define BACK_CHANNEL_CENTER (8) #define LFE_CHANNEL (9) #define UNKNOWN_CHANNEL (0) /* DRM channel definitions */ #define DRMCH_MONO 1 #define DRMCH_STEREO 2 #define DRMCH_SBR_MONO 3 #define DRMCH_SBR_STEREO 4 #define DRMCH_SBR_PS_STEREO 5 /* A decode call can eat up to FAAD_MIN_STREAMSIZE bytes per decoded channel, so at least so much bytes per channel should be available in this stream */ #define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ typedef void *NeAACDecHandle; typedef struct mp4AudioSpecificConfig { /* Audio Specific Info */ unsigned char objectTypeIndex; unsigned char samplingFrequencyIndex; unsigned long samplingFrequency; unsigned char channelsConfiguration; /* GA Specific Info */ unsigned char frameLengthFlag; unsigned char dependsOnCoreCoder; unsigned short coreCoderDelay; unsigned char extensionFlag; unsigned char aacSectionDataResilienceFlag; unsigned char aacScalefactorDataResilienceFlag; unsigned char aacSpectralDataResilienceFlag; unsigned char epConfig; char sbr_present_flag; char forceUpSampling; char downSampledSBR; } mp4AudioSpecificConfig; typedef struct NeAACDecConfiguration { unsigned char defObjectType; unsigned long defSampleRate; unsigned char outputFormat; unsigned char downMatrix; unsigned char useOldADTSFormat; unsigned char dontUpSampleImplicitSBR; } NeAACDecConfiguration, *NeAACDecConfigurationPtr; typedef struct NeAACDecFrameInfo { unsigned long bytesconsumed; unsigned long samples; unsigned char channels; unsigned char error; unsigned long samplerate; /* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */ unsigned char sbr; /* MPEG-4 ObjectType */ unsigned char object_type; /* AAC header type; MP4 will be signalled as RAW also */ unsigned char header_type; /* multichannel configuration */ unsigned char num_front_channels; unsigned char num_side_channels; unsigned char num_back_channels; unsigned char num_lfe_channels; unsigned char channel_position[64]; /* PS: 0: off, 1: on */ unsigned char ps; } NeAACDecFrameInfo; NEAACDECAPI char* NeAACDecGetErrorMessage(unsigned char errcode); NEAACDECAPI unsigned long NeAACDecGetCapabilities(void); NEAACDECAPI NeAACDecHandle NeAACDecOpen(void); NEAACDECAPI NeAACDecConfigurationPtr NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); NEAACDECAPI unsigned char NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config); /* Init the library based on info from the AAC file (ADTS/ADIF) */ NEAACDECAPI long NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels); /* Init the library using a DecoderSpecificInfo */ NEAACDECAPI char NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); /* Init the library for DRM */ NEAACDECAPI char NeAACDecInitDRM(NeAACDecHandle *hDecoder, unsigned long samplerate, unsigned char channels); NEAACDECAPI void NeAACDecPostSeekReset(NeAACDecHandle hDecoder, long frame); NEAACDECAPI void NeAACDecClose(NeAACDecHandle hDecoder); NEAACDECAPI void* NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); NEAACDECAPI void* NeAACDecDecode2(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer, unsigned long sample_buffer_size); NEAACDECAPI char NeAACDecAudioSpecificConfig(unsigned char *pBuffer, unsigned long buffer_size, mp4AudioSpecificConfig *mp4ASC); /* Get version and copyright strings */ NEAACDECAPI int NeAACDecGetVersion(char **faad_id_string, char **faad_copyright_string); #ifdef _WIN32 #pragma pack(pop) #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif faad2-2_10_0/libfaad/000077500000000000000000000000001374350120500142735ustar00rootroot00000000000000faad2-2_10_0/libfaad/Makefile.am000066400000000000000000000034131374350120500163300ustar00rootroot00000000000000lib_LTLIBRARIES = libfaad.la libfaad_drm.la AM_CPPFLAGS = -iquote $(top_srcdir)/include include_HEADERS = $(top_srcdir)/include/faad.h \ $(top_srcdir)/include/neaacdec.h libfaad_la_LDFLAGS = -version-info 2:0:0 -no-undefined libfaad_la_LIBADD = -lm libfaad_la_CFLAGS = -fvisibility=hidden libfaad_la_SOURCES = bits.c cfft.c decoder.c drc.c \ drm_dec.c error.c filtbank.c \ ic_predict.c is.c lt_predict.c mdct.c mp4.c ms.c output.c pns.c \ ps_dec.c ps_syntax.c \ pulse.c specrec.c syntax.c tns.c hcr.c huffman.c \ rvlc.c ssr.c ssr_fb.c ssr_ipqf.c common.c \ sbr_dct.c sbr_e_nf.c sbr_fbt.c sbr_hfadj.c sbr_hfgen.c \ sbr_huff.c sbr_qmf.c sbr_syntax.c sbr_tf_grid.c sbr_dec.c \ analysis.h bits.h cfft.h cfft_tab.h common.h \ drc.h drm_dec.h error.h fixed.h filtbank.h \ huffman.h ic_predict.h iq_table.h is.h kbd_win.h lt_predict.h \ mdct.h mdct_tab.h mp4.h ms.h output.h pns.h ps_dec.h ps_tables.h \ pulse.h rvlc.h \ sbr_dct.h sbr_dec.h sbr_e_nf.h sbr_fbt.h sbr_hfadj.h sbr_hfgen.h \ sbr_huff.h sbr_noise.h sbr_qmf.h sbr_syntax.h sbr_tf_grid.h \ sine_win.h specrec.h ssr.h ssr_fb.h ssr_ipqf.h \ ssr_win.h syntax.h structs.h tns.h \ sbr_qmf_c.h codebook/hcb.h \ codebook/hcb_1.h codebook/hcb_2.h codebook/hcb_3.h codebook/hcb_4.h \ codebook/hcb_5.h codebook/hcb_6.h codebook/hcb_7.h codebook/hcb_8.h \ codebook/hcb_9.h codebook/hcb_10.h codebook/hcb_11.h codebook/hcb_sf.h libfaad_drm_la_LDFLAGS = ${libfaad_la_LDFLAGS} libfaad_drm_la_LIBADD = ${libfaad_la_LIBADD} libfaad_drm_la_CFLAGS = ${libfaad_la_CFLAGS} -DDRM_SUPPORT libfaad_drm_la_SOURCES = ${libfaad_la_SOURCES} pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = faad2.pc EXTRA_DIST = faad2.pc.in faad2-2_10_0/libfaad/analysis.h000066400000000000000000000031221374350120500162650ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: analysis.h,v 1.18 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __ANALYSIS_H__ #define __ANALYSIS_H__ #ifdef __cplusplus extern "C" { #endif #ifdef ANALYSIS #define DEBUGDEC ,uint8_t print,uint16_t var,uint8_t *dbg #define DEBUGVAR(A,B,C) ,A,B,C extern uint16_t dbg_count; #else #define DEBUGDEC #define DEBUGVAR(A,B,C) #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/bits.c000066400000000000000000000146351374350120500154110ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: bits.c,v 1.44 2007/11/01 12:33:29 menno Exp $ **/ #include "common.h" #include "structs.h" #include #include "bits.h" /* initialize buffer, call once before first getbits or showbits */ void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size) { uint32_t tmp; if (ld == NULL) return; // useless //memset(ld, 0, sizeof(bitfile)); if (buffer_size == 0 || _buffer == NULL) { ld->error = 1; return; } ld->buffer = _buffer; ld->buffer_size = buffer_size; ld->bytes_left = buffer_size; if (ld->bytes_left >= 4) { tmp = getdword((uint32_t*)ld->buffer); ld->bytes_left -= 4; } else { tmp = getdword_n((uint32_t*)ld->buffer, ld->bytes_left); ld->bytes_left = 0; } ld->bufa = tmp; if (ld->bytes_left >= 4) { tmp = getdword((uint32_t*)ld->buffer + 1); ld->bytes_left -= 4; } else { tmp = getdword_n((uint32_t*)ld->buffer + 1, ld->bytes_left); ld->bytes_left = 0; } ld->bufb = tmp; ld->start = (uint32_t*)ld->buffer; ld->tail = ((uint32_t*)ld->buffer + 2); ld->bits_left = 32; ld->error = 0; } void faad_endbits(bitfile *ld) { // void } uint32_t faad_get_processed_bits(bitfile *ld) { return (uint32_t)(8 * (4*(ld->tail - ld->start) - 4) - (ld->bits_left)); } uint8_t faad_byte_align(bitfile *ld) { int remainder = (32 - ld->bits_left) & 0x7; if (remainder) { faad_flushbits(ld, 8 - remainder); return (uint8_t)(8 - remainder); } return 0; } void faad_flushbits_ex(bitfile *ld, uint32_t bits) { uint32_t tmp; ld->bufa = ld->bufb; if (ld->bytes_left >= 4) { tmp = getdword(ld->tail); ld->bytes_left -= 4; } else { tmp = getdword_n(ld->tail, ld->bytes_left); ld->bytes_left = 0; } ld->bufb = tmp; ld->tail++; ld->bits_left += (32 - bits); //ld->bytes_left -= 4; // if (ld->bytes_left == 0) // ld->no_more_reading = 1; // if (ld->bytes_left < 0) // ld->error = 1; } /* rewind to beginning */ void faad_rewindbits(bitfile *ld) { uint32_t tmp; ld->bytes_left = ld->buffer_size; if (ld->bytes_left >= 4) { tmp = getdword((uint32_t*)&ld->start[0]); ld->bytes_left -= 4; } else { tmp = getdword_n((uint32_t*)&ld->start[0], ld->bytes_left); ld->bytes_left = 0; } ld->bufa = tmp; if (ld->bytes_left >= 4) { tmp = getdword((uint32_t*)&ld->start[1]); ld->bytes_left -= 4; } else { tmp = getdword_n((uint32_t*)&ld->start[1], ld->bytes_left); ld->bytes_left = 0; } ld->bufb = tmp; ld->bits_left = 32; ld->tail = &ld->start[2]; } /* reset to a certain point */ void faad_resetbits(bitfile *ld, int bits) { uint32_t tmp; int words = bits >> 5; int remainder = bits & 0x1F; if (ld->buffer_size < words * 4) ld->bytes_left = 0; else ld->bytes_left = ld->buffer_size - words*4; if (ld->bytes_left >= 4) { tmp = getdword(&ld->start[words]); ld->bytes_left -= 4; } else { tmp = getdword_n(&ld->start[words], ld->bytes_left); ld->bytes_left = 0; } ld->bufa = tmp; if (ld->bytes_left >= 4) { tmp = getdword(&ld->start[words+1]); ld->bytes_left -= 4; } else { tmp = getdword_n(&ld->start[words+1], ld->bytes_left); ld->bytes_left = 0; } ld->bufb = tmp; ld->bits_left = 32 - remainder; ld->tail = &ld->start[words+2]; /* recheck for reading too many bytes */ ld->error = 0; // if (ld->bytes_left == 0) // ld->no_more_reading = 1; // if (ld->bytes_left < 0) // ld->error = 1; } uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits DEBUGDEC) { int i; unsigned int temp; int bytes = bits >> 3; int remainder = bits & 0x7; uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t)); for (i = 0; i < bytes; i++) { buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg)); } if (remainder) { temp = faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder); buffer[bytes] = (uint8_t)temp; } return buffer; } #ifdef DRM /* return the original data buffer */ void *faad_origbitbuffer(bitfile *ld) { return (void*)ld->start; } /* return the original data buffer size */ uint32_t faad_origbitbuffer_size(bitfile *ld) { return ld->buffer_size; } #endif /* reversed bit reading routines, used for RVLC and HCR */ void faad_initbits_rev(bitfile *ld, void *buffer, uint32_t bits_in_buffer) { uint32_t tmp; int32_t index; ld->buffer_size = bit2byte(bits_in_buffer); index = (bits_in_buffer+31)/32 - 1; ld->start = (uint32_t*)buffer + index - 2; tmp = getdword((uint32_t*)buffer + index); ld->bufa = tmp; tmp = getdword((uint32_t*)buffer + index - 1); ld->bufb = tmp; ld->tail = (uint32_t*)buffer + index; ld->bits_left = bits_in_buffer % 32; if (ld->bits_left == 0) ld->bits_left = 32; ld->bytes_left = ld->buffer_size; ld->error = 0; } /* EOF */ faad2-2_10_0/libfaad/bits.h000066400000000000000000000304651374350120500154150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: bits.h,v 1.45 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __BITS_H__ #define __BITS_H__ #ifdef __cplusplus extern "C" { #endif #include "analysis.h" #ifdef ANALYSIS #include #endif #define BYTE_NUMBIT 8 #define BYTE_NUMBIT_LD 3 //#define bit2byte(a) ((a+7)/BYTE_NUMBIT) #define bit2byte(a) ((a+7)>>BYTE_NUMBIT_LD) typedef struct _bitfile { /* bit input */ uint32_t bufa; uint32_t bufb; uint32_t bits_left; uint32_t buffer_size; /* size of the buffer in bytes */ uint32_t bytes_left; uint8_t error; uint32_t *tail; uint32_t *start; const void *buffer; } bitfile; #if 0 static uint32_t const bitmask[] = { 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF /* added bitmask 32, correct?!?!?! */ , 0xFFFFFFFF }; #endif void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size); void faad_endbits(bitfile *ld); void faad_initbits_rev(bitfile *ld, void *buffer, uint32_t bits_in_buffer); uint8_t faad_byte_align(bitfile *ld); uint32_t faad_get_processed_bits(bitfile *ld); void faad_flushbits_ex(bitfile *ld, uint32_t bits); void faad_rewindbits(bitfile *ld); void faad_resetbits(bitfile *ld, int bits); uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits DEBUGDEC); #ifdef DRM void *faad_origbitbuffer(bitfile *ld); uint32_t faad_origbitbuffer_size(bitfile *ld); #endif /* circumvent memory alignment errors on ARM */ static INLINE uint32_t getdword(void *mem) { uint32_t tmp; #ifndef ARCH_IS_BIG_ENDIAN ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3]; ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2]; ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1]; ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0]; #else ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3]; #endif return tmp; } /* reads only n bytes from the stream instead of the standard 4 */ static /*INLINE*/ uint32_t getdword_n(void *mem, int n) { uint32_t tmp = 0; #ifndef ARCH_IS_BIG_ENDIAN switch (n) { case 3: ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2]; case 2: ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1]; case 1: ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0]; default: break; } #else switch (n) { case 3: ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; case 2: ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; case 1: ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; default: break; } #endif return tmp; } static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits) { if (bits <= ld->bits_left) { //return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits]; return (ld->bufa << (32 - ld->bits_left)) >> (32 - bits); } bits -= ld->bits_left; //return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits)); return ((ld->bufa & ((1<bits_left)-1)) << bits) | (ld->bufb >> (32 - bits)); } static INLINE void faad_flushbits(bitfile *ld, uint32_t bits) { /* do nothing if error */ if (ld->error != 0) return; if (bits < ld->bits_left) { ld->bits_left -= bits; } else { faad_flushbits_ex(ld, bits); } } /* return next n bits (right adjusted) */ static /*INLINE*/ uint32_t faad_getbits(bitfile *ld, uint32_t n DEBUGDEC) { uint32_t ret; if (n == 0) return 0; ret = faad_showbits(ld, n); faad_flushbits(ld, n); #ifdef ANALYSIS if (print) fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg); #endif return ret; } static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC) { uint8_t r; if (ld->bits_left > 0) { ld->bits_left--; r = (uint8_t)((ld->bufa >> ld->bits_left) & 1); return r; } /* bits_left == 0 */ #if 0 r = (uint8_t)(ld->bufb >> 31); faad_flushbits_ex(ld, 1); #else r = (uint8_t)faad_getbits(ld, 1); #endif return r; } /* reversed bitreading routines */ static INLINE uint32_t faad_showbits_rev(bitfile *ld, uint32_t bits) { uint8_t i; uint32_t B = 0; if (bits <= ld->bits_left) { for (i = 0; i < bits; i++) { if (ld->bufa & (1 << (i + (32 - ld->bits_left)))) B |= (1 << (bits - i - 1)); } return B; } else { for (i = 0; i < ld->bits_left; i++) { if (ld->bufa & (1 << (i + (32 - ld->bits_left)))) B |= (1 << (bits - i - 1)); } for (i = 0; i < bits - ld->bits_left; i++) { if (ld->bufb & (1 << (i + (32-ld->bits_left)))) B |= (1 << (bits - ld->bits_left - i - 1)); } return B; } } static INLINE void faad_flushbits_rev(bitfile *ld, uint32_t bits) { /* do nothing if error */ if (ld->error != 0) return; if (bits < ld->bits_left) { ld->bits_left -= bits; } else { uint32_t tmp; ld->bufa = ld->bufb; tmp = getdword(ld->start); ld->bufb = tmp; ld->start--; ld->bits_left += (32 - bits); if (ld->bytes_left < 4) { ld->error = 1; ld->bytes_left = 0; } else { ld->bytes_left -= 4; } // if (ld->bytes_left == 0) // ld->no_more_reading = 1; } } static /*INLINE*/ uint32_t faad_getbits_rev(bitfile *ld, uint32_t n DEBUGDEC) { uint32_t ret; if (n == 0) return 0; ret = faad_showbits_rev(ld, n); faad_flushbits_rev(ld, n); #ifdef ANALYSIS if (print) fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg); #endif return ret; } #ifdef DRM /* CRC lookup table for G8 polynome in DRM standard */ static const uint8_t crc_table_G8[256] = { 0x0, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x2, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x6, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x4, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0xe, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0xc, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x8, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0xa, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x1, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x3, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x7, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x5, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0xf, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0xd, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x9, 0x7f, 0x62, 0x45, 0x58, 0xb, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4, }; static uint8_t faad_check_CRC(bitfile *ld, uint16_t len) { int bytes, rem; unsigned int CRC; unsigned int r=255; /* Initialize to all ones */ /* CRC polynome used x^8 + x^4 + x^3 + x^2 +1 */ #define GPOLY 0435 faad_rewindbits(ld); CRC = (unsigned int) ~faad_getbits(ld, 8 DEBUGVAR(1,999,"faad_check_CRC(): CRC")) & 0xFF; /* CRC is stored inverted */ bytes = len >> 3; rem = len & 0x7; for (; bytes > 0; bytes--) { r = crc_table_G8[( r ^ faad_getbits(ld, 8 DEBUGVAR(1,998,"")) ) & 0xFF]; } for (; rem > 0; rem--) { r = ( (r << 1) ^ (( ( faad_get1bit(ld DEBUGVAR(1,998,"")) & 1) ^ ((r >> 7) & 1)) * GPOLY )) & 0xFF; } if (r != CRC) // if (0) { return 28; } else { return 0; } } static uint8_t tabFlipbits[256] = { 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240, 8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248, 4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244, 12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252, 2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242, 10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250, 6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246, 14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254, 1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241, 9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249, 5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245, 13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253, 3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243, 11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251, 7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247, 15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255 }; #endif #ifdef ERROR_RESILIENCE /* Modified bit reading functions for HCR */ typedef struct { /* bit input */ uint32_t bufa; uint32_t bufb; int8_t len; } bits_t; static INLINE uint32_t showbits_hcr(bits_t *ld, uint8_t bits) { if (bits == 0) return 0; if (ld->len <= 32) { /* huffman_spectral_data_2 needs to read more than may be available, bits maybe > ld->len, deliver 0 than */ if (ld->len >= bits) return ((ld->bufa >> (ld->len - bits)) & (0xFFFFFFFF >> (32 - bits))); else return ((ld->bufa << (bits - ld->len)) & (0xFFFFFFFF >> (32 - bits))); } else { if ((ld->len - bits) < 32) { return ( (ld->bufb & (0xFFFFFFFF >> (64 - ld->len))) << (bits - ld->len + 32)) | (ld->bufa >> (ld->len - bits)); } else { return ((ld->bufb >> (ld->len - bits - 32)) & (0xFFFFFFFF >> (32 - bits))); } } } /* return 1 if position is outside of buffer, 0 otherwise */ static INLINE int8_t flushbits_hcr( bits_t *ld, uint8_t bits) { ld->len -= bits; if (ld->len <0) { ld->len = 0; return 1; } else { return 0; } } static INLINE int8_t getbits_hcr(bits_t *ld, uint8_t n, uint32_t *result) { *result = showbits_hcr(ld, n); return flushbits_hcr(ld, n); } static INLINE int8_t get1bit_hcr(bits_t *ld, uint8_t *result) { uint32_t res; int8_t ret; ret = getbits_hcr(ld, 1, &res); *result = (int8_t)(res & 1); return ret; } #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/cfft.c000066400000000000000000001032401374350120500153610ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: cfft.c,v 1.35 2007/11/01 12:33:29 menno Exp $ **/ /* * Algorithmically based on Fortran-77 FFTPACK * by Paul N. Swarztrauber(Version 4, 1985). * * Does even sized fft only */ /* isign is +1 for backward and -1 for forward transforms */ #include "common.h" #include "structs.h" #include #include "cfft.h" #include "cfft_tab.h" /* static function declarations */ static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa); static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa); static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, const complex_t *wa4, const int8_t isign); static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); /*---------------------------------------------------------------------- passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd. ----------------------------------------------------------------------*/ static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa) { uint16_t i, k, ah, ac; if (ido == 1) { for (k = 0; k < l1; k++) { ah = 2*k; ac = 4*k; RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); } } else { for (k = 0; k < l1; k++) { ah = k*ido; ac = 2*k*ido; for (i = 0; i < ido; i++) { complex_t t2; RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); #if 1 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); #else ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); #endif } } } } static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa) { uint16_t i, k, ah, ac; if (ido == 1) { for (k = 0; k < l1; k++) { ah = 2*k; ac = 4*k; RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); } } else { for (k = 0; k < l1; k++) { ah = k*ido; ac = 2*k*ido; for (i = 0; i < ido; i++) { complex_t t2; RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); #if 1 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); #else ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); #endif } } } } static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign) { static real_t taur = FRAC_CONST(-0.5); static real_t taui = FRAC_CONST(0.866025403784439); uint16_t i, k, ac, ah; complex_t c2, c3, d2, d3, t2; if (ido == 1) { if (isign == 1) { for (k = 0; k < l1; k++) { ac = 3*k+1; ah = k; RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); RE(ch[ah+l1]) = RE(c2) - IM(c3); IM(ch[ah+l1]) = IM(c2) + RE(c3); RE(ch[ah+2*l1]) = RE(c2) + IM(c3); IM(ch[ah+2*l1]) = IM(c2) - RE(c3); } } else { for (k = 0; k < l1; k++) { ac = 3*k+1; ah = k; RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); RE(ch[ah+l1]) = RE(c2) + IM(c3); IM(ch[ah+l1]) = IM(c2) - RE(c3); RE(ch[ah+2*l1]) = RE(c2) - IM(c3); IM(ch[ah+2*l1]) = IM(c2) + RE(c3); } } } else { if (isign == 1) { for (k = 0; k < l1; k++) { for (i = 0; i < ido; i++) { ac = i + (3*k+1)*ido; ah = i + k * ido; RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); RE(d2) = RE(c2) - IM(c3); IM(d3) = IM(c2) - RE(c3); RE(d3) = RE(c2) + IM(c3); IM(d2) = IM(c2) + RE(c3); #if 1 ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); #else ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); #endif } } } else { for (k = 0; k < l1; k++) { for (i = 0; i < ido; i++) { ac = i + (3*k+1)*ido; ah = i + k * ido; RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); RE(d2) = RE(c2) + IM(c3); IM(d3) = IM(c2) + RE(c3); RE(d3) = RE(c2) - IM(c3); IM(d2) = IM(c2) - RE(c3); #if 1 ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); #else ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); #endif } } } } } static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3) { uint16_t i, k, ac, ah; if (ido == 1) { for (k = 0; k < l1; k++) { complex_t t1, t2, t3, t4; ac = 4*k; ah = k; RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); RE(ch[ah]) = RE(t2) + RE(t3); RE(ch[ah+2*l1]) = RE(t2) - RE(t3); IM(ch[ah]) = IM(t2) + IM(t3); IM(ch[ah+2*l1]) = IM(t2) - IM(t3); RE(ch[ah+l1]) = RE(t1) + RE(t4); RE(ch[ah+3*l1]) = RE(t1) - RE(t4); IM(ch[ah+l1]) = IM(t1) + IM(t4); IM(ch[ah+3*l1]) = IM(t1) - IM(t4); } } else { for (k = 0; k < l1; k++) { ac = 4*k*ido; ah = k*ido; for (i = 0; i < ido; i++) { complex_t c2, c3, c4, t1, t2, t3, t4; RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); RE(c2) = RE(t1) + RE(t4); RE(c4) = RE(t1) - RE(t4); IM(c2) = IM(t1) + IM(t4); IM(c4) = IM(t1) - IM(t4); RE(ch[ah+i]) = RE(t2) + RE(t3); RE(c3) = RE(t2) - RE(t3); IM(ch[ah+i]) = IM(t2) + IM(t3); IM(c3) = IM(t2) - IM(t3); #if 1 ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); #else ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); #endif } } } } static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3) { uint16_t i, k, ac, ah; if (ido == 1) { for (k = 0; k < l1; k++) { complex_t t1, t2, t3, t4; ac = 4*k; ah = k; RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); RE(ch[ah]) = RE(t2) + RE(t3); RE(ch[ah+2*l1]) = RE(t2) - RE(t3); IM(ch[ah]) = IM(t2) + IM(t3); IM(ch[ah+2*l1]) = IM(t2) - IM(t3); RE(ch[ah+l1]) = RE(t1) - RE(t4); RE(ch[ah+3*l1]) = RE(t1) + RE(t4); IM(ch[ah+l1]) = IM(t1) - IM(t4); IM(ch[ah+3*l1]) = IM(t1) + IM(t4); } } else { for (k = 0; k < l1; k++) { ac = 4*k*ido; ah = k*ido; for (i = 0; i < ido; i++) { complex_t c2, c3, c4, t1, t2, t3, t4; RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); RE(c2) = RE(t1) - RE(t4); RE(c4) = RE(t1) + RE(t4); IM(c2) = IM(t1) - IM(t4); IM(c4) = IM(t1) + IM(t4); RE(ch[ah+i]) = RE(t2) + RE(t3); RE(c3) = RE(t2) - RE(t3); IM(ch[ah+i]) = IM(t2) + IM(t3); IM(c3) = IM(t2) - IM(t3); #if 1 ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); #else ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); #endif } } } } static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, const complex_t *wa4, const int8_t isign) { static real_t tr11 = FRAC_CONST(0.309016994374947); static real_t ti11 = FRAC_CONST(0.951056516295154); static real_t tr12 = FRAC_CONST(-0.809016994374947); static real_t ti12 = FRAC_CONST(0.587785252292473); uint16_t i, k, ac, ah; complex_t c2, c3, c4, c5, d3, d4, d5, d2, t2, t3, t4, t5; if (ido == 1) { if (isign == 1) { for (k = 0; k < l1; k++) { ac = 5*k + 1; ah = k; RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); ComplexMult(&RE(c5), &RE(c4), ti11, ti12, RE(t5), RE(t4)); ComplexMult(&IM(c5), &IM(c4), ti11, ti12, IM(t5), IM(t4)); RE(ch[ah+l1]) = RE(c2) - IM(c5); IM(ch[ah+l1]) = IM(c2) + RE(c5); RE(ch[ah+2*l1]) = RE(c3) - IM(c4); IM(ch[ah+2*l1]) = IM(c3) + RE(c4); RE(ch[ah+3*l1]) = RE(c3) + IM(c4); IM(ch[ah+3*l1]) = IM(c3) - RE(c4); RE(ch[ah+4*l1]) = RE(c2) + IM(c5); IM(ch[ah+4*l1]) = IM(c2) - RE(c5); } } else { for (k = 0; k < l1; k++) { ac = 5*k + 1; ah = k; RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); ComplexMult(&RE(c4), &RE(c5), ti12, ti11, RE(t5), RE(t4)); ComplexMult(&IM(c4), &IM(c5), ti12, ti11, IM(t5), IM(t4)); RE(ch[ah+l1]) = RE(c2) + IM(c5); IM(ch[ah+l1]) = IM(c2) - RE(c5); RE(ch[ah+2*l1]) = RE(c3) + IM(c4); IM(ch[ah+2*l1]) = IM(c3) - RE(c4); RE(ch[ah+3*l1]) = RE(c3) - IM(c4); IM(ch[ah+3*l1]) = IM(c3) + RE(c4); RE(ch[ah+4*l1]) = RE(c2) - IM(c5); IM(ch[ah+4*l1]) = IM(c2) + RE(c5); } } } else { if (isign == 1) { for (k = 0; k < l1; k++) { for (i = 0; i < ido; i++) { ac = i + (k*5 + 1) * ido; ah = i + k * ido; RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); ComplexMult(&RE(c5), &RE(c4), ti11, ti12, RE(t5), RE(t4)); ComplexMult(&IM(c5), &IM(c4), ti11, ti12, IM(t5), IM(t4)); IM(d2) = IM(c2) + RE(c5); IM(d3) = IM(c3) + RE(c4); RE(d4) = RE(c3) + IM(c4); RE(d5) = RE(c2) + IM(c5); RE(d2) = RE(c2) - IM(c5); IM(d5) = IM(c2) - RE(c5); RE(d3) = RE(c3) - IM(c4); IM(d4) = IM(c3) - RE(c4); #if 1 ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); #else ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); #endif } } } else { for (k = 0; k < l1; k++) { for (i = 0; i < ido; i++) { ac = i + (k*5 + 1) * ido; ah = i + k * ido; RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); ComplexMult(&RE(c4), &RE(c5), ti12, ti11, RE(t5), RE(t4)); ComplexMult(&IM(c4), &IM(c5), ti12, ti11, IM(t5), IM(t4)); IM(d2) = IM(c2) - RE(c5); IM(d3) = IM(c3) - RE(c4); RE(d4) = RE(c3) - IM(c4); RE(d5) = RE(c2) - IM(c5); RE(d2) = RE(c2) + IM(c5); IM(d5) = IM(c2) + RE(c5); RE(d3) = RE(c3) + IM(c4); IM(d4) = IM(c3) + RE(c4); #if 1 ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); #else ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); #endif } } } } } /*---------------------------------------------------------------------- cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs. ----------------------------------------------------------------------*/ static INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, const uint16_t *ifac, const complex_t *wa, const int8_t isign) { uint16_t i; uint16_t k1, l1, l2; uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; nf = ifac[1]; na = 0; l1 = 1; iw = 0; for (k1 = 2; k1 <= nf+1; k1++) { ip = ifac[k1]; l2 = ip*l1; ido = n / l2; idl1 = ido*l1; switch (ip) { case 4: ix2 = iw + ido; ix3 = ix2 + ido; if (na == 0) passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); else passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); na = 1 - na; break; case 2: if (na == 0) passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); else passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); na = 1 - na; break; case 3: ix2 = iw + ido; if (na == 0) passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); else passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); na = 1 - na; break; case 5: ix2 = iw + ido; ix3 = ix2 + ido; ix4 = ix3 + ido; if (na == 0) passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); else passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); na = 1 - na; break; } l1 = l2; iw += (ip-1) * ido; } if (na == 0) return; for (i = 0; i < n; i++) { RE(c[i]) = RE(ch[i]); IM(c[i]) = IM(ch[i]); } } static INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch, const uint16_t *ifac, const complex_t *wa, const int8_t isign) { uint16_t i; uint16_t k1, l1, l2; uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; nf = ifac[1]; na = 0; l1 = 1; iw = 0; for (k1 = 2; k1 <= nf+1; k1++) { ip = ifac[k1]; l2 = ip*l1; ido = n / l2; idl1 = ido*l1; switch (ip) { case 4: ix2 = iw + ido; ix3 = ix2 + ido; if (na == 0) passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); else passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); na = 1 - na; break; case 2: if (na == 0) passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); else passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); na = 1 - na; break; case 3: ix2 = iw + ido; if (na == 0) passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); else passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); na = 1 - na; break; case 5: ix2 = iw + ido; ix3 = ix2 + ido; ix4 = ix3 + ido; if (na == 0) passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); else passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); na = 1 - na; break; } l1 = l2; iw += (ip-1) * ido; } if (na == 0) return; for (i = 0; i < n; i++) { RE(c[i]) = RE(ch[i]); IM(c[i]) = IM(ch[i]); } } void cfftf(cfft_info *cfft, complex_t *c) { cfftf1neg(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, -1); } void cfftb(cfft_info *cfft, complex_t *c) { cfftf1pos(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, +1); } static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac) { static uint16_t ntryh[4] = {3, 4, 2, 5}; #ifndef FIXED_POINT real_t arg, argh, argld, fi; uint16_t ido, ipm; uint16_t i1, k1, l1, l2; uint16_t ld, ii, ip; #endif uint16_t ntry = 0, i, j; uint16_t ib; uint16_t nf, nl, nq, nr; nl = n; nf = 0; j = 0; startloop: j++; if (j <= 4) ntry = ntryh[j-1]; else ntry += 2; do { nq = nl / ntry; nr = nl - ntry*nq; if (nr != 0) goto startloop; nf++; ifac[nf+1] = ntry; nl = nq; if (ntry == 2 && nf != 1) { for (i = 2; i <= nf; i++) { ib = nf - i + 2; ifac[ib+1] = ifac[ib]; } ifac[2] = 2; } } while (nl != 1); ifac[0] = n; ifac[1] = nf; #ifndef FIXED_POINT argh = (real_t)2.0*(real_t)M_PI / (real_t)n; i = 0; l1 = 1; for (k1 = 1; k1 <= nf; k1++) { ip = ifac[k1+1]; ld = 0; l2 = l1*ip; ido = n / l2; ipm = ip - 1; for (j = 0; j < ipm; j++) { i1 = i; RE(wa[i]) = 1.0; IM(wa[i]) = 0.0; ld += l1; fi = 0; argld = ld*argh; for (ii = 0; ii < ido; ii++) { i++; fi++; arg = fi * argld; RE(wa[i]) = (real_t)cos(arg); #if 1 IM(wa[i]) = (real_t)sin(arg); #else IM(wa[i]) = (real_t)-sin(arg); #endif } if (ip > 5) { RE(wa[i1]) = RE(wa[i]); IM(wa[i1]) = IM(wa[i]); } } l1 = l2; } #endif } cfft_info *cffti(uint16_t n) { cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info)); cfft->n = n; cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t)); #ifndef FIXED_POINT cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t)); cffti1(n, cfft->tab, cfft->ifac); #else cffti1(n, NULL, cfft->ifac); switch (n) { case 64: cfft->tab = (complex_t*)cfft_tab_64; break; case 512: cfft->tab = (complex_t*)cfft_tab_512; break; #ifdef LD_DEC case 256: cfft->tab = (complex_t*)cfft_tab_256; break; #endif #ifdef ALLOW_SMALL_FRAMELENGTH case 60: cfft->tab = (complex_t*)cfft_tab_60; break; case 480: cfft->tab = (complex_t*)cfft_tab_480; break; #ifdef LD_DEC case 240: cfft->tab = (complex_t*)cfft_tab_240; break; #endif #endif case 128: cfft->tab = (complex_t*)cfft_tab_128; break; } #endif return cfft; } void cfftu(cfft_info *cfft) { if (cfft->work) faad_free(cfft->work); #ifndef FIXED_POINT if (cfft->tab) faad_free(cfft->tab); #endif if (cfft) faad_free(cfft); } faad2-2_10_0/libfaad/cfft.h000066400000000000000000000032051374350120500153660ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: cfft.h,v 1.24 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __CFFT_H__ #define __CFFT_H__ #ifdef __cplusplus extern "C" { #endif typedef struct { uint16_t n; uint16_t ifac[15]; complex_t *work; complex_t *tab; } cfft_info; void cfftf(cfft_info *cfft, complex_t *c); void cfftb(cfft_info *cfft, complex_t *c); cfft_info *cffti(uint16_t n); void cfftu(cfft_info *cfft); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/cfft_tab.h000066400000000000000000003633011374350120500162220ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: cfft_tab.h,v 1.21 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __CFFT_TAB_H__ #define __CFFT_TAB_H__ #ifdef __cplusplus extern "C" { #endif #ifdef FIXED_POINT ALIGN static const complex_t cfft_tab_512[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) }, { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, { FRAC_CONST(0.999322354793549), FRAC_CONST(0.036807224154472) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.998118102550507), FRAC_CONST(0.061320740729570) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.996312618255615), FRAC_CONST(0.085797317326069) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.993906974792480), FRAC_CONST(0.110222205519676) }, { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, { FRAC_CONST(0.990902662277222), FRAC_CONST(0.134580716490746) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.987301409244537), FRAC_CONST(0.158858150243759) }, { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, { FRAC_CONST(0.983105480670929), FRAC_CONST(0.183039888739586) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.978317379951477), FRAC_CONST(0.207111388444901) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.972939968109131), FRAC_CONST(0.231058120727539) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.966976463794708), FRAC_CONST(0.254865676164627) }, { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, { FRAC_CONST(0.960430502891541), FRAC_CONST(0.278519690036774) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.953306019306183), FRAC_CONST(0.302005946636200) }, { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, { FRAC_CONST(0.945607304573059), FRAC_CONST(0.325310319662094) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.937339007854462), FRAC_CONST(0.348418682813644) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.928506076335907), FRAC_CONST(0.371317207813263) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.919113874435425), FRAC_CONST(0.393992066383362) }, { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, { FRAC_CONST(0.909167945384979), FRAC_CONST(0.416429579257965) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.898674488067627), FRAC_CONST(0.438616245985031) }, { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, { FRAC_CONST(0.887639641761780), FRAC_CONST(0.460538715124130) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.876070082187653), FRAC_CONST(0.482183754444122) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.863972842693329), FRAC_CONST(0.503538370132446) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.851355195045471), FRAC_CONST(0.524589717388153) }, { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, { FRAC_CONST(0.838224709033966), FRAC_CONST(0.545324981212616) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.824589252471924), FRAC_CONST(0.565731823444366) }, { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, { FRAC_CONST(0.810457170009613), FRAC_CONST(0.585797905921936) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.795836925506592), FRAC_CONST(0.605511009693146) }, { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, { FRAC_CONST(0.780737221240997), FRAC_CONST(0.624859511852264) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.765167236328125), FRAC_CONST(0.643831551074982) }, { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(0.749136388301849), FRAC_CONST(0.662415802478790) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.732654273509979), FRAC_CONST(0.680601000785828) }, { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, { FRAC_CONST(0.715730786323547), FRAC_CONST(0.698376297950745) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.698376238346100), FRAC_CONST(0.715730845928192) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.680601000785828), FRAC_CONST(0.732654273509979) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.662415742874146), FRAC_CONST(0.749136388301849) }, { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, { FRAC_CONST(0.643831551074982), FRAC_CONST(0.765167295932770) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.624859452247620), FRAC_CONST(0.780737280845642) }, { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, { FRAC_CONST(0.605511009693146), FRAC_CONST(0.795836925506592) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.585797846317291), FRAC_CONST(0.810457170009613) }, { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.565731823444366), FRAC_CONST(0.824589312076569) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.545324981212616), FRAC_CONST(0.838224709033966) }, { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, { FRAC_CONST(0.524589657783508), FRAC_CONST(0.851355195045471) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.503538429737091), FRAC_CONST(0.863972842693329) }, { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, { FRAC_CONST(0.482183724641800), FRAC_CONST(0.876070141792297) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.460538715124130), FRAC_CONST(0.887639641761780) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.438616186380386), FRAC_CONST(0.898674488067627) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.416429549455643), FRAC_CONST(0.909168004989624) }, { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, { FRAC_CONST(0.393991947174072), FRAC_CONST(0.919113874435425) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.371317148208618), FRAC_CONST(0.928506076335907) }, { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(0.348418682813644), FRAC_CONST(0.937339007854462) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.325310230255127), FRAC_CONST(0.945607364177704) }, { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, { FRAC_CONST(0.302005946636200), FRAC_CONST(0.953306019306183) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.278519600629807), FRAC_CONST(0.960430562496185) }, { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(0.254865646362305), FRAC_CONST(0.966976463794708) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.231058135628700), FRAC_CONST(0.972939968109131) }, { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(0.207111328840256), FRAC_CONST(0.978317379951477) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.183039888739586), FRAC_CONST(0.983105480670929) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.158858075737953), FRAC_CONST(0.987301409244537) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.134580686688423), FRAC_CONST(0.990902662277222) }, { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, { FRAC_CONST(0.110222116112709), FRAC_CONST(0.993906974792480) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.085797272622585), FRAC_CONST(0.996312618255615) }, { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(0.061320748180151), FRAC_CONST(0.998118102550507) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(0.036807164549828), FRAC_CONST(0.999322414398193) }, { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(0.012271529063582), FRAC_CONST(0.999924719333649) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.012271616607904), FRAC_CONST(0.999924719333649) }, { FRAC_CONST(-0.024541223421693), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(-0.036807250231504), FRAC_CONST(0.999322354793549) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.061320833861828), FRAC_CONST(0.998118102550507) }, { FRAC_CONST(-0.073564574122429), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(-0.085797362029552), FRAC_CONST(0.996312618255615) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.110222205519676), FRAC_CONST(0.993906974792480) }, { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, { FRAC_CONST(-0.134580776095390), FRAC_CONST(0.990902602672577) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.158858165144920), FRAC_CONST(0.987301409244537) }, { FRAC_CONST(-0.170961946249008), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(-0.183039978146553), FRAC_CONST(0.983105480670929) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.207111418247223), FRAC_CONST(0.978317379951477) }, { FRAC_CONST(-0.219101309776306), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(-0.231058210134506), FRAC_CONST(0.972939908504486) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.254865705966949), FRAC_CONST(0.966976463794708) }, { FRAC_CONST(-0.266712844371796), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(-0.278519690036774), FRAC_CONST(0.960430502891541) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.302006036043167), FRAC_CONST(0.953306019306183) }, { FRAC_CONST(-0.313681721687317), FRAC_CONST(0.949528157711029) }, { FRAC_CONST(-0.325310319662094), FRAC_CONST(0.945607304573059) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.348418772220612), FRAC_CONST(0.937338948249817) }, { FRAC_CONST(-0.359895050525665), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(-0.371317237615585), FRAC_CONST(0.928506076335907) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.393992036581039), FRAC_CONST(0.919113874435425) }, { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, { FRAC_CONST(-0.416429519653320), FRAC_CONST(0.909168004989624) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.438616245985031), FRAC_CONST(0.898674428462982) }, { FRAC_CONST(-0.449611365795136), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(-0.460538804531097), FRAC_CONST(0.887639582157135) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.482183903455734), FRAC_CONST(0.876070022583008) }, { FRAC_CONST(-0.492898166179657), FRAC_CONST(0.870087027549744) }, { FRAC_CONST(-0.503538370132446), FRAC_CONST(0.863972842693329) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.524589717388153), FRAC_CONST(0.851355135440826) }, { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, { FRAC_CONST(-0.545325100421906), FRAC_CONST(0.838224649429321) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.565731763839722), FRAC_CONST(0.824589312076569) }, { FRAC_CONST(-0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(-0.585797905921936), FRAC_CONST(0.810457170009613) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.605511128902435), FRAC_CONST(0.795836865901947) }, { FRAC_CONST(-0.615231692790985), FRAC_CONST(0.788346350193024) }, { FRAC_CONST(-0.624859631061554), FRAC_CONST(0.780737102031708) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.643831551074982), FRAC_CONST(0.765167236328125) }, { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, { FRAC_CONST(-0.662415802478790), FRAC_CONST(0.749136328697205) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.680601119995117), FRAC_CONST(0.732654154300690) }, { FRAC_CONST(-0.689540684223175), FRAC_CONST(0.724246978759766) }, { FRAC_CONST(-0.698376238346100), FRAC_CONST(0.715730845928192) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.715730845928192), FRAC_CONST(0.698376238346100) }, { FRAC_CONST(-0.724247157573700), FRAC_CONST(0.689540505409241) }, { FRAC_CONST(-0.732654333114624), FRAC_CONST(0.680600941181183) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.749136507511139), FRAC_CONST(0.662415623664856) }, { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(-0.765167295932770), FRAC_CONST(0.643831551074982) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.780737280845642), FRAC_CONST(0.624859452247620) }, { FRAC_CONST(-0.788346469402313), FRAC_CONST(0.615231513977051) }, { FRAC_CONST(-0.795836985111237), FRAC_CONST(0.605510950088501) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.810457170009613), FRAC_CONST(0.585797846317291) }, { FRAC_CONST(-0.817584812641144), FRAC_CONST(0.575808167457581) }, { FRAC_CONST(-0.824589312076569), FRAC_CONST(0.565731763839722) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.838224768638611), FRAC_CONST(0.545324862003326) }, { FRAC_CONST(-0.844853639602661), FRAC_CONST(0.534997463226318) }, { FRAC_CONST(-0.851355314254761), FRAC_CONST(0.524589538574219) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.863972842693329), FRAC_CONST(0.503538370132446) }, { FRAC_CONST(-0.870087027549744), FRAC_CONST(0.492898136377335) }, { FRAC_CONST(-0.876070141792297), FRAC_CONST(0.482183694839478) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.887639701366425), FRAC_CONST(0.460538566112518) }, { FRAC_CONST(-0.893224298954010), FRAC_CONST(0.449611365795136) }, { FRAC_CONST(-0.898674488067627), FRAC_CONST(0.438616245985031) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.909168004989624), FRAC_CONST(0.416429489850998) }, { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, { FRAC_CONST(-0.919113874435425), FRAC_CONST(0.393991917371750) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.928506076335907), FRAC_CONST(0.371317237615585) }, { FRAC_CONST(-0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(-0.937339007854462), FRAC_CONST(0.348418653011322) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.945607364177704), FRAC_CONST(0.325310200452805) }, { FRAC_CONST(-0.949528217315674), FRAC_CONST(0.313681602478027) }, { FRAC_CONST(-0.953306078910828), FRAC_CONST(0.302005797624588) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.960430502891541), FRAC_CONST(0.278519690036774) }, { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, { FRAC_CONST(-0.966976463794708), FRAC_CONST(0.254865586757660) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.972939968109131), FRAC_CONST(0.231057971715927) }, { FRAC_CONST(-0.975702166557312), FRAC_CONST(0.219101071357727) }, { FRAC_CONST(-0.978317379951477), FRAC_CONST(0.207111403346062) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.983105480670929), FRAC_CONST(0.183039844036102) }, { FRAC_CONST(-0.985277652740479), FRAC_CONST(0.170961812138557) }, { FRAC_CONST(-0.987301409244537), FRAC_CONST(0.158858031034470) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.990902662277222), FRAC_CONST(0.134580522775650) }, { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, { FRAC_CONST(-0.993906974792480), FRAC_CONST(0.110222198069096) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.996312618255615), FRAC_CONST(0.085797227919102) }, { FRAC_CONST(-0.997290492057800), FRAC_CONST(0.073564447462559) }, { FRAC_CONST(-0.998118102550507), FRAC_CONST(0.061320584267378) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(-0.999322354793549), FRAC_CONST(0.036807239055634) }, { FRAC_CONST(-0.999698817729950), FRAC_CONST(0.024541210383177) }, { FRAC_CONST(-0.999924719333649), FRAC_CONST(0.012271485291421) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const complex_t cfft_tab_480[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999914348125458), FRAC_CONST(0.013089596293867) }, { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, { FRAC_CONST(0.999229013919830), FRAC_CONST(0.039259817451239) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.997858941555023), FRAC_CONST(0.065403133630753) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.995804905891418), FRAC_CONST(0.091501623392105) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.993068456649780), FRAC_CONST(0.117537401616573) }, { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, { FRAC_CONST(0.989651381969452), FRAC_CONST(0.143492624163628) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.985556066036224), FRAC_CONST(0.169349506497383) }, { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.975342333316803), FRAC_CONST(0.220697447657585) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.969230890274048), FRAC_CONST(0.246153295040131) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.962455213069916), FRAC_CONST(0.271440446376801) }, { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, { FRAC_CONST(0.955019950866699), FRAC_CONST(0.296541601419449) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.946930110454559), FRAC_CONST(0.321439445018768) }, { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, { FRAC_CONST(0.938191354274750), FRAC_CONST(0.346117079257965) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.928809583187103), FRAC_CONST(0.370557427406311) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.918791174888611), FRAC_CONST(0.394743889570236) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.908143162727356), FRAC_CONST(0.418659746646881) }, { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(0.896872758865356), FRAC_CONST(0.442288726568222) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.884987652301788), FRAC_CONST(0.465614527463913) }, { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, { FRAC_CONST(0.872496008872986), FRAC_CONST(0.488621264696121) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.859406411647797), FRAC_CONST(0.511293113231659) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.845727801322937), FRAC_CONST(0.533614516258240) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, { FRAC_CONST(0.816641509532928), FRAC_CONST(0.577145218849182) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.801253795623779), FRAC_CONST(0.598324596881866) }, { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(0.785316884517670), FRAC_CONST(0.619093954563141) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.768841803073883), FRAC_CONST(0.639438986778259) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.751839756965637), FRAC_CONST(0.659345865249634) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.734322488307953), FRAC_CONST(0.678800761699677) }, { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, { FRAC_CONST(0.716301918029785), FRAC_CONST(0.697790503501892) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.697790443897247), FRAC_CONST(0.716301977634430) }, { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, { FRAC_CONST(0.678800702095032), FRAC_CONST(0.734322547912598) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.659345805644989), FRAC_CONST(0.751839816570282) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.639438986778259), FRAC_CONST(0.768841862678528) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.619093954563141), FRAC_CONST(0.785316944122314) }, { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, { FRAC_CONST(0.598324596881866), FRAC_CONST(0.801253855228424) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.577145159244537), FRAC_CONST(0.816641569137573) }, { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.533614516258240), FRAC_CONST(0.845727801322937) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.511293113231659), FRAC_CONST(0.859406411647797) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.488621175289154), FRAC_CONST(0.872496068477631) }, { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(0.465614467859268), FRAC_CONST(0.884987652301788) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.442288666963577), FRAC_CONST(0.896872758865356) }, { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, { FRAC_CONST(0.418659746646881), FRAC_CONST(0.908143162727356) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.394743800163269), FRAC_CONST(0.918791234493256) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.370557397603989), FRAC_CONST(0.928809583187103) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.346117049455643), FRAC_CONST(0.938191354274750) }, { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(0.321439474821091), FRAC_CONST(0.946930110454559) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.296541512012482), FRAC_CONST(0.955019950866699) }, { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, { FRAC_CONST(0.271440386772156), FRAC_CONST(0.962455272674561) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.246153265237808), FRAC_CONST(0.969230890274048) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.220697447657585), FRAC_CONST(0.975342333316803) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(0.169349446892738), FRAC_CONST(0.985556066036224) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.143492594361305), FRAC_CONST(0.989651381969452) }, { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(0.117537401616573), FRAC_CONST(0.993068456649780) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.091501533985138), FRAC_CONST(0.995804905891418) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(0.065403074026108), FRAC_CONST(0.997858941555023) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(0.039259787648916), FRAC_CONST(0.999229013919830) }, { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(0.013089597225189), FRAC_CONST(0.999914348125458) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.013089684769511), FRAC_CONST(0.999914348125458) }, { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.039259877055883), FRAC_CONST(0.999229013919830) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.065403163433075), FRAC_CONST(0.997858941555023) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.091501623392105), FRAC_CONST(0.995804905891418) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.117537491023541), FRAC_CONST(0.993068456649780) }, { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(-0.143492683768272), FRAC_CONST(0.989651381969452) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.169349536299706), FRAC_CONST(0.985556066036224) }, { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.220697522163391), FRAC_CONST(0.975342273712158) }, { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(-0.246153354644775), FRAC_CONST(0.969230890274048) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.271440476179123), FRAC_CONST(0.962455213069916) }, { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, { FRAC_CONST(-0.296541571617126), FRAC_CONST(0.955019950866699) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.321439564228058), FRAC_CONST(0.946930110454559) }, { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(-0.346117109060287), FRAC_CONST(0.938191294670105) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.370557487010956), FRAC_CONST(0.928809523582459) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.394743859767914), FRAC_CONST(0.918791234493256) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.418659836053848), FRAC_CONST(0.908143103122711) }, { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, { FRAC_CONST(-0.442288637161255), FRAC_CONST(0.896872758865356) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.465614557266235), FRAC_CONST(0.884987592697144) }, { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(-0.488621354103088), FRAC_CONST(0.872495949268341) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.511293053627014), FRAC_CONST(0.859406411647797) }, { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, { FRAC_CONST(-0.533614575862885), FRAC_CONST(0.845727801322937) }, { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.566406309604645), FRAC_CONST(0.824126124382019) }, { FRAC_CONST(-0.577145218849182), FRAC_CONST(0.816641569137573) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.598324656486511), FRAC_CONST(0.801253736019135) }, { FRAC_CONST(-0.608761429786682), FRAC_CONST(0.793353319168091) }, { FRAC_CONST(-0.619093894958496), FRAC_CONST(0.785316944122314) }, { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, { FRAC_CONST(-0.639439046382904), FRAC_CONST(0.768841803073883) }, { FRAC_CONST(-0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(-0.659345924854279), FRAC_CONST(0.751839697360992) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.678800761699677), FRAC_CONST(0.734322488307953) }, { FRAC_CONST(-0.688354671001434), FRAC_CONST(0.725374281406403) }, { FRAC_CONST(-0.697790503501892), FRAC_CONST(0.716301858425140) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.716302037239075), FRAC_CONST(0.697790324687958) }, { FRAC_CONST(-0.725374460220337), FRAC_CONST(0.688354492187500) }, { FRAC_CONST(-0.734322547912598), FRAC_CONST(0.678800702095032) }, { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, { FRAC_CONST(-0.751839876174927), FRAC_CONST(0.659345746040344) }, { FRAC_CONST(-0.760406017303467), FRAC_CONST(0.649448037147522) }, { FRAC_CONST(-0.768841803073883), FRAC_CONST(0.639439046382904) }, { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, { FRAC_CONST(-0.785316944122314), FRAC_CONST(0.619093894958496) }, { FRAC_CONST(-0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(-0.801253914833069), FRAC_CONST(0.598324477672577) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.816641569137573), FRAC_CONST(0.577145218849182) }, { FRAC_CONST(-0.824126303195953), FRAC_CONST(0.566406130790710) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(-0.845727920532227), FRAC_CONST(0.533614337444305) }, { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, { FRAC_CONST(-0.859406411647797), FRAC_CONST(0.511293053627014) }, { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, { FRAC_CONST(-0.872496068477631), FRAC_CONST(0.488621145486832) }, { FRAC_CONST(-0.878817141056061), FRAC_CONST(0.477158725261688) }, { FRAC_CONST(-0.884987652301788), FRAC_CONST(0.465614557266235) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.896872758865356), FRAC_CONST(0.442288637161255) }, { FRAC_CONST(-0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(-0.908143222332001), FRAC_CONST(0.418659597635269) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.918791234493256), FRAC_CONST(0.394743859767914) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.928809583187103), FRAC_CONST(0.370557337999344) }, { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, { FRAC_CONST(-0.938191413879395), FRAC_CONST(0.346116900444031) }, { FRAC_CONST(-0.942641556262970), FRAC_CONST(0.333806753158569) }, { FRAC_CONST(-0.946930170059204), FRAC_CONST(0.321439445018768) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.955020010471344), FRAC_CONST(0.296541452407837) }, { FRAC_CONST(-0.958819746971130), FRAC_CONST(0.284015297889709) }, { FRAC_CONST(-0.962455213069916), FRAC_CONST(0.271440476179123) }, { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, { FRAC_CONST(-0.969230949878693), FRAC_CONST(0.246153235435486) }, { FRAC_CONST(-0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(-0.975342333316803), FRAC_CONST(0.220697283744812) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.983254909515381), FRAC_CONST(0.182235360145569) }, { FRAC_CONST(-0.985556066036224), FRAC_CONST(0.169349402189255) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(-0.989651441574097), FRAC_CONST(0.143492430448532) }, { FRAC_CONST(-0.991444885730743), FRAC_CONST(0.130526080727577) }, { FRAC_CONST(-0.993068456649780), FRAC_CONST(0.117537356913090) }, { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, { FRAC_CONST(-0.995804965496063), FRAC_CONST(0.091501489281654) }, { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, { FRAC_CONST(-0.997858941555023), FRAC_CONST(0.065403148531914) }, { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, { FRAC_CONST(-0.999229013919830), FRAC_CONST(0.039259742945433) }, { FRAC_CONST(-0.999657332897186), FRAC_CONST(0.026176951825619) }, { FRAC_CONST(-0.999914348125458), FRAC_CONST(0.013089434243739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } }; #endif ALIGN static const complex_t cfft_tab_64[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const complex_t cfft_tab_60[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } }; #endif #ifdef LD_DEC ALIGN static const complex_t cfft_tab_256[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const complex_t cfft_tab_240[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } }; #endif #endif ALIGN static const complex_t cfft_tab_128[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/codebook/000077500000000000000000000000001374350120500160605ustar00rootroot00000000000000faad2-2_10_0/libfaad/codebook/hcb.h000066400000000000000000000072051374350120500167710ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb.h,v 1.8 2007/11/01 12:34:10 menno Exp $ **/ #ifndef __HCB_H__ #define __HCB_H__ #ifdef __cplusplus extern "C" { #endif /* * Optimal huffman decoding for AAC taken from: * "SELECTING AN OPTIMAL HUFFMAN DECODER FOR AAC" by * VLADIMIR Z. MESAROVIC , RAGHUNATH RAO, MIROSLAV V. DOKIC, and SACHIN DEO * AES paper 5436 * * 2 methods are used for huffman decoding: * - binary search * - 2-step table lookup * * The choice of the "optimal" method is based on the fact that if the * memory size for the Two-step is exorbitantly high then the decision * is Binary search for that codebook. However, for marginally more memory * size, if Twostep outperforms even the best case of Binary then the * decision is Two-step for that codebook. * * The following methods are used for the different tables. * codebook "optimal" method * HCB_1 2-Step * HCB_2 2-Step * HCB_3 Binary * HCB_4 2-Step * HCB_5 Binary * HCB_6 2-Step * HCB_7 Binary * HCB_8 2-Step * HCB_9 Binary * HCB_10 2-Step * HCB_11 2-Step * HCB_SF Binary * */ #define ZERO_HCB 0 #define FIRST_PAIR_HCB 5 #define ESC_HCB 11 #define QUAD_LEN 4 #define PAIR_LEN 2 #define NOISE_HCB 13 #define INTENSITY_HCB2 14 #define INTENSITY_HCB 15 /* 1st step table */ typedef struct { uint8_t offset; uint8_t extra_bits; } hcb; /* 2nd step table with quadruple data */ typedef struct { uint8_t bits; int8_t x; int8_t y; } hcb_2_pair; typedef struct { uint8_t bits; int8_t x; int8_t y; int8_t v; int8_t w; } hcb_2_quad; /* binary search table */ typedef struct { uint8_t is_leaf; int8_t data[4]; } hcb_bin_quad; typedef struct { uint8_t is_leaf; int8_t data[2]; } hcb_bin_pair; hcb *hcb_table[]; hcb_2_quad *hcb_2_quad_table[]; hcb_2_pair *hcb_2_pair_table[]; hcb_bin_pair *hcb_bin_table[]; uint8_t hcbN[]; uint8_t unsigned_cb[]; int hcb_2_quad_table_size[]; int hcb_2_pair_table_size[]; int hcb_bin_table_size[]; #include "codebook/hcb_1.h" #include "codebook/hcb_2.h" #include "codebook/hcb_3.h" #include "codebook/hcb_4.h" #include "codebook/hcb_5.h" #include "codebook/hcb_6.h" #include "codebook/hcb_7.h" #include "codebook/hcb_8.h" #include "codebook/hcb_9.h" #include "codebook/hcb_10.h" #include "codebook/hcb_11.h" #include "codebook/hcb_sf.h" #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/codebook/hcb_1.h000066400000000000000000000136221374350120500172110ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_1.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_1 */ /* 1st step: 5 bits * 2^5 = 32 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb1_1[] = { { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* 10000 */ 1, 0 }, { /* 10001 */ 2, 0 }, { /* 10010 */ 3, 0 }, { /* 10011 */ 4, 0 }, { /* 10100 */ 5, 0 }, { /* 10101 */ 6, 0 }, { /* 10110 */ 7, 0 }, { /* 10111 */ 8, 0 }, /* 7 bit codewords */ { /* 11000 */ 9, 2 }, { /* 11001 */ 13, 2 }, { /* 11010 */ 17, 2 }, { /* 11011 */ 21, 2 }, { /* 11100 */ 25, 2 }, { /* 11101 */ 29, 2 }, /* 9 bit codewords */ { /* 11110 */ 33, 4 }, /* 9/10/11 bit codewords */ { /* 11111 */ 49, 6 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_quad hcb1_2[] = { /* 1 bit codeword */ { 1, 0, 0, 0, 0 }, /* 5 bit codewords */ { 5, 1, 0, 0, 0 }, { 5, -1, 0, 0, 0 }, { 5, 0, 0, 0, -1 }, { 5, 0, 1, 0, 0 }, { 5, 0, 0, 0, 1 }, { 5, 0, 0, -1, 0 }, { 5, 0, 0, 1, 0 }, { 5, 0, -1, 0, 0 }, /* 7 bit codewords */ /* first 5 bits: 11000 */ { 7, 1, -1, 0, 0 }, { 7, -1, 1, 0, 0 }, { 7, 0, 0, -1, 1 }, { 7, 0, 1, -1, 0 }, /* first 5 bits: 11001 */ { 7, 0, -1, 1, 0 }, { 7, 0, 0, 1, -1 }, { 7, 1, 1, 0, 0 }, { 7, 0, 0, -1, -1 }, /* first 5 bits: 11010 */ { 7, -1, -1, 0, 0 }, { 7, 0, -1, -1, 0 }, { 7, 1, 0, -1, 0 }, { 7, 0, 1, 0, -1 }, /* first 5 bits: 11011 */ { 7, -1, 0, 1, 0 }, { 7, 0, 0, 1, 1 }, { 7, 1, 0, 1, 0 }, { 7, 0, -1, 0, 1 }, /* first 5 bits: 11100 */ { 7, 0, 1, 1, 0 }, { 7, 0, 1, 0, 1 }, { 7, -1, 0, -1, 0 }, { 7, 1, 0, 0, 1 }, /* first 5 bits: 11101 */ { 7, -1, 0, 0, -1 }, { 7, 1, 0, 0, -1 }, { 7, -1, 0, 0, 1 }, { 7, 0, -1, 0, -1 }, /* 9 bit codeword */ /* first 5 bits: 11110 */ { 9, 1, 1, -1, 0 }, { 9, -1, 1, -1, 0 }, { 9, 1, -1, 1, 0 }, { 9, 0, 1, 1, -1 }, { 9, 0, 1, -1, 1 }, { 9, 0, -1, 1, 1 }, { 9, 0, -1, 1, -1 }, { 9, 1, -1, -1, 0 }, { 9, 1, 0, -1, 1 }, { 9, 0, 1, -1, -1 }, { 9, -1, 1, 1, 0 }, { 9, -1, 0, 1, -1 }, { 9, -1, -1, 1, 0 }, { 9, 0, -1, -1, 1 }, { 9, 1, -1, 0, 1 }, { 9, 1, -1, 0, -1 }, /* 9/10/11 bit codewords */ /* first 5 bits: 11111 */ /* 9 bit: reading 11 bits -> 2 too much so 4 entries for each codeword */ { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, /* 10 bit: reading 11 bits -> 1 too much so 2 entries for each codeword */ { 10, -1, -1, 0, 1 }, { 10, -1, -1, 0, 1 }, { 10, -1, 0, -1, -1 }, { 10, -1, 0, -1, -1 }, { 10, 1, 1, 0, -1 }, { 10, 1, 1, 0, -1 }, { 10, 1, 0, -1, -1 }, { 10, 1, 0, -1, -1 }, { 10, -1, 0, -1, 1 }, { 10, -1, 0, -1, 1 }, { 10, -1, -1, 0, -1 }, { 10, -1, -1, 0, -1 }, { 10, -1, 0, 1, 1 }, { 10, -1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, /* 11 bit */ { 11, 1, -1, 1, -1 }, { 11, -1, 1, -1, 1 }, { 11, -1, 1, 1, -1 }, { 11, 1, -1, -1, 1 }, { 11, 1, 1, 1, 1 }, { 11, -1, -1, 1, 1 }, { 11, 1, 1, -1, -1 }, { 11, -1, -1, 1, -1 }, { 11, -1, -1, -1, -1 }, { 11, 1, 1, -1, 1 }, { 11, 1, -1, 1, 1 }, { 11, -1, 1, 1, 1 }, { 11, -1, 1, -1, -1 }, { 11, -1, -1, -1, 1 }, { 11, 1, -1, -1, -1 }, { 11, 1, 1, 1, -1 } }; faad2-2_10_0/libfaad/codebook/hcb_10.h000066400000000000000000000173321374350120500172730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_10.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_10 */ /* 1st step: 6 bits * 2^6 = 64 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb10_1[] = { /* 4 bit codewords */ { /* 000000 */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* 000100 */ 1, 0 }, { /* */ 1, 0 }, { /* */ 1, 0 }, { /* */ 1, 0 }, { /* 001000 */ 2, 0 }, { /* */ 2, 0 }, { /* */ 2, 0 }, { /* */ 2, 0 }, /* 5 bit codewords */ { /* 001100 */ 3, 0 }, { /* */ 3, 0 }, { /* 001110 */ 4, 0 }, { /* */ 4, 0 }, { /* 010000 */ 5, 0 }, { /* */ 5, 0 }, { /* 010010 */ 6, 0 }, { /* */ 6, 0 }, { /* 010100 */ 7, 0 }, { /* */ 7, 0 }, { /* 010110 */ 8, 0 }, { /* */ 8, 0 }, { /* 011000 */ 9, 0 }, { /* */ 9, 0 }, { /* 011010 */ 10, 0 }, { /* */ 10, 0 }, /* 6 bit codewords */ { /* 011100 */ 11, 0 }, { /* 011101 */ 12, 0 }, { /* 011110 */ 13, 0 }, { /* 011111 */ 14, 0 }, { /* 100000 */ 15, 0 }, { /* 100001 */ 16, 0 }, { /* 100010 */ 17, 0 }, { /* 100011 */ 18, 0 }, { /* 100100 */ 19, 0 }, { /* 100101 */ 20, 0 }, { /* 100110 */ 21, 0 }, { /* 100111 */ 22, 0 }, { /* 101000 */ 23, 0 }, { /* 101001 */ 24, 0 }, /* 7 bit codewords */ { /* 101010 */ 25, 1 }, { /* 101011 */ 27, 1 }, { /* 101100 */ 29, 1 }, { /* 101101 */ 31, 1 }, { /* 101110 */ 33, 1 }, { /* 101111 */ 35, 1 }, { /* 110000 */ 37, 1 }, { /* 110001 */ 39, 1 }, /* 7/8 bit codewords */ { /* 110010 */ 41, 2 }, /* 8 bit codewords */ { /* 110011 */ 45, 2 }, { /* 110100 */ 49, 2 }, { /* 110101 */ 53, 2 }, { /* 110110 */ 57, 2 }, { /* 110111 */ 61, 2 }, /* 8/9 bit codewords */ { /* 111000 */ 65, 3 }, /* 9 bit codewords */ { /* 111001 */ 73, 3 }, { /* 111010 */ 81, 3 }, { /* 111011 */ 89, 3 }, /* 9/10 bit codewords */ { /* 111100 */ 97, 4 }, /* 10 bit codewords */ { /* 111101 */ 113, 4 }, { /* 111110 */ 129, 4 }, /* 10/11/12 bit codewords */ { /* 111111 */ 145, 6 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_pair hcb10_2[] = { /* 4 bit codewords */ { 4, 1, 1 }, { 4, 1, 2 }, { 4, 2, 1 }, /* 5 bit codewords */ { 5, 2, 2 }, { 5, 1, 0 }, { 5, 0, 1 }, { 5, 1, 3 }, { 5, 3, 2 }, { 5, 3, 1 }, { 5, 2, 3 }, { 5, 3, 3 }, /* 6 bit codewords */ { 6, 2, 0 }, { 6, 0, 2 }, { 6, 2, 4 }, { 6, 4, 2 }, { 6, 1, 4 }, { 6, 4, 1 }, { 6, 0, 0 }, { 6, 4, 3 }, { 6, 3, 4 }, { 6, 3, 0 }, { 6, 0, 3 }, { 6, 4, 4 }, { 6, 2, 5 }, { 6, 5, 2 }, /* 7 bit codewords */ { 7, 1, 5 }, { 7, 5, 1 }, { 7, 5, 3 }, { 7, 3, 5 }, { 7, 5, 4 }, { 7, 4, 5 }, { 7, 6, 2 }, { 7, 2, 6 }, { 7, 6, 3 }, { 7, 4, 0 }, { 7, 6, 1 }, { 7, 0, 4 }, { 7, 1, 6 }, { 7, 3, 6 }, { 7, 5, 5 }, { 7, 6, 4 }, /* 7/8 bit codewords */ { 7, 4, 6 }, { 7, 4, 6 }, { 8, 6, 5 }, { 8, 7, 2 }, /* 8 bit codewords */ { 8, 3, 7 }, { 8, 2, 7 }, { 8, 5, 6 }, { 8, 8, 2 }, { 8, 7, 3 }, { 8, 5, 0 }, { 8, 7, 1 }, { 8, 0, 5 }, { 8, 8, 1 }, { 8, 1, 7 }, { 8, 8, 3 }, { 8, 7, 4 }, { 8, 4, 7 }, { 8, 2, 8 }, { 8, 6, 6 }, { 8, 7, 5 }, { 8, 1, 8 }, { 8, 3, 8 }, { 8, 8, 4 }, { 8, 4, 8 }, /* 8/9 bit codewords */ { 8, 5, 7 }, { 8, 5, 7 }, { 8, 8, 5 }, { 8, 8, 5 }, { 8, 5, 8 }, { 8, 5, 8 }, { 9, 7, 6 }, { 9, 6, 7 }, /* 9 bit codewords */ { 9, 9, 2 }, { 9, 6, 0 }, { 9, 6, 8 }, { 9, 9, 3 }, { 9, 3, 9 }, { 9, 9, 1 }, { 9, 2, 9 }, { 9, 0, 6 }, { 9, 8, 6 }, { 9, 9, 4 }, { 9, 4, 9 }, { 9, 10, 2 }, { 9, 1, 9 }, { 9, 7, 7 }, { 9, 8, 7 }, { 9, 9, 5 }, { 9, 7, 8 }, { 9, 10, 3 }, { 9, 5, 9 }, { 9, 10, 4 }, { 9, 2, 10 }, { 9, 10, 1 }, { 9, 3, 10 }, { 9, 9, 6 }, /* 9/10 bit codewords */ { 9, 6, 9 }, { 9, 6, 9 }, { 9, 8, 0 }, { 9, 8, 0 }, { 9, 4, 10 }, { 9, 4, 10 }, { 9, 7, 0 }, { 9, 7, 0 }, { 9, 11, 2 }, { 9, 11, 2 }, { 10, 7, 9 }, { 10, 11, 3 }, { 10, 10, 6 }, { 10, 1, 10 }, { 10, 11, 1 }, { 10, 9, 7 }, /* 10 bit codewords */ { 10, 0, 7 }, { 10, 8, 8 }, { 10, 10, 5 }, { 10, 3, 11 }, { 10, 5, 10 }, { 10, 8, 9 }, { 10, 11, 5 }, { 10, 0, 8 }, { 10, 11, 4 }, { 10, 2, 11 }, { 10, 7, 10 }, { 10, 6, 10 }, { 10, 10, 7 }, { 10, 4, 11 }, { 10, 1, 11 }, { 10, 12, 2 }, { 10, 9, 8 }, { 10, 12, 3 }, { 10, 11, 6 }, { 10, 5, 11 }, { 10, 12, 4 }, { 10, 11, 7 }, { 10, 12, 5 }, { 10, 3, 12 }, { 10, 6, 11 }, { 10, 9, 0 }, { 10, 10, 8 }, { 10, 10, 0 }, { 10, 12, 1 }, { 10, 0, 9 }, { 10, 4, 12 }, { 10, 9, 9 }, /* 10/11/12 bit codewords */ { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 11, 9, 10 }, { 11, 9, 10 }, { 11, 1, 12 }, { 11, 1, 12 }, { 11, 11, 8 }, { 11, 11, 8 }, { 11, 12, 7 }, { 11, 12, 7 }, { 11, 7, 11 }, { 11, 7, 11 }, { 11, 5, 12 }, { 11, 5, 12 }, { 11, 6, 12 }, { 11, 6, 12 }, { 11, 10, 9 }, { 11, 10, 9 }, { 11, 8, 11 }, { 11, 8, 11 }, { 11, 12, 8 }, { 11, 12, 8 }, { 11, 0, 10 }, { 11, 0, 10 }, { 11, 7, 12 }, { 11, 7, 12 }, { 11, 11, 0 }, { 11, 11, 0 }, { 11, 10, 10 }, { 11, 10, 10 }, { 11, 11, 9 }, { 11, 11, 9 }, { 11, 11, 10 }, { 11, 11, 10 }, { 11, 0, 11 }, { 11, 0, 11 }, { 11, 11, 11 }, { 11, 11, 11 }, { 11, 9, 11 }, { 11, 9, 11 }, { 11, 10, 11 }, { 11, 10, 11 }, { 11, 12, 0 }, { 11, 12, 0 }, { 11, 8, 12 }, { 11, 8, 12 }, { 12, 12, 9 }, { 12, 10, 12 }, { 12, 9, 12 }, { 12, 11, 12 }, { 12, 12, 11 }, { 12, 0, 12 }, { 12, 12, 10 }, { 12, 12, 12 } }; faad2-2_10_0/libfaad/codebook/hcb_11.h000066400000000000000000000231721374350120500172730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_11.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_11 */ /* 1st step: 5 bits * 2^5 = 32 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb11_1[] = { /* 4 bits */ { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* 00010 */ 1, 0 }, { /* */ 1, 0 }, /* 5 bits */ { /* 00100 */ 2, 0 }, { /* 00101 */ 3, 0 }, { /* 00110 */ 4, 0 }, { /* 00111 */ 5, 0 }, { /* 01000 */ 6, 0 }, { /* 01001 */ 7, 0 }, /* 6 bits */ { /* 01010 */ 8, 1 }, { /* 01011 */ 10, 1 }, { /* 01100 */ 12, 1 }, /* 6/7 bits */ { /* 01101 */ 14, 2 }, /* 7 bits */ { /* 01110 */ 18, 2 }, { /* 01111 */ 22, 2 }, { /* 10000 */ 26, 2 }, /* 7/8 bits */ { /* 10001 */ 30, 3 }, /* 8 bits */ { /* 10010 */ 38, 3 }, { /* 10011 */ 46, 3 }, { /* 10100 */ 54, 3 }, { /* 10101 */ 62, 3 }, { /* 10110 */ 70, 3 }, { /* 10111 */ 78, 3 }, /* 8/9 bits */ { /* 11000 */ 86, 4 }, /* 9 bits */ { /* 11001 */ 102, 4 }, { /* 11010 */ 118, 4 }, { /* 11011 */ 134, 4 }, /* 9/10 bits */ { /* 11100 */ 150, 5 }, /* 10 bits */ { /* 11101 */ 182, 5 }, { /* 11110 */ 214, 5 }, /* 10/11/12 bits */ { /* 11111 */ 246, 7 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_pair hcb11_2[] = { /* 4 */ { 4, 0, 0 }, { 4, 1, 1 }, /* 5 */ { 5, 16, 16 }, { 5, 1, 0 }, { 5, 0, 1 }, { 5, 2, 1 }, { 5, 1, 2 }, { 5, 2, 2 }, /* 6 */ { 6, 1, 3 }, { 6, 3, 1 }, { 6, 3, 2 }, { 6, 2, 0 }, { 6, 2, 3 }, { 6, 0, 2 }, /* 6/7 */ { 6, 3, 3 }, { 6, 3, 3 }, { 7, 4, 1 }, { 7, 1, 4 }, /* 7 */ { 7, 4, 2 }, { 7, 2, 4 }, { 7, 4, 3 }, { 7, 3, 4 }, { 7, 3, 0 }, { 7, 0, 3 }, { 7, 5, 1 }, { 7, 5, 2 }, { 7, 2, 5 }, { 7, 4, 4 }, { 7, 1, 5 }, { 7, 5, 3 }, /* 7/8 */ { 7, 3, 5 }, { 7, 3, 5 }, { 7, 5, 4 }, { 7, 5, 4 }, { 8, 4, 5 }, { 8, 6, 2 }, { 8, 2, 6 }, { 8, 6, 1 }, /* 8 */ { 8, 6, 3 }, { 8, 3, 6 }, { 8, 1, 6 }, { 8, 4, 16 }, { 8, 3, 16 }, { 8, 16, 5 }, { 8, 16, 3 }, { 8, 16, 4 }, { 8, 6, 4 }, { 8, 16, 6 }, { 8, 4, 0 }, { 8, 4, 6 }, { 8, 0, 4 }, { 8, 2, 16 }, { 8, 5, 5 }, { 8, 5, 16 }, { 8, 16, 7 }, { 8, 16, 2 }, { 8, 16, 8 }, { 8, 2, 7 }, { 8, 7, 2 }, { 8, 3, 7 }, { 8, 6, 5 }, { 8, 5, 6 }, { 8, 6, 16 }, { 8, 16, 10 }, { 8, 7, 3 }, { 8, 7, 1 }, { 8, 16, 9 }, { 8, 7, 16 }, { 8, 1, 16 }, { 8, 1, 7 }, { 8, 4, 7 }, { 8, 16, 11 }, { 8, 7, 4 }, { 8, 16, 12 }, { 8, 8, 16 }, { 8, 16, 1 }, { 8, 6, 6 }, { 8, 9, 16 }, { 8, 2, 8 }, { 8, 5, 7 }, { 8, 10, 16 }, { 8, 16, 13 }, { 8, 8, 3 }, { 8, 8, 2 }, { 8, 3, 8 }, { 8, 5, 0 }, /* 8/9 */ { 8, 16, 14 }, { 8, 16, 14 }, { 8, 11, 16 }, { 8, 11, 16 }, { 8, 7, 5 }, { 8, 7, 5 }, { 8, 4, 8 }, { 8, 4, 8 }, { 8, 6, 7 }, { 8, 6, 7 }, { 8, 7, 6 }, { 8, 7, 6 }, { 8, 0, 5 }, { 8, 0, 5 }, { 9, 8, 4 }, { 9, 16, 15 }, /* 9 */ { 9, 12, 16 }, { 9, 1, 8 }, { 9, 8, 1 }, { 9, 14, 16 }, { 9, 5, 8 }, { 9, 13, 16 }, { 9, 3, 9 }, { 9, 8, 5 }, { 9, 7, 7 }, { 9, 2, 9 }, { 9, 8, 6 }, { 9, 9, 2 }, { 9, 9, 3 }, { 9, 15, 16 }, { 9, 4, 9 }, { 9, 6, 8 }, { 9, 6, 0 }, { 9, 9, 4 }, { 9, 5, 9 }, { 9, 8, 7 }, { 9, 7, 8 }, { 9, 1, 9 }, { 9, 10, 3 }, { 9, 0, 6 }, { 9, 10, 2 }, { 9, 9, 1 }, { 9, 9, 5 }, { 9, 4, 10 }, { 9, 2, 10 }, { 9, 9, 6 }, { 9, 3, 10 }, { 9, 6, 9 }, { 9, 10, 4 }, { 9, 8, 8 }, { 9, 10, 5 }, { 9, 9, 7 }, { 9, 11, 3 }, { 9, 1, 10 }, { 9, 7, 0 }, { 9, 10, 6 }, { 9, 7, 9 }, { 9, 3, 11 }, { 9, 5, 10 }, { 9, 10, 1 }, { 9, 4, 11 }, { 9, 11, 2 }, { 9, 13, 2 }, { 9, 6, 10 }, /* 9/10 */ { 9, 13, 3 }, { 9, 13, 3 }, { 9, 2, 11 }, { 9, 2, 11 }, { 9, 16, 0 }, { 9, 16, 0 }, { 9, 5, 11 }, { 9, 5, 11 }, { 9, 11, 5 }, { 9, 11, 5 }, { 10, 11, 4 }, { 10, 9, 8 }, { 10, 7, 10 }, { 10, 8, 9 }, { 10, 0, 16 }, { 10, 4, 13 }, { 10, 0, 7 }, { 10, 3, 13 }, { 10, 11, 6 }, { 10, 13, 1 }, { 10, 13, 4 }, { 10, 12, 3 }, { 10, 2, 13 }, { 10, 13, 5 }, { 10, 8, 10 }, { 10, 6, 11 }, { 10, 10, 8 }, { 10, 10, 7 }, { 10, 14, 2 }, { 10, 12, 4 }, { 10, 1, 11 }, { 10, 4, 12 }, /* 10 */ { 10, 11, 1 }, { 10, 3, 12 }, { 10, 1, 13 }, { 10, 12, 2 }, { 10, 7, 11 }, { 10, 3, 14 }, { 10, 5, 12 }, { 10, 5, 13 }, { 10, 14, 4 }, { 10, 4, 14 }, { 10, 11, 7 }, { 10, 14, 3 }, { 10, 12, 5 }, { 10, 13, 6 }, { 10, 12, 6 }, { 10, 8, 0 }, { 10, 11, 8 }, { 10, 2, 12 }, { 10, 9, 9 }, { 10, 14, 5 }, { 10, 6, 13 }, { 10, 10, 10 }, { 10, 15, 2 }, { 10, 8, 11 }, { 10, 9, 10 }, { 10, 14, 6 }, { 10, 10, 9 }, { 10, 5, 14 }, { 10, 11, 9 }, { 10, 14, 1 }, { 10, 2, 14 }, { 10, 6, 12 }, { 10, 1, 12 }, { 10, 13, 8 }, { 10, 0, 8 }, { 10, 13, 7 }, { 10, 7, 12 }, { 10, 12, 7 }, { 10, 7, 13 }, { 10, 15, 3 }, { 10, 12, 1 }, { 10, 6, 14 }, { 10, 2, 15 }, { 10, 15, 5 }, { 10, 15, 4 }, { 10, 1, 14 }, { 10, 9, 11 }, { 10, 4, 15 }, { 10, 14, 7 }, { 10, 8, 13 }, { 10, 13, 9 }, { 10, 8, 12 }, { 10, 5, 15 }, { 10, 3, 15 }, { 10, 10, 11 }, { 10, 11, 10 }, { 10, 12, 8 }, { 10, 15, 6 }, { 10, 15, 7 }, { 10, 8, 14 }, { 10, 15, 1 }, { 10, 7, 14 }, { 10, 9, 0 }, { 10, 0, 9 }, /* 10/11/12 */ { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 11, 9, 14 }, { 11, 9, 14 }, { 11, 15, 8 }, { 11, 15, 8 }, { 11, 11, 11 }, { 11, 11, 11 }, { 11, 11, 14 }, { 11, 11, 14 }, { 11, 1, 15 }, { 11, 1, 15 }, { 11, 10, 12 }, { 11, 10, 12 }, { 11, 10, 14 }, { 11, 10, 14 }, { 11, 13, 11 }, { 11, 13, 11 }, { 11, 13, 10 }, { 11, 13, 10 }, { 11, 11, 13 }, { 11, 11, 13 }, { 11, 11, 12 }, { 11, 11, 12 }, { 11, 8, 15 }, { 11, 8, 15 }, { 11, 14, 11 }, { 11, 14, 11 }, { 11, 13, 12 }, { 11, 13, 12 }, { 11, 12, 13 }, { 11, 12, 13 }, { 11, 15, 9 }, { 11, 15, 9 }, { 11, 14, 10 }, { 11, 14, 10 }, { 11, 10, 0 }, { 11, 10, 0 }, { 11, 12, 11 }, { 11, 12, 11 }, { 11, 9, 15 }, { 11, 9, 15 }, { 11, 0, 10 }, { 11, 0, 10 }, { 11, 12, 12 }, { 11, 12, 12 }, { 11, 11, 0 }, { 11, 11, 0 }, { 11, 12, 14 }, { 11, 12, 14 }, { 11, 10, 15 }, { 11, 10, 15 }, { 11, 13, 13 }, { 11, 13, 13 }, { 11, 0, 13 }, { 11, 0, 13 }, { 11, 14, 12 }, { 11, 14, 12 }, { 11, 15, 10 }, { 11, 15, 10 }, { 11, 15, 11 }, { 11, 15, 11 }, { 11, 11, 15 }, { 11, 11, 15 }, { 11, 14, 13 }, { 11, 14, 13 }, { 11, 13, 0 }, { 11, 13, 0 }, { 11, 0, 11 }, { 11, 0, 11 }, { 11, 13, 14 }, { 11, 13, 14 }, { 11, 15, 12 }, { 11, 15, 12 }, { 11, 15, 13 }, { 11, 15, 13 }, { 11, 12, 15 }, { 11, 12, 15 }, { 11, 14, 0 }, { 11, 14, 0 }, { 11, 14, 14 }, { 11, 14, 14 }, { 11, 13, 15 }, { 11, 13, 15 }, { 11, 12, 0 }, { 11, 12, 0 }, { 11, 14, 15 }, { 11, 14, 15 }, { 12, 0, 14 }, { 12, 0, 12 }, { 12, 15, 14 }, { 12, 15, 0 }, { 12, 0, 15 }, { 12, 15, 15 } }; faad2-2_10_0/libfaad/codebook/hcb_2.h000066400000000000000000000117361374350120500172160ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_2.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_2 */ /* 1st step: 5 bits * 2^5 = 32 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb2_1[] = { { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* 00100 */ 1, 0 }, { /* */ 1, 0 }, { /* 00110 */ 2, 0 }, { /* 00111 */ 3, 0 }, { /* 01000 */ 4, 0 }, { /* 01001 */ 5, 0 }, { /* 01010 */ 6, 0 }, { /* 01011 */ 7, 0 }, { /* 01100 */ 8, 0 }, /* 6 bit codewords */ { /* 01101 */ 9, 1 }, { /* 01110 */ 11, 1 }, { /* 01111 */ 13, 1 }, { /* 10000 */ 15, 1 }, { /* 10001 */ 17, 1 }, { /* 10010 */ 19, 1 }, { /* 10011 */ 21, 1 }, { /* 10100 */ 23, 1 }, { /* 10101 */ 25, 1 }, { /* 10110 */ 27, 1 }, { /* 10111 */ 29, 1 }, { /* 11000 */ 31, 1 }, /* 7 bit codewords */ { /* 11001 */ 33, 2 }, { /* 11010 */ 37, 2 }, { /* 11011 */ 41, 2 }, /* 7/8 bit codewords */ { /* 11100 */ 45, 3 }, /* 8 bit codewords */ { /* 11101 */ 53, 3 }, { /* 11110 */ 61, 3 }, /* 8/9 bit codewords */ { /* 11111 */ 69, 4 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_quad hcb2_2[] = { /* 3 bit codeword */ { 3, 0, 0, 0, 0 }, /* 4 bit codeword */ { 4, 1, 0, 0, 0 }, /* 5 bit codewords */ { 5, -1, 0, 0, 0 }, { 5, 0, 0, 0, 1 }, { 5, 0, 0, -1, 0 }, { 5, 0, 0, 0, -1 }, { 5, 0, -1, 0, 0 }, { 5, 0, 0, 1, 0 }, { 5, 0, 1, 0, 0 }, /* 6 bit codewords */ { 6, 0, -1, 1, 0 }, { 6, -1, 1, 0, 0 }, { 6, 0, 1, -1, 0 }, { 6, 0, 0, 1, -1 }, { 6, 0, 1, 0, -1 }, { 6, 0, 0, -1, 1 }, { 6, -1, 0, 0, -1 }, { 6, 1, -1, 0, 0 }, { 6, 1, 0, -1, 0 }, { 6, -1, -1, 0, 0 }, { 6, 0, 0, -1, -1 }, { 6, 1, 0, 1, 0 }, { 6, 1, 0, 0, 1 }, { 6, 0, -1, 0, 1 }, { 6, -1, 0, 1, 0 }, { 6, 0, 1, 0, 1 }, { 6, 0, -1, -1, 0 }, { 6, -1, 0, 0, 1 }, { 6, 0, -1, 0, -1 }, { 6, -1, 0, -1, 0 }, { 6, 1, 1, 0, 0 }, { 6, 0, 1, 1, 0 }, { 6, 0, 0, 1, 1 }, { 6, 1, 0, 0, -1 }, /* 7 bit codewords */ { 7, 0, 1, -1, 1 }, { 7, 1, 0, -1, 1 }, { 7, -1, 1, -1, 0 }, { 7, 0, -1, 1, -1 }, { 7, 1, -1, 1, 0 }, { 7, 1, 1, 0, -1 }, { 7, 1, 0, 1, 1 }, { 7, -1, 1, 1, 0 }, { 7, 0, -1, -1, 1 }, { 7, 1, 1, 1, 0 }, { 7, -1, 0, 1, -1 }, { 7, -1, -1, -1, 0 }, /* 7/8 bit codewords */ { 7, -1, 0, -1, 1 }, { 7, -1, 0, -1, 1 }, { 7, 1, -1, -1, 0 }, { 7, 1, -1, -1, 0 }, { 7, 1, 1, -1, 0 }, { 7, 1, 1, -1, 0 }, { 8, 1, -1, 0, 1 }, { 8, -1, 1, 0, -1 }, /* 8 bit codewords */ { 8, -1, -1, 1, 0 }, { 8, -1, 0, 1, 1 }, { 8, -1, -1, 0, 1 }, { 8, -1, -1, 0, -1 }, { 8, 0, -1, -1, -1 }, { 8, 1, 0, 1, -1 }, { 8, 1, 0, -1, -1 }, { 8, 0, 1, -1, -1 }, { 8, 0, 1, 1, 1 }, { 8, -1, 1, 0, 1 }, { 8, -1, 0, -1, -1 }, { 8, 0, 1, 1, -1 }, { 8, 1, -1, 0, -1 }, { 8, 0, -1, 1, 1 }, { 8, 1, 1, 0, 1 }, { 8, 1, -1, 1, -1 }, /* 8/9 bit codewords */ { 8, -1, 1, -1, 1 }, { 8, -1, 1, -1, 1 }, { 9, 1, -1, -1, 1 }, { 9, -1, -1, -1, -1 }, { 9, -1, 1, 1, -1 }, { 9, -1, 1, 1, 1 }, { 9, 1, 1, 1, 1 }, { 9, -1, -1, 1, -1 }, { 9, 1, -1, 1, 1 }, { 9, -1, 1, -1, -1 }, { 9, -1, -1, 1, 1 }, { 9, 1, 1, -1, -1 }, { 9, 1, -1, -1, -1 }, { 9, -1, -1, -1, 1 }, { 9, 1, 1, -1, 1 }, { 9, 1, 1, 1, -1 } }; faad2-2_10_0/libfaad/codebook/hcb_3.h000066400000000000000000000207311374350120500172120ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_3.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* Binary search huffman table HCB_3 */ static hcb_bin_quad hcb3[] = { { /* 0 */ 0, { 1, 2, 0, 0 } }, { /* 1 */ 1, { 0, 0, 0, 0 } }, /* 0 */ { /* 2 */ 0, { 1, 2, 0, 0 } }, { /* 3 */ 0, { 2, 3, 0, 0 } }, { /* 4 */ 0, { 3, 4, 0, 0 } }, { /* 5 */ 0, { 4, 5, 0, 0 } }, { /* 6 */ 0, { 5, 6, 0, 0 } }, { /* 7 */ 0, { 6, 7, 0, 0 } }, { /* 8 */ 0, { 7, 8, 0, 0 } }, { /* 9 */ 1, { 1, 0, 0, 0 } }, /* 1000 */ { /* 10 */ 1, { 0, 0, 0, 1 } }, /* 1001 */ { /* 11 */ 1, { 0, 1, 0, 0 } }, /* 1010 */ { /* 12 */ 1, { 0, 0, 1, 0 } }, /* 1011 */ { /* 13 */ 0, { 4, 5, 0, 0 } }, { /* 14 */ 0, { 5, 6, 0, 0 } }, { /* 15 */ 0, { 6, 7, 0, 0 } }, { /* 16 */ 0, { 7, 8, 0, 0 } }, { /* 17 */ 1, { 1, 1, 0, 0 } }, { /* 18 */ 1, { 0, 0, 1, 1 } }, { /* 19 */ 0, { 6, 7, 0, 0 } }, { /* 20 */ 0, { 7, 8, 0, 0 } }, { /* 21 */ 0, { 8, 9, 0, 0 } }, { /* 22 */ 0, { 9, 10, 0, 0 } }, { /* 23 */ 0, { 10, 11, 0, 0 } }, { /* 24 */ 0, { 11, 12, 0, 0 } }, { /* 25 */ 1, { 0, 1, 1, 0 } }, /* 110100 */ { /* 26 */ 1, { 0, 1, 0, 1 } }, /* 110101 */ { /* 27 */ 1, { 1, 0, 1, 0 } }, /* 110110 */ { /* 28 */ 1, { 0, 1, 1, 1 } }, /* 110111 */ { /* 29 */ 1, { 1, 0, 0, 1 } }, /* 111000 */ { /* 30 */ 1, { 1, 1, 1, 0 } }, /* 111001 */ { /* 31 */ 0, { 6, 7, 0, 0 } }, { /* 32 */ 0, { 7, 8, 0, 0 } }, { /* 33 */ 0, { 8, 9, 0, 0 } }, { /* 34 */ 0, { 9, 10, 0, 0 } }, { /* 35 */ 0, { 10, 11, 0, 0 } }, { /* 36 */ 0, { 11, 12, 0, 0 } }, { /* 37 */ 1, { 1, 1, 1, 1 } }, /* 1110100 */ { /* 38 */ 1, { 1, 0, 1, 1 } }, /* 1110101 */ { /* 39 */ 1, { 1, 1, 0, 1 } }, /* 1110110 */ { /* 40 */ 0, { 9, 10, 0, 0 } }, { /* 41 */ 0, { 10, 11, 0, 0 } }, { /* 42 */ 0, { 11, 12, 0, 0 } }, { /* 43 */ 0, { 12, 13, 0, 0 } }, { /* 44 */ 0, { 13, 14, 0, 0 } }, { /* 45 */ 0, { 14, 15, 0, 0 } }, { /* 46 */ 0, { 15, 16, 0, 0 } }, { /* 47 */ 0, { 16, 17, 0, 0 } }, { /* 48 */ 0, { 17, 18, 0, 0 } }, { /* 49 */ 1, { 2, 0, 0, 0 } }, /* 11101110 */ { /* 50 */ 1, { 0, 0, 0, 2 } }, /* 11101111 */ { /* 51 */ 1, { 0, 0, 1, 2 } }, /* 11110000 */ { /* 52 */ 1, { 2, 1, 0, 0 } }, /* 11110001 */ { /* 53 */ 1, { 1, 2, 1, 0 } }, /* 11110010 */ { /* 54 */ 0, { 13, 14, 0, 0 } }, { /* 55 */ 0, { 14, 15, 0, 0 } }, { /* 56 */ 0, { 15, 16, 0, 0 } }, { /* 57 */ 0, { 16, 17, 0, 0 } }, { /* 58 */ 0, { 17, 18, 0, 0 } }, { /* 59 */ 0, { 18, 19, 0, 0 } }, { /* 60 */ 0, { 19, 20, 0, 0 } }, { /* 61 */ 0, { 20, 21, 0, 0 } }, { /* 62 */ 0, { 21, 22, 0, 0 } }, { /* 63 */ 0, { 22, 23, 0, 0 } }, { /* 64 */ 0, { 23, 24, 0, 0 } }, { /* 65 */ 0, { 24, 25, 0, 0 } }, { /* 66 */ 0, { 25, 26, 0, 0 } }, { /* 67 */ 1, { 0, 0, 2, 1 } }, { /* 68 */ 1, { 0, 1, 2, 1 } }, { /* 69 */ 1, { 1, 2, 0, 0 } }, { /* 70 */ 1, { 0, 1, 1, 2 } }, { /* 71 */ 1, { 2, 1, 1, 0 } }, { /* 72 */ 1, { 0, 0, 2, 0 } }, { /* 73 */ 1, { 0, 2, 1, 0 } }, { /* 74 */ 1, { 0, 1, 2, 0 } }, { /* 75 */ 1, { 0, 2, 0, 0 } }, { /* 76 */ 1, { 0, 1, 0, 2 } }, { /* 77 */ 1, { 2, 0, 1, 0 } }, { /* 78 */ 1, { 1, 2, 1, 1 } }, { /* 79 */ 1, { 0, 2, 1, 1 } }, { /* 80 */ 1, { 1, 1, 2, 0 } }, { /* 81 */ 1, { 1, 1, 2, 1 } }, { /* 82 */ 0, { 11, 12, 0, 0 } }, { /* 83 */ 0, { 12, 13, 0, 0 } }, { /* 84 */ 0, { 13, 14, 0, 0 } }, { /* 85 */ 0, { 14, 15, 0, 0 } }, { /* 86 */ 0, { 15, 16, 0, 0 } }, { /* 87 */ 0, { 16, 17, 0, 0 } }, { /* 88 */ 0, { 17, 18, 0, 0 } }, { /* 89 */ 0, { 18, 19, 0, 0 } }, { /* 90 */ 0, { 19, 20, 0, 0 } }, { /* 91 */ 0, { 20, 21, 0, 0 } }, { /* 92 */ 0, { 21, 22, 0, 0 } }, { /* 93 */ 1, { 1, 2, 0, 1 } }, /* 1111101010 */ { /* 94 */ 1, { 1, 0, 2, 0 } }, /* 1111101011 */ { /* 95 */ 1, { 1, 0, 2, 1 } }, /* 1111101100 */ { /* 96 */ 1, { 0, 2, 0, 1 } }, /* 1111101101 */ { /* 97 */ 1, { 2, 1, 1, 1 } }, /* 1111101110 */ { /* 98 */ 1, { 1, 1, 1, 2 } }, /* 1111101111 */ { /* 99 */ 1, { 2, 1, 0, 1 } }, /* 1111110000 */ { /* 00 */ 1, { 1, 0, 1, 2 } }, /* 1111110001 */ { /* 01 */ 1, { 0, 0, 2, 2 } }, /* 1111110010 */ { /* 02 */ 1, { 0, 1, 2, 2 } }, /* 1111110011 */ { /* 03 */ 1, { 2, 2, 1, 0 } }, /* 1111110100 */ { /* 04 */ 1, { 1, 2, 2, 0 } }, /* 1111110101 */ { /* 05 */ 1, { 1, 0, 0, 2 } }, /* 1111110110 */ { /* 06 */ 1, { 2, 0, 0, 1 } }, /* 1111110111 */ { /* 07 */ 1, { 0, 2, 2, 1 } }, /* 1111111000 */ { /* 08 */ 0, { 7, 8, 0, 0 } }, { /* 09 */ 0, { 8, 9, 0, 0 } }, { /* 10 */ 0, { 9, 10, 0, 0 } }, { /* 11 */ 0, { 10, 11, 0, 0 } }, { /* 12 */ 0, { 11, 12, 0, 0 } }, { /* 13 */ 0, { 12, 13, 0, 0 } }, { /* 14 */ 0, { 13, 14, 0, 0 } }, { /* 15 */ 1, { 2, 2, 0, 0 } }, /* 11111110010 */ { /* 16 */ 1, { 1, 2, 2, 1 } }, /* 11111110011 */ { /* 17 */ 1, { 1, 1, 0, 2 } }, /* 11111110100 */ { /* 18 */ 1, { 2, 0, 1, 1 } }, /* 11111110101 */ { /* 19 */ 1, { 1, 1, 2, 2 } }, /* 11111110110 */ { /* 20 */ 1, { 2, 2, 1, 1 } }, /* 11111110111 */ { /* 21 */ 1, { 0, 2, 2, 0 } }, /* 11111111000 */ { /* 22 */ 1, { 0, 2, 1, 2 } }, /* 11111111001 */ { /* 23 */ 0, { 6, 7, 0, 0 } }, { /* 24 */ 0, { 7, 8, 0, 0 } }, { /* 25 */ 0, { 8, 9, 0, 0 } }, { /* 26 */ 0, { 9, 10, 0, 0 } }, { /* 27 */ 0, { 10, 11, 0, 0 } }, { /* 28 */ 0, { 11, 12, 0, 0 } }, { /* 29 */ 1, { 1, 0, 2, 2 } }, /* 111111110100 */ { /* 30 */ 1, { 2, 2, 0, 1 } }, /* 111111110101 */ { /* 31 */ 1, { 2, 1, 2, 0 } }, /* 111111110110 */ { /* 32 */ 1, { 2, 2, 2, 0 } }, /* 111111110111 */ { /* 33 */ 1, { 0, 2, 2, 2 } }, /* 111111111000 */ { /* 34 */ 1, { 2, 2, 2, 1 } }, /* 111111111001 */ { /* 35 */ 1, { 2, 1, 2, 1 } }, /* 111111111010 */ { /* 36 */ 1, { 1, 2, 1, 2 } }, /* 111111111011 */ { /* 37 */ 1, { 1, 2, 2, 2 } }, /* 111111111100 */ { /* 38 */ 0, { 3, 4, 0, 0 } }, { /* 39 */ 0, { 4, 5, 0, 0 } }, { /* 40 */ 0, { 5, 6, 0, 0 } }, { /* 41 */ 1, { 0, 2, 0, 2 } }, /* 1111111111010 */ { /* 42 */ 1, { 2, 0, 2, 0 } }, /* 1111111111011 */ { /* 43 */ 1, { 1, 2, 0, 2 } }, /* 1111111111100 */ { /* 44 */ 0, { 3, 4, 0, 0 } }, { /* 45 */ 0, { 4, 5, 0, 0 } }, { /* 46 */ 0, { 5, 6, 0, 0 } }, { /* 47 */ 1, { 2, 0, 2, 1 } }, /* 11111111111010 */ { /* 48 */ 1, { 2, 1, 1, 2 } }, /* 11111111111011 */ { /* 49 */ 1, { 2, 1, 0, 2 } }, /* 11111111111100 */ { /* 50 */ 0, { 3, 4, 0, 0 } }, { /* 51 */ 0, { 4, 5, 0, 0 } }, { /* 52 */ 0, { 5, 6, 0, 0 } }, { /* 53 */ 1, { 2, 2, 2, 2 } }, /* 111111111111010 */ { /* 54 */ 1, { 2, 2, 1, 2 } }, /* 111111111111011 */ { /* 55 */ 1, { 2, 1, 2, 2 } }, /* 111111111111100 */ { /* 56 */ 1, { 2, 0, 1, 2 } }, /* 111111111111101 */ { /* 57 */ 1, { 2, 0, 0, 2 } }, /* 111111111111110 */ { /* 58 */ 0, { 1, 2, 0, 0 } }, { /* 59 */ 1, { 2, 2, 0, 2 } }, /* 1111111111111110 */ { /* 60 */ 1, { 2, 0, 2, 2 } } /* 1111111111111111 */ }; faad2-2_10_0/libfaad/codebook/hcb_4.h000066400000000000000000000171321374350120500172140ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_4.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_4 */ /* 1st step: 5 bits * 2^5 = 32 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb4_1[] = { /* 4 bit codewords */ { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* 00010 */ 1, 0 }, { /* */ 1, 0 }, { /* 00100 */ 2, 0 }, { /* */ 2, 0 }, { /* 00110 */ 3, 0 }, { /* */ 3, 0 }, { /* 01000 */ 4, 0 }, { /* */ 4, 0 }, { /* 01010 */ 5, 0 }, { /* */ 5, 0 }, { /* 01100 */ 6, 0 }, { /* */ 6, 0 }, { /* 01110 */ 7, 0 }, { /* */ 7, 0 }, { /* 10000 */ 8, 0 }, { /* */ 8, 0 }, { /* 10010 */ 9, 0 }, { /* */ 9, 0 }, /* 5 bit codewords */ { /* 10100 */ 10, 0 }, { /* 10101 */ 11, 0 }, { /* 10110 */ 12, 0 }, { /* 10111 */ 13, 0 }, { /* 11000 */ 14, 0 }, { /* 11001 */ 15, 0 }, /* 7 bit codewords */ { /* 11010 */ 16, 2 }, { /* 11011 */ 20, 2 }, /* 7/8 bit codewords */ { /* 11100 */ 24, 3 }, /* 8 bit codewords */ { /* 11101 */ 32, 3 }, /* 8/9 bit codewords */ { /* 11110 */ 40, 4 }, /* 9/10/11/12 bit codewords */ { /* 11111 */ 56, 7 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_quad hcb4_2[] = { /* 4 bit codewords */ { 4, 1, 1, 1, 1 }, { 4, 0, 1, 1, 1 }, { 4, 1, 1, 0, 1 }, { 4, 1, 1, 1, 0 }, { 4, 1, 0, 1, 1 }, { 4, 1, 0, 0, 0 }, { 4, 1, 1, 0, 0 }, { 4, 0, 0, 0, 0 }, { 4, 0, 0, 1, 1 }, { 4, 1, 0, 1, 0 }, /* 5 bit codewords */ { 5, 1, 0, 0, 1 }, { 5, 0, 1, 1, 0 }, { 5, 0, 0, 0, 1 }, { 5, 0, 1, 0, 1 }, { 5, 0, 0, 1, 0 }, { 5, 0, 1, 0, 0 }, /* 7 bit codewords */ /* first 5 bits: 11010 */ { 7, 2, 1, 1, 1 }, { 7, 1, 1, 2, 1 }, { 7, 1, 2, 1, 1 }, { 7, 1, 1, 1, 2 }, /* first 5 bits: 11011 */ { 7, 2, 1, 1, 0 }, { 7, 2, 1, 0, 1 }, { 7, 1, 2, 1, 0 }, { 7, 2, 0, 1, 1 }, /* 7/8 bit codewords */ /* first 5 bits: 11100 */ { 7, 0, 1, 2, 1 }, { 7, 0, 1, 2, 1 }, { 8, 0, 1, 1, 2 }, { 8, 1, 1, 2, 0 }, { 8, 0, 2, 1, 1 }, { 8, 1, 0, 1, 2 }, { 8, 1, 2, 0, 1 }, { 8, 1, 1, 0, 2 }, /* 8 bit codewords */ { 8, 1, 0, 2, 1 }, { 8, 2, 1, 0, 0 }, { 8, 2, 0, 1, 0 }, { 8, 1, 2, 0, 0 }, { 8, 2, 0, 0, 1 }, { 8, 0, 1, 0, 2 }, { 8, 0, 2, 1, 0 }, { 8, 0, 0, 1, 2 }, /* 8/9 bit codewords */ { 8, 0, 1, 2, 0 }, { 8, 0, 1, 2, 0 }, { 8, 0, 2, 0, 1 }, { 8, 0, 2, 0, 1 }, { 8, 1, 0, 0, 2 }, { 8, 1, 0, 0, 2 }, { 8, 0, 0, 2, 1 }, { 8, 0, 0, 2, 1 }, { 8, 1, 0, 2, 0 }, { 8, 1, 0, 2, 0 }, { 8, 2, 0, 0, 0 }, { 8, 2, 0, 0, 0 }, { 8, 0, 0, 0, 2 }, { 8, 0, 0, 0, 2 }, { 9, 0, 2, 0, 0 }, { 9, 0, 0, 2, 0 }, /* 9/10/11 bit codewords */ /* 9 bit codewords repeated 2^3 = 8 times */ { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, /* 10 bit codewords repeated 2^2 = 4 times */ { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, /* 11 bit codewords repeated 2^1 = 2 times */ { 11, 2, 1, 2, 2 }, { 11, 2, 1, 2, 2 }, { 11, 2, 2, 1, 2 }, { 11, 2, 2, 1, 2 }, { 11, 0, 2, 2, 0 }, { 11, 0, 2, 2, 0 }, { 11, 2, 2, 0, 0 }, { 11, 2, 2, 0, 0 }, { 11, 0, 0, 2, 2 }, { 11, 0, 0, 2, 2 }, { 11, 2, 0, 2, 0 }, { 11, 2, 0, 2, 0 }, { 11, 0, 2, 0, 2 }, { 11, 0, 2, 0, 2 }, { 11, 2, 0, 0, 2 }, { 11, 2, 0, 0, 2 }, { 11, 2, 2, 2, 2 }, { 11, 2, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, { 11, 2, 2, 2, 0 }, { 11, 2, 2, 2, 0 }, /* 12 bit codewords */ { 12, 2, 2, 0, 2 }, { 12, 2, 0, 2, 2 }, }; faad2-2_10_0/libfaad/codebook/hcb_5.h000066400000000000000000000146441374350120500172220ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_5.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* Binary search huffman table HCB_5 */ static hcb_bin_pair hcb5[] = { { /* 0 */ 0, { 1, 2 } }, { /* 1 */ 1, { 0, 0 } }, /* 0 */ { /* 2 */ 0, { 1, 2 } }, { /* 3 */ 0, { 2, 3 } }, { /* 4 */ 0, { 3, 4 } }, { /* 5 */ 0, { 4, 5 } }, { /* 6 */ 0, { 5, 6 } }, { /* 7 */ 0, { 6, 7 } }, { /* 8 */ 0, { 7, 8 } }, { /* 9 */ 1, { -1, 0 } }, /* 1000 */ { /* 10 */ 1, { 1, 0 } }, /* 1001 */ { /* 11 */ 1, { 0, 1 } }, /* 1010 */ { /* 12 */ 1, { 0, -1 } }, /* 1011 */ { /* 13 */ 0, { 4, 5 } }, { /* 14 */ 0, { 5, 6 } }, { /* 15 */ 0, { 6, 7 } }, { /* 16 */ 0, { 7, 8 } }, { /* 17 */ 1, { 1, -1 } }, { /* 18 */ 1, { -1, 1 } }, { /* 19 */ 1, { -1, -1 } }, { /* 20 */ 1, { 1, 1 } }, { /* 21 */ 0, { 4, 5 } }, { /* 22 */ 0, { 5, 6 } }, { /* 23 */ 0, { 6, 7 } }, { /* 24 */ 0, { 7, 8 } }, { /* 25 */ 0, { 8, 9 } }, { /* 26 */ 0, { 9, 10 } }, { /* 27 */ 0, { 10, 11 } }, { /* 28 */ 0, { 11, 12 } }, { /* 29 */ 0, { 12, 13 } }, { /* 30 */ 0, { 13, 14 } }, { /* 31 */ 0, { 14, 15 } }, { /* 32 */ 0, { 15, 16 } }, { /* 33 */ 1, { -2, 0 } }, { /* 34 */ 1, { 0, 2 } }, { /* 35 */ 1, { 2, 0 } }, { /* 36 */ 1, { 0, -2 } }, { /* 37 */ 0, { 12, 13 } }, { /* 38 */ 0, { 13, 14 } }, { /* 39 */ 0, { 14, 15 } }, { /* 40 */ 0, { 15, 16 } }, { /* 41 */ 0, { 16, 17 } }, { /* 42 */ 0, { 17, 18 } }, { /* 43 */ 0, { 18, 19 } }, { /* 44 */ 0, { 19, 20 } }, { /* 45 */ 0, { 20, 21 } }, { /* 46 */ 0, { 21, 22 } }, { /* 47 */ 0, { 22, 23 } }, { /* 48 */ 0, { 23, 24 } }, { /* 49 */ 1, { -2, -1 } }, { /* 50 */ 1, { 2, 1 } }, { /* 51 */ 1, { -1, -2 } }, { /* 52 */ 1, { 1, 2 } }, { /* 53 */ 1, { -2, 1 } }, { /* 54 */ 1, { 2, -1 } }, { /* 55 */ 1, { -1, 2 } }, { /* 56 */ 1, { 1, -2 } }, { /* 57 */ 1, { -3, 0 } }, { /* 58 */ 1, { 3, 0 } }, { /* 59 */ 1, { 0, -3 } }, { /* 60 */ 1, { 0, 3 } }, { /* 61 */ 0, { 12, 13 } }, { /* 62 */ 0, { 13, 14 } }, { /* 63 */ 0, { 14, 15 } }, { /* 64 */ 0, { 15, 16 } }, { /* 65 */ 0, { 16, 17 } }, { /* 66 */ 0, { 17, 18 } }, { /* 67 */ 0, { 18, 19 } }, { /* 68 */ 0, { 19, 20 } }, { /* 69 */ 0, { 20, 21 } }, { /* 70 */ 0, { 21, 22 } }, { /* 71 */ 0, { 22, 23 } }, { /* 72 */ 0, { 23, 24 } }, { /* 73 */ 1, { -3, -1 } }, { /* 74 */ 1, { 1, 3 } }, { /* 75 */ 1, { 3, 1 } }, { /* 76 */ 1, { -1, -3 } }, { /* 77 */ 1, { -3, 1 } }, { /* 78 */ 1, { 3, -1 } }, { /* 79 */ 1, { 1, -3 } }, { /* 80 */ 1, { -1, 3 } }, { /* 81 */ 1, { -2, 2 } }, { /* 82 */ 1, { 2, 2 } }, { /* 83 */ 1, { -2, -2 } }, { /* 84 */ 1, { 2, -2 } }, { /* 85 */ 0, { 12, 13 } }, { /* 86 */ 0, { 13, 14 } }, { /* 87 */ 0, { 14, 15 } }, { /* 88 */ 0, { 15, 16 } }, { /* 89 */ 0, { 16, 17 } }, { /* 90 */ 0, { 17, 18 } }, { /* 91 */ 0, { 18, 19 } }, { /* 92 */ 0, { 19, 20 } }, { /* 93 */ 0, { 20, 21 } }, { /* 94 */ 0, { 21, 22 } }, { /* 95 */ 0, { 22, 23 } }, { /* 96 */ 0, { 23, 24 } }, { /* 97 */ 1, { -3, -2 } }, { /* 98 */ 1, { 3, -2 } }, { /* 99 */ 1, { -2, 3 } }, { /* 00 */ 1, { 2, -3 } }, { /* 01 */ 1, { 3, 2 } }, { /* 02 */ 1, { 2, 3 } }, { /* 03 */ 1, { -3, 2 } }, { /* 04 */ 1, { -2, -3 } }, { /* 05 */ 1, { 0, -4 } }, { /* 06 */ 1, { -4, 0 } }, { /* 07 */ 1, { 4, 1 } }, { /* 08 */ 1, { 4, 0 } }, { /* 09 */ 0, { 12, 13 } }, { /* 10 */ 0, { 13, 14 } }, { /* 11 */ 0, { 14, 15 } }, { /* 12 */ 0, { 15, 16 } }, { /* 13 */ 0, { 16, 17 } }, { /* 14 */ 0, { 17, 18 } }, { /* 15 */ 0, { 18, 19 } }, { /* 16 */ 0, { 19, 20 } }, { /* 17 */ 0, { 20, 21 } }, { /* 18 */ 0, { 21, 22 } }, { /* 19 */ 0, { 22, 23 } }, { /* 20 */ 0, { 23, 24 } }, { /* 21 */ 1, { -4, -1 } }, { /* 22 */ 1, { 0, 4 } }, { /* 23 */ 1, { 4, -1 } }, { /* 24 */ 1, { -1, -4 } }, { /* 25 */ 1, { 1, 4 } }, { /* 26 */ 1, { -1, 4 } }, { /* 27 */ 1, { -4, 1 } }, { /* 28 */ 1, { 1, -4 } }, { /* 29 */ 1, { 3, -3 } }, { /* 30 */ 1, { -3, -3 } }, { /* 31 */ 1, { -3, 3 } }, { /* 32 */ 1, { -2, 4 } }, { /* 33 */ 1, { -4, -2 } }, { /* 34 */ 1, { 4, 2 } }, { /* 35 */ 1, { 2, -4 } }, { /* 36 */ 1, { 2, 4 } }, { /* 37 */ 1, { 3, 3 } }, { /* 38 */ 1, { -4, 2 } }, { /* 39 */ 0, { 6, 7 } }, { /* 40 */ 0, { 7, 8 } }, { /* 41 */ 0, { 8, 9 } }, { /* 42 */ 0, { 9, 10 } }, { /* 43 */ 0, { 10, 11 } }, { /* 44 */ 0, { 11, 12 } }, { /* 45 */ 1, { -2, -4 } }, { /* 46 */ 1, { 4, -2 } }, { /* 47 */ 1, { 3, -4 } }, { /* 48 */ 1, { -4, -3 } }, { /* 49 */ 1, { -4, 3 } }, { /* 50 */ 1, { 3, 4 } }, { /* 51 */ 1, { -3, 4 } }, { /* 52 */ 1, { 4, 3 } }, { /* 53 */ 1, { 4, -3 } }, { /* 54 */ 1, { -3, -4 } }, { /* 55 */ 0, { 2, 3 } }, { /* 56 */ 0, { 3, 4 } }, { /* 57 */ 1, { 4, -4 } }, { /* 58 */ 1, { -4, 4 } }, { /* 59 */ 1, { 4, 4 } }, { /* 60 */ 1, { -4, -4 } } }; faad2-2_10_0/libfaad/codebook/hcb_6.h000066400000000000000000000116141374350120500172150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_6.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_6 */ /* 1st step: 5 bits * 2^5 = 32 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb6_1[] = { /* 4 bit codewords */ { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* 00010 */ 1, 0 }, { /* */ 1, 0 }, { /* 00100 */ 2, 0 }, { /* */ 2, 0 }, { /* 00110 */ 3, 0 }, { /* */ 3, 0 }, { /* 01000 */ 4, 0 }, { /* */ 4, 0 }, { /* 01010 */ 5, 0 }, { /* */ 5, 0 }, { /* 01100 */ 6, 0 }, { /* */ 6, 0 }, { /* 01110 */ 7, 0 }, { /* */ 7, 0 }, { /* 10000 */ 8, 0 }, { /* */ 8, 0 }, /* 6 bit codewords */ { /* 10010 */ 9, 1 }, { /* 10011 */ 11, 1 }, { /* 10100 */ 13, 1 }, { /* 10101 */ 15, 1 }, { /* 10110 */ 17, 1 }, { /* 10111 */ 19, 1 }, { /* 11000 */ 21, 1 }, { /* 11001 */ 23, 1 }, /* 7 bit codewords */ { /* 11010 */ 25, 2 }, { /* 11011 */ 29, 2 }, { /* 11100 */ 33, 2 }, /* 7/8 bit codewords */ { /* 11101 */ 37, 3 }, /* 8/9 bit codewords */ { /* 11110 */ 45, 4 }, /* 9/10/11 bit codewords */ { /* 11111 */ 61, 6 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_pair hcb6_2[] = { /* 4 bit codewords */ { 4, 0, 0 }, { 4, 1, 0 }, { 4, 0, -1 }, { 4, 0, 1 }, { 4, -1, 0 }, { 4, 1, 1 }, { 4, -1, 1 }, { 4, 1, -1 }, { 4, -1, -1 }, /* 6 bit codewords */ { 6, 2, -1 }, { 6, 2, 1 }, { 6, -2, 1 }, { 6, -2, -1 }, { 6, -2, 0 }, { 6, -1, 2 }, { 6, 2, 0 }, { 6, 1, -2 }, { 6, 1, 2 }, { 6, 0, -2 }, { 6, -1, -2 }, { 6, 0, 2 }, { 6, 2, -2 }, { 6, -2, 2 }, { 6, -2, -2 }, { 6, 2, 2 }, /* 7 bit codewords */ { 7, -3, 1 }, { 7, 3, 1 }, { 7, 3, -1 }, { 7, -1, 3 }, { 7, -3, -1 }, { 7, 1, 3 }, { 7, 1, -3 }, { 7, -1, -3 }, { 7, 3, 0 }, { 7, -3, 0 }, { 7, 0, -3 }, { 7, 0, 3 }, /* 7/8 bit codewords */ { 7, 3, 2 }, { 7, 3, 2 }, { 8, -3, -2 }, { 8, -2, 3 }, { 8, 2, 3 }, { 8, 3, -2 }, { 8, 2, -3 }, { 8, -2, -3 }, /* 8 bit codewords */ { 8, -3, 2 }, { 8, -3, 2 }, { 8, 3, 3 }, { 8, 3, 3 }, { 9, 3, -3 }, { 9, -3, -3 }, { 9, -3, 3 }, { 9, 1, -4 }, { 9, -1, -4 }, { 9, 4, 1 }, { 9, -4, 1 }, { 9, -4, -1 }, { 9, 1, 4 }, { 9, 4, -1 }, { 9, -1, 4 }, { 9, 0, -4 }, /* 9/10/11 bit codewords */ { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 10, -3, -4 }, { 10, -3, -4 }, { 10, -3, 4 }, { 10, -3, 4 }, { 10, 3, -4 }, { 10, 3, -4 }, { 10, 4, -3 }, { 10, 4, -3 }, { 10, 3, 4 }, { 10, 3, 4 }, { 10, 4, 3 }, { 10, 4, 3 }, { 10, -4, 3 }, { 10, -4, 3 }, { 10, -4, -3 }, { 10, -4, -3 }, { 11, 4, 4 }, { 11, -4, 4 }, { 11, -4, -4 }, { 11, 4, -4 } }; faad2-2_10_0/libfaad/codebook/hcb_7.h000066400000000000000000000123171374350120500172170ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_7.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* Binary search huffman table HCB_7 */ static hcb_bin_pair hcb7[] = { { /* 0 */ 0, { 1, 2 } }, { /* 1 */ 1, { 0, 0 } }, { /* 2 */ 0, { 1, 2 } }, { /* 3 */ 0, { 2, 3 } }, { /* 4 */ 0, { 3, 4 } }, { /* 5 */ 1, { 1, 0 } }, { /* 6 */ 1, { 0, 1 } }, { /* 7 */ 0, { 2, 3 } }, { /* 8 */ 0, { 3, 4 } }, { /* 9 */ 1, { 1, 1 } }, { /* 10 */ 0, { 3, 4 } }, { /* 11 */ 0, { 4, 5 } }, { /* 12 */ 0, { 5, 6 } }, { /* 13 */ 0, { 6, 7 } }, { /* 14 */ 0, { 7, 8 } }, { /* 15 */ 0, { 8, 9 } }, { /* 16 */ 0, { 9, 10 } }, { /* 17 */ 0, { 10, 11 } }, { /* 18 */ 0, { 11, 12 } }, { /* 19 */ 1, { 2, 1 } }, { /* 20 */ 1, { 1, 2 } }, { /* 21 */ 1, { 2, 0 } }, { /* 22 */ 1, { 0, 2 } }, { /* 23 */ 0, { 8, 9 } }, { /* 24 */ 0, { 9, 10 } }, { /* 25 */ 0, { 10, 11 } }, { /* 26 */ 0, { 11, 12 } }, { /* 27 */ 0, { 12, 13 } }, { /* 28 */ 0, { 13, 14 } }, { /* 29 */ 0, { 14, 15 } }, { /* 30 */ 0, { 15, 16 } }, { /* 31 */ 1, { 3, 1 } }, { /* 32 */ 1, { 1, 3 } }, { /* 33 */ 1, { 2, 2 } }, { /* 34 */ 1, { 3, 0 } }, { /* 35 */ 1, { 0, 3 } }, { /* 36 */ 0, { 11, 12 } }, { /* 37 */ 0, { 12, 13 } }, { /* 38 */ 0, { 13, 14 } }, { /* 39 */ 0, { 14, 15 } }, { /* 40 */ 0, { 15, 16 } }, { /* 41 */ 0, { 16, 17 } }, { /* 42 */ 0, { 17, 18 } }, { /* 43 */ 0, { 18, 19 } }, { /* 44 */ 0, { 19, 20 } }, { /* 45 */ 0, { 20, 21 } }, { /* 46 */ 0, { 21, 22 } }, { /* 47 */ 1, { 2, 3 } }, { /* 48 */ 1, { 3, 2 } }, { /* 49 */ 1, { 1, 4 } }, { /* 50 */ 1, { 4, 1 } }, { /* 51 */ 1, { 1, 5 } }, { /* 52 */ 1, { 5, 1 } }, { /* 53 */ 1, { 3, 3 } }, { /* 54 */ 1, { 2, 4 } }, { /* 55 */ 1, { 0, 4 } }, { /* 56 */ 1, { 4, 0 } }, { /* 57 */ 0, { 12, 13 } }, { /* 58 */ 0, { 13, 14 } }, { /* 59 */ 0, { 14, 15 } }, { /* 60 */ 0, { 15, 16 } }, { /* 61 */ 0, { 16, 17 } }, { /* 62 */ 0, { 17, 18 } }, { /* 63 */ 0, { 18, 19 } }, { /* 64 */ 0, { 19, 20 } }, { /* 65 */ 0, { 20, 21 } }, { /* 66 */ 0, { 21, 22 } }, { /* 67 */ 0, { 22, 23 } }, { /* 68 */ 0, { 23, 24 } }, { /* 69 */ 1, { 4, 2 } }, { /* 70 */ 1, { 2, 5 } }, { /* 71 */ 1, { 5, 2 } }, { /* 72 */ 1, { 0, 5 } }, { /* 73 */ 1, { 6, 1 } }, { /* 74 */ 1, { 5, 0 } }, { /* 75 */ 1, { 1, 6 } }, { /* 76 */ 1, { 4, 3 } }, { /* 77 */ 1, { 3, 5 } }, { /* 78 */ 1, { 3, 4 } }, { /* 79 */ 1, { 5, 3 } }, { /* 80 */ 1, { 2, 6 } }, { /* 81 */ 1, { 6, 2 } }, { /* 82 */ 1, { 1, 7 } }, { /* 83 */ 0, { 10, 11 } }, { /* 84 */ 0, { 11, 12 } }, { /* 85 */ 0, { 12, 13 } }, { /* 86 */ 0, { 13, 14 } }, { /* 87 */ 0, { 14, 15 } }, { /* 88 */ 0, { 15, 16 } }, { /* 89 */ 0, { 16, 17 } }, { /* 90 */ 0, { 17, 18 } }, { /* 91 */ 0, { 18, 19 } }, { /* 92 */ 0, { 19, 20 } }, { /* 93 */ 1, { 3, 6 } }, { /* 94 */ 1, { 0, 6 } }, { /* 95 */ 1, { 6, 0 } }, { /* 96 */ 1, { 4, 4 } }, { /* 97 */ 1, { 7, 1 } }, { /* 98 */ 1, { 4, 5 } }, { /* 99 */ 1, { 7, 2 } }, { /* 00 */ 1, { 5, 4 } }, { /* 01 */ 1, { 6, 3 } }, { /* 02 */ 1, { 2, 7 } }, { /* 03 */ 1, { 7, 3 } }, { /* 04 */ 1, { 6, 4 } }, { /* 05 */ 1, { 5, 5 } }, { /* 06 */ 1, { 4, 6 } }, { /* 07 */ 1, { 3, 7 } }, { /* 08 */ 0, { 5, 6 } }, { /* 09 */ 0, { 6, 7 } }, { /* 10 */ 0, { 7, 8 } }, { /* 11 */ 0, { 8, 9 } }, { /* 12 */ 0, { 9, 10 } }, { /* 13 */ 1, { 7, 0 } }, { /* 14 */ 1, { 0, 7 } }, { /* 15 */ 1, { 6, 5 } }, { /* 16 */ 1, { 5, 6 } }, { /* 17 */ 1, { 7, 4 } }, { /* 18 */ 1, { 4, 7 } }, { /* 19 */ 1, { 5, 7 } }, { /* 20 */ 1, { 7, 5 } }, { /* 21 */ 0, { 2, 3 } }, { /* 22 */ 0, { 3, 4 } }, { /* 23 */ 1, { 7, 6 } }, { /* 24 */ 1, { 6, 6 } }, { /* 25 */ 1, { 6, 7 } }, { /* 26 */ 1, { 7, 7 } } }; faad2-2_10_0/libfaad/codebook/hcb_8.h000066400000000000000000000104511374350120500172150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_8.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* 2-step huffman table HCB_8 */ /* 1st step: 5 bits * 2^5 = 32 entries * * Used to find offset into 2nd step table and number of extra bits to get */ static hcb hcb8_1[] = { /* 3 bit codeword */ { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, /* 4 bit codewords */ { /* 00100 */ 1, 0 }, { /* */ 1, 0 }, { /* 00110 */ 2, 0 }, { /* */ 2, 0 }, { /* 01000 */ 3, 0 }, { /* */ 3, 0 }, { /* 01010 */ 4, 0 }, { /* */ 4, 0 }, { /* 01100 */ 5, 0 }, { /* */ 5, 0 }, /* 5 bit codewords */ { /* 01110 */ 6, 0 }, { /* 01111 */ 7, 0 }, { /* 10000 */ 8, 0 }, { /* 10001 */ 9, 0 }, { /* 10010 */ 10, 0 }, { /* 10011 */ 11, 0 }, { /* 10100 */ 12, 0 }, /* 6 bit codewords */ { /* 10101 */ 13, 1 }, { /* 10110 */ 15, 1 }, { /* 10111 */ 17, 1 }, { /* 11000 */ 19, 1 }, { /* 11001 */ 21, 1 }, /* 7 bit codewords */ { /* 11010 */ 23, 2 }, { /* 11011 */ 27, 2 }, { /* 11100 */ 31, 2 }, /* 7/8 bit codewords */ { /* 11101 */ 35, 3 }, /* 8 bit codewords */ { /* 11110 */ 43, 3 }, /* 8/9/10 bit codewords */ { /* 11111 */ 51, 5 } }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_pair hcb8_2[] = { /* 3 bit codeword */ { 3, 1, 1 }, /* 4 bit codewords */ { 4, 2, 1 }, { 4, 1, 0 }, { 4, 1, 2 }, { 4, 0, 1 }, { 4, 2, 2 }, /* 5 bit codewords */ { 5, 0, 0 }, { 5, 2, 0 }, { 5, 0, 2 }, { 5, 3, 1 }, { 5, 1, 3 }, { 5, 3, 2 }, { 5, 2, 3 }, /* 6 bit codewords */ { 6, 3, 3 }, { 6, 4, 1 }, { 6, 1, 4 }, { 6, 4, 2 }, { 6, 2, 4 }, { 6, 3, 0 }, { 6, 0, 3 }, { 6, 4, 3 }, { 6, 3, 4 }, { 6, 5, 2 }, /* 7 bit codewords */ { 7, 5, 1 }, { 7, 2, 5 }, { 7, 1, 5 }, { 7, 5, 3 }, { 7, 3, 5 }, { 7, 4, 4 }, { 7, 5, 4 }, { 7, 0, 4 }, { 7, 4, 5 }, { 7, 4, 0 }, { 7, 2, 6 }, { 7, 6, 2 }, /* 7/8 bit codewords */ { 7, 6, 1 }, { 7, 6, 1 }, { 7, 1, 6 }, { 7, 1, 6 }, { 8, 3, 6 }, { 8, 6, 3 }, { 8, 5, 5 }, { 8, 5, 0 }, /* 8 bit codewords */ { 8, 6, 4 }, { 8, 0, 5 }, { 8, 4, 6 }, { 8, 7, 1 }, { 8, 7, 2 }, { 8, 2, 7 }, { 8, 6, 5 }, { 8, 7, 3 }, /* 8/9/10 bit codewords */ { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 9, 6, 6 }, { 9, 6, 6 }, { 9, 7, 4 }, { 9, 7, 4 }, { 9, 6, 0 }, { 9, 6, 0 }, { 9, 4, 7 }, { 9, 4, 7 }, { 9, 0, 6 }, { 9, 0, 6 }, { 9, 7, 5 }, { 9, 7, 5 }, { 9, 7, 6 }, { 9, 7, 6 }, { 9, 6, 7 }, { 9, 6, 7 }, { 10, 5, 7 }, { 10, 7, 0 }, { 10, 0, 7 }, { 10, 7, 7 } }; faad2-2_10_0/libfaad/codebook/hcb_9.h000066400000000000000000000274451374350120500172310ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_9.h,v 1.5 2007/11/01 12:34:11 menno Exp $ **/ /* Binary search huffman table HCB_9 */ static hcb_bin_pair hcb9[] = { { /* 0 */ 0, { 1, 2 } }, { /* 1 */ 1, { 0, 0 } }, { /* 2 */ 0, { 1, 2 } }, { /* 3 */ 0, { 2, 3 } }, { /* 4 */ 0, { 3, 4 } }, { /* 5 */ 1, { 1, 0 } }, { /* 6 */ 1, { 0, 1 } }, { /* 7 */ 0, { 2, 3 } }, { /* 8 */ 0, { 3, 4 } }, { /* 9 */ 1, { 1, 1 } }, { /* 10 */ 0, { 3, 4 } }, { /* 11 */ 0, { 4, 5 } }, { /* 12 */ 0, { 5, 6 } }, { /* 13 */ 0, { 6, 7 } }, { /* 14 */ 0, { 7, 8 } }, { /* 15 */ 0, { 8, 9 } }, { /* 16 */ 0, { 9, 10 } }, { /* 17 */ 0, { 10, 11 } }, { /* 18 */ 0, { 11, 12 } }, { /* 19 */ 1, { 2, 1 } }, { /* 20 */ 1, { 1, 2 } }, { /* 21 */ 1, { 2, 0 } }, { /* 22 */ 1, { 0, 2 } }, { /* 23 */ 0, { 8, 9 } }, { /* 24 */ 0, { 9, 10 } }, { /* 25 */ 0, { 10, 11 } }, { /* 26 */ 0, { 11, 12 } }, { /* 27 */ 0, { 12, 13 } }, { /* 28 */ 0, { 13, 14 } }, { /* 29 */ 0, { 14, 15 } }, { /* 30 */ 0, { 15, 16 } }, { /* 31 */ 1, { 3, 1 } }, { /* 32 */ 1, { 2, 2 } }, { /* 33 */ 1, { 1, 3 } }, { /* 34 */ 0, { 13, 14 } }, { /* 35 */ 0, { 14, 15 } }, { /* 36 */ 0, { 15, 16 } }, { /* 37 */ 0, { 16, 17 } }, { /* 38 */ 0, { 17, 18 } }, { /* 39 */ 0, { 18, 19 } }, { /* 40 */ 0, { 19, 20 } }, { /* 41 */ 0, { 20, 21 } }, { /* 42 */ 0, { 21, 22 } }, { /* 43 */ 0, { 22, 23 } }, { /* 44 */ 0, { 23, 24 } }, { /* 45 */ 0, { 24, 25 } }, { /* 46 */ 0, { 25, 26 } }, { /* 47 */ 1, { 3, 0 } }, { /* 48 */ 1, { 0, 3 } }, { /* 49 */ 1, { 2, 3 } }, { /* 50 */ 1, { 3, 2 } }, { /* 51 */ 1, { 1, 4 } }, { /* 52 */ 1, { 4, 1 } }, { /* 53 */ 1, { 2, 4 } }, { /* 54 */ 1, { 1, 5 } }, { /* 55 */ 0, { 18, 19 } }, { /* 56 */ 0, { 19, 20 } }, { /* 57 */ 0, { 20, 21 } }, { /* 58 */ 0, { 21, 22 } }, { /* 59 */ 0, { 22, 23 } }, { /* 60 */ 0, { 23, 24 } }, { /* 61 */ 0, { 24, 25 } }, { /* 62 */ 0, { 25, 26 } }, { /* 63 */ 0, { 26, 27 } }, { /* 64 */ 0, { 27, 28 } }, { /* 65 */ 0, { 28, 29 } }, { /* 66 */ 0, { 29, 30 } }, { /* 67 */ 0, { 30, 31 } }, { /* 68 */ 0, { 31, 32 } }, { /* 69 */ 0, { 32, 33 } }, { /* 70 */ 0, { 33, 34 } }, { /* 71 */ 0, { 34, 35 } }, { /* 72 */ 0, { 35, 36 } }, { /* 73 */ 1, { 4, 2 } }, { /* 74 */ 1, { 3, 3 } }, { /* 75 */ 1, { 0, 4 } }, { /* 76 */ 1, { 4, 0 } }, { /* 77 */ 1, { 5, 1 } }, { /* 78 */ 1, { 2, 5 } }, { /* 79 */ 1, { 1, 6 } }, { /* 80 */ 1, { 3, 4 } }, { /* 81 */ 1, { 5, 2 } }, { /* 82 */ 1, { 6, 1 } }, { /* 83 */ 1, { 4, 3 } }, { /* 84 */ 0, { 25, 26 } }, { /* 85 */ 0, { 26, 27 } }, { /* 86 */ 0, { 27, 28 } }, { /* 87 */ 0, { 28, 29 } }, { /* 88 */ 0, { 29, 30 } }, { /* 89 */ 0, { 30, 31 } }, { /* 90 */ 0, { 31, 32 } }, { /* 91 */ 0, { 32, 33 } }, { /* 92 */ 0, { 33, 34 } }, { /* 93 */ 0, { 34, 35 } }, { /* 94 */ 0, { 35, 36 } }, { /* 95 */ 0, { 36, 37 } }, { /* 96 */ 0, { 37, 38 } }, { /* 97 */ 0, { 38, 39 } }, { /* 98 */ 0, { 39, 40 } }, { /* 99 */ 0, { 40, 41 } }, { /* 00 */ 0, { 41, 42 } }, { /* 01 */ 0, { 42, 43 } }, { /* 02 */ 0, { 43, 44 } }, { /* 03 */ 0, { 44, 45 } }, { /* 04 */ 0, { 45, 46 } }, { /* 05 */ 0, { 46, 47 } }, { /* 06 */ 0, { 47, 48 } }, { /* 07 */ 0, { 48, 49 } }, { /* 08 */ 0, { 49, 50 } }, { /* 09 */ 1, { 0, 5 } }, { /* 10 */ 1, { 2, 6 } }, { /* 11 */ 1, { 5, 0 } }, { /* 12 */ 1, { 1, 7 } }, { /* 13 */ 1, { 3, 5 } }, { /* 14 */ 1, { 1, 8 } }, { /* 15 */ 1, { 8, 1 } }, { /* 16 */ 1, { 4, 4 } }, { /* 17 */ 1, { 5, 3 } }, { /* 18 */ 1, { 6, 2 } }, { /* 19 */ 1, { 7, 1 } }, { /* 20 */ 1, { 0, 6 } }, { /* 21 */ 1, { 8, 2 } }, { /* 22 */ 1, { 2, 8 } }, { /* 23 */ 1, { 3, 6 } }, { /* 24 */ 1, { 2, 7 } }, { /* 25 */ 1, { 4, 5 } }, { /* 26 */ 1, { 9, 1 } }, { /* 27 */ 1, { 1, 9 } }, { /* 28 */ 1, { 7, 2 } }, { /* 29 */ 0, { 30, 31 } }, { /* 30 */ 0, { 31, 32 } }, { /* 31 */ 0, { 32, 33 } }, { /* 32 */ 0, { 33, 34 } }, { /* 33 */ 0, { 34, 35 } }, { /* 34 */ 0, { 35, 36 } }, { /* 35 */ 0, { 36, 37 } }, { /* 36 */ 0, { 37, 38 } }, { /* 37 */ 0, { 38, 39 } }, { /* 38 */ 0, { 39, 40 } }, { /* 39 */ 0, { 40, 41 } }, { /* 40 */ 0, { 41, 42 } }, { /* 41 */ 0, { 42, 43 } }, { /* 42 */ 0, { 43, 44 } }, { /* 43 */ 0, { 44, 45 } }, { /* 44 */ 0, { 45, 46 } }, { /* 45 */ 0, { 46, 47 } }, { /* 46 */ 0, { 47, 48 } }, { /* 47 */ 0, { 48, 49 } }, { /* 48 */ 0, { 49, 50 } }, { /* 49 */ 0, { 50, 51 } }, { /* 50 */ 0, { 51, 52 } }, { /* 51 */ 0, { 52, 53 } }, { /* 52 */ 0, { 53, 54 } }, { /* 53 */ 0, { 54, 55 } }, { /* 54 */ 0, { 55, 56 } }, { /* 55 */ 0, { 56, 57 } }, { /* 56 */ 0, { 57, 58 } }, { /* 57 */ 0, { 58, 59 } }, { /* 58 */ 0, { 59, 60 } }, { /* 59 */ 1, { 6, 0 } }, { /* 60 */ 1, { 5, 4 } }, { /* 61 */ 1, { 6, 3 } }, { /* 62 */ 1, { 8, 3 } }, { /* 63 */ 1, { 0, 7 } }, { /* 64 */ 1, { 9, 2 } }, { /* 65 */ 1, { 3, 8 } }, { /* 66 */ 1, { 4, 6 } }, { /* 67 */ 1, { 3, 7 } }, { /* 68 */ 1, { 0, 8 } }, { /* 69 */ 1, { 10, 1 } }, { /* 70 */ 1, { 6, 4 } }, { /* 71 */ 1, { 2, 9 } }, { /* 72 */ 1, { 5, 5 } }, { /* 73 */ 1, { 8, 0 } }, { /* 74 */ 1, { 7, 0 } }, { /* 75 */ 1, { 7, 3 } }, { /* 76 */ 1, { 10, 2 } }, { /* 77 */ 1, { 9, 3 } }, { /* 78 */ 1, { 8, 4 } }, { /* 79 */ 1, { 1, 10 } }, { /* 80 */ 1, { 7, 4 } }, { /* 81 */ 1, { 6, 5 } }, { /* 82 */ 1, { 5, 6 } }, { /* 83 */ 1, { 4, 8 } }, { /* 84 */ 1, { 4, 7 } }, { /* 85 */ 1, { 3, 9 } }, { /* 86 */ 1, { 11, 1 } }, { /* 87 */ 1, { 5, 8 } }, { /* 88 */ 1, { 9, 0 } }, { /* 89 */ 1, { 8, 5 } }, { /* 90 */ 0, { 29, 30 } }, { /* 91 */ 0, { 30, 31 } }, { /* 92 */ 0, { 31, 32 } }, { /* 93 */ 0, { 32, 33 } }, { /* 94 */ 0, { 33, 34 } }, { /* 95 */ 0, { 34, 35 } }, { /* 96 */ 0, { 35, 36 } }, { /* 97 */ 0, { 36, 37 } }, { /* 98 */ 0, { 37, 38 } }, { /* 99 */ 0, { 38, 39 } }, { /* 00 */ 0, { 39, 40 } }, { /* 01 */ 0, { 40, 41 } }, { /* 02 */ 0, { 41, 42 } }, { /* 03 */ 0, { 42, 43 } }, { /* 04 */ 0, { 43, 44 } }, { /* 05 */ 0, { 44, 45 } }, { /* 06 */ 0, { 45, 46 } }, { /* 07 */ 0, { 46, 47 } }, { /* 08 */ 0, { 47, 48 } }, { /* 09 */ 0, { 48, 49 } }, { /* 10 */ 0, { 49, 50 } }, { /* 11 */ 0, { 50, 51 } }, { /* 12 */ 0, { 51, 52 } }, { /* 13 */ 0, { 52, 53 } }, { /* 14 */ 0, { 53, 54 } }, { /* 15 */ 0, { 54, 55 } }, { /* 16 */ 0, { 55, 56 } }, { /* 17 */ 0, { 56, 57 } }, { /* 18 */ 0, { 57, 58 } }, { /* 19 */ 1, { 10, 3 } }, { /* 20 */ 1, { 2, 10 } }, { /* 21 */ 1, { 0, 9 } }, { /* 22 */ 1, { 11, 2 } }, { /* 23 */ 1, { 9, 4 } }, { /* 24 */ 1, { 6, 6 } }, { /* 25 */ 1, { 12, 1 } }, { /* 26 */ 1, { 4, 9 } }, { /* 27 */ 1, { 8, 6 } }, { /* 28 */ 1, { 1, 11 } }, { /* 29 */ 1, { 9, 5 } }, { /* 30 */ 1, { 10, 4 } }, { /* 31 */ 1, { 5, 7 } }, { /* 32 */ 1, { 7, 5 } }, { /* 33 */ 1, { 2, 11 } }, { /* 34 */ 1, { 1, 12 } }, { /* 35 */ 1, { 12, 2 } }, { /* 36 */ 1, { 11, 3 } }, { /* 37 */ 1, { 3, 10 } }, { /* 38 */ 1, { 5, 9 } }, { /* 39 */ 1, { 6, 7 } }, { /* 40 */ 1, { 8, 7 } }, { /* 41 */ 1, { 11, 4 } }, { /* 42 */ 1, { 0, 10 } }, { /* 43 */ 1, { 7, 6 } }, { /* 44 */ 1, { 12, 3 } }, { /* 45 */ 1, { 10, 0 } }, { /* 46 */ 1, { 10, 5 } }, { /* 47 */ 1, { 4, 10 } }, { /* 48 */ 1, { 6, 8 } }, { /* 49 */ 1, { 2, 12 } }, { /* 50 */ 1, { 9, 6 } }, { /* 51 */ 1, { 9, 7 } }, { /* 52 */ 1, { 4, 11 } }, { /* 53 */ 1, { 11, 0 } }, { /* 54 */ 1, { 6, 9 } }, { /* 55 */ 1, { 3, 11 } }, { /* 56 */ 1, { 5, 10 } }, { /* 57 */ 0, { 20, 21 } }, { /* 58 */ 0, { 21, 22 } }, { /* 59 */ 0, { 22, 23 } }, { /* 60 */ 0, { 23, 24 } }, { /* 61 */ 0, { 24, 25 } }, { /* 62 */ 0, { 25, 26 } }, { /* 63 */ 0, { 26, 27 } }, { /* 64 */ 0, { 27, 28 } }, { /* 65 */ 0, { 28, 29 } }, { /* 66 */ 0, { 29, 30 } }, { /* 67 */ 0, { 30, 31 } }, { /* 68 */ 0, { 31, 32 } }, { /* 69 */ 0, { 32, 33 } }, { /* 70 */ 0, { 33, 34 } }, { /* 71 */ 0, { 34, 35 } }, { /* 72 */ 0, { 35, 36 } }, { /* 73 */ 0, { 36, 37 } }, { /* 74 */ 0, { 37, 38 } }, { /* 75 */ 0, { 38, 39 } }, { /* 76 */ 0, { 39, 40 } }, { /* 77 */ 1, { 8, 8 } }, { /* 78 */ 1, { 7, 8 } }, { /* 79 */ 1, { 12, 5 } }, { /* 80 */ 1, { 3, 12 } }, { /* 81 */ 1, { 11, 5 } }, { /* 82 */ 1, { 7, 7 } }, { /* 83 */ 1, { 12, 4 } }, { /* 84 */ 1, { 11, 6 } }, { /* 85 */ 1, { 10, 6 } }, { /* 86 */ 1, { 4, 12 } }, { /* 87 */ 1, { 7, 9 } }, { /* 88 */ 1, { 5, 11 } }, { /* 89 */ 1, { 0, 11 } }, { /* 90 */ 1, { 12, 6 } }, { /* 91 */ 1, { 6, 10 } }, { /* 92 */ 1, { 12, 0 } }, { /* 93 */ 1, { 10, 7 } }, { /* 94 */ 1, { 5, 12 } }, { /* 95 */ 1, { 7, 10 } }, { /* 96 */ 1, { 9, 8 } }, { /* 97 */ 1, { 0, 12 } }, { /* 98 */ 1, { 11, 7 } }, { /* 99 */ 1, { 8, 9 } }, { /* 00 */ 1, { 9, 9 } }, { /* 01 */ 1, { 10, 8 } }, { /* 02 */ 1, { 7, 11 } }, { /* 03 */ 1, { 12, 7 } }, { /* 04 */ 1, { 6, 11 } }, { /* 05 */ 1, { 8, 11 } }, { /* 06 */ 1, { 11, 8 } }, { /* 07 */ 1, { 7, 12 } }, { /* 08 */ 1, { 6, 12 } }, { /* 09 */ 0, { 8, 9 } }, { /* 10 */ 0, { 9, 10 } }, { /* 11 */ 0, { 10, 11 } }, { /* 12 */ 0, { 11, 12 } }, { /* 13 */ 0, { 12, 13 } }, { /* 14 */ 0, { 13, 14 } }, { /* 15 */ 0, { 14, 15 } }, { /* 16 */ 0, { 15, 16 } }, { /* 17 */ 1, { 8, 10 } }, { /* 18 */ 1, { 10, 9 } }, { /* 19 */ 1, { 8, 12 } }, { /* 20 */ 1, { 9, 10 } }, { /* 21 */ 1, { 9, 11 } }, { /* 22 */ 1, { 9, 12 } }, { /* 23 */ 1, { 10, 11 } }, { /* 24 */ 1, { 12, 9 } }, { /* 25 */ 1, { 10, 10 } }, { /* 26 */ 1, { 11, 9 } }, { /* 27 */ 1, { 12, 8 } }, { /* 28 */ 1, { 11, 10 } }, { /* 29 */ 1, { 12, 10 } }, { /* 30 */ 1, { 12, 11 } }, { /* 31 */ 0, { 2, 3 } }, { /* 32 */ 0, { 3, 4 } }, { /* 33 */ 1, { 10, 12 } }, { /* 34 */ 1, { 11, 11 } }, { /* 35 */ 1, { 11, 12 } }, { /* 36 */ 1, { 12, 12 } } }; faad2-2_10_0/libfaad/codebook/hcb_sf.h000066400000000000000000000164521374350120500174650ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcb_sf.h,v 1.7 2007/11/01 12:34:11 menno Exp $ **/ /* Binary search huffman table HCB_SF */ static uint8_t hcb_sf[][2] = { { /* 0 */ 1, 2 }, { /* 1 */ 60, 0 }, { /* 2 */ 1, 2 }, { /* 3 */ 2, 3 }, { /* 4 */ 3, 4 }, { /* 5 */ 59, 0 }, { /* 6 */ 3, 4 }, { /* 7 */ 4, 5 }, { /* 8 */ 5, 6 }, { /* 9 */ 61, 0 }, { /* 10 */ 58, 0 }, { /* 11 */ 62, 0 }, { /* 12 */ 3, 4 }, { /* 13 */ 4, 5 }, { /* 14 */ 5, 6 }, { /* 15 */ 57, 0 }, { /* 16 */ 63, 0 }, { /* 17 */ 4, 5 }, { /* 18 */ 5, 6 }, { /* 19 */ 6, 7 }, { /* 20 */ 7, 8 }, { /* 21 */ 56, 0 }, { /* 22 */ 64, 0 }, { /* 23 */ 55, 0 }, { /* 24 */ 65, 0 }, { /* 25 */ 4, 5 }, { /* 26 */ 5, 6 }, { /* 27 */ 6, 7 }, { /* 28 */ 7, 8 }, { /* 29 */ 66, 0 }, { /* 30 */ 54, 0 }, { /* 31 */ 67, 0 }, { /* 32 */ 5, 6 }, { /* 33 */ 6, 7 }, { /* 34 */ 7, 8 }, { /* 35 */ 8, 9 }, { /* 36 */ 9, 10 }, { /* 37 */ 53, 0 }, { /* 38 */ 68, 0 }, { /* 39 */ 52, 0 }, { /* 40 */ 69, 0 }, { /* 41 */ 51, 0 }, { /* 42 */ 5, 6 }, { /* 43 */ 6, 7 }, { /* 44 */ 7, 8 }, { /* 45 */ 8, 9 }, { /* 46 */ 9, 10 }, { /* 47 */ 70, 0 }, { /* 48 */ 50, 0 }, { /* 49 */ 49, 0 }, { /* 50 */ 71, 0 }, { /* 51 */ 6, 7 }, { /* 52 */ 7, 8 }, { /* 53 */ 8, 9 }, { /* 54 */ 9, 10 }, { /* 55 */ 10, 11 }, { /* 56 */ 11, 12 }, { /* 57 */ 72, 0 }, { /* 58 */ 48, 0 }, { /* 59 */ 73, 0 }, { /* 60 */ 47, 0 }, { /* 61 */ 74, 0 }, { /* 62 */ 46, 0 }, { /* 63 */ 6, 7 }, { /* 64 */ 7, 8 }, { /* 65 */ 8, 9 }, { /* 66 */ 9, 10 }, { /* 67 */ 10, 11 }, { /* 68 */ 11, 12 }, { /* 69 */ 76, 0 }, { /* 70 */ 75, 0 }, { /* 71 */ 77, 0 }, { /* 72 */ 78, 0 }, { /* 73 */ 45, 0 }, { /* 74 */ 43, 0 }, { /* 75 */ 6, 7 }, { /* 76 */ 7, 8 }, { /* 77 */ 8, 9 }, { /* 78 */ 9, 10 }, { /* 79 */ 10, 11 }, { /* 80 */ 11, 12 }, { /* 81 */ 44, 0 }, { /* 82 */ 79, 0 }, { /* 83 */ 42, 0 }, { /* 84 */ 41, 0 }, { /* 85 */ 80, 0 }, { /* 86 */ 40, 0 }, { /* 87 */ 6, 7 }, { /* 88 */ 7, 8 }, { /* 89 */ 8, 9 }, { /* 90 */ 9, 10 }, { /* 91 */ 10, 11 }, { /* 92 */ 11, 12 }, { /* 93 */ 81, 0 }, { /* 94 */ 39, 0 }, { /* 95 */ 82, 0 }, { /* 96 */ 38, 0 }, { /* 97 */ 83, 0 }, { /* 98 */ 7, 8 }, { /* 99 */ 8, 9 }, { /* 00 */ 9, 10 }, { /* 01 */ 10, 11 }, { /* 02 */ 11, 12 }, { /* 03 */ 12, 13 }, { /* 04 */ 13, 14 }, { /* 05 */ 37, 0 }, { /* 06 */ 35, 0 }, { /* 07 */ 85, 0 }, { /* 08 */ 33, 0 }, { /* 09 */ 36, 0 }, { /* 10 */ 34, 0 }, { /* 11 */ 84, 0 }, { /* 12 */ 32, 0 }, { /* 13 */ 6, 7 }, { /* 14 */ 7, 8 }, { /* 15 */ 8, 9 }, { /* 16 */ 9, 10 }, { /* 17 */ 10, 11 }, { /* 18 */ 11, 12 }, { /* 19 */ 87, 0 }, { /* 20 */ 89, 0 }, { /* 21 */ 30, 0 }, { /* 22 */ 31, 0 }, { /* 23 */ 8, 9 }, { /* 24 */ 9, 10 }, { /* 25 */ 10, 11 }, { /* 26 */ 11, 12 }, { /* 27 */ 12, 13 }, { /* 28 */ 13, 14 }, { /* 29 */ 14, 15 }, { /* 30 */ 15, 16 }, { /* 31 */ 86, 0 }, { /* 32 */ 29, 0 }, { /* 33 */ 26, 0 }, { /* 34 */ 27, 0 }, { /* 35 */ 28, 0 }, { /* 36 */ 24, 0 }, { /* 37 */ 88, 0 }, { /* 38 */ 9, 10 }, { /* 39 */ 10, 11 }, { /* 40 */ 11, 12 }, { /* 41 */ 12, 13 }, { /* 42 */ 13, 14 }, { /* 43 */ 14, 15 }, { /* 44 */ 15, 16 }, { /* 45 */ 16, 17 }, { /* 46 */ 17, 18 }, { /* 47 */ 25, 0 }, { /* 48 */ 22, 0 }, { /* 49 */ 23, 0 }, { /* 50 */ 15, 16 }, { /* 51 */ 16, 17 }, { /* 52 */ 17, 18 }, { /* 53 */ 18, 19 }, { /* 54 */ 19, 20 }, { /* 55 */ 20, 21 }, { /* 56 */ 21, 22 }, { /* 57 */ 22, 23 }, { /* 58 */ 23, 24 }, { /* 59 */ 24, 25 }, { /* 60 */ 25, 26 }, { /* 61 */ 26, 27 }, { /* 62 */ 27, 28 }, { /* 63 */ 28, 29 }, { /* 64 */ 29, 30 }, { /* 65 */ 90, 0 }, { /* 66 */ 21, 0 }, { /* 67 */ 19, 0 }, { /* 68 */ 3, 0 }, { /* 69 */ 1, 0 }, { /* 70 */ 2, 0 }, { /* 71 */ 0, 0 }, { /* 72 */ 23, 24 }, { /* 73 */ 24, 25 }, { /* 74 */ 25, 26 }, { /* 75 */ 26, 27 }, { /* 76 */ 27, 28 }, { /* 77 */ 28, 29 }, { /* 78 */ 29, 30 }, { /* 79 */ 30, 31 }, { /* 80 */ 31, 32 }, { /* 81 */ 32, 33 }, { /* 82 */ 33, 34 }, { /* 83 */ 34, 35 }, { /* 84 */ 35, 36 }, { /* 85 */ 36, 37 }, { /* 86 */ 37, 38 }, { /* 87 */ 38, 39 }, { /* 88 */ 39, 40 }, { /* 89 */ 40, 41 }, { /* 90 */ 41, 42 }, { /* 91 */ 42, 43 }, { /* 92 */ 43, 44 }, { /* 93 */ 44, 45 }, { /* 94 */ 45, 46 }, { /* 95 */ 98, 0 }, { /* 96 */ 99, 0 }, { /* 97 */ 100, 0 }, { /* 98 */ 101, 0 }, { /* 99 */ 102, 0 }, { /* 00 */ 117, 0 }, { /* 01 */ 97, 0 }, { /* 02 */ 91, 0 }, { /* 03 */ 92, 0 }, { /* 04 */ 93, 0 }, { /* 05 */ 94, 0 }, { /* 06 */ 95, 0 }, { /* 07 */ 96, 0 }, { /* 08 */ 104, 0 }, { /* 09 */ 111, 0 }, { /* 10 */ 112, 0 }, { /* 11 */ 113, 0 }, { /* 12 */ 114, 0 }, { /* 13 */ 115, 0 }, { /* 14 */ 116, 0 }, { /* 15 */ 110, 0 }, { /* 16 */ 105, 0 }, { /* 17 */ 106, 0 }, { /* 18 */ 107, 0 }, { /* 19 */ 108, 0 }, { /* 20 */ 109, 0 }, { /* 21 */ 118, 0 }, { /* 22 */ 6, 0 }, { /* 23 */ 8, 0 }, { /* 24 */ 9, 0 }, { /* 25 */ 10, 0 }, { /* 26 */ 5, 0 }, { /* 27 */ 103, 0 }, { /* 28 */ 120, 0 }, { /* 29 */ 119, 0 }, { /* 30 */ 4, 0 }, { /* 31 */ 7, 0 }, { /* 32 */ 15, 0 }, { /* 33 */ 16, 0 }, { /* 34 */ 18, 0 }, { /* 35 */ 20, 0 }, { /* 36 */ 17, 0 }, { /* 37 */ 11, 0 }, { /* 38 */ 12, 0 }, { /* 39 */ 14, 0 }, { /* 40 */ 13, 0 } }; faad2-2_10_0/libfaad/common.c000066400000000000000000000412011374350120500157250ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: common.c,v 1.27 2008/03/23 23:03:28 menno Exp $ **/ /* just some common functions that could be used anywhere */ #include "common.h" #include "structs.h" #include #include "syntax.h" /* Returns the sample rate index based on the samplerate */ uint8_t get_sr_index(const uint32_t 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; if (16428320 <= samplerate) return 11; return 11; } /* Returns the sample rate based on the sample rate index */ uint32_t get_sample_rate(const uint8_t sr_index) { static const uint32_t sample_rates[] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000 }; if (sr_index < 12) return sample_rates[sr_index]; return 0; } uint8_t max_pred_sfb(const uint8_t sr_index) { static const uint8_t pred_sfb_max[] = { 33, 33, 38, 40, 40, 40, 41, 41, 37, 37, 37, 34 }; if (sr_index < 12) return pred_sfb_max[sr_index]; return 0; } uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, const uint8_t is_short) { /* entry for each sampling rate * 1 Main/LC long window * 2 Main/LC short window * 3 SSR long window * 4 SSR short window */ static const uint8_t tns_sbf_max[][4] = { {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 */ {39, 14, 19, 7}, /* 7350 */ {0,0,0,0}, {0,0,0,0}, {0,0,0,0} }; uint8_t i = 0; if (is_short) i++; if (object_type == SSR) i += 2; return tns_sbf_max[sr_index][i]; } /* Returns 0 if an object type is decodable, otherwise returns -1 */ int8_t can_decode_ot(const uint8_t object_type) { switch (object_type) { case LC: return 0; case MAIN: #ifdef MAIN_DEC return 0; #else return -1; #endif case SSR: #ifdef SSR_DEC return 0; #else return -1; #endif case LTP: #ifdef LTP_DEC return 0; #else return -1; #endif /* ER object types */ #ifdef ERROR_RESILIENCE case ER_LC: #ifdef DRM case DRM_ER_LC: #endif return 0; case ER_LTP: #ifdef LTP_DEC return 0; #else return -1; #endif case LD: #ifdef LD_DEC return 0; #else return -1; #endif #endif } return -1; } void *faad_malloc(size_t size) { #if 0 // defined(_WIN32) && !defined(_WIN32_WCE) return _aligned_malloc(size, 16); #else // #ifdef 0 return malloc(size); #endif // #ifdef 0 } /* common free function */ void faad_free(void *b) { #if 0 // defined(_WIN32) && !defined(_WIN32_WCE) _aligned_free(b); #else free(b); } #endif static const uint8_t Parity [256] = { // parity 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 }; static uint32_t __r1 = 1; static uint32_t __r2 = 1; /* * This is a simple random number generator with good quality for audio purposes. * It consists of two polycounters with opposite rotation direction and different * periods. The periods are coprime, so the total period is the product of both. * * ------------------------------------------------------------------------------------------------- * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| * | ------------------------------------------------------------------------------------------------- * | | | | | | | * | +--+--+--+-XOR-+--------+ * | | * +--------------------------------------------------------------------------------------+ * * ------------------------------------------------------------------------------------------------- * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ * ------------------------------------------------------------------------------------------------- | * | | | | | * +--+----XOR----+--+ | * | | * +----------------------------------------------------------------------------------------+ * * * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, * which gives a period of 18.410.713.077.675.721.215. The result is the * XORed values of both generators. */ uint32_t ne_rng(uint32_t *__r1, uint32_t *__r2) { uint32_t t1, t2, t3, t4; t3 = t1 = *__r1; t4 = t2 = *__r2; // Parity calculation is done via table lookup, this is also available t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable t1 = Parity [t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations. t1 <<= 31; t2 = Parity [t2]; return (*__r1 = (t3 >> 1) | t1 ) ^ (*__r2 = (t4 + t4) | t2 ); } static uint32_t ones32(uint32_t x) { x -= ((x >> 1) & 0x55555555); x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); x = (((x >> 4) + x) & 0x0f0f0f0f); x += (x >> 8); x += (x >> 16); return (x & 0x0000003f); } static uint32_t floor_log2(uint32_t x) { #if 1 x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return (ones32(x) - 1); #else uint32_t count = 0; while (x >>= 1) count++; return count; #endif } /* returns position of first bit that is not 0 from msb, * starting count at lsb */ uint32_t wl_min_lzc(uint32_t x) { #if 1 x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); return (ones32(x)); #else uint32_t count = 0; while (x >>= 1) count++; return (count + 1); #endif } #ifdef FIXED_POINT #define TABLE_BITS 6 /* just take the maximum number of bits for interpolation */ #define INTERP_BITS (REAL_BITS-TABLE_BITS) static const real_t pow2_tab[] = { REAL_CONST(1.000000000000000), REAL_CONST(1.010889286051701), REAL_CONST(1.021897148654117), REAL_CONST(1.033024879021228), REAL_CONST(1.044273782427414), REAL_CONST(1.055645178360557), REAL_CONST(1.067140400676824), REAL_CONST(1.078760797757120), REAL_CONST(1.090507732665258), REAL_CONST(1.102382583307841), REAL_CONST(1.114386742595892), REAL_CONST(1.126521618608242), REAL_CONST(1.138788634756692), REAL_CONST(1.151189229952983), REAL_CONST(1.163724858777578), REAL_CONST(1.176396991650281), REAL_CONST(1.189207115002721), REAL_CONST(1.202156731452703), REAL_CONST(1.215247359980469), REAL_CONST(1.228480536106870), REAL_CONST(1.241857812073484), REAL_CONST(1.255380757024691), REAL_CONST(1.269050957191733), REAL_CONST(1.282870016078778), REAL_CONST(1.296839554651010), REAL_CONST(1.310961211524764), REAL_CONST(1.325236643159741), REAL_CONST(1.339667524053303), REAL_CONST(1.354255546936893), REAL_CONST(1.369002422974591), REAL_CONST(1.383909881963832), REAL_CONST(1.398979672538311), REAL_CONST(1.414213562373095), REAL_CONST(1.429613338391970), REAL_CONST(1.445180806977047), REAL_CONST(1.460917794180647), REAL_CONST(1.476826145939499), REAL_CONST(1.492907728291265), REAL_CONST(1.509164427593423), REAL_CONST(1.525598150744538), REAL_CONST(1.542210825407941), REAL_CONST(1.559004400237837), REAL_CONST(1.575980845107887), REAL_CONST(1.593142151342267), REAL_CONST(1.610490331949254), REAL_CONST(1.628027421857348), REAL_CONST(1.645755478153965), REAL_CONST(1.663676580326736), REAL_CONST(1.681792830507429), REAL_CONST(1.700106353718524), REAL_CONST(1.718619298122478), REAL_CONST(1.737333835273706), REAL_CONST(1.756252160373300), REAL_CONST(1.775376492526521), REAL_CONST(1.794709075003107), REAL_CONST(1.814252175500399), REAL_CONST(1.834008086409342), REAL_CONST(1.853979125083386), REAL_CONST(1.874167634110300), REAL_CONST(1.894575981586966), REAL_CONST(1.915206561397147), REAL_CONST(1.936061793492294), REAL_CONST(1.957144124175400), REAL_CONST(1.978456026387951), REAL_CONST(2.000000000000000) }; static const real_t log2_tab[] = { REAL_CONST(0.000000000000000), REAL_CONST(0.022367813028455), REAL_CONST(0.044394119358453), REAL_CONST(0.066089190457772), REAL_CONST(0.087462841250339), REAL_CONST(0.108524456778169), REAL_CONST(0.129283016944966), REAL_CONST(0.149747119504682), REAL_CONST(0.169925001442312), REAL_CONST(0.189824558880017), REAL_CONST(0.209453365628950), REAL_CONST(0.228818690495881), REAL_CONST(0.247927513443585), REAL_CONST(0.266786540694901), REAL_CONST(0.285402218862248), REAL_CONST(0.303780748177103), REAL_CONST(0.321928094887362), REAL_CONST(0.339850002884625), REAL_CONST(0.357552004618084), REAL_CONST(0.375039431346925), REAL_CONST(0.392317422778760), REAL_CONST(0.409390936137702), REAL_CONST(0.426264754702098), REAL_CONST(0.442943495848728), REAL_CONST(0.459431618637297), REAL_CONST(0.475733430966398), REAL_CONST(0.491853096329675), REAL_CONST(0.507794640198696), REAL_CONST(0.523561956057013), REAL_CONST(0.539158811108031), REAL_CONST(0.554588851677637), REAL_CONST(0.569855608330948), REAL_CONST(0.584962500721156), REAL_CONST(0.599912842187128), REAL_CONST(0.614709844115208), REAL_CONST(0.629356620079610), REAL_CONST(0.643856189774725), REAL_CONST(0.658211482751795), REAL_CONST(0.672425341971496), REAL_CONST(0.686500527183218), REAL_CONST(0.700439718141092), REAL_CONST(0.714245517666123), REAL_CONST(0.727920454563199), REAL_CONST(0.741466986401147), REAL_CONST(0.754887502163469), REAL_CONST(0.768184324776926), REAL_CONST(0.781359713524660), REAL_CONST(0.794415866350106), REAL_CONST(0.807354922057604), REAL_CONST(0.820178962415188), REAL_CONST(0.832890014164742), REAL_CONST(0.845490050944375), REAL_CONST(0.857980995127572), REAL_CONST(0.870364719583405), REAL_CONST(0.882643049361841), REAL_CONST(0.894817763307943), REAL_CONST(0.906890595608519), REAL_CONST(0.918863237274595), REAL_CONST(0.930737337562886), REAL_CONST(0.942514505339240), REAL_CONST(0.954196310386875), REAL_CONST(0.965784284662087), REAL_CONST(0.977279923499917), REAL_CONST(0.988684686772166), REAL_CONST(1.000000000000000) }; real_t pow2_fix(real_t val) { uint32_t x1, x2; uint32_t errcorr; uint32_t index_frac; real_t retval; int32_t whole = (val >> REAL_BITS); /* rest = [0..1] */ int32_t rest = val - (whole << REAL_BITS); /* index into pow2_tab */ int32_t index = rest >> (REAL_BITS-TABLE_BITS); if (val == 0) return (1<> (REAL_BITS-TABLE_BITS-INTERP_BITS); index_frac = index_frac & ((1< 0) { retval = 1 << whole; } else { retval = REAL_CONST(1) >> -whole; } x1 = pow2_tab[index & ((1<> INTERP_BITS; if (whole > 0) { retval = retval * (errcorr + x1); } else { retval = MUL_R(retval, (errcorr + x1)); } return retval; } int32_t pow2_int(real_t val) { uint32_t x1, x2; uint32_t errcorr; uint32_t index_frac; real_t retval; int32_t whole = (val >> REAL_BITS); /* rest = [0..1] */ int32_t rest = val - (whole << REAL_BITS); /* index into pow2_tab */ int32_t index = rest >> (REAL_BITS-TABLE_BITS); if (val == 0) return 1; /* leave INTERP_BITS bits */ index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS); index_frac = index_frac & ((1< 0) retval = 1 << whole; else retval = 0; x1 = pow2_tab[index & ((1<> INTERP_BITS; retval = MUL_R(retval, (errcorr + x1)); return retval; } /* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ int32_t log2_int(uint32_t val) { uint32_t frac; uint32_t whole = (val); int32_t exp = 0; uint32_t index; uint32_t index_frac; uint32_t x1, x2; uint32_t errcorr; /* error */ if (val == 0) return -10000; exp = floor_log2(val); exp -= REAL_BITS; /* frac = [1..2] */ if (exp >= 0) frac = val >> exp; else frac = val << -exp; /* index in the log2 table */ index = frac >> (REAL_BITS-TABLE_BITS); /* leftover part for linear interpolation */ index_frac = frac & ((1<<(REAL_BITS-TABLE_BITS))-1); /* leave INTERP_BITS bits */ index_frac = index_frac >> (REAL_BITS-TABLE_BITS-INTERP_BITS); x1 = log2_tab[index & ((1<> INTERP_BITS; return ((exp+REAL_BITS) << REAL_BITS) + errcorr + x1; } /* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ real_t log2_fix(uint32_t val) { uint32_t frac; uint32_t whole = (val >> REAL_BITS); int8_t exp = 0; uint32_t index; uint32_t index_frac; uint32_t x1, x2; uint32_t errcorr; /* error */ if (val == 0) return -100000; exp = floor_log2(val); exp -= REAL_BITS; /* frac = [1..2] */ if (exp >= 0) frac = val >> exp; else frac = val << -exp; /* index in the log2 table */ index = frac >> (REAL_BITS-TABLE_BITS); /* leftover part for linear interpolation */ index_frac = frac & ((1<<(REAL_BITS-TABLE_BITS))-1); /* leave INTERP_BITS bits */ index_frac = index_frac >> (REAL_BITS-TABLE_BITS-INTERP_BITS); x1 = log2_tab[index & ((1<> INTERP_BITS; return (exp << REAL_BITS) + errcorr + x1; } #endif faad2-2_10_0/libfaad/common.h000066400000000000000000000222561374350120500157430ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: common.h,v 1.79 2015/01/26 17:48:53 knik Exp $ **/ #ifndef __COMMON_H__ #define __COMMON_H__ #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_CONFIG_H # include "../config.h" #endif #include "neaacdec.h" #if 1 #define INLINE __inline #else #define INLINE inline #endif #if 0 //defined(_WIN32) && !defined(_WIN32_WCE) #define ALIGN __declspec(align(16)) #else #define ALIGN #endif #ifndef max #define max(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif /* COMPILE TIME DEFINITIONS */ /* use double precision */ /* #define USE_DOUBLE_PRECISION */ /* use fixed point reals */ //#define FIXED_POINT //#define BIG_IQ_TABLE /* Use if target platform has address generators with autoincrement */ //#define PREFER_POINTERS #ifdef _WIN32_WCE #define FIXED_POINT #endif #ifdef __BFIN__ #define FIXED_POINT #endif #define ERROR_RESILIENCE /* Allow decoding of MAIN profile AAC */ #define MAIN_DEC /* Allow decoding of SSR profile AAC */ //#define SSR_DEC /* Allow decoding of LTP profile AAC */ #define LTP_DEC /* Allow decoding of LD profile AAC */ #define LD_DEC /* Allow decoding of Digital Radio Mondiale (DRM) */ #ifdef DRM_SUPPORT #define DRM #define DRM_PS #endif /* LD can't do without LTP */ #ifdef LD_DEC #ifndef ERROR_RESILIENCE #define ERROR_RESILIENCE #endif #ifndef LTP_DEC #define LTP_DEC #endif #endif #define ALLOW_SMALL_FRAMELENGTH // Define LC_ONLY_DECODER if you want a pure AAC LC decoder (independant of SBR_DEC and PS_DEC) //#define LC_ONLY_DECODER #ifdef LC_ONLY_DECODER #undef LD_DEC #undef LTP_DEC #undef MAIN_DEC #undef SSR_DEC #undef DRM #undef DRM_PS #undef ALLOW_SMALL_FRAMELENGTH #undef ERROR_RESILIENCE #endif #define SBR_DEC //#define SBR_LOW_POWER #define PS_DEC #ifdef SBR_LOW_POWER #undef PS_DEC #endif /* FIXED POINT: No MAIN decoding */ #ifdef FIXED_POINT # ifdef MAIN_DEC # undef MAIN_DEC # endif #endif // FIXED_POINT #ifdef DRM # ifndef ALLOW_SMALL_FRAMELENGTH # define ALLOW_SMALL_FRAMELENGTH # endif # undef LD_DEC # undef LTP_DEC # undef MAIN_DEC # undef SSR_DEC #endif #ifdef FIXED_POINT #define DIV_R(A, B) (((int64_t)A << REAL_BITS)/B) #define DIV_C(A, B) (((int64_t)A << COEF_BITS)/B) #else #define DIV_R(A, B) ((A)/(B)) #define DIV_C(A, B) ((A)/(B)) #endif #ifndef SBR_LOW_POWER #define qmf_t complex_t #define QMF_RE(A) RE(A) #define QMF_IM(A) IM(A) #else #define qmf_t real_t #define QMF_RE(A) (A) #define QMF_IM(A) #endif /* END COMPILE TIME DEFINITIONS */ #if defined(_WIN32) && !defined(__MINGW32__) #include typedef unsigned __int64 uint64_t; typedef unsigned __int32 uint32_t; typedef unsigned __int16 uint16_t; typedef unsigned __int8 uint8_t; typedef signed __int64 int64_t; typedef signed __int32 int32_t; typedef signed __int16 int16_t; typedef signed __int8 int8_t; typedef float float32_t; #else #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_STRINGS_H # include #endif #if HAVE_INTTYPES_H # include #else # if HAVE_STDINT_H # include # else /* we need these... */ #ifndef __TCS__ typedef unsigned long long uint64_t; typedef signed long long int64_t; #else typedef unsigned long uint64_t; typedef signed long int64_t; #endif typedef unsigned long uint32_t; typedef unsigned short uint16_t; typedef unsigned char uint8_t; typedef signed long int32_t; typedef signed short int16_t; typedef signed char int8_t; # endif #endif #if HAVE_UNISTD_H //# include #endif #ifndef HAVE_FLOAT32_T typedef float float32_t; #endif #if STDC_HEADERS # include #else # if !HAVE_STRCHR # define strchr index # define strrchr rindex # endif char *strchr(), *strrchr(); # if !HAVE_MEMCPY # define memcpy(d, s, n) bcopy((s), (d), (n)) # define memmove(d, s, n) bcopy((s), (d), (n)) # endif #endif #endif #ifdef WORDS_BIGENDIAN #define ARCH_IS_BIG_ENDIAN #endif /* FIXED_POINT doesn't work with MAIN and SSR yet */ #ifdef FIXED_POINT #undef MAIN_DEC #undef SSR_DEC #endif #if defined(FIXED_POINT) #include "fixed.h" #elif defined(USE_DOUBLE_PRECISION) typedef double real_t; #include #define MUL_R(A,B) ((A)*(B)) #define MUL_C(A,B) ((A)*(B)) #define MUL_F(A,B) ((A)*(B)) /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } #define REAL_CONST(A) ((real_t)(A)) #define COEF_CONST(A) ((real_t)(A)) #define Q2_CONST(A) ((real_t)(A)) #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ #else /* Normal floating point operation */ typedef float real_t; #define MUL_R(A,B) ((A)*(B)) #define MUL_C(A,B) ((A)*(B)) #define MUL_F(A,B) ((A)*(B)) #define REAL_CONST(A) ((real_t)(A)) #define COEF_CONST(A) ((real_t)(A)) #define Q2_CONST(A) ((real_t)(A)) #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } #if defined(_WIN32) && defined(_M_IX86) && !defined(__MINGW32__) #ifndef HAVE_LRINTF #define HAS_LRINTF static INLINE int lrintf(float f) { int i; __asm { fld f fistp i } return i; } #endif /* HAVE_LRINTF */ #elif (defined(__i386__) && defined(__GNUC__) && \ !defined(__CYGWIN__) && !defined(__MINGW32__)) #ifndef HAVE_LRINTF #define HAS_LRINTF // from http://www.stereopsis.com/FPU.html static INLINE int lrintf(float f) { int i; __asm__ __volatile__ ( "flds %1 \n\t" "fistpl %0 \n\t" : "=m" (i) : "m" (f)); return i; } #endif /* HAVE_LRINTF */ #endif #ifdef __ICL /* only Intel C compiler has fmath ??? */ #include #define sin sinf #define cos cosf #define log logf #define floor floorf #define ceil ceilf #define sqrt sqrtf #else #ifdef HAVE_LRINTF # define HAS_LRINTF # define _ISOC9X_SOURCE 1 # define _ISOC99_SOURCE 1 # define __USE_ISOC9X 1 # define __USE_ISOC99 1 #endif #include #ifdef HAVE_SINF # define sin sinf #error #endif #ifdef HAVE_COSF # define cos cosf #endif #ifdef HAVE_LOGF # define log logf #endif #ifdef HAVE_EXPF # define exp expf #endif #ifdef HAVE_FLOORF # define floor floorf #endif #ifdef HAVE_CEILF # define ceil ceilf #endif #ifdef HAVE_SQRTF # define sqrt sqrtf #endif #endif #endif #ifndef HAS_LRINTF /* standard cast */ #define lrintf(f) ((int32_t)(f)) #endif typedef real_t complex_t[2]; #define RE(A) A[0] #define IM(A) A[1] /* common functions */ uint8_t cpu_has_sse(void); uint32_t ne_rng(uint32_t *__r1, uint32_t *__r2); uint32_t wl_min_lzc(uint32_t x); #ifdef FIXED_POINT #define LOG2_MIN_INF REAL_CONST(-10000) int32_t log2_int(uint32_t val); int32_t log2_fix(uint32_t val); int32_t pow2_int(real_t val); real_t pow2_fix(real_t val); #endif uint8_t get_sr_index(const uint32_t samplerate); uint8_t max_pred_sfb(const uint8_t sr_index); uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, const uint8_t is_short); uint32_t get_sample_rate(const uint8_t sr_index); int8_t can_decode_ot(const uint8_t object_type); void *faad_malloc(size_t size); void faad_free(void *b); //#define PROFILE #ifdef PROFILE static int64_t faad_get_ts() { __asm { rdtsc } } #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef M_PI_2 /* PI/2 */ #define M_PI_2 1.57079632679489661923 #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/decoder.c000066400000000000000000001110561374350120500160500ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: decoder.c,v 1.119 2015/01/24 14:21:05 knik Exp $ **/ #include "common.h" #include "structs.h" #include #include #include #include "mp4.h" #include "syntax.h" #include "error.h" #include "output.h" #include "filtbank.h" #include "drc.h" #ifdef SBR_DEC #include "sbr_dec.h" #include "sbr_syntax.h" #endif #ifdef SSR_DEC #include "ssr.h" #endif #ifdef ANALYSIS uint16_t dbg_count; #endif #if (defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64) && !defined(PACKAGE_VERSION) #include "win32_ver.h" #endif /* static function declarations */ static void* aac_frame_decode(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer2, unsigned long sample_buffer_size); static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo); int NeAACDecGetVersion(char **faad_id_string, char **faad_copyright_string) { static char *libfaadName = PACKAGE_VERSION; static char *libCopyright = " Copyright 2002-2004: Ahead Software AG\n" " http://www.audiocoding.com\n" " bug tracking: https://sourceforge.net/p/faac/bugs/\n"; if (faad_id_string) *faad_id_string = libfaadName; if (faad_copyright_string) *faad_copyright_string = libCopyright; return 0; } char* NeAACDecGetErrorMessage(unsigned char errcode) { if (errcode >= NUM_ERROR_MESSAGES) return NULL; return err_msg[errcode]; } unsigned long NeAACDecGetCapabilities(void) { uint32_t cap = 0; /* can't do without it */ cap += LC_DEC_CAP; #ifdef MAIN_DEC cap += MAIN_DEC_CAP; #endif #ifdef LTP_DEC cap += LTP_DEC_CAP; #endif #ifdef LD_DEC cap += LD_DEC_CAP; #endif #ifdef ERROR_RESILIENCE cap += ERROR_RESILIENCE_CAP; #endif #ifdef FIXED_POINT cap += FIXED_POINT_CAP; #endif return cap; } const unsigned char mes[] = { 0x67,0x20,0x61,0x20,0x20,0x20,0x6f,0x20,0x72,0x20,0x65,0x20,0x6e,0x20,0x20,0x20,0x74,0x20,0x68,0x20,0x67,0x20,0x69,0x20,0x72,0x20,0x79,0x20,0x70,0x20,0x6f,0x20,0x63 }; NeAACDecHandle NeAACDecOpen(void) { uint8_t i; NeAACDecStruct *hDecoder = NULL; if ((hDecoder = (NeAACDecStruct*)faad_malloc(sizeof(NeAACDecStruct))) == NULL) return NULL; memset(hDecoder, 0, sizeof(NeAACDecStruct)); hDecoder->cmes = mes; hDecoder->config.outputFormat = FAAD_FMT_16BIT; hDecoder->config.defObjectType = MAIN; hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ hDecoder->config.downMatrix = 0; hDecoder->adts_header_present = 0; hDecoder->adif_header_present = 0; hDecoder->latm_header_present = 0; #ifdef ERROR_RESILIENCE hDecoder->aacSectionDataResilienceFlag = 0; hDecoder->aacScalefactorDataResilienceFlag = 0; hDecoder->aacSpectralDataResilienceFlag = 0; #endif hDecoder->frameLength = 1024; hDecoder->frame = 0; hDecoder->sample_buffer = NULL; hDecoder->__r1 = 1; hDecoder->__r2 = 1; for (i = 0; i < MAX_CHANNELS; i++) { hDecoder->element_id[i] = INVALID_ELEMENT_ID; hDecoder->window_shape_prev[i] = 0; hDecoder->time_out[i] = NULL; hDecoder->fb_intermed[i] = NULL; #ifdef SSR_DEC hDecoder->ssr_overlap[i] = NULL; hDecoder->prev_fmd[i] = NULL; #endif #ifdef MAIN_DEC hDecoder->pred_stat[i] = NULL; #endif #ifdef LTP_DEC hDecoder->ltp_lag[i] = 0; hDecoder->lt_pred_stat[i] = NULL; #endif } #ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { hDecoder->sbr[i] = NULL; } #endif hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); return hDecoder; } NeAACDecConfigurationPtr NeAACDecGetCurrentConfiguration(NeAACDecHandle hpDecoder) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder) { NeAACDecConfigurationPtr config = &(hDecoder->config); return config; } return NULL; } unsigned char NeAACDecSetConfiguration(NeAACDecHandle hpDecoder, NeAACDecConfigurationPtr config) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder && config) { /* check if we can decode this object type */ if (can_decode_ot(config->defObjectType) < 0) return 0; hDecoder->config.defObjectType = config->defObjectType; /* samplerate: anything but 0 should be possible */ if (config->defSampleRate == 0) return 0; hDecoder->config.defSampleRate = config->defSampleRate; /* check output format */ #ifdef FIXED_POINT if ((config->outputFormat < 1) || (config->outputFormat > 4)) return 0; #else if ((config->outputFormat < 1) || (config->outputFormat > 5)) return 0; #endif hDecoder->config.outputFormat = config->outputFormat; if (config->downMatrix > 1) return 0; hDecoder->config.downMatrix = config->downMatrix; /* OK */ return 1; } return 0; } static int latmCheck(latm_header *latm, bitfile *ld) { uint32_t good=0, bad=0, bits, m; while (ld->bytes_left) { bits = faad_latm_frame(latm, ld); if(bits==0xFFFFFFFF) bad++; else { good++; while(bits>0) { m = min(bits, 8); faad_getbits(ld, m); bits -= m; } } } return (good>0); } long NeAACDecInit(NeAACDecHandle hpDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels) { uint32_t bits = 0; bitfile ld; adif_header adif; adts_header adts; NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) return -1; hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); hDecoder->object_type = hDecoder->config.defObjectType; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = 1; if (buffer != NULL) { #if 0 int is_latm; latm_header *l = &hDecoder->latm_config; #endif faad_initbits(&ld, buffer, buffer_size); #if 0 memset(l, 0, sizeof(latm_header)); is_latm = latmCheck(l, &ld); l->inited = 0; l->frameLength = 0; faad_rewindbits(&ld); if(is_latm && l->ASCbits>0) { int32_t x; hDecoder->latm_header_present = 1; x = NeAACDecInit2(hDecoder, l->ASC, (l->ASCbits+7)/8, samplerate, channels); if(x!=0) hDecoder->latm_header_present = 0; return x; } else #endif /* Check if an ADIF header is present */ if ((buffer[0] == 'A') && (buffer[1] == 'D') && (buffer[2] == 'I') && (buffer[3] == 'F')) { hDecoder->adif_header_present = 1; get_adif_header(&adif, &ld); faad_byte_align(&ld); hDecoder->sf_index = adif.pce[0].sf_index; hDecoder->object_type = adif.pce[0].object_type + 1; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = adif.pce[0].channels; memcpy(&(hDecoder->pce), &(adif.pce[0]), sizeof(program_config)); hDecoder->pce_set = 1; bits = bit2byte(faad_get_processed_bits(&ld)); /* Check if an ADTS header is present */ } else if (faad_showbits(&ld, 12) == 0xfff) { hDecoder->adts_header_present = 1; adts.old_format = hDecoder->config.useOldADTSFormat; adts_frame(&adts, &ld); hDecoder->sf_index = adts.sf_index; hDecoder->object_type = adts.profile + 1; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = (adts.channel_configuration > 6) ? 2 : adts.channel_configuration; } if (ld.error) { faad_endbits(&ld); return -1; } faad_endbits(&ld); } if (!*samplerate) return -1; #if (defined(PS_DEC) || defined(DRM_PS)) /* check if we have a mono file */ if (*channels == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ *channels = 2; } #endif hDecoder->channelConfiguration = *channels; #ifdef SBR_DEC /* implicit signalling */ if (*samplerate <= 24000 && (hDecoder->config.dontUpSampleImplicitSBR == 0)) { *samplerate *= 2; hDecoder->forceUpSampling = 1; } else if (*samplerate > 24000 && (hDecoder->config.dontUpSampleImplicitSBR == 0)) { hDecoder->downSampledSBR = 1; } #endif /* must be done before frameLength is divided by 2 for LD */ #ifdef SSR_DEC if (hDecoder->object_type == SSR) hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); else #endif hDecoder->fb = filter_bank_init(hDecoder->frameLength); #ifdef LD_DEC if (hDecoder->object_type == LD) hDecoder->frameLength >>= 1; #endif if (can_decode_ot(hDecoder->object_type) < 0) return -1; return bits; } /* Init the library using a DecoderSpecificInfo */ char NeAACDecInit2(NeAACDecHandle hpDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; int8_t rc; mp4AudioSpecificConfig mp4ASC; if((hDecoder == NULL) || (pBuffer == NULL) || (SizeOfDecoderSpecificInfo < 2) || (samplerate == NULL) || (channels == NULL)) { return -1; } hDecoder->adif_header_present = 0; hDecoder->adts_header_present = 0; /* decode the audio specific config */ rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, &(hDecoder->pce), hDecoder->latm_header_present); /* copy the relevant info to the decoder handle */ *samplerate = mp4ASC.samplingFrequency; if (mp4ASC.channelsConfiguration) { *channels = mp4ASC.channelsConfiguration; } else { *channels = hDecoder->pce.channels; hDecoder->pce_set = 1; } #if (defined(PS_DEC) || defined(DRM_PS)) /* check if we have a mono file */ if (*channels == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ *channels = 2; } #endif hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; hDecoder->object_type = mp4ASC.objectTypeIndex; #ifdef ERROR_RESILIENCE hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; #endif #ifdef SBR_DEC hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; hDecoder->downSampledSBR = mp4ASC.downSampledSBR; if (hDecoder->config.dontUpSampleImplicitSBR == 0) hDecoder->forceUpSampling = mp4ASC.forceUpSampling; else hDecoder->forceUpSampling = 0; /* AAC core decoder samplerate is 2 times as low */ if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) { hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); } #endif if (rc != 0) { return rc; } hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; if (mp4ASC.frameLengthFlag) #ifdef ALLOW_SMALL_FRAMELENGTH hDecoder->frameLength = 960; #else return -1; #endif /* must be done before frameLength is divided by 2 for LD */ #ifdef SSR_DEC if (hDecoder->object_type == SSR) hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); else #endif hDecoder->fb = filter_bank_init(hDecoder->frameLength); #ifdef LD_DEC if (hDecoder->object_type == LD) hDecoder->frameLength >>= 1; #endif return 0; } #ifdef DRM char NeAACDecInitDRM(NeAACDecHandle *hpDecoder, unsigned long samplerate, unsigned char channels) { NeAACDecStruct** hDecoder = (NeAACDecStruct**)hpDecoder; if (hDecoder == NULL) return 1; /* error */ NeAACDecClose(*hDecoder); *hDecoder = NeAACDecOpen(); /* Special object type defined for DRM */ (*hDecoder)->config.defObjectType = DRM_ER_LC; (*hDecoder)->config.defSampleRate = samplerate; #ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */ (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */ #endif (*hDecoder)->frameLength = 960; (*hDecoder)->sf_index = get_sr_index((*hDecoder)->config.defSampleRate); (*hDecoder)->object_type = (*hDecoder)->config.defObjectType; if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO)) (*hDecoder)->channelConfiguration = 2; else (*hDecoder)->channelConfiguration = 1; #ifdef SBR_DEC if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) (*hDecoder)->sbr_present_flag = 0; else (*hDecoder)->sbr_present_flag = 1; #endif (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); return 0; } #endif void NeAACDecClose(NeAACDecHandle hpDecoder) { uint8_t i; NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder == NULL) return; #ifdef PROFILE printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); printf("requant: %I64d cycles\n", hDecoder->requant_cycles); printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); printf("output: %I64d cycles\n", hDecoder->output_cycles); #endif for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); #ifdef SSR_DEC if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); #endif #ifdef MAIN_DEC if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); #endif #ifdef LTP_DEC if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); #endif } #ifdef SSR_DEC if (hDecoder->object_type == SSR) ssr_filter_bank_end(hDecoder->fb); else #endif filter_bank_end(hDecoder->fb); drc_end(hDecoder->drc); if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); #ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { if (hDecoder->sbr[i]) sbrDecodeEnd(hDecoder->sbr[i]); } #endif if (hDecoder) faad_free(hDecoder); } void NeAACDecPostSeekReset(NeAACDecHandle hpDecoder, long frame) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder) { hDecoder->postSeekResetFlag = 1; if (frame != -1) hDecoder->frame = frame; } } static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo) { hInfo->num_front_channels = 0; hInfo->num_side_channels = 0; hInfo->num_back_channels = 0; hInfo->num_lfe_channels = 0; memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t)); if (hDecoder->downMatrix) { hInfo->num_front_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; return; } /* check if there is a PCE */ if (hDecoder->pce_set) { uint8_t i, chpos = 0; uint8_t chdir, back_center = 0; hInfo->num_front_channels = hDecoder->pce.num_front_channels; hInfo->num_side_channels = hDecoder->pce.num_side_channels; hInfo->num_back_channels = hDecoder->pce.num_back_channels; hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; chdir = hInfo->num_front_channels; if (chdir & 1) { #if (defined(PS_DEC) || defined(DRM_PS)) /* When PS is enabled output is always stereo */ hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; #else hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; chdir--; #endif } for (i = 0; i < chdir; i += 2) { hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; } for (i = 0; i < hInfo->num_side_channels; i += 2) { hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; hInfo->channel_position[chpos++] = SIDE_CHANNEL_RIGHT; } chdir = hInfo->num_back_channels; if (chdir & 1) { back_center = 1; chdir--; } for (i = 0; i < chdir; i += 2) { hInfo->channel_position[chpos++] = BACK_CHANNEL_LEFT; hInfo->channel_position[chpos++] = BACK_CHANNEL_RIGHT; } if (back_center) { hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER; } for (i = 0; i < hInfo->num_lfe_channels; i++) { hInfo->channel_position[chpos++] = LFE_CHANNEL; } } else { switch (hDecoder->channelConfiguration) { case 1: #if (defined(PS_DEC) || defined(DRM_PS)) /* When PS is enabled output is always stereo */ hInfo->num_front_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; #else hInfo->num_front_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; #endif break; case 2: hInfo->num_front_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; break; case 3: hInfo->num_front_channels = 3; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; break; case 4: hInfo->num_front_channels = 3; hInfo->num_back_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = BACK_CHANNEL_CENTER; break; case 5: hInfo->num_front_channels = 3; hInfo->num_back_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = BACK_CHANNEL_LEFT; hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; break; case 6: hInfo->num_front_channels = 3; hInfo->num_back_channels = 2; hInfo->num_lfe_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = BACK_CHANNEL_LEFT; hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; hInfo->channel_position[5] = LFE_CHANNEL; break; case 7: hInfo->num_front_channels = 3; hInfo->num_side_channels = 2; hInfo->num_back_channels = 2; hInfo->num_lfe_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = SIDE_CHANNEL_LEFT; hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT; hInfo->channel_position[5] = BACK_CHANNEL_LEFT; hInfo->channel_position[6] = BACK_CHANNEL_RIGHT; hInfo->channel_position[7] = LFE_CHANNEL; break; default: /* channelConfiguration == 0 || channelConfiguration > 7 */ { uint8_t i; uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe; if (ch & 1) /* there's either a center front or a center back channel */ { uint8_t ch1 = (ch-1)/2; if (hDecoder->first_syn_ele == ID_SCE) { hInfo->num_front_channels = ch1 + 1; hInfo->num_back_channels = ch1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; for (i = 1; i <= ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1+1; i < ch; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } } else { hInfo->num_front_channels = ch1; hInfo->num_back_channels = ch1 + 1; for (i = 0; i < ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1; i < ch-1; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; } } else { uint8_t ch1 = (ch)/2; hInfo->num_front_channels = ch1; hInfo->num_back_channels = ch1; if (ch1 & 1) { hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; for (i = 1; i <= ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1+1; i < ch-1; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; } else { for (i = 0; i < ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1; i < ch; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } } } hInfo->num_lfe_channels = hDecoder->has_lfe; for (i = ch; i < hDecoder->fr_channels; i++) { hInfo->channel_position[i] = LFE_CHANNEL; } } break; } } } void* NeAACDecDecode(NeAACDecHandle hpDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); } void* NeAACDecDecode2(NeAACDecHandle hpDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer, unsigned long sample_buffer_size) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if ((sample_buffer == NULL) || (sample_buffer_size == 0)) { hInfo->error = 27; return NULL; } return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, sample_buffer, sample_buffer_size); } #ifdef DRM #define ERROR_STATE_INIT 6 static void conceal_output(NeAACDecStruct *hDecoder, uint16_t frame_len, uint8_t out_ch, void *sample_buffer) { return; } #endif static void* aac_frame_decode(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer2, unsigned long sample_buffer_size) { uint16_t i; uint8_t channels = 0; uint8_t output_channels = 0; bitfile ld = {0}; uint32_t bitsconsumed; uint16_t frame_len; void *sample_buffer; uint32_t startbit=0, endbit=0, payload_bits=0; #ifdef PROFILE int64_t count = faad_get_ts(); #endif /* safety checks */ if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL)) { return NULL; } #if 0 printf("%d\n", buffer_size*8); #endif frame_len = hDecoder->frameLength; memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); #ifdef USE_TIME_LIMIT if ((TIME_LIMIT * get_sample_rate(hDecoder->sf_index)) > hDecoder->TL_count) { hDecoder->TL_count += 1024; } else { hInfo->error = (NUM_ERROR_MESSAGES-1); goto error; } #endif /* check for some common metadata tag types in the bitstream * No need to return an error */ /* ID3 */ if (buffer_size >= 128) { if (memcmp(buffer, "TAG", 3) == 0) { /* found it */ hInfo->bytesconsumed = 128; /* 128 bytes fixed size */ /* no error, but no output either */ return NULL; } } /* initialize the bitstream */ faad_initbits(&ld, buffer, buffer_size); #if 0 { int i; for (i = 0; i < ((buffer_size+3)>>2); i++) { uint8_t *buf; uint32_t temp = 0; buf = faad_getbitbuffer(&ld, 32); //temp = getdword((void*)buf); temp = *((uint32_t*)buf); printf("0x%.8X\n", temp); free(buf); } faad_endbits(&ld); faad_initbits(&ld, buffer, buffer_size); } #endif #if 0 if(hDecoder->latm_header_present) { payload_bits = faad_latm_frame(&hDecoder->latm_config, &ld); startbit = faad_get_processed_bits(&ld); if(payload_bits == -1U) { hInfo->error = 1; goto error; } } #endif #ifdef DRM if (hDecoder->object_type == DRM_ER_LC) { /* We do not support stereo right now */ if (0) //(hDecoder->channelConfiguration == 2) { hInfo->error = 28; // Throw CRC error goto error; } faad_getbits(&ld, 8 DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); } #endif if (hDecoder->adts_header_present) { adts_header adts; adts.old_format = hDecoder->config.useOldADTSFormat; if ((hInfo->error = adts_frame(&adts, &ld)) > 0) goto error; /* MPEG2 does byte_alignment() here, * but ADTS header is always multiple of 8 bits in MPEG2 * so not needed to actually do it. */ } #ifdef ANALYSIS dbg_count = 0; #endif /* decode the complete bitstream */ #ifdef DRM if (/*(hDecoder->object_type == 6) ||*/ (hDecoder->object_type == DRM_ER_LC)) { DRM_aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); } else { #endif raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); #ifdef DRM } #endif #if 0 if(hDecoder->latm_header_present) { endbit = faad_get_processed_bits(&ld); if(endbit-startbit > payload_bits) fprintf(stderr, "\r\nERROR, too many payload bits read: %u > %d. Please. report with a link to a sample\n", endbit-startbit, payload_bits); if(hDecoder->latm_config.otherDataLenBits > 0) faad_getbits(&ld, hDecoder->latm_config.otherDataLenBits); faad_byte_align(&ld); } #endif channels = hDecoder->fr_channels; if (hInfo->error > 0) goto error; /* safety check */ if (channels == 0 || channels > MAX_CHANNELS) { /* invalid number of channels */ hInfo->error = 12; goto error; } /* no more bit reading after this */ bitsconsumed = faad_get_processed_bits(&ld); hInfo->bytesconsumed = bit2byte(bitsconsumed); if (ld.error) { hInfo->error = 14; goto error; } faad_endbits(&ld); if (!hDecoder->adts_header_present && !hDecoder->adif_header_present #if 0 && !hDecoder->latm_header_present #endif ) { if (hDecoder->channelConfiguration == 0) hDecoder->channelConfiguration = channels; if (channels == 8) /* 7.1 */ hDecoder->channelConfiguration = 7; if (channels == 7) /* not a standard channelConfiguration */ hDecoder->channelConfiguration = 0; } if ((channels == 5 || channels == 6) && hDecoder->config.downMatrix) { hDecoder->downMatrix = 1; output_channels = 2; } else { output_channels = channels; } #if (defined(PS_DEC) || defined(DRM_PS)) hDecoder->upMatrix = 0; /* check if we have a mono file */ if (output_channels == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ hDecoder->upMatrix = 1; output_channels = 2; } #endif /* Make a channel configuration based on either a PCE or a channelConfiguration */ create_channel_config(hDecoder, hInfo); /* number of samples in this frame */ hInfo->samples = frame_len*output_channels; /* number of channels in this frame */ hInfo->channels = output_channels; /* samplerate */ hInfo->samplerate = get_sample_rate(hDecoder->sf_index); /* object type */ hInfo->object_type = hDecoder->object_type; /* sbr */ hInfo->sbr = NO_SBR; /* header type */ hInfo->header_type = RAW; if (hDecoder->adif_header_present) hInfo->header_type = ADIF; if (hDecoder->adts_header_present) hInfo->header_type = ADTS; #if 0 if (hDecoder->latm_header_present) hInfo->header_type = LATM; #endif #if (defined(PS_DEC) || defined(DRM_PS)) hInfo->ps = hDecoder->ps_used_global; #endif /* check if frame has channel elements */ if (channels == 0) { hDecoder->frame++; return NULL; } /* allocate the buffer for the final samples */ if ((hDecoder->sample_buffer == NULL) || (hDecoder->alloced_channels != output_channels)) { static const uint8_t str[] = { sizeof(int16_t), sizeof(int32_t), sizeof(int32_t), sizeof(float32_t), sizeof(double), sizeof(int16_t), sizeof(int16_t), sizeof(int16_t), sizeof(int16_t), 0, 0, 0 }; uint8_t stride = str[hDecoder->config.outputFormat-1]; #ifdef SBR_DEC if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || (hDecoder->forceUpSampling == 1)) { stride = 2 * stride; } #endif /* check if we want to use internal sample_buffer */ if (sample_buffer_size == 0) { if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); hDecoder->sample_buffer = NULL; hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); } else if (sample_buffer_size < frame_len*output_channels*stride) { /* provided sample buffer is not big enough */ hInfo->error = 27; return NULL; } hDecoder->alloced_channels = output_channels; } if (sample_buffer_size == 0) { sample_buffer = hDecoder->sample_buffer; } else { sample_buffer = *sample_buffer2; } #ifdef SBR_DEC if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) { uint8_t ele; /* this data is different when SBR is used or when the data is upsampled */ if (!hDecoder->downSampledSBR) { frame_len *= 2; hInfo->samples *= 2; hInfo->samplerate *= 2; } /* check if every element was provided with SBR data */ for (ele = 0; ele < hDecoder->fr_ch_ele; ele++) { if (hDecoder->sbr[ele] == NULL) { hInfo->error = 25; goto error; } } /* sbr */ if (hDecoder->sbr_present_flag == 1) { hInfo->object_type = HE_AAC; hInfo->sbr = SBR_UPSAMPLED; } else { hInfo->sbr = NO_SBR_UPSAMPLED; } if (hDecoder->downSampledSBR) { hInfo->sbr = SBR_DOWNSAMPLED; } } #endif sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, output_channels, frame_len, hDecoder->config.outputFormat); #ifdef DRM //conceal_output(hDecoder, frame_len, output_channels, sample_buffer); #endif hDecoder->postSeekResetFlag = 0; hDecoder->frame++; #ifdef LD_DEC if (hDecoder->object_type != LD) { #endif if (hDecoder->frame <= 1) hInfo->samples = 0; #ifdef LD_DEC } else { /* LD encoders will give lower delay */ if (hDecoder->frame <= 0) hInfo->samples = 0; } #endif /* cleanup */ #ifdef ANALYSIS fflush(stdout); #endif #ifdef PROFILE count = faad_get_ts() - count; hDecoder->cycles += count; #endif return sample_buffer; error: #ifdef DRM hDecoder->error_state = ERROR_STATE_INIT; #endif /* reset filterbank state */ for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->fb_intermed[i] != NULL) { memset(hDecoder->fb_intermed[i], 0, hDecoder->frameLength*sizeof(real_t)); } } #ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { if (hDecoder->sbr[i] != NULL) { sbrReset(hDecoder->sbr[i]); } } #endif faad_endbits(&ld); /* cleanup */ #ifdef ANALYSIS fflush(stdout); #endif return NULL; } faad2-2_10_0/libfaad/drc.c000066400000000000000000000120441374350120500152100ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: drc.c,v 1.29 2015/02/22 10:09:29 knik Exp $ **/ #include "common.h" #include "structs.h" #include #include #include "syntax.h" #include "drc.h" drc_info *drc_init(real_t cut, real_t boost) { drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info)); memset(drc, 0, sizeof(drc_info)); drc->ctrl1 = cut; drc->ctrl2 = boost; drc->num_bands = 1; drc->band_top[0] = 1024/4 - 1; drc->dyn_rng_sgn[0] = 1; drc->dyn_rng_ctl[0] = 0; return drc; } void drc_end(drc_info *drc) { if (drc) faad_free(drc); } #ifdef FIXED_POINT static real_t drc_pow2_table[] = { COEF_CONST(0.5146511183), COEF_CONST(0.5297315472), COEF_CONST(0.5452538663), COEF_CONST(0.5612310242), COEF_CONST(0.5776763484), COEF_CONST(0.5946035575), COEF_CONST(0.6120267717), COEF_CONST(0.6299605249), COEF_CONST(0.6484197773), COEF_CONST(0.6674199271), COEF_CONST(0.6869768237), COEF_CONST(0.7071067812), COEF_CONST(0.7278265914), COEF_CONST(0.7491535384), COEF_CONST(0.7711054127), COEF_CONST(0.7937005260), COEF_CONST(0.8169577266), COEF_CONST(0.8408964153), COEF_CONST(0.8655365610), COEF_CONST(0.8908987181), COEF_CONST(0.9170040432), COEF_CONST(0.9438743127), COEF_CONST(0.9715319412), COEF_CONST(1.0000000000), COEF_CONST(1.0293022366), COEF_CONST(1.0594630944), COEF_CONST(1.0905077327), COEF_CONST(1.1224620483), COEF_CONST(1.1553526969), COEF_CONST(1.1892071150), COEF_CONST(1.2240535433), COEF_CONST(1.2599210499), COEF_CONST(1.2968395547), COEF_CONST(1.3348398542), COEF_CONST(1.3739536475), COEF_CONST(1.4142135624), COEF_CONST(1.4556531828), COEF_CONST(1.4983070769), COEF_CONST(1.5422108254), COEF_CONST(1.5874010520), COEF_CONST(1.6339154532), COEF_CONST(1.6817928305), COEF_CONST(1.7310731220), COEF_CONST(1.7817974363), COEF_CONST(1.8340080864), COEF_CONST(1.8877486254), COEF_CONST(1.9430638823) }; #endif void drc_decode(drc_info *drc, real_t *spec) { uint16_t i, bd, top; #ifdef FIXED_POINT int32_t exp, frac; #else real_t factor, exp; #endif uint16_t bottom = 0; if (drc->num_bands == 1) drc->band_top[0] = 1024/4 - 1; for (bd = 0; bd < drc->num_bands; bd++) { top = 4 * (drc->band_top[bd] + 1); #ifndef FIXED_POINT /* Decode DRC gain factor */ if (drc->dyn_rng_sgn[bd]) /* compress */ exp = ((-drc->ctrl1 * drc->dyn_rng_ctl[bd]) - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); else /* boost */ exp = ((drc->ctrl2 * drc->dyn_rng_ctl[bd]) - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); factor = (real_t)pow(2.0, exp); /* Apply gain factor */ for (i = bottom; i < top; i++) spec[i] *= factor; #else /* Decode DRC gain factor */ if (drc->dyn_rng_sgn[bd]) /* compress */ { exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; } else { /* boost */ exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; } /* Apply gain factor */ if (exp < 0) { for (i = bottom; i < top; i++) { spec[i] >>= -exp; if (frac) spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); } } else { for (i = bottom; i < top; i++) { spec[i] <<= exp; if (frac) spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); } } #endif bottom = top; } } faad2-2_10_0/libfaad/drc.h000066400000000000000000000030441374350120500152150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: drc.h,v 1.22 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __DRC_H__ #define __DRC_H__ #ifdef __cplusplus extern "C" { #endif #define DRC_REF_LEVEL 20*4 /* -20 dB */ drc_info *drc_init(real_t cut, real_t boost); void drc_end(drc_info *drc); void drc_decode(drc_info *drc, real_t *spec); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/drm_dec.c000066400000000000000000001357661374350120500160560ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $ **/ #include #include #include #include #include "common.h" #ifdef DRM #include "sbr_dec.h" #include "drm_dec.h" #include "bits.h" /* constants */ #define DECAY_CUTOFF 3 #define DECAY_SLOPE 0.05f /* type definitaions */ typedef const int8_t (*drm_ps_huff_tab)[2]; /* binary search huffman tables */ static const int8_t f_huffman_sa[][2] = { { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 1x */ { /*7*/ -8, 4 }, /* index 2: 3 bits: 10x */ { 5, 6 }, /* index 3: 3 bits: 11x */ { /*1*/ -14, /*-1*/ -16 }, /* index 4: 4 bits: 101x */ { /*-2*/ -17, 7 }, /* index 5: 4 bits: 110x */ { 8, 9 }, /* index 6: 4 bits: 111x */ { /*2*/ -13, /*-3*/ -18 }, /* index 7: 5 bits: 1101x */ { /*3*/ -12, 10 }, /* index 8: 5 bits: 1110x */ { 11, 12 }, /* index 9: 5 bits: 1111x */ { /*4*/ -11, /*5*/ -10 }, /* index 10: 6 bits: 11101x */ { /*-4*/ -19, /*-5*/ -20 }, /* index 11: 6 bits: 11110x */ { /*6*/ -9, 13 }, /* index 12: 6 bits: 11111x */ { /*-7*/ -22, /*-6*/ -21 } /* index 13: 7 bits: 111111x */ }; static const int8_t t_huffman_sa[][2] = { { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 1x */ { /*-1*/ -16, /*1*/ -14 }, /* index 2: 3 bits: 10x */ { 4, 5 }, /* index 3: 3 bits: 11x */ { /*-2*/ -17, /*2*/ -13 }, /* index 4: 4 bits: 110x */ { 6, 7 }, /* index 5: 4 bits: 111x */ { /*-3*/ -18, /*3*/ -12 }, /* index 6: 5 bits: 1110x */ { 8, 9 }, /* index 7: 5 bits: 1111x */ { /*-4*/ -19, /*4*/ -11 }, /* index 8: 6 bits: 11110x */ { 10, 11 }, /* index 9: 6 bits: 11111x */ { /*-5*/ -20, /*5*/ -10 }, /* index 10: 7 bits: 111110x */ { /*-6*/ -21, 12 }, /* index 11: 7 bits: 111111x */ { /*-7*/ -22, 13 }, /* index 12: 8 bits: 1111111x */ { /*6*/ -9, /*7*/ -8 } /* index 13: 9 bits: 11111111x */ }; static const int8_t f_huffman_pan[][2] = { { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ { 4, 5 }, /* index 3: 4 bits: 111x */ { /*-2*/ -17, /*2*/ -13 }, /* index 4: 5 bits: 1110x */ { 6, 7 }, /* index 5: 5 bits: 1111x */ { /*-3*/ -18, /*3*/ -12 }, /* index 6: 6 bits: 11110x */ { 8, 9 }, /* index 7: 6 bits: 11111x */ { /*-4*/ -19, /*4*/ -11 }, /* index 8: 7 bits: 111110x */ { 10, 11 }, /* index 9: 7 bits: 111111x */ { /*-5*/ -20, /*5*/ -10 }, /* index 10: 8 bits: 1111110x */ { 12, 13 }, /* index 11: 8 bits: 1111111x */ { /*-6*/ -21, /*6*/ -9 }, /* index 12: 9 bits: 11111110x */ { /*-7*/ -22, 14 }, /* index 13: 9 bits: 11111111x */ { /*7*/ -8, 15 }, /* index 14: 10 bits: 111111111x */ { 16, 17 }, /* index 15: 11 bits: 1111111111x */ { /*-8*/ -23, /*8*/ -7 }, /* index 16: 12 bits: 11111111110x */ { 18, 19 }, /* index 17: 12 bits: 11111111111x */ { /*-10*/ -25, 20 }, /* index 18: 13 bits: 111111111110x */ { 21, 22 }, /* index 19: 13 bits: 111111111111x */ { /*-9*/ -24, /*9*/ -6 }, /* index 20: 14 bits: 1111111111101x */ { /*10*/ -5, 23 }, /* index 21: 14 bits: 1111111111110x */ { 24, 25 }, /* index 22: 14 bits: 1111111111111x */ { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */ { /*11*/ -4, /*13*/ -2 }, /* index 24: 15 bits: 11111111111110x */ { 26, 27 }, /* index 25: 15 bits: 11111111111111x */ { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */ { /*12*/ -3, /*14*/ -1 } /* index 27: 16 bits: 111111111111111x */ }; static const int8_t t_huffman_pan[][2] = { { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ { /*-2*/ -17, 4 }, /* index 3: 4 bits: 111x */ { /*2*/ -13, 5 }, /* index 4: 5 bits: 1111x */ { /*-3*/ -18, 6 }, /* index 5: 6 bits: 11111x */ { /*3*/ -12, 7 }, /* index 6: 7 bits: 111111x */ { /*-4*/ -19, 8 }, /* index 7: 8 bits: 1111111x */ { /*4*/ -11, 9 }, /* index 8: 9 bits: 11111111x */ { 10, 11 }, /* index 9: 10 bits: 111111111x */ { /*-5*/ -20, /*5*/ -10 }, /* index 10: 11 bits: 1111111110x */ { 12, 13 }, /* index 11: 11 bits: 1111111111x */ { /*-6*/ -21, /*6*/ -9 }, /* index 12: 12 bits: 11111111110x */ { 14, 15 }, /* index 13: 12 bits: 11111111111x */ { /*-7*/ -22, /*7*/ -8 }, /* index 14: 13 bits: 111111111110x */ { 16, 17 }, /* index 15: 13 bits: 111111111111x */ { /*-8*/ -23, /*8*/ -7 }, /* index 16: 14 bits: 1111111111110x */ { 18, 19 }, /* index 17: 14 bits: 1111111111111x */ { /*-10*/ -25, /*10*/ -5 }, /* index 18: 15 bits: 11111111111110x */ { 20, 21 }, /* index 19: 15 bits: 11111111111111x */ { /*-9*/ -24, /*9*/ -6 }, /* index 20: 16 bits: 111111111111110x */ { 22, 23 }, /* index 21: 16 bits: 111111111111111x */ { 24, 25 }, /* index 22: 17 bits: 1111111111111110x */ { 26, 27 }, /* index 23: 17 bits: 1111111111111111x */ { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */ { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */ { /*11*/ -4, /*12*/ -3 }, /* index 26: 18 bits: 11111111111111110x */ { /*13*/ -2, /*14*/ -1 } /* index 27: 18 bits: 11111111111111111x */ }; /* There are 3 classes in the standard but the last 2 are identical */ static const real_t sa_quant[8][2] = { { FRAC_CONST(0.0000), FRAC_CONST(0.0000) }, { FRAC_CONST(0.0501), FRAC_CONST(0.1778) }, { FRAC_CONST(0.0706), FRAC_CONST(0.2818) }, { FRAC_CONST(0.0995), FRAC_CONST(0.4467) }, { FRAC_CONST(0.1399), FRAC_CONST(0.5623) }, { FRAC_CONST(0.1957), FRAC_CONST(0.7079) }, { FRAC_CONST(0.2713), FRAC_CONST(0.8913) }, { FRAC_CONST(0.3699), FRAC_CONST(1.0000) }, }; /* We don't need the actual quantizer values */ #if 0 static const real_t pan_quant[8][5] = { { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) }, { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) }, { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) }, { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) }, { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) }, { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) }, { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) }, { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) }, }; #endif /* 2^(pan_quant[x][y] */ static const real_t pan_pow_2_pos[8][5] = { { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) }, { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) }, { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) }, { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) }, { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) }, { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) }, { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) }, { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) } }; /* 2^(-pan_quant[x][y] */ static const real_t pan_pow_2_neg[8][5] = { { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) }, { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) }, { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) }, { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) }, { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) }, { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) }, { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) }, { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) } }; /* 2^(pan_quant[x][y]/30) */ static const real_t pan_pow_2_30_pos[8][5] = { { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) }, { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) }, { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) }, { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) }, { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) }, { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) }, { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) } }; /* 2^(-pan_quant[x][y]/30) */ static const real_t pan_pow_2_30_neg[8][5] = { { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) }, { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) }, { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) }, { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) }, { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) }, { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) }, { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) } }; static const real_t g_decayslope[MAX_SA_BAND] = { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8), FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5), FRAC_CONST(0.45), FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1), FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0) }; static const real_t sa_sqrt_1_minus[8][2] = { { FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) }, { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) }, { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) }, { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) }, { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) }, { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) }, { FRAC_CONST(0.929071574), FRAC_CONST(0) } }; static const uint8_t sa_freq_scale[9] = { 0, 1, 2, 3, 5, 7, 10, 13, 23 }; static const uint8_t pan_freq_scale[21] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 18, 22, 26, 32, 64 }; static const uint8_t pan_quant_class[20] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4 }; /* Inverse mapping lookup */ static const uint8_t pan_inv_freq[64] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 }; static const uint8_t sa_inv_freq[MAX_SA_BAND] = { 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7 }; static const real_t filter_coeff[] = { FRAC_CONST(0.65143905754106), FRAC_CONST(0.56471812200776), FRAC_CONST(0.48954165955695) }; static const uint8_t delay_length[3] = { 3, 4, 5 }; static const real_t delay_fraction[] = { FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) }; static const real_t peak_decay = FRAC_CONST(0.76592833836465); static const real_t smooth_coeff = FRAC_CONST(0.25); /* Please note that these are the same tables as in plain PS */ static const complex_t Q_Fract_allpass_Qmf[][3] = { { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } }; static const complex_t Phi_Fract_Qmf[] = { { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } }; /* static function declarations */ static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld); static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld); static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff); uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld) { uint16_t bits = (uint16_t)faad_get_processed_bits(ld); ps->drm_ps_data_available = 1; ps->bs_enable_sa = faad_get1bit(ld); ps->bs_enable_pan = faad_get1bit(ld); if (ps->bs_enable_sa) { drm_ps_sa_element(ps, ld); } if (ps->bs_enable_pan) { drm_ps_pan_element(ps, ld); } bits = (uint16_t)faad_get_processed_bits(ld) - bits; return bits; } static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld) { drm_ps_huff_tab huff; uint8_t band; ps->bs_sa_dt_flag = faad_get1bit(ld); if (ps->bs_sa_dt_flag) { huff = t_huffman_sa; } else { huff = f_huffman_sa; } for (band = 0; band < DRM_NUM_SA_BANDS; band++) { ps->bs_sa_data[band] = huff_dec(ld, huff); } } static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld) { drm_ps_huff_tab huff; uint8_t band; ps->bs_pan_dt_flag = faad_get1bit(ld); if (ps->bs_pan_dt_flag) { huff = t_huffman_pan; } else { huff = f_huffman_pan; } for (band = 0; band < DRM_NUM_PAN_BANDS; band++) { ps->bs_pan_data[band] = huff_dec(ld, huff); } } /* binary search huffman decoding */ static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff) { uint8_t bit; int16_t index = 0; while (index >= 0) { bit = (uint8_t)faad_get1bit(ld); index = huff[index][bit]; } return index + 15; } static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i) { if (i < 0) { /* printf(" SAminclip %d", i); */ ps->sa_decode_error = 1; return 0; } else if (i > 7) { /* printf(" SAmaxclip %d", i); */ ps->sa_decode_error = 1; return 7; } else return i; } static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i) { if (i < -7) { /* printf(" PANminclip %d", i); */ ps->pan_decode_error = 1; return -7; } else if (i > 7) { /* printf(" PANmaxclip %d", i); */ ps->pan_decode_error = 1; return 7; } else return i; } static void drm_ps_delta_decode(drm_ps_info *ps) { uint8_t band; if (ps->bs_enable_sa) { if (ps->bs_sa_dt_flag && !ps->g_last_had_sa) { /* wait until we get a DT frame */ ps->bs_enable_sa = 0; } else if (ps->bs_sa_dt_flag) { /* DT frame, we have a last frame, so we can decode */ ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]); } else { /* DF always decodable */ ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]); } for (band = 1; band < DRM_NUM_SA_BANDS; band++) { if (ps->bs_sa_dt_flag && ps->g_last_had_sa) { ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]); } else if (!ps->bs_sa_dt_flag) { ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]); } } } /* An error during SA decoding implies PAN data will be undecodable, too */ /* Also, we don't like on/off switching in PS, so we force to last settings */ if (ps->sa_decode_error) { ps->pan_decode_error = 1; ps->bs_enable_pan = ps->g_last_had_pan; ps->bs_enable_sa = ps->g_last_had_sa; } if (ps->bs_enable_sa) { if (ps->sa_decode_error) { for (band = 0; band < DRM_NUM_SA_BANDS; band++) { ps->g_sa_index[band] = ps->g_last_good_sa_index[band]; } } else { for (band = 0; band < DRM_NUM_SA_BANDS; band++) { ps->g_last_good_sa_index[band] = ps->g_sa_index[band]; } } } if (ps->bs_enable_pan) { if (ps->bs_pan_dt_flag && !ps->g_last_had_pan) { ps->bs_enable_pan = 0; } else if (ps->bs_pan_dt_flag) { ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]); } else { ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]); } for (band = 1; band < DRM_NUM_PAN_BANDS; band++) { if (ps->bs_pan_dt_flag && ps->g_last_had_pan) { ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]); } else if (!ps->bs_pan_dt_flag) { ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]); } } if (ps->pan_decode_error) { for (band = 0; band < DRM_NUM_PAN_BANDS; band++) { ps->g_pan_index[band] = ps->g_last_good_pan_index[band]; } } else { for (band = 0; band < DRM_NUM_PAN_BANDS; band++) { ps->g_last_good_pan_index[band] = ps->g_pan_index[band]; } } } } static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64]) { uint8_t s, b, k; complex_t qfrac, tmp0, tmp, in, R0; real_t peakdiff; real_t nrg; real_t power; real_t transratio; real_t new_delay_slopes[NUM_OF_LINKS]; uint8_t temp_delay_ser[NUM_OF_LINKS]; complex_t Phi_Fract; #ifdef FIXED_POINT uint32_t in_re, in_im; #endif for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) { /* set delay indices */ for (k = 0; k < NUM_OF_LINKS; k++) temp_delay_ser[k] = ps->delay_buf_index_ser[k]; RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { const real_t gamma = REAL_CONST(1.5); const real_t sigma = REAL_CONST(1.5625); RE(in) = QMF_RE(X[s][b]); IM(in) = QMF_IM(X[s][b]); #ifdef FIXED_POINT /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF * meaning that P will be scaled by 2^(-10) compared to floating point version */ in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); power = in_re*in_re + in_im*in_im; #else power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); #endif ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay); if (ps->peakdecay_fast[b] < power) ps->peakdecay_fast[b] = power; peakdiff = ps->prev_peakdiff[b]; peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff); ps->prev_peakdiff[b] = peakdiff; nrg = ps->prev_nrg[b]; nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff); ps->prev_nrg[b] = nrg; if (MUL_R(peakdiff, gamma) <= nrg) { transratio = sigma; } else { transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); } for (k = 0; k < NUM_OF_LINKS; k++) { new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); } RE(tmp0) = RE(ps->d_buff[0][b]); IM(tmp0) = IM(ps->d_buff[0][b]); RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); RE(ps->d_buff[1][b]) = RE(in); IM(ps->d_buff[1][b]) = IM(in); ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); RE(R0) = RE(tmp); IM(R0) = IM(tmp); for (k = 0; k < NUM_OF_LINKS; k++) { RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); RE(R0) = RE(tmp); IM(R0) = IM(tmp); } QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); for (k = 0; k < NUM_OF_LINKS; k++) { if (++temp_delay_ser[k] >= delay_length[k]) temp_delay_ser[k] = 0; } } } for (k = 0; k < NUM_OF_LINKS; k++) ps->delay_buf_index_ser[k] = temp_delay_ser[k]; } static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { uint8_t s, b, ifreq, qclass; real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; real_t new_dir_map, new_sa_map; if (ps->bs_enable_sa) { /* Instead of dequantization and mapping, we use an inverse mapping to look up all the values we need */ for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) { const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); ifreq = sa_inv_freq[b]; qclass = (b != 0); sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); } for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) { QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); sa_map[b] += k_sa_map[b]; sa_dir_map[b] += k_sa_dir_map[b]; } for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++) { QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); } } } else { for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) { QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); } } } } static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { uint8_t s, b, qclass, ifreq; real_t tmp, coeff1, coeff2; real_t pan_base[MAX_PAN_BAND]; real_t pan_delta[MAX_PAN_BAND]; qmf_t temp_l, temp_r; if (ps->bs_enable_pan) { for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) { /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an inverse mapping 64->20 and look up the 2^G(x,y) values directly */ ifreq = pan_inv_freq[b]; qclass = pan_quant_class[ifreq]; if (ps->g_prev_pan_index[ifreq] >= 0) { pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; } else { pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; } /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ /* a en b can be negative so we may need to inverse parts */ if (ps->g_pan_index[ifreq] >= 0) { if (ps->g_prev_pan_index[ifreq] >= 0) { pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); } else { pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); } } else { if (ps->g_prev_pan_index[ifreq] >= 0) { pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); } else { pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); } } } for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { /* PAN always uses all 64 channels */ for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) { tmp = pan_base[b]; coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); coeff1 = MUL_R(coeff2, tmp); QMF_RE(temp_l) = QMF_RE(X_left[s][b]); QMF_IM(temp_l) = QMF_IM(X_left[s][b]); QMF_RE(temp_r) = QMF_RE(X_right[s][b]); QMF_IM(temp_r) = QMF_IM(X_right[s][b]); QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ /* ^^^^^^^^^^^^^^^ k times */ pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); } } } } drm_ps_info *drm_ps_init(void) { drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info)); memset(ps, 0, sizeof(drm_ps_info)); return ps; } void drm_ps_free(drm_ps_info *ps) { faad_free(ps); } /* main DRM PS decoding function */ uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]) { if (ps == NULL) { memcpy(X_right, X_left, sizeof(qmf_t)*30*64); return 0; } if (!ps->drm_ps_data_available && !guess) { memcpy(X_right, X_left, sizeof(qmf_t)*30*64); memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index)); memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index)); return 0; } /* if SBR CRC doesn't match out, we can assume decode errors to start with, and we'll guess what the parameters should be */ if (!guess) { ps->sa_decode_error = 0; ps->pan_decode_error = 0; drm_ps_delta_decode(ps); } else { ps->sa_decode_error = 1; ps->pan_decode_error = 1; /* don't even bother decoding */ } ps->drm_ps_data_available = 0; drm_calc_sa_side_signal(ps, X_left); drm_add_ambiance(ps, X_left, X_right); if (ps->bs_enable_sa) { ps->g_last_had_sa = 1; memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS); } else { ps->g_last_had_sa = 0; } if (ps->bs_enable_pan) { drm_add_pan(ps, X_left, X_right); ps->g_last_had_pan = 1; memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS); } else { ps->g_last_had_pan = 0; } return 0; } #endif faad2-2_10_0/libfaad/drm_dec.h000066400000000000000000000056021374350120500160440ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: drm_dec.h,v 1.8 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __DRM_DEC_H__ #define __DRM_DEC_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #define DRM_PARAMETRIC_STEREO 0 #define DRM_NUM_SA_BANDS 8 #define DRM_NUM_PAN_BANDS 20 #define NUM_OF_LINKS 3 #define NUM_OF_QMF_CHANNELS 64 #define NUM_OF_SUBSAMPLES 30 #define MAX_SA_BAND 46 #define MAX_PAN_BAND 64 #define MAX_DELAY 5 typedef struct { uint8_t drm_ps_data_available; uint8_t bs_enable_sa; uint8_t bs_enable_pan; uint8_t bs_sa_dt_flag; uint8_t bs_pan_dt_flag; uint8_t g_last_had_sa; uint8_t g_last_had_pan; int8_t bs_sa_data[DRM_NUM_SA_BANDS]; int8_t bs_pan_data[DRM_NUM_PAN_BANDS]; int8_t g_sa_index[DRM_NUM_SA_BANDS]; int8_t g_pan_index[DRM_NUM_PAN_BANDS]; int8_t g_prev_sa_index[DRM_NUM_SA_BANDS]; int8_t g_prev_pan_index[DRM_NUM_PAN_BANDS]; int8_t sa_decode_error; int8_t pan_decode_error; int8_t g_last_good_sa_index[DRM_NUM_SA_BANDS]; int8_t g_last_good_pan_index[DRM_NUM_PAN_BANDS]; qmf_t SA[NUM_OF_SUBSAMPLES][MAX_SA_BAND]; complex_t d_buff[2][MAX_SA_BAND]; complex_t d2_buff[NUM_OF_LINKS][MAX_DELAY][MAX_SA_BAND]; uint8_t delay_buf_index_ser[NUM_OF_LINKS]; real_t prev_nrg[MAX_SA_BAND]; real_t prev_peakdiff[MAX_SA_BAND]; real_t peakdecay_fast[MAX_SA_BAND]; } drm_ps_info; uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld); drm_ps_info *drm_ps_init(void); void drm_ps_free(drm_ps_info *ps); uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/error.c000066400000000000000000000054041374350120500155730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: error.c,v 1.33 2008/09/19 23:31:39 menno Exp $ **/ #include "common.h" #include "error.h" char *err_msg[] = { "No error", "Gain control not yet implemented", "Pulse coding not allowed in short blocks", "Invalid huffman codebook", "Scalefactor out of range", "Unable to find ADTS syncword", "Channel coupling not yet implemented", "Channel configuration not allowed in error resilient frame", "Bit error in error resilient scalefactor decoding", "Error decoding huffman scalefactor (bitstream error)", "Error decoding huffman codeword (bitstream error)", "Non existent huffman codebook number found", "Invalid number of channels", "Maximum number of bitstream elements exceeded", "Input data buffer too small", "Array index out of range", "Maximum number of scalefactor bands exceeded", "Quantised value out of range", "LTP lag out of range", "Invalid SBR parameter decoded", "SBR called without being initialised", "Unexpected channel configuration change", "Error in program_config_element", "First SBR frame is not the same as first AAC frame", "Unexpected fill element with SBR data", "Not all elements were provided with SBR data", "LTP decoding not available", "Output data buffer too small", "CRC error in DRM data", "PNS not allowed in DRM data stream", "No standard extension payload allowed in DRM", "PCE shall be the first element in a frame", "Bitstream value not allowed by specification", "MAIN prediction not initialised" }; faad2-2_10_0/libfaad/error.h000066400000000000000000000026741374350120500156060ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: error.h,v 1.27 2008/09/19 23:31:40 menno Exp $ **/ #ifndef __ERROR_H__ #define __ERROR_H__ #ifdef __cplusplus extern "C" { #endif #define NUM_ERROR_MESSAGES 34 extern char *err_msg[]; #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/faad2.pc.in000066400000000000000000000003501374350120500161770ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: FAAD2 Description: Freeware Advanced Audio (AAC) Decoder Version: @VERSION@ Libs: -L${libdir} -lfaad Libs.private: -lm Cflags: -I${includedir} faad2-2_10_0/libfaad/filtbank.c000066400000000000000000000330601374350120500162330ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: filtbank.c,v 1.46 2009/01/26 23:51:15 menno Exp $ **/ #include "common.h" #include "structs.h" #include #include #ifdef _WIN32_WCE #define assert(x) #else #include #endif #include "filtbank.h" #include "syntax.h" #include "kbd_win.h" #include "sine_win.h" #include "mdct.h" fb_info *filter_bank_init(uint16_t frame_len) { uint16_t nshort = frame_len/8; #ifdef LD_DEC uint16_t frame_len_ld = frame_len/2; #endif fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); memset(fb, 0, sizeof(fb_info)); /* normal */ fb->mdct256 = faad_mdct_init(2*nshort); fb->mdct2048 = faad_mdct_init(2*frame_len); #ifdef LD_DEC /* LD */ fb->mdct1024 = faad_mdct_init(2*frame_len_ld); #endif #ifdef ALLOW_SMALL_FRAMELENGTH if (frame_len == 1024) { #endif fb->long_window[0] = sine_long_1024; fb->short_window[0] = sine_short_128; fb->long_window[1] = kbd_long_1024; fb->short_window[1] = kbd_short_128; #ifdef LD_DEC fb->ld_window[0] = sine_mid_512; fb->ld_window[1] = ld_mid_512; #endif #ifdef ALLOW_SMALL_FRAMELENGTH } else /* (frame_len == 960) */ { fb->long_window[0] = sine_long_960; fb->short_window[0] = sine_short_120; fb->long_window[1] = kbd_long_960; fb->short_window[1] = kbd_short_120; #ifdef LD_DEC fb->ld_window[0] = sine_mid_480; fb->ld_window[1] = ld_mid_480; #endif } #endif return fb; } void filter_bank_end(fb_info *fb) { if (fb != NULL) { #ifdef PROFILE printf("FB: %I64d cycles\n", fb->cycles); #endif faad_mdct_end(fb->mdct256); faad_mdct_end(fb->mdct2048); #ifdef LD_DEC faad_mdct_end(fb->mdct1024); #endif faad_free(fb); } } static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { #ifdef LD_DEC mdct_info *mdct = NULL; switch (len) { case 2048: case 1920: mdct = fb->mdct2048; break; case 1024: case 960: mdct = fb->mdct1024; break; } faad_imdct(mdct, in_data, out_data); #else faad_imdct(fb->mdct2048, in_data, out_data); #endif } #ifdef LTP_DEC static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { mdct_info *mdct = NULL; switch (len) { case 2048: case 1920: mdct = fb->mdct2048; break; case 256: case 240: mdct = fb->mdct256; break; #ifdef LD_DEC case 1024: case 960: mdct = fb->mdct1024; break; #endif } faad_mdct(mdct, in_data, out_data); } #endif void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, uint8_t object_type, uint16_t frame_len) { int16_t i; ALIGN real_t transf_buf[2*1024] = {0}; const real_t *window_long = NULL; const real_t *window_long_prev = NULL; const real_t *window_short = NULL; const real_t *window_short_prev = NULL; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; uint16_t trans = nshort/2; uint16_t nflat_ls = (nlong-nshort)/2; #ifdef PROFILE int64_t count = faad_get_ts(); #endif /* select windows of current frame and previous frame (Sine or KBD) */ #ifdef LD_DEC if (object_type == LD) { window_long = fb->ld_window[window_shape]; window_long_prev = fb->ld_window[window_shape_prev]; } else { #endif window_long = fb->long_window[window_shape]; window_long_prev = fb->long_window[window_shape_prev]; window_short = fb->short_window[window_shape]; window_short_prev = fb->short_window[window_shape_prev]; #ifdef LD_DEC } #endif #if 0 for (i = 0; i < 1024; i++) { printf("%d\n", freq_in[i]); } #endif #if 0 printf("%d %d\n", window_sequence, window_shape); #endif switch (window_sequence) { case ONLY_LONG_SEQUENCE: /* perform iMDCT */ imdct_long(fb, freq_in, transf_buf, 2*nlong); /* add second half output of previous frame to windowed output of current frame */ for (i = 0; i < nlong; i+=4) { time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); } /* window the second half and save as overlap for next frame */ for (i = 0; i < nlong; i+=4) { overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); overlap[i+1] = MUL_F(transf_buf[nlong+i+1],window_long[nlong-2-i]); overlap[i+2] = MUL_F(transf_buf[nlong+i+2],window_long[nlong-3-i]); overlap[i+3] = MUL_F(transf_buf[nlong+i+3],window_long[nlong-4-i]); } break; case LONG_START_SEQUENCE: /* perform iMDCT */ imdct_long(fb, freq_in, transf_buf, 2*nlong); /* add second half output of previous frame to windowed output of current frame */ for (i = 0; i < nlong; i+=4) { time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); } /* window the second half and save as overlap for next frame */ /* construct second half window using padding with 1's and 0's */ for (i = 0; i < nflat_ls; i++) overlap[i] = transf_buf[nlong+i]; for (i = 0; i < nshort; i++) overlap[nflat_ls+i] = MUL_F(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); for (i = 0; i < nflat_ls; i++) overlap[nflat_ls+nshort+i] = 0; break; case EIGHT_SHORT_SEQUENCE: /* perform iMDCT for each short block */ faad_imdct(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0); faad_imdct(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1); faad_imdct(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2); faad_imdct(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3); faad_imdct(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4); faad_imdct(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5); faad_imdct(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6); faad_imdct(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7); /* add second half output of previous frame to windowed output of current frame */ for (i = 0; i < nflat_ls; i++) time_out[i] = overlap[i]; for(i = 0; i < nshort; i++) { time_out[nflat_ls+ i] = overlap[nflat_ls+ i] + MUL_F(transf_buf[nshort*0+i],window_short_prev[i]); time_out[nflat_ls+1*nshort+i] = overlap[nflat_ls+nshort*1+i] + MUL_F(transf_buf[nshort*1+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*2+i],window_short[i]); time_out[nflat_ls+2*nshort+i] = overlap[nflat_ls+nshort*2+i] + MUL_F(transf_buf[nshort*3+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*4+i],window_short[i]); time_out[nflat_ls+3*nshort+i] = overlap[nflat_ls+nshort*3+i] + MUL_F(transf_buf[nshort*5+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*6+i],window_short[i]); if (i < trans) time_out[nflat_ls+4*nshort+i] = overlap[nflat_ls+nshort*4+i] + MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); } /* window the second half and save as overlap for next frame */ for(i = 0; i < nshort; i++) { if (i >= trans) overlap[nflat_ls+4*nshort+i-nlong] = MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); overlap[nflat_ls+5*nshort+i-nlong] = MUL_F(transf_buf[nshort*9+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*10+i],window_short[i]); overlap[nflat_ls+6*nshort+i-nlong] = MUL_F(transf_buf[nshort*11+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*12+i],window_short[i]); overlap[nflat_ls+7*nshort+i-nlong] = MUL_F(transf_buf[nshort*13+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*14+i],window_short[i]); overlap[nflat_ls+8*nshort+i-nlong] = MUL_F(transf_buf[nshort*15+i],window_short[nshort-1-i]); } for (i = 0; i < nflat_ls; i++) overlap[nflat_ls+nshort+i] = 0; break; case LONG_STOP_SEQUENCE: /* perform iMDCT */ imdct_long(fb, freq_in, transf_buf, 2*nlong); /* add second half output of previous frame to windowed output of current frame */ /* construct first half window using padding with 1's and 0's */ for (i = 0; i < nflat_ls; i++) time_out[i] = overlap[i]; for (i = 0; i < nshort; i++) time_out[nflat_ls+i] = overlap[nflat_ls+i] + MUL_F(transf_buf[nflat_ls+i],window_short_prev[i]); for (i = 0; i < nflat_ls; i++) time_out[nflat_ls+nshort+i] = overlap[nflat_ls+nshort+i] + transf_buf[nflat_ls+nshort+i]; /* window the second half and save as overlap for next frame */ for (i = 0; i < nlong; i++) overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); break; } #if 0 for (i = 0; i < 1024; i++) { printf("%d\n", time_out[i]); //printf("0x%.8X\n", time_out[i]); } #endif #ifdef PROFILE count = faad_get_ts() - count; fb->cycles += count; #endif } #ifdef LTP_DEC /* only works for LTP -> no overlapping, no short blocks */ void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, uint8_t object_type, uint16_t frame_len) { int16_t i; ALIGN real_t windowed_buf[2*1024] = {0}; const real_t *window_long = NULL; const real_t *window_long_prev = NULL; const real_t *window_short = NULL; const real_t *window_short_prev = NULL; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; uint16_t nflat_ls = (nlong-nshort)/2; assert(window_sequence != EIGHT_SHORT_SEQUENCE); #ifdef LD_DEC if (object_type == LD) { window_long = fb->ld_window[window_shape]; window_long_prev = fb->ld_window[window_shape_prev]; } else { #endif window_long = fb->long_window[window_shape]; window_long_prev = fb->long_window[window_shape_prev]; window_short = fb->short_window[window_shape]; window_short_prev = fb->short_window[window_shape_prev]; #ifdef LD_DEC } #endif switch(window_sequence) { case ONLY_LONG_SEQUENCE: for (i = nlong-1; i >= 0; i--) { windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); } mdct(fb, windowed_buf, out_mdct, 2*nlong); break; case LONG_START_SEQUENCE: for (i = 0; i < nlong; i++) windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); for (i = 0; i < nflat_ls; i++) windowed_buf[i+nlong] = in_data[i+nlong]; for (i = 0; i < nshort; i++) windowed_buf[i+nlong+nflat_ls] = MUL_F(in_data[i+nlong+nflat_ls], window_short[nshort-1-i]); for (i = 0; i < nflat_ls; i++) windowed_buf[i+nlong+nflat_ls+nshort] = 0; mdct(fb, windowed_buf, out_mdct, 2*nlong); break; case LONG_STOP_SEQUENCE: for (i = 0; i < nflat_ls; i++) windowed_buf[i] = 0; for (i = 0; i < nshort; i++) windowed_buf[i+nflat_ls] = MUL_F(in_data[i+nflat_ls], window_short_prev[i]); for (i = 0; i < nflat_ls; i++) windowed_buf[i+nflat_ls+nshort] = in_data[i+nflat_ls+nshort]; for (i = 0; i < nlong; i++) windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); mdct(fb, windowed_buf, out_mdct, 2*nlong); break; } } #endif faad2-2_10_0/libfaad/filtbank.h000066400000000000000000000041031374350120500162340ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: filtbank.h,v 1.27 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __FILTBANK_H__ #define __FILTBANK_H__ #ifdef __cplusplus extern "C" { #endif fb_info *filter_bank_init(uint16_t frame_len); void filter_bank_end(fb_info *fb); #ifdef LTP_DEC void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, uint8_t object_type, uint16_t frame_len); #endif void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, uint8_t object_type, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/fixed.h000066400000000000000000000177721374350120500155610ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: fixed.h,v 1.32 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __FIXED_H__ #define __FIXED_H__ #ifdef __cplusplus extern "C" { #endif #if defined(_WIN32_WCE) && defined(_ARM_) #include #endif #define COEF_BITS 28 #define COEF_PRECISION (1 << COEF_BITS) #define REAL_BITS 14 // MAXIMUM OF 14 FOR FIXED POINT SBR #define REAL_PRECISION (1 << REAL_BITS) /* FRAC is the fractional only part of the fixed point number [0.0..1.0) */ #define FRAC_SIZE 32 /* frac is a 32 bit integer */ #define FRAC_BITS 31 #define FRAC_PRECISION ((uint32_t)(1 << FRAC_BITS)) #define FRAC_MAX 0x7FFFFFFF typedef int32_t real_t; #define REAL_CONST(A) (((A) >= 0) ? ((real_t)((A)*(REAL_PRECISION)+0.5)) : ((real_t)((A)*(REAL_PRECISION)-0.5))) #define COEF_CONST(A) (((A) >= 0) ? ((real_t)((A)*(COEF_PRECISION)+0.5)) : ((real_t)((A)*(COEF_PRECISION)-0.5))) #define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5)))) //#define FRAC_CONST(A) (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5))) #define Q2_BITS 22 #define Q2_PRECISION (1 << Q2_BITS) #define Q2_CONST(A) (((A) >= 0) ? ((real_t)((A)*(Q2_PRECISION)+0.5)) : ((real_t)((A)*(Q2_PRECISION)-0.5))) #if defined(_WIN32) && !defined(_WIN32_WCE) /* multiply with real shift */ static INLINE real_t MUL_R(real_t A, real_t B) { _asm { mov eax,A imul B shrd eax,edx,REAL_BITS } } /* multiply with coef shift */ static INLINE real_t MUL_C(real_t A, real_t B) { _asm { mov eax,A imul B shrd eax,edx,COEF_BITS } } static INLINE real_t MUL_Q2(real_t A, real_t B) { _asm { mov eax,A imul B shrd eax,edx,Q2_BITS } } static INLINE real_t MUL_SHIFT6(real_t A, real_t B) { _asm { mov eax,A imul B shrd eax,edx,6 } } static INLINE real_t MUL_SHIFT23(real_t A, real_t B) { _asm { mov eax,A imul B shrd eax,edx,23 } } #if 1 static INLINE real_t _MulHigh(real_t A, real_t B) { _asm { mov eax,A imul B mov eax,edx } } /* multiply with fractional shift */ static INLINE real_t MUL_F(real_t A, real_t B) { return _MulHigh(A,B) << (FRAC_SIZE-FRAC_BITS); } /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); } #else static INLINE real_t MUL_F(real_t A, real_t B) { _asm { mov eax,A imul B shrd eax,edx,FRAC_BITS } } /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } #endif #elif defined(__GNUC__) && defined (__arm__) /* taken from MAD */ #define arm_mul(x, y, SCALEBITS) \ ({ \ uint32_t __hi; \ uint32_t __lo; \ uint32_t __result; \ asm("smull %0, %1, %3, %4\n\t" \ "movs %0, %0, lsr %5\n\t" \ "adc %2, %0, %1, lsl %6" \ : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ : "%r" (x), "r" (y), \ "M" (SCALEBITS), "M" (32 - (SCALEBITS)) \ : "cc"); \ __result; \ }) static INLINE real_t MUL_R(real_t A, real_t B) { return arm_mul(A, B, REAL_BITS); } static INLINE real_t MUL_C(real_t A, real_t B) { return arm_mul(A, B, COEF_BITS); } static INLINE real_t MUL_Q2(real_t A, real_t B) { return arm_mul(A, B, Q2_BITS); } static INLINE real_t MUL_SHIFT6(real_t A, real_t B) { return arm_mul(A, B, 6); } static INLINE real_t MUL_SHIFT23(real_t A, real_t B) { return arm_mul(A, B, 23); } static INLINE real_t _MulHigh(real_t x, real_t y) { uint32_t __lo; uint32_t __hi; asm("smull\t%0, %1, %2, %3" : "=&r"(__lo),"=&r"(__hi) : "%r"(x),"r"(y) : "cc"); return __hi; } static INLINE real_t MUL_F(real_t A, real_t B) { return _MulHigh(A, B) << (FRAC_SIZE-FRAC_BITS); } /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { int32_t tmp, yt1, yt2; asm("smull %0, %1, %4, %6\n\t" "smlal %0, %1, %5, %7\n\t" "rsb %3, %4, #0\n\t" "smull %0, %2, %5, %6\n\t" "smlal %0, %2, %3, %7" : "=&r" (tmp), "=&r" (yt1), "=&r" (yt2), "=r" (x1) : "3" (x1), "r" (x2), "r" (c1), "r" (c2) : "cc" ); *y1 = yt1 << (FRAC_SIZE-FRAC_BITS); *y2 = yt2 << (FRAC_SIZE-FRAC_BITS); } #else /* multiply with real shift */ #define MUL_R(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (REAL_BITS-1))) >> REAL_BITS) /* multiply with coef shift */ #define MUL_C(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (COEF_BITS-1))) >> COEF_BITS) /* multiply with fractional shift */ #if defined(_WIN32_WCE) && defined(_ARM_) /* eVC for PocketPC has an intrinsic function that returns only the high 32 bits of a 32x32 bit multiply */ static INLINE real_t MUL_F(real_t A, real_t B) { return _MulHigh(A,B) << (32-FRAC_BITS); } #else #ifdef __BFIN__ #define _MulHigh(X,Y) ({ int __xxo; \ asm ( \ "a1 = %2.H * %1.L (IS,M);\n\t" \ "a0 = %1.H * %2.H, a1+= %1.H * %2.L (IS,M);\n\t"\ "a1 = a1 >>> 16;\n\t" \ "%0 = (a0 += a1);\n\t" \ : "=d" (__xxo) : "d" (X), "d" (Y) : "A0","A1"); __xxo; }) #define MUL_F(X,Y) ({ int __xxo; \ asm ( \ "a1 = %2.H * %1.L (M);\n\t" \ "a0 = %1.H * %2.H, a1+= %1.H * %2.L (M);\n\t" \ "a1 = a1 >>> 16;\n\t" \ "%0 = (a0 += a1);\n\t" \ : "=d" (__xxo) : "d" (X), "d" (Y) : "A0","A1"); __xxo; }) #else #define _MulHigh(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_SIZE-1))) >> FRAC_SIZE) #define MUL_F(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_BITS-1))) >> FRAC_BITS) #endif #endif #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); } #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/hcr.c000066400000000000000000000365021374350120500152210ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: hcr.c,v 1.26 2009/01/26 23:51:15 menno Exp $ **/ #include "common.h" #include "structs.h" #include #include #include "specrec.h" #include "huffman.h" /* ISO/IEC 14496-3/Amd.1 * 8.5.3.3: Huffman Codeword Reordering for AAC spectral data (HCR) * * HCR devides the spectral data in known fixed size segments, and * sorts it by the importance of the data. The importance is firstly * the (lower) position in the spectrum, and secondly the largest * value in the used codebook. * The most important data is written at the start of each segment * (at known positions), the remaining data is interleaved inbetween, * with the writing direction alternating. * Data length is not increased. */ #ifdef ERROR_RESILIENCE /* 8.5.3.3.1 Pre-sorting */ #define NUM_CB 6 #define NUM_CB_ER 22 #define MAX_CB 32 #define VCB11_FIRST 16 #define VCB11_LAST 31 static const uint8_t PreSortCB_STD[NUM_CB] = { 11, 9, 7, 5, 3, 1}; static const uint8_t PreSortCB_ER[NUM_CB_ER] = { 11, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 9, 7, 5, 3, 1}; /* 8.5.3.3.2 Derivation of segment width */ static const uint8_t maxCwLen[MAX_CB] = {0, 11, 9, 20, 16, 13, 11, 14, 12, 17, 14, 49, 0, 0, 0, 0, 14, 17, 21, 21, 25, 25, 29, 29, 29, 29, 33, 33, 33, 37, 37, 41}; #define segmentWidth(cb) min(maxCwLen[cb], ics->length_of_longest_codeword) /* bit-twiddling helpers */ static const uint8_t S[] = {1, 2, 4, 8, 16}; static const uint32_t B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF}; typedef struct { uint8_t cb; uint8_t decoded; uint16_t sp_offset; bits_t bits; } codeword_t; /* rewind and reverse */ /* 32 bit version */ static uint32_t rewrev_word(uint32_t v, const uint8_t len) { /* 32 bit reverse */ v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); /* shift off low bits */ v >>= (32 - len); return v; } /* 64 bit version */ static void rewrev_lword(uint32_t *hi, uint32_t *lo, const uint8_t len) { if (len <= 32) { *hi = 0; *lo = rewrev_word(*lo, len); } else { uint32_t t = *hi, v = *lo; /* double 32 bit reverse */ v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); t = ((t >> S[0]) & B[0]) | ((t << S[0]) & ~B[0]); v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); t = ((t >> S[1]) & B[1]) | ((t << S[1]) & ~B[1]); v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); t = ((t >> S[2]) & B[2]) | ((t << S[2]) & ~B[2]); v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); t = ((t >> S[3]) & B[3]) | ((t << S[3]) & ~B[3]); v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); t = ((t >> S[4]) & B[4]) | ((t << S[4]) & ~B[4]); /* last 32<>32 bit swap is implicit below */ /* shift off low bits (this is really only one 64 bit shift) */ *lo = (t >> (64 - len)) | (v << (len - 32)); *hi = v >> (64 - len); } } /* bits_t version */ static void rewrev_bits(bits_t *bits) { if (bits->len == 0) return; rewrev_lword(&bits->bufb, &bits->bufa, bits->len); } /* merge bits of a to b */ static void concat_bits(bits_t *b, bits_t *a) { uint32_t bl, bh, al, ah; if (a->len == 0) return; al = a->bufa; ah = a->bufb; if (b->len > 32) { /* maskoff superfluous high b bits */ bl = b->bufa; bh = b->bufb & ((1 << (b->len-32)) - 1); /* left shift a b->len bits */ ah = al << (b->len - 32); al = 0; } else { bl = b->bufa & ((1 << (b->len)) - 1); bh = 0; ah = (ah << (b->len)) | (al >> (32 - b->len)); al = al << b->len; } /* merge */ b->bufa = bl | al; b->bufb = bh | ah; b->len += a->len; } static uint8_t is_good_cb(uint8_t this_CB, uint8_t this_sec_CB) { /* only want spectral data CB's */ if ((this_sec_CB > ZERO_HCB && this_sec_CB <= ESC_HCB) || (this_sec_CB >= VCB11_FIRST && this_sec_CB <= VCB11_LAST)) { if (this_CB < ESC_HCB) { /* normal codebook pairs */ return ((this_sec_CB == this_CB) || (this_sec_CB == this_CB + 1)); } else { /* escape codebook */ return (this_sec_CB == this_CB); } } return 0; } static void read_segment(bits_t *segment, uint8_t segwidth, bitfile *ld) { segment->len = segwidth; if (segwidth > 32) { segment->bufb = faad_getbits(ld, segwidth - 32); segment->bufa = faad_getbits(ld, 32); } else { segment->bufa = faad_getbits(ld, segwidth); segment->bufb = 0; } } static void fill_in_codeword(codeword_t *codeword, uint16_t index, uint16_t sp, uint8_t cb) { codeword[index].sp_offset = sp; codeword[index].cb = cb; codeword[index].decoded = 0; codeword[index].bits.len = 0; } uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, int16_t *spectral_data) { uint16_t PCWs_done; uint16_t numberOfSegments, numberOfSets, numberOfCodewords; codeword_t codeword[512]; bits_t segment[512]; uint16_t sp_offset[8]; uint16_t g, i, sortloop, set, bitsread; /*uint16_t bitsleft, codewordsleft*/; uint8_t w_idx, sfb, this_CB, last_CB, this_sec_CB; const uint16_t nshort = hDecoder->frameLength/8; const uint16_t sp_data_len = ics->length_of_reordered_spectral_data; const uint8_t *PreSortCb; /* no data (e.g. silence) */ if (sp_data_len == 0) return 0; /* since there is spectral data, at least one codeword has nonzero length */ if (ics->length_of_longest_codeword == 0) return 10; if (sp_data_len < ics->length_of_longest_codeword) return 10; sp_offset[0] = 0; for (g = 1; g < ics->num_window_groups; g++) { sp_offset[g] = sp_offset[g-1] + nshort*ics->window_group_length[g-1]; } PCWs_done = 0; numberOfSegments = 0; numberOfCodewords = 0; bitsread = 0; /* VCB11 code books in use */ if (hDecoder->aacSectionDataResilienceFlag) { PreSortCb = PreSortCB_ER; last_CB = NUM_CB_ER; } else { PreSortCb = PreSortCB_STD; last_CB = NUM_CB; } /* step 1: decode PCW's (set 0), and stuff data in easier-to-use format */ for (sortloop = 0; sortloop < last_CB; sortloop++) { /* select codebook to process this pass */ this_CB = PreSortCb[sortloop]; /* loop over sfbs */ for (sfb = 0; sfb < ics->max_sfb; sfb++) { /* loop over all in this sfb, 4 lines per loop */ for (w_idx = 0; 4*w_idx < (min(ics->swb_offset[sfb+1], ics->swb_offset_max) - ics->swb_offset[sfb]); w_idx++) { for(g = 0; g < ics->num_window_groups; g++) { for (i = 0; i < ics->num_sec[g]; i++) { /* check whether sfb used here is the one we want to process */ if ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) { /* check whether codebook used here is the one we want to process */ this_sec_CB = ics->sect_cb[g][i]; if (is_good_cb(this_CB, this_sec_CB)) { /* precalculate some stuff */ uint16_t sect_sfb_size = ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb]; uint8_t inc = (this_sec_CB < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; uint16_t group_cws_count = (4*ics->window_group_length[g])/inc; uint8_t segwidth = segmentWidth(this_sec_CB); uint16_t cws; /* read codewords until end of sfb or end of window group (shouldn't only 1 trigger?) */ for (cws = 0; (cws < group_cws_count) && ((cws + w_idx*group_cws_count) < sect_sfb_size); cws++) { uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc * (cws + w_idx*group_cws_count); /* read and decode PCW */ if (!PCWs_done) { /* read in normal segments */ if (bitsread + segwidth <= sp_data_len) { read_segment(&segment[numberOfSegments], segwidth, ld); bitsread += segwidth; huffman_spectral_data_2(this_sec_CB, &segment[numberOfSegments], &spectral_data[sp]); /* keep leftover bits */ rewrev_bits(&segment[numberOfSegments]); numberOfSegments++; } else { /* remaining stuff after last segment, we unfortunately couldn't read this in earlier because it might not fit in 64 bits. since we already decoded (and removed) the PCW it is now guaranteed to fit */ if (bitsread < sp_data_len) { const uint8_t additional_bits = sp_data_len - bitsread; read_segment(&segment[numberOfSegments], additional_bits, ld); segment[numberOfSegments].len += segment[numberOfSegments-1].len; rewrev_bits(&segment[numberOfSegments]); if (segment[numberOfSegments-1].len > 32) { segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb + showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len - 32); segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + showbits_hcr(&segment[numberOfSegments-1], 32); } else { segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len); segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb; } segment[numberOfSegments-1].len += additional_bits; } bitsread = sp_data_len; PCWs_done = 1; fill_in_codeword(codeword, 0, sp, this_sec_CB); } } else { fill_in_codeword(codeword, numberOfCodewords - numberOfSegments, sp, this_sec_CB); } numberOfCodewords++; } } } } } } } } if (numberOfSegments == 0) return 10; numberOfSets = numberOfCodewords / numberOfSegments; /* step 2: decode nonPCWs */ for (set = 1; set <= numberOfSets; set++) { uint16_t trial; for (trial = 0; trial < numberOfSegments; trial++) { uint16_t codewordBase; for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) { const uint16_t segment_idx = (trial + codewordBase) % numberOfSegments; const uint16_t codeword_idx = codewordBase + set*numberOfSegments - numberOfSegments; /* data up */ if (codeword_idx >= numberOfCodewords - numberOfSegments) break; if (!codeword[codeword_idx].decoded && segment[segment_idx].len > 0) { uint8_t tmplen; if (codeword[codeword_idx].bits.len != 0) concat_bits(&segment[segment_idx], &codeword[codeword_idx].bits); tmplen = segment[segment_idx].len; if (huffman_spectral_data_2(codeword[codeword_idx].cb, &segment[segment_idx], &spectral_data[codeword[codeword_idx].sp_offset]) >= 0) { codeword[codeword_idx].decoded = 1; } else { codeword[codeword_idx].bits = segment[segment_idx]; codeword[codeword_idx].bits.len = tmplen; } } } } for (i = 0; i < numberOfSegments; i++) rewrev_bits(&segment[i]); } #if 0 // Seems to give false errors bitsleft = 0; for (i = 0; i < numberOfSegments && !bitsleft; i++) bitsleft += segment[i].len; if (bitsleft) return 10; codewordsleft = 0; for (i = 0; (i < numberOfCodewords - numberOfSegments) && (!codewordsleft); i++) if (!codeword[i].decoded) codewordsleft++; if (codewordsleft) return 10; #endif return 0; } #endif faad2-2_10_0/libfaad/huffman.c000066400000000000000000000364741374350120500161010ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: huffman.c,v 1.26 2007/11/01 12:33:30 menno Exp $ **/ #include "common.h" #include "structs.h" #include #ifdef ANALYSIS #include #endif #include "bits.h" #include "huffman.h" #include "codebook/hcb.h" /* static function declarations */ static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); static INLINE uint8_t huffman_getescape(bitfile *ld, int16_t *sp); static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); static int16_t huffman_codebook(uint8_t i); static void vcb11_check_LAV(uint8_t cb, int16_t *sp); int8_t huffman_scale_factor(bitfile *ld) { uint16_t offset = 0; while (hcb_sf[offset][1]) { uint8_t b = faad_get1bit(ld DEBUGVAR(1,255,"huffman_scale_factor()")); offset += hcb_sf[offset][b]; if (offset > 240) { /* printf("ERROR: offset into hcb_sf = %d >240!\n", offset); */ return -1; } } return hcb_sf[offset][0]; } hcb *hcb_table[] = { 0, hcb1_1, hcb2_1, 0, hcb4_1, 0, hcb6_1, 0, hcb8_1, 0, hcb10_1, hcb11_1 }; hcb_2_quad *hcb_2_quad_table[] = { 0, hcb1_2, hcb2_2, 0, hcb4_2, 0, 0, 0, 0, 0, 0, 0 }; hcb_2_pair *hcb_2_pair_table[] = { 0, 0, 0, 0, 0, 0, hcb6_2, 0, hcb8_2, 0, hcb10_2, hcb11_2 }; hcb_bin_pair *hcb_bin_table[] = { 0, 0, 0, 0, 0, hcb5, 0, hcb7, 0, hcb9, 0, 0 }; uint8_t hcbN[] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5 }; /* defines whether a huffman codebook is unsigned or not */ /* Table 4.6.2 */ uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }; int hcb_2_quad_table_size[] = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 }; int hcb_2_pair_table_size[] = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 }; int hcb_bin_table_size[] = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 }; static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len) { uint8_t i; for (i = 0; i < len; i++) { if(sp[i]) { if(faad_get1bit(ld DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1) { sp[i] = -sp[i]; } } } } static INLINE uint8_t huffman_getescape(bitfile *ld, int16_t *sp) { uint8_t neg, i; int16_t j; int16_t off; int16_t x = *sp; if (x < 0) { if (x != -16) return 0; neg = 1; } else { if (x != 16) return 0; neg = 0; } for (i = 4; i < 16; i++) { if (faad_get1bit(ld DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0) { break; } } if (i >= 16) return 10; off = (int16_t)faad_getbits(ld, i DEBUGVAR(1,9,"huffman_getescape(): escape")); j = off | (1< hcb_2_quad_table_size[cb]) { /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset, hcb_2_quad_table_size[cb]); */ return 10; } sp[0] = hcb_2_quad_table[cb][offset].x; sp[1] = hcb_2_quad_table[cb][offset].y; sp[2] = hcb_2_quad_table[cb][offset].v; sp[3] = hcb_2_quad_table[cb][offset].w; return 0; } static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) { uint8_t err = huffman_2step_quad(cb, ld, sp); huffman_sign_bits(ld, sp, QUAD_LEN); return err; } static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp) { uint32_t cw; uint16_t offset = 0; uint8_t extra_bits; cw = faad_showbits(ld, hcbN[cb]); offset = hcb_table[cb][cw].offset; extra_bits = hcb_table[cb][cw].extra_bits; if (extra_bits) { /* we know for sure it's more than hcbN[cb] bits long */ faad_flushbits(ld, hcbN[cb]); offset += (uint16_t)faad_showbits(ld, extra_bits); faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]); } else { faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits); } if (offset > hcb_2_pair_table_size[cb]) { /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset, hcb_2_pair_table_size[cb]); */ return 10; } sp[0] = hcb_2_pair_table[cb][offset].x; sp[1] = hcb_2_pair_table[cb][offset].y; return 0; } static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) { uint8_t err = huffman_2step_pair(cb, ld, sp); huffman_sign_bits(ld, sp, PAIR_LEN); return err; } static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp) { uint16_t offset = 0; while (!hcb3[offset].is_leaf) { uint8_t b = faad_get1bit(ld DEBUGVAR(1,255,"huffman_spectral_data():3")); offset += hcb3[offset].data[b]; } if (offset > hcb_bin_table_size[cb]) { /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, hcb_bin_table_size[cb]); */ return 10; } sp[0] = hcb3[offset].data[0]; sp[1] = hcb3[offset].data[1]; sp[2] = hcb3[offset].data[2]; sp[3] = hcb3[offset].data[3]; return 0; } static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) { uint8_t err = huffman_binary_quad(cb, ld, sp); huffman_sign_bits(ld, sp, QUAD_LEN); return err; } static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp) { uint16_t offset = 0; while (!hcb_bin_table[cb][offset].is_leaf) { uint8_t b = faad_get1bit(ld DEBUGVAR(1,255,"huffman_spectral_data():9")); offset += hcb_bin_table[cb][offset].data[b]; } if (offset > hcb_bin_table_size[cb]) { /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, hcb_bin_table_size[cb]); */ return 10; } sp[0] = hcb_bin_table[cb][offset].data[0]; sp[1] = hcb_bin_table[cb][offset].data[1]; return 0; } static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) { uint8_t err = huffman_binary_pair(cb, ld, sp); huffman_sign_bits(ld, sp, PAIR_LEN); return err; } static int16_t huffman_codebook(uint8_t i) { static const uint32_t data = 16428320; if (i == 0) return (int16_t)(data >> 16) & 0xFFFF; else return (int16_t)data & 0xFFFF; } static void vcb11_check_LAV(uint8_t cb, int16_t *sp) { static const uint16_t vcb11_LAV_tab[] = { 16, 31, 47, 63, 95, 127, 159, 191, 223, 255, 319, 383, 511, 767, 1023, 2047 }; uint16_t max = 0; if (cb < 16 || cb > 31) return; max = vcb11_LAV_tab[cb - 16]; if ((abs(sp[0]) > max) || (abs(sp[1]) > max)) { sp[0] = 0; sp[1] = 0; } } uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp) { switch (cb) { case 1: /* 2-step method for data quadruples */ case 2: return huffman_2step_quad(cb, ld, sp); case 3: /* binary search for data quadruples */ return huffman_binary_quad_sign(cb, ld, sp); case 4: /* 2-step method for data quadruples */ return huffman_2step_quad_sign(cb, ld, sp); case 5: /* binary search for data pairs */ return huffman_binary_pair(cb, ld, sp); case 6: /* 2-step method for data pairs */ return huffman_2step_pair(cb, ld, sp); case 7: /* binary search for data pairs */ case 9: return huffman_binary_pair_sign(cb, ld, sp); case 8: /* 2-step method for data pairs */ case 10: return huffman_2step_pair_sign(cb, ld, sp); case 12: { uint8_t err = huffman_2step_pair(11, ld, sp); sp[0] = huffman_codebook(0); sp[1] = huffman_codebook(1); return err; } case 11: { uint8_t err = huffman_2step_pair_sign(11, ld, sp); if (!err) err = huffman_getescape(ld, &sp[0]); if (!err) err = huffman_getescape(ld, &sp[1]); return err; } #ifdef ERROR_RESILIENCE /* VCB11 uses codebook 11 */ case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: { uint8_t err = huffman_2step_pair_sign(11, ld, sp); if (!err) err = huffman_getescape(ld, &sp[0]); if (!err) err = huffman_getescape(ld, &sp[1]); /* check LAV (Largest Absolute Value) */ /* this finds errors in the ESCAPE signal */ vcb11_check_LAV(cb, sp); return err; } #endif default: /* Non existent codebook number, something went wrong */ return 11; } return 0; } #ifdef ERROR_RESILIENCE /* Special version of huffman_spectral_data Will not read from a bitfile but a bits_t structure. Will keep track of the bits decoded and return the number of bits remaining. Do not read more than ld->len, return -1 if codeword would be longer */ int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp) { uint32_t cw; uint16_t offset = 0; uint8_t extra_bits; uint8_t i, vcb11 = 0; switch (cb) { case 1: /* 2-step method for data quadruples */ case 2: case 4: cw = showbits_hcr(ld, hcbN[cb]); offset = hcb_table[cb][cw].offset; extra_bits = hcb_table[cb][cw].extra_bits; if (extra_bits) { /* we know for sure it's more than hcbN[cb] bits long */ if ( flushbits_hcr(ld, hcbN[cb]) ) return -1; offset += (uint16_t)showbits_hcr(ld, extra_bits); if ( flushbits_hcr(ld, hcb_2_quad_table[cb][offset].bits - hcbN[cb]) ) return -1; } else { if ( flushbits_hcr(ld, hcb_2_quad_table[cb][offset].bits) ) return -1; } sp[0] = hcb_2_quad_table[cb][offset].x; sp[1] = hcb_2_quad_table[cb][offset].y; sp[2] = hcb_2_quad_table[cb][offset].v; sp[3] = hcb_2_quad_table[cb][offset].w; break; case 6: /* 2-step method for data pairs */ case 8: case 10: case 11: /* VCB11 uses codebook 11 */ case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: if (cb >= 16) { /* store the virtual codebook */ vcb11 = cb; cb = 11; } cw = showbits_hcr(ld, hcbN[cb]); offset = hcb_table[cb][cw].offset; extra_bits = hcb_table[cb][cw].extra_bits; if (extra_bits) { /* we know for sure it's more than hcbN[cb] bits long */ if ( flushbits_hcr(ld, hcbN[cb]) ) return -1; offset += (uint16_t)showbits_hcr(ld, extra_bits); if ( flushbits_hcr(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]) ) return -1; } else { if ( flushbits_hcr(ld, hcb_2_pair_table[cb][offset].bits) ) return -1; } sp[0] = hcb_2_pair_table[cb][offset].x; sp[1] = hcb_2_pair_table[cb][offset].y; break; case 3: /* binary search for data quadruples */ while (!hcb3[offset].is_leaf) { uint8_t b; if ( get1bit_hcr(ld, &b) ) return -1; offset += hcb3[offset].data[b]; } sp[0] = hcb3[offset].data[0]; sp[1] = hcb3[offset].data[1]; sp[2] = hcb3[offset].data[2]; sp[3] = hcb3[offset].data[3]; break; case 5: /* binary search for data pairs */ case 7: case 9: while (!hcb_bin_table[cb][offset].is_leaf) { uint8_t b; if (get1bit_hcr(ld, &b) ) return -1; offset += hcb_bin_table[cb][offset].data[b]; } sp[0] = hcb_bin_table[cb][offset].data[0]; sp[1] = hcb_bin_table[cb][offset].data[1]; break; } /* decode sign bits */ if (unsigned_cb[cb]) { for(i = 0; i < ((cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN); i++) { if(sp[i]) { uint8_t b; if ( get1bit_hcr(ld, &b) ) return -1; if (b != 0) { sp[i] = -sp[i]; } } } } /* decode huffman escape bits */ if ((cb == ESC_HCB) || (cb >= 16)) { uint8_t k; for (k = 0; k < 2; k++) { if ((sp[k] == 16) || (sp[k] == -16)) { uint8_t neg, i; int32_t j; uint32_t off; neg = (sp[k] < 0) ? 1 : 0; for (i = 4; ; i++) { uint8_t b; if (get1bit_hcr(ld, &b)) return -1; if (b == 0) break; } if (getbits_hcr(ld, i, &off)) return -1; j = off + (1<len; } #endif faad2-2_10_0/libfaad/huffman.h000066400000000000000000000031371374350120500160740ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: huffman.h,v 1.28 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __HUFFMAN_H__ #define __HUFFMAN_H__ #ifdef __cplusplus extern "C" { #endif int8_t huffman_scale_factor(bitfile *ld); uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp); #ifdef ERROR_RESILIENCE int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp); #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ic_predict.c000066400000000000000000000153361374350120500165540ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ic_predict.c,v 1.28 2007/11/01 12:33:31 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef MAIN_DEC #include "syntax.h" #include "ic_predict.h" #include "pns.h" static void flt_round(float32_t *pf) { int32_t flg; uint32_t tmp, tmp1, tmp2; tmp = *(uint32_t*)pf; flg = tmp & (uint32_t)0x00008000; tmp &= (uint32_t)0xffff0000; tmp1 = tmp; /* round 1/2 lsb toward infinity */ if (flg) { tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ tmp |= (uint32_t)0x00010000; /* insert 1 lsb */ tmp2 = tmp; /* add 1 lsb and elided one */ tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp; } else { *pf = *(float32_t*)&tmp; } } static int16_t quant_pred(float32_t x) { int16_t q; uint32_t *tmp = (uint32_t*)&x; q = (int16_t)(*tmp>>16); return q; } static float32_t inv_quant_pred(int16_t q) { float32_t x; uint32_t *tmp = (uint32_t*)&x; *tmp = ((uint32_t)q)<<16; return x; } static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred) { uint16_t tmp; int16_t i, j; real_t dr1; float32_t predictedvalue; real_t e0, e1; real_t k1, k2; real_t r[2]; real_t COR[2]; real_t VAR[2]; r[0] = inv_quant_pred(state->r[0]); r[1] = inv_quant_pred(state->r[1]); COR[0] = inv_quant_pred(state->COR[0]); COR[1] = inv_quant_pred(state->COR[1]); VAR[0] = inv_quant_pred(state->VAR[0]); VAR[1] = inv_quant_pred(state->VAR[1]); #if 1 tmp = state->VAR[0]; j = (tmp >> 7); i = tmp & 0x7f; if (j >= 128) { j -= 128; k1 = COR[0] * exp_table[j] * mnt_table[i]; } else { k1 = REAL_CONST(0); } #else { #define B 0.953125 real_t c = COR[0]; real_t v = VAR[0]; float32_t tmp; if (c == 0 || v <= 1) { k1 = 0; } else { tmp = B / v; flt_round(&tmp); k1 = c * tmp; } } #endif if (pred) { #if 1 tmp = state->VAR[1]; j = (tmp >> 7); i = tmp & 0x7f; if (j >= 128) { j -= 128; k2 = COR[1] * exp_table[j] * mnt_table[i]; } else { k2 = REAL_CONST(0); } #else #define B 0.953125 real_t c = COR[1]; real_t v = VAR[1]; float32_t tmp; if (c == 0 || v <= 1) { k2 = 0; } else { tmp = B / v; flt_round(&tmp); k2 = c * tmp; } #endif predictedvalue = k1*r[0] + k2*r[1]; flt_round(&predictedvalue); *output = input + predictedvalue; } /* calculate new state data */ e0 = *output; e1 = e0 - k1*r[0]; dr1 = k1*e0; VAR[0] = ALPHA*VAR[0] + 0.5f * (r[0]*r[0] + e0*e0); COR[0] = ALPHA*COR[0] + r[0]*e0; VAR[1] = ALPHA*VAR[1] + 0.5f * (r[1]*r[1] + e1*e1); COR[1] = ALPHA*COR[1] + r[1]*e1; r[1] = A * (r[0]-dr1); r[0] = A * e0; state->r[0] = quant_pred(r[0]); state->r[1] = quant_pred(r[1]); state->COR[0] = quant_pred(COR[0]); state->COR[1] = quant_pred(COR[1]); state->VAR[0] = quant_pred(VAR[0]); state->VAR[1] = quant_pred(VAR[1]); } static void reset_pred_state(pred_state *state) { state->r[0] = 0; state->r[1] = 0; state->COR[0] = 0; state->COR[1] = 0; state->VAR[0] = 0x3F80; state->VAR[1] = 0x3F80; } void pns_reset_pred_state(ic_stream *ics, pred_state *state) { uint8_t sfb, g, b; uint16_t i, offs, offs2; /* prediction only for long blocks */ if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) return; for (g = 0; g < ics->num_window_groups; g++) { for (b = 0; b < ics->window_group_length[g]; b++) { for (sfb = 0; sfb < ics->max_sfb; sfb++) { if (is_noise(ics, g, sfb)) { offs = ics->swb_offset[sfb]; offs2 = min(ics->swb_offset[sfb+1], ics->swb_offset_max); for (i = offs; i < offs2; i++) reset_pred_state(&state[i]); } } } } } void reset_all_predictors(pred_state *state, uint16_t frame_len) { uint16_t i; for (i = 0; i < frame_len; i++) reset_pred_state(&state[i]); } /* intra channel prediction */ void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, uint16_t frame_len, uint8_t sf_index) { uint8_t sfb; uint16_t bin; if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { reset_all_predictors(state, frame_len); } else { for (sfb = 0; sfb < max_pred_sfb(sf_index); sfb++) { uint16_t low = ics->swb_offset[sfb]; uint16_t high = min(ics->swb_offset[sfb+1], ics->swb_offset_max); for (bin = low; bin < high; bin++) { ic_predict(&state[bin], spec[bin], &spec[bin], (ics->predictor_data_present && ics->pred.prediction_used[sfb])); } } if (ics->predictor_data_present) { if (ics->pred.predictor_reset) { for (bin = ics->pred.predictor_reset_group_number - 1; bin < frame_len; bin += 30) { reset_pred_state(&state[bin]); } } } } } #endif faad2-2_10_0/libfaad/ic_predict.h000066400000000000000000000341161374350120500165560ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ic_predict.h,v 1.23 2007/11/01 12:33:31 menno Exp $ **/ #ifdef MAIN_DEC #ifndef __IC_PREDICT_H__ #define __IC_PREDICT_H__ #ifdef __cplusplus extern "C" { #endif #define ALPHA REAL_CONST(0.90625) #define A REAL_CONST(0.953125) void pns_reset_pred_state(ic_stream *ics, pred_state *state); void reset_all_predictors(pred_state *state, uint16_t frame_len); void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, uint16_t frame_len, uint8_t sf_index); ALIGN static const real_t mnt_table[128] = { COEF_CONST(0.9531250000), COEF_CONST(0.9453125000), COEF_CONST(0.9375000000), COEF_CONST(0.9296875000), COEF_CONST(0.9257812500), COEF_CONST(0.9179687500), COEF_CONST(0.9101562500), COEF_CONST(0.9023437500), COEF_CONST(0.8984375000), COEF_CONST(0.8906250000), COEF_CONST(0.8828125000), COEF_CONST(0.8789062500), COEF_CONST(0.8710937500), COEF_CONST(0.8671875000), COEF_CONST(0.8593750000), COEF_CONST(0.8515625000), COEF_CONST(0.8476562500), COEF_CONST(0.8398437500), COEF_CONST(0.8359375000), COEF_CONST(0.8281250000), COEF_CONST(0.8242187500), COEF_CONST(0.8203125000), COEF_CONST(0.8125000000), COEF_CONST(0.8085937500), COEF_CONST(0.8007812500), COEF_CONST(0.7968750000), COEF_CONST(0.7929687500), COEF_CONST(0.7851562500), COEF_CONST(0.7812500000), COEF_CONST(0.7773437500), COEF_CONST(0.7734375000), COEF_CONST(0.7656250000), COEF_CONST(0.7617187500), COEF_CONST(0.7578125000), COEF_CONST(0.7539062500), COEF_CONST(0.7500000000), COEF_CONST(0.7421875000), COEF_CONST(0.7382812500), COEF_CONST(0.7343750000), COEF_CONST(0.7304687500), COEF_CONST(0.7265625000), COEF_CONST(0.7226562500), COEF_CONST(0.7187500000), COEF_CONST(0.7148437500), COEF_CONST(0.7109375000), COEF_CONST(0.7070312500), COEF_CONST(0.6992187500), COEF_CONST(0.6953125000), COEF_CONST(0.6914062500), COEF_CONST(0.6875000000), COEF_CONST(0.6835937500), COEF_CONST(0.6796875000), COEF_CONST(0.6796875000), COEF_CONST(0.6757812500), COEF_CONST(0.6718750000), COEF_CONST(0.6679687500), COEF_CONST(0.6640625000), COEF_CONST(0.6601562500), COEF_CONST(0.6562500000), COEF_CONST(0.6523437500), COEF_CONST(0.6484375000), COEF_CONST(0.6445312500), COEF_CONST(0.6406250000), COEF_CONST(0.6406250000), COEF_CONST(0.6367187500), COEF_CONST(0.6328125000), COEF_CONST(0.6289062500), COEF_CONST(0.6250000000), COEF_CONST(0.6210937500), COEF_CONST(0.6210937500), COEF_CONST(0.6171875000), COEF_CONST(0.6132812500), COEF_CONST(0.6093750000), COEF_CONST(0.6054687500), COEF_CONST(0.6054687500), COEF_CONST(0.6015625000), COEF_CONST(0.5976562500), COEF_CONST(0.5937500000), COEF_CONST(0.5937500000), COEF_CONST(0.5898437500), COEF_CONST(0.5859375000), COEF_CONST(0.5820312500), COEF_CONST(0.5820312500), COEF_CONST(0.5781250000), COEF_CONST(0.5742187500), COEF_CONST(0.5742187500), COEF_CONST(0.5703125000), COEF_CONST(0.5664062500), COEF_CONST(0.5664062500), COEF_CONST(0.5625000000), COEF_CONST(0.5585937500), COEF_CONST(0.5585937500), COEF_CONST(0.5546875000), COEF_CONST(0.5507812500), COEF_CONST(0.5507812500), COEF_CONST(0.5468750000), COEF_CONST(0.5429687500), COEF_CONST(0.5429687500), COEF_CONST(0.5390625000), COEF_CONST(0.5390625000), COEF_CONST(0.5351562500), COEF_CONST(0.5312500000), COEF_CONST(0.5312500000), COEF_CONST(0.5273437500), COEF_CONST(0.5273437500), COEF_CONST(0.5234375000), COEF_CONST(0.5195312500), COEF_CONST(0.5195312500), COEF_CONST(0.5156250000), COEF_CONST(0.5156250000), COEF_CONST(0.5117187500), COEF_CONST(0.5117187500), COEF_CONST(0.5078125000), COEF_CONST(0.5078125000), COEF_CONST(0.5039062500), COEF_CONST(0.5039062500), COEF_CONST(0.5000000000), COEF_CONST(0.4980468750), COEF_CONST(0.4960937500), COEF_CONST(0.4941406250), COEF_CONST(0.4921875000), COEF_CONST(0.4902343750), COEF_CONST(0.4882812500), COEF_CONST(0.4863281250), COEF_CONST(0.4843750000), COEF_CONST(0.4824218750), COEF_CONST(0.4804687500), COEF_CONST(0.4785156250) }; ALIGN static const real_t exp_table[128] = { COEF_CONST(0.50000000000000000000000000000000000000000000000000), COEF_CONST(0.25000000000000000000000000000000000000000000000000), COEF_CONST(0.12500000000000000000000000000000000000000000000000), COEF_CONST(0.06250000000000000000000000000000000000000000000000), COEF_CONST(0.03125000000000000000000000000000000000000000000000), COEF_CONST(0.01562500000000000000000000000000000000000000000000), COEF_CONST(0.00781250000000000000000000000000000000000000000000), COEF_CONST(0.00390625000000000000000000000000000000000000000000), COEF_CONST(0.00195312500000000000000000000000000000000000000000), COEF_CONST(0.00097656250000000000000000000000000000000000000000), COEF_CONST(0.00048828125000000000000000000000000000000000000000), COEF_CONST(0.00024414062500000000000000000000000000000000000000), COEF_CONST(0.00012207031250000000000000000000000000000000000000), COEF_CONST(0.00006103515625000000000000000000000000000000000000), COEF_CONST(0.00003051757812500000000000000000000000000000000000), COEF_CONST(0.00001525878906250000000000000000000000000000000000), COEF_CONST(0.00000762939453125000000000000000000000000000000000), COEF_CONST(0.00000381469726562500000000000000000000000000000000), COEF_CONST(0.00000190734863281250000000000000000000000000000000), COEF_CONST(0.00000095367431640625000000000000000000000000000000), COEF_CONST(0.00000047683715820312500000000000000000000000000000), COEF_CONST(0.00000023841857910156250000000000000000000000000000), COEF_CONST(0.00000011920928955078125000000000000000000000000000), COEF_CONST(0.00000005960464477539062500000000000000000000000000), COEF_CONST(0.00000002980232238769531300000000000000000000000000), COEF_CONST(0.00000001490116119384765600000000000000000000000000), COEF_CONST(0.00000000745058059692382810000000000000000000000000), COEF_CONST(0.00000000372529029846191410000000000000000000000000), COEF_CONST(0.00000000186264514923095700000000000000000000000000), COEF_CONST(0.00000000093132257461547852000000000000000000000000), COEF_CONST(0.00000000046566128730773926000000000000000000000000), COEF_CONST(0.00000000023283064365386963000000000000000000000000), COEF_CONST(0.00000000011641532182693481000000000000000000000000), COEF_CONST(0.00000000005820766091346740700000000000000000000000), COEF_CONST(0.00000000002910383045673370400000000000000000000000), COEF_CONST(0.00000000001455191522836685200000000000000000000000), COEF_CONST(0.00000000000727595761418342590000000000000000000000), COEF_CONST(0.00000000000363797880709171300000000000000000000000), COEF_CONST(0.00000000000181898940354585650000000000000000000000), COEF_CONST(0.00000000000090949470177292824000000000000000000000), COEF_CONST(0.00000000000045474735088646412000000000000000000000), COEF_CONST(0.00000000000022737367544323206000000000000000000000), COEF_CONST(0.00000000000011368683772161603000000000000000000000), COEF_CONST(0.00000000000005684341886080801500000000000000000000), COEF_CONST(0.00000000000002842170943040400700000000000000000000), COEF_CONST(0.00000000000001421085471520200400000000000000000000), COEF_CONST(0.00000000000000710542735760100190000000000000000000), COEF_CONST(0.00000000000000355271367880050090000000000000000000), COEF_CONST(0.00000000000000177635683940025050000000000000000000), COEF_CONST(0.00000000000000088817841970012523000000000000000000), COEF_CONST(0.00000000000000044408920985006262000000000000000000), COEF_CONST(0.00000000000000022204460492503131000000000000000000), COEF_CONST(0.00000000000000011102230246251565000000000000000000), COEF_CONST(0.00000000000000005551115123125782700000000000000000), COEF_CONST(0.00000000000000002775557561562891400000000000000000), COEF_CONST(0.00000000000000001387778780781445700000000000000000), COEF_CONST(0.00000000000000000693889390390722840000000000000000), COEF_CONST(0.00000000000000000346944695195361420000000000000000), COEF_CONST(0.00000000000000000173472347597680710000000000000000), COEF_CONST(0.00000000000000000086736173798840355000000000000000), COEF_CONST(0.00000000000000000043368086899420177000000000000000), COEF_CONST(0.00000000000000000021684043449710089000000000000000), COEF_CONST(0.00000000000000000010842021724855044000000000000000), COEF_CONST(0.00000000000000000005421010862427522200000000000000), COEF_CONST(0.00000000000000000002710505431213761100000000000000), COEF_CONST(0.00000000000000000001355252715606880500000000000000), COEF_CONST(0.00000000000000000000677626357803440270000000000000), COEF_CONST(0.00000000000000000000338813178901720140000000000000), COEF_CONST(0.00000000000000000000169406589450860070000000000000), COEF_CONST(0.00000000000000000000084703294725430034000000000000), COEF_CONST(0.00000000000000000000042351647362715017000000000000), COEF_CONST(0.00000000000000000000021175823681357508000000000000), COEF_CONST(0.00000000000000000000010587911840678754000000000000), COEF_CONST(0.00000000000000000000005293955920339377100000000000), COEF_CONST(0.00000000000000000000002646977960169688600000000000), COEF_CONST(0.00000000000000000000001323488980084844300000000000), COEF_CONST(0.00000000000000000000000661744490042422140000000000), COEF_CONST(0.00000000000000000000000330872245021211070000000000), COEF_CONST(0.00000000000000000000000165436122510605530000000000), COEF_CONST(0.00000000000000000000000082718061255302767000000000), COEF_CONST(0.00000000000000000000000041359030627651384000000000), COEF_CONST(0.00000000000000000000000020679515313825692000000000), COEF_CONST(0.00000000000000000000000010339757656912846000000000), COEF_CONST(0.00000000000000000000000005169878828456423000000000), COEF_CONST(0.00000000000000000000000002584939414228211500000000), COEF_CONST(0.00000000000000000000000001292469707114105700000000), COEF_CONST(0.00000000000000000000000000646234853557052870000000), COEF_CONST(0.00000000000000000000000000323117426778526440000000), COEF_CONST(0.00000000000000000000000000161558713389263220000000), COEF_CONST(0.00000000000000000000000000080779356694631609000000), COEF_CONST(0.00000000000000000000000000040389678347315804000000), COEF_CONST(0.00000000000000000000000000020194839173657902000000), COEF_CONST(0.00000000000000000000000000010097419586828951000000), COEF_CONST(0.00000000000000000000000000005048709793414475600000), COEF_CONST(0.00000000000000000000000000002524354896707237800000), COEF_CONST(0.00000000000000000000000000001262177448353618900000), COEF_CONST(0.00000000000000000000000000000631088724176809440000), COEF_CONST(0.00000000000000000000000000000315544362088404720000), COEF_CONST(0.00000000000000000000000000000157772181044202360000), COEF_CONST(0.00000000000000000000000000000078886090522101181000), COEF_CONST(0.00000000000000000000000000000039443045261050590000), COEF_CONST(0.00000000000000000000000000000019721522630525295000), COEF_CONST(0.00000000000000000000000000000009860761315262647600), COEF_CONST(0.00000000000000000000000000000004930380657631323800), COEF_CONST(0.00000000000000000000000000000002465190328815661900), COEF_CONST(0.00000000000000000000000000000001232595164407830900), COEF_CONST(0.00000000000000000000000000000000616297582203915470), COEF_CONST(0.00000000000000000000000000000000308148791101957740), COEF_CONST(0.00000000000000000000000000000000154074395550978870), COEF_CONST(0.00000000000000000000000000000000077037197775489434), COEF_CONST(0.00000000000000000000000000000000038518598887744717), COEF_CONST(0.00000000000000000000000000000000019259299443872359), COEF_CONST(0.00000000000000000000000000000000009629649721936179), COEF_CONST(0.00000000000000000000000000000000004814824860968090), COEF_CONST(0.00000000000000000000000000000000002407412430484045), COEF_CONST(0.00000000000000000000000000000000001203706215242022), COEF_CONST(0.00000000000000000000000000000000000601853107621011), COEF_CONST(0.00000000000000000000000000000000000300926553810506), COEF_CONST(0.00000000000000000000000000000000000150463276905253), COEF_CONST(0.00000000000000000000000000000000000075231638452626), COEF_CONST(0.00000000000000000000000000000000000037615819226313), COEF_CONST(0.00000000000000000000000000000000000018807909613157), COEF_CONST(0.00000000000000000000000000000000000009403954806578), COEF_CONST(0.00000000000000000000000000000000000004701977403289), COEF_CONST(0.00000000000000000000000000000000000002350988701645), COEF_CONST(0.00000000000000000000000000000000000001175494350822), COEF_CONST(0.0 /* 0000000000000000000000000000000000000587747175411 "floating point underflow" */), COEF_CONST(0.0) }; #ifdef __cplusplus } #endif #endif #endif faad2-2_10_0/libfaad/iq_table.h000066400000000000000000020001121374350120500162200ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: iq_table.h,v 1.20 2007/11/01 12:33:31 menno Exp $ **/ #ifndef IQ_TABLE_H__ #define IQ_TABLE_H__ #ifdef __cplusplus extern "C" { #endif /* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */ #ifndef FIXED_POINT #define IQ_TABLE_SIZE 8192 #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = { 0, 1, 2.5198420997897464, 4.3267487109222245, 6.3496042078727974, 8.5498797333834844, 10.902723556992836, 13.390518279406722, 15.999999999999998, 18.720754407467133, 21.544346900318832, 24.463780996262464, 27.47314182127996, 30.567350940369842, 33.741991698453212, 36.993181114957046, 40.317473596635935, 43.711787041189993, 47.173345095760126, 50.699631325716943, 54.288352331898118, 57.937407704003519, 61.6448652744185, 65.408940536585988, 69.227979374755591, 73.100443455321638, 77.024897778591622, 80.999999999999986, 85.024491212518527, 89.097187944889555, 93.216975178615741, 97.382800224133163, 101.59366732596474, 105.84863288986224, 110.14680124343441, 114.4873208566006, 118.86938096020653, 123.29220851090024, 127.75506545836058, 132.25724627755247, 136.79807573413572, 141.37690685569191, 145.99311908523086, 150.6461165966291, 155.33532675434674, 160.06019870205279, 164.82020206673349, 169.61482576651861, 174.44357691188537, 179.30597979112557, 184.20157493201927, 189.12991823257562, 194.09058015449685, 199.08314497371677, 204.1072100829694, 209.16238534187647, 214.24829247050752, 219.36456448277784, 224.51084515641216, 229.6867885365223, 234.89205847013176, 240.12632816923249, 245.38927980018505, 250.68060409747261, 255.99999999999991, 261.34717430828869, 266.72184136106449, 272.12372272986045, 277.55254693037961, 283.0080491494619, 288.48997098659891, 293.99806020902247, 299.53207051947408, 305.0917613358298, 310.67689758182206, 316.28724948815585, 321.92259240337177, 327.58270661385535, 333.26737717243742, 338.97639373507025, 344.70955040510125, 350.46664558470013, 356.24748183302603, 362.05186573075139, 367.87960775058258, 373.73052213344511, 379.60442677002078, 385.50114308734607, 391.42049594019937, 397.36231350702371, 403.32642719014467, 409.31267152006262, 415.32088406360799, 421.35090533576471, 427.40257871497619, 433.4757503617617, 439.5702691404793, 445.68598654408271, 451.82275662172759, 457.98043590909128, 464.15888336127773, 470.35796028818726, 476.5775302922363, 482.81745920832043, 489.07761504591741, 495.35786793323581, 501.65809006331688, 507.97815564200368, 514.31794083769648, 520.67732373281672, 527.05618427690604, 533.45440424129174, 539.87186717525128, 546.30845836361505, 552.76406478574609, 559.23857507584194, 565.73187948450413, 572.24386984152341, 578.77443951983378, 585.32348340058843, 591.89089783931263, 598.47658063309257, 605.08043098876044, 611.70234949203643, 618.3422380775919, 624.99999999999977, 631.67553980553748, 638.36876330481164, 645.07957754617485, 651.80789078990415, 658.55361248311499, 665.31665323538357, 672.09692479505225, 678.8943400261943, 685.70881288621433, 692.540258404062, 699.38859265903977, 706.25373276018058, 713.13559682617972, 720.03410396586037, 726.94917425915435, 733.88072873858209, 740.82868937121543, 747.79297904110535, 754.77352153216191, 761.77024151147043, 768.78306451302956, 775.81191692189896, 782.85672595874246, 789.91741966475445, 796.99392688695798, 804.08617726386274, 811.19410121147098, 818.31762990962227, 825.45669528866563, 832.61123001644864, 839.78116748561604, 846.96644180120552, 854.16698776853514, 861.38274088137143, 868.61363731036977, 875.85961389178203, 883.12060811641959, 890.39655811886757, 897.68740266694181, 904.99308115138172, 912.31353357577188, 919.64870054668756, 926.99852326405619, 934.36294351172899, 941.74190364825859, 949.13534659787422, 956.54321584165211, 963.96545540887348, 971.40200986856541, 978.85282432122176, 986.31784439069588, 993.7970162162635, 1001.29028644485, 1008.797602223418, 1016.3189111915103, 1023.8541614739464, 1031.4033016736653, 1038.9662808647138, 1046.5430485853758, 1054.1335548314366, 1061.7377500495838, 1069.3555851309357, 1076.9870114046978, 1084.6319806319441, 1092.2904449995174, 1099.9623571140482, 1107.6476699960892, 1115.3463370743607, 1123.058312180106, 1130.7835495415541, 1138.5220037784854, 1146.273629896901, 1154.0383832837879, 1161.816219701986, 1169.607095285146, 1177.4109665327808, 1185.2277903054078, 1193.0575238197798, 1200.9001246442001, 1208.7555506939248, 1216.6237602266442, 1224.5047118380478, 1232.3983644574657, 1240.3046773435874, 1248.2236100802568, 1256.1551225723395, 1264.099175041662, 1272.0557280230228, 1280.0247423602691, 1288.0061792024444, 1295.9999999999995, 1304.006166501068, 1312.0246407478062, 1320.0553850727929, 1328.0983620954903, 1336.1535347187651, 1344.2208661254647, 1352.3003197750522, 1360.3918594002962, 1368.4954490040145, 1376.6110528558709, 1384.7386354892244, 1392.8781616980295, 1401.0295965337855, 1409.1929053025353, 1417.3680535619119, 1425.5550071182327, 1433.7537320236374, 1441.9641945732744, 1450.1863613025282, 1458.4201989842913, 1466.6656746262797, 1474.9227554683875, 1483.1914089800841, 1491.4716028578516, 1499.7633050226596, 1508.0664836174794, 1516.3811070048375, 1524.7071437644029, 1533.0445626906128, 1541.3933327903342, 1549.7534232805581, 1558.1248035861302, 1566.507443337515, 1574.9013123685909, 1583.3063807144795, 1591.7226186094069, 1600.1499964845941, 1608.58848496618, 1617.0380548731737, 1625.4986772154357, 1633.9703231916887, 1642.4529641875577, 1650.9465717736346, 1659.4511177035752, 1667.9665739122186, 1676.4929125137353, 1685.030105799801, 1693.5781262377957, 1702.136946469027, 1710.7065393069795, 1719.2868777355877, 1727.8779349075323, 1736.4796841425596, 1745.092098925825, 1753.7151529062583, 1762.3488198949503, 1770.9930738635628, 1779.6478889427597, 1788.3132394206564, 1796.9890997412947, 1805.6754445031333, 1814.3722484575621, 1823.0794865074322, 1831.7971337056094, 1840.5251652535437, 1849.2635564998579, 1858.0122829389563, 1866.7713202096493, 1875.5406440937966, 1884.3202305149687, 1893.110055537124, 1901.9100953633042, 1910.7203263343454, 1919.5407249276057, 1928.3712677557098, 1937.2119315653083, 1946.0626932358525, 1954.923529778386, 1963.79441833435, 1972.6753361744036, 1981.5662606972594, 1990.467169428533, 1999.3780400196069, 2008.2988502465078, 2017.2295780087982, 2026.1702013284819, 2035.1206983489212, 2044.0810473337688, 2053.0512266659125, 2062.0312148464309, 2071.0209904935646, 2080.0205323416958, 2089.0298192403443, 2098.0488301531714, 2107.0775441569995, 2116.115940440839, 2125.1639983049317, 2134.2216971597995, 2143.2890165253098, 2152.3659360297484, 2161.4524354089031, 2170.5484945051617, 2179.6540932666144, 2188.7692117461711, 2197.8938301006888, 2207.0279285901042, 2216.1714875765838, 2225.324487523676, 2234.4869089954782, 2243.6587326558101, 2252.8399392673982, 2262.0305096910702, 2271.2304248849537, 2280.4396659036897, 2289.6582138976523, 2298.8860501121762, 2308.1231558867926, 2317.3695126544767, 2326.6251019409005, 2335.8899053636933, 2345.1639046317132, 2354.4470815443233, 2363.7394179906792, 2373.0408959490205, 2382.3514974859731, 2391.6712047558558, 2400.9999999999991, 2410.3378655460651, 2419.6847838073813, 2429.0407372822747, 2438.4057085534191, 2447.7796802871858, 2457.1626352330004, 2466.5545562227112, 2475.9554261699564, 2485.3652280695474, 2494.7839449968492, 2504.2115601071737, 2513.6480566351788, 2523.0934178942675, 2532.5476272760025, 2542.0106682495189, 2551.482524360948, 2560.9631792328441, 2570.4526165636184, 2579.9508201269791, 2589.4577737713744, 2598.9734614194458, 2608.4978670674823, 2618.0309747848837, 2627.5727687136259, 2637.1232330677353, 2646.6823521327647, 2656.2501102652768, 2665.8264918923328, 2675.4114815109842, 2685.0050636877722, 2694.6072230582295, 2704.2179443263894, 2713.8372122642972, 2723.4650117115279, 2733.1013275747096, 2742.7461448270483, 2752.3994485078601, 2762.0612237221085, 2771.7314556399419, 2781.4101294962406, 2791.0972305901655, 2800.7927442847094, 2810.4966560062589, 2820.2089512441521, 2829.9296155502466, 2839.6586345384894, 2849.3959938844923, 2859.1416793251065, 2868.8956766580086, 2878.6579717412847, 2888.4285504930212, 2898.2073988908974, 2907.9945029717837, 2917.789848831344, 2927.5934226236377, 2937.4052105607311, 2947.2251989123079, 2957.0533740052865, 2966.8897222234368, 2976.734230007005, 2986.5868838523397, 2996.4476703115197, 3006.3165759919889, 3016.1935875561908, 3026.0786917212095, 3035.9718752584108, 3045.8731249930906, 3055.7824278041207, 3065.6997706236039, 3075.625140436528, 3085.5585242804245, 3095.4999092450298, 3105.4492824719491, 3115.4066311543256, 3125.3719425365089, 3135.3452039137287, 3145.3264026317715, 3155.3155260866592, 3165.3125617243295, 3175.3174970403229, 3185.3303195794679, 3195.35101693557, 3205.3795767511078, 3215.4159867169251, 3225.460234571929, 3235.5123081027928, 3245.5721951436558, 3255.63988357583, 3265.7153613275095, 3275.7986163734795, 3285.8896367348289, 3295.9884104786665, 3306.0949257178395, 3316.2091706106517, 3326.331133360588, 3336.4608022160378, 3346.5981654700231, 3356.7432114599264, 3366.8959285672249, 3377.0563052172211, 3387.2243298787821, 3397.3999910640764, 3407.5832773283128, 3417.7741772694862, 3427.9726795281199, 3438.1787727870123, 3448.3924457709873, 3458.6136872466445, 3468.8424860221107, 3479.0788309467976, 3489.3227109111554, 3499.5741148464344, 3509.8330317244445, 3520.0994505573185, 3530.3733603972751, 3540.6547503363886, 3550.9436095063534, 3561.239927078258, 3571.5436922623535, 3581.8548943078308, 3592.1735225025936, 3602.4995661730372, 3612.8330146838275, 3623.1738574376814, 3633.5220838751502, 3643.8776834744031, 3654.2406457510142, 3664.6109602577494, 3674.9886165843564, 3685.3736043573545, 3695.7659132398294, 3706.1655329312248, 3716.5724531671399, 3726.9866637191262, 3737.4081543944876, 3747.8369150360782, 3758.2729355221072, 3768.7162057659411, 3779.1667157159077, 3789.6244553551055, 3800.0894147012082, 3810.5615838062768, 3821.0409527565694, 3831.5275116723533, 3842.0212507077194, 3852.522160050396, 3863.0302299215673, 3873.5454505756893, 3884.0678123003108, 3894.5973054158922, 3905.1339202756285, 3915.6776472652732, 3926.2284768029604, 3936.7863993390338, 3947.3514053558706, 3957.9234853677135, 3968.5026299204969, 3979.0888295916798, 3989.6820749900776, 4000.2823567556948, 4010.8896655595613, 4021.5039921035655, 4032.1253271202945, 4042.7536613728694, 4053.3889856547858, 4064.0312907897551, 4074.6805676315448, 4085.3368070638221, 4095.9999999999982, 4106.6701373830711, 4117.347210185475, 4128.0312094089259, 4138.722126084268, 4149.4199512713267, 4160.1246760587583, 4170.8362915638982, 4181.5547889326181, 4192.2801593391769, 4203.0123939860741, 4213.7514841039101, 4224.4974209512384, 4235.2501958144258, 4246.0098000075095, 4256.7762248720574, 4267.549461777031, 4278.3295021186423, 4289.1163373202198, 4299.9099588320714, 4310.7103581313495, 4321.5175267219138, 4332.3314561342004, 4343.152137925088, 4353.9795636777671, 4364.8137250016052, 4375.6546135320223, 4386.5022209303588, 4397.3565388837469, 4408.2175591049827, 4419.0852733324018, 4429.9596733297531, 4440.8407508860728, 4451.7284978155603, 4462.6229059574571, 4473.5239671759227, 4484.4316733599126, 4495.3460164230582, 4506.2669883035496, 4517.1945809640119, 4528.1287863913894, 4539.069596596828, 4550.0170036155587, 4560.9709995067806, 4571.931576353546, 4582.898726262647, 4593.8724413645004, 4604.8527138130348, 4615.8395357855816, 4626.8328994827571, 4637.8327971283588, 4648.8392209692511, 4659.8521632752563, 4670.8716163390473, 4681.8975724760394, 4692.9300240242837, 4703.9689633443595, 4715.0143828192668, 4726.0662748543255, 4737.1246318770682, 4748.1894463371373, 4759.2607107061804, 4770.3384174777493, 4781.4225591671993, 4792.5131283115852, 4803.6101174695614, 4814.7135192212854, 4825.8233261683154, 4836.9395309335096, 4848.0621261609349, 4859.1911045157631, 4870.3264586841779, 4881.4681813732768, 4892.6162653109768, 4903.7707032459193, 4914.931487947375, 4926.0986122051509, 4937.2720688294967, 4948.4518506510112, 4959.637950520555, 4970.8303613091521, 4982.0290759079044, 4993.2340872278974, 5004.4453882001153, 5015.6629717753467, 5026.8868309241007, 5038.1169586365131, 5049.353347922266, 5060.5959918104927, 5071.8448833496996, 5083.1000156076734, 5094.3613816713996, 5105.6289746469747, 5116.9027876595246, 5128.18281385312, 5139.4690463906918, 5150.7614784539473, 5162.0601032432933, 5173.3649139777472, 5184.6759038948594, 5195.9930662506322, 5207.3163943194386, 5218.6458813939435, 5229.9815207850224, 5241.3233058216847, 5252.6712298509919, 5264.025286237983, 5275.3854683655954, 5286.7517696345885, 5298.1241834634639, 5309.5027032883945, 5320.887322563146, 5332.2780347589978, 5343.6748333646756, 5355.0777118862716, 5366.4866638471722, 5377.901682787985, 5389.3227622664635, 5400.749895857437, 5412.1830771527357, 5423.622299761123, 5435.067557308219, 5446.5188434364318, 5457.9761518048872, 5469.4394760893592, 5480.9088099821975, 5492.3841471922606, 5503.8654814448455, 5515.3528064816201, 5526.846116060552, 5538.3454039558474, 5549.8506639578736, 5561.3618898731029, 5572.8790755240361, 5584.4022147491451, 5595.9313014027975, 5607.4663293552012, 5619.0072924923297, 5630.5541847158656, 5642.1069999431284, 5653.665732107017, 5665.230375155943, 5676.8009230537655, 5688.3773697797333, 5699.9597093284156, 5711.5479357096474, 5723.1420429484588, 5734.7420250850209, 5746.347876174581, 5757.9595902874016, 5769.5771615087006, 5781.2005839385911, 5792.8298516920213, 5804.4649588987149, 5816.1058997031105, 5827.7526682643065, 5839.4052587559972, 5851.0636653664196, 5862.7278822982908, 5874.3979037687541, 5886.0737240093204, 5897.7553372658094, 5909.4427377982956, 5921.1359198810505, 5932.8348778024874, 5944.5396058651031, 5956.2500983854261, 5967.9663496939575, 5979.6883541351208, 5991.4161060672022, 6003.1495998623004, 6014.8888299062692, 6026.6337905986684, 6038.3844763527022, 6050.1408815951781, 6061.9030007664414, 6073.6708283203316, 6085.4443587241267, 6097.2235864584891, 6109.0085060174197, 6120.7991119081998, 6132.595398651345, 6144.3973607805519, 6156.2049928426459, 6168.0182893975361, 6179.8372450181578, 6191.6618542904307, 6203.4921118132024, 6215.3280121982016, 6227.1695500699925, 6239.0167200659189, 6250.8695168360628, 6262.7279350431891, 6274.5919693627056, 6286.4616144826068, 6298.3368651034316, 6310.2177159382172, 6322.1041617124456, 6333.9961971640032, 6345.8938170431311, 6357.7970161123785, 6369.7057891465583, 6381.6201309327007, 6393.5400362700075, 6405.4654999698032, 6417.3965168554978, 6429.3330817625329, 6441.2751895383453, 6453.2228350423138, 6465.176013145724, 6477.134718731716, 6489.0989466952469, 6501.0686919430445, 6513.0439493935628, 6525.0247139769417, 6537.010980634961, 6549.002744321001, 6560.9999999999973, 6573.0027426483985, 6585.0109672541284, 6597.0246688165371, 6609.0438423463656, 6621.0684828657004, 6633.0985854079354, 6645.134145017727, 6657.1751567509573, 6669.2216156746908, 6681.2735168671343, 6693.3308554176001, 6705.3936264264594, 6717.461825005108, 6729.535446275926, 6741.6144853722335, 6753.6989374382601, 6765.7887976290967, 6777.8840611106634, 6789.9847230596661, 6802.0907786635626, 6814.2022231205201, 6826.3190516393797, 6838.4412594396181, 6850.5688417513074, 6862.701793815083, 6874.840110882099, 6886.9837882139991, 6899.1328210828724, 6911.2872047712199, 6923.4469345719199, 6935.6120057881863, 6947.7824137335365, 6959.9581537317536, 6972.1392211168532, 6984.3256112330409, 6996.5173194346862, 7008.7143410862773, 7020.9166715623942, 7033.1243062476678, 7045.3372405367481, 7057.5554698342685, 7069.7789895548103, 7082.0077951228714, 7094.2418819728273, 7106.4812455489018, 7118.7258813051285, 7130.9757847053224, 7143.2309512230404, 7155.4913763415516, 7167.7570555538041, 7180.0279843623894, 7192.3041582795131, 7204.5855728269571, 7216.8722235360519, 7229.1641059476406, 7241.4612156120484, 7253.7635480890503, 7266.0710989478375, 7278.3838637669869, 7290.7018381344296, 7303.0250176474174, 7315.3533979124932, 7327.6869745454596, 7340.0257431713462, 7352.3696994243801, 7364.7188389479543, 7377.0731573945968, 7389.4326504259407, 7401.7973137126937, 7414.1671429346061, 7426.5421337804428, 7438.922281947951, 7451.3075831438346, 7463.6980330837177, 7476.0936274921214, 7488.4943621024304, 7500.9002326568652, 7513.3112349064522, 7525.7273646109943, 7538.1486175390446, 7550.5749894678729, 7563.0064761834419, 7575.4430734803736, 7587.8847771619248, 7600.3315830399597, 7612.7834869349153, 7625.24048467578, 7637.7025721000637, 7650.1697450537677, 7662.6419993913596, 7675.1193309757446, 7687.6017356782404, 7700.0892093785433, 7712.5817479647112, 7725.079347333125, 7737.5820033884729, 7750.0897120437139, 7762.6024692200581, 7775.1202708469355, 7787.6431128619733, 7800.1709912109645, 7812.7039018478481, 7825.2418407346768, 7837.7848038415968, 7850.3327871468155, 7862.8857866365806, 7875.4437983051539, 7888.006818154784, 7900.5748421956796, 7913.1478664459901, 7925.725886931772, 7938.3088996869719, 7950.8969007533951, 7963.4898861806851, 7976.0878520262959, 7988.6907943554688, 8001.2987092412086, 8013.911592764257, 8026.5294410130691, 8039.1522500837891, 8051.7800160802271, 8064.412735113835, 8077.0504033036796, 8089.6930167764222, 8102.3405716662946, 8114.9930641150731, 8127.6504902720571, 8140.3128462940449, 8152.9801283453098, 8165.6523325975786, 8178.3294552300049, 8191.0114924291529, 8203.6984403889655, 8216.3902953107463, 8229.0870534031419, 8241.7887108821069, 8254.4952639708936, 8267.2067089000211, 8279.9230419072574, 8292.6442592375952, 8305.3703571432306, 8318.101331883543, 8330.8371797250657, 8343.577896941475, 8356.3234798135582, 8369.0739246291978, 8381.8292276833508, 8394.5893852780209, 8407.3543937222421, 8420.1242493320569, 8432.8989484304948, 8445.6784873475499, 8458.4628624201578, 8471.2520699921806, 8484.0461064143838, 8496.8449680444082, 8509.6486512467636, 8522.4571523927953, 8535.270467860666, 8548.0885940353437, 8560.9115273085663, 8573.7392640788403, 8586.5718007514006, 8599.4091337382069, 8612.2512594579148, 8625.0981743358552, 8637.9498748040205, 8650.8063573010386, 8663.6676182721567, 8676.533654169225, 8689.4044614506638, 8702.2800365814601, 8715.1603760331418, 8728.0454762837508, 8740.9353338178389, 8753.8299451264356, 8766.7293067070332, 8779.6334150635721, 8792.5422667064158, 8805.4558581523324, 8818.3741859244819, 8831.2972465523908, 8844.2250365719356, 8857.1575525253265, 8870.0947909610859, 8883.0367484340295, 8895.9834215052524, 8908.934806742107, 8921.8909007181846, 8934.8517000132997, 8947.817201213471, 8960.7874009109, 8973.7622957039603, 8986.7418821971733, 8999.7261570011924, 9012.7151167327884, 9025.7087580148236, 9038.7070774762469, 9051.7100717520643, 9064.7177374833282, 9077.7300713171153, 9090.7470699065179, 9103.7687299106146, 9116.7950479944648, 9129.8260208290812, 9142.8616450914233, 9155.9019174643727, 9168.9468346367157, 9181.9963933031358, 9195.0505901641845, 9208.1094219262741, 9221.1728853016557, 9234.240977008405, 9247.3136937704076, 9260.3910323173386, 9273.472989384647, 9286.5595617135423, 9299.6507460509747, 9312.7465391496207, 9325.8469377678684, 9338.9519386698012, 9352.0615386251757, 9365.1757344094131, 9378.2945228035842, 9391.4179005943843, 9404.5458645741273, 9417.6784115407263, 9430.8155382976747, 9443.9572416540359, 9457.1035184244265, 9470.2543654290002, 9483.4097794934296, 9496.5697574488931, 9509.7342961320664, 9522.9033923850911, 9536.0770430555804, 9549.2552449965824, 9562.4379950665825, 9575.6252901294793, 9588.8171270545736, 9602.0135027165488, 9615.2144139954635, 9628.4198577767274, 9641.629830951093, 9654.844330414644, 9668.0633530687719, 9681.286895820167, 9694.5149555808002, 9707.7475292679192, 9720.9846138040157, 9734.2262061168276, 9747.4723031393187, 9760.7229018096641, 9773.9779990712323, 9787.2375918725811, 9800.5016771674327, 9813.7702519146696, 9827.0433130783094, 9840.3208576275028, 9853.602882536512, 9866.8893847846994, 9880.1803613565116, 9893.4758092414686, 9906.7757254341523, 9920.0801069341851, 9933.3889507462245, 9946.7022538799429, 9960.0200133500221, 9973.3422261761298, 9986.6688893829159, 9999.9999999999945, 10013.335555061929, 10026.675551608221, 10040.019986683301, 10053.368857336509, 10066.722160622081, 10080.079893599144, 10093.442053331697, 10106.808636888598, 10120.179641343551, 10133.555063775095, 10146.934901266595, 10160.31915090622, 10173.707809786936, 10187.100875006496, 10200.498343667417, 10213.900212876984, 10227.306479747222, 10240.717141394889, 10254.132194941467, 10267.551637513146, 10280.975466240814, 10294.40367826004, 10307.836270711066, 10321.273240738796, 10334.71458549278, 10348.160302127204, 10361.610387800878, 10375.064839677221, 10388.523654924258, 10401.986830714593, 10415.454364225412, 10428.926252638465, 10442.402493140049, 10455.883082921007, 10469.368019176709, 10482.85729910704, 10496.350919916393, 10509.848878813653, 10523.351173012188, 10536.857799729838, 10550.3687561889, 10563.884039616123, 10577.403647242685, 10590.927576304197, 10604.455824040679, 10617.988387696556, 10631.525264520642, 10645.066451766135, 10658.611946690598, 10672.161746555956, 10685.715848628475, 10699.274250178762, 10712.836948481747, 10726.403940816675, 10739.975224467091, 10753.550796720834, 10767.130654870027, 10780.714796211059, 10794.303218044579, 10807.895917675487, 10821.492892412922, 10835.094139570248, 10848.699656465047, 10862.309440419107, 10875.923488758415, 10889.541798813138, 10903.16436791762, 10916.791193410372, 10930.422272634056, 10944.05760293548, 10957.697181665582, 10971.341006179427, 10984.98907383619, 10998.641381999149, 11012.297928035676, 11025.958709317223, 11039.623723219316, 11053.292967121541, 11066.966438407539, 11080.64413446499, 11094.326052685608, 11108.012190465128, 11121.702545203296, 11135.397114303863, 11149.095895174571, 11162.798885227143, 11176.506081877278, 11190.217482544635, 11203.933084652828, 11217.652885629415, 11231.376882905886, 11245.105073917659, 11258.837456104062, 11272.574026908333, 11286.314783777601, 11300.059724162888, 11313.808845519083, 11327.562145304952, 11341.319620983111, 11355.081270020033, 11368.847089886023, 11382.617078055218, 11396.391232005579, 11410.169549218874, 11423.952027180676, 11437.738663380349, 11451.529455311042, 11465.324400469679, 11479.123496356951, 11492.926740477304, 11506.734130338931, 11520.545663453764, 11534.361337337466, 11548.181149509423, 11562.005097492724, 11575.83317881417, 11589.665391004253, 11603.501731597149, 11617.342198130715, 11631.186788146468, 11645.035499189589, 11658.888328808911, 11672.745274556904, 11686.606333989675, 11700.471504666955, 11714.340784152086, 11728.214170012021, 11742.091659817312, 11755.973251142101, 11769.858941564111, 11783.748728664636, 11797.642610028539, 11811.540583244237, 11825.442645903697, 11839.34879560242, 11853.259029939445, 11867.173346517333, 11881.091742942155, 11895.014216823492, 11908.940765774427, 11922.871387411526, 11936.806079354839, 11950.744839227897, 11964.687664657684, 11978.634553274653, 11992.585502712702, 12006.540510609168, 12020.499574604828, 12034.462692343877, 12048.429861473938, 12062.401079646032, 12076.376344514589, 12090.355653737433, 12104.339004975769, 12118.326395894188, 12132.317824160644, 12146.313287446457, 12160.312783426305, 12174.316309778205, 12188.323864183525, 12202.335444326955, 12216.351047896511, 12230.370672583531, 12244.394316082657, 12258.421976091831, 12272.453650312296, 12286.489336448574, 12300.529032208471, 12314.572735303058, 12328.620443446678, 12342.672154356922, 12356.727865754638, 12370.787575363909, 12384.851280912055, 12398.918980129623, 12412.990670750381, 12427.066350511306, 12441.146017152583, 12455.229668417589, 12469.317302052901, 12483.40891580827, 12497.50450743663, 12511.604074694078, 12525.707615339878, 12539.815127136444, 12553.926607849342, 12568.042055247275, 12582.161467102082, 12596.284841188726, 12610.41217528529, 12624.543467172971, 12638.678714636069, 12652.817915461985, 12666.961067441209, 12681.108168367316, 12695.259216036962, 12709.414208249869, 12723.573142808827, 12737.736017519681, 12751.902830191326, 12766.073578635704, 12780.248260667788, 12794.426874105588, 12808.609416770132, 12822.795886485468, 12836.986281078653, 12851.180598379744, 12865.378836221802, 12879.580992440871, 12893.787064875984, 12907.997051369144, 12922.210949765335, 12936.428757912496, 12950.650473661524, 12964.876094866273, 12979.105619383534, 12993.339045073039, 13007.576369797454, 13021.817591422368, 13036.062707816285, 13050.311716850629, 13064.564616399723, 13078.821404340792, 13093.082078553954, 13107.346636922217, 13121.615077331464, 13135.887397670458, 13150.163595830827, 13164.44366970706, 13178.727617196502, 13193.015436199352, 13207.307124618648, 13221.602680360265, 13235.902101332911, 13250.205385448118, 13264.512530620239, 13278.823534766434, 13293.138395806676, 13307.457111663734, 13321.779680263176, 13336.106099533356, 13350.436367405409, 13364.77048181325, 13379.108440693562, 13393.450241985796, 13407.795883632158, 13422.145363577607, 13436.498679769853, 13450.855830159346, 13465.216812699266, 13479.581625345529, 13493.950266056772, 13508.32273279435, 13522.699023522329, 13537.079136207483, 13551.463068819286, 13565.850819329906, 13580.2423857142, 13594.63776594971, 13609.036958016657, 13623.439959897927, 13637.846769579081, 13652.257385048335, 13666.67180429656, 13681.090025317284, 13695.512046106669, 13709.937864663521, 13724.367478989278, 13738.800887088004, 13753.238086966385, 13767.679076633727, 13782.123854101939, 13796.572417385545, 13811.024764501659, 13825.480893469998, 13839.94080231286, 13854.404489055134, 13868.871951724283, 13883.34318835034, 13897.818196965914, 13912.296975606168, 13926.779522308825, 13941.26583511416, 13955.755912064991, 13970.249751206682, 13984.747350587126, 13999.248708256751, 14013.753822268511, 14028.262690677873, 14042.775311542828, 14057.291682923867, 14071.811802883994, 14086.335669488704, 14100.863280805994, 14115.394634906341, 14129.92972986271, 14144.468563750548, 14159.01113464777, 14173.55744063476, 14188.107479794369, 14202.661250211901, 14217.218749975118, 14231.779977174227, 14246.344929901879, 14260.913606253163, 14275.486004325601, 14290.062122219146, 14304.641958036171, 14319.225509881464, 14333.812775862236, 14348.403754088098, 14362.998442671067, 14377.59683972556, 14392.198943368388, 14406.804751718748, 14421.414262898223, 14436.027475030774, 14450.64438624274, 14465.264994662828, 14479.889298422106, 14494.517295654005, 14509.148984494313, 14523.784363081166, 14538.423429555049, 14553.066182058781, 14567.712618737527, 14582.362737738777, 14597.016537212348, 14611.674015310382, 14626.33517018734, 14640.999999999993, 14655.668502907418, 14670.340677071003, 14685.016520654426, 14699.696031823671, 14714.379208746999, 14729.066049594967, 14743.756552540408, 14758.45071575843, 14773.148537426418, 14787.850015724018, 14802.555148833142, 14817.263934937961, 14831.976372224897, 14846.692458882624, 14861.41219310206, 14876.135573076363, 14890.862597000923, 14905.593263073371, 14920.327569493558, 14935.065514463557, 14949.807096187662, 14964.552312872382, 14979.301162726431, 14994.053643960735, 15008.809754788414, 15023.569493424788, 15038.332858087369, 15053.099846995858, 15067.870458372134, 15082.644690440264, 15097.422541426484, 15112.204009559202, 15126.989093068994, 15141.777790188597, 15156.570099152905, 15171.366018198967, 15186.165545565986, 15200.968679495301, 15215.775418230402, 15230.585760016909, 15245.399703102579, 15260.217245737298, 15275.038386173073, 15289.863122664035, 15304.691453466432, 15319.523376838621, 15334.358891041069, 15349.197994336346, 15364.040684989128, 15378.886961266177, 15393.736821436356, 15408.590263770609, 15423.447286541972, 15438.307888025554, 15453.172066498542, 15468.039820240196, 15482.91114753184, 15497.786046656869, 15512.664515900733, 15527.546553550939, 15542.432157897045, 15557.32132723066, 15572.214059845435, 15587.110354037064, 15602.010208103273, 15616.913620343823, 15631.820589060506, 15646.731112557136, 15661.645189139546, 15676.562817115593, 15691.483994795139, 15706.408720490062, 15721.336992514242, 15736.268809183561, 15751.204168815901, 15766.143069731135, 15781.085510251132, 15796.03148869974, 15810.981003402798, 15825.934052688119, 15840.890634885489, 15855.850748326673, 15870.814391345401, 15885.781562277361, 15900.752259460214, 15915.726481233565, 15930.704225938984, 15945.685491919978, 15960.670277522009, 15975.658581092481, 15990.65040098073, 16005.645735538035, 16020.644583117599, 16035.646942074556, 16050.652810765967, 16065.662187550806, 16080.675070789974, 16095.691458846273, 16110.711350084424, 16125.734742871053, 16140.761635574685, 16155.792026565747, 16170.825914216561, 16185.863296901338, 16200.904172996183, 16215.948540879079, 16230.996398929899, 16246.047745530386, 16261.102579064163, 16276.160897916721, 16291.22270047542, 16306.287985129484, 16321.356750269995, 16336.428994289896, 16351.504715583982, 16366.5839125489, 16381.666583583141, 16396.752727087041, 16411.842341462776, 16426.935425114363, 16442.031976447644, 16457.131993870298, 16472.235475791829, 16487.342420623561, 16502.452826778641, 16517.566692672033, 16532.684016720516, 16547.804797342676, 16562.929032958902, 16578.056721991394, 16593.18786286415, 16608.322454002962, 16623.460493835417, 16638.601980790896, 16653.746913300558, 16668.895289797354, 16684.047108716015, 16699.202368493046, 16714.361067566726, 16729.523204377107, 16744.688777366009, 16759.857784977012, 16775.030225655464, 16790.206097848466, 16805.385400004874, 16820.568130575302, 16835.754288012104, 16850.943870769381, 16866.136877302983, 16881.333306070494, 16896.53315553123, 16911.736424146249, 16926.943110378332, 16942.153212691992, 16957.366729553454, 16972.583659430682, 16987.804000793338, 17003.027752112816, 17018.254911862205, 17033.485478516312, 17048.719450551645, 17063.956826446421, 17079.197604680547, 17094.44178373563, 17109.689362094967, 17124.940338243552, 17140.194710668064, 17155.452477856852, 17170.713638299967, 17185.978190489128, 17201.246132917724, 17216.517464080825, 17231.792182475165, 17247.070286599141, 17262.351774952826, 17277.636646037936, 17292.924898357855, 17308.216530417623, 17323.511540723921, 17338.809927785089, 17354.111690111105, 17369.416826213594, 17384.725334605821, 17400.037213802683, 17415.352462320716, 17430.67107867809, 17445.993061394587, 17461.318408991636, 17476.647119992274, 17491.979192921168, 17507.314626304586, 17522.653418670423, 17537.995568548187, 17553.341074468986, 17568.689934965536, 17584.042148572156, 17599.397713824768, 17614.75662926089, 17630.118893419625, 17645.484504841683, 17660.853462069354, 17676.225763646511, 17691.601408118619, 17706.980394032718, 17722.362719937424, 17737.748384382936, 17753.137385921014, 17768.529723104999, 17783.92539448979, 17799.324398631856, 17814.726734089225, 17830.13239942148, 17845.541393189767, 17860.95371395678, 17876.369360286772, 17891.788330745527, 17907.210623900395, 17922.636238320254, 17938.065172575527, 17953.497425238176, 17968.932994881692, 17984.371880081104, 17999.814079412972, 18015.259591455371, 18030.708414787914, 18046.160547991731, 18061.615989649465, 18077.074738345284, 18092.536792664861, 18108.002151195393, 18123.470812525571, 18138.942775245599, 18154.418037947191, 18169.896599223546, 18185.37845766938, 18200.863611880886, 18216.352060455767, 18231.843801993204, 18247.338835093873, 18262.837158359936, 18278.338770395032, 18293.84366980429, 18309.351855194309, 18324.863325173166, 18340.378078350412, 18355.896113337069, 18371.417428745623, 18386.942023190033, 18402.469895285718, 18418.00104364955, 18433.53546689987, 18449.073163656474, 18464.614132540602, 18480.158372174956, 18495.705881183676, 18511.256658192357, 18526.810701828035, 18542.368010719183, 18557.928583495715, 18573.492418788985, 18589.059515231773, 18604.629871458303, 18620.203486104212, 18635.78035780658, 18651.360485203899, 18666.943866936086, 18682.53050164448, 18698.120387971841, 18713.713524562332, 18729.30991006154, 18744.909543116457, 18760.512422375479, 18776.118546488418, 18791.727914106479, 18807.340523882274, 18822.95637446981, 18838.575464524489, 18854.197792703111, 18869.823357663863, 18885.452158066328, 18901.08419257147, 18916.719459841639, 18932.357958540564, 18947.999687333362, 18963.644644886521, 18979.292829867907, 18994.944240946759, 19010.598876793687, 19026.256736080668, 19041.917817481048, 19057.582119669532, 19073.2496413222, 19088.920381116473, 19104.594337731145, 19120.271509846356, 19135.951896143604, 19151.635495305738, 19167.322306016948, 19183.012326962784, 19198.705556830122, 19214.401994307198, 19230.101638083579, 19245.804486850167, 19261.510539299208, 19277.219794124274, 19292.932250020265, 19308.647905683421, 19324.366759811302, 19340.088811102793, 19355.8140582581, 19371.542499978754, 19387.2741349676, 19403.008961928797, 19418.746979567823, 19434.488186591469, 19450.232581707827, 19465.980163626304, 19481.730931057613, 19497.484882713761, 19513.242017308068, 19529.002333555141, 19544.765830170898, 19560.532505872539, 19576.302359378566, 19592.075389408761, 19607.851594684209, 19623.630973927269, 19639.41352586159, 19655.199249212103, 19670.988142705017, 19686.780205067826, 19702.575435029288, 19718.373831319448, 19734.175392669615, 19749.980117812371, 19765.788005481569, 19781.599054412323, 19797.413263341008, 19813.230631005274, 19829.051156144014, 19844.874837497395, 19860.701673806827, 19876.531663814985, 19892.364806265789, 19908.201099904403, 19924.040543477258, 19939.883135732012, 19955.728875417579, 19971.577761284105, 19987.429792082985, 20003.284966566847, 20019.14328348956, 20035.004741606219, 20050.869339673161, 20066.737076447946, 20082.607950689362, 20098.481961157428, 20114.359106613385, 20130.239385819699, 20146.122797540058, 20162.009340539353, 20177.899013583716, 20193.791815440476, 20209.687744878182, 20225.586800666591, 20241.488981576669, 20257.394286380597, 20273.302713851754, 20289.214262764715, 20305.128931895277, 20321.046720020415, 20336.967625918318, 20352.891648368361, 20368.818786151114, 20384.749038048347, 20400.682402843009, 20416.618879319249, 20432.558466262391, 20448.501162458953, 20464.446966696629, 20480.395877764302, 20496.347894452025, 20512.303015551031, 20528.261239853735, 20544.22256615372, 20560.186993245738, 20576.15451992572, 20592.125144990758, 20608.098867239107, 20624.075685470198, 20640.055598484618, 20656.038605084115, 20672.024704071595, 20688.013894251126, 20704.006174427926, 20720.001543408373, 20735.999999999989, 20752.001543011454, 20768.006171252597, 20784.013883534382, 20800.024678668931, 20816.038555469506, 20832.055512750507, 20848.075549327474, 20864.098664017085, 20880.124855637161, 20896.154123006647, 20912.186464945626, 20928.221880275312, 20944.260367818049, 20960.301926397311, 20976.346554837684, 20992.394251964895, 21008.445016605787, 21024.498847588318, 21040.555743741574, 21056.615703895754, 21072.678726882168, 21088.744811533252, 21104.813956682538, 21120.886161164683, 21136.961423815443, 21153.039743471683, 21169.121118971379, 21185.205549153605, 21201.293032858535, 21217.383568927453, 21233.477156202731, 21249.573793527841, 21265.673479747358, 21281.776213706937, 21297.881994253334, 21313.990820234398, 21330.102690499054, 21346.21760389733, 21362.335559280327, 21378.456555500241, 21394.580591410333, 21410.707665864964, 21426.83777771956, 21442.970925830628, 21459.107109055756, 21475.246326253604, 21491.388576283895, 21507.533858007431, 21523.682170286087, 21539.833511982797, 21555.987881961566, 21572.145279087465, 21588.305702226615, 21604.469150246216, 21620.635622014521, 21636.805116400832, 21652.977632275521, 21669.153168510009, 21685.331723976764, 21701.513297549318, 21717.697888102244, 21733.885494511167, 21750.076115652759, 21766.269750404736, 21782.466397645861, 21798.666056255934, 21814.868725115801, 21831.074403107345, 21847.283089113484, 21863.494782018177, 21879.709480706417, 21895.927184064229, 21912.147890978667, 21928.371600337818, 21944.598311030797, 21960.828021947746, 21977.060731979829, 21993.296440019243, 22009.535144959198, 22025.77684569393, 22042.021541118691, 22058.269230129757, 22074.519911624411, 22090.773584500959, 22107.030247658717, 22123.289899998013, 22139.552540420187, 22155.818167827587, 22172.086781123569, 22188.358379212495, 22204.632960999726, 22220.910525391639, 22237.191071295601, 22253.474597619981, 22269.761103274148, 22286.050587168469, 22302.343048214312, 22318.638485324027, 22334.936897410968, 22351.23828338947, 22367.542642174871, 22383.849972683485, 22400.160273832618, 22416.473544540564, 22432.789783726603, 22449.108990310986, 22465.431163214958, 22481.75630136074, 22498.084403671528, 22514.415469071497, 22530.749496485802, 22547.086484840562, 22563.426433062879, 22579.769340080824, 22596.115204823436, 22612.464026220721, 22628.815803203655, 22645.170534704179, 22661.5282196552, 22677.888856990587, 22694.252445645168, 22710.618984554734, 22726.988472656034, 22743.360908886778, 22759.736292185622, 22776.114621492186, 22792.495895747044, 22808.880113891719, 22825.267274868678, 22841.657377621348, 22858.050421094096, 22874.446404232243, 22890.845325982053, 22907.247185290722, 22923.651981106406, 22940.059712378195, 22956.470378056114, 22972.883977091129, 22989.300508435153, 23005.719971041017, 23022.142363862498, 23038.567685854305, 23054.995935972078, 23071.427113172387, 23087.86121641273, 23104.298244651531, 23120.738196848146, 23137.181071962848, 23153.626868956846, 23170.075586792263, 23186.527224432142, 23202.981780840448, 23219.439254982066, 23235.899645822796, 23252.362952329357, 23268.829173469378, 23285.298308211408, 23301.770355524899, 23318.245314380223, 23334.723183748658, 23351.203962602387, 23367.687649914504, 23384.174244659007, 23400.663745810798, 23417.15615234568, 23433.651463240367, 23450.149677472462, 23466.650794020472, 23483.154811863806, 23499.661729982763, 23516.171547358543, 23532.684262973235, 23549.199875809823, 23565.718384852185, 23582.239789085092, 23598.764087494197, 23615.291279066041, 23631.821362788058, 23648.354337648565, 23664.890202636761, 23681.428956742733, 23697.970598957443, 23714.515128272738, 23731.062543681343, 23747.612844176863, 23764.166028753778, 23780.72209640744, 23797.281046134085, 23813.842876930816, 23830.407587795606, 23846.975177727301, 23863.545645725622, 23880.11899079115, 23896.695211925336, 23913.274308130498, 23929.856278409821, 23946.441121767348, 23963.028837207989, 23979.619423737513, 23996.212880362549, 24012.809206090584, 24029.408399929966, 24046.010460889898, 24062.615387980433, 24079.223180212492, 24095.833836597827, 24112.447356149063, 24129.063737879667, 24145.682980803951, 24162.305083937081, 24178.930046295067, 24195.557866894767, 24212.188544753884, 24228.822078890964, 24245.458468325389, 24262.097712077397, 24278.739809168052, 24295.384758619261, 24312.032559453768, 24328.683210695162, 24345.336711367858, 24361.993060497109, 24378.652257108995, 24395.314300230442, 24411.979188889192, 24428.646922113825, 24445.317498933746, 24461.990918379193, 24478.667179481225, 24495.346281271726, 24512.028222783407, 24528.713003049801, 24545.400621105266, 24562.091075984976, 24578.784366724925, 24595.480492361927, 24612.179451933614, 24628.881244478438, 24645.585869035654, 24662.293324645343, 24679.003610348394, 24695.716725186514, 24712.432668202211, 24729.151438438807, 24745.873034940436, 24762.597456752032, 24779.324702919344, 24796.054772488926, 24812.787664508123, 24829.5233780251, 24846.261912088819, 24863.003265749034, 24879.747438056307, 24896.494428062004, 24913.244234818278, 24929.996857378079, 24946.752294795166, 24963.510546124078, 24980.271610420157, 24997.035486739525, 25013.802174139113, 25030.571671676629, 25047.343978410572, 25064.119093400237, 25080.897015705697, 25097.677744387816, 25114.461278508239, 25131.2476171294, 25148.036759314517, 25164.828704127583, 25181.623450633375, 25198.42099789745, 25215.221344986145, 25232.024490966574, 25248.830434906627, 25265.639175874974, 25282.450712941049, 25299.265045175071, 25316.082171648024, 25332.902091431668, 25349.724803598532, 25366.550307221914, 25383.378601375884, 25400.209685135269, 25417.043557575678, 25433.880217773472, 25450.719664805783, 25467.561897750507, 25484.406915686297, 25501.254717692573, 25518.105302849512, 25534.958670238051, 25551.814818939893, 25568.67374803748, 25585.535456614027, 25602.399943753502, 25619.267208540619, 25636.137250060852, 25653.010067400432, 25669.885659646327, 25686.76402588627, 25703.645165208734, 25720.529076702944, 25737.415759458876, 25754.305212567244, 25771.197435119517, 25788.092426207899, 25804.990184925344, 25821.890710365547, 25838.794001622944, 25855.700057792714, 25872.608877970775, 25889.520461253778, 25906.434806739118, 25923.351913524923, 25940.271780710063, 25957.194407394138, 25974.11979267748, 25991.047935661154, 26007.978835446964, 26024.912491137442, 26041.848901835841, 26058.788066646157, 26075.729984673108, 26092.674655022136, 26109.622076799409, 26126.572249111829, 26143.525171067016, 26160.480841773315, 26177.43926033979, 26194.400425876229, 26211.364337493149, 26228.330994301767, 26245.30039541404, 26262.272539942627, 26279.247427000919, 26296.225055703002, 26313.205425163702, 26330.188534498539, 26347.174382823756, 26364.162969256304, 26381.154292913852, 26398.148352914774, 26415.145148378149, 26432.144678423778, 26449.146942172156, 26466.151938744493, 26483.159667262702, 26500.170126849403, 26517.183316627921, 26534.199235722277, 26551.217883257199, 26568.239258358124, 26585.263360151173, 26602.290187763181, 26619.319740321676, 26636.352016954883, 26653.387016791727, 26670.424738961825, 26687.465182595493, 26704.508346823739, 26721.554230778267, 26738.602833591467, 26755.65415439643, 26772.708192326929, 26789.764946517433, 26806.824416103096, 26823.886600219761, 26840.95149800396, 26858.019108592915, 26875.089431124517, 26892.162464737365, 26909.238208570721, 26926.316661764544, 26943.397823459472, 26960.481692796813, 26977.568268918571, 26994.657550967422, 27011.749538086722, 27028.844229420498, 27045.941624113464, 27063.041721311005, 27080.144520159181, 27097.250019804727, 27114.35821939505, 27131.469118078236, 27148.582715003027, 27165.699009318858, 27182.818000175819, 27199.939686724665, 27217.064068116837, 27234.191143504428, 27251.320912040203, 27268.453372877593, 27285.588525170693, 27302.726368074269, 27319.866900743735, 27337.010122335181, 27354.156032005358, 27371.304628911668, 27388.455912212183, 27405.609881065626, 27422.766534631384, 27439.925872069507, 27457.087892540683, 27474.252595206275, 27491.419979228293, 27508.5900437694, 27525.762787992917, 27542.93821106281, 27560.116312143706, 27577.297090400876, 27594.480545000242, 27611.666675108383, 27628.855479892518, 27646.046958520514, 27663.241110160889, 27680.437933982801, 27697.637429156068, 27714.839594851132, 27732.04443023909, 27749.251934491687, 27766.462106781299, 27783.674946280949, 27800.890452164302, 27818.108623605654, 27835.329459779954, 27852.55295986278, 27869.779123030345, 27887.007948459504, 27904.239435327745, 27921.473582813196, 27938.710390094613, 27955.949856351392, 27973.19198076355, 27990.436762511745, 28007.684200777272, 28024.934294742041, 28042.187043588601, 28059.442446500128, 28076.700502660427, 28093.961211253929, 28111.224571465693, 28128.490582481401, 28145.759243487362, 28163.030553670509, 28180.304512218394, 28197.581118319198, 28214.860371161725, 28232.14226993539, 28249.42681383024, 28266.71400203693, 28284.003833746745, 28301.296308151585, 28318.591424443959, 28335.889181817001, 28353.189579464462, 28370.492616580705, 28387.798292360701, 28405.106606000048, 28422.417556694945, 28439.731143642206, 28457.047366039264, 28474.366223084147, 28491.687713975512, 28509.011837912611, 28526.338594095305, 28543.667981724069, 28560.999999999982, 28578.334648124732, 28595.671925300605, 28613.011830730498, 28630.354363617909, 28647.699523166943, 28665.0473085823, 28682.397719069289, 28699.750753833818, 28717.10641208239, 28734.464693022121, 28751.825595860708, 28769.189119806462, 28786.55526406828, 28803.924027855664, 28821.295410378701, 28838.669410848088, 28856.046028475103, 28873.425262471628, 28890.80711205013, 28908.191576423673, 28925.578654805915, 28942.968346411097, 28960.360650454055, 28977.755566150216, 28995.153092715591, 29012.553229366786, 29029.955975320987, 29047.361329795975, 29064.769292010107, 29082.179861182336, 29099.593036532187, 29117.00881727978, 29134.427202645813, 29151.848191851568, 29169.271784118911, 29186.697978670283, 29204.126774728706, 29221.55817151779, 29238.992168261717, 29256.42876418525, 29273.867958513725, 29291.309750473058, 29308.754139289747, 29326.201124190855, 29343.65070440403, 29361.102879157483, 29378.557647680012, 29396.015009200975, 29413.474962950309, 29430.937508158524, 29448.402644056692, 29465.870369876469, 29483.340684850071, 29500.81358821028, 29518.289079190454, 29535.767157024511, 29553.247820946945, 29570.731070192807, 29588.216903997723, 29605.70532159787, 29623.19632223, 29640.689905131429, 29658.186069540028, 29675.684814694236, 29693.186139833047, 29710.690044196028, 29728.196527023298, 29745.705587555527, 29763.217225033964, 29780.731438700397, 29798.248227797183, 29815.76759156723, 29833.289529254005, 29850.81404010153, 29868.341123354381, 29885.870778257693, 29903.403004057145, 29920.937799998974, 29938.475165329975, 29956.015099297485, 29973.557601149394, 29991.102670134147, 30008.650305500738, 30026.200506498706, 30043.753272378144, 30061.308602389683, 30078.866495784507, 30096.426951814352, 30113.989969731494, 30131.55554878875, 30149.123688239491, 30166.694387337629, 30184.267645337608, 30201.843461494434, 30219.42183506364, 30237.002765301309, 30254.586251464058, 30272.172292809046, 30289.760888593977, 30307.35203807709, 30324.94574051716, 30342.541995173502, 30360.140801305966, 30377.742158174944, 30395.346065041358, 30412.952521166666, 30430.561525812864, 30448.173078242475, 30465.787177718561, 30483.403823504719, 30501.02301486507, 30518.644751064272, 30536.269031367516, 30553.895855040515, 30571.525221349519, 30589.157129561307, 30606.791578943175, 30624.428568762964, 30642.06809828903, 30659.710166790261, 30677.35477353607, 30695.001917796391, 30712.651598841687, 30730.303815942945, 30747.958568371676, 30765.615855399912, 30783.275676300211, 30800.938030345646, 30818.602916809814, 30836.270334966837, 30853.940284091354, 30871.612763458521, 30889.287772344011, 30906.965310024025, 30924.645375775272, 30942.327968874983, 30960.013088600903, 30977.700734231294, 30995.390905044929, 31013.083600321101, 31030.778819339619, 31048.476561380798, 31066.17682572547, 31083.879611654978, 31101.584918451179, 31119.29274539644, 31137.003091773637, 31154.715956866155, 31172.431339957893, 31190.14924033326, 31207.869657277162, 31225.592590075023, 31243.318038012771, 31261.046000376838, 31278.776476454172, 31296.50946553221, 31314.24496689891, 31331.98297984272, 31349.7235036526, 31367.466537618013, 31385.212081028923, 31402.960133175795, 31420.710693349596, 31438.463760841791, 31456.219334944351, 31473.977414949743, 31491.738000150934, 31509.501089841389, 31527.266683315069, 31545.034779866437, 31562.80537879045, 31580.578479382562, 31598.35408093872, 31616.132182755369, 31633.91278412945, 31651.695884358396, 31669.481482740131, 31687.269578573076, 31705.060171156143, 31722.853259788735, 31740.648843770748, 31758.446922402567, 31776.247494985066, 31794.050560819614, 31811.85611920806, 31829.664169452753, 31847.474710856521, 31865.287742722685, 31883.103264355046, 31900.921275057899, 31918.741774136019, 31936.564760894671, 31954.390234639599, 31972.21819467704, 31990.048640313704, 32007.881570856793, 32025.716985613984, 32043.554883893445, 32061.395265003815, 32079.238128254223, 32097.083472954269, 32114.931298414049, 32132.781603944117, 32150.634388855524, 32168.48965245979, 32186.347394068915, 32204.207612995371, 32222.07030855212, 32239.935480052583, 32257.803126810672, 32275.673248140767, 32293.545843357719, 32311.420911776862, 32329.298452713996, 32347.178465485395, 32365.060949407813, 32382.945903798463, 32400.83332797504, 32418.723221255706, 32436.615582959093, 32454.510412404306, 32472.407708910916, 32490.307471798966, 32508.209700388961, 32526.114394001877, 32544.021551959166, 32561.931173582732, 32579.843258194956, 32597.757805118679, 32615.674813677211, 32633.594283194328, 32651.516212994258, 32669.440602401712, 32687.367450741847, 32705.296757340297, 32723.228521523146, 32741.162742616943, 32759.099419948703, 32777.038552845901, 32794.980140636464, 32812.924182648792, 32830.87067821173, 32848.819626654593, 32866.77102730715, 32884.724879499619, 32902.681182562686, 32920.639935827494, 32938.601138625643, 32956.56479028918, 32974.530890150607, 32992.499437542894, 33010.470431799447, 33028.443872254145, 33046.419758241311, 33064.39808909571, 33082.378864152583, 33100.36208274759, 33118.347744216881, 33136.335847897026, 33154.326393125062, 33172.31937923847, 33190.314805575174, 33208.312671473555, 33226.312976272442, 33244.315719311111, 33262.320899929284, 33280.328517467125, 33298.33857126526, 33316.351060664747, 33334.365985007091, 33352.383343634239, 33370.403135888591, 33388.42536111299, 33406.450018650721, 33424.477107845501, 33442.506628041512, 33460.53857858335, 33478.572958816083, 33496.609768085189, 33514.649005736617, 33532.690671116739, 33550.734763572356, 33568.781282450735, 33586.830227099563, 33604.881596866973, 33622.935391101528, 33640.991609152239, 33659.050250368542, 33677.111314100322, 33695.174799697881, 33713.240706511984, 33731.309033893805, 33749.37978119497, 33767.452947767531, 33785.528532963974, 33803.606536137209, 33821.686956640602, 33839.769793827938, 33857.855047053425, 33875.942715671707, 33894.032799037872, 33912.125296507431, 33930.220207436316, 33948.317531180888, 33966.417267097961, 33984.519414544746, 34002.623972878901, 34020.730941458511, 34038.840319642077, 34056.952106788536, 34075.066302257255, 34093.182905408015, 34111.301915601027, 34129.42333219693, 34147.547154556785, 34165.673382042078, 34183.80201401472, 34201.933049837033, 34220.06648887178, 34238.202330482141, 34256.340574031703, 34274.481218884495, 34292.624264404949, 34310.769709957938, 34328.91755490873, 34347.067798623029, 34365.220440466954, 34383.375479807051, 34401.532916010263, 34419.692748443973, 34437.854976475966, 34456.01959947445, 34474.18661680806, 34492.356027845817, 34510.527831957188, 34528.702028512052, 34546.878616880676, 34565.05759643377, 34583.238966542449, 34601.422726578232, 34619.608875913065, 34637.797413919296, 34655.988339969692, 34674.181653437423, 34692.37735369608, 34710.575440119668, 34728.775912082579, 34746.978768959649, 34765.184010126082, 34783.391634957537, 34801.60164283005, 34819.814033120063, 34838.028805204456, 34856.24595846048, 34874.465492265823, 34892.687405998557, 34910.911699037177, 34929.138370760564, 34947.367420548027, 34965.598847779271, 34983.832651834389, 35002.068832093908, 35020.307387938738, 35038.548318750189, 35056.79162390998, 35075.03730280025, 35093.285354803513, 35111.535779302685, 35129.788575681116, 35148.043743322516, 35166.301281611013, 35184.561189931141, 35202.823467667826, 35221.088114206388, 35239.355128932555, 35257.624511232447, 35275.896260492584, 35294.170376099886, 35312.446857441668, 35330.725703905628, 35349.006914879887, 35367.290489752944, 35385.576427913686, 35403.864728751418, 35422.155391655811, 35440.448416016967, 35458.743801225341, 35477.041546671804, 35495.341651747622, 35513.644115844436, 35531.948938354304, 35550.256118669655, 35568.565656183309, 35586.877550288496, 35605.191800378816, 35623.508405848268, 35641.827366091238, 35660.148680502505, 35678.472348477233, 35696.798369410979, 35715.126742699678, 35733.457467739659, 35751.790543927644, 35770.125970660738, 35788.46374733642, 35806.803873352568, 35825.146348107453, 35843.49117099971, 35861.838341428367, 35880.187858792851, 35898.539722492955, 35916.893931928862, 35935.250486501129, 35953.609385610718, 35971.970628658957, 35990.334215047558, 36008.700144178612, 36027.068415454596, 36045.439028278372, 36063.811982053165, 36082.187276182609, 36100.564910070694, 36118.944883121789, 36137.327194740654, 36155.711844332429, 36174.098831302617, 36192.488155057115, 36210.87981500219, 36229.273810544473, 36247.670141091003, 36266.068806049167, 36284.469804826738, 36302.873136831862, 36321.278801473069, 36339.686798159251, 36358.097126299683, 36376.509785304013, 36394.924774582258, 36413.342093544816, 36431.761741602444, 36450.183718166292, 36468.608022647859, 36487.034654459028, 36505.463613012063, 36523.894897719583, 36542.328507994578, 36560.764443250409, 36579.202702900831, 36597.643286359926, 36616.086193042182, 36634.531422362437, 36652.978973735895, 36671.428846578143, 36689.881040305125, 36708.335554333149, 36726.792388078902, 36745.251540959427, 36763.713012392138, 36782.176801794812, 36800.642908585593, 36819.111332182983, 36837.582072005869, 36856.055127473483, 36874.530498005421, 36893.008183021651, 36911.488181942506, 36929.970494188674, 36948.455119181206, 36966.942056341519, 36985.431305091392, 37003.922864852961, 37022.416735048733, 37040.912915101559, 37059.411404434657, 37077.91220247162, 37096.415308636388, 37114.920722353243, 37133.428443046862, 37151.938470142253, 37170.450803064785, 37188.965441240209, 37207.482384094597, 37226.001631054402, 37244.523181546429, 37263.047034997842, 37281.573190836149, 37300.101648489224, 37318.632407385296, 37337.165466952945, 37355.700826621112, 37374.238485819085, 37392.778443976509, 37411.320700523385, 37429.865254890057, 37448.412106507232, 37466.961254805974, 37485.512699217681, 37504.066439174116, 37522.622474107404, 37541.180803449992, 37559.741426634704, 37578.304343094693, 37596.869552263488, 37615.43705357494, 37634.006846463279, 37652.578930363044, 37671.153304709165, 37689.729968936896, 37708.308922481847, 37726.890164779965, 37745.473695267559, 37764.059513381275, 37782.647618558112, 37801.238010235415, 37819.830687850859, 37838.425650842495, 37857.022898648691, 37875.622430708172, 37894.224246460013, 37912.828345343616, 37931.434726798747, 37950.043390265506, 37968.654335184328, 37987.267560995999, 38005.883067141665, 38024.500853062775, 38043.120918201159, 38061.743261998963, 38080.367883898682, 38098.994783343158, 38117.623959775563, 38136.255412639417, 38154.889141378575, 38173.525145437234, 38192.163424259939, 38210.803977291551, 38229.446803977284, 38248.091903762703, 38266.739276093685, 38285.388920416466, 38304.040836177606, 38322.695022824002, 38341.351479802899, 38360.010206561863, 38378.671202548816, 38397.334467211993, 38415.999999999978, 38434.667800361683, 38453.33786774637, 38472.010201603611, 38490.684801383337, 38509.361666535784, 38528.040796511552, 38546.722190761553, 38565.405848737035, 38584.091769889594, 38602.779953671132, 38621.470399533908, 38640.163106930493, 38658.858075313794, 38677.555304137059, 38696.254792853862, 38714.956540918094, 38733.660547783991, 38752.366812906112, 38771.075335739348, 38789.78611573892, 38808.499152360368, 38827.214445059573, 38845.931993292739, 38864.651796516388, 38883.373854187383, 38902.098165762916, 38920.824730700486, 38939.553548457938, 38958.284618493431, 38977.017940265461, 38995.753513232834, 39014.491336854699, 39033.231410590517, 39051.973733900079, 39070.718306243485, 39089.465127081188, 39108.214195873945, 39126.965512082832, 39145.719075169261, 39164.474884594965, 39183.232939821988, 39201.99324031271, 39220.755785529815, 39239.52057493633, 39258.287607995589, 39277.056884171245, 39295.828402927284, 39314.602163728006, 39333.378166038019, 39352.15640932227, 39370.936893046004, 39389.719616674811, 39408.504579674584, 39427.291781511522, 39446.081221652174, 39464.872899563372, 39483.666814712291, 39502.462966566411, 39521.261354593538, 39540.06197826178, 39558.864837039568, 39577.669930395656, 39596.47725779911, 39615.286818719302, 39634.098612625923, 39652.912638988993, 39671.728897278823, 39690.547386966064, 39709.368107521652, 39728.191058416858, 39747.016239123259, 39765.84364911275, 39784.673287857528, 39803.505154830105, 39822.339249503319, 39841.175571350293, 39860.014119844491, 39878.854894459677, 39897.697894669909, 39916.54311994958, 39935.390569773372, 39954.240243616303, 39973.092140953675, 39991.946261261117, 40010.802604014549, 40029.661168690225, 40048.521954764678, 40067.384961714779, 40086.250189017679, 40105.117636150855, 40123.98730259209, 40142.859187819471, 40161.733291311379, 40180.609612546526, 40199.488151003912, 40218.368906162854, 40237.25187750296, 40256.137064504153, 40275.024466646668, 40293.914083411029, 40312.805914278084, 40331.699958728961, 40350.596216245103, 40369.494686308273, 40388.39536840051, 40407.298262004173, 40426.20336660192, 40445.110681676706, 40464.020206711793, 40482.931941190756, 40501.845884597446, 40520.762036416032, 40539.680396130985, 40558.600963227072, 40577.523737189367, 40596.448717503234, 40615.375903654342, 40634.305295128659, 40653.236891412453, 40672.170691992294, 40691.106696355047, 40710.044903987873, 40728.985314378238, 40747.927927013901, 40766.872741382918, 40785.819756973651, 40804.768973274746, 40823.720389775161, 40842.674005964131, 40861.629821331211, 40880.587835366234, 40899.548047559321, 40918.510457400931, 40937.475064381761, 40956.441867992849, 40975.410867725499, 40994.382063071331, 41013.355453522236, 41032.331038570417, 41051.308817708363, 41070.288790428858, 41089.270956224987, 41108.255314590111, 41127.241865017888, 41146.23060700229, 41165.221540037543, 41184.214663618193, 41203.209977239079, 41222.207480395307, 41241.207172582297, 41260.209053295752, 41279.213122031659, 41298.219378286303, 41317.227821556255, 41336.23845133838, 41355.251267129832, 41374.266268428037, 41393.283454730743, 41412.302825535953, 41431.324380341983, 41450.348118647416, 41469.374039951144, 41488.402143752326, 41507.432429550427, 41526.464896845187, 41545.499545136627, 41564.536373925075, 41583.575382711126, 41602.616570995662, 41621.659938279874, 41640.705484065205, 41659.753207853406, 41678.803109146495, 41697.855187446803, 41716.909442256911, 41735.965873079709, 41755.02447941836, 41774.085260776315, 41793.148216657297, 41812.213346565331, 41831.280650004708, 41850.350126480014, 41869.421775496106, 41888.495596558132, 41907.571589171515, 41926.649752841957, 41945.730087075463, 41964.812591378286, 41983.897265256979, 42002.984108218378, 42022.073119769593, 42041.164299418015, 42060.257646671307, 42079.353161037419, 42098.450842024591, 42117.550689141324, 42136.652701896404, 42155.756879798893, 42174.863222358137, 42193.971729083758, 42213.082399485655, 42232.195233074002, 42251.310229359246, 42270.427387852127, 42289.546708063644, 42308.668189505079, 42327.791831687995, 42346.917634124227, 42366.045596325886, 42385.175717805352, 42404.307998075295, 42423.442436648642, 42442.579033038608, 42461.717786758672, 42480.858697322597, 42500.001764244422, 42519.146987038446, 42538.294365219248, 42557.443898301688, 42576.595585800882, 42595.749427232236, 42614.90542211142, 42634.063569954378, 42653.223870277317, 42672.386322596729, 42691.55092642938, 42710.717681292292, 42729.886586702756, 42749.057642178363, 42768.23084723694, 42787.406201396603, 42806.58370417574, 42825.76335509299, 42844.945153667286, 42864.129099417805, 42883.315191864014, 42902.503430525649, 42921.693814922692, 42940.88634457541, 42960.081019004348, 42979.277837730297, 42998.476800274322, 43017.677906157769, 43036.881154902228, 43056.086546029583, 43075.294079061961, 43094.503753521763, 43113.715568931671, 43132.929524814601, 43152.145620693766, 43171.363856092619, 43190.584230534907, 43209.806743544621, 43229.031394646016, 43248.258183363621, 43267.487109222224, 43286.718171746885, 43305.951370462906, 43325.186704895881, 43344.42417457165, 43363.663779016322, 43382.905517756262, 43402.149390318104, 43421.395396228749, 43440.643535015348, 43459.89380620532, 43479.146209326354, 43498.400743906379, 43517.657409473606, 43536.916205556496, 43556.177131683784, 43575.44018738444, 43594.705372187724, 43613.972685623135, 43633.242127220445, 43652.513696509668, 43671.787393021099, 43691.063216285271, 43710.341165833001, 43729.621241195346, 43748.903441903625, 43768.187767489413, 43787.474217484552, 43806.762791421126, 43826.053488831501, 43845.346309248278, 43864.641252204325, 43883.938317232765, 43903.237503866971, 43922.538811640596, 43941.842240087513, 43961.147788741881, 43980.455457138101, 43999.765244810835, 44019.077151295001, 44038.391176125755, 44057.70731883854, 44077.02557896902, 44096.345956053141, 44115.668449627083, 44134.993059227287, 44154.319784390456, 44173.648624653535, 44192.979579553728, 44212.312648628489, 44231.647831415532, 44250.985127452805, 44270.324536278538, 44289.666057431183, 44309.009690449464, 44328.355434872348, 44347.703290239064, 44367.053256089079, 44386.405331962109, 44405.759517398139, 44425.115811937387, 44444.474215120332, 44463.834726487694, 44483.197345580462, 44502.562071939843, 44521.928905107328, 44541.297844624634, 44560.668890033732, 44580.042040876848, 44599.417296696454, 44618.794657035272, 44638.174121436256, 44657.555689442641, 44676.939360597877, 44696.325134445673, 44715.713010530002, 44735.102988395054, 44754.495067585296, 44773.88924764542, 44793.285528120374, 44812.683908555344, 44832.084388495779, 44851.486967487363, 44870.891645076015, 44890.298420807922, 44909.707294229491, 44929.118264887409, 44948.531332328566, 44967.946496100136, 44987.363755749502, 45006.783110824319, 45026.204560872473, 45045.628105442098, 45065.053744081561, 45084.48147633949, 45103.911301764747, 45123.343219906426, 45142.777230313885, 45162.21333253671, 45181.651526124733, 45201.091810628037, 45220.534185596924, 45239.978650581965, 45259.425205133957, 45278.873848803938, 45298.324581143192, 45317.777401703235, 45337.232310035848, 45356.68930569302, 45376.148388226997, 45395.60955719027, 45415.072812135557, 45434.538152615823, 45454.005578184282, 45473.475088394356, 45492.946682799746, 45512.420360954362, 45531.896122412363, 45551.373966728155, 45570.853893456362, 45590.33590215187, 45609.819992369776, 45629.306163665438, 45648.794415594442, 45668.284747712612, 45687.777159576006, 45707.27165074092, 45726.768220763894, 45746.266869201696, 45765.767595611323, 45785.270399550034, 45804.775280575297, 45824.282238244828, 45843.79127211657, 45863.302381748719, 45882.815566699683, 45902.33082652813, 45921.848160792935, 45941.367569053225, 45960.889050868354, 45980.41260579793, 45999.938233401757, 46019.465933239902, 46038.995704872657, 46058.527547860547, 46078.06146176433, 46097.597446144995, 46117.135500563774, 46136.675624582109, 46156.217817761702, 46175.762079664462, 46195.308409852543, 46214.856807888333, 46234.407273334444, 46253.959805753715, 46273.51440470924, 46293.071069764315, 46312.629800482478, 46332.190596427499, 46351.753457163381, 46371.318382254351, 46390.885371264863, 46410.45442375962, 46430.025539303526, 46449.598717461733, 46469.17395779962, 46488.751259882782, 46508.33062327707, 46527.912047548532, 46547.495532263471, 46567.081076988397, 46586.668681290059, 46606.258344735434, 46625.850066891719, 46645.443847326351, 46665.039685606986, 46684.637581301497, 46704.237533978005, 46723.839543204842, 46743.443608550573, 46763.049729583989, 46782.657905874104, 46802.268136990162, 46821.880422501628, 46841.494761978196, 46861.111154989776, 46880.729601106526, 46900.350099898795, 46919.97265093719, 46939.597253792526, 46959.223908035841, 46978.852613238392, 46998.483368971691, 47018.11617480743, 47037.751030317551, 47057.387935074221, 47077.026888649809, 47096.66789061694, 47116.310940548428, 47135.956038017328, 47155.603182596918, 47175.252373860698, 47194.903611382375, 47214.556894735892, 47234.212223495422, 47253.869597235338, 47273.52901553025, 47293.19047795498, 47312.853984084577, 47332.519533494306, 47352.187125759658, 47371.856760456343, 47391.528437160297, 47411.202155447652, 47430.877914894787, 47450.555715078299, 47470.235555574982, 47489.917435961863, 47509.601355816201, 47529.287314715453, 47548.975312237308, 47568.665347959672, 47588.357421460656, 47608.051532318605, 47627.747680112072, 47647.445864419846, 47667.14608482091, 47686.848340894474, 47706.552632219973, 47726.258958377046, 47745.967318945557, 47765.677713505589, 47785.390141637428, 47805.104602921601, 47824.821096938824, 47844.539623270044, 47864.260181496429, 47883.982771199349, 47903.707391960394, 47923.434043361369, 47943.162724984308, 47962.893436411439, 47982.626177225218, 48002.36094700831, 48022.097745343599, 48041.836571814172, 48061.57742600335, 48081.32030749465, 48101.065215871815, 48120.81215071879, 48140.56111161974, 48160.312098159047, 48180.065109921306, 48199.820146491307, 48219.577207454073, 48239.336292394844, 48259.097400899045, 48278.860532552339, 48298.625686940592, 48318.392863649875, 48338.162062266485, 48357.933282376915, 48377.706523567889, 48397.481785426316, 48417.259067539344, 48437.038369494308, 48456.819690878765, 48476.603031280487, 48496.388390287451, 48516.175767487839, 48535.965162470042, 48555.756574822684, 48575.550004134566, 48595.345449994718, 48615.142911992378, 48634.942389716991, 48654.743882758201, 48674.547390705877, 48694.352913150084, 48714.160449681112, 48733.969999889443, 48753.781563365759, 48773.595139700978, 48793.410728486211, 48813.228329312769, 48833.047941772187, 48852.869565456189, 48872.693199956717, 48892.518844865925, 48912.346499776155, 48932.176164279976, 48952.007837970152, 48971.841520439666, 48991.677211281676, 49011.514910089587, 49031.354616456978, 49051.196329977654, 49071.04005024561, 49090.885776855059, 49110.733509400408, 49130.583247476279, 49150.434990677488, 49170.288738599062, 49190.144490836232, 49210.002246984441, 49229.86200663932, 49249.723769396718, 49269.587534852675, 49289.453302603448, 49309.32107224549, 49329.190843375451, 49349.062615590192, 49368.936388486785, 49388.812161662492, 49408.689934714785, 49428.569707241324, 49448.45147883999, 49468.335249108866, 49488.22101764621, 49508.108784050521, 49527.99854792047, 49547.890308854934, 49567.784066453009, 49587.679820313977, 49607.57757003732, 49627.477315222721, 49647.379055470075, 49667.28279037946, 49687.188519551179, 49707.096242585707, 49727.005959083741, 49746.917668646165, 49766.831370874068, 49786.747065368734, 49806.66475173166, 49826.584429564515, 49846.506098469203, 49866.429758047794, 49886.355407902578, 49906.283047636032, 49926.212676850846, 49946.144295149883, 49966.077902136225, 49986.013497413151, 50005.951080584135, 50025.890651252834, 50045.832209023123, 50065.775753499074, 50085.721284284933, 50105.668800985164, 50125.618303204428, 50145.569790547575, 50165.523262619652, 50185.478719025901, 50205.436159371769, 50225.395583262893, 50245.356990305103, 50265.320380104429, 50285.285752267104, 50305.253106399534, 50325.222442108337, 50345.193759000336, 50365.16705668252, 50385.142334762102, 50405.119592846473, 50425.098830543218, 50445.080047460127, 50465.063243205179, 50485.048417386541, 50505.035569612577, 50525.024699491856, 50545.015806633128, 50565.008890645338, 50585.003951137631, 50605.00098771933, 50624.999999999971, 50645.000987589265, 50665.003950097132, 50685.008887133677, 50705.015798309192, 50725.024683234165, 50745.035541519283, 50765.048372775411, 50785.063176613621, 50805.079952645159, 50825.098700481489, 50845.119419734241, 50865.142110015244, 50885.166770936521, 50905.193402110279, 50925.222003148934, 50945.252573665071, 50965.285113271471, 50985.319621581119, 51005.356098207172, 51025.394542762981, 51045.434954862096, 51065.477334118244, 51085.521680145357, 51105.567992557546, 51125.616270969113, 51145.66651499454, 51165.718724248516, 51185.772898345916, 51205.829036901778, 51225.887139531362, 51245.947205850105, 51266.009235473619, 51286.073228017718, 51306.139183098399, 51326.207100331856, 51346.276979334456, 51366.348819722756, 51386.42262111351, 51406.498383123653, 51426.57610537031, 51446.655787470787, 51466.737429042587, 51486.82102970338, 51506.906589071048, 51526.994106763632, 51547.083582399391, 51567.175015596738, 51587.268405974297, 51607.363753150858, 51627.461056745415, 51647.56031637713, 51667.661531665362, 51687.764702229651, 51707.869827689727, 51727.976907665499, 51748.085941777055, 51768.196929644677, 51788.309870888836, 51808.42476513017, 51828.541611989524, 51848.660411087905, 51868.781162046515, 51888.90386448674, 51909.028518030143, 51929.155122298485, 51949.283676913685, 51969.414181497872, 51989.546635673345, 52009.681039062583, 52029.817391288263, 52049.955691973213, 52070.095940740481, 52090.238137213273, 52110.382281014987, 52130.5283717692, 52150.676409099666, 52170.826392630333, 52190.97832198532, 52211.132196788931, 52231.288016665654, 52251.445781240145, 52271.60549013727, 52291.76714298204, 52311.930739399664, 52332.096279015546, 52352.263761455244, 52372.433186344519, 52392.604553309284, 52412.777861975665, 52432.953111969946, 52453.130302918595, 52473.309434448267, 52493.490506185793, 52513.67351775818, 52533.858468792605, 52554.045358916446, 52574.234187757254, 52594.42495494274, 52614.617660100812, 52634.812302859558, 52655.008882847229, 52675.20739969227, 52695.407853023295, 52715.610242469098, 52735.814567658657, 52756.02082822111, 52776.229023785803, 52796.439153982225, 52816.651218440056, 52836.865216789171, 52857.081148659599, 52877.29901368155, 52897.518811485425, 52917.740541701773, 52937.964203961354, 52958.18979789508, 52978.417323134046, 52998.646779309529, 53018.878166052978, 53039.111482996006, 53059.346729770419, 53079.583906008193, 53099.823011341483, 53120.0640454026, 53140.307007824063, 53160.551898238533, 53180.79871627887, 53201.047461578091, 53221.2981337694, 53241.550732486176, 53261.805257361964, 53282.061708030487, 53302.32008412564, 53322.580385281493, 53342.842611132299, 53363.106761312469, 53383.372835456597, 53403.640833199453, 53423.910754175973, 53444.18259802126, 53464.456364370613, 53484.732052859479, 53505.009663123499, 53525.289194798468, 53545.570647520362, 53565.854020925333, 53586.139314649699, 53606.426528329954, 53626.715661602764, 53647.006714104959, 53667.299685473547, 53687.59457534572, 53707.891383358816, 53728.190109150361, 53748.490752358055, 53768.793312619753, 53789.09778957349, 53809.404182857485, 53829.712492110106, 53850.022716969899, 53870.334857075584, 53890.648912066055, 53910.964881580367, 53931.28276525774, 53951.602562737586, 53971.924273659461, 53992.24789766311, 54012.57343438844, 54032.90088347553, 54053.23024456462, 54073.561517296133, 54093.894701310644, 54114.22979624891, 54134.566801751855, 54154.90571746057, 54175.246543016314, 54195.589278060506, 54215.933922234755, 54236.280475180814, 54256.628936540626, 54276.97930595628, 54297.331583070045, 54317.685767524359, 54338.041858961828, 54358.399857025215, 54378.759761357462, 54399.121571601667, 54419.485287401105, 54439.850908399218, 54460.218434239614, 54480.587864566056, 54500.95919902248, 54521.332437252997, 54541.707578901878, 54562.084623613555, 54582.46357103264, 54602.844420803893, 54623.227172572246, 54643.611825982807, 54663.998380680838, 54684.386836311773, 54704.777192521207, 54725.169448954897, 54745.563605258772, 54765.959661078923, 54786.357616061614, 54806.757469853255, 54827.159222100439, 54847.562872449904, 54867.968420548583, 54888.375866043534, 54908.785208582012, 54929.196447811417, 54949.609583379322, 54970.024614933463, 54990.441542121727, 55010.86036459219, 55031.28108199306, 55051.703693972733, 55072.128200179759, 55092.554600262847, 55112.982893870874, 55133.413080652877, 55153.845160258061, 55174.279132335789, 55194.714996535586, 55215.152752507143, 55235.592399900306, 55256.033938365079, 55276.477367551655, 55296.92268711036, 55317.369896691685, 55337.818995946305, 55358.269984525024, 55378.72286207883, 55399.177628258869, 55419.634282716441, 55440.092825103013, 55460.553255070205, 55481.015572269804, 55501.479776353764, 55521.945866974187, 55542.413843783339, 55562.883706433655, 55583.355454577715, 55603.82908786826, 55624.304605958219, 55644.782008500639, 55665.261295148754, 55685.742465555952, 55706.225519375774, 55726.710456261928, 55747.197275868275, 55767.685977848843, 55788.176561857814, 55808.669027549528, 55829.163374578478, 55849.659602599328, 55870.157711266889, 55890.657700236145, 55911.159569162221, 55931.663317700411, 55952.168945506164, 55972.676452235086, 55993.185837542944, 56013.697101085651, 56034.210242519301, 56054.72526150012, 56075.242157684508, 56095.760930729011, 56116.281580290342, 56136.804106025367, 56157.328507591104, 56177.85478464474, 56198.382936843598, 56218.912963845185, 56239.444865307138, 56259.978640887268, 56280.514290243525, 56301.051813034042, 56321.591208917082, 56342.13247755108, 56362.675618594607, 56383.220631706419, 56403.767516545398, 56424.316272770608, 56444.866900041241, 56465.419398016667, 56485.973766356394, 56506.530004720102, 56527.088112767611, 56547.648090158902, 56568.209936554107, 56588.773651613519, 56609.339234997584, 56629.9066863669, 56650.47600538221, 56671.04719170442, 56691.620244994599, 56712.195164913959, 56732.771951123868, 56753.350603285835, 56773.931121061541, 56794.513504112823, 56815.097752101647, 56835.683864690152, 56856.271841540627, 56876.86168231551, 56897.453386677393, 56918.046954289028, 56938.642384813298, 56959.239677913261, 56979.838833252121, 57000.439850493225, 57021.04272930009, 57041.647469336371, 57062.254070265873, 57082.862531752558, 57103.472853460553, 57124.085035054108, 57144.699076197649, 57165.314976555739, 57185.932735793103, 57206.552353574611, 57227.173829565276, 57247.797163430281, 57268.42235483494, 57289.049403444733, 57309.678308925286, 57330.30907094237, 57350.941689161911, 57371.576163249985, 57392.212492872815, 57412.850677696784, 57433.490717388406, 57454.132611614368, 57474.776360041491, 57495.421962336746, 57516.069418167266, 57536.718727200314, 57557.36988910332, 57578.022903543861, 57598.677770189643, 57619.334488708548, 57639.993058768589, 57660.653480037938, 57681.315752184906, 57701.979874877965, 57722.64584778573, 57743.31367057695, 57763.983342920546, 57784.654864485572, 57805.328234941233, 57826.003453956881, 57846.680521202026, 57867.359436346305, 57888.040199059527, 57908.722809011633, 57929.407265872709, 57950.093569313001, 57970.781719002895, 57991.471714612911, 58012.16355581375, 58032.857242276223, 58053.552773671312, 58074.25014967013, 58094.949369943948, 58115.650434164185, 58136.353342002389, 58157.058093130276, 58177.764687219693, 58198.47312394264, 58219.183402971255, 58239.895523977837, 58260.609486634821, 58281.325290614775, 58302.042935590434, 58322.762421234678, 58343.483747220511, 58364.206913221096, 58384.931918909751, 58405.658763959924, 58426.3874480452, 58447.117970839339, 58467.85033201622, 58488.584531249864, 58509.320568214462, 58530.058442584334, 58550.798154033931, 58571.539702237875, 58592.283086870906, 58613.028307607929, 58633.775364123983, 58654.52425609425, 58675.274983194053, 58696.027545098877, 58716.781941484325, 58737.538172026158, 58758.296236400274, 58779.056134282728, 58799.817865349694, 58820.581429277503, 58841.346825742643, 58862.114054421712, 58882.883114991484, 58903.654007128847, 58924.426730510851, 58945.201284814684, 58965.977669717664, 58986.755884897269, 59007.535930031117, 59028.317804796949, 59049.101508872664, 59069.887041936301, 59090.674403666046, 59111.463593740213, 59132.254611837263, 59153.047457635803, 59173.84213081457, 59194.638631052461, 59215.436958028506, 59236.237111421855, 59257.039090911829, 59277.842896177877, 59298.648526899589, 59319.455982756685, 59340.26526342905, 59361.076368596696, 59381.889297939757, 59402.704051138542, 59423.520627873484, 59444.339027825139, 59465.159250674224, 59485.9812961016, 59506.805163788253, 59527.630853415307, 59548.458364664046, 59569.287697215863, 59590.118850752311, 59610.951824955089, 59631.786619506012, 59652.623234087048, 59673.461668380311, 59694.301922068029, 59715.143994832593, 59735.987886356525, 59756.833596322482, 59777.681124413255, 59798.530470311794, 59819.381633701159, 59840.234614264569, 59861.089411685381, 59881.94602564707, 59902.804455833269, 59923.664701927737, 59944.526763614384, 59965.390640577243, 59986.256332500488, 60007.123839068438, 60027.993159965539, 60048.864294876381, 60069.737243485688, 60090.612005478324, 60111.488580539284, 60132.366968353708, 60153.247168606867, 60174.129180984164, 60195.013005171153, 60215.898640853513, 60236.786087717061, 60257.675345447751, 60278.566413731671, 60299.459292255044, 60320.353980704247, 60341.25047876576, 60362.148786126229, 60383.048902472423, 60403.950827491237, 60424.854560869717, 60445.76010229504, 60466.667451454516, 60487.57660803559, 60508.487571725847, 60529.400342212997, 60550.314919184893, 60571.231302329521, 60592.149491335003, 60613.069485889588, 60633.991285681674, 60654.914890399785, 60675.840299732568, 60696.767513368832, 60717.696530997484, 60738.627352307602, 60759.55997698837, 60780.494404729128, 60801.430635219323, 60822.368668148556, 60843.308503206565, 60864.250140083204, 60885.193578468468, 60906.138818052495, 60927.085858525541, 60948.034699578006, 60968.985340900421, 60989.937782183442, 61010.892023117864, 61031.848063394616, 61052.805902704764, 61073.765540739492, 61094.726977190134, 61115.690211748137, 61136.655244105103, 61157.622073952742, 61178.590700982917, 61199.561124887616, 61220.533345358948, 61241.507362089171, 61262.483174770663, 61283.460783095943, 61304.440186757645, 61325.421385448557, 61346.404378861582, 61367.389166689762, 61388.375748626262, 61409.364124364387, 61430.354293597571, 61451.346256019373, 61472.340011323497, 61493.335559203762, 61514.332899354122, 61535.332031468672, 61556.332955241618, 61577.335670367313, 61598.340176540238, 61619.346473454993, 61640.354560806329, 61661.3644382891, 61682.376105598312, 61703.389562429089, 61724.404808476691, 61745.42184343651, 61766.440667004063, 61787.461278874987, 61808.483678745069, 61829.507866310203, 61850.533841266435, 61871.561603309929, 61892.591152136971, 61913.622487443987, 61934.655608927525, 61955.690516284267, 61976.727209211022, 61997.765687404724, 62018.805950562448, 62039.847998381381, 62060.891830558845, 62081.93744679229, 62102.984846779298, 62124.034030217575, 62145.084996804966, 62166.137746239416, 62187.19227821903, 62208.248592442025, 62229.306688606739, 62250.366566411656, 62271.428225555377, 62292.491665736627, 62313.556886654267, 62334.623888007271, 62355.692669494762, 62376.763230815974, 62397.835571670272, 62418.909691757144, 62439.98559077621, 62461.063268427228, 62482.142724410049, 62503.223958424685, 62524.306970171267, 62545.39175935003, 62566.478325661366, 62587.566668805768, 62608.656788483881, 62629.748684396451, 62650.842356244357, 62671.937803728622, 62693.035026550366, 62714.134024410858, 62735.234797011479, 62756.337344053733, 62777.441665239276, 62798.547760269852, 62819.655628847358, 62840.765270673801, 62861.876685451323, 62882.989872882186, 62904.104832668774, 62925.221564513602, 62946.340068119309, 62967.460343188657, 62988.582389424526, 63009.70620652994, 63030.831794208025, 63051.959152162039, 63073.08828009537, 63094.219177711529, 63115.351844714154, 63136.486280806988, 63157.622485693922, 63178.760459078956, 63199.900200666219, 63221.041710159967, 63242.184987264569, 63263.330031684534, 63284.476843124474, 63305.625421289144, 63326.775765883409, 63347.927876612259, 63369.081753180813, 63390.237395294316, 63411.39480265812, 63432.553974977716, 63453.714911958712, 63474.877613306839, 63496.042078727944, 63517.208307927998, 63538.376300613119, 63559.546056489504, 63580.717575263516, 63601.890856641607, 63623.065900330374, 63644.242706036515, 63665.421273466869, 63686.601602328381, 63707.783692328136, 63728.967543173334, 63750.153154571279, 63771.340526229418, 63792.529657855317, 63813.720549156649, 63834.913199841227, 63856.107609616978, 63877.303778191941, 63898.501705274284, 63919.7013905723, 63940.902833794404, 63962.106034649114, 63983.310992845094, 64004.517708091109, 64025.726180096048, 64046.936408568938, 64068.1483932189, 64089.362133755196, 64110.577629887193, 64131.794881324393, 64153.013887776404, 64174.234648952966, 64195.457164563937, 64216.681434319289, 64237.907457929112, 64259.135235103626, 64280.36476555316, 64301.596048988169, 64322.829085119236, 64344.06387365704, 64365.300414312398, 64386.538706796251, 64407.778750819634, 64429.020546093721, 64450.26409232981, 64471.509389239291, 64492.756436533709, 64514.005233924705, 64535.255781124033, 64556.50807784358, 64577.762123795357, 64599.017918691468, 64620.275462244172, 64641.534754165805, 64662.795794168844, 64684.058581965895, 64705.323117269661, 64726.589399792974, 64747.857429248776, 64769.127205350138, 64790.398727810236, 64811.671996342375, 64832.947010659969, 64854.223770476558, 64875.502275505794, 64896.782525461451, 64918.064520057414, 64939.348259007682, 64960.633742026388, 64981.920968827762, 65003.209939126165, 65024.500652636067, 65045.793109072067, 65067.087308148861, 65088.383249581282, 65109.680933084259, 65130.980358372864, 65152.28152516226, 65173.584433167736, 65194.889082104703, 65216.195471688683, 65237.503601635319, 65258.813471660353, 65280.125081479666, 65301.438430809241, 65322.753519365178, 65344.070346863708, 65365.388913021146, 65386.709217553958, 65408.031260178701, 65429.355040612056, 65450.680558570821, 65472.00781377191, 65493.336805932355, 65514.66753476928, 65535.999999999956, 65557.334201341757, 65578.670138512171, 65600.007811228788, 65621.347219209332, 65642.688362171626, 65664.031239833639, 65685.375851913413, 65706.722198129137, 65728.070278199084, 65749.420091841661, 65770.771638775404, 65792.124918718939, 65813.479931391004, 65834.836676510458, 65856.195153796303, 65877.5553629676, 65898.917303743554, 65920.280975843489, 65941.646378986843, 65963.013512893158, 65984.382377282076, 66005.752971873386, 66027.125296386963, 66048.499350542799, 66069.875134061018, 66091.252646661844, 66112.631888065618, 66134.01285799277, 66155.395556163887, 66176.779982299631, 66198.166136120795, 66219.554017348273, 66240.943625703105, 66262.334960906388, 66283.728022679396, 66305.122810743444, 66326.519324820023, 66347.917564630698, 66369.317529897162, 66390.719220341227, 66412.122635684791, 66433.527775649884, 66454.934639958636, 66476.343228333324, 66497.753540496284, 66519.165576169995, 66540.57933507704, 66561.994816940118, 66583.412021482043, 66604.830948425733, 66626.251597494222, 66647.673968410629, 66669.098060898235, 66690.523874680381, 66711.951409480564, 66733.380665022371, 66754.811641029475, 66776.244337225711, 66797.678753334985, 66819.11488908132, 66840.552744188884, 66861.992318381905, 66883.433611384738, 66904.876622921889, 66926.321352717903, 66947.767800497502, 66969.215965985466, 66990.665848906734, 67012.117448986304, 67033.570765949335, 67055.025799521056, 67076.482549426815, 67097.941015392076, 67119.401197142433, 67140.863094403554, 67162.326706901222, 67183.792034361351, 67205.259076509959, 67226.72783307315, 67248.198303777172, 67269.670488348347, 67291.144386513144, 67312.619997998088, 67334.09732252988, 67355.576359835293, 67377.057109641188, 67398.53957167457, 67420.023745662547, 67441.50963133233, 67462.99722841123, 67484.486536626689, 67505.977555706224, 67527.470285377494, 67548.964725368263, 67570.460875406367, 67591.9587352198, 67613.458304536631, 67634.95958308503, 67656.462570593329, 67677.967266789899, 67699.473671403248, 67720.981784162024, 67742.491604794923, 67764.003133030797, 67785.516368598575, 67807.031311227314, 67828.547960646174, 67850.066316584402, 67871.58637877139, 67893.108146936589, 67914.63162080961, 67936.156800120138, 67957.683684597971, 67979.212273973011, 68000.742567975263, 68022.274566334876, 68043.808268782057, 68065.343675047145, 68086.880784860579, 68108.419597952918, 68129.960114054789, 68151.502332896969, 68173.04625421032, 68194.591877725834, 68216.139203174564, 68237.688230287706, 68259.238958796544, 68280.791388432481, 68302.345518927032, 68323.901350011787, 68345.458881418483, 68367.018112878912, 68388.579044125028, 68410.141674888844, 68431.706004902502, 68453.272033898262, 68474.839761608455, 68496.409187765545, 68517.980312102081, 68539.553134350732, 68561.127654244279, 68582.70387151558, 68604.281785897634, 68625.861397123503, 68647.44270492639, 68669.025709039604, 68690.610409196524, 68712.196805130661, 68733.784896575627, 68755.374683265123, 68776.966164932994, 68798.559341313128, 68820.154212139591, 68841.750777146473, 68863.349036068044, 68884.948988638629, 68906.550634592684, 68928.153973664739, 68949.75900558944, 68971.365730101577, 68992.974146935987, 69014.584255827634, 69036.196056511588, 69057.809548723017, 69079.424732197207, 69101.041606669532, 69122.660171875468, 69144.280427550606, 69165.902373430625, 69187.526009251334, 69209.151334748618, 69230.778349658474, 69252.40705371699, 69274.037446660412, 69295.669528225, 69317.303298147192, 69338.938756163494, 69360.575902010532, 69382.214735425005, 69403.855256143754, 69425.497463903681, 69447.141358441833, 69468.78693949533, 69490.434206801394, 69512.083160097391, 69533.733799120717, 69555.386123608929, 69577.04013329967, 69598.695827930685, 69620.353207239794, 69642.012270964973, 69663.67301884426, 69685.335450615792, 69706.999566017839, 69728.665364788743, 69750.332846666963, 69772.002011391058, 69793.672858699691, 69815.345388331611, 69837.019600025669, 69858.695493520849, 69880.373068556204, 69902.052324870907, 69923.733262204216, 69945.415880295492, 69967.100178884211, 69988.786157709939, 70010.473816512356, 70032.163155031216, 70053.854173006403, 70075.546870177874, 70097.241246285717, 70118.937301070109, 70140.635034271298, 70162.334445629691, 70184.035534885741, 70205.738301780017, 70227.442746053217, 70249.1488674461, 70270.856665699539, 70292.566140554511, 70314.277291752107, 70335.990119033493, 70357.704622139936, 70379.420800812819, 70401.138654793613, 70422.85818382389, 70444.579387645339, 70466.302265999722, 70488.026818628918, 70509.753045274876, 70531.480945679708, 70553.210519585555, 70574.941766734701, 70596.674686869505, 70618.409279732456, 70640.145545066101, 70661.883482613106, 70683.623092116264, 70705.364373318414, 70727.107325962526, 70748.851949791671, 70770.598244549008, 70792.346209977783, 70814.095845821372, 70835.847151823225, 70857.600127726895, 70879.354773276034, 70901.111088214413, 70922.869072285859, 70944.628725234332, 70966.390046803877, 70988.153036738629, 71009.917694782853, 71031.684020680885, 71053.45201417715, 71075.221675016204, 71096.993002942661, 71118.765997701266, 71140.540659036851, 71162.316986694335, 71184.09498041874, 71205.874639955218, 71227.655965048951, 71249.438955445294, 71271.223610889632, 71293.009931127483, 71314.797915904477, 71336.587564966307, 71358.378878058764, 71380.171854927772, 71401.966495319313, 71423.762798979486, 71445.560765654489, 71467.360395090596, 71489.161687034211, 71510.964641231811, 71532.769257429973, 71554.575535375348, 71576.383474814749, 71598.19307549503, 71620.004337163133, 71641.817259566145, 71663.631842451214, 71685.4480855656, 71707.26598865664, 71729.085551471784, 71750.906773758586, 71772.729655264673, 71794.554195737772, 71816.380394925713, 71838.208252576442, 71860.037768437964, 71881.868942258385, 71903.701773785942, 71925.536262768932, 71947.372408955751, 71969.210212094898, 71991.049671934976, 72012.890788224686, 72034.73356071279, 72056.577989148165, 72078.424073279821, 72100.271812856794, 72122.121207628254, 72143.97225734347, 72165.824961751801, 72187.679320602692, 72209.53533364569, 72231.393000630429, 72253.252321306645, 72275.113295424177, 72296.975922732949, 72318.840202982959, 72340.706135924338, 72362.573721307272, 72384.442958882093, 72406.313848399179, 72428.186389609036, 72450.060582262216, 72471.936426109431, 72493.813920901433, 72515.693066389096, 72537.573862323392, 72559.456308455352, 72581.340404536139, 72603.226150316987, 72625.113545549248, 72647.002589984331, 72668.893283373764, 72690.785625469172, 72712.679616022273, 72734.575254784853, 72756.472541508803, 72778.371475946144, 72800.272057848939, 72822.174286969355, 72844.07816305969, 72865.983685872285, 72887.890855159596, 72909.799670674183, 72931.710132168693, 72953.622239395845, 72975.535992108475, 72997.451390059519, 73019.368433001961, 73041.287120688925, 73063.207452873612, 73085.129429309294, 73107.053049749389, 73128.978313947344, 73150.905221656736, 73172.833772631217, 73194.763966624567, 73216.695803390612, 73238.62928268328, 73260.564404256627, 73282.501167864757, 73304.439573261901, 73326.379620202337, 73348.321308440485, 73370.264637730841, 73392.209607827957, 73414.156218486532, 73436.104469461323, 73458.054360507173, 73480.005891379056, 73501.959061831993, 73523.913871621116, 73545.870320501665, 73567.828408228932, 73589.78813455833, 73611.749499245358, 73633.712502045615, 73655.677142714747, 73677.643421008557, 73699.611336682879, 73721.580889493693, 73743.552079197019, 73765.524905548999, 73787.499368305856, 73809.475467223907, 73831.453202059551, 73853.432572569291, 73875.413578509717, 73897.396219637507, 73919.380495709411, 73941.36640648231, 73963.353951713143, 73985.343131158952, 74007.333944576865, 74029.326391724098, 74051.320472357969, 74073.316186235883, 74095.313533115303, 74117.312512753837, 74139.313124909138, 74161.315369338976, 74183.319245801191, 74205.324754053727, 74227.331893854629, 74249.340664961986, 74271.351067134034, 74293.363100129049, 74315.376763705441, 74337.392057621662, 74359.408981636298, 74381.427535508003, 74403.447718995507, 74425.469531857671, 74447.492973853383, 74469.518044741693, 74491.54474428168, 74513.573072232539, 74535.603028353551, 74557.634612404087, 74579.667824143602, 74601.702663331642, 74623.739129727837, 74645.777223091936, 74667.816943183716, 74689.858289763113, 74711.901262590094, 74733.945861424741, 74755.992086027225, 74778.039936157802, 74800.089411576817, 74822.140512044702, 74844.193237321961, 74866.24758716923, 74888.303561347187, 74910.36115961663, 74932.420381738411, 74954.481227473516, 74976.543696582972, 74998.607788827925, 75020.673503969607, 75042.740841769322, 75064.809801988464, 75086.88038438854, 75108.952588731103, 75131.026414777836, 75153.101862290467, 75175.178931030852, 75197.257620760924, 75219.33793124267, 75241.419862238225, 75263.503413509738, 75285.588584819503, 75307.675375929874, 75329.763786603318, 75351.853816602365, 75373.945465689612, 75396.038733627807, 75418.133620179724, 75440.230125108254, 75462.32824817636, 75484.427989147109, 75506.529347783653, 75528.63232384919, 75550.736917107075, 75572.843127320695, 75594.950954253538, 75617.060397669193, 75639.171457331307, 75661.284133003646, 75683.398424450032, 75705.514331434402, 75727.631853720741, 75749.750991073175, 75771.871743255862, 75793.994110033076, 75816.118091169177, 75838.243686428585, 75860.370895575848, 75882.499718375562, 75904.630154592422, 75926.762203991224, 75948.895866336825, 75971.031141394182, 75993.168028928325, 76015.306528704401, 76037.4466404876, 76059.588364043215, 76081.731699136653, 76103.876645533353, 76126.023202998884, 76148.171371298871, 76170.321150199044, 76192.472539465205, 76214.625538863256, 76236.780148159174, 76258.936367119008, 76281.094195508922, 76303.253633095141, 76325.414679643975, 76347.577334921851, 76369.741598695226, 76391.907470730686, 76414.074950794879, 76436.244038654564, 76458.414734076548, 76480.587036827754, 76502.760946675175, 76524.936463385893, 76547.11358672705, 76569.292316465915, 76591.472652369819, 76613.654594206164, 76635.838141742468, 76658.023294746308, 76680.210052985349, 76702.398416227341, 76724.588384240138, 76746.779956791637, 76768.973133649866, 76791.167914582897, 76813.364299358902, 76835.562287746157, 76857.761879512967, 76879.963074427797, 76902.165872259109, 76924.37027277553, 76946.576275745727, 76968.783880938441, 76990.993088122515, 77013.203897066895, 77035.416307540567, 77057.630319312622, 77079.845932152239, 77102.063145828695, 77124.281960111301, 77146.50237476948, 77168.724389572759, 77190.948004290723, 77213.173218693031, 77235.400032549442, 77257.628445629802, 77279.858457704031, 77302.090068542122, 77324.323277914169, 77346.558085590339, 77368.794491340886, 77391.032494936138, 77413.272096146524, 77435.51329474253, 77457.756090494731, 77480.000483173804, 77502.246472550498, 77524.494058395634, 77546.743240480107, 77568.994018574944, 77591.246392451198, 77613.500361880026, 77635.755926632657, 77658.013086480438, 77680.271841194757, 77702.532190547092, 77724.794134309021, 77747.057672252195, 77769.322804148323, 77791.589529769248, 77813.857848886837, 77836.127761273063, 77858.399266699998, 77880.67236493979, 77902.947055764627, 77925.223338946831, 77947.50121425878, 77969.780681472927, 77992.061740361838, 78014.344390698127, 78036.628632254491, 78058.914464803747, 78081.201888118725, 78103.490901972415, 78125.781506137821, 78148.073700388064, 78170.367484496339, 78192.662858235926, 78214.959821380166, 78237.258373702498, 78259.558514976452, 78281.860244975614, 78304.163563473659, 78326.468470244363, 78348.77496506153, 78371.083047699125, 78393.392717931114, 78415.703975531578, 78438.016820274701, 78460.331251934695, 78482.647270285903, 78504.964875102727, 78527.284066159627, 78549.604843231195, 78571.927206092048, 78594.251154516911, 78616.576688280606, 78638.903807157985, 78661.232510924034, 78683.562799353778, 78705.894672222363, 78728.228129304945, 78750.563170376859, 78772.899795213423, 78795.238003590101, 78817.577795282399, 78839.919170065928, 78862.262127716356, 78884.606668009452, 78906.952790721043, 78929.300495627045, 78951.64978250346, 78974.000651126378, 78996.353101271932, 79018.707132716358, 79041.062745235977, 79063.41993860717, 79085.778712606436, 79108.139067010285, 79130.501001595389, 79152.864516138419, 79175.22961041618, 79197.596284205531, 79219.96453728342, 79242.33436942687, 79264.705780412987, 79287.078770018954, 79309.453338022009, 79331.829484199508, 79354.207208328866, 79376.586510187582, 79398.967389553218, 79421.349846203433, 79443.733879915948, 79466.119490468584, 79488.50667763922, 79510.895441205823, 79533.285780946433, 79555.677696639163, 79578.071188062226, 79600.466254993895, 79622.862897212515, 79645.261114496549, 79667.660906624471, 79690.062273374875, 79712.465214526455, 79734.869729857935, 79757.275819148126, 79779.683482175955, 79802.092718720378, 79824.503528560454, 79846.915911475327, 79869.329867244203, 79891.745395646343, 79914.162496461155, 79936.581169468045, 79959.001414446553, 79981.423231176261, 80003.846619436852, 80026.271579008084, 80048.698109669771, 80071.12621120183, 80093.555883384237, 80115.987125997053, 80138.419938820414, 80160.854321634528, 80183.290274219689, 80205.727796356281, 80228.166887824715, 80250.607548405547, 80273.049777879336, 80295.493576026798, 80317.938942628651, 80340.385877465727, 80362.834380318949, 80385.28445096928, 80407.736089197788, 80430.189294785596, 80452.644067513917, 80475.100407164035, 80497.558313517322, 80520.017786355209, 80542.478825459213, 80564.941430610925, 80587.405601592007, 80609.871338184195, 80632.338640169342, 80654.8075073293, 80677.277939446067, 80699.749936301683, 80722.223497678278, 80744.698623358039, 80767.17531312324, 80789.653566756242, 80812.133384039465, 80834.614764755403, 80857.097708686648, 80879.582215615854, 80902.068285325731, 80924.555917599093, 80947.045112218824, 80969.535868967869, 80992.028187629272, 81014.522067986123, 81037.017509821613, 81059.514512919006, 81082.013077061609, 81104.513202032831, 81127.014887616184, 81149.518133595193, 81172.022939753486, 81194.529305874807, 81217.037231742899, 81239.546717141639, 81262.057761854958, 81284.570365666848, 81307.084528361403, 81329.600249722775, 81352.117529535186, 81374.636367582949, 81397.156763650448, 81419.678717522125, 81442.202228982511, 81464.727297816222, 81487.253923807933, 81509.782106742379, 81532.311846404409, 81554.843142578902, 81577.375995050839, 81599.910403605274, 81622.446368027333, 81644.983888102215, 81667.522963615178, 81690.063594351581, 81712.605780096841, 81735.149520636449, 81757.694815755967, 81780.241665241047, 81802.79006887741, 81825.340026450824, 81847.891537747171, 81870.444602552379, 81892.999220652477, 81915.555391833506, 81938.113115881672, 81960.672392583176, 81983.233221724338, 82005.795603091537, 82028.359536471224, 82050.925021649906, 82073.492058414209, 82096.060646550788, 82118.630785846399, 82141.202476087841, 82163.775717062032, 82186.35050855593, 82208.926850356569, 82231.504742251054, 82254.084184026578, 82276.665175470393, 82299.24771636985, 82321.831806512317, 82344.417445685307, 82367.004633676348, 82389.593370273054, 82412.183655263143, 82434.775488434374, 82457.368869574595, 82479.963798471697, 82502.560274913689, 82525.158298688606, 82547.757869584602, 82570.35898738986, 82592.961651892678, 82615.565862881398, 82638.171620144421, 82660.778923470265, 82683.387772647475, 82705.998167464713, 82728.610107710658, 82751.223593174116, 82773.83862364394, 82796.45519890904, 82819.073318758441, 82841.692982981185, 82864.314191366429, 82886.936943703375, 82909.561239781324, 82932.187079389638, 82954.814462317736, 82977.443388355125, 83000.073857291369, 83022.70586891612, 83045.339423019104, 83067.974519390089, 83090.611157818959, 83113.249338095629, 83135.8890600101, 83158.530323352461, 83181.173127912858, 83203.817473481497, 83226.463359848669, 83249.11078680474, 83271.759754140134, 83294.410261645375, 83317.062309111003, 83339.715896327703, 83362.371023086147, 83385.027689177165, 83407.685894391587, 83430.345638520361, 83453.006921354478, 83475.669742685001, 83498.334102303095, 83520.999999999942, 83543.667435566866, 83566.336408795192, 83589.006919476349, 83611.678967401851, 83634.352552363242, 83657.027674152167, 83679.704332560359, 83702.382527379552, 83725.062258401638, 83747.743525418511, 83770.42632822218, 83793.110666604684, 83815.796540358162, 83838.483949274829, 83861.172893146941, 83883.863371766842, 83906.555384926964, 83929.248932419752, 83951.944014037799, 83974.640629573696, 83997.338778820151, 84020.038461569929, 84042.739677615857, 84065.442426750829, 84088.146708767847, 84110.852523459922, 84133.559870620171, 84156.268750041796, 84178.979161518029, 84201.691104842204, 84224.404579807713, 84247.119586208006, 84269.83612383662, 84292.55419248715, 84315.273791953281, 84337.994922028738, 84360.717582507335, 84383.441773182945, 84406.167493849513, 84428.894744301069, 84451.623524331691, 84474.353833735542, 84497.085672306828, 84519.819039839858, 84542.553936128999, 84565.290360968676, 84588.028314153402, 84610.767795477717, 84633.508804736295, 84656.251341723822, 84678.995406235073, 84701.740998064924, 84724.488117008252, 84747.236762860062, 84769.986935415407, 84792.73863446941, 84815.491859817252, 84838.246611254188, 84861.002888575575, 84883.760691576768, 84906.520020053256, 84929.28087380057, 84952.043252614312, 84974.807156290146, 84997.572584623806, 85020.339537411113, 85043.108014447949, 85065.878015530237, 85088.649540453989, 85111.422589015303, 85134.197161010321, 85156.973256235244, 85179.750874486374, 85202.530015560071, 85225.310679252725, 85248.092865360857, 85270.876573681016, 85293.661804009811, 85316.448556143951, 85339.236829880188, 85362.026625015351, 85384.817941346351, 85407.610778670132, 85430.405136783724, 85453.201015484257, 85475.998414568865, 85498.797333834795, 85521.597773079353, 85544.399732099904, 85567.203210693886, 85590.008208658808, 85612.814725792239, 85635.62276189182, 85658.432316755265, 85681.243390180331, 85704.055981964877, 85726.870091906807, 85749.685719804082, 85772.502865454764, 85795.321528656961, 85818.141709208852, 85840.963406908675, 85863.78662155474, 85886.611352945445, 85909.437600879217, 85932.26536515457, 85955.094645570091, 85977.92544192441, 86000.757754016275, 86023.591581644432, 86046.426924607746, 86069.263782705122, 86092.102155735556, 86114.942043498071, 86137.783445791807, 86160.626362415918, 86183.470793169676, 86206.316737852379, 86229.164196263402, 86252.013168202204, 86274.863653468303, 86297.715651861261, 86320.569163180728, 86343.424187226425, 86366.280723798132, 86389.138772695675, 86411.998333718977, 86434.859406668009, 86457.721991342827, 86480.586087543532, 86503.451695070296, 86526.318813723352, 86549.187443303032, 86572.057583609683, 86594.929234443756, 86617.802395605773, 86640.677066896271, 86663.553248115903, 86686.43093906538, 86709.310139545443, 86732.190849356964, 86755.073068300815, 86777.956796177954, 86800.842032789442, 86823.728777936354, 86846.617031419853, 86869.506793041175, 86892.398062601613, 86915.290839902518, 86938.185124745316, 86961.080916931489, 86983.978216262592, 87006.87702254027, 87029.777335566177, 87052.67915514209, 87075.582481069796, 87098.487313151185, 87121.39365118822, 87144.301494982894, 87167.210844337285, 87190.121699053532, 87213.034058933845, 87235.947923780506, 87258.863293395829, 87281.780167582241, 87304.698546142172, 87327.618428878181, 87350.539815592856, 87373.462706088845, 87396.387100168897, 87419.312997635774, 87442.240398292357, 87465.16930194154, 87488.099708386319, 87511.031617429733, 87533.965028874911, 87556.899942525008, 87579.836358183282, 87602.774275653021, 87625.713694737613, 87648.654615240492, 87671.597036965148, 87694.540959715145, 87717.486383294105, 87740.433307505737, 87763.381732153779, 87786.331657042057, 87809.283081974456, 87832.236006754916, 87855.190431187453, 87878.146355076155, 87901.103778225151, 87924.062700438633, 87947.023121520891, 87969.985041276246, 87992.948459509105, 88015.913376023906, 88038.879790625171, 88061.847703117513, 88084.817113305573, 88107.788020994049, 88130.760425987726, 88153.734328091465, 88176.709727110137, 88199.686622848749, 88222.665015112303, 88245.644903705906, 88268.626288434709, 88291.609169103947, 88314.593545518903, 88337.579417484914, 88360.566784807408, 88383.555647291854, 88406.546004743795, 88429.537856968818, 88452.531203772611, 88475.52604496089, 88498.522380339447, 88521.52020971413, 88544.519532890874, 88567.520349675644, 88590.522659874507, 88613.526463293543, 88636.531759738922, 88659.538549016899, 88682.546830933745, 88705.556605295846, 88728.567871909589, 88751.580630581491, 88774.594881118086, 88797.610623325963, 88820.62785701183, 88843.646581982393, 88866.666798044462, 88889.688505004888, 88912.711702670611, 88935.7363908486, 88958.762569345898, 88981.790237969632, 89004.81939652696, 89027.850044825114, 89050.882182671412, 89073.9158098732, 89096.950926237885, 89119.987531572973, 89143.025625686001, 89166.065208384563, 89189.106279476357, 89212.148838769106, 89235.192886070581, 89258.238421188667, 89281.285443931265, 89304.333954106376, 89327.383951522017, 89350.435435986306, 89373.488407307406, 89396.542865293537, 89419.598809753006, 89442.656240494165, 89465.715157325409, 89488.775560055219, 89511.837448492137, 89534.900822444746, 89557.965681721733, 89581.032026131812, 89604.099855483742, 89627.169169586399, 89650.239968248672, 89673.312251279538, 89696.386018488018, 89719.461269683205, 89742.53800467425, 89765.616223270365, 89788.69592528083, 89811.777110514988, 89834.859778782207, 89857.943929891975, 89881.029563653807, 89904.116679877261, 89927.205278372014, 89950.29535894774, 89973.386921414218, 89996.479965581268, 90019.574491258769, 90042.670498256688, 90065.767986385021, 90088.866955453836, 90111.967405273259, 90135.069335653476, 90158.172746404758, 90181.277637337407, 90204.384008261797, 90227.49185898836, 90250.601189327586, 90273.711999090039, 90296.824288086325, 90319.938056127125, 90343.053303023189, 90366.170028585286, 90389.288232624298, 90412.407914951138, 90435.529075376777, 90458.651713712257, 90481.775829768681, 90504.901423357209, 90528.028494289058, 90551.157042375504, 90574.287067427911, 90597.418569257643, 90620.551547676194, 90643.686002495073, 90666.821933525847, 90689.959340580186, 90713.098223469773, 90736.238582006365, 90759.380416001804, 90782.523725267951, 90805.668509616764, 90828.814768860233, 90851.962502810435, 90875.11171127946, 90898.262394079517, 90921.414551022855, 90944.568181921743, 90967.72328658856, 90990.879864835719, 91014.037916475718, 91037.19744132107, 91060.358439184391, 91083.520909878338, 91106.684853215629, 91129.850269009039, 91153.017157071401, 91176.185517215621, 91199.355349254649, 91222.526653001492, 91245.699428269247, 91268.873674871036, 91292.049392620058, 91315.226581329553, 91338.405240812834, 91361.585370883287, 91384.766971354344, 91407.950042039476, 91431.134582752245, 91454.320593306256, 91477.508073515171, 91500.697023192712, 91523.887442152685, 91547.07933020893, 91570.272687175326, 91593.467512865856, 91616.663807094534, 91639.861569675442, 91663.060800422725, 91686.261499150554, 91709.463665673218, 91732.66729980502, 91755.872401360321, 91779.078970153569, 91802.287005999257, 91825.49650871192, 91848.707478106167, 91871.91991399668, 91895.133816198169, 91918.349184525418, 91941.566018793281, 91964.784318816659, 91988.004084410495, 92011.22531538982, 92034.448011569708, 92057.672172765277, 92080.897798791746, 92104.124889464365, 92127.353444598411, 92150.58346400928, 92173.814947512379, 92197.04789492322, 92220.282306057314, 92243.518180730272, 92266.755518757753, 92289.994319955469, 92313.234584139194, 92336.476311124774, 92359.719500728082, 92382.964152765067, 92406.210267051734, 92429.457843404161, 92452.706881638471, 92475.957381570814, 92499.209343017443, 92522.462765794655, 92545.717649718805, 92568.973994606305, 92592.231800273614, 92615.491066537259, 92638.751793213814, 92662.01398011994, 92685.277627072326, 92708.54273388772, 92731.809300382942, 92755.077326374871, 92778.346811680414, 92801.617756116568, 92824.890159500384, 92848.164021648947, 92871.439342379424, 92894.716121509016, 92917.994358855023, 92941.274054234746, 92964.555207465572, 92987.837818364962, 93011.121886750407, 93034.407412439468, 93057.694395249753, 93080.982834998955, 93104.272731504767, 93127.564084584999, 93150.856894057491, 93174.15115974014, 93197.446881450916, 93220.744059007804, 93244.04269222889, 93267.342780932304, 93290.644324936235, 93313.947324058914, 93337.251778118633, 93360.557686933767, 93383.865050322696, 93407.173868103928, 93430.484140095941, 93453.795866117362, 93477.109045986799, 93500.423679522952, 93523.739766544561, 93547.057306870454, 93570.376300319491, 93593.696746710571, 93617.018645862699, 93640.341997594893, 93663.666801726242, 93686.993058075881, 93710.320766463032, 93733.64992670693, 93756.980538626914, 93780.312602042337, 93803.646116772637, 93826.981082637285, 93850.317499455836, 93873.655367047861, 93896.994685233032, 93920.335453831038, 93943.677672661666, 93967.021341544707, 93990.366460300051, 94013.713028747632, 94037.061046707429, 94060.410513999494, 94083.761430443905, 94107.113795860845, 94130.467610070496, 94153.822872893157, 94177.179584149111, 94200.537743658759, 94223.897351242529, 94247.25840672091, 94270.620909914433, 94293.98486064373, 94317.350258729421, 94340.71710399224, 94364.085396252936, 94387.455135332348, 94410.82632105134, 94434.198953230851, 94457.573031691878, 94480.948556255447, 94504.325526742658, 94527.70394297468, 94551.083804772716, 94574.465111958023, 94597.847864351934, 94621.232061775823, 94644.617704051096, 94668.004790999272, 94691.393322441872, 94714.783298200506, 94738.174718096794, 94761.567581952477, 94784.961889589307, 94808.357640829097, 94831.754835493703, 94855.153473405066, 94878.553554385173, 94901.955078256055, 94925.358044839784, 94948.762453958523, 94972.168305434476, 94995.575599089891, 95018.984334747074, 95042.394512228391, 95065.806131356265, 95089.219191953176, 95112.633693841635, 95136.04963684424, 95159.467020783617, 95182.885845482466, 95206.306110763529, 95229.727816449609, 95253.150962363579, 95276.575548328314, 95300.001574166803, 95323.429039702052, 95346.857944757154, 95370.288289155214, 95393.720072719429, 95417.153295273019, 95440.587956639298, 95464.024056641589, 95487.461595103305, 95510.900571847902, 95534.340986698866, 95557.782839479783, 95581.226130014256, 95604.670858125959, 95628.117023638595, 95651.564626375985, 95675.013666161918, 95698.464142820303, 95721.916056175076, 95745.369406050231, 95768.824192269807, 95792.280414657915, 95815.738073038709, 95839.197167236387, 95862.657697075221, 95886.11966237954, 95909.583062973688, 95933.047898682111, 95956.514169329268, 95979.981874739708, 96003.451014738006, 96026.921589148798, 96050.393597796792, 96073.867040506724, 96097.341917103375, 96120.818227411626, 96144.295971256375, 96167.775148462577, 96191.255758855244, 96214.737802259449, 96238.221278500292, 96261.70618740299, 96285.192528792715, 96308.680302494788, 96332.169508334526, 96355.660146137321, 96379.152215728609, 96402.645716933868, 96426.14064957868, 96449.637013488609, 96473.134808489311, 96496.63403440651, 96520.134691065963, 96543.636778293469, 96567.140295914898, 96590.645243756153, 96614.151621643221, 96637.659429402134, 96661.168666858954, 96684.679333839798, 96708.191430170875, 96731.70495567839, 96755.219910188665, 96778.736293528011, 96802.254105522836, 96825.77334599958, 96849.29401478474, 96872.816111704873, 96896.339636586577, 96919.864589256511, 96943.390969541389, 96966.918777267958, 96990.448012263048, 97013.978674353522, 97037.510763366285, 97061.044279128328, 97084.579221466673, 97108.115590208385, 97131.653385180587, 97155.19260621049, 97178.733253125291, 97202.2753257523, 97225.81882391886, 97249.363747452342, 97272.910096180189, 97296.457869929916, 97320.007068529041, 97343.557691805196, 97367.109739586012, 97390.663211699197, 97414.218107972498, 97437.774428233737, 97461.332172310766, 97484.891340031507, 97508.451931223899, 97532.013945715982, 97555.577383335811, 97579.142243911512, 97602.708527271257, 97626.276233243261, 97649.845361655811, 97673.415912337223, 97696.987885115886, 97720.561279820206, 97744.1360962787, 97767.712334319876, 97791.289993772341, 97814.869074464703, 97838.449576225685, 97862.031498883996, 97885.614842268449, 97909.199606207883, 97932.785790531183, 97956.37339506732, 97979.962419645264, 98003.552864094076, 98027.144728242856, 98050.738011920766, 98074.332714956996, 98097.928837180807, 98121.526378421506, 98145.125338508456, 98168.725717271067, 98192.327514538789, 98215.930730141132, 98239.535363907664, 98263.141415668011, 98286.748885251814, 98310.357772488816, 98333.968077208759, 98357.579799241488, 98381.192938416847, 98404.807494564782, 98428.42346751524, 98452.040857098269, 98475.659663143917, 98499.27988548232, 98522.901523943656, 98546.524578358163, 98570.149048556093, 98593.774934367786, 98617.402235623624, 98641.030952154048, 98664.661083789513, 98688.292630360564, 98711.925591697771, 98735.559967631794, 98759.195757993293, 98782.832962613014, 98806.471581321734, 98830.111613950285, 98853.753060329575, 98877.39592029051, 98901.040193664099, 98924.68588028138, 98948.33297997342, 98971.981492571387, 98995.63141790645, 99019.282755809851, 99042.935506112874, 99066.589668646877, 99090.245243243233, 99113.902229733401, 99137.560627948857, 99161.220437721131, 99184.881658881859, 99208.544291262631, 99232.208334695169, 99255.87378901121, 99279.540654042547, 99303.208929621018, 99326.878615578535, 99350.549711746993, 99374.222217958435, 99397.896134044888, 99421.571459838422, 99445.248195171211, 99468.926339875441, 99492.605893783344, 99516.286856727209, 99539.969228539398, 99563.653009052287, 99587.338198098325, 99611.024795510006, 99634.712801119866, 99658.402214760499, 99682.093036264545, 99705.785265464699, 99729.478902193689, 99753.173946284325, 99776.870397569437, 99800.56825588191, 99824.267521054688, 99847.968192920773, 99871.670271313182, 99895.373756065004, 99919.078647009388, 99942.78494397951, 99966.492646808634, 99990.20175533001, 100013.91226937699, 100037.62418878295, 100061.33751338134, 100085.05224300563, 100108.76837748935, 100132.4859166661, 100156.2048603695, 100179.92520843323, 100203.64696069101, 100227.37011697664, 100251.09467712394, 100274.82064096678, 100298.54800833909, 100322.27677907483, 100346.00695300807, 100369.73852997283, 100393.47150980328, 100417.20589233354, 100440.94167739789, 100464.67886483055, 100488.41745446586, 100512.1574461382, 100535.89883968196, 100559.64163493161, 100583.38583172169, 100607.13142988674, 100630.87842926137, 100654.62682968024, 100678.37663097809, 100702.12783298964, 100725.88043554971, 100749.63443849317, 100773.38984165489, 100797.14664486986, 100820.90484797307, 100844.66445079957, 100868.42545318443, 100892.18785496285, 100915.95165596998, 100939.71685604109, 100963.48345501146, 100987.25145271645, 101011.02084899142, 101034.79164367182, 101058.56383659317, 101082.33742759094, 101106.11241650078, 101129.88880315828, 101153.66658739912, 101177.44576905905, 101201.22634797383, 101225.00832397929, 101248.7916969113, 101272.57646660579, 101296.36263289873, 101320.15019562612, 101343.93915462404, 101367.7295097286, 101391.52126077596, 101415.31440760233, 101439.10895004397, 101462.9048879372, 101486.70222111834, 101510.50094942382, 101534.30107269008, 101558.10259075361, 101581.90550345098, 101605.70981061876, 101629.5155120936, 101653.32260771218, 101677.13109731126, 101700.9409807276, 101724.75225779804, 101748.56492835947, 101772.37899224881, 101796.19444930303, 101820.01129935916, 101843.82954225427, 101867.64917782549, 101891.47020590997, 101915.29262634492, 101939.11643896763, 101962.94164361537, 101986.76824012553, 102010.59622833549, 102034.42560808272, 102058.25637920471, 102082.08854153901, 102105.9220949232, 102129.75703919494, 102153.59337419191, 102177.43109975185, 102201.27021571253, 102225.1107219118, 102248.95261818753, 102272.79590437764, 102296.64058032009, 102320.48664585294, 102344.33410081422, 102368.18294504205, 102392.03317837461, 102415.88480065008, 102439.73781170673, 102463.59221138287, 102487.44799951684, 102511.30517594704, 102535.1637405119, 102559.02369304992, 102582.88503339965, 102606.74776139967, 102630.61187688859, 102654.4773797051, 102678.34426968795, 102702.21254667587, 102726.08221050771, 102749.95326102231, 102773.8256980586, 102797.69952145554, 102821.57473105213, 102845.45132668741, 102869.32930820051, 102893.20867543056, 102917.08942821674, 102940.97156639832, 102964.85508981455, 102988.73999830478, 103012.6262917084, 103036.51396986481, 103060.40303261351, 103084.293479794, 103108.18531124585, 103132.07852680866, 103155.97312632212, 103179.8691096259, 103203.76647655977, 103227.66522696352, 103251.56536067701, 103275.46687754011, 103299.36977739276, 103323.27406007495, 103347.1797254267, 103371.0867732881, 103394.99520349925, 103418.90501590034, 103442.81621033157, 103466.72878663319, 103490.64274464553, 103514.55808420894, 103538.4748051638, 103562.39290735057, 103586.31239060973, 103610.23325478184, 103634.15549970744, 103658.07912522719, 103682.00413118176, 103705.93051741188, 103729.85828375829, 103753.78743006183, 103777.71795616332, 103801.64986190372, 103825.58314712394, 103849.51781166498, 103873.4538553679, 103897.39127807376, 103921.33007962372, 103945.27025985894, 103969.21181862066, 103993.15475575015, 104017.0990710887, 104041.0447644777, 104064.99183575854, 104088.94028477269, 104112.89011136163, 104136.84131536692, 104160.79389663014, 104184.74785499295, 104208.70319029699, 104232.65990238401, 104256.61799109577, 104280.57745627411, 104304.53829776087, 104328.50051539797, 104352.46410902737, 104376.42907849104, 104400.39542363105, 104424.36314428948, 104448.33224030846, 104472.3027115302, 104496.27455779689, 104520.24777895081, 104544.22237483428, 104568.19834528965, 104592.17569015936, 104616.15440928582, 104640.13450251156, 104664.1159696791, 104688.09881063103, 104712.08302520998, 104736.06861325864, 104760.05557461972, 104784.043909136, 104808.03361665027, 104832.0246970054, 104856.01715004431, 104880.01097560991, 104904.00617354522, 104928.00274369326, 104952.00068589712, 104975.99999999993, 105000.00068584486, 105024.00274327511, 105048.00617213396, 105072.0109722647, 105096.0171435107, 105120.02468571534, 105144.03359872208, 105168.04388237436, 105192.05553651576, 105216.06856098982, 105240.08295564017, 105264.09872031047, 105288.11585484444, 105312.13435908582, 105336.1542328784, 105360.17547606604, 105384.19808849262, 105408.22207000206, 105432.24742043833, 105456.27413964548, 105480.30222746753, 105504.33168374863, 105528.36250833291, 105552.39470106458, 105576.42826178786, 105600.46319034706, 105624.49948658649, 105648.53715035053, 105672.5761814836, 105696.61657983017, 105720.65834523473, 105744.70147754184, 105768.7459765961, 105792.79184224214, 105816.83907432464, 105840.88767268835, 105864.93763717801, 105888.98896763846, 105913.04166391456, 105937.09572585119, 105961.15115329332, 105985.20794608595, 106009.26610407409, 106033.32562710284, 106057.38651501729, 106081.44876766266, 106105.51238488412, 106129.57736652695, 106153.64371243643, 106177.71142245791, 106201.78049643678, 106225.85093421848, 106249.92273564848, 106273.99590057228, 106298.07042883546, 106322.14632028362, 106346.22357476239, 106370.30219211751, 106394.38217219469, 106418.46351483969, 106442.54621989837, 106466.63028721658, 106490.71571664025, 106514.80250801529, 106538.89066118775, 106562.98017600364, 106587.07105230905, 106611.16328995011, 106635.25688877302, 106659.35184862395, 106683.44816934918, 106707.54585079502, 106731.64489280782, 106755.74529523395, 106779.84705791986, 106803.95018071201, 106828.05466345693, 106852.16050600118, 106876.26770819137, 106900.37626987413, 106924.48619089619, 106948.59747110425, 106972.71011034511, 106996.82410846559, 107020.93946531253, 107045.05618073288, 107069.17425457356, 107093.29368668159, 107117.41447690397, 107141.53662508781, 107165.66013108024, 107189.7849947284, 107213.91121587952, 107238.03879438085, 107262.16773007967, 107286.29802282334, 107310.42967245923, 107334.56267883476, 107358.69704179741, 107382.83276119467, 107406.96983687414, 107431.10826868335, 107455.24805646999, 107479.38920008171, 107503.53169936626, 107527.67555417139, 107551.82076434491, 107575.96732973469, 107600.11525018861, 107624.26452555459, 107648.41515568066, 107672.56714041479, 107696.72047960508, 107720.87517309963, 107745.03122074658, 107769.18862239413, 107793.34737789053, 107817.50748708403, 107841.66894982298, 107865.83176595572, 107889.99593533068, 107914.16145779629, 107938.32833320105, 107962.49656139348, 107986.66614222217, 108010.83707553572, 108035.00936118282, 108059.18299901215, 108083.35798887245, 108107.53433061253, 108131.71202408121, 108155.89106912735, 108180.07146559987, 108204.25321334775, 108228.43631221994, 108252.62076206553, 108276.80656273357, 108300.99371407321, 108325.18221593359, 108349.37206816394, 108373.56327061349, 108397.75582313156, 108421.94972556747, 108446.1449777706, 108470.34157959036, 108494.53953087622, 108518.73883147769, 108542.93948124432, 108567.14148002568, 108591.34482767139, 108615.54952403114, 108639.75556895464, 108663.96296229165, 108688.17170389196, 108712.38179360541, 108736.59323128188, 108760.80601677128, 108785.02014992358, 108809.23563058881, 108833.45245861699, 108857.67063385822, 108881.89015616261, 108906.11102538036, 108930.33324136167, 108954.55680395682, 108978.78171301607, 109003.00796838976, 109027.23556992831, 109051.46451748211, 109075.69481090162, 109099.92645003737, 109124.15943473989, 109148.39376485976, 109172.62944024763, 109196.86646075416, 109221.10482623006, 109245.34453652608, 109269.58559149304, 109293.82799098175, 109318.07173484311, 109342.31682292801, 109366.56325508743, 109390.81103117237, 109415.06015103387, 109439.31061452301, 109463.56242149093, 109487.8155717888, 109512.07006526781, 109536.3259017792, 109560.58308117429, 109584.8416033044, 109609.1014680209, 109633.36267517522, 109657.62522461878, 109681.88911620311, 109706.15434977971, 109730.4209252002, 109754.68884231619, 109778.95810097932, 109803.22870104131, 109827.50064235389, 109851.77392476884, 109876.04854813802, 109900.32451231324, 109924.60181714644, 109948.88046248957, 109973.1604481946, 109997.44177411357, 110021.72444009855, 110046.00844600165, 110070.29379167501, 110094.58047697082, 110118.86850174134, 110143.15786583882, 110167.44856911557, 110191.74061142397, 110216.03399261639, 110240.32871254528, 110264.62477106311, 110288.9221680224, 110313.22090327571, 110337.52097667565, 110361.82238807483, 110386.12513732594, 110410.42922428172, 110434.73464879491, 110459.04141071832, 110483.34950990479, 110507.6589462072, 110531.96971947847, 110556.28182957157, 110580.5952763395, 110604.91005963532, 110629.22617931209, 110653.54363522294, 110677.86242722106, 110702.18255515963, 110726.50401889188, 110750.82681827113, 110775.1509531507, 110799.47642338395, 110823.80322882428, 110848.13136932514, 110872.46084474004, 110896.79165492248, 110921.12379972603, 110945.4572790043, 110969.79209261097, 110994.12824039967, 111018.46572222417, 111042.80453793822, 111067.14468739564, 111091.48617045028, 111115.82898695602, 111140.1731367668, 111164.51861973655, 111188.86543571933, 111213.21358456917, 111237.56306614014, 111261.91388028639, 111286.26602686207, 111310.61950572141, 111334.97431671864, 111359.33045970804, 111383.68793454397, 111408.04674108078, 111432.40687917286, 111456.76834867468, 111481.13114944073, 111505.49528132551, 111529.86074418361, 111554.22753786964, 111578.59566223821, 111602.96511714405, 111627.33590244185, 111651.7080179864, 111676.08146363248, 111700.45623923496, 111724.8323446487, 111749.20977972864, 111773.58854432974, 111797.96863830699, 111822.35006151545, 111846.73281381019, 111871.11689504632, 111895.50230507903, 111919.8890437635, 111944.27711095495, 111968.6665065087, 111993.05723028004, 112017.44928212435, 112041.842661897, 112066.23736945343, 112090.63340464912, 112115.03076733962, 112139.42945738042, 112163.82947462716, 112188.23081893545, 112212.63349016097, 112237.03748815943, 112261.44281278658, 112285.84946389822, 112310.25744135017, 112334.66674499828, 112359.07737469849, 112383.48933030672, 112407.90261167898, 112432.31721867126, 112456.73315113965, 112481.15040894024, 112505.56899192919, 112529.98889996267, 112554.41013289688, 112578.8326905881, 112603.25657289263, 112627.68177966679, 112652.10831076698, 112676.53616604958, 112700.96534537108, 112725.39584858794, 112749.82767555672, 112774.26082613398, 112798.6953001763, 112823.13109754038, 112847.56821808286, 112872.00666166049, 112896.44642813003, 112920.88751734827, 112945.32992917208, 112969.77366345831, 112994.21872006389, 113018.66509884578, 113043.11279966099, 113067.56182236652, 113092.01216681948, 113116.46383287695, 113140.9168203961, 113165.37112923413, 113189.82675924824, 113214.28371029573, 113238.74198223387, 113263.20157492002, 113287.66248821157, 113312.12472196593, 113336.58827604055, 113361.05315029295, 113385.51934458067, 113409.98685876124, 113434.45569269233, 113458.92584623155, 113483.39731923661, 113507.87011156522, 113532.34422307517, 113556.81965362425, 113581.2964030703, 113605.77447127122, 113630.25385808491, 113654.73456336933, 113679.2165869825, 113703.69992878241, 113728.18458862718, 113752.67056637487, 113777.15786188368, 113801.64647501177, 113826.13640561736, 113850.62765355874, 113875.12021869418, 113899.61410088204, 113924.1092999807, 113948.60581584855, 113973.10364834407, 113997.60279732574, 114022.1032626521, 114046.60504418171, 114071.10814177318, 114095.61255528514, 114120.11828457628, 114144.62532950533, 114169.13368993104, 114193.6433657122, 114218.15435670764, 114242.66666277625, 114267.18028377694, 114291.69521956862, 114316.21147001031, 114340.72903496103, 114365.24791427983, 114389.7681078258, 114414.2896154581, 114438.81243703589, 114463.33657241837, 114487.8620214648, 114512.38878403447, 114536.91685998671, 114561.44624918087, 114585.97695147636, 114610.5089667326, 114635.04229480909, 114659.57693556532, 114684.11288886084, 114708.65015455526, 114733.18873250818, 114757.72862257928, 114782.26982462825, 114806.81233851484, 114831.35616409882, 114855.90130123998, 114880.44774979822, 114904.99550963337, 114929.5445806054, 114954.09496257425, 114978.64665539992, 115003.19965894247, 115027.75397306195, 115052.30959761847, 115076.86653247218, 115101.42477748329, 115125.984332512, 115150.54519741859, 115175.10737206334, 115199.67085630659, 115224.23565000873, 115248.80175303014, 115273.3691652313, 115297.93788647266, 115322.50791661476, 115347.07925551817, 115371.65190304347, 115396.22585905129, 115420.80112340231, 115445.37769595724, 115469.95557657682, 115494.53476512182, 115519.11526145306, 115543.69706543141, 115568.28017691776, 115592.86459577303, 115617.4503218582, 115642.03735503425, 115666.62569516223, 115691.21534210323, 115715.80629571836, 115740.39855586876, 115764.99212241563, 115789.58699522018, 115814.18317414368, 115838.78065904744, 115863.37944979276, 115887.97954624105, 115912.5809482537, 115937.18365569216, 115961.78766841792, 115986.39298629249, 116010.99960917742, 116035.60753693432, 116060.21676942479, 116084.82730651053, 116109.43914805322, 116134.0522939146, 116158.66674395646, 116183.2824980406, 116207.89955602887, 116232.51791778316, 116257.13758316539, 116281.75855203751, 116306.38082426153, 116331.00439969949, 116355.62927821343, 116380.25545966547, 116404.88294391775, 116429.51173083246, 116454.14182027178, 116478.77321209799, 116503.40590617337, 116528.03990236025, 116552.67520052097, 116577.31180051794, 116601.94970221359, 116626.5889054704, 116651.22941015086, 116675.87121611751, 116700.51432323294, 116725.15873135976, 116749.8044403606, 116774.45145009817, 116799.0997604352, 116823.74937123443, 116848.40028235866, 116873.05249367072, 116897.70600503348, 116922.36081630984, 116947.01692736275, 116971.67433805518, 116996.33304825013, 117020.99305781067, 117045.65436659988, 117070.31697448085, 117094.98088131678, 117119.64608697082, 117144.31259130624, 117168.98039418629, 117193.64949547425, 117218.31989503348, 117242.99159272734, 117267.66458841923, 117292.33888197262, 117317.01447325097, 117341.6913621178, 117366.36954843666, 117391.04903207115, 117415.72981288488, 117440.41189074152, 117465.09526550474, 117489.77993703831, 117514.46590520597, 117539.15316987153, 117563.84173089883, 117588.53158815173, 117613.22274149416, 117637.91519079007, 117662.60893590341, 117687.30397669821, 117712.00031303853, 117736.69794478847, 117761.39687181212, 117786.09709397367, 117810.7986111373, 117835.50142316725, 117860.20552992777, 117884.91093128319, 117909.6176270978, 117934.32561723603, 117959.03490156225, 117983.74547994092, 118008.45735223651, 118033.17051831353, 118057.88497803656, 118082.60073127014, 118107.31777787894, 118132.03611772758, 118156.75575068076, 118181.47667660323, 118206.19889535972, 118230.92240681504, 118255.64721083404, 118280.37330728157, 118305.10069602253, 118329.82937692189, 118354.55934984458, 118379.29061465565, 118404.02317122012, 118428.75701940308, 118453.49215906965, 118478.22859008498, 118502.96631231424, 118527.70532562268, 118552.44562987552, 118577.18722493808, 118601.93011067568, 118626.67428695368, 118651.41975363747, 118676.16651059251, 118700.91455768423, 118725.66389477813, 118750.41452173979, 118775.16643843475, 118799.91964472862, 118824.67414048707, 118849.42992557574, 118874.18699986035, 118898.94536320666, 118923.70501548045, 118948.46595654752, 118973.22818627374, 118997.99170452499, 119022.7565111672, 119047.52260606633, 119072.28998908834, 119097.0586600993, 119121.82861896523, 119146.59986555226, 119171.3723997265, 119196.14622135412, 119220.92133030134, 119245.69772643436, 119270.47540961947, 119295.25437972297, 119320.03463661121, 119344.81618015055, 119369.5990102074, 119394.38312664822, 119419.16852933947, 119443.95521814766, 119468.74319293935, 119493.53245358112, 119518.32299993958, 119543.11483188139, 119567.90794927324, 119592.70235198183, 119617.49803987393, 119642.29501281632, 119667.09327067583, 119691.89281331931, 119716.69364061367, 119741.49575242582, 119766.29914862274, 119791.10382907141, 119815.90979363887, 119840.71704219218, 119865.52557459843, 119890.33539072477, 119915.14649043836, 119939.95887360642, 119964.77254009615, 119989.58748977486, 120014.40372250983, 120039.22123816841, 120064.04003661797, 120088.86011772591, 120113.6814813597, 120138.5041273868, 120163.3280556747, 120188.15326609099, 120212.97975850321, 120237.807532779, 120262.63658878599, 120287.46692639188, 120312.29854546436, 120337.13144587121, 120361.9656274802, 120386.80109015915, 120411.63783377589, 120436.47585819835, 120461.31516329442, 120486.15574893207, 120510.99761497928, 120535.84076130406, 120560.68518777451, 120585.53089425867, 120610.3778806247, 120635.22614674074, 120660.07569247499, 120684.92651769568, 120709.77862227106, 120734.63200606944, 120759.48666895913, 120784.3426108085, 120809.19983148595, 120834.05833085992, 120858.91810879884, 120883.77916517125, 120908.64149984565, 120933.5051126906, 120958.37000357473, 120983.23617236665, 121008.10361893504, 121032.97234314861, 121057.84234487606, 121082.71362398617, 121107.58618034775, 121132.46001382964, 121157.33512430069, 121182.21151162982, 121207.08917568595, 121231.96811633807, 121256.84833345517, 121281.72982690629, 121306.61259656049, 121331.49664228689, 121356.38196395461, 121381.26856143285, 121406.15643459078, 121431.04558329767, 121455.93600742276, 121480.82770683538, 121505.72068140487, 121530.61493100057, 121555.51045549192, 121580.40725474835, 121605.30532863933, 121630.20467703436, 121655.10529980299, 121680.00719681478, 121704.91036793934, 121729.81481304632, 121754.72053200539, 121779.62752468624, 121804.53579095862, 121829.44533069231, 121854.3561437571, 121879.26823002285, 121904.1815893594, 121929.09622163669, 121954.01212672464, 121978.92930449323, 122003.84775481246, 122028.76747755238, 122053.68847258303, 122078.61073977455, 122103.53427899707, 122128.45909012076, 122153.38517301581, 122178.31252755247, 122203.24115360099, 122228.17105103172, 122253.10221971494, 122278.03465952107, 122302.96837032049, 122327.90335198362, 122352.83960438096, 122377.777127383, 122402.71592086025, 122427.65598468333, 122452.59731872278, 122477.53992284928, 122502.48379693348, 122527.42894084606, 122552.37535445779, 122577.32303763942, 122602.27199026172, 122627.22221219557, 122652.17370331181, 122677.12646348133, 122702.08049257506, 122727.03579046397, 122751.99235701906, 122776.95019211136, 122801.9092956119, 122826.8696673918, 122851.83130732219, 122876.79421527422, 122901.75839111909, 122926.72383472799, 122951.69054597223, 122976.65852472307, 123001.62777085182, 123026.59828422987, 123051.57006472857, 123076.54311221937, 123101.5174265737, 123126.49300766307, 123151.46985535898, 123176.44796953299, 123201.42735005668, 123226.40799680166, 123251.38990963959, 123276.37308844214, 123301.35753308103, 123326.343243428, 123351.33021935483, 123376.31846073334, 123401.30796743535, 123426.29873933276, 123451.29077629748, 123476.28407820144, 123501.2786449166, 123526.27447631498, 123551.27157226863, 123576.26993264959, 123601.26955732999, 123626.27044618195, 123651.27259907764, 123676.27601588926, 123701.28069648903, 123726.28664074924, 123751.29384854218, 123776.30231974016, 123801.31205421555, 123826.32305184075, 123851.33531248817, 123876.34883603029, 123901.36362233957, 123926.37967128855, 123951.39698274979, 123976.41555659588, 124001.43539269941, 124026.45649093305, 124051.47885116948, 124076.50247328142, 124101.5273571416, 124126.55350262282, 124151.58090959788, 124176.60957793961, 124201.63950752091, 124226.67069821467, 124251.70314989384, 124276.73686243138, 124301.7718357003, 124326.80806957364, 124351.84556392446, 124376.88431862585, 124401.92433355095, 124426.96560857294, 124452.00814356498, 124477.05193840031, 124502.0969929522, 124527.14330709392, 124552.19088069882, 124577.23971364023, 124602.28980579154, 124627.34115702618, 124652.3937672176, 124677.44763623926, 124702.50276396469, 124727.55915026742, 124752.61679502104, 124777.67569809916, 124802.73585937542, 124827.79727872348, 124852.85995601704, 124877.92389112986, 124902.98908393568, 124928.05553430831, 124953.1232421216, 124978.19220724938, 125003.26242956554, 125028.33390894404, 125053.40664525882, 125078.48063838384, 125103.55588819318, 125128.63239456083, 125153.71015736091, 125178.78917646752, 125203.86945175481, 125228.95098309696, 125254.03377036817, 125279.1178134427, 125304.20311219479, 125329.28966649878, 125354.37747622898, 125379.46654125977, 125404.55686146552, 125429.6484367207, 125454.74126689974, 125479.83535187715, 125504.93069152744, 125530.02728572517, 125555.12513434493, 125580.22423726133, 125605.32459434902, 125630.4262054827, 125655.52907053704, 125680.63318938682, 125705.73856190679, 125730.84518797178, 125755.9530674566, 125781.06220023613, 125806.17258618528, 125831.28422517896, 125856.39711709213, 125881.51126179981, 125906.62665917698, 125931.74330909875, 125956.86121144016, 125981.98036607634, 126007.10077288245, 126032.22243173365, 126057.34534250517, 126082.46950507225, 126107.59491931014, 126132.72158509417, 126157.84950229966, 126182.97867080198, 126208.10909047653, 126233.24076119871, 126258.37368284403, 126283.50785528794, 126308.64327840599, 126333.77995207369, 126358.91787616667, 126384.0570505605, 126409.19747513086, 126434.3391497534, 126459.48207430386, 126484.62624865794, 126509.77167269142, 126534.9183462801, 126560.06626929982, 126585.21544162642, 126610.36586313581, 126635.51753370393, 126660.67045320668, 126685.82462152008, 126710.98003852014, 126736.13670408291, 126761.29461808444, 126786.45378040087, 126811.61419090834, 126836.77584948298, 126861.93875600102, 126887.10291033868, 126912.26831237224, 126937.43496197795, 126962.60285903217, 126987.77200341123, 127012.94239499152, 127038.11403364947, 127063.2869192615, 127088.46105170409, 127113.63643085376, 127138.81305658702, 127163.99092878048, 127189.17004731069, 127214.35041205429, 127239.53202288797, 127264.71487968838, 127289.89898233226, 127315.08433069635, 127340.27092465744, 127365.45876409234, 127390.64784887788, 127415.83817889093, 127441.02975400841, 127466.22257410725, 127491.41663906439, 127516.61194875685, 127541.80850306165, 127567.00630185583, 127592.20534501647, 127617.4056324207, 127642.60716394568, 127667.80993946856, 127693.01395886653, 127718.21922201688, 127743.42572879682, 127768.63347908368, 127793.84247275478, 127819.05270968749, 127844.26418975917, 127869.47691284724, 127894.69087882918, 127919.90608758242, 127945.12253898452, 127970.34023291297, 127995.55916924537, 128020.77934785932, 128046.00076863244, 128071.22343144237, 128096.44733616684, 128121.67248268353, 128146.89887087021, 128172.12650060465, 128197.35537176467, 128222.5854842281, 128247.81683787282, 128273.04943257671, 128298.28326821771, 128323.51834467379, 128348.75466182294, 128373.99221954317, 128399.23101771252, 128424.47105620909, 128449.71233491098, 128474.95485369631, 128500.19861244329, 128525.44361103009, 128550.68984933494, 128575.93732723613, 128601.18604461191, 128626.43600134061, 128651.68719730059, 128676.93963237021, 128702.1933064279, 128727.44821935208, 128752.70437102125, 128777.96176131385, 128803.22039010846, 128828.48025728362, 128853.74136271792, 128879.00370628996, 128904.26728787841, 128929.53210736193, 128954.79816461923, 128980.06545952905, 129005.33399197015, 129030.60376182134, 129055.87476896142, 129081.14701326926, 129106.42049462376, 129131.6952129038, 129156.97116798835, 129182.24835975636, 129207.52678808685, 129232.80645285884, 129258.08735395141, 129283.36949124365, 129308.65286461466, 129333.9374739436, 129359.22331910966, 129384.51039999202, 129409.79871646997, 129435.08826842274, 129460.37905572963, 129485.67107826998, 129510.96433592314, 129536.25882856851, 129561.55455608548, 129586.85151835352, 129612.14971525209, 129637.4491466607, 129662.74981245887, 129688.0517125262, 129713.35484674224, 129738.65921498663, 129763.96481713903, 129789.27165307909, 129814.57972268655, 129839.88902584116, 129865.19956242264, 129890.51133231082, 129915.82433538554, 129941.13857152662, 129966.45404061397, 129991.7707425275, 130017.08867714716, 130042.4078443529, 130067.72824402474, 130093.04987604271, 130118.37274028687, 130143.69683663732, 130169.02216497416, 130194.34872517755, 130219.67651712766, 130245.0055407047, 130270.33579578891, 130295.66728226055, 130320.99999999991, 130346.33394888733, 130371.66912880314, 130397.00553962773, 130422.34318124152, 130447.68205352494, 130473.02215635845, 130498.36348962256, 130523.70605319779, 130549.0498469647, 130574.39487080388, 130599.74112459592, 130625.08860822149, 130650.43732156123, 130675.78726449587, 130701.13843690613, 130726.49083867275, 130751.84446967654, 130777.19932979831, 130802.5554189189, 130827.91273691918, 130853.27128368006, 130878.63105908247, 130903.99206300738, 130929.35429533575, 130954.71775594862, 130980.08244472703, 131005.44836155206, 131030.81550630482, 131056.18387886642, 131081.55347911804, 131106.92430694087, 131132.29636221612, 131157.66964482504, 131183.0441546489, 131208.41989156904, 131233.79685546676, 131259.17504622342, 131284.55446372041, 131309.93510783918, 131335.31697846117, 131360.70007546784, 131386.0843987407, 131411.46994816128, 131436.85672361116, 131462.24472497194, 131487.63395212521, 131513.02440495262, 131538.41608333588, 131563.80898715663, 131589.2031162967, 131614.59847063778, 131639.9950500617, 131665.39285445024, 131690.79188368531, 131716.19213764873, 131741.59361622241, 131766.99631928833, 131792.40024672839, 131817.80539842462, 131843.21177425905, 131868.61937411371, 131894.02819787065, 131919.43824541202, 131944.84951661993, 131970.26201137656, 131995.67572956407, 132021.09067106468, 132046.50683576067, 132071.9242235343, 132097.34283426782, 132122.76266784366, 132148.1837241441, 132173.60600305157, 132199.02950444847, 132224.45422821722, 132249.88017424036, 132275.30734240031, 132300.73573257966, 132326.16534466096, 132351.59617852676, 132377.02823405969, 132402.46151114244, 132427.89600965759, 132453.33172948789, 132478.76867051609, 132504.20683262491, 132529.64621569714, 132555.08681961559, 132580.5286442631, 132605.97168952253, 132631.41595527678, 132656.86144140881, 132682.30814780149, 132707.75607433787, 132733.20522090094, 132758.65558737374, 132784.10717363929, 132809.55997958075, 132835.01400508118, 132860.46925002377, 132885.92571429166, 132911.38339776811, 132936.84230033628, 132962.30242187946, 132987.76376228096, 133013.22632142407, 133038.69009919214, 133064.15509546854, 133089.62131013666, 133115.08874307995, 133140.55739418184, 133166.02726332581, 133191.49835039541, 133216.97065527414, 133242.44417784561, 133267.91891799335, 133293.39487560102, 133318.87205055228, 133344.35044273079, 133369.83005202023, 133395.31087830439, 133420.79292146701, 133446.27618139185, 133471.76065796276, 133497.24635106357, 133522.73326057816, 133548.22138639039, 133573.71072838426, 133599.20128644365, 133624.69306045261, 133650.1860502951, 133675.68025585517, 133701.1756770169, 133726.67231366437, 133752.17016568172, 133777.66923295305, 133803.16951536259, 133828.67101279454, 133854.17372513309, 133879.67765226253, 133905.18279406714, 133930.68915043125, 133956.19672123916, 133981.70550637526, 134007.21550572399, 134032.7267191697, 134058.23914659687, 134083.75278789, 134109.26764293358, 134134.78371161217, 134160.30099381026, 134185.8194894125, 134211.33919830353, 134236.8601203679, 134262.38225549037, 134287.90560355558, 134313.43016444831, 134338.95593805326, 134364.48292425525, 134390.01112293909, 134415.54053398955, 134441.07115729159, 134466.60299273001, 134492.1360401898, 134517.67029955584, 134543.20577071316, 134568.74245354676, 134594.28034794159, 134619.81945378278, 134645.35977095537, 134670.90129934452, 134696.4440388353, 134721.98798931291, 134747.53315066252, 134773.07952276937, 134798.62710551871, 134824.17589879577, 134849.72590248589, 134875.27711647438, 134900.82954064661, 134926.38317488792, 134951.93801908373, 134977.49407311951, 135003.05133688069, 135028.60981025276, 135054.16949312127, 135079.73038537172, 135105.29248688967, 135130.85579756077, 135156.42031727062, 135181.98604590484, 135207.55298334916, 135233.12112948924, 135258.69048421088, 135284.26104739975, 135309.83281894168, 135335.4057987225, 135360.97998662802, 135386.55538254412, 135412.13198635669, 135437.70979795168, 135463.28881721498, 135488.86904403262, 135514.45047829056, 135540.03311987486, 135565.61696867159, 135591.20202456677, 135616.78828744654, 135642.37575719706, 135667.96443370447, 135693.55431685498, 135719.14540653475, 135744.73770263011, 135770.33120502727, 135795.92591361253, 135821.52182827223, 135847.11894889272, 135872.7172753604, 135898.31680756161, 135923.91754538284, 135949.51948871053, 135975.12263743114, 136000.72699143123, 136026.33255059729, 136051.93931481591, 136077.54728397369, 136103.15645795723, 136128.76683665317, 136154.37841994822, 136179.99120772901, 136205.60519988232, 136231.2203962949, 136256.83679685349, 136282.45440144493, 136308.07320995603, 136333.69322227367, 136359.31443828469, 136384.93685787608, 136410.56048093468, 136436.18530734754, 136461.81133700156, 136487.43856978384, 136513.06700558143, 136538.6966442813, 136564.32748577066, 136589.95952993655, 136615.59277666616, 136641.22722584667, 136666.86287736523, 136692.49973110916, 136718.13778696564, 136743.77704482197, 136769.41750456547, 136795.05916608346, 136820.70202926331, 136846.34609399244, 136871.99136015819, 136897.63782764805, 136923.28549634948, 136948.93436614997, 136974.58443693706, 137000.23570859825, 137025.88818102115, 137051.54185409332, 137077.19672770242, 137102.85280173609, 137128.51007608202, 137154.16855062786, 137179.82822526142, 137205.48909987041, 137231.15117434258, 137256.8144485658, 137282.47892242789, 137308.14459581667, 137333.81146862009, 137359.47954072602, 137385.14881202241, 137410.81928239719, 137436.49095173844, 137462.16381993407, 137487.83788687221, 137513.51315244089, 137539.18961652822, 137564.86727902229, 137590.54613981131, 137616.22619878338, 137641.90745582676, 137667.58991082967, 137693.27356368033, 137718.95841426702, 137744.64446247809, 137770.33170820182, 137796.02015132661, 137821.70979174081, 137847.40062933284, 137873.09266399115, 137898.78589560417, 137924.48032406042, 137950.17594924837, 137975.8727710566, 138001.57078937365, 138027.27000408815, 138052.97041508864, 138078.67202226384, 138104.3748255024, 138130.07882469296, 138155.78401972432, 138181.49041048516, 138207.1979968643, 138232.9067787505, 138258.61675603263, 138284.32792859949, 138310.04029633995, 138335.75385914298, 138361.46861689744, 138387.18456949232, 138412.90171681659, 138438.62005875923, 138464.33959520931, 138490.06032605586, 138515.78225118798, 138541.50537049473, 138567.2296838653, 138592.95519118884, 138618.68189235451, 138644.40978725153, 138670.13887576913, 138695.86915779658, 138721.60063322316, 138747.33330193823, 138773.06716383106, 138798.80221879104, 138824.53846670757, 138850.27590747006, 138876.01454096794, 138901.7543670907, 138927.49538572782, 138953.2375967688, 138978.9810001032, 139004.72559562061, 139030.47138321059, 139056.2183627628, 139081.96653416683, 139107.71589731239, 139133.46645208917, 139159.21819838689, 139184.97113609532, 139210.72526510421, 139236.48058530336, 139262.23709658257, 139287.99479883176, 139313.75369194071, 139339.51377579942, 139365.27505029776, 139391.03751532568, 139416.80117077316, 139442.56601653024, 139468.33205248689, 139494.09927853322, 139519.86769455927, 139545.63730045516, 139571.408096111, 139597.18008141697, 139622.95325626322, 139648.72762054001, 139674.5031741375, 139700.27991694602, 139726.05784885579, 139751.83696975713, 139777.61727954043, 139803.39877809596, 139829.18146531415, 139854.96534108539, 139880.75040530015, 139906.53665784886, 139932.32409862199, 139958.11272751007, 139983.90254440365, 140009.69354919327, 140035.48574176949, 140061.27912202294, 140087.07368984428, 140112.86944512415, 140138.66638775321, 140164.4645176222, 140190.26383462184, 140216.06433864293, 140241.86602957622, 140267.66890731253, 140293.47297174268, 140319.27822275754, 140345.08466024802, 140370.89228410498, 140396.70109421943, 140422.51109048226, 140448.32227278448, 140474.13464101712, 140499.94819507122, 140525.76293483781, 140551.57886020801, 140577.3959710729, 140603.21426732364, 140629.03374885136, 140654.85441554731, 140680.67626730262, 140706.49930400858, 140732.32352555645, 140758.1489318375, 140783.97552274304, 140809.80329816442, 140835.63225799298, 140861.46240212015, 140887.29373043729, 140913.12624283586, 140938.95993920733, 140964.79481944317, 140990.63088343487, 141016.46813107401, 141042.30656225214, 141068.14617686081, 141093.98697479168, 141119.82895593636, 141145.6721201865, 141171.51646743377, 141197.36199756994, 141223.20871048668, 141249.05660607578, 141274.90568422904, 141300.75594483822, 141326.6073877952, 141352.4600129918, 141378.31382031992, 141404.16880967148, 141430.02498093838, 141455.8823340126, 141481.74086878612, 141507.60058515094, 141533.46148299909, 141559.32356222265, 141585.18682271364, 141611.05126436421, 141636.9168870665, 141662.78369071262, 141688.65167519479, 141714.5208404052, 141740.39118623605, 141766.26271257963, 141792.1354193282, 141818.00930637406, 141843.88437360956, 141869.760620927, 141895.6380482188, 141921.51665537735, 141947.39644229505, 141973.27740886438, 141999.15955497778, 142025.04288052776, 142050.92738540689, 142076.81306950765, 142102.69993272264, 142128.58797494444, 142154.47719606571, 142180.36759597904, 142206.25917457714, 142232.15193175265, 142258.04586739838, 142283.94098140698, 142309.83727367126, 142335.73474408401, 142361.63339253806, 142387.5332189262, 142413.43422314132, 142439.33640507635, 142465.23976462413, 142491.14430167765, 142517.05001612983, 142542.95690787368, 142568.86497680223, 142594.77422280848, 142620.68464578551, 142646.5962456264, 142672.50902222423, 142698.42297547215, 142724.33810526333, 142750.25441149093, 142776.17189404817, 142802.09055282827, 142828.01038772447, 142853.93139863008, 142879.85358543837, 142905.77694804268, 142931.70148633636, 142957.62720021277, 142983.55408956532, 143009.48215428743, 143035.41139427255, 143061.34180941415, 143087.27339960571, 143113.20616474075, 143139.14010471283, 143165.07521941551, 143191.01150874238, 143216.94897258704, 143242.88761084314, 143268.82742340435, 143294.76841016437, 143320.71057101688, 143346.65390585564, 143372.59841457437, 143398.54409706692, 143424.49095322701, 143450.43898294857, 143476.38818612538, 143502.33856265133, 143528.29011242036, 143554.24283532638, 143580.19673126334, 143606.1518001252, 143632.10804180597, 143658.06545619969, 143684.02404320039, 143709.98380270213, 143735.944734599, 143761.90683878519, 143787.87011515474, 143813.83456360188, 143839.8001840208, 143865.76697630569, 143891.73494035081, 143917.7040760504, 143943.67438329876, 143969.6458619902, 143995.61851201905, 144021.59233327967, 144047.56732566646, 144073.54348907378, 144099.52082339607, 144125.49932852783, 144151.4790043635, 144177.45985079758, 144203.44186772458, 144229.42505503909, 144255.40941263564, 144281.39494040885, 144307.38163825331, 144333.36950606373, 144359.35854373468, 144385.34875116093, 144411.34012823718, 144437.33267485813, 144463.32639091855, 144489.32127631325, 144515.31733093705, 144541.31455468474, 144567.3129474512, 144593.3125091313, 144619.31323961995, 144645.31513881206, 144671.31820660262, 144697.32244288657, 144723.32784755889, 144749.33442051467, 144775.34216164888, 144801.35107085665, 144827.36114803303, 144853.37239307314, 144879.38480587213, 144905.39838632516, 144931.41313432742, 144957.4290497741, 144983.44613256046, 145009.46438258173, 145035.48379973322, 145061.50438391021, 145087.52613500805, 145113.54905292206, 145139.57313754765, 145165.59838878017, 145191.62480651509, 145217.65239064783, 145243.68114107384, 145269.71105768863, 145295.74214038774, 145321.77438906668, 145347.80780362099, 145373.84238394629, 145399.87812993818, 145425.91504149229, 145451.95311850426, 145477.9923608698, 145504.03276848458, 145530.07434124436, 145556.11707904484, 145582.16098178181, 145608.20604935108, 145634.25228164849, 145660.29967856981, 145686.34824001096, 145712.39796586783, 145738.4488560363, 145764.50091041232, 145790.55412889185, 145816.60851137087, 145842.66405774537, 145868.72076791141, 145894.77864176501, 145920.83767920226, 145946.89788011924, 145972.95924441208, 145999.02177197693, 146025.08546270995, 146051.15031650732, 146077.21633326527, 146103.28351288004, 146129.35185524789, 146155.42136026506, 146181.49202782792, 146207.56385783272, 146233.63685017588, 146259.71100475377, 146285.78632146274, 146311.86280019928, 146337.94044085976, 146364.01924334071, 146390.09920753856, 146416.18033334985, 146442.26262067116, 146468.34606939898, 146494.43067942993, 146520.51645066062, 146546.60338298764, 146572.69147630769, 146598.78073051744, 146624.87114551352, 146650.96272119274, 146677.05545745179, 146703.14935418745, 146729.2444112965, 146755.34062867577, 146781.43800622207, 146807.53654383228, 146833.63624140329, 146859.73709883197, 146885.83911601527, 146911.94229285014, 146938.04662923355, 146964.15212506248, 146990.25878023397, 147016.36659464505, 147042.47556819281, 147068.58570077427, 147094.6969922866, 147120.80944262692, 147146.92305169237, 147173.03781938017, 147199.15374558745, 147225.27083021149, 147251.38907314953, 147277.50847429881, 147303.62903355664, 147329.75075082036, 147355.87362598727, 147381.99765895473, 147408.12284962015, 147434.24919788091, 147460.37670363448, 147486.50536677826, 147512.63518720976, 147538.76616482646, 147564.89829952587, 147591.03159120557, 147617.16603976308, 147643.30164509601, 147669.43840710199, 147695.57632567859, 147721.71540072354, 147747.85563213445, 147773.99701980909, 147800.13956364512, 147826.28326354033, 147852.42811939248, 147878.57413109933, 147904.72129855872, 147930.86962166851, 147957.01910032652, 147983.16973443062, 148009.32152387875, 148035.47446856883, 148061.62856839882, 148087.78382326665, 148113.94023307035, 148140.09779770792, 148166.25651707739, 148192.41639107687, 148218.57741960438, 148244.73960255808, 148270.90293983606, 148297.0674313365, 148323.23307695755, 148349.39987659742, 148375.56783015432, 148401.73693752653, 148427.90719861226, 148454.07861330983, 148480.25118151752, 148506.42490313368, 148532.59977805667, 148558.77580618486, 148584.95298741665, 148611.13132165043, 148637.31080878471, 148663.49144871789, 148689.6732413485, 148715.85618657502, 148742.040284296, 148768.22553440998, 148794.41193681557, 148820.59949141133, 148846.78819809589, 148872.97805676793, 148899.16906732606, 148925.36122966901, 148951.55454369547, 148977.74900930419, 149003.9446263939, 149030.1413948634, 149056.33931461151, 149082.53838553699, 149108.73860753875, 149134.9399805156, 149161.14250436646, 149187.34617899026, 149213.5510042859, 149239.75698015234, 149265.96410648854, 149292.17238319354, 149318.38181016635, 149344.59238730598, 149370.80411451156, 149397.01699168212, 149423.23101871679, 149449.44619551473, 149475.66252197503, 149501.87999799693, 149528.0986234796, 149554.31839832227, 149580.53932242419, 149606.76139568459, 149632.98461800278, 149659.20898927809, 149685.43450940982, 149711.66117829733, 149737.88899584001, 149764.11796193724, 149790.34807648844, 149816.57933939309, 149842.81175055061, 149869.04530986046, 149895.28001722222, 149921.51587253538, 149947.75287569952, 149973.99102661415, 150000.23032517891, 150026.47077129342, 150052.71236485732, 150078.95510577026, 150105.1989939319, 150131.444029242, 150157.69021160025, 150183.93754090639, 150210.18601706024, 150236.43563996154, 150262.68640951012, 150288.93832560582, 150315.19138814852, 150341.44559703805, 150367.70095217437, 150393.95745345735, 150420.21510078697, 150446.47389406321, 150472.73383318601, 150498.99491805542, 150525.25714857146, 150551.52052463419, 150577.78504614369, 150604.05071300003, 150630.31752510337, 150656.58548235384, 150682.85458465159, 150709.1248318968, 150735.39622398972, 150761.66876083051, 150787.9424423195, 150814.21726835691, 150840.49323884305, 150866.77035367821, 150893.04861276277, 150919.32801599705, 150945.60856328148, 150971.89025451642, 150998.17308960229, 151024.45706843957, 151050.74219092872, 151077.02845697021, 151103.31586646455, 151129.60441931229, 151155.894115414, 151182.1849546702, 151208.47693698155, 151234.77006224863, 151261.06433037209, 151287.35974125259, 151313.65629479082, 151339.95399088747, 151366.25282944329, 151392.55281035902, 151418.85393353543, 151445.1561988733, 151471.45960627345, 151497.76415563675, 151524.06984686397, 151550.37667985607, 151576.68465451393, 151602.99377073845, 151629.30402843058, 151655.61542749128, 151681.92796782157, 151708.24164932242, 151734.55647189484, 151760.87243543993, 151787.18953985872, 151813.50778505235, 151839.82717092187, 151866.14769736846, 151892.46936429327, 151918.79217159748, 151945.11611918229, 151971.44120694889, 151997.76743479856, 152024.09480263255, 152050.42331035214, 152076.75295785864, 152103.08374505339, 152129.41567183775, 152155.74873811303, 152182.08294378067, 152208.41828874208, 152234.75477289871, 152261.09239615197, 152287.43115840337, 152313.77105955439, 152340.11209950657, 152366.45427816146, 152392.79759542056, 152419.14205118554, 152445.48764535793, 152471.8343778394, 152498.18224853161, 152524.53125733617, 152550.88140415482, 152577.23268888926, 152603.58511144121, 152629.93867171241, 152656.29336960468, 152682.64920501978, 152709.00617785956, 152735.36428802583, 152761.72353542043, 152788.08391994529, 152814.44544150229, 152840.80809999333, 152867.17189532038, 152893.53682738543, 152919.90289609041, 152946.27010133737, 152972.63844302832, 152999.00792106529, 153025.37853535041, 153051.7502857857, 153078.12317227334, 153104.4971947154, 153130.8723530141, 153157.24864707157, 153183.62607679001, 153210.00464207167, 153236.38434281875, 153262.76517893354, 153289.14715031831, 153315.53025687535, 153341.91449850702, 153368.2998751156, 153394.68638660354, 153421.07403287315, 153447.46281382689, 153473.85272936718, 153500.24377939643, 153526.63596381716, 153553.02928253182, 153579.42373544298, 153605.81932245308, 153632.21604346478, 153658.61389838057, 153685.0128871031, 153711.41300953497, 153737.81426557881, 153764.21665513728, 153790.62017811305, 153817.02483440886, 153843.43062392739, 153869.83754657139, 153896.24560224367, 153922.65479084692, 153949.06511228404, 153975.4765664578, 154001.88915327107, 154028.30287262669, 154054.71772442761, 154081.13370857667, 154107.55082497682, 154133.96907353101, 154160.38845414223, 154186.80896671346, 154213.23061114774, 154239.65338734805, 154266.07729521746, 154292.50233465908, 154318.92850557598, 154345.35580787127, 154371.7842414481, 154398.21380620965, 154424.64450205903, 154451.07632889951, 154477.50928663427, 154503.94337516659, 154530.37859439969, 154556.81494423689, 154583.25242458144, 154609.69103533673, 154636.13077640603, 154662.57164769279, 154689.01364910032, 154715.45678053208, 154741.90104189145, 154768.34643308193, 154794.79295400696, 154821.24060457002, 154847.68938467462, 154874.13929422433, 154900.59033312264, 154927.04250127316, 154953.49579857948, 154979.95022494521, 155006.40578027396, 155032.86246446942, 155059.32027743524, 155085.77921907514, 155112.2392892928, 155138.70048799197, 155165.16281507642, 155191.62627044989, 155218.09085401625, 155244.55656567923, 155271.02340534274, 155297.49137291059, 155323.96046828668, 155350.4306913749, 155376.90204207919, 155403.37452030348, 155429.84812595171, 155456.32285892789, 155482.79871913602, 155509.27570648011, 155535.75382086422, 155562.23306219239, 155588.71343036872, 155615.19492529731, 155641.67754688227, 155668.16129502779, 155694.64616963797, 155721.13217061706, 155747.61929786921, 155774.10755129869, 155800.59693080973, 155827.08743630661, 155853.57906769359, 155880.07182487496, 155906.56570775513, 155933.06071623837, 155959.55685022907, 155986.05410963166, 156012.5524943505, 156039.05200429002, 156065.55263935472, 156092.054399449, 156118.5572844774, 156145.06129434443, 156171.5664289546, 156198.07268821247, 156224.5800720226, 156251.08858028959, 156277.59821291809, 156304.10896981266, 156330.62085087801, 156357.1338560188, 156383.64798513969, 156410.16323814544, 156436.67961494075, 156463.1971154304, 156489.71573951913, 156516.23548711176, 156542.75635811311, 156569.27835242799, 156595.80146996127, 156622.32571061782, 156648.85107430254, 156675.37756092031, 156701.90517037612, 156728.43390257491, 156754.96375742162, 156781.49473482129, 156808.02683467892, 156834.5600568995, 156861.09440138817, 156887.62986804993, 156914.16645678994, 156940.70416751326, 156967.24300012505, 156993.78295453047, 157020.32403063469, 157046.8662283429, 157073.40954756032, 157099.9539881922, 157126.49955014378, 157153.04623332032, 157179.59403762716, 157206.14296296958, 157232.69300925292, 157259.24417638258, 157285.79646426387, 157312.34987280221, 157338.90440190304, 157365.46005147175, 157392.01682141385, 157418.57471163478, 157445.13372204005, 157471.69385253513, 157498.25510302564, 157524.81747341706, 157551.38096361503, 157577.9455735251, 157604.51130305286, 157631.07815210402, 157657.64612058419, 157684.21520839902, 157710.78541545427, 157737.35674165559, 157763.92918690876, 157790.50275111952, 157817.07743419363, 157843.65323603692, 157870.23015655516, 157896.80819565422, 157923.3873532399, 157949.96762921812, 157976.54902349479, 158003.13153597576, 158029.71516656701, 158056.29991517449, 158082.88578170416, 158109.47276606198, 158136.06086815402, 158162.65008788629, 158189.24042516484, 158215.83187989573, 158242.42445198505, 158269.01814133892, 158295.61294786347, 158322.20887146486, 158348.80591204923, 158375.4040695228, 158402.00334379176, 158428.60373476235, 158455.2052423408, 158481.80786643337, 158508.41160694641, 158535.01646378616, 158561.62243685898, 158588.2295260712, 158614.8377313292, 158641.44705253936, 158668.05748960807, 158694.66904244179, 158721.28171094693, 158747.89549502998, 158774.5103945974, 158801.12640955573, 158827.74353981143, 158854.36178527112, 158880.9811458413, 158907.60162142856, 158934.22321193956, 158960.84591728085, 158987.46973735912, 159014.09467208097, 159040.72072135314, 159067.3478850823, 159093.97616317519, 159120.60555553852, 159147.23606207906, 159173.8676827036, 159200.50041731889, 159227.13426583182, 159253.76922814918, 159280.40530417781, 159307.04249382461, 159333.68079699649, 159360.32021360032, 159386.96074354305, 159413.60238673165, 159440.24514307309, 159466.88901247433, 159493.53399484244, 159520.18009008438, 159546.82729810724, 159573.47561881805, 159600.12505212394, 159626.77559793202, 159653.42725614941, 159680.08002668325, 159706.73390944069, 159733.38890432892, 159760.04501125516, 159786.70223012666, 159813.36056085059, 159840.02000333427, 159866.68055748497, 159893.34222320997, 159920.00500041663, 159946.66888901225, 159973.33388890422, 159999.99999999988, 160026.66722220668, 160053.33555543202, 160080.0049995833, 160106.67555456801, 160133.3472202936, 160160.0199966676, 160186.6938835975, 160213.36888099083, 160240.04498875517, 160266.72220679806, 160293.40053502709, 160320.07997334987, 160346.76052167406, 160373.44217990729, 160400.1249479572, 160426.80882573154, 160453.49381313793, 160480.17991008417, 160506.86711647795, 160533.55543222709, 160560.24485723933, 160586.93539142248, 160613.62703468435, 160640.31978693281, 160667.01364807569, 160693.70861802087, 160720.40469667627, 160747.1018839498, 160773.80017974938, 160800.49958398298, 160827.20009655855, 160853.90171738411, 160880.60444636765, 160907.30828341722, 160934.01322844089, 160960.71928134665, 160987.42644204266, 161014.13471043704, 161040.84408643784, 161067.55456995327, 161094.26616089148, 161120.97885916062, 161147.69266466892, 161174.40757732463, 161201.12359703594, 161227.84072371112, 161254.55895725847, 161281.27829758628, 161307.99874460287, 161334.72029821656, 161361.44295833571, 161388.1667248687, 161414.89159772391, 161441.61757680977, 161468.34466203468, 161495.07285330712, 161521.80215053557, 161548.53255362847, 161575.26406249436, 161601.99667704175, 161628.7303971792, 161655.46522281526, 161682.20115385848, 161708.93819021754, 161735.67633180099, 161762.41557851751, 161789.15593027571, 161815.89738698432, 161842.63994855201, 161869.38361488748, 161896.1283858995, 161922.87426149679, 161949.62124158812, 161976.36932608229, 162003.1185148881, 162029.8688079144, 162056.62020507001, 162083.37270626382, 162110.12631140469, 162136.88102040152, 162163.63683316324, 162190.39374959879, 162217.15176961714, 162243.91089312723, 162270.67112003808, 162297.43245025873, 162324.19488369819, 162350.9584202655, 162377.72305986975, 162404.48880242003, 162431.25564782543, 162458.02359599507, 162484.79264683815, 162511.56280026378, 162538.33405618116, 162565.10641449949, 162591.87987512801, 162618.65443797593, 162645.43010295252, 162672.20686996708, 162698.98473892888, 162725.76370974723, 162752.54378233149, 162779.32495659095, 162806.10723243505, 162832.89060977317, 162859.67508851466, 162886.46066856899, 162913.24734984562, 162940.03513225398, 162966.82401570358, 162993.6140001039, 163020.40508536444, 163047.19727139481, 163073.99055810447, 163100.78494540305, 163127.58043320014, 163154.37702140535, 163181.17470992831, 163207.97349867865, 163234.77338756606, 163261.57437650024, 163288.37646539087, 163315.17965414765, 163341.98394268038, 163368.78933089875, 163395.59581871261, 163422.40340603172, 163449.2120927659, 163476.02187882498, 163502.83276411882, 163529.6447485573, 163556.45783205028, 163583.2720145077, 163610.08729583945, 163636.90367595552, 163663.72115476584, 163690.53973218042, 163717.35940810922, 163744.18018246227, 163771.00205514964, 163797.82502608138, 163824.64909516752, 163851.4742623182, 163878.3005274435, 163905.12789045356, 163931.95635125853, 163958.78590976857, 163985.61656589387, 164012.44831954464, 164039.28117063109, 164066.11511906344, 164092.95016475199, 164119.78630760699, 164146.62354753874, 164173.46188445756, 164200.30131827376, 164227.14184889771, 164253.98347623978, 164280.82620021031, 164307.67002071979, 164334.51493767856, 164361.3609509971, 164388.20806058586, 164415.05626635533, 164441.905568216, 164468.75596607837, 164495.607459853, 164522.4600494504, 164549.31373478117, 164576.16851575591, 164603.02439228518, 164629.88136427966, 164656.73943164994, 164683.59859430668, 164710.45885216061, 164737.32020512238, 164764.1826531027, 164791.04619601235, 164817.91083376206, 164844.77656626256, 164871.64339342469, 164898.51131515924, 164925.38033137703, 164952.25044198887, 164979.1216469057, 165005.9939460383, 165032.86733929763, 165059.7418265946, 165086.61740784015, 165113.4940829452 }; #else #ifdef BIG_IQ_TABLE #define IQ_TABLE_SIZE 8192 #else #define IQ_TABLE_SIZE 1026 #endif ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = { REAL_CONST(0.0), REAL_CONST(1.0/8.0), REAL_CONST(2.5198420997897464/8.0), REAL_CONST(4.3267487109222245/8.0), REAL_CONST(6.3496042078727974/8.0), REAL_CONST(8.5498797333834844/8.0), REAL_CONST(10.902723556992836/8.0), REAL_CONST(13.390518279406722/8.0), REAL_CONST(15.999999999999998/8.0), REAL_CONST(18.720754407467133/8.0), REAL_CONST(21.544346900318832/8.0), REAL_CONST(24.463780996262464/8.0), REAL_CONST(27.47314182127996/8.0), REAL_CONST(30.567350940369842/8.0), REAL_CONST(33.741991698453212/8.0), REAL_CONST(36.993181114957046/8.0), REAL_CONST(40.317473596635935/8.0), REAL_CONST(43.711787041189993/8.0), REAL_CONST(47.173345095760126/8.0), REAL_CONST(50.699631325716943/8.0), REAL_CONST(54.288352331898118/8.0), REAL_CONST(57.937407704003519/8.0), REAL_CONST(61.6448652744185/8.0), REAL_CONST(65.408940536585988/8.0), REAL_CONST(69.227979374755591/8.0), REAL_CONST(73.100443455321638/8.0), REAL_CONST(77.024897778591622/8.0), REAL_CONST(80.999999999999986/8.0), REAL_CONST(85.024491212518527/8.0), REAL_CONST(89.097187944889555/8.0), REAL_CONST(93.216975178615741/8.0), REAL_CONST(97.382800224133163/8.0), REAL_CONST(101.59366732596474/8.0), REAL_CONST(105.84863288986224/8.0), REAL_CONST(110.14680124343441/8.0), REAL_CONST(114.4873208566006/8.0), REAL_CONST(118.86938096020653/8.0), REAL_CONST(123.29220851090024/8.0), REAL_CONST(127.75506545836058/8.0), REAL_CONST(132.25724627755247/8.0), REAL_CONST(136.79807573413572/8.0), REAL_CONST(141.37690685569191/8.0), REAL_CONST(145.99311908523086/8.0), REAL_CONST(150.6461165966291/8.0), REAL_CONST(155.33532675434674/8.0), REAL_CONST(160.06019870205279/8.0), REAL_CONST(164.82020206673349/8.0), REAL_CONST(169.61482576651861/8.0), REAL_CONST(174.44357691188537/8.0), REAL_CONST(179.30597979112557/8.0), REAL_CONST(184.20157493201927/8.0), REAL_CONST(189.12991823257562/8.0), REAL_CONST(194.09058015449685/8.0), REAL_CONST(199.08314497371677/8.0), REAL_CONST(204.1072100829694/8.0), REAL_CONST(209.16238534187647/8.0), REAL_CONST(214.24829247050752/8.0), REAL_CONST(219.36456448277784/8.0), REAL_CONST(224.51084515641216/8.0), REAL_CONST(229.6867885365223/8.0), REAL_CONST(234.89205847013176/8.0), REAL_CONST(240.12632816923249/8.0), REAL_CONST(245.38927980018505/8.0), REAL_CONST(250.68060409747261/8.0), REAL_CONST(255.99999999999991/8.0), REAL_CONST(261.34717430828869/8.0), REAL_CONST(266.72184136106449/8.0), REAL_CONST(272.12372272986045/8.0), REAL_CONST(277.55254693037961/8.0), REAL_CONST(283.0080491494619/8.0), REAL_CONST(288.48997098659891/8.0), REAL_CONST(293.99806020902247/8.0), REAL_CONST(299.53207051947408/8.0), REAL_CONST(305.0917613358298/8.0), REAL_CONST(310.67689758182206/8.0), REAL_CONST(316.28724948815585/8.0), REAL_CONST(321.92259240337177/8.0), REAL_CONST(327.58270661385535/8.0), REAL_CONST(333.26737717243742/8.0), REAL_CONST(338.97639373507025/8.0), REAL_CONST(344.70955040510125/8.0), REAL_CONST(350.46664558470013/8.0), REAL_CONST(356.24748183302603/8.0), REAL_CONST(362.05186573075139/8.0), REAL_CONST(367.87960775058258/8.0), REAL_CONST(373.73052213344511/8.0), REAL_CONST(379.60442677002078/8.0), REAL_CONST(385.50114308734607/8.0), REAL_CONST(391.42049594019937/8.0), REAL_CONST(397.36231350702371/8.0), REAL_CONST(403.32642719014467/8.0), REAL_CONST(409.31267152006262/8.0), REAL_CONST(415.32088406360799/8.0), REAL_CONST(421.35090533576471/8.0), REAL_CONST(427.40257871497619/8.0), REAL_CONST(433.4757503617617/8.0), REAL_CONST(439.5702691404793/8.0), REAL_CONST(445.68598654408271/8.0), REAL_CONST(451.82275662172759/8.0), REAL_CONST(457.98043590909128/8.0), REAL_CONST(464.15888336127773/8.0), REAL_CONST(470.35796028818726/8.0), REAL_CONST(476.5775302922363/8.0), REAL_CONST(482.81745920832043/8.0), REAL_CONST(489.07761504591741/8.0), REAL_CONST(495.35786793323581/8.0), REAL_CONST(501.65809006331688/8.0), REAL_CONST(507.97815564200368/8.0), REAL_CONST(514.31794083769648/8.0), REAL_CONST(520.67732373281672/8.0), REAL_CONST(527.05618427690604/8.0), REAL_CONST(533.45440424129174/8.0), REAL_CONST(539.87186717525128/8.0), REAL_CONST(546.30845836361505/8.0), REAL_CONST(552.76406478574609/8.0), REAL_CONST(559.23857507584194/8.0), REAL_CONST(565.73187948450413/8.0), REAL_CONST(572.24386984152341/8.0), REAL_CONST(578.77443951983378/8.0), REAL_CONST(585.32348340058843/8.0), REAL_CONST(591.89089783931263/8.0), REAL_CONST(598.47658063309257/8.0), REAL_CONST(605.08043098876044/8.0), REAL_CONST(611.70234949203643/8.0), REAL_CONST(618.3422380775919/8.0), REAL_CONST(624.99999999999977/8.0), REAL_CONST(631.67553980553748/8.0), REAL_CONST(638.36876330481164/8.0), REAL_CONST(645.07957754617485/8.0), REAL_CONST(651.80789078990415/8.0), REAL_CONST(658.55361248311499/8.0), REAL_CONST(665.31665323538357/8.0), REAL_CONST(672.09692479505225/8.0), REAL_CONST(678.8943400261943/8.0), REAL_CONST(685.70881288621433/8.0), REAL_CONST(692.540258404062/8.0), REAL_CONST(699.38859265903977/8.0), REAL_CONST(706.25373276018058/8.0), REAL_CONST(713.13559682617972/8.0), REAL_CONST(720.03410396586037/8.0), REAL_CONST(726.94917425915435/8.0), REAL_CONST(733.88072873858209/8.0), REAL_CONST(740.82868937121543/8.0), REAL_CONST(747.79297904110535/8.0), REAL_CONST(754.77352153216191/8.0), REAL_CONST(761.77024151147043/8.0), REAL_CONST(768.78306451302956/8.0), REAL_CONST(775.81191692189896/8.0), REAL_CONST(782.85672595874246/8.0), REAL_CONST(789.91741966475445/8.0), REAL_CONST(796.99392688695798/8.0), REAL_CONST(804.08617726386274/8.0), REAL_CONST(811.19410121147098/8.0), REAL_CONST(818.31762990962227/8.0), REAL_CONST(825.45669528866563/8.0), REAL_CONST(832.61123001644864/8.0), REAL_CONST(839.78116748561604/8.0), REAL_CONST(846.96644180120552/8.0), REAL_CONST(854.16698776853514/8.0), REAL_CONST(861.38274088137143/8.0), REAL_CONST(868.61363731036977/8.0), REAL_CONST(875.85961389178203/8.0), REAL_CONST(883.12060811641959/8.0), REAL_CONST(890.39655811886757/8.0), REAL_CONST(897.68740266694181/8.0), REAL_CONST(904.99308115138172/8.0), REAL_CONST(912.31353357577188/8.0), REAL_CONST(919.64870054668756/8.0), REAL_CONST(926.99852326405619/8.0), REAL_CONST(934.36294351172899/8.0), REAL_CONST(941.74190364825859/8.0), REAL_CONST(949.13534659787422/8.0), REAL_CONST(956.54321584165211/8.0), REAL_CONST(963.96545540887348/8.0), REAL_CONST(971.40200986856541/8.0), REAL_CONST(978.85282432122176/8.0), REAL_CONST(986.31784439069588/8.0), REAL_CONST(993.7970162162635/8.0), REAL_CONST(1001.29028644485/8.0), REAL_CONST(1008.797602223418/8.0), REAL_CONST(1016.3189111915103/8.0), REAL_CONST(1023.8541614739464/8.0), REAL_CONST(1031.4033016736653/8.0), REAL_CONST(1038.9662808647138/8.0), REAL_CONST(1046.5430485853758/8.0), REAL_CONST(1054.1335548314366/8.0), REAL_CONST(1061.7377500495838/8.0), REAL_CONST(1069.3555851309357/8.0), REAL_CONST(1076.9870114046978/8.0), REAL_CONST(1084.6319806319441/8.0), REAL_CONST(1092.2904449995174/8.0), REAL_CONST(1099.9623571140482/8.0), REAL_CONST(1107.6476699960892/8.0), REAL_CONST(1115.3463370743607/8.0), REAL_CONST(1123.058312180106/8.0), REAL_CONST(1130.7835495415541/8.0), REAL_CONST(1138.5220037784854/8.0), REAL_CONST(1146.273629896901/8.0), REAL_CONST(1154.0383832837879/8.0), REAL_CONST(1161.816219701986/8.0), REAL_CONST(1169.607095285146/8.0), REAL_CONST(1177.4109665327808/8.0), REAL_CONST(1185.2277903054078/8.0), REAL_CONST(1193.0575238197798/8.0), REAL_CONST(1200.9001246442001/8.0), REAL_CONST(1208.7555506939248/8.0), REAL_CONST(1216.6237602266442/8.0), REAL_CONST(1224.5047118380478/8.0), REAL_CONST(1232.3983644574657/8.0), REAL_CONST(1240.3046773435874/8.0), REAL_CONST(1248.2236100802568/8.0), REAL_CONST(1256.1551225723395/8.0), REAL_CONST(1264.099175041662/8.0), REAL_CONST(1272.0557280230228/8.0), REAL_CONST(1280.0247423602691/8.0), REAL_CONST(1288.0061792024444/8.0), REAL_CONST(1295.9999999999995/8.0), REAL_CONST(1304.006166501068/8.0), REAL_CONST(1312.0246407478062/8.0), REAL_CONST(1320.0553850727929/8.0), REAL_CONST(1328.0983620954903/8.0), REAL_CONST(1336.1535347187651/8.0), REAL_CONST(1344.2208661254647/8.0), REAL_CONST(1352.3003197750522/8.0), REAL_CONST(1360.3918594002962/8.0), REAL_CONST(1368.4954490040145/8.0), REAL_CONST(1376.6110528558709/8.0), REAL_CONST(1384.7386354892244/8.0), REAL_CONST(1392.8781616980295/8.0), REAL_CONST(1401.0295965337855/8.0), REAL_CONST(1409.1929053025353/8.0), REAL_CONST(1417.3680535619119/8.0), REAL_CONST(1425.5550071182327/8.0), REAL_CONST(1433.7537320236374/8.0), REAL_CONST(1441.9641945732744/8.0), REAL_CONST(1450.1863613025282/8.0), REAL_CONST(1458.4201989842913/8.0), REAL_CONST(1466.6656746262797/8.0), REAL_CONST(1474.9227554683875/8.0), REAL_CONST(1483.1914089800841/8.0), REAL_CONST(1491.4716028578516/8.0), REAL_CONST(1499.7633050226596/8.0), REAL_CONST(1508.0664836174794/8.0), REAL_CONST(1516.3811070048375/8.0), REAL_CONST(1524.7071437644029/8.0), REAL_CONST(1533.0445626906128/8.0), REAL_CONST(1541.3933327903342/8.0), REAL_CONST(1549.7534232805581/8.0), REAL_CONST(1558.1248035861302/8.0), REAL_CONST(1566.507443337515/8.0), REAL_CONST(1574.9013123685909/8.0), REAL_CONST(1583.3063807144795/8.0), REAL_CONST(1591.7226186094069/8.0), REAL_CONST(1600.1499964845941/8.0), REAL_CONST(1608.58848496618/8.0), REAL_CONST(1617.0380548731737/8.0), REAL_CONST(1625.4986772154357/8.0), REAL_CONST(1633.9703231916887/8.0), REAL_CONST(1642.4529641875577/8.0), REAL_CONST(1650.9465717736346/8.0), REAL_CONST(1659.4511177035752/8.0), REAL_CONST(1667.9665739122186/8.0), REAL_CONST(1676.4929125137353/8.0), REAL_CONST(1685.030105799801/8.0), REAL_CONST(1693.5781262377957/8.0), REAL_CONST(1702.136946469027/8.0), REAL_CONST(1710.7065393069795/8.0), REAL_CONST(1719.2868777355877/8.0), REAL_CONST(1727.8779349075323/8.0), REAL_CONST(1736.4796841425596/8.0), REAL_CONST(1745.092098925825/8.0), REAL_CONST(1753.7151529062583/8.0), REAL_CONST(1762.3488198949503/8.0), REAL_CONST(1770.9930738635628/8.0), REAL_CONST(1779.6478889427597/8.0), REAL_CONST(1788.3132394206564/8.0), REAL_CONST(1796.9890997412947/8.0), REAL_CONST(1805.6754445031333/8.0), REAL_CONST(1814.3722484575621/8.0), REAL_CONST(1823.0794865074322/8.0), REAL_CONST(1831.7971337056094/8.0), REAL_CONST(1840.5251652535437/8.0), REAL_CONST(1849.2635564998579/8.0), REAL_CONST(1858.0122829389563/8.0), REAL_CONST(1866.7713202096493/8.0), REAL_CONST(1875.5406440937966/8.0), REAL_CONST(1884.3202305149687/8.0), REAL_CONST(1893.110055537124/8.0), REAL_CONST(1901.9100953633042/8.0), REAL_CONST(1910.7203263343454/8.0), REAL_CONST(1919.5407249276057/8.0), REAL_CONST(1928.3712677557098/8.0), REAL_CONST(1937.2119315653083/8.0), REAL_CONST(1946.0626932358525/8.0), REAL_CONST(1954.923529778386/8.0), REAL_CONST(1963.79441833435/8.0), REAL_CONST(1972.6753361744036/8.0), REAL_CONST(1981.5662606972594/8.0), REAL_CONST(1990.467169428533/8.0), REAL_CONST(1999.3780400196069/8.0), REAL_CONST(2008.2988502465078/8.0), REAL_CONST(2017.2295780087982/8.0), REAL_CONST(2026.1702013284819/8.0), REAL_CONST(2035.1206983489212/8.0), REAL_CONST(2044.0810473337688/8.0), REAL_CONST(2053.0512266659125/8.0), REAL_CONST(2062.0312148464309/8.0), REAL_CONST(2071.0209904935646/8.0), REAL_CONST(2080.0205323416958/8.0), REAL_CONST(2089.0298192403443/8.0), REAL_CONST(2098.0488301531714/8.0), REAL_CONST(2107.0775441569995/8.0), REAL_CONST(2116.115940440839/8.0), REAL_CONST(2125.1639983049317/8.0), REAL_CONST(2134.2216971597995/8.0), REAL_CONST(2143.2890165253098/8.0), REAL_CONST(2152.3659360297484/8.0), REAL_CONST(2161.4524354089031/8.0), REAL_CONST(2170.5484945051617/8.0), REAL_CONST(2179.6540932666144/8.0), REAL_CONST(2188.7692117461711/8.0), REAL_CONST(2197.8938301006888/8.0), REAL_CONST(2207.0279285901042/8.0), REAL_CONST(2216.1714875765838/8.0), REAL_CONST(2225.324487523676/8.0), REAL_CONST(2234.4869089954782/8.0), REAL_CONST(2243.6587326558101/8.0), REAL_CONST(2252.8399392673982/8.0), REAL_CONST(2262.0305096910702/8.0), REAL_CONST(2271.2304248849537/8.0), REAL_CONST(2280.4396659036897/8.0), REAL_CONST(2289.6582138976523/8.0), REAL_CONST(2298.8860501121762/8.0), REAL_CONST(2308.1231558867926/8.0), REAL_CONST(2317.3695126544767/8.0), REAL_CONST(2326.6251019409005/8.0), REAL_CONST(2335.8899053636933/8.0), REAL_CONST(2345.1639046317132/8.0), REAL_CONST(2354.4470815443233/8.0), REAL_CONST(2363.7394179906792/8.0), REAL_CONST(2373.0408959490205/8.0), REAL_CONST(2382.3514974859731/8.0), REAL_CONST(2391.6712047558558/8.0), REAL_CONST(2400.9999999999991/8.0), REAL_CONST(2410.3378655460651/8.0), REAL_CONST(2419.6847838073813/8.0), REAL_CONST(2429.0407372822747/8.0), REAL_CONST(2438.4057085534191/8.0), REAL_CONST(2447.7796802871858/8.0), REAL_CONST(2457.1626352330004/8.0), REAL_CONST(2466.5545562227112/8.0), REAL_CONST(2475.9554261699564/8.0), REAL_CONST(2485.3652280695474/8.0), REAL_CONST(2494.7839449968492/8.0), REAL_CONST(2504.2115601071737/8.0), REAL_CONST(2513.6480566351788/8.0), REAL_CONST(2523.0934178942675/8.0), REAL_CONST(2532.5476272760025/8.0), REAL_CONST(2542.0106682495189/8.0), REAL_CONST(2551.482524360948/8.0), REAL_CONST(2560.9631792328441/8.0), REAL_CONST(2570.4526165636184/8.0), REAL_CONST(2579.9508201269791/8.0), REAL_CONST(2589.4577737713744/8.0), REAL_CONST(2598.9734614194458/8.0), REAL_CONST(2608.4978670674823/8.0), REAL_CONST(2618.0309747848837/8.0), REAL_CONST(2627.5727687136259/8.0), REAL_CONST(2637.1232330677353/8.0), REAL_CONST(2646.6823521327647/8.0), REAL_CONST(2656.2501102652768/8.0), REAL_CONST(2665.8264918923328/8.0), REAL_CONST(2675.4114815109842/8.0), REAL_CONST(2685.0050636877722/8.0), REAL_CONST(2694.6072230582295/8.0), REAL_CONST(2704.2179443263894/8.0), REAL_CONST(2713.8372122642972/8.0), REAL_CONST(2723.4650117115279/8.0), REAL_CONST(2733.1013275747096/8.0), REAL_CONST(2742.7461448270483/8.0), REAL_CONST(2752.3994485078601/8.0), REAL_CONST(2762.0612237221085/8.0), REAL_CONST(2771.7314556399419/8.0), REAL_CONST(2781.4101294962406/8.0), REAL_CONST(2791.0972305901655/8.0), REAL_CONST(2800.7927442847094/8.0), REAL_CONST(2810.4966560062589/8.0), REAL_CONST(2820.2089512441521/8.0), REAL_CONST(2829.9296155502466/8.0), REAL_CONST(2839.6586345384894/8.0), REAL_CONST(2849.3959938844923/8.0), REAL_CONST(2859.1416793251065/8.0), REAL_CONST(2868.8956766580086/8.0), REAL_CONST(2878.6579717412847/8.0), REAL_CONST(2888.4285504930212/8.0), REAL_CONST(2898.2073988908974/8.0), REAL_CONST(2907.9945029717837/8.0), REAL_CONST(2917.789848831344/8.0), REAL_CONST(2927.5934226236377/8.0), REAL_CONST(2937.4052105607311/8.0), REAL_CONST(2947.2251989123079/8.0), REAL_CONST(2957.0533740052865/8.0), REAL_CONST(2966.8897222234368/8.0), REAL_CONST(2976.734230007005/8.0), REAL_CONST(2986.5868838523397/8.0), REAL_CONST(2996.4476703115197/8.0), REAL_CONST(3006.3165759919889/8.0), REAL_CONST(3016.1935875561908/8.0), REAL_CONST(3026.0786917212095/8.0), REAL_CONST(3035.9718752584108/8.0), REAL_CONST(3045.8731249930906/8.0), REAL_CONST(3055.7824278041207/8.0), REAL_CONST(3065.6997706236039/8.0), REAL_CONST(3075.625140436528/8.0), REAL_CONST(3085.5585242804245/8.0), REAL_CONST(3095.4999092450298/8.0), REAL_CONST(3105.4492824719491/8.0), REAL_CONST(3115.4066311543256/8.0), REAL_CONST(3125.3719425365089/8.0), REAL_CONST(3135.3452039137287/8.0), REAL_CONST(3145.3264026317715/8.0), REAL_CONST(3155.3155260866592/8.0), REAL_CONST(3165.3125617243295/8.0), REAL_CONST(3175.3174970403229/8.0), REAL_CONST(3185.3303195794679/8.0), REAL_CONST(3195.35101693557/8.0), REAL_CONST(3205.3795767511078/8.0), REAL_CONST(3215.4159867169251/8.0), REAL_CONST(3225.460234571929/8.0), REAL_CONST(3235.5123081027928/8.0), REAL_CONST(3245.5721951436558/8.0), REAL_CONST(3255.63988357583/8.0), REAL_CONST(3265.7153613275095/8.0), REAL_CONST(3275.7986163734795/8.0), REAL_CONST(3285.8896367348289/8.0), REAL_CONST(3295.9884104786665/8.0), REAL_CONST(3306.0949257178395/8.0), REAL_CONST(3316.2091706106517/8.0), REAL_CONST(3326.331133360588/8.0), REAL_CONST(3336.4608022160378/8.0), REAL_CONST(3346.5981654700231/8.0), REAL_CONST(3356.7432114599264/8.0), REAL_CONST(3366.8959285672249/8.0), REAL_CONST(3377.0563052172211/8.0), REAL_CONST(3387.2243298787821/8.0), REAL_CONST(3397.3999910640764/8.0), REAL_CONST(3407.5832773283128/8.0), REAL_CONST(3417.7741772694862/8.0), REAL_CONST(3427.9726795281199/8.0), REAL_CONST(3438.1787727870123/8.0), REAL_CONST(3448.3924457709873/8.0), REAL_CONST(3458.6136872466445/8.0), REAL_CONST(3468.8424860221107/8.0), REAL_CONST(3479.0788309467976/8.0), REAL_CONST(3489.3227109111554/8.0), REAL_CONST(3499.5741148464344/8.0), REAL_CONST(3509.8330317244445/8.0), REAL_CONST(3520.0994505573185/8.0), REAL_CONST(3530.3733603972751/8.0), REAL_CONST(3540.6547503363886/8.0), REAL_CONST(3550.9436095063534/8.0), REAL_CONST(3561.239927078258/8.0), REAL_CONST(3571.5436922623535/8.0), REAL_CONST(3581.8548943078308/8.0), REAL_CONST(3592.1735225025936/8.0), REAL_CONST(3602.4995661730372/8.0), REAL_CONST(3612.8330146838275/8.0), REAL_CONST(3623.1738574376814/8.0), REAL_CONST(3633.5220838751502/8.0), REAL_CONST(3643.8776834744031/8.0), REAL_CONST(3654.2406457510142/8.0), REAL_CONST(3664.6109602577494/8.0), REAL_CONST(3674.9886165843564/8.0), REAL_CONST(3685.3736043573545/8.0), REAL_CONST(3695.7659132398294/8.0), REAL_CONST(3706.1655329312248/8.0), REAL_CONST(3716.5724531671399/8.0), REAL_CONST(3726.9866637191262/8.0), REAL_CONST(3737.4081543944876/8.0), REAL_CONST(3747.8369150360782/8.0), REAL_CONST(3758.2729355221072/8.0), REAL_CONST(3768.7162057659411/8.0), REAL_CONST(3779.1667157159077/8.0), REAL_CONST(3789.6244553551055/8.0), REAL_CONST(3800.0894147012082/8.0), REAL_CONST(3810.5615838062768/8.0), REAL_CONST(3821.0409527565694/8.0), REAL_CONST(3831.5275116723533/8.0), REAL_CONST(3842.0212507077194/8.0), REAL_CONST(3852.522160050396/8.0), REAL_CONST(3863.0302299215673/8.0), REAL_CONST(3873.5454505756893/8.0), REAL_CONST(3884.0678123003108/8.0), REAL_CONST(3894.5973054158922/8.0), REAL_CONST(3905.1339202756285/8.0), REAL_CONST(3915.6776472652732/8.0), REAL_CONST(3926.2284768029604/8.0), REAL_CONST(3936.7863993390338/8.0), REAL_CONST(3947.3514053558706/8.0), REAL_CONST(3957.9234853677135/8.0), REAL_CONST(3968.5026299204969/8.0), REAL_CONST(3979.0888295916798/8.0), REAL_CONST(3989.6820749900776/8.0), REAL_CONST(4000.2823567556948/8.0), REAL_CONST(4010.8896655595613/8.0), REAL_CONST(4021.5039921035655/8.0), REAL_CONST(4032.1253271202945/8.0), REAL_CONST(4042.7536613728694/8.0), REAL_CONST(4053.3889856547858/8.0), REAL_CONST(4064.0312907897551/8.0), REAL_CONST(4074.6805676315448/8.0), REAL_CONST(4085.3368070638221/8.0), REAL_CONST(4095.9999999999982/8.0), REAL_CONST(4106.6701373830711/8.0), REAL_CONST(4117.347210185475/8.0), REAL_CONST(4128.0312094089259/8.0), REAL_CONST(4138.722126084268/8.0), REAL_CONST(4149.4199512713267/8.0), REAL_CONST(4160.1246760587583/8.0), REAL_CONST(4170.8362915638982/8.0), REAL_CONST(4181.5547889326181/8.0), REAL_CONST(4192.2801593391769/8.0), REAL_CONST(4203.0123939860741/8.0), REAL_CONST(4213.7514841039101/8.0), REAL_CONST(4224.4974209512384/8.0), REAL_CONST(4235.2501958144258/8.0), REAL_CONST(4246.0098000075095/8.0), REAL_CONST(4256.7762248720574/8.0), REAL_CONST(4267.549461777031/8.0), REAL_CONST(4278.3295021186423/8.0), REAL_CONST(4289.1163373202198/8.0), REAL_CONST(4299.9099588320714/8.0), REAL_CONST(4310.7103581313495/8.0), REAL_CONST(4321.5175267219138/8.0), REAL_CONST(4332.3314561342004/8.0), REAL_CONST(4343.152137925088/8.0), REAL_CONST(4353.9795636777671/8.0), REAL_CONST(4364.8137250016052/8.0), REAL_CONST(4375.6546135320223/8.0), REAL_CONST(4386.5022209303588/8.0), REAL_CONST(4397.3565388837469/8.0), REAL_CONST(4408.2175591049827/8.0), REAL_CONST(4419.0852733324018/8.0), REAL_CONST(4429.9596733297531/8.0), REAL_CONST(4440.8407508860728/8.0), REAL_CONST(4451.7284978155603/8.0), REAL_CONST(4462.6229059574571/8.0), REAL_CONST(4473.5239671759227/8.0), REAL_CONST(4484.4316733599126/8.0), REAL_CONST(4495.3460164230582/8.0), REAL_CONST(4506.2669883035496/8.0), REAL_CONST(4517.1945809640119/8.0), REAL_CONST(4528.1287863913894/8.0), REAL_CONST(4539.069596596828/8.0), REAL_CONST(4550.0170036155587/8.0), REAL_CONST(4560.9709995067806/8.0), REAL_CONST(4571.931576353546/8.0), REAL_CONST(4582.898726262647/8.0), REAL_CONST(4593.8724413645004/8.0), REAL_CONST(4604.8527138130348/8.0), REAL_CONST(4615.8395357855816/8.0), REAL_CONST(4626.8328994827571/8.0), REAL_CONST(4637.8327971283588/8.0), REAL_CONST(4648.8392209692511/8.0), REAL_CONST(4659.8521632752563/8.0), REAL_CONST(4670.8716163390473/8.0), REAL_CONST(4681.8975724760394/8.0), REAL_CONST(4692.9300240242837/8.0), REAL_CONST(4703.9689633443595/8.0), REAL_CONST(4715.0143828192668/8.0), REAL_CONST(4726.0662748543255/8.0), REAL_CONST(4737.1246318770682/8.0), REAL_CONST(4748.1894463371373/8.0), REAL_CONST(4759.2607107061804/8.0), REAL_CONST(4770.3384174777493/8.0), REAL_CONST(4781.4225591671993/8.0), REAL_CONST(4792.5131283115852/8.0), REAL_CONST(4803.6101174695614/8.0), REAL_CONST(4814.7135192212854/8.0), REAL_CONST(4825.8233261683154/8.0), REAL_CONST(4836.9395309335096/8.0), REAL_CONST(4848.0621261609349/8.0), REAL_CONST(4859.1911045157631/8.0), REAL_CONST(4870.3264586841779/8.0), REAL_CONST(4881.4681813732768/8.0), REAL_CONST(4892.6162653109768/8.0), REAL_CONST(4903.7707032459193/8.0), REAL_CONST(4914.931487947375/8.0), REAL_CONST(4926.0986122051509/8.0), REAL_CONST(4937.2720688294967/8.0), REAL_CONST(4948.4518506510112/8.0), REAL_CONST(4959.637950520555/8.0), REAL_CONST(4970.8303613091521/8.0), REAL_CONST(4982.0290759079044/8.0), REAL_CONST(4993.2340872278974/8.0), REAL_CONST(5004.4453882001153/8.0), REAL_CONST(5015.6629717753467/8.0), REAL_CONST(5026.8868309241007/8.0), REAL_CONST(5038.1169586365131/8.0), REAL_CONST(5049.353347922266/8.0), REAL_CONST(5060.5959918104927/8.0), REAL_CONST(5071.8448833496996/8.0), REAL_CONST(5083.1000156076734/8.0), REAL_CONST(5094.3613816713996/8.0), REAL_CONST(5105.6289746469747/8.0), REAL_CONST(5116.9027876595246/8.0), REAL_CONST(5128.18281385312/8.0), REAL_CONST(5139.4690463906918/8.0), REAL_CONST(5150.7614784539473/8.0), REAL_CONST(5162.0601032432933/8.0), REAL_CONST(5173.3649139777472/8.0), REAL_CONST(5184.6759038948594/8.0), REAL_CONST(5195.9930662506322/8.0), REAL_CONST(5207.3163943194386/8.0), REAL_CONST(5218.6458813939435/8.0), REAL_CONST(5229.9815207850224/8.0), REAL_CONST(5241.3233058216847/8.0), REAL_CONST(5252.6712298509919/8.0), REAL_CONST(5264.025286237983/8.0), REAL_CONST(5275.3854683655954/8.0), REAL_CONST(5286.7517696345885/8.0), REAL_CONST(5298.1241834634639/8.0), REAL_CONST(5309.5027032883945/8.0), REAL_CONST(5320.887322563146/8.0), REAL_CONST(5332.2780347589978/8.0), REAL_CONST(5343.6748333646756/8.0), REAL_CONST(5355.0777118862716/8.0), REAL_CONST(5366.4866638471722/8.0), REAL_CONST(5377.901682787985/8.0), REAL_CONST(5389.3227622664635/8.0), REAL_CONST(5400.749895857437/8.0), REAL_CONST(5412.1830771527357/8.0), REAL_CONST(5423.622299761123/8.0), REAL_CONST(5435.067557308219/8.0), REAL_CONST(5446.5188434364318/8.0), REAL_CONST(5457.9761518048872/8.0), REAL_CONST(5469.4394760893592/8.0), REAL_CONST(5480.9088099821975/8.0), REAL_CONST(5492.3841471922606/8.0), REAL_CONST(5503.8654814448455/8.0), REAL_CONST(5515.3528064816201/8.0), REAL_CONST(5526.846116060552/8.0), REAL_CONST(5538.3454039558474/8.0), REAL_CONST(5549.8506639578736/8.0), REAL_CONST(5561.3618898731029/8.0), REAL_CONST(5572.8790755240361/8.0), REAL_CONST(5584.4022147491451/8.0), REAL_CONST(5595.9313014027975/8.0), REAL_CONST(5607.4663293552012/8.0), REAL_CONST(5619.0072924923297/8.0), REAL_CONST(5630.5541847158656/8.0), REAL_CONST(5642.1069999431284/8.0), REAL_CONST(5653.665732107017/8.0), REAL_CONST(5665.230375155943/8.0), REAL_CONST(5676.8009230537655/8.0), REAL_CONST(5688.3773697797333/8.0), REAL_CONST(5699.9597093284156/8.0), REAL_CONST(5711.5479357096474/8.0), REAL_CONST(5723.1420429484588/8.0), REAL_CONST(5734.7420250850209/8.0), REAL_CONST(5746.347876174581/8.0), REAL_CONST(5757.9595902874016/8.0), REAL_CONST(5769.5771615087006/8.0), REAL_CONST(5781.2005839385911/8.0), REAL_CONST(5792.8298516920213/8.0), REAL_CONST(5804.4649588987149/8.0), REAL_CONST(5816.1058997031105/8.0), REAL_CONST(5827.7526682643065/8.0), REAL_CONST(5839.4052587559972/8.0), REAL_CONST(5851.0636653664196/8.0), REAL_CONST(5862.7278822982908/8.0), REAL_CONST(5874.3979037687541/8.0), REAL_CONST(5886.0737240093204/8.0), REAL_CONST(5897.7553372658094/8.0), REAL_CONST(5909.4427377982956/8.0), REAL_CONST(5921.1359198810505/8.0), REAL_CONST(5932.8348778024874/8.0), REAL_CONST(5944.5396058651031/8.0), REAL_CONST(5956.2500983854261/8.0), REAL_CONST(5967.9663496939575/8.0), REAL_CONST(5979.6883541351208/8.0), REAL_CONST(5991.4161060672022/8.0), REAL_CONST(6003.1495998623004/8.0), REAL_CONST(6014.8888299062692/8.0), REAL_CONST(6026.6337905986684/8.0), REAL_CONST(6038.3844763527022/8.0), REAL_CONST(6050.1408815951781/8.0), REAL_CONST(6061.9030007664414/8.0), REAL_CONST(6073.6708283203316/8.0), REAL_CONST(6085.4443587241267/8.0), REAL_CONST(6097.2235864584891/8.0), REAL_CONST(6109.0085060174197/8.0), REAL_CONST(6120.7991119081998/8.0), REAL_CONST(6132.595398651345/8.0), REAL_CONST(6144.3973607805519/8.0), REAL_CONST(6156.2049928426459/8.0), REAL_CONST(6168.0182893975361/8.0), REAL_CONST(6179.8372450181578/8.0), REAL_CONST(6191.6618542904307/8.0), REAL_CONST(6203.4921118132024/8.0), REAL_CONST(6215.3280121982016/8.0), REAL_CONST(6227.1695500699925/8.0), REAL_CONST(6239.0167200659189/8.0), REAL_CONST(6250.8695168360628/8.0), REAL_CONST(6262.7279350431891/8.0), REAL_CONST(6274.5919693627056/8.0), REAL_CONST(6286.4616144826068/8.0), REAL_CONST(6298.3368651034316/8.0), REAL_CONST(6310.2177159382172/8.0), REAL_CONST(6322.1041617124456/8.0), REAL_CONST(6333.9961971640032/8.0), REAL_CONST(6345.8938170431311/8.0), REAL_CONST(6357.7970161123785/8.0), REAL_CONST(6369.7057891465583/8.0), REAL_CONST(6381.6201309327007/8.0), REAL_CONST(6393.5400362700075/8.0), REAL_CONST(6405.4654999698032/8.0), REAL_CONST(6417.3965168554978/8.0), REAL_CONST(6429.3330817625329/8.0), REAL_CONST(6441.2751895383453/8.0), REAL_CONST(6453.2228350423138/8.0), REAL_CONST(6465.176013145724/8.0), REAL_CONST(6477.134718731716/8.0), REAL_CONST(6489.0989466952469/8.0), REAL_CONST(6501.0686919430445/8.0), REAL_CONST(6513.0439493935628/8.0), REAL_CONST(6525.0247139769417/8.0), REAL_CONST(6537.010980634961/8.0), REAL_CONST(6549.002744321001/8.0), REAL_CONST(6560.9999999999973/8.0), REAL_CONST(6573.0027426483985/8.0), REAL_CONST(6585.0109672541284/8.0), REAL_CONST(6597.0246688165371/8.0), REAL_CONST(6609.0438423463656/8.0), REAL_CONST(6621.0684828657004/8.0), REAL_CONST(6633.0985854079354/8.0), REAL_CONST(6645.134145017727/8.0), REAL_CONST(6657.1751567509573/8.0), REAL_CONST(6669.2216156746908/8.0), REAL_CONST(6681.2735168671343/8.0), REAL_CONST(6693.3308554176001/8.0), REAL_CONST(6705.3936264264594/8.0), REAL_CONST(6717.461825005108/8.0), REAL_CONST(6729.535446275926/8.0), REAL_CONST(6741.6144853722335/8.0), REAL_CONST(6753.6989374382601/8.0), REAL_CONST(6765.7887976290967/8.0), REAL_CONST(6777.8840611106634/8.0), REAL_CONST(6789.9847230596661/8.0), REAL_CONST(6802.0907786635626/8.0), REAL_CONST(6814.2022231205201/8.0), REAL_CONST(6826.3190516393797/8.0), REAL_CONST(6838.4412594396181/8.0), REAL_CONST(6850.5688417513074/8.0), REAL_CONST(6862.701793815083/8.0), REAL_CONST(6874.840110882099/8.0), REAL_CONST(6886.9837882139991/8.0), REAL_CONST(6899.1328210828724/8.0), REAL_CONST(6911.2872047712199/8.0), REAL_CONST(6923.4469345719199/8.0), REAL_CONST(6935.6120057881863/8.0), REAL_CONST(6947.7824137335365/8.0), REAL_CONST(6959.9581537317536/8.0), REAL_CONST(6972.1392211168532/8.0), REAL_CONST(6984.3256112330409/8.0), REAL_CONST(6996.5173194346862/8.0), REAL_CONST(7008.7143410862773/8.0), REAL_CONST(7020.9166715623942/8.0), REAL_CONST(7033.1243062476678/8.0), REAL_CONST(7045.3372405367481/8.0), REAL_CONST(7057.5554698342685/8.0), REAL_CONST(7069.7789895548103/8.0), REAL_CONST(7082.0077951228714/8.0), REAL_CONST(7094.2418819728273/8.0), REAL_CONST(7106.4812455489018/8.0), REAL_CONST(7118.7258813051285/8.0), REAL_CONST(7130.9757847053224/8.0), REAL_CONST(7143.2309512230404/8.0), REAL_CONST(7155.4913763415516/8.0), REAL_CONST(7167.7570555538041/8.0), REAL_CONST(7180.0279843623894/8.0), REAL_CONST(7192.3041582795131/8.0), REAL_CONST(7204.5855728269571/8.0), REAL_CONST(7216.8722235360519/8.0), REAL_CONST(7229.1641059476406/8.0), REAL_CONST(7241.4612156120484/8.0), REAL_CONST(7253.7635480890503/8.0), REAL_CONST(7266.0710989478375/8.0), REAL_CONST(7278.3838637669869/8.0), REAL_CONST(7290.7018381344296/8.0), REAL_CONST(7303.0250176474174/8.0), REAL_CONST(7315.3533979124932/8.0), REAL_CONST(7327.6869745454596/8.0), REAL_CONST(7340.0257431713462/8.0), REAL_CONST(7352.3696994243801/8.0), REAL_CONST(7364.7188389479543/8.0), REAL_CONST(7377.0731573945968/8.0), REAL_CONST(7389.4326504259407/8.0), REAL_CONST(7401.7973137126937/8.0), REAL_CONST(7414.1671429346061/8.0), REAL_CONST(7426.5421337804428/8.0), REAL_CONST(7438.922281947951/8.0), REAL_CONST(7451.3075831438346/8.0), REAL_CONST(7463.6980330837177/8.0), REAL_CONST(7476.0936274921214/8.0), REAL_CONST(7488.4943621024304/8.0), REAL_CONST(7500.9002326568652/8.0), REAL_CONST(7513.3112349064522/8.0), REAL_CONST(7525.7273646109943/8.0), REAL_CONST(7538.1486175390446/8.0), REAL_CONST(7550.5749894678729/8.0), REAL_CONST(7563.0064761834419/8.0), REAL_CONST(7575.4430734803736/8.0), REAL_CONST(7587.8847771619248/8.0), REAL_CONST(7600.3315830399597/8.0), REAL_CONST(7612.7834869349153/8.0), REAL_CONST(7625.24048467578/8.0), REAL_CONST(7637.7025721000637/8.0), REAL_CONST(7650.1697450537677/8.0), REAL_CONST(7662.6419993913596/8.0), REAL_CONST(7675.1193309757446/8.0), REAL_CONST(7687.6017356782404/8.0), REAL_CONST(7700.0892093785433/8.0), REAL_CONST(7712.5817479647112/8.0), REAL_CONST(7725.079347333125/8.0), REAL_CONST(7737.5820033884729/8.0), REAL_CONST(7750.0897120437139/8.0), REAL_CONST(7762.6024692200581/8.0), REAL_CONST(7775.1202708469355/8.0), REAL_CONST(7787.6431128619733/8.0), REAL_CONST(7800.1709912109645/8.0), REAL_CONST(7812.7039018478481/8.0), REAL_CONST(7825.2418407346768/8.0), REAL_CONST(7837.7848038415968/8.0), REAL_CONST(7850.3327871468155/8.0), REAL_CONST(7862.8857866365806/8.0), REAL_CONST(7875.4437983051539/8.0), REAL_CONST(7888.006818154784/8.0), REAL_CONST(7900.5748421956796/8.0), REAL_CONST(7913.1478664459901/8.0), REAL_CONST(7925.725886931772/8.0), REAL_CONST(7938.3088996869719/8.0), REAL_CONST(7950.8969007533951/8.0), REAL_CONST(7963.4898861806851/8.0), REAL_CONST(7976.0878520262959/8.0), REAL_CONST(7988.6907943554688/8.0), REAL_CONST(8001.2987092412086/8.0), REAL_CONST(8013.911592764257/8.0), REAL_CONST(8026.5294410130691/8.0), REAL_CONST(8039.1522500837891/8.0), REAL_CONST(8051.7800160802271/8.0), REAL_CONST(8064.412735113835/8.0), REAL_CONST(8077.0504033036796/8.0), REAL_CONST(8089.6930167764222/8.0), REAL_CONST(8102.3405716662946/8.0), REAL_CONST(8114.9930641150731/8.0), REAL_CONST(8127.6504902720571/8.0), REAL_CONST(8140.3128462940449/8.0), REAL_CONST(8152.9801283453098/8.0), REAL_CONST(8165.6523325975786/8.0), REAL_CONST(8178.3294552300049/8.0), REAL_CONST(8191.0114924291529/8.0), REAL_CONST(8203.6984403889655/8.0), REAL_CONST(8216.3902953107463/8.0), REAL_CONST(8229.0870534031419/8.0), REAL_CONST(8241.7887108821069/8.0), REAL_CONST(8254.4952639708936/8.0), REAL_CONST(8267.2067089000211/8.0), REAL_CONST(8279.9230419072574/8.0), REAL_CONST(8292.6442592375952/8.0), REAL_CONST(8305.3703571432306/8.0), REAL_CONST(8318.101331883543/8.0), REAL_CONST(8330.8371797250657/8.0), REAL_CONST(8343.577896941475/8.0), REAL_CONST(8356.3234798135582/8.0), REAL_CONST(8369.0739246291978/8.0), REAL_CONST(8381.8292276833508/8.0), REAL_CONST(8394.5893852780209/8.0), REAL_CONST(8407.3543937222421/8.0), REAL_CONST(8420.1242493320569/8.0), REAL_CONST(8432.8989484304948/8.0), REAL_CONST(8445.6784873475499/8.0), REAL_CONST(8458.4628624201578/8.0), REAL_CONST(8471.2520699921806/8.0), REAL_CONST(8484.0461064143838/8.0), REAL_CONST(8496.8449680444082/8.0), REAL_CONST(8509.6486512467636/8.0), REAL_CONST(8522.4571523927953/8.0), REAL_CONST(8535.270467860666/8.0), REAL_CONST(8548.0885940353437/8.0), REAL_CONST(8560.9115273085663/8.0), REAL_CONST(8573.7392640788403/8.0), REAL_CONST(8586.5718007514006/8.0), REAL_CONST(8599.4091337382069/8.0), REAL_CONST(8612.2512594579148/8.0), REAL_CONST(8625.0981743358552/8.0), REAL_CONST(8637.9498748040205/8.0), REAL_CONST(8650.8063573010386/8.0), REAL_CONST(8663.6676182721567/8.0), REAL_CONST(8676.533654169225/8.0), REAL_CONST(8689.4044614506638/8.0), REAL_CONST(8702.2800365814601/8.0), REAL_CONST(8715.1603760331418/8.0), REAL_CONST(8728.0454762837508/8.0), REAL_CONST(8740.9353338178389/8.0), REAL_CONST(8753.8299451264356/8.0), REAL_CONST(8766.7293067070332/8.0), REAL_CONST(8779.6334150635721/8.0), REAL_CONST(8792.5422667064158/8.0), REAL_CONST(8805.4558581523324/8.0), REAL_CONST(8818.3741859244819/8.0), REAL_CONST(8831.2972465523908/8.0), REAL_CONST(8844.2250365719356/8.0), REAL_CONST(8857.1575525253265/8.0), REAL_CONST(8870.0947909610859/8.0), REAL_CONST(8883.0367484340295/8.0), REAL_CONST(8895.9834215052524/8.0), REAL_CONST(8908.934806742107/8.0), REAL_CONST(8921.8909007181846/8.0), REAL_CONST(8934.8517000132997/8.0), REAL_CONST(8947.817201213471/8.0), REAL_CONST(8960.7874009109/8.0), REAL_CONST(8973.7622957039603/8.0), REAL_CONST(8986.7418821971733/8.0), REAL_CONST(8999.7261570011924/8.0), REAL_CONST(9012.7151167327884/8.0), REAL_CONST(9025.7087580148236/8.0), REAL_CONST(9038.7070774762469/8.0), REAL_CONST(9051.7100717520643/8.0), REAL_CONST(9064.7177374833282/8.0), REAL_CONST(9077.7300713171153/8.0), REAL_CONST(9090.7470699065179/8.0), REAL_CONST(9103.7687299106146/8.0), REAL_CONST(9116.7950479944648/8.0), REAL_CONST(9129.8260208290812/8.0), REAL_CONST(9142.8616450914233/8.0), REAL_CONST(9155.9019174643727/8.0), REAL_CONST(9168.9468346367157/8.0), REAL_CONST(9181.9963933031358/8.0), REAL_CONST(9195.0505901641845/8.0), REAL_CONST(9208.1094219262741/8.0), REAL_CONST(9221.1728853016557/8.0), REAL_CONST(9234.240977008405/8.0), REAL_CONST(9247.3136937704076/8.0), REAL_CONST(9260.3910323173386/8.0), REAL_CONST(9273.472989384647/8.0), REAL_CONST(9286.5595617135423/8.0), REAL_CONST(9299.6507460509747/8.0), REAL_CONST(9312.7465391496207/8.0), REAL_CONST(9325.8469377678684/8.0), REAL_CONST(9338.9519386698012/8.0), REAL_CONST(9352.0615386251757/8.0), REAL_CONST(9365.1757344094131/8.0), REAL_CONST(9378.2945228035842/8.0), REAL_CONST(9391.4179005943843/8.0), REAL_CONST(9404.5458645741273/8.0), REAL_CONST(9417.6784115407263/8.0), REAL_CONST(9430.8155382976747/8.0), REAL_CONST(9443.9572416540359/8.0), REAL_CONST(9457.1035184244265/8.0), REAL_CONST(9470.2543654290002/8.0), REAL_CONST(9483.4097794934296/8.0), REAL_CONST(9496.5697574488931/8.0), REAL_CONST(9509.7342961320664/8.0), REAL_CONST(9522.9033923850911/8.0), REAL_CONST(9536.0770430555804/8.0), REAL_CONST(9549.2552449965824/8.0), REAL_CONST(9562.4379950665825/8.0), REAL_CONST(9575.6252901294793/8.0), REAL_CONST(9588.8171270545736/8.0), REAL_CONST(9602.0135027165488/8.0), REAL_CONST(9615.2144139954635/8.0), REAL_CONST(9628.4198577767274/8.0), REAL_CONST(9641.629830951093/8.0), REAL_CONST(9654.844330414644/8.0), REAL_CONST(9668.0633530687719/8.0), REAL_CONST(9681.286895820167/8.0), REAL_CONST(9694.5149555808002/8.0), REAL_CONST(9707.7475292679192/8.0), REAL_CONST(9720.9846138040157/8.0), REAL_CONST(9734.2262061168276/8.0), REAL_CONST(9747.4723031393187/8.0), REAL_CONST(9760.7229018096641/8.0), REAL_CONST(9773.9779990712323/8.0), REAL_CONST(9787.2375918725811/8.0), REAL_CONST(9800.5016771674327/8.0), REAL_CONST(9813.7702519146696/8.0), REAL_CONST(9827.0433130783094/8.0), REAL_CONST(9840.3208576275028/8.0), REAL_CONST(9853.602882536512/8.0), REAL_CONST(9866.8893847846994/8.0), REAL_CONST(9880.1803613565116/8.0), REAL_CONST(9893.4758092414686/8.0), REAL_CONST(9906.7757254341523/8.0), REAL_CONST(9920.0801069341851/8.0), REAL_CONST(9933.3889507462245/8.0), REAL_CONST(9946.7022538799429/8.0), REAL_CONST(9960.0200133500221/8.0), REAL_CONST(9973.3422261761298/8.0), REAL_CONST(9986.6688893829159/8.0), REAL_CONST(9999.9999999999945/8.0), REAL_CONST(10013.335555061929/8.0), REAL_CONST(10026.675551608221/8.0), REAL_CONST(10040.019986683301/8.0), REAL_CONST(10053.368857336509/8.0), REAL_CONST(10066.722160622081/8.0), REAL_CONST(10080.079893599144/8.0), REAL_CONST(10093.442053331697/8.0), REAL_CONST(10106.808636888598/8.0), REAL_CONST(10120.179641343551/8.0), REAL_CONST(10133.555063775095/8.0), REAL_CONST(10146.934901266595/8.0), REAL_CONST(10160.31915090622/8.0), REAL_CONST(10173.707809786936/8.0), REAL_CONST(10187.100875006496/8.0), REAL_CONST(10200.498343667417/8.0), REAL_CONST(10213.900212876984/8.0), REAL_CONST(10227.306479747222/8.0), REAL_CONST(10240.717141394889/8.0), REAL_CONST(10254.132194941467/8.0), REAL_CONST(10267.551637513146/8.0), REAL_CONST(10280.975466240814/8.0), REAL_CONST(10294.40367826004/8.0), REAL_CONST(10307.836270711066/8.0), REAL_CONST(10321.273240738796/8.0), REAL_CONST(10334.71458549278/8.0) #ifdef BIG_IQ_TABLE ,REAL_CONST(10348.160302127204/8.0), REAL_CONST(10361.610387800878/8.0), REAL_CONST(10375.064839677221/8.0), REAL_CONST(10388.523654924258/8.0), REAL_CONST(10401.986830714593/8.0), REAL_CONST(10415.454364225412/8.0), REAL_CONST(10428.926252638465/8.0), REAL_CONST(10442.402493140049/8.0), REAL_CONST(10455.883082921007/8.0), REAL_CONST(10469.368019176709/8.0), REAL_CONST(10482.85729910704/8.0), REAL_CONST(10496.350919916393/8.0), REAL_CONST(10509.848878813653/8.0), REAL_CONST(10523.351173012188/8.0), REAL_CONST(10536.857799729838/8.0), REAL_CONST(10550.3687561889/8.0), REAL_CONST(10563.884039616123/8.0), REAL_CONST(10577.403647242685/8.0), REAL_CONST(10590.927576304197/8.0), REAL_CONST(10604.455824040679/8.0), REAL_CONST(10617.988387696556/8.0), REAL_CONST(10631.525264520642/8.0), REAL_CONST(10645.066451766135/8.0), REAL_CONST(10658.611946690598/8.0), REAL_CONST(10672.161746555956/8.0), REAL_CONST(10685.715848628475/8.0), REAL_CONST(10699.274250178762/8.0), REAL_CONST(10712.836948481747/8.0), REAL_CONST(10726.403940816675/8.0), REAL_CONST(10739.975224467091/8.0), REAL_CONST(10753.550796720834/8.0), REAL_CONST(10767.130654870027/8.0), REAL_CONST(10780.714796211059/8.0), REAL_CONST(10794.303218044579/8.0), REAL_CONST(10807.895917675487/8.0), REAL_CONST(10821.492892412922/8.0), REAL_CONST(10835.094139570248/8.0), REAL_CONST(10848.699656465047/8.0), REAL_CONST(10862.309440419107/8.0), REAL_CONST(10875.923488758415/8.0), REAL_CONST(10889.541798813138/8.0), REAL_CONST(10903.16436791762/8.0), REAL_CONST(10916.791193410372/8.0), REAL_CONST(10930.422272634056/8.0), REAL_CONST(10944.05760293548/8.0), REAL_CONST(10957.697181665582/8.0), REAL_CONST(10971.341006179427/8.0), REAL_CONST(10984.98907383619/8.0), REAL_CONST(10998.641381999149/8.0), REAL_CONST(11012.297928035676/8.0), REAL_CONST(11025.958709317223/8.0), REAL_CONST(11039.623723219316/8.0), REAL_CONST(11053.292967121541/8.0), REAL_CONST(11066.966438407539/8.0), REAL_CONST(11080.64413446499/8.0), REAL_CONST(11094.326052685608/8.0), REAL_CONST(11108.012190465128/8.0), REAL_CONST(11121.702545203296/8.0), REAL_CONST(11135.397114303863/8.0), REAL_CONST(11149.095895174571/8.0), REAL_CONST(11162.798885227143/8.0), REAL_CONST(11176.506081877278/8.0), REAL_CONST(11190.217482544635/8.0), REAL_CONST(11203.933084652828/8.0), REAL_CONST(11217.652885629415/8.0), REAL_CONST(11231.376882905886/8.0), REAL_CONST(11245.105073917659/8.0), REAL_CONST(11258.837456104062/8.0), REAL_CONST(11272.574026908333/8.0), REAL_CONST(11286.314783777601/8.0), REAL_CONST(11300.059724162888/8.0), REAL_CONST(11313.808845519083/8.0), REAL_CONST(11327.562145304952/8.0), REAL_CONST(11341.319620983111/8.0), REAL_CONST(11355.081270020033/8.0), REAL_CONST(11368.847089886023/8.0), REAL_CONST(11382.617078055218/8.0), REAL_CONST(11396.391232005579/8.0), REAL_CONST(11410.169549218874/8.0), REAL_CONST(11423.952027180676/8.0), REAL_CONST(11437.738663380349/8.0), REAL_CONST(11451.529455311042/8.0), REAL_CONST(11465.324400469679/8.0), REAL_CONST(11479.123496356951/8.0), REAL_CONST(11492.926740477304/8.0), REAL_CONST(11506.734130338931/8.0), REAL_CONST(11520.545663453764/8.0), REAL_CONST(11534.361337337466/8.0), REAL_CONST(11548.181149509423/8.0), REAL_CONST(11562.005097492724/8.0), REAL_CONST(11575.83317881417/8.0), REAL_CONST(11589.665391004253/8.0), REAL_CONST(11603.501731597149/8.0), REAL_CONST(11617.342198130715/8.0), REAL_CONST(11631.186788146468/8.0), REAL_CONST(11645.035499189589/8.0), REAL_CONST(11658.888328808911/8.0), REAL_CONST(11672.745274556904/8.0), REAL_CONST(11686.606333989675/8.0), REAL_CONST(11700.471504666955/8.0), REAL_CONST(11714.340784152086/8.0), REAL_CONST(11728.214170012021/8.0), REAL_CONST(11742.091659817312/8.0), REAL_CONST(11755.973251142101/8.0), REAL_CONST(11769.858941564111/8.0), REAL_CONST(11783.748728664636/8.0), REAL_CONST(11797.642610028539/8.0), REAL_CONST(11811.540583244237/8.0), REAL_CONST(11825.442645903697/8.0), REAL_CONST(11839.34879560242/8.0), REAL_CONST(11853.259029939445/8.0), REAL_CONST(11867.173346517333/8.0), REAL_CONST(11881.091742942155/8.0), REAL_CONST(11895.014216823492/8.0), REAL_CONST(11908.940765774427/8.0), REAL_CONST(11922.871387411526/8.0), REAL_CONST(11936.806079354839/8.0), REAL_CONST(11950.744839227897/8.0), REAL_CONST(11964.687664657684/8.0), REAL_CONST(11978.634553274653/8.0), REAL_CONST(11992.585502712702/8.0), REAL_CONST(12006.540510609168/8.0), REAL_CONST(12020.499574604828/8.0), REAL_CONST(12034.462692343877/8.0), REAL_CONST(12048.429861473938/8.0), REAL_CONST(12062.401079646032/8.0), REAL_CONST(12076.376344514589/8.0), REAL_CONST(12090.355653737433/8.0), REAL_CONST(12104.339004975769/8.0), REAL_CONST(12118.326395894188/8.0), REAL_CONST(12132.317824160644/8.0), REAL_CONST(12146.313287446457/8.0), REAL_CONST(12160.312783426305/8.0), REAL_CONST(12174.316309778205/8.0), REAL_CONST(12188.323864183525/8.0), REAL_CONST(12202.335444326955/8.0), REAL_CONST(12216.351047896511/8.0), REAL_CONST(12230.370672583531/8.0), REAL_CONST(12244.394316082657/8.0), REAL_CONST(12258.421976091831/8.0), REAL_CONST(12272.453650312296/8.0), REAL_CONST(12286.489336448574/8.0), REAL_CONST(12300.529032208471/8.0), REAL_CONST(12314.572735303058/8.0), REAL_CONST(12328.620443446678/8.0), REAL_CONST(12342.672154356922/8.0), REAL_CONST(12356.727865754638/8.0), REAL_CONST(12370.787575363909/8.0), REAL_CONST(12384.851280912055/8.0), REAL_CONST(12398.918980129623/8.0), REAL_CONST(12412.990670750381/8.0), REAL_CONST(12427.066350511306/8.0), REAL_CONST(12441.146017152583/8.0), REAL_CONST(12455.229668417589/8.0), REAL_CONST(12469.317302052901/8.0), REAL_CONST(12483.40891580827/8.0), REAL_CONST(12497.50450743663/8.0), REAL_CONST(12511.604074694078/8.0), REAL_CONST(12525.707615339878/8.0), REAL_CONST(12539.815127136444/8.0), REAL_CONST(12553.926607849342/8.0), REAL_CONST(12568.042055247275/8.0), REAL_CONST(12582.161467102082/8.0), REAL_CONST(12596.284841188726/8.0), REAL_CONST(12610.41217528529/8.0), REAL_CONST(12624.543467172971/8.0), REAL_CONST(12638.678714636069/8.0), REAL_CONST(12652.817915461985/8.0), REAL_CONST(12666.961067441209/8.0), REAL_CONST(12681.108168367316/8.0), REAL_CONST(12695.259216036962/8.0), REAL_CONST(12709.414208249869/8.0), REAL_CONST(12723.573142808827/8.0), REAL_CONST(12737.736017519681/8.0), REAL_CONST(12751.902830191326/8.0), REAL_CONST(12766.073578635704/8.0), REAL_CONST(12780.248260667788/8.0), REAL_CONST(12794.426874105588/8.0), REAL_CONST(12808.609416770132/8.0), REAL_CONST(12822.795886485468/8.0), REAL_CONST(12836.986281078653/8.0), REAL_CONST(12851.180598379744/8.0), REAL_CONST(12865.378836221802/8.0), REAL_CONST(12879.580992440871/8.0), REAL_CONST(12893.787064875984/8.0), REAL_CONST(12907.997051369144/8.0), REAL_CONST(12922.210949765335/8.0), REAL_CONST(12936.428757912496/8.0), REAL_CONST(12950.650473661524/8.0), REAL_CONST(12964.876094866273/8.0), REAL_CONST(12979.105619383534/8.0), REAL_CONST(12993.339045073039/8.0), REAL_CONST(13007.576369797454/8.0), REAL_CONST(13021.817591422368/8.0), REAL_CONST(13036.062707816285/8.0), REAL_CONST(13050.311716850629/8.0), REAL_CONST(13064.564616399723/8.0), REAL_CONST(13078.821404340792/8.0), REAL_CONST(13093.082078553954/8.0), REAL_CONST(13107.346636922217/8.0), REAL_CONST(13121.615077331464/8.0), REAL_CONST(13135.887397670458/8.0), REAL_CONST(13150.163595830827/8.0), REAL_CONST(13164.44366970706/8.0), REAL_CONST(13178.727617196502/8.0), REAL_CONST(13193.015436199352/8.0), REAL_CONST(13207.307124618648/8.0), REAL_CONST(13221.602680360265/8.0), REAL_CONST(13235.902101332911/8.0), REAL_CONST(13250.205385448118/8.0), REAL_CONST(13264.512530620239/8.0), REAL_CONST(13278.823534766434/8.0), REAL_CONST(13293.138395806676/8.0), REAL_CONST(13307.457111663734/8.0), REAL_CONST(13321.779680263176/8.0), REAL_CONST(13336.106099533356/8.0), REAL_CONST(13350.436367405409/8.0), REAL_CONST(13364.77048181325/8.0), REAL_CONST(13379.108440693562/8.0), REAL_CONST(13393.450241985796/8.0), REAL_CONST(13407.795883632158/8.0), REAL_CONST(13422.145363577607/8.0), REAL_CONST(13436.498679769853/8.0), REAL_CONST(13450.855830159346/8.0), REAL_CONST(13465.216812699266/8.0), REAL_CONST(13479.581625345529/8.0), REAL_CONST(13493.950266056772/8.0), REAL_CONST(13508.32273279435/8.0), REAL_CONST(13522.699023522329/8.0), REAL_CONST(13537.079136207483/8.0), REAL_CONST(13551.463068819286/8.0), REAL_CONST(13565.850819329906/8.0), REAL_CONST(13580.2423857142/8.0), REAL_CONST(13594.63776594971/8.0), REAL_CONST(13609.036958016657/8.0), REAL_CONST(13623.439959897927/8.0), REAL_CONST(13637.846769579081/8.0), REAL_CONST(13652.257385048335/8.0), REAL_CONST(13666.67180429656/8.0), REAL_CONST(13681.090025317284/8.0), REAL_CONST(13695.512046106669/8.0), REAL_CONST(13709.937864663521/8.0), REAL_CONST(13724.367478989278/8.0), REAL_CONST(13738.800887088004/8.0), REAL_CONST(13753.238086966385/8.0), REAL_CONST(13767.679076633727/8.0), REAL_CONST(13782.123854101939/8.0), REAL_CONST(13796.572417385545/8.0), REAL_CONST(13811.024764501659/8.0), REAL_CONST(13825.480893469998/8.0), REAL_CONST(13839.94080231286/8.0), REAL_CONST(13854.404489055134/8.0), REAL_CONST(13868.871951724283/8.0), REAL_CONST(13883.34318835034/8.0), REAL_CONST(13897.818196965914/8.0), REAL_CONST(13912.296975606168/8.0), REAL_CONST(13926.779522308825/8.0), REAL_CONST(13941.26583511416/8.0), REAL_CONST(13955.755912064991/8.0), REAL_CONST(13970.249751206682/8.0), REAL_CONST(13984.747350587126/8.0), REAL_CONST(13999.248708256751/8.0), REAL_CONST(14013.753822268511/8.0), REAL_CONST(14028.262690677873/8.0), REAL_CONST(14042.775311542828/8.0), REAL_CONST(14057.291682923867/8.0), REAL_CONST(14071.811802883994/8.0), REAL_CONST(14086.335669488704/8.0), REAL_CONST(14100.863280805994/8.0), REAL_CONST(14115.394634906341/8.0), REAL_CONST(14129.92972986271/8.0), REAL_CONST(14144.468563750548/8.0), REAL_CONST(14159.01113464777/8.0), REAL_CONST(14173.55744063476/8.0), REAL_CONST(14188.107479794369/8.0), REAL_CONST(14202.661250211901/8.0), REAL_CONST(14217.218749975118/8.0), REAL_CONST(14231.779977174227/8.0), REAL_CONST(14246.344929901879/8.0), REAL_CONST(14260.913606253163/8.0), REAL_CONST(14275.486004325601/8.0), REAL_CONST(14290.062122219146/8.0), REAL_CONST(14304.641958036171/8.0), REAL_CONST(14319.225509881464/8.0), REAL_CONST(14333.812775862236/8.0), REAL_CONST(14348.403754088098/8.0), REAL_CONST(14362.998442671067/8.0), REAL_CONST(14377.59683972556/8.0), REAL_CONST(14392.198943368388/8.0), REAL_CONST(14406.804751718748/8.0), REAL_CONST(14421.414262898223/8.0), REAL_CONST(14436.027475030774/8.0), REAL_CONST(14450.64438624274/8.0), REAL_CONST(14465.264994662828/8.0), REAL_CONST(14479.889298422106/8.0), REAL_CONST(14494.517295654005/8.0), REAL_CONST(14509.148984494313/8.0), REAL_CONST(14523.784363081166/8.0), REAL_CONST(14538.423429555049/8.0), REAL_CONST(14553.066182058781/8.0), REAL_CONST(14567.712618737527/8.0), REAL_CONST(14582.362737738777/8.0), REAL_CONST(14597.016537212348/8.0), REAL_CONST(14611.674015310382/8.0), REAL_CONST(14626.33517018734/8.0), REAL_CONST(14640.999999999993/8.0), REAL_CONST(14655.668502907418/8.0), REAL_CONST(14670.340677071003/8.0), REAL_CONST(14685.016520654426/8.0), REAL_CONST(14699.696031823671/8.0), REAL_CONST(14714.379208746999/8.0), REAL_CONST(14729.066049594967/8.0), REAL_CONST(14743.756552540408/8.0), REAL_CONST(14758.45071575843/8.0), REAL_CONST(14773.148537426418/8.0), REAL_CONST(14787.850015724018/8.0), REAL_CONST(14802.555148833142/8.0), REAL_CONST(14817.263934937961/8.0), REAL_CONST(14831.976372224897/8.0), REAL_CONST(14846.692458882624/8.0), REAL_CONST(14861.41219310206/8.0), REAL_CONST(14876.135573076363/8.0), REAL_CONST(14890.862597000923/8.0), REAL_CONST(14905.593263073371/8.0), REAL_CONST(14920.327569493558/8.0), REAL_CONST(14935.065514463557/8.0), REAL_CONST(14949.807096187662/8.0), REAL_CONST(14964.552312872382/8.0), REAL_CONST(14979.301162726431/8.0), REAL_CONST(14994.053643960735/8.0), REAL_CONST(15008.809754788414/8.0), REAL_CONST(15023.569493424788/8.0), REAL_CONST(15038.332858087369/8.0), REAL_CONST(15053.099846995858/8.0), REAL_CONST(15067.870458372134/8.0), REAL_CONST(15082.644690440264/8.0), REAL_CONST(15097.422541426484/8.0), REAL_CONST(15112.204009559202/8.0), REAL_CONST(15126.989093068994/8.0), REAL_CONST(15141.777790188597/8.0), REAL_CONST(15156.570099152905/8.0), REAL_CONST(15171.366018198967/8.0), REAL_CONST(15186.165545565986/8.0), REAL_CONST(15200.968679495301/8.0), REAL_CONST(15215.775418230402/8.0), REAL_CONST(15230.585760016909/8.0), REAL_CONST(15245.399703102579/8.0), REAL_CONST(15260.217245737298/8.0), REAL_CONST(15275.038386173073/8.0), REAL_CONST(15289.863122664035/8.0), REAL_CONST(15304.691453466432/8.0), REAL_CONST(15319.523376838621/8.0), REAL_CONST(15334.358891041069/8.0), REAL_CONST(15349.197994336346/8.0), REAL_CONST(15364.040684989128/8.0), REAL_CONST(15378.886961266177/8.0), REAL_CONST(15393.736821436356/8.0), REAL_CONST(15408.590263770609/8.0), REAL_CONST(15423.447286541972/8.0), REAL_CONST(15438.307888025554/8.0), REAL_CONST(15453.172066498542/8.0), REAL_CONST(15468.039820240196/8.0), REAL_CONST(15482.91114753184/8.0), REAL_CONST(15497.786046656869/8.0), REAL_CONST(15512.664515900733/8.0), REAL_CONST(15527.546553550939/8.0), REAL_CONST(15542.432157897045/8.0), REAL_CONST(15557.32132723066/8.0), REAL_CONST(15572.214059845435/8.0), REAL_CONST(15587.110354037064/8.0), REAL_CONST(15602.010208103273/8.0), REAL_CONST(15616.913620343823/8.0), REAL_CONST(15631.820589060506/8.0), REAL_CONST(15646.731112557136/8.0), REAL_CONST(15661.645189139546/8.0), REAL_CONST(15676.562817115593/8.0), REAL_CONST(15691.483994795139/8.0), REAL_CONST(15706.408720490062/8.0), REAL_CONST(15721.336992514242/8.0), REAL_CONST(15736.268809183561/8.0), REAL_CONST(15751.204168815901/8.0), REAL_CONST(15766.143069731135/8.0), REAL_CONST(15781.085510251132/8.0), REAL_CONST(15796.03148869974/8.0), REAL_CONST(15810.981003402798/8.0), REAL_CONST(15825.934052688119/8.0), REAL_CONST(15840.890634885489/8.0), REAL_CONST(15855.850748326673/8.0), REAL_CONST(15870.814391345401/8.0), REAL_CONST(15885.781562277361/8.0), REAL_CONST(15900.752259460214/8.0), REAL_CONST(15915.726481233565/8.0), REAL_CONST(15930.704225938984/8.0), REAL_CONST(15945.685491919978/8.0), REAL_CONST(15960.670277522009/8.0), REAL_CONST(15975.658581092481/8.0), REAL_CONST(15990.65040098073/8.0), REAL_CONST(16005.645735538035/8.0), REAL_CONST(16020.644583117599/8.0), REAL_CONST(16035.646942074556/8.0), REAL_CONST(16050.652810765967/8.0), REAL_CONST(16065.662187550806/8.0), REAL_CONST(16080.675070789974/8.0), REAL_CONST(16095.691458846273/8.0), REAL_CONST(16110.711350084424/8.0), REAL_CONST(16125.734742871053/8.0), REAL_CONST(16140.761635574685/8.0), REAL_CONST(16155.792026565747/8.0), REAL_CONST(16170.825914216561/8.0), REAL_CONST(16185.863296901338/8.0), REAL_CONST(16200.904172996183/8.0), REAL_CONST(16215.948540879079/8.0), REAL_CONST(16230.996398929899/8.0), REAL_CONST(16246.047745530386/8.0), REAL_CONST(16261.102579064163/8.0), REAL_CONST(16276.160897916721/8.0), REAL_CONST(16291.22270047542/8.0), REAL_CONST(16306.287985129484/8.0), REAL_CONST(16321.356750269995/8.0), REAL_CONST(16336.428994289896/8.0), REAL_CONST(16351.504715583982/8.0), REAL_CONST(16366.5839125489/8.0), REAL_CONST(16381.666583583141/8.0), REAL_CONST(16396.752727087041/8.0), REAL_CONST(16411.842341462776/8.0), REAL_CONST(16426.935425114363/8.0), REAL_CONST(16442.031976447644/8.0), REAL_CONST(16457.131993870298/8.0), REAL_CONST(16472.235475791829/8.0), REAL_CONST(16487.342420623561/8.0), REAL_CONST(16502.452826778641/8.0), REAL_CONST(16517.566692672033/8.0), REAL_CONST(16532.684016720516/8.0), REAL_CONST(16547.804797342676/8.0), REAL_CONST(16562.929032958902/8.0), REAL_CONST(16578.056721991394/8.0), REAL_CONST(16593.18786286415/8.0), REAL_CONST(16608.322454002962/8.0), REAL_CONST(16623.460493835417/8.0), REAL_CONST(16638.601980790896/8.0), REAL_CONST(16653.746913300558/8.0), REAL_CONST(16668.895289797354/8.0), REAL_CONST(16684.047108716015/8.0), REAL_CONST(16699.202368493046/8.0), REAL_CONST(16714.361067566726/8.0), REAL_CONST(16729.523204377107/8.0), REAL_CONST(16744.688777366009/8.0), REAL_CONST(16759.857784977012/8.0), REAL_CONST(16775.030225655464/8.0), REAL_CONST(16790.206097848466/8.0), REAL_CONST(16805.385400004874/8.0), REAL_CONST(16820.568130575302/8.0), REAL_CONST(16835.754288012104/8.0), REAL_CONST(16850.943870769381/8.0), REAL_CONST(16866.136877302983/8.0), REAL_CONST(16881.333306070494/8.0), REAL_CONST(16896.53315553123/8.0), REAL_CONST(16911.736424146249/8.0), REAL_CONST(16926.943110378332/8.0), REAL_CONST(16942.153212691992/8.0), REAL_CONST(16957.366729553454/8.0), REAL_CONST(16972.583659430682/8.0), REAL_CONST(16987.804000793338/8.0), REAL_CONST(17003.027752112816/8.0), REAL_CONST(17018.254911862205/8.0), REAL_CONST(17033.485478516312/8.0), REAL_CONST(17048.719450551645/8.0), REAL_CONST(17063.956826446421/8.0), REAL_CONST(17079.197604680547/8.0), REAL_CONST(17094.44178373563/8.0), REAL_CONST(17109.689362094967/8.0), REAL_CONST(17124.940338243552/8.0), REAL_CONST(17140.194710668064/8.0), REAL_CONST(17155.452477856852/8.0), REAL_CONST(17170.713638299967/8.0), REAL_CONST(17185.978190489128/8.0), REAL_CONST(17201.246132917724/8.0), REAL_CONST(17216.517464080825/8.0), REAL_CONST(17231.792182475165/8.0), REAL_CONST(17247.070286599141/8.0), REAL_CONST(17262.351774952826/8.0), REAL_CONST(17277.636646037936/8.0), REAL_CONST(17292.924898357855/8.0), REAL_CONST(17308.216530417623/8.0), REAL_CONST(17323.511540723921/8.0), REAL_CONST(17338.809927785089/8.0), REAL_CONST(17354.111690111105/8.0), REAL_CONST(17369.416826213594/8.0), REAL_CONST(17384.725334605821/8.0), REAL_CONST(17400.037213802683/8.0), REAL_CONST(17415.352462320716/8.0), REAL_CONST(17430.67107867809/8.0), REAL_CONST(17445.993061394587/8.0), REAL_CONST(17461.318408991636/8.0), REAL_CONST(17476.647119992274/8.0), REAL_CONST(17491.979192921168/8.0), REAL_CONST(17507.314626304586/8.0), REAL_CONST(17522.653418670423/8.0), REAL_CONST(17537.995568548187/8.0), REAL_CONST(17553.341074468986/8.0), REAL_CONST(17568.689934965536/8.0), REAL_CONST(17584.042148572156/8.0), REAL_CONST(17599.397713824768/8.0), REAL_CONST(17614.75662926089/8.0), REAL_CONST(17630.118893419625/8.0), REAL_CONST(17645.484504841683/8.0), REAL_CONST(17660.853462069354/8.0), REAL_CONST(17676.225763646511/8.0), REAL_CONST(17691.601408118619/8.0), REAL_CONST(17706.980394032718/8.0), REAL_CONST(17722.362719937424/8.0), REAL_CONST(17737.748384382936/8.0), REAL_CONST(17753.137385921014/8.0), REAL_CONST(17768.529723104999/8.0), REAL_CONST(17783.92539448979/8.0), REAL_CONST(17799.324398631856/8.0), REAL_CONST(17814.726734089225/8.0), REAL_CONST(17830.13239942148/8.0), REAL_CONST(17845.541393189767/8.0), REAL_CONST(17860.95371395678/8.0), REAL_CONST(17876.369360286772/8.0), REAL_CONST(17891.788330745527/8.0), REAL_CONST(17907.210623900395/8.0), REAL_CONST(17922.636238320254/8.0), REAL_CONST(17938.065172575527/8.0), REAL_CONST(17953.497425238176/8.0), REAL_CONST(17968.932994881692/8.0), REAL_CONST(17984.371880081104/8.0), REAL_CONST(17999.814079412972/8.0), REAL_CONST(18015.259591455371/8.0), REAL_CONST(18030.708414787914/8.0), REAL_CONST(18046.160547991731/8.0), REAL_CONST(18061.615989649465/8.0), REAL_CONST(18077.074738345284/8.0), REAL_CONST(18092.536792664861/8.0), REAL_CONST(18108.002151195393/8.0), REAL_CONST(18123.470812525571/8.0), REAL_CONST(18138.942775245599/8.0), REAL_CONST(18154.418037947191/8.0), REAL_CONST(18169.896599223546/8.0), REAL_CONST(18185.37845766938/8.0), REAL_CONST(18200.863611880886/8.0), REAL_CONST(18216.352060455767/8.0), REAL_CONST(18231.843801993204/8.0), REAL_CONST(18247.338835093873/8.0), REAL_CONST(18262.837158359936/8.0), REAL_CONST(18278.338770395032/8.0), REAL_CONST(18293.84366980429/8.0), REAL_CONST(18309.351855194309/8.0), REAL_CONST(18324.863325173166/8.0), REAL_CONST(18340.378078350412/8.0), REAL_CONST(18355.896113337069/8.0), REAL_CONST(18371.417428745623/8.0), REAL_CONST(18386.942023190033/8.0), REAL_CONST(18402.469895285718/8.0), REAL_CONST(18418.00104364955/8.0), REAL_CONST(18433.53546689987/8.0), REAL_CONST(18449.073163656474/8.0), REAL_CONST(18464.614132540602/8.0), REAL_CONST(18480.158372174956/8.0), REAL_CONST(18495.705881183676/8.0), REAL_CONST(18511.256658192357/8.0), REAL_CONST(18526.810701828035/8.0), REAL_CONST(18542.368010719183/8.0), REAL_CONST(18557.928583495715/8.0), REAL_CONST(18573.492418788985/8.0), REAL_CONST(18589.059515231773/8.0), REAL_CONST(18604.629871458303/8.0), REAL_CONST(18620.203486104212/8.0), REAL_CONST(18635.78035780658/8.0), REAL_CONST(18651.360485203899/8.0), REAL_CONST(18666.943866936086/8.0), REAL_CONST(18682.53050164448/8.0), REAL_CONST(18698.120387971841/8.0), REAL_CONST(18713.713524562332/8.0), REAL_CONST(18729.30991006154/8.0), REAL_CONST(18744.909543116457/8.0), REAL_CONST(18760.512422375479/8.0), REAL_CONST(18776.118546488418/8.0), REAL_CONST(18791.727914106479/8.0), REAL_CONST(18807.340523882274/8.0), REAL_CONST(18822.95637446981/8.0), REAL_CONST(18838.575464524489/8.0), REAL_CONST(18854.197792703111/8.0), REAL_CONST(18869.823357663863/8.0), REAL_CONST(18885.452158066328/8.0), REAL_CONST(18901.08419257147/8.0), REAL_CONST(18916.719459841639/8.0), REAL_CONST(18932.357958540564/8.0), REAL_CONST(18947.999687333362/8.0), REAL_CONST(18963.644644886521/8.0), REAL_CONST(18979.292829867907/8.0), REAL_CONST(18994.944240946759/8.0), REAL_CONST(19010.598876793687/8.0), REAL_CONST(19026.256736080668/8.0), REAL_CONST(19041.917817481048/8.0), REAL_CONST(19057.582119669532/8.0), REAL_CONST(19073.2496413222/8.0), REAL_CONST(19088.920381116473/8.0), REAL_CONST(19104.594337731145/8.0), REAL_CONST(19120.271509846356/8.0), REAL_CONST(19135.951896143604/8.0), REAL_CONST(19151.635495305738/8.0), REAL_CONST(19167.322306016948/8.0), REAL_CONST(19183.012326962784/8.0), REAL_CONST(19198.705556830122/8.0), REAL_CONST(19214.401994307198/8.0), REAL_CONST(19230.101638083579/8.0), REAL_CONST(19245.804486850167/8.0), REAL_CONST(19261.510539299208/8.0), REAL_CONST(19277.219794124274/8.0), REAL_CONST(19292.932250020265/8.0), REAL_CONST(19308.647905683421/8.0), REAL_CONST(19324.366759811302/8.0), REAL_CONST(19340.088811102793/8.0), REAL_CONST(19355.8140582581/8.0), REAL_CONST(19371.542499978754/8.0), REAL_CONST(19387.2741349676/8.0), REAL_CONST(19403.008961928797/8.0), REAL_CONST(19418.746979567823/8.0), REAL_CONST(19434.488186591469/8.0), REAL_CONST(19450.232581707827/8.0), REAL_CONST(19465.980163626304/8.0), REAL_CONST(19481.730931057613/8.0), REAL_CONST(19497.484882713761/8.0), REAL_CONST(19513.242017308068/8.0), REAL_CONST(19529.002333555141/8.0), REAL_CONST(19544.765830170898/8.0), REAL_CONST(19560.532505872539/8.0), REAL_CONST(19576.302359378566/8.0), REAL_CONST(19592.075389408761/8.0), REAL_CONST(19607.851594684209/8.0), REAL_CONST(19623.630973927269/8.0), REAL_CONST(19639.41352586159/8.0), REAL_CONST(19655.199249212103/8.0), REAL_CONST(19670.988142705017/8.0), REAL_CONST(19686.780205067826/8.0), REAL_CONST(19702.575435029288/8.0), REAL_CONST(19718.373831319448/8.0), REAL_CONST(19734.175392669615/8.0), REAL_CONST(19749.980117812371/8.0), REAL_CONST(19765.788005481569/8.0), REAL_CONST(19781.599054412323/8.0), REAL_CONST(19797.413263341008/8.0), REAL_CONST(19813.230631005274/8.0), REAL_CONST(19829.051156144014/8.0), REAL_CONST(19844.874837497395/8.0), REAL_CONST(19860.701673806827/8.0), REAL_CONST(19876.531663814985/8.0), REAL_CONST(19892.364806265789/8.0), REAL_CONST(19908.201099904403/8.0), REAL_CONST(19924.040543477258/8.0), REAL_CONST(19939.883135732012/8.0), REAL_CONST(19955.728875417579/8.0), REAL_CONST(19971.577761284105/8.0), REAL_CONST(19987.429792082985/8.0), REAL_CONST(20003.284966566847/8.0), REAL_CONST(20019.14328348956/8.0), REAL_CONST(20035.004741606219/8.0), REAL_CONST(20050.869339673161/8.0), REAL_CONST(20066.737076447946/8.0), REAL_CONST(20082.607950689362/8.0), REAL_CONST(20098.481961157428/8.0), REAL_CONST(20114.359106613385/8.0), REAL_CONST(20130.239385819699/8.0), REAL_CONST(20146.122797540058/8.0), REAL_CONST(20162.009340539353/8.0), REAL_CONST(20177.899013583716/8.0), REAL_CONST(20193.791815440476/8.0), REAL_CONST(20209.687744878182/8.0), REAL_CONST(20225.586800666591/8.0), REAL_CONST(20241.488981576669/8.0), REAL_CONST(20257.394286380597/8.0), REAL_CONST(20273.302713851754/8.0), REAL_CONST(20289.214262764715/8.0), REAL_CONST(20305.128931895277/8.0), REAL_CONST(20321.046720020415/8.0), REAL_CONST(20336.967625918318/8.0), REAL_CONST(20352.891648368361/8.0), REAL_CONST(20368.818786151114/8.0), REAL_CONST(20384.749038048347/8.0), REAL_CONST(20400.682402843009/8.0), REAL_CONST(20416.618879319249/8.0), REAL_CONST(20432.558466262391/8.0), REAL_CONST(20448.501162458953/8.0), REAL_CONST(20464.446966696629/8.0), REAL_CONST(20480.395877764302/8.0), REAL_CONST(20496.347894452025/8.0), REAL_CONST(20512.303015551031/8.0), REAL_CONST(20528.261239853735/8.0), REAL_CONST(20544.22256615372/8.0), REAL_CONST(20560.186993245738/8.0), REAL_CONST(20576.15451992572/8.0), REAL_CONST(20592.125144990758/8.0), REAL_CONST(20608.098867239107/8.0), REAL_CONST(20624.075685470198/8.0), REAL_CONST(20640.055598484618/8.0), REAL_CONST(20656.038605084115/8.0), REAL_CONST(20672.024704071595/8.0), REAL_CONST(20688.013894251126/8.0), REAL_CONST(20704.006174427926/8.0), REAL_CONST(20720.001543408373/8.0), REAL_CONST(20735.999999999989/8.0), REAL_CONST(20752.001543011454/8.0), REAL_CONST(20768.006171252597/8.0), REAL_CONST(20784.013883534382/8.0), REAL_CONST(20800.024678668931/8.0), REAL_CONST(20816.038555469506/8.0), REAL_CONST(20832.055512750507/8.0), REAL_CONST(20848.075549327474/8.0), REAL_CONST(20864.098664017085/8.0), REAL_CONST(20880.124855637161/8.0), REAL_CONST(20896.154123006647/8.0), REAL_CONST(20912.186464945626/8.0), REAL_CONST(20928.221880275312/8.0), REAL_CONST(20944.260367818049/8.0), REAL_CONST(20960.301926397311/8.0), REAL_CONST(20976.346554837684/8.0), REAL_CONST(20992.394251964895/8.0), REAL_CONST(21008.445016605787/8.0), REAL_CONST(21024.498847588318/8.0), REAL_CONST(21040.555743741574/8.0), REAL_CONST(21056.615703895754/8.0), REAL_CONST(21072.678726882168/8.0), REAL_CONST(21088.744811533252/8.0), REAL_CONST(21104.813956682538/8.0), REAL_CONST(21120.886161164683/8.0), REAL_CONST(21136.961423815443/8.0), REAL_CONST(21153.039743471683/8.0), REAL_CONST(21169.121118971379/8.0), REAL_CONST(21185.205549153605/8.0), REAL_CONST(21201.293032858535/8.0), REAL_CONST(21217.383568927453/8.0), REAL_CONST(21233.477156202731/8.0), REAL_CONST(21249.573793527841/8.0), REAL_CONST(21265.673479747358/8.0), REAL_CONST(21281.776213706937/8.0), REAL_CONST(21297.881994253334/8.0), REAL_CONST(21313.990820234398/8.0), REAL_CONST(21330.102690499054/8.0), REAL_CONST(21346.21760389733/8.0), REAL_CONST(21362.335559280327/8.0), REAL_CONST(21378.456555500241/8.0), REAL_CONST(21394.580591410333/8.0), REAL_CONST(21410.707665864964/8.0), REAL_CONST(21426.83777771956/8.0), REAL_CONST(21442.970925830628/8.0), REAL_CONST(21459.107109055756/8.0), REAL_CONST(21475.246326253604/8.0), REAL_CONST(21491.388576283895/8.0), REAL_CONST(21507.533858007431/8.0), REAL_CONST(21523.682170286087/8.0), REAL_CONST(21539.833511982797/8.0), REAL_CONST(21555.987881961566/8.0), REAL_CONST(21572.145279087465/8.0), REAL_CONST(21588.305702226615/8.0), REAL_CONST(21604.469150246216/8.0), REAL_CONST(21620.635622014521/8.0), REAL_CONST(21636.805116400832/8.0), REAL_CONST(21652.977632275521/8.0), REAL_CONST(21669.153168510009/8.0), REAL_CONST(21685.331723976764/8.0), REAL_CONST(21701.513297549318/8.0), REAL_CONST(21717.697888102244/8.0), REAL_CONST(21733.885494511167/8.0), REAL_CONST(21750.076115652759/8.0), REAL_CONST(21766.269750404736/8.0), REAL_CONST(21782.466397645861/8.0), REAL_CONST(21798.666056255934/8.0), REAL_CONST(21814.868725115801/8.0), REAL_CONST(21831.074403107345/8.0), REAL_CONST(21847.283089113484/8.0), REAL_CONST(21863.494782018177/8.0), REAL_CONST(21879.709480706417/8.0), REAL_CONST(21895.927184064229/8.0), REAL_CONST(21912.147890978667/8.0), REAL_CONST(21928.371600337818/8.0), REAL_CONST(21944.598311030797/8.0), REAL_CONST(21960.828021947746/8.0), REAL_CONST(21977.060731979829/8.0), REAL_CONST(21993.296440019243/8.0), REAL_CONST(22009.535144959198/8.0), REAL_CONST(22025.77684569393/8.0), REAL_CONST(22042.021541118691/8.0), REAL_CONST(22058.269230129757/8.0), REAL_CONST(22074.519911624411/8.0), REAL_CONST(22090.773584500959/8.0), REAL_CONST(22107.030247658717/8.0), REAL_CONST(22123.289899998013/8.0), REAL_CONST(22139.552540420187/8.0), REAL_CONST(22155.818167827587/8.0), REAL_CONST(22172.086781123569/8.0), REAL_CONST(22188.358379212495/8.0), REAL_CONST(22204.632960999726/8.0), REAL_CONST(22220.910525391639/8.0), REAL_CONST(22237.191071295601/8.0), REAL_CONST(22253.474597619981/8.0), REAL_CONST(22269.761103274148/8.0), REAL_CONST(22286.050587168469/8.0), REAL_CONST(22302.343048214312/8.0), REAL_CONST(22318.638485324027/8.0), REAL_CONST(22334.936897410968/8.0), REAL_CONST(22351.23828338947/8.0), REAL_CONST(22367.542642174871/8.0), REAL_CONST(22383.849972683485/8.0), REAL_CONST(22400.160273832618/8.0), REAL_CONST(22416.473544540564/8.0), REAL_CONST(22432.789783726603/8.0), REAL_CONST(22449.108990310986/8.0), REAL_CONST(22465.431163214958/8.0), REAL_CONST(22481.75630136074/8.0), REAL_CONST(22498.084403671528/8.0), REAL_CONST(22514.415469071497/8.0), REAL_CONST(22530.749496485802/8.0), REAL_CONST(22547.086484840562/8.0), REAL_CONST(22563.426433062879/8.0), REAL_CONST(22579.769340080824/8.0), REAL_CONST(22596.115204823436/8.0), REAL_CONST(22612.464026220721/8.0), REAL_CONST(22628.815803203655/8.0), REAL_CONST(22645.170534704179/8.0), REAL_CONST(22661.5282196552/8.0), REAL_CONST(22677.888856990587/8.0), REAL_CONST(22694.252445645168/8.0), REAL_CONST(22710.618984554734/8.0), REAL_CONST(22726.988472656034/8.0), REAL_CONST(22743.360908886778/8.0), REAL_CONST(22759.736292185622/8.0), REAL_CONST(22776.114621492186/8.0), REAL_CONST(22792.495895747044/8.0), REAL_CONST(22808.880113891719/8.0), REAL_CONST(22825.267274868678/8.0), REAL_CONST(22841.657377621348/8.0), REAL_CONST(22858.050421094096/8.0), REAL_CONST(22874.446404232243/8.0), REAL_CONST(22890.845325982053/8.0), REAL_CONST(22907.247185290722/8.0), REAL_CONST(22923.651981106406/8.0), REAL_CONST(22940.059712378195/8.0), REAL_CONST(22956.470378056114/8.0), REAL_CONST(22972.883977091129/8.0), REAL_CONST(22989.300508435153/8.0), REAL_CONST(23005.719971041017/8.0), REAL_CONST(23022.142363862498/8.0), REAL_CONST(23038.567685854305/8.0), REAL_CONST(23054.995935972078/8.0), REAL_CONST(23071.427113172387/8.0), REAL_CONST(23087.86121641273/8.0), REAL_CONST(23104.298244651531/8.0), REAL_CONST(23120.738196848146/8.0), REAL_CONST(23137.181071962848/8.0), REAL_CONST(23153.626868956846/8.0), REAL_CONST(23170.075586792263/8.0), REAL_CONST(23186.527224432142/8.0), REAL_CONST(23202.981780840448/8.0), REAL_CONST(23219.439254982066/8.0), REAL_CONST(23235.899645822796/8.0), REAL_CONST(23252.362952329357/8.0), REAL_CONST(23268.829173469378/8.0), REAL_CONST(23285.298308211408/8.0), REAL_CONST(23301.770355524899/8.0), REAL_CONST(23318.245314380223/8.0), REAL_CONST(23334.723183748658/8.0), REAL_CONST(23351.203962602387/8.0), REAL_CONST(23367.687649914504/8.0), REAL_CONST(23384.174244659007/8.0), REAL_CONST(23400.663745810798/8.0), REAL_CONST(23417.15615234568/8.0), REAL_CONST(23433.651463240367/8.0), REAL_CONST(23450.149677472462/8.0), REAL_CONST(23466.650794020472/8.0), REAL_CONST(23483.154811863806/8.0), REAL_CONST(23499.661729982763/8.0), REAL_CONST(23516.171547358543/8.0), REAL_CONST(23532.684262973235/8.0), REAL_CONST(23549.199875809823/8.0), REAL_CONST(23565.718384852185/8.0), REAL_CONST(23582.239789085092/8.0), REAL_CONST(23598.764087494197/8.0), REAL_CONST(23615.291279066041/8.0), REAL_CONST(23631.821362788058/8.0), REAL_CONST(23648.354337648565/8.0), REAL_CONST(23664.890202636761/8.0), REAL_CONST(23681.428956742733/8.0), REAL_CONST(23697.970598957443/8.0), REAL_CONST(23714.515128272738/8.0), REAL_CONST(23731.062543681343/8.0), REAL_CONST(23747.612844176863/8.0), REAL_CONST(23764.166028753778/8.0), REAL_CONST(23780.72209640744/8.0), REAL_CONST(23797.281046134085/8.0), REAL_CONST(23813.842876930816/8.0), REAL_CONST(23830.407587795606/8.0), REAL_CONST(23846.975177727301/8.0), REAL_CONST(23863.545645725622/8.0), REAL_CONST(23880.11899079115/8.0), REAL_CONST(23896.695211925336/8.0), REAL_CONST(23913.274308130498/8.0), REAL_CONST(23929.856278409821/8.0), REAL_CONST(23946.441121767348/8.0), REAL_CONST(23963.028837207989/8.0), REAL_CONST(23979.619423737513/8.0), REAL_CONST(23996.212880362549/8.0), REAL_CONST(24012.809206090584/8.0), REAL_CONST(24029.408399929966/8.0), REAL_CONST(24046.010460889898/8.0), REAL_CONST(24062.615387980433/8.0), REAL_CONST(24079.223180212492/8.0), REAL_CONST(24095.833836597827/8.0), REAL_CONST(24112.447356149063/8.0), REAL_CONST(24129.063737879667/8.0), REAL_CONST(24145.682980803951/8.0), REAL_CONST(24162.305083937081/8.0), REAL_CONST(24178.930046295067/8.0), REAL_CONST(24195.557866894767/8.0), REAL_CONST(24212.188544753884/8.0), REAL_CONST(24228.822078890964/8.0), REAL_CONST(24245.458468325389/8.0), REAL_CONST(24262.097712077397/8.0), REAL_CONST(24278.739809168052/8.0), REAL_CONST(24295.384758619261/8.0), REAL_CONST(24312.032559453768/8.0), REAL_CONST(24328.683210695162/8.0), REAL_CONST(24345.336711367858/8.0), REAL_CONST(24361.993060497109/8.0), REAL_CONST(24378.652257108995/8.0), REAL_CONST(24395.314300230442/8.0), REAL_CONST(24411.979188889192/8.0), REAL_CONST(24428.646922113825/8.0), REAL_CONST(24445.317498933746/8.0), REAL_CONST(24461.990918379193/8.0), REAL_CONST(24478.667179481225/8.0), REAL_CONST(24495.346281271726/8.0), REAL_CONST(24512.028222783407/8.0), REAL_CONST(24528.713003049801/8.0), REAL_CONST(24545.400621105266/8.0), REAL_CONST(24562.091075984976/8.0), REAL_CONST(24578.784366724925/8.0), REAL_CONST(24595.480492361927/8.0), REAL_CONST(24612.179451933614/8.0), REAL_CONST(24628.881244478438/8.0), REAL_CONST(24645.585869035654/8.0), REAL_CONST(24662.293324645343/8.0), REAL_CONST(24679.003610348394/8.0), REAL_CONST(24695.716725186514/8.0), REAL_CONST(24712.432668202211/8.0), REAL_CONST(24729.151438438807/8.0), REAL_CONST(24745.873034940436/8.0), REAL_CONST(24762.597456752032/8.0), REAL_CONST(24779.324702919344/8.0), REAL_CONST(24796.054772488926/8.0), REAL_CONST(24812.787664508123/8.0), REAL_CONST(24829.5233780251/8.0), REAL_CONST(24846.261912088819/8.0), REAL_CONST(24863.003265749034/8.0), REAL_CONST(24879.747438056307/8.0), REAL_CONST(24896.494428062004/8.0), REAL_CONST(24913.244234818278/8.0), REAL_CONST(24929.996857378079/8.0), REAL_CONST(24946.752294795166/8.0), REAL_CONST(24963.510546124078/8.0), REAL_CONST(24980.271610420157/8.0), REAL_CONST(24997.035486739525/8.0), REAL_CONST(25013.802174139113/8.0), REAL_CONST(25030.571671676629/8.0), REAL_CONST(25047.343978410572/8.0), REAL_CONST(25064.119093400237/8.0), REAL_CONST(25080.897015705697/8.0), REAL_CONST(25097.677744387816/8.0), REAL_CONST(25114.461278508239/8.0), REAL_CONST(25131.2476171294/8.0), REAL_CONST(25148.036759314517/8.0), REAL_CONST(25164.828704127583/8.0), REAL_CONST(25181.623450633375/8.0), REAL_CONST(25198.42099789745/8.0), REAL_CONST(25215.221344986145/8.0), REAL_CONST(25232.024490966574/8.0), REAL_CONST(25248.830434906627/8.0), REAL_CONST(25265.639175874974/8.0), REAL_CONST(25282.450712941049/8.0), REAL_CONST(25299.265045175071/8.0), REAL_CONST(25316.082171648024/8.0), REAL_CONST(25332.902091431668/8.0), REAL_CONST(25349.724803598532/8.0), REAL_CONST(25366.550307221914/8.0), REAL_CONST(25383.378601375884/8.0), REAL_CONST(25400.209685135269/8.0), REAL_CONST(25417.043557575678/8.0), REAL_CONST(25433.880217773472/8.0), REAL_CONST(25450.719664805783/8.0), REAL_CONST(25467.561897750507/8.0), REAL_CONST(25484.406915686297/8.0), REAL_CONST(25501.254717692573/8.0), REAL_CONST(25518.105302849512/8.0), REAL_CONST(25534.958670238051/8.0), REAL_CONST(25551.814818939893/8.0), REAL_CONST(25568.67374803748/8.0), REAL_CONST(25585.535456614027/8.0), REAL_CONST(25602.399943753502/8.0), REAL_CONST(25619.267208540619/8.0), REAL_CONST(25636.137250060852/8.0), REAL_CONST(25653.010067400432/8.0), REAL_CONST(25669.885659646327/8.0), REAL_CONST(25686.76402588627/8.0), REAL_CONST(25703.645165208734/8.0), REAL_CONST(25720.529076702944/8.0), REAL_CONST(25737.415759458876/8.0), REAL_CONST(25754.305212567244/8.0), REAL_CONST(25771.197435119517/8.0), REAL_CONST(25788.092426207899/8.0), REAL_CONST(25804.990184925344/8.0), REAL_CONST(25821.890710365547/8.0), REAL_CONST(25838.794001622944/8.0), REAL_CONST(25855.700057792714/8.0), REAL_CONST(25872.608877970775/8.0), REAL_CONST(25889.520461253778/8.0), REAL_CONST(25906.434806739118/8.0), REAL_CONST(25923.351913524923/8.0), REAL_CONST(25940.271780710063/8.0), REAL_CONST(25957.194407394138/8.0), REAL_CONST(25974.11979267748/8.0), REAL_CONST(25991.047935661154/8.0), REAL_CONST(26007.978835446964/8.0), REAL_CONST(26024.912491137442/8.0), REAL_CONST(26041.848901835841/8.0), REAL_CONST(26058.788066646157/8.0), REAL_CONST(26075.729984673108/8.0), REAL_CONST(26092.674655022136/8.0), REAL_CONST(26109.622076799409/8.0), REAL_CONST(26126.572249111829/8.0), REAL_CONST(26143.525171067016/8.0), REAL_CONST(26160.480841773315/8.0), REAL_CONST(26177.43926033979/8.0), REAL_CONST(26194.400425876229/8.0), REAL_CONST(26211.364337493149/8.0), REAL_CONST(26228.330994301767/8.0), REAL_CONST(26245.30039541404/8.0), REAL_CONST(26262.272539942627/8.0), REAL_CONST(26279.247427000919/8.0), REAL_CONST(26296.225055703002/8.0), REAL_CONST(26313.205425163702/8.0), REAL_CONST(26330.188534498539/8.0), REAL_CONST(26347.174382823756/8.0), REAL_CONST(26364.162969256304/8.0), REAL_CONST(26381.154292913852/8.0), REAL_CONST(26398.148352914774/8.0), REAL_CONST(26415.145148378149/8.0), REAL_CONST(26432.144678423778/8.0), REAL_CONST(26449.146942172156/8.0), REAL_CONST(26466.151938744493/8.0), REAL_CONST(26483.159667262702/8.0), REAL_CONST(26500.170126849403/8.0), REAL_CONST(26517.183316627921/8.0), REAL_CONST(26534.199235722277/8.0), REAL_CONST(26551.217883257199/8.0), REAL_CONST(26568.239258358124/8.0), REAL_CONST(26585.263360151173/8.0), REAL_CONST(26602.290187763181/8.0), REAL_CONST(26619.319740321676/8.0), REAL_CONST(26636.352016954883/8.0), REAL_CONST(26653.387016791727/8.0), REAL_CONST(26670.424738961825/8.0), REAL_CONST(26687.465182595493/8.0), REAL_CONST(26704.508346823739/8.0), REAL_CONST(26721.554230778267/8.0), REAL_CONST(26738.602833591467/8.0), REAL_CONST(26755.65415439643/8.0), REAL_CONST(26772.708192326929/8.0), REAL_CONST(26789.764946517433/8.0), REAL_CONST(26806.824416103096/8.0), REAL_CONST(26823.886600219761/8.0), REAL_CONST(26840.95149800396/8.0), REAL_CONST(26858.019108592915/8.0), REAL_CONST(26875.089431124517/8.0), REAL_CONST(26892.162464737365/8.0), REAL_CONST(26909.238208570721/8.0), REAL_CONST(26926.316661764544/8.0), REAL_CONST(26943.397823459472/8.0), REAL_CONST(26960.481692796813/8.0), REAL_CONST(26977.568268918571/8.0), REAL_CONST(26994.657550967422/8.0), REAL_CONST(27011.749538086722/8.0), REAL_CONST(27028.844229420498/8.0), REAL_CONST(27045.941624113464/8.0), REAL_CONST(27063.041721311005/8.0), REAL_CONST(27080.144520159181/8.0), REAL_CONST(27097.250019804727/8.0), REAL_CONST(27114.35821939505/8.0), REAL_CONST(27131.469118078236/8.0), REAL_CONST(27148.582715003027/8.0), REAL_CONST(27165.699009318858/8.0), REAL_CONST(27182.818000175819/8.0), REAL_CONST(27199.939686724665/8.0), REAL_CONST(27217.064068116837/8.0), REAL_CONST(27234.191143504428/8.0), REAL_CONST(27251.320912040203/8.0), REAL_CONST(27268.453372877593/8.0), REAL_CONST(27285.588525170693/8.0), REAL_CONST(27302.726368074269/8.0), REAL_CONST(27319.866900743735/8.0), REAL_CONST(27337.010122335181/8.0), REAL_CONST(27354.156032005358/8.0), REAL_CONST(27371.304628911668/8.0), REAL_CONST(27388.455912212183/8.0), REAL_CONST(27405.609881065626/8.0), REAL_CONST(27422.766534631384/8.0), REAL_CONST(27439.925872069507/8.0), REAL_CONST(27457.087892540683/8.0), REAL_CONST(27474.252595206275/8.0), REAL_CONST(27491.419979228293/8.0), REAL_CONST(27508.5900437694/8.0), REAL_CONST(27525.762787992917/8.0), REAL_CONST(27542.93821106281/8.0), REAL_CONST(27560.116312143706/8.0), REAL_CONST(27577.297090400876/8.0), REAL_CONST(27594.480545000242/8.0), REAL_CONST(27611.666675108383/8.0), REAL_CONST(27628.855479892518/8.0), REAL_CONST(27646.046958520514/8.0), REAL_CONST(27663.241110160889/8.0), REAL_CONST(27680.437933982801/8.0), REAL_CONST(27697.637429156068/8.0), REAL_CONST(27714.839594851132/8.0), REAL_CONST(27732.04443023909/8.0), REAL_CONST(27749.251934491687/8.0), REAL_CONST(27766.462106781299/8.0), REAL_CONST(27783.674946280949/8.0), REAL_CONST(27800.890452164302/8.0), REAL_CONST(27818.108623605654/8.0), REAL_CONST(27835.329459779954/8.0), REAL_CONST(27852.55295986278/8.0), REAL_CONST(27869.779123030345/8.0), REAL_CONST(27887.007948459504/8.0), REAL_CONST(27904.239435327745/8.0), REAL_CONST(27921.473582813196/8.0), REAL_CONST(27938.710390094613/8.0), REAL_CONST(27955.949856351392/8.0), REAL_CONST(27973.19198076355/8.0), REAL_CONST(27990.436762511745/8.0), REAL_CONST(28007.684200777272/8.0), REAL_CONST(28024.934294742041/8.0), REAL_CONST(28042.187043588601/8.0), REAL_CONST(28059.442446500128/8.0), REAL_CONST(28076.700502660427/8.0), REAL_CONST(28093.961211253929/8.0), REAL_CONST(28111.224571465693/8.0), REAL_CONST(28128.490582481401/8.0), REAL_CONST(28145.759243487362/8.0), REAL_CONST(28163.030553670509/8.0), REAL_CONST(28180.304512218394/8.0), REAL_CONST(28197.581118319198/8.0), REAL_CONST(28214.860371161725/8.0), REAL_CONST(28232.14226993539/8.0), REAL_CONST(28249.42681383024/8.0), REAL_CONST(28266.71400203693/8.0), REAL_CONST(28284.003833746745/8.0), REAL_CONST(28301.296308151585/8.0), REAL_CONST(28318.591424443959/8.0), REAL_CONST(28335.889181817001/8.0), REAL_CONST(28353.189579464462/8.0), REAL_CONST(28370.492616580705/8.0), REAL_CONST(28387.798292360701/8.0), REAL_CONST(28405.106606000048/8.0), REAL_CONST(28422.417556694945/8.0), REAL_CONST(28439.731143642206/8.0), REAL_CONST(28457.047366039264/8.0), REAL_CONST(28474.366223084147/8.0), REAL_CONST(28491.687713975512/8.0), REAL_CONST(28509.011837912611/8.0), REAL_CONST(28526.338594095305/8.0), REAL_CONST(28543.667981724069/8.0), REAL_CONST(28560.999999999982/8.0), REAL_CONST(28578.334648124732/8.0), REAL_CONST(28595.671925300605/8.0), REAL_CONST(28613.011830730498/8.0), REAL_CONST(28630.354363617909/8.0), REAL_CONST(28647.699523166943/8.0), REAL_CONST(28665.0473085823/8.0), REAL_CONST(28682.397719069289/8.0), REAL_CONST(28699.750753833818/8.0), REAL_CONST(28717.10641208239/8.0), REAL_CONST(28734.464693022121/8.0), REAL_CONST(28751.825595860708/8.0), REAL_CONST(28769.189119806462/8.0), REAL_CONST(28786.55526406828/8.0), REAL_CONST(28803.924027855664/8.0), REAL_CONST(28821.295410378701/8.0), REAL_CONST(28838.669410848088/8.0), REAL_CONST(28856.046028475103/8.0), REAL_CONST(28873.425262471628/8.0), REAL_CONST(28890.80711205013/8.0), REAL_CONST(28908.191576423673/8.0), REAL_CONST(28925.578654805915/8.0), REAL_CONST(28942.968346411097/8.0), REAL_CONST(28960.360650454055/8.0), REAL_CONST(28977.755566150216/8.0), REAL_CONST(28995.153092715591/8.0), REAL_CONST(29012.553229366786/8.0), REAL_CONST(29029.955975320987/8.0), REAL_CONST(29047.361329795975/8.0), REAL_CONST(29064.769292010107/8.0), REAL_CONST(29082.179861182336/8.0), REAL_CONST(29099.593036532187/8.0), REAL_CONST(29117.00881727978/8.0), REAL_CONST(29134.427202645813/8.0), REAL_CONST(29151.848191851568/8.0), REAL_CONST(29169.271784118911/8.0), REAL_CONST(29186.697978670283/8.0), REAL_CONST(29204.126774728706/8.0), REAL_CONST(29221.55817151779/8.0), REAL_CONST(29238.992168261717/8.0), REAL_CONST(29256.42876418525/8.0), REAL_CONST(29273.867958513725/8.0), REAL_CONST(29291.309750473058/8.0), REAL_CONST(29308.754139289747/8.0), REAL_CONST(29326.201124190855/8.0), REAL_CONST(29343.65070440403/8.0), REAL_CONST(29361.102879157483/8.0), REAL_CONST(29378.557647680012/8.0), REAL_CONST(29396.015009200975/8.0), REAL_CONST(29413.474962950309/8.0), REAL_CONST(29430.937508158524/8.0), REAL_CONST(29448.402644056692/8.0), REAL_CONST(29465.870369876469/8.0), REAL_CONST(29483.340684850071/8.0), REAL_CONST(29500.81358821028/8.0), REAL_CONST(29518.289079190454/8.0), REAL_CONST(29535.767157024511/8.0), REAL_CONST(29553.247820946945/8.0), REAL_CONST(29570.731070192807/8.0), REAL_CONST(29588.216903997723/8.0), REAL_CONST(29605.70532159787/8.0), REAL_CONST(29623.19632223/8.0), REAL_CONST(29640.689905131429/8.0), REAL_CONST(29658.186069540028/8.0), REAL_CONST(29675.684814694236/8.0), REAL_CONST(29693.186139833047/8.0), REAL_CONST(29710.690044196028/8.0), REAL_CONST(29728.196527023298/8.0), REAL_CONST(29745.705587555527/8.0), REAL_CONST(29763.217225033964/8.0), REAL_CONST(29780.731438700397/8.0), REAL_CONST(29798.248227797183/8.0), REAL_CONST(29815.76759156723/8.0), REAL_CONST(29833.289529254005/8.0), REAL_CONST(29850.81404010153/8.0), REAL_CONST(29868.341123354381/8.0), REAL_CONST(29885.870778257693/8.0), REAL_CONST(29903.403004057145/8.0), REAL_CONST(29920.937799998974/8.0), REAL_CONST(29938.475165329975/8.0), REAL_CONST(29956.015099297485/8.0), REAL_CONST(29973.557601149394/8.0), REAL_CONST(29991.102670134147/8.0), REAL_CONST(30008.650305500738/8.0), REAL_CONST(30026.200506498706/8.0), REAL_CONST(30043.753272378144/8.0), REAL_CONST(30061.308602389683/8.0), REAL_CONST(30078.866495784507/8.0), REAL_CONST(30096.426951814352/8.0), REAL_CONST(30113.989969731494/8.0), REAL_CONST(30131.55554878875/8.0), REAL_CONST(30149.123688239491/8.0), REAL_CONST(30166.694387337629/8.0), REAL_CONST(30184.267645337608/8.0), REAL_CONST(30201.843461494434/8.0), REAL_CONST(30219.42183506364/8.0), REAL_CONST(30237.002765301309/8.0), REAL_CONST(30254.586251464058/8.0), REAL_CONST(30272.172292809046/8.0), REAL_CONST(30289.760888593977/8.0), REAL_CONST(30307.35203807709/8.0), REAL_CONST(30324.94574051716/8.0), REAL_CONST(30342.541995173502/8.0), REAL_CONST(30360.140801305966/8.0), REAL_CONST(30377.742158174944/8.0), REAL_CONST(30395.346065041358/8.0), REAL_CONST(30412.952521166666/8.0), REAL_CONST(30430.561525812864/8.0), REAL_CONST(30448.173078242475/8.0), REAL_CONST(30465.787177718561/8.0), REAL_CONST(30483.403823504719/8.0), REAL_CONST(30501.02301486507/8.0), REAL_CONST(30518.644751064272/8.0), REAL_CONST(30536.269031367516/8.0), REAL_CONST(30553.895855040515/8.0), REAL_CONST(30571.525221349519/8.0), REAL_CONST(30589.157129561307/8.0), REAL_CONST(30606.791578943175/8.0), REAL_CONST(30624.428568762964/8.0), REAL_CONST(30642.06809828903/8.0), REAL_CONST(30659.710166790261/8.0), REAL_CONST(30677.35477353607/8.0), REAL_CONST(30695.001917796391/8.0), REAL_CONST(30712.651598841687/8.0), REAL_CONST(30730.303815942945/8.0), REAL_CONST(30747.958568371676/8.0), REAL_CONST(30765.615855399912/8.0), REAL_CONST(30783.275676300211/8.0), REAL_CONST(30800.938030345646/8.0), REAL_CONST(30818.602916809814/8.0), REAL_CONST(30836.270334966837/8.0), REAL_CONST(30853.940284091354/8.0), REAL_CONST(30871.612763458521/8.0), REAL_CONST(30889.287772344011/8.0), REAL_CONST(30906.965310024025/8.0), REAL_CONST(30924.645375775272/8.0), REAL_CONST(30942.327968874983/8.0), REAL_CONST(30960.013088600903/8.0), REAL_CONST(30977.700734231294/8.0), REAL_CONST(30995.390905044929/8.0), REAL_CONST(31013.083600321101/8.0), REAL_CONST(31030.778819339619/8.0), REAL_CONST(31048.476561380798/8.0), REAL_CONST(31066.17682572547/8.0), REAL_CONST(31083.879611654978/8.0), REAL_CONST(31101.584918451179/8.0), REAL_CONST(31119.29274539644/8.0), REAL_CONST(31137.003091773637/8.0), REAL_CONST(31154.715956866155/8.0), REAL_CONST(31172.431339957893/8.0), REAL_CONST(31190.14924033326/8.0), REAL_CONST(31207.869657277162/8.0), REAL_CONST(31225.592590075023/8.0), REAL_CONST(31243.318038012771/8.0), REAL_CONST(31261.046000376838/8.0), REAL_CONST(31278.776476454172/8.0), REAL_CONST(31296.50946553221/8.0), REAL_CONST(31314.24496689891/8.0), REAL_CONST(31331.98297984272/8.0), REAL_CONST(31349.7235036526/8.0), REAL_CONST(31367.466537618013/8.0), REAL_CONST(31385.212081028923/8.0), REAL_CONST(31402.960133175795/8.0), REAL_CONST(31420.710693349596/8.0), REAL_CONST(31438.463760841791/8.0), REAL_CONST(31456.219334944351/8.0), REAL_CONST(31473.977414949743/8.0), REAL_CONST(31491.738000150934/8.0), REAL_CONST(31509.501089841389/8.0), REAL_CONST(31527.266683315069/8.0), REAL_CONST(31545.034779866437/8.0), REAL_CONST(31562.80537879045/8.0), REAL_CONST(31580.578479382562/8.0), REAL_CONST(31598.35408093872/8.0), REAL_CONST(31616.132182755369/8.0), REAL_CONST(31633.91278412945/8.0), REAL_CONST(31651.695884358396/8.0), REAL_CONST(31669.481482740131/8.0), REAL_CONST(31687.269578573076/8.0), REAL_CONST(31705.060171156143/8.0), REAL_CONST(31722.853259788735/8.0), REAL_CONST(31740.648843770748/8.0), REAL_CONST(31758.446922402567/8.0), REAL_CONST(31776.247494985066/8.0), REAL_CONST(31794.050560819614/8.0), REAL_CONST(31811.85611920806/8.0), REAL_CONST(31829.664169452753/8.0), REAL_CONST(31847.474710856521/8.0), REAL_CONST(31865.287742722685/8.0), REAL_CONST(31883.103264355046/8.0), REAL_CONST(31900.921275057899/8.0), REAL_CONST(31918.741774136019/8.0), REAL_CONST(31936.564760894671/8.0), REAL_CONST(31954.390234639599/8.0), REAL_CONST(31972.21819467704/8.0), REAL_CONST(31990.048640313704/8.0), REAL_CONST(32007.881570856793/8.0), REAL_CONST(32025.716985613984/8.0), REAL_CONST(32043.554883893445/8.0), REAL_CONST(32061.395265003815/8.0), REAL_CONST(32079.238128254223/8.0), REAL_CONST(32097.083472954269/8.0), REAL_CONST(32114.931298414049/8.0), REAL_CONST(32132.781603944117/8.0), REAL_CONST(32150.634388855524/8.0), REAL_CONST(32168.48965245979/8.0), REAL_CONST(32186.347394068915/8.0), REAL_CONST(32204.207612995371/8.0), REAL_CONST(32222.07030855212/8.0), REAL_CONST(32239.935480052583/8.0), REAL_CONST(32257.803126810672/8.0), REAL_CONST(32275.673248140767/8.0), REAL_CONST(32293.545843357719/8.0), REAL_CONST(32311.420911776862/8.0), REAL_CONST(32329.298452713996/8.0), REAL_CONST(32347.178465485395/8.0), REAL_CONST(32365.060949407813/8.0), REAL_CONST(32382.945903798463/8.0), REAL_CONST(32400.83332797504/8.0), REAL_CONST(32418.723221255706/8.0), REAL_CONST(32436.615582959093/8.0), REAL_CONST(32454.510412404306/8.0), REAL_CONST(32472.407708910916/8.0), REAL_CONST(32490.307471798966/8.0), REAL_CONST(32508.209700388961/8.0), REAL_CONST(32526.114394001877/8.0), REAL_CONST(32544.021551959166/8.0), REAL_CONST(32561.931173582732/8.0), REAL_CONST(32579.843258194956/8.0), REAL_CONST(32597.757805118679/8.0), REAL_CONST(32615.674813677211/8.0), REAL_CONST(32633.594283194328/8.0), REAL_CONST(32651.516212994258/8.0), REAL_CONST(32669.440602401712/8.0), REAL_CONST(32687.367450741847/8.0), REAL_CONST(32705.296757340297/8.0), REAL_CONST(32723.228521523146/8.0), REAL_CONST(32741.162742616943/8.0), REAL_CONST(32759.099419948703/8.0), REAL_CONST(32777.038552845901/8.0), REAL_CONST(32794.980140636464/8.0), REAL_CONST(32812.924182648792/8.0), REAL_CONST(32830.87067821173/8.0), REAL_CONST(32848.819626654593/8.0), REAL_CONST(32866.77102730715/8.0), REAL_CONST(32884.724879499619/8.0), REAL_CONST(32902.681182562686/8.0), REAL_CONST(32920.639935827494/8.0), REAL_CONST(32938.601138625643/8.0), REAL_CONST(32956.56479028918/8.0), REAL_CONST(32974.530890150607/8.0), REAL_CONST(32992.499437542894/8.0), REAL_CONST(33010.470431799447/8.0), REAL_CONST(33028.443872254145/8.0), REAL_CONST(33046.419758241311/8.0), REAL_CONST(33064.39808909571/8.0), REAL_CONST(33082.378864152583/8.0), REAL_CONST(33100.36208274759/8.0), REAL_CONST(33118.347744216881/8.0), REAL_CONST(33136.335847897026/8.0), REAL_CONST(33154.326393125062/8.0), REAL_CONST(33172.31937923847/8.0), REAL_CONST(33190.314805575174/8.0), REAL_CONST(33208.312671473555/8.0), REAL_CONST(33226.312976272442/8.0), REAL_CONST(33244.315719311111/8.0), REAL_CONST(33262.320899929284/8.0), REAL_CONST(33280.328517467125/8.0), REAL_CONST(33298.33857126526/8.0), REAL_CONST(33316.351060664747/8.0), REAL_CONST(33334.365985007091/8.0), REAL_CONST(33352.383343634239/8.0), REAL_CONST(33370.403135888591/8.0), REAL_CONST(33388.42536111299/8.0), REAL_CONST(33406.450018650721/8.0), REAL_CONST(33424.477107845501/8.0), REAL_CONST(33442.506628041512/8.0), REAL_CONST(33460.53857858335/8.0), REAL_CONST(33478.572958816083/8.0), REAL_CONST(33496.609768085189/8.0), REAL_CONST(33514.649005736617/8.0), REAL_CONST(33532.690671116739/8.0), REAL_CONST(33550.734763572356/8.0), REAL_CONST(33568.781282450735/8.0), REAL_CONST(33586.830227099563/8.0), REAL_CONST(33604.881596866973/8.0), REAL_CONST(33622.935391101528/8.0), REAL_CONST(33640.991609152239/8.0), REAL_CONST(33659.050250368542/8.0), REAL_CONST(33677.111314100322/8.0), REAL_CONST(33695.174799697881/8.0), REAL_CONST(33713.240706511984/8.0), REAL_CONST(33731.309033893805/8.0), REAL_CONST(33749.37978119497/8.0), REAL_CONST(33767.452947767531/8.0), REAL_CONST(33785.528532963974/8.0), REAL_CONST(33803.606536137209/8.0), REAL_CONST(33821.686956640602/8.0), REAL_CONST(33839.769793827938/8.0), REAL_CONST(33857.855047053425/8.0), REAL_CONST(33875.942715671707/8.0), REAL_CONST(33894.032799037872/8.0), REAL_CONST(33912.125296507431/8.0), REAL_CONST(33930.220207436316/8.0), REAL_CONST(33948.317531180888/8.0), REAL_CONST(33966.417267097961/8.0), REAL_CONST(33984.519414544746/8.0), REAL_CONST(34002.623972878901/8.0), REAL_CONST(34020.730941458511/8.0), REAL_CONST(34038.840319642077/8.0), REAL_CONST(34056.952106788536/8.0), REAL_CONST(34075.066302257255/8.0), REAL_CONST(34093.182905408015/8.0), REAL_CONST(34111.301915601027/8.0), REAL_CONST(34129.42333219693/8.0), REAL_CONST(34147.547154556785/8.0), REAL_CONST(34165.673382042078/8.0), REAL_CONST(34183.80201401472/8.0), REAL_CONST(34201.933049837033/8.0), REAL_CONST(34220.06648887178/8.0), REAL_CONST(34238.202330482141/8.0), REAL_CONST(34256.340574031703/8.0), REAL_CONST(34274.481218884495/8.0), REAL_CONST(34292.624264404949/8.0), REAL_CONST(34310.769709957938/8.0), REAL_CONST(34328.91755490873/8.0), REAL_CONST(34347.067798623029/8.0), REAL_CONST(34365.220440466954/8.0), REAL_CONST(34383.375479807051/8.0), REAL_CONST(34401.532916010263/8.0), REAL_CONST(34419.692748443973/8.0), REAL_CONST(34437.854976475966/8.0), REAL_CONST(34456.01959947445/8.0), REAL_CONST(34474.18661680806/8.0), REAL_CONST(34492.356027845817/8.0), REAL_CONST(34510.527831957188/8.0), REAL_CONST(34528.702028512052/8.0), REAL_CONST(34546.878616880676/8.0), REAL_CONST(34565.05759643377/8.0), REAL_CONST(34583.238966542449/8.0), REAL_CONST(34601.422726578232/8.0), REAL_CONST(34619.608875913065/8.0), REAL_CONST(34637.797413919296/8.0), REAL_CONST(34655.988339969692/8.0), REAL_CONST(34674.181653437423/8.0), REAL_CONST(34692.37735369608/8.0), REAL_CONST(34710.575440119668/8.0), REAL_CONST(34728.775912082579/8.0), REAL_CONST(34746.978768959649/8.0), REAL_CONST(34765.184010126082/8.0), REAL_CONST(34783.391634957537/8.0), REAL_CONST(34801.60164283005/8.0), REAL_CONST(34819.814033120063/8.0), REAL_CONST(34838.028805204456/8.0), REAL_CONST(34856.24595846048/8.0), REAL_CONST(34874.465492265823/8.0), REAL_CONST(34892.687405998557/8.0), REAL_CONST(34910.911699037177/8.0), REAL_CONST(34929.138370760564/8.0), REAL_CONST(34947.367420548027/8.0), REAL_CONST(34965.598847779271/8.0), REAL_CONST(34983.832651834389/8.0), REAL_CONST(35002.068832093908/8.0), REAL_CONST(35020.307387938738/8.0), REAL_CONST(35038.548318750189/8.0), REAL_CONST(35056.79162390998/8.0), REAL_CONST(35075.03730280025/8.0), REAL_CONST(35093.285354803513/8.0), REAL_CONST(35111.535779302685/8.0), REAL_CONST(35129.788575681116/8.0), REAL_CONST(35148.043743322516/8.0), REAL_CONST(35166.301281611013/8.0), REAL_CONST(35184.561189931141/8.0), REAL_CONST(35202.823467667826/8.0), REAL_CONST(35221.088114206388/8.0), REAL_CONST(35239.355128932555/8.0), REAL_CONST(35257.624511232447/8.0), REAL_CONST(35275.896260492584/8.0), REAL_CONST(35294.170376099886/8.0), REAL_CONST(35312.446857441668/8.0), REAL_CONST(35330.725703905628/8.0), REAL_CONST(35349.006914879887/8.0), REAL_CONST(35367.290489752944/8.0), REAL_CONST(35385.576427913686/8.0), REAL_CONST(35403.864728751418/8.0), REAL_CONST(35422.155391655811/8.0), REAL_CONST(35440.448416016967/8.0), REAL_CONST(35458.743801225341/8.0), REAL_CONST(35477.041546671804/8.0), REAL_CONST(35495.341651747622/8.0), REAL_CONST(35513.644115844436/8.0), REAL_CONST(35531.948938354304/8.0), REAL_CONST(35550.256118669655/8.0), REAL_CONST(35568.565656183309/8.0), REAL_CONST(35586.877550288496/8.0), REAL_CONST(35605.191800378816/8.0), REAL_CONST(35623.508405848268/8.0), REAL_CONST(35641.827366091238/8.0), REAL_CONST(35660.148680502505/8.0), REAL_CONST(35678.472348477233/8.0), REAL_CONST(35696.798369410979/8.0), REAL_CONST(35715.126742699678/8.0), REAL_CONST(35733.457467739659/8.0), REAL_CONST(35751.790543927644/8.0), REAL_CONST(35770.125970660738/8.0), REAL_CONST(35788.46374733642/8.0), REAL_CONST(35806.803873352568/8.0), REAL_CONST(35825.146348107453/8.0), REAL_CONST(35843.49117099971/8.0), REAL_CONST(35861.838341428367/8.0), REAL_CONST(35880.187858792851/8.0), REAL_CONST(35898.539722492955/8.0), REAL_CONST(35916.893931928862/8.0), REAL_CONST(35935.250486501129/8.0), REAL_CONST(35953.609385610718/8.0), REAL_CONST(35971.970628658957/8.0), REAL_CONST(35990.334215047558/8.0), REAL_CONST(36008.700144178612/8.0), REAL_CONST(36027.068415454596/8.0), REAL_CONST(36045.439028278372/8.0), REAL_CONST(36063.811982053165/8.0), REAL_CONST(36082.187276182609/8.0), REAL_CONST(36100.564910070694/8.0), REAL_CONST(36118.944883121789/8.0), REAL_CONST(36137.327194740654/8.0), REAL_CONST(36155.711844332429/8.0), REAL_CONST(36174.098831302617/8.0), REAL_CONST(36192.488155057115/8.0), REAL_CONST(36210.87981500219/8.0), REAL_CONST(36229.273810544473/8.0), REAL_CONST(36247.670141091003/8.0), REAL_CONST(36266.068806049167/8.0), REAL_CONST(36284.469804826738/8.0), REAL_CONST(36302.873136831862/8.0), REAL_CONST(36321.278801473069/8.0), REAL_CONST(36339.686798159251/8.0), REAL_CONST(36358.097126299683/8.0), REAL_CONST(36376.509785304013/8.0), REAL_CONST(36394.924774582258/8.0), REAL_CONST(36413.342093544816/8.0), REAL_CONST(36431.761741602444/8.0), REAL_CONST(36450.183718166292/8.0), REAL_CONST(36468.608022647859/8.0), REAL_CONST(36487.034654459028/8.0), REAL_CONST(36505.463613012063/8.0), REAL_CONST(36523.894897719583/8.0), REAL_CONST(36542.328507994578/8.0), REAL_CONST(36560.764443250409/8.0), REAL_CONST(36579.202702900831/8.0), REAL_CONST(36597.643286359926/8.0), REAL_CONST(36616.086193042182/8.0), REAL_CONST(36634.531422362437/8.0), REAL_CONST(36652.978973735895/8.0), REAL_CONST(36671.428846578143/8.0), REAL_CONST(36689.881040305125/8.0), REAL_CONST(36708.335554333149/8.0), REAL_CONST(36726.792388078902/8.0), REAL_CONST(36745.251540959427/8.0), REAL_CONST(36763.713012392138/8.0), REAL_CONST(36782.176801794812/8.0), REAL_CONST(36800.642908585593/8.0), REAL_CONST(36819.111332182983/8.0), REAL_CONST(36837.582072005869/8.0), REAL_CONST(36856.055127473483/8.0), REAL_CONST(36874.530498005421/8.0), REAL_CONST(36893.008183021651/8.0), REAL_CONST(36911.488181942506/8.0), REAL_CONST(36929.970494188674/8.0), REAL_CONST(36948.455119181206/8.0), REAL_CONST(36966.942056341519/8.0), REAL_CONST(36985.431305091392/8.0), REAL_CONST(37003.922864852961/8.0), REAL_CONST(37022.416735048733/8.0), REAL_CONST(37040.912915101559/8.0), REAL_CONST(37059.411404434657/8.0), REAL_CONST(37077.91220247162/8.0), REAL_CONST(37096.415308636388/8.0), REAL_CONST(37114.920722353243/8.0), REAL_CONST(37133.428443046862/8.0), REAL_CONST(37151.938470142253/8.0), REAL_CONST(37170.450803064785/8.0), REAL_CONST(37188.965441240209/8.0), REAL_CONST(37207.482384094597/8.0), REAL_CONST(37226.001631054402/8.0), REAL_CONST(37244.523181546429/8.0), REAL_CONST(37263.047034997842/8.0), REAL_CONST(37281.573190836149/8.0), REAL_CONST(37300.101648489224/8.0), REAL_CONST(37318.632407385296/8.0), REAL_CONST(37337.165466952945/8.0), REAL_CONST(37355.700826621112/8.0), REAL_CONST(37374.238485819085/8.0), REAL_CONST(37392.778443976509/8.0), REAL_CONST(37411.320700523385/8.0), REAL_CONST(37429.865254890057/8.0), REAL_CONST(37448.412106507232/8.0), REAL_CONST(37466.961254805974/8.0), REAL_CONST(37485.512699217681/8.0), REAL_CONST(37504.066439174116/8.0), REAL_CONST(37522.622474107404/8.0), REAL_CONST(37541.180803449992/8.0), REAL_CONST(37559.741426634704/8.0), REAL_CONST(37578.304343094693/8.0), REAL_CONST(37596.869552263488/8.0), REAL_CONST(37615.43705357494/8.0), REAL_CONST(37634.006846463279/8.0), REAL_CONST(37652.578930363044/8.0), REAL_CONST(37671.153304709165/8.0), REAL_CONST(37689.729968936896/8.0), REAL_CONST(37708.308922481847/8.0), REAL_CONST(37726.890164779965/8.0), REAL_CONST(37745.473695267559/8.0), REAL_CONST(37764.059513381275/8.0), REAL_CONST(37782.647618558112/8.0), REAL_CONST(37801.238010235415/8.0), REAL_CONST(37819.830687850859/8.0), REAL_CONST(37838.425650842495/8.0), REAL_CONST(37857.022898648691/8.0), REAL_CONST(37875.622430708172/8.0), REAL_CONST(37894.224246460013/8.0), REAL_CONST(37912.828345343616/8.0), REAL_CONST(37931.434726798747/8.0), REAL_CONST(37950.043390265506/8.0), REAL_CONST(37968.654335184328/8.0), REAL_CONST(37987.267560995999/8.0), REAL_CONST(38005.883067141665/8.0), REAL_CONST(38024.500853062775/8.0), REAL_CONST(38043.120918201159/8.0), REAL_CONST(38061.743261998963/8.0), REAL_CONST(38080.367883898682/8.0), REAL_CONST(38098.994783343158/8.0), REAL_CONST(38117.623959775563/8.0), REAL_CONST(38136.255412639417/8.0), REAL_CONST(38154.889141378575/8.0), REAL_CONST(38173.525145437234/8.0), REAL_CONST(38192.163424259939/8.0), REAL_CONST(38210.803977291551/8.0), REAL_CONST(38229.446803977284/8.0), REAL_CONST(38248.091903762703/8.0), REAL_CONST(38266.739276093685/8.0), REAL_CONST(38285.388920416466/8.0), REAL_CONST(38304.040836177606/8.0), REAL_CONST(38322.695022824002/8.0), REAL_CONST(38341.351479802899/8.0), REAL_CONST(38360.010206561863/8.0), REAL_CONST(38378.671202548816/8.0), REAL_CONST(38397.334467211993/8.0), REAL_CONST(38415.999999999978/8.0), REAL_CONST(38434.667800361683/8.0), REAL_CONST(38453.33786774637/8.0), REAL_CONST(38472.010201603611/8.0), REAL_CONST(38490.684801383337/8.0), REAL_CONST(38509.361666535784/8.0), REAL_CONST(38528.040796511552/8.0), REAL_CONST(38546.722190761553/8.0), REAL_CONST(38565.405848737035/8.0), REAL_CONST(38584.091769889594/8.0), REAL_CONST(38602.779953671132/8.0), REAL_CONST(38621.470399533908/8.0), REAL_CONST(38640.163106930493/8.0), REAL_CONST(38658.858075313794/8.0), REAL_CONST(38677.555304137059/8.0), REAL_CONST(38696.254792853862/8.0), REAL_CONST(38714.956540918094/8.0), REAL_CONST(38733.660547783991/8.0), REAL_CONST(38752.366812906112/8.0), REAL_CONST(38771.075335739348/8.0), REAL_CONST(38789.78611573892/8.0), REAL_CONST(38808.499152360368/8.0), REAL_CONST(38827.214445059573/8.0), REAL_CONST(38845.931993292739/8.0), REAL_CONST(38864.651796516388/8.0), REAL_CONST(38883.373854187383/8.0), REAL_CONST(38902.098165762916/8.0), REAL_CONST(38920.824730700486/8.0), REAL_CONST(38939.553548457938/8.0), REAL_CONST(38958.284618493431/8.0), REAL_CONST(38977.017940265461/8.0), REAL_CONST(38995.753513232834/8.0), REAL_CONST(39014.491336854699/8.0), REAL_CONST(39033.231410590517/8.0), REAL_CONST(39051.973733900079/8.0), REAL_CONST(39070.718306243485/8.0), REAL_CONST(39089.465127081188/8.0), REAL_CONST(39108.214195873945/8.0), REAL_CONST(39126.965512082832/8.0), REAL_CONST(39145.719075169261/8.0), REAL_CONST(39164.474884594965/8.0), REAL_CONST(39183.232939821988/8.0), REAL_CONST(39201.99324031271/8.0), REAL_CONST(39220.755785529815/8.0), REAL_CONST(39239.52057493633/8.0), REAL_CONST(39258.287607995589/8.0), REAL_CONST(39277.056884171245/8.0), REAL_CONST(39295.828402927284/8.0), REAL_CONST(39314.602163728006/8.0), REAL_CONST(39333.378166038019/8.0), REAL_CONST(39352.15640932227/8.0), REAL_CONST(39370.936893046004/8.0), REAL_CONST(39389.719616674811/8.0), REAL_CONST(39408.504579674584/8.0), REAL_CONST(39427.291781511522/8.0), REAL_CONST(39446.081221652174/8.0), REAL_CONST(39464.872899563372/8.0), REAL_CONST(39483.666814712291/8.0), REAL_CONST(39502.462966566411/8.0), REAL_CONST(39521.261354593538/8.0), REAL_CONST(39540.06197826178/8.0), REAL_CONST(39558.864837039568/8.0), REAL_CONST(39577.669930395656/8.0), REAL_CONST(39596.47725779911/8.0), REAL_CONST(39615.286818719302/8.0), REAL_CONST(39634.098612625923/8.0), REAL_CONST(39652.912638988993/8.0), REAL_CONST(39671.728897278823/8.0), REAL_CONST(39690.547386966064/8.0), REAL_CONST(39709.368107521652/8.0), REAL_CONST(39728.191058416858/8.0), REAL_CONST(39747.016239123259/8.0), REAL_CONST(39765.84364911275/8.0), REAL_CONST(39784.673287857528/8.0), REAL_CONST(39803.505154830105/8.0), REAL_CONST(39822.339249503319/8.0), REAL_CONST(39841.175571350293/8.0), REAL_CONST(39860.014119844491/8.0), REAL_CONST(39878.854894459677/8.0), REAL_CONST(39897.697894669909/8.0), REAL_CONST(39916.54311994958/8.0), REAL_CONST(39935.390569773372/8.0), REAL_CONST(39954.240243616303/8.0), REAL_CONST(39973.092140953675/8.0), REAL_CONST(39991.946261261117/8.0), REAL_CONST(40010.802604014549/8.0), REAL_CONST(40029.661168690225/8.0), REAL_CONST(40048.521954764678/8.0), REAL_CONST(40067.384961714779/8.0), REAL_CONST(40086.250189017679/8.0), REAL_CONST(40105.117636150855/8.0), REAL_CONST(40123.98730259209/8.0), REAL_CONST(40142.859187819471/8.0), REAL_CONST(40161.733291311379/8.0), REAL_CONST(40180.609612546526/8.0), REAL_CONST(40199.488151003912/8.0), REAL_CONST(40218.368906162854/8.0), REAL_CONST(40237.25187750296/8.0), REAL_CONST(40256.137064504153/8.0), REAL_CONST(40275.024466646668/8.0), REAL_CONST(40293.914083411029/8.0), REAL_CONST(40312.805914278084/8.0), REAL_CONST(40331.699958728961/8.0), REAL_CONST(40350.596216245103/8.0), REAL_CONST(40369.494686308273/8.0), REAL_CONST(40388.39536840051/8.0), REAL_CONST(40407.298262004173/8.0), REAL_CONST(40426.20336660192/8.0), REAL_CONST(40445.110681676706/8.0), REAL_CONST(40464.020206711793/8.0), REAL_CONST(40482.931941190756/8.0), REAL_CONST(40501.845884597446/8.0), REAL_CONST(40520.762036416032/8.0), REAL_CONST(40539.680396130985/8.0), REAL_CONST(40558.600963227072/8.0), REAL_CONST(40577.523737189367/8.0), REAL_CONST(40596.448717503234/8.0), REAL_CONST(40615.375903654342/8.0), REAL_CONST(40634.305295128659/8.0), REAL_CONST(40653.236891412453/8.0), REAL_CONST(40672.170691992294/8.0), REAL_CONST(40691.106696355047/8.0), REAL_CONST(40710.044903987873/8.0), REAL_CONST(40728.985314378238/8.0), REAL_CONST(40747.927927013901/8.0), REAL_CONST(40766.872741382918/8.0), REAL_CONST(40785.819756973651/8.0), REAL_CONST(40804.768973274746/8.0), REAL_CONST(40823.720389775161/8.0), REAL_CONST(40842.674005964131/8.0), REAL_CONST(40861.629821331211/8.0), REAL_CONST(40880.587835366234/8.0), REAL_CONST(40899.548047559321/8.0), REAL_CONST(40918.510457400931/8.0), REAL_CONST(40937.475064381761/8.0), REAL_CONST(40956.441867992849/8.0), REAL_CONST(40975.410867725499/8.0), REAL_CONST(40994.382063071331/8.0), REAL_CONST(41013.355453522236/8.0), REAL_CONST(41032.331038570417/8.0), REAL_CONST(41051.308817708363/8.0), REAL_CONST(41070.288790428858/8.0), REAL_CONST(41089.270956224987/8.0), REAL_CONST(41108.255314590111/8.0), REAL_CONST(41127.241865017888/8.0), REAL_CONST(41146.23060700229/8.0), REAL_CONST(41165.221540037543/8.0), REAL_CONST(41184.214663618193/8.0), REAL_CONST(41203.209977239079/8.0), REAL_CONST(41222.207480395307/8.0), REAL_CONST(41241.207172582297/8.0), REAL_CONST(41260.209053295752/8.0), REAL_CONST(41279.213122031659/8.0), REAL_CONST(41298.219378286303/8.0), REAL_CONST(41317.227821556255/8.0), REAL_CONST(41336.23845133838/8.0), REAL_CONST(41355.251267129832/8.0), REAL_CONST(41374.266268428037/8.0), REAL_CONST(41393.283454730743/8.0), REAL_CONST(41412.302825535953/8.0), REAL_CONST(41431.324380341983/8.0), REAL_CONST(41450.348118647416/8.0), REAL_CONST(41469.374039951144/8.0), REAL_CONST(41488.402143752326/8.0), REAL_CONST(41507.432429550427/8.0), REAL_CONST(41526.464896845187/8.0), REAL_CONST(41545.499545136627/8.0), REAL_CONST(41564.536373925075/8.0), REAL_CONST(41583.575382711126/8.0), REAL_CONST(41602.616570995662/8.0), REAL_CONST(41621.659938279874/8.0), REAL_CONST(41640.705484065205/8.0), REAL_CONST(41659.753207853406/8.0), REAL_CONST(41678.803109146495/8.0), REAL_CONST(41697.855187446803/8.0), REAL_CONST(41716.909442256911/8.0), REAL_CONST(41735.965873079709/8.0), REAL_CONST(41755.02447941836/8.0), REAL_CONST(41774.085260776315/8.0), REAL_CONST(41793.148216657297/8.0), REAL_CONST(41812.213346565331/8.0), REAL_CONST(41831.280650004708/8.0), REAL_CONST(41850.350126480014/8.0), REAL_CONST(41869.421775496106/8.0), REAL_CONST(41888.495596558132/8.0), REAL_CONST(41907.571589171515/8.0), REAL_CONST(41926.649752841957/8.0), REAL_CONST(41945.730087075463/8.0), REAL_CONST(41964.812591378286/8.0), REAL_CONST(41983.897265256979/8.0), REAL_CONST(42002.984108218378/8.0), REAL_CONST(42022.073119769593/8.0), REAL_CONST(42041.164299418015/8.0), REAL_CONST(42060.257646671307/8.0), REAL_CONST(42079.353161037419/8.0), REAL_CONST(42098.450842024591/8.0), REAL_CONST(42117.550689141324/8.0), REAL_CONST(42136.652701896404/8.0), REAL_CONST(42155.756879798893/8.0), REAL_CONST(42174.863222358137/8.0), REAL_CONST(42193.971729083758/8.0), REAL_CONST(42213.082399485655/8.0), REAL_CONST(42232.195233074002/8.0), REAL_CONST(42251.310229359246/8.0), REAL_CONST(42270.427387852127/8.0), REAL_CONST(42289.546708063644/8.0), REAL_CONST(42308.668189505079/8.0), REAL_CONST(42327.791831687995/8.0), REAL_CONST(42346.917634124227/8.0), REAL_CONST(42366.045596325886/8.0), REAL_CONST(42385.175717805352/8.0), REAL_CONST(42404.307998075295/8.0), REAL_CONST(42423.442436648642/8.0), REAL_CONST(42442.579033038608/8.0), REAL_CONST(42461.717786758672/8.0), REAL_CONST(42480.858697322597/8.0), REAL_CONST(42500.001764244422/8.0), REAL_CONST(42519.146987038446/8.0), REAL_CONST(42538.294365219248/8.0), REAL_CONST(42557.443898301688/8.0), REAL_CONST(42576.595585800882/8.0), REAL_CONST(42595.749427232236/8.0), REAL_CONST(42614.90542211142/8.0), REAL_CONST(42634.063569954378/8.0), REAL_CONST(42653.223870277317/8.0), REAL_CONST(42672.386322596729/8.0), REAL_CONST(42691.55092642938/8.0), REAL_CONST(42710.717681292292/8.0), REAL_CONST(42729.886586702756/8.0), REAL_CONST(42749.057642178363/8.0), REAL_CONST(42768.23084723694/8.0), REAL_CONST(42787.406201396603/8.0), REAL_CONST(42806.58370417574/8.0), REAL_CONST(42825.76335509299/8.0), REAL_CONST(42844.945153667286/8.0), REAL_CONST(42864.129099417805/8.0), REAL_CONST(42883.315191864014/8.0), REAL_CONST(42902.503430525649/8.0), REAL_CONST(42921.693814922692/8.0), REAL_CONST(42940.88634457541/8.0), REAL_CONST(42960.081019004348/8.0), REAL_CONST(42979.277837730297/8.0), REAL_CONST(42998.476800274322/8.0), REAL_CONST(43017.677906157769/8.0), REAL_CONST(43036.881154902228/8.0), REAL_CONST(43056.086546029583/8.0), REAL_CONST(43075.294079061961/8.0), REAL_CONST(43094.503753521763/8.0), REAL_CONST(43113.715568931671/8.0), REAL_CONST(43132.929524814601/8.0), REAL_CONST(43152.145620693766/8.0), REAL_CONST(43171.363856092619/8.0), REAL_CONST(43190.584230534907/8.0), REAL_CONST(43209.806743544621/8.0), REAL_CONST(43229.031394646016/8.0), REAL_CONST(43248.258183363621/8.0), REAL_CONST(43267.487109222224/8.0), REAL_CONST(43286.718171746885/8.0), REAL_CONST(43305.951370462906/8.0), REAL_CONST(43325.186704895881/8.0), REAL_CONST(43344.42417457165/8.0), REAL_CONST(43363.663779016322/8.0), REAL_CONST(43382.905517756262/8.0), REAL_CONST(43402.149390318104/8.0), REAL_CONST(43421.395396228749/8.0), REAL_CONST(43440.643535015348/8.0), REAL_CONST(43459.89380620532/8.0), REAL_CONST(43479.146209326354/8.0), REAL_CONST(43498.400743906379/8.0), REAL_CONST(43517.657409473606/8.0), REAL_CONST(43536.916205556496/8.0), REAL_CONST(43556.177131683784/8.0), REAL_CONST(43575.44018738444/8.0), REAL_CONST(43594.705372187724/8.0), REAL_CONST(43613.972685623135/8.0), REAL_CONST(43633.242127220445/8.0), REAL_CONST(43652.513696509668/8.0), REAL_CONST(43671.787393021099/8.0), REAL_CONST(43691.063216285271/8.0), REAL_CONST(43710.341165833001/8.0), REAL_CONST(43729.621241195346/8.0), REAL_CONST(43748.903441903625/8.0), REAL_CONST(43768.187767489413/8.0), REAL_CONST(43787.474217484552/8.0), REAL_CONST(43806.762791421126/8.0), REAL_CONST(43826.053488831501/8.0), REAL_CONST(43845.346309248278/8.0), REAL_CONST(43864.641252204325/8.0), REAL_CONST(43883.938317232765/8.0), REAL_CONST(43903.237503866971/8.0), REAL_CONST(43922.538811640596/8.0), REAL_CONST(43941.842240087513/8.0), REAL_CONST(43961.147788741881/8.0), REAL_CONST(43980.455457138101/8.0), REAL_CONST(43999.765244810835/8.0), REAL_CONST(44019.077151295001/8.0), REAL_CONST(44038.391176125755/8.0), REAL_CONST(44057.70731883854/8.0), REAL_CONST(44077.02557896902/8.0), REAL_CONST(44096.345956053141/8.0), REAL_CONST(44115.668449627083/8.0), REAL_CONST(44134.993059227287/8.0), REAL_CONST(44154.319784390456/8.0), REAL_CONST(44173.648624653535/8.0), REAL_CONST(44192.979579553728/8.0), REAL_CONST(44212.312648628489/8.0), REAL_CONST(44231.647831415532/8.0), REAL_CONST(44250.985127452805/8.0), REAL_CONST(44270.324536278538/8.0), REAL_CONST(44289.666057431183/8.0), REAL_CONST(44309.009690449464/8.0), REAL_CONST(44328.355434872348/8.0), REAL_CONST(44347.703290239064/8.0), REAL_CONST(44367.053256089079/8.0), REAL_CONST(44386.405331962109/8.0), REAL_CONST(44405.759517398139/8.0), REAL_CONST(44425.115811937387/8.0), REAL_CONST(44444.474215120332/8.0), REAL_CONST(44463.834726487694/8.0), REAL_CONST(44483.197345580462/8.0), REAL_CONST(44502.562071939843/8.0), REAL_CONST(44521.928905107328/8.0), REAL_CONST(44541.297844624634/8.0), REAL_CONST(44560.668890033732/8.0), REAL_CONST(44580.042040876848/8.0), REAL_CONST(44599.417296696454/8.0), REAL_CONST(44618.794657035272/8.0), REAL_CONST(44638.174121436256/8.0), REAL_CONST(44657.555689442641/8.0), REAL_CONST(44676.939360597877/8.0), REAL_CONST(44696.325134445673/8.0), REAL_CONST(44715.713010530002/8.0), REAL_CONST(44735.102988395054/8.0), REAL_CONST(44754.495067585296/8.0), REAL_CONST(44773.88924764542/8.0), REAL_CONST(44793.285528120374/8.0), REAL_CONST(44812.683908555344/8.0), REAL_CONST(44832.084388495779/8.0), REAL_CONST(44851.486967487363/8.0), REAL_CONST(44870.891645076015/8.0), REAL_CONST(44890.298420807922/8.0), REAL_CONST(44909.707294229491/8.0), REAL_CONST(44929.118264887409/8.0), REAL_CONST(44948.531332328566/8.0), REAL_CONST(44967.946496100136/8.0), REAL_CONST(44987.363755749502/8.0), REAL_CONST(45006.783110824319/8.0), REAL_CONST(45026.204560872473/8.0), REAL_CONST(45045.628105442098/8.0), REAL_CONST(45065.053744081561/8.0), REAL_CONST(45084.48147633949/8.0), REAL_CONST(45103.911301764747/8.0), REAL_CONST(45123.343219906426/8.0), REAL_CONST(45142.777230313885/8.0), REAL_CONST(45162.21333253671/8.0), REAL_CONST(45181.651526124733/8.0), REAL_CONST(45201.091810628037/8.0), REAL_CONST(45220.534185596924/8.0), REAL_CONST(45239.978650581965/8.0), REAL_CONST(45259.425205133957/8.0), REAL_CONST(45278.873848803938/8.0), REAL_CONST(45298.324581143192/8.0), REAL_CONST(45317.777401703235/8.0), REAL_CONST(45337.232310035848/8.0), REAL_CONST(45356.68930569302/8.0), REAL_CONST(45376.148388226997/8.0), REAL_CONST(45395.60955719027/8.0), REAL_CONST(45415.072812135557/8.0), REAL_CONST(45434.538152615823/8.0), REAL_CONST(45454.005578184282/8.0), REAL_CONST(45473.475088394356/8.0), REAL_CONST(45492.946682799746/8.0), REAL_CONST(45512.420360954362/8.0), REAL_CONST(45531.896122412363/8.0), REAL_CONST(45551.373966728155/8.0), REAL_CONST(45570.853893456362/8.0), REAL_CONST(45590.33590215187/8.0), REAL_CONST(45609.819992369776/8.0), REAL_CONST(45629.306163665438/8.0), REAL_CONST(45648.794415594442/8.0), REAL_CONST(45668.284747712612/8.0), REAL_CONST(45687.777159576006/8.0), REAL_CONST(45707.27165074092/8.0), REAL_CONST(45726.768220763894/8.0), REAL_CONST(45746.266869201696/8.0), REAL_CONST(45765.767595611323/8.0), REAL_CONST(45785.270399550034/8.0), REAL_CONST(45804.775280575297/8.0), REAL_CONST(45824.282238244828/8.0), REAL_CONST(45843.79127211657/8.0), REAL_CONST(45863.302381748719/8.0), REAL_CONST(45882.815566699683/8.0), REAL_CONST(45902.33082652813/8.0), REAL_CONST(45921.848160792935/8.0), REAL_CONST(45941.367569053225/8.0), REAL_CONST(45960.889050868354/8.0), REAL_CONST(45980.41260579793/8.0), REAL_CONST(45999.938233401757/8.0), REAL_CONST(46019.465933239902/8.0), REAL_CONST(46038.995704872657/8.0), REAL_CONST(46058.527547860547/8.0), REAL_CONST(46078.06146176433/8.0), REAL_CONST(46097.597446144995/8.0), REAL_CONST(46117.135500563774/8.0), REAL_CONST(46136.675624582109/8.0), REAL_CONST(46156.217817761702/8.0), REAL_CONST(46175.762079664462/8.0), REAL_CONST(46195.308409852543/8.0), REAL_CONST(46214.856807888333/8.0), REAL_CONST(46234.407273334444/8.0), REAL_CONST(46253.959805753715/8.0), REAL_CONST(46273.51440470924/8.0), REAL_CONST(46293.071069764315/8.0), REAL_CONST(46312.629800482478/8.0), REAL_CONST(46332.190596427499/8.0), REAL_CONST(46351.753457163381/8.0), REAL_CONST(46371.318382254351/8.0), REAL_CONST(46390.885371264863/8.0), REAL_CONST(46410.45442375962/8.0), REAL_CONST(46430.025539303526/8.0), REAL_CONST(46449.598717461733/8.0), REAL_CONST(46469.17395779962/8.0), REAL_CONST(46488.751259882782/8.0), REAL_CONST(46508.33062327707/8.0), REAL_CONST(46527.912047548532/8.0), REAL_CONST(46547.495532263471/8.0), REAL_CONST(46567.081076988397/8.0), REAL_CONST(46586.668681290059/8.0), REAL_CONST(46606.258344735434/8.0), REAL_CONST(46625.850066891719/8.0), REAL_CONST(46645.443847326351/8.0), REAL_CONST(46665.039685606986/8.0), REAL_CONST(46684.637581301497/8.0), REAL_CONST(46704.237533978005/8.0), REAL_CONST(46723.839543204842/8.0), REAL_CONST(46743.443608550573/8.0), REAL_CONST(46763.049729583989/8.0), REAL_CONST(46782.657905874104/8.0), REAL_CONST(46802.268136990162/8.0), REAL_CONST(46821.880422501628/8.0), REAL_CONST(46841.494761978196/8.0), REAL_CONST(46861.111154989776/8.0), REAL_CONST(46880.729601106526/8.0), REAL_CONST(46900.350099898795/8.0), REAL_CONST(46919.97265093719/8.0), REAL_CONST(46939.597253792526/8.0), REAL_CONST(46959.223908035841/8.0), REAL_CONST(46978.852613238392/8.0), REAL_CONST(46998.483368971691/8.0), REAL_CONST(47018.11617480743/8.0), REAL_CONST(47037.751030317551/8.0), REAL_CONST(47057.387935074221/8.0), REAL_CONST(47077.026888649809/8.0), REAL_CONST(47096.66789061694/8.0), REAL_CONST(47116.310940548428/8.0), REAL_CONST(47135.956038017328/8.0), REAL_CONST(47155.603182596918/8.0), REAL_CONST(47175.252373860698/8.0), REAL_CONST(47194.903611382375/8.0), REAL_CONST(47214.556894735892/8.0), REAL_CONST(47234.212223495422/8.0), REAL_CONST(47253.869597235338/8.0), REAL_CONST(47273.52901553025/8.0), REAL_CONST(47293.19047795498/8.0), REAL_CONST(47312.853984084577/8.0), REAL_CONST(47332.519533494306/8.0), REAL_CONST(47352.187125759658/8.0), REAL_CONST(47371.856760456343/8.0), REAL_CONST(47391.528437160297/8.0), REAL_CONST(47411.202155447652/8.0), REAL_CONST(47430.877914894787/8.0), REAL_CONST(47450.555715078299/8.0), REAL_CONST(47470.235555574982/8.0), REAL_CONST(47489.917435961863/8.0), REAL_CONST(47509.601355816201/8.0), REAL_CONST(47529.287314715453/8.0), REAL_CONST(47548.975312237308/8.0), REAL_CONST(47568.665347959672/8.0), REAL_CONST(47588.357421460656/8.0), REAL_CONST(47608.051532318605/8.0), REAL_CONST(47627.747680112072/8.0), REAL_CONST(47647.445864419846/8.0), REAL_CONST(47667.14608482091/8.0), REAL_CONST(47686.848340894474/8.0), REAL_CONST(47706.552632219973/8.0), REAL_CONST(47726.258958377046/8.0), REAL_CONST(47745.967318945557/8.0), REAL_CONST(47765.677713505589/8.0), REAL_CONST(47785.390141637428/8.0), REAL_CONST(47805.104602921601/8.0), REAL_CONST(47824.821096938824/8.0), REAL_CONST(47844.539623270044/8.0), REAL_CONST(47864.260181496429/8.0), REAL_CONST(47883.982771199349/8.0), REAL_CONST(47903.707391960394/8.0), REAL_CONST(47923.434043361369/8.0), REAL_CONST(47943.162724984308/8.0), REAL_CONST(47962.893436411439/8.0), REAL_CONST(47982.626177225218/8.0), REAL_CONST(48002.36094700831/8.0), REAL_CONST(48022.097745343599/8.0), REAL_CONST(48041.836571814172/8.0), REAL_CONST(48061.57742600335/8.0), REAL_CONST(48081.32030749465/8.0), REAL_CONST(48101.065215871815/8.0), REAL_CONST(48120.81215071879/8.0), REAL_CONST(48140.56111161974/8.0), REAL_CONST(48160.312098159047/8.0), REAL_CONST(48180.065109921306/8.0), REAL_CONST(48199.820146491307/8.0), REAL_CONST(48219.577207454073/8.0), REAL_CONST(48239.336292394844/8.0), REAL_CONST(48259.097400899045/8.0), REAL_CONST(48278.860532552339/8.0), REAL_CONST(48298.625686940592/8.0), REAL_CONST(48318.392863649875/8.0), REAL_CONST(48338.162062266485/8.0), REAL_CONST(48357.933282376915/8.0), REAL_CONST(48377.706523567889/8.0), REAL_CONST(48397.481785426316/8.0), REAL_CONST(48417.259067539344/8.0), REAL_CONST(48437.038369494308/8.0), REAL_CONST(48456.819690878765/8.0), REAL_CONST(48476.603031280487/8.0), REAL_CONST(48496.388390287451/8.0), REAL_CONST(48516.175767487839/8.0), REAL_CONST(48535.965162470042/8.0), REAL_CONST(48555.756574822684/8.0), REAL_CONST(48575.550004134566/8.0), REAL_CONST(48595.345449994718/8.0), REAL_CONST(48615.142911992378/8.0), REAL_CONST(48634.942389716991/8.0), REAL_CONST(48654.743882758201/8.0), REAL_CONST(48674.547390705877/8.0), REAL_CONST(48694.352913150084/8.0), REAL_CONST(48714.160449681112/8.0), REAL_CONST(48733.969999889443/8.0), REAL_CONST(48753.781563365759/8.0), REAL_CONST(48773.595139700978/8.0), REAL_CONST(48793.410728486211/8.0), REAL_CONST(48813.228329312769/8.0), REAL_CONST(48833.047941772187/8.0), REAL_CONST(48852.869565456189/8.0), REAL_CONST(48872.693199956717/8.0), REAL_CONST(48892.518844865925/8.0), REAL_CONST(48912.346499776155/8.0), REAL_CONST(48932.176164279976/8.0), REAL_CONST(48952.007837970152/8.0), REAL_CONST(48971.841520439666/8.0), REAL_CONST(48991.677211281676/8.0), REAL_CONST(49011.514910089587/8.0), REAL_CONST(49031.354616456978/8.0), REAL_CONST(49051.196329977654/8.0), REAL_CONST(49071.04005024561/8.0), REAL_CONST(49090.885776855059/8.0), REAL_CONST(49110.733509400408/8.0), REAL_CONST(49130.583247476279/8.0), REAL_CONST(49150.434990677488/8.0), REAL_CONST(49170.288738599062/8.0), REAL_CONST(49190.144490836232/8.0), REAL_CONST(49210.002246984441/8.0), REAL_CONST(49229.86200663932/8.0), REAL_CONST(49249.723769396718/8.0), REAL_CONST(49269.587534852675/8.0), REAL_CONST(49289.453302603448/8.0), REAL_CONST(49309.32107224549/8.0), REAL_CONST(49329.190843375451/8.0), REAL_CONST(49349.062615590192/8.0), REAL_CONST(49368.936388486785/8.0), REAL_CONST(49388.812161662492/8.0), REAL_CONST(49408.689934714785/8.0), REAL_CONST(49428.569707241324/8.0), REAL_CONST(49448.45147883999/8.0), REAL_CONST(49468.335249108866/8.0), REAL_CONST(49488.22101764621/8.0), REAL_CONST(49508.108784050521/8.0), REAL_CONST(49527.99854792047/8.0), REAL_CONST(49547.890308854934/8.0), REAL_CONST(49567.784066453009/8.0), REAL_CONST(49587.679820313977/8.0), REAL_CONST(49607.57757003732/8.0), REAL_CONST(49627.477315222721/8.0), REAL_CONST(49647.379055470075/8.0), REAL_CONST(49667.28279037946/8.0), REAL_CONST(49687.188519551179/8.0), REAL_CONST(49707.096242585707/8.0), REAL_CONST(49727.005959083741/8.0), REAL_CONST(49746.917668646165/8.0), REAL_CONST(49766.831370874068/8.0), REAL_CONST(49786.747065368734/8.0), REAL_CONST(49806.66475173166/8.0), REAL_CONST(49826.584429564515/8.0), REAL_CONST(49846.506098469203/8.0), REAL_CONST(49866.429758047794/8.0), REAL_CONST(49886.355407902578/8.0), REAL_CONST(49906.283047636032/8.0), REAL_CONST(49926.212676850846/8.0), REAL_CONST(49946.144295149883/8.0), REAL_CONST(49966.077902136225/8.0), REAL_CONST(49986.013497413151/8.0), REAL_CONST(50005.951080584135/8.0), REAL_CONST(50025.890651252834/8.0), REAL_CONST(50045.832209023123/8.0), REAL_CONST(50065.775753499074/8.0), REAL_CONST(50085.721284284933/8.0), REAL_CONST(50105.668800985164/8.0), REAL_CONST(50125.618303204428/8.0), REAL_CONST(50145.569790547575/8.0), REAL_CONST(50165.523262619652/8.0), REAL_CONST(50185.478719025901/8.0), REAL_CONST(50205.436159371769/8.0), REAL_CONST(50225.395583262893/8.0), REAL_CONST(50245.356990305103/8.0), REAL_CONST(50265.320380104429/8.0), REAL_CONST(50285.285752267104/8.0), REAL_CONST(50305.253106399534/8.0), REAL_CONST(50325.222442108337/8.0), REAL_CONST(50345.193759000336/8.0), REAL_CONST(50365.16705668252/8.0), REAL_CONST(50385.142334762102/8.0), REAL_CONST(50405.119592846473/8.0), REAL_CONST(50425.098830543218/8.0), REAL_CONST(50445.080047460127/8.0), REAL_CONST(50465.063243205179/8.0), REAL_CONST(50485.048417386541/8.0), REAL_CONST(50505.035569612577/8.0), REAL_CONST(50525.024699491856/8.0), REAL_CONST(50545.015806633128/8.0), REAL_CONST(50565.008890645338/8.0), REAL_CONST(50585.003951137631/8.0), REAL_CONST(50605.00098771933/8.0), REAL_CONST(50624.999999999971/8.0), REAL_CONST(50645.000987589265/8.0), REAL_CONST(50665.003950097132/8.0), REAL_CONST(50685.008887133677/8.0), REAL_CONST(50705.015798309192/8.0), REAL_CONST(50725.024683234165/8.0), REAL_CONST(50745.035541519283/8.0), REAL_CONST(50765.048372775411/8.0), REAL_CONST(50785.063176613621/8.0), REAL_CONST(50805.079952645159/8.0), REAL_CONST(50825.098700481489/8.0), REAL_CONST(50845.119419734241/8.0), REAL_CONST(50865.142110015244/8.0), REAL_CONST(50885.166770936521/8.0), REAL_CONST(50905.193402110279/8.0), REAL_CONST(50925.222003148934/8.0), REAL_CONST(50945.252573665071/8.0), REAL_CONST(50965.285113271471/8.0), REAL_CONST(50985.319621581119/8.0), REAL_CONST(51005.356098207172/8.0), REAL_CONST(51025.394542762981/8.0), REAL_CONST(51045.434954862096/8.0), REAL_CONST(51065.477334118244/8.0), REAL_CONST(51085.521680145357/8.0), REAL_CONST(51105.567992557546/8.0), REAL_CONST(51125.616270969113/8.0), REAL_CONST(51145.66651499454/8.0), REAL_CONST(51165.718724248516/8.0), REAL_CONST(51185.772898345916/8.0), REAL_CONST(51205.829036901778/8.0), REAL_CONST(51225.887139531362/8.0), REAL_CONST(51245.947205850105/8.0), REAL_CONST(51266.009235473619/8.0), REAL_CONST(51286.073228017718/8.0), REAL_CONST(51306.139183098399/8.0), REAL_CONST(51326.207100331856/8.0), REAL_CONST(51346.276979334456/8.0), REAL_CONST(51366.348819722756/8.0), REAL_CONST(51386.42262111351/8.0), REAL_CONST(51406.498383123653/8.0), REAL_CONST(51426.57610537031/8.0), REAL_CONST(51446.655787470787/8.0), REAL_CONST(51466.737429042587/8.0), REAL_CONST(51486.82102970338/8.0), REAL_CONST(51506.906589071048/8.0), REAL_CONST(51526.994106763632/8.0), REAL_CONST(51547.083582399391/8.0), REAL_CONST(51567.175015596738/8.0), REAL_CONST(51587.268405974297/8.0), REAL_CONST(51607.363753150858/8.0), REAL_CONST(51627.461056745415/8.0), REAL_CONST(51647.56031637713/8.0), REAL_CONST(51667.661531665362/8.0), REAL_CONST(51687.764702229651/8.0), REAL_CONST(51707.869827689727/8.0), REAL_CONST(51727.976907665499/8.0), REAL_CONST(51748.085941777055/8.0), REAL_CONST(51768.196929644677/8.0), REAL_CONST(51788.309870888836/8.0), REAL_CONST(51808.42476513017/8.0), REAL_CONST(51828.541611989524/8.0), REAL_CONST(51848.660411087905/8.0), REAL_CONST(51868.781162046515/8.0), REAL_CONST(51888.90386448674/8.0), REAL_CONST(51909.028518030143/8.0), REAL_CONST(51929.155122298485/8.0), REAL_CONST(51949.283676913685/8.0), REAL_CONST(51969.414181497872/8.0), REAL_CONST(51989.546635673345/8.0), REAL_CONST(52009.681039062583/8.0), REAL_CONST(52029.817391288263/8.0), REAL_CONST(52049.955691973213/8.0), REAL_CONST(52070.095940740481/8.0), REAL_CONST(52090.238137213273/8.0), REAL_CONST(52110.382281014987/8.0), REAL_CONST(52130.5283717692/8.0), REAL_CONST(52150.676409099666/8.0), REAL_CONST(52170.826392630333/8.0), REAL_CONST(52190.97832198532/8.0), REAL_CONST(52211.132196788931/8.0), REAL_CONST(52231.288016665654/8.0), REAL_CONST(52251.445781240145/8.0), REAL_CONST(52271.60549013727/8.0), REAL_CONST(52291.76714298204/8.0), REAL_CONST(52311.930739399664/8.0), REAL_CONST(52332.096279015546/8.0), REAL_CONST(52352.263761455244/8.0), REAL_CONST(52372.433186344519/8.0), REAL_CONST(52392.604553309284/8.0), REAL_CONST(52412.777861975665/8.0), REAL_CONST(52432.953111969946/8.0), REAL_CONST(52453.130302918595/8.0), REAL_CONST(52473.309434448267/8.0), REAL_CONST(52493.490506185793/8.0), REAL_CONST(52513.67351775818/8.0), REAL_CONST(52533.858468792605/8.0), REAL_CONST(52554.045358916446/8.0), REAL_CONST(52574.234187757254/8.0), REAL_CONST(52594.42495494274/8.0), REAL_CONST(52614.617660100812/8.0), REAL_CONST(52634.812302859558/8.0), REAL_CONST(52655.008882847229/8.0), REAL_CONST(52675.20739969227/8.0), REAL_CONST(52695.407853023295/8.0), REAL_CONST(52715.610242469098/8.0), REAL_CONST(52735.814567658657/8.0), REAL_CONST(52756.02082822111/8.0), REAL_CONST(52776.229023785803/8.0), REAL_CONST(52796.439153982225/8.0), REAL_CONST(52816.651218440056/8.0), REAL_CONST(52836.865216789171/8.0), REAL_CONST(52857.081148659599/8.0), REAL_CONST(52877.29901368155/8.0), REAL_CONST(52897.518811485425/8.0), REAL_CONST(52917.740541701773/8.0), REAL_CONST(52937.964203961354/8.0), REAL_CONST(52958.18979789508/8.0), REAL_CONST(52978.417323134046/8.0), REAL_CONST(52998.646779309529/8.0), REAL_CONST(53018.878166052978/8.0), REAL_CONST(53039.111482996006/8.0), REAL_CONST(53059.346729770419/8.0), REAL_CONST(53079.583906008193/8.0), REAL_CONST(53099.823011341483/8.0), REAL_CONST(53120.0640454026/8.0), REAL_CONST(53140.307007824063/8.0), REAL_CONST(53160.551898238533/8.0), REAL_CONST(53180.79871627887/8.0), REAL_CONST(53201.047461578091/8.0), REAL_CONST(53221.2981337694/8.0), REAL_CONST(53241.550732486176/8.0), REAL_CONST(53261.805257361964/8.0), REAL_CONST(53282.061708030487/8.0), REAL_CONST(53302.32008412564/8.0), REAL_CONST(53322.580385281493/8.0), REAL_CONST(53342.842611132299/8.0), REAL_CONST(53363.106761312469/8.0), REAL_CONST(53383.372835456597/8.0), REAL_CONST(53403.640833199453/8.0), REAL_CONST(53423.910754175973/8.0), REAL_CONST(53444.18259802126/8.0), REAL_CONST(53464.456364370613/8.0), REAL_CONST(53484.732052859479/8.0), REAL_CONST(53505.009663123499/8.0), REAL_CONST(53525.289194798468/8.0), REAL_CONST(53545.570647520362/8.0), REAL_CONST(53565.854020925333/8.0), REAL_CONST(53586.139314649699/8.0), REAL_CONST(53606.426528329954/8.0), REAL_CONST(53626.715661602764/8.0), REAL_CONST(53647.006714104959/8.0), REAL_CONST(53667.299685473547/8.0), REAL_CONST(53687.59457534572/8.0), REAL_CONST(53707.891383358816/8.0), REAL_CONST(53728.190109150361/8.0), REAL_CONST(53748.490752358055/8.0), REAL_CONST(53768.793312619753/8.0), REAL_CONST(53789.09778957349/8.0), REAL_CONST(53809.404182857485/8.0), REAL_CONST(53829.712492110106/8.0), REAL_CONST(53850.022716969899/8.0), REAL_CONST(53870.334857075584/8.0), REAL_CONST(53890.648912066055/8.0), REAL_CONST(53910.964881580367/8.0), REAL_CONST(53931.28276525774/8.0), REAL_CONST(53951.602562737586/8.0), REAL_CONST(53971.924273659461/8.0), REAL_CONST(53992.24789766311/8.0), REAL_CONST(54012.57343438844/8.0), REAL_CONST(54032.90088347553/8.0), REAL_CONST(54053.23024456462/8.0), REAL_CONST(54073.561517296133/8.0), REAL_CONST(54093.894701310644/8.0), REAL_CONST(54114.22979624891/8.0), REAL_CONST(54134.566801751855/8.0), REAL_CONST(54154.90571746057/8.0), REAL_CONST(54175.246543016314/8.0), REAL_CONST(54195.589278060506/8.0), REAL_CONST(54215.933922234755/8.0), REAL_CONST(54236.280475180814/8.0), REAL_CONST(54256.628936540626/8.0), REAL_CONST(54276.97930595628/8.0), REAL_CONST(54297.331583070045/8.0), REAL_CONST(54317.685767524359/8.0), REAL_CONST(54338.041858961828/8.0), REAL_CONST(54358.399857025215/8.0), REAL_CONST(54378.759761357462/8.0), REAL_CONST(54399.121571601667/8.0), REAL_CONST(54419.485287401105/8.0), REAL_CONST(54439.850908399218/8.0), REAL_CONST(54460.218434239614/8.0), REAL_CONST(54480.587864566056/8.0), REAL_CONST(54500.95919902248/8.0), REAL_CONST(54521.332437252997/8.0), REAL_CONST(54541.707578901878/8.0), REAL_CONST(54562.084623613555/8.0), REAL_CONST(54582.46357103264/8.0), REAL_CONST(54602.844420803893/8.0), REAL_CONST(54623.227172572246/8.0), REAL_CONST(54643.611825982807/8.0), REAL_CONST(54663.998380680838/8.0), REAL_CONST(54684.386836311773/8.0), REAL_CONST(54704.777192521207/8.0), REAL_CONST(54725.169448954897/8.0), REAL_CONST(54745.563605258772/8.0), REAL_CONST(54765.959661078923/8.0), REAL_CONST(54786.357616061614/8.0), REAL_CONST(54806.757469853255/8.0), REAL_CONST(54827.159222100439/8.0), REAL_CONST(54847.562872449904/8.0), REAL_CONST(54867.968420548583/8.0), REAL_CONST(54888.375866043534/8.0), REAL_CONST(54908.785208582012/8.0), REAL_CONST(54929.196447811417/8.0), REAL_CONST(54949.609583379322/8.0), REAL_CONST(54970.024614933463/8.0), REAL_CONST(54990.441542121727/8.0), REAL_CONST(55010.86036459219/8.0), REAL_CONST(55031.28108199306/8.0), REAL_CONST(55051.703693972733/8.0), REAL_CONST(55072.128200179759/8.0), REAL_CONST(55092.554600262847/8.0), REAL_CONST(55112.982893870874/8.0), REAL_CONST(55133.413080652877/8.0), REAL_CONST(55153.845160258061/8.0), REAL_CONST(55174.279132335789/8.0), REAL_CONST(55194.714996535586/8.0), REAL_CONST(55215.152752507143/8.0), REAL_CONST(55235.592399900306/8.0), REAL_CONST(55256.033938365079/8.0), REAL_CONST(55276.477367551655/8.0), REAL_CONST(55296.92268711036/8.0), REAL_CONST(55317.369896691685/8.0), REAL_CONST(55337.818995946305/8.0), REAL_CONST(55358.269984525024/8.0), REAL_CONST(55378.72286207883/8.0), REAL_CONST(55399.177628258869/8.0), REAL_CONST(55419.634282716441/8.0), REAL_CONST(55440.092825103013/8.0), REAL_CONST(55460.553255070205/8.0), REAL_CONST(55481.015572269804/8.0), REAL_CONST(55501.479776353764/8.0), REAL_CONST(55521.945866974187/8.0), REAL_CONST(55542.413843783339/8.0), REAL_CONST(55562.883706433655/8.0), REAL_CONST(55583.355454577715/8.0), REAL_CONST(55603.82908786826/8.0), REAL_CONST(55624.304605958219/8.0), REAL_CONST(55644.782008500639/8.0), REAL_CONST(55665.261295148754/8.0), REAL_CONST(55685.742465555952/8.0), REAL_CONST(55706.225519375774/8.0), REAL_CONST(55726.710456261928/8.0), REAL_CONST(55747.197275868275/8.0), REAL_CONST(55767.685977848843/8.0), REAL_CONST(55788.176561857814/8.0), REAL_CONST(55808.669027549528/8.0), REAL_CONST(55829.163374578478/8.0), REAL_CONST(55849.659602599328/8.0), REAL_CONST(55870.157711266889/8.0), REAL_CONST(55890.657700236145/8.0), REAL_CONST(55911.159569162221/8.0), REAL_CONST(55931.663317700411/8.0), REAL_CONST(55952.168945506164/8.0), REAL_CONST(55972.676452235086/8.0), REAL_CONST(55993.185837542944/8.0), REAL_CONST(56013.697101085651/8.0), REAL_CONST(56034.210242519301/8.0), REAL_CONST(56054.72526150012/8.0), REAL_CONST(56075.242157684508/8.0), REAL_CONST(56095.760930729011/8.0), REAL_CONST(56116.281580290342/8.0), REAL_CONST(56136.804106025367/8.0), REAL_CONST(56157.328507591104/8.0), REAL_CONST(56177.85478464474/8.0), REAL_CONST(56198.382936843598/8.0), REAL_CONST(56218.912963845185/8.0), REAL_CONST(56239.444865307138/8.0), REAL_CONST(56259.978640887268/8.0), REAL_CONST(56280.514290243525/8.0), REAL_CONST(56301.051813034042/8.0), REAL_CONST(56321.591208917082/8.0), REAL_CONST(56342.13247755108/8.0), REAL_CONST(56362.675618594607/8.0), REAL_CONST(56383.220631706419/8.0), REAL_CONST(56403.767516545398/8.0), REAL_CONST(56424.316272770608/8.0), REAL_CONST(56444.866900041241/8.0), REAL_CONST(56465.419398016667/8.0), REAL_CONST(56485.973766356394/8.0), REAL_CONST(56506.530004720102/8.0), REAL_CONST(56527.088112767611/8.0), REAL_CONST(56547.648090158902/8.0), REAL_CONST(56568.209936554107/8.0), REAL_CONST(56588.773651613519/8.0), REAL_CONST(56609.339234997584/8.0), REAL_CONST(56629.9066863669/8.0), REAL_CONST(56650.47600538221/8.0), REAL_CONST(56671.04719170442/8.0), REAL_CONST(56691.620244994599/8.0), REAL_CONST(56712.195164913959/8.0), REAL_CONST(56732.771951123868/8.0), REAL_CONST(56753.350603285835/8.0), REAL_CONST(56773.931121061541/8.0), REAL_CONST(56794.513504112823/8.0), REAL_CONST(56815.097752101647/8.0), REAL_CONST(56835.683864690152/8.0), REAL_CONST(56856.271841540627/8.0), REAL_CONST(56876.86168231551/8.0), REAL_CONST(56897.453386677393/8.0), REAL_CONST(56918.046954289028/8.0), REAL_CONST(56938.642384813298/8.0), REAL_CONST(56959.239677913261/8.0), REAL_CONST(56979.838833252121/8.0), REAL_CONST(57000.439850493225/8.0), REAL_CONST(57021.04272930009/8.0), REAL_CONST(57041.647469336371/8.0), REAL_CONST(57062.254070265873/8.0), REAL_CONST(57082.862531752558/8.0), REAL_CONST(57103.472853460553/8.0), REAL_CONST(57124.085035054108/8.0), REAL_CONST(57144.699076197649/8.0), REAL_CONST(57165.314976555739/8.0), REAL_CONST(57185.932735793103/8.0), REAL_CONST(57206.552353574611/8.0), REAL_CONST(57227.173829565276/8.0), REAL_CONST(57247.797163430281/8.0), REAL_CONST(57268.42235483494/8.0), REAL_CONST(57289.049403444733/8.0), REAL_CONST(57309.678308925286/8.0), REAL_CONST(57330.30907094237/8.0), REAL_CONST(57350.941689161911/8.0), REAL_CONST(57371.576163249985/8.0), REAL_CONST(57392.212492872815/8.0), REAL_CONST(57412.850677696784/8.0), REAL_CONST(57433.490717388406/8.0), REAL_CONST(57454.132611614368/8.0), REAL_CONST(57474.776360041491/8.0), REAL_CONST(57495.421962336746/8.0), REAL_CONST(57516.069418167266/8.0), REAL_CONST(57536.718727200314/8.0), REAL_CONST(57557.36988910332/8.0), REAL_CONST(57578.022903543861/8.0), REAL_CONST(57598.677770189643/8.0), REAL_CONST(57619.334488708548/8.0), REAL_CONST(57639.993058768589/8.0), REAL_CONST(57660.653480037938/8.0), REAL_CONST(57681.315752184906/8.0), REAL_CONST(57701.979874877965/8.0), REAL_CONST(57722.64584778573/8.0), REAL_CONST(57743.31367057695/8.0), REAL_CONST(57763.983342920546/8.0), REAL_CONST(57784.654864485572/8.0), REAL_CONST(57805.328234941233/8.0), REAL_CONST(57826.003453956881/8.0), REAL_CONST(57846.680521202026/8.0), REAL_CONST(57867.359436346305/8.0), REAL_CONST(57888.040199059527/8.0), REAL_CONST(57908.722809011633/8.0), REAL_CONST(57929.407265872709/8.0), REAL_CONST(57950.093569313001/8.0), REAL_CONST(57970.781719002895/8.0), REAL_CONST(57991.471714612911/8.0), REAL_CONST(58012.16355581375/8.0), REAL_CONST(58032.857242276223/8.0), REAL_CONST(58053.552773671312/8.0), REAL_CONST(58074.25014967013/8.0), REAL_CONST(58094.949369943948/8.0), REAL_CONST(58115.650434164185/8.0), REAL_CONST(58136.353342002389/8.0), REAL_CONST(58157.058093130276/8.0), REAL_CONST(58177.764687219693/8.0), REAL_CONST(58198.47312394264/8.0), REAL_CONST(58219.183402971255/8.0), REAL_CONST(58239.895523977837/8.0), REAL_CONST(58260.609486634821/8.0), REAL_CONST(58281.325290614775/8.0), REAL_CONST(58302.042935590434/8.0), REAL_CONST(58322.762421234678/8.0), REAL_CONST(58343.483747220511/8.0), REAL_CONST(58364.206913221096/8.0), REAL_CONST(58384.931918909751/8.0), REAL_CONST(58405.658763959924/8.0), REAL_CONST(58426.3874480452/8.0), REAL_CONST(58447.117970839339/8.0), REAL_CONST(58467.85033201622/8.0), REAL_CONST(58488.584531249864/8.0), REAL_CONST(58509.320568214462/8.0), REAL_CONST(58530.058442584334/8.0), REAL_CONST(58550.798154033931/8.0), REAL_CONST(58571.539702237875/8.0), REAL_CONST(58592.283086870906/8.0), REAL_CONST(58613.028307607929/8.0), REAL_CONST(58633.775364123983/8.0), REAL_CONST(58654.52425609425/8.0), REAL_CONST(58675.274983194053/8.0), REAL_CONST(58696.027545098877/8.0), REAL_CONST(58716.781941484325/8.0), REAL_CONST(58737.538172026158/8.0), REAL_CONST(58758.296236400274/8.0), REAL_CONST(58779.056134282728/8.0), REAL_CONST(58799.817865349694/8.0), REAL_CONST(58820.581429277503/8.0), REAL_CONST(58841.346825742643/8.0), REAL_CONST(58862.114054421712/8.0), REAL_CONST(58882.883114991484/8.0), REAL_CONST(58903.654007128847/8.0), REAL_CONST(58924.426730510851/8.0), REAL_CONST(58945.201284814684/8.0), REAL_CONST(58965.977669717664/8.0), REAL_CONST(58986.755884897269/8.0), REAL_CONST(59007.535930031117/8.0), REAL_CONST(59028.317804796949/8.0), REAL_CONST(59049.101508872664/8.0), REAL_CONST(59069.887041936301/8.0), REAL_CONST(59090.674403666046/8.0), REAL_CONST(59111.463593740213/8.0), REAL_CONST(59132.254611837263/8.0), REAL_CONST(59153.047457635803/8.0), REAL_CONST(59173.84213081457/8.0), REAL_CONST(59194.638631052461/8.0), REAL_CONST(59215.436958028506/8.0), REAL_CONST(59236.237111421855/8.0), REAL_CONST(59257.039090911829/8.0), REAL_CONST(59277.842896177877/8.0), REAL_CONST(59298.648526899589/8.0), REAL_CONST(59319.455982756685/8.0), REAL_CONST(59340.26526342905/8.0), REAL_CONST(59361.076368596696/8.0), REAL_CONST(59381.889297939757/8.0), REAL_CONST(59402.704051138542/8.0), REAL_CONST(59423.520627873484/8.0), REAL_CONST(59444.339027825139/8.0), REAL_CONST(59465.159250674224/8.0), REAL_CONST(59485.9812961016/8.0), REAL_CONST(59506.805163788253/8.0), REAL_CONST(59527.630853415307/8.0), REAL_CONST(59548.458364664046/8.0), REAL_CONST(59569.287697215863/8.0), REAL_CONST(59590.118850752311/8.0), REAL_CONST(59610.951824955089/8.0), REAL_CONST(59631.786619506012/8.0), REAL_CONST(59652.623234087048/8.0), REAL_CONST(59673.461668380311/8.0), REAL_CONST(59694.301922068029/8.0), REAL_CONST(59715.143994832593/8.0), REAL_CONST(59735.987886356525/8.0), REAL_CONST(59756.833596322482/8.0), REAL_CONST(59777.681124413255/8.0), REAL_CONST(59798.530470311794/8.0), REAL_CONST(59819.381633701159/8.0), REAL_CONST(59840.234614264569/8.0), REAL_CONST(59861.089411685381/8.0), REAL_CONST(59881.94602564707/8.0), REAL_CONST(59902.804455833269/8.0), REAL_CONST(59923.664701927737/8.0), REAL_CONST(59944.526763614384/8.0), REAL_CONST(59965.390640577243/8.0), REAL_CONST(59986.256332500488/8.0), REAL_CONST(60007.123839068438/8.0), REAL_CONST(60027.993159965539/8.0), REAL_CONST(60048.864294876381/8.0), REAL_CONST(60069.737243485688/8.0), REAL_CONST(60090.612005478324/8.0), REAL_CONST(60111.488580539284/8.0), REAL_CONST(60132.366968353708/8.0), REAL_CONST(60153.247168606867/8.0), REAL_CONST(60174.129180984164/8.0), REAL_CONST(60195.013005171153/8.0), REAL_CONST(60215.898640853513/8.0), REAL_CONST(60236.786087717061/8.0), REAL_CONST(60257.675345447751/8.0), REAL_CONST(60278.566413731671/8.0), REAL_CONST(60299.459292255044/8.0), REAL_CONST(60320.353980704247/8.0), REAL_CONST(60341.25047876576/8.0), REAL_CONST(60362.148786126229/8.0), REAL_CONST(60383.048902472423/8.0), REAL_CONST(60403.950827491237/8.0), REAL_CONST(60424.854560869717/8.0), REAL_CONST(60445.76010229504/8.0), REAL_CONST(60466.667451454516/8.0), REAL_CONST(60487.57660803559/8.0), REAL_CONST(60508.487571725847/8.0), REAL_CONST(60529.400342212997/8.0), REAL_CONST(60550.314919184893/8.0), REAL_CONST(60571.231302329521/8.0), REAL_CONST(60592.149491335003/8.0), REAL_CONST(60613.069485889588/8.0), REAL_CONST(60633.991285681674/8.0), REAL_CONST(60654.914890399785/8.0), REAL_CONST(60675.840299732568/8.0), REAL_CONST(60696.767513368832/8.0), REAL_CONST(60717.696530997484/8.0), REAL_CONST(60738.627352307602/8.0), REAL_CONST(60759.55997698837/8.0), REAL_CONST(60780.494404729128/8.0), REAL_CONST(60801.430635219323/8.0), REAL_CONST(60822.368668148556/8.0), REAL_CONST(60843.308503206565/8.0), REAL_CONST(60864.250140083204/8.0), REAL_CONST(60885.193578468468/8.0), REAL_CONST(60906.138818052495/8.0), REAL_CONST(60927.085858525541/8.0), REAL_CONST(60948.034699578006/8.0), REAL_CONST(60968.985340900421/8.0), REAL_CONST(60989.937782183442/8.0), REAL_CONST(61010.892023117864/8.0), REAL_CONST(61031.848063394616/8.0), REAL_CONST(61052.805902704764/8.0), REAL_CONST(61073.765540739492/8.0), REAL_CONST(61094.726977190134/8.0), REAL_CONST(61115.690211748137/8.0), REAL_CONST(61136.655244105103/8.0), REAL_CONST(61157.622073952742/8.0), REAL_CONST(61178.590700982917/8.0), REAL_CONST(61199.561124887616/8.0), REAL_CONST(61220.533345358948/8.0), REAL_CONST(61241.507362089171/8.0), REAL_CONST(61262.483174770663/8.0), REAL_CONST(61283.460783095943/8.0), REAL_CONST(61304.440186757645/8.0), REAL_CONST(61325.421385448557/8.0), REAL_CONST(61346.404378861582/8.0), REAL_CONST(61367.389166689762/8.0), REAL_CONST(61388.375748626262/8.0), REAL_CONST(61409.364124364387/8.0), REAL_CONST(61430.354293597571/8.0), REAL_CONST(61451.346256019373/8.0), REAL_CONST(61472.340011323497/8.0), REAL_CONST(61493.335559203762/8.0), REAL_CONST(61514.332899354122/8.0), REAL_CONST(61535.332031468672/8.0), REAL_CONST(61556.332955241618/8.0), REAL_CONST(61577.335670367313/8.0), REAL_CONST(61598.340176540238/8.0), REAL_CONST(61619.346473454993/8.0), REAL_CONST(61640.354560806329/8.0), REAL_CONST(61661.3644382891/8.0), REAL_CONST(61682.376105598312/8.0), REAL_CONST(61703.389562429089/8.0), REAL_CONST(61724.404808476691/8.0), REAL_CONST(61745.42184343651/8.0), REAL_CONST(61766.440667004063/8.0), REAL_CONST(61787.461278874987/8.0), REAL_CONST(61808.483678745069/8.0), REAL_CONST(61829.507866310203/8.0), REAL_CONST(61850.533841266435/8.0), REAL_CONST(61871.561603309929/8.0), REAL_CONST(61892.591152136971/8.0), REAL_CONST(61913.622487443987/8.0), REAL_CONST(61934.655608927525/8.0), REAL_CONST(61955.690516284267/8.0), REAL_CONST(61976.727209211022/8.0), REAL_CONST(61997.765687404724/8.0), REAL_CONST(62018.805950562448/8.0), REAL_CONST(62039.847998381381/8.0), REAL_CONST(62060.891830558845/8.0), REAL_CONST(62081.93744679229/8.0), REAL_CONST(62102.984846779298/8.0), REAL_CONST(62124.034030217575/8.0), REAL_CONST(62145.084996804966/8.0), REAL_CONST(62166.137746239416/8.0), REAL_CONST(62187.19227821903/8.0), REAL_CONST(62208.248592442025/8.0), REAL_CONST(62229.306688606739/8.0), REAL_CONST(62250.366566411656/8.0), REAL_CONST(62271.428225555377/8.0), REAL_CONST(62292.491665736627/8.0), REAL_CONST(62313.556886654267/8.0), REAL_CONST(62334.623888007271/8.0), REAL_CONST(62355.692669494762/8.0), REAL_CONST(62376.763230815974/8.0), REAL_CONST(62397.835571670272/8.0), REAL_CONST(62418.909691757144/8.0), REAL_CONST(62439.98559077621/8.0), REAL_CONST(62461.063268427228/8.0), REAL_CONST(62482.142724410049/8.0), REAL_CONST(62503.223958424685/8.0), REAL_CONST(62524.306970171267/8.0), REAL_CONST(62545.39175935003/8.0), REAL_CONST(62566.478325661366/8.0), REAL_CONST(62587.566668805768/8.0), REAL_CONST(62608.656788483881/8.0), REAL_CONST(62629.748684396451/8.0), REAL_CONST(62650.842356244357/8.0), REAL_CONST(62671.937803728622/8.0), REAL_CONST(62693.035026550366/8.0), REAL_CONST(62714.134024410858/8.0), REAL_CONST(62735.234797011479/8.0), REAL_CONST(62756.337344053733/8.0), REAL_CONST(62777.441665239276/8.0), REAL_CONST(62798.547760269852/8.0), REAL_CONST(62819.655628847358/8.0), REAL_CONST(62840.765270673801/8.0), REAL_CONST(62861.876685451323/8.0), REAL_CONST(62882.989872882186/8.0), REAL_CONST(62904.104832668774/8.0), REAL_CONST(62925.221564513602/8.0), REAL_CONST(62946.340068119309/8.0), REAL_CONST(62967.460343188657/8.0), REAL_CONST(62988.582389424526/8.0), REAL_CONST(63009.70620652994/8.0), REAL_CONST(63030.831794208025/8.0), REAL_CONST(63051.959152162039/8.0), REAL_CONST(63073.08828009537/8.0), REAL_CONST(63094.219177711529/8.0), REAL_CONST(63115.351844714154/8.0), REAL_CONST(63136.486280806988/8.0), REAL_CONST(63157.622485693922/8.0), REAL_CONST(63178.760459078956/8.0), REAL_CONST(63199.900200666219/8.0), REAL_CONST(63221.041710159967/8.0), REAL_CONST(63242.184987264569/8.0), REAL_CONST(63263.330031684534/8.0), REAL_CONST(63284.476843124474/8.0), REAL_CONST(63305.625421289144/8.0), REAL_CONST(63326.775765883409/8.0), REAL_CONST(63347.927876612259/8.0), REAL_CONST(63369.081753180813/8.0), REAL_CONST(63390.237395294316/8.0), REAL_CONST(63411.39480265812/8.0), REAL_CONST(63432.553974977716/8.0), REAL_CONST(63453.714911958712/8.0), REAL_CONST(63474.877613306839/8.0), REAL_CONST(63496.042078727944/8.0), REAL_CONST(63517.208307927998/8.0), REAL_CONST(63538.376300613119/8.0), REAL_CONST(63559.546056489504/8.0), REAL_CONST(63580.717575263516/8.0), REAL_CONST(63601.890856641607/8.0), REAL_CONST(63623.065900330374/8.0), REAL_CONST(63644.242706036515/8.0), REAL_CONST(63665.421273466869/8.0), REAL_CONST(63686.601602328381/8.0), REAL_CONST(63707.783692328136/8.0), REAL_CONST(63728.967543173334/8.0), REAL_CONST(63750.153154571279/8.0), REAL_CONST(63771.340526229418/8.0), REAL_CONST(63792.529657855317/8.0), REAL_CONST(63813.720549156649/8.0), REAL_CONST(63834.913199841227/8.0), REAL_CONST(63856.107609616978/8.0), REAL_CONST(63877.303778191941/8.0), REAL_CONST(63898.501705274284/8.0), REAL_CONST(63919.7013905723/8.0), REAL_CONST(63940.902833794404/8.0), REAL_CONST(63962.106034649114/8.0), REAL_CONST(63983.310992845094/8.0), REAL_CONST(64004.517708091109/8.0), REAL_CONST(64025.726180096048/8.0), REAL_CONST(64046.936408568938/8.0), REAL_CONST(64068.1483932189/8.0), REAL_CONST(64089.362133755196/8.0), REAL_CONST(64110.577629887193/8.0), REAL_CONST(64131.794881324393/8.0), REAL_CONST(64153.013887776404/8.0), REAL_CONST(64174.234648952966/8.0), REAL_CONST(64195.457164563937/8.0), REAL_CONST(64216.681434319289/8.0), REAL_CONST(64237.907457929112/8.0), REAL_CONST(64259.135235103626/8.0), REAL_CONST(64280.36476555316/8.0), REAL_CONST(64301.596048988169/8.0), REAL_CONST(64322.829085119236/8.0), REAL_CONST(64344.06387365704/8.0), REAL_CONST(64365.300414312398/8.0), REAL_CONST(64386.538706796251/8.0), REAL_CONST(64407.778750819634/8.0), REAL_CONST(64429.020546093721/8.0), REAL_CONST(64450.26409232981/8.0), REAL_CONST(64471.509389239291/8.0), REAL_CONST(64492.756436533709/8.0), REAL_CONST(64514.005233924705/8.0), REAL_CONST(64535.255781124033/8.0), REAL_CONST(64556.50807784358/8.0), REAL_CONST(64577.762123795357/8.0), REAL_CONST(64599.017918691468/8.0), REAL_CONST(64620.275462244172/8.0), REAL_CONST(64641.534754165805/8.0), REAL_CONST(64662.795794168844/8.0), REAL_CONST(64684.058581965895/8.0), REAL_CONST(64705.323117269661/8.0), REAL_CONST(64726.589399792974/8.0), REAL_CONST(64747.857429248776/8.0), REAL_CONST(64769.127205350138/8.0), REAL_CONST(64790.398727810236/8.0), REAL_CONST(64811.671996342375/8.0), REAL_CONST(64832.947010659969/8.0), REAL_CONST(64854.223770476558/8.0), REAL_CONST(64875.502275505794/8.0), REAL_CONST(64896.782525461451/8.0), REAL_CONST(64918.064520057414/8.0), REAL_CONST(64939.348259007682/8.0), REAL_CONST(64960.633742026388/8.0), REAL_CONST(64981.920968827762/8.0), REAL_CONST(65003.209939126165/8.0), REAL_CONST(65024.500652636067/8.0), REAL_CONST(65045.793109072067/8.0), REAL_CONST(65067.087308148861/8.0), REAL_CONST(65088.383249581282/8.0), REAL_CONST(65109.680933084259/8.0), REAL_CONST(65130.980358372864/8.0), REAL_CONST(65152.28152516226/8.0), REAL_CONST(65173.584433167736/8.0), REAL_CONST(65194.889082104703/8.0), REAL_CONST(65216.195471688683/8.0), REAL_CONST(65237.503601635319/8.0), REAL_CONST(65258.813471660353/8.0), REAL_CONST(65280.125081479666/8.0), REAL_CONST(65301.438430809241/8.0), REAL_CONST(65322.753519365178/8.0), REAL_CONST(65344.070346863708/8.0), REAL_CONST(65365.388913021146/8.0), REAL_CONST(65386.709217553958/8.0), REAL_CONST(65408.031260178701/8.0), REAL_CONST(65429.355040612056/8.0), REAL_CONST(65450.680558570821/8.0), REAL_CONST(65472.00781377191/8.0), REAL_CONST(65493.336805932355/8.0), REAL_CONST(65514.66753476928/8.0), REAL_CONST(65535.999999999956/8.0), REAL_CONST(65557.334201341757/8.0), REAL_CONST(65578.670138512171/8.0), REAL_CONST(65600.007811228788/8.0), REAL_CONST(65621.347219209332/8.0), REAL_CONST(65642.688362171626/8.0), REAL_CONST(65664.031239833639/8.0), REAL_CONST(65685.375851913413/8.0), REAL_CONST(65706.722198129137/8.0), REAL_CONST(65728.070278199084/8.0), REAL_CONST(65749.420091841661/8.0), REAL_CONST(65770.771638775404/8.0), REAL_CONST(65792.124918718939/8.0), REAL_CONST(65813.479931391004/8.0), REAL_CONST(65834.836676510458/8.0), REAL_CONST(65856.195153796303/8.0), REAL_CONST(65877.5553629676/8.0), REAL_CONST(65898.917303743554/8.0), REAL_CONST(65920.280975843489/8.0), REAL_CONST(65941.646378986843/8.0), REAL_CONST(65963.013512893158/8.0), REAL_CONST(65984.382377282076/8.0), REAL_CONST(66005.752971873386/8.0), REAL_CONST(66027.125296386963/8.0), REAL_CONST(66048.499350542799/8.0), REAL_CONST(66069.875134061018/8.0), REAL_CONST(66091.252646661844/8.0), REAL_CONST(66112.631888065618/8.0), REAL_CONST(66134.01285799277/8.0), REAL_CONST(66155.395556163887/8.0), REAL_CONST(66176.779982299631/8.0), REAL_CONST(66198.166136120795/8.0), REAL_CONST(66219.554017348273/8.0), REAL_CONST(66240.943625703105/8.0), REAL_CONST(66262.334960906388/8.0), REAL_CONST(66283.728022679396/8.0), REAL_CONST(66305.122810743444/8.0), REAL_CONST(66326.519324820023/8.0), REAL_CONST(66347.917564630698/8.0), REAL_CONST(66369.317529897162/8.0), REAL_CONST(66390.719220341227/8.0), REAL_CONST(66412.122635684791/8.0), REAL_CONST(66433.527775649884/8.0), REAL_CONST(66454.934639958636/8.0), REAL_CONST(66476.343228333324/8.0), REAL_CONST(66497.753540496284/8.0), REAL_CONST(66519.165576169995/8.0), REAL_CONST(66540.57933507704/8.0), REAL_CONST(66561.994816940118/8.0), REAL_CONST(66583.412021482043/8.0), REAL_CONST(66604.830948425733/8.0), REAL_CONST(66626.251597494222/8.0), REAL_CONST(66647.673968410629/8.0), REAL_CONST(66669.098060898235/8.0), REAL_CONST(66690.523874680381/8.0), REAL_CONST(66711.951409480564/8.0), REAL_CONST(66733.380665022371/8.0), REAL_CONST(66754.811641029475/8.0), REAL_CONST(66776.244337225711/8.0), REAL_CONST(66797.678753334985/8.0), REAL_CONST(66819.11488908132/8.0), REAL_CONST(66840.552744188884/8.0), REAL_CONST(66861.992318381905/8.0), REAL_CONST(66883.433611384738/8.0), REAL_CONST(66904.876622921889/8.0), REAL_CONST(66926.321352717903/8.0), REAL_CONST(66947.767800497502/8.0), REAL_CONST(66969.215965985466/8.0), REAL_CONST(66990.665848906734/8.0), REAL_CONST(67012.117448986304/8.0), REAL_CONST(67033.570765949335/8.0), REAL_CONST(67055.025799521056/8.0), REAL_CONST(67076.482549426815/8.0), REAL_CONST(67097.941015392076/8.0), REAL_CONST(67119.401197142433/8.0), REAL_CONST(67140.863094403554/8.0), REAL_CONST(67162.326706901222/8.0), REAL_CONST(67183.792034361351/8.0), REAL_CONST(67205.259076509959/8.0), REAL_CONST(67226.72783307315/8.0), REAL_CONST(67248.198303777172/8.0), REAL_CONST(67269.670488348347/8.0), REAL_CONST(67291.144386513144/8.0), REAL_CONST(67312.619997998088/8.0), REAL_CONST(67334.09732252988/8.0), REAL_CONST(67355.576359835293/8.0), REAL_CONST(67377.057109641188/8.0), REAL_CONST(67398.53957167457/8.0), REAL_CONST(67420.023745662547/8.0), REAL_CONST(67441.50963133233/8.0), REAL_CONST(67462.99722841123/8.0), REAL_CONST(67484.486536626689/8.0), REAL_CONST(67505.977555706224/8.0), REAL_CONST(67527.470285377494/8.0), REAL_CONST(67548.964725368263/8.0), REAL_CONST(67570.460875406367/8.0), REAL_CONST(67591.9587352198/8.0), REAL_CONST(67613.458304536631/8.0), REAL_CONST(67634.95958308503/8.0), REAL_CONST(67656.462570593329/8.0), REAL_CONST(67677.967266789899/8.0), REAL_CONST(67699.473671403248/8.0), REAL_CONST(67720.981784162024/8.0), REAL_CONST(67742.491604794923/8.0), REAL_CONST(67764.003133030797/8.0), REAL_CONST(67785.516368598575/8.0), REAL_CONST(67807.031311227314/8.0), REAL_CONST(67828.547960646174/8.0), REAL_CONST(67850.066316584402/8.0), REAL_CONST(67871.58637877139/8.0), REAL_CONST(67893.108146936589/8.0), REAL_CONST(67914.63162080961/8.0), REAL_CONST(67936.156800120138/8.0), REAL_CONST(67957.683684597971/8.0), REAL_CONST(67979.212273973011/8.0), REAL_CONST(68000.742567975263/8.0), REAL_CONST(68022.274566334876/8.0), REAL_CONST(68043.808268782057/8.0), REAL_CONST(68065.343675047145/8.0), REAL_CONST(68086.880784860579/8.0), REAL_CONST(68108.419597952918/8.0), REAL_CONST(68129.960114054789/8.0), REAL_CONST(68151.502332896969/8.0), REAL_CONST(68173.04625421032/8.0), REAL_CONST(68194.591877725834/8.0), REAL_CONST(68216.139203174564/8.0), REAL_CONST(68237.688230287706/8.0), REAL_CONST(68259.238958796544/8.0), REAL_CONST(68280.791388432481/8.0), REAL_CONST(68302.345518927032/8.0), REAL_CONST(68323.901350011787/8.0), REAL_CONST(68345.458881418483/8.0), REAL_CONST(68367.018112878912/8.0), REAL_CONST(68388.579044125028/8.0), REAL_CONST(68410.141674888844/8.0), REAL_CONST(68431.706004902502/8.0), REAL_CONST(68453.272033898262/8.0), REAL_CONST(68474.839761608455/8.0), REAL_CONST(68496.409187765545/8.0), REAL_CONST(68517.980312102081/8.0), REAL_CONST(68539.553134350732/8.0), REAL_CONST(68561.127654244279/8.0), REAL_CONST(68582.70387151558/8.0), REAL_CONST(68604.281785897634/8.0), REAL_CONST(68625.861397123503/8.0), REAL_CONST(68647.44270492639/8.0), REAL_CONST(68669.025709039604/8.0), REAL_CONST(68690.610409196524/8.0), REAL_CONST(68712.196805130661/8.0), REAL_CONST(68733.784896575627/8.0), REAL_CONST(68755.374683265123/8.0), REAL_CONST(68776.966164932994/8.0), REAL_CONST(68798.559341313128/8.0), REAL_CONST(68820.154212139591/8.0), REAL_CONST(68841.750777146473/8.0), REAL_CONST(68863.349036068044/8.0), REAL_CONST(68884.948988638629/8.0), REAL_CONST(68906.550634592684/8.0), REAL_CONST(68928.153973664739/8.0), REAL_CONST(68949.75900558944/8.0), REAL_CONST(68971.365730101577/8.0), REAL_CONST(68992.974146935987/8.0), REAL_CONST(69014.584255827634/8.0), REAL_CONST(69036.196056511588/8.0), REAL_CONST(69057.809548723017/8.0), REAL_CONST(69079.424732197207/8.0), REAL_CONST(69101.041606669532/8.0), REAL_CONST(69122.660171875468/8.0), REAL_CONST(69144.280427550606/8.0), REAL_CONST(69165.902373430625/8.0), REAL_CONST(69187.526009251334/8.0), REAL_CONST(69209.151334748618/8.0), REAL_CONST(69230.778349658474/8.0), REAL_CONST(69252.40705371699/8.0), REAL_CONST(69274.037446660412/8.0), REAL_CONST(69295.669528225/8.0), REAL_CONST(69317.303298147192/8.0), REAL_CONST(69338.938756163494/8.0), REAL_CONST(69360.575902010532/8.0), REAL_CONST(69382.214735425005/8.0), REAL_CONST(69403.855256143754/8.0), REAL_CONST(69425.497463903681/8.0), REAL_CONST(69447.141358441833/8.0), REAL_CONST(69468.78693949533/8.0), REAL_CONST(69490.434206801394/8.0), REAL_CONST(69512.083160097391/8.0), REAL_CONST(69533.733799120717/8.0), REAL_CONST(69555.386123608929/8.0), REAL_CONST(69577.04013329967/8.0), REAL_CONST(69598.695827930685/8.0), REAL_CONST(69620.353207239794/8.0), REAL_CONST(69642.012270964973/8.0), REAL_CONST(69663.67301884426/8.0), REAL_CONST(69685.335450615792/8.0), REAL_CONST(69706.999566017839/8.0), REAL_CONST(69728.665364788743/8.0), REAL_CONST(69750.332846666963/8.0), REAL_CONST(69772.002011391058/8.0), REAL_CONST(69793.672858699691/8.0), REAL_CONST(69815.345388331611/8.0), REAL_CONST(69837.019600025669/8.0), REAL_CONST(69858.695493520849/8.0), REAL_CONST(69880.373068556204/8.0), REAL_CONST(69902.052324870907/8.0), REAL_CONST(69923.733262204216/8.0), REAL_CONST(69945.415880295492/8.0), REAL_CONST(69967.100178884211/8.0), REAL_CONST(69988.786157709939/8.0), REAL_CONST(70010.473816512356/8.0), REAL_CONST(70032.163155031216/8.0), REAL_CONST(70053.854173006403/8.0), REAL_CONST(70075.546870177874/8.0), REAL_CONST(70097.241246285717/8.0), REAL_CONST(70118.937301070109/8.0), REAL_CONST(70140.635034271298/8.0), REAL_CONST(70162.334445629691/8.0), REAL_CONST(70184.035534885741/8.0), REAL_CONST(70205.738301780017/8.0), REAL_CONST(70227.442746053217/8.0), REAL_CONST(70249.1488674461/8.0), REAL_CONST(70270.856665699539/8.0), REAL_CONST(70292.566140554511/8.0), REAL_CONST(70314.277291752107/8.0), REAL_CONST(70335.990119033493/8.0), REAL_CONST(70357.704622139936/8.0), REAL_CONST(70379.420800812819/8.0), REAL_CONST(70401.138654793613/8.0), REAL_CONST(70422.85818382389/8.0), REAL_CONST(70444.579387645339/8.0), REAL_CONST(70466.302265999722/8.0), REAL_CONST(70488.026818628918/8.0), REAL_CONST(70509.753045274876/8.0), REAL_CONST(70531.480945679708/8.0), REAL_CONST(70553.210519585555/8.0), REAL_CONST(70574.941766734701/8.0), REAL_CONST(70596.674686869505/8.0), REAL_CONST(70618.409279732456/8.0), REAL_CONST(70640.145545066101/8.0), REAL_CONST(70661.883482613106/8.0), REAL_CONST(70683.623092116264/8.0), REAL_CONST(70705.364373318414/8.0), REAL_CONST(70727.107325962526/8.0), REAL_CONST(70748.851949791671/8.0), REAL_CONST(70770.598244549008/8.0), REAL_CONST(70792.346209977783/8.0), REAL_CONST(70814.095845821372/8.0), REAL_CONST(70835.847151823225/8.0), REAL_CONST(70857.600127726895/8.0), REAL_CONST(70879.354773276034/8.0), REAL_CONST(70901.111088214413/8.0), REAL_CONST(70922.869072285859/8.0), REAL_CONST(70944.628725234332/8.0), REAL_CONST(70966.390046803877/8.0), REAL_CONST(70988.153036738629/8.0), REAL_CONST(71009.917694782853/8.0), REAL_CONST(71031.684020680885/8.0), REAL_CONST(71053.45201417715/8.0), REAL_CONST(71075.221675016204/8.0), REAL_CONST(71096.993002942661/8.0), REAL_CONST(71118.765997701266/8.0), REAL_CONST(71140.540659036851/8.0), REAL_CONST(71162.316986694335/8.0), REAL_CONST(71184.09498041874/8.0), REAL_CONST(71205.874639955218/8.0), REAL_CONST(71227.655965048951/8.0), REAL_CONST(71249.438955445294/8.0), REAL_CONST(71271.223610889632/8.0), REAL_CONST(71293.009931127483/8.0), REAL_CONST(71314.797915904477/8.0), REAL_CONST(71336.587564966307/8.0), REAL_CONST(71358.378878058764/8.0), REAL_CONST(71380.171854927772/8.0), REAL_CONST(71401.966495319313/8.0), REAL_CONST(71423.762798979486/8.0), REAL_CONST(71445.560765654489/8.0), REAL_CONST(71467.360395090596/8.0), REAL_CONST(71489.161687034211/8.0), REAL_CONST(71510.964641231811/8.0), REAL_CONST(71532.769257429973/8.0), REAL_CONST(71554.575535375348/8.0), REAL_CONST(71576.383474814749/8.0), REAL_CONST(71598.19307549503/8.0), REAL_CONST(71620.004337163133/8.0), REAL_CONST(71641.817259566145/8.0), REAL_CONST(71663.631842451214/8.0), REAL_CONST(71685.4480855656/8.0), REAL_CONST(71707.26598865664/8.0), REAL_CONST(71729.085551471784/8.0), REAL_CONST(71750.906773758586/8.0), REAL_CONST(71772.729655264673/8.0), REAL_CONST(71794.554195737772/8.0), REAL_CONST(71816.380394925713/8.0), REAL_CONST(71838.208252576442/8.0), REAL_CONST(71860.037768437964/8.0), REAL_CONST(71881.868942258385/8.0), REAL_CONST(71903.701773785942/8.0), REAL_CONST(71925.536262768932/8.0), REAL_CONST(71947.372408955751/8.0), REAL_CONST(71969.210212094898/8.0), REAL_CONST(71991.049671934976/8.0), REAL_CONST(72012.890788224686/8.0), REAL_CONST(72034.73356071279/8.0), REAL_CONST(72056.577989148165/8.0), REAL_CONST(72078.424073279821/8.0), REAL_CONST(72100.271812856794/8.0), REAL_CONST(72122.121207628254/8.0), REAL_CONST(72143.97225734347/8.0), REAL_CONST(72165.824961751801/8.0), REAL_CONST(72187.679320602692/8.0), REAL_CONST(72209.53533364569/8.0), REAL_CONST(72231.393000630429/8.0), REAL_CONST(72253.252321306645/8.0), REAL_CONST(72275.113295424177/8.0), REAL_CONST(72296.975922732949/8.0), REAL_CONST(72318.840202982959/8.0), REAL_CONST(72340.706135924338/8.0), REAL_CONST(72362.573721307272/8.0), REAL_CONST(72384.442958882093/8.0), REAL_CONST(72406.313848399179/8.0), REAL_CONST(72428.186389609036/8.0), REAL_CONST(72450.060582262216/8.0), REAL_CONST(72471.936426109431/8.0), REAL_CONST(72493.813920901433/8.0), REAL_CONST(72515.693066389096/8.0), REAL_CONST(72537.573862323392/8.0), REAL_CONST(72559.456308455352/8.0), REAL_CONST(72581.340404536139/8.0), REAL_CONST(72603.226150316987/8.0), REAL_CONST(72625.113545549248/8.0), REAL_CONST(72647.002589984331/8.0), REAL_CONST(72668.893283373764/8.0), REAL_CONST(72690.785625469172/8.0), REAL_CONST(72712.679616022273/8.0), REAL_CONST(72734.575254784853/8.0), REAL_CONST(72756.472541508803/8.0), REAL_CONST(72778.371475946144/8.0), REAL_CONST(72800.272057848939/8.0), REAL_CONST(72822.174286969355/8.0), REAL_CONST(72844.07816305969/8.0), REAL_CONST(72865.983685872285/8.0), REAL_CONST(72887.890855159596/8.0), REAL_CONST(72909.799670674183/8.0), REAL_CONST(72931.710132168693/8.0), REAL_CONST(72953.622239395845/8.0), REAL_CONST(72975.535992108475/8.0), REAL_CONST(72997.451390059519/8.0), REAL_CONST(73019.368433001961/8.0), REAL_CONST(73041.287120688925/8.0), REAL_CONST(73063.207452873612/8.0), REAL_CONST(73085.129429309294/8.0), REAL_CONST(73107.053049749389/8.0), REAL_CONST(73128.978313947344/8.0), REAL_CONST(73150.905221656736/8.0), REAL_CONST(73172.833772631217/8.0), REAL_CONST(73194.763966624567/8.0), REAL_CONST(73216.695803390612/8.0), REAL_CONST(73238.62928268328/8.0), REAL_CONST(73260.564404256627/8.0), REAL_CONST(73282.501167864757/8.0), REAL_CONST(73304.439573261901/8.0), REAL_CONST(73326.379620202337/8.0), REAL_CONST(73348.321308440485/8.0), REAL_CONST(73370.264637730841/8.0), REAL_CONST(73392.209607827957/8.0), REAL_CONST(73414.156218486532/8.0), REAL_CONST(73436.104469461323/8.0), REAL_CONST(73458.054360507173/8.0), REAL_CONST(73480.005891379056/8.0), REAL_CONST(73501.959061831993/8.0), REAL_CONST(73523.913871621116/8.0), REAL_CONST(73545.870320501665/8.0), REAL_CONST(73567.828408228932/8.0), REAL_CONST(73589.78813455833/8.0), REAL_CONST(73611.749499245358/8.0), REAL_CONST(73633.712502045615/8.0), REAL_CONST(73655.677142714747/8.0), REAL_CONST(73677.643421008557/8.0), REAL_CONST(73699.611336682879/8.0), REAL_CONST(73721.580889493693/8.0), REAL_CONST(73743.552079197019/8.0), REAL_CONST(73765.524905548999/8.0), REAL_CONST(73787.499368305856/8.0), REAL_CONST(73809.475467223907/8.0), REAL_CONST(73831.453202059551/8.0), REAL_CONST(73853.432572569291/8.0), REAL_CONST(73875.413578509717/8.0), REAL_CONST(73897.396219637507/8.0), REAL_CONST(73919.380495709411/8.0), REAL_CONST(73941.36640648231/8.0), REAL_CONST(73963.353951713143/8.0), REAL_CONST(73985.343131158952/8.0), REAL_CONST(74007.333944576865/8.0), REAL_CONST(74029.326391724098/8.0), REAL_CONST(74051.320472357969/8.0), REAL_CONST(74073.316186235883/8.0), REAL_CONST(74095.313533115303/8.0), REAL_CONST(74117.312512753837/8.0), REAL_CONST(74139.313124909138/8.0), REAL_CONST(74161.315369338976/8.0), REAL_CONST(74183.319245801191/8.0), REAL_CONST(74205.324754053727/8.0), REAL_CONST(74227.331893854629/8.0), REAL_CONST(74249.340664961986/8.0), REAL_CONST(74271.351067134034/8.0), REAL_CONST(74293.363100129049/8.0), REAL_CONST(74315.376763705441/8.0), REAL_CONST(74337.392057621662/8.0), REAL_CONST(74359.408981636298/8.0), REAL_CONST(74381.427535508003/8.0), REAL_CONST(74403.447718995507/8.0), REAL_CONST(74425.469531857671/8.0), REAL_CONST(74447.492973853383/8.0), REAL_CONST(74469.518044741693/8.0), REAL_CONST(74491.54474428168/8.0), REAL_CONST(74513.573072232539/8.0), REAL_CONST(74535.603028353551/8.0), REAL_CONST(74557.634612404087/8.0), REAL_CONST(74579.667824143602/8.0), REAL_CONST(74601.702663331642/8.0), REAL_CONST(74623.739129727837/8.0), REAL_CONST(74645.777223091936/8.0), REAL_CONST(74667.816943183716/8.0), REAL_CONST(74689.858289763113/8.0), REAL_CONST(74711.901262590094/8.0), REAL_CONST(74733.945861424741/8.0), REAL_CONST(74755.992086027225/8.0), REAL_CONST(74778.039936157802/8.0), REAL_CONST(74800.089411576817/8.0), REAL_CONST(74822.140512044702/8.0), REAL_CONST(74844.193237321961/8.0), REAL_CONST(74866.24758716923/8.0), REAL_CONST(74888.303561347187/8.0), REAL_CONST(74910.36115961663/8.0), REAL_CONST(74932.420381738411/8.0), REAL_CONST(74954.481227473516/8.0), REAL_CONST(74976.543696582972/8.0), REAL_CONST(74998.607788827925/8.0), REAL_CONST(75020.673503969607/8.0), REAL_CONST(75042.740841769322/8.0), REAL_CONST(75064.809801988464/8.0), REAL_CONST(75086.88038438854/8.0), REAL_CONST(75108.952588731103/8.0), REAL_CONST(75131.026414777836/8.0), REAL_CONST(75153.101862290467/8.0), REAL_CONST(75175.178931030852/8.0), REAL_CONST(75197.257620760924/8.0), REAL_CONST(75219.33793124267/8.0), REAL_CONST(75241.419862238225/8.0), REAL_CONST(75263.503413509738/8.0), REAL_CONST(75285.588584819503/8.0), REAL_CONST(75307.675375929874/8.0), REAL_CONST(75329.763786603318/8.0), REAL_CONST(75351.853816602365/8.0), REAL_CONST(75373.945465689612/8.0), REAL_CONST(75396.038733627807/8.0), REAL_CONST(75418.133620179724/8.0), REAL_CONST(75440.230125108254/8.0), REAL_CONST(75462.32824817636/8.0), REAL_CONST(75484.427989147109/8.0), REAL_CONST(75506.529347783653/8.0), REAL_CONST(75528.63232384919/8.0), REAL_CONST(75550.736917107075/8.0), REAL_CONST(75572.843127320695/8.0), REAL_CONST(75594.950954253538/8.0), REAL_CONST(75617.060397669193/8.0), REAL_CONST(75639.171457331307/8.0), REAL_CONST(75661.284133003646/8.0), REAL_CONST(75683.398424450032/8.0), REAL_CONST(75705.514331434402/8.0), REAL_CONST(75727.631853720741/8.0), REAL_CONST(75749.750991073175/8.0), REAL_CONST(75771.871743255862/8.0), REAL_CONST(75793.994110033076/8.0), REAL_CONST(75816.118091169177/8.0), REAL_CONST(75838.243686428585/8.0), REAL_CONST(75860.370895575848/8.0), REAL_CONST(75882.499718375562/8.0), REAL_CONST(75904.630154592422/8.0), REAL_CONST(75926.762203991224/8.0), REAL_CONST(75948.895866336825/8.0), REAL_CONST(75971.031141394182/8.0), REAL_CONST(75993.168028928325/8.0), REAL_CONST(76015.306528704401/8.0), REAL_CONST(76037.4466404876/8.0), REAL_CONST(76059.588364043215/8.0), REAL_CONST(76081.731699136653/8.0), REAL_CONST(76103.876645533353/8.0), REAL_CONST(76126.023202998884/8.0), REAL_CONST(76148.171371298871/8.0), REAL_CONST(76170.321150199044/8.0), REAL_CONST(76192.472539465205/8.0), REAL_CONST(76214.625538863256/8.0), REAL_CONST(76236.780148159174/8.0), REAL_CONST(76258.936367119008/8.0), REAL_CONST(76281.094195508922/8.0), REAL_CONST(76303.253633095141/8.0), REAL_CONST(76325.414679643975/8.0), REAL_CONST(76347.577334921851/8.0), REAL_CONST(76369.741598695226/8.0), REAL_CONST(76391.907470730686/8.0), REAL_CONST(76414.074950794879/8.0), REAL_CONST(76436.244038654564/8.0), REAL_CONST(76458.414734076548/8.0), REAL_CONST(76480.587036827754/8.0), REAL_CONST(76502.760946675175/8.0), REAL_CONST(76524.936463385893/8.0), REAL_CONST(76547.11358672705/8.0), REAL_CONST(76569.292316465915/8.0), REAL_CONST(76591.472652369819/8.0), REAL_CONST(76613.654594206164/8.0), REAL_CONST(76635.838141742468/8.0), REAL_CONST(76658.023294746308/8.0), REAL_CONST(76680.210052985349/8.0), REAL_CONST(76702.398416227341/8.0), REAL_CONST(76724.588384240138/8.0), REAL_CONST(76746.779956791637/8.0), REAL_CONST(76768.973133649866/8.0), REAL_CONST(76791.167914582897/8.0), REAL_CONST(76813.364299358902/8.0), REAL_CONST(76835.562287746157/8.0), REAL_CONST(76857.761879512967/8.0), REAL_CONST(76879.963074427797/8.0), REAL_CONST(76902.165872259109/8.0), REAL_CONST(76924.37027277553/8.0), REAL_CONST(76946.576275745727/8.0), REAL_CONST(76968.783880938441/8.0), REAL_CONST(76990.993088122515/8.0), REAL_CONST(77013.203897066895/8.0), REAL_CONST(77035.416307540567/8.0), REAL_CONST(77057.630319312622/8.0), REAL_CONST(77079.845932152239/8.0), REAL_CONST(77102.063145828695/8.0), REAL_CONST(77124.281960111301/8.0), REAL_CONST(77146.50237476948/8.0), REAL_CONST(77168.724389572759/8.0), REAL_CONST(77190.948004290723/8.0), REAL_CONST(77213.173218693031/8.0), REAL_CONST(77235.400032549442/8.0), REAL_CONST(77257.628445629802/8.0), REAL_CONST(77279.858457704031/8.0), REAL_CONST(77302.090068542122/8.0), REAL_CONST(77324.323277914169/8.0), REAL_CONST(77346.558085590339/8.0), REAL_CONST(77368.794491340886/8.0), REAL_CONST(77391.032494936138/8.0), REAL_CONST(77413.272096146524/8.0), REAL_CONST(77435.51329474253/8.0), REAL_CONST(77457.756090494731/8.0), REAL_CONST(77480.000483173804/8.0), REAL_CONST(77502.246472550498/8.0), REAL_CONST(77524.494058395634/8.0), REAL_CONST(77546.743240480107/8.0), REAL_CONST(77568.994018574944/8.0), REAL_CONST(77591.246392451198/8.0), REAL_CONST(77613.500361880026/8.0), REAL_CONST(77635.755926632657/8.0), REAL_CONST(77658.013086480438/8.0), REAL_CONST(77680.271841194757/8.0), REAL_CONST(77702.532190547092/8.0), REAL_CONST(77724.794134309021/8.0), REAL_CONST(77747.057672252195/8.0), REAL_CONST(77769.322804148323/8.0), REAL_CONST(77791.589529769248/8.0), REAL_CONST(77813.857848886837/8.0), REAL_CONST(77836.127761273063/8.0), REAL_CONST(77858.399266699998/8.0), REAL_CONST(77880.67236493979/8.0), REAL_CONST(77902.947055764627/8.0), REAL_CONST(77925.223338946831/8.0), REAL_CONST(77947.50121425878/8.0), REAL_CONST(77969.780681472927/8.0), REAL_CONST(77992.061740361838/8.0), REAL_CONST(78014.344390698127/8.0), REAL_CONST(78036.628632254491/8.0), REAL_CONST(78058.914464803747/8.0), REAL_CONST(78081.201888118725/8.0), REAL_CONST(78103.490901972415/8.0), REAL_CONST(78125.781506137821/8.0), REAL_CONST(78148.073700388064/8.0), REAL_CONST(78170.367484496339/8.0), REAL_CONST(78192.662858235926/8.0), REAL_CONST(78214.959821380166/8.0), REAL_CONST(78237.258373702498/8.0), REAL_CONST(78259.558514976452/8.0), REAL_CONST(78281.860244975614/8.0), REAL_CONST(78304.163563473659/8.0), REAL_CONST(78326.468470244363/8.0), REAL_CONST(78348.77496506153/8.0), REAL_CONST(78371.083047699125/8.0), REAL_CONST(78393.392717931114/8.0), REAL_CONST(78415.703975531578/8.0), REAL_CONST(78438.016820274701/8.0), REAL_CONST(78460.331251934695/8.0), REAL_CONST(78482.647270285903/8.0), REAL_CONST(78504.964875102727/8.0), REAL_CONST(78527.284066159627/8.0), REAL_CONST(78549.604843231195/8.0), REAL_CONST(78571.927206092048/8.0), REAL_CONST(78594.251154516911/8.0), REAL_CONST(78616.576688280606/8.0), REAL_CONST(78638.903807157985/8.0), REAL_CONST(78661.232510924034/8.0), REAL_CONST(78683.562799353778/8.0), REAL_CONST(78705.894672222363/8.0), REAL_CONST(78728.228129304945/8.0), REAL_CONST(78750.563170376859/8.0), REAL_CONST(78772.899795213423/8.0), REAL_CONST(78795.238003590101/8.0), REAL_CONST(78817.577795282399/8.0), REAL_CONST(78839.919170065928/8.0), REAL_CONST(78862.262127716356/8.0), REAL_CONST(78884.606668009452/8.0), REAL_CONST(78906.952790721043/8.0), REAL_CONST(78929.300495627045/8.0), REAL_CONST(78951.64978250346/8.0), REAL_CONST(78974.000651126378/8.0), REAL_CONST(78996.353101271932/8.0), REAL_CONST(79018.707132716358/8.0), REAL_CONST(79041.062745235977/8.0), REAL_CONST(79063.41993860717/8.0), REAL_CONST(79085.778712606436/8.0), REAL_CONST(79108.139067010285/8.0), REAL_CONST(79130.501001595389/8.0), REAL_CONST(79152.864516138419/8.0), REAL_CONST(79175.22961041618/8.0), REAL_CONST(79197.596284205531/8.0), REAL_CONST(79219.96453728342/8.0), REAL_CONST(79242.33436942687/8.0), REAL_CONST(79264.705780412987/8.0), REAL_CONST(79287.078770018954/8.0), REAL_CONST(79309.453338022009/8.0), REAL_CONST(79331.829484199508/8.0), REAL_CONST(79354.207208328866/8.0), REAL_CONST(79376.586510187582/8.0), REAL_CONST(79398.967389553218/8.0), REAL_CONST(79421.349846203433/8.0), REAL_CONST(79443.733879915948/8.0), REAL_CONST(79466.119490468584/8.0), REAL_CONST(79488.50667763922/8.0), REAL_CONST(79510.895441205823/8.0), REAL_CONST(79533.285780946433/8.0), REAL_CONST(79555.677696639163/8.0), REAL_CONST(79578.071188062226/8.0), REAL_CONST(79600.466254993895/8.0), REAL_CONST(79622.862897212515/8.0), REAL_CONST(79645.261114496549/8.0), REAL_CONST(79667.660906624471/8.0), REAL_CONST(79690.062273374875/8.0), REAL_CONST(79712.465214526455/8.0), REAL_CONST(79734.869729857935/8.0), REAL_CONST(79757.275819148126/8.0), REAL_CONST(79779.683482175955/8.0), REAL_CONST(79802.092718720378/8.0), REAL_CONST(79824.503528560454/8.0), REAL_CONST(79846.915911475327/8.0), REAL_CONST(79869.329867244203/8.0), REAL_CONST(79891.745395646343/8.0), REAL_CONST(79914.162496461155/8.0), REAL_CONST(79936.581169468045/8.0), REAL_CONST(79959.001414446553/8.0), REAL_CONST(79981.423231176261/8.0), REAL_CONST(80003.846619436852/8.0), REAL_CONST(80026.271579008084/8.0), REAL_CONST(80048.698109669771/8.0), REAL_CONST(80071.12621120183/8.0), REAL_CONST(80093.555883384237/8.0), REAL_CONST(80115.987125997053/8.0), REAL_CONST(80138.419938820414/8.0), REAL_CONST(80160.854321634528/8.0), REAL_CONST(80183.290274219689/8.0), REAL_CONST(80205.727796356281/8.0), REAL_CONST(80228.166887824715/8.0), REAL_CONST(80250.607548405547/8.0), REAL_CONST(80273.049777879336/8.0), REAL_CONST(80295.493576026798/8.0), REAL_CONST(80317.938942628651/8.0), REAL_CONST(80340.385877465727/8.0), REAL_CONST(80362.834380318949/8.0), REAL_CONST(80385.28445096928/8.0), REAL_CONST(80407.736089197788/8.0), REAL_CONST(80430.189294785596/8.0), REAL_CONST(80452.644067513917/8.0), REAL_CONST(80475.100407164035/8.0), REAL_CONST(80497.558313517322/8.0), REAL_CONST(80520.017786355209/8.0), REAL_CONST(80542.478825459213/8.0), REAL_CONST(80564.941430610925/8.0), REAL_CONST(80587.405601592007/8.0), REAL_CONST(80609.871338184195/8.0), REAL_CONST(80632.338640169342/8.0), REAL_CONST(80654.8075073293/8.0), REAL_CONST(80677.277939446067/8.0), REAL_CONST(80699.749936301683/8.0), REAL_CONST(80722.223497678278/8.0), REAL_CONST(80744.698623358039/8.0), REAL_CONST(80767.17531312324/8.0), REAL_CONST(80789.653566756242/8.0), REAL_CONST(80812.133384039465/8.0), REAL_CONST(80834.614764755403/8.0), REAL_CONST(80857.097708686648/8.0), REAL_CONST(80879.582215615854/8.0), REAL_CONST(80902.068285325731/8.0), REAL_CONST(80924.555917599093/8.0), REAL_CONST(80947.045112218824/8.0), REAL_CONST(80969.535868967869/8.0), REAL_CONST(80992.028187629272/8.0), REAL_CONST(81014.522067986123/8.0), REAL_CONST(81037.017509821613/8.0), REAL_CONST(81059.514512919006/8.0), REAL_CONST(81082.013077061609/8.0), REAL_CONST(81104.513202032831/8.0), REAL_CONST(81127.014887616184/8.0), REAL_CONST(81149.518133595193/8.0), REAL_CONST(81172.022939753486/8.0), REAL_CONST(81194.529305874807/8.0), REAL_CONST(81217.037231742899/8.0), REAL_CONST(81239.546717141639/8.0), REAL_CONST(81262.057761854958/8.0), REAL_CONST(81284.570365666848/8.0), REAL_CONST(81307.084528361403/8.0), REAL_CONST(81329.600249722775/8.0), REAL_CONST(81352.117529535186/8.0), REAL_CONST(81374.636367582949/8.0), REAL_CONST(81397.156763650448/8.0), REAL_CONST(81419.678717522125/8.0), REAL_CONST(81442.202228982511/8.0), REAL_CONST(81464.727297816222/8.0), REAL_CONST(81487.253923807933/8.0), REAL_CONST(81509.782106742379/8.0), REAL_CONST(81532.311846404409/8.0), REAL_CONST(81554.843142578902/8.0), REAL_CONST(81577.375995050839/8.0), REAL_CONST(81599.910403605274/8.0), REAL_CONST(81622.446368027333/8.0), REAL_CONST(81644.983888102215/8.0), REAL_CONST(81667.522963615178/8.0), REAL_CONST(81690.063594351581/8.0), REAL_CONST(81712.605780096841/8.0), REAL_CONST(81735.149520636449/8.0), REAL_CONST(81757.694815755967/8.0), REAL_CONST(81780.241665241047/8.0), REAL_CONST(81802.79006887741/8.0), REAL_CONST(81825.340026450824/8.0), REAL_CONST(81847.891537747171/8.0), REAL_CONST(81870.444602552379/8.0), REAL_CONST(81892.999220652477/8.0), REAL_CONST(81915.555391833506/8.0), REAL_CONST(81938.113115881672/8.0), REAL_CONST(81960.672392583176/8.0), REAL_CONST(81983.233221724338/8.0), REAL_CONST(82005.795603091537/8.0), REAL_CONST(82028.359536471224/8.0), REAL_CONST(82050.925021649906/8.0), REAL_CONST(82073.492058414209/8.0), REAL_CONST(82096.060646550788/8.0), REAL_CONST(82118.630785846399/8.0), REAL_CONST(82141.202476087841/8.0), REAL_CONST(82163.775717062032/8.0), REAL_CONST(82186.35050855593/8.0), REAL_CONST(82208.926850356569/8.0), REAL_CONST(82231.504742251054/8.0), REAL_CONST(82254.084184026578/8.0), REAL_CONST(82276.665175470393/8.0), REAL_CONST(82299.24771636985/8.0), REAL_CONST(82321.831806512317/8.0), REAL_CONST(82344.417445685307/8.0), REAL_CONST(82367.004633676348/8.0), REAL_CONST(82389.593370273054/8.0), REAL_CONST(82412.183655263143/8.0), REAL_CONST(82434.775488434374/8.0), REAL_CONST(82457.368869574595/8.0), REAL_CONST(82479.963798471697/8.0), REAL_CONST(82502.560274913689/8.0), REAL_CONST(82525.158298688606/8.0), REAL_CONST(82547.757869584602/8.0), REAL_CONST(82570.35898738986/8.0), REAL_CONST(82592.961651892678/8.0), REAL_CONST(82615.565862881398/8.0), REAL_CONST(82638.171620144421/8.0), REAL_CONST(82660.778923470265/8.0), REAL_CONST(82683.387772647475/8.0), REAL_CONST(82705.998167464713/8.0), REAL_CONST(82728.610107710658/8.0), REAL_CONST(82751.223593174116/8.0), REAL_CONST(82773.83862364394/8.0), REAL_CONST(82796.45519890904/8.0), REAL_CONST(82819.073318758441/8.0), REAL_CONST(82841.692982981185/8.0), REAL_CONST(82864.314191366429/8.0), REAL_CONST(82886.936943703375/8.0), REAL_CONST(82909.561239781324/8.0), REAL_CONST(82932.187079389638/8.0), REAL_CONST(82954.814462317736/8.0), REAL_CONST(82977.443388355125/8.0), REAL_CONST(83000.073857291369/8.0), REAL_CONST(83022.70586891612/8.0), REAL_CONST(83045.339423019104/8.0), REAL_CONST(83067.974519390089/8.0), REAL_CONST(83090.611157818959/8.0), REAL_CONST(83113.249338095629/8.0), REAL_CONST(83135.8890600101/8.0), REAL_CONST(83158.530323352461/8.0), REAL_CONST(83181.173127912858/8.0), REAL_CONST(83203.817473481497/8.0), REAL_CONST(83226.463359848669/8.0), REAL_CONST(83249.11078680474/8.0), REAL_CONST(83271.759754140134/8.0), REAL_CONST(83294.410261645375/8.0), REAL_CONST(83317.062309111003/8.0), REAL_CONST(83339.715896327703/8.0), REAL_CONST(83362.371023086147/8.0), REAL_CONST(83385.027689177165/8.0), REAL_CONST(83407.685894391587/8.0), REAL_CONST(83430.345638520361/8.0), REAL_CONST(83453.006921354478/8.0), REAL_CONST(83475.669742685001/8.0), REAL_CONST(83498.334102303095/8.0), REAL_CONST(83520.999999999942/8.0), REAL_CONST(83543.667435566866/8.0), REAL_CONST(83566.336408795192/8.0), REAL_CONST(83589.006919476349/8.0), REAL_CONST(83611.678967401851/8.0), REAL_CONST(83634.352552363242/8.0), REAL_CONST(83657.027674152167/8.0), REAL_CONST(83679.704332560359/8.0), REAL_CONST(83702.382527379552/8.0), REAL_CONST(83725.062258401638/8.0), REAL_CONST(83747.743525418511/8.0), REAL_CONST(83770.42632822218/8.0), REAL_CONST(83793.110666604684/8.0), REAL_CONST(83815.796540358162/8.0), REAL_CONST(83838.483949274829/8.0), REAL_CONST(83861.172893146941/8.0), REAL_CONST(83883.863371766842/8.0), REAL_CONST(83906.555384926964/8.0), REAL_CONST(83929.248932419752/8.0), REAL_CONST(83951.944014037799/8.0), REAL_CONST(83974.640629573696/8.0), REAL_CONST(83997.338778820151/8.0), REAL_CONST(84020.038461569929/8.0), REAL_CONST(84042.739677615857/8.0), REAL_CONST(84065.442426750829/8.0), REAL_CONST(84088.146708767847/8.0), REAL_CONST(84110.852523459922/8.0), REAL_CONST(84133.559870620171/8.0), REAL_CONST(84156.268750041796/8.0), REAL_CONST(84178.979161518029/8.0), REAL_CONST(84201.691104842204/8.0), REAL_CONST(84224.404579807713/8.0), REAL_CONST(84247.119586208006/8.0), REAL_CONST(84269.83612383662/8.0), REAL_CONST(84292.55419248715/8.0), REAL_CONST(84315.273791953281/8.0), REAL_CONST(84337.994922028738/8.0), REAL_CONST(84360.717582507335/8.0), REAL_CONST(84383.441773182945/8.0), REAL_CONST(84406.167493849513/8.0), REAL_CONST(84428.894744301069/8.0), REAL_CONST(84451.623524331691/8.0), REAL_CONST(84474.353833735542/8.0), REAL_CONST(84497.085672306828/8.0), REAL_CONST(84519.819039839858/8.0), REAL_CONST(84542.553936128999/8.0), REAL_CONST(84565.290360968676/8.0), REAL_CONST(84588.028314153402/8.0), REAL_CONST(84610.767795477717/8.0), REAL_CONST(84633.508804736295/8.0), REAL_CONST(84656.251341723822/8.0), REAL_CONST(84678.995406235073/8.0), REAL_CONST(84701.740998064924/8.0), REAL_CONST(84724.488117008252/8.0), REAL_CONST(84747.236762860062/8.0), REAL_CONST(84769.986935415407/8.0), REAL_CONST(84792.73863446941/8.0), REAL_CONST(84815.491859817252/8.0), REAL_CONST(84838.246611254188/8.0), REAL_CONST(84861.002888575575/8.0), REAL_CONST(84883.760691576768/8.0), REAL_CONST(84906.520020053256/8.0), REAL_CONST(84929.28087380057/8.0), REAL_CONST(84952.043252614312/8.0), REAL_CONST(84974.807156290146/8.0), REAL_CONST(84997.572584623806/8.0), REAL_CONST(85020.339537411113/8.0), REAL_CONST(85043.108014447949/8.0), REAL_CONST(85065.878015530237/8.0), REAL_CONST(85088.649540453989/8.0), REAL_CONST(85111.422589015303/8.0), REAL_CONST(85134.197161010321/8.0), REAL_CONST(85156.973256235244/8.0), REAL_CONST(85179.750874486374/8.0), REAL_CONST(85202.530015560071/8.0), REAL_CONST(85225.310679252725/8.0), REAL_CONST(85248.092865360857/8.0), REAL_CONST(85270.876573681016/8.0), REAL_CONST(85293.661804009811/8.0), REAL_CONST(85316.448556143951/8.0), REAL_CONST(85339.236829880188/8.0), REAL_CONST(85362.026625015351/8.0), REAL_CONST(85384.817941346351/8.0), REAL_CONST(85407.610778670132/8.0), REAL_CONST(85430.405136783724/8.0), REAL_CONST(85453.201015484257/8.0), REAL_CONST(85475.998414568865/8.0), REAL_CONST(85498.797333834795/8.0), REAL_CONST(85521.597773079353/8.0), REAL_CONST(85544.399732099904/8.0), REAL_CONST(85567.203210693886/8.0), REAL_CONST(85590.008208658808/8.0), REAL_CONST(85612.814725792239/8.0), REAL_CONST(85635.62276189182/8.0), REAL_CONST(85658.432316755265/8.0), REAL_CONST(85681.243390180331/8.0), REAL_CONST(85704.055981964877/8.0), REAL_CONST(85726.870091906807/8.0), REAL_CONST(85749.685719804082/8.0), REAL_CONST(85772.502865454764/8.0), REAL_CONST(85795.321528656961/8.0), REAL_CONST(85818.141709208852/8.0), REAL_CONST(85840.963406908675/8.0), REAL_CONST(85863.78662155474/8.0), REAL_CONST(85886.611352945445/8.0), REAL_CONST(85909.437600879217/8.0), REAL_CONST(85932.26536515457/8.0), REAL_CONST(85955.094645570091/8.0), REAL_CONST(85977.92544192441/8.0), REAL_CONST(86000.757754016275/8.0), REAL_CONST(86023.591581644432/8.0), REAL_CONST(86046.426924607746/8.0), REAL_CONST(86069.263782705122/8.0), REAL_CONST(86092.102155735556/8.0), REAL_CONST(86114.942043498071/8.0), REAL_CONST(86137.783445791807/8.0), REAL_CONST(86160.626362415918/8.0), REAL_CONST(86183.470793169676/8.0), REAL_CONST(86206.316737852379/8.0), REAL_CONST(86229.164196263402/8.0), REAL_CONST(86252.013168202204/8.0), REAL_CONST(86274.863653468303/8.0), REAL_CONST(86297.715651861261/8.0), REAL_CONST(86320.569163180728/8.0), REAL_CONST(86343.424187226425/8.0), REAL_CONST(86366.280723798132/8.0), REAL_CONST(86389.138772695675/8.0), REAL_CONST(86411.998333718977/8.0), REAL_CONST(86434.859406668009/8.0), REAL_CONST(86457.721991342827/8.0), REAL_CONST(86480.586087543532/8.0), REAL_CONST(86503.451695070296/8.0), REAL_CONST(86526.318813723352/8.0), REAL_CONST(86549.187443303032/8.0), REAL_CONST(86572.057583609683/8.0), REAL_CONST(86594.929234443756/8.0), REAL_CONST(86617.802395605773/8.0), REAL_CONST(86640.677066896271/8.0), REAL_CONST(86663.553248115903/8.0), REAL_CONST(86686.43093906538/8.0), REAL_CONST(86709.310139545443/8.0), REAL_CONST(86732.190849356964/8.0), REAL_CONST(86755.073068300815/8.0), REAL_CONST(86777.956796177954/8.0), REAL_CONST(86800.842032789442/8.0), REAL_CONST(86823.728777936354/8.0), REAL_CONST(86846.617031419853/8.0), REAL_CONST(86869.506793041175/8.0), REAL_CONST(86892.398062601613/8.0), REAL_CONST(86915.290839902518/8.0), REAL_CONST(86938.185124745316/8.0), REAL_CONST(86961.080916931489/8.0), REAL_CONST(86983.978216262592/8.0), REAL_CONST(87006.87702254027/8.0), REAL_CONST(87029.777335566177/8.0), REAL_CONST(87052.67915514209/8.0), REAL_CONST(87075.582481069796/8.0), REAL_CONST(87098.487313151185/8.0), REAL_CONST(87121.39365118822/8.0), REAL_CONST(87144.301494982894/8.0), REAL_CONST(87167.210844337285/8.0), REAL_CONST(87190.121699053532/8.0), REAL_CONST(87213.034058933845/8.0), REAL_CONST(87235.947923780506/8.0), REAL_CONST(87258.863293395829/8.0), REAL_CONST(87281.780167582241/8.0), REAL_CONST(87304.698546142172/8.0), REAL_CONST(87327.618428878181/8.0), REAL_CONST(87350.539815592856/8.0), REAL_CONST(87373.462706088845/8.0), REAL_CONST(87396.387100168897/8.0), REAL_CONST(87419.312997635774/8.0), REAL_CONST(87442.240398292357/8.0), REAL_CONST(87465.16930194154/8.0), REAL_CONST(87488.099708386319/8.0), REAL_CONST(87511.031617429733/8.0), REAL_CONST(87533.965028874911/8.0), REAL_CONST(87556.899942525008/8.0), REAL_CONST(87579.836358183282/8.0), REAL_CONST(87602.774275653021/8.0), REAL_CONST(87625.713694737613/8.0), REAL_CONST(87648.654615240492/8.0), REAL_CONST(87671.597036965148/8.0), REAL_CONST(87694.540959715145/8.0), REAL_CONST(87717.486383294105/8.0), REAL_CONST(87740.433307505737/8.0), REAL_CONST(87763.381732153779/8.0), REAL_CONST(87786.331657042057/8.0), REAL_CONST(87809.283081974456/8.0), REAL_CONST(87832.236006754916/8.0), REAL_CONST(87855.190431187453/8.0), REAL_CONST(87878.146355076155/8.0), REAL_CONST(87901.103778225151/8.0), REAL_CONST(87924.062700438633/8.0), REAL_CONST(87947.023121520891/8.0), REAL_CONST(87969.985041276246/8.0), REAL_CONST(87992.948459509105/8.0), REAL_CONST(88015.913376023906/8.0), REAL_CONST(88038.879790625171/8.0), REAL_CONST(88061.847703117513/8.0), REAL_CONST(88084.817113305573/8.0), REAL_CONST(88107.788020994049/8.0), REAL_CONST(88130.760425987726/8.0), REAL_CONST(88153.734328091465/8.0), REAL_CONST(88176.709727110137/8.0), REAL_CONST(88199.686622848749/8.0), REAL_CONST(88222.665015112303/8.0), REAL_CONST(88245.644903705906/8.0), REAL_CONST(88268.626288434709/8.0), REAL_CONST(88291.609169103947/8.0), REAL_CONST(88314.593545518903/8.0), REAL_CONST(88337.579417484914/8.0), REAL_CONST(88360.566784807408/8.0), REAL_CONST(88383.555647291854/8.0), REAL_CONST(88406.546004743795/8.0), REAL_CONST(88429.537856968818/8.0), REAL_CONST(88452.531203772611/8.0), REAL_CONST(88475.52604496089/8.0), REAL_CONST(88498.522380339447/8.0), REAL_CONST(88521.52020971413/8.0), REAL_CONST(88544.519532890874/8.0), REAL_CONST(88567.520349675644/8.0), REAL_CONST(88590.522659874507/8.0), REAL_CONST(88613.526463293543/8.0), REAL_CONST(88636.531759738922/8.0), REAL_CONST(88659.538549016899/8.0), REAL_CONST(88682.546830933745/8.0), REAL_CONST(88705.556605295846/8.0), REAL_CONST(88728.567871909589/8.0), REAL_CONST(88751.580630581491/8.0), REAL_CONST(88774.594881118086/8.0), REAL_CONST(88797.610623325963/8.0), REAL_CONST(88820.62785701183/8.0), REAL_CONST(88843.646581982393/8.0), REAL_CONST(88866.666798044462/8.0), REAL_CONST(88889.688505004888/8.0), REAL_CONST(88912.711702670611/8.0), REAL_CONST(88935.7363908486/8.0), REAL_CONST(88958.762569345898/8.0), REAL_CONST(88981.790237969632/8.0), REAL_CONST(89004.81939652696/8.0), REAL_CONST(89027.850044825114/8.0), REAL_CONST(89050.882182671412/8.0), REAL_CONST(89073.9158098732/8.0), REAL_CONST(89096.950926237885/8.0), REAL_CONST(89119.987531572973/8.0), REAL_CONST(89143.025625686001/8.0), REAL_CONST(89166.065208384563/8.0), REAL_CONST(89189.106279476357/8.0), REAL_CONST(89212.148838769106/8.0), REAL_CONST(89235.192886070581/8.0), REAL_CONST(89258.238421188667/8.0), REAL_CONST(89281.285443931265/8.0), REAL_CONST(89304.333954106376/8.0), REAL_CONST(89327.383951522017/8.0), REAL_CONST(89350.435435986306/8.0), REAL_CONST(89373.488407307406/8.0), REAL_CONST(89396.542865293537/8.0), REAL_CONST(89419.598809753006/8.0), REAL_CONST(89442.656240494165/8.0), REAL_CONST(89465.715157325409/8.0), REAL_CONST(89488.775560055219/8.0), REAL_CONST(89511.837448492137/8.0), REAL_CONST(89534.900822444746/8.0), REAL_CONST(89557.965681721733/8.0), REAL_CONST(89581.032026131812/8.0), REAL_CONST(89604.099855483742/8.0), REAL_CONST(89627.169169586399/8.0), REAL_CONST(89650.239968248672/8.0), REAL_CONST(89673.312251279538/8.0), REAL_CONST(89696.386018488018/8.0), REAL_CONST(89719.461269683205/8.0), REAL_CONST(89742.53800467425/8.0), REAL_CONST(89765.616223270365/8.0), REAL_CONST(89788.69592528083/8.0), REAL_CONST(89811.777110514988/8.0), REAL_CONST(89834.859778782207/8.0), REAL_CONST(89857.943929891975/8.0), REAL_CONST(89881.029563653807/8.0), REAL_CONST(89904.116679877261/8.0), REAL_CONST(89927.205278372014/8.0), REAL_CONST(89950.29535894774/8.0), REAL_CONST(89973.386921414218/8.0), REAL_CONST(89996.479965581268/8.0), REAL_CONST(90019.574491258769/8.0), REAL_CONST(90042.670498256688/8.0), REAL_CONST(90065.767986385021/8.0), REAL_CONST(90088.866955453836/8.0), REAL_CONST(90111.967405273259/8.0), REAL_CONST(90135.069335653476/8.0), REAL_CONST(90158.172746404758/8.0), REAL_CONST(90181.277637337407/8.0), REAL_CONST(90204.384008261797/8.0), REAL_CONST(90227.49185898836/8.0), REAL_CONST(90250.601189327586/8.0), REAL_CONST(90273.711999090039/8.0), REAL_CONST(90296.824288086325/8.0), REAL_CONST(90319.938056127125/8.0), REAL_CONST(90343.053303023189/8.0), REAL_CONST(90366.170028585286/8.0), REAL_CONST(90389.288232624298/8.0), REAL_CONST(90412.407914951138/8.0), REAL_CONST(90435.529075376777/8.0), REAL_CONST(90458.651713712257/8.0), REAL_CONST(90481.775829768681/8.0), REAL_CONST(90504.901423357209/8.0), REAL_CONST(90528.028494289058/8.0), REAL_CONST(90551.157042375504/8.0), REAL_CONST(90574.287067427911/8.0), REAL_CONST(90597.418569257643/8.0), REAL_CONST(90620.551547676194/8.0), REAL_CONST(90643.686002495073/8.0), REAL_CONST(90666.821933525847/8.0), REAL_CONST(90689.959340580186/8.0), REAL_CONST(90713.098223469773/8.0), REAL_CONST(90736.238582006365/8.0), REAL_CONST(90759.380416001804/8.0), REAL_CONST(90782.523725267951/8.0), REAL_CONST(90805.668509616764/8.0), REAL_CONST(90828.814768860233/8.0), REAL_CONST(90851.962502810435/8.0), REAL_CONST(90875.11171127946/8.0), REAL_CONST(90898.262394079517/8.0), REAL_CONST(90921.414551022855/8.0), REAL_CONST(90944.568181921743/8.0), REAL_CONST(90967.72328658856/8.0), REAL_CONST(90990.879864835719/8.0), REAL_CONST(91014.037916475718/8.0), REAL_CONST(91037.19744132107/8.0), REAL_CONST(91060.358439184391/8.0), REAL_CONST(91083.520909878338/8.0), REAL_CONST(91106.684853215629/8.0), REAL_CONST(91129.850269009039/8.0), REAL_CONST(91153.017157071401/8.0), REAL_CONST(91176.185517215621/8.0), REAL_CONST(91199.355349254649/8.0), REAL_CONST(91222.526653001492/8.0), REAL_CONST(91245.699428269247/8.0), REAL_CONST(91268.873674871036/8.0), REAL_CONST(91292.049392620058/8.0), REAL_CONST(91315.226581329553/8.0), REAL_CONST(91338.405240812834/8.0), REAL_CONST(91361.585370883287/8.0), REAL_CONST(91384.766971354344/8.0), REAL_CONST(91407.950042039476/8.0), REAL_CONST(91431.134582752245/8.0), REAL_CONST(91454.320593306256/8.0), REAL_CONST(91477.508073515171/8.0), REAL_CONST(91500.697023192712/8.0), REAL_CONST(91523.887442152685/8.0), REAL_CONST(91547.07933020893/8.0), REAL_CONST(91570.272687175326/8.0), REAL_CONST(91593.467512865856/8.0), REAL_CONST(91616.663807094534/8.0), REAL_CONST(91639.861569675442/8.0), REAL_CONST(91663.060800422725/8.0), REAL_CONST(91686.261499150554/8.0), REAL_CONST(91709.463665673218/8.0), REAL_CONST(91732.66729980502/8.0), REAL_CONST(91755.872401360321/8.0), REAL_CONST(91779.078970153569/8.0), REAL_CONST(91802.287005999257/8.0), REAL_CONST(91825.49650871192/8.0), REAL_CONST(91848.707478106167/8.0), REAL_CONST(91871.91991399668/8.0), REAL_CONST(91895.133816198169/8.0), REAL_CONST(91918.349184525418/8.0), REAL_CONST(91941.566018793281/8.0), REAL_CONST(91964.784318816659/8.0), REAL_CONST(91988.004084410495/8.0), REAL_CONST(92011.22531538982/8.0), REAL_CONST(92034.448011569708/8.0), REAL_CONST(92057.672172765277/8.0), REAL_CONST(92080.897798791746/8.0), REAL_CONST(92104.124889464365/8.0), REAL_CONST(92127.353444598411/8.0), REAL_CONST(92150.58346400928/8.0), REAL_CONST(92173.814947512379/8.0), REAL_CONST(92197.04789492322/8.0), REAL_CONST(92220.282306057314/8.0), REAL_CONST(92243.518180730272/8.0), REAL_CONST(92266.755518757753/8.0), REAL_CONST(92289.994319955469/8.0), REAL_CONST(92313.234584139194/8.0), REAL_CONST(92336.476311124774/8.0), REAL_CONST(92359.719500728082/8.0), REAL_CONST(92382.964152765067/8.0), REAL_CONST(92406.210267051734/8.0), REAL_CONST(92429.457843404161/8.0), REAL_CONST(92452.706881638471/8.0), REAL_CONST(92475.957381570814/8.0), REAL_CONST(92499.209343017443/8.0), REAL_CONST(92522.462765794655/8.0), REAL_CONST(92545.717649718805/8.0), REAL_CONST(92568.973994606305/8.0), REAL_CONST(92592.231800273614/8.0), REAL_CONST(92615.491066537259/8.0), REAL_CONST(92638.751793213814/8.0), REAL_CONST(92662.01398011994/8.0), REAL_CONST(92685.277627072326/8.0), REAL_CONST(92708.54273388772/8.0), REAL_CONST(92731.809300382942/8.0), REAL_CONST(92755.077326374871/8.0), REAL_CONST(92778.346811680414/8.0), REAL_CONST(92801.617756116568/8.0), REAL_CONST(92824.890159500384/8.0), REAL_CONST(92848.164021648947/8.0), REAL_CONST(92871.439342379424/8.0), REAL_CONST(92894.716121509016/8.0), REAL_CONST(92917.994358855023/8.0), REAL_CONST(92941.274054234746/8.0), REAL_CONST(92964.555207465572/8.0), REAL_CONST(92987.837818364962/8.0), REAL_CONST(93011.121886750407/8.0), REAL_CONST(93034.407412439468/8.0), REAL_CONST(93057.694395249753/8.0), REAL_CONST(93080.982834998955/8.0), REAL_CONST(93104.272731504767/8.0), REAL_CONST(93127.564084584999/8.0), REAL_CONST(93150.856894057491/8.0), REAL_CONST(93174.15115974014/8.0), REAL_CONST(93197.446881450916/8.0), REAL_CONST(93220.744059007804/8.0), REAL_CONST(93244.04269222889/8.0), REAL_CONST(93267.342780932304/8.0), REAL_CONST(93290.644324936235/8.0), REAL_CONST(93313.947324058914/8.0), REAL_CONST(93337.251778118633/8.0), REAL_CONST(93360.557686933767/8.0), REAL_CONST(93383.865050322696/8.0), REAL_CONST(93407.173868103928/8.0), REAL_CONST(93430.484140095941/8.0), REAL_CONST(93453.795866117362/8.0), REAL_CONST(93477.109045986799/8.0), REAL_CONST(93500.423679522952/8.0), REAL_CONST(93523.739766544561/8.0), REAL_CONST(93547.057306870454/8.0), REAL_CONST(93570.376300319491/8.0), REAL_CONST(93593.696746710571/8.0), REAL_CONST(93617.018645862699/8.0), REAL_CONST(93640.341997594893/8.0), REAL_CONST(93663.666801726242/8.0), REAL_CONST(93686.993058075881/8.0), REAL_CONST(93710.320766463032/8.0), REAL_CONST(93733.64992670693/8.0), REAL_CONST(93756.980538626914/8.0), REAL_CONST(93780.312602042337/8.0), REAL_CONST(93803.646116772637/8.0), REAL_CONST(93826.981082637285/8.0), REAL_CONST(93850.317499455836/8.0), REAL_CONST(93873.655367047861/8.0), REAL_CONST(93896.994685233032/8.0), REAL_CONST(93920.335453831038/8.0), REAL_CONST(93943.677672661666/8.0), REAL_CONST(93967.021341544707/8.0), REAL_CONST(93990.366460300051/8.0), REAL_CONST(94013.713028747632/8.0), REAL_CONST(94037.061046707429/8.0), REAL_CONST(94060.410513999494/8.0), REAL_CONST(94083.761430443905/8.0), REAL_CONST(94107.113795860845/8.0), REAL_CONST(94130.467610070496/8.0), REAL_CONST(94153.822872893157/8.0), REAL_CONST(94177.179584149111/8.0), REAL_CONST(94200.537743658759/8.0), REAL_CONST(94223.897351242529/8.0), REAL_CONST(94247.25840672091/8.0), REAL_CONST(94270.620909914433/8.0), REAL_CONST(94293.98486064373/8.0), REAL_CONST(94317.350258729421/8.0), REAL_CONST(94340.71710399224/8.0), REAL_CONST(94364.085396252936/8.0), REAL_CONST(94387.455135332348/8.0), REAL_CONST(94410.82632105134/8.0), REAL_CONST(94434.198953230851/8.0), REAL_CONST(94457.573031691878/8.0), REAL_CONST(94480.948556255447/8.0), REAL_CONST(94504.325526742658/8.0), REAL_CONST(94527.70394297468/8.0), REAL_CONST(94551.083804772716/8.0), REAL_CONST(94574.465111958023/8.0), REAL_CONST(94597.847864351934/8.0), REAL_CONST(94621.232061775823/8.0), REAL_CONST(94644.617704051096/8.0), REAL_CONST(94668.004790999272/8.0), REAL_CONST(94691.393322441872/8.0), REAL_CONST(94714.783298200506/8.0), REAL_CONST(94738.174718096794/8.0), REAL_CONST(94761.567581952477/8.0), REAL_CONST(94784.961889589307/8.0), REAL_CONST(94808.357640829097/8.0), REAL_CONST(94831.754835493703/8.0), REAL_CONST(94855.153473405066/8.0), REAL_CONST(94878.553554385173/8.0), REAL_CONST(94901.955078256055/8.0), REAL_CONST(94925.358044839784/8.0), REAL_CONST(94948.762453958523/8.0), REAL_CONST(94972.168305434476/8.0), REAL_CONST(94995.575599089891/8.0), REAL_CONST(95018.984334747074/8.0), REAL_CONST(95042.394512228391/8.0), REAL_CONST(95065.806131356265/8.0), REAL_CONST(95089.219191953176/8.0), REAL_CONST(95112.633693841635/8.0), REAL_CONST(95136.04963684424/8.0), REAL_CONST(95159.467020783617/8.0), REAL_CONST(95182.885845482466/8.0), REAL_CONST(95206.306110763529/8.0), REAL_CONST(95229.727816449609/8.0), REAL_CONST(95253.150962363579/8.0), REAL_CONST(95276.575548328314/8.0), REAL_CONST(95300.001574166803/8.0), REAL_CONST(95323.429039702052/8.0), REAL_CONST(95346.857944757154/8.0), REAL_CONST(95370.288289155214/8.0), REAL_CONST(95393.720072719429/8.0), REAL_CONST(95417.153295273019/8.0), REAL_CONST(95440.587956639298/8.0), REAL_CONST(95464.024056641589/8.0), REAL_CONST(95487.461595103305/8.0), REAL_CONST(95510.900571847902/8.0), REAL_CONST(95534.340986698866/8.0), REAL_CONST(95557.782839479783/8.0), REAL_CONST(95581.226130014256/8.0), REAL_CONST(95604.670858125959/8.0), REAL_CONST(95628.117023638595/8.0), REAL_CONST(95651.564626375985/8.0), REAL_CONST(95675.013666161918/8.0), REAL_CONST(95698.464142820303/8.0), REAL_CONST(95721.916056175076/8.0), REAL_CONST(95745.369406050231/8.0), REAL_CONST(95768.824192269807/8.0), REAL_CONST(95792.280414657915/8.0), REAL_CONST(95815.738073038709/8.0), REAL_CONST(95839.197167236387/8.0), REAL_CONST(95862.657697075221/8.0), REAL_CONST(95886.11966237954/8.0), REAL_CONST(95909.583062973688/8.0), REAL_CONST(95933.047898682111/8.0), REAL_CONST(95956.514169329268/8.0), REAL_CONST(95979.981874739708/8.0), REAL_CONST(96003.451014738006/8.0), REAL_CONST(96026.921589148798/8.0), REAL_CONST(96050.393597796792/8.0), REAL_CONST(96073.867040506724/8.0), REAL_CONST(96097.341917103375/8.0), REAL_CONST(96120.818227411626/8.0), REAL_CONST(96144.295971256375/8.0), REAL_CONST(96167.775148462577/8.0), REAL_CONST(96191.255758855244/8.0), REAL_CONST(96214.737802259449/8.0), REAL_CONST(96238.221278500292/8.0), REAL_CONST(96261.70618740299/8.0), REAL_CONST(96285.192528792715/8.0), REAL_CONST(96308.680302494788/8.0), REAL_CONST(96332.169508334526/8.0), REAL_CONST(96355.660146137321/8.0), REAL_CONST(96379.152215728609/8.0), REAL_CONST(96402.645716933868/8.0), REAL_CONST(96426.14064957868/8.0), REAL_CONST(96449.637013488609/8.0), REAL_CONST(96473.134808489311/8.0), REAL_CONST(96496.63403440651/8.0), REAL_CONST(96520.134691065963/8.0), REAL_CONST(96543.636778293469/8.0), REAL_CONST(96567.140295914898/8.0), REAL_CONST(96590.645243756153/8.0), REAL_CONST(96614.151621643221/8.0), REAL_CONST(96637.659429402134/8.0), REAL_CONST(96661.168666858954/8.0), REAL_CONST(96684.679333839798/8.0), REAL_CONST(96708.191430170875/8.0), REAL_CONST(96731.70495567839/8.0), REAL_CONST(96755.219910188665/8.0), REAL_CONST(96778.736293528011/8.0), REAL_CONST(96802.254105522836/8.0), REAL_CONST(96825.77334599958/8.0), REAL_CONST(96849.29401478474/8.0), REAL_CONST(96872.816111704873/8.0), REAL_CONST(96896.339636586577/8.0), REAL_CONST(96919.864589256511/8.0), REAL_CONST(96943.390969541389/8.0), REAL_CONST(96966.918777267958/8.0), REAL_CONST(96990.448012263048/8.0), REAL_CONST(97013.978674353522/8.0), REAL_CONST(97037.510763366285/8.0), REAL_CONST(97061.044279128328/8.0), REAL_CONST(97084.579221466673/8.0), REAL_CONST(97108.115590208385/8.0), REAL_CONST(97131.653385180587/8.0), REAL_CONST(97155.19260621049/8.0), REAL_CONST(97178.733253125291/8.0), REAL_CONST(97202.2753257523/8.0), REAL_CONST(97225.81882391886/8.0), REAL_CONST(97249.363747452342/8.0), REAL_CONST(97272.910096180189/8.0), REAL_CONST(97296.457869929916/8.0), REAL_CONST(97320.007068529041/8.0), REAL_CONST(97343.557691805196/8.0), REAL_CONST(97367.109739586012/8.0), REAL_CONST(97390.663211699197/8.0), REAL_CONST(97414.218107972498/8.0), REAL_CONST(97437.774428233737/8.0), REAL_CONST(97461.332172310766/8.0), REAL_CONST(97484.891340031507/8.0), REAL_CONST(97508.451931223899/8.0), REAL_CONST(97532.013945715982/8.0), REAL_CONST(97555.577383335811/8.0), REAL_CONST(97579.142243911512/8.0), REAL_CONST(97602.708527271257/8.0), REAL_CONST(97626.276233243261/8.0), REAL_CONST(97649.845361655811/8.0), REAL_CONST(97673.415912337223/8.0), REAL_CONST(97696.987885115886/8.0), REAL_CONST(97720.561279820206/8.0), REAL_CONST(97744.1360962787/8.0), REAL_CONST(97767.712334319876/8.0), REAL_CONST(97791.289993772341/8.0), REAL_CONST(97814.869074464703/8.0), REAL_CONST(97838.449576225685/8.0), REAL_CONST(97862.031498883996/8.0), REAL_CONST(97885.614842268449/8.0), REAL_CONST(97909.199606207883/8.0), REAL_CONST(97932.785790531183/8.0), REAL_CONST(97956.37339506732/8.0), REAL_CONST(97979.962419645264/8.0), REAL_CONST(98003.552864094076/8.0), REAL_CONST(98027.144728242856/8.0), REAL_CONST(98050.738011920766/8.0), REAL_CONST(98074.332714956996/8.0), REAL_CONST(98097.928837180807/8.0), REAL_CONST(98121.526378421506/8.0), REAL_CONST(98145.125338508456/8.0), REAL_CONST(98168.725717271067/8.0), REAL_CONST(98192.327514538789/8.0), REAL_CONST(98215.930730141132/8.0), REAL_CONST(98239.535363907664/8.0), REAL_CONST(98263.141415668011/8.0), REAL_CONST(98286.748885251814/8.0), REAL_CONST(98310.357772488816/8.0), REAL_CONST(98333.968077208759/8.0), REAL_CONST(98357.579799241488/8.0), REAL_CONST(98381.192938416847/8.0), REAL_CONST(98404.807494564782/8.0), REAL_CONST(98428.42346751524/8.0), REAL_CONST(98452.040857098269/8.0), REAL_CONST(98475.659663143917/8.0), REAL_CONST(98499.27988548232/8.0), REAL_CONST(98522.901523943656/8.0), REAL_CONST(98546.524578358163/8.0), REAL_CONST(98570.149048556093/8.0), REAL_CONST(98593.774934367786/8.0), REAL_CONST(98617.402235623624/8.0), REAL_CONST(98641.030952154048/8.0), REAL_CONST(98664.661083789513/8.0), REAL_CONST(98688.292630360564/8.0), REAL_CONST(98711.925591697771/8.0), REAL_CONST(98735.559967631794/8.0), REAL_CONST(98759.195757993293/8.0), REAL_CONST(98782.832962613014/8.0), REAL_CONST(98806.471581321734/8.0), REAL_CONST(98830.111613950285/8.0), REAL_CONST(98853.753060329575/8.0), REAL_CONST(98877.39592029051/8.0), REAL_CONST(98901.040193664099/8.0), REAL_CONST(98924.68588028138/8.0), REAL_CONST(98948.33297997342/8.0), REAL_CONST(98971.981492571387/8.0), REAL_CONST(98995.63141790645/8.0), REAL_CONST(99019.282755809851/8.0), REAL_CONST(99042.935506112874/8.0), REAL_CONST(99066.589668646877/8.0), REAL_CONST(99090.245243243233/8.0), REAL_CONST(99113.902229733401/8.0), REAL_CONST(99137.560627948857/8.0), REAL_CONST(99161.220437721131/8.0), REAL_CONST(99184.881658881859/8.0), REAL_CONST(99208.544291262631/8.0), REAL_CONST(99232.208334695169/8.0), REAL_CONST(99255.87378901121/8.0), REAL_CONST(99279.540654042547/8.0), REAL_CONST(99303.208929621018/8.0), REAL_CONST(99326.878615578535/8.0), REAL_CONST(99350.549711746993/8.0), REAL_CONST(99374.222217958435/8.0), REAL_CONST(99397.896134044888/8.0), REAL_CONST(99421.571459838422/8.0), REAL_CONST(99445.248195171211/8.0), REAL_CONST(99468.926339875441/8.0), REAL_CONST(99492.605893783344/8.0), REAL_CONST(99516.286856727209/8.0), REAL_CONST(99539.969228539398/8.0), REAL_CONST(99563.653009052287/8.0), REAL_CONST(99587.338198098325/8.0), REAL_CONST(99611.024795510006/8.0), REAL_CONST(99634.712801119866/8.0), REAL_CONST(99658.402214760499/8.0), REAL_CONST(99682.093036264545/8.0), REAL_CONST(99705.785265464699/8.0), REAL_CONST(99729.478902193689/8.0), REAL_CONST(99753.173946284325/8.0), REAL_CONST(99776.870397569437/8.0), REAL_CONST(99800.56825588191/8.0), REAL_CONST(99824.267521054688/8.0), REAL_CONST(99847.968192920773/8.0), REAL_CONST(99871.670271313182/8.0), REAL_CONST(99895.373756065004/8.0), REAL_CONST(99919.078647009388/8.0), REAL_CONST(99942.78494397951/8.0), REAL_CONST(99966.492646808634/8.0), REAL_CONST(99990.20175533001/8.0), REAL_CONST(100013.91226937699/8.0), REAL_CONST(100037.62418878295/8.0), REAL_CONST(100061.33751338134/8.0), REAL_CONST(100085.05224300563/8.0), REAL_CONST(100108.76837748935/8.0), REAL_CONST(100132.4859166661/8.0), REAL_CONST(100156.2048603695/8.0), REAL_CONST(100179.92520843323/8.0), REAL_CONST(100203.64696069101/8.0), REAL_CONST(100227.37011697664/8.0), REAL_CONST(100251.09467712394/8.0), REAL_CONST(100274.82064096678/8.0), REAL_CONST(100298.54800833909/8.0), REAL_CONST(100322.27677907483/8.0), REAL_CONST(100346.00695300807/8.0), REAL_CONST(100369.73852997283/8.0), REAL_CONST(100393.47150980328/8.0), REAL_CONST(100417.20589233354/8.0), REAL_CONST(100440.94167739789/8.0), REAL_CONST(100464.67886483055/8.0), REAL_CONST(100488.41745446586/8.0), REAL_CONST(100512.1574461382/8.0), REAL_CONST(100535.89883968196/8.0), REAL_CONST(100559.64163493161/8.0), REAL_CONST(100583.38583172169/8.0), REAL_CONST(100607.13142988674/8.0), REAL_CONST(100630.87842926137/8.0), REAL_CONST(100654.62682968024/8.0), REAL_CONST(100678.37663097809/8.0), REAL_CONST(100702.12783298964/8.0), REAL_CONST(100725.88043554971/8.0), REAL_CONST(100749.63443849317/8.0), REAL_CONST(100773.38984165489/8.0), REAL_CONST(100797.14664486986/8.0), REAL_CONST(100820.90484797307/8.0), REAL_CONST(100844.66445079957/8.0), REAL_CONST(100868.42545318443/8.0), REAL_CONST(100892.18785496285/8.0), REAL_CONST(100915.95165596998/8.0), REAL_CONST(100939.71685604109/8.0), REAL_CONST(100963.48345501146/8.0), REAL_CONST(100987.25145271645/8.0), REAL_CONST(101011.02084899142/8.0), REAL_CONST(101034.79164367182/8.0), REAL_CONST(101058.56383659317/8.0), REAL_CONST(101082.33742759094/8.0), REAL_CONST(101106.11241650078/8.0), REAL_CONST(101129.88880315828/8.0), REAL_CONST(101153.66658739912/8.0), REAL_CONST(101177.44576905905/8.0), REAL_CONST(101201.22634797383/8.0), REAL_CONST(101225.00832397929/8.0), REAL_CONST(101248.7916969113/8.0), REAL_CONST(101272.57646660579/8.0), REAL_CONST(101296.36263289873/8.0), REAL_CONST(101320.15019562612/8.0), REAL_CONST(101343.93915462404/8.0), REAL_CONST(101367.7295097286/8.0), REAL_CONST(101391.52126077596/8.0), REAL_CONST(101415.31440760233/8.0), REAL_CONST(101439.10895004397/8.0), REAL_CONST(101462.9048879372/8.0), REAL_CONST(101486.70222111834/8.0), REAL_CONST(101510.50094942382/8.0), REAL_CONST(101534.30107269008/8.0), REAL_CONST(101558.10259075361/8.0), REAL_CONST(101581.90550345098/8.0), REAL_CONST(101605.70981061876/8.0), REAL_CONST(101629.5155120936/8.0), REAL_CONST(101653.32260771218/8.0), REAL_CONST(101677.13109731126/8.0), REAL_CONST(101700.9409807276/8.0), REAL_CONST(101724.75225779804/8.0), REAL_CONST(101748.56492835947/8.0), REAL_CONST(101772.37899224881/8.0), REAL_CONST(101796.19444930303/8.0), REAL_CONST(101820.01129935916/8.0), REAL_CONST(101843.82954225427/8.0), REAL_CONST(101867.64917782549/8.0), REAL_CONST(101891.47020590997/8.0), REAL_CONST(101915.29262634492/8.0), REAL_CONST(101939.11643896763/8.0), REAL_CONST(101962.94164361537/8.0), REAL_CONST(101986.76824012553/8.0), REAL_CONST(102010.59622833549/8.0), REAL_CONST(102034.42560808272/8.0), REAL_CONST(102058.25637920471/8.0), REAL_CONST(102082.08854153901/8.0), REAL_CONST(102105.9220949232/8.0), REAL_CONST(102129.75703919494/8.0), REAL_CONST(102153.59337419191/8.0), REAL_CONST(102177.43109975185/8.0), REAL_CONST(102201.27021571253/8.0), REAL_CONST(102225.1107219118/8.0), REAL_CONST(102248.95261818753/8.0), REAL_CONST(102272.79590437764/8.0), REAL_CONST(102296.64058032009/8.0), REAL_CONST(102320.48664585294/8.0), REAL_CONST(102344.33410081422/8.0), REAL_CONST(102368.18294504205/8.0), REAL_CONST(102392.03317837461/8.0), REAL_CONST(102415.88480065008/8.0), REAL_CONST(102439.73781170673/8.0), REAL_CONST(102463.59221138287/8.0), REAL_CONST(102487.44799951684/8.0), REAL_CONST(102511.30517594704/8.0), REAL_CONST(102535.1637405119/8.0), REAL_CONST(102559.02369304992/8.0), REAL_CONST(102582.88503339965/8.0), REAL_CONST(102606.74776139967/8.0), REAL_CONST(102630.61187688859/8.0), REAL_CONST(102654.4773797051/8.0), REAL_CONST(102678.34426968795/8.0), REAL_CONST(102702.21254667587/8.0), REAL_CONST(102726.08221050771/8.0), REAL_CONST(102749.95326102231/8.0), REAL_CONST(102773.8256980586/8.0), REAL_CONST(102797.69952145554/8.0), REAL_CONST(102821.57473105213/8.0), REAL_CONST(102845.45132668741/8.0), REAL_CONST(102869.32930820051/8.0), REAL_CONST(102893.20867543056/8.0), REAL_CONST(102917.08942821674/8.0), REAL_CONST(102940.97156639832/8.0), REAL_CONST(102964.85508981455/8.0), REAL_CONST(102988.73999830478/8.0), REAL_CONST(103012.6262917084/8.0), REAL_CONST(103036.51396986481/8.0), REAL_CONST(103060.40303261351/8.0), REAL_CONST(103084.293479794/8.0), REAL_CONST(103108.18531124585/8.0), REAL_CONST(103132.07852680866/8.0), REAL_CONST(103155.97312632212/8.0), REAL_CONST(103179.8691096259/8.0), REAL_CONST(103203.76647655977/8.0), REAL_CONST(103227.66522696352/8.0), REAL_CONST(103251.56536067701/8.0), REAL_CONST(103275.46687754011/8.0), REAL_CONST(103299.36977739276/8.0), REAL_CONST(103323.27406007495/8.0), REAL_CONST(103347.1797254267/8.0), REAL_CONST(103371.0867732881/8.0), REAL_CONST(103394.99520349925/8.0), REAL_CONST(103418.90501590034/8.0), REAL_CONST(103442.81621033157/8.0), REAL_CONST(103466.72878663319/8.0), REAL_CONST(103490.64274464553/8.0), REAL_CONST(103514.55808420894/8.0), REAL_CONST(103538.4748051638/8.0), REAL_CONST(103562.39290735057/8.0), REAL_CONST(103586.31239060973/8.0), REAL_CONST(103610.23325478184/8.0), REAL_CONST(103634.15549970744/8.0), REAL_CONST(103658.07912522719/8.0), REAL_CONST(103682.00413118176/8.0), REAL_CONST(103705.93051741188/8.0), REAL_CONST(103729.85828375829/8.0), REAL_CONST(103753.78743006183/8.0), REAL_CONST(103777.71795616332/8.0), REAL_CONST(103801.64986190372/8.0), REAL_CONST(103825.58314712394/8.0), REAL_CONST(103849.51781166498/8.0), REAL_CONST(103873.4538553679/8.0), REAL_CONST(103897.39127807376/8.0), REAL_CONST(103921.33007962372/8.0), REAL_CONST(103945.27025985894/8.0), REAL_CONST(103969.21181862066/8.0), REAL_CONST(103993.15475575015/8.0), REAL_CONST(104017.0990710887/8.0), REAL_CONST(104041.0447644777/8.0), REAL_CONST(104064.99183575854/8.0), REAL_CONST(104088.94028477269/8.0), REAL_CONST(104112.89011136163/8.0), REAL_CONST(104136.84131536692/8.0), REAL_CONST(104160.79389663014/8.0), REAL_CONST(104184.74785499295/8.0), REAL_CONST(104208.70319029699/8.0), REAL_CONST(104232.65990238401/8.0), REAL_CONST(104256.61799109577/8.0), REAL_CONST(104280.57745627411/8.0), REAL_CONST(104304.53829776087/8.0), REAL_CONST(104328.50051539797/8.0), REAL_CONST(104352.46410902737/8.0), REAL_CONST(104376.42907849104/8.0), REAL_CONST(104400.39542363105/8.0), REAL_CONST(104424.36314428948/8.0), REAL_CONST(104448.33224030846/8.0), REAL_CONST(104472.3027115302/8.0), REAL_CONST(104496.27455779689/8.0), REAL_CONST(104520.24777895081/8.0), REAL_CONST(104544.22237483428/8.0), REAL_CONST(104568.19834528965/8.0), REAL_CONST(104592.17569015936/8.0), REAL_CONST(104616.15440928582/8.0), REAL_CONST(104640.13450251156/8.0), REAL_CONST(104664.1159696791/8.0), REAL_CONST(104688.09881063103/8.0), REAL_CONST(104712.08302520998/8.0), REAL_CONST(104736.06861325864/8.0), REAL_CONST(104760.05557461972/8.0), REAL_CONST(104784.043909136/8.0), REAL_CONST(104808.03361665027/8.0), REAL_CONST(104832.0246970054/8.0), REAL_CONST(104856.01715004431/8.0), REAL_CONST(104880.01097560991/8.0), REAL_CONST(104904.00617354522/8.0), REAL_CONST(104928.00274369326/8.0), REAL_CONST(104952.00068589712/8.0), REAL_CONST(104975.99999999993/8.0), REAL_CONST(105000.00068584486/8.0), REAL_CONST(105024.00274327511/8.0), REAL_CONST(105048.00617213396/8.0), REAL_CONST(105072.0109722647/8.0), REAL_CONST(105096.0171435107/8.0), REAL_CONST(105120.02468571534/8.0), REAL_CONST(105144.03359872208/8.0), REAL_CONST(105168.04388237436/8.0), REAL_CONST(105192.05553651576/8.0), REAL_CONST(105216.06856098982/8.0), REAL_CONST(105240.08295564017/8.0), REAL_CONST(105264.09872031047/8.0), REAL_CONST(105288.11585484444/8.0), REAL_CONST(105312.13435908582/8.0), REAL_CONST(105336.1542328784/8.0), REAL_CONST(105360.17547606604/8.0), REAL_CONST(105384.19808849262/8.0), REAL_CONST(105408.22207000206/8.0), REAL_CONST(105432.24742043833/8.0), REAL_CONST(105456.27413964548/8.0), REAL_CONST(105480.30222746753/8.0), REAL_CONST(105504.33168374863/8.0), REAL_CONST(105528.36250833291/8.0), REAL_CONST(105552.39470106458/8.0), REAL_CONST(105576.42826178786/8.0), REAL_CONST(105600.46319034706/8.0), REAL_CONST(105624.49948658649/8.0), REAL_CONST(105648.53715035053/8.0), REAL_CONST(105672.5761814836/8.0), REAL_CONST(105696.61657983017/8.0), REAL_CONST(105720.65834523473/8.0), REAL_CONST(105744.70147754184/8.0), REAL_CONST(105768.7459765961/8.0), REAL_CONST(105792.79184224214/8.0), REAL_CONST(105816.83907432464/8.0), REAL_CONST(105840.88767268835/8.0), REAL_CONST(105864.93763717801/8.0), REAL_CONST(105888.98896763846/8.0), REAL_CONST(105913.04166391456/8.0), REAL_CONST(105937.09572585119/8.0), REAL_CONST(105961.15115329332/8.0), REAL_CONST(105985.20794608595/8.0), REAL_CONST(106009.26610407409/8.0), REAL_CONST(106033.32562710284/8.0), REAL_CONST(106057.38651501729/8.0), REAL_CONST(106081.44876766266/8.0), REAL_CONST(106105.51238488412/8.0), REAL_CONST(106129.57736652695/8.0), REAL_CONST(106153.64371243643/8.0), REAL_CONST(106177.71142245791/8.0), REAL_CONST(106201.78049643678/8.0), REAL_CONST(106225.85093421848/8.0), REAL_CONST(106249.92273564848/8.0), REAL_CONST(106273.99590057228/8.0), REAL_CONST(106298.07042883546/8.0), REAL_CONST(106322.14632028362/8.0), REAL_CONST(106346.22357476239/8.0), REAL_CONST(106370.30219211751/8.0), REAL_CONST(106394.38217219469/8.0), REAL_CONST(106418.46351483969/8.0), REAL_CONST(106442.54621989837/8.0), REAL_CONST(106466.63028721658/8.0), REAL_CONST(106490.71571664025/8.0), REAL_CONST(106514.80250801529/8.0), REAL_CONST(106538.89066118775/8.0), REAL_CONST(106562.98017600364/8.0), REAL_CONST(106587.07105230905/8.0), REAL_CONST(106611.16328995011/8.0), REAL_CONST(106635.25688877302/8.0), REAL_CONST(106659.35184862395/8.0), REAL_CONST(106683.44816934918/8.0), REAL_CONST(106707.54585079502/8.0), REAL_CONST(106731.64489280782/8.0), REAL_CONST(106755.74529523395/8.0), REAL_CONST(106779.84705791986/8.0), REAL_CONST(106803.95018071201/8.0), REAL_CONST(106828.05466345693/8.0), REAL_CONST(106852.16050600118/8.0), REAL_CONST(106876.26770819137/8.0), REAL_CONST(106900.37626987413/8.0), REAL_CONST(106924.48619089619/8.0), REAL_CONST(106948.59747110425/8.0), REAL_CONST(106972.71011034511/8.0), REAL_CONST(106996.82410846559/8.0), REAL_CONST(107020.93946531253/8.0), REAL_CONST(107045.05618073288/8.0), REAL_CONST(107069.17425457356/8.0), REAL_CONST(107093.29368668159/8.0), REAL_CONST(107117.41447690397/8.0), REAL_CONST(107141.53662508781/8.0), REAL_CONST(107165.66013108024/8.0), REAL_CONST(107189.7849947284/8.0), REAL_CONST(107213.91121587952/8.0), REAL_CONST(107238.03879438085/8.0), REAL_CONST(107262.16773007967/8.0), REAL_CONST(107286.29802282334/8.0), REAL_CONST(107310.42967245923/8.0), REAL_CONST(107334.56267883476/8.0), REAL_CONST(107358.69704179741/8.0), REAL_CONST(107382.83276119467/8.0), REAL_CONST(107406.96983687414/8.0), REAL_CONST(107431.10826868335/8.0), REAL_CONST(107455.24805646999/8.0), REAL_CONST(107479.38920008171/8.0), REAL_CONST(107503.53169936626/8.0), REAL_CONST(107527.67555417139/8.0), REAL_CONST(107551.82076434491/8.0), REAL_CONST(107575.96732973469/8.0), REAL_CONST(107600.11525018861/8.0), REAL_CONST(107624.26452555459/8.0), REAL_CONST(107648.41515568066/8.0), REAL_CONST(107672.56714041479/8.0), REAL_CONST(107696.72047960508/8.0), REAL_CONST(107720.87517309963/8.0), REAL_CONST(107745.03122074658/8.0), REAL_CONST(107769.18862239413/8.0), REAL_CONST(107793.34737789053/8.0), REAL_CONST(107817.50748708403/8.0), REAL_CONST(107841.66894982298/8.0), REAL_CONST(107865.83176595572/8.0), REAL_CONST(107889.99593533068/8.0), REAL_CONST(107914.16145779629/8.0), REAL_CONST(107938.32833320105/8.0), REAL_CONST(107962.49656139348/8.0), REAL_CONST(107986.66614222217/8.0), REAL_CONST(108010.83707553572/8.0), REAL_CONST(108035.00936118282/8.0), REAL_CONST(108059.18299901215/8.0), REAL_CONST(108083.35798887245/8.0), REAL_CONST(108107.53433061253/8.0), REAL_CONST(108131.71202408121/8.0), REAL_CONST(108155.89106912735/8.0), REAL_CONST(108180.07146559987/8.0), REAL_CONST(108204.25321334775/8.0), REAL_CONST(108228.43631221994/8.0), REAL_CONST(108252.62076206553/8.0), REAL_CONST(108276.80656273357/8.0), REAL_CONST(108300.99371407321/8.0), REAL_CONST(108325.18221593359/8.0), REAL_CONST(108349.37206816394/8.0), REAL_CONST(108373.56327061349/8.0), REAL_CONST(108397.75582313156/8.0), REAL_CONST(108421.94972556747/8.0), REAL_CONST(108446.1449777706/8.0), REAL_CONST(108470.34157959036/8.0), REAL_CONST(108494.53953087622/8.0), REAL_CONST(108518.73883147769/8.0), REAL_CONST(108542.93948124432/8.0), REAL_CONST(108567.14148002568/8.0), REAL_CONST(108591.34482767139/8.0), REAL_CONST(108615.54952403114/8.0), REAL_CONST(108639.75556895464/8.0), REAL_CONST(108663.96296229165/8.0), REAL_CONST(108688.17170389196/8.0), REAL_CONST(108712.38179360541/8.0), REAL_CONST(108736.59323128188/8.0), REAL_CONST(108760.80601677128/8.0), REAL_CONST(108785.02014992358/8.0), REAL_CONST(108809.23563058881/8.0), REAL_CONST(108833.45245861699/8.0), REAL_CONST(108857.67063385822/8.0), REAL_CONST(108881.89015616261/8.0), REAL_CONST(108906.11102538036/8.0), REAL_CONST(108930.33324136167/8.0), REAL_CONST(108954.55680395682/8.0), REAL_CONST(108978.78171301607/8.0), REAL_CONST(109003.00796838976/8.0), REAL_CONST(109027.23556992831/8.0), REAL_CONST(109051.46451748211/8.0), REAL_CONST(109075.69481090162/8.0), REAL_CONST(109099.92645003737/8.0), REAL_CONST(109124.15943473989/8.0), REAL_CONST(109148.39376485976/8.0), REAL_CONST(109172.62944024763/8.0), REAL_CONST(109196.86646075416/8.0), REAL_CONST(109221.10482623006/8.0), REAL_CONST(109245.34453652608/8.0), REAL_CONST(109269.58559149304/8.0), REAL_CONST(109293.82799098175/8.0), REAL_CONST(109318.07173484311/8.0), REAL_CONST(109342.31682292801/8.0), REAL_CONST(109366.56325508743/8.0), REAL_CONST(109390.81103117237/8.0), REAL_CONST(109415.06015103387/8.0), REAL_CONST(109439.31061452301/8.0), REAL_CONST(109463.56242149093/8.0), REAL_CONST(109487.8155717888/8.0), REAL_CONST(109512.07006526781/8.0), REAL_CONST(109536.3259017792/8.0), REAL_CONST(109560.58308117429/8.0), REAL_CONST(109584.8416033044/8.0), REAL_CONST(109609.1014680209/8.0), REAL_CONST(109633.36267517522/8.0), REAL_CONST(109657.62522461878/8.0), REAL_CONST(109681.88911620311/8.0), REAL_CONST(109706.15434977971/8.0), REAL_CONST(109730.4209252002/8.0), REAL_CONST(109754.68884231619/8.0), REAL_CONST(109778.95810097932/8.0), REAL_CONST(109803.22870104131/8.0), REAL_CONST(109827.50064235389/8.0), REAL_CONST(109851.77392476884/8.0), REAL_CONST(109876.04854813802/8.0), REAL_CONST(109900.32451231324/8.0), REAL_CONST(109924.60181714644/8.0), REAL_CONST(109948.88046248957/8.0), REAL_CONST(109973.1604481946/8.0), REAL_CONST(109997.44177411357/8.0), REAL_CONST(110021.72444009855/8.0), REAL_CONST(110046.00844600165/8.0), REAL_CONST(110070.29379167501/8.0), REAL_CONST(110094.58047697082/8.0), REAL_CONST(110118.86850174134/8.0), REAL_CONST(110143.15786583882/8.0), REAL_CONST(110167.44856911557/8.0), REAL_CONST(110191.74061142397/8.0), REAL_CONST(110216.03399261639/8.0), REAL_CONST(110240.32871254528/8.0), REAL_CONST(110264.62477106311/8.0), REAL_CONST(110288.9221680224/8.0), REAL_CONST(110313.22090327571/8.0), REAL_CONST(110337.52097667565/8.0), REAL_CONST(110361.82238807483/8.0), REAL_CONST(110386.12513732594/8.0), REAL_CONST(110410.42922428172/8.0), REAL_CONST(110434.73464879491/8.0), REAL_CONST(110459.04141071832/8.0), REAL_CONST(110483.34950990479/8.0), REAL_CONST(110507.6589462072/8.0), REAL_CONST(110531.96971947847/8.0), REAL_CONST(110556.28182957157/8.0), REAL_CONST(110580.5952763395/8.0), REAL_CONST(110604.91005963532/8.0), REAL_CONST(110629.22617931209/8.0), REAL_CONST(110653.54363522294/8.0), REAL_CONST(110677.86242722106/8.0), REAL_CONST(110702.18255515963/8.0), REAL_CONST(110726.50401889188/8.0), REAL_CONST(110750.82681827113/8.0), REAL_CONST(110775.1509531507/8.0), REAL_CONST(110799.47642338395/8.0), REAL_CONST(110823.80322882428/8.0), REAL_CONST(110848.13136932514/8.0), REAL_CONST(110872.46084474004/8.0), REAL_CONST(110896.79165492248/8.0), REAL_CONST(110921.12379972603/8.0), REAL_CONST(110945.4572790043/8.0), REAL_CONST(110969.79209261097/8.0), REAL_CONST(110994.12824039967/8.0), REAL_CONST(111018.46572222417/8.0), REAL_CONST(111042.80453793822/8.0), REAL_CONST(111067.14468739564/8.0), REAL_CONST(111091.48617045028/8.0), REAL_CONST(111115.82898695602/8.0), REAL_CONST(111140.1731367668/8.0), REAL_CONST(111164.51861973655/8.0), REAL_CONST(111188.86543571933/8.0), REAL_CONST(111213.21358456917/8.0), REAL_CONST(111237.56306614014/8.0), REAL_CONST(111261.91388028639/8.0), REAL_CONST(111286.26602686207/8.0), REAL_CONST(111310.61950572141/8.0), REAL_CONST(111334.97431671864/8.0), REAL_CONST(111359.33045970804/8.0), REAL_CONST(111383.68793454397/8.0), REAL_CONST(111408.04674108078/8.0), REAL_CONST(111432.40687917286/8.0), REAL_CONST(111456.76834867468/8.0), REAL_CONST(111481.13114944073/8.0), REAL_CONST(111505.49528132551/8.0), REAL_CONST(111529.86074418361/8.0), REAL_CONST(111554.22753786964/8.0), REAL_CONST(111578.59566223821/8.0), REAL_CONST(111602.96511714405/8.0), REAL_CONST(111627.33590244185/8.0), REAL_CONST(111651.7080179864/8.0), REAL_CONST(111676.08146363248/8.0), REAL_CONST(111700.45623923496/8.0), REAL_CONST(111724.8323446487/8.0), REAL_CONST(111749.20977972864/8.0), REAL_CONST(111773.58854432974/8.0), REAL_CONST(111797.96863830699/8.0), REAL_CONST(111822.35006151545/8.0), REAL_CONST(111846.73281381019/8.0), REAL_CONST(111871.11689504632/8.0), REAL_CONST(111895.50230507903/8.0), REAL_CONST(111919.8890437635/8.0), REAL_CONST(111944.27711095495/8.0), REAL_CONST(111968.6665065087/8.0), REAL_CONST(111993.05723028004/8.0), REAL_CONST(112017.44928212435/8.0), REAL_CONST(112041.842661897/8.0), REAL_CONST(112066.23736945343/8.0), REAL_CONST(112090.63340464912/8.0), REAL_CONST(112115.03076733962/8.0), REAL_CONST(112139.42945738042/8.0), REAL_CONST(112163.82947462716/8.0), REAL_CONST(112188.23081893545/8.0), REAL_CONST(112212.63349016097/8.0), REAL_CONST(112237.03748815943/8.0), REAL_CONST(112261.44281278658/8.0), REAL_CONST(112285.84946389822/8.0), REAL_CONST(112310.25744135017/8.0), REAL_CONST(112334.66674499828/8.0), REAL_CONST(112359.07737469849/8.0), REAL_CONST(112383.48933030672/8.0), REAL_CONST(112407.90261167898/8.0), REAL_CONST(112432.31721867126/8.0), REAL_CONST(112456.73315113965/8.0), REAL_CONST(112481.15040894024/8.0), REAL_CONST(112505.56899192919/8.0), REAL_CONST(112529.98889996267/8.0), REAL_CONST(112554.41013289688/8.0), REAL_CONST(112578.8326905881/8.0), REAL_CONST(112603.25657289263/8.0), REAL_CONST(112627.68177966679/8.0), REAL_CONST(112652.10831076698/8.0), REAL_CONST(112676.53616604958/8.0), REAL_CONST(112700.96534537108/8.0), REAL_CONST(112725.39584858794/8.0), REAL_CONST(112749.82767555672/8.0), REAL_CONST(112774.26082613398/8.0), REAL_CONST(112798.6953001763/8.0), REAL_CONST(112823.13109754038/8.0), REAL_CONST(112847.56821808286/8.0), REAL_CONST(112872.00666166049/8.0), REAL_CONST(112896.44642813003/8.0), REAL_CONST(112920.88751734827/8.0), REAL_CONST(112945.32992917208/8.0), REAL_CONST(112969.77366345831/8.0), REAL_CONST(112994.21872006389/8.0), REAL_CONST(113018.66509884578/8.0), REAL_CONST(113043.11279966099/8.0), REAL_CONST(113067.56182236652/8.0), REAL_CONST(113092.01216681948/8.0), REAL_CONST(113116.46383287695/8.0), REAL_CONST(113140.9168203961/8.0), REAL_CONST(113165.37112923413/8.0), REAL_CONST(113189.82675924824/8.0), REAL_CONST(113214.28371029573/8.0), REAL_CONST(113238.74198223387/8.0), REAL_CONST(113263.20157492002/8.0), REAL_CONST(113287.66248821157/8.0), REAL_CONST(113312.12472196593/8.0), REAL_CONST(113336.58827604055/8.0), REAL_CONST(113361.05315029295/8.0), REAL_CONST(113385.51934458067/8.0), REAL_CONST(113409.98685876124/8.0), REAL_CONST(113434.45569269233/8.0), REAL_CONST(113458.92584623155/8.0), REAL_CONST(113483.39731923661/8.0), REAL_CONST(113507.87011156522/8.0), REAL_CONST(113532.34422307517/8.0), REAL_CONST(113556.81965362425/8.0), REAL_CONST(113581.2964030703/8.0), REAL_CONST(113605.77447127122/8.0), REAL_CONST(113630.25385808491/8.0), REAL_CONST(113654.73456336933/8.0), REAL_CONST(113679.2165869825/8.0), REAL_CONST(113703.69992878241/8.0), REAL_CONST(113728.18458862718/8.0), REAL_CONST(113752.67056637487/8.0), REAL_CONST(113777.15786188368/8.0), REAL_CONST(113801.64647501177/8.0), REAL_CONST(113826.13640561736/8.0), REAL_CONST(113850.62765355874/8.0), REAL_CONST(113875.12021869418/8.0), REAL_CONST(113899.61410088204/8.0), REAL_CONST(113924.1092999807/8.0), REAL_CONST(113948.60581584855/8.0), REAL_CONST(113973.10364834407/8.0), REAL_CONST(113997.60279732574/8.0), REAL_CONST(114022.1032626521/8.0), REAL_CONST(114046.60504418171/8.0), REAL_CONST(114071.10814177318/8.0), REAL_CONST(114095.61255528514/8.0), REAL_CONST(114120.11828457628/8.0), REAL_CONST(114144.62532950533/8.0), REAL_CONST(114169.13368993104/8.0), REAL_CONST(114193.6433657122/8.0), REAL_CONST(114218.15435670764/8.0), REAL_CONST(114242.66666277625/8.0), REAL_CONST(114267.18028377694/8.0), REAL_CONST(114291.69521956862/8.0), REAL_CONST(114316.21147001031/8.0), REAL_CONST(114340.72903496103/8.0), REAL_CONST(114365.24791427983/8.0), REAL_CONST(114389.7681078258/8.0), REAL_CONST(114414.2896154581/8.0), REAL_CONST(114438.81243703589/8.0), REAL_CONST(114463.33657241837/8.0), REAL_CONST(114487.8620214648/8.0), REAL_CONST(114512.38878403447/8.0), REAL_CONST(114536.91685998671/8.0), REAL_CONST(114561.44624918087/8.0), REAL_CONST(114585.97695147636/8.0), REAL_CONST(114610.5089667326/8.0), REAL_CONST(114635.04229480909/8.0), REAL_CONST(114659.57693556532/8.0), REAL_CONST(114684.11288886084/8.0), REAL_CONST(114708.65015455526/8.0), REAL_CONST(114733.18873250818/8.0), REAL_CONST(114757.72862257928/8.0), REAL_CONST(114782.26982462825/8.0), REAL_CONST(114806.81233851484/8.0), REAL_CONST(114831.35616409882/8.0), REAL_CONST(114855.90130123998/8.0), REAL_CONST(114880.44774979822/8.0), REAL_CONST(114904.99550963337/8.0), REAL_CONST(114929.5445806054/8.0), REAL_CONST(114954.09496257425/8.0), REAL_CONST(114978.64665539992/8.0), REAL_CONST(115003.19965894247/8.0), REAL_CONST(115027.75397306195/8.0), REAL_CONST(115052.30959761847/8.0), REAL_CONST(115076.86653247218/8.0), REAL_CONST(115101.42477748329/8.0), REAL_CONST(115125.984332512/8.0), REAL_CONST(115150.54519741859/8.0), REAL_CONST(115175.10737206334/8.0), REAL_CONST(115199.67085630659/8.0), REAL_CONST(115224.23565000873/8.0), REAL_CONST(115248.80175303014/8.0), REAL_CONST(115273.3691652313/8.0), REAL_CONST(115297.93788647266/8.0), REAL_CONST(115322.50791661476/8.0), REAL_CONST(115347.07925551817/8.0), REAL_CONST(115371.65190304347/8.0), REAL_CONST(115396.22585905129/8.0), REAL_CONST(115420.80112340231/8.0), REAL_CONST(115445.37769595724/8.0), REAL_CONST(115469.95557657682/8.0), REAL_CONST(115494.53476512182/8.0), REAL_CONST(115519.11526145306/8.0), REAL_CONST(115543.69706543141/8.0), REAL_CONST(115568.28017691776/8.0), REAL_CONST(115592.86459577303/8.0), REAL_CONST(115617.4503218582/8.0), REAL_CONST(115642.03735503425/8.0), REAL_CONST(115666.62569516223/8.0), REAL_CONST(115691.21534210323/8.0), REAL_CONST(115715.80629571836/8.0), REAL_CONST(115740.39855586876/8.0), REAL_CONST(115764.99212241563/8.0), REAL_CONST(115789.58699522018/8.0), REAL_CONST(115814.18317414368/8.0), REAL_CONST(115838.78065904744/8.0), REAL_CONST(115863.37944979276/8.0), REAL_CONST(115887.97954624105/8.0), REAL_CONST(115912.5809482537/8.0), REAL_CONST(115937.18365569216/8.0), REAL_CONST(115961.78766841792/8.0), REAL_CONST(115986.39298629249/8.0), REAL_CONST(116010.99960917742/8.0), REAL_CONST(116035.60753693432/8.0), REAL_CONST(116060.21676942479/8.0), REAL_CONST(116084.82730651053/8.0), REAL_CONST(116109.43914805322/8.0), REAL_CONST(116134.0522939146/8.0), REAL_CONST(116158.66674395646/8.0), REAL_CONST(116183.2824980406/8.0), REAL_CONST(116207.89955602887/8.0), REAL_CONST(116232.51791778316/8.0), REAL_CONST(116257.13758316539/8.0), REAL_CONST(116281.75855203751/8.0), REAL_CONST(116306.38082426153/8.0), REAL_CONST(116331.00439969949/8.0), REAL_CONST(116355.62927821343/8.0), REAL_CONST(116380.25545966547/8.0), REAL_CONST(116404.88294391775/8.0), REAL_CONST(116429.51173083246/8.0), REAL_CONST(116454.14182027178/8.0), REAL_CONST(116478.77321209799/8.0), REAL_CONST(116503.40590617337/8.0), REAL_CONST(116528.03990236025/8.0), REAL_CONST(116552.67520052097/8.0), REAL_CONST(116577.31180051794/8.0), REAL_CONST(116601.94970221359/8.0), REAL_CONST(116626.5889054704/8.0), REAL_CONST(116651.22941015086/8.0), REAL_CONST(116675.87121611751/8.0), REAL_CONST(116700.51432323294/8.0), REAL_CONST(116725.15873135976/8.0), REAL_CONST(116749.8044403606/8.0), REAL_CONST(116774.45145009817/8.0), REAL_CONST(116799.0997604352/8.0), REAL_CONST(116823.74937123443/8.0), REAL_CONST(116848.40028235866/8.0), REAL_CONST(116873.05249367072/8.0), REAL_CONST(116897.70600503348/8.0), REAL_CONST(116922.36081630984/8.0), REAL_CONST(116947.01692736275/8.0), REAL_CONST(116971.67433805518/8.0), REAL_CONST(116996.33304825013/8.0), REAL_CONST(117020.99305781067/8.0), REAL_CONST(117045.65436659988/8.0), REAL_CONST(117070.31697448085/8.0), REAL_CONST(117094.98088131678/8.0), REAL_CONST(117119.64608697082/8.0), REAL_CONST(117144.31259130624/8.0), REAL_CONST(117168.98039418629/8.0), REAL_CONST(117193.64949547425/8.0), REAL_CONST(117218.31989503348/8.0), REAL_CONST(117242.99159272734/8.0), REAL_CONST(117267.66458841923/8.0), REAL_CONST(117292.33888197262/8.0), REAL_CONST(117317.01447325097/8.0), REAL_CONST(117341.6913621178/8.0), REAL_CONST(117366.36954843666/8.0), REAL_CONST(117391.04903207115/8.0), REAL_CONST(117415.72981288488/8.0), REAL_CONST(117440.41189074152/8.0), REAL_CONST(117465.09526550474/8.0), REAL_CONST(117489.77993703831/8.0), REAL_CONST(117514.46590520597/8.0), REAL_CONST(117539.15316987153/8.0), REAL_CONST(117563.84173089883/8.0), REAL_CONST(117588.53158815173/8.0), REAL_CONST(117613.22274149416/8.0), REAL_CONST(117637.91519079007/8.0), REAL_CONST(117662.60893590341/8.0), REAL_CONST(117687.30397669821/8.0), REAL_CONST(117712.00031303853/8.0), REAL_CONST(117736.69794478847/8.0), REAL_CONST(117761.39687181212/8.0), REAL_CONST(117786.09709397367/8.0), REAL_CONST(117810.7986111373/8.0), REAL_CONST(117835.50142316725/8.0), REAL_CONST(117860.20552992777/8.0), REAL_CONST(117884.91093128319/8.0), REAL_CONST(117909.6176270978/8.0), REAL_CONST(117934.32561723603/8.0), REAL_CONST(117959.03490156225/8.0), REAL_CONST(117983.74547994092/8.0), REAL_CONST(118008.45735223651/8.0), REAL_CONST(118033.17051831353/8.0), REAL_CONST(118057.88497803656/8.0), REAL_CONST(118082.60073127014/8.0), REAL_CONST(118107.31777787894/8.0), REAL_CONST(118132.03611772758/8.0), REAL_CONST(118156.75575068076/8.0), REAL_CONST(118181.47667660323/8.0), REAL_CONST(118206.19889535972/8.0), REAL_CONST(118230.92240681504/8.0), REAL_CONST(118255.64721083404/8.0), REAL_CONST(118280.37330728157/8.0), REAL_CONST(118305.10069602253/8.0), REAL_CONST(118329.82937692189/8.0), REAL_CONST(118354.55934984458/8.0), REAL_CONST(118379.29061465565/8.0), REAL_CONST(118404.02317122012/8.0), REAL_CONST(118428.75701940308/8.0), REAL_CONST(118453.49215906965/8.0), REAL_CONST(118478.22859008498/8.0), REAL_CONST(118502.96631231424/8.0), REAL_CONST(118527.70532562268/8.0), REAL_CONST(118552.44562987552/8.0), REAL_CONST(118577.18722493808/8.0), REAL_CONST(118601.93011067568/8.0), REAL_CONST(118626.67428695368/8.0), REAL_CONST(118651.41975363747/8.0), REAL_CONST(118676.16651059251/8.0), REAL_CONST(118700.91455768423/8.0), REAL_CONST(118725.66389477813/8.0), REAL_CONST(118750.41452173979/8.0), REAL_CONST(118775.16643843475/8.0), REAL_CONST(118799.91964472862/8.0), REAL_CONST(118824.67414048707/8.0), REAL_CONST(118849.42992557574/8.0), REAL_CONST(118874.18699986035/8.0), REAL_CONST(118898.94536320666/8.0), REAL_CONST(118923.70501548045/8.0), REAL_CONST(118948.46595654752/8.0), REAL_CONST(118973.22818627374/8.0), REAL_CONST(118997.99170452499/8.0), REAL_CONST(119022.7565111672/8.0), REAL_CONST(119047.52260606633/8.0), REAL_CONST(119072.28998908834/8.0), REAL_CONST(119097.0586600993/8.0), REAL_CONST(119121.82861896523/8.0), REAL_CONST(119146.59986555226/8.0), REAL_CONST(119171.3723997265/8.0), REAL_CONST(119196.14622135412/8.0), REAL_CONST(119220.92133030134/8.0), REAL_CONST(119245.69772643436/8.0), REAL_CONST(119270.47540961947/8.0), REAL_CONST(119295.25437972297/8.0), REAL_CONST(119320.03463661121/8.0), REAL_CONST(119344.81618015055/8.0), REAL_CONST(119369.5990102074/8.0), REAL_CONST(119394.38312664822/8.0), REAL_CONST(119419.16852933947/8.0), REAL_CONST(119443.95521814766/8.0), REAL_CONST(119468.74319293935/8.0), REAL_CONST(119493.53245358112/8.0), REAL_CONST(119518.32299993958/8.0), REAL_CONST(119543.11483188139/8.0), REAL_CONST(119567.90794927324/8.0), REAL_CONST(119592.70235198183/8.0), REAL_CONST(119617.49803987393/8.0), REAL_CONST(119642.29501281632/8.0), REAL_CONST(119667.09327067583/8.0), REAL_CONST(119691.89281331931/8.0), REAL_CONST(119716.69364061367/8.0), REAL_CONST(119741.49575242582/8.0), REAL_CONST(119766.29914862274/8.0), REAL_CONST(119791.10382907141/8.0), REAL_CONST(119815.90979363887/8.0), REAL_CONST(119840.71704219218/8.0), REAL_CONST(119865.52557459843/8.0), REAL_CONST(119890.33539072477/8.0), REAL_CONST(119915.14649043836/8.0), REAL_CONST(119939.95887360642/8.0), REAL_CONST(119964.77254009615/8.0), REAL_CONST(119989.58748977486/8.0), REAL_CONST(120014.40372250983/8.0), REAL_CONST(120039.22123816841/8.0), REAL_CONST(120064.04003661797/8.0), REAL_CONST(120088.86011772591/8.0), REAL_CONST(120113.6814813597/8.0), REAL_CONST(120138.5041273868/8.0), REAL_CONST(120163.3280556747/8.0), REAL_CONST(120188.15326609099/8.0), REAL_CONST(120212.97975850321/8.0), REAL_CONST(120237.807532779/8.0), REAL_CONST(120262.63658878599/8.0), REAL_CONST(120287.46692639188/8.0), REAL_CONST(120312.29854546436/8.0), REAL_CONST(120337.13144587121/8.0), REAL_CONST(120361.9656274802/8.0), REAL_CONST(120386.80109015915/8.0), REAL_CONST(120411.63783377589/8.0), REAL_CONST(120436.47585819835/8.0), REAL_CONST(120461.31516329442/8.0), REAL_CONST(120486.15574893207/8.0), REAL_CONST(120510.99761497928/8.0), REAL_CONST(120535.84076130406/8.0), REAL_CONST(120560.68518777451/8.0), REAL_CONST(120585.53089425867/8.0), REAL_CONST(120610.3778806247/8.0), REAL_CONST(120635.22614674074/8.0), REAL_CONST(120660.07569247499/8.0), REAL_CONST(120684.92651769568/8.0), REAL_CONST(120709.77862227106/8.0), REAL_CONST(120734.63200606944/8.0), REAL_CONST(120759.48666895913/8.0), REAL_CONST(120784.3426108085/8.0), REAL_CONST(120809.19983148595/8.0), REAL_CONST(120834.05833085992/8.0), REAL_CONST(120858.91810879884/8.0), REAL_CONST(120883.77916517125/8.0), REAL_CONST(120908.64149984565/8.0), REAL_CONST(120933.5051126906/8.0), REAL_CONST(120958.37000357473/8.0), REAL_CONST(120983.23617236665/8.0), REAL_CONST(121008.10361893504/8.0), REAL_CONST(121032.97234314861/8.0), REAL_CONST(121057.84234487606/8.0), REAL_CONST(121082.71362398617/8.0), REAL_CONST(121107.58618034775/8.0), REAL_CONST(121132.46001382964/8.0), REAL_CONST(121157.33512430069/8.0), REAL_CONST(121182.21151162982/8.0), REAL_CONST(121207.08917568595/8.0), REAL_CONST(121231.96811633807/8.0), REAL_CONST(121256.84833345517/8.0), REAL_CONST(121281.72982690629/8.0), REAL_CONST(121306.61259656049/8.0), REAL_CONST(121331.49664228689/8.0), REAL_CONST(121356.38196395461/8.0), REAL_CONST(121381.26856143285/8.0), REAL_CONST(121406.15643459078/8.0), REAL_CONST(121431.04558329767/8.0), REAL_CONST(121455.93600742276/8.0), REAL_CONST(121480.82770683538/8.0), REAL_CONST(121505.72068140487/8.0), REAL_CONST(121530.61493100057/8.0), REAL_CONST(121555.51045549192/8.0), REAL_CONST(121580.40725474835/8.0), REAL_CONST(121605.30532863933/8.0), REAL_CONST(121630.20467703436/8.0), REAL_CONST(121655.10529980299/8.0), REAL_CONST(121680.00719681478/8.0), REAL_CONST(121704.91036793934/8.0), REAL_CONST(121729.81481304632/8.0), REAL_CONST(121754.72053200539/8.0), REAL_CONST(121779.62752468624/8.0), REAL_CONST(121804.53579095862/8.0), REAL_CONST(121829.44533069231/8.0), REAL_CONST(121854.3561437571/8.0), REAL_CONST(121879.26823002285/8.0), REAL_CONST(121904.1815893594/8.0), REAL_CONST(121929.09622163669/8.0), REAL_CONST(121954.01212672464/8.0), REAL_CONST(121978.92930449323/8.0), REAL_CONST(122003.84775481246/8.0), REAL_CONST(122028.76747755238/8.0), REAL_CONST(122053.68847258303/8.0), REAL_CONST(122078.61073977455/8.0), REAL_CONST(122103.53427899707/8.0), REAL_CONST(122128.45909012076/8.0), REAL_CONST(122153.38517301581/8.0), REAL_CONST(122178.31252755247/8.0), REAL_CONST(122203.24115360099/8.0), REAL_CONST(122228.17105103172/8.0), REAL_CONST(122253.10221971494/8.0), REAL_CONST(122278.03465952107/8.0), REAL_CONST(122302.96837032049/8.0), REAL_CONST(122327.90335198362/8.0), REAL_CONST(122352.83960438096/8.0), REAL_CONST(122377.777127383/8.0), REAL_CONST(122402.71592086025/8.0), REAL_CONST(122427.65598468333/8.0), REAL_CONST(122452.59731872278/8.0), REAL_CONST(122477.53992284928/8.0), REAL_CONST(122502.48379693348/8.0), REAL_CONST(122527.42894084606/8.0), REAL_CONST(122552.37535445779/8.0), REAL_CONST(122577.32303763942/8.0), REAL_CONST(122602.27199026172/8.0), REAL_CONST(122627.22221219557/8.0), REAL_CONST(122652.17370331181/8.0), REAL_CONST(122677.12646348133/8.0), REAL_CONST(122702.08049257506/8.0), REAL_CONST(122727.03579046397/8.0), REAL_CONST(122751.99235701906/8.0), REAL_CONST(122776.95019211136/8.0), REAL_CONST(122801.9092956119/8.0), REAL_CONST(122826.8696673918/8.0), REAL_CONST(122851.83130732219/8.0), REAL_CONST(122876.79421527422/8.0), REAL_CONST(122901.75839111909/8.0), REAL_CONST(122926.72383472799/8.0), REAL_CONST(122951.69054597223/8.0), REAL_CONST(122976.65852472307/8.0), REAL_CONST(123001.62777085182/8.0), REAL_CONST(123026.59828422987/8.0), REAL_CONST(123051.57006472857/8.0), REAL_CONST(123076.54311221937/8.0), REAL_CONST(123101.5174265737/8.0), REAL_CONST(123126.49300766307/8.0), REAL_CONST(123151.46985535898/8.0), REAL_CONST(123176.44796953299/8.0), REAL_CONST(123201.42735005668/8.0), REAL_CONST(123226.40799680166/8.0), REAL_CONST(123251.38990963959/8.0), REAL_CONST(123276.37308844214/8.0), REAL_CONST(123301.35753308103/8.0), REAL_CONST(123326.343243428/8.0), REAL_CONST(123351.33021935483/8.0), REAL_CONST(123376.31846073334/8.0), REAL_CONST(123401.30796743535/8.0), REAL_CONST(123426.29873933276/8.0), REAL_CONST(123451.29077629748/8.0), REAL_CONST(123476.28407820144/8.0), REAL_CONST(123501.2786449166/8.0), REAL_CONST(123526.27447631498/8.0), REAL_CONST(123551.27157226863/8.0), REAL_CONST(123576.26993264959/8.0), REAL_CONST(123601.26955732999/8.0), REAL_CONST(123626.27044618195/8.0), REAL_CONST(123651.27259907764/8.0), REAL_CONST(123676.27601588926/8.0), REAL_CONST(123701.28069648903/8.0), REAL_CONST(123726.28664074924/8.0), REAL_CONST(123751.29384854218/8.0), REAL_CONST(123776.30231974016/8.0), REAL_CONST(123801.31205421555/8.0), REAL_CONST(123826.32305184075/8.0), REAL_CONST(123851.33531248817/8.0), REAL_CONST(123876.34883603029/8.0), REAL_CONST(123901.36362233957/8.0), REAL_CONST(123926.37967128855/8.0), REAL_CONST(123951.39698274979/8.0), REAL_CONST(123976.41555659588/8.0), REAL_CONST(124001.43539269941/8.0), REAL_CONST(124026.45649093305/8.0), REAL_CONST(124051.47885116948/8.0), REAL_CONST(124076.50247328142/8.0), REAL_CONST(124101.5273571416/8.0), REAL_CONST(124126.55350262282/8.0), REAL_CONST(124151.58090959788/8.0), REAL_CONST(124176.60957793961/8.0), REAL_CONST(124201.63950752091/8.0), REAL_CONST(124226.67069821467/8.0), REAL_CONST(124251.70314989384/8.0), REAL_CONST(124276.73686243138/8.0), REAL_CONST(124301.7718357003/8.0), REAL_CONST(124326.80806957364/8.0), REAL_CONST(124351.84556392446/8.0), REAL_CONST(124376.88431862585/8.0), REAL_CONST(124401.92433355095/8.0), REAL_CONST(124426.96560857294/8.0), REAL_CONST(124452.00814356498/8.0), REAL_CONST(124477.05193840031/8.0), REAL_CONST(124502.0969929522/8.0), REAL_CONST(124527.14330709392/8.0), REAL_CONST(124552.19088069882/8.0), REAL_CONST(124577.23971364023/8.0), REAL_CONST(124602.28980579154/8.0), REAL_CONST(124627.34115702618/8.0), REAL_CONST(124652.3937672176/8.0), REAL_CONST(124677.44763623926/8.0), REAL_CONST(124702.50276396469/8.0), REAL_CONST(124727.55915026742/8.0), REAL_CONST(124752.61679502104/8.0), REAL_CONST(124777.67569809916/8.0), REAL_CONST(124802.73585937542/8.0), REAL_CONST(124827.79727872348/8.0), REAL_CONST(124852.85995601704/8.0), REAL_CONST(124877.92389112986/8.0), REAL_CONST(124902.98908393568/8.0), REAL_CONST(124928.05553430831/8.0), REAL_CONST(124953.1232421216/8.0), REAL_CONST(124978.19220724938/8.0), REAL_CONST(125003.26242956554/8.0), REAL_CONST(125028.33390894404/8.0), REAL_CONST(125053.40664525882/8.0), REAL_CONST(125078.48063838384/8.0), REAL_CONST(125103.55588819318/8.0), REAL_CONST(125128.63239456083/8.0), REAL_CONST(125153.71015736091/8.0), REAL_CONST(125178.78917646752/8.0), REAL_CONST(125203.86945175481/8.0), REAL_CONST(125228.95098309696/8.0), REAL_CONST(125254.03377036817/8.0), REAL_CONST(125279.1178134427/8.0), REAL_CONST(125304.20311219479/8.0), REAL_CONST(125329.28966649878/8.0), REAL_CONST(125354.37747622898/8.0), REAL_CONST(125379.46654125977/8.0), REAL_CONST(125404.55686146552/8.0), REAL_CONST(125429.6484367207/8.0), REAL_CONST(125454.74126689974/8.0), REAL_CONST(125479.83535187715/8.0), REAL_CONST(125504.93069152744/8.0), REAL_CONST(125530.02728572517/8.0), REAL_CONST(125555.12513434493/8.0), REAL_CONST(125580.22423726133/8.0), REAL_CONST(125605.32459434902/8.0), REAL_CONST(125630.4262054827/8.0), REAL_CONST(125655.52907053704/8.0), REAL_CONST(125680.63318938682/8.0), REAL_CONST(125705.73856190679/8.0), REAL_CONST(125730.84518797178/8.0), REAL_CONST(125755.9530674566/8.0), REAL_CONST(125781.06220023613/8.0), REAL_CONST(125806.17258618528/8.0), REAL_CONST(125831.28422517896/8.0), REAL_CONST(125856.39711709213/8.0), REAL_CONST(125881.51126179981/8.0), REAL_CONST(125906.62665917698/8.0), REAL_CONST(125931.74330909875/8.0), REAL_CONST(125956.86121144016/8.0), REAL_CONST(125981.98036607634/8.0), REAL_CONST(126007.10077288245/8.0), REAL_CONST(126032.22243173365/8.0), REAL_CONST(126057.34534250517/8.0), REAL_CONST(126082.46950507225/8.0), REAL_CONST(126107.59491931014/8.0), REAL_CONST(126132.72158509417/8.0), REAL_CONST(126157.84950229966/8.0), REAL_CONST(126182.97867080198/8.0), REAL_CONST(126208.10909047653/8.0), REAL_CONST(126233.24076119871/8.0), REAL_CONST(126258.37368284403/8.0), REAL_CONST(126283.50785528794/8.0), REAL_CONST(126308.64327840599/8.0), REAL_CONST(126333.77995207369/8.0), REAL_CONST(126358.91787616667/8.0), REAL_CONST(126384.0570505605/8.0), REAL_CONST(126409.19747513086/8.0), REAL_CONST(126434.3391497534/8.0), REAL_CONST(126459.48207430386/8.0), REAL_CONST(126484.62624865794/8.0), REAL_CONST(126509.77167269142/8.0), REAL_CONST(126534.9183462801/8.0), REAL_CONST(126560.06626929982/8.0), REAL_CONST(126585.21544162642/8.0), REAL_CONST(126610.36586313581/8.0), REAL_CONST(126635.51753370393/8.0), REAL_CONST(126660.67045320668/8.0), REAL_CONST(126685.82462152008/8.0), REAL_CONST(126710.98003852014/8.0), REAL_CONST(126736.13670408291/8.0), REAL_CONST(126761.29461808444/8.0), REAL_CONST(126786.45378040087/8.0), REAL_CONST(126811.61419090834/8.0), REAL_CONST(126836.77584948298/8.0), REAL_CONST(126861.93875600102/8.0), REAL_CONST(126887.10291033868/8.0), REAL_CONST(126912.26831237224/8.0), REAL_CONST(126937.43496197795/8.0), REAL_CONST(126962.60285903217/8.0), REAL_CONST(126987.77200341123/8.0), REAL_CONST(127012.94239499152/8.0), REAL_CONST(127038.11403364947/8.0), REAL_CONST(127063.2869192615/8.0), REAL_CONST(127088.46105170409/8.0), REAL_CONST(127113.63643085376/8.0), REAL_CONST(127138.81305658702/8.0), REAL_CONST(127163.99092878048/8.0), REAL_CONST(127189.17004731069/8.0), REAL_CONST(127214.35041205429/8.0), REAL_CONST(127239.53202288797/8.0), REAL_CONST(127264.71487968838/8.0), REAL_CONST(127289.89898233226/8.0), REAL_CONST(127315.08433069635/8.0), REAL_CONST(127340.27092465744/8.0), REAL_CONST(127365.45876409234/8.0), REAL_CONST(127390.64784887788/8.0), REAL_CONST(127415.83817889093/8.0), REAL_CONST(127441.02975400841/8.0), REAL_CONST(127466.22257410725/8.0), REAL_CONST(127491.41663906439/8.0), REAL_CONST(127516.61194875685/8.0), REAL_CONST(127541.80850306165/8.0), REAL_CONST(127567.00630185583/8.0), REAL_CONST(127592.20534501647/8.0), REAL_CONST(127617.4056324207/8.0), REAL_CONST(127642.60716394568/8.0), REAL_CONST(127667.80993946856/8.0), REAL_CONST(127693.01395886653/8.0), REAL_CONST(127718.21922201688/8.0), REAL_CONST(127743.42572879682/8.0), REAL_CONST(127768.63347908368/8.0), REAL_CONST(127793.84247275478/8.0), REAL_CONST(127819.05270968749/8.0), REAL_CONST(127844.26418975917/8.0), REAL_CONST(127869.47691284724/8.0), REAL_CONST(127894.69087882918/8.0), REAL_CONST(127919.90608758242/8.0), REAL_CONST(127945.12253898452/8.0), REAL_CONST(127970.34023291297/8.0), REAL_CONST(127995.55916924537/8.0), REAL_CONST(128020.77934785932/8.0), REAL_CONST(128046.00076863244/8.0), REAL_CONST(128071.22343144237/8.0), REAL_CONST(128096.44733616684/8.0), REAL_CONST(128121.67248268353/8.0), REAL_CONST(128146.89887087021/8.0), REAL_CONST(128172.12650060465/8.0), REAL_CONST(128197.35537176467/8.0), REAL_CONST(128222.5854842281/8.0), REAL_CONST(128247.81683787282/8.0), REAL_CONST(128273.04943257671/8.0), REAL_CONST(128298.28326821771/8.0), REAL_CONST(128323.51834467379/8.0), REAL_CONST(128348.75466182294/8.0), REAL_CONST(128373.99221954317/8.0), REAL_CONST(128399.23101771252/8.0), REAL_CONST(128424.47105620909/8.0), REAL_CONST(128449.71233491098/8.0), REAL_CONST(128474.95485369631/8.0), REAL_CONST(128500.19861244329/8.0), REAL_CONST(128525.44361103009/8.0), REAL_CONST(128550.68984933494/8.0), REAL_CONST(128575.93732723613/8.0), REAL_CONST(128601.18604461191/8.0), REAL_CONST(128626.43600134061/8.0), REAL_CONST(128651.68719730059/8.0), REAL_CONST(128676.93963237021/8.0), REAL_CONST(128702.1933064279/8.0), REAL_CONST(128727.44821935208/8.0), REAL_CONST(128752.70437102125/8.0), REAL_CONST(128777.96176131385/8.0), REAL_CONST(128803.22039010846/8.0), REAL_CONST(128828.48025728362/8.0), REAL_CONST(128853.74136271792/8.0), REAL_CONST(128879.00370628996/8.0), REAL_CONST(128904.26728787841/8.0), REAL_CONST(128929.53210736193/8.0), REAL_CONST(128954.79816461923/8.0), REAL_CONST(128980.06545952905/8.0), REAL_CONST(129005.33399197015/8.0), REAL_CONST(129030.60376182134/8.0), REAL_CONST(129055.87476896142/8.0), REAL_CONST(129081.14701326926/8.0), REAL_CONST(129106.42049462376/8.0), REAL_CONST(129131.6952129038/8.0), REAL_CONST(129156.97116798835/8.0), REAL_CONST(129182.24835975636/8.0), REAL_CONST(129207.52678808685/8.0), REAL_CONST(129232.80645285884/8.0), REAL_CONST(129258.08735395141/8.0), REAL_CONST(129283.36949124365/8.0), REAL_CONST(129308.65286461466/8.0), REAL_CONST(129333.9374739436/8.0), REAL_CONST(129359.22331910966/8.0), REAL_CONST(129384.51039999202/8.0), REAL_CONST(129409.79871646997/8.0), REAL_CONST(129435.08826842274/8.0), REAL_CONST(129460.37905572963/8.0), REAL_CONST(129485.67107826998/8.0), REAL_CONST(129510.96433592314/8.0), REAL_CONST(129536.25882856851/8.0), REAL_CONST(129561.55455608548/8.0), REAL_CONST(129586.85151835352/8.0), REAL_CONST(129612.14971525209/8.0), REAL_CONST(129637.4491466607/8.0), REAL_CONST(129662.74981245887/8.0), REAL_CONST(129688.0517125262/8.0), REAL_CONST(129713.35484674224/8.0), REAL_CONST(129738.65921498663/8.0), REAL_CONST(129763.96481713903/8.0), REAL_CONST(129789.27165307909/8.0), REAL_CONST(129814.57972268655/8.0), REAL_CONST(129839.88902584116/8.0), REAL_CONST(129865.19956242264/8.0), REAL_CONST(129890.51133231082/8.0), REAL_CONST(129915.82433538554/8.0), REAL_CONST(129941.13857152662/8.0), REAL_CONST(129966.45404061397/8.0), REAL_CONST(129991.7707425275/8.0), REAL_CONST(130017.08867714716/8.0), REAL_CONST(130042.4078443529/8.0), REAL_CONST(130067.72824402474/8.0), REAL_CONST(130093.04987604271/8.0), REAL_CONST(130118.37274028687/8.0), REAL_CONST(130143.69683663732/8.0), REAL_CONST(130169.02216497416/8.0), REAL_CONST(130194.34872517755/8.0), REAL_CONST(130219.67651712766/8.0), REAL_CONST(130245.0055407047/8.0), REAL_CONST(130270.33579578891/8.0), REAL_CONST(130295.66728226055/8.0), REAL_CONST(130320.99999999991/8.0), REAL_CONST(130346.33394888733/8.0), REAL_CONST(130371.66912880314/8.0), REAL_CONST(130397.00553962773/8.0), REAL_CONST(130422.34318124152/8.0), REAL_CONST(130447.68205352494/8.0), REAL_CONST(130473.02215635845/8.0), REAL_CONST(130498.36348962256/8.0), REAL_CONST(130523.70605319779/8.0), REAL_CONST(130549.0498469647/8.0), REAL_CONST(130574.39487080388/8.0), REAL_CONST(130599.74112459592/8.0), REAL_CONST(130625.08860822149/8.0), REAL_CONST(130650.43732156123/8.0), REAL_CONST(130675.78726449587/8.0), REAL_CONST(130701.13843690613/8.0), REAL_CONST(130726.49083867275/8.0), REAL_CONST(130751.84446967654/8.0), REAL_CONST(130777.19932979831/8.0), REAL_CONST(130802.5554189189/8.0), REAL_CONST(130827.91273691918/8.0), REAL_CONST(130853.27128368006/8.0), REAL_CONST(130878.63105908247/8.0), REAL_CONST(130903.99206300738/8.0), REAL_CONST(130929.35429533575/8.0), REAL_CONST(130954.71775594862/8.0), REAL_CONST(130980.08244472703/8.0), REAL_CONST(131005.44836155206/8.0), REAL_CONST(131030.81550630482/8.0), REAL_CONST(131056.18387886642/8.0), REAL_CONST(131081.55347911804/8.0), REAL_CONST(131106.92430694087/8.0), REAL_CONST(131132.29636221612/8.0), REAL_CONST(131157.66964482504/8.0), REAL_CONST(131183.0441546489/8.0), REAL_CONST(131208.41989156904/8.0), REAL_CONST(131233.79685546676/8.0), REAL_CONST(131259.17504622342/8.0), REAL_CONST(131284.55446372041/8.0), REAL_CONST(131309.93510783918/8.0), REAL_CONST(131335.31697846117/8.0), REAL_CONST(131360.70007546784/8.0), REAL_CONST(131386.0843987407/8.0), REAL_CONST(131411.46994816128/8.0), REAL_CONST(131436.85672361116/8.0), REAL_CONST(131462.24472497194/8.0), REAL_CONST(131487.63395212521/8.0), REAL_CONST(131513.02440495262/8.0), REAL_CONST(131538.41608333588/8.0), REAL_CONST(131563.80898715663/8.0), REAL_CONST(131589.2031162967/8.0), REAL_CONST(131614.59847063778/8.0), REAL_CONST(131639.9950500617/8.0), REAL_CONST(131665.39285445024/8.0), REAL_CONST(131690.79188368531/8.0), REAL_CONST(131716.19213764873/8.0), REAL_CONST(131741.59361622241/8.0), REAL_CONST(131766.99631928833/8.0), REAL_CONST(131792.40024672839/8.0), REAL_CONST(131817.80539842462/8.0), REAL_CONST(131843.21177425905/8.0), REAL_CONST(131868.61937411371/8.0), REAL_CONST(131894.02819787065/8.0), REAL_CONST(131919.43824541202/8.0), REAL_CONST(131944.84951661993/8.0), REAL_CONST(131970.26201137656/8.0), REAL_CONST(131995.67572956407/8.0), REAL_CONST(132021.09067106468/8.0), REAL_CONST(132046.50683576067/8.0), REAL_CONST(132071.9242235343/8.0), REAL_CONST(132097.34283426782/8.0), REAL_CONST(132122.76266784366/8.0), REAL_CONST(132148.1837241441/8.0), REAL_CONST(132173.60600305157/8.0), REAL_CONST(132199.02950444847/8.0), REAL_CONST(132224.45422821722/8.0), REAL_CONST(132249.88017424036/8.0), REAL_CONST(132275.30734240031/8.0), REAL_CONST(132300.73573257966/8.0), REAL_CONST(132326.16534466096/8.0), REAL_CONST(132351.59617852676/8.0), REAL_CONST(132377.02823405969/8.0), REAL_CONST(132402.46151114244/8.0), REAL_CONST(132427.89600965759/8.0), REAL_CONST(132453.33172948789/8.0), REAL_CONST(132478.76867051609/8.0), REAL_CONST(132504.20683262491/8.0), REAL_CONST(132529.64621569714/8.0), REAL_CONST(132555.08681961559/8.0), REAL_CONST(132580.5286442631/8.0), REAL_CONST(132605.97168952253/8.0), REAL_CONST(132631.41595527678/8.0), REAL_CONST(132656.86144140881/8.0), REAL_CONST(132682.30814780149/8.0), REAL_CONST(132707.75607433787/8.0), REAL_CONST(132733.20522090094/8.0), REAL_CONST(132758.65558737374/8.0), REAL_CONST(132784.10717363929/8.0), REAL_CONST(132809.55997958075/8.0), REAL_CONST(132835.01400508118/8.0), REAL_CONST(132860.46925002377/8.0), REAL_CONST(132885.92571429166/8.0), REAL_CONST(132911.38339776811/8.0), REAL_CONST(132936.84230033628/8.0), REAL_CONST(132962.30242187946/8.0), REAL_CONST(132987.76376228096/8.0), REAL_CONST(133013.22632142407/8.0), REAL_CONST(133038.69009919214/8.0), REAL_CONST(133064.15509546854/8.0), REAL_CONST(133089.62131013666/8.0), REAL_CONST(133115.08874307995/8.0), REAL_CONST(133140.55739418184/8.0), REAL_CONST(133166.02726332581/8.0), REAL_CONST(133191.49835039541/8.0), REAL_CONST(133216.97065527414/8.0), REAL_CONST(133242.44417784561/8.0), REAL_CONST(133267.91891799335/8.0), REAL_CONST(133293.39487560102/8.0), REAL_CONST(133318.87205055228/8.0), REAL_CONST(133344.35044273079/8.0), REAL_CONST(133369.83005202023/8.0), REAL_CONST(133395.31087830439/8.0), REAL_CONST(133420.79292146701/8.0), REAL_CONST(133446.27618139185/8.0), REAL_CONST(133471.76065796276/8.0), REAL_CONST(133497.24635106357/8.0), REAL_CONST(133522.73326057816/8.0), REAL_CONST(133548.22138639039/8.0), REAL_CONST(133573.71072838426/8.0), REAL_CONST(133599.20128644365/8.0), REAL_CONST(133624.69306045261/8.0), REAL_CONST(133650.1860502951/8.0), REAL_CONST(133675.68025585517/8.0), REAL_CONST(133701.1756770169/8.0), REAL_CONST(133726.67231366437/8.0), REAL_CONST(133752.17016568172/8.0), REAL_CONST(133777.66923295305/8.0), REAL_CONST(133803.16951536259/8.0), REAL_CONST(133828.67101279454/8.0), REAL_CONST(133854.17372513309/8.0), REAL_CONST(133879.67765226253/8.0), REAL_CONST(133905.18279406714/8.0), REAL_CONST(133930.68915043125/8.0), REAL_CONST(133956.19672123916/8.0), REAL_CONST(133981.70550637526/8.0), REAL_CONST(134007.21550572399/8.0), REAL_CONST(134032.7267191697/8.0), REAL_CONST(134058.23914659687/8.0), REAL_CONST(134083.75278789/8.0), REAL_CONST(134109.26764293358/8.0), REAL_CONST(134134.78371161217/8.0), REAL_CONST(134160.30099381026/8.0), REAL_CONST(134185.8194894125/8.0), REAL_CONST(134211.33919830353/8.0), REAL_CONST(134236.8601203679/8.0), REAL_CONST(134262.38225549037/8.0), REAL_CONST(134287.90560355558/8.0), REAL_CONST(134313.43016444831/8.0), REAL_CONST(134338.95593805326/8.0), REAL_CONST(134364.48292425525/8.0), REAL_CONST(134390.01112293909/8.0), REAL_CONST(134415.54053398955/8.0), REAL_CONST(134441.07115729159/8.0), REAL_CONST(134466.60299273001/8.0), REAL_CONST(134492.1360401898/8.0), REAL_CONST(134517.67029955584/8.0), REAL_CONST(134543.20577071316/8.0), REAL_CONST(134568.74245354676/8.0), REAL_CONST(134594.28034794159/8.0), REAL_CONST(134619.81945378278/8.0), REAL_CONST(134645.35977095537/8.0), REAL_CONST(134670.90129934452/8.0), REAL_CONST(134696.4440388353/8.0), REAL_CONST(134721.98798931291/8.0), REAL_CONST(134747.53315066252/8.0), REAL_CONST(134773.07952276937/8.0), REAL_CONST(134798.62710551871/8.0), REAL_CONST(134824.17589879577/8.0), REAL_CONST(134849.72590248589/8.0), REAL_CONST(134875.27711647438/8.0), REAL_CONST(134900.82954064661/8.0), REAL_CONST(134926.38317488792/8.0), REAL_CONST(134951.93801908373/8.0), REAL_CONST(134977.49407311951/8.0), REAL_CONST(135003.05133688069/8.0), REAL_CONST(135028.60981025276/8.0), REAL_CONST(135054.16949312127/8.0), REAL_CONST(135079.73038537172/8.0), REAL_CONST(135105.29248688967/8.0), REAL_CONST(135130.85579756077/8.0), REAL_CONST(135156.42031727062/8.0), REAL_CONST(135181.98604590484/8.0), REAL_CONST(135207.55298334916/8.0), REAL_CONST(135233.12112948924/8.0), REAL_CONST(135258.69048421088/8.0), REAL_CONST(135284.26104739975/8.0), REAL_CONST(135309.83281894168/8.0), REAL_CONST(135335.4057987225/8.0), REAL_CONST(135360.97998662802/8.0), REAL_CONST(135386.55538254412/8.0), REAL_CONST(135412.13198635669/8.0), REAL_CONST(135437.70979795168/8.0), REAL_CONST(135463.28881721498/8.0), REAL_CONST(135488.86904403262/8.0), REAL_CONST(135514.45047829056/8.0), REAL_CONST(135540.03311987486/8.0), REAL_CONST(135565.61696867159/8.0), REAL_CONST(135591.20202456677/8.0), REAL_CONST(135616.78828744654/8.0), REAL_CONST(135642.37575719706/8.0), REAL_CONST(135667.96443370447/8.0), REAL_CONST(135693.55431685498/8.0), REAL_CONST(135719.14540653475/8.0), REAL_CONST(135744.73770263011/8.0), REAL_CONST(135770.33120502727/8.0), REAL_CONST(135795.92591361253/8.0), REAL_CONST(135821.52182827223/8.0), REAL_CONST(135847.11894889272/8.0), REAL_CONST(135872.7172753604/8.0), REAL_CONST(135898.31680756161/8.0), REAL_CONST(135923.91754538284/8.0), REAL_CONST(135949.51948871053/8.0), REAL_CONST(135975.12263743114/8.0), REAL_CONST(136000.72699143123/8.0), REAL_CONST(136026.33255059729/8.0), REAL_CONST(136051.93931481591/8.0), REAL_CONST(136077.54728397369/8.0), REAL_CONST(136103.15645795723/8.0), REAL_CONST(136128.76683665317/8.0), REAL_CONST(136154.37841994822/8.0), REAL_CONST(136179.99120772901/8.0), REAL_CONST(136205.60519988232/8.0), REAL_CONST(136231.2203962949/8.0), REAL_CONST(136256.83679685349/8.0), REAL_CONST(136282.45440144493/8.0), REAL_CONST(136308.07320995603/8.0), REAL_CONST(136333.69322227367/8.0), REAL_CONST(136359.31443828469/8.0), REAL_CONST(136384.93685787608/8.0), REAL_CONST(136410.56048093468/8.0), REAL_CONST(136436.18530734754/8.0), REAL_CONST(136461.81133700156/8.0), REAL_CONST(136487.43856978384/8.0), REAL_CONST(136513.06700558143/8.0), REAL_CONST(136538.6966442813/8.0), REAL_CONST(136564.32748577066/8.0), REAL_CONST(136589.95952993655/8.0), REAL_CONST(136615.59277666616/8.0), REAL_CONST(136641.22722584667/8.0), REAL_CONST(136666.86287736523/8.0), REAL_CONST(136692.49973110916/8.0), REAL_CONST(136718.13778696564/8.0), REAL_CONST(136743.77704482197/8.0), REAL_CONST(136769.41750456547/8.0), REAL_CONST(136795.05916608346/8.0), REAL_CONST(136820.70202926331/8.0), REAL_CONST(136846.34609399244/8.0), REAL_CONST(136871.99136015819/8.0), REAL_CONST(136897.63782764805/8.0), REAL_CONST(136923.28549634948/8.0), REAL_CONST(136948.93436614997/8.0), REAL_CONST(136974.58443693706/8.0), REAL_CONST(137000.23570859825/8.0), REAL_CONST(137025.88818102115/8.0), REAL_CONST(137051.54185409332/8.0), REAL_CONST(137077.19672770242/8.0), REAL_CONST(137102.85280173609/8.0), REAL_CONST(137128.51007608202/8.0), REAL_CONST(137154.16855062786/8.0), REAL_CONST(137179.82822526142/8.0), REAL_CONST(137205.48909987041/8.0), REAL_CONST(137231.15117434258/8.0), REAL_CONST(137256.8144485658/8.0), REAL_CONST(137282.47892242789/8.0), REAL_CONST(137308.14459581667/8.0), REAL_CONST(137333.81146862009/8.0), REAL_CONST(137359.47954072602/8.0), REAL_CONST(137385.14881202241/8.0), REAL_CONST(137410.81928239719/8.0), REAL_CONST(137436.49095173844/8.0), REAL_CONST(137462.16381993407/8.0), REAL_CONST(137487.83788687221/8.0), REAL_CONST(137513.51315244089/8.0), REAL_CONST(137539.18961652822/8.0), REAL_CONST(137564.86727902229/8.0), REAL_CONST(137590.54613981131/8.0), REAL_CONST(137616.22619878338/8.0), REAL_CONST(137641.90745582676/8.0), REAL_CONST(137667.58991082967/8.0), REAL_CONST(137693.27356368033/8.0), REAL_CONST(137718.95841426702/8.0), REAL_CONST(137744.64446247809/8.0), REAL_CONST(137770.33170820182/8.0), REAL_CONST(137796.02015132661/8.0), REAL_CONST(137821.70979174081/8.0), REAL_CONST(137847.40062933284/8.0), REAL_CONST(137873.09266399115/8.0), REAL_CONST(137898.78589560417/8.0), REAL_CONST(137924.48032406042/8.0), REAL_CONST(137950.17594924837/8.0), REAL_CONST(137975.8727710566/8.0), REAL_CONST(138001.57078937365/8.0), REAL_CONST(138027.27000408815/8.0), REAL_CONST(138052.97041508864/8.0), REAL_CONST(138078.67202226384/8.0), REAL_CONST(138104.3748255024/8.0), REAL_CONST(138130.07882469296/8.0), REAL_CONST(138155.78401972432/8.0), REAL_CONST(138181.49041048516/8.0), REAL_CONST(138207.1979968643/8.0), REAL_CONST(138232.9067787505/8.0), REAL_CONST(138258.61675603263/8.0), REAL_CONST(138284.32792859949/8.0), REAL_CONST(138310.04029633995/8.0), REAL_CONST(138335.75385914298/8.0), REAL_CONST(138361.46861689744/8.0), REAL_CONST(138387.18456949232/8.0), REAL_CONST(138412.90171681659/8.0), REAL_CONST(138438.62005875923/8.0), REAL_CONST(138464.33959520931/8.0), REAL_CONST(138490.06032605586/8.0), REAL_CONST(138515.78225118798/8.0), REAL_CONST(138541.50537049473/8.0), REAL_CONST(138567.2296838653/8.0), REAL_CONST(138592.95519118884/8.0), REAL_CONST(138618.68189235451/8.0), REAL_CONST(138644.40978725153/8.0), REAL_CONST(138670.13887576913/8.0), REAL_CONST(138695.86915779658/8.0), REAL_CONST(138721.60063322316/8.0), REAL_CONST(138747.33330193823/8.0), REAL_CONST(138773.06716383106/8.0), REAL_CONST(138798.80221879104/8.0), REAL_CONST(138824.53846670757/8.0), REAL_CONST(138850.27590747006/8.0), REAL_CONST(138876.01454096794/8.0), REAL_CONST(138901.7543670907/8.0), REAL_CONST(138927.49538572782/8.0), REAL_CONST(138953.2375967688/8.0), REAL_CONST(138978.9810001032/8.0), REAL_CONST(139004.72559562061/8.0), REAL_CONST(139030.47138321059/8.0), REAL_CONST(139056.2183627628/8.0), REAL_CONST(139081.96653416683/8.0), REAL_CONST(139107.71589731239/8.0), REAL_CONST(139133.46645208917/8.0), REAL_CONST(139159.21819838689/8.0), REAL_CONST(139184.97113609532/8.0), REAL_CONST(139210.72526510421/8.0), REAL_CONST(139236.48058530336/8.0), REAL_CONST(139262.23709658257/8.0), REAL_CONST(139287.99479883176/8.0), REAL_CONST(139313.75369194071/8.0), REAL_CONST(139339.51377579942/8.0), REAL_CONST(139365.27505029776/8.0), REAL_CONST(139391.03751532568/8.0), REAL_CONST(139416.80117077316/8.0), REAL_CONST(139442.56601653024/8.0), REAL_CONST(139468.33205248689/8.0), REAL_CONST(139494.09927853322/8.0), REAL_CONST(139519.86769455927/8.0), REAL_CONST(139545.63730045516/8.0), REAL_CONST(139571.408096111/8.0), REAL_CONST(139597.18008141697/8.0), REAL_CONST(139622.95325626322/8.0), REAL_CONST(139648.72762054001/8.0), REAL_CONST(139674.5031741375/8.0), REAL_CONST(139700.27991694602/8.0), REAL_CONST(139726.05784885579/8.0), REAL_CONST(139751.83696975713/8.0), REAL_CONST(139777.61727954043/8.0), REAL_CONST(139803.39877809596/8.0), REAL_CONST(139829.18146531415/8.0), REAL_CONST(139854.96534108539/8.0), REAL_CONST(139880.75040530015/8.0), REAL_CONST(139906.53665784886/8.0), REAL_CONST(139932.32409862199/8.0), REAL_CONST(139958.11272751007/8.0), REAL_CONST(139983.90254440365/8.0), REAL_CONST(140009.69354919327/8.0), REAL_CONST(140035.48574176949/8.0), REAL_CONST(140061.27912202294/8.0), REAL_CONST(140087.07368984428/8.0), REAL_CONST(140112.86944512415/8.0), REAL_CONST(140138.66638775321/8.0), REAL_CONST(140164.4645176222/8.0), REAL_CONST(140190.26383462184/8.0), REAL_CONST(140216.06433864293/8.0), REAL_CONST(140241.86602957622/8.0), REAL_CONST(140267.66890731253/8.0), REAL_CONST(140293.47297174268/8.0), REAL_CONST(140319.27822275754/8.0), REAL_CONST(140345.08466024802/8.0), REAL_CONST(140370.89228410498/8.0), REAL_CONST(140396.70109421943/8.0), REAL_CONST(140422.51109048226/8.0), REAL_CONST(140448.32227278448/8.0), REAL_CONST(140474.13464101712/8.0), REAL_CONST(140499.94819507122/8.0), REAL_CONST(140525.76293483781/8.0), REAL_CONST(140551.57886020801/8.0), REAL_CONST(140577.3959710729/8.0), REAL_CONST(140603.21426732364/8.0), REAL_CONST(140629.03374885136/8.0), REAL_CONST(140654.85441554731/8.0), REAL_CONST(140680.67626730262/8.0), REAL_CONST(140706.49930400858/8.0), REAL_CONST(140732.32352555645/8.0), REAL_CONST(140758.1489318375/8.0), REAL_CONST(140783.97552274304/8.0), REAL_CONST(140809.80329816442/8.0), REAL_CONST(140835.63225799298/8.0), REAL_CONST(140861.46240212015/8.0), REAL_CONST(140887.29373043729/8.0), REAL_CONST(140913.12624283586/8.0), REAL_CONST(140938.95993920733/8.0), REAL_CONST(140964.79481944317/8.0), REAL_CONST(140990.63088343487/8.0), REAL_CONST(141016.46813107401/8.0), REAL_CONST(141042.30656225214/8.0), REAL_CONST(141068.14617686081/8.0), REAL_CONST(141093.98697479168/8.0), REAL_CONST(141119.82895593636/8.0), REAL_CONST(141145.6721201865/8.0), REAL_CONST(141171.51646743377/8.0), REAL_CONST(141197.36199756994/8.0), REAL_CONST(141223.20871048668/8.0), REAL_CONST(141249.05660607578/8.0), REAL_CONST(141274.90568422904/8.0), REAL_CONST(141300.75594483822/8.0), REAL_CONST(141326.6073877952/8.0), REAL_CONST(141352.4600129918/8.0), REAL_CONST(141378.31382031992/8.0), REAL_CONST(141404.16880967148/8.0), REAL_CONST(141430.02498093838/8.0), REAL_CONST(141455.8823340126/8.0), REAL_CONST(141481.74086878612/8.0), REAL_CONST(141507.60058515094/8.0), REAL_CONST(141533.46148299909/8.0), REAL_CONST(141559.32356222265/8.0), REAL_CONST(141585.18682271364/8.0), REAL_CONST(141611.05126436421/8.0), REAL_CONST(141636.9168870665/8.0), REAL_CONST(141662.78369071262/8.0), REAL_CONST(141688.65167519479/8.0), REAL_CONST(141714.5208404052/8.0), REAL_CONST(141740.39118623605/8.0), REAL_CONST(141766.26271257963/8.0), REAL_CONST(141792.1354193282/8.0), REAL_CONST(141818.00930637406/8.0), REAL_CONST(141843.88437360956/8.0), REAL_CONST(141869.760620927/8.0), REAL_CONST(141895.6380482188/8.0), REAL_CONST(141921.51665537735/8.0), REAL_CONST(141947.39644229505/8.0), REAL_CONST(141973.27740886438/8.0), REAL_CONST(141999.15955497778/8.0), REAL_CONST(142025.04288052776/8.0), REAL_CONST(142050.92738540689/8.0), REAL_CONST(142076.81306950765/8.0), REAL_CONST(142102.69993272264/8.0), REAL_CONST(142128.58797494444/8.0), REAL_CONST(142154.47719606571/8.0), REAL_CONST(142180.36759597904/8.0), REAL_CONST(142206.25917457714/8.0), REAL_CONST(142232.15193175265/8.0), REAL_CONST(142258.04586739838/8.0), REAL_CONST(142283.94098140698/8.0), REAL_CONST(142309.83727367126/8.0), REAL_CONST(142335.73474408401/8.0), REAL_CONST(142361.63339253806/8.0), REAL_CONST(142387.5332189262/8.0), REAL_CONST(142413.43422314132/8.0), REAL_CONST(142439.33640507635/8.0), REAL_CONST(142465.23976462413/8.0), REAL_CONST(142491.14430167765/8.0), REAL_CONST(142517.05001612983/8.0), REAL_CONST(142542.95690787368/8.0), REAL_CONST(142568.86497680223/8.0), REAL_CONST(142594.77422280848/8.0), REAL_CONST(142620.68464578551/8.0), REAL_CONST(142646.5962456264/8.0), REAL_CONST(142672.50902222423/8.0), REAL_CONST(142698.42297547215/8.0), REAL_CONST(142724.33810526333/8.0), REAL_CONST(142750.25441149093/8.0), REAL_CONST(142776.17189404817/8.0), REAL_CONST(142802.09055282827/8.0), REAL_CONST(142828.01038772447/8.0), REAL_CONST(142853.93139863008/8.0), REAL_CONST(142879.85358543837/8.0), REAL_CONST(142905.77694804268/8.0), REAL_CONST(142931.70148633636/8.0), REAL_CONST(142957.62720021277/8.0), REAL_CONST(142983.55408956532/8.0), REAL_CONST(143009.48215428743/8.0), REAL_CONST(143035.41139427255/8.0), REAL_CONST(143061.34180941415/8.0), REAL_CONST(143087.27339960571/8.0), REAL_CONST(143113.20616474075/8.0), REAL_CONST(143139.14010471283/8.0), REAL_CONST(143165.07521941551/8.0), REAL_CONST(143191.01150874238/8.0), REAL_CONST(143216.94897258704/8.0), REAL_CONST(143242.88761084314/8.0), REAL_CONST(143268.82742340435/8.0), REAL_CONST(143294.76841016437/8.0), REAL_CONST(143320.71057101688/8.0), REAL_CONST(143346.65390585564/8.0), REAL_CONST(143372.59841457437/8.0), REAL_CONST(143398.54409706692/8.0), REAL_CONST(143424.49095322701/8.0), REAL_CONST(143450.43898294857/8.0), REAL_CONST(143476.38818612538/8.0), REAL_CONST(143502.33856265133/8.0), REAL_CONST(143528.29011242036/8.0), REAL_CONST(143554.24283532638/8.0), REAL_CONST(143580.19673126334/8.0), REAL_CONST(143606.1518001252/8.0), REAL_CONST(143632.10804180597/8.0), REAL_CONST(143658.06545619969/8.0), REAL_CONST(143684.02404320039/8.0), REAL_CONST(143709.98380270213/8.0), REAL_CONST(143735.944734599/8.0), REAL_CONST(143761.90683878519/8.0), REAL_CONST(143787.87011515474/8.0), REAL_CONST(143813.83456360188/8.0), REAL_CONST(143839.8001840208/8.0), REAL_CONST(143865.76697630569/8.0), REAL_CONST(143891.73494035081/8.0), REAL_CONST(143917.7040760504/8.0), REAL_CONST(143943.67438329876/8.0), REAL_CONST(143969.6458619902/8.0), REAL_CONST(143995.61851201905/8.0), REAL_CONST(144021.59233327967/8.0), REAL_CONST(144047.56732566646/8.0), REAL_CONST(144073.54348907378/8.0), REAL_CONST(144099.52082339607/8.0), REAL_CONST(144125.49932852783/8.0), REAL_CONST(144151.4790043635/8.0), REAL_CONST(144177.45985079758/8.0), REAL_CONST(144203.44186772458/8.0), REAL_CONST(144229.42505503909/8.0), REAL_CONST(144255.40941263564/8.0), REAL_CONST(144281.39494040885/8.0), REAL_CONST(144307.38163825331/8.0), REAL_CONST(144333.36950606373/8.0), REAL_CONST(144359.35854373468/8.0), REAL_CONST(144385.34875116093/8.0), REAL_CONST(144411.34012823718/8.0), REAL_CONST(144437.33267485813/8.0), REAL_CONST(144463.32639091855/8.0), REAL_CONST(144489.32127631325/8.0), REAL_CONST(144515.31733093705/8.0), REAL_CONST(144541.31455468474/8.0), REAL_CONST(144567.3129474512/8.0), REAL_CONST(144593.3125091313/8.0), REAL_CONST(144619.31323961995/8.0), REAL_CONST(144645.31513881206/8.0), REAL_CONST(144671.31820660262/8.0), REAL_CONST(144697.32244288657/8.0), REAL_CONST(144723.32784755889/8.0), REAL_CONST(144749.33442051467/8.0), REAL_CONST(144775.34216164888/8.0), REAL_CONST(144801.35107085665/8.0), REAL_CONST(144827.36114803303/8.0), REAL_CONST(144853.37239307314/8.0), REAL_CONST(144879.38480587213/8.0), REAL_CONST(144905.39838632516/8.0), REAL_CONST(144931.41313432742/8.0), REAL_CONST(144957.4290497741/8.0), REAL_CONST(144983.44613256046/8.0), REAL_CONST(145009.46438258173/8.0), REAL_CONST(145035.48379973322/8.0), REAL_CONST(145061.50438391021/8.0), REAL_CONST(145087.52613500805/8.0), REAL_CONST(145113.54905292206/8.0), REAL_CONST(145139.57313754765/8.0), REAL_CONST(145165.59838878017/8.0), REAL_CONST(145191.62480651509/8.0), REAL_CONST(145217.65239064783/8.0), REAL_CONST(145243.68114107384/8.0), REAL_CONST(145269.71105768863/8.0), REAL_CONST(145295.74214038774/8.0), REAL_CONST(145321.77438906668/8.0), REAL_CONST(145347.80780362099/8.0), REAL_CONST(145373.84238394629/8.0), REAL_CONST(145399.87812993818/8.0), REAL_CONST(145425.91504149229/8.0), REAL_CONST(145451.95311850426/8.0), REAL_CONST(145477.9923608698/8.0), REAL_CONST(145504.03276848458/8.0), REAL_CONST(145530.07434124436/8.0), REAL_CONST(145556.11707904484/8.0), REAL_CONST(145582.16098178181/8.0), REAL_CONST(145608.20604935108/8.0), REAL_CONST(145634.25228164849/8.0), REAL_CONST(145660.29967856981/8.0), REAL_CONST(145686.34824001096/8.0), REAL_CONST(145712.39796586783/8.0), REAL_CONST(145738.4488560363/8.0), REAL_CONST(145764.50091041232/8.0), REAL_CONST(145790.55412889185/8.0), REAL_CONST(145816.60851137087/8.0), REAL_CONST(145842.66405774537/8.0), REAL_CONST(145868.72076791141/8.0), REAL_CONST(145894.77864176501/8.0), REAL_CONST(145920.83767920226/8.0), REAL_CONST(145946.89788011924/8.0), REAL_CONST(145972.95924441208/8.0), REAL_CONST(145999.02177197693/8.0), REAL_CONST(146025.08546270995/8.0), REAL_CONST(146051.15031650732/8.0), REAL_CONST(146077.21633326527/8.0), REAL_CONST(146103.28351288004/8.0), REAL_CONST(146129.35185524789/8.0), REAL_CONST(146155.42136026506/8.0), REAL_CONST(146181.49202782792/8.0), REAL_CONST(146207.56385783272/8.0), REAL_CONST(146233.63685017588/8.0), REAL_CONST(146259.71100475377/8.0), REAL_CONST(146285.78632146274/8.0), REAL_CONST(146311.86280019928/8.0), REAL_CONST(146337.94044085976/8.0), REAL_CONST(146364.01924334071/8.0), REAL_CONST(146390.09920753856/8.0), REAL_CONST(146416.18033334985/8.0), REAL_CONST(146442.26262067116/8.0), REAL_CONST(146468.34606939898/8.0), REAL_CONST(146494.43067942993/8.0), REAL_CONST(146520.51645066062/8.0), REAL_CONST(146546.60338298764/8.0), REAL_CONST(146572.69147630769/8.0), REAL_CONST(146598.78073051744/8.0), REAL_CONST(146624.87114551352/8.0), REAL_CONST(146650.96272119274/8.0), REAL_CONST(146677.05545745179/8.0), REAL_CONST(146703.14935418745/8.0), REAL_CONST(146729.2444112965/8.0), REAL_CONST(146755.34062867577/8.0), REAL_CONST(146781.43800622207/8.0), REAL_CONST(146807.53654383228/8.0), REAL_CONST(146833.63624140329/8.0), REAL_CONST(146859.73709883197/8.0), REAL_CONST(146885.83911601527/8.0), REAL_CONST(146911.94229285014/8.0), REAL_CONST(146938.04662923355/8.0), REAL_CONST(146964.15212506248/8.0), REAL_CONST(146990.25878023397/8.0), REAL_CONST(147016.36659464505/8.0), REAL_CONST(147042.47556819281/8.0), REAL_CONST(147068.58570077427/8.0), REAL_CONST(147094.6969922866/8.0), REAL_CONST(147120.80944262692/8.0), REAL_CONST(147146.92305169237/8.0), REAL_CONST(147173.03781938017/8.0), REAL_CONST(147199.15374558745/8.0), REAL_CONST(147225.27083021149/8.0), REAL_CONST(147251.38907314953/8.0), REAL_CONST(147277.50847429881/8.0), REAL_CONST(147303.62903355664/8.0), REAL_CONST(147329.75075082036/8.0), REAL_CONST(147355.87362598727/8.0), REAL_CONST(147381.99765895473/8.0), REAL_CONST(147408.12284962015/8.0), REAL_CONST(147434.24919788091/8.0), REAL_CONST(147460.37670363448/8.0), REAL_CONST(147486.50536677826/8.0), REAL_CONST(147512.63518720976/8.0), REAL_CONST(147538.76616482646/8.0), REAL_CONST(147564.89829952587/8.0), REAL_CONST(147591.03159120557/8.0), REAL_CONST(147617.16603976308/8.0), REAL_CONST(147643.30164509601/8.0), REAL_CONST(147669.43840710199/8.0), REAL_CONST(147695.57632567859/8.0), REAL_CONST(147721.71540072354/8.0), REAL_CONST(147747.85563213445/8.0), REAL_CONST(147773.99701980909/8.0), REAL_CONST(147800.13956364512/8.0), REAL_CONST(147826.28326354033/8.0), REAL_CONST(147852.42811939248/8.0), REAL_CONST(147878.57413109933/8.0), REAL_CONST(147904.72129855872/8.0), REAL_CONST(147930.86962166851/8.0), REAL_CONST(147957.01910032652/8.0), REAL_CONST(147983.16973443062/8.0), REAL_CONST(148009.32152387875/8.0), REAL_CONST(148035.47446856883/8.0), REAL_CONST(148061.62856839882/8.0), REAL_CONST(148087.78382326665/8.0), REAL_CONST(148113.94023307035/8.0), REAL_CONST(148140.09779770792/8.0), REAL_CONST(148166.25651707739/8.0), REAL_CONST(148192.41639107687/8.0), REAL_CONST(148218.57741960438/8.0), REAL_CONST(148244.73960255808/8.0), REAL_CONST(148270.90293983606/8.0), REAL_CONST(148297.0674313365/8.0), REAL_CONST(148323.23307695755/8.0), REAL_CONST(148349.39987659742/8.0), REAL_CONST(148375.56783015432/8.0), REAL_CONST(148401.73693752653/8.0), REAL_CONST(148427.90719861226/8.0), REAL_CONST(148454.07861330983/8.0), REAL_CONST(148480.25118151752/8.0), REAL_CONST(148506.42490313368/8.0), REAL_CONST(148532.59977805667/8.0), REAL_CONST(148558.77580618486/8.0), REAL_CONST(148584.95298741665/8.0), REAL_CONST(148611.13132165043/8.0), REAL_CONST(148637.31080878471/8.0), REAL_CONST(148663.49144871789/8.0), REAL_CONST(148689.6732413485/8.0), REAL_CONST(148715.85618657502/8.0), REAL_CONST(148742.040284296/8.0), REAL_CONST(148768.22553440998/8.0), REAL_CONST(148794.41193681557/8.0), REAL_CONST(148820.59949141133/8.0), REAL_CONST(148846.78819809589/8.0), REAL_CONST(148872.97805676793/8.0), REAL_CONST(148899.16906732606/8.0), REAL_CONST(148925.36122966901/8.0), REAL_CONST(148951.55454369547/8.0), REAL_CONST(148977.74900930419/8.0), REAL_CONST(149003.9446263939/8.0), REAL_CONST(149030.1413948634/8.0), REAL_CONST(149056.33931461151/8.0), REAL_CONST(149082.53838553699/8.0), REAL_CONST(149108.73860753875/8.0), REAL_CONST(149134.9399805156/8.0), REAL_CONST(149161.14250436646/8.0), REAL_CONST(149187.34617899026/8.0), REAL_CONST(149213.5510042859/8.0), REAL_CONST(149239.75698015234/8.0), REAL_CONST(149265.96410648854/8.0), REAL_CONST(149292.17238319354/8.0), REAL_CONST(149318.38181016635/8.0), REAL_CONST(149344.59238730598/8.0), REAL_CONST(149370.80411451156/8.0), REAL_CONST(149397.01699168212/8.0), REAL_CONST(149423.23101871679/8.0), REAL_CONST(149449.44619551473/8.0), REAL_CONST(149475.66252197503/8.0), REAL_CONST(149501.87999799693/8.0), REAL_CONST(149528.0986234796/8.0), REAL_CONST(149554.31839832227/8.0), REAL_CONST(149580.53932242419/8.0), REAL_CONST(149606.76139568459/8.0), REAL_CONST(149632.98461800278/8.0), REAL_CONST(149659.20898927809/8.0), REAL_CONST(149685.43450940982/8.0), REAL_CONST(149711.66117829733/8.0), REAL_CONST(149737.88899584001/8.0), REAL_CONST(149764.11796193724/8.0), REAL_CONST(149790.34807648844/8.0), REAL_CONST(149816.57933939309/8.0), REAL_CONST(149842.81175055061/8.0), REAL_CONST(149869.04530986046/8.0), REAL_CONST(149895.28001722222/8.0), REAL_CONST(149921.51587253538/8.0), REAL_CONST(149947.75287569952/8.0), REAL_CONST(149973.99102661415/8.0), REAL_CONST(150000.23032517891/8.0), REAL_CONST(150026.47077129342/8.0), REAL_CONST(150052.71236485732/8.0), REAL_CONST(150078.95510577026/8.0), REAL_CONST(150105.1989939319/8.0), REAL_CONST(150131.444029242/8.0), REAL_CONST(150157.69021160025/8.0), REAL_CONST(150183.93754090639/8.0), REAL_CONST(150210.18601706024/8.0), REAL_CONST(150236.43563996154/8.0), REAL_CONST(150262.68640951012/8.0), REAL_CONST(150288.93832560582/8.0), REAL_CONST(150315.19138814852/8.0), REAL_CONST(150341.44559703805/8.0), REAL_CONST(150367.70095217437/8.0), REAL_CONST(150393.95745345735/8.0), REAL_CONST(150420.21510078697/8.0), REAL_CONST(150446.47389406321/8.0), REAL_CONST(150472.73383318601/8.0), REAL_CONST(150498.99491805542/8.0), REAL_CONST(150525.25714857146/8.0), REAL_CONST(150551.52052463419/8.0), REAL_CONST(150577.78504614369/8.0), REAL_CONST(150604.05071300003/8.0), REAL_CONST(150630.31752510337/8.0), REAL_CONST(150656.58548235384/8.0), REAL_CONST(150682.85458465159/8.0), REAL_CONST(150709.1248318968/8.0), REAL_CONST(150735.39622398972/8.0), REAL_CONST(150761.66876083051/8.0), REAL_CONST(150787.9424423195/8.0), REAL_CONST(150814.21726835691/8.0), REAL_CONST(150840.49323884305/8.0), REAL_CONST(150866.77035367821/8.0), REAL_CONST(150893.04861276277/8.0), REAL_CONST(150919.32801599705/8.0), REAL_CONST(150945.60856328148/8.0), REAL_CONST(150971.89025451642/8.0), REAL_CONST(150998.17308960229/8.0), REAL_CONST(151024.45706843957/8.0), REAL_CONST(151050.74219092872/8.0), REAL_CONST(151077.02845697021/8.0), REAL_CONST(151103.31586646455/8.0), REAL_CONST(151129.60441931229/8.0), REAL_CONST(151155.894115414/8.0), REAL_CONST(151182.1849546702/8.0), REAL_CONST(151208.47693698155/8.0), REAL_CONST(151234.77006224863/8.0), REAL_CONST(151261.06433037209/8.0), REAL_CONST(151287.35974125259/8.0), REAL_CONST(151313.65629479082/8.0), REAL_CONST(151339.95399088747/8.0), REAL_CONST(151366.25282944329/8.0), REAL_CONST(151392.55281035902/8.0), REAL_CONST(151418.85393353543/8.0), REAL_CONST(151445.1561988733/8.0), REAL_CONST(151471.45960627345/8.0), REAL_CONST(151497.76415563675/8.0), REAL_CONST(151524.06984686397/8.0), REAL_CONST(151550.37667985607/8.0), REAL_CONST(151576.68465451393/8.0), REAL_CONST(151602.99377073845/8.0), REAL_CONST(151629.30402843058/8.0), REAL_CONST(151655.61542749128/8.0), REAL_CONST(151681.92796782157/8.0), REAL_CONST(151708.24164932242/8.0), REAL_CONST(151734.55647189484/8.0), REAL_CONST(151760.87243543993/8.0), REAL_CONST(151787.18953985872/8.0), REAL_CONST(151813.50778505235/8.0), REAL_CONST(151839.82717092187/8.0), REAL_CONST(151866.14769736846/8.0), REAL_CONST(151892.46936429327/8.0), REAL_CONST(151918.79217159748/8.0), REAL_CONST(151945.11611918229/8.0), REAL_CONST(151971.44120694889/8.0), REAL_CONST(151997.76743479856/8.0), REAL_CONST(152024.09480263255/8.0), REAL_CONST(152050.42331035214/8.0), REAL_CONST(152076.75295785864/8.0), REAL_CONST(152103.08374505339/8.0), REAL_CONST(152129.41567183775/8.0), REAL_CONST(152155.74873811303/8.0), REAL_CONST(152182.08294378067/8.0), REAL_CONST(152208.41828874208/8.0), REAL_CONST(152234.75477289871/8.0), REAL_CONST(152261.09239615197/8.0), REAL_CONST(152287.43115840337/8.0), REAL_CONST(152313.77105955439/8.0), REAL_CONST(152340.11209950657/8.0), REAL_CONST(152366.45427816146/8.0), REAL_CONST(152392.79759542056/8.0), REAL_CONST(152419.14205118554/8.0), REAL_CONST(152445.48764535793/8.0), REAL_CONST(152471.8343778394/8.0), REAL_CONST(152498.18224853161/8.0), REAL_CONST(152524.53125733617/8.0), REAL_CONST(152550.88140415482/8.0), REAL_CONST(152577.23268888926/8.0), REAL_CONST(152603.58511144121/8.0), REAL_CONST(152629.93867171241/8.0), REAL_CONST(152656.29336960468/8.0), REAL_CONST(152682.64920501978/8.0), REAL_CONST(152709.00617785956/8.0), REAL_CONST(152735.36428802583/8.0), REAL_CONST(152761.72353542043/8.0), REAL_CONST(152788.08391994529/8.0), REAL_CONST(152814.44544150229/8.0), REAL_CONST(152840.80809999333/8.0), REAL_CONST(152867.17189532038/8.0), REAL_CONST(152893.53682738543/8.0), REAL_CONST(152919.90289609041/8.0), REAL_CONST(152946.27010133737/8.0), REAL_CONST(152972.63844302832/8.0), REAL_CONST(152999.00792106529/8.0), REAL_CONST(153025.37853535041/8.0), REAL_CONST(153051.7502857857/8.0), REAL_CONST(153078.12317227334/8.0), REAL_CONST(153104.4971947154/8.0), REAL_CONST(153130.8723530141/8.0), REAL_CONST(153157.24864707157/8.0), REAL_CONST(153183.62607679001/8.0), REAL_CONST(153210.00464207167/8.0), REAL_CONST(153236.38434281875/8.0), REAL_CONST(153262.76517893354/8.0), REAL_CONST(153289.14715031831/8.0), REAL_CONST(153315.53025687535/8.0), REAL_CONST(153341.91449850702/8.0), REAL_CONST(153368.2998751156/8.0), REAL_CONST(153394.68638660354/8.0), REAL_CONST(153421.07403287315/8.0), REAL_CONST(153447.46281382689/8.0), REAL_CONST(153473.85272936718/8.0), REAL_CONST(153500.24377939643/8.0), REAL_CONST(153526.63596381716/8.0), REAL_CONST(153553.02928253182/8.0), REAL_CONST(153579.42373544298/8.0), REAL_CONST(153605.81932245308/8.0), REAL_CONST(153632.21604346478/8.0), REAL_CONST(153658.61389838057/8.0), REAL_CONST(153685.0128871031/8.0), REAL_CONST(153711.41300953497/8.0), REAL_CONST(153737.81426557881/8.0), REAL_CONST(153764.21665513728/8.0), REAL_CONST(153790.62017811305/8.0), REAL_CONST(153817.02483440886/8.0), REAL_CONST(153843.43062392739/8.0), REAL_CONST(153869.83754657139/8.0), REAL_CONST(153896.24560224367/8.0), REAL_CONST(153922.65479084692/8.0), REAL_CONST(153949.06511228404/8.0), REAL_CONST(153975.4765664578/8.0), REAL_CONST(154001.88915327107/8.0), REAL_CONST(154028.30287262669/8.0), REAL_CONST(154054.71772442761/8.0), REAL_CONST(154081.13370857667/8.0), REAL_CONST(154107.55082497682/8.0), REAL_CONST(154133.96907353101/8.0), REAL_CONST(154160.38845414223/8.0), REAL_CONST(154186.80896671346/8.0), REAL_CONST(154213.23061114774/8.0), REAL_CONST(154239.65338734805/8.0), REAL_CONST(154266.07729521746/8.0), REAL_CONST(154292.50233465908/8.0), REAL_CONST(154318.92850557598/8.0), REAL_CONST(154345.35580787127/8.0), REAL_CONST(154371.7842414481/8.0), REAL_CONST(154398.21380620965/8.0), REAL_CONST(154424.64450205903/8.0), REAL_CONST(154451.07632889951/8.0), REAL_CONST(154477.50928663427/8.0), REAL_CONST(154503.94337516659/8.0), REAL_CONST(154530.37859439969/8.0), REAL_CONST(154556.81494423689/8.0), REAL_CONST(154583.25242458144/8.0), REAL_CONST(154609.69103533673/8.0), REAL_CONST(154636.13077640603/8.0), REAL_CONST(154662.57164769279/8.0), REAL_CONST(154689.01364910032/8.0), REAL_CONST(154715.45678053208/8.0), REAL_CONST(154741.90104189145/8.0), REAL_CONST(154768.34643308193/8.0), REAL_CONST(154794.79295400696/8.0), REAL_CONST(154821.24060457002/8.0), REAL_CONST(154847.68938467462/8.0), REAL_CONST(154874.13929422433/8.0), REAL_CONST(154900.59033312264/8.0), REAL_CONST(154927.04250127316/8.0), REAL_CONST(154953.49579857948/8.0), REAL_CONST(154979.95022494521/8.0), REAL_CONST(155006.40578027396/8.0), REAL_CONST(155032.86246446942/8.0), REAL_CONST(155059.32027743524/8.0), REAL_CONST(155085.77921907514/8.0), REAL_CONST(155112.2392892928/8.0), REAL_CONST(155138.70048799197/8.0), REAL_CONST(155165.16281507642/8.0), REAL_CONST(155191.62627044989/8.0), REAL_CONST(155218.09085401625/8.0), REAL_CONST(155244.55656567923/8.0), REAL_CONST(155271.02340534274/8.0), REAL_CONST(155297.49137291059/8.0), REAL_CONST(155323.96046828668/8.0), REAL_CONST(155350.4306913749/8.0), REAL_CONST(155376.90204207919/8.0), REAL_CONST(155403.37452030348/8.0), REAL_CONST(155429.84812595171/8.0), REAL_CONST(155456.32285892789/8.0), REAL_CONST(155482.79871913602/8.0), REAL_CONST(155509.27570648011/8.0), REAL_CONST(155535.75382086422/8.0), REAL_CONST(155562.23306219239/8.0), REAL_CONST(155588.71343036872/8.0), REAL_CONST(155615.19492529731/8.0), REAL_CONST(155641.67754688227/8.0), REAL_CONST(155668.16129502779/8.0), REAL_CONST(155694.64616963797/8.0), REAL_CONST(155721.13217061706/8.0), REAL_CONST(155747.61929786921/8.0), REAL_CONST(155774.10755129869/8.0), REAL_CONST(155800.59693080973/8.0), REAL_CONST(155827.08743630661/8.0), REAL_CONST(155853.57906769359/8.0), REAL_CONST(155880.07182487496/8.0), REAL_CONST(155906.56570775513/8.0), REAL_CONST(155933.06071623837/8.0), REAL_CONST(155959.55685022907/8.0), REAL_CONST(155986.05410963166/8.0), REAL_CONST(156012.5524943505/8.0), REAL_CONST(156039.05200429002/8.0), REAL_CONST(156065.55263935472/8.0), REAL_CONST(156092.054399449/8.0), REAL_CONST(156118.5572844774/8.0), REAL_CONST(156145.06129434443/8.0), REAL_CONST(156171.5664289546/8.0), REAL_CONST(156198.07268821247/8.0), REAL_CONST(156224.5800720226/8.0), REAL_CONST(156251.08858028959/8.0), REAL_CONST(156277.59821291809/8.0), REAL_CONST(156304.10896981266/8.0), REAL_CONST(156330.62085087801/8.0), REAL_CONST(156357.1338560188/8.0), REAL_CONST(156383.64798513969/8.0), REAL_CONST(156410.16323814544/8.0), REAL_CONST(156436.67961494075/8.0), REAL_CONST(156463.1971154304/8.0), REAL_CONST(156489.71573951913/8.0), REAL_CONST(156516.23548711176/8.0), REAL_CONST(156542.75635811311/8.0), REAL_CONST(156569.27835242799/8.0), REAL_CONST(156595.80146996127/8.0), REAL_CONST(156622.32571061782/8.0), REAL_CONST(156648.85107430254/8.0), REAL_CONST(156675.37756092031/8.0), REAL_CONST(156701.90517037612/8.0), REAL_CONST(156728.43390257491/8.0), REAL_CONST(156754.96375742162/8.0), REAL_CONST(156781.49473482129/8.0), REAL_CONST(156808.02683467892/8.0), REAL_CONST(156834.5600568995/8.0), REAL_CONST(156861.09440138817/8.0), REAL_CONST(156887.62986804993/8.0), REAL_CONST(156914.16645678994/8.0), REAL_CONST(156940.70416751326/8.0), REAL_CONST(156967.24300012505/8.0), REAL_CONST(156993.78295453047/8.0), REAL_CONST(157020.32403063469/8.0), REAL_CONST(157046.8662283429/8.0), REAL_CONST(157073.40954756032/8.0), REAL_CONST(157099.9539881922/8.0), REAL_CONST(157126.49955014378/8.0), REAL_CONST(157153.04623332032/8.0), REAL_CONST(157179.59403762716/8.0), REAL_CONST(157206.14296296958/8.0), REAL_CONST(157232.69300925292/8.0), REAL_CONST(157259.24417638258/8.0), REAL_CONST(157285.79646426387/8.0), REAL_CONST(157312.34987280221/8.0), REAL_CONST(157338.90440190304/8.0), REAL_CONST(157365.46005147175/8.0), REAL_CONST(157392.01682141385/8.0), REAL_CONST(157418.57471163478/8.0), REAL_CONST(157445.13372204005/8.0), REAL_CONST(157471.69385253513/8.0), REAL_CONST(157498.25510302564/8.0), REAL_CONST(157524.81747341706/8.0), REAL_CONST(157551.38096361503/8.0), REAL_CONST(157577.9455735251/8.0), REAL_CONST(157604.51130305286/8.0), REAL_CONST(157631.07815210402/8.0), REAL_CONST(157657.64612058419/8.0), REAL_CONST(157684.21520839902/8.0), REAL_CONST(157710.78541545427/8.0), REAL_CONST(157737.35674165559/8.0), REAL_CONST(157763.92918690876/8.0), REAL_CONST(157790.50275111952/8.0), REAL_CONST(157817.07743419363/8.0), REAL_CONST(157843.65323603692/8.0), REAL_CONST(157870.23015655516/8.0), REAL_CONST(157896.80819565422/8.0), REAL_CONST(157923.3873532399/8.0), REAL_CONST(157949.96762921812/8.0), REAL_CONST(157976.54902349479/8.0), REAL_CONST(158003.13153597576/8.0), REAL_CONST(158029.71516656701/8.0), REAL_CONST(158056.29991517449/8.0), REAL_CONST(158082.88578170416/8.0), REAL_CONST(158109.47276606198/8.0), REAL_CONST(158136.06086815402/8.0), REAL_CONST(158162.65008788629/8.0), REAL_CONST(158189.24042516484/8.0), REAL_CONST(158215.83187989573/8.0), REAL_CONST(158242.42445198505/8.0), REAL_CONST(158269.01814133892/8.0), REAL_CONST(158295.61294786347/8.0), REAL_CONST(158322.20887146486/8.0), REAL_CONST(158348.80591204923/8.0), REAL_CONST(158375.4040695228/8.0), REAL_CONST(158402.00334379176/8.0), REAL_CONST(158428.60373476235/8.0), REAL_CONST(158455.2052423408/8.0), REAL_CONST(158481.80786643337/8.0), REAL_CONST(158508.41160694641/8.0), REAL_CONST(158535.01646378616/8.0), REAL_CONST(158561.62243685898/8.0), REAL_CONST(158588.2295260712/8.0), REAL_CONST(158614.8377313292/8.0), REAL_CONST(158641.44705253936/8.0), REAL_CONST(158668.05748960807/8.0), REAL_CONST(158694.66904244179/8.0), REAL_CONST(158721.28171094693/8.0), REAL_CONST(158747.89549502998/8.0), REAL_CONST(158774.5103945974/8.0), REAL_CONST(158801.12640955573/8.0), REAL_CONST(158827.74353981143/8.0), REAL_CONST(158854.36178527112/8.0), REAL_CONST(158880.9811458413/8.0), REAL_CONST(158907.60162142856/8.0), REAL_CONST(158934.22321193956/8.0), REAL_CONST(158960.84591728085/8.0), REAL_CONST(158987.46973735912/8.0), REAL_CONST(159014.09467208097/8.0), REAL_CONST(159040.72072135314/8.0), REAL_CONST(159067.3478850823/8.0), REAL_CONST(159093.97616317519/8.0), REAL_CONST(159120.60555553852/8.0), REAL_CONST(159147.23606207906/8.0), REAL_CONST(159173.8676827036/8.0), REAL_CONST(159200.50041731889/8.0), REAL_CONST(159227.13426583182/8.0), REAL_CONST(159253.76922814918/8.0), REAL_CONST(159280.40530417781/8.0), REAL_CONST(159307.04249382461/8.0), REAL_CONST(159333.68079699649/8.0), REAL_CONST(159360.32021360032/8.0), REAL_CONST(159386.96074354305/8.0), REAL_CONST(159413.60238673165/8.0), REAL_CONST(159440.24514307309/8.0), REAL_CONST(159466.88901247433/8.0), REAL_CONST(159493.53399484244/8.0), REAL_CONST(159520.18009008438/8.0), REAL_CONST(159546.82729810724/8.0), REAL_CONST(159573.47561881805/8.0), REAL_CONST(159600.12505212394/8.0), REAL_CONST(159626.77559793202/8.0), REAL_CONST(159653.42725614941/8.0), REAL_CONST(159680.08002668325/8.0), REAL_CONST(159706.73390944069/8.0), REAL_CONST(159733.38890432892/8.0), REAL_CONST(159760.04501125516/8.0), REAL_CONST(159786.70223012666/8.0), REAL_CONST(159813.36056085059/8.0), REAL_CONST(159840.02000333427/8.0), REAL_CONST(159866.68055748497/8.0), REAL_CONST(159893.34222320997/8.0), REAL_CONST(159920.00500041663/8.0), REAL_CONST(159946.66888901225/8.0), REAL_CONST(159973.33388890422/8.0), REAL_CONST(159999.99999999988/8.0), REAL_CONST(160026.66722220668/8.0), REAL_CONST(160053.33555543202/8.0), REAL_CONST(160080.0049995833/8.0), REAL_CONST(160106.67555456801/8.0), REAL_CONST(160133.3472202936/8.0), REAL_CONST(160160.0199966676/8.0), REAL_CONST(160186.6938835975/8.0), REAL_CONST(160213.36888099083/8.0), REAL_CONST(160240.04498875517/8.0), REAL_CONST(160266.72220679806/8.0), REAL_CONST(160293.40053502709/8.0), REAL_CONST(160320.07997334987/8.0), REAL_CONST(160346.76052167406/8.0), REAL_CONST(160373.44217990729/8.0), REAL_CONST(160400.1249479572/8.0), REAL_CONST(160426.80882573154/8.0), REAL_CONST(160453.49381313793/8.0), REAL_CONST(160480.17991008417/8.0), REAL_CONST(160506.86711647795/8.0), REAL_CONST(160533.55543222709/8.0), REAL_CONST(160560.24485723933/8.0), REAL_CONST(160586.93539142248/8.0), REAL_CONST(160613.62703468435/8.0), REAL_CONST(160640.31978693281/8.0), REAL_CONST(160667.01364807569/8.0), REAL_CONST(160693.70861802087/8.0), REAL_CONST(160720.40469667627/8.0), REAL_CONST(160747.1018839498/8.0), REAL_CONST(160773.80017974938/8.0), REAL_CONST(160800.49958398298/8.0), REAL_CONST(160827.20009655855/8.0), REAL_CONST(160853.90171738411/8.0), REAL_CONST(160880.60444636765/8.0), REAL_CONST(160907.30828341722/8.0), REAL_CONST(160934.01322844089/8.0), REAL_CONST(160960.71928134665/8.0), REAL_CONST(160987.42644204266/8.0), REAL_CONST(161014.13471043704/8.0), REAL_CONST(161040.84408643784/8.0), REAL_CONST(161067.55456995327/8.0), REAL_CONST(161094.26616089148/8.0), REAL_CONST(161120.97885916062/8.0), REAL_CONST(161147.69266466892/8.0), REAL_CONST(161174.40757732463/8.0), REAL_CONST(161201.12359703594/8.0), REAL_CONST(161227.84072371112/8.0), REAL_CONST(161254.55895725847/8.0), REAL_CONST(161281.27829758628/8.0), REAL_CONST(161307.99874460287/8.0), REAL_CONST(161334.72029821656/8.0), REAL_CONST(161361.44295833571/8.0), REAL_CONST(161388.1667248687/8.0), REAL_CONST(161414.89159772391/8.0), REAL_CONST(161441.61757680977/8.0), REAL_CONST(161468.34466203468/8.0), REAL_CONST(161495.07285330712/8.0), REAL_CONST(161521.80215053557/8.0), REAL_CONST(161548.53255362847/8.0), REAL_CONST(161575.26406249436/8.0), REAL_CONST(161601.99667704175/8.0), REAL_CONST(161628.7303971792/8.0), REAL_CONST(161655.46522281526/8.0), REAL_CONST(161682.20115385848/8.0), REAL_CONST(161708.93819021754/8.0), REAL_CONST(161735.67633180099/8.0), REAL_CONST(161762.41557851751/8.0), REAL_CONST(161789.15593027571/8.0), REAL_CONST(161815.89738698432/8.0), REAL_CONST(161842.63994855201/8.0), REAL_CONST(161869.38361488748/8.0), REAL_CONST(161896.1283858995/8.0), REAL_CONST(161922.87426149679/8.0), REAL_CONST(161949.62124158812/8.0), REAL_CONST(161976.36932608229/8.0), REAL_CONST(162003.1185148881/8.0), REAL_CONST(162029.8688079144/8.0), REAL_CONST(162056.62020507001/8.0), REAL_CONST(162083.37270626382/8.0), REAL_CONST(162110.12631140469/8.0), REAL_CONST(162136.88102040152/8.0), REAL_CONST(162163.63683316324/8.0), REAL_CONST(162190.39374959879/8.0), REAL_CONST(162217.15176961714/8.0), REAL_CONST(162243.91089312723/8.0), REAL_CONST(162270.67112003808/8.0), REAL_CONST(162297.43245025873/8.0), REAL_CONST(162324.19488369819/8.0), REAL_CONST(162350.9584202655/8.0), REAL_CONST(162377.72305986975/8.0), REAL_CONST(162404.48880242003/8.0), REAL_CONST(162431.25564782543/8.0), REAL_CONST(162458.02359599507/8.0), REAL_CONST(162484.79264683815/8.0), REAL_CONST(162511.56280026378/8.0), REAL_CONST(162538.33405618116/8.0), REAL_CONST(162565.10641449949/8.0), REAL_CONST(162591.87987512801/8.0), REAL_CONST(162618.65443797593/8.0), REAL_CONST(162645.43010295252/8.0), REAL_CONST(162672.20686996708/8.0), REAL_CONST(162698.98473892888/8.0), REAL_CONST(162725.76370974723/8.0), REAL_CONST(162752.54378233149/8.0), REAL_CONST(162779.32495659095/8.0), REAL_CONST(162806.10723243505/8.0), REAL_CONST(162832.89060977317/8.0), REAL_CONST(162859.67508851466/8.0), REAL_CONST(162886.46066856899/8.0), REAL_CONST(162913.24734984562/8.0), REAL_CONST(162940.03513225398/8.0), REAL_CONST(162966.82401570358/8.0), REAL_CONST(162993.6140001039/8.0), REAL_CONST(163020.40508536444/8.0), REAL_CONST(163047.19727139481/8.0), REAL_CONST(163073.99055810447/8.0), REAL_CONST(163100.78494540305/8.0), REAL_CONST(163127.58043320014/8.0), REAL_CONST(163154.37702140535/8.0), REAL_CONST(163181.17470992831/8.0), REAL_CONST(163207.97349867865/8.0), REAL_CONST(163234.77338756606/8.0), REAL_CONST(163261.57437650024/8.0), REAL_CONST(163288.37646539087/8.0), REAL_CONST(163315.17965414765/8.0), REAL_CONST(163341.98394268038/8.0), REAL_CONST(163368.78933089875/8.0), REAL_CONST(163395.59581871261/8.0), REAL_CONST(163422.40340603172/8.0), REAL_CONST(163449.2120927659/8.0), REAL_CONST(163476.02187882498/8.0), REAL_CONST(163502.83276411882/8.0), REAL_CONST(163529.6447485573/8.0), REAL_CONST(163556.45783205028/8.0), REAL_CONST(163583.2720145077/8.0), REAL_CONST(163610.08729583945/8.0), REAL_CONST(163636.90367595552/8.0), REAL_CONST(163663.72115476584/8.0), REAL_CONST(163690.53973218042/8.0), REAL_CONST(163717.35940810922/8.0), REAL_CONST(163744.18018246227/8.0), REAL_CONST(163771.00205514964/8.0), REAL_CONST(163797.82502608138/8.0), REAL_CONST(163824.64909516752/8.0), REAL_CONST(163851.4742623182/8.0), REAL_CONST(163878.3005274435/8.0), REAL_CONST(163905.12789045356/8.0), REAL_CONST(163931.95635125853/8.0), REAL_CONST(163958.78590976857/8.0), REAL_CONST(163985.61656589387/8.0), REAL_CONST(164012.44831954464/8.0), REAL_CONST(164039.28117063109/8.0), REAL_CONST(164066.11511906344/8.0), REAL_CONST(164092.95016475199/8.0), REAL_CONST(164119.78630760699/8.0), REAL_CONST(164146.62354753874/8.0), REAL_CONST(164173.46188445756/8.0), REAL_CONST(164200.30131827376/8.0), REAL_CONST(164227.14184889771/8.0), REAL_CONST(164253.98347623978/8.0), REAL_CONST(164280.82620021031/8.0), REAL_CONST(164307.67002071979/8.0), REAL_CONST(164334.51493767856/8.0), REAL_CONST(164361.3609509971/8.0), REAL_CONST(164388.20806058586/8.0), REAL_CONST(164415.05626635533/8.0), REAL_CONST(164441.905568216/8.0), REAL_CONST(164468.75596607837/8.0), REAL_CONST(164495.607459853/8.0), REAL_CONST(164522.4600494504/8.0), REAL_CONST(164549.31373478117/8.0), REAL_CONST(164576.16851575591/8.0), REAL_CONST(164603.02439228518/8.0), REAL_CONST(164629.88136427966/8.0), REAL_CONST(164656.73943164994/8.0), REAL_CONST(164683.59859430668/8.0), REAL_CONST(164710.45885216061/8.0), REAL_CONST(164737.32020512238/8.0), REAL_CONST(164764.1826531027/8.0), REAL_CONST(164791.04619601235/8.0), REAL_CONST(164817.91083376206/8.0), REAL_CONST(164844.77656626256/8.0), REAL_CONST(164871.64339342469/8.0), REAL_CONST(164898.51131515924/8.0), REAL_CONST(164925.38033137703/8.0), REAL_CONST(164952.25044198887/8.0), REAL_CONST(164979.1216469057/8.0), REAL_CONST(165005.9939460383/8.0), REAL_CONST(165032.86733929763/8.0), REAL_CONST(165059.7418265946/8.0), REAL_CONST(165086.61740784015/8.0), REAL_CONST(165113.4940829452/8.0) #endif }; #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/is.c000066400000000000000000000075601374350120500150620ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: is.c,v 1.28 2007/11/01 12:33:31 menno Exp $ **/ #include "common.h" #include "structs.h" #include "syntax.h" #include "is.h" #ifdef FIXED_POINT static real_t pow05_table[] = { COEF_CONST(1.68179283050743), /* 0.5^(-3/4) */ COEF_CONST(1.41421356237310), /* 0.5^(-2/4) */ COEF_CONST(1.18920711500272), /* 0.5^(-1/4) */ COEF_CONST(1.0), /* 0.5^( 0/4) */ COEF_CONST(0.84089641525371), /* 0.5^(+1/4) */ COEF_CONST(0.70710678118655), /* 0.5^(+2/4) */ COEF_CONST(0.59460355750136) /* 0.5^(+3/4) */ }; #endif void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len) { uint8_t g, sfb, b; uint16_t i; #ifndef FIXED_POINT real_t scale; #else int32_t exp, frac; #endif uint16_t nshort = frame_len/8; uint8_t group = 0; for (g = 0; g < icsr->num_window_groups; g++) { /* Do intensity stereo decoding */ for (b = 0; b < icsr->window_group_length[g]; b++) { for (sfb = 0; sfb < icsr->max_sfb; sfb++) { if (is_intensity(icsr, g, sfb)) { #ifdef MAIN_DEC /* For scalefactor bands coded in intensity stereo the corresponding predictors in the right channel are switched to "off". */ ics->pred.prediction_used[sfb] = 0; icsr->pred.prediction_used[sfb] = 0; #endif #ifndef FIXED_POINT scale = (real_t)pow(0.5, (0.25*icsr->scale_factors[g][sfb])); #else exp = icsr->scale_factors[g][sfb] >> 2; frac = icsr->scale_factors[g][sfb] & 3; #endif /* Scale from left to right channel, do not touch left channel */ for (i = icsr->swb_offset[sfb]; i < min(icsr->swb_offset[sfb+1], ics->swb_offset_max); i++) { #ifndef FIXED_POINT r_spec[(group*nshort)+i] = MUL_R(l_spec[(group*nshort)+i], scale); #else if (exp < 0) r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] << -exp; else r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] >> exp; r_spec[(group*nshort)+i] = MUL_C(r_spec[(group*nshort)+i], pow05_table[frac + 3]); #endif if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) r_spec[(group*nshort)+i] = -r_spec[(group*nshort)+i]; } } } group++; } } } faad2-2_10_0/libfaad/is.h000066400000000000000000000036671374350120500150730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: is.h,v 1.20 2007/11/01 12:33:31 menno Exp $ **/ #ifndef __IS_H__ #define __IS_H__ #ifdef __cplusplus extern "C" { #endif #include "syntax.h" void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len); static INLINE int8_t is_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) { switch (ics->sfb_cb[group][sfb]) { case INTENSITY_HCB: return 1; case INTENSITY_HCB2: return -1; default: return 0; } } static INLINE int8_t invert_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) { if (ics->ms_mask_present == 1) return (1-2*ics->ms_used[group][sfb]); return 1; } #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/kbd_win.h000066400000000000000000002352011374350120500160640ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: kbd_win.h,v 1.21 2007/11/01 12:33:31 menno Exp $ **/ #ifndef __KBD_WIN_H__ #define __KBD_WIN_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t kbd_long_1024[] = { FRAC_CONST(0.00029256153896361), FRAC_CONST(0.00042998567353047), FRAC_CONST(0.00054674074589540), FRAC_CONST(0.00065482304299792), FRAC_CONST(0.00075870195068747), FRAC_CONST(0.00086059331713336), FRAC_CONST(0.00096177541439010), FRAC_CONST(0.0010630609410878), FRAC_CONST(0.0011650036308132), FRAC_CONST(0.0012680012194148), FRAC_CONST(0.0013723517232956), FRAC_CONST(0.0014782864109136), FRAC_CONST(0.0015859901976719), FRAC_CONST(0.0016956148252373), FRAC_CONST(0.0018072876903517), FRAC_CONST(0.0019211179405514), FRAC_CONST(0.0020372007924215), FRAC_CONST(0.0021556206591754), FRAC_CONST(0.0022764534599614), FRAC_CONST(0.0023997683540995), FRAC_CONST(0.0025256290631156), FRAC_CONST(0.0026540948920831), FRAC_CONST(0.0027852215281403), FRAC_CONST(0.0029190616715331), FRAC_CONST(0.0030556655443223), FRAC_CONST(0.0031950812943391), FRAC_CONST(0.0033373553240392), FRAC_CONST(0.0034825325586930), FRAC_CONST(0.0036306566699199), FRAC_CONST(0.0037817702604646), FRAC_CONST(0.0039359150179719), FRAC_CONST(0.0040931318437260), FRAC_CONST(0.0042534609610026), FRAC_CONST(0.0044169420066964), FRAC_CONST(0.0045836141091341), FRAC_CONST(0.0047535159544086), FRAC_CONST(0.0049266858431214), FRAC_CONST(0.0051031617390698), FRAC_CONST(0.0052829813111335), FRAC_CONST(0.0054661819693975), FRAC_CONST(0.0056528008963682), FRAC_CONST(0.0058428750739943), FRAC_CONST(0.0060364413070882), FRAC_CONST(0.0062335362436492), FRAC_CONST(0.0064341963925079), FRAC_CONST(0.0066384581386503), FRAC_CONST(0.0068463577565218), FRAC_CONST(0.0070579314215715), FRAC_CONST(0.0072732152202559), FRAC_CONST(0.0074922451586909), FRAC_CONST(0.0077150571701162), FRAC_CONST(0.0079416871213115), FRAC_CONST(0.0081721708180857), FRAC_CONST(0.0084065440099458), FRAC_CONST(0.0086448423940363), FRAC_CONST(0.0088871016184291), FRAC_CONST(0.0091333572848345), FRAC_CONST(0.0093836449507939), FRAC_CONST(0.0096380001314086), FRAC_CONST(0.0098964583006517), FRAC_CONST(0.010159054892306), FRAC_CONST(0.010425825300561), FRAC_CONST(0.010696804880310), FRAC_CONST(0.010972028947167), FRAC_CONST(0.011251532777236), FRAC_CONST(0.011535351606646), FRAC_CONST(0.011823520630897), FRAC_CONST(0.012116075003993), FRAC_CONST(0.012413049837429), FRAC_CONST(0.012714480198999), FRAC_CONST(0.013020401111478), FRAC_CONST(0.013330847551161), FRAC_CONST(0.013645854446288), FRAC_CONST(0.013965456675352), FRAC_CONST(0.014289689065314), FRAC_CONST(0.014618586389712), FRAC_CONST(0.014952183366697), FRAC_CONST(0.015290514656976), FRAC_CONST(0.015633614861688), FRAC_CONST(0.015981518520214), FRAC_CONST(0.016334260107915), FRAC_CONST(0.016691874033817), FRAC_CONST(0.017054394638241), FRAC_CONST(0.017421856190380), FRAC_CONST(0.017794292885832), FRAC_CONST(0.018171738844085), FRAC_CONST(0.018554228105962), FRAC_CONST(0.018941794631032), FRAC_CONST(0.019334472294980), FRAC_CONST(0.019732294886947), FRAC_CONST(0.020135296106839), FRAC_CONST(0.020543509562604), FRAC_CONST(0.020956968767488), FRAC_CONST(0.021375707137257), FRAC_CONST(0.021799757987407), FRAC_CONST(0.022229154530343), FRAC_CONST(0.022663929872540), FRAC_CONST(0.023104117011689), FRAC_CONST(0.023549748833816), FRAC_CONST(0.024000858110398), FRAC_CONST(0.024457477495451), FRAC_CONST(0.024919639522613), FRAC_CONST(0.025387376602207), FRAC_CONST(0.025860721018295), FRAC_CONST(0.026339704925726), FRAC_CONST(0.026824360347160), FRAC_CONST(0.027314719170100), FRAC_CONST(0.027810813143900), FRAC_CONST(0.028312673876775), FRAC_CONST(0.028820332832801), FRAC_CONST(0.029333821328905), FRAC_CONST(0.029853170531859), FRAC_CONST(0.030378411455255), FRAC_CONST(0.030909574956490), FRAC_CONST(0.031446691733739), FRAC_CONST(0.031989792322926), FRAC_CONST(0.032538907094693), FRAC_CONST(0.033094066251369), FRAC_CONST(0.033655299823935), FRAC_CONST(0.034222637668991), FRAC_CONST(0.034796109465717), FRAC_CONST(0.035375744712844), FRAC_CONST(0.035961572725616), FRAC_CONST(0.036553622632758), FRAC_CONST(0.037151923373446), FRAC_CONST(0.037756503694277), FRAC_CONST(0.038367392146243), FRAC_CONST(0.038984617081711), FRAC_CONST(0.039608206651398), FRAC_CONST(0.040238188801359), FRAC_CONST(0.040874591269976), FRAC_CONST(0.041517441584950), FRAC_CONST(0.042166767060301), FRAC_CONST(0.042822594793376), FRAC_CONST(0.043484951661852), FRAC_CONST(0.044153864320760), FRAC_CONST(0.044829359199509), FRAC_CONST(0.045511462498913), FRAC_CONST(0.046200200188234), FRAC_CONST(0.046895598002228), FRAC_CONST(0.047597681438201), FRAC_CONST(0.048306475753074), FRAC_CONST(0.049022005960455), FRAC_CONST(0.049744296827725), FRAC_CONST(0.050473372873129), FRAC_CONST(0.051209258362879), FRAC_CONST(0.051951977308273), FRAC_CONST(0.052701553462813), FRAC_CONST(0.053458010319350), FRAC_CONST(0.054221371107223), FRAC_CONST(0.054991658789428), FRAC_CONST(0.055768896059787), FRAC_CONST(0.056553105340134), FRAC_CONST(0.057344308777513), FRAC_CONST(0.058142528241393), FRAC_CONST(0.058947785320893), FRAC_CONST(0.059760101322019), FRAC_CONST(0.060579497264926), FRAC_CONST(0.061405993881180), FRAC_CONST(0.062239611611049), FRAC_CONST(0.063080370600799), FRAC_CONST(0.063928290700012), FRAC_CONST(0.064783391458919), FRAC_CONST(0.065645692125747), FRAC_CONST(0.066515211644086), FRAC_CONST(0.067391968650269), FRAC_CONST(0.068275981470777), FRAC_CONST(0.069167268119652), FRAC_CONST(0.070065846295935), FRAC_CONST(0.070971733381121), FRAC_CONST(0.071884946436630), FRAC_CONST(0.072805502201299), FRAC_CONST(0.073733417088896), FRAC_CONST(0.074668707185649), FRAC_CONST(0.075611388247794), FRAC_CONST(0.076561475699152), FRAC_CONST(0.077518984628715), FRAC_CONST(0.078483929788261), FRAC_CONST(0.079456325589986), FRAC_CONST(0.080436186104162), FRAC_CONST(0.081423525056808), FRAC_CONST(0.082418355827392), FRAC_CONST(0.083420691446553), FRAC_CONST(0.084430544593841), FRAC_CONST(0.085447927595483), FRAC_CONST(0.086472852422178), FRAC_CONST(0.087505330686900), FRAC_CONST(0.088545373642744), FRAC_CONST(0.089592992180780), FRAC_CONST(0.090648196827937), FRAC_CONST(0.091710997744919), FRAC_CONST(0.092781404724131), FRAC_CONST(0.093859427187640), FRAC_CONST(0.094945074185163), FRAC_CONST(0.096038354392069), FRAC_CONST(0.097139276107423), FRAC_CONST(0.098247847252041), FRAC_CONST(0.099364075366580), FRAC_CONST(0.10048796760965), FRAC_CONST(0.10161953075597), FRAC_CONST(0.10275877119451), FRAC_CONST(0.10390569492671), FRAC_CONST(0.10506030756469), FRAC_CONST(0.10622261432949), FRAC_CONST(0.10739262004941), FRAC_CONST(0.10857032915821), FRAC_CONST(0.10975574569357), FRAC_CONST(0.11094887329534), FRAC_CONST(0.11214971520402), FRAC_CONST(0.11335827425914), FRAC_CONST(0.11457455289772), FRAC_CONST(0.11579855315274), FRAC_CONST(0.11703027665170), FRAC_CONST(0.11826972461510), FRAC_CONST(0.11951689785504), FRAC_CONST(0.12077179677383), FRAC_CONST(0.12203442136263), FRAC_CONST(0.12330477120008), FRAC_CONST(0.12458284545102), FRAC_CONST(0.12586864286523), FRAC_CONST(0.12716216177615), FRAC_CONST(0.12846340009971), FRAC_CONST(0.12977235533312), FRAC_CONST(0.13108902455375), FRAC_CONST(0.13241340441801), FRAC_CONST(0.13374549116025), FRAC_CONST(0.13508528059173), FRAC_CONST(0.13643276809961), FRAC_CONST(0.13778794864595), FRAC_CONST(0.13915081676677), FRAC_CONST(0.14052136657114), FRAC_CONST(0.14189959174027), FRAC_CONST(0.14328548552671), FRAC_CONST(0.14467904075349), FRAC_CONST(0.14608024981336), FRAC_CONST(0.14748910466804), FRAC_CONST(0.14890559684750), FRAC_CONST(0.15032971744929), FRAC_CONST(0.15176145713790), FRAC_CONST(0.15320080614414), FRAC_CONST(0.15464775426459), FRAC_CONST(0.15610229086100), FRAC_CONST(0.15756440485987), FRAC_CONST(0.15903408475193), FRAC_CONST(0.16051131859170), FRAC_CONST(0.16199609399712), FRAC_CONST(0.16348839814917), FRAC_CONST(0.16498821779156), FRAC_CONST(0.16649553923042), FRAC_CONST(0.16801034833404), FRAC_CONST(0.16953263053270), FRAC_CONST(0.17106237081842), FRAC_CONST(0.17259955374484), FRAC_CONST(0.17414416342714), FRAC_CONST(0.17569618354193), FRAC_CONST(0.17725559732720), FRAC_CONST(0.17882238758238), FRAC_CONST(0.18039653666830), FRAC_CONST(0.18197802650733), FRAC_CONST(0.18356683858343), FRAC_CONST(0.18516295394233), FRAC_CONST(0.18676635319174), FRAC_CONST(0.18837701650148), FRAC_CONST(0.18999492360384), FRAC_CONST(0.19162005379380), FRAC_CONST(0.19325238592940), FRAC_CONST(0.19489189843209), FRAC_CONST(0.19653856928714), FRAC_CONST(0.19819237604409), FRAC_CONST(0.19985329581721), FRAC_CONST(0.20152130528605), FRAC_CONST(0.20319638069594), FRAC_CONST(0.20487849785865), FRAC_CONST(0.20656763215298), FRAC_CONST(0.20826375852540), FRAC_CONST(0.20996685149083), FRAC_CONST(0.21167688513330), FRAC_CONST(0.21339383310678), FRAC_CONST(0.21511766863598), FRAC_CONST(0.21684836451719), FRAC_CONST(0.21858589311922), FRAC_CONST(0.22033022638425), FRAC_CONST(0.22208133582887), FRAC_CONST(0.22383919254503), FRAC_CONST(0.22560376720111), FRAC_CONST(0.22737503004300), FRAC_CONST(0.22915295089517), FRAC_CONST(0.23093749916189), FRAC_CONST(0.23272864382838), FRAC_CONST(0.23452635346201), FRAC_CONST(0.23633059621364), FRAC_CONST(0.23814133981883), FRAC_CONST(0.23995855159925), FRAC_CONST(0.24178219846403), FRAC_CONST(0.24361224691114), FRAC_CONST(0.24544866302890), FRAC_CONST(0.24729141249740), FRAC_CONST(0.24914046059007), FRAC_CONST(0.25099577217522), FRAC_CONST(0.25285731171763), FRAC_CONST(0.25472504328019), FRAC_CONST(0.25659893052556), FRAC_CONST(0.25847893671788), FRAC_CONST(0.26036502472451), FRAC_CONST(0.26225715701781), FRAC_CONST(0.26415529567692), FRAC_CONST(0.26605940238966), FRAC_CONST(0.26796943845439), FRAC_CONST(0.26988536478190), FRAC_CONST(0.27180714189742), FRAC_CONST(0.27373472994256), FRAC_CONST(0.27566808867736), FRAC_CONST(0.27760717748238), FRAC_CONST(0.27955195536071), FRAC_CONST(0.28150238094021), FRAC_CONST(0.28345841247557), FRAC_CONST(0.28542000785059), FRAC_CONST(0.28738712458038), FRAC_CONST(0.28935971981364), FRAC_CONST(0.29133775033492), FRAC_CONST(0.29332117256704), FRAC_CONST(0.29530994257338), FRAC_CONST(0.29730401606034), FRAC_CONST(0.29930334837974), FRAC_CONST(0.30130789453132), FRAC_CONST(0.30331760916521), FRAC_CONST(0.30533244658452), FRAC_CONST(0.30735236074785), FRAC_CONST(0.30937730527195), FRAC_CONST(0.31140723343430), FRAC_CONST(0.31344209817583), FRAC_CONST(0.31548185210356), FRAC_CONST(0.31752644749341), FRAC_CONST(0.31957583629288), FRAC_CONST(0.32162997012390), FRAC_CONST(0.32368880028565), FRAC_CONST(0.32575227775738), FRAC_CONST(0.32782035320134), FRAC_CONST(0.32989297696566), FRAC_CONST(0.33197009908736), FRAC_CONST(0.33405166929523), FRAC_CONST(0.33613763701295), FRAC_CONST(0.33822795136203), FRAC_CONST(0.34032256116495), FRAC_CONST(0.34242141494820), FRAC_CONST(0.34452446094547), FRAC_CONST(0.34663164710072), FRAC_CONST(0.34874292107143), FRAC_CONST(0.35085823023181), FRAC_CONST(0.35297752167598), FRAC_CONST(0.35510074222129), FRAC_CONST(0.35722783841160), FRAC_CONST(0.35935875652060), FRAC_CONST(0.36149344255514), FRAC_CONST(0.36363184225864), FRAC_CONST(0.36577390111444), FRAC_CONST(0.36791956434930), FRAC_CONST(0.37006877693676), FRAC_CONST(0.37222148360070), FRAC_CONST(0.37437762881878), FRAC_CONST(0.37653715682603), FRAC_CONST(0.37870001161834), FRAC_CONST(0.38086613695607), FRAC_CONST(0.38303547636766), FRAC_CONST(0.38520797315322), FRAC_CONST(0.38738357038821), FRAC_CONST(0.38956221092708), FRAC_CONST(0.39174383740701), FRAC_CONST(0.39392839225157), FRAC_CONST(0.39611581767449), FRAC_CONST(0.39830605568342), FRAC_CONST(0.40049904808370), FRAC_CONST(0.40269473648218), FRAC_CONST(0.40489306229101), FRAC_CONST(0.40709396673153), FRAC_CONST(0.40929739083810), FRAC_CONST(0.41150327546197), FRAC_CONST(0.41371156127524), FRAC_CONST(0.41592218877472), FRAC_CONST(0.41813509828594), FRAC_CONST(0.42035022996702), FRAC_CONST(0.42256752381274), FRAC_CONST(0.42478691965848), FRAC_CONST(0.42700835718423), FRAC_CONST(0.42923177591866), FRAC_CONST(0.43145711524314), FRAC_CONST(0.43368431439580), FRAC_CONST(0.43591331247564), FRAC_CONST(0.43814404844658), FRAC_CONST(0.44037646114161), FRAC_CONST(0.44261048926688), FRAC_CONST(0.44484607140589), FRAC_CONST(0.44708314602359), FRAC_CONST(0.44932165147057), FRAC_CONST(0.45156152598727), FRAC_CONST(0.45380270770813), FRAC_CONST(0.45604513466581), FRAC_CONST(0.45828874479543), FRAC_CONST(0.46053347593880), FRAC_CONST(0.46277926584861), FRAC_CONST(0.46502605219277), FRAC_CONST(0.46727377255861), FRAC_CONST(0.46952236445718), FRAC_CONST(0.47177176532752), FRAC_CONST(0.47402191254100), FRAC_CONST(0.47627274340557), FRAC_CONST(0.47852419517009), FRAC_CONST(0.48077620502869), FRAC_CONST(0.48302871012505), FRAC_CONST(0.48528164755674), FRAC_CONST(0.48753495437962), FRAC_CONST(0.48978856761212), FRAC_CONST(0.49204242423966), FRAC_CONST(0.49429646121898), FRAC_CONST(0.49655061548250), FRAC_CONST(0.49880482394273), FRAC_CONST(0.50105902349665), FRAC_CONST(0.50331315103004), FRAC_CONST(0.50556714342194), FRAC_CONST(0.50782093754901), FRAC_CONST(0.51007447028990), FRAC_CONST(0.51232767852971), FRAC_CONST(0.51458049916433), FRAC_CONST(0.51683286910489), FRAC_CONST(0.51908472528213), FRAC_CONST(0.52133600465083), FRAC_CONST(0.52358664419420), FRAC_CONST(0.52583658092832), FRAC_CONST(0.52808575190648), FRAC_CONST(0.53033409422367), FRAC_CONST(0.53258154502092), FRAC_CONST(0.53482804148974), FRAC_CONST(0.53707352087652), FRAC_CONST(0.53931792048690), FRAC_CONST(0.54156117769021), FRAC_CONST(0.54380322992385), FRAC_CONST(0.54604401469766), FRAC_CONST(0.54828346959835), FRAC_CONST(0.55052153229384), FRAC_CONST(0.55275814053768), FRAC_CONST(0.55499323217338), FRAC_CONST(0.55722674513883), FRAC_CONST(0.55945861747062), FRAC_CONST(0.56168878730842), FRAC_CONST(0.56391719289930), FRAC_CONST(0.56614377260214), FRAC_CONST(0.56836846489188), FRAC_CONST(0.57059120836390), FRAC_CONST(0.57281194173835), FRAC_CONST(0.57503060386439), FRAC_CONST(0.57724713372458), FRAC_CONST(0.57946147043912), FRAC_CONST(0.58167355327012), FRAC_CONST(0.58388332162591), FRAC_CONST(0.58609071506528), FRAC_CONST(0.58829567330173), FRAC_CONST(0.59049813620770), FRAC_CONST(0.59269804381879), FRAC_CONST(0.59489533633802), FRAC_CONST(0.59708995413996), FRAC_CONST(0.59928183777495), FRAC_CONST(0.60147092797329), FRAC_CONST(0.60365716564937), FRAC_CONST(0.60584049190582), FRAC_CONST(0.60802084803764), FRAC_CONST(0.61019817553632), FRAC_CONST(0.61237241609393), FRAC_CONST(0.61454351160718), FRAC_CONST(0.61671140418155), FRAC_CONST(0.61887603613527), FRAC_CONST(0.62103735000336), FRAC_CONST(0.62319528854167), FRAC_CONST(0.62534979473088), FRAC_CONST(0.62750081178042), FRAC_CONST(0.62964828313250), FRAC_CONST(0.63179215246597), FRAC_CONST(0.63393236370030), FRAC_CONST(0.63606886099946), FRAC_CONST(0.63820158877577), FRAC_CONST(0.64033049169379), FRAC_CONST(0.64245551467413), FRAC_CONST(0.64457660289729), FRAC_CONST(0.64669370180740), FRAC_CONST(0.64880675711607), FRAC_CONST(0.65091571480603), FRAC_CONST(0.65302052113494), FRAC_CONST(0.65512112263906), FRAC_CONST(0.65721746613689), FRAC_CONST(0.65930949873289), FRAC_CONST(0.66139716782102), FRAC_CONST(0.66348042108842), FRAC_CONST(0.66555920651892), FRAC_CONST(0.66763347239664), FRAC_CONST(0.66970316730947), FRAC_CONST(0.67176824015260), FRAC_CONST(0.67382864013196), FRAC_CONST(0.67588431676768), FRAC_CONST(0.67793521989751), FRAC_CONST(0.67998129968017), FRAC_CONST(0.68202250659876), FRAC_CONST(0.68405879146403), FRAC_CONST(0.68609010541774), FRAC_CONST(0.68811639993588), FRAC_CONST(0.69013762683195), FRAC_CONST(0.69215373826012), FRAC_CONST(0.69416468671849), FRAC_CONST(0.69617042505214), FRAC_CONST(0.69817090645634), FRAC_CONST(0.70016608447958), FRAC_CONST(0.70215591302664), FRAC_CONST(0.70414034636163), FRAC_CONST(0.70611933911096), FRAC_CONST(0.70809284626630), FRAC_CONST(0.71006082318751), FRAC_CONST(0.71202322560554), FRAC_CONST(0.71398000962530), FRAC_CONST(0.71593113172842), FRAC_CONST(0.71787654877613), FRAC_CONST(0.71981621801195), FRAC_CONST(0.72175009706445), FRAC_CONST(0.72367814394990), FRAC_CONST(0.72560031707496), FRAC_CONST(0.72751657523927), FRAC_CONST(0.72942687763803), FRAC_CONST(0.73133118386457), FRAC_CONST(0.73322945391280), FRAC_CONST(0.73512164817975), FRAC_CONST(0.73700772746796), FRAC_CONST(0.73888765298787), FRAC_CONST(0.74076138636020), FRAC_CONST(0.74262888961827), FRAC_CONST(0.74449012521027), FRAC_CONST(0.74634505600152), FRAC_CONST(0.74819364527663), FRAC_CONST(0.75003585674175), FRAC_CONST(0.75187165452661), FRAC_CONST(0.75370100318668), FRAC_CONST(0.75552386770515), FRAC_CONST(0.75734021349500), FRAC_CONST(0.75915000640095), FRAC_CONST(0.76095321270137), FRAC_CONST(0.76274979911019), FRAC_CONST(0.76453973277875), FRAC_CONST(0.76632298129757), FRAC_CONST(0.76809951269819), FRAC_CONST(0.76986929545481), FRAC_CONST(0.77163229848604), FRAC_CONST(0.77338849115651), FRAC_CONST(0.77513784327849), FRAC_CONST(0.77688032511340), FRAC_CONST(0.77861590737340), FRAC_CONST(0.78034456122283), FRAC_CONST(0.78206625827961), FRAC_CONST(0.78378097061667), FRAC_CONST(0.78548867076330), FRAC_CONST(0.78718933170643), FRAC_CONST(0.78888292689189), FRAC_CONST(0.79056943022564), FRAC_CONST(0.79224881607494), FRAC_CONST(0.79392105926949), FRAC_CONST(0.79558613510249), FRAC_CONST(0.79724401933170), FRAC_CONST(0.79889468818046), FRAC_CONST(0.80053811833858), FRAC_CONST(0.80217428696334), FRAC_CONST(0.80380317168028), FRAC_CONST(0.80542475058405), FRAC_CONST(0.80703900223920), FRAC_CONST(0.80864590568089), FRAC_CONST(0.81024544041560), FRAC_CONST(0.81183758642175), FRAC_CONST(0.81342232415032), FRAC_CONST(0.81499963452540), FRAC_CONST(0.81656949894467), FRAC_CONST(0.81813189927991), FRAC_CONST(0.81968681787738), FRAC_CONST(0.82123423755821), FRAC_CONST(0.82277414161874), FRAC_CONST(0.82430651383076), FRAC_CONST(0.82583133844180), FRAC_CONST(0.82734860017528), FRAC_CONST(0.82885828423070), FRAC_CONST(0.83036037628369), FRAC_CONST(0.83185486248609), FRAC_CONST(0.83334172946597), FRAC_CONST(0.83482096432759), FRAC_CONST(0.83629255465130), FRAC_CONST(0.83775648849344), FRAC_CONST(0.83921275438615), FRAC_CONST(0.84066134133716), FRAC_CONST(0.84210223882952), FRAC_CONST(0.84353543682130), FRAC_CONST(0.84496092574524), FRAC_CONST(0.84637869650833), FRAC_CONST(0.84778874049138), FRAC_CONST(0.84919104954855), FRAC_CONST(0.85058561600677), FRAC_CONST(0.85197243266520), FRAC_CONST(0.85335149279457), FRAC_CONST(0.85472279013653), FRAC_CONST(0.85608631890295), FRAC_CONST(0.85744207377513), FRAC_CONST(0.85879004990298), FRAC_CONST(0.86013024290422), FRAC_CONST(0.86146264886346), FRAC_CONST(0.86278726433124), FRAC_CONST(0.86410408632306), FRAC_CONST(0.86541311231838), FRAC_CONST(0.86671434025950), FRAC_CONST(0.86800776855046), FRAC_CONST(0.86929339605590), FRAC_CONST(0.87057122209981), FRAC_CONST(0.87184124646433), FRAC_CONST(0.87310346938840), FRAC_CONST(0.87435789156650), FRAC_CONST(0.87560451414719), FRAC_CONST(0.87684333873173), FRAC_CONST(0.87807436737261), FRAC_CONST(0.87929760257204), FRAC_CONST(0.88051304728038), FRAC_CONST(0.88172070489456), FRAC_CONST(0.88292057925645), FRAC_CONST(0.88411267465117), FRAC_CONST(0.88529699580537), FRAC_CONST(0.88647354788545), FRAC_CONST(0.88764233649580), FRAC_CONST(0.88880336767692), FRAC_CONST(0.88995664790351), FRAC_CONST(0.89110218408260), FRAC_CONST(0.89223998355154), FRAC_CONST(0.89337005407600), FRAC_CONST(0.89449240384793), FRAC_CONST(0.89560704148345), FRAC_CONST(0.89671397602074), FRAC_CONST(0.89781321691786), FRAC_CONST(0.89890477405053), FRAC_CONST(0.89998865770993), FRAC_CONST(0.90106487860034), FRAC_CONST(0.90213344783689), FRAC_CONST(0.90319437694315), FRAC_CONST(0.90424767784873), FRAC_CONST(0.90529336288690), FRAC_CONST(0.90633144479201), FRAC_CONST(0.90736193669708), FRAC_CONST(0.90838485213119), FRAC_CONST(0.90940020501694), FRAC_CONST(0.91040800966776), FRAC_CONST(0.91140828078533), FRAC_CONST(0.91240103345685), FRAC_CONST(0.91338628315231), FRAC_CONST(0.91436404572173), FRAC_CONST(0.91533433739238), FRAC_CONST(0.91629717476594), FRAC_CONST(0.91725257481564), FRAC_CONST(0.91820055488334), FRAC_CONST(0.91914113267664), FRAC_CONST(0.92007432626589), FRAC_CONST(0.92100015408120), FRAC_CONST(0.92191863490944), FRAC_CONST(0.92282978789113), FRAC_CONST(0.92373363251740), FRAC_CONST(0.92463018862687), FRAC_CONST(0.92551947640245), FRAC_CONST(0.92640151636824), FRAC_CONST(0.92727632938624), FRAC_CONST(0.92814393665320), FRAC_CONST(0.92900435969727), FRAC_CONST(0.92985762037477), FRAC_CONST(0.93070374086684), FRAC_CONST(0.93154274367610), FRAC_CONST(0.93237465162328), FRAC_CONST(0.93319948784382), FRAC_CONST(0.93401727578443), FRAC_CONST(0.93482803919967), FRAC_CONST(0.93563180214841), FRAC_CONST(0.93642858899043), FRAC_CONST(0.93721842438279), FRAC_CONST(0.93800133327637), FRAC_CONST(0.93877734091223), FRAC_CONST(0.93954647281807), FRAC_CONST(0.94030875480458), FRAC_CONST(0.94106421296182), FRAC_CONST(0.94181287365556), FRAC_CONST(0.94255476352362), FRAC_CONST(0.94328990947213), FRAC_CONST(0.94401833867184), FRAC_CONST(0.94474007855439), FRAC_CONST(0.94545515680855), FRAC_CONST(0.94616360137644), FRAC_CONST(0.94686544044975), FRAC_CONST(0.94756070246592), FRAC_CONST(0.94824941610434), FRAC_CONST(0.94893161028248), FRAC_CONST(0.94960731415209), FRAC_CONST(0.95027655709525), FRAC_CONST(0.95093936872056), FRAC_CONST(0.95159577885924), FRAC_CONST(0.95224581756115), FRAC_CONST(0.95288951509097), FRAC_CONST(0.95352690192417), FRAC_CONST(0.95415800874314), FRAC_CONST(0.95478286643320), FRAC_CONST(0.95540150607863), FRAC_CONST(0.95601395895871), FRAC_CONST(0.95662025654373), FRAC_CONST(0.95722043049100), FRAC_CONST(0.95781451264084), FRAC_CONST(0.95840253501260), FRAC_CONST(0.95898452980058), FRAC_CONST(0.95956052937008), FRAC_CONST(0.96013056625336), FRAC_CONST(0.96069467314557), FRAC_CONST(0.96125288290073), FRAC_CONST(0.96180522852773), FRAC_CONST(0.96235174318622), FRAC_CONST(0.96289246018262), FRAC_CONST(0.96342741296604), FRAC_CONST(0.96395663512424), FRAC_CONST(0.96448016037959), FRAC_CONST(0.96499802258499), FRAC_CONST(0.96551025571985), FRAC_CONST(0.96601689388602), FRAC_CONST(0.96651797130376), FRAC_CONST(0.96701352230768), FRAC_CONST(0.96750358134269), FRAC_CONST(0.96798818295998), FRAC_CONST(0.96846736181297), FRAC_CONST(0.96894115265327), FRAC_CONST(0.96940959032667), FRAC_CONST(0.96987270976912), FRAC_CONST(0.97033054600270), FRAC_CONST(0.97078313413161), FRAC_CONST(0.97123050933818), FRAC_CONST(0.97167270687887), FRAC_CONST(0.97210976208030), FRAC_CONST(0.97254171033525), FRAC_CONST(0.97296858709871), FRAC_CONST(0.97339042788392), FRAC_CONST(0.97380726825843), FRAC_CONST(0.97421914384017), FRAC_CONST(0.97462609029350), FRAC_CONST(0.97502814332534), FRAC_CONST(0.97542533868127), FRAC_CONST(0.97581771214160), FRAC_CONST(0.97620529951759), FRAC_CONST(0.97658813664749), FRAC_CONST(0.97696625939282), FRAC_CONST(0.97733970363445), FRAC_CONST(0.97770850526884), FRAC_CONST(0.97807270020427), FRAC_CONST(0.97843232435704), FRAC_CONST(0.97878741364771), FRAC_CONST(0.97913800399743), FRAC_CONST(0.97948413132414), FRAC_CONST(0.97982583153895), FRAC_CONST(0.98016314054243), FRAC_CONST(0.98049609422096), FRAC_CONST(0.98082472844313), FRAC_CONST(0.98114907905608), FRAC_CONST(0.98146918188197), FRAC_CONST(0.98178507271438), FRAC_CONST(0.98209678731477), FRAC_CONST(0.98240436140902), FRAC_CONST(0.98270783068385), FRAC_CONST(0.98300723078342), FRAC_CONST(0.98330259730589), FRAC_CONST(0.98359396579995), FRAC_CONST(0.98388137176152), FRAC_CONST(0.98416485063031), FRAC_CONST(0.98444443778651), FRAC_CONST(0.98472016854752), FRAC_CONST(0.98499207816463), FRAC_CONST(0.98526020181980), FRAC_CONST(0.98552457462240), FRAC_CONST(0.98578523160609), FRAC_CONST(0.98604220772560), FRAC_CONST(0.98629553785362), FRAC_CONST(0.98654525677772), FRAC_CONST(0.98679139919726), FRAC_CONST(0.98703399972035), FRAC_CONST(0.98727309286089), FRAC_CONST(0.98750871303556), FRAC_CONST(0.98774089456089), FRAC_CONST(0.98796967165036), FRAC_CONST(0.98819507841154), FRAC_CONST(0.98841714884323), FRAC_CONST(0.98863591683269), FRAC_CONST(0.98885141615285), FRAC_CONST(0.98906368045957), FRAC_CONST(0.98927274328896), FRAC_CONST(0.98947863805473), FRAC_CONST(0.98968139804554), FRAC_CONST(0.98988105642241), FRAC_CONST(0.99007764621618), FRAC_CONST(0.99027120032501), FRAC_CONST(0.99046175151186), FRAC_CONST(0.99064933240208), FRAC_CONST(0.99083397548099), FRAC_CONST(0.99101571309153), FRAC_CONST(0.99119457743191), FRAC_CONST(0.99137060055337), FRAC_CONST(0.99154381435784), FRAC_CONST(0.99171425059582), FRAC_CONST(0.99188194086414), FRAC_CONST(0.99204691660388), FRAC_CONST(0.99220920909823), FRAC_CONST(0.99236884947045), FRAC_CONST(0.99252586868186), FRAC_CONST(0.99268029752989), FRAC_CONST(0.99283216664606), FRAC_CONST(0.99298150649419), FRAC_CONST(0.99312834736847), FRAC_CONST(0.99327271939167), FRAC_CONST(0.99341465251338), FRAC_CONST(0.99355417650825), FRAC_CONST(0.99369132097430), FRAC_CONST(0.99382611533130), FRAC_CONST(0.99395858881910), FRAC_CONST(0.99408877049612), FRAC_CONST(0.99421668923778), FRAC_CONST(0.99434237373503), FRAC_CONST(0.99446585249289), FRAC_CONST(0.99458715382906), FRAC_CONST(0.99470630587254), FRAC_CONST(0.99482333656229), FRAC_CONST(0.99493827364600), FRAC_CONST(0.99505114467878), FRAC_CONST(0.99516197702200), FRAC_CONST(0.99527079784214), FRAC_CONST(0.99537763410962), FRAC_CONST(0.99548251259777), FRAC_CONST(0.99558545988178), FRAC_CONST(0.99568650233767), FRAC_CONST(0.99578566614138), FRAC_CONST(0.99588297726783), FRAC_CONST(0.99597846149005), FRAC_CONST(0.99607214437834), FRAC_CONST(0.99616405129947), FRAC_CONST(0.99625420741595), FRAC_CONST(0.99634263768527), FRAC_CONST(0.99642936685928), FRAC_CONST(0.99651441948352), FRAC_CONST(0.99659781989663), FRAC_CONST(0.99667959222978), FRAC_CONST(0.99675976040620), FRAC_CONST(0.99683834814063), FRAC_CONST(0.99691537893895), FRAC_CONST(0.99699087609774), FRAC_CONST(0.99706486270391), FRAC_CONST(0.99713736163442), FRAC_CONST(0.99720839555593), FRAC_CONST(0.99727798692461), FRAC_CONST(0.99734615798589), FRAC_CONST(0.99741293077431), FRAC_CONST(0.99747832711337), FRAC_CONST(0.99754236861541), FRAC_CONST(0.99760507668158), FRAC_CONST(0.99766647250181), FRAC_CONST(0.99772657705478), FRAC_CONST(0.99778541110799), FRAC_CONST(0.99784299521785), FRAC_CONST(0.99789934972976), FRAC_CONST(0.99795449477828), FRAC_CONST(0.99800845028730), FRAC_CONST(0.99806123597027), FRAC_CONST(0.99811287133042), FRAC_CONST(0.99816337566108), FRAC_CONST(0.99821276804596), FRAC_CONST(0.99826106735952), FRAC_CONST(0.99830829226732), FRAC_CONST(0.99835446122649), FRAC_CONST(0.99839959248609), FRAC_CONST(0.99844370408765), FRAC_CONST(0.99848681386566), FRAC_CONST(0.99852893944805), FRAC_CONST(0.99857009825685), FRAC_CONST(0.99861030750869), FRAC_CONST(0.99864958421549), FRAC_CONST(0.99868794518504), FRAC_CONST(0.99872540702178), FRAC_CONST(0.99876198612738), FRAC_CONST(0.99879769870160), FRAC_CONST(0.99883256074295), FRAC_CONST(0.99886658804953), FRAC_CONST(0.99889979621983), FRAC_CONST(0.99893220065356), FRAC_CONST(0.99896381655254), FRAC_CONST(0.99899465892154), FRAC_CONST(0.99902474256924), FRAC_CONST(0.99905408210916), FRAC_CONST(0.99908269196056), FRAC_CONST(0.99911058634952), FRAC_CONST(0.99913777930986), FRAC_CONST(0.99916428468421), FRAC_CONST(0.99919011612505), FRAC_CONST(0.99921528709576), FRAC_CONST(0.99923981087174), FRAC_CONST(0.99926370054150), FRAC_CONST(0.99928696900779), FRAC_CONST(0.99930962898876), FRAC_CONST(0.99933169301910), FRAC_CONST(0.99935317345126), FRAC_CONST(0.99937408245662), FRAC_CONST(0.99939443202674), FRAC_CONST(0.99941423397457), FRAC_CONST(0.99943349993572), FRAC_CONST(0.99945224136972), FRAC_CONST(0.99947046956130), FRAC_CONST(0.99948819562171), FRAC_CONST(0.99950543049000), FRAC_CONST(0.99952218493439), FRAC_CONST(0.99953846955355), FRAC_CONST(0.99955429477803), FRAC_CONST(0.99956967087154), FRAC_CONST(0.99958460793242), FRAC_CONST(0.99959911589494), FRAC_CONST(0.99961320453077), FRAC_CONST(0.99962688345035), FRAC_CONST(0.99964016210433), FRAC_CONST(0.99965304978499), FRAC_CONST(0.99966555562769), FRAC_CONST(0.99967768861231), FRAC_CONST(0.99968945756473), FRAC_CONST(0.99970087115825), FRAC_CONST(0.99971193791510), FRAC_CONST(0.99972266620792), FRAC_CONST(0.99973306426121), FRAC_CONST(0.99974314015288), FRAC_CONST(0.99975290181568), FRAC_CONST(0.99976235703876), FRAC_CONST(0.99977151346914), FRAC_CONST(0.99978037861326), FRAC_CONST(0.99978895983845), FRAC_CONST(0.99979726437448), FRAC_CONST(0.99980529931507), FRAC_CONST(0.99981307161943), FRAC_CONST(0.99982058811377), FRAC_CONST(0.99982785549283), FRAC_CONST(0.99983488032144), FRAC_CONST(0.99984166903600), FRAC_CONST(0.99984822794606), FRAC_CONST(0.99985456323584), FRAC_CONST(0.99986068096572), FRAC_CONST(0.99986658707386), FRAC_CONST(0.99987228737764), FRAC_CONST(0.99987778757524), FRAC_CONST(0.99988309324717), FRAC_CONST(0.99988820985777), FRAC_CONST(0.99989314275675), FRAC_CONST(0.99989789718072), FRAC_CONST(0.99990247825468), FRAC_CONST(0.99990689099357), FRAC_CONST(0.99991114030376), FRAC_CONST(0.99991523098456), FRAC_CONST(0.99991916772971), FRAC_CONST(0.99992295512891), FRAC_CONST(0.99992659766930), FRAC_CONST(0.99993009973692), FRAC_CONST(0.99993346561824), FRAC_CONST(0.99993669950161), FRAC_CONST(0.99993980547870), FRAC_CONST(0.99994278754604), FRAC_CONST(0.99994564960642), FRAC_CONST(0.99994839547033), FRAC_CONST(0.99995102885747), FRAC_CONST(0.99995355339809), FRAC_CONST(0.99995597263451), FRAC_CONST(0.99995829002249), FRAC_CONST(0.99996050893264), FRAC_CONST(0.99996263265183), FRAC_CONST(0.99996466438460), FRAC_CONST(0.99996660725452), FRAC_CONST(0.99996846430558), FRAC_CONST(0.99997023850356), FRAC_CONST(0.99997193273736), FRAC_CONST(0.99997354982037), FRAC_CONST(0.99997509249183), FRAC_CONST(0.99997656341810), FRAC_CONST(0.99997796519400), FRAC_CONST(0.99997930034415), FRAC_CONST(0.99998057132421), FRAC_CONST(0.99998178052220), FRAC_CONST(0.99998293025975), FRAC_CONST(0.99998402279338), FRAC_CONST(0.99998506031574), FRAC_CONST(0.99998604495686), FRAC_CONST(0.99998697878536), FRAC_CONST(0.99998786380966), FRAC_CONST(0.99998870197921), FRAC_CONST(0.99998949518567), FRAC_CONST(0.99999024526408), FRAC_CONST(0.99999095399401), FRAC_CONST(0.99999162310077), FRAC_CONST(0.99999225425649), FRAC_CONST(0.99999284908128), FRAC_CONST(0.99999340914435), FRAC_CONST(0.99999393596510), FRAC_CONST(0.99999443101421), FRAC_CONST(0.99999489571473), FRAC_CONST(0.99999533144314), FRAC_CONST(0.99999573953040), FRAC_CONST(0.99999612126300), FRAC_CONST(0.99999647788395), FRAC_CONST(0.99999681059383), FRAC_CONST(0.99999712055178), FRAC_CONST(0.99999740887647), FRAC_CONST(0.99999767664709), FRAC_CONST(0.99999792490431), FRAC_CONST(0.99999815465123), FRAC_CONST(0.99999836685427), FRAC_CONST(0.99999856244415), FRAC_CONST(0.99999874231676), FRAC_CONST(0.99999890733405), FRAC_CONST(0.99999905832493), FRAC_CONST(0.99999919608613), FRAC_CONST(0.99999932138304), FRAC_CONST(0.99999943495056), FRAC_CONST(0.99999953749392), FRAC_CONST(0.99999962968950), FRAC_CONST(0.99999971218563), FRAC_CONST(0.99999978560337), FRAC_CONST(0.99999985053727), FRAC_CONST(0.99999990755616), FRAC_CONST(0.99999995720387) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t kbd_long_960[] = { FRAC_CONST(0.0003021562530949), FRAC_CONST(0.0004452267024786), FRAC_CONST(0.0005674947527496), FRAC_CONST(0.0006812465553466), FRAC_CONST(0.0007910496776387), FRAC_CONST(0.0008991655033895), FRAC_CONST(0.0010068978259384), FRAC_CONST(0.0011150758515751), FRAC_CONST(0.0012242653193642), FRAC_CONST(0.0013348735658205), FRAC_CONST(0.0014472068670273), FRAC_CONST(0.0015615039850448), FRAC_CONST(0.0016779568885263), FRAC_CONST(0.0017967241232412), FRAC_CONST(0.0019179397560955), FRAC_CONST(0.0020417195415393), FRAC_CONST(0.0021681652836642), FRAC_CONST(0.0022973679910599), FRAC_CONST(0.0024294102029937), FRAC_CONST(0.0025643677339078), FRAC_CONST(0.0027023110014772), FRAC_CONST(0.0028433060512612), FRAC_CONST(0.0029874153568025), FRAC_CONST(0.0031346984511728), FRAC_CONST(0.0032852124303662), FRAC_CONST(0.0034390123581190), FRAC_CONST(0.0035961515940931), FRAC_CONST(0.0037566820618961), FRAC_CONST(0.0039206544694386), FRAC_CONST(0.0040881184912194), FRAC_CONST(0.0042591229199617), FRAC_CONST(0.0044337157933972), FRAC_CONST(0.0046119445007641), FRAC_CONST(0.0047938558726415), FRAC_CONST(0.0049794962570131), FRAC_CONST(0.0051689115838900), FRAC_CONST(0.0053621474203763), FRAC_CONST(0.0055592490177131), FRAC_CONST(0.0057602613515573), FRAC_CONST(0.0059652291565289), FRAC_CONST(0.0061741969558843), FRAC_CONST(0.0063872090870253), FRAC_CONST(0.0066043097234387), FRAC_CONST(0.0068255428935640), FRAC_CONST(0.0070509524970088), FRAC_CONST(0.0072805823184660), FRAC_CONST(0.0075144760396340), FRAC_CONST(0.0077526772493942), FRAC_CONST(0.0079952294524673), FRAC_CONST(0.0082421760767325), FRAC_CONST(0.0084935604793733), FRAC_CONST(0.0087494259519870), FRAC_CONST(0.0090098157247792), FRAC_CONST(0.0092747729699467), FRAC_CONST(0.0095443408043399), FRAC_CONST(0.0098185622914832), FRAC_CONST(0.0100974804430226), FRAC_CONST(0.0103811382196612), FRAC_CONST(0.0106695785316351), FRAC_CONST(0.0109628442387771), FRAC_CONST(0.0112609781502091), FRAC_CONST(0.0115640230236993), FRAC_CONST(0.0118720215647169), FRAC_CONST(0.0121850164252137), FRAC_CONST(0.0125030502021561), FRAC_CONST(0.0128261654358321), FRAC_CONST(0.0131544046079532), FRAC_CONST(0.0134878101395681), FRAC_CONST(0.0138264243888068), FRAC_CONST(0.0141702896484671), FRAC_CONST(0.0145194481434592), FRAC_CONST(0.0148739420281182), FRAC_CONST(0.0152338133833959), FRAC_CONST(0.0155991042139432), FRAC_CONST(0.0159698564450882), FRAC_CONST(0.0163461119197227), FRAC_CONST(0.0167279123950996), FRAC_CONST(0.0171152995395520), FRAC_CONST(0.0175083149291368), FRAC_CONST(0.0179070000442104), FRAC_CONST(0.0183113962659409), FRAC_CONST(0.0187215448727609), FRAC_CONST(0.0191374870367659), FRAC_CONST(0.0195592638200623), FRAC_CONST(0.0199869161710679), FRAC_CONST(0.0204204849207691), FRAC_CONST(0.0208600107789370), FRAC_CONST(0.0213055343303066), FRAC_CONST(0.0217570960307201), FRAC_CONST(0.0222147362032386), FRAC_CONST(0.0226784950342228), FRAC_CONST(0.0231484125693867), FRAC_CONST(0.0236245287098244), FRAC_CONST(0.0241068832080138), FRAC_CONST(0.0245955156637973), FRAC_CONST(0.0250904655203431), FRAC_CONST(0.0255917720600868), FRAC_CONST(0.0260994744006559), FRAC_CONST(0.0266136114907790), FRAC_CONST(0.0271342221061795), FRAC_CONST(0.0276613448454576), FRAC_CONST(0.0281950181259587), FRAC_CONST(0.0287352801796329), FRAC_CONST(0.0292821690488833), FRAC_CONST(0.0298357225824074), FRAC_CONST(0.0303959784310299), FRAC_CONST(0.0309629740435296), FRAC_CONST(0.0315367466624615), FRAC_CONST(0.0321173333199732), FRAC_CONST(0.0327047708336193), FRAC_CONST(0.0332990958021720), FRAC_CONST(0.0339003446014307), FRAC_CONST(0.0345085533800302), FRAC_CONST(0.0351237580552491), FRAC_CONST(0.0357459943088193), FRAC_CONST(0.0363752975827358), FRAC_CONST(0.0370117030750704), FRAC_CONST(0.0376552457357870), FRAC_CONST(0.0383059602625614), FRAC_CONST(0.0389638810966056), FRAC_CONST(0.0396290424184964), FRAC_CONST(0.0403014781440112), FRAC_CONST(0.0409812219199691), FRAC_CONST(0.0416683071200799), FRAC_CONST(0.0423627668408009), FRAC_CONST(0.0430646338972016), FRAC_CONST(0.0437739408188385), FRAC_CONST(0.0444907198456388), FRAC_CONST(0.0452150029237951), FRAC_CONST(0.0459468217016708), FRAC_CONST(0.0466862075257170), FRAC_CONST(0.0474331914364021), FRAC_CONST(0.0481878041641539), FRAC_CONST(0.0489500761253148), FRAC_CONST(0.0497200374181119), FRAC_CONST(0.0504977178186404), FRAC_CONST(0.0512831467768636), FRAC_CONST(0.0520763534126273), FRAC_CONST(0.0528773665116913), FRAC_CONST(0.0536862145217772), FRAC_CONST(0.0545029255486345), FRAC_CONST(0.0553275273521232), FRAC_CONST(0.0561600473423164), FRAC_CONST(0.0570005125756209), FRAC_CONST(0.0578489497509179), FRAC_CONST(0.0587053852057233), FRAC_CONST(0.0595698449123695), FRAC_CONST(0.0604423544742077), FRAC_CONST(0.0613229391218317), FRAC_CONST(0.0622116237093247), FRAC_CONST(0.0631084327105284), FRAC_CONST(0.0640133902153352), FRAC_CONST(0.0649265199260043), FRAC_CONST(0.0658478451535027), FRAC_CONST(0.0667773888138695), FRAC_CONST(0.0677151734246072), FRAC_CONST(0.0686612211010977), FRAC_CONST(0.0696155535530446), FRAC_CONST(0.0705781920809429), FRAC_CONST(0.0715491575725758), FRAC_CONST(0.0725284704995383), FRAC_CONST(0.0735161509137906), FRAC_CONST(0.0745122184442388), FRAC_CONST(0.0755166922933461), FRAC_CONST(0.0765295912337720), FRAC_CONST(0.0775509336050437), FRAC_CONST(0.0785807373102561), FRAC_CONST(0.0796190198128044), FRAC_CONST(0.0806657981331473), FRAC_CONST(0.0817210888456026), FRAC_CONST(0.0827849080751753), FRAC_CONST(0.0838572714944183), FRAC_CONST(0.0849381943203265), FRAC_CONST(0.0860276913112652), FRAC_CONST(0.0871257767639319), FRAC_CONST(0.0882324645103534), FRAC_CONST(0.0893477679149177), FRAC_CONST(0.0904716998714418), FRAC_CONST(0.0916042728002747), FRAC_CONST(0.0927454986454381), FRAC_CONST(0.0938953888718020), FRAC_CONST(0.0950539544622996), FRAC_CONST(0.0962212059151784), FRAC_CONST(0.0973971532412897), FRAC_CONST(0.0985818059614169), FRAC_CONST(0.0997751731036425), FRAC_CONST(0.1009772632007537), FRAC_CONST(0.1021880842876888), FRAC_CONST(0.1034076438990227), FRAC_CONST(0.1046359490664932), FRAC_CONST(0.1058730063165681), FRAC_CONST(0.1071188216680533), FRAC_CONST(0.1083734006297428), FRAC_CONST(0.1096367481981100), FRAC_CONST(0.1109088688550422), FRAC_CONST(0.1121897665656167), FRAC_CONST(0.1134794447759207), FRAC_CONST(0.1147779064109143), FRAC_CONST(0.1160851538723372), FRAC_CONST(0.1174011890366591), FRAC_CONST(0.1187260132530751), FRAC_CONST(0.1200596273415457), FRAC_CONST(0.1214020315908810), FRAC_CONST(0.1227532257568719), FRAC_CONST(0.1241132090604651), FRAC_CONST(0.1254819801859856), FRAC_CONST(0.1268595372794049), FRAC_CONST(0.1282458779466558), FRAC_CONST(0.1296409992519942), FRAC_CONST(0.1310448977164081), FRAC_CONST(0.1324575693160745), FRAC_CONST(0.1338790094808633), FRAC_CONST(0.1353092130928902), FRAC_CONST(0.1367481744851168), FRAC_CONST(0.1381958874400010), FRAC_CONST(0.1396523451881945), FRAC_CONST(0.1411175404072910), FRAC_CONST(0.1425914652206223), FRAC_CONST(0.1440741111961058), FRAC_CONST(0.1455654693451402), FRAC_CONST(0.1470655301215526), FRAC_CONST(0.1485742834205956), FRAC_CONST(0.1500917185779945), FRAC_CONST(0.1516178243690463), FRAC_CONST(0.1531525890077689), FRAC_CONST(0.1546960001461024), FRAC_CONST(0.1562480448731608), FRAC_CONST(0.1578087097145364), FRAC_CONST(0.1593779806316558), FRAC_CONST(0.1609558430211876), FRAC_CONST(0.1625422817145027), FRAC_CONST(0.1641372809771871), FRAC_CONST(0.1657408245086070), FRAC_CONST(0.1673528954415270), FRAC_CONST(0.1689734763417811), FRAC_CONST(0.1706025492079969), FRAC_CONST(0.1722400954713725), FRAC_CONST(0.1738860959955082), FRAC_CONST(0.1755405310762898), FRAC_CONST(0.1772033804418275), FRAC_CONST(0.1788746232524467), FRAC_CONST(0.1805542381007349), FRAC_CONST(0.1822422030116404), FRAC_CONST(0.1839384954426268), FRAC_CONST(0.1856430922838810), FRAC_CONST(0.1873559698585756), FRAC_CONST(0.1890771039231862), FRAC_CONST(0.1908064696678625), FRAC_CONST(0.1925440417168546), FRAC_CONST(0.1942897941289937), FRAC_CONST(0.1960437003982277), FRAC_CONST(0.1978057334542116), FRAC_CONST(0.1995758656629525), FRAC_CONST(0.2013540688275098), FRAC_CONST(0.2031403141887507), FRAC_CONST(0.2049345724261595), FRAC_CONST(0.2067368136587033), FRAC_CONST(0.2085470074457521), FRAC_CONST(0.2103651227880538), FRAC_CONST(0.2121911281287646), FRAC_CONST(0.2140249913545346), FRAC_CONST(0.2158666797966480), FRAC_CONST(0.2177161602322188), FRAC_CONST(0.2195733988854414), FRAC_CONST(0.2214383614288963), FRAC_CONST(0.2233110129849106), FRAC_CONST(0.2251913181269740), FRAC_CONST(0.2270792408812093), FRAC_CONST(0.2289747447278976), FRAC_CONST(0.2308777926030592), FRAC_CONST(0.2327883469000885), FRAC_CONST(0.2347063694714437), FRAC_CONST(0.2366318216303919), FRAC_CONST(0.2385646641528076), FRAC_CONST(0.2405048572790267), FRAC_CONST(0.2424523607157545), FRAC_CONST(0.2444071336380283), FRAC_CONST(0.2463691346912334), FRAC_CONST(0.2483383219931741), FRAC_CONST(0.2503146531361985), FRAC_CONST(0.2522980851893767), FRAC_CONST(0.2542885747007335), FRAC_CONST(0.2562860776995335), FRAC_CONST(0.2582905496986215), FRAC_CONST(0.2603019456968142), FRAC_CONST(0.2623202201813464), FRAC_CONST(0.2643453271303700), FRAC_CONST(0.2663772200155053), FRAC_CONST(0.2684158518044454), FRAC_CONST(0.2704611749636135), FRAC_CONST(0.2725131414608710), FRAC_CONST(0.2745717027682799), FRAC_CONST(0.2766368098649151), FRAC_CONST(0.2787084132397296), FRAC_CONST(0.2807864628944707), FRAC_CONST(0.2828709083466482), FRAC_CONST(0.2849616986325523), FRAC_CONST(0.2870587823103237), FRAC_CONST(0.2891621074630737), FRAC_CONST(0.2912716217020546), FRAC_CONST(0.2933872721698803), FRAC_CONST(0.2955090055437973), FRAC_CONST(0.2976367680390041), FRAC_CONST(0.2997705054120213), FRAC_CONST(0.3019101629641097), FRAC_CONST(0.3040556855447379), FRAC_CONST(0.3062070175550981), FRAC_CONST(0.3083641029516701), FRAC_CONST(0.3105268852498334), FRAC_CONST(0.3126953075275265), FRAC_CONST(0.3148693124289546), FRAC_CONST(0.3170488421683428), FRAC_CONST(0.3192338385337370), FRAC_CONST(0.3214242428908514), FRAC_CONST(0.3236199961869606), FRAC_CONST(0.3258210389548392), FRAC_CONST(0.3280273113167459), FRAC_CONST(0.3302387529884521), FRAC_CONST(0.3324553032833160), FRAC_CONST(0.3346769011164010), FRAC_CONST(0.3369034850086373), FRAC_CONST(0.3391349930910280), FRAC_CONST(0.3413713631088974), FRAC_CONST(0.3436125324261830), FRAC_CONST(0.3458584380297697), FRAC_CONST(0.3481090165338656), FRAC_CONST(0.3503642041844199), FRAC_CONST(0.3526239368635820), FRAC_CONST(0.3548881500942010), FRAC_CONST(0.3571567790443668), FRAC_CONST(0.3594297585319891), FRAC_CONST(0.3617070230294185), FRAC_CONST(0.3639885066681048), FRAC_CONST(0.3662741432432950), FRAC_CONST(0.3685638662187693), FRAC_CONST(0.3708576087316147), FRAC_CONST(0.3731553035970366), FRAC_CONST(0.3754568833132069), FRAC_CONST(0.3777622800661488), FRAC_CONST(0.3800714257346570), FRAC_CONST(0.3823842518952546), FRAC_CONST(0.3847006898271841), FRAC_CONST(0.3870206705174334), FRAC_CONST(0.3893441246657958), FRAC_CONST(0.3916709826899639), FRAC_CONST(0.3940011747306560), FRAC_CONST(0.3963346306567764), FRAC_CONST(0.3986712800706062), FRAC_CONST(0.4010110523130271), FRAC_CONST(0.4033538764687756), FRAC_CONST(0.4056996813717284), FRAC_CONST(0.4080483956102172), FRAC_CONST(0.4103999475323736), FRAC_CONST(0.4127542652515031), FRAC_CONST(0.4151112766514873), FRAC_CONST(0.4174709093922143), FRAC_CONST(0.4198330909150365), FRAC_CONST(0.4221977484482556), FRAC_CONST(0.4245648090126334), FRAC_CONST(0.4269341994269293), FRAC_CONST(0.4293058463134616), FRAC_CONST(0.4316796761036958), FRAC_CONST(0.4340556150438547), FRAC_CONST(0.4364335892005536), FRAC_CONST(0.4388135244664580), FRAC_CONST(0.4411953465659639), FRAC_CONST(0.4435789810609000), FRAC_CONST(0.4459643533562509), FRAC_CONST(0.4483513887059016), FRAC_CONST(0.4507400122184019), FRAC_CONST(0.4531301488627497), FRAC_CONST(0.4555217234741947), FRAC_CONST(0.4579146607600593), FRAC_CONST(0.4603088853055777), FRAC_CONST(0.4627043215797521), FRAC_CONST(0.4651008939412254), FRAC_CONST(0.4674985266441709), FRAC_CONST(0.4698971438441951), FRAC_CONST(0.4722966696042580), FRAC_CONST(0.4746970279006055), FRAC_CONST(0.4770981426287164), FRAC_CONST(0.4794999376092619), FRAC_CONST(0.4819023365940778), FRAC_CONST(0.4843052632721476), FRAC_CONST(0.4867086412755978), FRAC_CONST(0.4891123941857028), FRAC_CONST(0.4915164455388997), FRAC_CONST(0.4939207188328126), FRAC_CONST(0.4963251375322855), FRAC_CONST(0.4987296250754225), FRAC_CONST(0.5011341048796359), FRAC_CONST(0.5035385003477012), FRAC_CONST(0.5059427348738168), FRAC_CONST(0.5083467318496706), FRAC_CONST(0.5107504146705106), FRAC_CONST(0.5131537067412193), FRAC_CONST(0.5155565314823923), FRAC_CONST(0.5179588123364193), FRAC_CONST(0.5203604727735667), FRAC_CONST(0.5227614362980630), FRAC_CONST(0.5251616264541841), FRAC_CONST(0.5275609668323384), FRAC_CONST(0.5299593810751532), FRAC_CONST(0.5323567928835578), FRAC_CONST(0.5347531260228663), FRAC_CONST(0.5371483043288580), FRAC_CONST(0.5395422517138538), FRAC_CONST(0.5419348921727899), FRAC_CONST(0.5443261497892862), FRAC_CONST(0.5467159487417104), FRAC_CONST(0.5491042133092364), FRAC_CONST(0.5514908678778958), FRAC_CONST(0.5538758369466227), FRAC_CONST(0.5562590451332913), FRAC_CONST(0.5586404171807443), FRAC_CONST(0.5610198779628133), FRAC_CONST(0.5633973524903286), FRAC_CONST(0.5657727659171199), FRAC_CONST(0.5681460435460047), FRAC_CONST(0.5705171108347663), FRAC_CONST(0.5728858934021188), FRAC_CONST(0.5752523170336598), FRAC_CONST(0.5776163076878088), FRAC_CONST(0.5799777915017323), FRAC_CONST(0.5823366947972535), FRAC_CONST(0.5846929440867458), FRAC_CONST(0.5870464660790119), FRAC_CONST(0.5893971876851449), FRAC_CONST(0.5917450360243719), FRAC_CONST(0.5940899384298793), FRAC_CONST(0.5964318224546208), FRAC_CONST(0.5987706158771039), FRAC_CONST(0.6011062467071583), FRAC_CONST(0.6034386431916822), FRAC_CONST(0.6057677338203681), FRAC_CONST(0.6080934473314057), FRAC_CONST(0.6104157127171639), FRAC_CONST(0.6127344592298474), FRAC_CONST(0.6150496163871310), FRAC_CONST(0.6173611139777690), FRAC_CONST(0.6196688820671789), FRAC_CONST(0.6219728510029997), FRAC_CONST(0.6242729514206247), FRAC_CONST(0.6265691142487051), FRAC_CONST(0.6288612707146283), FRAC_CONST(0.6311493523499663), FRAC_CONST(0.6334332909958958), FRAC_CONST(0.6357130188085891), FRAC_CONST(0.6379884682645743), FRAC_CONST(0.6402595721660647), FRAC_CONST(0.6425262636462578), FRAC_CONST(0.6447884761746012), FRAC_CONST(0.6470461435620266), FRAC_CONST(0.6492991999661505), FRAC_CONST(0.6515475798964411), FRAC_CONST(0.6537912182193508), FRAC_CONST(0.6560300501634142), FRAC_CONST(0.6582640113243098), FRAC_CONST(0.6604930376698862), FRAC_CONST(0.6627170655451516), FRAC_CONST(0.6649360316772256), FRAC_CONST(0.6671498731802533), FRAC_CONST(0.6693585275602818), FRAC_CONST(0.6715619327200959), FRAC_CONST(0.6737600269640164), FRAC_CONST(0.6759527490026566), FRAC_CONST(0.6781400379576392), FRAC_CONST(0.6803218333662715), FRAC_CONST(0.6824980751861787), FRAC_CONST(0.6846687037998949), FRAC_CONST(0.6868336600194123), FRAC_CONST(0.6889928850906855), FRAC_CONST(0.6911463206980928), FRAC_CONST(0.6932939089688525), FRAC_CONST(0.6954355924773949), FRAC_CONST(0.6975713142496884), FRAC_CONST(0.6997010177675195), FRAC_CONST(0.7018246469727265), FRAC_CONST(0.7039421462713862), FRAC_CONST(0.7060534605379528), FRAC_CONST(0.7081585351193496), FRAC_CONST(0.7102573158390105), FRAC_CONST(0.7123497490008750), FRAC_CONST(0.7144357813933307), FRAC_CONST(0.7165153602931092), FRAC_CONST(0.7185884334691287), FRAC_CONST(0.7206549491862871), FRAC_CONST(0.7227148562092042), FRAC_CONST(0.7247681038059106), FRAC_CONST(0.7268146417514855), FRAC_CONST(0.7288544203316418), FRAC_CONST(0.7308873903462577), FRAC_CONST(0.7329135031128549), FRAC_CONST(0.7349327104700221), FRAC_CONST(0.7369449647807855), FRAC_CONST(0.7389502189359237), FRAC_CONST(0.7409484263572271), FRAC_CONST(0.7429395410007016), FRAC_CONST(0.7449235173597176), FRAC_CONST(0.7469003104681008), FRAC_CONST(0.7488698759031670), FRAC_CONST(0.7508321697887005), FRAC_CONST(0.7527871487978728), FRAC_CONST(0.7547347701561059), FRAC_CONST(0.7566749916438754), FRAC_CONST(0.7586077715994560), FRAC_CONST(0.7605330689216074), FRAC_CONST(0.7624508430722016), FRAC_CONST(0.7643610540787891), FRAC_CONST(0.7662636625371070), FRAC_CONST(0.7681586296135255), FRAC_CONST(0.7700459170474343), FRAC_CONST(0.7719254871535672), FRAC_CONST(0.7737973028242671), FRAC_CONST(0.7756613275316875), FRAC_CONST(0.7775175253299340), FRAC_CONST(0.7793658608571425), FRAC_CONST(0.7812062993374951), FRAC_CONST(0.7830388065831744), FRAC_CONST(0.7848633489962533), FRAC_CONST(0.7866798935705233), FRAC_CONST(0.7884884078932579), FRAC_CONST(0.7902888601469138), FRAC_CONST(0.7920812191107668), FRAC_CONST(0.7938654541624850), FRAC_CONST(0.7956415352796368), FRAC_CONST(0.7974094330411343), FRAC_CONST(0.7991691186286133), FRAC_CONST(0.8009205638277465), FRAC_CONST(0.8026637410294932), FRAC_CONST(0.8043986232312831), FRAC_CONST(0.8061251840381346), FRAC_CONST(0.8078433976637077), FRAC_CONST(0.8095532389312917), FRAC_CONST(0.8112546832747255), FRAC_CONST(0.8129477067392539), FRAC_CONST(0.8146322859823164), FRAC_CONST(0.8163083982742698), FRAC_CONST(0.8179760214990457), FRAC_CONST(0.8196351341547393), FRAC_CONST(0.8212857153541345), FRAC_CONST(0.8229277448251595), FRAC_CONST(0.8245612029112778), FRAC_CONST(0.8261860705718113), FRAC_CONST(0.8278023293821971), FRAC_CONST(0.8294099615341773), FRAC_CONST(0.8310089498359212), FRAC_CONST(0.8325992777120815), FRAC_CONST(0.8341809292037831), FRAC_CONST(0.8357538889685445), FRAC_CONST(0.8373181422801330), FRAC_CONST(0.8388736750283521), FRAC_CONST(0.8404204737187619), FRAC_CONST(0.8419585254723335), FRAC_CONST(0.8434878180250348), FRAC_CONST(0.8450083397273509), FRAC_CONST(0.8465200795437368), FRAC_CONST(0.8480230270520029), FRAC_CONST(0.8495171724426350), FRAC_CONST(0.8510025065180464), FRAC_CONST(0.8524790206917633), FRAC_CONST(0.8539467069875448), FRAC_CONST(0.8554055580384357), FRAC_CONST(0.8568555670857525), FRAC_CONST(0.8582967279780043), FRAC_CONST(0.8597290351697464), FRAC_CONST(0.8611524837203691), FRAC_CONST(0.8625670692928198), FRAC_CONST(0.8639727881522599), FRAC_CONST(0.8653696371646555), FRAC_CONST(0.8667576137953045), FRAC_CONST(0.8681367161072958), FRAC_CONST(0.8695069427599065), FRAC_CONST(0.8708682930069319), FRAC_CONST(0.8722207666949527), FRAC_CONST(0.8735643642615368), FRAC_CONST(0.8748990867333771), FRAC_CONST(0.8762249357243662), FRAC_CONST(0.8775419134336067), FRAC_CONST(0.8788500226433579), FRAC_CONST(0.8801492667169208), FRAC_CONST(0.8814396495964587), FRAC_CONST(0.8827211758007560), FRAC_CONST(0.8839938504229149), FRAC_CONST(0.8852576791279895), FRAC_CONST(0.8865126681505587), FRAC_CONST(0.8877588242922386), FRAC_CONST(0.8889961549191320), FRAC_CONST(0.8902246679592184), FRAC_CONST(0.8914443718996848), FRAC_CONST(0.8926552757841945), FRAC_CONST(0.8938573892100969), FRAC_CONST(0.8950507223255798), FRAC_CONST(0.8962352858267605), FRAC_CONST(0.8974110909547198), FRAC_CONST(0.8985781494924783), FRAC_CONST(0.8997364737619142), FRAC_CONST(0.9008860766206249), FRAC_CONST(0.9020269714587307), FRAC_CONST(0.9031591721956235), FRAC_CONST(0.9042826932766591), FRAC_CONST(0.9053975496697941), FRAC_CONST(0.9065037568621681), FRAC_CONST(0.9076013308566311), FRAC_CONST(0.9086902881682180), FRAC_CONST(0.9097706458205682), FRAC_CONST(0.9108424213422940), FRAC_CONST(0.9119056327632955), FRAC_CONST(0.9129602986110235), FRAC_CONST(0.9140064379066919), FRAC_CONST(0.9150440701614393), FRAC_CONST(0.9160732153724396), FRAC_CONST(0.9170938940189634), FRAC_CONST(0.9181061270583908), FRAC_CONST(0.9191099359221748), FRAC_CONST(0.9201053425117579), FRAC_CONST(0.9210923691944400), FRAC_CONST(0.9220710387992010), FRAC_CONST(0.9230413746124764), FRAC_CONST(0.9240034003738882), FRAC_CONST(0.9249571402719298), FRAC_CONST(0.9259026189396085), FRAC_CONST(0.9268398614500427), FRAC_CONST(0.9277688933120170), FRAC_CONST(0.9286897404654957), FRAC_CONST(0.9296024292770939), FRAC_CONST(0.9305069865355076), FRAC_CONST(0.9314034394469048), FRAC_CONST(0.9322918156302762), FRAC_CONST(0.9331721431127471), FRAC_CONST(0.9340444503248519), FRAC_CONST(0.9349087660957711), FRAC_CONST(0.9357651196485313), FRAC_CONST(0.9366135405951697), FRAC_CONST(0.9374540589318637), FRAC_CONST(0.9382867050340261), FRAC_CONST(0.9391115096513655), FRAC_CONST(0.9399285039029165), FRAC_CONST(0.9407377192720349), FRAC_CONST(0.9415391876013639), FRAC_CONST(0.9423329410877687), FRAC_CONST(0.9431190122772415), FRAC_CONST(0.9438974340597782), FRAC_CONST(0.9446682396642262), FRAC_CONST(0.9454314626531054), FRAC_CONST(0.9461871369174033), FRAC_CONST(0.9469352966713429), FRAC_CONST(0.9476759764471278), FRAC_CONST(0.9484092110896616), FRAC_CONST(0.9491350357512457), FRAC_CONST(0.9498534858862532), FRAC_CONST(0.9505645972457831), FRAC_CONST(0.9512684058722927), FRAC_CONST(0.9519649480942105), FRAC_CONST(0.9526542605205314), FRAC_CONST(0.9533363800353921), FRAC_CONST(0.9540113437926313), FRAC_CONST(0.9546791892103320), FRAC_CONST(0.9553399539653500), FRAC_CONST(0.9559936759878265), FRAC_CONST(0.9566403934556893), FRAC_CONST(0.9572801447891388), FRAC_CONST(0.9579129686451244), FRAC_CONST(0.9585389039118085), FRAC_CONST(0.9591579897030224), FRAC_CONST(0.9597702653527108), FRAC_CONST(0.9603757704093711), FRAC_CONST(0.9609745446304828), FRAC_CONST(0.9615666279769324), FRAC_CONST(0.9621520606074324), FRAC_CONST(0.9627308828729358), FRAC_CONST(0.9633031353110477), FRAC_CONST(0.9638688586404335), FRAC_CONST(0.9644280937552258), FRAC_CONST(0.9649808817194311), FRAC_CONST(0.9655272637613366), FRAC_CONST(0.9660672812679171), FRAC_CONST(0.9666009757792454), FRAC_CONST(0.9671283889829055), FRAC_CONST(0.9676495627084089), FRAC_CONST(0.9681645389216160), FRAC_CONST(0.9686733597191652), FRAC_CONST(0.9691760673229058), FRAC_CONST(0.9696727040743406), FRAC_CONST(0.9701633124290767), FRAC_CONST(0.9706479349512860), FRAC_CONST(0.9711266143081750), FRAC_CONST(0.9715993932644684), FRAC_CONST(0.9720663146769026), FRAC_CONST(0.9725274214887337), FRAC_CONST(0.9729827567242596), FRAC_CONST(0.9734323634833574), FRAC_CONST(0.9738762849360358), FRAC_CONST(0.9743145643170059), FRAC_CONST(0.9747472449202687), FRAC_CONST(0.9751743700937215), FRAC_CONST(0.9755959832337850), FRAC_CONST(0.9760121277800496), FRAC_CONST(0.9764228472099433), FRAC_CONST(0.9768281850334235), FRAC_CONST(0.9772281847876897), FRAC_CONST(0.9776228900319223), FRAC_CONST(0.9780123443420448), FRAC_CONST(0.9783965913055132), FRAC_CONST(0.9787756745161313), FRAC_CONST(0.9791496375688939), FRAC_CONST(0.9795185240548578), FRAC_CONST(0.9798823775560431), FRAC_CONST(0.9802412416403639), FRAC_CONST(0.9805951598565897), FRAC_CONST(0.9809441757293399), FRAC_CONST(0.9812883327541090), FRAC_CONST(0.9816276743923267), FRAC_CONST(0.9819622440664515), FRAC_CONST(0.9822920851550995), FRAC_CONST(0.9826172409882086), FRAC_CONST(0.9829377548422400), FRAC_CONST(0.9832536699354163), FRAC_CONST(0.9835650294229984), FRAC_CONST(0.9838718763926001), FRAC_CONST(0.9841742538595437), FRAC_CONST(0.9844722047622547), FRAC_CONST(0.9847657719576983), FRAC_CONST(0.9850549982168574), FRAC_CONST(0.9853399262202529), FRAC_CONST(0.9856205985535073), FRAC_CONST(0.9858970577029519), FRAC_CONST(0.9861693460512790), FRAC_CONST(0.9864375058732389), FRAC_CONST(0.9867015793313820), FRAC_CONST(0.9869616084718489), FRAC_CONST(0.9872176352202061), FRAC_CONST(0.9874697013773301), FRAC_CONST(0.9877178486153397), FRAC_CONST(0.9879621184735767), FRAC_CONST(0.9882025523546365), FRAC_CONST(0.9884391915204485), FRAC_CONST(0.9886720770884069), FRAC_CONST(0.9889012500275530), FRAC_CONST(0.9891267511548089), FRAC_CONST(0.9893486211312621), FRAC_CONST(0.9895669004585049), FRAC_CONST(0.9897816294750255), FRAC_CONST(0.9899928483526520), FRAC_CONST(0.9902005970930525), FRAC_CONST(0.9904049155242876), FRAC_CONST(0.9906058432974180), FRAC_CONST(0.9908034198831690), FRAC_CONST(0.9909976845686489), FRAC_CONST(0.9911886764541239), FRAC_CONST(0.9913764344498495), FRAC_CONST(0.9915609972729590), FRAC_CONST(0.9917424034444086), FRAC_CONST(0.9919206912859797), FRAC_CONST(0.9920958989173397), FRAC_CONST(0.9922680642531603), FRAC_CONST(0.9924372250002933), FRAC_CONST(0.9926034186550070), FRAC_CONST(0.9927666825002789), FRAC_CONST(0.9929270536031491), FRAC_CONST(0.9930845688121325), FRAC_CONST(0.9932392647546895), FRAC_CONST(0.9933911778347579), FRAC_CONST(0.9935403442303433), FRAC_CONST(0.9936867998911693), FRAC_CONST(0.9938305805363887), FRAC_CONST(0.9939717216523539), FRAC_CONST(0.9941102584904481), FRAC_CONST(0.9942462260649764), FRAC_CONST(0.9943796591511174), FRAC_CONST(0.9945105922829353), FRAC_CONST(0.9946390597514524), FRAC_CONST(0.9947650956027824), FRAC_CONST(0.9948887336363228), FRAC_CONST(0.9950100074030103), FRAC_CONST(0.9951289502036336), FRAC_CONST(0.9952455950872091), FRAC_CONST(0.9953599748494155), FRAC_CONST(0.9954721220310890), FRAC_CONST(0.9955820689167787), FRAC_CONST(0.9956898475333619), FRAC_CONST(0.9957954896487196), FRAC_CONST(0.9958990267704713), FRAC_CONST(0.9960004901447701), FRAC_CONST(0.9960999107551559), FRAC_CONST(0.9961973193214694), FRAC_CONST(0.9962927462988245), FRAC_CONST(0.9963862218766388), FRAC_CONST(0.9964777759777242), FRAC_CONST(0.9965674382574342), FRAC_CONST(0.9966552381028704), FRAC_CONST(0.9967412046321465), FRAC_CONST(0.9968253666937095), FRAC_CONST(0.9969077528657186), FRAC_CONST(0.9969883914554805), FRAC_CONST(0.9970673104989413), FRAC_CONST(0.9971445377602348), FRAC_CONST(0.9972201007312871), FRAC_CONST(0.9972940266314749), FRAC_CONST(0.9973663424073412), FRAC_CONST(0.9974370747323638), FRAC_CONST(0.9975062500067785), FRAC_CONST(0.9975738943574574), FRAC_CONST(0.9976400336378379), FRAC_CONST(0.9977046934279079), FRAC_CONST(0.9977678990342401), FRAC_CONST(0.9978296754900812), FRAC_CONST(0.9978900475554902), FRAC_CONST(0.9979490397175296), FRAC_CONST(0.9980066761905056), FRAC_CONST(0.9980629809162593), FRAC_CONST(0.9981179775645063), FRAC_CONST(0.9981716895332257), FRAC_CONST(0.9982241399490979), FRAC_CONST(0.9982753516679893), FRAC_CONST(0.9983253472754841), FRAC_CONST(0.9983741490874634), FRAC_CONST(0.9984217791507299), FRAC_CONST(0.9984682592436778), FRAC_CONST(0.9985136108770075), FRAC_CONST(0.9985578552944850), FRAC_CONST(0.9986010134737439), FRAC_CONST(0.9986431061271304), FRAC_CONST(0.9986841537025921), FRAC_CONST(0.9987241763846056), FRAC_CONST(0.9987631940951476), FRAC_CONST(0.9988012264947044), FRAC_CONST(0.9988382929833222), FRAC_CONST(0.9988744127016956), FRAC_CONST(0.9989096045322947), FRAC_CONST(0.9989438871005292), FRAC_CONST(0.9989772787759494), FRAC_CONST(0.9990097976734847), FRAC_CONST(0.9990414616547146), FRAC_CONST(0.9990722883291779), FRAC_CONST(0.9991022950557125), FRAC_CONST(0.9991314989438310), FRAC_CONST(0.9991599168551279), FRAC_CONST(0.9991875654047181), FRAC_CONST(0.9992144609627068), FRAC_CONST(0.9992406196556911), FRAC_CONST(0.9992660573682882), FRAC_CONST(0.9992907897446957), FRAC_CONST(0.9993148321902777), FRAC_CONST(0.9993381998731797), FRAC_CONST(0.9993609077259696), FRAC_CONST(0.9993829704473038), FRAC_CONST(0.9994044025036201), FRAC_CONST(0.9994252181308537), FRAC_CONST(0.9994454313361775), FRAC_CONST(0.9994650558997651), FRAC_CONST(0.9994841053765757), FRAC_CONST(0.9995025930981609), FRAC_CONST(0.9995205321744921), FRAC_CONST(0.9995379354958073), FRAC_CONST(0.9995548157344778), FRAC_CONST(0.9995711853468930), FRAC_CONST(0.9995870565753632), FRAC_CONST(0.9996024414500382), FRAC_CONST(0.9996173517908444), FRAC_CONST(0.9996317992094352), FRAC_CONST(0.9996457951111574), FRAC_CONST(0.9996593506970310), FRAC_CONST(0.9996724769657434), FRAC_CONST(0.9996851847156547), FRAC_CONST(0.9996974845468164), FRAC_CONST(0.9997093868630000), FRAC_CONST(0.9997209018737374), FRAC_CONST(0.9997320395963699), FRAC_CONST(0.9997428098581069), FRAC_CONST(0.9997532222980933), FRAC_CONST(0.9997632863694836), FRAC_CONST(0.9997730113415246), FRAC_CONST(0.9997824063016426), FRAC_CONST(0.9997914801575380), FRAC_CONST(0.9998002416392840), FRAC_CONST(0.9998086993014300), FRAC_CONST(0.9998168615251084), FRAC_CONST(0.9998247365201450), FRAC_CONST(0.9998323323271717), FRAC_CONST(0.9998396568197407), FRAC_CONST(0.9998467177064404), FRAC_CONST(0.9998535225330116), FRAC_CONST(0.9998600786844637), FRAC_CONST(0.9998663933871905), FRAC_CONST(0.9998724737110845), FRAC_CONST(0.9998783265716498), FRAC_CONST(0.9998839587321121), FRAC_CONST(0.9998893768055266), FRAC_CONST(0.9998945872568815), FRAC_CONST(0.9998995964051983), FRAC_CONST(0.9999044104256269), FRAC_CONST(0.9999090353515359), FRAC_CONST(0.9999134770765971), FRAC_CONST(0.9999177413568642), FRAC_CONST(0.9999218338128448), FRAC_CONST(0.9999257599315647), FRAC_CONST(0.9999295250686255), FRAC_CONST(0.9999331344502529), FRAC_CONST(0.9999365931753376), FRAC_CONST(0.9999399062174669), FRAC_CONST(0.9999430784269460), FRAC_CONST(0.9999461145328103), FRAC_CONST(0.9999490191448277), FRAC_CONST(0.9999517967554878), FRAC_CONST(0.9999544517419835), FRAC_CONST(0.9999569883681778), FRAC_CONST(0.9999594107865607), FRAC_CONST(0.9999617230401926), FRAC_CONST(0.9999639290646355), FRAC_CONST(0.9999660326898712), FRAC_CONST(0.9999680376422052), FRAC_CONST(0.9999699475461585), FRAC_CONST(0.9999717659263435), FRAC_CONST(0.9999734962093266), FRAC_CONST(0.9999751417254756), FRAC_CONST(0.9999767057107922), FRAC_CONST(0.9999781913087290), FRAC_CONST(0.9999796015719915), FRAC_CONST(0.9999809394643231), FRAC_CONST(0.9999822078622751), FRAC_CONST(0.9999834095569596), FRAC_CONST(0.9999845472557860), FRAC_CONST(0.9999856235841805), FRAC_CONST(0.9999866410872889), FRAC_CONST(0.9999876022316609), FRAC_CONST(0.9999885094069193), FRAC_CONST(0.9999893649274085), FRAC_CONST(0.9999901710338274), FRAC_CONST(0.9999909298948430), FRAC_CONST(0.9999916436086862), FRAC_CONST(0.9999923142047299), FRAC_CONST(0.9999929436450469), FRAC_CONST(0.9999935338259505), FRAC_CONST(0.9999940865795161), FRAC_CONST(0.9999946036750835), FRAC_CONST(0.9999950868207405), FRAC_CONST(0.9999955376647868), FRAC_CONST(0.9999959577971798), FRAC_CONST(0.9999963487509599), FRAC_CONST(0.9999967120036571), FRAC_CONST(0.9999970489786785), FRAC_CONST(0.9999973610466748), FRAC_CONST(0.9999976495268890), FRAC_CONST(0.9999979156884846), FRAC_CONST(0.9999981607518545), FRAC_CONST(0.9999983858899099), FRAC_CONST(0.9999985922293493), FRAC_CONST(0.9999987808519092), FRAC_CONST(0.9999989527955938), FRAC_CONST(0.9999991090558848), FRAC_CONST(0.9999992505869332), FRAC_CONST(0.9999993783027293), FRAC_CONST(0.9999994930782556), FRAC_CONST(0.9999995957506171), FRAC_CONST(0.9999996871201549), FRAC_CONST(0.9999997679515386), FRAC_CONST(0.9999998389748399), FRAC_CONST(0.9999999008865869), FRAC_CONST(0.9999999543507984) }; #endif ALIGN static const real_t kbd_short_128[] = { FRAC_CONST(4.3795702929468881e-005), FRAC_CONST(0.00011867384265436617), FRAC_CONST(0.0002307165763996192), FRAC_CONST(0.00038947282760568383), FRAC_CONST(0.00060581272288302553), FRAC_CONST(0.00089199695169487453), FRAC_CONST(0.0012617254423430522), FRAC_CONST(0.0017301724373162003), FRAC_CONST(0.0023140071937421476), FRAC_CONST(0.0030313989666022221), FRAC_CONST(0.0039020049735530842), FRAC_CONST(0.0049469401815512024), FRAC_CONST(0.0061887279335368318), FRAC_CONST(0.0076512306364647726), FRAC_CONST(0.0093595599562652423), FRAC_CONST(0.011339966208377799), FRAC_CONST(0.013619706891715299), FRAC_CONST(0.016226894586323766), FRAC_CONST(0.019190324717288168), FRAC_CONST(0.022539283975960878), FRAC_CONST(0.026303340480472455), FRAC_CONST(0.030512117046644357), FRAC_CONST(0.03519504922365594), FRAC_CONST(0.040381130021856941), FRAC_CONST(0.046098643518702249), FRAC_CONST(0.052374889768730587), FRAC_CONST(0.059235903660769147), FRAC_CONST(0.066706170556282418), FRAC_CONST(0.074808341703430481), FRAC_CONST(0.083562952548726227), FRAC_CONST(0.092988147159339674), FRAC_CONST(0.1030994120216919), FRAC_CONST(0.11390932249409955), FRAC_CONST(0.12542730516149531), FRAC_CONST(0.13765941926783826), FRAC_CONST(0.15060816028651081), FRAC_CONST(0.16427228853114245), FRAC_CONST(0.17864668550988483), FRAC_CONST(0.19372224048676889), FRAC_CONST(0.20948576943658073), FRAC_CONST(0.22591996826744942), FRAC_CONST(0.24300340184133981), FRAC_CONST(0.26071052995068139), FRAC_CONST(0.27901177101369551), FRAC_CONST(0.29787360383626599), FRAC_CONST(0.3172587073594233), FRAC_CONST(0.33712613787396362), FRAC_CONST(0.35743154274286698), FRAC_CONST(0.37812740923363009), FRAC_CONST(0.39916334663203618), FRAC_CONST(0.42048639939189658), FRAC_CONST(0.4420413886774246), FRAC_CONST(0.4637712792815169), FRAC_CONST(0.4856175685594023), FRAC_CONST(0.50752069370766872), FRAC_CONST(0.52942045344797806), FRAC_CONST(0.55125643994680196), FRAC_CONST(0.57296847662071559), FRAC_CONST(0.59449705734411495), FRAC_CONST(0.61578378249506627), FRAC_CONST(0.63677178724712891), FRAC_CONST(0.65740615754163356), FRAC_CONST(0.67763432925662526), FRAC_CONST(0.69740646622548552), FRAC_CONST(0.71667581294953808), FRAC_CONST(0.73539901809352737), FRAC_CONST(0.75353642514900732), FRAC_CONST(0.77105232699609816), FRAC_CONST(0.78791518148597028), FRAC_CONST(0.80409778560147072), FRAC_CONST(0.81957740622770781), FRAC_CONST(0.83433586607383625), FRAC_CONST(0.84835958382689225), FRAC_CONST(0.86163956818294229), FRAC_CONST(0.87417136598406997), FRAC_CONST(0.88595496528524853), FRAC_CONST(0.89699465477567619), FRAC_CONST(0.90729884157670959), FRAC_CONST(0.91687983002436779), FRAC_CONST(0.92575356460899649), FRAC_CONST(0.93393934077779084), FRAC_CONST(0.94145948779657318), FRAC_CONST(0.94833902830402828), FRAC_CONST(0.95460531956280026), FRAC_CONST(0.96028768170574896), FRAC_CONST(0.96541701848104766), FRAC_CONST(0.97002543610646474), FRAC_CONST(0.97414586584250062), FRAC_CONST(0.97781169577969584), FRAC_CONST(0.98105641710392333), FRAC_CONST(0.98391328975491177), FRAC_CONST(0.98641503193166202), FRAC_CONST(0.98859353733226141), FRAC_CONST(0.99047962335771556), FRAC_CONST(0.9921028127769449), FRAC_CONST(0.99349115056397752), FRAC_CONST(0.99467105680259038), FRAC_CONST(0.9956672157341897), FRAC_CONST(0.99650250022834352), FRAC_CONST(0.99719793020823266), FRAC_CONST(0.99777266288955657), FRAC_CONST(0.99824401211201486), FRAC_CONST(0.99862749357391212), FRAC_CONST(0.99893689243401962), FRAC_CONST(0.99918434952623147), FRAC_CONST(0.99938046234161726), FRAC_CONST(0.99953439696357238), FRAC_CONST(0.99965400728430465), FRAC_CONST(0.99974595807027455), FRAC_CONST(0.99981584876278362), FRAC_CONST(0.99986833527824281), FRAC_CONST(0.99990724749057802), FRAC_CONST(0.99993570051598468), FRAC_CONST(0.99995619835942084), FRAC_CONST(0.99997072890647543), FRAC_CONST(0.9999808496399144), FRAC_CONST(0.99998776381655818), FRAC_CONST(0.99999238714961569), FRAC_CONST(0.99999540529959718), FRAC_CONST(0.99999732268176988), FRAC_CONST(0.99999850325054862), FRAC_CONST(0.99999920402413744), FRAC_CONST(0.9999996021706401), FRAC_CONST(0.99999981649545566), FRAC_CONST(0.99999992415545547), FRAC_CONST(0.99999997338493041), FRAC_CONST(0.99999999295825959), FRAC_CONST(0.99999999904096815) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t kbd_short_120[] = { FRAC_CONST(0.0000452320086910), FRAC_CONST(0.0001274564692111), FRAC_CONST(0.0002529398385345), FRAC_CONST(0.0004335140496648), FRAC_CONST(0.0006827100966952), FRAC_CONST(0.0010158708222246), FRAC_CONST(0.0014502162869659), FRAC_CONST(0.0020048865156264), FRAC_CONST(0.0027009618393178), FRAC_CONST(0.0035614590925043), FRAC_CONST(0.0046113018122711), FRAC_CONST(0.0058772627936484), FRAC_CONST(0.0073878776584103), FRAC_CONST(0.0091733284512589), FRAC_CONST(0.0112652966728373), FRAC_CONST(0.0136967855861945), FRAC_CONST(0.0165019120857793), FRAC_CONST(0.0197156688892217), FRAC_CONST(0.0233736582950619), FRAC_CONST(0.0275117992367496), FRAC_CONST(0.0321660098468534), FRAC_CONST(0.0373718682174417), FRAC_CONST(0.0431642544948834), FRAC_CONST(0.0495769778717676), FRAC_CONST(0.0566423924273392), FRAC_CONST(0.0643910061132260), FRAC_CONST(0.0728510874761729), FRAC_CONST(0.0820482749475221), FRAC_CONST(0.0920051937045235), FRAC_CONST(0.1027410852163450), FRAC_CONST(0.1142714546239370), FRAC_CONST(0.1266077410648368), FRAC_CONST(0.1397570159398145), FRAC_CONST(0.1537217139274270), FRAC_CONST(0.1684994012857075), FRAC_CONST(0.1840825856392944), FRAC_CONST(0.2004585710384133), FRAC_CONST(0.2176093615976121), FRAC_CONST(0.2355116164824983), FRAC_CONST(0.2541366584185075), FRAC_CONST(0.2734505372545160), FRAC_CONST(0.2934141494343369), FRAC_CONST(0.3139834135200387), FRAC_CONST(0.3351095011824163), FRAC_CONST(0.3567391223361566), FRAC_CONST(0.3788148623608774), FRAC_CONST(0.4012755686250732), FRAC_CONST(0.4240567828288110), FRAC_CONST(0.4470912150133537), FRAC_CONST(0.4703092544619664), FRAC_CONST(0.4936395121456694), FRAC_CONST(0.5170093888596962), FRAC_CONST(0.5403456627591340), FRAC_CONST(0.5635750896430154), FRAC_CONST(0.5866250090612892), FRAC_CONST(0.6094239491338723), FRAC_CONST(0.6319022228794100), FRAC_CONST(0.6539925088563087), FRAC_CONST(0.6756304090216887), FRAC_CONST(0.6967549769155277), FRAC_CONST(0.7173092095766250), FRAC_CONST(0.7372404969921184), FRAC_CONST(0.7565010233699827), FRAC_CONST(0.7750481150999984), FRAC_CONST(0.7928445309277697), FRAC_CONST(0.8098586906021583), FRAC_CONST(0.8260648390616000), FRAC_CONST(0.8414431440907889), FRAC_CONST(0.8559797262966709), FRAC_CONST(0.8696666212110165), FRAC_CONST(0.8825016743142358), FRAC_CONST(0.8944883707784486), FRAC_CONST(0.9056356027326216), FRAC_CONST(0.9159573778427816), FRAC_CONST(0.9254724739583072), FRAC_CONST(0.9342040454819434), FRAC_CONST(0.9421791879559176), FRAC_CONST(0.9494284680976784), FRAC_CONST(0.9559854271440150), FRAC_CONST(0.9618860658493898), FRAC_CONST(0.9671683198119525), FRAC_CONST(0.9718715339497299), FRAC_CONST(0.9760359449042233), FRAC_CONST(0.9797021798981759), FRAC_CONST(0.9829107801140203), FRAC_CONST(0.9857017559923277), FRAC_CONST(0.9881141809867999), FRAC_CONST(0.9901858292742826), FRAC_CONST(0.9919528617340944), FRAC_CONST(0.9934495632180476), FRAC_CONST(0.9947081327749199), FRAC_CONST(0.9957585271195989), FRAC_CONST(0.9966283562984427), FRAC_CONST(0.9973428292485683), FRAC_CONST(0.9979247458259197), FRAC_CONST(0.9983945309245774), FRAC_CONST(0.9987703055583410), FRAC_CONST(0.9990679892449266), FRAC_CONST(0.9993014277313617), FRAC_CONST(0.9994825400228521), FRAC_CONST(0.9996214788122335), FRAC_CONST(0.9997267987294857), FRAC_CONST(0.9998056273097539), FRAC_CONST(0.9998638341781910), FRAC_CONST(0.9999061946325793), FRAC_CONST(0.9999365445321382), FRAC_CONST(0.9999579241373735), FRAC_CONST(0.9999727092594598), FRAC_CONST(0.9999827287418790), FRAC_CONST(0.9999893678912771), FRAC_CONST(0.9999936579844555), FRAC_CONST(0.9999963523959187), FRAC_CONST(0.9999979902130101), FRAC_CONST(0.9999989484358076), FRAC_CONST(0.9999994840031031), FRAC_CONST(0.9999997669534347), FRAC_CONST(0.9999999060327799), FRAC_CONST(0.9999999680107184), FRAC_CONST(0.9999999918774242), FRAC_CONST(0.9999999989770326) }; #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/lt_predict.c000066400000000000000000000141621374350120500165740ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: lt_predict.c,v 1.27 2007/11/01 12:33:31 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef LTP_DEC #include #include "syntax.h" #include "lt_predict.h" #include "filtbank.h" #include "tns.h" /* static function declarations */ static int16_t real_to_int16(real_t sig_in); /* check if the object type is an object type that can have LTP */ uint8_t is_ltp_ot(uint8_t object_type) { #ifdef LTP_DEC if ((object_type == LTP) #ifdef ERROR_RESILIENCE || (object_type == ER_LTP) #endif #ifdef LD_DEC || (object_type == LD) #endif ) { return 1; } #endif return 0; } ALIGN static const real_t codebook[8] = { REAL_CONST(0.570829), REAL_CONST(0.696616), REAL_CONST(0.813004), REAL_CONST(0.911304), REAL_CONST(0.984900), REAL_CONST(1.067894), REAL_CONST(1.194601), REAL_CONST(1.369533) }; void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape, uint8_t win_shape_prev, uint8_t sr_index, uint8_t object_type, uint16_t frame_len) { uint8_t sfb; uint16_t bin, i, num_samples; ALIGN real_t x_est[2048]; ALIGN real_t X_est[2048]; if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) { if (ltp->data_present) { num_samples = frame_len << 1; for(i = 0; i < num_samples; i++) { /* The extra lookback M (N/2 for LD, 0 for LTP) is handled in the buffer updating */ #if 0 x_est[i] = MUL_R_C(lt_pred_stat[num_samples + i - ltp->lag], codebook[ltp->coef]); #else /* lt_pred_stat is a 16 bit int, multiplied with the fixed point real this gives a real for x_est */ x_est[i] = (real_t)lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef]; #endif } filter_bank_ltp(fb, ics->window_sequence, win_shape, win_shape_prev, x_est, X_est, object_type, frame_len); tns_encode_frame(ics, &(ics->tns), sr_index, object_type, X_est, frame_len); for (sfb = 0; sfb < ltp->last_band; sfb++) { if (ltp->long_used[sfb]) { uint16_t low = ics->swb_offset[sfb]; uint16_t high = min(ics->swb_offset[sfb+1], ics->swb_offset_max); for (bin = low; bin < high; bin++) { spec[bin] += X_est[bin]; } } } } } } #ifdef FIXED_POINT static INLINE int16_t real_to_int16(real_t sig_in) { if (sig_in >= 0) { sig_in += (1 << (REAL_BITS-1)); if (sig_in >= REAL_CONST(32768)) return 32767; } else { sig_in += -(1 << (REAL_BITS-1)); if (sig_in <= REAL_CONST(-32768)) return -32768; } return (sig_in >> REAL_BITS); } #else static INLINE int16_t real_to_int16(real_t sig_in) { if (sig_in >= 0) { #ifndef HAS_LRINTF sig_in += 0.5f; #endif if (sig_in >= 32768.0f) return 32767; } else { #ifndef HAS_LRINTF sig_in += -0.5f; #endif if (sig_in <= -32768.0f) return -32768; } return lrintf(sig_in); } #endif void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, uint16_t frame_len, uint8_t object_type) { uint16_t i; /* * The reference point for index i and the content of the buffer * lt_pred_stat are arranged so that lt_pred_stat(0 ... N/2 - 1) contains the * last aliased half window from the IMDCT, and lt_pred_stat(N/2 ... N-1) * is always all zeros. The rest of lt_pred_stat (i<0) contains the previous * fully reconstructed time domain samples, i.e., output of the decoder. * * These values are shifted up by N*2 to avoid (i<0) * * For the LD object type an extra 512 samples lookback is accomodated here. */ #ifdef LD_DEC if (object_type == LD) { for (i = 0; i < frame_len; i++) { lt_pred_stat[i] /* extra 512 */ = lt_pred_stat[i + frame_len]; lt_pred_stat[frame_len + i] = lt_pred_stat[i + (frame_len * 2)]; lt_pred_stat[(frame_len * 2) + i] = real_to_int16(time[i]); lt_pred_stat[(frame_len * 3) + i] = real_to_int16(overlap[i]); } } else { #endif for (i = 0; i < frame_len; i++) { lt_pred_stat[i] = lt_pred_stat[i + frame_len]; lt_pred_stat[frame_len + i] = real_to_int16(time[i]); lt_pred_stat[(frame_len * 2) + i] = real_to_int16(overlap[i]); #if 0 /* set to zero once upon initialisation */ lt_pred_stat[(frame_len * 3) + i] = 0; #endif } #ifdef LD_DEC } #endif } #endif faad2-2_10_0/libfaad/lt_predict.h000066400000000000000000000040551374350120500166010ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: lt_predict.h,v 1.20 2007/11/01 12:33:31 menno Exp $ **/ #ifdef LTP_DEC #ifndef __LT_PREDICT_H__ #define __LT_PREDICT_H__ #ifdef __cplusplus extern "C" { #endif #include "filtbank.h" uint8_t is_ltp_ot(uint8_t object_type); void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape, uint8_t win_shape_prev, uint8_t sr_index, uint8_t object_type, uint16_t frame_len); void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, uint16_t frame_len, uint8_t object_type); #ifdef __cplusplus } #endif #endif #endif faad2-2_10_0/libfaad/mdct.c000066400000000000000000000200761374350120500153730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mdct.c,v 1.47 2007/11/01 12:33:31 menno Exp $ **/ /* * Fast (I)MDCT Implementation using (I)FFT ((Inverse) Fast Fourier Transform) * and consists of three steps: pre-(I)FFT complex multiplication, complex * (I)FFT, post-(I)FFT complex multiplication, * * As described in: * P. Duhamel, Y. Mahieux, and J.P. Petit, "A Fast Algorithm for the * Implementation of Filter Banks Based on 'Time Domain Aliasing * Cancellation'," IEEE Proc. on ICASSP'91, 1991, pp. 2209-2212. * * * As of April 6th 2002 completely rewritten. * This (I)MDCT can now be used for any data size n, where n is divisible by 8. * */ #include "common.h" #include "structs.h" #include #ifdef _WIN32_WCE #define assert(x) #else #include #endif #include "cfft.h" #include "mdct.h" #include "mdct_tab.h" mdct_info *faad_mdct_init(uint16_t N) { mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info)); assert(N % 8 == 0); mdct->N = N; /* NOTE: For "small framelengths" in FIXED_POINT the coefficients need to be * scaled by sqrt("(nearest power of 2) > N" / N) */ /* RE(mdct->sincos[k]) = scale*(real_t)(cos(2.0*M_PI*(k+1./8.) / (real_t)N)); * IM(mdct->sincos[k]) = scale*(real_t)(sin(2.0*M_PI*(k+1./8.) / (real_t)N)); */ /* scale is 1 for fixed point, sqrt(N) for floating point */ switch (N) { case 2048: mdct->sincos = (complex_t*)mdct_tab_2048; break; case 256: mdct->sincos = (complex_t*)mdct_tab_256; break; #ifdef LD_DEC case 1024: mdct->sincos = (complex_t*)mdct_tab_1024; break; #endif #ifdef ALLOW_SMALL_FRAMELENGTH case 1920: mdct->sincos = (complex_t*)mdct_tab_1920; break; case 240: mdct->sincos = (complex_t*)mdct_tab_240; break; #ifdef LD_DEC case 960: mdct->sincos = (complex_t*)mdct_tab_960; break; #endif #endif #ifdef SSR_DEC case 512: mdct->sincos = (complex_t*)mdct_tab_512; break; case 64: mdct->sincos = (complex_t*)mdct_tab_64; break; #endif } /* initialise fft */ mdct->cfft = cffti(N/4); #ifdef PROFILE mdct->cycles = 0; mdct->fft_cycles = 0; #endif return mdct; } void faad_mdct_end(mdct_info *mdct) { if (mdct != NULL) { #ifdef PROFILE printf("MDCT[%.4d]: %I64d cycles\n", mdct->N, mdct->cycles); printf("CFFT[%.4d]: %I64d cycles\n", mdct->N/4, mdct->fft_cycles); #endif cfftu(mdct->cfft); faad_free(mdct); } } void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out) { uint16_t k; complex_t x; #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT real_t scale, b_scale = 0; #endif #endif ALIGN complex_t Z1[512]; complex_t *sincos = mdct->sincos; uint16_t N = mdct->N; uint16_t N2 = N >> 1; uint16_t N4 = N >> 2; uint16_t N8 = N >> 3; #ifdef PROFILE int64_t count1, count2 = faad_get_ts(); #endif #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT /* detect non-power of 2 */ if (N & (N-1)) { /* adjust scale for non-power of 2 MDCT */ /* 2048/1920 */ b_scale = 1; scale = COEF_CONST(1.0666666666666667); } #endif #endif /* pre-IFFT complex multiplication */ for (k = 0; k < N4; k++) { ComplexMult(&IM(Z1[k]), &RE(Z1[k]), X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); } #ifdef PROFILE count1 = faad_get_ts(); #endif /* complex IFFT, any non-scaling FFT can be used here */ cfftb(mdct->cfft, Z1); #ifdef PROFILE count1 = faad_get_ts() - count1; #endif /* post-IFFT complex multiplication */ for (k = 0; k < N4; k++) { RE(x) = RE(Z1[k]); IM(x) = IM(Z1[k]); ComplexMult(&IM(Z1[k]), &RE(Z1[k]), IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT /* non-power of 2 MDCT scaling */ if (b_scale) { RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); } #endif #endif } /* reordering */ for (k = 0; k < N8; k+=2) { X_out[ 2*k] = IM(Z1[N8 + k]); X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); X_out[N4 + 2*k] = RE(Z1[ k]); X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); X_out[N2 + 2*k] = RE(Z1[N8 + k]); X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); } #ifdef PROFILE count2 = faad_get_ts() - count2; mdct->fft_cycles += count1; mdct->cycles += (count2 - count1); #endif } #ifdef LTP_DEC void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out) { uint16_t k; complex_t x; ALIGN complex_t Z1[512]; complex_t *sincos = mdct->sincos; uint16_t N = mdct->N; uint16_t N2 = N >> 1; uint16_t N4 = N >> 2; uint16_t N8 = N >> 3; #ifndef FIXED_POINT real_t scale = REAL_CONST(N); #else real_t scale = REAL_CONST(4.0/N); #endif #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT /* detect non-power of 2 */ if (N & (N-1)) { /* adjust scale for non-power of 2 MDCT */ /* *= sqrt(2048/1920) */ scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); } #endif #endif /* pre-FFT complex multiplication */ for (k = 0; k < N8; k++) { uint16_t n = k << 1; RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; ComplexMult(&RE(Z1[k]), &IM(Z1[k]), RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); RE(x) = X_in[N2 - 1 - n] - X_in[ n]; IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); } /* complex FFT, any non-scaling FFT can be used here */ cfftf(mdct->cfft, Z1); /* post-FFT complex multiplication */ for (k = 0; k < N4; k++) { uint16_t n = k << 1; ComplexMult(&RE(x), &IM(x), RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); X_out[ n] = -RE(x); X_out[N2 - 1 - n] = IM(x); X_out[N2 + n] = -IM(x); X_out[N - 1 - n] = RE(x); } } #endif faad2-2_10_0/libfaad/mdct.h000066400000000000000000000031161374350120500153740ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mdct.h,v 1.30 2007/11/01 12:33:31 menno Exp $ **/ #ifndef __MDCT_H__ #define __MDCT_H__ #ifdef __cplusplus extern "C" { #endif mdct_info *faad_mdct_init(uint16_t N); void faad_mdct_end(mdct_info *mdct); void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out); void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/mdct_tab.h000066400000000000000000007464141374350120500162410ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mdct_tab.h,v 1.7 2007/11/01 12:33:32 menno Exp $ **/ #ifndef __MDCT_TAB_H__ #define __MDCT_TAB_H__ #ifdef __cplusplus extern "C" { #endif #ifdef FIXED_POINT /* 256 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_2048[] = { { FRAC_CONST(0.999999926465718), FRAC_CONST(0.000383495187571) }, { FRAC_CONST(0.999994043728986), FRAC_CONST(0.003451449920136) }, { FRAC_CONST(0.999978748667469), FRAC_CONST(0.006519372166339) }, { FRAC_CONST(0.999954041425130), FRAC_CONST(0.009587233049729) }, { FRAC_CONST(0.999919922234523), FRAC_CONST(0.012655003694430) }, { FRAC_CONST(0.999876391416790), FRAC_CONST(0.015722655225417) }, { FRAC_CONST(0.999823449381662), FRAC_CONST(0.018790158768785) }, { FRAC_CONST(0.999761096627447), FRAC_CONST(0.021857485452022) }, { FRAC_CONST(0.999689333741034), FRAC_CONST(0.024924606404281) }, { FRAC_CONST(0.999608161397882), FRAC_CONST(0.027991492756653) }, { FRAC_CONST(0.999517580362017), FRAC_CONST(0.031058115642435) }, { FRAC_CONST(0.999417591486022), FRAC_CONST(0.034124446197403) }, { FRAC_CONST(0.999308195711029), FRAC_CONST(0.037190455560088) }, { FRAC_CONST(0.999189394066715), FRAC_CONST(0.040256114872041) }, { FRAC_CONST(0.999061187671285), FRAC_CONST(0.043321395278110) }, { FRAC_CONST(0.998923577731466), FRAC_CONST(0.046386267926707) }, { FRAC_CONST(0.998776565542496), FRAC_CONST(0.049450703970085) }, { FRAC_CONST(0.998620152488109), FRAC_CONST(0.052514674564603) }, { FRAC_CONST(0.998454340040525), FRAC_CONST(0.055578150871005) }, { FRAC_CONST(0.998279129760433), FRAC_CONST(0.058641104054683) }, { FRAC_CONST(0.998094523296980), FRAC_CONST(0.061703505285957) }, { FRAC_CONST(0.997900522387752), FRAC_CONST(0.064765325740340) }, { FRAC_CONST(0.997697128858759), FRAC_CONST(0.067826536598811) }, { FRAC_CONST(0.997484344624418), FRAC_CONST(0.070887109048088) }, { FRAC_CONST(0.997262171687536), FRAC_CONST(0.073947014280897) }, { FRAC_CONST(0.997030612139289), FRAC_CONST(0.077006223496246) }, { FRAC_CONST(0.996789668159205), FRAC_CONST(0.080064707899691) }, { FRAC_CONST(0.996539342015138), FRAC_CONST(0.083122438703613) }, { FRAC_CONST(0.996279636063255), FRAC_CONST(0.086179387127485) }, { FRAC_CONST(0.996010552748006), FRAC_CONST(0.089235524398144) }, { FRAC_CONST(0.995732094602106), FRAC_CONST(0.092290821750062) }, { FRAC_CONST(0.995444264246510), FRAC_CONST(0.095345250425618) }, { FRAC_CONST(0.995147064390386), FRAC_CONST(0.098398781675364) }, { FRAC_CONST(0.994840497831093), FRAC_CONST(0.101451386758302) }, { FRAC_CONST(0.994524567454152), FRAC_CONST(0.104503036942151) }, { FRAC_CONST(0.994199276233219), FRAC_CONST(0.107553703503616) }, { FRAC_CONST(0.993864627230060), FRAC_CONST(0.110603357728662) }, { FRAC_CONST(0.993520623594518), FRAC_CONST(0.113651970912782) }, { FRAC_CONST(0.993167268564487), FRAC_CONST(0.116699514361268) }, { FRAC_CONST(0.992804565465879), FRAC_CONST(0.119745959389480) }, { FRAC_CONST(0.992432517712594), FRAC_CONST(0.122791277323117) }, { FRAC_CONST(0.992051128806486), FRAC_CONST(0.125835439498487) }, { FRAC_CONST(0.991660402337333), FRAC_CONST(0.128878417262777) }, { FRAC_CONST(0.991260341982802), FRAC_CONST(0.131920181974320) }, { FRAC_CONST(0.990850951508414), FRAC_CONST(0.134960705002869) }, { FRAC_CONST(0.990432234767506), FRAC_CONST(0.137999957729863) }, { FRAC_CONST(0.990004195701201), FRAC_CONST(0.141037911548698) }, { FRAC_CONST(0.989566838338365), FRAC_CONST(0.144074537864995) }, { FRAC_CONST(0.989120166795573), FRAC_CONST(0.147109808096872) }, { FRAC_CONST(0.988664185277066), FRAC_CONST(0.150143693675208) }, { FRAC_CONST(0.988198898074718), FRAC_CONST(0.153176166043918) }, { FRAC_CONST(0.987724309567987), FRAC_CONST(0.156207196660216) }, { FRAC_CONST(0.987240424223882), FRAC_CONST(0.159236756994888) }, { FRAC_CONST(0.986747246596917), FRAC_CONST(0.162264818532558) }, { FRAC_CONST(0.986244781329065), FRAC_CONST(0.165291352771958) }, { FRAC_CONST(0.985733033149723), FRAC_CONST(0.168316331226195) }, { FRAC_CONST(0.985212006875659), FRAC_CONST(0.171339725423019) }, { FRAC_CONST(0.984681707410971), FRAC_CONST(0.174361506905094) }, { FRAC_CONST(0.984142139747039), FRAC_CONST(0.177381647230260) }, { FRAC_CONST(0.983593308962479), FRAC_CONST(0.180400117971807) }, { FRAC_CONST(0.983035220223096), FRAC_CONST(0.183416890718739) }, { FRAC_CONST(0.982467878781833), FRAC_CONST(0.186431937076042) }, { FRAC_CONST(0.981891289978725), FRAC_CONST(0.189445228664950) }, { FRAC_CONST(0.981305459240845), FRAC_CONST(0.192456737123217) }, { FRAC_CONST(0.980710392082254), FRAC_CONST(0.195466434105377) }, { FRAC_CONST(0.980106094103952), FRAC_CONST(0.198474291283016) }, { FRAC_CONST(0.979492570993821), FRAC_CONST(0.201480280345038) }, { FRAC_CONST(0.978869828526574), FRAC_CONST(0.204484372997927) }, { FRAC_CONST(0.978237872563701), FRAC_CONST(0.207486540966021) }, { FRAC_CONST(0.977596709053412), FRAC_CONST(0.210486755991770) }, { FRAC_CONST(0.976946344030582), FRAC_CONST(0.213484989836008) }, { FRAC_CONST(0.976286783616694), FRAC_CONST(0.216481214278217) }, { FRAC_CONST(0.975618034019782), FRAC_CONST(0.219475401116790) }, { FRAC_CONST(0.974940101534372), FRAC_CONST(0.222467522169302) }, { FRAC_CONST(0.974252992541423), FRAC_CONST(0.225457549272769) }, { FRAC_CONST(0.973556713508266), FRAC_CONST(0.228445454283916) }, { FRAC_CONST(0.972851270988544), FRAC_CONST(0.231431209079446) }, { FRAC_CONST(0.972136671622152), FRAC_CONST(0.234414785556295) }, { FRAC_CONST(0.971412922135171), FRAC_CONST(0.237396155631907) }, { FRAC_CONST(0.970680029339806), FRAC_CONST(0.240375291244489) }, { FRAC_CONST(0.969938000134324), FRAC_CONST(0.243352164353285) }, { FRAC_CONST(0.969186841502986), FRAC_CONST(0.246326746938829) }, { FRAC_CONST(0.968426560515983), FRAC_CONST(0.249299011003218) }, { FRAC_CONST(0.967657164329370), FRAC_CONST(0.252268928570371) }, { FRAC_CONST(0.966878660184996), FRAC_CONST(0.255236471686292) }, { FRAC_CONST(0.966091055410439), FRAC_CONST(0.258201612419335) }, { FRAC_CONST(0.965294357418935), FRAC_CONST(0.261164322860466) }, { FRAC_CONST(0.964488573709308), FRAC_CONST(0.264124575123528) }, { FRAC_CONST(0.963673711865903), FRAC_CONST(0.267082341345496) }, { FRAC_CONST(0.962849779558509), FRAC_CONST(0.270037593686751) }, { FRAC_CONST(0.962016784542291), FRAC_CONST(0.272990304331330) }, { FRAC_CONST(0.961174734657714), FRAC_CONST(0.275940445487197) }, { FRAC_CONST(0.960323637830474), FRAC_CONST(0.278887989386500) }, { FRAC_CONST(0.959463502071418), FRAC_CONST(0.281832908285833) }, { FRAC_CONST(0.958594335476470), FRAC_CONST(0.284775174466498) }, { FRAC_CONST(0.957716146226559), FRAC_CONST(0.287714760234765) }, { FRAC_CONST(0.956828942587535), FRAC_CONST(0.290651637922133) }, { FRAC_CONST(0.955932732910098), FRAC_CONST(0.293585779885591) }, { FRAC_CONST(0.955027525629714), FRAC_CONST(0.296517158507877) }, { FRAC_CONST(0.954113329266539), FRAC_CONST(0.299445746197740) }, { FRAC_CONST(0.953190152425337), FRAC_CONST(0.302371515390196) }, { FRAC_CONST(0.952258003795400), FRAC_CONST(0.305294438546792) }, { FRAC_CONST(0.951316892150466), FRAC_CONST(0.308214488155861) }, { FRAC_CONST(0.950366826348636), FRAC_CONST(0.311131636732785) }, { FRAC_CONST(0.949407815332292), FRAC_CONST(0.314045856820251) }, { FRAC_CONST(0.948439868128010), FRAC_CONST(0.316957120988508) }, { FRAC_CONST(0.947462993846478), FRAC_CONST(0.319865401835631) }, { FRAC_CONST(0.946477201682409), FRAC_CONST(0.322770671987771) }, { FRAC_CONST(0.945482500914454), FRAC_CONST(0.325672904099420) }, { FRAC_CONST(0.944478900905116), FRAC_CONST(0.328572070853664) }, { FRAC_CONST(0.943466411100659), FRAC_CONST(0.331468144962441) }, { FRAC_CONST(0.942445041031025), FRAC_CONST(0.334361099166799) }, { FRAC_CONST(0.941414800309736), FRAC_CONST(0.337250906237151) }, { FRAC_CONST(0.940375698633812), FRAC_CONST(0.340137538973532) }, { FRAC_CONST(0.939327745783671), FRAC_CONST(0.343020970205856) }, { FRAC_CONST(0.938270951623047), FRAC_CONST(0.345901172794169) }, { FRAC_CONST(0.937205326098888), FRAC_CONST(0.348778119628908) }, { FRAC_CONST(0.936130879241267), FRAC_CONST(0.351651783631155) }, { FRAC_CONST(0.935047621163287), FRAC_CONST(0.354522137752887) }, { FRAC_CONST(0.933955562060987), FRAC_CONST(0.357389154977241) }, { FRAC_CONST(0.932854712213241), FRAC_CONST(0.360252808318757) }, { FRAC_CONST(0.931745081981669), FRAC_CONST(0.363113070823639) }, { FRAC_CONST(0.930626681810532), FRAC_CONST(0.365969915570009) }, { FRAC_CONST(0.929499522226639), FRAC_CONST(0.368823315668154) }, { FRAC_CONST(0.928363613839244), FRAC_CONST(0.371673244260787) }, { FRAC_CONST(0.927218967339952), FRAC_CONST(0.374519674523293) }, { FRAC_CONST(0.926065593502609), FRAC_CONST(0.377362579663988) }, { FRAC_CONST(0.924903503183211), FRAC_CONST(0.380201932924366) }, { FRAC_CONST(0.923732707319793), FRAC_CONST(0.383037707579352) }, { FRAC_CONST(0.922553216932333), FRAC_CONST(0.385869876937555) }, { FRAC_CONST(0.921365043122642), FRAC_CONST(0.388698414341519) }, { FRAC_CONST(0.920168197074266), FRAC_CONST(0.391523293167972) }, { FRAC_CONST(0.918962690052376), FRAC_CONST(0.394344486828080) }, { FRAC_CONST(0.917748533403661), FRAC_CONST(0.397161968767692) }, { FRAC_CONST(0.916525738556228), FRAC_CONST(0.399975712467595) }, { FRAC_CONST(0.915294317019487), FRAC_CONST(0.402785691443764) }, { FRAC_CONST(0.914054280384047), FRAC_CONST(0.405591879247604) }, { FRAC_CONST(0.912805640321604), FRAC_CONST(0.408394249466208) }, { FRAC_CONST(0.911548408584834), FRAC_CONST(0.411192775722600) }, { FRAC_CONST(0.910282597007282), FRAC_CONST(0.413987431675985) }, { FRAC_CONST(0.909008217503247), FRAC_CONST(0.416778191021998) }, { FRAC_CONST(0.907725282067676), FRAC_CONST(0.419565027492947) }, { FRAC_CONST(0.906433802776045), FRAC_CONST(0.422347914858067) }, { FRAC_CONST(0.905133791784250), FRAC_CONST(0.425126826923762) }, { FRAC_CONST(0.903825261328488), FRAC_CONST(0.427901737533854) }, { FRAC_CONST(0.902508223725146), FRAC_CONST(0.430672620569827) }, { FRAC_CONST(0.901182691370685), FRAC_CONST(0.433439449951074) }, { FRAC_CONST(0.899848676741519), FRAC_CONST(0.436202199635144) }, { FRAC_CONST(0.898506192393902), FRAC_CONST(0.438960843617984) }, { FRAC_CONST(0.897155250963809), FRAC_CONST(0.441715355934187) }, { FRAC_CONST(0.895795865166814), FRAC_CONST(0.444465710657234) }, { FRAC_CONST(0.894428047797974), FRAC_CONST(0.447211881899738) }, { FRAC_CONST(0.893051811731707), FRAC_CONST(0.449953843813691) }, { FRAC_CONST(0.891667169921672), FRAC_CONST(0.452691570590701) }, { FRAC_CONST(0.890274135400645), FRAC_CONST(0.455425036462242) }, { FRAC_CONST(0.888872721280396), FRAC_CONST(0.458154215699893) }, { FRAC_CONST(0.887462940751569), FRAC_CONST(0.460879082615579) }, { FRAC_CONST(0.886044807083556), FRAC_CONST(0.463599611561814) }, { FRAC_CONST(0.884618333624370), FRAC_CONST(0.466315776931944) }, { FRAC_CONST(0.883183533800523), FRAC_CONST(0.469027553160387) }, { FRAC_CONST(0.881740421116898), FRAC_CONST(0.471734914722871) }, { FRAC_CONST(0.880289009156621), FRAC_CONST(0.474437836136679) }, { FRAC_CONST(0.878829311580933), FRAC_CONST(0.477136291960885) }, { FRAC_CONST(0.877361342129065), FRAC_CONST(0.479830256796594) }, { FRAC_CONST(0.875885114618104), FRAC_CONST(0.482519705287184) }, { FRAC_CONST(0.874400642942865), FRAC_CONST(0.485204612118542) }, { FRAC_CONST(0.872907941075761), FRAC_CONST(0.487884952019301) }, { FRAC_CONST(0.871407023066671), FRAC_CONST(0.490560699761082) }, { FRAC_CONST(0.869897903042806), FRAC_CONST(0.493231830158728) }, { FRAC_CONST(0.868380595208580), FRAC_CONST(0.495898318070542) }, { FRAC_CONST(0.866855113845470), FRAC_CONST(0.498560138398525) }, { FRAC_CONST(0.865321473311890), FRAC_CONST(0.501217266088610) }, { FRAC_CONST(0.863779688043047), FRAC_CONST(0.503869676130899) }, { FRAC_CONST(0.862229772550811), FRAC_CONST(0.506517343559899) }, { FRAC_CONST(0.860671741423578), FRAC_CONST(0.509160243454755) }, { FRAC_CONST(0.859105609326130), FRAC_CONST(0.511798350939487) }, { FRAC_CONST(0.857531390999499), FRAC_CONST(0.514431641183223) }, { FRAC_CONST(0.855949101260827), FRAC_CONST(0.517060089400432) }, { FRAC_CONST(0.854358755003227), FRAC_CONST(0.519683670851158) }, { FRAC_CONST(0.852760367195645), FRAC_CONST(0.522302360841255) }, { FRAC_CONST(0.851153952882715), FRAC_CONST(0.524916134722613) }, { FRAC_CONST(0.849539527184621), FRAC_CONST(0.527524967893398) }, { FRAC_CONST(0.847917105296951), FRAC_CONST(0.530128835798279) }, { FRAC_CONST(0.846286702490560), FRAC_CONST(0.532727713928659) }, { FRAC_CONST(0.844648334111418), FRAC_CONST(0.535321577822907) }, { FRAC_CONST(0.843002015580473), FRAC_CONST(0.537910403066589) }, { FRAC_CONST(0.841347762393502), FRAC_CONST(0.540494165292695) }, { FRAC_CONST(0.839685590120966), FRAC_CONST(0.543072840181872) }, { FRAC_CONST(0.838015514407864), FRAC_CONST(0.545646403462649) }, { FRAC_CONST(0.836337550973584), FRAC_CONST(0.548214830911668) }, { FRAC_CONST(0.834651715611756), FRAC_CONST(0.550778098353912) }, { FRAC_CONST(0.832958024190107), FRAC_CONST(0.553336181662932) }, { FRAC_CONST(0.831256492650303), FRAC_CONST(0.555889056761074) }, { FRAC_CONST(0.829547137007809), FRAC_CONST(0.558436699619704) }, { FRAC_CONST(0.827829973351730), FRAC_CONST(0.560979086259438) }, { FRAC_CONST(0.826105017844665), FRAC_CONST(0.563516192750365) }, { FRAC_CONST(0.824372286722551), FRAC_CONST(0.566047995212271) }, { FRAC_CONST(0.822631796294515), FRAC_CONST(0.568574469814869) }, { FRAC_CONST(0.820883562942715), FRAC_CONST(0.571095592778017) }, { FRAC_CONST(0.819127603122188), FRAC_CONST(0.573611340371945) }, { FRAC_CONST(0.817363933360698), FRAC_CONST(0.576121688917478) }, { FRAC_CONST(0.815592570258577), FRAC_CONST(0.578626614786261) }, { FRAC_CONST(0.813813530488567), FRAC_CONST(0.581126094400978) }, { FRAC_CONST(0.812026830795670), FRAC_CONST(0.583620104235573) }, { FRAC_CONST(0.810232487996982), FRAC_CONST(0.586108620815476) }, { FRAC_CONST(0.808430518981543), FRAC_CONST(0.588591620717823) }, { FRAC_CONST(0.806620940710170), FRAC_CONST(0.591069080571671) }, { FRAC_CONST(0.804803770215303), FRAC_CONST(0.593540977058226) }, { FRAC_CONST(0.802979024600843), FRAC_CONST(0.596007286911057) }, { FRAC_CONST(0.801146721041991), FRAC_CONST(0.598467986916314) }, { FRAC_CONST(0.799306876785086), FRAC_CONST(0.600923053912954) }, { FRAC_CONST(0.797459509147442), FRAC_CONST(0.603372464792950) }, { FRAC_CONST(0.795604635517188), FRAC_CONST(0.605816196501515) }, { FRAC_CONST(0.793742273353100), FRAC_CONST(0.608254226037314) }, { FRAC_CONST(0.791872440184440), FRAC_CONST(0.610686530452686) }, { FRAC_CONST(0.789995153610791), FRAC_CONST(0.613113086853855) }, { FRAC_CONST(0.788110431301888), FRAC_CONST(0.615533872401147) }, { FRAC_CONST(0.786218290997456), FRAC_CONST(0.617948864309208) }, { FRAC_CONST(0.784318750507039), FRAC_CONST(0.620358039847214) }, { FRAC_CONST(0.782411827709837), FRAC_CONST(0.622761376339086) }, { FRAC_CONST(0.780497540554532), FRAC_CONST(0.625158851163708) }, { FRAC_CONST(0.778575907059125), FRAC_CONST(0.627550441755132) }, { FRAC_CONST(0.776646945310762), FRAC_CONST(0.629936125602796) }, { FRAC_CONST(0.774710673465566), FRAC_CONST(0.632315880251738) }, { FRAC_CONST(0.772767109748464), FRAC_CONST(0.634689683302798) }, { FRAC_CONST(0.770816272453019), FRAC_CONST(0.637057512412839) }, { FRAC_CONST(0.768858179941253), FRAC_CONST(0.639419345294951) }, { FRAC_CONST(0.766892850643481), FRAC_CONST(0.641775159718664) }, { FRAC_CONST(0.764920303058128), FRAC_CONST(0.644124933510155) }, { FRAC_CONST(0.762940555751566), FRAC_CONST(0.646468644552458) }, { FRAC_CONST(0.760953627357928), FRAC_CONST(0.648806270785673) }, { FRAC_CONST(0.758959536578942), FRAC_CONST(0.651137790207170) }, { FRAC_CONST(0.756958302183750), FRAC_CONST(0.653463180871802) }, { FRAC_CONST(0.754949943008733), FRAC_CONST(0.655782420892106) }, { FRAC_CONST(0.752934477957330), FRAC_CONST(0.658095488438511) }, { FRAC_CONST(0.750911925999868), FRAC_CONST(0.660402361739545) }, { FRAC_CONST(0.748882306173375), FRAC_CONST(0.662703019082037) }, { FRAC_CONST(0.746845637581407), FRAC_CONST(0.664997438811325) }, { FRAC_CONST(0.744801939393863), FRAC_CONST(0.667285599331456) }, { FRAC_CONST(0.742751230846809), FRAC_CONST(0.669567479105392) }, { FRAC_CONST(0.740693531242296), FRAC_CONST(0.671843056655212) }, { FRAC_CONST(0.738628859948175), FRAC_CONST(0.674112310562312) }, { FRAC_CONST(0.736557236397919), FRAC_CONST(0.676375219467612) }, { FRAC_CONST(0.734478680090438), FRAC_CONST(0.678631762071749) }, { FRAC_CONST(0.732393210589896), FRAC_CONST(0.680881917135287) }, { FRAC_CONST(0.730300847525525), FRAC_CONST(0.683125663478909) }, { FRAC_CONST(0.728201610591445), FRAC_CONST(0.685362979983619) }, { FRAC_CONST(0.726095519546471), FRAC_CONST(0.687593845590942) }, { FRAC_CONST(0.723982594213936), FRAC_CONST(0.689818239303122) }, { FRAC_CONST(0.721862854481496), FRAC_CONST(0.692036140183319) }, { FRAC_CONST(0.719736320300951), FRAC_CONST(0.694247527355803) }, { FRAC_CONST(0.717603011688049), FRAC_CONST(0.696452380006158) }, { FRAC_CONST(0.715462948722304), FRAC_CONST(0.698650677381469) }, { FRAC_CONST(0.713316151546803), FRAC_CONST(0.700842398790526) }, { FRAC_CONST(0.711162640368018), FRAC_CONST(0.703027523604011) }, { FRAC_CONST(0.709002435455618), FRAC_CONST(0.705206031254698) }, { FRAC_CONST(0.706835557142274), FRAC_CONST(0.707377901237642) }, { FRAC_CONST(0.704662025823469), FRAC_CONST(0.709543113110377) }, { FRAC_CONST(0.702481861957308), FRAC_CONST(0.711701646493103) }, { FRAC_CONST(0.700295086064324), FRAC_CONST(0.713853481068882) }, { FRAC_CONST(0.698101718727284), FRAC_CONST(0.715998596583829) }, { FRAC_CONST(0.695901780590997), FRAC_CONST(0.718136972847297) }, { FRAC_CONST(0.693695292362118), FRAC_CONST(0.720268589732077) }, { FRAC_CONST(0.691482274808956), FRAC_CONST(0.722393427174578) }, { FRAC_CONST(0.689262748761273), FRAC_CONST(0.724511465175020) }, { FRAC_CONST(0.687036735110096), FRAC_CONST(0.726622683797623) }, { FRAC_CONST(0.684804254807511), FRAC_CONST(0.728727063170794) }, { FRAC_CONST(0.682565328866473), FRAC_CONST(0.730824583487312) }, { FRAC_CONST(0.680319978360607), FRAC_CONST(0.732915225004518) }, { FRAC_CONST(0.678068224424007), FRAC_CONST(0.734998968044497) }, { FRAC_CONST(0.675810088251037), FRAC_CONST(0.737075792994266) }, { FRAC_CONST(0.673545591096136), FRAC_CONST(0.739145680305957) }, { FRAC_CONST(0.671274754273613), FRAC_CONST(0.741208610497004) }, { FRAC_CONST(0.668997599157450), FRAC_CONST(0.743264564150321) }, { FRAC_CONST(0.666714147181098), FRAC_CONST(0.745313521914490) }, { FRAC_CONST(0.664424419837275), FRAC_CONST(0.747355464503940) }, { FRAC_CONST(0.662128438677769), FRAC_CONST(0.749390372699130) }, { FRAC_CONST(0.659826225313227), FRAC_CONST(0.751418227346727) }, { FRAC_CONST(0.657517801412960), FRAC_CONST(0.753439009359794) }, { FRAC_CONST(0.655203188704732), FRAC_CONST(0.755452699717958) }, { FRAC_CONST(0.652882408974559), FRAC_CONST(0.757459279467601) }, { FRAC_CONST(0.650555484066504), FRAC_CONST(0.759458729722028) }, { FRAC_CONST(0.648222435882470), FRAC_CONST(0.761451031661654) }, { FRAC_CONST(0.645883286381996), FRAC_CONST(0.763436166534172) }, { FRAC_CONST(0.643538057582048), FRAC_CONST(0.765414115654738) }, { FRAC_CONST(0.641186771556811), FRAC_CONST(0.767384860406142) }, { FRAC_CONST(0.638829450437486), FRAC_CONST(0.769348382238982) }, { FRAC_CONST(0.636466116412077), FRAC_CONST(0.771304662671845) }, { FRAC_CONST(0.634096791725184), FRAC_CONST(0.773253683291473) }, { FRAC_CONST(0.631721498677792), FRAC_CONST(0.775195425752941) }, { FRAC_CONST(0.629340259627066), FRAC_CONST(0.777129871779832) }, { FRAC_CONST(0.626953096986133), FRAC_CONST(0.779057003164401) }, { FRAC_CONST(0.624560033223877), FRAC_CONST(0.780976801767754) }, { FRAC_CONST(0.622161090864727), FRAC_CONST(0.782889249520015) }, { FRAC_CONST(0.619756292488441), FRAC_CONST(0.784794328420499) }, { FRAC_CONST(0.617345660729897), FRAC_CONST(0.786692020537877) }, { FRAC_CONST(0.614929218278880), FRAC_CONST(0.788582308010347) }, { FRAC_CONST(0.612506987879866), FRAC_CONST(0.790465173045805) }, { FRAC_CONST(0.610078992331810), FRAC_CONST(0.792340597922007) }, { FRAC_CONST(0.607645254487931), FRAC_CONST(0.794208564986741) }, { FRAC_CONST(0.605205797255497), FRAC_CONST(0.796069056657988) }, { FRAC_CONST(0.602760643595607), FRAC_CONST(0.797922055424093) }, { FRAC_CONST(0.600309816522980), FRAC_CONST(0.799767543843926) }, { FRAC_CONST(0.597853339105734), FRAC_CONST(0.801605504547046) }, { FRAC_CONST(0.595391234465169), FRAC_CONST(0.803435920233868) }, { FRAC_CONST(0.592923525775551), FRAC_CONST(0.805258773675822) }, { FRAC_CONST(0.590450236263896), FRAC_CONST(0.807074047715518) }, { FRAC_CONST(0.587971389209745), FRAC_CONST(0.808881725266904) }, { FRAC_CONST(0.585487007944951), FRAC_CONST(0.810681789315431) }, { FRAC_CONST(0.582997115853458), FRAC_CONST(0.812474222918210) }, { FRAC_CONST(0.580501736371077), FRAC_CONST(0.814259009204175) }, { FRAC_CONST(0.578000892985270), FRAC_CONST(0.816036131374237) }, { FRAC_CONST(0.575494609234928), FRAC_CONST(0.817805572701444) }, { FRAC_CONST(0.572982908710149), FRAC_CONST(0.819567316531142) }, { FRAC_CONST(0.570465815052013), FRAC_CONST(0.821321346281127) }, { FRAC_CONST(0.567943351952366), FRAC_CONST(0.823067645441802) }, { FRAC_CONST(0.565415543153590), FRAC_CONST(0.824806197576334) }, { FRAC_CONST(0.562882412448385), FRAC_CONST(0.826536986320810) }, { FRAC_CONST(0.560343983679541), FRAC_CONST(0.828259995384386) }, { FRAC_CONST(0.557800280739717), FRAC_CONST(0.829975208549444) }, { FRAC_CONST(0.555251327571214), FRAC_CONST(0.831682609671745) }, { FRAC_CONST(0.552697148165750), FRAC_CONST(0.833382182680580) }, { FRAC_CONST(0.550137766564234), FRAC_CONST(0.835073911578919) }, { FRAC_CONST(0.547573206856540), FRAC_CONST(0.836757780443567) }, { FRAC_CONST(0.545003493181281), FRAC_CONST(0.838433773425308) }, { FRAC_CONST(0.542428649725581), FRAC_CONST(0.840101874749058) }, { FRAC_CONST(0.539848700724848), FRAC_CONST(0.841762068714012) }, { FRAC_CONST(0.537263670462543), FRAC_CONST(0.843414339693793) }, { FRAC_CONST(0.534673583269956), FRAC_CONST(0.845058672136595) }, { FRAC_CONST(0.532078463525974), FRAC_CONST(0.846695050565337) }, { FRAC_CONST(0.529478335656852), FRAC_CONST(0.848323459577802) }, { FRAC_CONST(0.526873224135985), FRAC_CONST(0.849943883846782) }, { FRAC_CONST(0.524263153483673), FRAC_CONST(0.851556308120229) }, { FRAC_CONST(0.521648148266897), FRAC_CONST(0.853160717221390) }, { FRAC_CONST(0.519028233099081), FRAC_CONST(0.854757096048957) }, { FRAC_CONST(0.516403432639864), FRAC_CONST(0.856345429577204) }, { FRAC_CONST(0.513773771594868), FRAC_CONST(0.857925702856130) }, { FRAC_CONST(0.511139274715464), FRAC_CONST(0.859497901011602) }, { FRAC_CONST(0.508499966798541), FRAC_CONST(0.861062009245491) }, { FRAC_CONST(0.505855872686269), FRAC_CONST(0.862618012835817) }, { FRAC_CONST(0.503207017265869), FRAC_CONST(0.864165897136879) }, { FRAC_CONST(0.500553425469378), FRAC_CONST(0.865705647579402) }, { FRAC_CONST(0.497895122273411), FRAC_CONST(0.867237249670668) }, { FRAC_CONST(0.495232132698931), FRAC_CONST(0.868760688994655) }, { FRAC_CONST(0.492564481811011), FRAC_CONST(0.870275951212172) }, { FRAC_CONST(0.489892194718595), FRAC_CONST(0.871783022060993) }, { FRAC_CONST(0.487215296574269), FRAC_CONST(0.873281887355994) }, { FRAC_CONST(0.484533812574016), FRAC_CONST(0.874772532989284) }, { FRAC_CONST(0.481847767956986), FRAC_CONST(0.876254944930338) }, { FRAC_CONST(0.479157188005253), FRAC_CONST(0.877729109226132) }, { FRAC_CONST(0.476462098043581), FRAC_CONST(0.879195012001267) }, { FRAC_CONST(0.473762523439183), FRAC_CONST(0.880652639458111) }, { FRAC_CONST(0.471058489601483), FRAC_CONST(0.882101977876918) }, { FRAC_CONST(0.468350021981877), FRAC_CONST(0.883543013615962) }, { FRAC_CONST(0.465637146073494), FRAC_CONST(0.884975733111667) }, { FRAC_CONST(0.462919887410955), FRAC_CONST(0.886400122878730) }, { FRAC_CONST(0.460198271570134), FRAC_CONST(0.887816169510255) }, { FRAC_CONST(0.457472324167916), FRAC_CONST(0.889223859677868) }, { FRAC_CONST(0.454742070861955), FRAC_CONST(0.890623180131856) }, { FRAC_CONST(0.452007537350437), FRAC_CONST(0.892014117701280) }, { FRAC_CONST(0.449268749371830), FRAC_CONST(0.893396659294108) }, { FRAC_CONST(0.446525732704651), FRAC_CONST(0.894770791897330) }, { FRAC_CONST(0.443778513167218), FRAC_CONST(0.896136502577087) }, { FRAC_CONST(0.441027116617407), FRAC_CONST(0.897493778478790) }, { FRAC_CONST(0.438271568952410), FRAC_CONST(0.898842606827242) }, { FRAC_CONST(0.435511896108492), FRAC_CONST(0.900182974926757) }, { FRAC_CONST(0.432748124060744), FRAC_CONST(0.901514870161279) }, { FRAC_CONST(0.429980278822841), FRAC_CONST(0.902838279994503) }, { FRAC_CONST(0.427208386446796), FRAC_CONST(0.904153191969992) }, { FRAC_CONST(0.424432473022717), FRAC_CONST(0.905459593711293) }, { FRAC_CONST(0.421652564678558), FRAC_CONST(0.906757472922057) }, { FRAC_CONST(0.418868687579875), FRAC_CONST(0.908046817386148) }, { FRAC_CONST(0.416080867929579), FRAC_CONST(0.909327614967767) }, { FRAC_CONST(0.413289131967691), FRAC_CONST(0.910599853611559) }, { FRAC_CONST(0.410493505971093), FRAC_CONST(0.911863521342729) }, { FRAC_CONST(0.407694016253280), FRAC_CONST(0.913118606267154) }, { FRAC_CONST(0.404890689164118), FRAC_CONST(0.914365096571498) }, { FRAC_CONST(0.402083551089587), FRAC_CONST(0.915602980523320) }, { FRAC_CONST(0.399272628451541), FRAC_CONST(0.916832246471184) }, { FRAC_CONST(0.396457947707454), FRAC_CONST(0.918052882844770) }, { FRAC_CONST(0.393639535350173), FRAC_CONST(0.919264878154985) }, { FRAC_CONST(0.390817417907669), FRAC_CONST(0.920468220994067) }, { FRAC_CONST(0.387991621942785), FRAC_CONST(0.921662900035695) }, { FRAC_CONST(0.385162174052990), FRAC_CONST(0.922848904035094) }, { FRAC_CONST(0.382329100870125), FRAC_CONST(0.924026221829144) }, { FRAC_CONST(0.379492429060153), FRAC_CONST(0.925194842336480) }, { FRAC_CONST(0.376652185322910), FRAC_CONST(0.926354754557603) }, { FRAC_CONST(0.373808396391851), FRAC_CONST(0.927505947574975) }, { FRAC_CONST(0.370961089033802), FRAC_CONST(0.928648410553131) }, { FRAC_CONST(0.368110290048703), FRAC_CONST(0.929782132738772) }, { FRAC_CONST(0.365256026269360), FRAC_CONST(0.930907103460875) }, { FRAC_CONST(0.362398324561191), FRAC_CONST(0.932023312130786) }, { FRAC_CONST(0.359537211821973), FRAC_CONST(0.933130748242325) }, { FRAC_CONST(0.356672714981588), FRAC_CONST(0.934229401371881) }, { FRAC_CONST(0.353804861001772), FRAC_CONST(0.935319261178512) }, { FRAC_CONST(0.350933676875858), FRAC_CONST(0.936400317404042) }, { FRAC_CONST(0.348059189628526), FRAC_CONST(0.937472559873159) }, { FRAC_CONST(0.345181426315543), FRAC_CONST(0.938535978493509) }, { FRAC_CONST(0.342300414023514), FRAC_CONST(0.939590563255789) }, { FRAC_CONST(0.339416179869623), FRAC_CONST(0.940636304233848) }, { FRAC_CONST(0.336528751001382), FRAC_CONST(0.941673191584771) }, { FRAC_CONST(0.333638154596371), FRAC_CONST(0.942701215548982) }, { FRAC_CONST(0.330744417861983), FRAC_CONST(0.943720366450326) }, { FRAC_CONST(0.327847568035171), FRAC_CONST(0.944730634696168) }, { FRAC_CONST(0.324947632382188), FRAC_CONST(0.945732010777477) }, { FRAC_CONST(0.322044638198335), FRAC_CONST(0.946724485268921) }, { FRAC_CONST(0.319138612807696), FRAC_CONST(0.947708048828952) }, { FRAC_CONST(0.316229583562890), FRAC_CONST(0.948682692199895) }, { FRAC_CONST(0.313317577844809), FRAC_CONST(0.949648406208035) }, { FRAC_CONST(0.310402623062359), FRAC_CONST(0.950605181763705) }, { FRAC_CONST(0.307484746652204), FRAC_CONST(0.951553009861369) }, { FRAC_CONST(0.304563976078509), FRAC_CONST(0.952491881579706) }, { FRAC_CONST(0.301640338832679), FRAC_CONST(0.953421788081700) }, { FRAC_CONST(0.298713862433100), FRAC_CONST(0.954342720614716) }, { FRAC_CONST(0.295784574424884), FRAC_CONST(0.955254670510587) }, { FRAC_CONST(0.292852502379605), FRAC_CONST(0.956157629185692) }, { FRAC_CONST(0.289917673895041), FRAC_CONST(0.957051588141041) }, { FRAC_CONST(0.286980116594916), FRAC_CONST(0.957936538962351) }, { FRAC_CONST(0.284039858128637), FRAC_CONST(0.958812473320129) }, { FRAC_CONST(0.281096926171038), FRAC_CONST(0.959679382969747) }, { FRAC_CONST(0.278151348422115), FRAC_CONST(0.960537259751520) }, { FRAC_CONST(0.275203152606767), FRAC_CONST(0.961386095590786) }, { FRAC_CONST(0.272252366474537), FRAC_CONST(0.962225882497979) }, { FRAC_CONST(0.269299017799346), FRAC_CONST(0.963056612568704) }, { FRAC_CONST(0.266343134379238), FRAC_CONST(0.963878277983814) }, { FRAC_CONST(0.263384744036113), FRAC_CONST(0.964690871009481) }, { FRAC_CONST(0.260423874615468), FRAC_CONST(0.965494383997270) }, { FRAC_CONST(0.257460553986133), FRAC_CONST(0.966288809384210) }, { FRAC_CONST(0.254494810040011), FRAC_CONST(0.967074139692867) }, { FRAC_CONST(0.251526670691813), FRAC_CONST(0.967850367531414) }, { FRAC_CONST(0.248556163878797), FRAC_CONST(0.968617485593698) }, { FRAC_CONST(0.245583317560504), FRAC_CONST(0.969375486659311) }, { FRAC_CONST(0.242608159718497), FRAC_CONST(0.970124363593660) }, { FRAC_CONST(0.239630718356094), FRAC_CONST(0.970864109348029) }, { FRAC_CONST(0.236651021498106), FRAC_CONST(0.971594716959650) }, { FRAC_CONST(0.233669097190577), FRAC_CONST(0.972316179551765) }, { FRAC_CONST(0.230684973500512), FRAC_CONST(0.973028490333694) }, { FRAC_CONST(0.227698678515621), FRAC_CONST(0.973731642600896) }, { FRAC_CONST(0.224710240344050), FRAC_CONST(0.974425629735035) }, { FRAC_CONST(0.221719687114115), FRAC_CONST(0.975110445204039) }, { FRAC_CONST(0.218727046974045), FRAC_CONST(0.975786082562164) }, { FRAC_CONST(0.215732348091706), FRAC_CONST(0.976452535450054) }, { FRAC_CONST(0.212735618654346), FRAC_CONST(0.977109797594801) }, { FRAC_CONST(0.209736886868323), FRAC_CONST(0.977757862810003) }, { FRAC_CONST(0.206736180958844), FRAC_CONST(0.978396724995823) }, { FRAC_CONST(0.203733529169694), FRAC_CONST(0.979026378139048) }, { FRAC_CONST(0.200728959762976), FRAC_CONST(0.979646816313141) }, { FRAC_CONST(0.197722501018842), FRAC_CONST(0.980258033678304) }, { FRAC_CONST(0.194714181235226), FRAC_CONST(0.980860024481524) }, { FRAC_CONST(0.191704028727580), FRAC_CONST(0.981452783056636) }, { FRAC_CONST(0.188692071828605), FRAC_CONST(0.982036303824369) }, { FRAC_CONST(0.185678338887988), FRAC_CONST(0.982610581292405) }, { FRAC_CONST(0.182662858272129), FRAC_CONST(0.983175610055424) }, { FRAC_CONST(0.179645658363882), FRAC_CONST(0.983731384795162) }, { FRAC_CONST(0.176626767562281), FRAC_CONST(0.984277900280454) }, { FRAC_CONST(0.173606214282275), FRAC_CONST(0.984815151367289) }, { FRAC_CONST(0.170584026954464), FRAC_CONST(0.985343132998855) }, { FRAC_CONST(0.167560234024824), FRAC_CONST(0.985861840205587) }, { FRAC_CONST(0.164534863954446), FRAC_CONST(0.986371268105216) }, { FRAC_CONST(0.161507945219266), FRAC_CONST(0.986871411902812) }, { FRAC_CONST(0.158479506309796), FRAC_CONST(0.987362266890832) }, { FRAC_CONST(0.155449575730856), FRAC_CONST(0.987843828449162) }, { FRAC_CONST(0.152418182001307), FRAC_CONST(0.988316092045160) }, { FRAC_CONST(0.149385353653780), FRAC_CONST(0.988779053233702) }, { FRAC_CONST(0.146351119234411), FRAC_CONST(0.989232707657220) }, { FRAC_CONST(0.143315507302572), FRAC_CONST(0.989677051045747) }, { FRAC_CONST(0.140278546430595), FRAC_CONST(0.990112079216954) }, { FRAC_CONST(0.137240265203516), FRAC_CONST(0.990537788076189) }, { FRAC_CONST(0.134200692218792), FRAC_CONST(0.990954173616519) }, { FRAC_CONST(0.131159856086043), FRAC_CONST(0.991361231918763) }, { FRAC_CONST(0.128117785426777), FRAC_CONST(0.991758959151536) }, { FRAC_CONST(0.125074508874121), FRAC_CONST(0.992147351571276) }, { FRAC_CONST(0.122030055072553), FRAC_CONST(0.992526405522286) }, { FRAC_CONST(0.118984452677633), FRAC_CONST(0.992896117436766) }, { FRAC_CONST(0.115937730355728), FRAC_CONST(0.993256483834846) }, { FRAC_CONST(0.112889916783750), FRAC_CONST(0.993607501324622) }, { FRAC_CONST(0.109841040648883), FRAC_CONST(0.993949166602181) }, { FRAC_CONST(0.106791130648307), FRAC_CONST(0.994281476451642) }, { FRAC_CONST(0.103740215488939), FRAC_CONST(0.994604427745176) }, { FRAC_CONST(0.100688323887154), FRAC_CONST(0.994918017443043) }, { FRAC_CONST(0.097635484568517), FRAC_CONST(0.995222242593618) }, { FRAC_CONST(0.094581726267515), FRAC_CONST(0.995517100333418) }, { FRAC_CONST(0.091527077727285), FRAC_CONST(0.995802587887129) }, { FRAC_CONST(0.088471567699341), FRAC_CONST(0.996078702567634) }, { FRAC_CONST(0.085415224943307), FRAC_CONST(0.996345441776036) }, { FRAC_CONST(0.082358078226647), FRAC_CONST(0.996602803001684) }, { FRAC_CONST(0.079300156324388), FRAC_CONST(0.996850783822197) }, { FRAC_CONST(0.076241488018856), FRAC_CONST(0.997089381903483) }, { FRAC_CONST(0.073182102099403), FRAC_CONST(0.997318594999769) }, { FRAC_CONST(0.070122027362134), FRAC_CONST(0.997538420953611) }, { FRAC_CONST(0.067061292609637), FRAC_CONST(0.997748857695926) }, { FRAC_CONST(0.063999926650714), FRAC_CONST(0.997949903246001) }, { FRAC_CONST(0.060937958300107), FRAC_CONST(0.998141555711521) }, { FRAC_CONST(0.057875416378229), FRAC_CONST(0.998323813288578) }, { FRAC_CONST(0.054812329710890), FRAC_CONST(0.998496674261695) }, { FRAC_CONST(0.051748727129028), FRAC_CONST(0.998660137003838) }, { FRAC_CONST(0.048684637468439), FRAC_CONST(0.998814199976435) }, { FRAC_CONST(0.045620089569500), FRAC_CONST(0.998958861729386) }, { FRAC_CONST(0.042555112276904), FRAC_CONST(0.999094120901079) }, { FRAC_CONST(0.039489734439384), FRAC_CONST(0.999219976218404) }, { FRAC_CONST(0.036423984909444), FRAC_CONST(0.999336426496761) }, { FRAC_CONST(0.033357892543086), FRAC_CONST(0.999443470640078) }, { FRAC_CONST(0.030291486199539), FRAC_CONST(0.999541107640813) }, { FRAC_CONST(0.027224794740988), FRAC_CONST(0.999629336579970) }, { FRAC_CONST(0.024157847032300), FRAC_CONST(0.999708156627105) }, { FRAC_CONST(0.021090671940755), FRAC_CONST(0.999777567040333) }, { FRAC_CONST(0.018023298335774), FRAC_CONST(0.999837567166337) }, { FRAC_CONST(0.014955755088644), FRAC_CONST(0.999888156440373) }, { FRAC_CONST(0.011888071072252), FRAC_CONST(0.999929334386276) }, { FRAC_CONST(0.008820275160808), FRAC_CONST(0.999961100616463) }, { FRAC_CONST(0.005752396229574), FRAC_CONST(0.999983454831938) }, { FRAC_CONST(0.002684463154596), FRAC_CONST(0.999996396822294) } }; /* 64 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_256[] = { { FRAC_CONST(0.999995293809576), FRAC_CONST(0.003067956762966) }, { FRAC_CONST(0.999618822495179), FRAC_CONST(0.027608145778966) }, { FRAC_CONST(0.998640218180265), FRAC_CONST(0.052131704680283) }, { FRAC_CONST(0.997060070339483), FRAC_CONST(0.076623861392031) }, { FRAC_CONST(0.994879330794806), FRAC_CONST(0.101069862754828) }, { FRAC_CONST(0.992099313142192), FRAC_CONST(0.125454983411546) }, { FRAC_CONST(0.988721691960324), FRAC_CONST(0.149764534677322) }, { FRAC_CONST(0.984748501801904), FRAC_CONST(0.173983873387464) }, { FRAC_CONST(0.980182135968117), FRAC_CONST(0.198098410717954) }, { FRAC_CONST(0.975025345066994), FRAC_CONST(0.222093620973204) }, { FRAC_CONST(0.969281235356549), FRAC_CONST(0.245955050335795) }, { FRAC_CONST(0.962953266873684), FRAC_CONST(0.269668325572915) }, { FRAC_CONST(0.956045251349996), FRAC_CONST(0.293219162694259) }, { FRAC_CONST(0.948561349915730), FRAC_CONST(0.316593375556166) }, { FRAC_CONST(0.940506070593268), FRAC_CONST(0.339776884406827) }, { FRAC_CONST(0.931884265581668), FRAC_CONST(0.362755724367397) }, { FRAC_CONST(0.922701128333879), FRAC_CONST(0.385516053843919) }, { FRAC_CONST(0.912962190428398), FRAC_CONST(0.408044162864979) }, { FRAC_CONST(0.902673318237259), FRAC_CONST(0.430326481340083) }, { FRAC_CONST(0.891840709392343), FRAC_CONST(0.452349587233771) }, { FRAC_CONST(0.880470889052161), FRAC_CONST(0.474100214650550) }, { FRAC_CONST(0.868570705971341), FRAC_CONST(0.495565261825773) }, { FRAC_CONST(0.856147328375194), FRAC_CONST(0.516731799017650) }, { FRAC_CONST(0.843208239641845), FRAC_CONST(0.537587076295645) }, { FRAC_CONST(0.829761233794523), FRAC_CONST(0.558118531220556) }, { FRAC_CONST(0.815814410806734), FRAC_CONST(0.578313796411656) }, { FRAC_CONST(0.801376171723140), FRAC_CONST(0.598160706996342) }, { FRAC_CONST(0.786455213599086), FRAC_CONST(0.617647307937804) }, { FRAC_CONST(0.771060524261814), FRAC_CONST(0.636761861236284) }, { FRAC_CONST(0.755201376896537), FRAC_CONST(0.655492852999615) }, { FRAC_CONST(0.738887324460615), FRAC_CONST(0.673829000378756) }, { FRAC_CONST(0.722128193929215), FRAC_CONST(0.691759258364158) }, { FRAC_CONST(0.704934080375905), FRAC_CONST(0.709272826438866) }, { FRAC_CONST(0.687315340891759), FRAC_CONST(0.726359155084346) }, { FRAC_CONST(0.669282588346636), FRAC_CONST(0.743007952135122) }, { FRAC_CONST(0.650846684996381), FRAC_CONST(0.759209188978388) }, { FRAC_CONST(0.632018735939809), FRAC_CONST(0.774953106594874) }, { FRAC_CONST(0.612810082429410), FRAC_CONST(0.790230221437310) }, { FRAC_CONST(0.593232295039800), FRAC_CONST(0.805031331142964) }, { FRAC_CONST(0.573297166698042), FRAC_CONST(0.819347520076797) }, { FRAC_CONST(0.553016705580028), FRAC_CONST(0.833170164701913) }, { FRAC_CONST(0.532403127877198), FRAC_CONST(0.846490938774052) }, { FRAC_CONST(0.511468850437971), FRAC_CONST(0.859301818357008) }, { FRAC_CONST(0.490226483288291), FRAC_CONST(0.871595086655951) }, { FRAC_CONST(0.468688822035828), FRAC_CONST(0.883363338665732) }, { FRAC_CONST(0.446868840162374), FRAC_CONST(0.894599485631383) }, { FRAC_CONST(0.424779681209109), FRAC_CONST(0.905296759318119) }, { FRAC_CONST(0.402434650859419), FRAC_CONST(0.915448716088268) }, { FRAC_CONST(0.379847208924051), FRAC_CONST(0.925049240782678) }, { FRAC_CONST(0.357030961233430), FRAC_CONST(0.934092550404259) }, { FRAC_CONST(0.333999651442009), FRAC_CONST(0.942573197601447) }, { FRAC_CONST(0.310767152749611), FRAC_CONST(0.950486073949482) }, { FRAC_CONST(0.287347459544730), FRAC_CONST(0.957826413027533) }, { FRAC_CONST(0.263754678974832), FRAC_CONST(0.964589793289813) }, { FRAC_CONST(0.240003022448742), FRAC_CONST(0.970772140728950) }, { FRAC_CONST(0.216106797076220), FRAC_CONST(0.976369731330021) }, { FRAC_CONST(0.192080397049892), FRAC_CONST(0.981379193313755) }, { FRAC_CONST(0.167938294974731), FRAC_CONST(0.985797509167567) }, { FRAC_CONST(0.143695033150295), FRAC_CONST(0.989622017463201) }, { FRAC_CONST(0.119365214810991), FRAC_CONST(0.992850414459865) }, { FRAC_CONST(0.094963495329639), FRAC_CONST(0.995480755491927) }, { FRAC_CONST(0.070504573389614), FRAC_CONST(0.997511456140303) }, { FRAC_CONST(0.046003182130915), FRAC_CONST(0.998941293186857) }, { FRAC_CONST(0.021474080275470), FRAC_CONST(0.999769405351215) } }; #ifdef LD_DEC /* 256 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1024[] = { { FRAC_CONST(0.999999705862882), FRAC_CONST(0.000766990318743) }, { FRAC_CONST(0.999976174986898), FRAC_CONST(0.006902858724730) }, { FRAC_CONST(0.999914995573113), FRAC_CONST(0.013038467241987) }, { FRAC_CONST(0.999816169924900), FRAC_CONST(0.019173584868323) }, { FRAC_CONST(0.999679701762988), FRAC_CONST(0.025307980620025) }, { FRAC_CONST(0.999505596225325), FRAC_CONST(0.031441423540560) }, { FRAC_CONST(0.999293859866888), FRAC_CONST(0.037573682709270) }, { FRAC_CONST(0.999044500659429), FRAC_CONST(0.043704527250063) }, { FRAC_CONST(0.998757527991183), FRAC_CONST(0.049833726340107) }, { FRAC_CONST(0.998432952666508), FRAC_CONST(0.055961049218521) }, { FRAC_CONST(0.998070786905482), FRAC_CONST(0.062086265195060) }, { FRAC_CONST(0.997671044343441), FRAC_CONST(0.068209143658806) }, { FRAC_CONST(0.997233740030466), FRAC_CONST(0.074329454086846) }, { FRAC_CONST(0.996758890430818), FRAC_CONST(0.080446966052950) }, { FRAC_CONST(0.996246513422316), FRAC_CONST(0.086561449236251) }, { FRAC_CONST(0.995696628295664), FRAC_CONST(0.092672673429913) }, { FRAC_CONST(0.995109255753726), FRAC_CONST(0.098780408549800) }, { FRAC_CONST(0.994484417910748), FRAC_CONST(0.104884424643135) }, { FRAC_CONST(0.993822138291520), FRAC_CONST(0.110984491897163) }, { FRAC_CONST(0.993122441830496), FRAC_CONST(0.117080380647801) }, { FRAC_CONST(0.992385354870852), FRAC_CONST(0.123171861388280) }, { FRAC_CONST(0.991610905163495), FRAC_CONST(0.129258704777796) }, { FRAC_CONST(0.990799121866020), FRAC_CONST(0.135340681650134) }, { FRAC_CONST(0.989950035541609), FRAC_CONST(0.141417563022303) }, { FRAC_CONST(0.989063678157882), FRAC_CONST(0.147489120103154) }, { FRAC_CONST(0.988140083085693), FRAC_CONST(0.153555124301993) }, { FRAC_CONST(0.987179285097874), FRAC_CONST(0.159615347237193) }, { FRAC_CONST(0.986181320367928), FRAC_CONST(0.165669560744784) }, { FRAC_CONST(0.985146226468662), FRAC_CONST(0.171717536887050) }, { FRAC_CONST(0.984074042370776), FRAC_CONST(0.177759047961107) }, { FRAC_CONST(0.982964808441396), FRAC_CONST(0.183793866507478) }, { FRAC_CONST(0.981818566442553), FRAC_CONST(0.189821765318656) }, { FRAC_CONST(0.980635359529608), FRAC_CONST(0.195842517447658) }, { FRAC_CONST(0.979415232249635), FRAC_CONST(0.201855896216568) }, { FRAC_CONST(0.978158230539735), FRAC_CONST(0.207861675225075) }, { FRAC_CONST(0.976864401725313), FRAC_CONST(0.213859628358994) }, { FRAC_CONST(0.975533794518291), FRAC_CONST(0.219849529798779) }, { FRAC_CONST(0.974166459015280), FRAC_CONST(0.225831154028026) }, { FRAC_CONST(0.972762446695689), FRAC_CONST(0.231804275841965) }, { FRAC_CONST(0.971321810419786), FRAC_CONST(0.237768670355934) }, { FRAC_CONST(0.969844604426715), FRAC_CONST(0.243724113013852) }, { FRAC_CONST(0.968330884332445), FRAC_CONST(0.249670379596669) }, { FRAC_CONST(0.966780707127683), FRAC_CONST(0.255607246230807) }, { FRAC_CONST(0.965194131175725), FRAC_CONST(0.261534489396596) }, { FRAC_CONST(0.963571216210257), FRAC_CONST(0.267451885936678) }, { FRAC_CONST(0.961912023333112), FRAC_CONST(0.273359213064419) }, { FRAC_CONST(0.960216615011963), FRAC_CONST(0.279256248372291) }, { FRAC_CONST(0.958485055077976), FRAC_CONST(0.285142769840249) }, { FRAC_CONST(0.956717408723403), FRAC_CONST(0.291018555844085) }, { FRAC_CONST(0.954913742499131), FRAC_CONST(0.296883385163778) }, { FRAC_CONST(0.953074124312172), FRAC_CONST(0.302737036991819) }, { FRAC_CONST(0.951198623423113), FRAC_CONST(0.308579290941525) }, { FRAC_CONST(0.949287310443502), FRAC_CONST(0.314409927055337) }, { FRAC_CONST(0.947340257333192), FRAC_CONST(0.320228725813100) }, { FRAC_CONST(0.945357537397632), FRAC_CONST(0.326035468140330) }, { FRAC_CONST(0.943339225285108), FRAC_CONST(0.331829935416461) }, { FRAC_CONST(0.941285396983929), FRAC_CONST(0.337611909483075) }, { FRAC_CONST(0.939196129819570), FRAC_CONST(0.343381172652115) }, { FRAC_CONST(0.937071502451759), FRAC_CONST(0.349137507714085) }, { FRAC_CONST(0.934911594871516), FRAC_CONST(0.354880697946223) }, { FRAC_CONST(0.932716488398140), FRAC_CONST(0.360610527120662) }, { FRAC_CONST(0.930486265676150), FRAC_CONST(0.366326779512574) }, { FRAC_CONST(0.928221010672169), FRAC_CONST(0.372029239908285) }, { FRAC_CONST(0.925920808671770), FRAC_CONST(0.377717693613386) }, { FRAC_CONST(0.923585746276257), FRAC_CONST(0.383391926460809) }, { FRAC_CONST(0.921215911399409), FRAC_CONST(0.389051724818894) }, { FRAC_CONST(0.918811393264170), FRAC_CONST(0.394696875599434) }, { FRAC_CONST(0.916372282399289), FRAC_CONST(0.400327166265690) }, { FRAC_CONST(0.913898670635912), FRAC_CONST(0.405942384840403) }, { FRAC_CONST(0.911390651104122), FRAC_CONST(0.411542319913765) }, { FRAC_CONST(0.908848318229439), FRAC_CONST(0.417126760651388) }, { FRAC_CONST(0.906271767729258), FRAC_CONST(0.422695496802233) }, { FRAC_CONST(0.903661096609248), FRAC_CONST(0.428248318706532) }, { FRAC_CONST(0.901016403159702), FRAC_CONST(0.433785017303679) }, { FRAC_CONST(0.898337786951834), FRAC_CONST(0.439305384140100) }, { FRAC_CONST(0.895625348834030), FRAC_CONST(0.444809211377105) }, { FRAC_CONST(0.892879190928052), FRAC_CONST(0.450296291798709) }, { FRAC_CONST(0.890099416625192), FRAC_CONST(0.455766418819435) }, { FRAC_CONST(0.887286130582383), FRAC_CONST(0.461219386492092) }, { FRAC_CONST(0.884439438718254), FRAC_CONST(0.466654989515531) }, { FRAC_CONST(0.881559448209144), FRAC_CONST(0.472073023242369) }, { FRAC_CONST(0.878646267485068), FRAC_CONST(0.477473283686698) }, { FRAC_CONST(0.875700006225635), FRAC_CONST(0.482855567531766) }, { FRAC_CONST(0.872720775355914), FRAC_CONST(0.488219672137627) }, { FRAC_CONST(0.869708687042266), FRAC_CONST(0.493565395548775) }, { FRAC_CONST(0.866663854688111), FRAC_CONST(0.498892536501745) }, { FRAC_CONST(0.863586392929668), FRAC_CONST(0.504200894432690) }, { FRAC_CONST(0.860476417631632), FRAC_CONST(0.509490269484936) }, { FRAC_CONST(0.857334045882816), FRAC_CONST(0.514760462516501) }, { FRAC_CONST(0.854159395991739), FRAC_CONST(0.520011275107596) }, { FRAC_CONST(0.850952587482176), FRAC_CONST(0.525242509568095) }, { FRAC_CONST(0.847713741088654), FRAC_CONST(0.530453968944976) }, { FRAC_CONST(0.844442978751911), FRAC_CONST(0.535645457029741) }, { FRAC_CONST(0.841140423614298), FRAC_CONST(0.540816778365797) }, { FRAC_CONST(0.837806200015151), FRAC_CONST(0.545967738255818) }, { FRAC_CONST(0.834440433486103), FRAC_CONST(0.551098142769075) }, { FRAC_CONST(0.831043250746362), FRAC_CONST(0.556207798748740) }, { FRAC_CONST(0.827614779697938), FRAC_CONST(0.561296513819151) }, { FRAC_CONST(0.824155149420829), FRAC_CONST(0.566364096393064) }, { FRAC_CONST(0.820664490168157), FRAC_CONST(0.571410355678857) }, { FRAC_CONST(0.817142933361273), FRAC_CONST(0.576435101687722) }, { FRAC_CONST(0.813590611584799), FRAC_CONST(0.581438145240810) }, { FRAC_CONST(0.810007658581641), FRAC_CONST(0.586419297976361) }, { FRAC_CONST(0.806394209247956), FRAC_CONST(0.591378372356788) }, { FRAC_CONST(0.802750399628069), FRAC_CONST(0.596315181675744) }, { FRAC_CONST(0.799076366909352), FRAC_CONST(0.601229540065149) }, { FRAC_CONST(0.795372249417061), FRAC_CONST(0.606121262502186) }, { FRAC_CONST(0.791638186609126), FRAC_CONST(0.610990164816272) }, { FRAC_CONST(0.787874319070900), FRAC_CONST(0.615836063695985) }, { FRAC_CONST(0.784080788509870), FRAC_CONST(0.620658776695972) }, { FRAC_CONST(0.780257737750317), FRAC_CONST(0.625458122243814) }, { FRAC_CONST(0.776405310727940), FRAC_CONST(0.630233919646864) }, { FRAC_CONST(0.772523652484441), FRAC_CONST(0.634985989099049) }, { FRAC_CONST(0.768612909162058), FRAC_CONST(0.639714151687640) }, { FRAC_CONST(0.764673227998067), FRAC_CONST(0.644418229399988) }, { FRAC_CONST(0.760704757319237), FRAC_CONST(0.649098045130226) }, { FRAC_CONST(0.756707646536246), FRAC_CONST(0.653753422685936) }, { FRAC_CONST(0.752682046138055), FRAC_CONST(0.658384186794785) }, { FRAC_CONST(0.748628107686245), FRAC_CONST(0.662990163111121) }, { FRAC_CONST(0.744545983809307), FRAC_CONST(0.667571178222540) }, { FRAC_CONST(0.740435828196898), FRAC_CONST(0.672127059656412) }, { FRAC_CONST(0.736297795594053), FRAC_CONST(0.676657635886375) }, { FRAC_CONST(0.732132041795361), FRAC_CONST(0.681162736338795) }, { FRAC_CONST(0.727938723639099), FRAC_CONST(0.685642191399187) }, { FRAC_CONST(0.723717999001324), FRAC_CONST(0.690095832418600) }, { FRAC_CONST(0.719470026789933), FRAC_CONST(0.694523491719966) }, { FRAC_CONST(0.715194966938680), FRAC_CONST(0.698925002604414) }, { FRAC_CONST(0.710892980401152), FRAC_CONST(0.703300199357549) }, { FRAC_CONST(0.706564229144710), FRAC_CONST(0.707648917255684) }, { FRAC_CONST(0.702208876144392), FRAC_CONST(0.711970992572050) }, { FRAC_CONST(0.697827085376777), FRAC_CONST(0.716266262582953) }, { FRAC_CONST(0.693419021813812), FRAC_CONST(0.720534565573905) }, { FRAC_CONST(0.688984851416597), FRAC_CONST(0.724775740845711) }, { FRAC_CONST(0.684524741129142), FRAC_CONST(0.728989628720519) }, { FRAC_CONST(0.680038858872079), FRAC_CONST(0.733176070547833) }, { FRAC_CONST(0.675527373536339), FRAC_CONST(0.737334908710483) }, { FRAC_CONST(0.670990454976794), FRAC_CONST(0.741465986630563) }, { FRAC_CONST(0.666428274005865), FRAC_CONST(0.745569148775325) }, { FRAC_CONST(0.661841002387087), FRAC_CONST(0.749644240663033) }, { FRAC_CONST(0.657228812828643), FRAC_CONST(0.753691108868781) }, { FRAC_CONST(0.652591878976863), FRAC_CONST(0.757709601030268) }, { FRAC_CONST(0.647930375409685), FRAC_CONST(0.761699565853535) }, { FRAC_CONST(0.643244477630086), FRAC_CONST(0.765660853118662) }, { FRAC_CONST(0.638534362059467), FRAC_CONST(0.769593313685423) }, { FRAC_CONST(0.633800206031017), FRAC_CONST(0.773496799498899) }, { FRAC_CONST(0.629042187783036), FRAC_CONST(0.777371163595056) }, { FRAC_CONST(0.624260486452221), FRAC_CONST(0.781216260106276) }, { FRAC_CONST(0.619455282066924), FRAC_CONST(0.785031944266848) }, { FRAC_CONST(0.614626755540375), FRAC_CONST(0.788818072418420) }, { FRAC_CONST(0.609775088663868), FRAC_CONST(0.792574502015408) }, { FRAC_CONST(0.604900464099920), FRAC_CONST(0.796301091630359) }, { FRAC_CONST(0.600003065375389), FRAC_CONST(0.799997700959282) }, { FRAC_CONST(0.595083076874570), FRAC_CONST(0.803664190826924) }, { FRAC_CONST(0.590140683832249), FRAC_CONST(0.807300423192014) }, { FRAC_CONST(0.585176072326730), FRAC_CONST(0.810906261152460) }, { FRAC_CONST(0.580189429272832), FRAC_CONST(0.814481568950499) }, { FRAC_CONST(0.575180942414845), FRAC_CONST(0.818026211977813) }, { FRAC_CONST(0.570150800319470), FRAC_CONST(0.821540056780598) }, { FRAC_CONST(0.565099192368714), FRAC_CONST(0.825022971064580) }, { FRAC_CONST(0.560026308752760), FRAC_CONST(0.828474823700007) }, { FRAC_CONST(0.554932340462810), FRAC_CONST(0.831895484726578) }, { FRAC_CONST(0.549817479283891), FRAC_CONST(0.835284825358337) }, { FRAC_CONST(0.544681917787635), FRAC_CONST(0.838642717988527) }, { FRAC_CONST(0.539525849325029), FRAC_CONST(0.841969036194388) }, { FRAC_CONST(0.534349468019138), FRAC_CONST(0.845263654741918) }, { FRAC_CONST(0.529152968757791), FRAC_CONST(0.848526449590593) }, { FRAC_CONST(0.523936547186249), FRAC_CONST(0.851757297898029) }, { FRAC_CONST(0.518700399699835), FRAC_CONST(0.854956078024615) }, { FRAC_CONST(0.513444723436544), FRAC_CONST(0.858122669538086) }, { FRAC_CONST(0.508169716269615), FRAC_CONST(0.861256953218062) }, { FRAC_CONST(0.502875576800087), FRAC_CONST(0.864358811060534) }, { FRAC_CONST(0.497562504349319), FRAC_CONST(0.867428126282307) }, { FRAC_CONST(0.492230698951486), FRAC_CONST(0.870464783325398) }, { FRAC_CONST(0.486880361346047), FRAC_CONST(0.873468667861385) }, { FRAC_CONST(0.481511692970190), FRAC_CONST(0.876439666795714) }, { FRAC_CONST(0.476124895951244), FRAC_CONST(0.879377668271953) }, { FRAC_CONST(0.470720173099072), FRAC_CONST(0.882282561676009) }, { FRAC_CONST(0.465297727898435), FRAC_CONST(0.885154237640285) }, { FRAC_CONST(0.459857764501330), FRAC_CONST(0.887992588047806) }, { FRAC_CONST(0.454400487719304), FRAC_CONST(0.890797506036281) }, { FRAC_CONST(0.448926103015743), FRAC_CONST(0.893568886002136) }, { FRAC_CONST(0.443434816498138), FRAC_CONST(0.896306623604480) }, { FRAC_CONST(0.437926834910323), FRAC_CONST(0.899010615769039) }, { FRAC_CONST(0.432402365624690), FRAC_CONST(0.901680760692038) }, { FRAC_CONST(0.426861616634386), FRAC_CONST(0.904316957844028) }, { FRAC_CONST(0.421304796545480), FRAC_CONST(0.906919107973678) }, { FRAC_CONST(0.415732114569105), FRAC_CONST(0.909487113111505) }, { FRAC_CONST(0.410143780513590), FRAC_CONST(0.912020876573568) }, { FRAC_CONST(0.404540004776553), FRAC_CONST(0.914520302965104) }, { FRAC_CONST(0.398920998336983), FRAC_CONST(0.916985298184123) }, { FRAC_CONST(0.393286972747297), FRAC_CONST(0.919415769424947) }, { FRAC_CONST(0.387638140125373), FRAC_CONST(0.921811625181708) }, { FRAC_CONST(0.381974713146567), FRAC_CONST(0.924172775251791) }, { FRAC_CONST(0.376296905035705), FRAC_CONST(0.926499130739231) }, { FRAC_CONST(0.370604929559052), FRAC_CONST(0.928790604058057) }, { FRAC_CONST(0.364899001016267), FRAC_CONST(0.931047108935595) }, { FRAC_CONST(0.359179334232337), FRAC_CONST(0.933268560415712) }, { FRAC_CONST(0.353446144549481), FRAC_CONST(0.935454874862015) }, { FRAC_CONST(0.347699647819051), FRAC_CONST(0.937605969961000) }, { FRAC_CONST(0.341940060393402), FRAC_CONST(0.939721764725153) }, { FRAC_CONST(0.336167599117745), FRAC_CONST(0.941802179495998) }, { FRAC_CONST(0.330382481321983), FRAC_CONST(0.943847135947093) }, { FRAC_CONST(0.324584924812532), FRAC_CONST(0.945856557086984) }, { FRAC_CONST(0.318775147864118), FRAC_CONST(0.947830367262101) }, { FRAC_CONST(0.312953369211560), FRAC_CONST(0.949768492159607) }, { FRAC_CONST(0.307119808041533), FRAC_CONST(0.951670858810194) }, { FRAC_CONST(0.301274683984318), FRAC_CONST(0.953537395590833) }, { FRAC_CONST(0.295418217105532), FRAC_CONST(0.955368032227470) }, { FRAC_CONST(0.289550627897843), FRAC_CONST(0.957162699797670) }, { FRAC_CONST(0.283672137272669), FRAC_CONST(0.958921330733213) }, { FRAC_CONST(0.277782966551858), FRAC_CONST(0.960643858822638) }, { FRAC_CONST(0.271883337459360), FRAC_CONST(0.962330219213737) }, { FRAC_CONST(0.265973472112876), FRAC_CONST(0.963980348415994) }, { FRAC_CONST(0.260053593015495), FRAC_CONST(0.965594184302977) }, { FRAC_CONST(0.254123923047321), FRAC_CONST(0.967171666114677) }, { FRAC_CONST(0.248184685457075), FRAC_CONST(0.968712734459795) }, { FRAC_CONST(0.242236103853696), FRAC_CONST(0.970217331317979) }, { FRAC_CONST(0.236278402197920), FRAC_CONST(0.971685400042009) }, { FRAC_CONST(0.230311804793846), FRAC_CONST(0.973116885359925) }, { FRAC_CONST(0.224336536280494), FRAC_CONST(0.974511733377116) }, { FRAC_CONST(0.218352821623346), FRAC_CONST(0.975869891578341) }, { FRAC_CONST(0.212360886105879), FRAC_CONST(0.977191308829712) }, { FRAC_CONST(0.206360955321076), FRAC_CONST(0.978475935380617) }, { FRAC_CONST(0.200353255162940), FRAC_CONST(0.979723722865591) }, { FRAC_CONST(0.194338011817989), FRAC_CONST(0.980934624306142) }, { FRAC_CONST(0.188315451756732), FRAC_CONST(0.982108594112514) }, { FRAC_CONST(0.182285801725153), FRAC_CONST(0.983245588085407) }, { FRAC_CONST(0.176249288736168), FRAC_CONST(0.984345563417642) }, { FRAC_CONST(0.170206140061078), FRAC_CONST(0.985408478695768) }, { FRAC_CONST(0.164156583221016), FRAC_CONST(0.986434293901627) }, { FRAC_CONST(0.158100845978377), FRAC_CONST(0.987422970413855) }, { FRAC_CONST(0.152039156328246), FRAC_CONST(0.988374471009341) }, { FRAC_CONST(0.145971742489812), FRAC_CONST(0.989288759864625) }, { FRAC_CONST(0.139898832897777), FRAC_CONST(0.990165802557248) }, { FRAC_CONST(0.133820656193755), FRAC_CONST(0.991005566067049) }, { FRAC_CONST(0.127737441217662), FRAC_CONST(0.991808018777406) }, { FRAC_CONST(0.121649416999106), FRAC_CONST(0.992573130476429) }, { FRAC_CONST(0.115556812748755), FRAC_CONST(0.993300872358093) }, { FRAC_CONST(0.109459857849718), FRAC_CONST(0.993991217023329) }, { FRAC_CONST(0.103358781848900), FRAC_CONST(0.994644138481051) }, { FRAC_CONST(0.097253814448363), FRAC_CONST(0.995259612149133) }, { FRAC_CONST(0.091145185496681), FRAC_CONST(0.995837614855342) }, { FRAC_CONST(0.085033124980280), FRAC_CONST(0.996378124838200) }, { FRAC_CONST(0.078917863014785), FRAC_CONST(0.996881121747814) }, { FRAC_CONST(0.072799629836352), FRAC_CONST(0.997346586646633) }, { FRAC_CONST(0.066678655793002), FRAC_CONST(0.997774502010168) }, { FRAC_CONST(0.060555171335948), FRAC_CONST(0.998164851727646) }, { FRAC_CONST(0.054429407010919), FRAC_CONST(0.998517621102622) }, { FRAC_CONST(0.048301593449480), FRAC_CONST(0.998832796853528) }, { FRAC_CONST(0.042171961360348), FRAC_CONST(0.999110367114175) }, { FRAC_CONST(0.036040741520706), FRAC_CONST(0.999350321434199) }, { FRAC_CONST(0.029908164767517), FRAC_CONST(0.999552650779457) }, { FRAC_CONST(0.023774461988828), FRAC_CONST(0.999717347532362) }, { FRAC_CONST(0.017639864115082), FRAC_CONST(0.999844405492175) }, { FRAC_CONST(0.011504602110423), FRAC_CONST(0.999933819875236) }, { FRAC_CONST(0.005368906963996), FRAC_CONST(0.999985587315143) } }; #endif // LD_DEC #ifdef ALLOW_SMALL_FRAMELENGTH /* 480 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1920[] = { { FRAC_CONST(0.999999916334328), FRAC_CONST(0.000409061532028) }, { FRAC_CONST(0.999993223088129), FRAC_CONST(0.003681545574400) }, { FRAC_CONST(0.999975820717897), FRAC_CONST(0.006953990190376) }, { FRAC_CONST(0.999947709409999), FRAC_CONST(0.010226360334704) }, { FRAC_CONST(0.999908889465485), FRAC_CONST(0.013498620962929) }, { FRAC_CONST(0.999859361300084), FRAC_CONST(0.016770737031768) }, { FRAC_CONST(0.999799125444203), FRAC_CONST(0.020042673499487) }, { FRAC_CONST(0.999728182542920), FRAC_CONST(0.023314395326274) }, { FRAC_CONST(0.999646533355977), FRAC_CONST(0.026585867474619) }, { FRAC_CONST(0.999554178757770), FRAC_CONST(0.029857054909681) }, { FRAC_CONST(0.999451119737344), FRAC_CONST(0.033127922599673) }, { FRAC_CONST(0.999337357398377), FRAC_CONST(0.036398435516228) }, { FRAC_CONST(0.999212892959173), FRAC_CONST(0.039668558634781) }, { FRAC_CONST(0.999077727752645), FRAC_CONST(0.042938256934941) }, { FRAC_CONST(0.998931863226306), FRAC_CONST(0.046207495400865) }, { FRAC_CONST(0.998775300942246), FRAC_CONST(0.049476239021636) }, { FRAC_CONST(0.998608042577122), FRAC_CONST(0.052744452791636) }, { FRAC_CONST(0.998430089922136), FRAC_CONST(0.056012101710921) }, { FRAC_CONST(0.998241444883019), FRAC_CONST(0.059279150785597) }, { FRAC_CONST(0.998042109480008), FRAC_CONST(0.062545565028192) }, { FRAC_CONST(0.997832085847824), FRAC_CONST(0.065811309458034) }, { FRAC_CONST(0.997611376235651), FRAC_CONST(0.069076349101624) }, { FRAC_CONST(0.997379983007114), FRAC_CONST(0.072340648993011) }, { FRAC_CONST(0.997137908640245), FRAC_CONST(0.075604174174166) }, { FRAC_CONST(0.996885155727469), FRAC_CONST(0.078866889695354) }, { FRAC_CONST(0.996621726975566), FRAC_CONST(0.082128760615515) }, { FRAC_CONST(0.996347625205645), FRAC_CONST(0.085389752002632) }, { FRAC_CONST(0.996062853353117), FRAC_CONST(0.088649828934106) }, { FRAC_CONST(0.995767414467660), FRAC_CONST(0.091908956497133) }, { FRAC_CONST(0.995461311713186), FRAC_CONST(0.095167099789075) }, { FRAC_CONST(0.995144548367810), FRAC_CONST(0.098424223917834) }, { FRAC_CONST(0.994817127823813), FRAC_CONST(0.101680294002229) }, { FRAC_CONST(0.994479053587606), FRAC_CONST(0.104935275172364) }, { FRAC_CONST(0.994130329279692), FRAC_CONST(0.108189132570007) }, { FRAC_CONST(0.993770958634630), FRAC_CONST(0.111441831348957) }, { FRAC_CONST(0.993400945500988), FRAC_CONST(0.114693336675426) }, { FRAC_CONST(0.993020293841312), FRAC_CONST(0.117943613728403) }, { FRAC_CONST(0.992629007732074), FRAC_CONST(0.121192627700032) }, { FRAC_CONST(0.992227091363634), FRAC_CONST(0.124440343795983) }, { FRAC_CONST(0.991814549040194), FRAC_CONST(0.127686727235827) }, { FRAC_CONST(0.991391385179751), FRAC_CONST(0.130931743253405) }, { FRAC_CONST(0.990957604314048), FRAC_CONST(0.134175357097202) }, { FRAC_CONST(0.990513211088533), FRAC_CONST(0.137417534030720) }, { FRAC_CONST(0.990058210262297), FRAC_CONST(0.140658239332849) }, { FRAC_CONST(0.989592606708036), FRAC_CONST(0.143897438298239) }, { FRAC_CONST(0.989116405411988), FRAC_CONST(0.147135096237670) }, { FRAC_CONST(0.988629611473887), FRAC_CONST(0.150371178478428) }, { FRAC_CONST(0.988132230106905), FRAC_CONST(0.153605650364672) }, { FRAC_CONST(0.987624266637598), FRAC_CONST(0.156838477257806) }, { FRAC_CONST(0.987105726505845), FRAC_CONST(0.160069624536852) }, { FRAC_CONST(0.986576615264794), FRAC_CONST(0.163299057598817) }, { FRAC_CONST(0.986036938580803), FRAC_CONST(0.166526741859069) }, { FRAC_CONST(0.985486702233375), FRAC_CONST(0.169752642751702) }, { FRAC_CONST(0.984925912115099), FRAC_CONST(0.172976725729910) }, { FRAC_CONST(0.984354574231587), FRAC_CONST(0.176198956266353) }, { FRAC_CONST(0.983772694701407), FRAC_CONST(0.179419299853531) }, { FRAC_CONST(0.983180279756024), FRAC_CONST(0.182637722004152) }, { FRAC_CONST(0.982577335739725), FRAC_CONST(0.185854188251500) }, { FRAC_CONST(0.981963869109555), FRAC_CONST(0.189068664149806) }, { FRAC_CONST(0.981339886435250), FRAC_CONST(0.192281115274616) }, { FRAC_CONST(0.980705394399163), FRAC_CONST(0.195491507223158) }, { FRAC_CONST(0.980060399796194), FRAC_CONST(0.198699805614714) }, { FRAC_CONST(0.979404909533716), FRAC_CONST(0.201905976090986) }, { FRAC_CONST(0.978738930631504), FRAC_CONST(0.205109984316464) }, { FRAC_CONST(0.978062470221657), FRAC_CONST(0.208311795978794) }, { FRAC_CONST(0.977375535548522), FRAC_CONST(0.211511376789145) }, { FRAC_CONST(0.976678133968618), FRAC_CONST(0.214708692482577) }, { FRAC_CONST(0.975970272950556), FRAC_CONST(0.217903708818409) }, { FRAC_CONST(0.975251960074958), FRAC_CONST(0.221096391580581) }, { FRAC_CONST(0.974523203034377), FRAC_CONST(0.224286706578026) }, { FRAC_CONST(0.973784009633218), FRAC_CONST(0.227474619645035) }, { FRAC_CONST(0.973034387787646), FRAC_CONST(0.230660096641619) }, { FRAC_CONST(0.972274345525510), FRAC_CONST(0.233843103453878) }, { FRAC_CONST(0.971503890986252), FRAC_CONST(0.237023605994367) }, { FRAC_CONST(0.970723032420820), FRAC_CONST(0.240201570202459) }, { FRAC_CONST(0.969931778191584), FRAC_CONST(0.243376962044711) }, { FRAC_CONST(0.969130136772239), FRAC_CONST(0.246549747515226) }, { FRAC_CONST(0.968318116747721), FRAC_CONST(0.249719892636022) }, { FRAC_CONST(0.967495726814114), FRAC_CONST(0.252887363457390) }, { FRAC_CONST(0.966662975778551), FRAC_CONST(0.256052126058264) }, { FRAC_CONST(0.965819872559127), FRAC_CONST(0.259214146546579) }, { FRAC_CONST(0.964966426184802), FRAC_CONST(0.262373391059634) }, { FRAC_CONST(0.964102645795299), FRAC_CONST(0.265529825764461) }, { FRAC_CONST(0.963228540641012), FRAC_CONST(0.268683416858178) }, { FRAC_CONST(0.962344120082907), FRAC_CONST(0.271834130568359) }, { FRAC_CONST(0.961449393592416), FRAC_CONST(0.274981933153391) }, { FRAC_CONST(0.960544370751341), FRAC_CONST(0.278126790902837) }, { FRAC_CONST(0.959629061251750), FRAC_CONST(0.281268670137799) }, { FRAC_CONST(0.958703474895872), FRAC_CONST(0.284407537211272) }, { FRAC_CONST(0.957767621595993), FRAC_CONST(0.287543358508512) }, { FRAC_CONST(0.956821511374351), FRAC_CONST(0.290676100447394) }, { FRAC_CONST(0.955865154363025), FRAC_CONST(0.293805729478766) }, { FRAC_CONST(0.954898560803832), FRAC_CONST(0.296932212086818) }, { FRAC_CONST(0.953921741048211), FRAC_CONST(0.300055514789431) }, { FRAC_CONST(0.952934705557117), FRAC_CONST(0.303175604138543) }, { FRAC_CONST(0.951937464900908), FRAC_CONST(0.306292446720504) }, { FRAC_CONST(0.950930029759229), FRAC_CONST(0.309406009156434) }, { FRAC_CONST(0.949912410920903), FRAC_CONST(0.312516258102580) }, { FRAC_CONST(0.948884619283808), FRAC_CONST(0.315623160250676) }, { FRAC_CONST(0.947846665854767), FRAC_CONST(0.318726682328294) }, { FRAC_CONST(0.946798561749429), FRAC_CONST(0.321826791099207) }, { FRAC_CONST(0.945740318192145), FRAC_CONST(0.324923453363742) }, { FRAC_CONST(0.944671946515855), FRAC_CONST(0.328016635959131) }, { FRAC_CONST(0.943593458161960), FRAC_CONST(0.331106305759876) }, { FRAC_CONST(0.942504864680205), FRAC_CONST(0.334192429678095) }, { FRAC_CONST(0.941406177728551), FRAC_CONST(0.337274974663880) }, { FRAC_CONST(0.940297409073052), FRAC_CONST(0.340353907705650) }, { FRAC_CONST(0.939178570587730), FRAC_CONST(0.343429195830507) }, { FRAC_CONST(0.938049674254446), FRAC_CONST(0.346500806104585) }, { FRAC_CONST(0.936910732162774), FRAC_CONST(0.349568705633406) }, { FRAC_CONST(0.935761756509868), FRAC_CONST(0.352632861562230) }, { FRAC_CONST(0.934602759600334), FRAC_CONST(0.355693241076410) }, { FRAC_CONST(0.933433753846097), FRAC_CONST(0.358749811401739) }, { FRAC_CONST(0.932254751766271), FRAC_CONST(0.361802539804806) }, { FRAC_CONST(0.931065765987021), FRAC_CONST(0.364851393593340) }, { FRAC_CONST(0.929866809241428), FRAC_CONST(0.367896340116568) }, { FRAC_CONST(0.928657894369357), FRAC_CONST(0.370937346765559) }, { FRAC_CONST(0.927439034317314), FRAC_CONST(0.373974380973575) }, { FRAC_CONST(0.926210242138311), FRAC_CONST(0.377007410216418) }, { FRAC_CONST(0.924971530991726), FRAC_CONST(0.380036402012783) }, { FRAC_CONST(0.923722914143160), FRAC_CONST(0.383061323924602) }, { FRAC_CONST(0.922464404964295), FRAC_CONST(0.386082143557389) }, { FRAC_CONST(0.921196016932755), FRAC_CONST(0.389098828560595) }, { FRAC_CONST(0.919917763631956), FRAC_CONST(0.392111346627946) }, { FRAC_CONST(0.918629658750963), FRAC_CONST(0.395119665497795) }, { FRAC_CONST(0.917331716084346), FRAC_CONST(0.398123752953462) }, { FRAC_CONST(0.916023949532027), FRAC_CONST(0.401123576823585) }, { FRAC_CONST(0.914706373099136), FRAC_CONST(0.404119104982459) }, { FRAC_CONST(0.913379000895858), FRAC_CONST(0.407110305350386) }, { FRAC_CONST(0.912041847137282), FRAC_CONST(0.410097145894012) }, { FRAC_CONST(0.910694926143251), FRAC_CONST(0.413079594626675) }, { FRAC_CONST(0.909338252338207), FRAC_CONST(0.416057619608744) }, { FRAC_CONST(0.907971840251037), FRAC_CONST(0.419031188947965) }, { FRAC_CONST(0.906595704514915), FRAC_CONST(0.422000270799800) }, { FRAC_CONST(0.905209859867151), FRAC_CONST(0.424964833367766) }, { FRAC_CONST(0.903814321149027), FRAC_CONST(0.427924844903780) }, { FRAC_CONST(0.902409103305641), FRAC_CONST(0.430880273708497) }, { FRAC_CONST(0.900994221385748), FRAC_CONST(0.433831088131649) }, { FRAC_CONST(0.899569690541596), FRAC_CONST(0.436777256572384) }, { FRAC_CONST(0.898135526028766), FRAC_CONST(0.439718747479604) }, { FRAC_CONST(0.896691743206008), FRAC_CONST(0.442655529352306) }, { FRAC_CONST(0.895238357535076), FRAC_CONST(0.445587570739915) }, { FRAC_CONST(0.893775384580563), FRAC_CONST(0.448514840242624) }, { FRAC_CONST(0.892302840009734), FRAC_CONST(0.451437306511726) }, { FRAC_CONST(0.890820739592359), FRAC_CONST(0.454354938249958) }, { FRAC_CONST(0.889329099200541), FRAC_CONST(0.457267704211826) }, { FRAC_CONST(0.887827934808551), FRAC_CONST(0.460175573203949) }, { FRAC_CONST(0.886317262492655), FRAC_CONST(0.463078514085383) }, { FRAC_CONST(0.884797098430938), FRAC_CONST(0.465976495767966) }, { FRAC_CONST(0.883267458903136), FRAC_CONST(0.468869487216642) }, { FRAC_CONST(0.881728360290461), FRAC_CONST(0.471757457449795) }, { FRAC_CONST(0.880179819075421), FRAC_CONST(0.474640375539586) }, { FRAC_CONST(0.878621851841649), FRAC_CONST(0.477518210612278) }, { FRAC_CONST(0.877054475273722), FRAC_CONST(0.480390931848569) }, { FRAC_CONST(0.875477706156984), FRAC_CONST(0.483258508483922) }, { FRAC_CONST(0.873891561377366), FRAC_CONST(0.486120909808896) }, { FRAC_CONST(0.872296057921204), FRAC_CONST(0.488978105169472) }, { FRAC_CONST(0.870691212875058), FRAC_CONST(0.491830063967383) }, { FRAC_CONST(0.869077043425529), FRAC_CONST(0.494676755660442) }, { FRAC_CONST(0.867453566859076), FRAC_CONST(0.497518149762867) }, { FRAC_CONST(0.865820800561827), FRAC_CONST(0.500354215845611) }, { FRAC_CONST(0.864178762019399), FRAC_CONST(0.503184923536685) }, { FRAC_CONST(0.862527468816704), FRAC_CONST(0.506010242521482) }, { FRAC_CONST(0.860866938637767), FRAC_CONST(0.508830142543107) }, { FRAC_CONST(0.859197189265532), FRAC_CONST(0.511644593402696) }, { FRAC_CONST(0.857518238581672), FRAC_CONST(0.514453564959741) }, { FRAC_CONST(0.855830104566401), FRAC_CONST(0.517257027132414) }, { FRAC_CONST(0.854132805298278), FRAC_CONST(0.520054949897887) }, { FRAC_CONST(0.852426358954015), FRAC_CONST(0.522847303292655) }, { FRAC_CONST(0.850710783808280), FRAC_CONST(0.525634057412856) }, { FRAC_CONST(0.848986098233506), FRAC_CONST(0.528415182414593) }, { FRAC_CONST(0.847252320699689), FRAC_CONST(0.531190648514252) }, { FRAC_CONST(0.845509469774194), FRAC_CONST(0.533960425988819) }, { FRAC_CONST(0.843757564121554), FRAC_CONST(0.536724485176205) }, { FRAC_CONST(0.841996622503271), FRAC_CONST(0.539482796475555) }, { FRAC_CONST(0.840226663777615), FRAC_CONST(0.542235330347571) }, { FRAC_CONST(0.838447706899422), FRAC_CONST(0.544982057314827) }, { FRAC_CONST(0.836659770919891), FRAC_CONST(0.547722947962084) }, { FRAC_CONST(0.834862874986380), FRAC_CONST(0.550457972936605) }, { FRAC_CONST(0.833057038342201), FRAC_CONST(0.553187102948470) }, { FRAC_CONST(0.831242280326413), FRAC_CONST(0.555910308770889) }, { FRAC_CONST(0.829418620373617), FRAC_CONST(0.558627561240515) }, { FRAC_CONST(0.827586078013746), FRAC_CONST(0.561338831257758) }, { FRAC_CONST(0.825744672871856), FRAC_CONST(0.564044089787093) }, { FRAC_CONST(0.823894424667918), FRAC_CONST(0.566743307857377) }, { FRAC_CONST(0.822035353216601), FRAC_CONST(0.569436456562150) }, { FRAC_CONST(0.820167478427070), FRAC_CONST(0.572123507059955) }, { FRAC_CONST(0.818290820302761), FRAC_CONST(0.574804430574639) }, { FRAC_CONST(0.816405398941175), FRAC_CONST(0.577479198395666) }, { FRAC_CONST(0.814511234533661), FRAC_CONST(0.580147781878420) }, { FRAC_CONST(0.812608347365198), FRAC_CONST(0.582810152444517) }, { FRAC_CONST(0.810696757814178), FRAC_CONST(0.585466281582107) }, { FRAC_CONST(0.808776486352191), FRAC_CONST(0.588116140846181) }, { FRAC_CONST(0.806847553543799), FRAC_CONST(0.590759701858874) }, { FRAC_CONST(0.804909980046325), FRAC_CONST(0.593396936309773) }, { FRAC_CONST(0.802963786609623), FRAC_CONST(0.596027815956215) }, { FRAC_CONST(0.801008994075862), FRAC_CONST(0.598652312623592) }, { FRAC_CONST(0.799045623379300), FRAC_CONST(0.601270398205654) }, { FRAC_CONST(0.797073695546059), FRAC_CONST(0.603882044664808) }, { FRAC_CONST(0.795093231693901), FRAC_CONST(0.606487224032418) }, { FRAC_CONST(0.793104253032005), FRAC_CONST(0.609085908409106) }, { FRAC_CONST(0.791106780860733), FRAC_CONST(0.611678069965050) }, { FRAC_CONST(0.789100836571407), FRAC_CONST(0.614263680940283) }, { FRAC_CONST(0.787086441646080), FRAC_CONST(0.616842713644988) }, { FRAC_CONST(0.785063617657302), FRAC_CONST(0.619415140459796) }, { FRAC_CONST(0.783032386267894), FRAC_CONST(0.621980933836084) }, { FRAC_CONST(0.780992769230711), FRAC_CONST(0.624540066296266) }, { FRAC_CONST(0.778944788388414), FRAC_CONST(0.627092510434089) }, { FRAC_CONST(0.776888465673232), FRAC_CONST(0.629638238914927) }, { FRAC_CONST(0.774823823106730), FRAC_CONST(0.632177224476073) }, { FRAC_CONST(0.772750882799570), FRAC_CONST(0.634709439927031) }, { FRAC_CONST(0.770669666951277), FRAC_CONST(0.637234858149809) }, { FRAC_CONST(0.768580197850002), FRAC_CONST(0.639753452099206) }, { FRAC_CONST(0.766482497872280), FRAC_CONST(0.642265194803105) }, { FRAC_CONST(0.764376589482793), FRAC_CONST(0.644770059362758) }, { FRAC_CONST(0.762262495234126), FRAC_CONST(0.647268018953079) }, { FRAC_CONST(0.760140237766532), FRAC_CONST(0.649759046822928) }, { FRAC_CONST(0.758009839807683), FRAC_CONST(0.652243116295397) }, { FRAC_CONST(0.755871324172429), FRAC_CONST(0.654720200768098) }, { FRAC_CONST(0.753724713762555), FRAC_CONST(0.657190273713446) }, { FRAC_CONST(0.751570031566534), FRAC_CONST(0.659653308678945) }, { FRAC_CONST(0.749407300659280), FRAC_CONST(0.662109279287469) }, { FRAC_CONST(0.747236544201905), FRAC_CONST(0.664558159237545) }, { FRAC_CONST(0.745057785441466), FRAC_CONST(0.666999922303638) }, { FRAC_CONST(0.742871047710719), FRAC_CONST(0.669434542336425) }, { FRAC_CONST(0.740676354427868), FRAC_CONST(0.671861993263083) }, { FRAC_CONST(0.738473729096316), FRAC_CONST(0.674282249087562) }, { FRAC_CONST(0.736263195304409), FRAC_CONST(0.676695283890867) }, { FRAC_CONST(0.734044776725190), FRAC_CONST(0.679101071831334) }, { FRAC_CONST(0.731818497116138), FRAC_CONST(0.681499587144906) }, { FRAC_CONST(0.729584380318920), FRAC_CONST(0.683890804145412) }, { FRAC_CONST(0.727342450259131), FRAC_CONST(0.686274697224838) }, { FRAC_CONST(0.725092730946042), FRAC_CONST(0.688651240853606) }, { FRAC_CONST(0.722835246472338), FRAC_CONST(0.691020409580841) }, { FRAC_CONST(0.720570021013866), FRAC_CONST(0.693382178034651) }, { FRAC_CONST(0.718297078829369), FRAC_CONST(0.695736520922392) }, { FRAC_CONST(0.716016444260233), FRAC_CONST(0.698083413030944) }, { FRAC_CONST(0.713728141730222), FRAC_CONST(0.700422829226978) }, { FRAC_CONST(0.711432195745216), FRAC_CONST(0.702754744457225) }, { FRAC_CONST(0.709128630892954), FRAC_CONST(0.705079133748748) }, { FRAC_CONST(0.706817471842764), FRAC_CONST(0.707395972209203) }, { FRAC_CONST(0.704498743345302), FRAC_CONST(0.709705235027113) }, { FRAC_CONST(0.702172470232289), FRAC_CONST(0.712006897472128) }, { FRAC_CONST(0.699838677416240), FRAC_CONST(0.714300934895292) }, { FRAC_CONST(0.697497389890200), FRAC_CONST(0.716587322729308) }, { FRAC_CONST(0.695148632727480), FRAC_CONST(0.718866036488799) }, { FRAC_CONST(0.692792431081381), FRAC_CONST(0.721137051770570) }, { FRAC_CONST(0.690428810184929), FRAC_CONST(0.723400344253874) }, { FRAC_CONST(0.688057795350606), FRAC_CONST(0.725655889700665) }, { FRAC_CONST(0.685679411970075), FRAC_CONST(0.727903663955865) }, { FRAC_CONST(0.683293685513912), FRAC_CONST(0.730143642947616) }, { FRAC_CONST(0.680900641531330), FRAC_CONST(0.732375802687543) }, { FRAC_CONST(0.678500305649909), FRAC_CONST(0.734600119271009) }, { FRAC_CONST(0.676092703575316), FRAC_CONST(0.736816568877370) }, { FRAC_CONST(0.673677861091036), FRAC_CONST(0.739025127770231) }, { FRAC_CONST(0.671255804058092), FRAC_CONST(0.741225772297702) }, { FRAC_CONST(0.668826558414768), FRAC_CONST(0.743418478892647) }, { FRAC_CONST(0.666390150176334), FRAC_CONST(0.745603224072940) }, { FRAC_CONST(0.663946605434765), FRAC_CONST(0.747779984441716) }, { FRAC_CONST(0.661495950358462), FRAC_CONST(0.749948736687619) }, { FRAC_CONST(0.659038211191971), FRAC_CONST(0.752109457585056) }, { FRAC_CONST(0.656573414255705), FRAC_CONST(0.754262123994441) }, { FRAC_CONST(0.654101585945659), FRAC_CONST(0.756406712862448) }, { FRAC_CONST(0.651622752733128), FRAC_CONST(0.758543201222251) }, { FRAC_CONST(0.649136941164425), FRAC_CONST(0.760671566193777) }, { FRAC_CONST(0.646644177860593), FRAC_CONST(0.762791784983948) }, { FRAC_CONST(0.644144489517126), FRAC_CONST(0.764903834886923) }, { FRAC_CONST(0.641637902903677), FRAC_CONST(0.767007693284345) }, { FRAC_CONST(0.639124444863776), FRAC_CONST(0.769103337645580) }, { FRAC_CONST(0.636604142314538), FRAC_CONST(0.771190745527961) }, { FRAC_CONST(0.634077022246379), FRAC_CONST(0.773269894577026) }, { FRAC_CONST(0.631543111722725), FRAC_CONST(0.775340762526760) }, { FRAC_CONST(0.629002437879721), FRAC_CONST(0.777403327199831) }, { FRAC_CONST(0.626455027925944), FRAC_CONST(0.779457566507828) }, { FRAC_CONST(0.623900909142107), FRAC_CONST(0.781503458451498) }, { FRAC_CONST(0.621340108880771), FRAC_CONST(0.783540981120982) }, { FRAC_CONST(0.618772654566049), FRAC_CONST(0.785570112696050) }, { FRAC_CONST(0.616198573693314), FRAC_CONST(0.787590831446332) }, { FRAC_CONST(0.613617893828905), FRAC_CONST(0.789603115731555) }, { FRAC_CONST(0.611030642609828), FRAC_CONST(0.791606944001769) }, { FRAC_CONST(0.608436847743468), FRAC_CONST(0.793602294797585) }, { FRAC_CONST(0.605836537007281), FRAC_CONST(0.795589146750397) }, { FRAC_CONST(0.603229738248508), FRAC_CONST(0.797567478582619) }, { FRAC_CONST(0.600616479383869), FRAC_CONST(0.799537269107905) }, { FRAC_CONST(0.597996788399267), FRAC_CONST(0.801498497231381) }, { FRAC_CONST(0.595370693349487), FRAC_CONST(0.803451141949871) }, { FRAC_CONST(0.592738222357898), FRAC_CONST(0.805395182352117) }, { FRAC_CONST(0.590099403616149), FRAC_CONST(0.807330597619008) }, { FRAC_CONST(0.587454265383869), FRAC_CONST(0.809257367023803) }, { FRAC_CONST(0.584802835988364), FRAC_CONST(0.811175469932349) }, { FRAC_CONST(0.582145143824311), FRAC_CONST(0.813084885803304) }, { FRAC_CONST(0.579481217353460), FRAC_CONST(0.814985594188359) }, { FRAC_CONST(0.576811085104321), FRAC_CONST(0.816877574732454) }, { FRAC_CONST(0.574134775671867), FRAC_CONST(0.818760807173997) }, { FRAC_CONST(0.571452317717222), FRAC_CONST(0.820635271345081) }, { FRAC_CONST(0.568763739967354), FRAC_CONST(0.822500947171703) }, { FRAC_CONST(0.566069071214772), FRAC_CONST(0.824357814673971) }, { FRAC_CONST(0.563368340317214), FRAC_CONST(0.826205853966327) }, { FRAC_CONST(0.560661576197336), FRAC_CONST(0.828045045257756) }, { FRAC_CONST(0.557948807842409), FRAC_CONST(0.829875368851995) }, { FRAC_CONST(0.555230064304002), FRAC_CONST(0.831696805147750) }, { FRAC_CONST(0.552505374697674), FRAC_CONST(0.833509334638900) }, { FRAC_CONST(0.549774768202663), FRAC_CONST(0.835312937914713) }, { FRAC_CONST(0.547038274061568), FRAC_CONST(0.837107595660044) }, { FRAC_CONST(0.544295921580046), FRAC_CONST(0.838893288655553) }, { FRAC_CONST(0.541547740126486), FRAC_CONST(0.840669997777901) }, { FRAC_CONST(0.538793759131706), FRAC_CONST(0.842437703999961) }, { FRAC_CONST(0.536034008088628), FRAC_CONST(0.844196388391019) }, { FRAC_CONST(0.533268516551970), FRAC_CONST(0.845946032116980) }, { FRAC_CONST(0.530497314137923), FRAC_CONST(0.847686616440563) }, { FRAC_CONST(0.527720430523840), FRAC_CONST(0.849418122721510) }, { FRAC_CONST(0.524937895447912), FRAC_CONST(0.851140532416778) }, { FRAC_CONST(0.522149738708856), FRAC_CONST(0.852853827080745) }, { FRAC_CONST(0.519355990165590), FRAC_CONST(0.854557988365401) }, { FRAC_CONST(0.516556679736915), FRAC_CONST(0.856252998020546) }, { FRAC_CONST(0.513751837401199), FRAC_CONST(0.857938837893991) }, { FRAC_CONST(0.510941493196049), FRAC_CONST(0.859615489931744) }, { FRAC_CONST(0.508125677217994), FRAC_CONST(0.861282936178208) }, { FRAC_CONST(0.505304419622159), FRAC_CONST(0.862941158776375) }, { FRAC_CONST(0.502477750621949), FRAC_CONST(0.864590139968012) }, { FRAC_CONST(0.499645700488717), FRAC_CONST(0.866229862093855) }, { FRAC_CONST(0.496808299551444), FRAC_CONST(0.867860307593799) }, { FRAC_CONST(0.493965578196415), FRAC_CONST(0.869481459007080) }, { FRAC_CONST(0.491117566866892), FRAC_CONST(0.871093298972471) }, { FRAC_CONST(0.488264296062789), FRAC_CONST(0.872695810228461) }, { FRAC_CONST(0.485405796340343), FRAC_CONST(0.874288975613440) }, { FRAC_CONST(0.482542098311789), FRAC_CONST(0.875872778065888) }, { FRAC_CONST(0.479673232645033), FRAC_CONST(0.877447200624553) }, { FRAC_CONST(0.476799230063322), FRAC_CONST(0.879012226428633) }, { FRAC_CONST(0.473920121344914), FRAC_CONST(0.880567838717962) }, { FRAC_CONST(0.471035937322751), FRAC_CONST(0.882114020833179) }, { FRAC_CONST(0.468146708884125), FRAC_CONST(0.883650756215917) }, { FRAC_CONST(0.465252466970353), FRAC_CONST(0.885178028408975) }, { FRAC_CONST(0.462353242576441), FRAC_CONST(0.886695821056495) }, { FRAC_CONST(0.459449066750752), FRAC_CONST(0.888204117904136) }, { FRAC_CONST(0.456539970594675), FRAC_CONST(0.889702902799251) }, { FRAC_CONST(0.453625985262295), FRAC_CONST(0.891192159691058) }, { FRAC_CONST(0.450707141960053), FRAC_CONST(0.892671872630812) }, { FRAC_CONST(0.447783471946415), FRAC_CONST(0.894142025771977) }, { FRAC_CONST(0.444855006531538), FRAC_CONST(0.895602603370393) }, { FRAC_CONST(0.441921777076935), FRAC_CONST(0.897053589784447) }, { FRAC_CONST(0.438983814995137), FRAC_CONST(0.898494969475242) }, { FRAC_CONST(0.436041151749356), FRAC_CONST(0.899926727006758) }, { FRAC_CONST(0.433093818853152), FRAC_CONST(0.901348847046022) }, { FRAC_CONST(0.430141847870093), FRAC_CONST(0.902761314363272) }, { FRAC_CONST(0.427185270413416), FRAC_CONST(0.904164113832116) }, { FRAC_CONST(0.424224118145690), FRAC_CONST(0.905557230429701) }, { FRAC_CONST(0.421258422778478), FRAC_CONST(0.906940649236866) }, { FRAC_CONST(0.418288216071994), FRAC_CONST(0.908314355438308) }, { FRAC_CONST(0.415313529834766), FRAC_CONST(0.909678334322736) }, { FRAC_CONST(0.412334395923293), FRAC_CONST(0.911032571283032) }, { FRAC_CONST(0.409350846241706), FRAC_CONST(0.912377051816407) }, { FRAC_CONST(0.406362912741425), FRAC_CONST(0.913711761524555) }, { FRAC_CONST(0.403370627420818), FRAC_CONST(0.915036686113806) }, { FRAC_CONST(0.400374022324857), FRAC_CONST(0.916351811395282) }, { FRAC_CONST(0.397373129544774), FRAC_CONST(0.917657123285050) }, { FRAC_CONST(0.394367981217720), FRAC_CONST(0.918952607804266) }, { FRAC_CONST(0.391358609526420), FRAC_CONST(0.920238251079332) }, { FRAC_CONST(0.388345046698826), FRAC_CONST(0.921514039342042) }, { FRAC_CONST(0.385327325007776), FRAC_CONST(0.922779958929729) }, { FRAC_CONST(0.382305476770645), FRAC_CONST(0.924035996285410) }, { FRAC_CONST(0.379279534348999), FRAC_CONST(0.925282137957935) }, { FRAC_CONST(0.376249530148250), FRAC_CONST(0.926518370602127) }, { FRAC_CONST(0.373215496617310), FRAC_CONST(0.927744680978929) }, { FRAC_CONST(0.370177466248239), FRAC_CONST(0.928961055955541) }, { FRAC_CONST(0.367135471575903), FRAC_CONST(0.930167482505564) }, { FRAC_CONST(0.364089545177621), FRAC_CONST(0.931363947709140) }, { FRAC_CONST(0.361039719672816), FRAC_CONST(0.932550438753087) }, { FRAC_CONST(0.357986027722671), FRAC_CONST(0.933726942931039) }, { FRAC_CONST(0.354928502029772), FRAC_CONST(0.934893447643582) }, { FRAC_CONST(0.351867175337763), FRAC_CONST(0.936049940398387) }, { FRAC_CONST(0.348802080430994), FRAC_CONST(0.937196408810347) }, { FRAC_CONST(0.345733250134169), FRAC_CONST(0.938332840601705) }, { FRAC_CONST(0.342660717311994), FRAC_CONST(0.939459223602190) }, { FRAC_CONST(0.339584514868829), FRAC_CONST(0.940575545749145) }, { FRAC_CONST(0.336504675748328), FRAC_CONST(0.941681795087657) }, { FRAC_CONST(0.333421232933097), FRAC_CONST(0.942777959770684) }, { FRAC_CONST(0.330334219444328), FRAC_CONST(0.943864028059183) }, { FRAC_CONST(0.327243668341457), FRAC_CONST(0.944939988322235) }, { FRAC_CONST(0.324149612721804), FRAC_CONST(0.946005829037171) }, { FRAC_CONST(0.321052085720218), FRAC_CONST(0.947061538789691) }, { FRAC_CONST(0.317951120508725), FRAC_CONST(0.948107106273994) }, { FRAC_CONST(0.314846750296171), FRAC_CONST(0.949142520292891) }, { FRAC_CONST(0.311739008327867), FRAC_CONST(0.950167769757930) }, { FRAC_CONST(0.308627927885232), FRAC_CONST(0.951182843689513) }, { FRAC_CONST(0.305513542285440), FRAC_CONST(0.952187731217013) }, { FRAC_CONST(0.302395884881056), FRAC_CONST(0.953182421578893) }, { FRAC_CONST(0.299274989059689), FRAC_CONST(0.954166904122818) }, { FRAC_CONST(0.296150888243624), FRAC_CONST(0.955141168305771) }, { FRAC_CONST(0.293023615889471), FRAC_CONST(0.956105203694164) }, { FRAC_CONST(0.289893205487806), FRAC_CONST(0.957058999963955) }, { FRAC_CONST(0.286759690562807), FRAC_CONST(0.958002546900750) }, { FRAC_CONST(0.283623104671904), FRAC_CONST(0.958935834399920) }, { FRAC_CONST(0.280483481405410), FRAC_CONST(0.959858852466706) }, { FRAC_CONST(0.277340854386169), FRAC_CONST(0.960771591216325) }, { FRAC_CONST(0.274195257269191), FRAC_CONST(0.961674040874080) }, { FRAC_CONST(0.271046723741295), FRAC_CONST(0.962566191775459) }, { FRAC_CONST(0.267895287520743), FRAC_CONST(0.963448034366243) }, { FRAC_CONST(0.264740982356888), FRAC_CONST(0.964319559202607) }, { FRAC_CONST(0.261583842029803), FRAC_CONST(0.965180756951218) }, { FRAC_CONST(0.258423900349924), FRAC_CONST(0.966031618389343) }, { FRAC_CONST(0.255261191157689), FRAC_CONST(0.966872134404937) }, { FRAC_CONST(0.252095748323171), FRAC_CONST(0.967702295996750) }, { FRAC_CONST(0.248927605745720), FRAC_CONST(0.968522094274417) }, { FRAC_CONST(0.245756797353599), FRAC_CONST(0.969331520458559) }, { FRAC_CONST(0.242583357103617), FRAC_CONST(0.970130565880871) }, { FRAC_CONST(0.239407318980770), FRAC_CONST(0.970919221984218) }, { FRAC_CONST(0.236228716997876), FRAC_CONST(0.971697480322728) }, { FRAC_CONST(0.233047585195206), FRAC_CONST(0.972465332561878) }, { FRAC_CONST(0.229863957640129), FRAC_CONST(0.973222770478587) }, { FRAC_CONST(0.226677868426735), FRAC_CONST(0.973969785961306) }, { FRAC_CONST(0.223489351675482), FRAC_CONST(0.974706371010097) }, { FRAC_CONST(0.220298441532823), FRAC_CONST(0.975432517736727) }, { FRAC_CONST(0.217105172170841), FRAC_CONST(0.976148218364747) }, { FRAC_CONST(0.213909577786886), FRAC_CONST(0.976853465229579) }, { FRAC_CONST(0.210711692603206), FRAC_CONST(0.977548250778596) }, { FRAC_CONST(0.207511550866582), FRAC_CONST(0.978232567571202) }, { FRAC_CONST(0.204309186847962), FRAC_CONST(0.978906408278914) }, { FRAC_CONST(0.201104634842092), FRAC_CONST(0.979569765685441) }, { FRAC_CONST(0.197897929167148), FRAC_CONST(0.980222632686756) }, { FRAC_CONST(0.194689104164373), FRAC_CONST(0.980865002291179) }, { FRAC_CONST(0.191478194197704), FRAC_CONST(0.981496867619447) }, { FRAC_CONST(0.188265233653407), FRAC_CONST(0.982118221904791) }, { FRAC_CONST(0.185050256939710), FRAC_CONST(0.982729058493005) }, { FRAC_CONST(0.181833298486427), FRAC_CONST(0.983329370842520) }, { FRAC_CONST(0.178614392744603), FRAC_CONST(0.983919152524473) }, { FRAC_CONST(0.175393574186129), FRAC_CONST(0.984498397222776) }, { FRAC_CONST(0.172170877303385), FRAC_CONST(0.985067098734184) }, { FRAC_CONST(0.168946336608867), FRAC_CONST(0.985625250968360) }, { FRAC_CONST(0.165719986634814), FRAC_CONST(0.986172847947943) }, { FRAC_CONST(0.162491861932842), FRAC_CONST(0.986709883808609) }, { FRAC_CONST(0.159261997073573), FRAC_CONST(0.987236352799134) }, { FRAC_CONST(0.156030426646266), FRAC_CONST(0.987752249281460) }, { FRAC_CONST(0.152797185258443), FRAC_CONST(0.988257567730749) }, { FRAC_CONST(0.149562307535523), FRAC_CONST(0.988752302735447) }, { FRAC_CONST(0.146325828120446), FRAC_CONST(0.989236448997339) }, { FRAC_CONST(0.143087781673307), FRAC_CONST(0.989710001331608) }, { FRAC_CONST(0.139848202870981), FRAC_CONST(0.990172954666889) }, { FRAC_CONST(0.136607126406757), FRAC_CONST(0.990625304045323) }, { FRAC_CONST(0.133364586989957), FRAC_CONST(0.991067044622612) }, { FRAC_CONST(0.130120619345575), FRAC_CONST(0.991498171668069) }, { FRAC_CONST(0.126875258213898), FRAC_CONST(0.991918680564670) }, { FRAC_CONST(0.123628538350136), FRAC_CONST(0.992328566809103) }, { FRAC_CONST(0.120380494524051), FRAC_CONST(0.992727826011815) }, { FRAC_CONST(0.117131161519582), FRAC_CONST(0.993116453897061) }, { FRAC_CONST(0.113880574134475), FRAC_CONST(0.993494446302948) }, { FRAC_CONST(0.110628767179910), FRAC_CONST(0.993861799181482) }, { FRAC_CONST(0.107375775480128), FRAC_CONST(0.994218508598608) }, { FRAC_CONST(0.104121633872055), FRAC_CONST(0.994564570734255) }, { FRAC_CONST(0.100866377204933), FRAC_CONST(0.994899981882376) }, { FRAC_CONST(0.097610040339947), FRAC_CONST(0.995224738450986) }, { FRAC_CONST(0.094352658149849), FRAC_CONST(0.995538836962204) }, { FRAC_CONST(0.091094265518583), FRAC_CONST(0.995842274052287) }, { FRAC_CONST(0.087834897340919), FRAC_CONST(0.996135046471667) }, { FRAC_CONST(0.084574588522070), FRAC_CONST(0.996417151084987) }, { FRAC_CONST(0.081313373977324), FRAC_CONST(0.996688584871134) }, { FRAC_CONST(0.078051288631670), FRAC_CONST(0.996949344923269) }, { FRAC_CONST(0.074788367419420), FRAC_CONST(0.997199428448862) }, { FRAC_CONST(0.071524645283840), FRAC_CONST(0.997438832769720) }, { FRAC_CONST(0.068260157176771), FRAC_CONST(0.997667555322013) }, { FRAC_CONST(0.064994938058259), FRAC_CONST(0.997885593656308) }, { FRAC_CONST(0.061729022896176), FRAC_CONST(0.998092945437590) }, { FRAC_CONST(0.058462446665851), FRAC_CONST(0.998289608445286) }, { FRAC_CONST(0.055195244349690), FRAC_CONST(0.998475580573295) }, { FRAC_CONST(0.051927450936806), FRAC_CONST(0.998650859830004) }, { FRAC_CONST(0.048659101422640), FRAC_CONST(0.998815444338313) }, { FRAC_CONST(0.045390230808591), FRAC_CONST(0.998969332335654) }, { FRAC_CONST(0.042120874101635), FRAC_CONST(0.999112522174011) }, { FRAC_CONST(0.038851066313958), FRAC_CONST(0.999245012319936) }, { FRAC_CONST(0.035580842462574), FRAC_CONST(0.999366801354564) }, { FRAC_CONST(0.032310237568951), FRAC_CONST(0.999477887973635) }, { FRAC_CONST(0.029039286658643), FRAC_CONST(0.999578270987499) }, { FRAC_CONST(0.025768024760904), FRAC_CONST(0.999667949321134) }, { FRAC_CONST(0.022496486908322), FRAC_CONST(0.999746922014158) }, { FRAC_CONST(0.019224708136438), FRAC_CONST(0.999815188220837) }, { FRAC_CONST(0.015952723483375), FRAC_CONST(0.999872747210095) }, { FRAC_CONST(0.012680567989461), FRAC_CONST(0.999919598365521) }, { FRAC_CONST(0.009408276696850), FRAC_CONST(0.999955741185376) }, { FRAC_CONST(0.006135884649155), FRAC_CONST(0.999981175282601) }, { FRAC_CONST(0.002863426891064), FRAC_CONST(0.999995900384816) } }; #ifdef LD_DEC /* 240 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_960[] = { { FRAC_CONST(0.999999665337326), FRAC_CONST(0.000818122995607) }, { FRAC_CONST(0.999972892444367), FRAC_CONST(0.007363041249780) }, { FRAC_CONST(0.999903284040864), FRAC_CONST(0.013907644095771) }, { FRAC_CONST(0.999790843108610), FRAC_CONST(0.020451651184577) }, { FRAC_CONST(0.999635574464198), FRAC_CONST(0.026994782192715) }, { FRAC_CONST(0.999437484758823), FRAC_CONST(0.033536756834230) }, { FRAC_CONST(0.999196582477986), FRAC_CONST(0.040077294872701) }, { FRAC_CONST(0.998912877941140), FRAC_CONST(0.046616116133247) }, { FRAC_CONST(0.998586383301244), FRAC_CONST(0.053152940514528) }, { FRAC_CONST(0.998217112544241), FRAC_CONST(0.059687488000744) }, { FRAC_CONST(0.997805081488460), FRAC_CONST(0.066219478673630) }, { FRAC_CONST(0.997350307783942), FRAC_CONST(0.072748632724445) }, { FRAC_CONST(0.996852810911678), FRAC_CONST(0.079274670465961) }, { FRAC_CONST(0.996312612182778), FRAC_CONST(0.085797312344440) }, { FRAC_CONST(0.995729734737558), FRAC_CONST(0.092316278951614) }, { FRAC_CONST(0.995104203544548), FRAC_CONST(0.098831291036650) }, { FRAC_CONST(0.994436045399422), FRAC_CONST(0.105342069518114) }, { FRAC_CONST(0.993725288923851), FRAC_CONST(0.111848335495926) }, { FRAC_CONST(0.992971964564277), FRAC_CONST(0.118349810263305) }, { FRAC_CONST(0.992176104590608), FRAC_CONST(0.124846215318711) }, { FRAC_CONST(0.991337743094838), FRAC_CONST(0.131337272377774) }, { FRAC_CONST(0.990456915989581), FRAC_CONST(0.137822703385212) }, { FRAC_CONST(0.989533661006540), FRAC_CONST(0.144302230526747) }, { FRAC_CONST(0.988568017694885), FRAC_CONST(0.150775576241001) }, { FRAC_CONST(0.987560027419562), FRAC_CONST(0.157242463231389) }, { FRAC_CONST(0.986509733359519), FRAC_CONST(0.163702614477995) }, { FRAC_CONST(0.985417180505858), FRAC_CONST(0.170155753249442) }, { FRAC_CONST(0.984282415659907), FRAC_CONST(0.176601603114742) }, { FRAC_CONST(0.983105487431216), FRAC_CONST(0.183039887955141) }, { FRAC_CONST(0.981886446235473), FRAC_CONST(0.189470331975943) }, { FRAC_CONST(0.980625344292344), FRAC_CONST(0.195892659718330) }, { FRAC_CONST(0.979322235623241), FRAC_CONST(0.202306596071156) }, { FRAC_CONST(0.977977176049000), FRAC_CONST(0.208711866282735) }, { FRAC_CONST(0.976590223187499), FRAC_CONST(0.215108195972610) }, { FRAC_CONST(0.975161436451181), FRAC_CONST(0.221495311143304) }, { FRAC_CONST(0.973690877044515), FRAC_CONST(0.227872938192063) }, { FRAC_CONST(0.972178607961371), FRAC_CONST(0.234240803922570) }, { FRAC_CONST(0.970624693982323), FRAC_CONST(0.240598635556650) }, { FRAC_CONST(0.969029201671875), FRAC_CONST(0.246946160745958) }, { FRAC_CONST(0.967392199375607), FRAC_CONST(0.253283107583640) }, { FRAC_CONST(0.965713757217249), FRAC_CONST(0.259609204615985) }, { FRAC_CONST(0.963993947095677), FRAC_CONST(0.265924180854051) }, { FRAC_CONST(0.962232842681832), FRAC_CONST(0.272227765785273) }, { FRAC_CONST(0.960430519415566), FRAC_CONST(0.278519689385053) }, { FRAC_CONST(0.958587054502409), FRAC_CONST(0.284799682128326) }, { FRAC_CONST(0.956702526910263), FRAC_CONST(0.291067475001103) }, { FRAC_CONST(0.954777017366017), FRAC_CONST(0.297322799511998) }, { FRAC_CONST(0.952810608352092), FRAC_CONST(0.303565387703730) }, { FRAC_CONST(0.950803384102905), FRAC_CONST(0.309794972164597) }, { FRAC_CONST(0.948755430601263), FRAC_CONST(0.316011286039934) }, { FRAC_CONST(0.946666835574676), FRAC_CONST(0.322214063043544) }, { FRAC_CONST(0.944537688491606), FRAC_CONST(0.328403037469105) }, { FRAC_CONST(0.942368080557626), FRAC_CONST(0.334577944201551) }, { FRAC_CONST(0.940158104711519), FRAC_CONST(0.340738518728429) }, { FRAC_CONST(0.937907855621296), FRAC_CONST(0.346884497151231) }, { FRAC_CONST(0.935617429680138), FRAC_CONST(0.353015616196696) }, { FRAC_CONST(0.933286925002268), FRAC_CONST(0.359131613228090) }, { FRAC_CONST(0.930916441418752), FRAC_CONST(0.365232226256457) }, { FRAC_CONST(0.928506080473216), FRAC_CONST(0.371317193951838) }, { FRAC_CONST(0.926055945417500), FRAC_CONST(0.377386255654469) }, { FRAC_CONST(0.923566141207236), FRAC_CONST(0.383439151385947) }, { FRAC_CONST(0.921036774497350), FRAC_CONST(0.389475621860365) }, { FRAC_CONST(0.918467953637492), FRAC_CONST(0.395495408495417) }, { FRAC_CONST(0.915859788667400), FRAC_CONST(0.401498253423481) }, { FRAC_CONST(0.913212391312179), FRAC_CONST(0.407483899502658) }, { FRAC_CONST(0.910525874977521), FRAC_CONST(0.413452090327791) }, { FRAC_CONST(0.907800354744844), FRAC_CONST(0.419402570241451) }, { FRAC_CONST(0.905035947366364), FRAC_CONST(0.425335084344881) }, { FRAC_CONST(0.902232771260093), FRAC_CONST(0.431249378508924) }, { FRAC_CONST(0.899390946504764), FRAC_CONST(0.437145199384900) }, { FRAC_CONST(0.896510594834693), FRAC_CONST(0.443022294415467) }, { FRAC_CONST(0.893591839634558), FRAC_CONST(0.448880411845433) }, { FRAC_CONST(0.890634805934118), FRAC_CONST(0.454719300732547) }, { FRAC_CONST(0.887639620402854), FRAC_CONST(0.460538710958240) }, { FRAC_CONST(0.884606411344546), FRAC_CONST(0.466338393238348) }, { FRAC_CONST(0.881535308691775), FRAC_CONST(0.472118099133784) }, { FRAC_CONST(0.878426444000357), FRAC_CONST(0.477877581061184) }, { FRAC_CONST(0.875279950443708), FRAC_CONST(0.483616592303511) }, { FRAC_CONST(0.872095962807140), FRAC_CONST(0.489334887020625) }, { FRAC_CONST(0.868874617482085), FRAC_CONST(0.495032220259813) }, { FRAC_CONST(0.865616052460258), FRAC_CONST(0.500708347966279) }, { FRAC_CONST(0.862320407327736), FRAC_CONST(0.506363026993605) }, { FRAC_CONST(0.858987823258990), FRAC_CONST(0.511996015114162) }, { FRAC_CONST(0.855618443010829), FRAC_CONST(0.517607071029487) }, { FRAC_CONST(0.852212410916289), FRAC_CONST(0.523195954380619) }, { FRAC_CONST(0.848769872878448), FRAC_CONST(0.528762425758396) }, { FRAC_CONST(0.845290976364179), FRAC_CONST(0.534306246713712) }, { FRAC_CONST(0.841775870397828), FRAC_CONST(0.539827179767727) }, { FRAC_CONST(0.838224705554838), FRAC_CONST(0.545324988422046) }, { FRAC_CONST(0.834637633955290), FRAC_CONST(0.550799437168844) }, { FRAC_CONST(0.831014809257393), FRAC_CONST(0.556250291500956) }, { FRAC_CONST(0.827356386650900), FRAC_CONST(0.561677317921925) }, { FRAC_CONST(0.823662522850458), FRAC_CONST(0.567080283956001) }, { FRAC_CONST(0.819933376088899), FRAC_CONST(0.572458958158102) }, { FRAC_CONST(0.816169106110459), FRAC_CONST(0.577813110123727) }, { FRAC_CONST(0.812369874163934), FRAC_CONST(0.583142510498826) }, { FRAC_CONST(0.808535842995778), FRAC_CONST(0.588446930989624) }, { FRAC_CONST(0.804667176843123), FRAC_CONST(0.593726144372402) }, { FRAC_CONST(0.800764041426753), FRAC_CONST(0.598979924503229) }, { FRAC_CONST(0.796826603943998), FRAC_CONST(0.604208046327650) }, { FRAC_CONST(0.792855033061574), FRAC_CONST(0.609410285890327) }, { FRAC_CONST(0.788849498908361), FRAC_CONST(0.614586420344631) }, { FRAC_CONST(0.784810173068109), FRAC_CONST(0.619736227962191) }, { FRAC_CONST(0.780737228572094), FRAC_CONST(0.624859488142386) }, { FRAC_CONST(0.776630839891703), FRAC_CONST(0.629955981421804) }, { FRAC_CONST(0.772491182930959), FRAC_CONST(0.635025489483633) }, { FRAC_CONST(0.768318435018988), FRAC_CONST(0.640067795167023) }, { FRAC_CONST(0.764112774902423), FRAC_CONST(0.645082682476378) }, { FRAC_CONST(0.759874382737746), FRAC_CONST(0.650069936590618) }, { FRAC_CONST(0.755603440083571), FRAC_CONST(0.655029343872374) }, { FRAC_CONST(0.751300129892866), FRAC_CONST(0.659960691877147) }, { FRAC_CONST(0.746964636505118), FRAC_CONST(0.664863769362399) }, { FRAC_CONST(0.742597145638433), FRAC_CONST(0.669738366296610) }, { FRAC_CONST(0.738197844381584), FRAC_CONST(0.674584273868271) }, { FRAC_CONST(0.733766921185995), FRAC_CONST(0.679401284494831) }, { FRAC_CONST(0.729304565857668), FRAC_CONST(0.684189191831585) }, { FRAC_CONST(0.724810969549055), FRAC_CONST(0.688947790780520) }, { FRAC_CONST(0.720286324750863), FRAC_CONST(0.693676877499095) }, { FRAC_CONST(0.715730825283819), FRAC_CONST(0.698376249408973) }, { FRAC_CONST(0.711144666290356), FRAC_CONST(0.703045705204703) }, { FRAC_CONST(0.706528044226263), FRAC_CONST(0.707685044862340) }, { FRAC_CONST(0.701881156852263), FRAC_CONST(0.712294069648014) }, { FRAC_CONST(0.697204203225545), FRAC_CONST(0.716872582126442) }, { FRAC_CONST(0.692497383691237), FRAC_CONST(0.721420386169390) }, { FRAC_CONST(0.687760899873822), FRAC_CONST(0.725937286964068) }, { FRAC_CONST(0.682994954668502), FRAC_CONST(0.730423091021479) }, { FRAC_CONST(0.678199752232508), FRAC_CONST(0.734877606184707) }, { FRAC_CONST(0.673375497976352), FRAC_CONST(0.739300641637149) }, { FRAC_CONST(0.668522398555031), FRAC_CONST(0.743692007910687) }, { FRAC_CONST(0.663640661859171), FRAC_CONST(0.748051516893805) }, { FRAC_CONST(0.658730497006124), FRAC_CONST(0.752378981839648) }, { FRAC_CONST(0.653792114331011), FRAC_CONST(0.756674217374021) }, { FRAC_CONST(0.648825725377709), FRAC_CONST(0.760937039503328) }, { FRAC_CONST(0.643831542889792), FRAC_CONST(0.765167265622459) }, { FRAC_CONST(0.638809780801414), FRAC_CONST(0.769364714522605) }, { FRAC_CONST(0.633760654228152), FRAC_CONST(0.773529206399025) }, { FRAC_CONST(0.628684379457781), FRAC_CONST(0.777660562858748) }, { FRAC_CONST(0.623581173941019), FRAC_CONST(0.781758606928213) }, { FRAC_CONST(0.618451256282204), FRAC_CONST(0.785823163060853) }, { FRAC_CONST(0.613294846229936), FRAC_CONST(0.789854057144609) }, { FRAC_CONST(0.608112164667659), FRAC_CONST(0.793851116509396) }, { FRAC_CONST(0.602903433604202), FRAC_CONST(0.797814169934493) }, { FRAC_CONST(0.597668876164268), FRAC_CONST(0.801743047655882) }, { FRAC_CONST(0.592408716578875), FRAC_CONST(0.805637581373517) }, { FRAC_CONST(0.587123180175754), FRAC_CONST(0.809497604258536) }, { FRAC_CONST(0.581812493369691), FRAC_CONST(0.813322950960406) }, { FRAC_CONST(0.576476883652835), FRAC_CONST(0.817113457614006) }, { FRAC_CONST(0.571116579584947), FRAC_CONST(0.820868961846646) }, { FRAC_CONST(0.565731810783613), FRAC_CONST(0.824589302785025) }, { FRAC_CONST(0.560322807914407), FRAC_CONST(0.828274321062119) }, { FRAC_CONST(0.554889802681009), FRAC_CONST(0.831923858824010) }, { FRAC_CONST(0.549433027815281), FRAC_CONST(0.835537759736646) }, { FRAC_CONST(0.543952717067296), FRAC_CONST(0.839115868992540) }, { FRAC_CONST(0.538449105195327), FRAC_CONST(0.842658033317402) }, { FRAC_CONST(0.532922427955790), FRAC_CONST(0.846164100976699) }, { FRAC_CONST(0.527372922093142), FRAC_CONST(0.849633921782164) }, { FRAC_CONST(0.521800825329746), FRAC_CONST(0.853067347098221) }, { FRAC_CONST(0.516206376355680), FRAC_CONST(0.856464229848356) }, { FRAC_CONST(0.510589814818519), FRAC_CONST(0.859824424521420) }, { FRAC_CONST(0.504951381313066), FRAC_CONST(0.863147787177854) }, { FRAC_CONST(0.499291317371047), FRAC_CONST(0.866434175455865) }, { FRAC_CONST(0.493609865450762), FRAC_CONST(0.869683448577516) }, { FRAC_CONST(0.487907268926702), FRAC_CONST(0.872895467354761) }, { FRAC_CONST(0.482183772079123), FRAC_CONST(0.876070094195407) }, { FRAC_CONST(0.476439620083580), FRAC_CONST(0.879207193109004) }, { FRAC_CONST(0.470675059000427), FRAC_CONST(0.882306629712678) }, { FRAC_CONST(0.464890335764274), FRAC_CONST(0.885368271236879) }, { FRAC_CONST(0.459085698173413), FRAC_CONST(0.888391986531075) }, { FRAC_CONST(0.453261394879198), FRAC_CONST(0.891377646069366) }, { FRAC_CONST(0.447417675375397), FRAC_CONST(0.894325121956035) }, { FRAC_CONST(0.441554789987504), FRAC_CONST(0.897234287931024) }, { FRAC_CONST(0.435672989862017), FRAC_CONST(0.900105019375345) }, { FRAC_CONST(0.429772526955677), FRAC_CONST(0.902937193316419) }, { FRAC_CONST(0.423853654024676), FRAC_CONST(0.905730688433339) }, { FRAC_CONST(0.417916624613831), FRAC_CONST(0.908485385062073) }, { FRAC_CONST(0.411961693045722), FRAC_CONST(0.911201165200584) }, { FRAC_CONST(0.405989114409798), FRAC_CONST(0.913877912513892) }, { FRAC_CONST(0.399999144551449), FRAC_CONST(0.916515512339049) }, { FRAC_CONST(0.393992040061048), FRAC_CONST(0.919113851690058) }, { FRAC_CONST(0.387968058262959), FRAC_CONST(0.921672819262709) }, { FRAC_CONST(0.381927457204511), FRAC_CONST(0.924192305439348) }, { FRAC_CONST(0.375870495644949), FRAC_CONST(0.926672202293573) }, { FRAC_CONST(0.369797433044349), FRAC_CONST(0.929112403594856) }, { FRAC_CONST(0.363708529552499), FRAC_CONST(0.931512804813095) }, { FRAC_CONST(0.357604045997758), FRAC_CONST(0.933873303123091) }, { FRAC_CONST(0.351484243875885), FRAC_CONST(0.936193797408954) }, { FRAC_CONST(0.345349385338836), FRAC_CONST(0.938474188268430) }, { FRAC_CONST(0.339199733183530), FRAC_CONST(0.940714378017165) }, { FRAC_CONST(0.333035550840599), FRAC_CONST(0.942914270692887) }, { FRAC_CONST(0.326857102363098), FRAC_CONST(0.945073772059514) }, { FRAC_CONST(0.320664652415198), FRAC_CONST(0.947192789611197) }, { FRAC_CONST(0.314458466260842), FRAC_CONST(0.949271232576274) }, { FRAC_CONST(0.308238809752391), FRAC_CONST(0.951309011921168) }, { FRAC_CONST(0.302005949319228), FRAC_CONST(0.953306040354194) }, { FRAC_CONST(0.295760151956351), FRAC_CONST(0.955262232329299) }, { FRAC_CONST(0.289501685212929), FRAC_CONST(0.957177504049732) }, { FRAC_CONST(0.283230817180850), FRAC_CONST(0.959051773471624) }, { FRAC_CONST(0.276947816483228), FRAC_CONST(0.960884960307514) }, { FRAC_CONST(0.270652952262902), FRAC_CONST(0.962676986029777) }, { FRAC_CONST(0.264346494170904), FRAC_CONST(0.964427773873996) }, { FRAC_CONST(0.258028712354909), FRAC_CONST(0.966137248842248) }, { FRAC_CONST(0.251699877447663), FRAC_CONST(0.967805337706313) }, { FRAC_CONST(0.245360260555389), FRAC_CONST(0.969431969010818) }, { FRAC_CONST(0.239010133246176), FRAC_CONST(0.971017073076290) }, { FRAC_CONST(0.232649767538342), FRAC_CONST(0.972560582002147) }, { FRAC_CONST(0.226279435888785), FRAC_CONST(0.974062429669605) }, { FRAC_CONST(0.219899411181310), FRAC_CONST(0.975522551744506) }, { FRAC_CONST(0.213509966714943), FRAC_CONST(0.976940885680082) }, { FRAC_CONST(0.207111376192219), FRAC_CONST(0.978317370719628) }, { FRAC_CONST(0.200703913707458), FRAC_CONST(0.979651947899104) }, { FRAC_CONST(0.194287853735029), FRAC_CONST(0.980944560049668) }, { FRAC_CONST(0.187863471117585), FRAC_CONST(0.982195151800116) }, { FRAC_CONST(0.181431041054297), FRAC_CONST(0.983403669579260) }, { FRAC_CONST(0.174990839089060), FRAC_CONST(0.984570061618221) }, { FRAC_CONST(0.168543141098691), FRAC_CONST(0.985694277952645) }, { FRAC_CONST(0.162088223281113), FRAC_CONST(0.986776270424848) }, { FRAC_CONST(0.155626362143520), FRAC_CONST(0.987815992685872) }, { FRAC_CONST(0.149157834490539), FRAC_CONST(0.988813400197476) }, { FRAC_CONST(0.142682917412363), FRAC_CONST(0.989768450234042) }, { FRAC_CONST(0.136201888272891), FRAC_CONST(0.990681101884405) }, { FRAC_CONST(0.129715024697841), FRAC_CONST(0.991551316053606) }, { FRAC_CONST(0.123222604562857), FRAC_CONST(0.992379055464567) }, { FRAC_CONST(0.116724905981611), FRAC_CONST(0.993164284659685) }, { FRAC_CONST(0.110222207293883), FRAC_CONST(0.993906970002356) }, { FRAC_CONST(0.103714787053643), FRAC_CONST(0.994607079678411) }, { FRAC_CONST(0.097202924017115), FRAC_CONST(0.995264583697482) }, { FRAC_CONST(0.090686897130838), FRAC_CONST(0.995879453894286) }, { FRAC_CONST(0.084166985519718), FRAC_CONST(0.996451663929828) }, { FRAC_CONST(0.077643468475068), FRAC_CONST(0.996981189292537) }, { FRAC_CONST(0.071116625442645), FRAC_CONST(0.997468007299307) }, { FRAC_CONST(0.064586736010684), FRAC_CONST(0.997912097096476) }, { FRAC_CONST(0.058054079897912), FRAC_CONST(0.998313439660714) }, { FRAC_CONST(0.051518936941578), FRAC_CONST(0.998672017799843) }, { FRAC_CONST(0.044981587085452), FRAC_CONST(0.998987816153567) }, { FRAC_CONST(0.038442310367847), FRAC_CONST(0.999260821194138) }, { FRAC_CONST(0.031901386909611), FRAC_CONST(0.999491021226926) }, { FRAC_CONST(0.025359096902136), FRAC_CONST(0.999678406390929) }, { FRAC_CONST(0.018815720595351), FRAC_CONST(0.999822968659191) }, { FRAC_CONST(0.012271538285720), FRAC_CONST(0.999924701839145) }, { FRAC_CONST(0.005726830304231), FRAC_CONST(0.999983601572879) } }; #endif // LD_DEC /* 60 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_240[] = { { FRAC_CONST(0.999994645401696), FRAC_CONST(0.003272486506527) }, { FRAC_CONST(0.999566308502021), FRAC_CONST(0.029448173247963) }, { FRAC_CONST(0.998452918783950), FRAC_CONST(0.055603677682425) }, { FRAC_CONST(0.996655239309180), FRAC_CONST(0.081721074133668) }, { FRAC_CONST(0.994174502117428), FRAC_CONST(0.107782463042759) }, { FRAC_CONST(0.991012407382049), FRAC_CONST(0.133769983235535) }, { FRAC_CONST(0.987171122244825), FRAC_CONST(0.159665824163761) }, { FRAC_CONST(0.982653279330712), FRAC_CONST(0.185452238111591) }, { FRAC_CONST(0.977461974943572), FRAC_CONST(0.211111552358965) }, { FRAC_CONST(0.971600766944121), FRAC_CONST(0.236626181293610) }, { FRAC_CONST(0.965073672311547), FRAC_CONST(0.261978638463337) }, { FRAC_CONST(0.957885164390477), FRAC_CONST(0.287151548560387) }, { FRAC_CONST(0.950040169825165), FRAC_CONST(0.312127659329594) }, { FRAC_CONST(0.941544065183021), FRAC_CONST(0.336889853392220) }, { FRAC_CONST(0.932402673269775), FRAC_CONST(0.361421159977355) }, { FRAC_CONST(0.922622259138823), FRAC_CONST(0.385704766552831) }, { FRAC_CONST(0.912209525797468), FRAC_CONST(0.409724030347695) }, { FRAC_CONST(0.901171609613013), FRAC_CONST(0.433462489758331) }, { FRAC_CONST(0.889516075421856), FRAC_CONST(0.456903875630421) }, { FRAC_CONST(0.877250911344924), FRAC_CONST(0.480032122409011) }, { FRAC_CONST(0.864384523313017), FRAC_CONST(0.502831379149042) }, { FRAC_CONST(0.850925729305802), FRAC_CONST(0.525286020378792) }, { FRAC_CONST(0.836883753308409), FRAC_CONST(0.547380656808797) }, { FRAC_CONST(0.822268218989775), FRAC_CONST(0.569100145878898) }, { FRAC_CONST(0.807089143107059), FRAC_CONST(0.590429602136201) }, { FRAC_CONST(0.791356928640660), FRAC_CONST(0.611354407436816) }, { FRAC_CONST(0.775082357664531), FRAC_CONST(0.631860220964409) }, { FRAC_CONST(0.758276583956687), FRAC_CONST(0.651932989058674) }, { FRAC_CONST(0.740951125354959), FRAC_CONST(0.671558954847018) }, { FRAC_CONST(0.723117855863248), FRAC_CONST(0.690724667672829) }, { FRAC_CONST(0.704788997513670), FRAC_CONST(0.709416992313883) }, { FRAC_CONST(0.685977111990193), FRAC_CONST(0.727623117984575) }, { FRAC_CONST(0.666695092019479), FRAC_CONST(0.745330567115786) }, { FRAC_CONST(0.646956152534857), FRAC_CONST(0.762527203906388) }, { FRAC_CONST(0.626773821619469), FRAC_CONST(0.779201242640517) }, { FRAC_CONST(0.606161931234795), FRAC_CONST(0.795341255764910) }, { FRAC_CONST(0.585134607740916), FRAC_CONST(0.810936181720784) }, { FRAC_CONST(0.563706262215017), FRAC_CONST(0.825975332524873) }, { FRAC_CONST(0.541891580574752), FRAC_CONST(0.840448401094438) }, { FRAC_CONST(0.519705513513249), FRAC_CONST(0.854345468311227) }, { FRAC_CONST(0.497163266252654), FRAC_CONST(0.867657009819544) }, { FRAC_CONST(0.474280288123229), FRAC_CONST(0.880373902553765) }, { FRAC_CONST(0.451072261975153), FRAC_CONST(0.892487430990834) }, { FRAC_CONST(0.427555093430282), FRAC_CONST(0.903989293123443) }, { FRAC_CONST(0.403744899981227), FRAC_CONST(0.914871606149819) }, { FRAC_CONST(0.379657999945233), FRAC_CONST(0.925126911876195) }, { FRAC_CONST(0.355310901280416), FRAC_CONST(0.934748181828292) }, { FRAC_CONST(0.330720290272038), FRAC_CONST(0.943728822068278) }, { FRAC_CONST(0.305903020096554), FRAC_CONST(0.952062677713924) }, { FRAC_CONST(0.280876099271292), FRAC_CONST(0.959744037156857) }, { FRAC_CONST(0.255656679997665), FRAC_CONST(0.966767635977008) }, { FRAC_CONST(0.230262046405902), FRAC_CONST(0.973128660550580) }, { FRAC_CONST(0.204709602709380), FRAC_CONST(0.978822751349072) }, { FRAC_CONST(0.179016861276633), FRAC_CONST(0.983846005927077) }, { FRAC_CONST(0.153201430629259), FRAC_CONST(0.988194981596825) }, { FRAC_CONST(0.127281003373913), FRAC_CONST(0.991866697787626) }, { FRAC_CONST(0.101273344076683), FRAC_CONST(0.994858638088611) }, { FRAC_CONST(0.075196277088140), FRAC_CONST(0.997168751973348) }, { FRAC_CONST(0.049067674327418), FRAC_CONST(0.998795456205172) }, { FRAC_CONST(0.022905443033697), FRAC_CONST(0.999737635922260) } }; #endif // ALLOW_SMALL_FRAMELENGTH #ifdef SSR_DEC /* 128 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_512[] = { { FRAC_CONST(0.999998823451702), FRAC_CONST(0.001533980186285) }, { FRAC_CONST(0.999904701082853), FRAC_CONST(0.013805388528060) }, { FRAC_CONST(0.999659996743959), FRAC_CONST(0.026074717829104) }, { FRAC_CONST(0.999264747286594), FRAC_CONST(0.038340120373553) }, { FRAC_CONST(0.998719012233873), FRAC_CONST(0.050599749036899) }, { FRAC_CONST(0.998022873771486), FRAC_CONST(0.062851757564161) }, { FRAC_CONST(0.997176436735326), FRAC_CONST(0.075094300847921) }, { FRAC_CONST(0.996179828595697), FRAC_CONST(0.087325535206192) }, { FRAC_CONST(0.995033199438119), FRAC_CONST(0.099543618660069) }, { FRAC_CONST(0.993736721940725), FRAC_CONST(0.111746711211127) }, { FRAC_CONST(0.992290591348257), FRAC_CONST(0.123932975118512) }, { FRAC_CONST(0.990695025442665), FRAC_CONST(0.136100575175706) }, { FRAC_CONST(0.988950264510303), FRAC_CONST(0.148247678986896) }, { FRAC_CONST(0.987056571305751), FRAC_CONST(0.160372457242928) }, { FRAC_CONST(0.985014231012240), FRAC_CONST(0.172473083996796) }, { FRAC_CONST(0.982823551198705), FRAC_CONST(0.184547736938620) }, { FRAC_CONST(0.980484861773469), FRAC_CONST(0.196594597670080) }, { FRAC_CONST(0.977998514934557), FRAC_CONST(0.208611851978263) }, { FRAC_CONST(0.975364885116657), FRAC_CONST(0.220597690108874) }, { FRAC_CONST(0.972584368934732), FRAC_CONST(0.232550307038775) }, { FRAC_CONST(0.969657385124292), FRAC_CONST(0.244467902747824) }, { FRAC_CONST(0.966584374478333), FRAC_CONST(0.256348682489943) }, { FRAC_CONST(0.963365799780954), FRAC_CONST(0.268190857063403) }, { FRAC_CONST(0.960002145737666), FRAC_CONST(0.279992643080273) }, { FRAC_CONST(0.956493918902395), FRAC_CONST(0.291752263234989) }, { FRAC_CONST(0.952841647601199), FRAC_CONST(0.303467946572011) }, { FRAC_CONST(0.949045881852701), FRAC_CONST(0.315137928752522) }, { FRAC_CONST(0.945107193285261), FRAC_CONST(0.326760452320132) }, { FRAC_CONST(0.941026175050889), FRAC_CONST(0.338333766965541) }, { FRAC_CONST(0.936803441735922), FRAC_CONST(0.349856129790135) }, { FRAC_CONST(0.932439629268462), FRAC_CONST(0.361325805568454) }, { FRAC_CONST(0.927935394822618), FRAC_CONST(0.372741067009516) }, { FRAC_CONST(0.923291416719528), FRAC_CONST(0.384100195016935) }, { FRAC_CONST(0.918508394325212), FRAC_CONST(0.395401478947816) }, { FRAC_CONST(0.913587047945251), FRAC_CONST(0.406643216870369) }, { FRAC_CONST(0.908528118716306), FRAC_CONST(0.417823715820212) }, { FRAC_CONST(0.903332368494512), FRAC_CONST(0.428941292055329) }, { FRAC_CONST(0.898000579740740), FRAC_CONST(0.439994271309633) }, { FRAC_CONST(0.892533555402765), FRAC_CONST(0.450980989045104) }, { FRAC_CONST(0.886932118794342), FRAC_CONST(0.461899790702463) }, { FRAC_CONST(0.881197113471222), FRAC_CONST(0.472749031950343) }, { FRAC_CONST(0.875329403104111), FRAC_CONST(0.483527078932919) }, { FRAC_CONST(0.869329871348607), FRAC_CONST(0.494232308515960) }, { FRAC_CONST(0.863199421712124), FRAC_CONST(0.504863108531268) }, { FRAC_CONST(0.856938977417829), FRAC_CONST(0.515417878019463) }, { FRAC_CONST(0.850549481265603), FRAC_CONST(0.525895027471085) }, { FRAC_CONST(0.844031895490066), FRAC_CONST(0.536292979065963) }, { FRAC_CONST(0.837387201615662), FRAC_CONST(0.546610166910835) }, { FRAC_CONST(0.830616400308846), FRAC_CONST(0.556845037275160) }, { FRAC_CONST(0.823720511227391), FRAC_CONST(0.566996048825109) }, { FRAC_CONST(0.816700572866828), FRAC_CONST(0.577061672855679) }, { FRAC_CONST(0.809557642404051), FRAC_CONST(0.587040393520918) }, { FRAC_CONST(0.802292795538116), FRAC_CONST(0.596930708062197) }, { FRAC_CONST(0.794907126328237), FRAC_CONST(0.606731127034524) }, { FRAC_CONST(0.787401747029031), FRAC_CONST(0.616440174530854) }, { FRAC_CONST(0.779777787923015), FRAC_CONST(0.626056388404344) }, { FRAC_CONST(0.772036397150385), FRAC_CONST(0.635578320488556) }, { FRAC_CONST(0.764178740536117), FRAC_CONST(0.645004536815544) }, { FRAC_CONST(0.756206001414395), FRAC_CONST(0.654333617831800) }, { FRAC_CONST(0.748119380450404), FRAC_CONST(0.663564158612040) }, { FRAC_CONST(0.739920095459516), FRAC_CONST(0.672694769070773) }, { FRAC_CONST(0.731609381223893), FRAC_CONST(0.681724074171650) }, { FRAC_CONST(0.723188489306527), FRAC_CONST(0.690650714134535) }, { FRAC_CONST(0.714658687862769), FRAC_CONST(0.699473344640284) }, { FRAC_CONST(0.706021261449340), FRAC_CONST(0.708190637033195) }, { FRAC_CONST(0.697277510830887), FRAC_CONST(0.716801278521100) }, { FRAC_CONST(0.688428752784091), FRAC_CONST(0.725303972373061) }, { FRAC_CONST(0.679476319899365), FRAC_CONST(0.733697438114660) }, { FRAC_CONST(0.670421560380173), FRAC_CONST(0.741980411720831) }, { FRAC_CONST(0.661265837839992), FRAC_CONST(0.750151645806215) }, { FRAC_CONST(0.652010531096960), FRAC_CONST(0.758209909813015) }, { FRAC_CONST(0.642657033966227), FRAC_CONST(0.766153990196313) }, { FRAC_CONST(0.633206755050057), FRAC_CONST(0.773982690606823) }, { FRAC_CONST(0.623661117525695), FRAC_CONST(0.781694832071059) }, { FRAC_CONST(0.614021558931038), FRAC_CONST(0.789289253168886) }, { FRAC_CONST(0.604289530948156), FRAC_CONST(0.796764810208419) }, { FRAC_CONST(0.594466499184665), FRAC_CONST(0.804120377398266) }, { FRAC_CONST(0.584553942953015), FRAC_CONST(0.811354847017064) }, { FRAC_CONST(0.574553355047716), FRAC_CONST(0.818467129580299) }, { FRAC_CONST(0.564466241520520), FRAC_CONST(0.825456154004377) }, { FRAC_CONST(0.554294121453620), FRAC_CONST(0.832320867767930) }, { FRAC_CONST(0.544038526730884), FRAC_CONST(0.839060237070313) }, { FRAC_CONST(0.533701001807153), FRAC_CONST(0.845673246987299) }, { FRAC_CONST(0.523283103475656), FRAC_CONST(0.852158901623920) }, { FRAC_CONST(0.512786400633563), FRAC_CONST(0.858516224264443) }, { FRAC_CONST(0.502212474045711), FRAC_CONST(0.864744257519462) }, { FRAC_CONST(0.491562916106550), FRAC_CONST(0.870842063470079) }, { FRAC_CONST(0.480839330600334), FRAC_CONST(0.876808723809146) }, { FRAC_CONST(0.470043332459596), FRAC_CONST(0.882643339979563) }, { FRAC_CONST(0.459176547521944), FRAC_CONST(0.888345033309596) }, { FRAC_CONST(0.448240612285220), FRAC_CONST(0.893912945145203) }, { FRAC_CONST(0.437237173661044), FRAC_CONST(0.899346236979341) }, { FRAC_CONST(0.426167888726800), FRAC_CONST(0.904644090578246) }, { FRAC_CONST(0.415034424476082), FRAC_CONST(0.909805708104652) }, { FRAC_CONST(0.403838457567654), FRAC_CONST(0.914830312237946) }, { FRAC_CONST(0.392581674072952), FRAC_CONST(0.919717146291227) }, { FRAC_CONST(0.381265769222162), FRAC_CONST(0.924465474325263) }, { FRAC_CONST(0.369892447148934), FRAC_CONST(0.929074581259316) }, { FRAC_CONST(0.358463420633737), FRAC_CONST(0.933543772978836) }, { FRAC_CONST(0.346980410845924), FRAC_CONST(0.937872376439990) }, { FRAC_CONST(0.335445147084532), FRAC_CONST(0.942059739771017) }, { FRAC_CONST(0.323859366517853), FRAC_CONST(0.946105232370403) }, { FRAC_CONST(0.312224813921825), FRAC_CONST(0.950008245001843) }, { FRAC_CONST(0.300543241417273), FRAC_CONST(0.953768189885990) }, { FRAC_CONST(0.288816408206049), FRAC_CONST(0.957384500788976) }, { FRAC_CONST(0.277046080306100), FRAC_CONST(0.960856633107680) }, { FRAC_CONST(0.265234030285512), FRAC_CONST(0.964184063951746) }, { FRAC_CONST(0.253382036995570), FRAC_CONST(0.967366292222329) }, { FRAC_CONST(0.241491885302869), FRAC_CONST(0.970402838687556) }, { FRAC_CONST(0.229565365820519), FRAC_CONST(0.973293246054698) }, { FRAC_CONST(0.217604274638484), FRAC_CONST(0.976037079039039) }, { FRAC_CONST(0.205610413053099), FRAC_CONST(0.978633924429423) }, { FRAC_CONST(0.193585587295804), FRAC_CONST(0.981083391150487) }, { FRAC_CONST(0.181531608261125), FRAC_CONST(0.983385110321551) }, { FRAC_CONST(0.169450291233968), FRAC_CONST(0.985538735312176) }, { FRAC_CONST(0.157343455616238), FRAC_CONST(0.987543941794359) }, { FRAC_CONST(0.145212924652848), FRAC_CONST(0.989400427791380) }, { FRAC_CONST(0.133060525157139), FRAC_CONST(0.991107913723277) }, { FRAC_CONST(0.120888087235777), FRAC_CONST(0.992666142448948) }, { FRAC_CONST(0.108697444013139), FRAC_CONST(0.994074879304879) }, { FRAC_CONST(0.096490431355253), FRAC_CONST(0.995333912140482) }, { FRAC_CONST(0.084268887593324), FRAC_CONST(0.996443051350043) }, { FRAC_CONST(0.072034653246889), FRAC_CONST(0.997402129901275) }, { FRAC_CONST(0.059789570746640), FRAC_CONST(0.998211003360478) }, { FRAC_CONST(0.047535484156959), FRAC_CONST(0.998869549914284) }, { FRAC_CONST(0.035274238898214), FRAC_CONST(0.999377670388003) }, { FRAC_CONST(0.023007681468839), FRAC_CONST(0.999735288260562) }, { FRAC_CONST(0.010737659167265), FRAC_CONST(0.999942349676024) } }; /* 16 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_64[] = { { FRAC_CONST(0.999924701839145), FRAC_CONST(0.012271538285720) }, { FRAC_CONST(0.993906970002356), FRAC_CONST(0.110222207293883) }, { FRAC_CONST(0.978317370719628), FRAC_CONST(0.207111376192219) }, { FRAC_CONST(0.953306040354194), FRAC_CONST(0.302005949319228) }, { FRAC_CONST(0.919113851690058), FRAC_CONST(0.393992040061048) }, { FRAC_CONST(0.876070094195407), FRAC_CONST(0.482183772079123) }, { FRAC_CONST(0.824589302785025), FRAC_CONST(0.565731810783613) }, { FRAC_CONST(0.765167265622459), FRAC_CONST(0.643831542889791) }, { FRAC_CONST(0.698376249408973), FRAC_CONST(0.715730825283819) }, { FRAC_CONST(0.624859488142386), FRAC_CONST(0.780737228572094) }, { FRAC_CONST(0.545324988422046), FRAC_CONST(0.838224705554838) }, { FRAC_CONST(0.460538710958240), FRAC_CONST(0.887639620402854) }, { FRAC_CONST(0.371317193951838), FRAC_CONST(0.928506080473215) }, { FRAC_CONST(0.278519689385053), FRAC_CONST(0.960430519415566) }, { FRAC_CONST(0.183039887955141), FRAC_CONST(0.983105487431216) }, { FRAC_CONST(0.085797312344440), FRAC_CONST(0.996312612182778) } }; #endif // SSR_DEC #else // FIXED_POINT /* 256 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_2048[] = { { FRAC_CONST(0.031249997702054), FRAC_CONST(0.000011984224612) }, { FRAC_CONST(0.031249813866531), FRAC_CONST(0.000107857810004) }, { FRAC_CONST(0.031249335895858), FRAC_CONST(0.000203730380198) }, { FRAC_CONST(0.031248563794535), FRAC_CONST(0.000299601032804) }, { FRAC_CONST(0.031247497569829), FRAC_CONST(0.000395468865451) }, { FRAC_CONST(0.031246137231775), FRAC_CONST(0.000491332975794) }, { FRAC_CONST(0.031244482793177), FRAC_CONST(0.000587192461525) }, { FRAC_CONST(0.031242534269608), FRAC_CONST(0.000683046420376) }, { FRAC_CONST(0.031240291679407), FRAC_CONST(0.000778893950134) }, { FRAC_CONST(0.031237755043684), FRAC_CONST(0.000874734148645) }, { FRAC_CONST(0.031234924386313), FRAC_CONST(0.000970566113826) }, { FRAC_CONST(0.031231799733938), FRAC_CONST(0.001066388943669) }, { FRAC_CONST(0.031228381115970), FRAC_CONST(0.001162201736253) }, { FRAC_CONST(0.031224668564585), FRAC_CONST(0.001258003589751) }, { FRAC_CONST(0.031220662114728), FRAC_CONST(0.001353793602441) }, { FRAC_CONST(0.031216361804108), FRAC_CONST(0.001449570872710) }, { FRAC_CONST(0.031211767673203), FRAC_CONST(0.001545334499065) }, { FRAC_CONST(0.031206879765253), FRAC_CONST(0.001641083580144) }, { FRAC_CONST(0.031201698126266), FRAC_CONST(0.001736817214719) }, { FRAC_CONST(0.031196222805014), FRAC_CONST(0.001832534501709) }, { FRAC_CONST(0.031190453853031), FRAC_CONST(0.001928234540186) }, { FRAC_CONST(0.031184391324617), FRAC_CONST(0.002023916429386) }, { FRAC_CONST(0.031178035276836), FRAC_CONST(0.002119579268713) }, { FRAC_CONST(0.031171385769513), FRAC_CONST(0.002215222157753) }, { FRAC_CONST(0.031164442865236), FRAC_CONST(0.002310844196278) }, { FRAC_CONST(0.031157206629353), FRAC_CONST(0.002406444484258) }, { FRAC_CONST(0.031149677129975), FRAC_CONST(0.002502022121865) }, { FRAC_CONST(0.031141854437973), FRAC_CONST(0.002597576209488) }, { FRAC_CONST(0.031133738626977), FRAC_CONST(0.002693105847734) }, { FRAC_CONST(0.031125329773375), FRAC_CONST(0.002788610137442) }, { FRAC_CONST(0.031116627956316), FRAC_CONST(0.002884088179689) }, { FRAC_CONST(0.031107633257703), FRAC_CONST(0.002979539075801) }, { FRAC_CONST(0.031098345762200), FRAC_CONST(0.003074961927355) }, { FRAC_CONST(0.031088765557222), FRAC_CONST(0.003170355836197) }, { FRAC_CONST(0.031078892732942), FRAC_CONST(0.003265719904442) }, { FRAC_CONST(0.031068727382288), FRAC_CONST(0.003361053234488) }, { FRAC_CONST(0.031058269600939), FRAC_CONST(0.003456354929021) }, { FRAC_CONST(0.031047519487329), FRAC_CONST(0.003551624091024) }, { FRAC_CONST(0.031036477142640), FRAC_CONST(0.003646859823790) }, { FRAC_CONST(0.031025142670809), FRAC_CONST(0.003742061230921) }, { FRAC_CONST(0.031013516178519), FRAC_CONST(0.003837227416347) }, { FRAC_CONST(0.031001597775203), FRAC_CONST(0.003932357484328) }, { FRAC_CONST(0.030989387573042), FRAC_CONST(0.004027450539462) }, { FRAC_CONST(0.030976885686963), FRAC_CONST(0.004122505686697) }, { FRAC_CONST(0.030964092234638), FRAC_CONST(0.004217522031340) }, { FRAC_CONST(0.030951007336485), FRAC_CONST(0.004312498679058) }, { FRAC_CONST(0.030937631115663), FRAC_CONST(0.004407434735897) }, { FRAC_CONST(0.030923963698074), FRAC_CONST(0.004502329308281) }, { FRAC_CONST(0.030910005212362), FRAC_CONST(0.004597181503027) }, { FRAC_CONST(0.030895755789908), FRAC_CONST(0.004691990427350) }, { FRAC_CONST(0.030881215564835), FRAC_CONST(0.004786755188872) }, { FRAC_CONST(0.030866384674000), FRAC_CONST(0.004881474895632) }, { FRAC_CONST(0.030851263256996), FRAC_CONST(0.004976148656090) }, { FRAC_CONST(0.030835851456154), FRAC_CONST(0.005070775579142) }, { FRAC_CONST(0.030820149416533), FRAC_CONST(0.005165354774124) }, { FRAC_CONST(0.030804157285929), FRAC_CONST(0.005259885350819) }, { FRAC_CONST(0.030787875214864), FRAC_CONST(0.005354366419469) }, { FRAC_CONST(0.030771303356593), FRAC_CONST(0.005448797090784) }, { FRAC_CONST(0.030754441867095), FRAC_CONST(0.005543176475946) }, { FRAC_CONST(0.030737290905077), FRAC_CONST(0.005637503686619) }, { FRAC_CONST(0.030719850631972), FRAC_CONST(0.005731777834961) }, { FRAC_CONST(0.030702121211932), FRAC_CONST(0.005825998033626) }, { FRAC_CONST(0.030684102811835), FRAC_CONST(0.005920163395780) }, { FRAC_CONST(0.030665795601276), FRAC_CONST(0.006014273035101) }, { FRAC_CONST(0.030647199752570), FRAC_CONST(0.006108326065793) }, { FRAC_CONST(0.030628315440748), FRAC_CONST(0.006202321602594) }, { FRAC_CONST(0.030609142843557), FRAC_CONST(0.006296258760782) }, { FRAC_CONST(0.030589682141455), FRAC_CONST(0.006390136656185) }, { FRAC_CONST(0.030569933517616), FRAC_CONST(0.006483954405188) }, { FRAC_CONST(0.030549897157919), FRAC_CONST(0.006577711124743) }, { FRAC_CONST(0.030529573250956), FRAC_CONST(0.006671405932375) }, { FRAC_CONST(0.030508961988022), FRAC_CONST(0.006765037946194) }, { FRAC_CONST(0.030488063563118), FRAC_CONST(0.006858606284900) }, { FRAC_CONST(0.030466878172949), FRAC_CONST(0.006952110067791) }, { FRAC_CONST(0.030445406016919), FRAC_CONST(0.007045548414774) }, { FRAC_CONST(0.030423647297133), FRAC_CONST(0.007138920446372) }, { FRAC_CONST(0.030401602218392), FRAC_CONST(0.007232225283733) }, { FRAC_CONST(0.030379270988192), FRAC_CONST(0.007325462048634) }, { FRAC_CONST(0.030356653816724), FRAC_CONST(0.007418629863497) }, { FRAC_CONST(0.030333750916869), FRAC_CONST(0.007511727851390) }, { FRAC_CONST(0.030310562504198), FRAC_CONST(0.007604755136040) }, { FRAC_CONST(0.030287088796968), FRAC_CONST(0.007697710841838) }, { FRAC_CONST(0.030263330016124), FRAC_CONST(0.007790594093851) }, { FRAC_CONST(0.030239286385293), FRAC_CONST(0.007883404017824) }, { FRAC_CONST(0.030214958130781), FRAC_CONST(0.007976139740197) }, { FRAC_CONST(0.030190345481576), FRAC_CONST(0.008068800388104) }, { FRAC_CONST(0.030165448669342), FRAC_CONST(0.008161385089390) }, { FRAC_CONST(0.030140267928416), FRAC_CONST(0.008253892972610) }, { FRAC_CONST(0.030114803495809), FRAC_CONST(0.008346323167047) }, { FRAC_CONST(0.030089055611203), FRAC_CONST(0.008438674802711) }, { FRAC_CONST(0.030063024516947), FRAC_CONST(0.008530947010354) }, { FRAC_CONST(0.030036710458054), FRAC_CONST(0.008623138921475) }, { FRAC_CONST(0.030010113682202), FRAC_CONST(0.008715249668328) }, { FRAC_CONST(0.029983234439732), FRAC_CONST(0.008807278383932) }, { FRAC_CONST(0.029956072983640), FRAC_CONST(0.008899224202078) }, { FRAC_CONST(0.029928629569580), FRAC_CONST(0.008991086257336) }, { FRAC_CONST(0.029900904455860), FRAC_CONST(0.009082863685067) }, { FRAC_CONST(0.029872897903441), FRAC_CONST(0.009174555621425) }, { FRAC_CONST(0.029844610175929), FRAC_CONST(0.009266161203371) }, { FRAC_CONST(0.029816041539579), FRAC_CONST(0.009357679568679) }, { FRAC_CONST(0.029787192263292), FRAC_CONST(0.009449109855944) }, { FRAC_CONST(0.029758062618606), FRAC_CONST(0.009540451204587) }, { FRAC_CONST(0.029728652879702), FRAC_CONST(0.009631702754871) }, { FRAC_CONST(0.029698963323395), FRAC_CONST(0.009722863647900) }, { FRAC_CONST(0.029668994229134), FRAC_CONST(0.009813933025633) }, { FRAC_CONST(0.029638745879000), FRAC_CONST(0.009904910030891) }, { FRAC_CONST(0.029608218557702), FRAC_CONST(0.009995793807363) }, { FRAC_CONST(0.029577412552575), FRAC_CONST(0.010086583499618) }, { FRAC_CONST(0.029546328153577), FRAC_CONST(0.010177278253107) }, { FRAC_CONST(0.029514965653285), FRAC_CONST(0.010267877214177) }, { FRAC_CONST(0.029483325346896), FRAC_CONST(0.010358379530076) }, { FRAC_CONST(0.029451407532220), FRAC_CONST(0.010448784348962) }, { FRAC_CONST(0.029419212509679), FRAC_CONST(0.010539090819911) }, { FRAC_CONST(0.029386740582307), FRAC_CONST(0.010629298092923) }, { FRAC_CONST(0.029353992055740), FRAC_CONST(0.010719405318933) }, { FRAC_CONST(0.029320967238220), FRAC_CONST(0.010809411649818) }, { FRAC_CONST(0.029287666440590), FRAC_CONST(0.010899316238403) }, { FRAC_CONST(0.029254089976290), FRAC_CONST(0.010989118238474) }, { FRAC_CONST(0.029220238161353), FRAC_CONST(0.011078816804778) }, { FRAC_CONST(0.029186111314406), FRAC_CONST(0.011168411093039) }, { FRAC_CONST(0.029151709756664), FRAC_CONST(0.011257900259961) }, { FRAC_CONST(0.029117033811927), FRAC_CONST(0.011347283463239) }, { FRAC_CONST(0.029082083806579), FRAC_CONST(0.011436559861563) }, { FRAC_CONST(0.029046860069582), FRAC_CONST(0.011525728614630) }, { FRAC_CONST(0.029011362932476), FRAC_CONST(0.011614788883150) }, { FRAC_CONST(0.028975592729373), FRAC_CONST(0.011703739828853) }, { FRAC_CONST(0.028939549796957), FRAC_CONST(0.011792580614500) }, { FRAC_CONST(0.028903234474475), FRAC_CONST(0.011881310403886) }, { FRAC_CONST(0.028866647103744), FRAC_CONST(0.011969928361855) }, { FRAC_CONST(0.028829788029135), FRAC_CONST(0.012058433654299) }, { FRAC_CONST(0.028792657597583), FRAC_CONST(0.012146825448172) }, { FRAC_CONST(0.028755256158571), FRAC_CONST(0.012235102911499) }, { FRAC_CONST(0.028717584064137), FRAC_CONST(0.012323265213377) }, { FRAC_CONST(0.028679641668864), FRAC_CONST(0.012411311523990) }, { FRAC_CONST(0.028641429329882), FRAC_CONST(0.012499241014612) }, { FRAC_CONST(0.028602947406859), FRAC_CONST(0.012587052857618) }, { FRAC_CONST(0.028564196262001), FRAC_CONST(0.012674746226488) }, { FRAC_CONST(0.028525176260050), FRAC_CONST(0.012762320295819) }, { FRAC_CONST(0.028485887768276), FRAC_CONST(0.012849774241331) }, { FRAC_CONST(0.028446331156478), FRAC_CONST(0.012937107239875) }, { FRAC_CONST(0.028406506796976), FRAC_CONST(0.013024318469437) }, { FRAC_CONST(0.028366415064615), FRAC_CONST(0.013111407109155) }, { FRAC_CONST(0.028326056336751), FRAC_CONST(0.013198372339315) }, { FRAC_CONST(0.028285430993258), FRAC_CONST(0.013285213341368) }, { FRAC_CONST(0.028244539416515), FRAC_CONST(0.013371929297933) }, { FRAC_CONST(0.028203381991411), FRAC_CONST(0.013458519392807) }, { FRAC_CONST(0.028161959105334), FRAC_CONST(0.013544982810971) }, { FRAC_CONST(0.028120271148172), FRAC_CONST(0.013631318738598) }, { FRAC_CONST(0.028078318512309), FRAC_CONST(0.013717526363062) }, { FRAC_CONST(0.028036101592619), FRAC_CONST(0.013803604872943) }, { FRAC_CONST(0.027993620786463), FRAC_CONST(0.013889553458039) }, { FRAC_CONST(0.027950876493687), FRAC_CONST(0.013975371309367) }, { FRAC_CONST(0.027907869116616), FRAC_CONST(0.014061057619178) }, { FRAC_CONST(0.027864599060052), FRAC_CONST(0.014146611580959) }, { FRAC_CONST(0.027821066731270), FRAC_CONST(0.014232032389445) }, { FRAC_CONST(0.027777272540012), FRAC_CONST(0.014317319240622) }, { FRAC_CONST(0.027733216898487), FRAC_CONST(0.014402471331737) }, { FRAC_CONST(0.027688900221361), FRAC_CONST(0.014487487861307) }, { FRAC_CONST(0.027644322925762), FRAC_CONST(0.014572368029123) }, { FRAC_CONST(0.027599485431266), FRAC_CONST(0.014657111036262) }, { FRAC_CONST(0.027554388159903), FRAC_CONST(0.014741716085090) }, { FRAC_CONST(0.027509031536144), FRAC_CONST(0.014826182379271) }, { FRAC_CONST(0.027463415986904), FRAC_CONST(0.014910509123778) }, { FRAC_CONST(0.027417541941533), FRAC_CONST(0.014994695524894) }, { FRAC_CONST(0.027371409831816), FRAC_CONST(0.015078740790225) }, { FRAC_CONST(0.027325020091965), FRAC_CONST(0.015162644128704) }, { FRAC_CONST(0.027278373158618), FRAC_CONST(0.015246404750603) }, { FRAC_CONST(0.027231469470833), FRAC_CONST(0.015330021867534) }, { FRAC_CONST(0.027184309470088), FRAC_CONST(0.015413494692460) }, { FRAC_CONST(0.027136893600268), FRAC_CONST(0.015496822439704) }, { FRAC_CONST(0.027089222307671), FRAC_CONST(0.015580004324954) }, { FRAC_CONST(0.027041296040997), FRAC_CONST(0.015663039565269) }, { FRAC_CONST(0.026993115251345), FRAC_CONST(0.015745927379091) }, { FRAC_CONST(0.026944680392213), FRAC_CONST(0.015828666986247) }, { FRAC_CONST(0.026895991919487), FRAC_CONST(0.015911257607961) }, { FRAC_CONST(0.026847050291442), FRAC_CONST(0.015993698466859) }, { FRAC_CONST(0.026797855968734), FRAC_CONST(0.016075988786976) }, { FRAC_CONST(0.026748409414401), FRAC_CONST(0.016158127793763) }, { FRAC_CONST(0.026698711093851), FRAC_CONST(0.016240114714099) }, { FRAC_CONST(0.026648761474864), FRAC_CONST(0.016321948776289) }, { FRAC_CONST(0.026598561027585), FRAC_CONST(0.016403629210082) }, { FRAC_CONST(0.026548110224519), FRAC_CONST(0.016485155246669) }, { FRAC_CONST(0.026497409540530), FRAC_CONST(0.016566526118696) }, { FRAC_CONST(0.026446459452830), FRAC_CONST(0.016647741060271) }, { FRAC_CONST(0.026395260440982), FRAC_CONST(0.016728799306966) }, { FRAC_CONST(0.026343812986890), FRAC_CONST(0.016809700095831) }, { FRAC_CONST(0.026292117574797), FRAC_CONST(0.016890442665397) }, { FRAC_CONST(0.026240174691280), FRAC_CONST(0.016971026255683) }, { FRAC_CONST(0.026187984825246), FRAC_CONST(0.017051450108208) }, { FRAC_CONST(0.026135548467924), FRAC_CONST(0.017131713465990) }, { FRAC_CONST(0.026082866112867), FRAC_CONST(0.017211815573560) }, { FRAC_CONST(0.026029938255941), FRAC_CONST(0.017291755676967) }, { FRAC_CONST(0.025976765395322), FRAC_CONST(0.017371533023784) }, { FRAC_CONST(0.025923348031494), FRAC_CONST(0.017451146863116) }, { FRAC_CONST(0.025869686667242), FRAC_CONST(0.017530596445607) }, { FRAC_CONST(0.025815781807646), FRAC_CONST(0.017609881023449) }, { FRAC_CONST(0.025761633960080), FRAC_CONST(0.017688999850383) }, { FRAC_CONST(0.025707243634204), FRAC_CONST(0.017767952181715) }, { FRAC_CONST(0.025652611341960), FRAC_CONST(0.017846737274313) }, { FRAC_CONST(0.025597737597568), FRAC_CONST(0.017925354386623) }, { FRAC_CONST(0.025542622917522), FRAC_CONST(0.018003802778671) }, { FRAC_CONST(0.025487267820581), FRAC_CONST(0.018082081712071) }, { FRAC_CONST(0.025431672827768), FRAC_CONST(0.018160190450031) }, { FRAC_CONST(0.025375838462365), FRAC_CONST(0.018238128257362) }, { FRAC_CONST(0.025319765249906), FRAC_CONST(0.018315894400484) }, { FRAC_CONST(0.025263453718173), FRAC_CONST(0.018393488147432) }, { FRAC_CONST(0.025206904397193), FRAC_CONST(0.018470908767865) }, { FRAC_CONST(0.025150117819228), FRAC_CONST(0.018548155533070) }, { FRAC_CONST(0.025093094518776), FRAC_CONST(0.018625227715971) }, { FRAC_CONST(0.025035835032562), FRAC_CONST(0.018702124591135) }, { FRAC_CONST(0.024978339899534), FRAC_CONST(0.018778845434780) }, { FRAC_CONST(0.024920609660858), FRAC_CONST(0.018855389524780) }, { FRAC_CONST(0.024862644859912), FRAC_CONST(0.018931756140672) }, { FRAC_CONST(0.024804446042284), FRAC_CONST(0.019007944563666) }, { FRAC_CONST(0.024746013755764), FRAC_CONST(0.019083954076646) }, { FRAC_CONST(0.024687348550337), FRAC_CONST(0.019159783964183) }, { FRAC_CONST(0.024628450978184), FRAC_CONST(0.019235433512536) }, { FRAC_CONST(0.024569321593670), FRAC_CONST(0.019310902009663) }, { FRAC_CONST(0.024509960953345), FRAC_CONST(0.019386188745225) }, { FRAC_CONST(0.024450369615932), FRAC_CONST(0.019461293010596) }, { FRAC_CONST(0.024390548142329), FRAC_CONST(0.019536214098866) }, { FRAC_CONST(0.024330497095598), FRAC_CONST(0.019610951304848) }, { FRAC_CONST(0.024270217040961), FRAC_CONST(0.019685503925087) }, { FRAC_CONST(0.024209708545799), FRAC_CONST(0.019759871257867) }, { FRAC_CONST(0.024148972179639), FRAC_CONST(0.019834052603212) }, { FRAC_CONST(0.024088008514157), FRAC_CONST(0.019908047262901) }, { FRAC_CONST(0.024026818123164), FRAC_CONST(0.019981854540467) }, { FRAC_CONST(0.023965401582609), FRAC_CONST(0.020055473741208) }, { FRAC_CONST(0.023903759470567), FRAC_CONST(0.020128904172192) }, { FRAC_CONST(0.023841892367236), FRAC_CONST(0.020202145142264) }, { FRAC_CONST(0.023779800854935), FRAC_CONST(0.020275195962052) }, { FRAC_CONST(0.023717485518092), FRAC_CONST(0.020348055943974) }, { FRAC_CONST(0.023654946943242), FRAC_CONST(0.020420724402244) }, { FRAC_CONST(0.023592185719023), FRAC_CONST(0.020493200652878) }, { FRAC_CONST(0.023529202436167), FRAC_CONST(0.020565484013703) }, { FRAC_CONST(0.023465997687496), FRAC_CONST(0.020637573804361) }, { FRAC_CONST(0.023402572067918), FRAC_CONST(0.020709469346314) }, { FRAC_CONST(0.023338926174419), FRAC_CONST(0.020781169962854) }, { FRAC_CONST(0.023275060606058), FRAC_CONST(0.020852674979108) }, { FRAC_CONST(0.023210975963963), FRAC_CONST(0.020923983722044) }, { FRAC_CONST(0.023146672851322), FRAC_CONST(0.020995095520475) }, { FRAC_CONST(0.023082151873380), FRAC_CONST(0.021066009705072) }, { FRAC_CONST(0.023017413637435), FRAC_CONST(0.021136725608363) }, { FRAC_CONST(0.022952458752826), FRAC_CONST(0.021207242564742) }, { FRAC_CONST(0.022887287830934), FRAC_CONST(0.021277559910478) }, { FRAC_CONST(0.022821901485173), FRAC_CONST(0.021347676983716) }, { FRAC_CONST(0.022756300330983), FRAC_CONST(0.021417593124488) }, { FRAC_CONST(0.022690484985827), FRAC_CONST(0.021487307674717) }, { FRAC_CONST(0.022624456069185), FRAC_CONST(0.021556819978223) }, { FRAC_CONST(0.022558214202547), FRAC_CONST(0.021626129380729) }, { FRAC_CONST(0.022491760009405), FRAC_CONST(0.021695235229869) }, { FRAC_CONST(0.022425094115252), FRAC_CONST(0.021764136875192) }, { FRAC_CONST(0.022358217147572), FRAC_CONST(0.021832833668171) }, { FRAC_CONST(0.022291129735838), FRAC_CONST(0.021901324962204) }, { FRAC_CONST(0.022223832511501), FRAC_CONST(0.021969610112625) }, { FRAC_CONST(0.022156326107988), FRAC_CONST(0.022037688476709) }, { FRAC_CONST(0.022088611160696), FRAC_CONST(0.022105559413676) }, { FRAC_CONST(0.022020688306983), FRAC_CONST(0.022173222284699) }, { FRAC_CONST(0.021952558186166), FRAC_CONST(0.022240676452909) }, { FRAC_CONST(0.021884221439510), FRAC_CONST(0.022307921283403) }, { FRAC_CONST(0.021815678710228), FRAC_CONST(0.022374956143245) }, { FRAC_CONST(0.021746930643469), FRAC_CONST(0.022441780401478) }, { FRAC_CONST(0.021677977886316), FRAC_CONST(0.022508393429127) }, { FRAC_CONST(0.021608821087780), FRAC_CONST(0.022574794599206) }, { FRAC_CONST(0.021539460898790), FRAC_CONST(0.022640983286719) }, { FRAC_CONST(0.021469897972190), FRAC_CONST(0.022706958868676) }, { FRAC_CONST(0.021400132962735), FRAC_CONST(0.022772720724087) }, { FRAC_CONST(0.021330166527077), FRAC_CONST(0.022838268233979) }, { FRAC_CONST(0.021259999323769), FRAC_CONST(0.022903600781391) }, { FRAC_CONST(0.021189632013250), FRAC_CONST(0.022968717751391) }, { FRAC_CONST(0.021119065257845), FRAC_CONST(0.023033618531071) }, { FRAC_CONST(0.021048299721754), FRAC_CONST(0.023098302509561) }, { FRAC_CONST(0.020977336071050), FRAC_CONST(0.023162769078031) }, { FRAC_CONST(0.020906174973670), FRAC_CONST(0.023227017629698) }, { FRAC_CONST(0.020834817099409), FRAC_CONST(0.023291047559828) }, { FRAC_CONST(0.020763263119915), FRAC_CONST(0.023354858265748) }, { FRAC_CONST(0.020691513708680), FRAC_CONST(0.023418449146848) }, { FRAC_CONST(0.020619569541038), FRAC_CONST(0.023481819604585) }, { FRAC_CONST(0.020547431294155), FRAC_CONST(0.023544969042494) }, { FRAC_CONST(0.020475099647023), FRAC_CONST(0.023607896866186) }, { FRAC_CONST(0.020402575280455), FRAC_CONST(0.023670602483363) }, { FRAC_CONST(0.020329858877078), FRAC_CONST(0.023733085303813) }, { FRAC_CONST(0.020256951121327), FRAC_CONST(0.023795344739427) }, { FRAC_CONST(0.020183852699437), FRAC_CONST(0.023857380204193) }, { FRAC_CONST(0.020110564299439), FRAC_CONST(0.023919191114211) }, { FRAC_CONST(0.020037086611150), FRAC_CONST(0.023980776887692) }, { FRAC_CONST(0.019963420326171), FRAC_CONST(0.024042136944968) }, { FRAC_CONST(0.019889566137877), FRAC_CONST(0.024103270708495) }, { FRAC_CONST(0.019815524741412), FRAC_CONST(0.024164177602859) }, { FRAC_CONST(0.019741296833681), FRAC_CONST(0.024224857054779) }, { FRAC_CONST(0.019666883113346), FRAC_CONST(0.024285308493120) }, { FRAC_CONST(0.019592284280817), FRAC_CONST(0.024345531348888) }, { FRAC_CONST(0.019517501038246), FRAC_CONST(0.024405525055242) }, { FRAC_CONST(0.019442534089523), FRAC_CONST(0.024465289047500) }, { FRAC_CONST(0.019367384140264), FRAC_CONST(0.024524822763141) }, { FRAC_CONST(0.019292051897809), FRAC_CONST(0.024584125641809) }, { FRAC_CONST(0.019216538071215), FRAC_CONST(0.024643197125323) }, { FRAC_CONST(0.019140843371246), FRAC_CONST(0.024702036657681) }, { FRAC_CONST(0.019064968510369), FRAC_CONST(0.024760643685063) }, { FRAC_CONST(0.018988914202748), FRAC_CONST(0.024819017655836) }, { FRAC_CONST(0.018912681164234), FRAC_CONST(0.024877158020562) }, { FRAC_CONST(0.018836270112363), FRAC_CONST(0.024935064232003) }, { FRAC_CONST(0.018759681766343), FRAC_CONST(0.024992735745123) }, { FRAC_CONST(0.018682916847054), FRAC_CONST(0.025050172017095) }, { FRAC_CONST(0.018605976077037), FRAC_CONST(0.025107372507308) }, { FRAC_CONST(0.018528860180486), FRAC_CONST(0.025164336677369) }, { FRAC_CONST(0.018451569883247), FRAC_CONST(0.025221063991110) }, { FRAC_CONST(0.018374105912805), FRAC_CONST(0.025277553914591) }, { FRAC_CONST(0.018296468998280), FRAC_CONST(0.025333805916107) }, { FRAC_CONST(0.018218659870421), FRAC_CONST(0.025389819466194) }, { FRAC_CONST(0.018140679261596), FRAC_CONST(0.025445594037630) }, { FRAC_CONST(0.018062527905790), FRAC_CONST(0.025501129105445) }, { FRAC_CONST(0.017984206538592), FRAC_CONST(0.025556424146920) }, { FRAC_CONST(0.017905715897192), FRAC_CONST(0.025611478641598) }, { FRAC_CONST(0.017827056720375), FRAC_CONST(0.025666292071285) }, { FRAC_CONST(0.017748229748511), FRAC_CONST(0.025720863920056) }, { FRAC_CONST(0.017669235723550), FRAC_CONST(0.025775193674260) }, { FRAC_CONST(0.017590075389012), FRAC_CONST(0.025829280822525) }, { FRAC_CONST(0.017510749489986), FRAC_CONST(0.025883124855762) }, { FRAC_CONST(0.017431258773116), FRAC_CONST(0.025936725267170) }, { FRAC_CONST(0.017351603986600), FRAC_CONST(0.025990081552242) }, { FRAC_CONST(0.017271785880180), FRAC_CONST(0.026043193208768) }, { FRAC_CONST(0.017191805205132), FRAC_CONST(0.026096059736841) }, { FRAC_CONST(0.017111662714267), FRAC_CONST(0.026148680638861) }, { FRAC_CONST(0.017031359161915), FRAC_CONST(0.026201055419541) }, { FRAC_CONST(0.016950895303924), FRAC_CONST(0.026253183585908) }, { FRAC_CONST(0.016870271897651), FRAC_CONST(0.026305064647313) }, { FRAC_CONST(0.016789489701954), FRAC_CONST(0.026356698115431) }, { FRAC_CONST(0.016708549477186), FRAC_CONST(0.026408083504269) }, { FRAC_CONST(0.016627451985187), FRAC_CONST(0.026459220330167) }, { FRAC_CONST(0.016546197989277), FRAC_CONST(0.026510108111806) }, { FRAC_CONST(0.016464788254250), FRAC_CONST(0.026560746370212) }, { FRAC_CONST(0.016383223546365), FRAC_CONST(0.026611134628757) }, { FRAC_CONST(0.016301504633341), FRAC_CONST(0.026661272413168) }, { FRAC_CONST(0.016219632284346), FRAC_CONST(0.026711159251530) }, { FRAC_CONST(0.016137607269996), FRAC_CONST(0.026760794674288) }, { FRAC_CONST(0.016055430362340), FRAC_CONST(0.026810178214254) }, { FRAC_CONST(0.015973102334858), FRAC_CONST(0.026859309406613) }, { FRAC_CONST(0.015890623962454), FRAC_CONST(0.026908187788922) }, { FRAC_CONST(0.015807996021446), FRAC_CONST(0.026956812901119) }, { FRAC_CONST(0.015725219289558), FRAC_CONST(0.027005184285527) }, { FRAC_CONST(0.015642294545918), FRAC_CONST(0.027053301486856) }, { FRAC_CONST(0.015559222571044), FRAC_CONST(0.027101164052208) }, { FRAC_CONST(0.015476004146842), FRAC_CONST(0.027148771531083) }, { FRAC_CONST(0.015392640056594), FRAC_CONST(0.027196123475380) }, { FRAC_CONST(0.015309131084956), FRAC_CONST(0.027243219439406) }, { FRAC_CONST(0.015225478017946), FRAC_CONST(0.027290058979875) }, { FRAC_CONST(0.015141681642938), FRAC_CONST(0.027336641655915) }, { FRAC_CONST(0.015057742748656), FRAC_CONST(0.027382967029073) }, { FRAC_CONST(0.014973662125164), FRAC_CONST(0.027429034663317) }, { FRAC_CONST(0.014889440563862), FRAC_CONST(0.027474844125040) }, { FRAC_CONST(0.014805078857474), FRAC_CONST(0.027520394983066) }, { FRAC_CONST(0.014720577800046), FRAC_CONST(0.027565686808654) }, { FRAC_CONST(0.014635938186934), FRAC_CONST(0.027610719175499) }, { FRAC_CONST(0.014551160814797), FRAC_CONST(0.027655491659740) }, { FRAC_CONST(0.014466246481592), FRAC_CONST(0.027700003839960) }, { FRAC_CONST(0.014381195986567), FRAC_CONST(0.027744255297195) }, { FRAC_CONST(0.014296010130247), FRAC_CONST(0.027788245614933) }, { FRAC_CONST(0.014210689714436), FRAC_CONST(0.027831974379120) }, { FRAC_CONST(0.014125235542201), FRAC_CONST(0.027875441178165) }, { FRAC_CONST(0.014039648417870), FRAC_CONST(0.027918645602941) }, { FRAC_CONST(0.013953929147020), FRAC_CONST(0.027961587246792) }, { FRAC_CONST(0.013868078536476), FRAC_CONST(0.028004265705534) }, { FRAC_CONST(0.013782097394294), FRAC_CONST(0.028046680577462) }, { FRAC_CONST(0.013695986529763), FRAC_CONST(0.028088831463351) }, { FRAC_CONST(0.013609746753390), FRAC_CONST(0.028130717966461) }, { FRAC_CONST(0.013523378876898), FRAC_CONST(0.028172339692540) }, { FRAC_CONST(0.013436883713214), FRAC_CONST(0.028213696249828) }, { FRAC_CONST(0.013350262076462), FRAC_CONST(0.028254787249062) }, { FRAC_CONST(0.013263514781960), FRAC_CONST(0.028295612303478) }, { FRAC_CONST(0.013176642646205), FRAC_CONST(0.028336171028814) }, { FRAC_CONST(0.013089646486871), FRAC_CONST(0.028376463043317) }, { FRAC_CONST(0.013002527122799), FRAC_CONST(0.028416487967743) }, { FRAC_CONST(0.012915285373990), FRAC_CONST(0.028456245425361) }, { FRAC_CONST(0.012827922061597), FRAC_CONST(0.028495735041960) }, { FRAC_CONST(0.012740438007915), FRAC_CONST(0.028534956445849) }, { FRAC_CONST(0.012652834036379), FRAC_CONST(0.028573909267859) }, { FRAC_CONST(0.012565110971550), FRAC_CONST(0.028612593141354) }, { FRAC_CONST(0.012477269639111), FRAC_CONST(0.028651007702224) }, { FRAC_CONST(0.012389310865858), FRAC_CONST(0.028689152588899) }, { FRAC_CONST(0.012301235479693), FRAC_CONST(0.028727027442343) }, { FRAC_CONST(0.012213044309615), FRAC_CONST(0.028764631906065) }, { FRAC_CONST(0.012124738185712), FRAC_CONST(0.028801965626115) }, { FRAC_CONST(0.012036317939156), FRAC_CONST(0.028839028251097) }, { FRAC_CONST(0.011947784402191), FRAC_CONST(0.028875819432161) }, { FRAC_CONST(0.011859138408130), FRAC_CONST(0.028912338823015) }, { FRAC_CONST(0.011770380791341), FRAC_CONST(0.028948586079925) }, { FRAC_CONST(0.011681512387245), FRAC_CONST(0.028984560861718) }, { FRAC_CONST(0.011592534032306), FRAC_CONST(0.029020262829785) }, { FRAC_CONST(0.011503446564022), FRAC_CONST(0.029055691648087) }, { FRAC_CONST(0.011414250820918), FRAC_CONST(0.029090846983152) }, { FRAC_CONST(0.011324947642537), FRAC_CONST(0.029125728504087) }, { FRAC_CONST(0.011235537869437), FRAC_CONST(0.029160335882573) }, { FRAC_CONST(0.011146022343175), FRAC_CONST(0.029194668792871) }, { FRAC_CONST(0.011056401906305), FRAC_CONST(0.029228726911828) }, { FRAC_CONST(0.010966677402371), FRAC_CONST(0.029262509918876) }, { FRAC_CONST(0.010876849675891), FRAC_CONST(0.029296017496036) }, { FRAC_CONST(0.010786919572361), FRAC_CONST(0.029329249327922) }, { FRAC_CONST(0.010696887938235), FRAC_CONST(0.029362205101743) }, { FRAC_CONST(0.010606755620926), FRAC_CONST(0.029394884507308) }, { FRAC_CONST(0.010516523468793), FRAC_CONST(0.029427287237024) }, { FRAC_CONST(0.010426192331137), FRAC_CONST(0.029459412985906) }, { FRAC_CONST(0.010335763058187), FRAC_CONST(0.029491261451573) }, { FRAC_CONST(0.010245236501099), FRAC_CONST(0.029522832334255) }, { FRAC_CONST(0.010154613511943), FRAC_CONST(0.029554125336796) }, { FRAC_CONST(0.010063894943698), FRAC_CONST(0.029585140164654) }, { FRAC_CONST(0.009973081650240), FRAC_CONST(0.029615876525905) }, { FRAC_CONST(0.009882174486340), FRAC_CONST(0.029646334131247) }, { FRAC_CONST(0.009791174307650), FRAC_CONST(0.029676512694001) }, { FRAC_CONST(0.009700081970699), FRAC_CONST(0.029706411930116) }, { FRAC_CONST(0.009608898332881), FRAC_CONST(0.029736031558168) }, { FRAC_CONST(0.009517624252453), FRAC_CONST(0.029765371299366) }, { FRAC_CONST(0.009426260588521), FRAC_CONST(0.029794430877553) }, { FRAC_CONST(0.009334808201034), FRAC_CONST(0.029823210019210) }, { FRAC_CONST(0.009243267950778), FRAC_CONST(0.029851708453456) }, { FRAC_CONST(0.009151640699363), FRAC_CONST(0.029879925912053) }, { FRAC_CONST(0.009059927309220), FRAC_CONST(0.029907862129408) }, { FRAC_CONST(0.008968128643591), FRAC_CONST(0.029935516842573) }, { FRAC_CONST(0.008876245566520), FRAC_CONST(0.029962889791254) }, { FRAC_CONST(0.008784278942845), FRAC_CONST(0.029989980717805) }, { FRAC_CONST(0.008692229638191), FRAC_CONST(0.030016789367235) }, { FRAC_CONST(0.008600098518961), FRAC_CONST(0.030043315487212) }, { FRAC_CONST(0.008507886452329), FRAC_CONST(0.030069558828062) }, { FRAC_CONST(0.008415594306230), FRAC_CONST(0.030095519142772) }, { FRAC_CONST(0.008323222949351), FRAC_CONST(0.030121196186994) }, { FRAC_CONST(0.008230773251129), FRAC_CONST(0.030146589719046) }, { FRAC_CONST(0.008138246081733), FRAC_CONST(0.030171699499915) }, { FRAC_CONST(0.008045642312067), FRAC_CONST(0.030196525293257) }, { FRAC_CONST(0.007952962813750), FRAC_CONST(0.030221066865402) }, { FRAC_CONST(0.007860208459119), FRAC_CONST(0.030245323985357) }, { FRAC_CONST(0.007767380121212), FRAC_CONST(0.030269296424803) }, { FRAC_CONST(0.007674478673766), FRAC_CONST(0.030292983958103) }, { FRAC_CONST(0.007581504991203), FRAC_CONST(0.030316386362302) }, { FRAC_CONST(0.007488459948628), FRAC_CONST(0.030339503417126) }, { FRAC_CONST(0.007395344421816), FRAC_CONST(0.030362334904989) }, { FRAC_CONST(0.007302159287206), FRAC_CONST(0.030384880610993) }, { FRAC_CONST(0.007208905421891), FRAC_CONST(0.030407140322928) }, { FRAC_CONST(0.007115583703613), FRAC_CONST(0.030429113831278) }, { FRAC_CONST(0.007022195010752), FRAC_CONST(0.030450800929220) }, { FRAC_CONST(0.006928740222316), FRAC_CONST(0.030472201412626) }, { FRAC_CONST(0.006835220217939), FRAC_CONST(0.030493315080068) }, { FRAC_CONST(0.006741635877866), FRAC_CONST(0.030514141732814) }, { FRAC_CONST(0.006647988082948), FRAC_CONST(0.030534681174838) }, { FRAC_CONST(0.006554277714635), FRAC_CONST(0.030554933212813) }, { FRAC_CONST(0.006460505654964), FRAC_CONST(0.030574897656119) }, { FRAC_CONST(0.006366672786553), FRAC_CONST(0.030594574316845) }, { FRAC_CONST(0.006272779992593), FRAC_CONST(0.030613963009786) }, { FRAC_CONST(0.006178828156839), FRAC_CONST(0.030633063552447) }, { FRAC_CONST(0.006084818163601), FRAC_CONST(0.030651875765048) }, { FRAC_CONST(0.005990750897737), FRAC_CONST(0.030670399470520) }, { FRAC_CONST(0.005896627244644), FRAC_CONST(0.030688634494512) }, { FRAC_CONST(0.005802448090250), FRAC_CONST(0.030706580665388) }, { FRAC_CONST(0.005708214321004), FRAC_CONST(0.030724237814232) }, { FRAC_CONST(0.005613926823871), FRAC_CONST(0.030741605774849) }, { FRAC_CONST(0.005519586486321), FRAC_CONST(0.030758684383764) }, { FRAC_CONST(0.005425194196321), FRAC_CONST(0.030775473480228) }, { FRAC_CONST(0.005330750842327), FRAC_CONST(0.030791972906214) }, { FRAC_CONST(0.005236257313276), FRAC_CONST(0.030808182506425) }, { FRAC_CONST(0.005141714498576), FRAC_CONST(0.030824102128288) }, { FRAC_CONST(0.005047123288102), FRAC_CONST(0.030839731621963) }, { FRAC_CONST(0.004952484572181), FRAC_CONST(0.030855070840339) }, { FRAC_CONST(0.004857799241589), FRAC_CONST(0.030870119639036) }, { FRAC_CONST(0.004763068187541), FRAC_CONST(0.030884877876411) }, { FRAC_CONST(0.004668292301681), FRAC_CONST(0.030899345413553) }, { FRAC_CONST(0.004573472476075), FRAC_CONST(0.030913522114288) }, { FRAC_CONST(0.004478609603205), FRAC_CONST(0.030927407845180) }, { FRAC_CONST(0.004383704575956), FRAC_CONST(0.030941002475530) }, { FRAC_CONST(0.004288758287610), FRAC_CONST(0.030954305877381) }, { FRAC_CONST(0.004193771631837), FRAC_CONST(0.030967317925516) }, { FRAC_CONST(0.004098745502689), FRAC_CONST(0.030980038497461) }, { FRAC_CONST(0.004003680794587), FRAC_CONST(0.030992467473486) }, { FRAC_CONST(0.003908578402316), FRAC_CONST(0.031004604736602) }, { FRAC_CONST(0.003813439221017), FRAC_CONST(0.031016450172571) }, { FRAC_CONST(0.003718264146176), FRAC_CONST(0.031028003669899) }, { FRAC_CONST(0.003623054073616), FRAC_CONST(0.031039265119839) }, { FRAC_CONST(0.003527809899492), FRAC_CONST(0.031050234416394) }, { FRAC_CONST(0.003432532520278), FRAC_CONST(0.031060911456318) }, { FRAC_CONST(0.003337222832760), FRAC_CONST(0.031071296139114) }, { FRAC_CONST(0.003241881734029), FRAC_CONST(0.031081388367037) }, { FRAC_CONST(0.003146510121474), FRAC_CONST(0.031091188045095) }, { FRAC_CONST(0.003051108892766), FRAC_CONST(0.031100695081051) }, { FRAC_CONST(0.002955678945860), FRAC_CONST(0.031109909385419) }, { FRAC_CONST(0.002860221178978), FRAC_CONST(0.031118830871473) }, { FRAC_CONST(0.002764736490604), FRAC_CONST(0.031127459455239) }, { FRAC_CONST(0.002669225779478), FRAC_CONST(0.031135795055501) }, { FRAC_CONST(0.002573689944583), FRAC_CONST(0.031143837593803) }, { FRAC_CONST(0.002478129885137), FRAC_CONST(0.031151586994444) }, { FRAC_CONST(0.002382546500589), FRAC_CONST(0.031159043184484) }, { FRAC_CONST(0.002286940690606), FRAC_CONST(0.031166206093743) }, { FRAC_CONST(0.002191313355067), FRAC_CONST(0.031173075654800) }, { FRAC_CONST(0.002095665394051), FRAC_CONST(0.031179651802998) }, { FRAC_CONST(0.001999997707835), FRAC_CONST(0.031185934476438) }, { FRAC_CONST(0.001904311196878), FRAC_CONST(0.031191923615985) }, { FRAC_CONST(0.001808606761820), FRAC_CONST(0.031197619165268) }, { FRAC_CONST(0.001712885303465), FRAC_CONST(0.031203021070678) }, { FRAC_CONST(0.001617147722782), FRAC_CONST(0.031208129281370) }, { FRAC_CONST(0.001521394920889), FRAC_CONST(0.031212943749264) }, { FRAC_CONST(0.001425627799047), FRAC_CONST(0.031217464429043) }, { FRAC_CONST(0.001329847258653), FRAC_CONST(0.031221691278159) }, { FRAC_CONST(0.001234054201231), FRAC_CONST(0.031225624256825) }, { FRAC_CONST(0.001138249528420), FRAC_CONST(0.031229263328024) }, { FRAC_CONST(0.001042434141971), FRAC_CONST(0.031232608457502) }, { FRAC_CONST(0.000946608943736), FRAC_CONST(0.031235659613775) }, { FRAC_CONST(0.000850774835656), FRAC_CONST(0.031238416768124) }, { FRAC_CONST(0.000754932719759), FRAC_CONST(0.031240879894597) }, { FRAC_CONST(0.000659083498149), FRAC_CONST(0.031243048970010) }, { FRAC_CONST(0.000563228072993), FRAC_CONST(0.031244923973948) }, { FRAC_CONST(0.000467367346520), FRAC_CONST(0.031246504888762) }, { FRAC_CONST(0.000371502221008), FRAC_CONST(0.031247791699571) }, { FRAC_CONST(0.000275633598775), FRAC_CONST(0.031248784394264) }, { FRAC_CONST(0.000179762382174), FRAC_CONST(0.031249482963498) }, { FRAC_CONST(0.000083889473581), FRAC_CONST(0.031249887400697) } }; /* 64 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_256[] = { { FRAC_CONST(0.088387931675923), FRAC_CONST(0.000271171628935) }, { FRAC_CONST(0.088354655998507), FRAC_CONST(0.002440238387037) }, { FRAC_CONST(0.088268158780110), FRAC_CONST(0.004607835236780) }, { FRAC_CONST(0.088128492123423), FRAC_CONST(0.006772656498875) }, { FRAC_CONST(0.087935740158418), FRAC_CONST(0.008933398165942) }, { FRAC_CONST(0.087690018991670), FRAC_CONST(0.011088758687994) }, { FRAC_CONST(0.087391476636423), FRAC_CONST(0.013237439756448) }, { FRAC_CONST(0.087040292923427), FRAC_CONST(0.015378147086172) }, { FRAC_CONST(0.086636679392621), FRAC_CONST(0.017509591195118) }, { FRAC_CONST(0.086180879165703), FRAC_CONST(0.019630488181053) }, { FRAC_CONST(0.085673166799686), FRAC_CONST(0.021739560494940) }, { FRAC_CONST(0.085113848121515), FRAC_CONST(0.023835537710479) }, { FRAC_CONST(0.084503260043847), FRAC_CONST(0.025917157289369) }, { FRAC_CONST(0.083841770362110), FRAC_CONST(0.027983165341813) }, { FRAC_CONST(0.083129777532952), FRAC_CONST(0.030032317381813) }, { FRAC_CONST(0.082367710434230), FRAC_CONST(0.032063379076803) }, { FRAC_CONST(0.081556028106671), FRAC_CONST(0.034075126991164) }, { FRAC_CONST(0.080695219477356), FRAC_CONST(0.036066349323177) }, { FRAC_CONST(0.079785803065216), FRAC_CONST(0.038035846634965) }, { FRAC_CONST(0.078828326668693), FRAC_CONST(0.039982432574992) }, { FRAC_CONST(0.077823367035766), FRAC_CONST(0.041904934592675) }, { FRAC_CONST(0.076771529516540), FRAC_CONST(0.043802194644686) }, { FRAC_CONST(0.075673447698606), FRAC_CONST(0.045673069892513) }, { FRAC_CONST(0.074529783025390), FRAC_CONST(0.047516433390863) }, { FRAC_CONST(0.073341224397728), FRAC_CONST(0.049331174766491) }, { FRAC_CONST(0.072108487758894), FRAC_CONST(0.051116200887052) }, { FRAC_CONST(0.070832315663343), FRAC_CONST(0.052870436519557) }, { FRAC_CONST(0.069513476829429), FRAC_CONST(0.054592824978055) }, { FRAC_CONST(0.068152765676348), FRAC_CONST(0.056282328760143) }, { FRAC_CONST(0.066751001845620), FRAC_CONST(0.057937930171918) }, { FRAC_CONST(0.065309029707361), FRAC_CONST(0.059558631940996) }, { FRAC_CONST(0.063827717851668), FRAC_CONST(0.061143457817234) }, { FRAC_CONST(0.062307958565413), FRAC_CONST(0.062691453160784) }, { FRAC_CONST(0.060750667294763), FRAC_CONST(0.064201685517134) }, { FRAC_CONST(0.059156782093749), FRAC_CONST(0.065673245178784) }, { FRAC_CONST(0.057527263059216), FRAC_CONST(0.067105245733220) }, { FRAC_CONST(0.055863091752499), FRAC_CONST(0.068496824596852) }, { FRAC_CONST(0.054165270608165), FRAC_CONST(0.069847143534609) }, { FRAC_CONST(0.052434822330188), FRAC_CONST(0.071155389164853) }, { FRAC_CONST(0.050672789275903), FRAC_CONST(0.072420773449336) }, { FRAC_CONST(0.048880232828135), FRAC_CONST(0.073642534167879) }, { FRAC_CONST(0.047058232755862), FRAC_CONST(0.074819935377512) }, { FRAC_CONST(0.045207886563797), FRAC_CONST(0.075952267855771) }, { FRAC_CONST(0.043330308831298), FRAC_CONST(0.077038849527912) }, { FRAC_CONST(0.041426630540984), FRAC_CONST(0.078079025877766) }, { FRAC_CONST(0.039497998397473), FRAC_CONST(0.079072170341994) }, { FRAC_CONST(0.037545574136653), FRAC_CONST(0.080017684687506) }, { FRAC_CONST(0.035570533825892), FRAC_CONST(0.080914999371817) }, { FRAC_CONST(0.033574067155622), FRAC_CONST(0.081763573886112) }, { FRAC_CONST(0.031557376722714), FRAC_CONST(0.082562897080836) }, { FRAC_CONST(0.029521677306074), FRAC_CONST(0.083312487473584) }, { FRAC_CONST(0.027468195134911), FRAC_CONST(0.084011893539132) }, { FRAC_CONST(0.025398167150101), FRAC_CONST(0.084660693981419) }, { FRAC_CONST(0.023312840259098), FRAC_CONST(0.085258497987320) }, { FRAC_CONST(0.021213470584847), FRAC_CONST(0.085804945462053) }, { FRAC_CONST(0.019101322709138), FRAC_CONST(0.086299707246093) }, { FRAC_CONST(0.016977668910873), FRAC_CONST(0.086742485313442) }, { FRAC_CONST(0.014843788399692), FRAC_CONST(0.087133012951149) }, { FRAC_CONST(0.012700966545425), FRAC_CONST(0.087471054919968) }, { FRAC_CONST(0.010550494103830), FRAC_CONST(0.087756407596056) }, { FRAC_CONST(0.008393666439096), FRAC_CONST(0.087988899093631) }, { FRAC_CONST(0.006231782743558), FRAC_CONST(0.088168389368510) }, { FRAC_CONST(0.004066145255116), FRAC_CONST(0.088294770302461) }, { FRAC_CONST(0.001898058472816), FRAC_CONST(0.088367965768336) } }; #ifdef LD_DEC /* 128 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1024[] = { { FRAC_CONST(0.044194160825012), FRAC_CONST(0.000033896503468) }, { FRAC_CONST(0.044193120897389), FRAC_CONST(0.000305066138364) }, { FRAC_CONST(0.044190417123742), FRAC_CONST(0.000576224287693) }, { FRAC_CONST(0.044186049605866), FRAC_CONST(0.000847360742503) }, { FRAC_CONST(0.044180018508197), FRAC_CONST(0.001118465294660) }, { FRAC_CONST(0.044172324057802), FRAC_CONST(0.001389527737231) }, { FRAC_CONST(0.044162966544372), FRAC_CONST(0.001660537864867) }, { FRAC_CONST(0.044151946320213), FRAC_CONST(0.001931485474192) }, { FRAC_CONST(0.044139263800230), FRAC_CONST(0.002202360364180) }, { FRAC_CONST(0.044124919461912), FRAC_CONST(0.002473152336546) }, { FRAC_CONST(0.044108913845316), FRAC_CONST(0.002743851196123) }, { FRAC_CONST(0.044091247553044), FRAC_CONST(0.003014446751254) }, { FRAC_CONST(0.044071921250223), FRAC_CONST(0.003284928814169) }, { FRAC_CONST(0.044050935664476), FRAC_CONST(0.003555287201370) }, { FRAC_CONST(0.044028291585898), FRAC_CONST(0.003825511734018) }, { FRAC_CONST(0.044003989867028), FRAC_CONST(0.004095592238311) }, { FRAC_CONST(0.043978031422810), FRAC_CONST(0.004365518545871) }, { FRAC_CONST(0.043950417230565), FRAC_CONST(0.004635280494126) }, { FRAC_CONST(0.043921148329953), FRAC_CONST(0.004904867926689) }, { FRAC_CONST(0.043890225822930), FRAC_CONST(0.005174270693748) }, { FRAC_CONST(0.043857650873712), FRAC_CONST(0.005443478652439) }, { FRAC_CONST(0.043823424708727), FRAC_CONST(0.005712481667236) }, { FRAC_CONST(0.043787548616571), FRAC_CONST(0.005981269610326) }, { FRAC_CONST(0.043750023947958), FRAC_CONST(0.006249832361997) }, { FRAC_CONST(0.043710852115672), FRAC_CONST(0.006518159811011) }, { FRAC_CONST(0.043670034594508), FRAC_CONST(0.006786241854993) }, { FRAC_CONST(0.043627572921225), FRAC_CONST(0.007054068400804) }, { FRAC_CONST(0.043583468694479), FRAC_CONST(0.007321629364927) }, { FRAC_CONST(0.043537723574771), FRAC_CONST(0.007588914673843) }, { FRAC_CONST(0.043490339284377), FRAC_CONST(0.007855914264410) }, { FRAC_CONST(0.043441317607290), FRAC_CONST(0.008122618084246) }, { FRAC_CONST(0.043390660389149), FRAC_CONST(0.008389016092101) }, { FRAC_CONST(0.043338369537168), FRAC_CONST(0.008655098258243) }, { FRAC_CONST(0.043284447020070), FRAC_CONST(0.008920854564826) }, { FRAC_CONST(0.043228894868005), FRAC_CONST(0.009186275006278) }, { FRAC_CONST(0.043171715172482), FRAC_CONST(0.009451349589667) }, { FRAC_CONST(0.043112910086283), FRAC_CONST(0.009716068335087) }, { FRAC_CONST(0.043052481823387), FRAC_CONST(0.009980421276025) }, { FRAC_CONST(0.042990432658884), FRAC_CONST(0.010244398459743) }, { FRAC_CONST(0.042926764928889), FRAC_CONST(0.010507989947649) }, { FRAC_CONST(0.042861481030457), FRAC_CONST(0.010771185815673) }, { FRAC_CONST(0.042794583421490), FRAC_CONST(0.011033976154639) }, { FRAC_CONST(0.042726074620644), FRAC_CONST(0.011296351070639) }, { FRAC_CONST(0.042655957207238), FRAC_CONST(0.011558300685406) }, { FRAC_CONST(0.042584233821153), FRAC_CONST(0.011819815136685) }, { FRAC_CONST(0.042510907162732), FRAC_CONST(0.012080884578604) }, { FRAC_CONST(0.042435979992684), FRAC_CONST(0.012341499182048) }, { FRAC_CONST(0.042359455131975), FRAC_CONST(0.012601649135022) }, { FRAC_CONST(0.042281335461721), FRAC_CONST(0.012861324643029) }, { FRAC_CONST(0.042201623923085), FRAC_CONST(0.013120515929433) }, { FRAC_CONST(0.042120323517160), FRAC_CONST(0.013379213235827) }, { FRAC_CONST(0.042037437304862), FRAC_CONST(0.013637406822406) }, { FRAC_CONST(0.041952968406809), FRAC_CONST(0.013895086968325) }, { FRAC_CONST(0.041866920003207), FRAC_CONST(0.014152243972073) }, { FRAC_CONST(0.041779295333730), FRAC_CONST(0.014408868151835) }, { FRAC_CONST(0.041690097697398), FRAC_CONST(0.014664949845855) }, { FRAC_CONST(0.041599330452450), FRAC_CONST(0.014920479412801) }, { FRAC_CONST(0.041506997016224), FRAC_CONST(0.015175447232131) }, { FRAC_CONST(0.041413100865019), FRAC_CONST(0.015429843704450) }, { FRAC_CONST(0.041317645533974), FRAC_CONST(0.015683659251874) }, { FRAC_CONST(0.041220634616927), FRAC_CONST(0.015936884318392) }, { FRAC_CONST(0.041122071766285), FRAC_CONST(0.016189509370223) }, { FRAC_CONST(0.041021960692883), FRAC_CONST(0.016441524896177) }, { FRAC_CONST(0.040920305165846), FRAC_CONST(0.016692921408010) }, { FRAC_CONST(0.040817109012449), FRAC_CONST(0.016943689440788) }, { FRAC_CONST(0.040712376117967), FRAC_CONST(0.017193819553235) }, { FRAC_CONST(0.040606110425535), FRAC_CONST(0.017443302328094) }, { FRAC_CONST(0.040498315935996), FRAC_CONST(0.017692128372479) }, { FRAC_CONST(0.040388996707752), FRAC_CONST(0.017940288318230) }, { FRAC_CONST(0.040278156856609), FRAC_CONST(0.018187772822267) }, { FRAC_CONST(0.040165800555627), FRAC_CONST(0.018434572566936) }, { FRAC_CONST(0.040051932034955), FRAC_CONST(0.018680678260367) }, { FRAC_CONST(0.039936555581679), FRAC_CONST(0.018926080636820) }, { FRAC_CONST(0.039819675539659), FRAC_CONST(0.019170770457035) }, { FRAC_CONST(0.039701296309360), FRAC_CONST(0.019414738508577) }, { FRAC_CONST(0.039581422347694), FRAC_CONST(0.019657975606187) }, { FRAC_CONST(0.039460058167849), FRAC_CONST(0.019900472592126) }, { FRAC_CONST(0.039337208339116), FRAC_CONST(0.020142220336521) }, { FRAC_CONST(0.039212877486723), FRAC_CONST(0.020383209737704) }, { FRAC_CONST(0.039087070291656), FRAC_CONST(0.020623431722561) }, { FRAC_CONST(0.038959791490485), FRAC_CONST(0.020862877246870) }, { FRAC_CONST(0.038831045875184), FRAC_CONST(0.021101537295642) }, { FRAC_CONST(0.038700838292953), FRAC_CONST(0.021339402883462) }, { FRAC_CONST(0.038569173646034), FRAC_CONST(0.021576465054824) }, { FRAC_CONST(0.038436056891527), FRAC_CONST(0.021812714884472) }, { FRAC_CONST(0.038301493041202), FRAC_CONST(0.022048143477734) }, { FRAC_CONST(0.038165487161312), FRAC_CONST(0.022282741970855) }, { FRAC_CONST(0.038028044372402), FRAC_CONST(0.022516501531335) }, { FRAC_CONST(0.037889169849115), FRAC_CONST(0.022749413358259) }, { FRAC_CONST(0.037748868819998), FRAC_CONST(0.022981468682628) }, { FRAC_CONST(0.037607146567305), FRAC_CONST(0.023212658767690) }, { FRAC_CONST(0.037464008426800), FRAC_CONST(0.023442974909269) }, { FRAC_CONST(0.037319459787553), FRAC_CONST(0.023672408436094) }, { FRAC_CONST(0.037173506091737), FRAC_CONST(0.023900950710120) }, { FRAC_CONST(0.037026152834428), FRAC_CONST(0.024128593126861) }, { FRAC_CONST(0.036877405563392), FRAC_CONST(0.024355327115708) }, { FRAC_CONST(0.036727269878879), FRAC_CONST(0.024581144140255) }, { FRAC_CONST(0.036575751433414), FRAC_CONST(0.024806035698618) }, { FRAC_CONST(0.036422855931580), FRAC_CONST(0.025029993323758) }, { FRAC_CONST(0.036268589129807), FRAC_CONST(0.025253008583796) }, { FRAC_CONST(0.036112956836151), FRAC_CONST(0.025475073082334) }, { FRAC_CONST(0.035955964910083), FRAC_CONST(0.025696178458769) }, { FRAC_CONST(0.035797619262257), FRAC_CONST(0.025916316388609) }, { FRAC_CONST(0.035637925854300), FRAC_CONST(0.026135478583784) }, { FRAC_CONST(0.035476890698576), FRAC_CONST(0.026353656792963) }, { FRAC_CONST(0.035314519857970), FRAC_CONST(0.026570842801858) }, { FRAC_CONST(0.035150819445650), FRAC_CONST(0.026787028433540) }, { FRAC_CONST(0.034985795624846), FRAC_CONST(0.027002205548742) }, { FRAC_CONST(0.034819454608610), FRAC_CONST(0.027216366046166) }, { FRAC_CONST(0.034651802659589), FRAC_CONST(0.027429501862792) }, { FRAC_CONST(0.034482846089783), FRAC_CONST(0.027641604974175) }, { FRAC_CONST(0.034312591260311), FRAC_CONST(0.027852667394755) }, { FRAC_CONST(0.034141044581172), FRAC_CONST(0.028062681178149) }, { FRAC_CONST(0.033968212511001), FRAC_CONST(0.028271638417458) }, { FRAC_CONST(0.033794101556828), FRAC_CONST(0.028479531245560) }, { FRAC_CONST(0.033618718273831), FRAC_CONST(0.028686351835407) }, { FRAC_CONST(0.033442069265093), FRAC_CONST(0.028892092400321) }, { FRAC_CONST(0.033264161181349), FRAC_CONST(0.029096745194286) }, { FRAC_CONST(0.033085000720737), FRAC_CONST(0.029300302512241) }, { FRAC_CONST(0.032904594628548), FRAC_CONST(0.029502756690366) }, { FRAC_CONST(0.032722949696969), FRAC_CONST(0.029704100106376) }, { FRAC_CONST(0.032540072764829), FRAC_CONST(0.029904325179807) }, { FRAC_CONST(0.032355970717341), FRAC_CONST(0.030103424372297) }, { FRAC_CONST(0.032170650485843), FRAC_CONST(0.030301390187873) }, { FRAC_CONST(0.031984119047537), FRAC_CONST(0.030498215173235) }, { FRAC_CONST(0.031796383425227), FRAC_CONST(0.030693891918034) }, { FRAC_CONST(0.031607450687052), FRAC_CONST(0.030888413055150) }, { FRAC_CONST(0.031417327946223), FRAC_CONST(0.031081771260973) }, { FRAC_CONST(0.031226022360754), FRAC_CONST(0.031273959255676) }, { FRAC_CONST(0.031033541133193), FRAC_CONST(0.031464969803488) }, { FRAC_CONST(0.030839891510348), FRAC_CONST(0.031654795712972) }, { FRAC_CONST(0.030645080783018), FRAC_CONST(0.031843429837288) }, { FRAC_CONST(0.030449116285718), FRAC_CONST(0.032030865074469) }, { FRAC_CONST(0.030252005396399), FRAC_CONST(0.032217094367684) }, { FRAC_CONST(0.030053755536176), FRAC_CONST(0.032402110705505) }, { FRAC_CONST(0.029854374169043), FRAC_CONST(0.032585907122172) }, { FRAC_CONST(0.029653868801596), FRAC_CONST(0.032768476697853) }, { FRAC_CONST(0.029452246982750), FRAC_CONST(0.032949812558907) }, { FRAC_CONST(0.029249516303451), FRAC_CONST(0.033129907878142) }, { FRAC_CONST(0.029045684396395), FRAC_CONST(0.033308755875070) }, { FRAC_CONST(0.028840758935738), FRAC_CONST(0.033486349816166) }, { FRAC_CONST(0.028634747636808), FRAC_CONST(0.033662683015118) }, { FRAC_CONST(0.028427658255815), FRAC_CONST(0.033837748833080) }, { FRAC_CONST(0.028219498589555), FRAC_CONST(0.034011540678924) }, { FRAC_CONST(0.028010276475123), FRAC_CONST(0.034184052009485) }, { FRAC_CONST(0.027799999789613), FRAC_CONST(0.034355276329809) }, { FRAC_CONST(0.027588676449824), FRAC_CONST(0.034525207193396) }, { FRAC_CONST(0.027376314411959), FRAC_CONST(0.034693838202447) }, { FRAC_CONST(0.027162921671330), FRAC_CONST(0.034861163008098) }, { FRAC_CONST(0.026948506262053), FRAC_CONST(0.035027175310665) }, { FRAC_CONST(0.026733076256746), FRAC_CONST(0.035191868859880) }, { FRAC_CONST(0.026516639766228), FRAC_CONST(0.035355237455122) }, { FRAC_CONST(0.026299204939210), FRAC_CONST(0.035517274945657) }, { FRAC_CONST(0.026080779961991), FRAC_CONST(0.035677975230865) }, { FRAC_CONST(0.025861373058146), FRAC_CONST(0.035837332260471) }, { FRAC_CONST(0.025640992488223), FRAC_CONST(0.035995340034772) }, { FRAC_CONST(0.025419646549425), FRAC_CONST(0.036151992604866) }, { FRAC_CONST(0.025197343575302), FRAC_CONST(0.036307284072871) }, { FRAC_CONST(0.024974091935435), FRAC_CONST(0.036461208592152) }, { FRAC_CONST(0.024749900035122), FRAC_CONST(0.036613760367538) }, { FRAC_CONST(0.024524776315061), FRAC_CONST(0.036764933655540) }, { FRAC_CONST(0.024298729251033), FRAC_CONST(0.036914722764569) }, { FRAC_CONST(0.024071767353583), FRAC_CONST(0.037063122055150) }, { FRAC_CONST(0.023843899167697), FRAC_CONST(0.037210125940135) }, { FRAC_CONST(0.023615133272485), FRAC_CONST(0.037355728884908) }, { FRAC_CONST(0.023385478280852), FRAC_CONST(0.037499925407603) }, { FRAC_CONST(0.023154942839179), FRAC_CONST(0.037642710079302) }, { FRAC_CONST(0.022923535626995), FRAC_CONST(0.037784077524241) }, { FRAC_CONST(0.022691265356652), FRAC_CONST(0.037924022420018) }, { FRAC_CONST(0.022458140772993), FRAC_CONST(0.038062539497785) }, { FRAC_CONST(0.022224170653027), FRAC_CONST(0.038199623542453) }, { FRAC_CONST(0.021989363805598), FRAC_CONST(0.038335269392885) }, { FRAC_CONST(0.021753729071049), FRAC_CONST(0.038469471942092) }, { FRAC_CONST(0.021517275320897), FRAC_CONST(0.038602226137423) }, { FRAC_CONST(0.021280011457490), FRAC_CONST(0.038733526980758) }, { FRAC_CONST(0.021041946413679), FRAC_CONST(0.038863369528695) }, { FRAC_CONST(0.020803089152479), FRAC_CONST(0.038991748892734) }, { FRAC_CONST(0.020563448666730), FRAC_CONST(0.039118660239466) }, { FRAC_CONST(0.020323033978761), FRAC_CONST(0.039244098790750) }, { FRAC_CONST(0.020081854140050), FRAC_CONST(0.039368059823895) }, { FRAC_CONST(0.019839918230880), FRAC_CONST(0.039490538671839) }, { FRAC_CONST(0.019597235360003), FRAC_CONST(0.039611530723322) }, { FRAC_CONST(0.019353814664291), FRAC_CONST(0.039731031423061) }, { FRAC_CONST(0.019109665308395), FRAC_CONST(0.039849036271924) }, { FRAC_CONST(0.018864796484402), FRAC_CONST(0.039965540827094) }, { FRAC_CONST(0.018619217411483), FRAC_CONST(0.040080540702240) }, { FRAC_CONST(0.018372937335552), FRAC_CONST(0.040194031567683) }, { FRAC_CONST(0.018125965528915), FRAC_CONST(0.040306009150554) }, { FRAC_CONST(0.017878311289921), FRAC_CONST(0.040416469234963) }, { FRAC_CONST(0.017629983942612), FRAC_CONST(0.040525407662148) }, { FRAC_CONST(0.017380992836371), FRAC_CONST(0.040632820330639) }, { FRAC_CONST(0.017131347345575), FRAC_CONST(0.040738703196411) }, { FRAC_CONST(0.016881056869233), FRAC_CONST(0.040843052273033) }, { FRAC_CONST(0.016630130830641), FRAC_CONST(0.040945863631822) }, { FRAC_CONST(0.016378578677023), FRAC_CONST(0.041047133401988) }, { FRAC_CONST(0.016126409879175), FRAC_CONST(0.041146857770781) }, { FRAC_CONST(0.015873633931110), FRAC_CONST(0.041245032983635) }, { FRAC_CONST(0.015620260349699), FRAC_CONST(0.041341655344309) }, { FRAC_CONST(0.015366298674314), FRAC_CONST(0.041436721215026) }, { FRAC_CONST(0.015111758466470), FRAC_CONST(0.041530227016609) }, { FRAC_CONST(0.014856649309460), FRAC_CONST(0.041622169228618) }, { FRAC_CONST(0.014600980808001), FRAC_CONST(0.041712544389481) }, { FRAC_CONST(0.014344762587867), FRAC_CONST(0.041801349096623) }, { FRAC_CONST(0.014088004295529), FRAC_CONST(0.041888580006598) }, { FRAC_CONST(0.013830715597792), FRAC_CONST(0.041974233835211) }, { FRAC_CONST(0.013572906181430), FRAC_CONST(0.042058307357645) }, { FRAC_CONST(0.013314585752822), FRAC_CONST(0.042140797408577) }, { FRAC_CONST(0.013055764037585), FRAC_CONST(0.042221700882306) }, { FRAC_CONST(0.012796450780212), FRAC_CONST(0.042301014732860) }, { FRAC_CONST(0.012536655743699), FRAC_CONST(0.042378735974118) }, { FRAC_CONST(0.012276388709183), FRAC_CONST(0.042454861679919) }, { FRAC_CONST(0.012015659475571), FRAC_CONST(0.042529388984173) }, { FRAC_CONST(0.011754477859172), FRAC_CONST(0.042602315080970) }, { FRAC_CONST(0.011492853693324), FRAC_CONST(0.042673637224683) }, { FRAC_CONST(0.011230796828031), FRAC_CONST(0.042743352730074) }, { FRAC_CONST(0.010968317129584), FRAC_CONST(0.042811458972393) }, { FRAC_CONST(0.010705424480197), FRAC_CONST(0.042877953387479) }, { FRAC_CONST(0.010442128777629), FRAC_CONST(0.042942833471854) }, { FRAC_CONST(0.010178439934815), FRAC_CONST(0.043006096782821) }, { FRAC_CONST(0.009914367879490), FRAC_CONST(0.043067740938551) }, { FRAC_CONST(0.009649922553818), FRAC_CONST(0.043127763618177) }, { FRAC_CONST(0.009385113914016), FRAC_CONST(0.043186162561878) }, { FRAC_CONST(0.009119951929979), FRAC_CONST(0.043242935570968) }, { FRAC_CONST(0.008854446584907), FRAC_CONST(0.043298080507974) }, { FRAC_CONST(0.008588607874926), FRAC_CONST(0.043351595296722) }, { FRAC_CONST(0.008322445808712), FRAC_CONST(0.043403477922409) }, { FRAC_CONST(0.008055970407118), FRAC_CONST(0.043453726431684) }, { FRAC_CONST(0.007789191702791), FRAC_CONST(0.043502338932719) }, { FRAC_CONST(0.007522119739798), FRAC_CONST(0.043549313595281) }, { FRAC_CONST(0.007254764573250), FRAC_CONST(0.043594648650800) }, { FRAC_CONST(0.006987136268915), FRAC_CONST(0.043638342392438) }, { FRAC_CONST(0.006719244902849), FRAC_CONST(0.043680393175148) }, { FRAC_CONST(0.006451100561010), FRAC_CONST(0.043720799415744) }, { FRAC_CONST(0.006182713338881), FRAC_CONST(0.043759559592953) }, { FRAC_CONST(0.005914093341090), FRAC_CONST(0.043796672247476) }, { FRAC_CONST(0.005645250681027), FRAC_CONST(0.043832135982044) }, { FRAC_CONST(0.005376195480466), FRAC_CONST(0.043865949461465) }, { FRAC_CONST(0.005106937869184), FRAC_CONST(0.043898111412683) }, { FRAC_CONST(0.004837487984578), FRAC_CONST(0.043928620624817) }, { FRAC_CONST(0.004567855971284), FRAC_CONST(0.043957475949213) }, { FRAC_CONST(0.004298051980793), FRAC_CONST(0.043984676299484) }, { FRAC_CONST(0.004028086171076), FRAC_CONST(0.044010220651553) }, { FRAC_CONST(0.003757968706190), FRAC_CONST(0.044034108043689) }, { FRAC_CONST(0.003487709755907), FRAC_CONST(0.044056337576546) }, { FRAC_CONST(0.003217319495322), FRAC_CONST(0.044076908413193) }, { FRAC_CONST(0.002946808104477), FRAC_CONST(0.044095819779151) }, { FRAC_CONST(0.002676185767973), FRAC_CONST(0.044113070962418) }, { FRAC_CONST(0.002405462674586), FRAC_CONST(0.044128661313495) }, { FRAC_CONST(0.002134649016890), FRAC_CONST(0.044142590245416) }, { FRAC_CONST(0.001863754990865), FRAC_CONST(0.044154857233763) }, { FRAC_CONST(0.001592790795518), FRAC_CONST(0.044165461816692) }, { FRAC_CONST(0.001321766632497), FRAC_CONST(0.044174403594946) }, { FRAC_CONST(0.001050692705710), FRAC_CONST(0.044181682231873) }, { FRAC_CONST(0.000779579220936), FRAC_CONST(0.044187297453434) }, { FRAC_CONST(0.000508436385446), FRAC_CONST(0.044191249048222) }, { FRAC_CONST(0.000237274407613), FRAC_CONST(0.044193536867459) } }; #endif // LD_DEC #ifdef ALLOW_SMALL_FRAMELENGTH /* 480 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1920[] = { { FRAC_CONST(0.032274858518097), FRAC_CONST(0.000013202404176) }, { FRAC_CONST(0.032274642494505), FRAC_CONST(0.000118821372483) }, { FRAC_CONST(0.032274080835421), FRAC_CONST(0.000224439068308) }, { FRAC_CONST(0.032273173546860), FRAC_CONST(0.000330054360572) }, { FRAC_CONST(0.032271920638538), FRAC_CONST(0.000435666118218) }, { FRAC_CONST(0.032270322123873), FRAC_CONST(0.000541273210231) }, { FRAC_CONST(0.032268378019984), FRAC_CONST(0.000646874505642) }, { FRAC_CONST(0.032266088347691), FRAC_CONST(0.000752468873546) }, { FRAC_CONST(0.032263453131514), FRAC_CONST(0.000858055183114) }, { FRAC_CONST(0.032260472399674), FRAC_CONST(0.000963632303600) }, { FRAC_CONST(0.032257146184092), FRAC_CONST(0.001069199104358) }, { FRAC_CONST(0.032253474520390), FRAC_CONST(0.001174754454853) }, { FRAC_CONST(0.032249457447888), FRAC_CONST(0.001280297224671) }, { FRAC_CONST(0.032245095009606), FRAC_CONST(0.001385826283535) }, { FRAC_CONST(0.032240387252262), FRAC_CONST(0.001491340501313) }, { FRAC_CONST(0.032235334226272), FRAC_CONST(0.001596838748031) }, { FRAC_CONST(0.032229935985750), FRAC_CONST(0.001702319893890) }, { FRAC_CONST(0.032224192588507), FRAC_CONST(0.001807782809271) }, { FRAC_CONST(0.032218104096050), FRAC_CONST(0.001913226364749) }, { FRAC_CONST(0.032211670573582), FRAC_CONST(0.002018649431111) }, { FRAC_CONST(0.032204892090000), FRAC_CONST(0.002124050879359) }, { FRAC_CONST(0.032197768717898), FRAC_CONST(0.002229429580728) }, { FRAC_CONST(0.032190300533560), FRAC_CONST(0.002334784406698) }, { FRAC_CONST(0.032182487616965), FRAC_CONST(0.002440114229003) }, { FRAC_CONST(0.032174330051782), FRAC_CONST(0.002545417919644) }, { FRAC_CONST(0.032165827925374), FRAC_CONST(0.002650694350905) }, { FRAC_CONST(0.032156981328790), FRAC_CONST(0.002755942395358) }, { FRAC_CONST(0.032147790356771), FRAC_CONST(0.002861160925883) }, { FRAC_CONST(0.032138255107744), FRAC_CONST(0.002966348815672) }, { FRAC_CONST(0.032128375683825), FRAC_CONST(0.003071504938250) }, { FRAC_CONST(0.032118152190814), FRAC_CONST(0.003176628167476) }, { FRAC_CONST(0.032107584738196), FRAC_CONST(0.003281717377568) }, { FRAC_CONST(0.032096673439141), FRAC_CONST(0.003386771443102) }, { FRAC_CONST(0.032085418410500), FRAC_CONST(0.003491789239036) }, { FRAC_CONST(0.032073819772804), FRAC_CONST(0.003596769640711) }, { FRAC_CONST(0.032061877650267), FRAC_CONST(0.003701711523874) }, { FRAC_CONST(0.032049592170778), FRAC_CONST(0.003806613764680) }, { FRAC_CONST(0.032036963465906), FRAC_CONST(0.003911475239711) }, { FRAC_CONST(0.032023991670893), FRAC_CONST(0.004016294825985) }, { FRAC_CONST(0.032010676924657), FRAC_CONST(0.004121071400967) }, { FRAC_CONST(0.031997019369789), FRAC_CONST(0.004225803842586) }, { FRAC_CONST(0.031983019152549), FRAC_CONST(0.004330491029241) }, { FRAC_CONST(0.031968676422869), FRAC_CONST(0.004435131839816) }, { FRAC_CONST(0.031953991334348), FRAC_CONST(0.004539725153692) }, { FRAC_CONST(0.031938964044252), FRAC_CONST(0.004644269850758) }, { FRAC_CONST(0.031923594713510), FRAC_CONST(0.004748764811426) }, { FRAC_CONST(0.031907883506716), FRAC_CONST(0.004853208916638) }, { FRAC_CONST(0.031891830592124), FRAC_CONST(0.004957601047881) }, { FRAC_CONST(0.031875436141648), FRAC_CONST(0.005061940087200) }, { FRAC_CONST(0.031858700330859), FRAC_CONST(0.005166224917208) }, { FRAC_CONST(0.031841623338985), FRAC_CONST(0.005270454421097) }, { FRAC_CONST(0.031824205348907), FRAC_CONST(0.005374627482653) }, { FRAC_CONST(0.031806446547156), FRAC_CONST(0.005478742986267) }, { FRAC_CONST(0.031788347123916), FRAC_CONST(0.005582799816945) }, { FRAC_CONST(0.031769907273017), FRAC_CONST(0.005686796860323) }, { FRAC_CONST(0.031751127191935), FRAC_CONST(0.005790733002674) }, { FRAC_CONST(0.031732007081789), FRAC_CONST(0.005894607130928) }, { FRAC_CONST(0.031712547147340), FRAC_CONST(0.005998418132675) }, { FRAC_CONST(0.031692747596989), FRAC_CONST(0.006102164896182) }, { FRAC_CONST(0.031672608642773), FRAC_CONST(0.006205846310406) }, { FRAC_CONST(0.031652130500364), FRAC_CONST(0.006309461265002) }, { FRAC_CONST(0.031631313389067), FRAC_CONST(0.006413008650337) }, { FRAC_CONST(0.031610157531816), FRAC_CONST(0.006516487357501) }, { FRAC_CONST(0.031588663155172), FRAC_CONST(0.006619896278321) }, { FRAC_CONST(0.031566830489325), FRAC_CONST(0.006723234305370) }, { FRAC_CONST(0.031544659768083), FRAC_CONST(0.006826500331981) }, { FRAC_CONST(0.031522151228878), FRAC_CONST(0.006929693252258) }, { FRAC_CONST(0.031499305112758), FRAC_CONST(0.007032811961088) }, { FRAC_CONST(0.031476121664387), FRAC_CONST(0.007135855354151) }, { FRAC_CONST(0.031452601132040), FRAC_CONST(0.007238822327937) }, { FRAC_CONST(0.031428743767604), FRAC_CONST(0.007341711779751) }, { FRAC_CONST(0.031404549826572), FRAC_CONST(0.007444522607730) }, { FRAC_CONST(0.031380019568042), FRAC_CONST(0.007547253710853) }, { FRAC_CONST(0.031355153254712), FRAC_CONST(0.007649903988952) }, { FRAC_CONST(0.031329951152882), FRAC_CONST(0.007752472342725) }, { FRAC_CONST(0.031304413532445), FRAC_CONST(0.007854957673748) }, { FRAC_CONST(0.031278540666888), FRAC_CONST(0.007957358884484) }, { FRAC_CONST(0.031252332833290), FRAC_CONST(0.008059674878300) }, { FRAC_CONST(0.031225790312316), FRAC_CONST(0.008161904559473) }, { FRAC_CONST(0.031198913388214), FRAC_CONST(0.008264046833205) }, { FRAC_CONST(0.031171702348814), FRAC_CONST(0.008366100605636) }, { FRAC_CONST(0.031144157485525), FRAC_CONST(0.008468064783849) }, { FRAC_CONST(0.031116279093331), FRAC_CONST(0.008569938275893) }, { FRAC_CONST(0.031088067470786), FRAC_CONST(0.008671719990782) }, { FRAC_CONST(0.031059522920014), FRAC_CONST(0.008773408838517) }, { FRAC_CONST(0.031030645746705), FRAC_CONST(0.008875003730092) }, { FRAC_CONST(0.031001436260110), FRAC_CONST(0.008976503577507) }, { FRAC_CONST(0.030971894773039), FRAC_CONST(0.009077907293780) }, { FRAC_CONST(0.030942021601857), FRAC_CONST(0.009179213792959) }, { FRAC_CONST(0.030911817066483), FRAC_CONST(0.009280421990133) }, { FRAC_CONST(0.030881281490382), FRAC_CONST(0.009381530801444) }, { FRAC_CONST(0.030850415200566), FRAC_CONST(0.009482539144097) }, { FRAC_CONST(0.030819218527589), FRAC_CONST(0.009583445936373) }, { FRAC_CONST(0.030787691805541), FRAC_CONST(0.009684250097643) }, { FRAC_CONST(0.030755835372048), FRAC_CONST(0.009784950548375) }, { FRAC_CONST(0.030723649568268), FRAC_CONST(0.009885546210147) }, { FRAC_CONST(0.030691134738883), FRAC_CONST(0.009986036005661) }, { FRAC_CONST(0.030658291232103), FRAC_CONST(0.010086418858753) }, { FRAC_CONST(0.030625119399655), FRAC_CONST(0.010186693694402) }, { FRAC_CONST(0.030591619596781), FRAC_CONST(0.010286859438745) }, { FRAC_CONST(0.030557792182239), FRAC_CONST(0.010386915019088) }, { FRAC_CONST(0.030523637518292), FRAC_CONST(0.010486859363916) }, { FRAC_CONST(0.030489155970710), FRAC_CONST(0.010586691402906) }, { FRAC_CONST(0.030454347908763), FRAC_CONST(0.010686410066936) }, { FRAC_CONST(0.030419213705216), FRAC_CONST(0.010786014288099) }, { FRAC_CONST(0.030383753736329), FRAC_CONST(0.010885502999714) }, { FRAC_CONST(0.030347968381849), FRAC_CONST(0.010984875136338) }, { FRAC_CONST(0.030311858025010), FRAC_CONST(0.011084129633775) }, { FRAC_CONST(0.030275423052523), FRAC_CONST(0.011183265429088) }, { FRAC_CONST(0.030238663854579), FRAC_CONST(0.011282281460612) }, { FRAC_CONST(0.030201580824838), FRAC_CONST(0.011381176667967) }, { FRAC_CONST(0.030164174360430), FRAC_CONST(0.011479949992062) }, { FRAC_CONST(0.030126444861948), FRAC_CONST(0.011578600375117) }, { FRAC_CONST(0.030088392733446), FRAC_CONST(0.011677126760663) }, { FRAC_CONST(0.030050018382430), FRAC_CONST(0.011775528093563) }, { FRAC_CONST(0.030011322219859), FRAC_CONST(0.011873803320018) }, { FRAC_CONST(0.029972304660138), FRAC_CONST(0.011971951387578) }, { FRAC_CONST(0.029932966121114), FRAC_CONST(0.012069971245157) }, { FRAC_CONST(0.029893307024070), FRAC_CONST(0.012167861843041) }, { FRAC_CONST(0.029853327793724), FRAC_CONST(0.012265622132901) }, { FRAC_CONST(0.029813028858222), FRAC_CONST(0.012363251067801) }, { FRAC_CONST(0.029772410649132), FRAC_CONST(0.012460747602215) }, { FRAC_CONST(0.029731473601443), FRAC_CONST(0.012558110692033) }, { FRAC_CONST(0.029690218153558), FRAC_CONST(0.012655339294575) }, { FRAC_CONST(0.029648644747289), FRAC_CONST(0.012752432368600) }, { FRAC_CONST(0.029606753827855), FRAC_CONST(0.012849388874320) }, { FRAC_CONST(0.029564545843872), FRAC_CONST(0.012946207773407) }, { FRAC_CONST(0.029522021247356), FRAC_CONST(0.013042888029011) }, { FRAC_CONST(0.029479180493710), FRAC_CONST(0.013139428605762) }, { FRAC_CONST(0.029436024041725), FRAC_CONST(0.013235828469789) }, { FRAC_CONST(0.029392552353570), FRAC_CONST(0.013332086588727) }, { FRAC_CONST(0.029348765894794), FRAC_CONST(0.013428201931728) }, { FRAC_CONST(0.029304665134313), FRAC_CONST(0.013524173469475) }, { FRAC_CONST(0.029260250544412), FRAC_CONST(0.013620000174189) }, { FRAC_CONST(0.029215522600735), FRAC_CONST(0.013715681019643) }, { FRAC_CONST(0.029170481782283), FRAC_CONST(0.013811214981173) }, { FRAC_CONST(0.029125128571406), FRAC_CONST(0.013906601035686) }, { FRAC_CONST(0.029079463453801), FRAC_CONST(0.014001838161674) }, { FRAC_CONST(0.029033486918505), FRAC_CONST(0.014096925339225) }, { FRAC_CONST(0.028987199457889), FRAC_CONST(0.014191861550031) }, { FRAC_CONST(0.028940601567655), FRAC_CONST(0.014286645777401) }, { FRAC_CONST(0.028893693746829), FRAC_CONST(0.014381277006273) }, { FRAC_CONST(0.028846476497755), FRAC_CONST(0.014475754223221) }, { FRAC_CONST(0.028798950326094), FRAC_CONST(0.014570076416472) }, { FRAC_CONST(0.028751115740811), FRAC_CONST(0.014664242575910) }, { FRAC_CONST(0.028702973254178), FRAC_CONST(0.014758251693091) }, { FRAC_CONST(0.028654523381760), FRAC_CONST(0.014852102761253) }, { FRAC_CONST(0.028605766642418), FRAC_CONST(0.014945794775326) }, { FRAC_CONST(0.028556703558297), FRAC_CONST(0.015039326731945) }, { FRAC_CONST(0.028507334654823), FRAC_CONST(0.015132697629457) }, { FRAC_CONST(0.028457660460698), FRAC_CONST(0.015225906467935) }, { FRAC_CONST(0.028407681507891), FRAC_CONST(0.015318952249187) }, { FRAC_CONST(0.028357398331639), FRAC_CONST(0.015411833976768) }, { FRAC_CONST(0.028306811470432), FRAC_CONST(0.015504550655988) }, { FRAC_CONST(0.028255921466016), FRAC_CONST(0.015597101293927) }, { FRAC_CONST(0.028204728863381), FRAC_CONST(0.015689484899442) }, { FRAC_CONST(0.028153234210760), FRAC_CONST(0.015781700483179) }, { FRAC_CONST(0.028101438059619), FRAC_CONST(0.015873747057582) }, { FRAC_CONST(0.028049340964652), FRAC_CONST(0.015965623636907) }, { FRAC_CONST(0.027996943483779), FRAC_CONST(0.016057329237229) }, { FRAC_CONST(0.027944246178133), FRAC_CONST(0.016148862876456) }, { FRAC_CONST(0.027891249612061), FRAC_CONST(0.016240223574335) }, { FRAC_CONST(0.027837954353113), FRAC_CONST(0.016331410352467) }, { FRAC_CONST(0.027784360972039), FRAC_CONST(0.016422422234315) }, { FRAC_CONST(0.027730470042780), FRAC_CONST(0.016513258245214) }, { FRAC_CONST(0.027676282142466), FRAC_CONST(0.016603917412384) }, { FRAC_CONST(0.027621797851405), FRAC_CONST(0.016694398764938) }, { FRAC_CONST(0.027567017753080), FRAC_CONST(0.016784701333894) }, { FRAC_CONST(0.027511942434143), FRAC_CONST(0.016874824152183) }, { FRAC_CONST(0.027456572484404), FRAC_CONST(0.016964766254662) }, { FRAC_CONST(0.027400908496833), FRAC_CONST(0.017054526678124) }, { FRAC_CONST(0.027344951067546), FRAC_CONST(0.017144104461307) }, { FRAC_CONST(0.027288700795801), FRAC_CONST(0.017233498644904) }, { FRAC_CONST(0.027232158283994), FRAC_CONST(0.017322708271577) }, { FRAC_CONST(0.027175324137651), FRAC_CONST(0.017411732385960) }, { FRAC_CONST(0.027118198965418), FRAC_CONST(0.017500570034678) }, { FRAC_CONST(0.027060783379060), FRAC_CONST(0.017589220266351) }, { FRAC_CONST(0.027003077993454), FRAC_CONST(0.017677682131607) }, { FRAC_CONST(0.026945083426576), FRAC_CONST(0.017765954683088) }, { FRAC_CONST(0.026886800299502), FRAC_CONST(0.017854036975468) }, { FRAC_CONST(0.026828229236397), FRAC_CONST(0.017941928065456) }, { FRAC_CONST(0.026769370864511), FRAC_CONST(0.018029627011808) }, { FRAC_CONST(0.026710225814170), FRAC_CONST(0.018117132875340) }, { FRAC_CONST(0.026650794718768), FRAC_CONST(0.018204444718934) }, { FRAC_CONST(0.026591078214767), FRAC_CONST(0.018291561607551) }, { FRAC_CONST(0.026531076941680), FRAC_CONST(0.018378482608238) }, { FRAC_CONST(0.026470791542075), FRAC_CONST(0.018465206790142) }, { FRAC_CONST(0.026410222661558), FRAC_CONST(0.018551733224515) }, { FRAC_CONST(0.026349370948775), FRAC_CONST(0.018638060984730) }, { FRAC_CONST(0.026288237055398), FRAC_CONST(0.018724189146286) }, { FRAC_CONST(0.026226821636121), FRAC_CONST(0.018810116786819) }, { FRAC_CONST(0.026165125348656), FRAC_CONST(0.018895842986112) }, { FRAC_CONST(0.026103148853718), FRAC_CONST(0.018981366826109) }, { FRAC_CONST(0.026040892815028), FRAC_CONST(0.019066687390916) }, { FRAC_CONST(0.025978357899296), FRAC_CONST(0.019151803766819) }, { FRAC_CONST(0.025915544776223), FRAC_CONST(0.019236715042290) }, { FRAC_CONST(0.025852454118485), FRAC_CONST(0.019321420307998) }, { FRAC_CONST(0.025789086601733), FRAC_CONST(0.019405918656817) }, { FRAC_CONST(0.025725442904582), FRAC_CONST(0.019490209183837) }, { FRAC_CONST(0.025661523708606), FRAC_CONST(0.019574290986376) }, { FRAC_CONST(0.025597329698327), FRAC_CONST(0.019658163163984) }, { FRAC_CONST(0.025532861561211), FRAC_CONST(0.019741824818458) }, { FRAC_CONST(0.025468119987662), FRAC_CONST(0.019825275053848) }, { FRAC_CONST(0.025403105671008), FRAC_CONST(0.019908512976470) }, { FRAC_CONST(0.025337819307501), FRAC_CONST(0.019991537694913) }, { FRAC_CONST(0.025272261596305), FRAC_CONST(0.020074348320047) }, { FRAC_CONST(0.025206433239491), FRAC_CONST(0.020156943965039) }, { FRAC_CONST(0.025140334942028), FRAC_CONST(0.020239323745355) }, { FRAC_CONST(0.025073967411776), FRAC_CONST(0.020321486778774) }, { FRAC_CONST(0.025007331359476), FRAC_CONST(0.020403432185395) }, { FRAC_CONST(0.024940427498748), FRAC_CONST(0.020485159087650) }, { FRAC_CONST(0.024873256546079), FRAC_CONST(0.020566666610309) }, { FRAC_CONST(0.024805819220816), FRAC_CONST(0.020647953880491) }, { FRAC_CONST(0.024738116245157), FRAC_CONST(0.020729020027676) }, { FRAC_CONST(0.024670148344147), FRAC_CONST(0.020809864183709) }, { FRAC_CONST(0.024601916245669), FRAC_CONST(0.020890485482816) }, { FRAC_CONST(0.024533420680433), FRAC_CONST(0.020970883061607) }, { FRAC_CONST(0.024464662381971), FRAC_CONST(0.021051056059087) }, { FRAC_CONST(0.024395642086630), FRAC_CONST(0.021131003616670) }, { FRAC_CONST(0.024326360533561), FRAC_CONST(0.021210724878181) }, { FRAC_CONST(0.024256818464715), FRAC_CONST(0.021290218989868) }, { FRAC_CONST(0.024187016624830), FRAC_CONST(0.021369485100415) }, { FRAC_CONST(0.024116955761430), FRAC_CONST(0.021448522360944) }, { FRAC_CONST(0.024046636624808), FRAC_CONST(0.021527329925030) }, { FRAC_CONST(0.023976059968027), FRAC_CONST(0.021605906948708) }, { FRAC_CONST(0.023905226546906), FRAC_CONST(0.021684252590480) }, { FRAC_CONST(0.023834137120014), FRAC_CONST(0.021762366011328) }, { FRAC_CONST(0.023762792448662), FRAC_CONST(0.021840246374720) }, { FRAC_CONST(0.023691193296893), FRAC_CONST(0.021917892846620) }, { FRAC_CONST(0.023619340431478), FRAC_CONST(0.021995304595495) }, { FRAC_CONST(0.023547234621902), FRAC_CONST(0.022072480792330) }, { FRAC_CONST(0.023474876640361), FRAC_CONST(0.022149420610628) }, { FRAC_CONST(0.023402267261751), FRAC_CONST(0.022226123226426) }, { FRAC_CONST(0.023329407263659), FRAC_CONST(0.022302587818300) }, { FRAC_CONST(0.023256297426359), FRAC_CONST(0.022378813567377) }, { FRAC_CONST(0.023182938532797), FRAC_CONST(0.022454799657339) }, { FRAC_CONST(0.023109331368588), FRAC_CONST(0.022530545274437) }, { FRAC_CONST(0.023035476722006), FRAC_CONST(0.022606049607496) }, { FRAC_CONST(0.022961375383975), FRAC_CONST(0.022681311847926) }, { FRAC_CONST(0.022887028148061), FRAC_CONST(0.022756331189727) }, { FRAC_CONST(0.022812435810462), FRAC_CONST(0.022831106829504) }, { FRAC_CONST(0.022737599170003), FRAC_CONST(0.022905637966469) }, { FRAC_CONST(0.022662519028125), FRAC_CONST(0.022979923802453) }, { FRAC_CONST(0.022587196188874), FRAC_CONST(0.023053963541915) }, { FRAC_CONST(0.022511631458899), FRAC_CONST(0.023127756391950) }, { FRAC_CONST(0.022435825647437), FRAC_CONST(0.023201301562294) }, { FRAC_CONST(0.022359779566306), FRAC_CONST(0.023274598265338) }, { FRAC_CONST(0.022283494029900), FRAC_CONST(0.023347645716133) }, { FRAC_CONST(0.022206969855176), FRAC_CONST(0.023420443132400) }, { FRAC_CONST(0.022130207861645), FRAC_CONST(0.023492989734537) }, { FRAC_CONST(0.022053208871367), FRAC_CONST(0.023565284745628) }, { FRAC_CONST(0.021975973708940), FRAC_CONST(0.023637327391451) }, { FRAC_CONST(0.021898503201489), FRAC_CONST(0.023709116900488) }, { FRAC_CONST(0.021820798178663), FRAC_CONST(0.023780652503931) }, { FRAC_CONST(0.021742859472618), FRAC_CONST(0.023851933435691) }, { FRAC_CONST(0.021664687918017), FRAC_CONST(0.023922958932406) }, { FRAC_CONST(0.021586284352013), FRAC_CONST(0.023993728233451) }, { FRAC_CONST(0.021507649614247), FRAC_CONST(0.024064240580942) }, { FRAC_CONST(0.021428784546832), FRAC_CONST(0.024134495219750) }, { FRAC_CONST(0.021349689994350), FRAC_CONST(0.024204491397504) }, { FRAC_CONST(0.021270366803840), FRAC_CONST(0.024274228364600) }, { FRAC_CONST(0.021190815824791), FRAC_CONST(0.024343705374213) }, { FRAC_CONST(0.021111037909128), FRAC_CONST(0.024412921682298) }, { FRAC_CONST(0.021031033911210), FRAC_CONST(0.024481876547605) }, { FRAC_CONST(0.020950804687815), FRAC_CONST(0.024550569231683) }, { FRAC_CONST(0.020870351098134), FRAC_CONST(0.024618998998889) }, { FRAC_CONST(0.020789674003759), FRAC_CONST(0.024687165116394) }, { FRAC_CONST(0.020708774268678), FRAC_CONST(0.024755066854194) }, { FRAC_CONST(0.020627652759262), FRAC_CONST(0.024822703485116) }, { FRAC_CONST(0.020546310344257), FRAC_CONST(0.024890074284826) }, { FRAC_CONST(0.020464747894775), FRAC_CONST(0.024957178531837) }, { FRAC_CONST(0.020382966284284), FRAC_CONST(0.025024015507516) }, { FRAC_CONST(0.020300966388600), FRAC_CONST(0.025090584496093) }, { FRAC_CONST(0.020218749085876), FRAC_CONST(0.025156884784668) }, { FRAC_CONST(0.020136315256592), FRAC_CONST(0.025222915663218) }, { FRAC_CONST(0.020053665783549), FRAC_CONST(0.025288676424605) }, { FRAC_CONST(0.019970801551857), FRAC_CONST(0.025354166364584) }, { FRAC_CONST(0.019887723448925), FRAC_CONST(0.025419384781811) }, { FRAC_CONST(0.019804432364452), FRAC_CONST(0.025484330977848) }, { FRAC_CONST(0.019720929190419), FRAC_CONST(0.025549004257175) }, { FRAC_CONST(0.019637214821078), FRAC_CONST(0.025613403927192) }, { FRAC_CONST(0.019553290152943), FRAC_CONST(0.025677529298230) }, { FRAC_CONST(0.019469156084779), FRAC_CONST(0.025741379683559) }, { FRAC_CONST(0.019384813517595), FRAC_CONST(0.025804954399392) }, { FRAC_CONST(0.019300263354632), FRAC_CONST(0.025868252764895) }, { FRAC_CONST(0.019215506501354), FRAC_CONST(0.025931274102193) }, { FRAC_CONST(0.019130543865439), FRAC_CONST(0.025994017736379) }, { FRAC_CONST(0.019045376356769), FRAC_CONST(0.026056482995518) }, { FRAC_CONST(0.018960004887419), FRAC_CONST(0.026118669210657) }, { FRAC_CONST(0.018874430371648), FRAC_CONST(0.026180575715833) }, { FRAC_CONST(0.018788653725892), FRAC_CONST(0.026242201848076) }, { FRAC_CONST(0.018702675868750), FRAC_CONST(0.026303546947421) }, { FRAC_CONST(0.018616497720974), FRAC_CONST(0.026364610356909) }, { FRAC_CONST(0.018530120205464), FRAC_CONST(0.026425391422602) }, { FRAC_CONST(0.018443544247254), FRAC_CONST(0.026485889493583) }, { FRAC_CONST(0.018356770773502), FRAC_CONST(0.026546103921965) }, { FRAC_CONST(0.018269800713483), FRAC_CONST(0.026606034062902) }, { FRAC_CONST(0.018182634998576), FRAC_CONST(0.026665679274589) }, { FRAC_CONST(0.018095274562256), FRAC_CONST(0.026725038918274) }, { FRAC_CONST(0.018007720340083), FRAC_CONST(0.026784112358263) }, { FRAC_CONST(0.017919973269692), FRAC_CONST(0.026842898961926) }, { FRAC_CONST(0.017832034290785), FRAC_CONST(0.026901398099707) }, { FRAC_CONST(0.017743904345116), FRAC_CONST(0.026959609145127) }, { FRAC_CONST(0.017655584376488), FRAC_CONST(0.027017531474792) }, { FRAC_CONST(0.017567075330734), FRAC_CONST(0.027075164468401) }, { FRAC_CONST(0.017478378155718), FRAC_CONST(0.027132507508750) }, { FRAC_CONST(0.017389493801313), FRAC_CONST(0.027189559981742) }, { FRAC_CONST(0.017300423219401), FRAC_CONST(0.027246321276391) }, { FRAC_CONST(0.017211167363854), FRAC_CONST(0.027302790784828) }, { FRAC_CONST(0.017121727190533), FRAC_CONST(0.027358967902310) }, { FRAC_CONST(0.017032103657269), FRAC_CONST(0.027414852027226) }, { FRAC_CONST(0.016942297723858), FRAC_CONST(0.027470442561102) }, { FRAC_CONST(0.016852310352050), FRAC_CONST(0.027525738908608) }, { FRAC_CONST(0.016762142505537), FRAC_CONST(0.027580740477564) }, { FRAC_CONST(0.016671795149944), FRAC_CONST(0.027635446678948) }, { FRAC_CONST(0.016581269252819), FRAC_CONST(0.027689856926900) }, { FRAC_CONST(0.016490565783622), FRAC_CONST(0.027743970638730) }, { FRAC_CONST(0.016399685713714), FRAC_CONST(0.027797787234924) }, { FRAC_CONST(0.016308630016347), FRAC_CONST(0.027851306139149) }, { FRAC_CONST(0.016217399666655), FRAC_CONST(0.027904526778260) }, { FRAC_CONST(0.016125995641641), FRAC_CONST(0.027957448582309) }, { FRAC_CONST(0.016034418920170), FRAC_CONST(0.028010070984544) }, { FRAC_CONST(0.015942670482954), FRAC_CONST(0.028062393421421) }, { FRAC_CONST(0.015850751312545), FRAC_CONST(0.028114415332610) }, { FRAC_CONST(0.015758662393324), FRAC_CONST(0.028166136160998) }, { FRAC_CONST(0.015666404711489), FRAC_CONST(0.028217555352697) }, { FRAC_CONST(0.015573979255046), FRAC_CONST(0.028268672357047) }, { FRAC_CONST(0.015481387013797), FRAC_CONST(0.028319486626627) }, { FRAC_CONST(0.015388628979331), FRAC_CONST(0.028369997617257) }, { FRAC_CONST(0.015295706145012), FRAC_CONST(0.028420204788004) }, { FRAC_CONST(0.015202619505968), FRAC_CONST(0.028470107601191) }, { FRAC_CONST(0.015109370059084), FRAC_CONST(0.028519705522399) }, { FRAC_CONST(0.015015958802984), FRAC_CONST(0.028568998020472) }, { FRAC_CONST(0.014922386738030), FRAC_CONST(0.028617984567529) }, { FRAC_CONST(0.014828654866302), FRAC_CONST(0.028666664638963) }, { FRAC_CONST(0.014734764191593), FRAC_CONST(0.028715037713449) }, { FRAC_CONST(0.014640715719398), FRAC_CONST(0.028763103272951) }, { FRAC_CONST(0.014546510456900), FRAC_CONST(0.028810860802724) }, { FRAC_CONST(0.014452149412962), FRAC_CONST(0.028858309791325) }, { FRAC_CONST(0.014357633598114), FRAC_CONST(0.028905449730613) }, { FRAC_CONST(0.014262964024545), FRAC_CONST(0.028952280115756) }, { FRAC_CONST(0.014168141706090), FRAC_CONST(0.028998800445240) }, { FRAC_CONST(0.014073167658220), FRAC_CONST(0.029045010220868) }, { FRAC_CONST(0.013978042898030), FRAC_CONST(0.029090908947771) }, { FRAC_CONST(0.013882768444231), FRAC_CONST(0.029136496134411) }, { FRAC_CONST(0.013787345317136), FRAC_CONST(0.029181771292585) }, { FRAC_CONST(0.013691774538648), FRAC_CONST(0.029226733937433) }, { FRAC_CONST(0.013596057132255), FRAC_CONST(0.029271383587441) }, { FRAC_CONST(0.013500194123014), FRAC_CONST(0.029315719764447) }, { FRAC_CONST(0.013404186537539), FRAC_CONST(0.029359741993647) }, { FRAC_CONST(0.013308035403995), FRAC_CONST(0.029403449803598) }, { FRAC_CONST(0.013211741752084), FRAC_CONST(0.029446842726223) }, { FRAC_CONST(0.013115306613032), FRAC_CONST(0.029489920296820) }, { FRAC_CONST(0.013018731019584), FRAC_CONST(0.029532682054063) }, { FRAC_CONST(0.012922016005985), FRAC_CONST(0.029575127540008) }, { FRAC_CONST(0.012825162607977), FRAC_CONST(0.029617256300097) }, { FRAC_CONST(0.012728171862781), FRAC_CONST(0.029659067883165) }, { FRAC_CONST(0.012631044809089), FRAC_CONST(0.029700561841444) }, { FRAC_CONST(0.012533782487056), FRAC_CONST(0.029741737730567) }, { FRAC_CONST(0.012436385938281), FRAC_CONST(0.029782595109573) }, { FRAC_CONST(0.012338856205805), FRAC_CONST(0.029823133540913) }, { FRAC_CONST(0.012241194334091), FRAC_CONST(0.029863352590452) }, { FRAC_CONST(0.012143401369021), FRAC_CONST(0.029903251827477) }, { FRAC_CONST(0.012045478357878), FRAC_CONST(0.029942830824699) }, { FRAC_CONST(0.011947426349339), FRAC_CONST(0.029982089158259) }, { FRAC_CONST(0.011849246393462), FRAC_CONST(0.030021026407731) }, { FRAC_CONST(0.011750939541676), FRAC_CONST(0.030059642156129) }, { FRAC_CONST(0.011652506846768), FRAC_CONST(0.030097935989909) }, { FRAC_CONST(0.011553949362874), FRAC_CONST(0.030135907498976) }, { FRAC_CONST(0.011455268145464), FRAC_CONST(0.030173556276684) }, { FRAC_CONST(0.011356464251335), FRAC_CONST(0.030210881919845) }, { FRAC_CONST(0.011257538738598), FRAC_CONST(0.030247884028732) }, { FRAC_CONST(0.011158492666665), FRAC_CONST(0.030284562207083) }, { FRAC_CONST(0.011059327096240), FRAC_CONST(0.030320916062102) }, { FRAC_CONST(0.010960043089307), FRAC_CONST(0.030356945204470) }, { FRAC_CONST(0.010860641709118), FRAC_CONST(0.030392649248343) }, { FRAC_CONST(0.010761124020182), FRAC_CONST(0.030428027811361) }, { FRAC_CONST(0.010661491088253), FRAC_CONST(0.030463080514646) }, { FRAC_CONST(0.010561743980319), FRAC_CONST(0.030497806982812) }, { FRAC_CONST(0.010461883764593), FRAC_CONST(0.030532206843968) }, { FRAC_CONST(0.010361911510496), FRAC_CONST(0.030566279729717) }, { FRAC_CONST(0.010261828288652), FRAC_CONST(0.030600025275167) }, { FRAC_CONST(0.010161635170872), FRAC_CONST(0.030633443118931) }, { FRAC_CONST(0.010061333230142), FRAC_CONST(0.030666532903129) }, { FRAC_CONST(0.009960923540617), FRAC_CONST(0.030699294273397) }, { FRAC_CONST(0.009860407177603), FRAC_CONST(0.030731726878888) }, { FRAC_CONST(0.009759785217550), FRAC_CONST(0.030763830372273) }, { FRAC_CONST(0.009659058738038), FRAC_CONST(0.030795604409750) }, { FRAC_CONST(0.009558228817767), FRAC_CONST(0.030827048651045) }, { FRAC_CONST(0.009457296536545), FRAC_CONST(0.030858162759415) }, { FRAC_CONST(0.009356262975275), FRAC_CONST(0.030888946401653) }, { FRAC_CONST(0.009255129215945), FRAC_CONST(0.030919399248091) }, { FRAC_CONST(0.009153896341616), FRAC_CONST(0.030949520972603) }, { FRAC_CONST(0.009052565436412), FRAC_CONST(0.030979311252611) }, { FRAC_CONST(0.008951137585505), FRAC_CONST(0.031008769769084) }, { FRAC_CONST(0.008849613875105), FRAC_CONST(0.031037896206544) }, { FRAC_CONST(0.008747995392451), FRAC_CONST(0.031066690253072) }, { FRAC_CONST(0.008646283225794), FRAC_CONST(0.031095151600306) }, { FRAC_CONST(0.008544478464390), FRAC_CONST(0.031123279943448) }, { FRAC_CONST(0.008442582198486), FRAC_CONST(0.031151074981266) }, { FRAC_CONST(0.008340595519310), FRAC_CONST(0.031178536416098) }, { FRAC_CONST(0.008238519519057), FRAC_CONST(0.031205663953853) }, { FRAC_CONST(0.008136355290878), FRAC_CONST(0.031232457304017) }, { FRAC_CONST(0.008034103928871), FRAC_CONST(0.031258916179656) }, { FRAC_CONST(0.007931766528065), FRAC_CONST(0.031285040297416) }, { FRAC_CONST(0.007829344184412), FRAC_CONST(0.031310829377528) }, { FRAC_CONST(0.007726837994772), FRAC_CONST(0.031336283143813) }, { FRAC_CONST(0.007624249056906), FRAC_CONST(0.031361401323680) }, { FRAC_CONST(0.007521578469457), FRAC_CONST(0.031386183648135) }, { FRAC_CONST(0.007418827331946), FRAC_CONST(0.031410629851778) }, { FRAC_CONST(0.007315996744755), FRAC_CONST(0.031434739672811) }, { FRAC_CONST(0.007213087809115), FRAC_CONST(0.031458512853036) }, { FRAC_CONST(0.007110101627101), FRAC_CONST(0.031481949137863) }, { FRAC_CONST(0.007007039301610), FRAC_CONST(0.031505048276306) }, { FRAC_CONST(0.006903901936357), FRAC_CONST(0.031527810020993) }, { FRAC_CONST(0.006800690635862), FRAC_CONST(0.031550234128164) }, { FRAC_CONST(0.006697406505433), FRAC_CONST(0.031572320357675) }, { FRAC_CONST(0.006594050651161), FRAC_CONST(0.031594068473000) }, { FRAC_CONST(0.006490624179905), FRAC_CONST(0.031615478241233) }, { FRAC_CONST(0.006387128199278), FRAC_CONST(0.031636549433095) }, { FRAC_CONST(0.006283563817639), FRAC_CONST(0.031657281822929) }, { FRAC_CONST(0.006179932144080), FRAC_CONST(0.031677675188707) }, { FRAC_CONST(0.006076234288412), FRAC_CONST(0.031697729312034) }, { FRAC_CONST(0.005972471361157), FRAC_CONST(0.031717443978146) }, { FRAC_CONST(0.005868644473532), FRAC_CONST(0.031736818975914) }, { FRAC_CONST(0.005764754737440), FRAC_CONST(0.031755854097848) }, { FRAC_CONST(0.005660803265456), FRAC_CONST(0.031774549140098) }, { FRAC_CONST(0.005556791170816), FRAC_CONST(0.031792903902453) }, { FRAC_CONST(0.005452719567407), FRAC_CONST(0.031810918188350) }, { FRAC_CONST(0.005348589569753), FRAC_CONST(0.031828591804869) }, { FRAC_CONST(0.005244402293001), FRAC_CONST(0.031845924562742) }, { FRAC_CONST(0.005140158852914), FRAC_CONST(0.031862916276347) }, { FRAC_CONST(0.005035860365855), FRAC_CONST(0.031879566763717) }, { FRAC_CONST(0.004931507948778), FRAC_CONST(0.031895875846539) }, { FRAC_CONST(0.004827102719212), FRAC_CONST(0.031911843350155) }, { FRAC_CONST(0.004722645795254), FRAC_CONST(0.031927469103567) }, { FRAC_CONST(0.004618138295554), FRAC_CONST(0.031942752939435) }, { FRAC_CONST(0.004513581339303), FRAC_CONST(0.031957694694082) }, { FRAC_CONST(0.004408976046222), FRAC_CONST(0.031972294207493) }, { FRAC_CONST(0.004304323536549), FRAC_CONST(0.031986551323320) }, { FRAC_CONST(0.004199624931030), FRAC_CONST(0.032000465888879) }, { FRAC_CONST(0.004094881350902), FRAC_CONST(0.032014037755158) }, { FRAC_CONST(0.003990093917884), FRAC_CONST(0.032027266776813) }, { FRAC_CONST(0.003885263754166), FRAC_CONST(0.032040152812170) }, { FRAC_CONST(0.003780391982394), FRAC_CONST(0.032052695723232) }, { FRAC_CONST(0.003675479725661), FRAC_CONST(0.032064895375674) }, { FRAC_CONST(0.003570528107494), FRAC_CONST(0.032076751638847) }, { FRAC_CONST(0.003465538251839), FRAC_CONST(0.032088264385780) }, { FRAC_CONST(0.003360511283053), FRAC_CONST(0.032099433493181) }, { FRAC_CONST(0.003255448325892), FRAC_CONST(0.032110258841438) }, { FRAC_CONST(0.003150350505494), FRAC_CONST(0.032120740314619) }, { FRAC_CONST(0.003045218947373), FRAC_CONST(0.032130877800478) }, { FRAC_CONST(0.002940054777404), FRAC_CONST(0.032140671190449) }, { FRAC_CONST(0.002834859121810), FRAC_CONST(0.032150120379653) }, { FRAC_CONST(0.002729633107153), FRAC_CONST(0.032159225266897) }, { FRAC_CONST(0.002624377860318), FRAC_CONST(0.032167985754674) }, { FRAC_CONST(0.002519094508504), FRAC_CONST(0.032176401749168) }, { FRAC_CONST(0.002413784179212), FRAC_CONST(0.032184473160250) }, { FRAC_CONST(0.002308448000231), FRAC_CONST(0.032192199901481) }, { FRAC_CONST(0.002203087099626), FRAC_CONST(0.032199581890114) }, { FRAC_CONST(0.002097702605728), FRAC_CONST(0.032206619047093) }, { FRAC_CONST(0.001992295647121), FRAC_CONST(0.032213311297057) }, { FRAC_CONST(0.001886867352628), FRAC_CONST(0.032219658568338) }, { FRAC_CONST(0.001781418851302), FRAC_CONST(0.032225660792960) }, { FRAC_CONST(0.001675951272410), FRAC_CONST(0.032231317906644) }, { FRAC_CONST(0.001570465745428), FRAC_CONST(0.032236629848809) }, { FRAC_CONST(0.001464963400018), FRAC_CONST(0.032241596562566) }, { FRAC_CONST(0.001359445366028), FRAC_CONST(0.032246217994727) }, { FRAC_CONST(0.001253912773470), FRAC_CONST(0.032250494095799) }, { FRAC_CONST(0.001148366752513), FRAC_CONST(0.032254424819990) }, { FRAC_CONST(0.001042808433471), FRAC_CONST(0.032258010125204) }, { FRAC_CONST(0.000937238946789), FRAC_CONST(0.032261249973045) }, { FRAC_CONST(0.000831659423030), FRAC_CONST(0.032264144328817) }, { FRAC_CONST(0.000726070992868), FRAC_CONST(0.032266693161525) }, { FRAC_CONST(0.000620474787068), FRAC_CONST(0.032268896443871) }, { FRAC_CONST(0.000514871936481), FRAC_CONST(0.032270754152261) }, { FRAC_CONST(0.000409263572030), FRAC_CONST(0.032272266266801) }, { FRAC_CONST(0.000303650824695), FRAC_CONST(0.032273432771295) }, { FRAC_CONST(0.000198034825504), FRAC_CONST(0.032274253653254) }, { FRAC_CONST(0.000092416705518), FRAC_CONST(0.032274728903884) } }; #ifdef LD_DEC /* 240 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_960[] = { { FRAC_CONST(0.045643531183573), FRAC_CONST(0.000037342034959) }, { FRAC_CONST(0.045642309173789), FRAC_CONST(0.000336075315362) }, { FRAC_CONST(0.045639131999390), FRAC_CONST(0.000634794199417) }, { FRAC_CONST(0.045633999796474), FRAC_CONST(0.000933485891002) }, { FRAC_CONST(0.045626912784890), FRAC_CONST(0.001232137595157) }, { FRAC_CONST(0.045617871268219), FRAC_CONST(0.001530736518639) }, { FRAC_CONST(0.045606875633772), FRAC_CONST(0.001829269870464) }, { FRAC_CONST(0.045593926352564), FRAC_CONST(0.002127724862455) }, { FRAC_CONST(0.045579023979299), FRAC_CONST(0.002426088709795) }, { FRAC_CONST(0.045562169152346), FRAC_CONST(0.002724348631569) }, { FRAC_CONST(0.045543362593709), FRAC_CONST(0.003022491851315) }, { FRAC_CONST(0.045522605108999), FRAC_CONST(0.003320505597570) }, { FRAC_CONST(0.045499897587396), FRAC_CONST(0.003618377104416) }, { FRAC_CONST(0.045475241001617), FRAC_CONST(0.003916093612031) }, { FRAC_CONST(0.045448636407866), FRAC_CONST(0.004213642367228) }, { FRAC_CONST(0.045420084945797), FRAC_CONST(0.004511010624011) }, { FRAC_CONST(0.045389587838458), FRAC_CONST(0.004808185644112) }, { FRAC_CONST(0.045357146392244), FRAC_CONST(0.005105154697544) }, { FRAC_CONST(0.045322761996840), FRAC_CONST(0.005401905063139) }, { FRAC_CONST(0.045286436125157), FRAC_CONST(0.005698424029100) }, { FRAC_CONST(0.045248170333275), FRAC_CONST(0.005994698893542) }, { FRAC_CONST(0.045207966260374), FRAC_CONST(0.006290716965035) }, { FRAC_CONST(0.045165825628663), FRAC_CONST(0.006586465563151) }, { FRAC_CONST(0.045121750243305), FRAC_CONST(0.006881932019003) }, { FRAC_CONST(0.045075741992343), FRAC_CONST(0.007177103675792) }, { FRAC_CONST(0.045027802846618), FRAC_CONST(0.007471967889347) }, { FRAC_CONST(0.044977934859683), FRAC_CONST(0.007766512028667) }, { FRAC_CONST(0.044926140167717), FRAC_CONST(0.008060723476460) }, { FRAC_CONST(0.044872420989432), FRAC_CONST(0.008354589629687) }, { FRAC_CONST(0.044816779625979), FRAC_CONST(0.008648097900101) }, { FRAC_CONST(0.044759218460849), FRAC_CONST(0.008941235714784) }, { FRAC_CONST(0.044699739959770), FRAC_CONST(0.009233990516688) }, { FRAC_CONST(0.044638346670603), FRAC_CONST(0.009526349765171) }, { FRAC_CONST(0.044575041223233), FRAC_CONST(0.009818300936537) }, { FRAC_CONST(0.044509826329454), FRAC_CONST(0.010109831524568) }, { FRAC_CONST(0.044442704782856), FRAC_CONST(0.010400929041064) }, { FRAC_CONST(0.044373679458701), FRAC_CONST(0.010691581016378) }, { FRAC_CONST(0.044302753313806), FRAC_CONST(0.010981774999945) }, { FRAC_CONST(0.044229929386409), FRAC_CONST(0.011271498560822) }, { FRAC_CONST(0.044155210796046), FRAC_CONST(0.011560739288214) }, { FRAC_CONST(0.044078600743413), FRAC_CONST(0.011849484792012) }, { FRAC_CONST(0.044000102510229), FRAC_CONST(0.012137722703321) }, { FRAC_CONST(0.043919719459097), FRAC_CONST(0.012425440674986) }, { FRAC_CONST(0.043837455033359), FRAC_CONST(0.012712626382127) }, { FRAC_CONST(0.043753312756950), FRAC_CONST(0.012999267522665) }, { FRAC_CONST(0.043667296234245), FRAC_CONST(0.013285351817848) }, { FRAC_CONST(0.043579409149906), FRAC_CONST(0.013570867012776) }, { FRAC_CONST(0.043489655268722), FRAC_CONST(0.013855800876928) }, { FRAC_CONST(0.043398038435451), FRAC_CONST(0.014140141204686) }, { FRAC_CONST(0.043304562574653), FRAC_CONST(0.014423875815857) }, { FRAC_CONST(0.043209231690524), FRAC_CONST(0.014706992556195) }, { FRAC_CONST(0.043112049866720), FRAC_CONST(0.014989479297920) }, { FRAC_CONST(0.043013021266188), FRAC_CONST(0.015271323940241) }, { FRAC_CONST(0.042912150130984), FRAC_CONST(0.015552514409871) }, { FRAC_CONST(0.042809440782090), FRAC_CONST(0.015833038661547) }, { FRAC_CONST(0.042704897619235), FRAC_CONST(0.016112884678543) }, { FRAC_CONST(0.042598525120698), FRAC_CONST(0.016392040473187) }, { FRAC_CONST(0.042490327843124), FRAC_CONST(0.016670494087374) }, { FRAC_CONST(0.042380310421324), FRAC_CONST(0.016948233593079) }, { FRAC_CONST(0.042268477568078), FRAC_CONST(0.017225247092864) }, { FRAC_CONST(0.042154834073934), FRAC_CONST(0.017501522720393) }, { FRAC_CONST(0.042039384807000), FRAC_CONST(0.017777048640940) }, { FRAC_CONST(0.041922134712739), FRAC_CONST(0.018051813051888) }, { FRAC_CONST(0.041803088813754), FRAC_CONST(0.018325804183247) }, { FRAC_CONST(0.041682252209576), FRAC_CONST(0.018599010298148) }, { FRAC_CONST(0.041559630076443), FRAC_CONST(0.018871419693350) }, { FRAC_CONST(0.041435227667079), FRAC_CONST(0.019143020699741) }, { FRAC_CONST(0.041309050310468), FRAC_CONST(0.019413801682838) }, { FRAC_CONST(0.041181103411629), FRAC_CONST(0.019683751043285) }, { FRAC_CONST(0.041051392451382), FRAC_CONST(0.019952857217350) }, { FRAC_CONST(0.040919922986111), FRAC_CONST(0.020221108677421) }, { FRAC_CONST(0.040786700647532), FRAC_CONST(0.020488493932496) }, { FRAC_CONST(0.040651731142446), FRAC_CONST(0.020755001528683) }, { FRAC_CONST(0.040515020252497), FRAC_CONST(0.021020620049682) }, { FRAC_CONST(0.040376573833925), FRAC_CONST(0.021285338117280) }, { FRAC_CONST(0.040236397817314), FRAC_CONST(0.021549144391836) }, { FRAC_CONST(0.040094498207337), FRAC_CONST(0.021812027572768) }, { FRAC_CONST(0.039950881082502), FRAC_CONST(0.022073976399034) }, { FRAC_CONST(0.039805552594888), FRAC_CONST(0.022334979649620) }, { FRAC_CONST(0.039658518969884), FRAC_CONST(0.022595026144014) }, { FRAC_CONST(0.039509786505922), FRAC_CONST(0.022854104742690) }, { FRAC_CONST(0.039359361574204), FRAC_CONST(0.023112204347583) }, { FRAC_CONST(0.039207250618434), FRAC_CONST(0.023369313902565) }, { FRAC_CONST(0.039053460154540), FRAC_CONST(0.023625422393919) }, { FRAC_CONST(0.038897996770393), FRAC_CONST(0.023880518850809) }, { FRAC_CONST(0.038740867125527), FRAC_CONST(0.024134592345752) }, { FRAC_CONST(0.038582077950852), FRAC_CONST(0.024387631995085) }, { FRAC_CONST(0.038421636048370), FRAC_CONST(0.024639626959432) }, { FRAC_CONST(0.038259548290876), FRAC_CONST(0.024890566444167) }, { FRAC_CONST(0.038095821621671), FRAC_CONST(0.025140439699877) }, { FRAC_CONST(0.037930463054261), FRAC_CONST(0.025389236022825) }, { FRAC_CONST(0.037763479672055), FRAC_CONST(0.025636944755403) }, { FRAC_CONST(0.037594878628068), FRAC_CONST(0.025883555286595) }, { FRAC_CONST(0.037424667144605), FRAC_CONST(0.026129057052425) }, { FRAC_CONST(0.037252852512960), FRAC_CONST(0.026373439536415) }, { FRAC_CONST(0.037079442093102), FRAC_CONST(0.026616692270033) }, { FRAC_CONST(0.036904443313354), FRAC_CONST(0.026858804833142) }, { FRAC_CONST(0.036727863670081), FRAC_CONST(0.027099766854444) }, { FRAC_CONST(0.036549710727369), FRAC_CONST(0.027339568011930) }, { FRAC_CONST(0.036369992116697), FRAC_CONST(0.027578198033315) }, { FRAC_CONST(0.036188715536611), FRAC_CONST(0.027815646696484) }, { FRAC_CONST(0.036005888752396), FRAC_CONST(0.028051903829926) }, { FRAC_CONST(0.035821519595745), FRAC_CONST(0.028286959313171) }, { FRAC_CONST(0.035635615964417), FRAC_CONST(0.028520803077226) }, { FRAC_CONST(0.035448185821906), FRAC_CONST(0.028753425105002) }, { FRAC_CONST(0.035259237197095), FRAC_CONST(0.028984815431745) }, { FRAC_CONST(0.035068778183914), FRAC_CONST(0.029214964145465) }, { FRAC_CONST(0.034876816940994), FRAC_CONST(0.029443861387355) }, { FRAC_CONST(0.034683361691315), FRAC_CONST(0.029671497352220) }, { FRAC_CONST(0.034488420721856), FRAC_CONST(0.029897862288892) }, { FRAC_CONST(0.034292002383240), FRAC_CONST(0.030122946500652) }, { FRAC_CONST(0.034094115089375), FRAC_CONST(0.030346740345641) }, { FRAC_CONST(0.033894767317093), FRAC_CONST(0.030569234237276) }, { FRAC_CONST(0.033693967605790), FRAC_CONST(0.030790418644658) }, { FRAC_CONST(0.033491724557057), FRAC_CONST(0.031010284092984) }, { FRAC_CONST(0.033288046834313), FRAC_CONST(0.031228821163949) }, { FRAC_CONST(0.033082943162434), FRAC_CONST(0.031446020496153) }, { FRAC_CONST(0.032876422327378), FRAC_CONST(0.031661872785500) }, { FRAC_CONST(0.032668493175811), FRAC_CONST(0.031876368785596) }, { FRAC_CONST(0.032459164614726), FRAC_CONST(0.032089499308145) }, { FRAC_CONST(0.032248445611061), FRAC_CONST(0.032301255223347) }, { FRAC_CONST(0.032036345191317), FRAC_CONST(0.032511627460281) }, { FRAC_CONST(0.031822872441171), FRAC_CONST(0.032720607007302) }, { FRAC_CONST(0.031608036505083), FRAC_CONST(0.032928184912422) }, { FRAC_CONST(0.031391846585912), FRAC_CONST(0.033134352283693) }, { FRAC_CONST(0.031174311944513), FRAC_CONST(0.033339100289593) }, { FRAC_CONST(0.030955441899347), FRAC_CONST(0.033542420159397) }, { FRAC_CONST(0.030735245826077), FRAC_CONST(0.033744303183559) }, { FRAC_CONST(0.030513733157171), FRAC_CONST(0.033944740714083) }, { FRAC_CONST(0.030290913381494), FRAC_CONST(0.034143724164891) }, { FRAC_CONST(0.030066796043904), FRAC_CONST(0.034341245012195) }, { FRAC_CONST(0.029841390744841), FRAC_CONST(0.034537294794860) }, { FRAC_CONST(0.029614707139919), FRAC_CONST(0.034731865114764) }, { FRAC_CONST(0.029386754939508), FRAC_CONST(0.034924947637164) }, { FRAC_CONST(0.029157543908322), FRAC_CONST(0.035116534091046) }, { FRAC_CONST(0.028927083864999), FRAC_CONST(0.035306616269485) }, { FRAC_CONST(0.028695384681680), FRAC_CONST(0.035495186029992) }, { FRAC_CONST(0.028462456283587), FRAC_CONST(0.035682235294866) }, { FRAC_CONST(0.028228308648598), FRAC_CONST(0.035867756051541) }, { FRAC_CONST(0.027992951806817), FRAC_CONST(0.036051740352923) }, { FRAC_CONST(0.027756395840148), FRAC_CONST(0.036234180317738) }, { FRAC_CONST(0.027518650881862), FRAC_CONST(0.036415068130865) }, { FRAC_CONST(0.027279727116161), FRAC_CONST(0.036594396043672) }, { FRAC_CONST(0.027039634777745), FRAC_CONST(0.036772156374348) }, { FRAC_CONST(0.026798384151369), FRAC_CONST(0.036948341508233) }, { FRAC_CONST(0.026555985571409), FRAC_CONST(0.037122943898140) }, { FRAC_CONST(0.026312449421412), FRAC_CONST(0.037295956064686) }, { FRAC_CONST(0.026067786133656), FRAC_CONST(0.037467370596605) }, { FRAC_CONST(0.025822006188702), FRAC_CONST(0.037637180151068) }, { FRAC_CONST(0.025575120114946), FRAC_CONST(0.037805377454000) }, { FRAC_CONST(0.025327138488165), FRAC_CONST(0.037971955300388) }, { FRAC_CONST(0.025078071931066), FRAC_CONST(0.038136906554591) }, { FRAC_CONST(0.024827931112832), FRAC_CONST(0.038300224150647) }, { FRAC_CONST(0.024576726748663), FRAC_CONST(0.038461901092573) }, { FRAC_CONST(0.024324469599317), FRAC_CONST(0.038621930454668) }, { FRAC_CONST(0.024071170470652), FRAC_CONST(0.038780305381806) }, { FRAC_CONST(0.023816840213160), FRAC_CONST(0.038937019089732) }, { FRAC_CONST(0.023561489721501), FRAC_CONST(0.039092064865353) }, { FRAC_CONST(0.023305129934041), FRAC_CONST(0.039245436067023) }, { FRAC_CONST(0.023047771832380), FRAC_CONST(0.039397126124832) }, { FRAC_CONST(0.022789426440883), FRAC_CONST(0.039547128540881) }, { FRAC_CONST(0.022530104826206), FRAC_CONST(0.039695436889566) }, { FRAC_CONST(0.022269818096825), FRAC_CONST(0.039842044817851) }, { FRAC_CONST(0.022008577402555), FRAC_CONST(0.039986946045542) }, { FRAC_CONST(0.021746393934081), FRAC_CONST(0.040130134365550) }, { FRAC_CONST(0.021483278922467), FRAC_CONST(0.040271603644166) }, { FRAC_CONST(0.021219243638687), FRAC_CONST(0.040411347821316) }, { FRAC_CONST(0.020954299393132), FRAC_CONST(0.040549360910825) }, { FRAC_CONST(0.020688457535133), FRAC_CONST(0.040685637000671) }, { FRAC_CONST(0.020421729452469), FRAC_CONST(0.040820170253240) }, { FRAC_CONST(0.020154126570884), FRAC_CONST(0.040952954905576) }, { FRAC_CONST(0.019885660353596), FRAC_CONST(0.041083985269625) }, { FRAC_CONST(0.019616342300802), FRAC_CONST(0.041213255732484) }, { FRAC_CONST(0.019346183949192), FRAC_CONST(0.041340760756635) }, { FRAC_CONST(0.019075196871451), FRAC_CONST(0.041466494880189) }, { FRAC_CONST(0.018803392675763), FRAC_CONST(0.041590452717113) }, { FRAC_CONST(0.018530783005316), FRAC_CONST(0.041712628957466) }, { FRAC_CONST(0.018257379537800), FRAC_CONST(0.041833018367625) }, { FRAC_CONST(0.017983193984910), FRAC_CONST(0.041951615790509) }, { FRAC_CONST(0.017708238091842), FRAC_CONST(0.042068416145797) }, { FRAC_CONST(0.017432523636792), FRAC_CONST(0.042183414430153) }, { FRAC_CONST(0.017156062430449), FRAC_CONST(0.042296605717432) }, { FRAC_CONST(0.016878866315491), FRAC_CONST(0.042407985158896) }, { FRAC_CONST(0.016600947166078), FRAC_CONST(0.042517547983420) }, { FRAC_CONST(0.016322316887341), FRAC_CONST(0.042625289497698) }, { FRAC_CONST(0.016042987414872), FRAC_CONST(0.042731205086442) }, { FRAC_CONST(0.015762970714219), FRAC_CONST(0.042835290212581) }, { FRAC_CONST(0.015482278780363), FRAC_CONST(0.042937540417454) }, { FRAC_CONST(0.015200923637213), FRAC_CONST(0.043037951321002) }, { FRAC_CONST(0.014918917337087), FRAC_CONST(0.043136518621958) }, { FRAC_CONST(0.014636271960196), FRAC_CONST(0.043233238098025) }, { FRAC_CONST(0.014352999614128), FRAC_CONST(0.043328105606063) }, { FRAC_CONST(0.014069112433327), FRAC_CONST(0.043421117082265) }, { FRAC_CONST(0.013784622578575), FRAC_CONST(0.043512268542327) }, { FRAC_CONST(0.013499542236471), FRAC_CONST(0.043601556081625) }, { FRAC_CONST(0.013213883618907), FRAC_CONST(0.043688975875378) }, { FRAC_CONST(0.012927658962548), FRAC_CONST(0.043774524178812) }, { FRAC_CONST(0.012640880528305), FRAC_CONST(0.043858197327323) }, { FRAC_CONST(0.012353560600813), FRAC_CONST(0.043939991736633) }, { FRAC_CONST(0.012065711487901), FRAC_CONST(0.044019903902940) }, { FRAC_CONST(0.011777345520066), FRAC_CONST(0.044097930403073) }, { FRAC_CONST(0.011488475049948), FRAC_CONST(0.044174067894638) }, { FRAC_CONST(0.011199112451794), FRAC_CONST(0.044248313116156) }, { FRAC_CONST(0.010909270120937), FRAC_CONST(0.044320662887211) }, { FRAC_CONST(0.010618960473257), FRAC_CONST(0.044391114108577) }, { FRAC_CONST(0.010328195944653), FRAC_CONST(0.044459663762361) }, { FRAC_CONST(0.010036988990509), FRAC_CONST(0.044526308912122) }, { FRAC_CONST(0.009745352085163), FRAC_CONST(0.044591046703005) }, { FRAC_CONST(0.009453297721368), FRAC_CONST(0.044653874361857) }, { FRAC_CONST(0.009160838409762), FRAC_CONST(0.044714789197351) }, { FRAC_CONST(0.008867986678328), FRAC_CONST(0.044773788600099) }, { FRAC_CONST(0.008574755071860), FRAC_CONST(0.044830870042761) }, { FRAC_CONST(0.008281156151424), FRAC_CONST(0.044886031080160) }, { FRAC_CONST(0.007987202493820), FRAC_CONST(0.044939269349379) }, { FRAC_CONST(0.007692906691044), FRAC_CONST(0.044990582569869) }, { FRAC_CONST(0.007398281349750), FRAC_CONST(0.045039968543542) }, { FRAC_CONST(0.007103339090706), FRAC_CONST(0.045087425154868) }, { FRAC_CONST(0.006808092548258), FRAC_CONST(0.045132950370962) }, { FRAC_CONST(0.006512554369783), FRAC_CONST(0.045176542241676) }, { FRAC_CONST(0.006216737215155), FRAC_CONST(0.045218198899680) }, { FRAC_CONST(0.005920653756196), FRAC_CONST(0.045257918560541) }, { FRAC_CONST(0.005624316676135), FRAC_CONST(0.045295699522801) }, { FRAC_CONST(0.005327738669067), FRAC_CONST(0.045331540168049) }, { FRAC_CONST(0.005030932439406), FRAC_CONST(0.045365438960992) }, { FRAC_CONST(0.004733910701344), FRAC_CONST(0.045397394449517) }, { FRAC_CONST(0.004436686178303), FRAC_CONST(0.045427405264758) }, { FRAC_CONST(0.004139271602393), FRAC_CONST(0.045455470121152) }, { FRAC_CONST(0.003841679713863), FRAC_CONST(0.045481587816494) }, { FRAC_CONST(0.003543923260561), FRAC_CONST(0.045505757231988) }, { FRAC_CONST(0.003246014997382), FRAC_CONST(0.045527977332297) }, { FRAC_CONST(0.002947967685724), FRAC_CONST(0.045548247165585) }, { FRAC_CONST(0.002649794092941), FRAC_CONST(0.045566565863562) }, { FRAC_CONST(0.002351506991799), FRAC_CONST(0.045582932641515) }, { FRAC_CONST(0.002053119159924), FRAC_CONST(0.045597346798344) }, { FRAC_CONST(0.001754643379257), FRAC_CONST(0.045609807716597) }, { FRAC_CONST(0.001456092435508), FRAC_CONST(0.045620314862489) }, { FRAC_CONST(0.001157479117605), FRAC_CONST(0.045628867785927) }, { FRAC_CONST(0.000858816217149), FRAC_CONST(0.045635466120535) }, { FRAC_CONST(0.000560116527865), FRAC_CONST(0.045640109583661) }, { FRAC_CONST(0.000261392845053), FRAC_CONST(0.045642797976394) } }; #endif // LD_DEC /* 60 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_240[] = { { FRAC_CONST(0.091286604111815), FRAC_CONST(0.000298735779793) }, { FRAC_CONST(0.091247502481454), FRAC_CONST(0.002688238127538) }, { FRAC_CONST(0.091145864370807), FRAC_CONST(0.005075898091152) }, { FRAC_CONST(0.090981759437558), FRAC_CONST(0.007460079287760) }, { FRAC_CONST(0.090755300151030), FRAC_CONST(0.009839147718664) }, { FRAC_CONST(0.090466641715108), FRAC_CONST(0.012211472889198) }, { FRAC_CONST(0.090115981961863), FRAC_CONST(0.014575428926191) }, { FRAC_CONST(0.089703561215976), FRAC_CONST(0.016929395692256) }, { FRAC_CONST(0.089229662130024), FRAC_CONST(0.019271759896156) }, { FRAC_CONST(0.088694609490769), FRAC_CONST(0.021600916198470) }, { FRAC_CONST(0.088098769996564), FRAC_CONST(0.023915268311810) }, { FRAC_CONST(0.087442552006035), FRAC_CONST(0.026213230094844) }, { FRAC_CONST(0.086726405258214), FRAC_CONST(0.028493226639351) }, { FRAC_CONST(0.085950820564309), FRAC_CONST(0.030753695349588) }, { FRAC_CONST(0.085116329471329), FRAC_CONST(0.032993087013213) }, { FRAC_CONST(0.084223503897785), FRAC_CONST(0.035209866863042) }, { FRAC_CONST(0.083272955741727), FRAC_CONST(0.037402515628894) }, { FRAC_CONST(0.082265336461381), FRAC_CONST(0.039569530578832) }, { FRAC_CONST(0.081201336628670), FRAC_CONST(0.041709426549053) }, { FRAC_CONST(0.080081685455930), FRAC_CONST(0.043820736961749) }, { FRAC_CONST(0.078907150296148), FRAC_CONST(0.045902014830227) }, { FRAC_CONST(0.077678536117054), FRAC_CONST(0.047951833750597) }, { FRAC_CONST(0.076396684949434), FRAC_CONST(0.049968788879362) }, { FRAC_CONST(0.075062475310050), FRAC_CONST(0.051951497896226) }, { FRAC_CONST(0.073676821599542), FRAC_CONST(0.053898601951466) }, { FRAC_CONST(0.072240673475749), FRAC_CONST(0.055808766597225) }, { FRAC_CONST(0.070755015202858), FRAC_CONST(0.057680682702068) }, { FRAC_CONST(0.069220864976840), FRAC_CONST(0.059513067348201) }, { FRAC_CONST(0.067639274227625), FRAC_CONST(0.061304664710718) }, { FRAC_CONST(0.066011326898512), FRAC_CONST(0.063054246918278) }, { FRAC_CONST(0.064338138703282), FRAC_CONST(0.064760614894630) }, { FRAC_CONST(0.062620856361546), FRAC_CONST(0.066422599180399) }, { FRAC_CONST(0.060860656812842), FRAC_CONST(0.068039060734572) }, { FRAC_CONST(0.059058746410016), FRAC_CONST(0.069608891715145) }, { FRAC_CONST(0.057216360092450), FRAC_CONST(0.071131016238378) }, { FRAC_CONST(0.055334760539699), FRAC_CONST(0.072604391116154) }, { FRAC_CONST(0.053415237306106), FRAC_CONST(0.074028006570930) }, { FRAC_CONST(0.051459105937014), FRAC_CONST(0.075400886927784) }, { FRAC_CONST(0.049467707067153), FRAC_CONST(0.076722091283096) }, { FRAC_CONST(0.047442405501835), FRAC_CONST(0.077990714149396) }, { FRAC_CONST(0.045384589281588), FRAC_CONST(0.079205886075941) }, { FRAC_CONST(0.043295668730857), FRAC_CONST(0.080366774244592) }, { FRAC_CONST(0.041177075491445), FRAC_CONST(0.081472583040586) }, { FRAC_CONST(0.039030261541332), FRAC_CONST(0.082522554597810) }, { FRAC_CONST(0.036856698199564), FRAC_CONST(0.083515969318206) }, { FRAC_CONST(0.034657875117883), FRAC_CONST(0.084452146364948) }, { FRAC_CONST(0.032435299259796), FRAC_CONST(0.085330444129049) }, { FRAC_CONST(0.030190493867775), FRAC_CONST(0.086150260669096) }, { FRAC_CONST(0.027924997419306), FRAC_CONST(0.086911034123781) }, { FRAC_CONST(0.025640362572491), FRAC_CONST(0.087612243096981) }, { FRAC_CONST(0.023338155101933), FRAC_CONST(0.088253407015092) }, { FRAC_CONST(0.021019952825636), FRAC_CONST(0.088834086456390) }, { FRAC_CONST(0.018687344523641), FRAC_CONST(0.089353883452193) }, { FRAC_CONST(0.016341928849164), FRAC_CONST(0.089812441759604) }, { FRAC_CONST(0.013985313232951), FRAC_CONST(0.090209447105664) }, { FRAC_CONST(0.011619112781631), FRAC_CONST(0.090544627402740) }, { FRAC_CONST(0.009244949170797), FRAC_CONST(0.090817752935000) }, { FRAC_CONST(0.006864449533597), FRAC_CONST(0.091028636515846) }, { FRAC_CONST(0.004479245345574), FRAC_CONST(0.091177133616206) }, { FRAC_CONST(0.002090971306534), FRAC_CONST(0.091263142463585) } }; #endif // ALLOW_SMALL_FRAMELENGTH #ifdef SSR_DEC /* 128 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_512[] = { { FRAC_CONST(0.062499926465731), FRAC_CONST(0.000095873761643) }, { FRAC_CONST(0.062494043817678), FRAC_CONST(0.000862836783004) }, { FRAC_CONST(0.062478749796497), FRAC_CONST(0.001629669864319) }, { FRAC_CONST(0.062454046705412), FRAC_CONST(0.002396257523347) }, { FRAC_CONST(0.062419938264617), FRAC_CONST(0.003162484314806) }, { FRAC_CONST(0.062376429610718), FRAC_CONST(0.003928234847760) }, { FRAC_CONST(0.062323527295958), FRAC_CONST(0.004693393802995) }, { FRAC_CONST(0.062261239287231), FRAC_CONST(0.005457845950387) }, { FRAC_CONST(0.062189574964882), FRAC_CONST(0.006221476166254) }, { FRAC_CONST(0.062108545121295), FRAC_CONST(0.006984169450695) }, { FRAC_CONST(0.062018161959266), FRAC_CONST(0.007745810944907) }, { FRAC_CONST(0.061918439090167), FRAC_CONST(0.008506285948482) }, { FRAC_CONST(0.061809391531894), FRAC_CONST(0.009265479936681) }, { FRAC_CONST(0.061691035706609), FRAC_CONST(0.010023278577683) }, { FRAC_CONST(0.061563389438265), FRAC_CONST(0.010779567749800) }, { FRAC_CONST(0.061426471949919), FRAC_CONST(0.011534233558664) }, { FRAC_CONST(0.061280303860842), FRAC_CONST(0.012287162354380) }, { FRAC_CONST(0.061124907183410), FRAC_CONST(0.013038240748641) }, { FRAC_CONST(0.060960305319791), FRAC_CONST(0.013787355631805) }, { FRAC_CONST(0.060786523058421), FRAC_CONST(0.014534394189923) }, { FRAC_CONST(0.060603586570268), FRAC_CONST(0.015279243921739) }, { FRAC_CONST(0.060411523404896), FRAC_CONST(0.016021792655621) }, { FRAC_CONST(0.060210362486310), FRAC_CONST(0.016761928566463) }, { FRAC_CONST(0.060000134108604), FRAC_CONST(0.017499540192517) }, { FRAC_CONST(0.059780869931400), FRAC_CONST(0.018234516452187) }, { FRAC_CONST(0.059552602975075), FRAC_CONST(0.018966746660751) }, { FRAC_CONST(0.059315367615794), FRAC_CONST(0.019696120547033) }, { FRAC_CONST(0.059069199580329), FRAC_CONST(0.020422528270008) }, { FRAC_CONST(0.058814135940681), FRAC_CONST(0.021145860435346) }, { FRAC_CONST(0.058550215108495), FRAC_CONST(0.021866008111883) }, { FRAC_CONST(0.058277476829279), FRAC_CONST(0.022582862848028) }, { FRAC_CONST(0.057995962176414), FRAC_CONST(0.023296316688095) }, { FRAC_CONST(0.057705713544970), FRAC_CONST(0.024006262188558) }, { FRAC_CONST(0.057406774645326), FRAC_CONST(0.024712592434239) }, { FRAC_CONST(0.057099190496578), FRAC_CONST(0.025415201054398) }, { FRAC_CONST(0.056783007419769), FRAC_CONST(0.026113982238763) }, { FRAC_CONST(0.056458273030907), FRAC_CONST(0.026808830753458) }, { FRAC_CONST(0.056125036233796), FRAC_CONST(0.027499641956852) }, { FRAC_CONST(0.055783347212673), FRAC_CONST(0.028186311815319) }, { FRAC_CONST(0.055433257424646), FRAC_CONST(0.028868736918904) }, { FRAC_CONST(0.055074819591951), FRAC_CONST(0.029546814496896) }, { FRAC_CONST(0.054708087694007), FRAC_CONST(0.030220442433307) }, { FRAC_CONST(0.054333116959288), FRAC_CONST(0.030889519282247) }, { FRAC_CONST(0.053949963857008), FRAC_CONST(0.031553944283204) }, { FRAC_CONST(0.053558686088614), FRAC_CONST(0.032213617376216) }, { FRAC_CONST(0.053159342579100), FRAC_CONST(0.032868439216943) }, { FRAC_CONST(0.052751993468129), FRAC_CONST(0.033518311191623) }, { FRAC_CONST(0.052336700100979), FRAC_CONST(0.034163135431927) }, { FRAC_CONST(0.051913525019303), FRAC_CONST(0.034802814829698) }, { FRAC_CONST(0.051482531951712), FRAC_CONST(0.035437253051569) }, { FRAC_CONST(0.051043785804177), FRAC_CONST(0.036066354553480) }, { FRAC_CONST(0.050597352650253), FRAC_CONST(0.036690024595057) }, { FRAC_CONST(0.050143299721132), FRAC_CONST(0.037308169253887) }, { FRAC_CONST(0.049681695395515), FRAC_CONST(0.037920695439658) }, { FRAC_CONST(0.049212609189314), FRAC_CONST(0.038527510908178) }, { FRAC_CONST(0.048736111745188), FRAC_CONST(0.039128524275271) }, { FRAC_CONST(0.048252274821899), FRAC_CONST(0.039723645030535) }, { FRAC_CONST(0.047761171283507), FRAC_CONST(0.040312783550971) }, { FRAC_CONST(0.047262875088400), FRAC_CONST(0.040895851114488) }, { FRAC_CONST(0.046757461278150), FRAC_CONST(0.041472759913252) }, { FRAC_CONST(0.046245005966220), FRAC_CONST(0.042043423066923) }, { FRAC_CONST(0.045725586326493), FRAC_CONST(0.042607754635728) }, { FRAC_CONST(0.045199280581658), FRAC_CONST(0.043165669633408) }, { FRAC_CONST(0.044666167991423), FRAC_CONST(0.043717084040018) }, { FRAC_CONST(0.044126328840584), FRAC_CONST(0.044261914814575) }, { FRAC_CONST(0.043579844426930), FRAC_CONST(0.044800079907569) }, { FRAC_CONST(0.043026797049006), FRAC_CONST(0.045331498273316) }, { FRAC_CONST(0.042467269993710), FRAC_CONST(0.045856089882166) }, { FRAC_CONST(0.041901347523761), FRAC_CONST(0.046373775732552) }, { FRAC_CONST(0.041329114865000), FRAC_CONST(0.046884477862888) }, { FRAC_CONST(0.040750658193560), FRAC_CONST(0.047388119363313) }, { FRAC_CONST(0.040166064622889), FRAC_CONST(0.047884624387270) }, { FRAC_CONST(0.039575422190629), FRAC_CONST(0.048373918162926) }, { FRAC_CONST(0.038978819845356), FRAC_CONST(0.048855927004441) }, { FRAC_CONST(0.038376347433190), FRAC_CONST(0.049330578323055) }, { FRAC_CONST(0.037768095684260), FRAC_CONST(0.049797800638026) }, { FRAC_CONST(0.037154156199042), FRAC_CONST(0.050257523587392) }, { FRAC_CONST(0.036534621434563), FRAC_CONST(0.050709677938566) }, { FRAC_CONST(0.035909584690482), FRAC_CONST(0.051154195598769) }, { FRAC_CONST(0.035279140095032), FRAC_CONST(0.051591009625274) }, { FRAC_CONST(0.034643382590851), FRAC_CONST(0.052020054235496) }, { FRAC_CONST(0.034002407920680), FRAC_CONST(0.052441264816895) }, { FRAC_CONST(0.033356312612947), FRAC_CONST(0.052854577936706) }, { FRAC_CONST(0.032705193967229), FRAC_CONST(0.053259931351495) }, { FRAC_CONST(0.032049150039598), FRAC_CONST(0.053657264016528) }, { FRAC_CONST(0.031388279627857), FRAC_CONST(0.054046516094966) }, { FRAC_CONST(0.030722682256659), FRAC_CONST(0.054427628966880) }, { FRAC_CONST(0.030052458162521), FRAC_CONST(0.054800545238072) }, { FRAC_CONST(0.029377708278725), FRAC_CONST(0.055165208748723) }, { FRAC_CONST(0.028698534220122), FRAC_CONST(0.055521564581850) }, { FRAC_CONST(0.028015038267826), FRAC_CONST(0.055869559071575) }, { FRAC_CONST(0.027327323353815), FRAC_CONST(0.056209139811209) }, { FRAC_CONST(0.026635493045425), FRAC_CONST(0.056540255661140) }, { FRAC_CONST(0.025939651529755), FRAC_CONST(0.056862856756541) }, { FRAC_CONST(0.025239903597978), FRAC_CONST(0.057176894514872) }, { FRAC_CONST(0.024536354629559), FRAC_CONST(0.057482321643202) }, { FRAC_CONST(0.023829110576385), FRAC_CONST(0.057779092145329) }, { FRAC_CONST(0.023118277946808), FRAC_CONST(0.058067161328707) }, { FRAC_CONST(0.022403963789609), FRAC_CONST(0.058346485811177) }, { FRAC_CONST(0.021686275677870), FRAC_CONST(0.058617023527499) }, { FRAC_CONST(0.020965321692783), FRAC_CONST(0.058878733735689) }, { FRAC_CONST(0.020241210407366), FRAC_CONST(0.059131577023150) }, { FRAC_CONST(0.019514050870114), FRAC_CONST(0.059375515312615) }, { FRAC_CONST(0.018783952588580), FRAC_CONST(0.059610511867874) }, { FRAC_CONST(0.018051025512878), FRAC_CONST(0.059836531299311) }, { FRAC_CONST(0.017315380019131), FRAC_CONST(0.060053539569230) }, { FRAC_CONST(0.016577126892844), FRAC_CONST(0.060261503996984) }, { FRAC_CONST(0.015836377312223), FRAC_CONST(0.060460393263896) }, { FRAC_CONST(0.015093242831429), FRAC_CONST(0.060650177417972) }, { FRAC_CONST(0.014347835363782), FRAC_CONST(0.060830827878419) }, { FRAC_CONST(0.013600267164905), FRAC_CONST(0.061002317439940) }, { FRAC_CONST(0.012850650815819), FRAC_CONST(0.061164620276839) }, { FRAC_CONST(0.012099099205988), FRAC_CONST(0.061317711946905) }, { FRAC_CONST(0.011345725516320), FRAC_CONST(0.061461569395097) }, { FRAC_CONST(0.010590643202123), FRAC_CONST(0.061596170957011) }, { FRAC_CONST(0.009833965976015), FRAC_CONST(0.061721496362147) }, { FRAC_CONST(0.009075807790803), FRAC_CONST(0.061837526736961) }, { FRAC_CONST(0.008316282822321), FRAC_CONST(0.061944244607705) }, { FRAC_CONST(0.007555505452236), FRAC_CONST(0.062041633903059) }, { FRAC_CONST(0.006793590250821), FRAC_CONST(0.062129679956555) }, { FRAC_CONST(0.006030651959703), FRAC_CONST(0.062208369508780) }, { FRAC_CONST(0.005266805474583), FRAC_CONST(0.062277690709378) }, { FRAC_CONST(0.004502165827931), FRAC_CONST(0.062337633118830) }, { FRAC_CONST(0.003736848171665), FRAC_CONST(0.062388187710030) }, { FRAC_CONST(0.002970967759810), FRAC_CONST(0.062429346869643) }, { FRAC_CONST(0.002204639931138), FRAC_CONST(0.062461104399250) }, { FRAC_CONST(0.001437980091802), FRAC_CONST(0.062483455516285) }, { FRAC_CONST(0.000671103697954), FRAC_CONST(0.062496396854751) } }; /* 16 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_64[] = { { FRAC_CONST(0.176763384336599), FRAC_CONST(0.002169321984356) }, { FRAC_CONST(0.175699589589310), FRAC_CONST(0.019484717553714) }, { FRAC_CONST(0.172943711747111), FRAC_CONST(0.036612464641599) }, { FRAC_CONST(0.168522291420137), FRAC_CONST(0.053387613680577) }, { FRAC_CONST(0.162477909303132), FRAC_CONST(0.069648610815172) }, { FRAC_CONST(0.154868776100077), FRAC_CONST(0.085238853753814) }, { FRAC_CONST(0.145768171923295), FRAC_CONST(0.100008199934509) }, { FRAC_CONST(0.135263740565902), FRAC_CONST(0.113814412479792) }, { FRAC_CONST(0.123456645444178), FRAC_CONST(0.126524530015608) }, { FRAC_CONST(0.110460595338559), FRAC_CONST(0.138016147162030) }, { FRAC_CONST(0.096400749315926), FRAC_CONST(0.148178593363981) }, { FRAC_CONST(0.081412511379371), FRAC_CONST(0.156913998709178) }, { FRAC_CONST(0.065640226453626), FRAC_CONST(0.164138236468888) }, { FRAC_CONST(0.049235790264535), FRAC_CONST(0.169781733284316) }, { FRAC_CONST(0.032357186500177), FRAC_CONST(0.173790139196080) }, { FRAC_CONST(0.015166965341583), FRAC_CONST(0.176124851064031) } }; #endif // SSR_DEC #endif // FIXED_POINT #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/mp4.c000066400000000000000000000230251374350120500151410ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mp4.c,v 1.41 2016/11/11 11:25:58 knik Exp $ **/ #include "common.h" #include "structs.h" #include #include "mp4.h" #include "syntax.h" /* defines if an object type can be decoded by this library or not */ static uint8_t ObjectTypesTable[32] = { 0, /* 0 NULL */ #ifdef MAIN_DEC 1, /* 1 AAC Main */ #else 0, /* 1 AAC Main */ #endif 1, /* 2 AAC LC */ #ifdef SSR_DEC 1, /* 3 AAC SSR */ #else 0, /* 3 AAC SSR */ #endif #ifdef LTP_DEC 1, /* 4 AAC LTP */ #else 0, /* 4 AAC LTP */ #endif #ifdef SBR_DEC 1, /* 5 SBR */ #else 0, /* 5 SBR */ #endif 0, /* 6 AAC Scalable */ 0, /* 7 TwinVQ */ 0, /* 8 CELP */ 0, /* 9 HVXC */ 0, /* 10 Reserved */ 0, /* 11 Reserved */ 0, /* 12 TTSI */ 0, /* 13 Main synthetic */ 0, /* 14 Wavetable synthesis */ 0, /* 15 General MIDI */ 0, /* 16 Algorithmic Synthesis and Audio FX */ /* MPEG-4 Version 2 */ #ifdef ERROR_RESILIENCE 1, /* 17 ER AAC LC */ 0, /* 18 (Reserved) */ #ifdef LTP_DEC 1, /* 19 ER AAC LTP */ #else 0, /* 19 ER AAC LTP */ #endif 0, /* 20 ER AAC scalable */ 0, /* 21 ER TwinVQ */ 0, /* 22 ER BSAC */ #ifdef LD_DEC 1, /* 23 ER AAC LD */ #else 0, /* 23 ER AAC LD */ #endif 0, /* 24 ER CELP */ 0, /* 25 ER HVXC */ 0, /* 26 ER HILN */ 0, /* 27 ER Parametric */ #else /* No ER defined */ 0, /* 17 ER AAC LC */ 0, /* 18 (Reserved) */ 0, /* 19 ER AAC LTP */ 0, /* 20 ER AAC scalable */ 0, /* 21 ER TwinVQ */ 0, /* 22 ER BSAC */ 0, /* 23 ER AAC LD */ 0, /* 24 ER CELP */ 0, /* 25 ER HVXC */ 0, /* 26 ER HILN */ 0, /* 27 ER Parametric */ #endif 0, /* 28 (Reserved) */ #ifdef PS_DEC 1, /* 29 AAC LC + SBR + PS */ #else 0, /* 29 AAC LC + SBR + PS */ #endif 0, /* 30 (Reserved) */ 0 /* 31 (Reserved) */ }; /* Table 1.6.1 */ char NeAACDecAudioSpecificConfig(unsigned char *pBuffer, unsigned long buffer_size, mp4AudioSpecificConfig *mp4ASC) { return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL, 0); } int8_t AudioSpecificConfigFromBitfile(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint32_t buffer_size, uint8_t short_form) { int8_t result = 0; uint32_t startpos = faad_get_processed_bits(ld); #ifdef SBR_DEC int8_t bits_to_decode = 0; #endif if (mp4ASC == NULL) return -8; memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); if(mp4ASC->samplingFrequencyIndex==0x0f) faad_getbits(ld, 24); mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) { return -1; } if (mp4ASC->samplingFrequency == 0) { return -2; } if (mp4ASC->channelsConfiguration > 7) { return -3; } #if (defined(PS_DEC) || defined(DRM_PS)) /* check if we have a mono file */ if (mp4ASC->channelsConfiguration == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ mp4ASC->channelsConfiguration = 2; } #endif #ifdef SBR_DEC mp4ASC->sbr_present_flag = -1; if (mp4ASC->objectTypeIndex == 5 || mp4ASC->objectTypeIndex == 29) { uint8_t tmp; mp4ASC->sbr_present_flag = 1; tmp = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); /* check for downsampled SBR */ if (tmp == mp4ASC->samplingFrequencyIndex) mp4ASC->downSampledSBR = 1; mp4ASC->samplingFrequencyIndex = tmp; if (mp4ASC->samplingFrequencyIndex == 15) { mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); } else { mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); } mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); } #endif /* get GASpecificConfig */ if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) { result = GASpecificConfig(ld, mp4ASC, pce); #ifdef ERROR_RESILIENCE } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ result = GASpecificConfig(ld, mp4ASC, pce); mp4ASC->epConfig = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); if (mp4ASC->epConfig != 0) result = -5; #endif } else { result = -4; } #ifdef SSR_DEC /* shorter frames not allowed for SSR */ if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) return -6; #endif #ifdef SBR_DEC if(short_form) bits_to_decode = 0; else bits_to_decode = (int8_t)(buffer_size*8 - (startpos-faad_get_processed_bits(ld))); if ((mp4ASC->objectTypeIndex != 5 && mp4ASC->objectTypeIndex != 29) && (bits_to_decode >= 16)) { int16_t syncExtensionType = (int16_t)faad_getbits(ld, 11 DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); if (syncExtensionType == 0x2b7) { uint8_t tmp_OTi = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); if (tmp_OTi == 5) { mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(ld DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); if (mp4ASC->sbr_present_flag) { uint8_t tmp; /* Don't set OT to SBR until checked that it is actually there */ mp4ASC->objectTypeIndex = tmp_OTi; tmp = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); /* check for downsampled SBR */ if (tmp == mp4ASC->samplingFrequencyIndex) mp4ASC->downSampledSBR = 1; mp4ASC->samplingFrequencyIndex = tmp; if (mp4ASC->samplingFrequencyIndex == 15) { mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); } else { mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); } } } } } /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ if (mp4ASC->sbr_present_flag == (char)-1) /* cannot be -1 on systems with unsigned char */ { if (mp4ASC->samplingFrequency <= 24000) { mp4ASC->samplingFrequency *= 2; mp4ASC->forceUpSampling = 1; } else /* > 24000*/ { mp4ASC->downSampledSBR = 1; } } #endif faad_endbits(ld); return result; } int8_t AudioSpecificConfig2(uint8_t *pBuffer, uint32_t buffer_size, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint8_t short_form) { uint8_t ret = 0; bitfile ld; faad_initbits(&ld, pBuffer, buffer_size); faad_byte_align(&ld); ret = AudioSpecificConfigFromBitfile(&ld, mp4ASC, pce, buffer_size, short_form); faad_endbits(&ld); return ret; } faad2-2_10_0/libfaad/mp4.h000066400000000000000000000035451374350120500151530ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mp4.h,v 1.28 2009/02/05 00:51:03 menno Exp $ **/ #ifndef __MP4_H__ #define __MP4_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #include "neaacdec.h" int8_t AudioSpecificConfig2(uint8_t *pBuffer, uint32_t buffer_size, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint8_t short_form); int8_t AudioSpecificConfigFromBitfile(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint32_t bsize, uint8_t short_form); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ms.c000066400000000000000000000053321374350120500150610ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ms.c,v 1.21 2007/11/01 12:33:32 menno Exp $ **/ #include "common.h" #include "structs.h" #include "syntax.h" #include "ms.h" #include "is.h" #include "pns.h" void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len) { uint8_t g, b, sfb; uint8_t group = 0; uint16_t nshort = frame_len/8; uint16_t i, k; real_t tmp; if (ics->ms_mask_present >= 1) { for (g = 0; g < ics->num_window_groups; g++) { for (b = 0; b < ics->window_group_length[g]; b++) { for (sfb = 0; sfb < ics->max_sfb; sfb++) { /* If intensity stereo coding or noise substitution is on for a particular scalefactor band, no M/S stereo decoding is carried out. */ if ((ics->ms_used[g][sfb] || ics->ms_mask_present == 2) && !is_intensity(icsr, g, sfb) && !is_noise(ics, g, sfb)) { for (i = ics->swb_offset[sfb]; i < min(ics->swb_offset[sfb+1], ics->swb_offset_max); i++) { k = (group*nshort) + i; tmp = l_spec[k] - r_spec[k]; l_spec[k] = l_spec[k] + r_spec[k]; r_spec[k] = tmp; } } } group++; } } } } faad2-2_10_0/libfaad/ms.h000066400000000000000000000027611374350120500150710ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ms.h,v 1.19 2007/11/01 12:33:32 menno Exp $ **/ #ifndef __MS_H__ #define __MS_H__ #ifdef __cplusplus extern "C" { #endif void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/output.c000066400000000000000000000425671374350120500160150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: output.c,v 1.47 2009/01/26 23:51:15 menno Exp $ **/ #include "common.h" #include "structs.h" #include "output.h" #ifndef FIXED_POINT #define FLOAT_SCALE (1.0f/(1<<15)) #define DM_MUL REAL_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) #define RSQRT2 REAL_CONST(0.7071067811865475244) // 1/sqrt(2) static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, uint8_t down_matrix, uint8_t *internal_channel) { if (!down_matrix) return input[internal_channel[channel]][sample]; if (channel == 0) { return DM_MUL * (input[internal_channel[1]][sample] + input[internal_channel[0]][sample] * RSQRT2 + input[internal_channel[3]][sample] * RSQRT2); } else { return DM_MUL * (input[internal_channel[2]][sample] + input[internal_channel[0]][sample] * RSQRT2 + input[internal_channel[4]][sample] * RSQRT2); } } #ifndef HAS_LRINTF #define CLIP(sample, max, min) \ if (sample >= 0.0f) \ { \ sample += 0.5f; \ if (sample >= max) \ sample = max; \ } else { \ sample += -0.5f; \ if (sample <= min) \ sample = min; \ } #else #define CLIP(sample, max, min) \ if (sample >= 0.0f) \ { \ if (sample >= max) \ sample = max; \ } else { \ if (sample <= min) \ sample = min; \ } #endif #define CONV(a,b) ((a<<1)|(b&0x1)) static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, uint8_t channels, uint16_t frame_len, int16_t **sample_buffer) { uint8_t ch, ch1; uint16_t i; switch (CONV(channels,hDecoder->downMatrix)) { case CONV(1,0): case CONV(1,1): for(i = 0; i < frame_len; i++) { real_t inp = input[hDecoder->internal_channel[0]][i]; CLIP(inp, 32767.0f, -32768.0f); (*sample_buffer)[i] = (int16_t)lrintf(inp); } break; case CONV(2,0): if (hDecoder->upMatrix) { ch = hDecoder->internal_channel[0]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch][i]; CLIP(inp0, 32767.0f, -32768.0f); (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp0); } } else { ch = hDecoder->internal_channel[0]; ch1 = hDecoder->internal_channel[1]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch ][i]; real_t inp1 = input[ch1][i]; CLIP(inp0, 32767.0f, -32768.0f); CLIP(inp1, 32767.0f, -32768.0f); (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp1); } } break; default: for (ch = 0; ch < channels; ch++) { for(i = 0; i < frame_len; i++) { real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); CLIP(inp, 32767.0f, -32768.0f); (*sample_buffer)[(i*channels)+ch] = (int16_t)lrintf(inp); } } break; } } static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, uint8_t channels, uint16_t frame_len, int32_t **sample_buffer) { uint8_t ch, ch1; uint16_t i; switch (CONV(channels,hDecoder->downMatrix)) { case CONV(1,0): case CONV(1,1): for(i = 0; i < frame_len; i++) { real_t inp = input[hDecoder->internal_channel[0]][i]; inp *= 256.0f; CLIP(inp, 8388607.0f, -8388608.0f); (*sample_buffer)[i] = (int32_t)lrintf(inp); } break; case CONV(2,0): if (hDecoder->upMatrix) { ch = hDecoder->internal_channel[0]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch][i]; inp0 *= 256.0f; CLIP(inp0, 8388607.0f, -8388608.0f); (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); } } else { ch = hDecoder->internal_channel[0]; ch1 = hDecoder->internal_channel[1]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch ][i]; real_t inp1 = input[ch1][i]; inp0 *= 256.0f; inp1 *= 256.0f; CLIP(inp0, 8388607.0f, -8388608.0f); CLIP(inp1, 8388607.0f, -8388608.0f); (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); } } break; default: for (ch = 0; ch < channels; ch++) { for(i = 0; i < frame_len; i++) { real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); inp *= 256.0f; CLIP(inp, 8388607.0f, -8388608.0f); (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); } } break; } } static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, uint8_t channels, uint16_t frame_len, int32_t **sample_buffer) { uint8_t ch, ch1; uint16_t i; switch (CONV(channels,hDecoder->downMatrix)) { case CONV(1,0): case CONV(1,1): for(i = 0; i < frame_len; i++) { real_t inp = input[hDecoder->internal_channel[0]][i]; inp *= 65536.0f; CLIP(inp, 2147483647.0f, -2147483648.0f); (*sample_buffer)[i] = (int32_t)lrintf(inp); } break; case CONV(2,0): if (hDecoder->upMatrix) { ch = hDecoder->internal_channel[0]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch][i]; inp0 *= 65536.0f; CLIP(inp0, 2147483647.0f, -2147483648.0f); (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); } } else { ch = hDecoder->internal_channel[0]; ch1 = hDecoder->internal_channel[1]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch ][i]; real_t inp1 = input[ch1][i]; inp0 *= 65536.0f; inp1 *= 65536.0f; CLIP(inp0, 2147483647.0f, -2147483648.0f); CLIP(inp1, 2147483647.0f, -2147483648.0f); (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); } } break; default: for (ch = 0; ch < channels; ch++) { for(i = 0; i < frame_len; i++) { real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); inp *= 65536.0f; CLIP(inp, 2147483647.0f, -2147483648.0f); (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); } } break; } } static void to_PCM_float(NeAACDecStruct *hDecoder, real_t **input, uint8_t channels, uint16_t frame_len, float32_t **sample_buffer) { uint8_t ch, ch1; uint16_t i; switch (CONV(channels,hDecoder->downMatrix)) { case CONV(1,0): case CONV(1,1): for(i = 0; i < frame_len; i++) { real_t inp = input[hDecoder->internal_channel[0]][i]; (*sample_buffer)[i] = inp*FLOAT_SCALE; } break; case CONV(2,0): if (hDecoder->upMatrix) { ch = hDecoder->internal_channel[0]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch][i]; (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; (*sample_buffer)[(i*2)+1] = inp0*FLOAT_SCALE; } } else { ch = hDecoder->internal_channel[0]; ch1 = hDecoder->internal_channel[1]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch ][i]; real_t inp1 = input[ch1][i]; (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; (*sample_buffer)[(i*2)+1] = inp1*FLOAT_SCALE; } } break; default: for (ch = 0; ch < channels; ch++) { for(i = 0; i < frame_len; i++) { real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); (*sample_buffer)[(i*channels)+ch] = inp*FLOAT_SCALE; } } break; } } static void to_PCM_double(NeAACDecStruct *hDecoder, real_t **input, uint8_t channels, uint16_t frame_len, double **sample_buffer) { uint8_t ch, ch1; uint16_t i; switch (CONV(channels,hDecoder->downMatrix)) { case CONV(1,0): case CONV(1,1): for(i = 0; i < frame_len; i++) { real_t inp = input[hDecoder->internal_channel[0]][i]; (*sample_buffer)[i] = (double)inp*FLOAT_SCALE; } break; case CONV(2,0): if (hDecoder->upMatrix) { ch = hDecoder->internal_channel[0]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch][i]; (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; (*sample_buffer)[(i*2)+1] = (double)inp0*FLOAT_SCALE; } } else { ch = hDecoder->internal_channel[0]; ch1 = hDecoder->internal_channel[1]; for(i = 0; i < frame_len; i++) { real_t inp0 = input[ch ][i]; real_t inp1 = input[ch1][i]; (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; (*sample_buffer)[(i*2)+1] = (double)inp1*FLOAT_SCALE; } } break; default: for (ch = 0; ch < channels; ch++) { for(i = 0; i < frame_len; i++) { real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); (*sample_buffer)[(i*channels)+ch] = (double)inp*FLOAT_SCALE; } } break; } } void *output_to_PCM(NeAACDecStruct *hDecoder, real_t **input, void *sample_buffer, uint8_t channels, uint16_t frame_len, uint8_t format) { int16_t *short_sample_buffer = (int16_t*)sample_buffer; int32_t *int_sample_buffer = (int32_t*)sample_buffer; float32_t *float_sample_buffer = (float32_t*)sample_buffer; double *double_sample_buffer = (double*)sample_buffer; #ifdef PROFILE int64_t count = faad_get_ts(); #endif /* Copy output to a standard PCM buffer */ switch (format) { case FAAD_FMT_16BIT: to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); break; case FAAD_FMT_24BIT: to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); break; case FAAD_FMT_32BIT: to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); break; case FAAD_FMT_FLOAT: to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); break; case FAAD_FMT_DOUBLE: to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); break; } #ifdef PROFILE count = faad_get_ts() - count; hDecoder->output_cycles += count; #endif return sample_buffer; } #else #define DM_MUL FRAC_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) #define RSQRT2 FRAC_CONST(0.7071067811865475244) // 1/sqrt(2) static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, uint8_t down_matrix, uint8_t up_matrix, uint8_t *internal_channel) { if (up_matrix == 1) return input[internal_channel[0]][sample]; if (!down_matrix) return input[internal_channel[channel]][sample]; if (channel == 0) { real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); real_t L_S = MUL_F(input[internal_channel[3]][sample], RSQRT2); real_t cum = input[internal_channel[1]][sample] + C + L_S; return MUL_F(cum, DM_MUL); } else { real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); real_t R_S = MUL_F(input[internal_channel[4]][sample], RSQRT2); real_t cum = input[internal_channel[2]][sample] + C + R_S; return MUL_F(cum, DM_MUL); } } void* output_to_PCM(NeAACDecStruct *hDecoder, real_t **input, void *sample_buffer, uint8_t channels, uint16_t frame_len, uint8_t format) { uint8_t ch; uint16_t i; int16_t *short_sample_buffer = (int16_t*)sample_buffer; int32_t *int_sample_buffer = (int32_t*)sample_buffer; /* Copy output to a standard PCM buffer */ for (ch = 0; ch < channels; ch++) { switch (format) { case FAAD_FMT_16BIT: for(i = 0; i < frame_len; i++) { int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, hDecoder->internal_channel); if (tmp >= 0) { tmp += (1 << (REAL_BITS-1)); if (tmp >= REAL_CONST(32767)) { tmp = REAL_CONST(32767); } } else { tmp += -(1 << (REAL_BITS-1)); if (tmp <= REAL_CONST(-32768)) { tmp = REAL_CONST(-32768); } } tmp >>= REAL_BITS; short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; } break; case FAAD_FMT_24BIT: for(i = 0; i < frame_len; i++) { int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, hDecoder->internal_channel); if (tmp >= 0) { tmp += (1 << (REAL_BITS-9)); tmp >>= (REAL_BITS-8); if (tmp >= 8388607) { tmp = 8388607; } } else { tmp += -(1 << (REAL_BITS-9)); tmp >>= (REAL_BITS-8); if (tmp <= -8388608) { tmp = -8388608; } } int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; } break; case FAAD_FMT_32BIT: for(i = 0; i < frame_len; i++) { int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, hDecoder->internal_channel); if (tmp >= 0) { tmp += (1 << (16-REAL_BITS-1)); tmp <<= (16-REAL_BITS); } else { tmp += -(1 << (16-REAL_BITS-1)); tmp <<= (16-REAL_BITS); } int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; } break; case FAAD_FMT_FIXED: for(i = 0; i < frame_len; i++) { real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, hDecoder->internal_channel); int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; } break; } } return sample_buffer; } #endif faad2-2_10_0/libfaad/output.h000066400000000000000000000031661374350120500160120ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: output.h,v 1.26 2009/01/26 23:51:15 menno Exp $ **/ #ifndef __OUTPUT_H__ #define __OUTPUT_H__ #ifdef __cplusplus extern "C" { #endif void* output_to_PCM(NeAACDecStruct *hDecoder, real_t **input, void *samplebuffer, uint8_t channels, uint16_t frame_len, uint8_t format); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/pns.c000066400000000000000000000216011374350120500152370ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pns.c,v 1.39 2010/06/04 20:47:56 menno Exp $ **/ #include "common.h" #include "structs.h" #include "pns.h" /* static function declarations */ static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, uint8_t sub, /* RNG states */ uint32_t *__r1, uint32_t *__r2); #ifdef FIXED_POINT #define DIV(A, B) (((int64_t)A << REAL_BITS)/B) #define step(shift) \ if ((0x40000000l >> shift) + root <= value) \ { \ value -= (0x40000000l >> shift) + root; \ root = (root >> 1) | (0x40000000l >> shift); \ } else { \ root = root >> 1; \ } /* fixed point square root approximation */ /* !!!! ONLY WORKS FOR EVEN %REAL_BITS% !!!! */ real_t fp_sqrt(real_t value) { real_t root = 0; step( 0); step( 2); step( 4); step( 6); step( 8); step(10); step(12); step(14); step(16); step(18); step(20); step(22); step(24); step(26); step(28); step(30); if (root < value) ++root; root <<= (REAL_BITS/2); return root; } static real_t const pow2_table[] = { COEF_CONST(1.0), COEF_CONST(1.18920711500272), COEF_CONST(1.41421356237310), COEF_CONST(1.68179283050743) }; #endif /* The function gen_rand_vector(addr, size) generates a vector of length with signed random values of average energy MEAN_NRG per random value. A suitable random number generator can be realized using one multiplication/accumulation per random value. */ static INLINE void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, uint8_t sub, /* RNG states */ uint32_t *__r1, uint32_t *__r2) { #ifndef FIXED_POINT uint16_t i; real_t energy = 0.0; real_t scale = (real_t)1.0/(real_t)size; for (i = 0; i < size; i++) { real_t tmp = scale*(real_t)(int32_t)ne_rng(__r1, __r2); spec[i] = tmp; energy += tmp*tmp; } scale = (real_t)1.0/(real_t)sqrt(energy); scale *= (real_t)pow(2.0, 0.25 * scale_factor); for (i = 0; i < size; i++) { spec[i] *= scale; } #else uint16_t i; real_t energy = 0, scale; int32_t exp, frac; for (i = 0; i < size; i++) { /* this can be replaced by a 16 bit random generator!!!! */ real_t tmp = (int32_t)ne_rng(__r1, __r2); if (tmp < 0) tmp = -(tmp & ((1<<(REAL_BITS-1))-1)); else tmp = (tmp & ((1<<(REAL_BITS-1))-1)); energy += MUL_R(tmp,tmp); spec[i] = tmp; } energy = fp_sqrt(energy); if (energy > 0) { scale = DIV(REAL_CONST(1),energy); exp = scale_factor >> 2; frac = scale_factor & 3; /* IMDCT pre-scaling */ exp -= sub; if (exp < 0) scale >>= -exp; else scale <<= exp; if (frac) scale = MUL_C(scale, pow2_table[frac]); for (i = 0; i < size; i++) { spec[i] = MUL_R(spec[i], scale); } } #endif } void pns_decode(ic_stream *ics_left, ic_stream *ics_right, real_t *spec_left, real_t *spec_right, uint16_t frame_len, uint8_t channel_pair, uint8_t object_type, /* RNG states */ uint32_t *__r1, uint32_t *__r2) { uint8_t g, sfb, b; uint16_t size, offs; uint8_t group = 0; uint16_t nshort = frame_len >> 3; uint8_t sub = 0; #ifdef FIXED_POINT /* IMDCT scaling */ if (object_type == LD) { sub = 9 /*9*/; } else { if (ics_left->window_sequence == EIGHT_SHORT_SEQUENCE) sub = 7 /*7*/; else sub = 10 /*10*/; } #endif for (g = 0; g < ics_left->num_window_groups; g++) { /* Do perceptual noise substitution decoding */ for (b = 0; b < ics_left->window_group_length[g]; b++) { for (sfb = 0; sfb < ics_left->max_sfb; sfb++) { uint32_t r1_dep = 0, r2_dep = 0; if (is_noise(ics_left, g, sfb)) { #ifdef LTP_DEC /* Simultaneous use of LTP and PNS is not prevented in the syntax. If both LTP, and PNS are enabled on the same scalefactor band, PNS takes precedence, and no prediction is applied to this band. */ ics_left->ltp.long_used[sfb] = 0; ics_left->ltp2.long_used[sfb] = 0; #endif #ifdef MAIN_DEC /* For scalefactor bands coded using PNS the corresponding predictors are switched to "off". */ ics_left->pred.prediction_used[sfb] = 0; #endif offs = ics_left->swb_offset[sfb]; size = min(ics_left->swb_offset[sfb+1], ics_left->swb_offset_max) - offs; r1_dep = *__r1; r2_dep = *__r2; /* Generate random vector */ gen_rand_vector(&spec_left[(group*nshort)+offs], ics_left->scale_factors[g][sfb], size, sub, __r1, __r2); } /* From the spec: If the same scalefactor band and group is coded by perceptual noise substitution in both channels of a channel pair, the correlation of the noise signal can be controlled by means of the ms_used field: While the default noise generation process works independently for each channel (separate generation of random vectors), the same random vector is used for both channels if ms_used[] is set for a particular scalefactor band and group. In this case, no M/S stereo coding is carried out (because M/S stereo coding and noise substitution coding are mutually exclusive). If the same scalefactor band and group is coded by perceptual noise substitution in only one channel of a channel pair the setting of ms_used[] is not evaluated. */ if ((ics_right != NULL) && is_noise(ics_right, g, sfb)) { #ifdef LTP_DEC /* See comment above. */ ics_right->ltp.long_used[sfb] = 0; ics_right->ltp2.long_used[sfb] = 0; #endif #ifdef MAIN_DEC /* See comment above. */ ics_right->pred.prediction_used[sfb] = 0; #endif if (channel_pair && is_noise(ics_left, g, sfb) && (((ics_left->ms_mask_present == 1) && (ics_left->ms_used[g][sfb])) || (ics_left->ms_mask_present == 2))) { /*uint16_t c;*/ offs = ics_right->swb_offset[sfb]; size = min(ics_right->swb_offset[sfb+1], ics_right->swb_offset_max) - offs; /* Generate random vector dependent on left channel*/ gen_rand_vector(&spec_right[(group*nshort)+offs], ics_right->scale_factors[g][sfb], size, sub, &r1_dep, &r2_dep); } else /*if (ics_left->ms_mask_present == 0)*/ { offs = ics_right->swb_offset[sfb]; size = min(ics_right->swb_offset[sfb+1], ics_right->swb_offset_max) - offs; /* Generate random vector */ gen_rand_vector(&spec_right[(group*nshort)+offs], ics_right->scale_factors[g][sfb], size, sub, __r1, __r2); } } } /* sfb */ group++; } /* b */ } /* g */ } faad2-2_10_0/libfaad/pns.h000066400000000000000000000035171374350120500152520ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pns.h,v 1.27 2007/11/01 12:33:33 menno Exp $ **/ #ifndef __PNS_H__ #define __PNS_H__ #ifdef __cplusplus extern "C" { #endif #include "syntax.h" #define NOISE_OFFSET 90 void pns_decode(ic_stream *ics_left, ic_stream *ics_right, real_t *spec_left, real_t *spec_right, uint16_t frame_len, uint8_t channel_pair, uint8_t object_type, /* RNG states */ uint32_t *__r1, uint32_t *__r2); static INLINE uint8_t is_noise(ic_stream *ics, uint8_t group, uint8_t sfb) { if (ics->sfb_cb[group][sfb] == NOISE_HCB) return 1; return 0; } #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ps_dec.c000066400000000000000000002147451374350120500157110ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ps_dec.c,v 1.16 2009/01/26 22:32:31 menno Exp $ **/ #include "common.h" #ifdef PS_DEC #include #include #include "ps_dec.h" #include "ps_tables.h" /* constants */ #define NEGATE_IPD_MASK (0x1000) #define DECAY_SLOPE FRAC_CONST(0.05) #define COEF_SQRT2 COEF_CONST(1.4142135623731) /* tables */ /* filters are mirrored in coef 6, second half left out */ static const real_t p8_13_20[7] = { FRAC_CONST(0.00746082949812), FRAC_CONST(0.02270420949825), FRAC_CONST(0.04546865930473), FRAC_CONST(0.07266113929591), FRAC_CONST(0.09885108575264), FRAC_CONST(0.11793710567217), FRAC_CONST(0.125) }; static const real_t p2_13_20[7] = { FRAC_CONST(0.0), FRAC_CONST(0.01899487526049), FRAC_CONST(0.0), FRAC_CONST(-0.07293139167538), FRAC_CONST(0.0), FRAC_CONST(0.30596630545168), FRAC_CONST(0.5) }; static const real_t p12_13_34[7] = { FRAC_CONST(0.04081179924692), FRAC_CONST(0.03812810994926), FRAC_CONST(0.05144908135699), FRAC_CONST(0.06399831151592), FRAC_CONST(0.07428313801106), FRAC_CONST(0.08100347892914), FRAC_CONST(0.08333333333333) }; static const real_t p8_13_34[7] = { FRAC_CONST(0.01565675600122), FRAC_CONST(0.03752716391991), FRAC_CONST(0.05417891378782), FRAC_CONST(0.08417044116767), FRAC_CONST(0.10307344158036), FRAC_CONST(0.12222452249753), FRAC_CONST(0.125) }; static const real_t p4_13_34[7] = { FRAC_CONST(-0.05908211155639), FRAC_CONST(-0.04871498374946), FRAC_CONST(0.0), FRAC_CONST(0.07778723915851), FRAC_CONST(0.16486303567403), FRAC_CONST(0.23279856662996), FRAC_CONST(0.25) }; #ifdef PARAM_32KHZ static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = { { 1, 2, 3 } /* d_24kHz */, { 3, 4, 5 } /* d_48kHz */ }; #else static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = { 3, 4, 5 /* d_48kHz */ }; #endif static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */ FRAC_CONST(0.65143905753106), FRAC_CONST(0.56471812200776), FRAC_CONST(0.48954165955695) }; static const uint8_t group_border20[10+12 + 1] = { 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */ 9, 8, /* 2 subqmf subbands */ 10, 11, /* 2 subqmf subbands */ 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 }; static const uint8_t group_border34[32+18 + 1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */ 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */ 20, 21, 22, 23, /* 4 subqmf subbands */ 24, 25, 26, 27, /* 4 subqmf subbands */ 28, 29, 30, 31, /* 4 subqmf subbands */ 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27 }; static const uint16_t map_group2bk20[10+12] = { (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; static const uint16_t map_group2bk34[32+18] = { 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), 10, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 9, 14, 11, 12, 13, 14, 15, 16, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 }; /* type definitions */ typedef struct { uint8_t frame_len; uint8_t resolution20[3]; uint8_t resolution34[5]; qmf_t *work; qmf_t **buffer; qmf_t **temp; } hyb_info; /* static function declarations */ static void ps_data_decode(ps_info *ps); static hyb_info *hybrid_init(uint8_t numTimeSlotsRate); static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid); static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid); static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], uint8_t use34, uint8_t numTimeSlotsRate); static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], uint8_t use34, uint8_t numTimeSlotsRate); static int8_t delta_clip(int8_t i, int8_t min, int8_t max); static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, uint8_t dt_flag, uint8_t nr_par, uint8_t stride, int8_t min_index, int8_t max_index); static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, uint8_t dt_flag, uint8_t nr_par, uint8_t stride, int8_t and_modulo); static void map20indexto34(int8_t *index, uint8_t bins); #ifdef PS_LOW_POWER static void map34indexto20(int8_t *index, uint8_t bins); #endif static void ps_data_decode(ps_info *ps); static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); /* */ static hyb_info *hybrid_init(uint8_t numTimeSlotsRate) { uint8_t i; hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info)); hyb->resolution34[0] = 12; hyb->resolution34[1] = 8; hyb->resolution34[2] = 4; hyb->resolution34[3] = 4; hyb->resolution34[4] = 4; hyb->resolution20[0] = 8; hyb->resolution20[1] = 2; hyb->resolution20[2] = 2; hyb->frame_len = numTimeSlotsRate; hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t)); memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t)); hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*)); for (i = 0; i < 5; i++) { hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t)); memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t)); } hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*)); for (i = 0; i < hyb->frame_len; i++) { hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t)); } return hyb; } static void hybrid_free(hyb_info *hyb) { uint8_t i; if (!hyb) return; if (hyb->work) faad_free(hyb->work); for (i = 0; i < 5; i++) { if (hyb->buffer[i]) faad_free(hyb->buffer[i]); } if (hyb->buffer) faad_free(hyb->buffer); for (i = 0; i < hyb->frame_len; i++) { if (hyb->temp[i]) faad_free(hyb->temp[i]); } if (hyb->temp) faad_free(hyb->temp); faad_free(hyb); } /* real filter, size 2 */ static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid) { uint8_t i; for (i = 0; i < frame_len; i++) { real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); /* q = 0 */ QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; /* q = 1 */ QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; } } /* complex filter, size 4 */ static void channel_filter4(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid) { uint8_t i; real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; for (i = 0; i < frame_len; i++) { input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + MUL_F(filter[6], QMF_RE(buffer[i+6])); input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + MUL_F(filter[6], QMF_IM(buffer[i+6])); input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); /* q == 0 */ QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; /* q == 1 */ QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; /* q == 2 */ QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; /* q == 3 */ QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; } } static void INLINE DCT3_4_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); f1 = x[0] - f0; f2 = x[0] + f0; f3 = x[1] + x[3]; f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); f7 = f4 + f5; f8 = f6 - f5; y[3] = f2 - f8; y[0] = f2 + f8; y[2] = f1 - f7; y[1] = f1 + f7; } /* complex filter, size 8 */ static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid) { uint8_t i, n; real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; real_t x[4]; for (i = 0; i < frame_len; i++) { input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); input_re1[2] = -MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))) + MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); input_re1[3] = -MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))) + MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); input_im1[1] = MUL_F(filter[0],(QMF_IM(buffer[12+i]) - QMF_IM(buffer[0+i]))) + MUL_F(filter[4],(QMF_IM(buffer[8+i]) - QMF_IM(buffer[4+i]))); input_im1[2] = MUL_F(filter[1],(QMF_IM(buffer[11+i]) - QMF_IM(buffer[1+i]))) + MUL_F(filter[3],(QMF_IM(buffer[9+i]) - QMF_IM(buffer[3+i]))); input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); for (n = 0; n < 4; n++) { x[n] = input_re1[n] - input_im1[3-n]; } DCT3_4_unscaled(x, x); QMF_RE(X_hybrid[i][7]) = x[0]; QMF_RE(X_hybrid[i][5]) = x[2]; QMF_RE(X_hybrid[i][3]) = x[3]; QMF_RE(X_hybrid[i][1]) = x[1]; for (n = 0; n < 4; n++) { x[n] = input_re1[n] + input_im1[3-n]; } DCT3_4_unscaled(x, x); QMF_RE(X_hybrid[i][6]) = x[1]; QMF_RE(X_hybrid[i][4]) = x[3]; QMF_RE(X_hybrid[i][2]) = x[2]; QMF_RE(X_hybrid[i][0]) = x[0]; input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); input_im2[2] = -MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))) + MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); input_im2[3] = -MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))) + MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); input_re2[1] = MUL_F(filter[0],(QMF_RE(buffer[12+i]) - QMF_RE(buffer[0+i]))) + MUL_F(filter[4],(QMF_RE(buffer[8+i]) - QMF_RE(buffer[4+i]))); input_re2[2] = MUL_F(filter[1],(QMF_RE(buffer[11+i]) - QMF_RE(buffer[1+i]))) + MUL_F(filter[3],(QMF_RE(buffer[9+i]) - QMF_RE(buffer[3+i]))); input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); for (n = 0; n < 4; n++) { x[n] = input_im2[n] + input_re2[3-n]; } DCT3_4_unscaled(x, x); QMF_IM(X_hybrid[i][7]) = x[0]; QMF_IM(X_hybrid[i][5]) = x[2]; QMF_IM(X_hybrid[i][3]) = x[3]; QMF_IM(X_hybrid[i][1]) = x[1]; for (n = 0; n < 4; n++) { x[n] = input_im2[n] - input_re2[3-n]; } DCT3_4_unscaled(x, x); QMF_IM(X_hybrid[i][6]) = x[1]; QMF_IM(X_hybrid[i][4]) = x[3]; QMF_IM(X_hybrid[i][2]) = x[2]; QMF_IM(X_hybrid[i][0]) = x[0]; } } static void INLINE DCT3_6_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7; f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); f1 = x[0] + f0; f2 = x[0] - f0; f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); f5 = f4 - x[4]; f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); f7 = f6 - f3; y[0] = f1 + f6 + f4; y[1] = f2 + f3 - x[4]; y[2] = f7 + f2 - f5; y[3] = f1 - f7 - f5; y[4] = f1 - f3 - x[4]; y[5] = f2 - f6 + f4; } /* complex filter, size 12 */ static void channel_filter12(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid) { uint8_t i, n; real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; for (i = 0; i < frame_len; i++) { for (n = 0; n < 6; n++) { if (n == 0) { input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); } else { input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); } input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); } DCT3_6_unscaled(out_re1, input_re1); DCT3_6_unscaled(out_re2, input_re2); DCT3_6_unscaled(out_im1, input_im1); DCT3_6_unscaled(out_im2, input_im2); for (n = 0; n < 6; n += 2) { QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; } } } /* Hybrid analysis: further split up QMF subbands * to improve frequency resolution */ static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], uint8_t use34, uint8_t numTimeSlotsRate) { uint8_t k, n, band; uint8_t offset = 0; uint8_t qmf_bands = (use34) ? 5 : 3; uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; for (band = 0; band < qmf_bands; band++) { /* build working buffer */ memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t)); /* add new samples */ for (n = 0; n < hyb->frame_len; n++) { QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]); QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]); } /* store samples */ memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t)); switch(resolution[band]) { case 2: /* Type B real filter, Q[p] = 2 */ channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp); break; case 4: /* Type A complex filter, Q[p] = 4 */ channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp); break; case 8: /* Type A complex filter, Q[p] = 8 */ channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20, hyb->work, hyb->temp); break; case 12: /* Type A complex filter, Q[p] = 12 */ channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp); break; } for (n = 0; n < hyb->frame_len; n++) { for (k = 0; k < resolution[band]; k++) { QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]); QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]); } } offset += resolution[band]; } /* group hybrid channels */ if (!use34) { for (n = 0; n < numTimeSlotsRate; n++) { QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]); QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]); QMF_RE(X_hybrid[n][4]) = 0; QMF_IM(X_hybrid[n][4]) = 0; QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]); QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]); QMF_RE(X_hybrid[n][5]) = 0; QMF_IM(X_hybrid[n][5]) = 0; } } } static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], uint8_t use34, uint8_t numTimeSlotsRate) { uint8_t k, n, band; uint8_t offset = 0; uint8_t qmf_bands = (use34) ? 5 : 3; uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; for(band = 0; band < qmf_bands; band++) { for (n = 0; n < hyb->frame_len; n++) { QMF_RE(X[n][band]) = 0; QMF_IM(X[n][band]) = 0; for (k = 0; k < resolution[band]; k++) { QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]); QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]); } } offset += resolution[band]; } } /* limits the value i to the range [min,max] */ static int8_t delta_clip(int8_t i, int8_t min, int8_t max) { if (i < min) return min; else if (i > max) return max; else return i; } //int iid = 0; /* delta decode array */ static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, uint8_t dt_flag, uint8_t nr_par, uint8_t stride, int8_t min_index, int8_t max_index) { int8_t i; if (enable == 1) { if (dt_flag == 0) { /* delta coded in frequency direction */ index[0] = 0 + index[0]; index[0] = delta_clip(index[0], min_index, max_index); for (i = 1; i < nr_par; i++) { index[i] = index[i-1] + index[i]; index[i] = delta_clip(index[i], min_index, max_index); } } else { /* delta coded in time direction */ for (i = 0; i < nr_par; i++) { //int8_t tmp2; //int8_t tmp = index[i]; //printf("%d %d\n", index_prev[i*stride], index[i]); //printf("%d\n", index[i]); index[i] = index_prev[i*stride] + index[i]; //tmp2 = index[i]; index[i] = delta_clip(index[i], min_index, max_index); //if (iid) //{ // if (index[i] == 7) // { // printf("%d %d %d\n", index_prev[i*stride], tmp, tmp2); // } //} } } } else { /* set indices to zero */ for (i = 0; i < nr_par; i++) { index[i] = 0; } } /* coarse */ if (stride == 2) { for (i = (nr_par<<1)-1; i > 0; i--) { index[i] = index[i>>1]; } } } /* delta modulo decode array */ /* in: log2 value of the modulo value to allow using AND instead of MOD */ static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, uint8_t dt_flag, uint8_t nr_par, uint8_t stride, int8_t and_modulo) { int8_t i; if (enable == 1) { if (dt_flag == 0) { /* delta coded in frequency direction */ index[0] = 0 + index[0]; index[0] &= and_modulo; for (i = 1; i < nr_par; i++) { index[i] = index[i-1] + index[i]; index[i] &= and_modulo; } } else { /* delta coded in time direction */ for (i = 0; i < nr_par; i++) { index[i] = index_prev[i*stride] + index[i]; index[i] &= and_modulo; } } } else { /* set indices to zero */ for (i = 0; i < nr_par; i++) { index[i] = 0; } } /* coarse */ if (stride == 2) { index[0] = 0; for (i = (nr_par<<1)-1; i > 0; i--) { index[i] = index[i>>1]; } } } #ifdef PS_LOW_POWER static void map34indexto20(int8_t *index, uint8_t bins) { index[0] = (2*index[0]+index[1])/3; index[1] = (index[1]+2*index[2])/3; index[2] = (2*index[3]+index[4])/3; index[3] = (index[4]+2*index[5])/3; index[4] = (index[6]+index[7])/2; index[5] = (index[8]+index[9])/2; index[6] = index[10]; index[7] = index[11]; index[8] = (index[12]+index[13])/2; index[9] = (index[14]+index[15])/2; index[10] = index[16]; if (bins == 34) { index[11] = index[17]; index[12] = index[18]; index[13] = index[19]; index[14] = (index[20]+index[21])/2; index[15] = (index[22]+index[23])/2; index[16] = (index[24]+index[25])/2; index[17] = (index[26]+index[27])/2; index[18] = (index[28]+index[29]+index[30]+index[31])/4; index[19] = (index[32]+index[33])/2; } } #endif static void map20indexto34(int8_t *index, uint8_t bins) { index[0] = index[0]; index[1] = (index[0] + index[1])/2; index[2] = index[1]; index[3] = index[2]; index[4] = (index[2] + index[3])/2; index[5] = index[3]; index[6] = index[4]; index[7] = index[4]; index[8] = index[5]; index[9] = index[5]; index[10] = index[6]; index[11] = index[7]; index[12] = index[8]; index[13] = index[8]; index[14] = index[9]; index[15] = index[9]; index[16] = index[10]; if (bins == 34) { index[17] = index[11]; index[18] = index[12]; index[19] = index[13]; index[20] = index[14]; index[21] = index[14]; index[22] = index[15]; index[23] = index[15]; index[24] = index[16]; index[25] = index[16]; index[26] = index[17]; index[27] = index[17]; index[28] = index[18]; index[29] = index[18]; index[30] = index[18]; index[31] = index[18]; index[32] = index[19]; index[33] = index[19]; } } /* parse the bitstream data decoded in ps_data() */ static void ps_data_decode(ps_info *ps) { uint8_t env, bin; /* ps data not available, use data from previous frame */ if (ps->ps_data_available == 0) { ps->num_env = 0; } for (env = 0; env < ps->num_env; env++) { int8_t *iid_index_prev; int8_t *icc_index_prev; int8_t *ipd_index_prev; int8_t *opd_index_prev; int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/; if (env == 0) { /* take last envelope from previous frame */ iid_index_prev = ps->iid_index_prev; icc_index_prev = ps->icc_index_prev; ipd_index_prev = ps->ipd_index_prev; opd_index_prev = ps->opd_index_prev; } else { /* take index values from previous envelope */ iid_index_prev = ps->iid_index[env - 1]; icc_index_prev = ps->icc_index[env - 1]; ipd_index_prev = ps->ipd_index[env - 1]; opd_index_prev = ps->opd_index[env - 1]; } // iid = 1; /* delta decode iid parameters */ delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev, ps->iid_dt[env], ps->nr_iid_par, (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1, -num_iid_steps, num_iid_steps); // iid = 0; /* delta decode icc parameters */ delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev, ps->icc_dt[env], ps->nr_icc_par, (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1, 0, 7); /* delta modulo decode ipd parameters */ delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev, ps->ipd_dt[env], ps->nr_ipdopd_par, 1, 7); /* delta modulo decode opd parameters */ delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev, ps->opd_dt[env], ps->nr_ipdopd_par, 1, 7); } /* handle error case */ if (ps->num_env == 0) { /* force to 1 */ ps->num_env = 1; if (ps->enable_iid) { for (bin = 0; bin < 34; bin++) ps->iid_index[0][bin] = ps->iid_index_prev[bin]; } else { for (bin = 0; bin < 34; bin++) ps->iid_index[0][bin] = 0; } if (ps->enable_icc) { for (bin = 0; bin < 34; bin++) ps->icc_index[0][bin] = ps->icc_index_prev[bin]; } else { for (bin = 0; bin < 34; bin++) ps->icc_index[0][bin] = 0; } if (ps->enable_ipdopd) { for (bin = 0; bin < 17; bin++) { ps->ipd_index[0][bin] = ps->ipd_index_prev[bin]; ps->opd_index[0][bin] = ps->opd_index_prev[bin]; } } else { for (bin = 0; bin < 17; bin++) { ps->ipd_index[0][bin] = 0; ps->opd_index[0][bin] = 0; } } } /* update previous indices */ for (bin = 0; bin < 34; bin++) ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin]; for (bin = 0; bin < 34; bin++) ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin]; for (bin = 0; bin < 17; bin++) { ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin]; ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin]; } ps->ps_data_available = 0; if (ps->frame_class == 0) { ps->border_position[0] = 0; for (env = 1; env < ps->num_env; env++) { ps->border_position[env] = (env * ps->numTimeSlotsRate) / ps->num_env; } ps->border_position[ps->num_env] = ps->numTimeSlotsRate; } else { ps->border_position[0] = 0; if (ps->border_position[ps->num_env] < ps->numTimeSlotsRate) { for (bin = 0; bin < 34; bin++) { ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin]; ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin]; } for (bin = 0; bin < 17; bin++) { ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin]; ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin]; } ps->num_env++; ps->border_position[ps->num_env] = ps->numTimeSlotsRate; } for (env = 1; env < ps->num_env; env++) { int8_t thr = ps->numTimeSlotsRate - (ps->num_env - env); if (ps->border_position[env] > thr) { ps->border_position[env] = thr; } else { thr = ps->border_position[env-1]+1; if (ps->border_position[env] < thr) { ps->border_position[env] = thr; } } } } /* make sure that the indices of all parameters can be mapped * to the same hybrid synthesis filterbank */ #ifdef PS_LOW_POWER for (env = 0; env < ps->num_env; env++) { if (ps->iid_mode == 2 || ps->iid_mode == 5) map34indexto20(ps->iid_index[env], 34); if (ps->icc_mode == 2 || ps->icc_mode == 5) map34indexto20(ps->icc_index[env], 34); /* disable ipd/opd */ for (bin = 0; bin < 17; bin++) { ps->aaIpdIndex[env][bin] = 0; ps->aaOpdIndex[env][bin] = 0; } } #else if (ps->use34hybrid_bands) { for (env = 0; env < ps->num_env; env++) { if (ps->iid_mode != 2 && ps->iid_mode != 5) map20indexto34(ps->iid_index[env], 34); if (ps->icc_mode != 2 && ps->icc_mode != 5) map20indexto34(ps->icc_index[env], 34); if (ps->ipd_mode != 2 && ps->ipd_mode != 5) { map20indexto34(ps->ipd_index[env], 17); map20indexto34(ps->opd_index[env], 17); } } } #endif #if 0 for (env = 0; env < ps->num_env; env++) { printf("iid[env:%d]:", env); for (bin = 0; bin < 34; bin++) { printf(" %d", ps->iid_index[env][bin]); } printf("\n"); } for (env = 0; env < ps->num_env; env++) { printf("icc[env:%d]:", env); for (bin = 0; bin < 34; bin++) { printf(" %d", ps->icc_index[env][bin]); } printf("\n"); } for (env = 0; env < ps->num_env; env++) { printf("ipd[env:%d]:", env); for (bin = 0; bin < 17; bin++) { printf(" %d", ps->ipd_index[env][bin]); } printf("\n"); } for (env = 0; env < ps->num_env; env++) { printf("opd[env:%d]:", env); for (bin = 0; bin < 17; bin++) { printf(" %d", ps->opd_index[env][bin]); } printf("\n"); } printf("\n"); #endif } /* decorrelate the mono signal using an allpass filter */ static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) { uint8_t gr, n, m, bk; uint8_t temp_delay; uint8_t sb, maxsb; const complex_t *Phi_Fract_SubQmf; uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; real_t P_SmoothPeakDecayDiffNrg, nrg; real_t P[32][34]; real_t G_TransientRatio[32][34] = {{0}}; complex_t inputLeft; /* chose hybrid filterbank: 20 or 34 band case */ if (ps->use34hybrid_bands) { Phi_Fract_SubQmf = Phi_Fract_SubQmf34; } else{ Phi_Fract_SubQmf = Phi_Fract_SubQmf20; } /* clear the energy values */ for (n = 0; n < 32; n++) { for (bk = 0; bk < 34; bk++) { P[n][bk] = 0; } } /* calculate the energy in each parameter band b(k) */ for (gr = 0; gr < ps->num_groups; gr++) { /* select the parameter index b(k) to which this group belongs */ bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; /* select the upper subband border for this group */ maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; for (sb = ps->group_border[gr]; sb < maxsb; sb++) { for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) { #ifdef FIXED_POINT uint32_t in_re, in_im; #endif /* input from hybrid subbands or QMF subbands */ if (gr < ps->num_hybrid_groups) { RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); } else { RE(inputLeft) = QMF_RE(X_left[n][sb]); IM(inputLeft) = QMF_IM(X_left[n][sb]); } /* accumulate energy */ #ifdef FIXED_POINT /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF * meaning that P will be scaled by 2^(-10) compared to floating point version */ in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); P[n][bk] += in_re*in_re + in_im*in_im; #else P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); #endif } } } #if 0 for (n = 0; n < 32; n++) { for (bk = 0; bk < 34; bk++) { #ifdef FIXED_POINT printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); #else printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); #endif } } #endif /* calculate transient reduction ratio for each parameter band b(k) */ for (bk = 0; bk < ps->nr_par_bands; bk++) { for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) { const real_t gamma = COEF_CONST(1.5); ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); if (ps->P_PeakDecayNrg[bk] < P[n][bk]) ps->P_PeakDecayNrg[bk] = P[n][bk]; /* apply smoothing filter to peak decay energy */ P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; /* apply smoothing filter to energy */ nrg = ps->P_prev[bk]; nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); ps->P_prev[bk] = nrg; /* calculate transient ratio */ if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) { G_TransientRatio[n][bk] = REAL_CONST(1.0); } else { G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); } } } #if 0 for (n = 0; n < 32; n++) { for (bk = 0; bk < 34; bk++) { #ifdef FIXED_POINT printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); #else printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); #endif } } #endif /* apply stereo decorrelation filter to the signal */ for (gr = 0; gr < ps->num_groups; gr++) { if (gr < ps->num_hybrid_groups) maxsb = ps->group_border[gr] + 1; else maxsb = ps->group_border[gr + 1]; /* QMF channel */ for (sb = ps->group_border[gr]; sb < maxsb; sb++) { real_t g_DecaySlope; real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; /* g_DecaySlope: [0..1] */ if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) { g_DecaySlope = FRAC_CONST(1.0); } else { int8_t decay = ps->decay_cutoff - sb; if (decay <= -20 /* -1/DECAY_SLOPE */) { g_DecaySlope = 0; } else { /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; } } /* calculate g_DecaySlope_filt for every m multiplied by filter_a[m] */ for (m = 0; m < NO_ALLPASS_LINKS; m++) { g_DecaySlope_filt[m] = MUL_F(g_DecaySlope, filter_a[m]); } /* set delay indices */ temp_delay = ps->saved_delay; for (n = 0; n < NO_ALLPASS_LINKS; n++) temp_delay_ser[n] = ps->delay_buf_index_ser[n]; for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) { complex_t tmp, tmp0, R0; if (gr < ps->num_hybrid_groups) { /* hybrid filterbank input */ RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); } else { /* QMF filterbank input */ RE(inputLeft) = QMF_RE(X_left[n][sb]); IM(inputLeft) = QMF_IM(X_left[n][sb]); } if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) { /* delay */ /* never hybrid subbands here, always QMF subbands */ RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); RE(R0) = RE(tmp); IM(R0) = IM(tmp); RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); } else { /* allpass filter */ uint8_t m; complex_t Phi_Fract; /* fetch parameters */ if (gr < ps->num_hybrid_groups) { /* select data from the hybrid subbands */ RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); } else { /* select data from the QMF subbands */ RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); } /* z^(-2) * Phi_Fract[k] */ ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); RE(R0) = RE(tmp); IM(R0) = IM(tmp); for (m = 0; m < NO_ALLPASS_LINKS; m++) { complex_t Q_Fract_allpass, tmp2; /* fetch parameters */ if (gr < ps->num_hybrid_groups) { /* select data from the hybrid subbands */ RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); if (ps->use34hybrid_bands) { RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); } else { RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); } } else { /* select data from the QMF subbands */ RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); } /* delay by a fraction */ /* z^(-d(m)) * Q_Fract_allpass[k,m] */ ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); /* -a(m) * g_DecaySlope[k] */ RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); /* store sample */ if (gr < ps->num_hybrid_groups) { RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); } else { RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); } /* store for next iteration (or as output value if last iteration) */ RE(R0) = RE(tmp); IM(R0) = IM(tmp); } } /* select b(k) for reading the transient ratio */ bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; /* duck if a past transient is found */ RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); if (gr < ps->num_hybrid_groups) { /* hybrid */ QMF_RE(X_hybrid_right[n][sb]) = RE(R0); QMF_IM(X_hybrid_right[n][sb]) = IM(R0); } else { /* QMF */ QMF_RE(X_right[n][sb]) = RE(R0); QMF_IM(X_right[n][sb]) = IM(R0); } /* Update delay buffer index */ if (++temp_delay >= 2) { temp_delay = 0; } /* update delay indices */ if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) { /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) { ps->delay_buf_index_delay[sb] = 0; } } for (m = 0; m < NO_ALLPASS_LINKS; m++) { if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) { temp_delay_ser[m] = 0; } } } } } /* update delay indices */ ps->saved_delay = temp_delay; for (m = 0; m < NO_ALLPASS_LINKS; m++) ps->delay_buf_index_ser[m] = temp_delay_ser[m]; } #ifdef FIXED_POINT #define step(shift) \ if ((0x40000000l >> shift) + root <= value) \ { \ value -= (0x40000000l >> shift) + root; \ root = (root >> 1) | (0x40000000l >> shift); \ } else { \ root = root >> 1; \ } /* fixed point square root approximation */ static real_t ps_sqrt(real_t value) { real_t root = 0; step( 0); step( 2); step( 4); step( 6); step( 8); step(10); step(12); step(14); step(16); step(18); step(20); step(22); step(24); step(26); step(28); step(30); if (root < value) ++root; root <<= (REAL_BITS/2); return root; } #else #define ps_sqrt(A) sqrt(A) #endif static const real_t ipdopd_cos_tab[] = { FRAC_CONST(1.000000000000000), FRAC_CONST(0.707106781186548), FRAC_CONST(0.000000000000000), FRAC_CONST(-0.707106781186547), FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.707106781186548), FRAC_CONST(-0.000000000000000), FRAC_CONST(0.707106781186547), FRAC_CONST(1.000000000000000) }; static const real_t ipdopd_sin_tab[] = { FRAC_CONST(0.000000000000000), FRAC_CONST(0.707106781186547), FRAC_CONST(1.000000000000000), FRAC_CONST(0.707106781186548), FRAC_CONST(0.000000000000000), FRAC_CONST(-0.707106781186547), FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.707106781186548), FRAC_CONST(-0.000000000000000) }; static real_t magnitude_c(complex_t c) { #ifdef FIXED_POINT #define ps_abs(A) (((A) > 0) ? (A) : (-(A))) #define ALPHA FRAC_CONST(0.948059448969) #define BETA FRAC_CONST(0.392699081699) real_t abs_inphase = ps_abs(RE(c)); real_t abs_quadrature = ps_abs(IM(c)); if (abs_inphase > abs_quadrature) { return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA); } else { return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA); } #else return sqrt(RE(c)*RE(c) + IM(c)*IM(c)); #endif } static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) { uint8_t n; uint8_t gr; uint8_t bk = 0; uint8_t sb, maxsb; uint8_t env; uint8_t nr_ipdopd_par; complex_t h11, h12, h21, h22; complex_t H11, H12, H21, H22; complex_t deltaH11, deltaH12, deltaH21, deltaH22; complex_t tempLeft; complex_t tempRight; complex_t phaseLeft; complex_t phaseRight; real_t L; const real_t *sf_iid; uint8_t no_iid_steps; if (ps->iid_mode >= 3) { no_iid_steps = 15; sf_iid = sf_iid_fine; } else { no_iid_steps = 7; sf_iid = sf_iid_normal; } if (ps->ipd_mode == 0 || ps->ipd_mode == 3) { nr_ipdopd_par = 11; /* resolution */ } else { nr_ipdopd_par = ps->nr_ipdopd_par; } for (gr = 0; gr < ps->num_groups; gr++) { bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; /* use one channel per group in the subqmf domain */ maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; for (env = 0; env < ps->num_env; env++) { if (ps->icc_mode < 3) { /* type 'A' mixing as described in 8.6.4.6.2.1 */ real_t c_1, c_2; real_t cosa, sina; real_t cosb, sinb; real_t ab1, ab2; real_t ab3, ab4; /* c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); alpha = 0.5 * acos(quant_rho[icc_index]); beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); */ //printf("%d\n", ps->iid_index[env][bk]); /* index range is supposed to be -7...7 or -15...15 depending on iid_mode (Table 8.24, ISO/IEC 14496-3:2005). if it is outside these boundaries, this is most likely an error. sanitize it and try to process further. */ if (ps->iid_index[env][bk] < -no_iid_steps) { fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk], -no_iid_steps); ps->iid_index[env][bk] = -no_iid_steps; } else if (ps->iid_index[env][bk] > no_iid_steps) { fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk], no_iid_steps); ps->iid_index[env][bk] = no_iid_steps; } /* calculate the scalefactors c_1 and c_2 from the intensity differences */ c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; /* calculate alpha and beta using the ICC parameters */ cosa = cos_alphas[ps->icc_index[env][bk]]; sina = sin_alphas[ps->icc_index[env][bk]]; if (ps->iid_mode >= 3) { if (ps->iid_index[env][bk] < 0) { cosb = cos_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; sinb = -sin_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; } else { cosb = cos_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; sinb = sin_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; } } else { if (ps->iid_index[env][bk] < 0) { cosb = cos_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; sinb = -sin_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; } else { cosb = cos_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; sinb = sin_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; } } ab1 = MUL_C(cosb, cosa); ab2 = MUL_C(sinb, sina); ab3 = MUL_C(sinb, cosa); ab4 = MUL_C(cosb, sina); /* h_xy: COEF */ RE(h11) = MUL_C(c_2, (ab1 - ab2)); RE(h12) = MUL_C(c_1, (ab1 + ab2)); RE(h21) = MUL_C(c_2, (ab3 + ab4)); RE(h22) = MUL_C(c_1, (ab3 - ab4)); } else { /* type 'B' mixing as described in 8.6.4.6.2.2 */ real_t sina, cosa; real_t cosg, sing; /* real_t c, rho, mu, alpha, gamma; uint8_t i; i = ps->iid_index[env][bk]; c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); rho = quant_rho[ps->icc_index[env][bk]]; if (rho == 0.0f && c == 1.) { alpha = (real_t)M_PI/4.0f; rho = 0.05f; } else { if (rho <= 0.05f) { rho = 0.05f; } alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); if (alpha < 0.) { alpha += (real_t)M_PI/2.0f; } if (rho < 0.) { alpha += (real_t)M_PI; } } mu = c+1.0f/c; mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); */ if (ps->iid_mode >= 3) { uint8_t abs_iid = abs(ps->iid_index[env][bk]); cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; } else { uint8_t abs_iid = abs(ps->iid_index[env][bk]); cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; } RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); } /* calculate phase rotation parameters H_xy */ /* note that the imaginary part of these parameters are only calculated when IPD and OPD are enabled */ if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) { int8_t i; real_t xy, pq, xypq; /* ringbuffer index */ i = ps->phase_hist; /* previous value */ #ifdef FIXED_POINT /* divide by 4, shift right 2 bits */ RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 2; IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 2; RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 2; IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 2; #else RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); #endif /* save current value */ RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; /* add current value */ RE(tempLeft) += RE(ps->ipd_prev[bk][i]); IM(tempLeft) += IM(ps->ipd_prev[bk][i]); RE(tempRight) += RE(ps->opd_prev[bk][i]); IM(tempRight) += IM(ps->opd_prev[bk][i]); /* ringbuffer index */ if (i == 0) { i = 2; } i--; /* get value before previous */ #ifdef FIXED_POINT /* dividing by 2, shift right 1 bit */ RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 1); IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 1); RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 1); IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 1); #else RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); #endif #if 0 /* original code */ ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); opd = (float)atan2(IM(tempRight), RE(tempRight)); /* phase rotation */ RE(phaseLeft) = (float)cos(opd); IM(phaseLeft) = (float)sin(opd); opd -= ipd; RE(phaseRight) = (float)cos(opd); IM(phaseRight) = (float)sin(opd); #else // x = IM(tempLeft) // y = RE(tempLeft) // p = IM(tempRight) // q = RE(tempRight) // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y)) // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y)) // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); xy = magnitude_c(tempRight); pq = magnitude_c(tempLeft); if (xy != 0) { RE(phaseLeft) = DIV_R(RE(tempRight), xy); IM(phaseLeft) = DIV_R(IM(tempRight), xy); } else { RE(phaseLeft) = 0; IM(phaseLeft) = 0; } xypq = MUL_R(xy, pq); if (xypq != 0) { real_t tmp1 = MUL_R(RE(tempRight), RE(tempLeft)) + MUL_R(IM(tempRight), IM(tempLeft)); real_t tmp2 = MUL_R(IM(tempRight), RE(tempLeft)) - MUL_R(RE(tempRight), IM(tempLeft)); RE(phaseRight) = DIV_R(tmp1, xypq); IM(phaseRight) = DIV_R(tmp2, xypq); } else { RE(phaseRight) = 0; IM(phaseRight) = 0; } #endif /* MUL_F(COEF, REAL) = COEF */ IM(h11) = MUL_R(RE(h11), IM(phaseLeft)); IM(h12) = MUL_R(RE(h12), IM(phaseRight)); IM(h21) = MUL_R(RE(h21), IM(phaseLeft)); IM(h22) = MUL_R(RE(h22), IM(phaseRight)); RE(h11) = MUL_R(RE(h11), RE(phaseLeft)); RE(h12) = MUL_R(RE(h12), RE(phaseRight)); RE(h21) = MUL_R(RE(h21), RE(phaseLeft)); RE(h22) = MUL_R(RE(h22), RE(phaseRight)); } /* length of the envelope n_e+1 - n_e (in time samples) */ /* 0 < L <= 32: integer */ L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); /* obtain final H_xy by means of linear interpolation */ RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; RE(H11) = RE(ps->h11_prev[gr]); RE(H12) = RE(ps->h12_prev[gr]); RE(H21) = RE(ps->h21_prev[gr]); RE(H22) = RE(ps->h22_prev[gr]); RE(ps->h11_prev[gr]) = RE(h11); RE(ps->h12_prev[gr]) = RE(h12); RE(ps->h21_prev[gr]) = RE(h21); RE(ps->h22_prev[gr]) = RE(h22); /* only calculate imaginary part when needed */ if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) { /* obtain final H_xy by means of linear interpolation */ IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; IM(H11) = IM(ps->h11_prev[gr]); IM(H12) = IM(ps->h12_prev[gr]); IM(H21) = IM(ps->h21_prev[gr]); IM(H22) = IM(ps->h22_prev[gr]); if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) { IM(deltaH11) = -IM(deltaH11); IM(deltaH12) = -IM(deltaH12); IM(deltaH21) = -IM(deltaH21); IM(deltaH22) = -IM(deltaH22); IM(H11) = -IM(H11); IM(H12) = -IM(H12); IM(H21) = -IM(H21); IM(H22) = -IM(H22); } IM(ps->h11_prev[gr]) = IM(h11); IM(ps->h12_prev[gr]) = IM(h12); IM(ps->h21_prev[gr]) = IM(h21); IM(ps->h22_prev[gr]) = IM(h22); } /* apply H_xy to the current envelope band of the decorrelated subband */ for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) { /* addition finalises the interpolation over every n */ RE(H11) += RE(deltaH11); RE(H12) += RE(deltaH12); RE(H21) += RE(deltaH21); RE(H22) += RE(deltaH22); if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) { IM(H11) += IM(deltaH11); IM(H12) += IM(deltaH12); IM(H21) += IM(deltaH21); IM(H22) += IM(deltaH22); } /* channel is an alias to the subband */ for (sb = ps->group_border[gr]; sb < maxsb; sb++) { complex_t inLeft, inRight; /* load decorrelated samples */ if (gr < ps->num_hybrid_groups) { RE(inLeft) = RE(X_hybrid_left[n][sb]); IM(inLeft) = IM(X_hybrid_left[n][sb]); RE(inRight) = RE(X_hybrid_right[n][sb]); IM(inRight) = IM(X_hybrid_right[n][sb]); } else { RE(inLeft) = RE(X_left[n][sb]); IM(inLeft) = IM(X_left[n][sb]); RE(inRight) = RE(X_right[n][sb]); IM(inRight) = IM(X_right[n][sb]); } /* apply mixing */ RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); /* only perform imaginary operations when needed */ if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) { /* apply rotation */ RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); } /* store final samples */ if (gr < ps->num_hybrid_groups) { RE(X_hybrid_left[n][sb]) = RE(tempLeft); IM(X_hybrid_left[n][sb]) = IM(tempLeft); RE(X_hybrid_right[n][sb]) = RE(tempRight); IM(X_hybrid_right[n][sb]) = IM(tempRight); } else { RE(X_left[n][sb]) = RE(tempLeft); IM(X_left[n][sb]) = IM(tempLeft); RE(X_right[n][sb]) = RE(tempRight); IM(X_right[n][sb]) = IM(tempRight); } } } /* shift phase smoother's circular buffer index */ ps->phase_hist++; if (ps->phase_hist == 2) { ps->phase_hist = 0; } } } } void ps_free(ps_info *ps) { /* free hybrid filterbank structures */ hybrid_free(ps->hyb); faad_free(ps); } ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate) { uint8_t i; uint8_t short_delay_band; ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); memset(ps, 0, sizeof(ps_info)); ps->hyb = hybrid_init(numTimeSlotsRate); ps->numTimeSlotsRate = numTimeSlotsRate; ps->ps_data_available = 0; /* delay stuff*/ ps->saved_delay = 0; for (i = 0; i < 64; i++) { ps->delay_buf_index_delay[i] = 0; } for (i = 0; i < NO_ALLPASS_LINKS; i++) { ps->delay_buf_index_ser[i] = 0; #ifdef PARAM_32KHZ if (sr_index <= 5) /* >= 32 kHz*/ { ps->num_sample_delay_ser[i] = delay_length_d[1][i]; } else { ps->num_sample_delay_ser[i] = delay_length_d[0][i]; } #else /* THESE ARE CONSTANTS NOW */ ps->num_sample_delay_ser[i] = delay_length_d[i]; #endif } #ifdef PARAM_32KHZ if (sr_index <= 5) /* >= 32 kHz*/ { short_delay_band = 35; ps->nr_allpass_bands = 22; ps->alpha_decay = FRAC_CONST(0.76592833836465); ps->alpha_smooth = FRAC_CONST(0.25); } else { short_delay_band = 64; ps->nr_allpass_bands = 45; ps->alpha_decay = FRAC_CONST(0.58664621951003); ps->alpha_smooth = FRAC_CONST(0.6); } #else /* THESE ARE CONSTANTS NOW */ short_delay_band = 35; ps->nr_allpass_bands = 22; ps->alpha_decay = FRAC_CONST(0.76592833836465); ps->alpha_smooth = FRAC_CONST(0.25); #endif /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ for (i = 0; i < short_delay_band; i++) { ps->delay_D[i] = 14; } for (i = short_delay_band; i < 64; i++) { ps->delay_D[i] = 1; } /* mixing and phase */ for (i = 0; i < 50; i++) { RE(ps->h11_prev[i]) = 1; IM(ps->h12_prev[i]) = 1; RE(ps->h11_prev[i]) = 1; IM(ps->h12_prev[i]) = 1; } ps->phase_hist = 0; for (i = 0; i < 20; i++) { RE(ps->ipd_prev[i][0]) = 0; IM(ps->ipd_prev[i][0]) = 0; RE(ps->ipd_prev[i][1]) = 0; IM(ps->ipd_prev[i][1]) = 0; RE(ps->opd_prev[i][0]) = 0; IM(ps->opd_prev[i][0]) = 0; RE(ps->opd_prev[i][1]) = 0; IM(ps->opd_prev[i][1]) = 0; } return ps; } /* main Parametric Stereo decoding function */ uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { qmf_t X_hybrid_left[32][32] = {{0}}; qmf_t X_hybrid_right[32][32] = {{0}}; /* delta decoding of the bitstream data */ ps_data_decode(ps); /* set up some parameters depending on filterbank type */ if (ps->use34hybrid_bands) { ps->group_border = (uint8_t*)group_border34; ps->map_group2bk = (uint16_t*)map_group2bk34; ps->num_groups = 32+18; ps->num_hybrid_groups = 32; ps->nr_par_bands = 34; ps->decay_cutoff = 5; } else { ps->group_border = (uint8_t*)group_border20; ps->map_group2bk = (uint16_t*)map_group2bk20; ps->num_groups = 10+12; ps->num_hybrid_groups = 10; ps->nr_par_bands = 20; ps->decay_cutoff = 3; } /* Perform further analysis on the lowest subbands to get a higher * frequency resolution */ hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left, ps->use34hybrid_bands, ps->numTimeSlotsRate); /* decorrelate mono signal */ ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); /* apply mixing and phase parameters */ ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); /* hybrid synthesis, to rebuild the SBR QMF matrices */ hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left, ps->use34hybrid_bands, ps->numTimeSlotsRate); hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right, ps->use34hybrid_bands, ps->numTimeSlotsRate); return 0; } #endif faad2-2_10_0/libfaad/ps_dec.h000066400000000000000000000101721374350120500157020ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ps_dec.h,v 1.13 2009/01/26 22:32:31 menno Exp $ **/ #ifndef __PS_DEC_H__ #define __PS_DEC_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #define EXTENSION_ID_PS 2 #define MAX_PS_ENVELOPES 5 #define NO_ALLPASS_LINKS 3 typedef struct { /* bitstream parameters */ uint8_t enable_iid; uint8_t enable_icc; uint8_t enable_ext; uint8_t iid_mode; uint8_t icc_mode; uint8_t nr_iid_par; uint8_t nr_ipdopd_par; uint8_t nr_icc_par; uint8_t frame_class; uint8_t num_env; uint8_t border_position[MAX_PS_ENVELOPES+1]; uint8_t iid_dt[MAX_PS_ENVELOPES]; uint8_t icc_dt[MAX_PS_ENVELOPES]; uint8_t enable_ipdopd; uint8_t ipd_mode; uint8_t ipd_dt[MAX_PS_ENVELOPES]; uint8_t opd_dt[MAX_PS_ENVELOPES]; /* indices */ int8_t iid_index_prev[34]; int8_t icc_index_prev[34]; int8_t ipd_index_prev[17]; int8_t opd_index_prev[17]; int8_t iid_index[MAX_PS_ENVELOPES][34]; int8_t icc_index[MAX_PS_ENVELOPES][34]; int8_t ipd_index[MAX_PS_ENVELOPES][17]; int8_t opd_index[MAX_PS_ENVELOPES][17]; int8_t ipd_index_1[17]; int8_t opd_index_1[17]; int8_t ipd_index_2[17]; int8_t opd_index_2[17]; /* ps data was correctly read */ uint8_t ps_data_available; /* a header has been read */ uint8_t header_read; /* hybrid filterbank parameters */ void *hyb; uint8_t use34hybrid_bands; uint8_t numTimeSlotsRate; /**/ uint8_t num_groups; uint8_t num_hybrid_groups; uint8_t nr_par_bands; uint8_t nr_allpass_bands; uint8_t decay_cutoff; uint8_t *group_border; uint16_t *map_group2bk; /* filter delay handling */ uint8_t saved_delay; uint8_t delay_buf_index_ser[NO_ALLPASS_LINKS]; uint8_t num_sample_delay_ser[NO_ALLPASS_LINKS]; uint8_t delay_D[64]; uint8_t delay_buf_index_delay[64]; complex_t delay_Qmf[14][64]; /* 14 samples delay max, 64 QMF channels */ complex_t delay_SubQmf[2][32]; /* 2 samples delay max (SubQmf is always allpass filtered) */ complex_t delay_Qmf_ser[NO_ALLPASS_LINKS][5][64]; /* 5 samples delay max (table 8.34), 64 QMF channels */ complex_t delay_SubQmf_ser[NO_ALLPASS_LINKS][5][32]; /* 5 samples delay max (table 8.34) */ /* transients */ real_t alpha_decay; real_t alpha_smooth; real_t P_PeakDecayNrg[34]; real_t P_prev[34]; real_t P_SmoothPeakDecayDiffNrg_prev[34]; /* mixing and phase */ complex_t h11_prev[50]; complex_t h12_prev[50]; complex_t h21_prev[50]; complex_t h22_prev[50]; uint8_t phase_hist; complex_t ipd_prev[20][2]; complex_t opd_prev[20][2]; } ps_info; /* ps_syntax.c */ uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header); /* ps_dec.c */ ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate); void ps_free(ps_info *ps); uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ps_syntax.c000066400000000000000000000606711374350120500165010ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ps_syntax.c,v 1.11 2007/11/01 12:33:33 menno Exp $ **/ #include "common.h" #ifdef PS_DEC #include "bits.h" #include "ps_dec.h" /* type definitaions */ typedef const int8_t (*ps_huff_tab)[2]; /* static data tables */ static const uint8_t nr_iid_par_tab[] = { 10, 20, 34, 10, 20, 34, 0, 0 }; static const uint8_t nr_ipdopd_par_tab[] = { 5, 11, 17, 5, 11, 17, 0, 0 }; static const uint8_t nr_icc_par_tab[] = { 10, 20, 34, 10, 20, 34, 0, 0 }; static const uint8_t num_env_tab[][4] = { { 0, 1, 2, 4 }, { 1, 2, 3, 4 } }; /* binary lookup huffman tables */ static const int8_t f_huff_iid_def[][2] = { { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 1x */ { /*1*/ -30, /*-1*/ -32 }, /* index 2: 3 bits: 10x */ { 4, 5 }, /* index 3: 3 bits: 11x */ { /*2*/ -29, /*-2*/ -33 }, /* index 4: 4 bits: 110x */ { 6, 7 }, /* index 5: 4 bits: 111x */ { /*3*/ -28, /*-3*/ -34 }, /* index 6: 5 bits: 1110x */ { 8, 9 }, /* index 7: 5 bits: 1111x */ { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 11110x */ { /*5*/ -26, 10 }, /* index 9: 6 bits: 11111x */ { /*-5*/ -36, 11 }, /* index 10: 7 bits: 111111x */ { /*6*/ -25, 12 }, /* index 11: 8 bits: 1111111x */ { /*-6*/ -37, 13 }, /* index 12: 9 bits: 11111111x */ { /*-7*/ -38, 14 }, /* index 13: 10 bits: 111111111x */ { /*7*/ -24, 15 }, /* index 14: 11 bits: 1111111111x */ { 16, 17 }, /* index 15: 12 bits: 11111111111x */ { /*8*/ -23, /*-8*/ -39 }, /* index 16: 13 bits: 111111111110x */ { 18, 19 }, /* index 17: 13 bits: 111111111111x */ { /*9*/ -22, /*10*/ -21 }, /* index 18: 14 bits: 1111111111110x */ { 20, 21 }, /* index 19: 14 bits: 1111111111111x */ { /*-9*/ -40, /*11*/ -20 }, /* index 20: 15 bits: 11111111111110x */ { 22, 23 }, /* index 21: 15 bits: 11111111111111x */ { /*-10*/ -41, 24 }, /* index 22: 16 bits: 111111111111110x */ { 25, 26 }, /* index 23: 16 bits: 111111111111111x */ { /*-11*/ -42, /*-14*/ -45 }, /* index 24: 17 bits: 1111111111111101x */ { /*-13*/ -44, /*-12*/ -43 }, /* index 25: 17 bits: 1111111111111110x */ { /*12*/ -19, 27 }, /* index 26: 17 bits: 1111111111111111x */ { /*13*/ -18, /*14*/ -17 } /* index 27: 18 bits: 11111111111111111x */ }; static const int8_t t_huff_iid_def[][2] = { { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ { /*-1*/ -32, 2 }, /* index 1: 2 bits: 1x */ { /*1*/ -30, 3 }, /* index 2: 3 bits: 11x */ { /*-2*/ -33, 4 }, /* index 3: 4 bits: 111x */ { /*2*/ -29, 5 }, /* index 4: 5 bits: 1111x */ { /*-3*/ -34, 6 }, /* index 5: 6 bits: 11111x */ { /*3*/ -28, 7 }, /* index 6: 7 bits: 111111x */ { /*-4*/ -35, 8 }, /* index 7: 8 bits: 1111111x */ { /*4*/ -27, 9 }, /* index 8: 9 bits: 11111111x */ { /*-5*/ -36, 10 }, /* index 9: 10 bits: 111111111x */ { /*5*/ -26, 11 }, /* index 10: 11 bits: 1111111111x */ { /*-6*/ -37, 12 }, /* index 11: 12 bits: 11111111111x */ { /*6*/ -25, 13 }, /* index 12: 13 bits: 111111111111x */ { /*7*/ -24, 14 }, /* index 13: 14 bits: 1111111111111x */ { /*-7*/ -38, 15 }, /* index 14: 15 bits: 11111111111111x */ { 16, 17 }, /* index 15: 16 bits: 111111111111111x */ { /*8*/ -23, /*-8*/ -39 }, /* index 16: 17 bits: 1111111111111110x */ { 18, 19 }, /* index 17: 17 bits: 1111111111111111x */ { 20, 21 }, /* index 18: 18 bits: 11111111111111110x */ { 22, 23 }, /* index 19: 18 bits: 11111111111111111x */ { /*9*/ -22, /*-14*/ -45 }, /* index 20: 19 bits: 111111111111111100x */ { /*-13*/ -44, /*-12*/ -43 }, /* index 21: 19 bits: 111111111111111101x */ { 24, 25 }, /* index 22: 19 bits: 111111111111111110x */ { 26, 27 }, /* index 23: 19 bits: 111111111111111111x */ { /*-11*/ -42, /*-10*/ -41 }, /* index 24: 20 bits: 1111111111111111100x */ { /*-9*/ -40, /*10*/ -21 }, /* index 25: 20 bits: 1111111111111111101x */ { /*11*/ -20, /*12*/ -19 }, /* index 26: 20 bits: 1111111111111111110x */ { /*13*/ -18, /*14*/ -17 } /* index 27: 20 bits: 1111111111111111111x */ }; static const int8_t f_huff_iid_fine[][2] = { { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 0x */ { 4, /*-1*/ -32 }, /* index 2: 3 bits: 00x */ { /*1*/ -30, 5 }, /* index 3: 3 bits: 01x */ { /*-2*/ -33, /*2*/ -29 }, /* index 4: 4 bits: 000x */ { 6, 7 }, /* index 5: 4 bits: 011x */ { /*-3*/ -34, /*3*/ -28 }, /* index 6: 5 bits: 0110x */ { 8, 9 }, /* index 7: 5 bits: 0111x */ { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 01110x */ { 10, 11 }, /* index 9: 6 bits: 01111x */ { /*-5*/ -36, /*5*/ -26 }, /* index 10: 7 bits: 011110x */ { 12, 13 }, /* index 11: 7 bits: 011111x */ { /*-6*/ -37, /*6*/ -25 }, /* index 12: 8 bits: 0111110x */ { 14, 15 }, /* index 13: 8 bits: 0111111x */ { /*7*/ -24, 16 }, /* index 14: 9 bits: 01111110x */ { 17, 18 }, /* index 15: 9 bits: 01111111x */ { 19, /*-8*/ -39 }, /* index 16: 10 bits: 011111101x */ { /*8*/ -23, 20 }, /* index 17: 10 bits: 011111110x */ { 21, /*-7*/ -38 }, /* index 18: 10 bits: 011111111x */ { /*10*/ -21, 22 }, /* index 19: 11 bits: 0111111010x */ { 23, /*-9*/ -40 }, /* index 20: 11 bits: 0111111101x */ { /*9*/ -22, 24 }, /* index 21: 11 bits: 0111111110x */ { /*-11*/ -42, /*11*/ -20 }, /* index 22: 12 bits: 01111110101x */ { 25, 26 }, /* index 23: 12 bits: 01111111010x */ { 27, /*-10*/ -41 }, /* index 24: 12 bits: 01111111101x */ { 28, /*-12*/ -43 }, /* index 25: 13 bits: 011111110100x */ { /*12*/ -19, 29 }, /* index 26: 13 bits: 011111110101x */ { 30, 31 }, /* index 27: 13 bits: 011111111010x */ { 32, /*-14*/ -45 }, /* index 28: 14 bits: 0111111101000x */ { /*14*/ -17, 33 }, /* index 29: 14 bits: 0111111101011x */ { 34, /*-13*/ -44 }, /* index 30: 14 bits: 0111111110100x */ { /*13*/ -18, 35 }, /* index 31: 14 bits: 0111111110101x */ { 36, 37 }, /* index 32: 15 bits: 01111111010000x */ { 38, /*-15*/ -46 }, /* index 33: 15 bits: 01111111010111x */ { /*15*/ -16, 39 }, /* index 34: 15 bits: 01111111101000x */ { 40, 41 }, /* index 35: 15 bits: 01111111101011x */ { 42, 43 }, /* index 36: 16 bits: 011111110100000x */ { /*-17*/ -48, /*17*/ -14 }, /* index 37: 16 bits: 011111110100001x */ { 44, 45 }, /* index 38: 16 bits: 011111110101110x */ { 46, 47 }, /* index 39: 16 bits: 011111111010001x */ { 48, 49 }, /* index 40: 16 bits: 011111111010110x */ { /*-16*/ -47, /*16*/ -15 }, /* index 41: 16 bits: 011111111010111x */ { /*-21*/ -52, /*21*/ -10 }, /* index 42: 17 bits: 0111111101000000x */ { /*-19*/ -50, /*19*/ -12 }, /* index 43: 17 bits: 0111111101000001x */ { /*-18*/ -49, /*18*/ -13 }, /* index 44: 17 bits: 0111111101011100x */ { 50, 51 }, /* index 45: 17 bits: 0111111101011101x */ { 52, 53 }, /* index 46: 17 bits: 0111111110100010x */ { 54, 55 }, /* index 47: 17 bits: 0111111110100011x */ { 56, 57 }, /* index 48: 17 bits: 0111111110101100x */ { 58, 59 }, /* index 49: 17 bits: 0111111110101101x */ { /*-26*/ -57, /*-25*/ -56 }, /* index 50: 18 bits: 01111111010111010x */ { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 18 bits: 01111111010111011x */ { /*-22*/ -53, /*22*/ -9 }, /* index 52: 18 bits: 01111111101000100x */ { /*-24*/ -55, /*-23*/ -54 }, /* index 53: 18 bits: 01111111101000101x */ { /*25*/ -6, /*26*/ -5 }, /* index 54: 18 bits: 01111111101000110x */ { /*23*/ -8, /*24*/ -7 }, /* index 55: 18 bits: 01111111101000111x */ { /*29*/ -2, /*30*/ -1 }, /* index 56: 18 bits: 01111111101011000x */ { /*27*/ -4, /*28*/ -3 }, /* index 57: 18 bits: 01111111101011001x */ { /*-30*/ -61, /*-29*/ -60 }, /* index 58: 18 bits: 01111111101011010x */ { /*-20*/ -51, /*20*/ -11 } /* index 59: 18 bits: 01111111101011011x */ }; static const int8_t t_huff_iid_fine[][2] = { { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ { /*1*/ -30, 2 }, /* index 1: 2 bits: 0x */ { 3, /*-1*/ -32 }, /* index 2: 3 bits: 01x */ { 4, 5 }, /* index 3: 4 bits: 010x */ { 6, 7 }, /* index 4: 5 bits: 0100x */ { /*-2*/ -33, /*2*/ -29 }, /* index 5: 5 bits: 0101x */ { 8, /*-3*/ -34 }, /* index 6: 6 bits: 01000x */ { /*3*/ -28, 9 }, /* index 7: 6 bits: 01001x */ { /*-4*/ -35, /*4*/ -27 }, /* index 8: 7 bits: 010000x */ { 10, 11 }, /* index 9: 7 bits: 010011x */ { /*5*/ -26, 12 }, /* index 10: 8 bits: 0100110x */ { 13, 14 }, /* index 11: 8 bits: 0100111x */ { /*-6*/ -37, /*6*/ -25 }, /* index 12: 9 bits: 01001101x */ { 15, 16 }, /* index 13: 9 bits: 01001110x */ { 17, /*-5*/ -36 }, /* index 14: 9 bits: 01001111x */ { 18, /*-7*/ -38 }, /* index 15: 10 bits: 010011100x */ { /*7*/ -24, 19 }, /* index 16: 10 bits: 010011101x */ { 20, 21 }, /* index 17: 10 bits: 010011110x */ { /*9*/ -22, 22 }, /* index 18: 11 bits: 0100111000x */ { 23, 24 }, /* index 19: 11 bits: 0100111011x */ { /*-8*/ -39, /*8*/ -23 }, /* index 20: 11 bits: 0100111100x */ { 25, 26 }, /* index 21: 11 bits: 0100111101x */ { /*11*/ -20, 27 }, /* index 22: 12 bits: 01001110001x */ { 28, 29 }, /* index 23: 12 bits: 01001110110x */ { /*-10*/ -41, /*10*/ -21 }, /* index 24: 12 bits: 01001110111x */ { 30, 31 }, /* index 25: 12 bits: 01001111010x */ { 32, /*-9*/ -40 }, /* index 26: 12 bits: 01001111011x */ { 33, /*-13*/ -44 }, /* index 27: 13 bits: 010011100011x */ { /*13*/ -18, 34 }, /* index 28: 13 bits: 010011101100x */ { 35, 36 }, /* index 29: 13 bits: 010011101101x */ { 37, /*-12*/ -43 }, /* index 30: 13 bits: 010011110100x */ { /*12*/ -19, 38 }, /* index 31: 13 bits: 010011110101x */ { 39, /*-11*/ -42 }, /* index 32: 13 bits: 010011110110x */ { 40, 41 }, /* index 33: 14 bits: 0100111000110x */ { 42, 43 }, /* index 34: 14 bits: 0100111011001x */ { 44, 45 }, /* index 35: 14 bits: 0100111011010x */ { 46, /*-15*/ -46 }, /* index 36: 14 bits: 0100111011011x */ { /*15*/ -16, 47 }, /* index 37: 14 bits: 0100111101000x */ { /*-14*/ -45, /*14*/ -17 }, /* index 38: 14 bits: 0100111101011x */ { 48, 49 }, /* index 39: 14 bits: 0100111101100x */ { /*-21*/ -52, /*-20*/ -51 }, /* index 40: 15 bits: 01001110001100x */ { /*18*/ -13, /*19*/ -12 }, /* index 41: 15 bits: 01001110001101x */ { /*-19*/ -50, /*-18*/ -49 }, /* index 42: 15 bits: 01001110110010x */ { 50, 51 }, /* index 43: 15 bits: 01001110110011x */ { 52, 53 }, /* index 44: 15 bits: 01001110110100x */ { 54, 55 }, /* index 45: 15 bits: 01001110110101x */ { 56, /*-17*/ -48 }, /* index 46: 15 bits: 01001110110110x */ { /*17*/ -14, 57 }, /* index 47: 15 bits: 01001111010001x */ { 58, /*-16*/ -47 }, /* index 48: 15 bits: 01001111011000x */ { /*16*/ -15, 59 }, /* index 49: 15 bits: 01001111011001x */ { /*-26*/ -57, /*26*/ -5 }, /* index 50: 16 bits: 010011101100110x */ { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 16 bits: 010011101100111x */ { /*29*/ -2, /*30*/ -1 }, /* index 52: 16 bits: 010011101101000x */ { /*27*/ -4, /*28*/ -3 }, /* index 53: 16 bits: 010011101101001x */ { /*-30*/ -61, /*-29*/ -60 }, /* index 54: 16 bits: 010011101101010x */ { /*-25*/ -56, /*25*/ -6 }, /* index 55: 16 bits: 010011101101011x */ { /*-24*/ -55, /*24*/ -7 }, /* index 56: 16 bits: 010011101101100x */ { /*-23*/ -54, /*23*/ -8 }, /* index 57: 16 bits: 010011110100011x */ { /*-22*/ -53, /*22*/ -9 }, /* index 58: 16 bits: 010011110110000x */ { /*20*/ -11, /*21*/ -10 } /* index 59: 16 bits: 010011110110011x */ }; static const int8_t f_huff_icc[][2] = { { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ { /*5*/ -26, 9 }, /* index 8: 9 bits: 11111111x */ { /*-4*/ -35, 10 }, /* index 9: 10 bits: 111111111x */ { /*6*/ -25, 11 }, /* index 10: 11 bits: 1111111111x */ { /*-5*/ -36, 12 }, /* index 11: 12 bits: 11111111111x */ { /*7*/ -24, 13 }, /* index 12: 13 bits: 111111111111x */ { /*-6*/ -37, /*-7*/ -38 } /* index 13: 14 bits: 1111111111111x */ }; static const int8_t t_huff_icc[][2] = { { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ { /*-4*/ -35, 9 }, /* index 8: 9 bits: 11111111x */ { /*5*/ -26, 10 }, /* index 9: 10 bits: 111111111x */ { /*-5*/ -36, 11 }, /* index 10: 11 bits: 1111111111x */ { /*6*/ -25, 12 }, /* index 11: 12 bits: 11111111111x */ { /*-6*/ -37, 13 }, /* index 12: 13 bits: 111111111111x */ { /*-7*/ -38, /*7*/ -24 } /* index 13: 14 bits: 1111111111111x */ }; static const int8_t f_huff_ipd[][2] = { { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 0x */ { /*1*/ -30, 4 }, /* index 2: 3 bits: 00x */ { 5, 6 }, /* index 3: 3 bits: 01x */ { /*4*/ -27, /*5*/ -26 }, /* index 4: 4 bits: 001x */ { /*3*/ -28, /*6*/ -25 }, /* index 5: 4 bits: 010x */ { /*2*/ -29, /*7*/ -24 } /* index 6: 4 bits: 011x */ }; static const int8_t t_huff_ipd[][2] = { { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 0x */ { 4, 5 }, /* index 2: 3 bits: 00x */ { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ { /*5*/ -26, 6 }, /* index 4: 4 bits: 000x */ { /*2*/ -29, /*6*/ -25 }, /* index 5: 4 bits: 001x */ { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0001x */ }; static const int8_t f_huff_opd[][2] = { { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 0x */ { /*7*/ -24, /*1*/ -30 }, /* index 2: 3 bits: 00x */ { 4, 5 }, /* index 3: 3 bits: 01x */ { /*3*/ -28, /*6*/ -25 }, /* index 4: 4 bits: 010x */ { /*2*/ -29, 6 }, /* index 5: 4 bits: 011x */ { /*5*/ -26, /*4*/ -27 } /* index 6: 5 bits: 0111x */ }; static const int8_t t_huff_opd[][2] = { { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ { 2, 3 }, /* index 1: 2 bits: 0x */ { 4, 5 }, /* index 2: 3 bits: 00x */ { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ { /*5*/ -26, /*2*/ -29 }, /* index 4: 4 bits: 000x */ { /*6*/ -25, 6 }, /* index 5: 4 bits: 001x */ { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0011x */ }; /* static function declarations */ static uint16_t ps_extension(ps_info *ps, bitfile *ld, const uint8_t ps_extension_id, const uint16_t num_bits_left); static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par); static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff); uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header) { uint8_t tmp, n; uint16_t bits = (uint16_t)faad_get_processed_bits(ld); *header = 0; /* check for new PS header */ if (faad_get1bit(ld DEBUGVAR(1,1000,"ps_data(): enable_ps_header"))) { *header = 1; ps->header_read = 1; ps->use34hybrid_bands = 0; /* Inter-channel Intensity Difference (IID) parameters enabled */ ps->enable_iid = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1001,"ps_data(): enable_iid")); if (ps->enable_iid) { ps->iid_mode = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,1002,"ps_data(): iid_mode")); ps->nr_iid_par = nr_iid_par_tab[ps->iid_mode]; ps->nr_ipdopd_par = nr_ipdopd_par_tab[ps->iid_mode]; if (ps->iid_mode == 2 || ps->iid_mode == 5) ps->use34hybrid_bands = 1; /* IPD freq res equal to IID freq res */ ps->ipd_mode = ps->iid_mode; } /* Inter-channel Coherence (ICC) parameters enabled */ ps->enable_icc = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1003,"ps_data(): enable_icc")); if (ps->enable_icc) { ps->icc_mode = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,1004,"ps_data(): icc_mode")); ps->nr_icc_par = nr_icc_par_tab[ps->icc_mode]; if (ps->icc_mode == 2 || ps->icc_mode == 5) ps->use34hybrid_bands = 1; } /* PS extension layer enabled */ ps->enable_ext = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1005,"ps_data(): enable_ext")); } /* we are here, but no header has been read yet */ if (ps->header_read == 0) { ps->ps_data_available = 0; return 1; } ps->frame_class = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1006,"ps_data(): frame_class")); tmp = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,1007,"ps_data(): num_env_idx")); ps->num_env = num_env_tab[ps->frame_class][tmp]; if (ps->frame_class) { for (n = 1; n < ps->num_env+1; n++) { ps->border_position[n] = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,1008,"ps_data(): border_position")) + 1; } } if (ps->enable_iid) { for (n = 0; n < ps->num_env; n++) { ps->iid_dt[n] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1009,"ps_data(): iid_dt")); /* iid_data */ if (ps->iid_mode < 3) { huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_def, f_huff_iid_def, ps->iid_index[n]); } else { huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_fine, f_huff_iid_fine, ps->iid_index[n]); } } } if (ps->enable_icc) { for (n = 0; n < ps->num_env; n++) { ps->icc_dt[n] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1010,"ps_data(): icc_dt")); /* icc_data */ huff_data(ld, ps->icc_dt[n], ps->nr_icc_par, t_huff_icc, f_huff_icc, ps->icc_index[n]); } } if (ps->enable_ext) { uint16_t num_bits_left; uint16_t cnt = (uint16_t)faad_getbits(ld, 4 DEBUGVAR(1,1011,"ps_data(): ps_extension_size")); if (cnt == 15) { cnt += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,1012,"ps_data(): esc_count")); } num_bits_left = 8 * cnt; while (num_bits_left > 7) { uint8_t ps_extension_id = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,1013,"ps_data(): ps_extension_size")); num_bits_left -= 2; num_bits_left -= ps_extension(ps, ld, ps_extension_id, num_bits_left); } faad_getbits(ld, num_bits_left DEBUGVAR(1,1014,"ps_data(): fill_bits")); } bits = (uint16_t)faad_get_processed_bits(ld) - bits; ps->ps_data_available = 1; return bits; } static uint16_t ps_extension(ps_info *ps, bitfile *ld, const uint8_t ps_extension_id, const uint16_t num_bits_left) { uint8_t n; uint16_t bits = (uint16_t)faad_get_processed_bits(ld); if (ps_extension_id == 0) { ps->enable_ipdopd = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1015,"ps_extension(): enable_ipdopd")); if (ps->enable_ipdopd) { for (n = 0; n < ps->num_env; n++) { ps->ipd_dt[n] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1016,"ps_extension(): ipd_dt")); /* ipd_data */ huff_data(ld, ps->ipd_dt[n], ps->nr_ipdopd_par, t_huff_ipd, f_huff_ipd, ps->ipd_index[n]); ps->opd_dt[n] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,1017,"ps_extension(): opd_dt")); /* opd_data */ huff_data(ld, ps->opd_dt[n], ps->nr_ipdopd_par, t_huff_opd, f_huff_opd, ps->opd_index[n]); } } faad_get1bit(ld DEBUGVAR(1,1018,"ps_extension(): reserved_ps")); } /* return number of bits read */ bits = (uint16_t)faad_get_processed_bits(ld) - bits; return bits; } /* read huffman data coded in either the frequency or the time direction */ static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par) { uint8_t n; if (dt) { /* coded in time direction */ for (n = 0; n < nr_par; n++) { par[n] = ps_huff_dec(ld, t_huff); } } else { /* coded in frequency direction */ par[0] = ps_huff_dec(ld, f_huff); for (n = 1; n < nr_par; n++) { par[n] = ps_huff_dec(ld, f_huff); } } } /* binary search huffman decoding */ static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff) { uint8_t bit; int16_t index = 0; while (index >= 0) { bit = (uint8_t)faad_get1bit(ld); index = t_huff[index][bit]; } return index + 31; } #endif faad2-2_10_0/libfaad/ps_tables.h000066400000000000000000001727101374350120500164300ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ps_tables.h,v 1.8 2007/11/01 12:33:33 menno Exp $ **/ #ifndef __PS_TABLES_H__ #define __PS_TABLES_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif #if 0 #if 0 float f_center_20[12] = { 0.5/4, 1.5/4, 2.5/4, 3.5/4, 4.5/4*0, 5.5/4*0, -1.5/4, -0.5/4, 3.5/2, 2.5/2, 4.5/2, 5.5/2 }; #else float f_center_20[12] = { 0.5/8, 1.5/8, 2.5/8, 3.5/8, 4.5/8*0, 5.5/8*0, -1.5/8, -0.5/8, 3.5/4, 2.5/4, 4.5/4, 5.5/4 }; #endif float f_center_34[32] = { 1/12, 3/12, 5/12, 7/12, 9/12, 11/12, 13/12, 15/12, 17/12, -5/12, -3/12, -1/12, 17/8, 19/8, 5/8, 7/8, 9/8, 11/8, 13/8, 15/8, 9/4, 11/4, 13/4, 7/4, 17/4, 11/4, 13/4, 15/4, 17/4, 19/4, 21/4, 15/4 }; static const real_t frac_delay_q[] = { FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) }; #endif /* RE(ps->Phi_Fract_Qmf[j]) = (float)cos(M_PI*(j+0.5)*(0.39)); */ /* IM(ps->Phi_Fract_Qmf[j]) = (float)sin(M_PI*(j+0.5)*(0.39)); */ static const complex_t Phi_Fract_Qmf[] = { { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } }; /* RE(Phi_Fract_SubQmf20[j]) = (float)cos(M_PI*f_center_20[j]*0.39); */ /* IM(Phi_Fract_SubQmf20[j]) = (float)sin(M_PI*f_center_20[j]*0.39); */ static const complex_t Phi_Fract_SubQmf20[] = { { FRAC_CONST(0.9882950187), FRAC_CONST(0.1525546312) }, { FRAC_CONST(0.8962930441), FRAC_CONST(0.4434623122) }, { FRAC_CONST(0.7208535671), FRAC_CONST(0.6930873394) }, { FRAC_CONST(0.4783087075), FRAC_CONST(0.8781917691) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(0.8962930441), FRAC_CONST(-0.4434623122) }, { FRAC_CONST(0.9882950187), FRAC_CONST(-0.1525546312) }, { FRAC_CONST(-0.5424415469), FRAC_CONST(0.8400935531) }, { FRAC_CONST(0.0392598175), FRAC_CONST(0.9992290139) }, { FRAC_CONST(-0.9268565774), FRAC_CONST(0.3754155636) }, { FRAC_CONST(-0.9741733670), FRAC_CONST(-0.2258012742) } }; /* RE(Phi_Fract_SubQmf34[j]) = (float)cos(M_PI*f_center_34[j]*0.39); */ /* IM(Phi_Fract_SubQmf34[j]) = (float)sin(M_PI*f_center_34[j]*0.39); */ static const complex_t Phi_Fract_SubQmf34[] = { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, { FRAC_CONST(0.9876883626), FRAC_CONST(-0.1564344615) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) } }; /* RE(Q_Fract_allpass_Qmf[j][i]) = (float)cos(M_PI*(j+0.5)*(frac_delay_q[i])); */ /* IM(Q_Fract_allpass_Qmf[j][i]) = (float)sin(M_PI*(j+0.5)*(frac_delay_q[i])); */ static const complex_t Q_Fract_allpass_Qmf[][3] = { { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } }; /* RE(Q_Fract_allpass_SubQmf20[j][i]) = (float)cos(M_PI*f_center_20[j]*frac_delay_q[i]); */ /* IM(Q_Fract_allpass_SubQmf20[j][i]) = (float)sin(M_PI*f_center_20[j]*frac_delay_q[i]); */ static const complex_t Q_Fract_allpass_SubQmf20[][3] = { { { FRAC_CONST(0.9857769012), FRAC_CONST(0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(0.1358452588) } }, { { FRAC_CONST(0.8744080663), FRAC_CONST(0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(0.3975082636) } }, { { FRAC_CONST(0.6642524004), FRAC_CONST(0.7475083470) }, { FRAC_CONST(0.0980171412), FRAC_CONST(0.9951847196) }, { FRAC_CONST(0.7767338753), FRAC_CONST(0.6298289299) } }, { { FRAC_CONST(0.3790524006), FRAC_CONST(0.9253752232) }, { FRAC_CONST(-0.4713967443), FRAC_CONST(0.8819212914) }, { FRAC_CONST(0.5785340071), FRAC_CONST(0.8156582713) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(0.8744080663), FRAC_CONST(-0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(-0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(-0.3975082636) } }, { { FRAC_CONST(0.9857769012), FRAC_CONST(-0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(-0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(-0.1358452588) } }, { { FRAC_CONST(-0.7126385570), FRAC_CONST(0.7015314102) }, { FRAC_CONST(-0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.3305967748), FRAC_CONST(0.9437720776) } }, { { FRAC_CONST(-0.1175374240), FRAC_CONST(0.9930684566) }, { FRAC_CONST(-0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(0.2066311091), FRAC_CONST(0.9784189463) } }, { { FRAC_CONST(-0.9947921634), FRAC_CONST(0.1019244045) }, { FRAC_CONST(0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.7720130086), FRAC_CONST(0.6356067061) } }, { { FRAC_CONST(-0.8400934935), FRAC_CONST(-0.5424416065) }, { FRAC_CONST(0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(-0.9896889329), FRAC_CONST(0.1432335079) } } }; /* RE(Q_Fract_allpass_SubQmf34[j][i]) = (float)cos(M_PI*f_center_34[j]*frac_delay_q[i]); */ /* IM(Q_Fract_allpass_SubQmf34[j][i]) = (float)sin(M_PI*f_center_34[j]*frac_delay_q[i]); */ static const complex_t Q_Fract_allpass_SubQmf34[][3] = { { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, { { FRAC_CONST(0.8910064697), FRAC_CONST(0.4539906085) }, { FRAC_CONST(0.7071067691), FRAC_CONST(-0.7071067691) }, { FRAC_CONST(0.6730125546), FRAC_CONST(-0.7396310568) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } } }; #if 0 static float quant_rho[8] = { FRAC_CONST(1.0), FRAC_CONST(0.937), FRAC_CONST(0.84118), FRAC_CONST(0.60092), FRAC_CONST(0.36764), FRAC_CONST(0.0), FRAC_CONST(-0.589), FRAC_CONST(-1.0) }; static const uint8_t quant_iid_normal[7] = { 2, 4, 7, 10, 14, 18, 25 }; static const uint8_t quant_iid_fine[15] = { 2, 4, 6, 8, 10, 13, 16, 19, 22, 25, 30, 35, 40, 45, 50 }; #endif static const real_t cos_alphas[] = { COEF_CONST(1.0000000000), COEF_CONST(0.9841239700), COEF_CONST(0.9594738210), COEF_CONST(0.8946843079), COEF_CONST(0.8269340931), COEF_CONST(0.7071067812), COEF_CONST(0.4533210856), COEF_CONST(0.0000000000) }; static const real_t sin_alphas[] = { COEF_CONST(0.0000000000), COEF_CONST(0.1774824264), COEF_CONST(0.2817977763), COEF_CONST(0.4466989918), COEF_CONST(0.5622988580), COEF_CONST(0.7071067812), COEF_CONST(0.8913472911), COEF_CONST(1.0000000000) }; static const real_t cos_betas_normal[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9959398908), COEF_CONST(0.9896038018), COEF_CONST(0.9727589768), COEF_CONST(0.9548355329), COEF_CONST(0.9223070404), COEF_CONST(0.8494349490), COEF_CONST(0.7013005535) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9902068095), COEF_CONST(0.9749613872), COEF_CONST(0.9346538534), COEF_CONST(0.8921231300), COEF_CONST(0.8158851259), COEF_CONST(0.6495964302), COEF_CONST(0.3313370772) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9880510933), COEF_CONST(0.9694670261), COEF_CONST(0.9204347876), COEF_CONST(0.8688622825), COEF_CONST(0.7768516704), COEF_CONST(0.5782161800), COEF_CONST(0.2069970356) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) } }; static const real_t sin_betas_normal[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0900207420), COEF_CONST(-0.1438204281), COEF_CONST(-0.2318188366), COEF_CONST(-0.2971348264), COEF_CONST(-0.3864579191), COEF_CONST(-0.5276933461), COEF_CONST(-0.7128657193) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1396082894), COEF_CONST(-0.2223742196), COEF_CONST(-0.3555589603), COEF_CONST(-0.4517923427), COEF_CONST(-0.5782140273), COEF_CONST(-0.7602792104), COEF_CONST(-0.9435124489) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1541266914), COEF_CONST(-0.2452217065), COEF_CONST(-0.3908961522), COEF_CONST(-0.4950538699), COEF_CONST(-0.6296836366), COEF_CONST(-0.8158836002), COEF_CONST(-0.9783415698) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) } }; static const real_t cos_betas_fine[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9968361371), COEF_CONST(0.9918968104), COEF_CONST(0.9787540479), COEF_CONST(0.9647515190), COEF_CONST(0.9392903010), COEF_CONST(0.8820167114), COEF_CONST(0.7645325390) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9950262915), COEF_CONST(0.9872675041), COEF_CONST(0.9666584578), COEF_CONST(0.9447588606), COEF_CONST(0.9050918405), COEF_CONST(0.8165997379), COEF_CONST(0.6383824796) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9908827998), COEF_CONST(0.9766855904), COEF_CONST(0.9391249214), COEF_CONST(0.8994531782), COEF_CONST(0.8282352693), COEF_CONST(0.6723983174), COEF_CONST(0.3719473225) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9890240165), COEF_CONST(0.9719459866), COEF_CONST(0.9268448110), COEF_CONST(0.8793388536), COEF_CONST(0.7944023271), COEF_CONST(0.6101812098), COEF_CONST(0.2621501145) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9876350461), COEF_CONST(0.9684073447), COEF_CONST(0.9176973944), COEF_CONST(0.8643930070), COEF_CONST(0.7693796058), COEF_CONST(0.5646720713), COEF_CONST(0.1838899556) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9866247085), COEF_CONST(0.9658349704), COEF_CONST(0.9110590761), COEF_CONST(0.8535668048), COEF_CONST(0.7513165426), COEF_CONST(0.5320914819), COEF_CONST(0.1289530943) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9851245614), COEF_CONST(0.9620180268), COEF_CONST(0.9012265590), COEF_CONST(0.8375623272), COEF_CONST(0.7247108045), COEF_CONST(0.4845204297), COEF_CONST(0.0504115003) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9846869856), COEF_CONST(0.9609052357), COEF_CONST(0.8983639533), COEF_CONST(0.8329098386), COEF_CONST(0.7169983441), COEF_CONST(0.4708245354), COEF_CONST(0.0281732509) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9844406325), COEF_CONST(0.9602788522), COEF_CONST(0.8967533934), COEF_CONST(0.8302936455), COEF_CONST(0.7126658102), COEF_CONST(0.4631492839), COEF_CONST(0.0157851140) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9843020502), COEF_CONST(0.9599265269), COEF_CONST(0.8958477331), COEF_CONST(0.8288229094), COEF_CONST(0.7102315840), COEF_CONST(0.4588429315), COEF_CONST(0.0088578059) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9842241136), COEF_CONST(0.9597283916), COEF_CONST(0.8953385094), COEF_CONST(0.8279961409), COEF_CONST(0.7088635748), COEF_CONST(0.4564246834), COEF_CONST(0.0049751355) } }; static const real_t sin_betas_fine[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0794840594), COEF_CONST(-0.1270461238), COEF_CONST(-0.2050378347), COEF_CONST(-0.2631625097), COEF_CONST(-0.3431234916), COEF_CONST(-0.4712181245), COEF_CONST(-0.6445851354) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0996126459), COEF_CONST(-0.1590687758), COEF_CONST(-0.2560691819), COEF_CONST(-0.3277662204), COEF_CONST(-0.4252161335), COEF_CONST(-0.5772043556), COEF_CONST(-0.7697193058) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1347266752), COEF_CONST(-0.2146747714), COEF_CONST(-0.3435758752), COEF_CONST(-0.4370171396), COEF_CONST(-0.5603805303), COEF_CONST(-0.7401895046), COEF_CONST(-0.9282538388) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1477548470), COEF_CONST(-0.2352041647), COEF_CONST(-0.3754446647), COEF_CONST(-0.4761965776), COEF_CONST(-0.6073919186), COEF_CONST(-0.7922618830), COEF_CONST(-0.9650271071) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1567705832), COEF_CONST(-0.2493736450), COEF_CONST(-0.3972801182), COEF_CONST(-0.5028167951), COEF_CONST(-0.6387918458), COEF_CONST(-0.8253153651), COEF_CONST(-0.9829468369) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1630082348), COEF_CONST(-0.2591578860), COEF_CONST(-0.4122758299), COEF_CONST(-0.5209834064), COEF_CONST(-0.6599420072), COEF_CONST(-0.8466868694), COEF_CONST(-0.9916506943) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1718417832), COEF_CONST(-0.2729859267), COEF_CONST(-0.4333482310), COEF_CONST(-0.5463417868), COEF_CONST(-0.6890531546), COEF_CONST(-0.8747799456), COEF_CONST(-0.9987285320) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1743316967), COEF_CONST(-0.2768774604), COEF_CONST(-0.4392518725), COEF_CONST(-0.5534087104), COEF_CONST(-0.6970748701), COEF_CONST(-0.8822268738), COEF_CONST(-0.9996030552) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1757175038), COEF_CONST(-0.2790421580), COEF_CONST(-0.4425306221), COEF_CONST(-0.5573261722), COEF_CONST(-0.7015037013), COEF_CONST(-0.8862802834), COEF_CONST(-0.9998754073) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1764921355), COEF_CONST(-0.2802517850), COEF_CONST(-0.4443611583), COEF_CONST(-0.5595110229), COEF_CONST(-0.7039681080), COEF_CONST(-0.8885173967), COEF_CONST(-0.9999607689) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1769262394), COEF_CONST(-0.2809295540), COEF_CONST(-0.4453862969), COEF_CONST(-0.5607337966), COEF_CONST(-0.7053456119), COEF_CONST(-0.8897620516), COEF_CONST(-0.9999876239) } }; static const real_t sincos_alphas_B_normal[][8] = { { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, { COEF_CONST(0.1249065138), COEF_CONST(0.1173697697), COEF_CONST(0.1057888284), COEF_CONST(0.0761985131), COEF_CONST(0.0468732723), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103) }, { COEF_CONST(0.1956693050), COEF_CONST(0.1846090179), COEF_CONST(0.1673645109), COEF_CONST(0.1220621836), COEF_CONST(0.0757362479), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630) }, { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, { COEF_CONST(0.4078449476), COEF_CONST(0.3929852420), COEF_CONST(0.3680589270), COEF_CONST(0.2911029124), COEF_CONST(0.1934512363), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716) }, { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, { COEF_CONST(0.9130511848), COEF_CONST(0.9195447612), COEF_CONST(0.9298024282), COEF_CONST(0.9566917233), COEF_CONST(0.9811098801), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928) }, { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, { COEF_CONST(0.9806699215), COEF_CONST(0.9828120260), COEF_CONST(0.9858950861), COEF_CONST(0.9925224431), COEF_CONST(0.9971278825), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406) }, { COEF_CONST(0.9921685024), COEF_CONST(0.9930882705), COEF_CONST(0.9943886135), COEF_CONST(0.9970926648), COEF_CONST(0.9989008403), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479) }, { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) } }; static const real_t sincos_alphas_B_fine[][8] = { { COEF_CONST(0.0031622158), COEF_CONST(0.0029630181), COEF_CONST(0.0026599892), COEF_CONST(0.0019002704), COEF_CONST(0.0011626042), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278) }, { COEF_CONST(0.0056232673), COEF_CONST(0.0052689825), COEF_CONST(0.0047302825), COEF_CONST(0.0033791756), COEF_CONST(0.0020674015), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710) }, { COEF_CONST(0.0099994225), COEF_CONST(0.0093696693), COEF_CONST(0.0084117414), COEF_CONST(0.0060093796), COEF_CONST(0.0036766009), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392) }, { COEF_CONST(0.0177799194), COEF_CONST(0.0166607102), COEF_CONST(0.0149581377), COEF_CONST(0.0106875809), COEF_CONST(0.0065392545), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767) }, { COEF_CONST(0.0316069684), COEF_CONST(0.0296211579), COEF_CONST(0.0265987295), COEF_CONST(0.0190113813), COEF_CONST(0.0116349973), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974) }, { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, { COEF_CONST(0.0791834041), COEF_CONST(0.0742798103), COEF_CONST(0.0667907269), COEF_CONST(0.0478705292), COEF_CONST(0.0293500747), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755) }, { COEF_CONST(0.1115021177), COEF_CONST(0.1047141985), COEF_CONST(0.0943053154), COEF_CONST(0.0678120561), COEF_CONST(0.0416669150), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213) }, { COEF_CONST(0.1565355066), COEF_CONST(0.1473258371), COEF_CONST(0.1330924027), COEF_CONST(0.0963282233), COEF_CONST(0.0594509113), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946) }, { COEF_CONST(0.2184643682), COEF_CONST(0.2064579524), COEF_CONST(0.1876265439), COEF_CONST(0.1375744167), COEF_CONST(0.0856896681), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338) }, { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, { COEF_CONST(0.3698741335), COEF_CONST(0.3547727297), COEF_CONST(0.3298252076), COEF_CONST(0.2556265829), COEF_CONST(0.1665990017), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541) }, { COEF_CONST(0.4480623975), COEF_CONST(0.4339410024), COEF_CONST(0.4098613774), COEF_CONST(0.3322709108), COEF_CONST(0.2266784729), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131) }, { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, { COEF_CONST(0.8940022267), COEF_CONST(0.9009412572), COEF_CONST(0.9121477564), COEF_CONST(0.9431839770), COEF_CONST(0.9739696219), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480) }, { COEF_CONST(0.9290818561), COEF_CONST(0.9349525662), COEF_CONST(0.9440420138), COEF_CONST(0.9667755833), COEF_CONST(0.9860247275), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664) }, { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, { COEF_CONST(0.9758449068), COEF_CONST(0.9784554646), COEF_CONST(0.9822404252), COEF_CONST(0.9904914275), COEF_CONST(0.9963218730), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926) }, { COEF_CONST(0.9876723320), COEF_CONST(0.9890880155), COEF_CONST(0.9911036356), COEF_CONST(0.9953496173), COEF_CONST(0.9982312259), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685) }, { COEF_CONST(0.9937641889), COEF_CONST(0.9945023501), COEF_CONST(0.9955433130), COEF_CONST(0.9976981117), COEF_CONST(0.9991315558), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610) }, { COEF_CONST(0.9968600642), COEF_CONST(0.9972374385), COEF_CONST(0.9977670024), COEF_CONST(0.9988535464), COEF_CONST(0.9995691924), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129) }, { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) }, { COEF_CONST(0.9995003746), COEF_CONST(0.9995611974), COEF_CONST(0.9996461891), COEF_CONST(0.9998192657), COEF_CONST(0.9999323103), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475) }, { COEF_CONST(0.9998419236), COEF_CONST(0.9998611991), COEF_CONST(0.9998881193), COEF_CONST(0.9999428861), COEF_CONST(0.9999786185), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045) }, { COEF_CONST(0.9999500038), COEF_CONST(0.9999561034), COEF_CONST(0.9999646206), COEF_CONST(0.9999819429), COEF_CONST(0.9999932409), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750) }, { COEF_CONST(0.9999841890), COEF_CONST(0.9999861183), COEF_CONST(0.9999888121), COEF_CONST(0.9999942902), COEF_CONST(0.9999978628), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605) }, { COEF_CONST(0.9999950000), COEF_CONST(0.9999956102), COEF_CONST(0.9999964621), COEF_CONST(0.9999981945), COEF_CONST(0.9999993242), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875) } }; static const real_t cos_gammas_normal[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9913533967), COEF_CONST(0.9786000177), COEF_CONST(0.9496063381), COEF_CONST(0.9277157252), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9977406278), COEF_CONST(0.9945423840), COEF_CONST(0.9878736667), COEF_CONST(0.9833980494), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9990607067), COEF_CONST(0.9977417734), COEF_CONST(0.9950323970), COEF_CONST(0.9932453273), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) } }; static const real_t cos_gammas_fine[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9899597309), COEF_CONST(0.9750098690), COEF_CONST(0.9402333855), COEF_CONST(0.9129698759), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9926607607), COEF_CONST(0.9819295710), COEF_CONST(0.9580160104), COEF_CONST(0.9404993670), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9972074644), COEF_CONST(0.9932414270), COEF_CONST(0.9849197629), COEF_CONST(0.9792926592), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9985361982), COEF_CONST(0.9964742028), COEF_CONST(0.9922136306), COEF_CONST(0.9893845420), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9992494366), COEF_CONST(0.9981967170), COEF_CONST(0.9960386625), COEF_CONST(0.9946185834), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9996194722), COEF_CONST(0.9990869422), COEF_CONST(0.9979996269), COEF_CONST(0.9972873651), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999390971), COEF_CONST(0.9998540271), COEF_CONST(0.9996809352), COEF_CONST(0.9995679735), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999807170), COEF_CONST(0.9999537862), COEF_CONST(0.9998990191), COEF_CONST(0.9998632947), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999938979), COEF_CONST(0.9999853814), COEF_CONST(0.9999680568), COEF_CONST(0.9999567596), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999980703), COEF_CONST(0.9999953731), COEF_CONST(0.9999898968), COEF_CONST(0.9999863277), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999993891), COEF_CONST(0.9999985397), COEF_CONST(0.9999968037), COEF_CONST(0.9999956786), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155) } }; static const real_t sin_gammas_normal[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1312190642), COEF_CONST(0.2057717310), COEF_CONST(0.3134450552), COEF_CONST(0.3732874674), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0671836269), COEF_CONST(0.1043333428), COEF_CONST(0.1552598422), COEF_CONST(0.1814615013), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0433324862), COEF_CONST(0.0671666110), COEF_CONST(0.0995516398), COEF_CONST(0.1160332699), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) } }; static const real_t sin_gammas_fine[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1413496768), COEF_CONST(0.2221615526), COEF_CONST(0.3405307340), COEF_CONST(0.4080269669), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1209322714), COEF_CONST(0.1892467110), COEF_CONST(0.2867147079), COEF_CONST(0.3397954394), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0746811420), COEF_CONST(0.1160666523), COEF_CONST(0.1730117353), COEF_CONST(0.2024497161), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0540875291), COEF_CONST(0.0838997203), COEF_CONST(0.1245476266), COEF_CONST(0.1453211203), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0387371058), COEF_CONST(0.0600276114), COEF_CONST(0.0889212171), COEF_CONST(0.1036044086), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0275846110), COEF_CONST(0.0427233177), COEF_CONST(0.0632198125), COEF_CONST(0.0736064637), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0110363955), COEF_CONST(0.0170857974), COEF_CONST(0.0252592108), COEF_CONST(0.0293916021), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0062101284), COEF_CONST(0.0096138203), COEF_CONST(0.0142109649), COEF_CONST(0.0165345659), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0034934509), COEF_CONST(0.0054071189), COEF_CONST(0.0079928316), COEF_CONST(0.0092994041), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0019645397), COEF_CONST(0.0030419905), COEF_CONST(0.0044951511), COEF_CONST(0.0052291853), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0011053943), COEF_CONST(0.0017089869), COEF_CONST(0.0025283670), COEF_CONST(0.0029398552), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685) } }; static const real_t sf_iid_normal[] = { COEF_CONST(1.4119827747), COEF_CONST(1.4031381607), COEF_CONST(1.3868767023), COEF_CONST(1.3483997583), COEF_CONST(1.2912493944), COEF_CONST(1.1960374117), COEF_CONST(1.1073724031), COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), COEF_CONST(0.7546485662), COEF_CONST(0.5767799020), COEF_CONST(0.4264014363), COEF_CONST(0.2767182887), COEF_CONST(0.1766446233), COEF_CONST(0.0794016272) }; static const real_t sf_iid_fine[] = { COEF_CONST(1.4142065048), COEF_CONST(1.4141912460), COEF_CONST(1.4141428471), COEF_CONST(1.4139900208), COEF_CONST(1.4135069847), COEF_CONST(1.4119827747), COEF_CONST(1.4097729921), COEF_CONST(1.4053947926), COEF_CONST(1.3967796564), COEF_CONST(1.3800530434), COEF_CONST(1.3483997583), COEF_CONST(1.3139201403), COEF_CONST(1.2643101215), COEF_CONST(1.1960374117), COEF_CONST(1.1073724031), COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), COEF_CONST(0.7546485662), COEF_CONST(0.6336560845), COEF_CONST(0.5230810642), COEF_CONST(0.4264014363), COEF_CONST(0.3089554012), COEF_CONST(0.2213746458), COEF_CONST(0.1576878875), COEF_CONST(0.1119822487), COEF_CONST(0.0794016272), COEF_CONST(0.0446990170), COEF_CONST(0.0251446925), COEF_CONST(0.0141414283), COEF_CONST(0.0079525812), COEF_CONST(0.0044721137) }; #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/pulse.c000066400000000000000000000036041374350120500155720ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pulse.c,v 1.21 2007/11/01 12:33:34 menno Exp $ **/ #include "common.h" #include "structs.h" #include "syntax.h" #include "pulse.h" uint8_t pulse_decode(ic_stream *ics, int16_t *spec_data, uint16_t framelen) { uint8_t i; uint16_t k; pulse_info *pul = &(ics->pul); k = min(ics->swb_offset[pul->pulse_start_sfb], ics->swb_offset_max); for (i = 0; i <= pul->number_pulse; i++) { k += pul->pulse_offset[i]; if (k >= framelen) return 15; /* should not be possible */ if (spec_data[k] > 0) spec_data[k] += pul->pulse_amp[i]; else spec_data[k] -= pul->pulse_amp[i]; } return 0; } faad2-2_10_0/libfaad/pulse.h000066400000000000000000000027231374350120500156000ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pulse.h,v 1.20 2007/11/01 12:33:34 menno Exp $ **/ #ifndef __PULSE_H__ #define __PULSE_H__ #ifdef __cplusplus extern "C" { #endif uint8_t pulse_decode(ic_stream *ics, int16_t *spec_coef, uint16_t framelen); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/rvlc.c000066400000000000000000000363541374350120500154200ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: rvlc.c,v 1.21 2007/11/01 12:33:34 menno Exp $ **/ /* RVLC scalefactor decoding * * RVLC works like this: * 1. Only symmetric huffman codewords are used * 2. Total length of the scalefactor data is stored in the bitsream * 3. Scalefactors are DPCM coded * 4. Next to the starting value for DPCM the ending value is also stored * * With all this it is possible to read the scalefactor data from 2 sides. * If there is a bit error in the scalefactor data it is possible to start * decoding from the other end of the data, to find all but 1 scalefactor. */ #include "common.h" #include "structs.h" #include #include "syntax.h" #include "bits.h" #include "rvlc.h" #ifdef ERROR_RESILIENCE //#define PRINT_RVLC /* static function declarations */ static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, uint8_t *is_used); #if 0 static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, uint8_t is_used); #endif static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, int8_t direction); static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction); uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld) { uint8_t bits = 9; ics->sf_concealment = faad_get1bit(ld DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment")); ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain")); if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) bits = 11; /* the number of bits used for the huffman codewords */ ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf")); if (ics->noise_used) { ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9 DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg")); ics->length_of_rvlc_sf -= 9; } ics->sf_escapes_present = faad_get1bit(ld DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present")); if (ics->sf_escapes_present) { ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes")); } if (ics->noise_used) { ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9 DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position")); } return 0; } uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld) { uint8_t result; uint8_t intensity_used = 0; uint8_t *rvlc_sf_buffer = NULL; uint8_t *rvlc_esc_buffer = NULL; bitfile ld_rvlc_sf, ld_rvlc_esc; // bitfile ld_rvlc_sf_rev, ld_rvlc_esc_rev; if (ics->length_of_rvlc_sf > 0) { /* We read length_of_rvlc_sf bits here to put it in a seperate bitfile. */ rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf")); faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf)); // faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer, // ics->length_of_rvlc_sf); } if (ics->sf_escapes_present) { /* We read length_of_rvlc_escapes bits here to put it in a seperate bitfile. */ rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes")); faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes)); // faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer, // ics->length_of_rvlc_escapes); } /* decode the rvlc scale factors and escapes */ result = rvlc_decode_sf_forward(ics, &ld_rvlc_sf, &ld_rvlc_esc, &intensity_used); // result = rvlc_decode_sf_reverse(ics, &ld_rvlc_sf_rev, // &ld_rvlc_esc_rev, intensity_used); if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer); if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer); if (ics->length_of_rvlc_sf > 0) faad_endbits(&ld_rvlc_sf); if (ics->sf_escapes_present) faad_endbits(&ld_rvlc_esc); return result; } static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, uint8_t *intensity_used) { int8_t g, sfb; int8_t t = 0; int8_t error = 0; int8_t noise_pcm_flag = 1; int16_t scale_factor = ics->global_gain; int16_t is_position = 0; int16_t noise_energy = ics->global_gain - 90 - 256; #ifdef PRINT_RVLC printf("\nglobal_gain: %d\n", ics->global_gain); #endif for (g = 0; g < ics->num_window_groups; g++) { for (sfb = 0; sfb < ics->max_sfb; sfb++) { if (error) { ics->scale_factors[g][sfb] = 0; } else { switch (ics->sfb_cb[g][sfb]) { case ZERO_HCB: /* zero book */ ics->scale_factors[g][sfb] = 0; break; case INTENSITY_HCB: /* intensity books */ case INTENSITY_HCB2: *intensity_used = 1; /* decode intensity position */ t = rvlc_huffman_sf(ld_sf, ld_esc, +1); is_position += t; ics->scale_factors[g][sfb] = is_position; break; case NOISE_HCB: /* noise books */ /* decode noise energy */ if (noise_pcm_flag) { int16_t n = ics->dpcm_noise_nrg; noise_pcm_flag = 0; noise_energy += n; } else { t = rvlc_huffman_sf(ld_sf, ld_esc, +1); noise_energy += t; } ics->scale_factors[g][sfb] = noise_energy; break; default: /* spectral books */ /* decode scale factor */ t = rvlc_huffman_sf(ld_sf, ld_esc, +1); scale_factor += t; if (scale_factor < 0) return 4; ics->scale_factors[g][sfb] = scale_factor; break; } #ifdef PRINT_RVLC printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], ics->scale_factors[g][sfb]); #endif if (t == 99) { error = 1; } } } } #ifdef PRINT_RVLC printf("\n\n"); #endif return 0; } #if 0 // not used right now, doesn't work correctly yet static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, uint8_t intensity_used) { int8_t g, sfb; int8_t t = 0; int8_t error = 0; int8_t noise_pcm_flag = 1, is_pcm_flag = 1, sf_pcm_flag = 1; int16_t scale_factor = ics->rev_global_gain; int16_t is_position = 0; int16_t noise_energy = ics->rev_global_gain; #ifdef PRINT_RVLC printf("\nrev_global_gain: %d\n", ics->rev_global_gain); #endif if (intensity_used) { is_position = rvlc_huffman_sf(ld_sf, ld_esc, -1); #ifdef PRINT_RVLC printf("is_position: %d\n", is_position); #endif } for (g = ics->num_window_groups-1; g >= 0; g--) { for (sfb = ics->max_sfb-1; sfb >= 0; sfb--) { if (error) { ics->scale_factors[g][sfb] = 0; } else { switch (ics->sfb_cb[g][sfb]) { case ZERO_HCB: /* zero book */ ics->scale_factors[g][sfb] = 0; break; case INTENSITY_HCB: /* intensity books */ case INTENSITY_HCB2: if (is_pcm_flag) { is_pcm_flag = 0; ics->scale_factors[g][sfb] = is_position; } else { t = rvlc_huffman_sf(ld_sf, ld_esc, -1); is_position -= t; ics->scale_factors[g][sfb] = (uint8_t)is_position; } break; case NOISE_HCB: /* noise books */ /* decode noise energy */ if (noise_pcm_flag) { noise_pcm_flag = 0; noise_energy = ics->dpcm_noise_last_position; } else { t = rvlc_huffman_sf(ld_sf, ld_esc, -1); noise_energy -= t; } ics->scale_factors[g][sfb] = (uint8_t)noise_energy; break; default: /* spectral books */ if (sf_pcm_flag || (sfb == 0)) { sf_pcm_flag = 0; if (sfb == 0) scale_factor = ics->global_gain; } else { /* decode scale factor */ t = rvlc_huffman_sf(ld_sf, ld_esc, -1); scale_factor -= t; } if (scale_factor < 0) return 4; ics->scale_factors[g][sfb] = (uint8_t)scale_factor; break; } #ifdef PRINT_RVLC printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], ics->scale_factors[g][sfb]); #endif if (t == 99) { error = 1; } } } } #ifdef PRINT_RVLC printf("\n\n"); #endif return 0; } #endif /* index == 99 means not allowed codeword */ static rvlc_huff_table book_rvlc[] = { /*index length codeword */ { 0, 1, 0 }, /* 0 */ { -1, 3, 5 }, /* 101 */ { 1, 3, 7 }, /* 111 */ { -2, 4, 9 }, /* 1001 */ { -3, 5, 17 }, /* 10001 */ { 2, 5, 27 }, /* 11011 */ { -4, 6, 33 }, /* 100001 */ { 99, 6, 50 }, /* 110010 */ { 3, 6, 51 }, /* 110011 */ { 99, 6, 52 }, /* 110100 */ { -7, 7, 65 }, /* 1000001 */ { 99, 7, 96 }, /* 1100000 */ { 99, 7, 98 }, /* 1100010 */ { 7, 7, 99 }, /* 1100011 */ { 4, 7, 107 }, /* 1101011 */ { -5, 8, 129 }, /* 10000001 */ { 99, 8, 194 }, /* 11000010 */ { 5, 8, 195 }, /* 11000011 */ { 99, 8, 212 }, /* 11010100 */ { 99, 9, 256 }, /* 100000000 */ { -6, 9, 257 }, /* 100000001 */ { 99, 9, 426 }, /* 110101010 */ { 6, 9, 427 }, /* 110101011 */ { 99, 10, 0 } /* Shouldn't come this far */ }; static rvlc_huff_table book_escape[] = { /*index length codeword */ { 1, 2, 0 }, { 0, 2, 2 }, { 3, 3, 2 }, { 2, 3, 6 }, { 4, 4, 14 }, { 7, 5, 13 }, { 6, 5, 15 }, { 5, 5, 31 }, { 11, 6, 24 }, { 10, 6, 25 }, { 9, 6, 29 }, { 8, 6, 61 }, { 13, 7, 56 }, { 12, 7, 120 }, { 15, 8, 114 }, { 14, 8, 242 }, { 17, 9, 230 }, { 16, 9, 486 }, { 19, 10, 463 }, { 18, 10, 974 }, { 22, 11, 925 }, { 20, 11, 1950 }, { 21, 11, 1951 }, { 23, 12, 1848 }, { 25, 13, 3698 }, { 24, 14, 7399 }, { 26, 15, 14797 }, { 49, 19, 236736 }, { 50, 19, 236737 }, { 51, 19, 236738 }, { 52, 19, 236739 }, { 53, 19, 236740 }, { 27, 20, 473482 }, { 28, 20, 473483 }, { 29, 20, 473484 }, { 30, 20, 473485 }, { 31, 20, 473486 }, { 32, 20, 473487 }, { 33, 20, 473488 }, { 34, 20, 473489 }, { 35, 20, 473490 }, { 36, 20, 473491 }, { 37, 20, 473492 }, { 38, 20, 473493 }, { 39, 20, 473494 }, { 40, 20, 473495 }, { 41, 20, 473496 }, { 42, 20, 473497 }, { 43, 20, 473498 }, { 44, 20, 473499 }, { 45, 20, 473500 }, { 46, 20, 473501 }, { 47, 20, 473502 }, { 48, 20, 473503 }, { 99, 21, 0 } /* Shouldn't come this far */ }; static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, int8_t direction) { uint8_t i, j; int8_t index; uint32_t cw; rvlc_huff_table *h = book_rvlc; i = h->len; if (direction > 0) cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,"")); else cw = faad_getbits_rev(ld_sf, i DEBUGVAR(1,0,"")); while ((cw != h->cw) && (i < 10)) { h++; j = h->len-i; i += j; cw <<= j; if (direction > 0) cw |= faad_getbits(ld_sf, j DEBUGVAR(1,0,"")); else cw |= faad_getbits_rev(ld_sf, j DEBUGVAR(1,0,"")); } index = h->index; if (index == +ESC_VAL) { int8_t esc = rvlc_huffman_esc(ld_esc, direction); if (esc == 99) return 99; index += esc; #ifdef PRINT_RVLC printf("esc: %d - ", esc); #endif } if (index == -ESC_VAL) { int8_t esc = rvlc_huffman_esc(ld_esc, direction); if (esc == 99) return 99; index -= esc; #ifdef PRINT_RVLC printf("esc: %d - ", esc); #endif } return index; } static int8_t rvlc_huffman_esc(bitfile *ld, int8_t direction) { uint8_t i, j; uint32_t cw; rvlc_huff_table *h = book_escape; i = h->len; if (direction > 0) cw = faad_getbits(ld, i DEBUGVAR(1,0,"")); else cw = faad_getbits_rev(ld, i DEBUGVAR(1,0,"")); while ((cw != h->cw) && (i < 21)) { h++; j = h->len-i; i += j; cw <<= j; if (direction > 0) cw |= faad_getbits(ld, j DEBUGVAR(1,0,"")); else cw |= faad_getbits_rev(ld, j DEBUGVAR(1,0,"")); } return h->index; } #endif faad2-2_10_0/libfaad/rvlc.h000066400000000000000000000031671374350120500154210ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: rvlc.h,v 1.17 2007/11/01 12:33:34 menno Exp $ **/ #ifndef __RVLC_SCF_H__ #define __RVLC_SCF_H__ #ifdef __cplusplus extern "C" { #endif typedef struct { int8_t index; uint8_t len; uint32_t cw; } rvlc_huff_table; #define ESC_VAL 7 uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld); uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_dct.c000066400000000000000000002401451374350120500160650ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_dct.c,v 1.20 2007/11/01 12:33:34 menno Exp $ **/ /* Most of the DCT/DST codes here are generated using Spiral which is GPL * For more info see: http://www.spiral.net/ */ #include "common.h" #ifdef SBR_DEC #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif #include "sbr_dct.h" void DCT4_32(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; real_t f271, f272, f273, f274, f275, f276, f277, f278, f279, f280; real_t f281, f282, f283, f284, f285, f286, f287, f288, f289, f290; real_t f291, f292, f293, f294, f295, f296, f297, f298, f299, f300; real_t f301, f302, f303, f304, f305, f306, f307, f310, f311, f312; real_t f313, f316, f317, f318, f319, f322, f323, f324, f325, f328; real_t f329, f330, f331, f334, f335, f336, f337, f340, f341, f342; real_t f343, f346, f347, f348, f349, f352, f353, f354, f355, f358; real_t f359, f360, f361, f364, f365, f366, f367, f370, f371, f372; real_t f373, f376, f377, f378, f379, f382, f383, f384, f385, f388; real_t f389, f390, f391, f394, f395, f396, f397; f0 = x[15] - x[16]; f1 = x[15] + x[16]; f2 = MUL_F(FRAC_CONST(0.7071067811865476), f1); f3 = MUL_F(FRAC_CONST(0.7071067811865476), f0); f4 = x[8] - x[23]; f5 = x[8] + x[23]; f6 = MUL_F(FRAC_CONST(0.7071067811865476), f5); f7 = MUL_F(FRAC_CONST(0.7071067811865476), f4); f8 = x[12] - x[19]; f9 = x[12] + x[19]; f10 = MUL_F(FRAC_CONST(0.7071067811865476), f9); f11 = MUL_F(FRAC_CONST(0.7071067811865476), f8); f12 = x[11] - x[20]; f13 = x[11] + x[20]; f14 = MUL_F(FRAC_CONST(0.7071067811865476), f13); f15 = MUL_F(FRAC_CONST(0.7071067811865476), f12); f16 = x[14] - x[17]; f17 = x[14] + x[17]; f18 = MUL_F(FRAC_CONST(0.7071067811865476), f17); f19 = MUL_F(FRAC_CONST(0.7071067811865476), f16); f20 = x[9] - x[22]; f21 = x[9] + x[22]; f22 = MUL_F(FRAC_CONST(0.7071067811865476), f21); f23 = MUL_F(FRAC_CONST(0.7071067811865476), f20); f24 = x[13] - x[18]; f25 = x[13] + x[18]; f26 = MUL_F(FRAC_CONST(0.7071067811865476), f25); f27 = MUL_F(FRAC_CONST(0.7071067811865476), f24); f28 = x[10] - x[21]; f29 = x[10] + x[21]; f30 = MUL_F(FRAC_CONST(0.7071067811865476), f29); f31 = MUL_F(FRAC_CONST(0.7071067811865476), f28); f32 = x[0] - f2; f33 = x[0] + f2; f34 = x[31] - f3; f35 = x[31] + f3; f36 = x[7] - f6; f37 = x[7] + f6; f38 = x[24] - f7; f39 = x[24] + f7; f40 = x[3] - f10; f41 = x[3] + f10; f42 = x[28] - f11; f43 = x[28] + f11; f44 = x[4] - f14; f45 = x[4] + f14; f46 = x[27] - f15; f47 = x[27] + f15; f48 = x[1] - f18; f49 = x[1] + f18; f50 = x[30] - f19; f51 = x[30] + f19; f52 = x[6] - f22; f53 = x[6] + f22; f54 = x[25] - f23; f55 = x[25] + f23; f56 = x[2] - f26; f57 = x[2] + f26; f58 = x[29] - f27; f59 = x[29] + f27; f60 = x[5] - f30; f61 = x[5] + f30; f62 = x[26] - f31; f63 = x[26] + f31; f64 = f39 + f37; f65 = MUL_F(FRAC_CONST(-0.5411961001461969), f39); f66 = MUL_F(FRAC_CONST(0.9238795325112867), f64); f67 = MUL_C(COEF_CONST(1.3065629648763766), f37); f68 = f65 + f66; f69 = f67 - f66; f70 = f38 + f36; f71 = MUL_C(COEF_CONST(1.3065629648763770), f38); f72 = MUL_F(FRAC_CONST(-0.3826834323650904), f70); f73 = MUL_F(FRAC_CONST(0.5411961001461961), f36); f74 = f71 + f72; f75 = f73 - f72; f76 = f47 + f45; f77 = MUL_F(FRAC_CONST(-0.5411961001461969), f47); f78 = MUL_F(FRAC_CONST(0.9238795325112867), f76); f79 = MUL_C(COEF_CONST(1.3065629648763766), f45); f80 = f77 + f78; f81 = f79 - f78; f82 = f46 + f44; f83 = MUL_C(COEF_CONST(1.3065629648763770), f46); f84 = MUL_F(FRAC_CONST(-0.3826834323650904), f82); f85 = MUL_F(FRAC_CONST(0.5411961001461961), f44); f86 = f83 + f84; f87 = f85 - f84; f88 = f55 + f53; f89 = MUL_F(FRAC_CONST(-0.5411961001461969), f55); f90 = MUL_F(FRAC_CONST(0.9238795325112867), f88); f91 = MUL_C(COEF_CONST(1.3065629648763766), f53); f92 = f89 + f90; f93 = f91 - f90; f94 = f54 + f52; f95 = MUL_C(COEF_CONST(1.3065629648763770), f54); f96 = MUL_F(FRAC_CONST(-0.3826834323650904), f94); f97 = MUL_F(FRAC_CONST(0.5411961001461961), f52); f98 = f95 + f96; f99 = f97 - f96; f100 = f63 + f61; f101 = MUL_F(FRAC_CONST(-0.5411961001461969), f63); f102 = MUL_F(FRAC_CONST(0.9238795325112867), f100); f103 = MUL_C(COEF_CONST(1.3065629648763766), f61); f104 = f101 + f102; f105 = f103 - f102; f106 = f62 + f60; f107 = MUL_C(COEF_CONST(1.3065629648763770), f62); f108 = MUL_F(FRAC_CONST(-0.3826834323650904), f106); f109 = MUL_F(FRAC_CONST(0.5411961001461961), f60); f110 = f107 + f108; f111 = f109 - f108; f112 = f33 - f68; f113 = f33 + f68; f114 = f35 - f69; f115 = f35 + f69; f116 = f32 - f74; f117 = f32 + f74; f118 = f34 - f75; f119 = f34 + f75; f120 = f41 - f80; f121 = f41 + f80; f122 = f43 - f81; f123 = f43 + f81; f124 = f40 - f86; f125 = f40 + f86; f126 = f42 - f87; f127 = f42 + f87; f128 = f49 - f92; f129 = f49 + f92; f130 = f51 - f93; f131 = f51 + f93; f132 = f48 - f98; f133 = f48 + f98; f134 = f50 - f99; f135 = f50 + f99; f136 = f57 - f104; f137 = f57 + f104; f138 = f59 - f105; f139 = f59 + f105; f140 = f56 - f110; f141 = f56 + f110; f142 = f58 - f111; f143 = f58 + f111; f144 = f123 + f121; f145 = MUL_F(FRAC_CONST(-0.7856949583871021), f123); f146 = MUL_F(FRAC_CONST(0.9807852804032304), f144); f147 = MUL_C(COEF_CONST(1.1758756024193588), f121); f148 = f145 + f146; f149 = f147 - f146; f150 = f127 + f125; f151 = MUL_F(FRAC_CONST(0.2758993792829431), f127); f152 = MUL_F(FRAC_CONST(0.5555702330196022), f150); f153 = MUL_C(COEF_CONST(1.3870398453221475), f125); f154 = f151 + f152; f155 = f153 - f152; f156 = f122 + f120; f157 = MUL_C(COEF_CONST(1.1758756024193591), f122); f158 = MUL_F(FRAC_CONST(-0.1950903220161287), f156); f159 = MUL_F(FRAC_CONST(0.7856949583871016), f120); f160 = f157 + f158; f161 = f159 - f158; f162 = f126 + f124; f163 = MUL_C(COEF_CONST(1.3870398453221473), f126); f164 = MUL_F(FRAC_CONST(-0.8314696123025455), f162); f165 = MUL_F(FRAC_CONST(-0.2758993792829436), f124); f166 = f163 + f164; f167 = f165 - f164; f168 = f139 + f137; f169 = MUL_F(FRAC_CONST(-0.7856949583871021), f139); f170 = MUL_F(FRAC_CONST(0.9807852804032304), f168); f171 = MUL_C(COEF_CONST(1.1758756024193588), f137); f172 = f169 + f170; f173 = f171 - f170; f174 = f143 + f141; f175 = MUL_F(FRAC_CONST(0.2758993792829431), f143); f176 = MUL_F(FRAC_CONST(0.5555702330196022), f174); f177 = MUL_C(COEF_CONST(1.3870398453221475), f141); f178 = f175 + f176; f179 = f177 - f176; f180 = f138 + f136; f181 = MUL_C(COEF_CONST(1.1758756024193591), f138); f182 = MUL_F(FRAC_CONST(-0.1950903220161287), f180); f183 = MUL_F(FRAC_CONST(0.7856949583871016), f136); f184 = f181 + f182; f185 = f183 - f182; f186 = f142 + f140; f187 = MUL_C(COEF_CONST(1.3870398453221473), f142); f188 = MUL_F(FRAC_CONST(-0.8314696123025455), f186); f189 = MUL_F(FRAC_CONST(-0.2758993792829436), f140); f190 = f187 + f188; f191 = f189 - f188; f192 = f113 - f148; f193 = f113 + f148; f194 = f115 - f149; f195 = f115 + f149; f196 = f117 - f154; f197 = f117 + f154; f198 = f119 - f155; f199 = f119 + f155; f200 = f112 - f160; f201 = f112 + f160; f202 = f114 - f161; f203 = f114 + f161; f204 = f116 - f166; f205 = f116 + f166; f206 = f118 - f167; f207 = f118 + f167; f208 = f129 - f172; f209 = f129 + f172; f210 = f131 - f173; f211 = f131 + f173; f212 = f133 - f178; f213 = f133 + f178; f214 = f135 - f179; f215 = f135 + f179; f216 = f128 - f184; f217 = f128 + f184; f218 = f130 - f185; f219 = f130 + f185; f220 = f132 - f190; f221 = f132 + f190; f222 = f134 - f191; f223 = f134 + f191; f224 = f211 + f209; f225 = MUL_F(FRAC_CONST(-0.8971675863426361), f211); f226 = MUL_F(FRAC_CONST(0.9951847266721968), f224); f227 = MUL_C(COEF_CONST(1.0932018670017576), f209); f228 = f225 + f226; f229 = f227 - f226; f230 = f215 + f213; f231 = MUL_F(FRAC_CONST(-0.4105245275223571), f215); f232 = MUL_F(FRAC_CONST(0.8819212643483549), f230); f233 = MUL_C(COEF_CONST(1.3533180011743529), f213); f234 = f231 + f232; f235 = f233 - f232; f236 = f219 + f217; f237 = MUL_F(FRAC_CONST(0.1386171691990915), f219); f238 = MUL_F(FRAC_CONST(0.6343932841636455), f236); f239 = MUL_C(COEF_CONST(1.4074037375263826), f217); f240 = f237 + f238; f241 = f239 - f238; f242 = f223 + f221; f243 = MUL_F(FRAC_CONST(0.6666556584777466), f223); f244 = MUL_F(FRAC_CONST(0.2902846772544623), f242); f245 = MUL_C(COEF_CONST(1.2472250129866711), f221); f246 = f243 + f244; f247 = f245 - f244; f248 = f210 + f208; f249 = MUL_C(COEF_CONST(1.0932018670017574), f210); f250 = MUL_F(FRAC_CONST(-0.0980171403295605), f248); f251 = MUL_F(FRAC_CONST(0.8971675863426364), f208); f252 = f249 + f250; f253 = f251 - f250; f254 = f214 + f212; f255 = MUL_C(COEF_CONST(1.3533180011743529), f214); f256 = MUL_F(FRAC_CONST(-0.4713967368259979), f254); f257 = MUL_F(FRAC_CONST(0.4105245275223569), f212); f258 = f255 + f256; f259 = f257 - f256; f260 = f218 + f216; f261 = MUL_C(COEF_CONST(1.4074037375263826), f218); f262 = MUL_F(FRAC_CONST(-0.7730104533627369), f260); f263 = MUL_F(FRAC_CONST(-0.1386171691990913), f216); f264 = f261 + f262; f265 = f263 - f262; f266 = f222 + f220; f267 = MUL_C(COEF_CONST(1.2472250129866711), f222); f268 = MUL_F(FRAC_CONST(-0.9569403357322089), f266); f269 = MUL_F(FRAC_CONST(-0.6666556584777469), f220); f270 = f267 + f268; f271 = f269 - f268; f272 = f193 - f228; f273 = f193 + f228; f274 = f195 - f229; f275 = f195 + f229; f276 = f197 - f234; f277 = f197 + f234; f278 = f199 - f235; f279 = f199 + f235; f280 = f201 - f240; f281 = f201 + f240; f282 = f203 - f241; f283 = f203 + f241; f284 = f205 - f246; f285 = f205 + f246; f286 = f207 - f247; f287 = f207 + f247; f288 = f192 - f252; f289 = f192 + f252; f290 = f194 - f253; f291 = f194 + f253; f292 = f196 - f258; f293 = f196 + f258; f294 = f198 - f259; f295 = f198 + f259; f296 = f200 - f264; f297 = f200 + f264; f298 = f202 - f265; f299 = f202 + f265; f300 = f204 - f270; f301 = f204 + f270; f302 = f206 - f271; f303 = f206 + f271; f304 = f275 + f273; f305 = MUL_F(FRAC_CONST(-0.9751575901732920), f275); f306 = MUL_F(FRAC_CONST(0.9996988186962043), f304); f307 = MUL_C(COEF_CONST(1.0242400472191164), f273); y[0] = f305 + f306; y[31] = f307 - f306; f310 = f279 + f277; f311 = MUL_F(FRAC_CONST(-0.8700688593994936), f279); f312 = MUL_F(FRAC_CONST(0.9924795345987100), f310); f313 = MUL_C(COEF_CONST(1.1148902097979263), f277); y[2] = f311 + f312; y[29] = f313 - f312; f316 = f283 + f281; f317 = MUL_F(FRAC_CONST(-0.7566008898816587), f283); f318 = MUL_F(FRAC_CONST(0.9757021300385286), f316); f319 = MUL_C(COEF_CONST(1.1948033701953984), f281); y[4] = f317 + f318; y[27] = f319 - f318; f322 = f287 + f285; f323 = MUL_F(FRAC_CONST(-0.6358464401941451), f287); f324 = MUL_F(FRAC_CONST(0.9495281805930367), f322); f325 = MUL_C(COEF_CONST(1.2632099209919283), f285); y[6] = f323 + f324; y[25] = f325 - f324; f328 = f291 + f289; f329 = MUL_F(FRAC_CONST(-0.5089684416985408), f291); f330 = MUL_F(FRAC_CONST(0.9142097557035307), f328); f331 = MUL_C(COEF_CONST(1.3194510697085207), f289); y[8] = f329 + f330; y[23] = f331 - f330; f334 = f295 + f293; f335 = MUL_F(FRAC_CONST(-0.3771887988789273), f295); f336 = MUL_F(FRAC_CONST(0.8700869911087114), f334); f337 = MUL_C(COEF_CONST(1.3629851833384954), f293); y[10] = f335 + f336; y[21] = f337 - f336; f340 = f299 + f297; f341 = MUL_F(FRAC_CONST(-0.2417766217337384), f299); f342 = MUL_F(FRAC_CONST(0.8175848131515837), f340); f343 = MUL_C(COEF_CONST(1.3933930045694289), f297); y[12] = f341 + f342; y[19] = f343 - f342; f346 = f303 + f301; f347 = MUL_F(FRAC_CONST(-0.1040360035527077), f303); f348 = MUL_F(FRAC_CONST(0.7572088465064845), f346); f349 = MUL_C(COEF_CONST(1.4103816894602612), f301); y[14] = f347 + f348; y[17] = f349 - f348; f352 = f274 + f272; f353 = MUL_F(FRAC_CONST(0.0347065382144002), f274); f354 = MUL_F(FRAC_CONST(0.6895405447370668), f352); f355 = MUL_C(COEF_CONST(1.4137876276885337), f272); y[16] = f353 + f354; y[15] = f355 - f354; f358 = f278 + f276; f359 = MUL_F(FRAC_CONST(0.1731148370459795), f278); f360 = MUL_F(FRAC_CONST(0.6152315905806268), f358); f361 = MUL_C(COEF_CONST(1.4035780182072330), f276); y[18] = f359 + f360; y[13] = f361 - f360; f364 = f282 + f280; f365 = MUL_F(FRAC_CONST(0.3098559453626100), f282); f366 = MUL_F(FRAC_CONST(0.5349976198870972), f364); f367 = MUL_C(COEF_CONST(1.3798511851368043), f280); y[20] = f365 + f366; y[11] = f367 - f366; f370 = f286 + f284; f371 = MUL_F(FRAC_CONST(0.4436129715409088), f286); f372 = MUL_F(FRAC_CONST(0.4496113296546065), f370); f373 = MUL_C(COEF_CONST(1.3428356308501219), f284); y[22] = f371 + f372; y[9] = f373 - f372; f376 = f290 + f288; f377 = MUL_F(FRAC_CONST(0.5730977622997509), f290); f378 = MUL_F(FRAC_CONST(0.3598950365349881), f376); f379 = MUL_C(COEF_CONST(1.2928878353697271), f288); y[24] = f377 + f378; y[7] = f379 - f378; f382 = f294 + f292; f383 = MUL_F(FRAC_CONST(0.6970633083205415), f294); f384 = MUL_F(FRAC_CONST(0.2667127574748984), f382); f385 = MUL_C(COEF_CONST(1.2304888232703382), f292); y[26] = f383 + f384; y[5] = f385 - f384; f388 = f298 + f296; f389 = MUL_F(FRAC_CONST(0.8143157536286401), f298); f390 = MUL_F(FRAC_CONST(0.1709618887603012), f388); f391 = MUL_C(COEF_CONST(1.1562395311492424), f296); y[28] = f389 + f390; y[3] = f391 - f390; f394 = f302 + f300; f395 = MUL_F(FRAC_CONST(0.9237258930790228), f302); f396 = MUL_F(FRAC_CONST(0.0735645635996674), f394); f397 = MUL_C(COEF_CONST(1.0708550202783576), f300); y[30] = f395 + f396; y[1] = f397 - f396; } void DST4_32(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9; real_t f10, f11, f12, f13, f14, f15, f16, f17, f18, f19; real_t f20, f21, f22, f23, f24, f25, f26, f27, f28, f29; real_t f30, f31, f32, f33, f34, f35, f36, f37, f38, f39; real_t f40, f41, f42, f43, f44, f45, f46, f47, f48, f49; real_t f50, f51, f52, f53, f54, f55, f56, f57, f58, f59; real_t f60, f61, f62, f63, f64, f65, f66, f67, f68, f69; real_t f70, f71, f72, f73, f74, f75, f76, f77, f78, f79; real_t f80, f81, f82, f83, f84, f85, f86, f87, f88, f89; real_t f90, f91, f92, f93, f94, f95, f96, f97, f98, f99; real_t f100, f101, f102, f103, f104, f105, f106, f107, f108, f109; real_t f110, f111, f112, f113, f114, f115, f116, f117, f118, f119; real_t f120, f121, f122, f123, f124, f125, f126, f127, f128, f129; real_t f130, f131, f132, f133, f134, f135, f136, f137, f138, f139; real_t f140, f141, f142, f143, f144, f145, f146, f147, f148, f149; real_t f150, f151, f152, f153, f154, f155, f156, f157, f158, f159; real_t f160, f161, f162, f163, f164, f165, f166, f167, f168, f169; real_t f170, f171, f172, f173, f174, f175, f176, f177, f178, f179; real_t f180, f181, f182, f183, f184, f185, f186, f187, f188, f189; real_t f190, f191, f192, f193, f194, f195, f196, f197, f198, f199; real_t f200, f201, f202, f203, f204, f205, f206, f207, f208, f209; real_t f210, f211, f212, f213, f214, f215, f216, f217, f218, f219; real_t f220, f221, f222, f223, f224, f225, f226, f227, f228, f229; real_t f230, f231, f232, f233, f234, f235, f236, f237, f238, f239; real_t f240, f241, f242, f243, f244, f245, f246, f247, f248, f249; real_t f250, f251, f252, f253, f254, f255, f256, f257, f258, f259; real_t f260, f261, f262, f263, f264, f265, f266, f267, f268, f269; real_t f270, f271, f272, f273, f274, f275, f276, f277, f278, f279; real_t f280, f281, f282, f283, f284, f285, f286, f287, f288, f289; real_t f290, f291, f292, f293, f294, f295, f296, f297, f298, f299; real_t f300, f301, f302, f303, f304, f305, f306, f307, f308, f309; real_t f310, f311, f312, f313, f314, f315, f316, f317, f318, f319; real_t f320, f321, f322, f323, f324, f325, f326, f327, f328, f329; real_t f330, f331, f332, f333, f334, f335; f0 = x[0] - x[1]; f1 = x[2] - x[1]; f2 = x[2] - x[3]; f3 = x[4] - x[3]; f4 = x[4] - x[5]; f5 = x[6] - x[5]; f6 = x[6] - x[7]; f7 = x[8] - x[7]; f8 = x[8] - x[9]; f9 = x[10] - x[9]; f10 = x[10] - x[11]; f11 = x[12] - x[11]; f12 = x[12] - x[13]; f13 = x[14] - x[13]; f14 = x[14] - x[15]; f15 = x[16] - x[15]; f16 = x[16] - x[17]; f17 = x[18] - x[17]; f18 = x[18] - x[19]; f19 = x[20] - x[19]; f20 = x[20] - x[21]; f21 = x[22] - x[21]; f22 = x[22] - x[23]; f23 = x[24] - x[23]; f24 = x[24] - x[25]; f25 = x[26] - x[25]; f26 = x[26] - x[27]; f27 = x[28] - x[27]; f28 = x[28] - x[29]; f29 = x[30] - x[29]; f30 = x[30] - x[31]; f31 = MUL_F(FRAC_CONST(0.7071067811865476), f15); f32 = x[0] - f31; f33 = x[0] + f31; f34 = f7 + f23; f35 = MUL_C(COEF_CONST(1.3065629648763766), f7); f36 = MUL_F(FRAC_CONST(-0.9238795325112866), f34); f37 = MUL_F(FRAC_CONST(-0.5411961001461967), f23); f38 = f35 + f36; f39 = f37 - f36; f40 = f33 - f39; f41 = f33 + f39; f42 = f32 - f38; f43 = f32 + f38; f44 = f11 - f19; f45 = f11 + f19; f46 = MUL_F(FRAC_CONST(0.7071067811865476), f45); f47 = f3 - f46; f48 = f3 + f46; f49 = MUL_F(FRAC_CONST(0.7071067811865476), f44); f50 = f49 - f27; f51 = f49 + f27; f52 = f51 + f48; f53 = MUL_F(FRAC_CONST(-0.7856949583871021), f51); f54 = MUL_F(FRAC_CONST(0.9807852804032304), f52); f55 = MUL_C(COEF_CONST(1.1758756024193588), f48); f56 = f53 + f54; f57 = f55 - f54; f58 = f50 + f47; f59 = MUL_F(FRAC_CONST(-0.2758993792829430), f50); f60 = MUL_F(FRAC_CONST(0.8314696123025452), f58); f61 = MUL_C(COEF_CONST(1.3870398453221475), f47); f62 = f59 + f60; f63 = f61 - f60; f64 = f41 - f56; f65 = f41 + f56; f66 = f43 - f62; f67 = f43 + f62; f68 = f42 - f63; f69 = f42 + f63; f70 = f40 - f57; f71 = f40 + f57; f72 = f5 - f9; f73 = f5 + f9; f74 = f13 - f17; f75 = f13 + f17; f76 = f21 - f25; f77 = f21 + f25; f78 = MUL_F(FRAC_CONST(0.7071067811865476), f75); f79 = f1 - f78; f80 = f1 + f78; f81 = f73 + f77; f82 = MUL_C(COEF_CONST(1.3065629648763766), f73); f83 = MUL_F(FRAC_CONST(-0.9238795325112866), f81); f84 = MUL_F(FRAC_CONST(-0.5411961001461967), f77); f85 = f82 + f83; f86 = f84 - f83; f87 = f80 - f86; f88 = f80 + f86; f89 = f79 - f85; f90 = f79 + f85; f91 = MUL_F(FRAC_CONST(0.7071067811865476), f74); f92 = f29 - f91; f93 = f29 + f91; f94 = f76 + f72; f95 = MUL_C(COEF_CONST(1.3065629648763766), f76); f96 = MUL_F(FRAC_CONST(-0.9238795325112866), f94); f97 = MUL_F(FRAC_CONST(-0.5411961001461967), f72); f98 = f95 + f96; f99 = f97 - f96; f100 = f93 - f99; f101 = f93 + f99; f102 = f92 - f98; f103 = f92 + f98; f104 = f101 + f88; f105 = MUL_F(FRAC_CONST(-0.8971675863426361), f101); f106 = MUL_F(FRAC_CONST(0.9951847266721968), f104); f107 = MUL_C(COEF_CONST(1.0932018670017576), f88); f108 = f105 + f106; f109 = f107 - f106; f110 = f90 - f103; f111 = MUL_F(FRAC_CONST(-0.6666556584777466), f103); f112 = MUL_F(FRAC_CONST(0.9569403357322089), f110); f113 = MUL_C(COEF_CONST(1.2472250129866713), f90); f114 = f112 - f111; f115 = f113 - f112; f116 = f102 + f89; f117 = MUL_F(FRAC_CONST(-0.4105245275223571), f102); f118 = MUL_F(FRAC_CONST(0.8819212643483549), f116); f119 = MUL_C(COEF_CONST(1.3533180011743529), f89); f120 = f117 + f118; f121 = f119 - f118; f122 = f87 - f100; f123 = MUL_F(FRAC_CONST(-0.1386171691990915), f100); f124 = MUL_F(FRAC_CONST(0.7730104533627370), f122); f125 = MUL_C(COEF_CONST(1.4074037375263826), f87); f126 = f124 - f123; f127 = f125 - f124; f128 = f65 - f108; f129 = f65 + f108; f130 = f67 - f114; f131 = f67 + f114; f132 = f69 - f120; f133 = f69 + f120; f134 = f71 - f126; f135 = f71 + f126; f136 = f70 - f127; f137 = f70 + f127; f138 = f68 - f121; f139 = f68 + f121; f140 = f66 - f115; f141 = f66 + f115; f142 = f64 - f109; f143 = f64 + f109; f144 = f0 + f30; f145 = MUL_C(COEF_CONST(1.0478631305325901), f0); f146 = MUL_F(FRAC_CONST(-0.9987954562051724), f144); f147 = MUL_F(FRAC_CONST(-0.9497277818777548), f30); f148 = f145 + f146; f149 = f147 - f146; f150 = f4 + f26; f151 = MUL_F(FRAC_CONST(1.2130114330978077), f4); f152 = MUL_F(FRAC_CONST(-0.9700312531945440), f150); f153 = MUL_F(FRAC_CONST(-0.7270510732912803), f26); f154 = f151 + f152; f155 = f153 - f152; f156 = f8 + f22; f157 = MUL_C(COEF_CONST(1.3315443865537255), f8); f158 = MUL_F(FRAC_CONST(-0.9039892931234433), f156); f159 = MUL_F(FRAC_CONST(-0.4764341996931612), f22); f160 = f157 + f158; f161 = f159 - f158; f162 = f12 + f18; f163 = MUL_C(COEF_CONST(1.3989068359730781), f12); f164 = MUL_F(FRAC_CONST(-0.8032075314806453), f162); f165 = MUL_F(FRAC_CONST(-0.2075082269882124), f18); f166 = f163 + f164; f167 = f165 - f164; f168 = f16 + f14; f169 = MUL_C(COEF_CONST(1.4125100802019777), f16); f170 = MUL_F(FRAC_CONST(-0.6715589548470187), f168); f171 = MUL_F(FRAC_CONST(0.0693921705079402), f14); f172 = f169 + f170; f173 = f171 - f170; f174 = f20 + f10; f175 = MUL_C(COEF_CONST(1.3718313541934939), f20); f176 = MUL_F(FRAC_CONST(-0.5141027441932219), f174); f177 = MUL_F(FRAC_CONST(0.3436258658070501), f10); f178 = f175 + f176; f179 = f177 - f176; f180 = f24 + f6; f181 = MUL_C(COEF_CONST(1.2784339185752409), f24); f182 = MUL_F(FRAC_CONST(-0.3368898533922200), f180); f183 = MUL_F(FRAC_CONST(0.6046542117908008), f6); f184 = f181 + f182; f185 = f183 - f182; f186 = f28 + f2; f187 = MUL_C(COEF_CONST(1.1359069844201433), f28); f188 = MUL_F(FRAC_CONST(-0.1467304744553624), f186); f189 = MUL_F(FRAC_CONST(0.8424460355094185), f2); f190 = f187 + f188; f191 = f189 - f188; f192 = f149 - f173; f193 = f149 + f173; f194 = f148 - f172; f195 = f148 + f172; f196 = f155 - f179; f197 = f155 + f179; f198 = f154 - f178; f199 = f154 + f178; f200 = f161 - f185; f201 = f161 + f185; f202 = f160 - f184; f203 = f160 + f184; f204 = f167 - f191; f205 = f167 + f191; f206 = f166 - f190; f207 = f166 + f190; f208 = f192 + f194; f209 = MUL_C(COEF_CONST(1.1758756024193588), f192); f210 = MUL_F(FRAC_CONST(-0.9807852804032304), f208); f211 = MUL_F(FRAC_CONST(-0.7856949583871021), f194); f212 = f209 + f210; f213 = f211 - f210; f214 = f196 + f198; f215 = MUL_C(COEF_CONST(1.3870398453221475), f196); f216 = MUL_F(FRAC_CONST(-0.5555702330196022), f214); f217 = MUL_F(FRAC_CONST(0.2758993792829431), f198); f218 = f215 + f216; f219 = f217 - f216; f220 = f200 + f202; f221 = MUL_F(FRAC_CONST(0.7856949583871022), f200); f222 = MUL_F(FRAC_CONST(0.1950903220161283), f220); f223 = MUL_C(COEF_CONST(1.1758756024193586), f202); f224 = f221 + f222; f225 = f223 - f222; f226 = f204 + f206; f227 = MUL_F(FRAC_CONST(-0.2758993792829430), f204); f228 = MUL_F(FRAC_CONST(0.8314696123025452), f226); f229 = MUL_C(COEF_CONST(1.3870398453221475), f206); f230 = f227 + f228; f231 = f229 - f228; f232 = f193 - f201; f233 = f193 + f201; f234 = f195 - f203; f235 = f195 + f203; f236 = f197 - f205; f237 = f197 + f205; f238 = f199 - f207; f239 = f199 + f207; f240 = f213 - f225; f241 = f213 + f225; f242 = f212 - f224; f243 = f212 + f224; f244 = f219 - f231; f245 = f219 + f231; f246 = f218 - f230; f247 = f218 + f230; f248 = f232 + f234; f249 = MUL_C(COEF_CONST(1.3065629648763766), f232); f250 = MUL_F(FRAC_CONST(-0.9238795325112866), f248); f251 = MUL_F(FRAC_CONST(-0.5411961001461967), f234); f252 = f249 + f250; f253 = f251 - f250; f254 = f236 + f238; f255 = MUL_F(FRAC_CONST(0.5411961001461969), f236); f256 = MUL_F(FRAC_CONST(0.3826834323650898), f254); f257 = MUL_C(COEF_CONST(1.3065629648763766), f238); f258 = f255 + f256; f259 = f257 - f256; f260 = f240 + f242; f261 = MUL_C(COEF_CONST(1.3065629648763766), f240); f262 = MUL_F(FRAC_CONST(-0.9238795325112866), f260); f263 = MUL_F(FRAC_CONST(-0.5411961001461967), f242); f264 = f261 + f262; f265 = f263 - f262; f266 = f244 + f246; f267 = MUL_F(FRAC_CONST(0.5411961001461969), f244); f268 = MUL_F(FRAC_CONST(0.3826834323650898), f266); f269 = MUL_C(COEF_CONST(1.3065629648763766), f246); f270 = f267 + f268; f271 = f269 - f268; f272 = f233 - f237; f273 = f233 + f237; f274 = f235 - f239; f275 = f235 + f239; f276 = f253 - f259; f277 = f253 + f259; f278 = f252 - f258; f279 = f252 + f258; f280 = f241 - f245; f281 = f241 + f245; f282 = f243 - f247; f283 = f243 + f247; f284 = f265 - f271; f285 = f265 + f271; f286 = f264 - f270; f287 = f264 + f270; f288 = f272 - f274; f289 = f272 + f274; f290 = MUL_F(FRAC_CONST(0.7071067811865474), f288); f291 = MUL_F(FRAC_CONST(0.7071067811865474), f289); f292 = f276 - f278; f293 = f276 + f278; f294 = MUL_F(FRAC_CONST(0.7071067811865474), f292); f295 = MUL_F(FRAC_CONST(0.7071067811865474), f293); f296 = f280 - f282; f297 = f280 + f282; f298 = MUL_F(FRAC_CONST(0.7071067811865474), f296); f299 = MUL_F(FRAC_CONST(0.7071067811865474), f297); f300 = f284 - f286; f301 = f284 + f286; f302 = MUL_F(FRAC_CONST(0.7071067811865474), f300); f303 = MUL_F(FRAC_CONST(0.7071067811865474), f301); f304 = f129 - f273; f305 = f129 + f273; f306 = f131 - f281; f307 = f131 + f281; f308 = f133 - f285; f309 = f133 + f285; f310 = f135 - f277; f311 = f135 + f277; f312 = f137 - f295; f313 = f137 + f295; f314 = f139 - f303; f315 = f139 + f303; f316 = f141 - f299; f317 = f141 + f299; f318 = f143 - f291; f319 = f143 + f291; f320 = f142 - f290; f321 = f142 + f290; f322 = f140 - f298; f323 = f140 + f298; f324 = f138 - f302; f325 = f138 + f302; f326 = f136 - f294; f327 = f136 + f294; f328 = f134 - f279; f329 = f134 + f279; f330 = f132 - f287; f331 = f132 + f287; f332 = f130 - f283; f333 = f130 + f283; f334 = f128 - f275; f335 = f128 + f275; y[31] = MUL_F(FRAC_CONST(0.5001506360206510), f305); y[30] = MUL_F(FRAC_CONST(0.5013584524464084), f307); y[29] = MUL_F(FRAC_CONST(0.5037887256810443), f309); y[28] = MUL_F(FRAC_CONST(0.5074711720725553), f311); y[27] = MUL_F(FRAC_CONST(0.5124514794082247), f313); y[26] = MUL_F(FRAC_CONST(0.5187927131053328), f315); y[25] = MUL_F(FRAC_CONST(0.5265773151542700), f317); y[24] = MUL_F(FRAC_CONST(0.5359098169079920), f319); y[23] = MUL_F(FRAC_CONST(0.5469204379855088), f321); y[22] = MUL_F(FRAC_CONST(0.5597698129470802), f323); y[21] = MUL_F(FRAC_CONST(0.5746551840326600), f325); y[20] = MUL_F(FRAC_CONST(0.5918185358574165), f327); y[19] = MUL_F(FRAC_CONST(0.6115573478825099), f329); y[18] = MUL_F(FRAC_CONST(0.6342389366884031), f331); y[17] = MUL_F(FRAC_CONST(0.6603198078137061), f333); y[16] = MUL_F(FRAC_CONST(0.6903721282002123), f335); y[15] = MUL_F(FRAC_CONST(0.7251205223771985), f334); y[14] = MUL_F(FRAC_CONST(0.7654941649730891), f332); y[13] = MUL_F(FRAC_CONST(0.8127020908144905), f330); y[12] = MUL_F(FRAC_CONST(0.8683447152233481), f328); y[11] = MUL_F(FRAC_CONST(0.9345835970364075), f326); y[10] = MUL_C(COEF_CONST(1.0144082649970547), f324); y[9] = MUL_C(COEF_CONST(1.1120716205797176), f322); y[8] = MUL_C(COEF_CONST(1.2338327379765710), f320); y[7] = MUL_C(COEF_CONST(1.3892939586328277), f318); y[6] = MUL_C(COEF_CONST(1.5939722833856311), f316); y[5] = MUL_C(COEF_CONST(1.8746759800084078), f314); y[4] = MUL_C(COEF_CONST(2.2820500680051619), f312); y[3] = MUL_C(COEF_CONST(2.9246284281582162), f310); y[2] = MUL_C(COEF_CONST(4.0846110781292477), f308); y[1] = MUL_C(COEF_CONST(6.7967507116736332), f306); y[0] = MUL_R(REAL_CONST(20.3738781672314530), f304); } #ifdef SBR_LOW_POWER void DCT2_16_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f31, f32; real_t f33, f34, f37, f38, f39, f40, f41, f42, f43, f44; real_t f45, f46, f47, f48, f49, f51, f53, f54, f57, f58; real_t f59, f60, f61, f62, f63, f64, f65, f66, f67, f68; real_t f69, f70, f71, f72, f73, f74, f75, f76, f77, f78; real_t f79, f80, f81, f82, f83, f84, f85, f86, f87, f88; real_t f89, f90, f91, f92, f95, f96, f97, f98, f101, f102; real_t f103, f104, f107, f108, f109, f110; f0 = x[0] - x[15]; f1 = x[0] + x[15]; f2 = x[1] - x[14]; f3 = x[1] + x[14]; f4 = x[2] - x[13]; f5 = x[2] + x[13]; f6 = x[3] - x[12]; f7 = x[3] + x[12]; f8 = x[4] - x[11]; f9 = x[4] + x[11]; f10 = x[5] - x[10]; f11 = x[5] + x[10]; f12 = x[6] - x[9]; f13 = x[6] + x[9]; f14 = x[7] - x[8]; f15 = x[7] + x[8]; f16 = f1 - f15; f17 = f1 + f15; f18 = f3 - f13; f19 = f3 + f13; f20 = f5 - f11; f21 = f5 + f11; f22 = f7 - f9; f23 = f7 + f9; f24 = f17 - f23; f25 = f17 + f23; f26 = f19 - f21; f27 = f19 + f21; f28 = f25 - f27; y[0] = f25 + f27; y[8] = MUL_F(f28, FRAC_CONST(0.7071067811865476)); f31 = f24 + f26; f32 = MUL_C(f24, COEF_CONST(1.3065629648763766)); f33 = MUL_F(f31, FRAC_CONST(-0.9238795325112866)); f34 = MUL_F(f26, FRAC_CONST(-0.5411961001461967)); y[12] = f32 + f33; y[4] = f34 - f33; f37 = f16 + f22; f38 = MUL_C(f16, COEF_CONST(1.1758756024193588)); f39 = MUL_F(f37, FRAC_CONST(-0.9807852804032304)); f40 = MUL_F(f22, FRAC_CONST(-0.7856949583871021)); f41 = f38 + f39; f42 = f40 - f39; f43 = f18 + f20; f44 = MUL_C(f18, COEF_CONST(1.3870398453221473)); f45 = MUL_F(f43, FRAC_CONST(-0.8314696123025455)); f46 = MUL_F(f20, FRAC_CONST(-0.2758993792829436)); f47 = f44 + f45; f48 = f46 - f45; f49 = f42 - f48; y[2] = f42 + f48; f51 = MUL_F(f49, FRAC_CONST(0.7071067811865476)); y[14] = f41 - f47; f53 = f41 + f47; f54 = MUL_F(f53, FRAC_CONST(0.7071067811865476)); y[10] = f51 - f54; y[6] = f51 + f54; f57 = f2 - f4; f58 = f2 + f4; f59 = f6 - f8; f60 = f6 + f8; f61 = f10 - f12; f62 = f10 + f12; f63 = MUL_F(f60, FRAC_CONST(0.7071067811865476)); f64 = f0 - f63; f65 = f0 + f63; f66 = f58 + f62; f67 = MUL_C(f58, COEF_CONST(1.3065629648763766)); f68 = MUL_F(f66, FRAC_CONST(-0.9238795325112866)); f69 = MUL_F(f62, FRAC_CONST(-0.5411961001461967)); f70 = f67 + f68; f71 = f69 - f68; f72 = f65 - f71; f73 = f65 + f71; f74 = f64 - f70; f75 = f64 + f70; f76 = MUL_F(f59, FRAC_CONST(0.7071067811865476)); f77 = f14 - f76; f78 = f14 + f76; f79 = f61 + f57; f80 = MUL_C(f61, COEF_CONST(1.3065629648763766)); f81 = MUL_F(f79, FRAC_CONST(-0.9238795325112866)); f82 = MUL_F(f57, FRAC_CONST(-0.5411961001461967)); f83 = f80 + f81; f84 = f82 - f81; f85 = f78 - f84; f86 = f78 + f84; f87 = f77 - f83; f88 = f77 + f83; f89 = f86 + f73; f90 = MUL_F(f86, FRAC_CONST(-0.8971675863426361)); f91 = MUL_F(f89, FRAC_CONST(0.9951847266721968)); f92 = MUL_C(f73, COEF_CONST(1.0932018670017576)); y[1] = f90 + f91; y[15] = f92 - f91; f95 = f75 - f88; f96 = MUL_F(f88, FRAC_CONST(-0.6666556584777466)); f97 = MUL_F(f95, FRAC_CONST(0.9569403357322089)); f98 = MUL_C(f75, COEF_CONST(1.2472250129866713)); y[3] = f97 - f96; y[13] = f98 - f97; f101 = f87 + f74; f102 = MUL_F(f87, FRAC_CONST(-0.4105245275223571)); f103 = MUL_F(f101, FRAC_CONST(0.8819212643483549)); f104 = MUL_C(f74, COEF_CONST(1.3533180011743529)); y[5] = f102 + f103; y[11] = f104 - f103; f107 = f72 - f85; f108 = MUL_F(f85, FRAC_CONST(-0.1386171691990915)); f109 = MUL_F(f107, FRAC_CONST(0.7730104533627370)); f110 = MUL_C(f72, COEF_CONST(1.4074037375263826)); y[7] = f109 - f108; y[9] = f110 - f109; } void DCT4_16(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; real_t f121, f122, f123, f124, f125, f126, f127, f128, f130, f132; real_t f134, f136, f138, f140, f142, f144, f145, f148, f149, f152; real_t f153, f156, f157; f0 = x[0] + x[15]; f1 = MUL_C(COEF_CONST(1.0478631305325901), x[0]); f2 = MUL_F(FRAC_CONST(-0.9987954562051724), f0); f3 = MUL_F(FRAC_CONST(-0.9497277818777548), x[15]); f4 = f1 + f2; f5 = f3 - f2; f6 = x[2] + x[13]; f7 = MUL_C(COEF_CONST(1.2130114330978077), x[2]); f8 = MUL_F(FRAC_CONST(-0.9700312531945440), f6); f9 = MUL_F(FRAC_CONST(-0.7270510732912803), x[13]); f10 = f7 + f8; f11 = f9 - f8; f12 = x[4] + x[11]; f13 = MUL_C(COEF_CONST(1.3315443865537255), x[4]); f14 = MUL_F(FRAC_CONST(-0.9039892931234433), f12); f15 = MUL_F(FRAC_CONST(-0.4764341996931612), x[11]); f16 = f13 + f14; f17 = f15 - f14; f18 = x[6] + x[9]; f19 = MUL_C(COEF_CONST(1.3989068359730781), x[6]); f20 = MUL_F(FRAC_CONST(-0.8032075314806453), f18); f21 = MUL_F(FRAC_CONST(-0.2075082269882124), x[9]); f22 = f19 + f20; f23 = f21 - f20; f24 = x[8] + x[7]; f25 = MUL_C(COEF_CONST(1.4125100802019777), x[8]); f26 = MUL_F(FRAC_CONST(-0.6715589548470187), f24); f27 = MUL_F(FRAC_CONST(0.0693921705079402), x[7]); f28 = f25 + f26; f29 = f27 - f26; f30 = x[10] + x[5]; f31 = MUL_C(COEF_CONST(1.3718313541934939), x[10]); f32 = MUL_F(FRAC_CONST(-0.5141027441932219), f30); f33 = MUL_F(FRAC_CONST(0.3436258658070501), x[5]); f34 = f31 + f32; f35 = f33 - f32; f36 = x[12] + x[3]; f37 = MUL_C(COEF_CONST(1.2784339185752409), x[12]); f38 = MUL_F(FRAC_CONST(-0.3368898533922200), f36); f39 = MUL_F(FRAC_CONST(0.6046542117908008), x[3]); f40 = f37 + f38; f41 = f39 - f38; f42 = x[14] + x[1]; f43 = MUL_C(COEF_CONST(1.1359069844201433), x[14]); f44 = MUL_F(FRAC_CONST(-0.1467304744553624), f42); f45 = MUL_F(FRAC_CONST(0.8424460355094185), x[1]); f46 = f43 + f44; f47 = f45 - f44; f48 = f5 - f29; f49 = f5 + f29; f50 = f4 - f28; f51 = f4 + f28; f52 = f11 - f35; f53 = f11 + f35; f54 = f10 - f34; f55 = f10 + f34; f56 = f17 - f41; f57 = f17 + f41; f58 = f16 - f40; f59 = f16 + f40; f60 = f23 - f47; f61 = f23 + f47; f62 = f22 - f46; f63 = f22 + f46; f64 = f48 + f50; f65 = MUL_C(COEF_CONST(1.1758756024193588), f48); f66 = MUL_F(FRAC_CONST(-0.9807852804032304), f64); f67 = MUL_F(FRAC_CONST(-0.7856949583871021), f50); f68 = f65 + f66; f69 = f67 - f66; f70 = f52 + f54; f71 = MUL_C(COEF_CONST(1.3870398453221475), f52); f72 = MUL_F(FRAC_CONST(-0.5555702330196022), f70); f73 = MUL_F(FRAC_CONST(0.2758993792829431), f54); f74 = f71 + f72; f75 = f73 - f72; f76 = f56 + f58; f77 = MUL_F(FRAC_CONST(0.7856949583871022), f56); f78 = MUL_F(FRAC_CONST(0.1950903220161283), f76); f79 = MUL_C(COEF_CONST(1.1758756024193586), f58); f80 = f77 + f78; f81 = f79 - f78; f82 = f60 + f62; f83 = MUL_F(FRAC_CONST(-0.2758993792829430), f60); f84 = MUL_F(FRAC_CONST(0.8314696123025452), f82); f85 = MUL_C(COEF_CONST(1.3870398453221475), f62); f86 = f83 + f84; f87 = f85 - f84; f88 = f49 - f57; f89 = f49 + f57; f90 = f51 - f59; f91 = f51 + f59; f92 = f53 - f61; f93 = f53 + f61; f94 = f55 - f63; f95 = f55 + f63; f96 = f69 - f81; f97 = f69 + f81; f98 = f68 - f80; f99 = f68 + f80; f100 = f75 - f87; f101 = f75 + f87; f102 = f74 - f86; f103 = f74 + f86; f104 = f88 + f90; f105 = MUL_C(COEF_CONST(1.3065629648763766), f88); f106 = MUL_F(FRAC_CONST(-0.9238795325112866), f104); f107 = MUL_F(FRAC_CONST(-0.5411961001461967), f90); f108 = f105 + f106; f109 = f107 - f106; f110 = f92 + f94; f111 = MUL_F(FRAC_CONST(0.5411961001461969), f92); f112 = MUL_F(FRAC_CONST(0.3826834323650898), f110); f113 = MUL_C(COEF_CONST(1.3065629648763766), f94); f114 = f111 + f112; f115 = f113 - f112; f116 = f96 + f98; f117 = MUL_C(COEF_CONST(1.3065629648763766), f96); f118 = MUL_F(FRAC_CONST(-0.9238795325112866), f116); f119 = MUL_F(FRAC_CONST(-0.5411961001461967), f98); f120 = f117 + f118; f121 = f119 - f118; f122 = f100 + f102; f123 = MUL_F(FRAC_CONST(0.5411961001461969), f100); f124 = MUL_F(FRAC_CONST(0.3826834323650898), f122); f125 = MUL_C(COEF_CONST(1.3065629648763766), f102); f126 = f123 + f124; f127 = f125 - f124; f128 = f89 - f93; y[0] = f89 + f93; f130 = f91 - f95; y[15] = f91 + f95; f132 = f109 - f115; y[3] = f109 + f115; f134 = f108 - f114; y[12] = f108 + f114; f136 = f97 - f101; y[1] = f97 + f101; f138 = f99 - f103; y[14] = f99 + f103; f140 = f121 - f127; y[2] = f121 + f127; f142 = f120 - f126; y[13] = f120 + f126; f144 = f128 - f130; f145 = f128 + f130; y[8] = MUL_F(FRAC_CONST(0.7071067811865474), f144); y[7] = MUL_F(FRAC_CONST(0.7071067811865474), f145); f148 = f132 - f134; f149 = f132 + f134; y[11] = MUL_F(FRAC_CONST(0.7071067811865474), f148); y[4] = MUL_F(FRAC_CONST(0.7071067811865474), f149); f152 = f136 - f138; f153 = f136 + f138; y[9] = MUL_F(FRAC_CONST(0.7071067811865474), f152); y[6] = MUL_F(FRAC_CONST(0.7071067811865474), f153); f156 = f140 - f142; f157 = f140 + f142; y[10] = MUL_F(FRAC_CONST(0.7071067811865474), f156); y[5] = MUL_F(FRAC_CONST(0.7071067811865474), f157); } void DCT3_32_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; real_t f271, f272; f0 = MUL_F(x[16], FRAC_CONST(0.7071067811865476)); f1 = x[0] - f0; f2 = x[0] + f0; f3 = x[8] + x[24]; f4 = MUL_C(x[8], COEF_CONST(1.3065629648763766)); f5 = MUL_F(f3, FRAC_CONST((-0.9238795325112866))); f6 = MUL_F(x[24], FRAC_CONST((-0.5411961001461967))); f7 = f4 + f5; f8 = f6 - f5; f9 = f2 - f8; f10 = f2 + f8; f11 = f1 - f7; f12 = f1 + f7; f13 = x[4] + x[28]; f14 = MUL_C(x[4], COEF_CONST(1.1758756024193588)); f15 = MUL_F(f13, FRAC_CONST((-0.9807852804032304))); f16 = MUL_F(x[28], FRAC_CONST((-0.7856949583871021))); f17 = f14 + f15; f18 = f16 - f15; f19 = x[12] + x[20]; f20 = MUL_C(x[12], COEF_CONST(1.3870398453221473)); f21 = MUL_F(f19, FRAC_CONST((-0.8314696123025455))); f22 = MUL_F(x[20], FRAC_CONST((-0.2758993792829436))); f23 = f20 + f21; f24 = f22 - f21; f25 = f18 - f24; f26 = f18 + f24; f27 = MUL_F(f25, FRAC_CONST(0.7071067811865476)); f28 = f17 - f23; f29 = f17 + f23; f30 = MUL_F(f29, FRAC_CONST(0.7071067811865476)); f31 = f27 - f30; f32 = f27 + f30; f33 = f10 - f26; f34 = f10 + f26; f35 = f12 - f32; f36 = f12 + f32; f37 = f11 - f31; f38 = f11 + f31; f39 = f9 - f28; f40 = f9 + f28; f41 = x[2] + x[30]; f42 = MUL_C(x[2], COEF_CONST(1.0932018670017569)); f43 = MUL_F(f41, FRAC_CONST((-0.9951847266721969))); f44 = MUL_F(x[30], FRAC_CONST((-0.8971675863426368))); f45 = f42 + f43; f46 = f44 - f43; f47 = x[6] + x[26]; f48 = MUL_C(x[6], COEF_CONST(1.2472250129866711)); f49 = MUL_F(f47, FRAC_CONST((-0.9569403357322089))); f50 = MUL_F(x[26], FRAC_CONST((-0.6666556584777469))); f51 = f48 + f49; f52 = f50 - f49; f53 = x[10] + x[22]; f54 = MUL_C(x[10], COEF_CONST(1.3533180011743526)); f55 = MUL_F(f53, FRAC_CONST((-0.8819212643483551))); f56 = MUL_F(x[22], FRAC_CONST((-0.4105245275223575))); f57 = f54 + f55; f58 = f56 - f55; f59 = x[14] + x[18]; f60 = MUL_C(x[14], COEF_CONST(1.4074037375263826)); f61 = MUL_F(f59, FRAC_CONST((-0.7730104533627369))); f62 = MUL_F(x[18], FRAC_CONST((-0.1386171691990913))); f63 = f60 + f61; f64 = f62 - f61; f65 = f46 - f64; f66 = f46 + f64; f67 = f52 - f58; f68 = f52 + f58; f69 = f66 - f68; f70 = f66 + f68; f71 = MUL_F(f69, FRAC_CONST(0.7071067811865476)); f72 = f65 + f67; f73 = MUL_C(f65, COEF_CONST(1.3065629648763766)); f74 = MUL_F(f72, FRAC_CONST((-0.9238795325112866))); f75 = MUL_F(f67, FRAC_CONST((-0.5411961001461967))); f76 = f73 + f74; f77 = f75 - f74; f78 = f45 - f63; f79 = f45 + f63; f80 = f51 - f57; f81 = f51 + f57; f82 = f79 + f81; f83 = MUL_C(f79, COEF_CONST(1.3065629648763770)); f84 = MUL_F(f82, FRAC_CONST((-0.3826834323650904))); f85 = MUL_F(f81, FRAC_CONST(0.5411961001461961)); f86 = f83 + f84; f87 = f85 - f84; f88 = f78 - f80; f89 = f78 + f80; f90 = MUL_F(f89, FRAC_CONST(0.7071067811865476)); f91 = f77 - f87; f92 = f77 + f87; f93 = f71 - f90; f94 = f71 + f90; f95 = f76 - f86; f96 = f76 + f86; f97 = f34 - f70; f98 = f34 + f70; f99 = f36 - f92; f100 = f36 + f92; f101 = f38 - f91; f102 = f38 + f91; f103 = f40 - f94; f104 = f40 + f94; f105 = f39 - f93; f106 = f39 + f93; f107 = f37 - f96; f108 = f37 + f96; f109 = f35 - f95; f110 = f35 + f95; f111 = f33 - f88; f112 = f33 + f88; f113 = x[1] + x[31]; f114 = MUL_C(x[1], COEF_CONST(1.0478631305325901)); f115 = MUL_F(f113, FRAC_CONST((-0.9987954562051724))); f116 = MUL_F(x[31], FRAC_CONST((-0.9497277818777548))); f117 = f114 + f115; f118 = f116 - f115; f119 = x[5] + x[27]; f120 = MUL_C(x[5], COEF_CONST(1.2130114330978077)); f121 = MUL_F(f119, FRAC_CONST((-0.9700312531945440))); f122 = MUL_F(x[27], FRAC_CONST((-0.7270510732912803))); f123 = f120 + f121; f124 = f122 - f121; f125 = x[9] + x[23]; f126 = MUL_C(x[9], COEF_CONST(1.3315443865537255)); f127 = MUL_F(f125, FRAC_CONST((-0.9039892931234433))); f128 = MUL_F(x[23], FRAC_CONST((-0.4764341996931612))); f129 = f126 + f127; f130 = f128 - f127; f131 = x[13] + x[19]; f132 = MUL_C(x[13], COEF_CONST(1.3989068359730781)); f133 = MUL_F(f131, FRAC_CONST((-0.8032075314806453))); f134 = MUL_F(x[19], FRAC_CONST((-0.2075082269882124))); f135 = f132 + f133; f136 = f134 - f133; f137 = x[17] + x[15]; f138 = MUL_C(x[17], COEF_CONST(1.4125100802019777)); f139 = MUL_F(f137, FRAC_CONST((-0.6715589548470187))); f140 = MUL_F(x[15], FRAC_CONST(0.0693921705079402)); f141 = f138 + f139; f142 = f140 - f139; f143 = x[21] + x[11]; f144 = MUL_C(x[21], COEF_CONST(1.3718313541934939)); f145 = MUL_F(f143, FRAC_CONST((-0.5141027441932219))); f146 = MUL_F(x[11], FRAC_CONST(0.3436258658070501)); f147 = f144 + f145; f148 = f146 - f145; f149 = x[25] + x[7]; f150 = MUL_C(x[25], COEF_CONST(1.2784339185752409)); f151 = MUL_F(f149, FRAC_CONST((-0.3368898533922200))); f152 = MUL_F(x[7], FRAC_CONST(0.6046542117908008)); f153 = f150 + f151; f154 = f152 - f151; f155 = x[29] + x[3]; f156 = MUL_C(x[29], COEF_CONST(1.1359069844201433)); f157 = MUL_F(f155, FRAC_CONST((-0.1467304744553624))); f158 = MUL_F(x[3], FRAC_CONST(0.8424460355094185)); f159 = f156 + f157; f160 = f158 - f157; f161 = f118 - f142; f162 = f118 + f142; f163 = f117 - f141; f164 = f117 + f141; f165 = f124 - f148; f166 = f124 + f148; f167 = f123 - f147; f168 = f123 + f147; f169 = f130 - f154; f170 = f130 + f154; f171 = f129 - f153; f172 = f129 + f153; f173 = f136 - f160; f174 = f136 + f160; f175 = f135 - f159; f176 = f135 + f159; f177 = f161 + f163; f178 = MUL_C(f161, COEF_CONST(1.1758756024193588)); f179 = MUL_F(f177, FRAC_CONST((-0.9807852804032304))); f180 = MUL_F(f163, FRAC_CONST((-0.7856949583871021))); f181 = f178 + f179; f182 = f180 - f179; f183 = f165 + f167; f184 = MUL_C(f165, COEF_CONST(1.3870398453221475)); f185 = MUL_F(f183, FRAC_CONST((-0.5555702330196022))); f186 = MUL_F(f167, FRAC_CONST(0.2758993792829431)); f187 = f184 + f185; f188 = f186 - f185; f189 = f169 + f171; f190 = MUL_F(f169, FRAC_CONST(0.7856949583871022)); f191 = MUL_F(f189, FRAC_CONST(0.1950903220161283)); f192 = MUL_C(f171, COEF_CONST(1.1758756024193586)); f193 = f190 + f191; f194 = f192 - f191; f195 = f173 + f175; f196 = MUL_F(f173, FRAC_CONST((-0.2758993792829430))); f197 = MUL_F(f195, FRAC_CONST(0.8314696123025452)); f198 = MUL_C(f175, COEF_CONST(1.3870398453221475)); f199 = f196 + f197; f200 = f198 - f197; f201 = f162 - f170; f202 = f162 + f170; f203 = f164 - f172; f204 = f164 + f172; f205 = f166 - f174; f206 = f166 + f174; f207 = f168 - f176; f208 = f168 + f176; f209 = f182 - f194; f210 = f182 + f194; f211 = f181 - f193; f212 = f181 + f193; f213 = f188 - f200; f214 = f188 + f200; f215 = f187 - f199; f216 = f187 + f199; f217 = f201 + f203; f218 = MUL_C(f201, COEF_CONST(1.3065629648763766)); f219 = MUL_F(f217, FRAC_CONST((-0.9238795325112866))); f220 = MUL_F(f203, FRAC_CONST((-0.5411961001461967))); f221 = f218 + f219; f222 = f220 - f219; f223 = f205 + f207; f224 = MUL_F(f205, FRAC_CONST(0.5411961001461969)); f225 = MUL_F(f223, FRAC_CONST(0.3826834323650898)); f226 = MUL_C(f207, COEF_CONST(1.3065629648763766)); f227 = f224 + f225; f228 = f226 - f225; f229 = f209 + f211; f230 = MUL_C(f209, COEF_CONST(1.3065629648763766)); f231 = MUL_F(f229, FRAC_CONST((-0.9238795325112866))); f232 = MUL_F(f211, FRAC_CONST((-0.5411961001461967))); f233 = f230 + f231; f234 = f232 - f231; f235 = f213 + f215; f236 = MUL_F(f213, FRAC_CONST(0.5411961001461969)); f237 = MUL_F(f235, FRAC_CONST(0.3826834323650898)); f238 = MUL_C(f215, COEF_CONST(1.3065629648763766)); f239 = f236 + f237; f240 = f238 - f237; f241 = f202 - f206; f242 = f202 + f206; f243 = f204 - f208; f244 = f204 + f208; f245 = f222 - f228; f246 = f222 + f228; f247 = f221 - f227; f248 = f221 + f227; f249 = f210 - f214; f250 = f210 + f214; f251 = f212 - f216; f252 = f212 + f216; f253 = f234 - f240; f254 = f234 + f240; f255 = f233 - f239; f256 = f233 + f239; f257 = f241 - f243; f258 = f241 + f243; f259 = MUL_F(f257, FRAC_CONST(0.7071067811865474)); f260 = MUL_F(f258, FRAC_CONST(0.7071067811865474)); f261 = f245 - f247; f262 = f245 + f247; f263 = MUL_F(f261, FRAC_CONST(0.7071067811865474)); f264 = MUL_F(f262, FRAC_CONST(0.7071067811865474)); f265 = f249 - f251; f266 = f249 + f251; f267 = MUL_F(f265, FRAC_CONST(0.7071067811865474)); f268 = MUL_F(f266, FRAC_CONST(0.7071067811865474)); f269 = f253 - f255; f270 = f253 + f255; f271 = MUL_F(f269, FRAC_CONST(0.7071067811865474)); f272 = MUL_F(f270, FRAC_CONST(0.7071067811865474)); y[31] = f98 - f242; y[0] = f98 + f242; y[30] = f100 - f250; y[1] = f100 + f250; y[29] = f102 - f254; y[2] = f102 + f254; y[28] = f104 - f246; y[3] = f104 + f246; y[27] = f106 - f264; y[4] = f106 + f264; y[26] = f108 - f272; y[5] = f108 + f272; y[25] = f110 - f268; y[6] = f110 + f268; y[24] = f112 - f260; y[7] = f112 + f260; y[23] = f111 - f259; y[8] = f111 + f259; y[22] = f109 - f267; y[9] = f109 + f267; y[21] = f107 - f271; y[10] = f107 + f271; y[20] = f105 - f263; y[11] = f105 + f263; y[19] = f103 - f248; y[12] = f103 + f248; y[18] = f101 - f256; y[13] = f101 + f256; y[17] = f99 - f252; y[14] = f99 + f252; y[16] = f97 - f244; y[15] = f97 + f244; } void DCT2_32_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f63, f64, f65, f66, f69, f70, f71, f72, f73, f74; real_t f75, f76, f77, f78, f79, f80, f81, f83, f85, f86; real_t f89, f90, f91, f92, f93, f94, f95, f96, f97, f98; real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108; real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118; real_t f119, f120, f121, f122, f123, f124, f127, f128, f129, f130; real_t f133, f134, f135, f136, f139, f140, f141, f142, f145, f146; real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156; real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166; real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176; real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186; real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196; real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206; real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216; real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226; real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236; real_t f237, f238, f239, f240, f241, f242, f243, f244, f247, f248; real_t f249, f250, f253, f254, f255, f256, f259, f260, f261, f262; real_t f265, f266, f267, f268, f271, f272, f273, f274, f277, f278; real_t f279, f280, f283, f284, f285, f286; f0 = x[0] - x[31]; f1 = x[0] + x[31]; f2 = x[1] - x[30]; f3 = x[1] + x[30]; f4 = x[2] - x[29]; f5 = x[2] + x[29]; f6 = x[3] - x[28]; f7 = x[3] + x[28]; f8 = x[4] - x[27]; f9 = x[4] + x[27]; f10 = x[5] - x[26]; f11 = x[5] + x[26]; f12 = x[6] - x[25]; f13 = x[6] + x[25]; f14 = x[7] - x[24]; f15 = x[7] + x[24]; f16 = x[8] - x[23]; f17 = x[8] + x[23]; f18 = x[9] - x[22]; f19 = x[9] + x[22]; f20 = x[10] - x[21]; f21 = x[10] + x[21]; f22 = x[11] - x[20]; f23 = x[11] + x[20]; f24 = x[12] - x[19]; f25 = x[12] + x[19]; f26 = x[13] - x[18]; f27 = x[13] + x[18]; f28 = x[14] - x[17]; f29 = x[14] + x[17]; f30 = x[15] - x[16]; f31 = x[15] + x[16]; f32 = f1 - f31; f33 = f1 + f31; f34 = f3 - f29; f35 = f3 + f29; f36 = f5 - f27; f37 = f5 + f27; f38 = f7 - f25; f39 = f7 + f25; f40 = f9 - f23; f41 = f9 + f23; f42 = f11 - f21; f43 = f11 + f21; f44 = f13 - f19; f45 = f13 + f19; f46 = f15 - f17; f47 = f15 + f17; f48 = f33 - f47; f49 = f33 + f47; f50 = f35 - f45; f51 = f35 + f45; f52 = f37 - f43; f53 = f37 + f43; f54 = f39 - f41; f55 = f39 + f41; f56 = f49 - f55; f57 = f49 + f55; f58 = f51 - f53; f59 = f51 + f53; f60 = f57 - f59; y[0] = f57 + f59; y[16] = MUL_F(FRAC_CONST(0.7071067811865476), f60); f63 = f56 + f58; f64 = MUL_C(COEF_CONST(1.3065629648763766), f56); f65 = MUL_F(FRAC_CONST(-0.9238795325112866), f63); f66 = MUL_F(FRAC_CONST(-0.5411961001461967), f58); y[24] = f64 + f65; y[8] = f66 - f65; f69 = f48 + f54; f70 = MUL_C(COEF_CONST(1.1758756024193588), f48); f71 = MUL_F(FRAC_CONST(-0.9807852804032304), f69); f72 = MUL_F(FRAC_CONST(-0.7856949583871021), f54); f73 = f70 + f71; f74 = f72 - f71; f75 = f50 + f52; f76 = MUL_C(COEF_CONST(1.3870398453221473), f50); f77 = MUL_F(FRAC_CONST(-0.8314696123025455), f75); f78 = MUL_F(FRAC_CONST(-0.2758993792829436), f52); f79 = f76 + f77; f80 = f78 - f77; f81 = f74 - f80; y[4] = f74 + f80; f83 = MUL_F(FRAC_CONST(0.7071067811865476), f81); y[28] = f73 - f79; f85 = f73 + f79; f86 = MUL_F(FRAC_CONST(0.7071067811865476), f85); y[20] = f83 - f86; y[12] = f83 + f86; f89 = f34 - f36; f90 = f34 + f36; f91 = f38 - f40; f92 = f38 + f40; f93 = f42 - f44; f94 = f42 + f44; f95 = MUL_F(FRAC_CONST(0.7071067811865476), f92); f96 = f32 - f95; f97 = f32 + f95; f98 = f90 + f94; f99 = MUL_C(COEF_CONST(1.3065629648763766), f90); f100 = MUL_F(FRAC_CONST(-0.9238795325112866), f98); f101 = MUL_F(FRAC_CONST(-0.5411961001461967), f94); f102 = f99 + f100; f103 = f101 - f100; f104 = f97 - f103; f105 = f97 + f103; f106 = f96 - f102; f107 = f96 + f102; f108 = MUL_F(FRAC_CONST(0.7071067811865476), f91); f109 = f46 - f108; f110 = f46 + f108; f111 = f93 + f89; f112 = MUL_C(COEF_CONST(1.3065629648763766), f93); f113 = MUL_F(FRAC_CONST(-0.9238795325112866), f111); f114 = MUL_F(FRAC_CONST(-0.5411961001461967), f89); f115 = f112 + f113; f116 = f114 - f113; f117 = f110 - f116; f118 = f110 + f116; f119 = f109 - f115; f120 = f109 + f115; f121 = f118 + f105; f122 = MUL_F(FRAC_CONST(-0.8971675863426361), f118); f123 = MUL_F(FRAC_CONST(0.9951847266721968), f121); f124 = MUL_C(COEF_CONST(1.0932018670017576), f105); y[2] = f122 + f123; y[30] = f124 - f123; f127 = f107 - f120; f128 = MUL_F(FRAC_CONST(-0.6666556584777466), f120); f129 = MUL_F(FRAC_CONST(0.9569403357322089), f127); f130 = MUL_C(COEF_CONST(1.2472250129866713), f107); y[6] = f129 - f128; y[26] = f130 - f129; f133 = f119 + f106; f134 = MUL_F(FRAC_CONST(-0.4105245275223571), f119); f135 = MUL_F(FRAC_CONST(0.8819212643483549), f133); f136 = MUL_C(COEF_CONST(1.3533180011743529), f106); y[10] = f134 + f135; y[22] = f136 - f135; f139 = f104 - f117; f140 = MUL_F(FRAC_CONST(-0.1386171691990915), f117); f141 = MUL_F(FRAC_CONST(0.7730104533627370), f139); f142 = MUL_C(COEF_CONST(1.4074037375263826), f104); y[14] = f141 - f140; y[18] = f142 - f141; f145 = f2 - f4; f146 = f2 + f4; f147 = f6 - f8; f148 = f6 + f8; f149 = f10 - f12; f150 = f10 + f12; f151 = f14 - f16; f152 = f14 + f16; f153 = f18 - f20; f154 = f18 + f20; f155 = f22 - f24; f156 = f22 + f24; f157 = f26 - f28; f158 = f26 + f28; f159 = MUL_F(FRAC_CONST(0.7071067811865476), f152); f160 = f0 - f159; f161 = f0 + f159; f162 = f148 + f156; f163 = MUL_C(COEF_CONST(1.3065629648763766), f148); f164 = MUL_F(FRAC_CONST(-0.9238795325112866), f162); f165 = MUL_F(FRAC_CONST(-0.5411961001461967), f156); f166 = f163 + f164; f167 = f165 - f164; f168 = f161 - f167; f169 = f161 + f167; f170 = f160 - f166; f171 = f160 + f166; f172 = f146 + f158; f173 = MUL_C(COEF_CONST(1.1758756024193588), f146); f174 = MUL_F(FRAC_CONST(-0.9807852804032304), f172); f175 = MUL_F(FRAC_CONST(-0.7856949583871021), f158); f176 = f173 + f174; f177 = f175 - f174; f178 = f150 + f154; f179 = MUL_C(COEF_CONST(1.3870398453221473), f150); f180 = MUL_F(FRAC_CONST(-0.8314696123025455), f178); f181 = MUL_F(FRAC_CONST(-0.2758993792829436), f154); f182 = f179 + f180; f183 = f181 - f180; f184 = f177 - f183; f185 = f177 + f183; f186 = MUL_F(FRAC_CONST(0.7071067811865476), f184); f187 = f176 - f182; f188 = f176 + f182; f189 = MUL_F(FRAC_CONST(0.7071067811865476), f188); f190 = f186 - f189; f191 = f186 + f189; f192 = f169 - f185; f193 = f169 + f185; f194 = f171 - f191; f195 = f171 + f191; f196 = f170 - f190; f197 = f170 + f190; f198 = f168 - f187; f199 = f168 + f187; f200 = MUL_F(FRAC_CONST(0.7071067811865476), f151); f201 = f30 - f200; f202 = f30 + f200; f203 = f155 + f147; f204 = MUL_C(COEF_CONST(1.3065629648763766), f155); f205 = MUL_F(FRAC_CONST(-0.9238795325112866), f203); f206 = MUL_F(FRAC_CONST(-0.5411961001461967), f147); f207 = f204 + f205; f208 = f206 - f205; f209 = f202 - f208; f210 = f202 + f208; f211 = f201 - f207; f212 = f201 + f207; f213 = f157 + f145; f214 = MUL_C(COEF_CONST(1.1758756024193588), f157); f215 = MUL_F(FRAC_CONST(-0.9807852804032304), f213); f216 = MUL_F(FRAC_CONST(-0.7856949583871021), f145); f217 = f214 + f215; f218 = f216 - f215; f219 = f153 + f149; f220 = MUL_C(COEF_CONST(1.3870398453221473), f153); f221 = MUL_F(FRAC_CONST(-0.8314696123025455), f219); f222 = MUL_F(FRAC_CONST(-0.2758993792829436), f149); f223 = f220 + f221; f224 = f222 - f221; f225 = f218 - f224; f226 = f218 + f224; f227 = MUL_F(FRAC_CONST(0.7071067811865476), f225); f228 = f217 - f223; f229 = f217 + f223; f230 = MUL_F(FRAC_CONST(0.7071067811865476), f229); f231 = f227 - f230; f232 = f227 + f230; f233 = f210 - f226; f234 = f210 + f226; f235 = f212 - f232; f236 = f212 + f232; f237 = f211 - f231; f238 = f211 + f231; f239 = f209 - f228; f240 = f209 + f228; f241 = f234 + f193; f242 = MUL_F(FRAC_CONST(-0.9497277818777543), f234); f243 = MUL_F(FRAC_CONST(0.9987954562051724), f241); f244 = MUL_C(COEF_CONST(1.0478631305325905), f193); y[1] = f242 + f243; y[31] = f244 - f243; f247 = f195 - f236; f248 = MUL_F(FRAC_CONST(-0.8424460355094192), f236); f249 = MUL_F(FRAC_CONST(0.9891765099647810), f247); f250 = MUL_C(COEF_CONST(1.1359069844201428), f195); y[3] = f249 - f248; y[29] = f250 - f249; f253 = f238 + f197; f254 = MUL_F(FRAC_CONST(-0.7270510732912801), f238); f255 = MUL_F(FRAC_CONST(0.9700312531945440), f253); f256 = MUL_C(COEF_CONST(1.2130114330978079), f197); y[5] = f254 + f255; y[27] = f256 - f255; f259 = f199 - f240; f260 = MUL_F(FRAC_CONST(-0.6046542117908007), f240); f261 = MUL_F(FRAC_CONST(0.9415440651830208), f259); f262 = MUL_C(COEF_CONST(1.2784339185752409), f199); y[7] = f261 - f260; y[25] = f262 - f261; f265 = f239 + f198; f266 = MUL_F(FRAC_CONST(-0.4764341996931611), f239); f267 = MUL_F(FRAC_CONST(0.9039892931234433), f265); f268 = MUL_C(COEF_CONST(1.3315443865537255), f198); y[9] = f266 + f267; y[23] = f268 - f267; f271 = f196 - f237; f272 = MUL_F(FRAC_CONST(-0.3436258658070505), f237); f273 = MUL_F(FRAC_CONST(0.8577286100002721), f271); f274 = MUL_C(COEF_CONST(1.3718313541934939), f196); y[11] = f273 - f272; y[21] = f274 - f273; f277 = f235 + f194; f278 = MUL_F(FRAC_CONST(-0.2075082269882114), f235); f279 = MUL_F(FRAC_CONST(0.8032075314806448), f277); f280 = MUL_C(COEF_CONST(1.3989068359730783), f194); y[13] = f278 + f279; y[19] = f280 - f279; f283 = f192 - f233; f284 = MUL_F(FRAC_CONST(-0.0693921705079408), f233); f285 = MUL_F(FRAC_CONST(0.7409511253549591), f283); f286 = MUL_C(COEF_CONST(1.4125100802019774), f192); y[15] = f285 - f284; y[17] = f286 - f285; } #else #define n 32 #define log2n 5 // w_array_real[i] = cos(2*M_PI*i/32) static const real_t w_array_real[] = { FRAC_CONST(1.000000000000000), FRAC_CONST(0.980785279337272), FRAC_CONST(0.923879528329380), FRAC_CONST(0.831469603195765), FRAC_CONST(0.707106765732237), FRAC_CONST(0.555570210304169), FRAC_CONST(0.382683402077046), FRAC_CONST(0.195090284503576), FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090370246552), FRAC_CONST(-0.382683482845162), FRAC_CONST(-0.555570282993553), FRAC_CONST(-0.707106827549476), FRAC_CONST(-0.831469651765257), FRAC_CONST(-0.923879561784627), FRAC_CONST(-0.980785296392607) }; // w_array_imag[i] = sin(-2*M_PI*i/32) static const real_t w_array_imag[] = { FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090327375064), FRAC_CONST(-0.382683442461104), FRAC_CONST(-0.555570246648862), FRAC_CONST(-0.707106796640858), FRAC_CONST(-0.831469627480512), FRAC_CONST(-0.923879545057005), FRAC_CONST(-0.980785287864940), FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.980785270809601), FRAC_CONST(-0.923879511601754), FRAC_CONST(-0.831469578911016), FRAC_CONST(-0.707106734823616), FRAC_CONST(-0.555570173959476), FRAC_CONST(-0.382683361692986), FRAC_CONST(-0.195090241632088) }; // FFT decimation in frequency // 4*16*2+16=128+16=144 multiplications // 6*16*2+10*8+4*16*2=192+80+128=400 additions static void fft_dif(real_t * Real, real_t * Imag) { real_t w_real, w_imag; // For faster access real_t point1_real, point1_imag, point2_real, point2_imag; // For faster access uint32_t j, i, i2, w_index; // Counters // First 2 stages of 32 point FFT decimation in frequency // 4*16*2=64*2=128 multiplications // 6*16*2=96*2=192 additions // Stage 1 of 32 point FFT decimation in frequency for (i = 0; i < 16; i++) { point1_real = Real[i]; point1_imag = Imag[i]; i2 = i+16; point2_real = Real[i2]; point2_imag = Imag[i2]; w_real = w_array_real[i]; w_imag = w_array_imag[i]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); } // Stage 2 of 32 point FFT decimation in frequency for (j = 0, w_index = 0; j < 8; j++, w_index += 2) { w_real = w_array_real[w_index]; w_imag = w_array_imag[w_index]; i = j; point1_real = Real[i]; point1_imag = Imag[i]; i2 = i+8; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); i = j+16; point1_real = Real[i]; point1_imag = Imag[i]; i2 = i+8; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); } // Stage 3 of 32 point FFT decimation in frequency // 2*4*2=16 multiplications // 4*4*2+6*4*2=10*8=80 additions for (i = 0; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // out[i1] = point1 + point2 Real[i] += point2_real; Imag[i] += point2_imag; // out[i2] = point1 - point2 Real[i2] = point1_real - point2_real; Imag[i2] = point1_imag - point2_imag; } w_real = w_array_real[4]; // = sqrt(2)/2 // w_imag = -w_real; // = w_array_imag[4]; // = -sqrt(2)/2 for (i = 1; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = MUL_F(point1_real+point1_imag, w_real); Imag[i2] = MUL_F(point1_imag-point1_real, w_real); } for (i = 2; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // x[i] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * (-i) Real[i2] = point1_imag - point2_imag; Imag[i2] = point2_real - point1_real; } w_real = w_array_real[12]; // = -sqrt(2)/2 // w_imag = w_real; // = w_array_imag[12]; // = -sqrt(2)/2 for (i = 3; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = MUL_F(point1_real-point1_imag, w_real); Imag[i2] = MUL_F(point1_real+point1_imag, w_real); } // Stage 4 of 32 point FFT decimation in frequency (no multiplications) // 16*4=64 additions for (i = 0; i < n; i += 4) { i2 = i+2; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = x[i] - x[i2] Real[i2] = point1_real - point2_real; Imag[i2] = point1_imag - point2_imag; } for (i = 1; i < n; i += 4) { i2 = i+2; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // x[i] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * (-i) Real[i2] = point1_imag - point2_imag; Imag[i2] = point2_real - point1_real; } // Stage 5 of 32 point FFT decimation in frequency (no multiplications) // 16*4=64 additions for (i = 0; i < n; i += 2) { i2 = i+1; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // out[i1] = point1 + point2 Real[i] += point2_real; Imag[i] += point2_imag; // out[i2] = point1 - point2 Real[i2] = point1_real - point2_real; Imag[i2] = point1_imag - point2_imag; } #ifdef REORDER_IN_FFT FFTReorder(Real, Imag); #endif // #ifdef REORDER_IN_FFT } #undef n #undef log2n static const real_t dct4_64_tab[] = { COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507), COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537), COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708), COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462), COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627), COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471), COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592), COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979), COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146), COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291), COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091), COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643), COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127), COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700), COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423), COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828), COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626), COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974), COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658), COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784), COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981), COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980), COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093), COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162), COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640), COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904), COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420), COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944), COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476), COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670), COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128), COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182), COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388), COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101), COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759), COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140), COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596), COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318), COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446), COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152), COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704), COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322), COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238), COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981), COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577), COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592), COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960), COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205), COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734), COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526), COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092), COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721), COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959), COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014), COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227), COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424), COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756), COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734), COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437), COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838), COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899), COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223), COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439), COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320), COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086), COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159), COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605), COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942), COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475), COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740), COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961), COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470), COEF_CONST(0), COEF_CONST(-1.412510156631470), COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961), COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740), COEF_CONST(-1.353317975997925), COEF_CONST(-1.331544399261475), COEF_CONST(-1.306562900543213), COEF_CONST(-1.278433918952942), COEF_CONST(-1.247225046157837), COEF_CONST(-1.213011384010315), COEF_CONST(-1.175875544548035), COEF_CONST(-1.135907053947449), COEF_CONST(-1.093201875686646), COEF_CONST(-1.047863125801086), COEF_CONST(-1.000000000000000), COEF_CONST(-0.949727773666382), COEF_CONST(-0.897167563438416), COEF_CONST(-0.842446029186249), COEF_CONST(-0.785694956779480), COEF_CONST(-0.727051079273224), COEF_CONST(-0.666655659675598), COEF_CONST(-0.604654192924500), COEF_CONST(-0.541196048259735), COEF_CONST(-0.476434230804443), COEF_CONST(-0.410524487495422), COEF_CONST(-0.343625843524933), COEF_CONST(-0.275899350643158), COEF_CONST(-0.207508206367493), COEF_CONST(-0.138617098331451), COEF_CONST(-0.069392144680023), COEF_CONST(0), COEF_CONST(0.069392263889313), COEF_CONST(0.138617157936096), COEF_CONST(0.207508206367493), COEF_CONST(0.275899469852448), COEF_CONST(0.343625962734222), COEF_CONST(0.410524636507034), COEF_CONST(0.476434201002121), COEF_CONST(0.541196107864380), COEF_CONST(0.604654192924500), COEF_CONST(0.666655719280243), COEF_CONST(0.727051138877869), COEF_CONST(0.785695075988770), COEF_CONST(0.842446029186249), COEF_CONST(0.897167563438416), COEF_CONST(0.949727773666382) }; /* size 64 only! */ void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag) { // Tables with bit reverse values for 5 bits, bit reverse of i at i-th position const uint8_t bit_rev_tab[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 }; uint32_t i, i_rev; /* Step 2: modulate */ // 3*32=96 multiplications // 3*32=96 additions for (i = 0; i < 32; i++) { real_t x_re, x_im, tmp; x_re = in_real[i]; x_im = in_imag[i]; tmp = MUL_C(x_re + x_im, dct4_64_tab[i]); in_real[i] = MUL_C(x_im, dct4_64_tab[i + 64]) + tmp; in_imag[i] = MUL_C(x_re, dct4_64_tab[i + 32]) + tmp; } /* Step 3: FFT, but with output in bit reverse order */ fft_dif(in_real, in_imag); /* Step 4: modulate + bitreverse reordering */ // 3*31+2=95 multiplications // 3*31+2=95 additions for (i = 0; i < 16; i++) { real_t x_re, x_im, tmp; i_rev = bit_rev_tab[i]; x_re = in_real[i_rev]; x_im = in_imag[i_rev]; tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; } // i = 16, i_rev = 1 = rev(16); out_imag[16] = MUL_C(in_imag[1] - in_real[1], dct4_64_tab[16 + 3*32]); out_real[16] = MUL_C(in_real[1] + in_imag[1], dct4_64_tab[16 + 3*32]); for (i = 17; i < 32; i++) { real_t x_re, x_im, tmp; i_rev = bit_rev_tab[i]; x_re = in_real[i_rev]; x_im = in_imag[i_rev]; tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; } } #endif #endif faad2-2_10_0/libfaad/sbr_dct.h000066400000000000000000000033361374350120500160710ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_dct.h,v 1.19 2007/11/01 12:33:34 menno Exp $ **/ #ifndef __SBR_DCT_H__ #define __SBR_DCT_H__ #ifdef __cplusplus extern "C" { #endif void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag); void DCT3_32_unscaled(real_t *y, real_t *x); void DCT4_32(real_t *y, real_t *x); void DST4_32(real_t *y, real_t *x); void DCT2_32_unscaled(real_t *y, real_t *x); void DCT4_16(real_t *y, real_t *x); void DCT2_16_unscaled(real_t *y, real_t *x); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_dec.c000066400000000000000000000441241374350120500160450ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_dec.c,v 1.44 2009/01/26 22:32:31 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include #include #include "syntax.h" #include "bits.h" #include "sbr_syntax.h" #include "sbr_qmf.h" #include "sbr_hfgen.h" #include "sbr_hfadj.h" /* static function declarations */ static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch); static void sbr_save_matrix(sbr_info *sbr, uint8_t ch); sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, uint32_t sample_rate, uint8_t downSampledSBR #ifdef DRM , uint8_t IsDRM #endif ) { sbr_info *sbr = faad_malloc(sizeof(sbr_info)); memset(sbr, 0, sizeof(sbr_info)); /* save id of the parent element */ sbr->id_aac = id_aac; sbr->sample_rate = sample_rate; sbr->bs_freq_scale = 2; sbr->bs_alter_scale = 1; sbr->bs_noise_bands = 2; sbr->bs_limiter_bands = 2; sbr->bs_limiter_gains = 2; sbr->bs_interpol_freq = 1; sbr->bs_smoothing_mode = 1; sbr->bs_start_freq = 5; sbr->bs_amp_res = 1; sbr->bs_samplerate_mode = 1; sbr->prevEnvIsShort[0] = -1; sbr->prevEnvIsShort[1] = -1; sbr->header_count = 0; sbr->Reset = 1; #ifdef DRM sbr->Is_DRM_SBR = IsDRM; #endif sbr->tHFGen = T_HFGEN; sbr->tHFAdj = T_HFADJ; sbr->bsco = 0; sbr->bsco_prev = 0; sbr->M_prev = 0; sbr->frame_len = framelength; /* force sbr reset */ sbr->bs_start_freq_prev = -1; if (framelength == 960) { sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960; sbr->numTimeSlots = NO_TIME_SLOTS_960; } else if (framelength == 1024) { sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS; sbr->numTimeSlots = NO_TIME_SLOTS; } else { faad_free(sbr); return NULL; } sbr->GQ_ringbuf_index[0] = 0; sbr->GQ_ringbuf_index[1] = 0; if (id_aac == ID_CPE) { /* stereo */ uint8_t j; sbr->qmfa[0] = qmfa_init(32); sbr->qmfa[1] = qmfa_init(32); sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); for (j = 0; j < 5; j++) { sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); sbr->G_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); sbr->Q_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); } memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); } else { /* mono */ uint8_t j; sbr->qmfa[0] = qmfa_init(32); sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); sbr->qmfs[1] = NULL; for (j = 0; j < 5; j++) { sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); } memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); } return sbr; } void sbrDecodeEnd(sbr_info *sbr) { uint8_t j; if (sbr) { qmfa_end(sbr->qmfa[0]); qmfs_end(sbr->qmfs[0]); if (sbr->qmfs[1] != NULL) { qmfa_end(sbr->qmfa[1]); qmfs_end(sbr->qmfs[1]); } for (j = 0; j < 5; j++) { if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]); if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]); if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]); if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]); } #ifdef PS_DEC if (sbr->ps != NULL) ps_free(sbr->ps); #endif #ifdef DRM_PS if (sbr->drm_ps != NULL) drm_ps_free(sbr->drm_ps); #endif faad_free(sbr); } } void sbrReset(sbr_info *sbr) { uint8_t j; if (sbr->qmfa[0] != NULL) memset(sbr->qmfa[0]->x, 0, 2 * sbr->qmfa[0]->channels * 10 * sizeof(real_t)); if (sbr->qmfa[1] != NULL) memset(sbr->qmfa[1]->x, 0, 2 * sbr->qmfa[1]->channels * 10 * sizeof(real_t)); if (sbr->qmfs[0] != NULL) memset(sbr->qmfs[0]->v, 0, 2 * sbr->qmfs[0]->channels * 20 * sizeof(real_t)); if (sbr->qmfs[1] != NULL) memset(sbr->qmfs[1]->v, 0, 2 * sbr->qmfs[1]->channels * 20 * sizeof(real_t)); for (j = 0; j < 5; j++) { if (sbr->G_temp_prev[0][j] != NULL) memset(sbr->G_temp_prev[0][j], 0, 64*sizeof(real_t)); if (sbr->G_temp_prev[1][j] != NULL) memset(sbr->G_temp_prev[1][j], 0, 64*sizeof(real_t)); if (sbr->Q_temp_prev[0][j] != NULL) memset(sbr->Q_temp_prev[0][j], 0, 64*sizeof(real_t)); if (sbr->Q_temp_prev[1][j] != NULL) memset(sbr->Q_temp_prev[1][j], 0, 64*sizeof(real_t)); } memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); sbr->GQ_ringbuf_index[0] = 0; sbr->GQ_ringbuf_index[1] = 0; sbr->header_count = 0; sbr->Reset = 1; sbr->L_E_prev[0] = 0; sbr->L_E_prev[1] = 0; sbr->bs_freq_scale = 2; sbr->bs_alter_scale = 1; sbr->bs_noise_bands = 2; sbr->bs_limiter_bands = 2; sbr->bs_limiter_gains = 2; sbr->bs_interpol_freq = 1; sbr->bs_smoothing_mode = 1; sbr->bs_start_freq = 5; sbr->bs_amp_res = 1; sbr->bs_samplerate_mode = 1; sbr->prevEnvIsShort[0] = -1; sbr->prevEnvIsShort[1] = -1; sbr->bsco = 0; sbr->bsco_prev = 0; sbr->M_prev = 0; sbr->bs_start_freq_prev = -1; sbr->f_prev[0] = 0; sbr->f_prev[1] = 0; for (j = 0; j < MAX_M; j++) { sbr->E_prev[0][j] = 0; sbr->Q_prev[0][j] = 0; sbr->E_prev[1][j] = 0; sbr->Q_prev[1][j] = 0; sbr->bs_add_harmonic_prev[0][j] = 0; sbr->bs_add_harmonic_prev[1][j] = 0; } sbr->bs_add_harmonic_flag_prev[0] = 0; sbr->bs_add_harmonic_flag_prev[1] = 0; } static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch) { uint8_t i; /* save data for next frame */ sbr->kx_prev = sbr->kx; sbr->M_prev = sbr->M; sbr->bsco_prev = sbr->bsco; sbr->L_E_prev[ch] = sbr->L_E[ch]; /* sbr->L_E[ch] can become 0 on files with bit errors */ if (sbr->L_E[ch] <= 0) return 19; sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1]; for (i = 0; i < MAX_M; i++) { sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1]; sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1]; } for (i = 0; i < MAX_M; i++) { sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i]; } sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch]; if (sbr->l_A[ch] == sbr->L_E[ch]) sbr->prevEnvIsShort[ch] = 0; else sbr->prevEnvIsShort[ch] = -1; return 0; } static void sbr_save_matrix(sbr_info *sbr, uint8_t ch) { uint8_t i; for (i = 0; i < sbr->tHFGen; i++) { memmove(sbr->Xsbr[ch][i], sbr->Xsbr[ch][i+sbr->numTimeSlotsRate], 64 * sizeof(qmf_t)); } for (i = sbr->tHFGen; i < MAX_NTSRHFG; i++) { memset(sbr->Xsbr[ch][i], 0, 64 * sizeof(qmf_t)); } } static uint8_t sbr_process_channel(sbr_info *sbr, real_t *channel_buf, qmf_t X[MAX_NTSR][64], uint8_t ch, uint8_t dont_process, const uint8_t downSampledSBR) { int16_t k, l; uint8_t ret = 0; #ifdef SBR_LOW_POWER ALIGN real_t deg[64]; #endif #ifdef DRM if (sbr->Is_DRM_SBR) { sbr->bsco = max((int32_t)sbr->maxAACLine*32/(int32_t)sbr->frame_len - (int32_t)sbr->kx, 0); } else { #endif sbr->bsco = 0; #ifdef DRM } #endif //#define PRE_QMF_PRINT #ifdef PRE_QMF_PRINT { int i; for (i = 0; i < 1024; i++) { printf("%d\n", channel_buf[i]); } } #endif /* subband analysis */ if (dont_process) sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, 32); else sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, sbr->kx); if (!dont_process) { #if 1 /* insert high frequencies here */ /* hf generation using patching */ hf_generation(sbr, sbr->Xsbr[ch], sbr->Xsbr[ch] #ifdef SBR_LOW_POWER ,deg #endif ,ch); #endif #if 0 //def SBR_LOW_POWER for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++) { for (k = 0; k < sbr->kx; k++) { QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0; } } #endif #if 1 /* hf adjustment */ ret = hf_adjustment(sbr, sbr->Xsbr[ch] #ifdef SBR_LOW_POWER ,deg #endif ,ch); #endif if (ret > 0) { dont_process = 1; } } if ((sbr->just_seeked != 0) || dont_process) { for (l = 0; l < sbr->numTimeSlotsRate; l++) { for (k = 0; k < 32; k++) { QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); #ifndef SBR_LOW_POWER QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); #endif } for (k = 32; k < 64; k++) { QMF_RE(X[l][k]) = 0; #ifndef SBR_LOW_POWER QMF_IM(X[l][k]) = 0; #endif } } } else { for (l = 0; l < sbr->numTimeSlotsRate; l++) { uint8_t kx_band, M_band, bsco_band; if (l < sbr->t_E[ch][0]) { kx_band = sbr->kx_prev; M_band = sbr->M_prev; bsco_band = sbr->bsco_prev; } else { kx_band = sbr->kx; M_band = sbr->M; bsco_band = sbr->bsco; } #ifndef SBR_LOW_POWER for (k = 0; k < kx_band + bsco_band; k++) { QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); } for (k = kx_band + bsco_band; k < kx_band + M_band; k++) { QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); } for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++) { QMF_RE(X[l][k]) = 0; QMF_IM(X[l][k]) = 0; } #else for (k = 0; k < kx_band + bsco_band; k++) { QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); } for (k = kx_band + bsco_band; k < min(kx_band + M_band, 63); k++) { QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); } for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++) { QMF_RE(X[l][k]) = 0; } QMF_RE(X[l][kx_band - 1 + bsco_band]) += QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][kx_band - 1 + bsco_band]); #endif } } return ret; } uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, const uint8_t just_seeked, const uint8_t downSampledSBR) { uint8_t dont_process = 0; uint8_t ret = 0; ALIGN qmf_t X[MAX_NTSR][64]; if (sbr == NULL) return 20; /* case can occur due to bit errors */ if (sbr->id_aac != ID_CPE) return 21; if (sbr->ret || (sbr->header_count == 0)) { /* don't process just upsample */ dont_process = 1; /* Re-activate reset for next frame */ if (sbr->ret && sbr->Reset) sbr->bs_start_freq_prev = -1; } if (just_seeked) { sbr->just_seeked = 1; } else { sbr->just_seeked = 0; } sbr->ret += sbr_process_channel(sbr, left_chan, X, 0, dont_process, downSampledSBR); /* subband synthesis */ if (downSampledSBR) { sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, left_chan); } else { sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan); } sbr->ret += sbr_process_channel(sbr, right_chan, X, 1, dont_process, downSampledSBR); /* subband synthesis */ if (downSampledSBR) { sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X, right_chan); } else { sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan); } if (sbr->bs_header_flag) sbr->just_seeked = 0; if (sbr->header_count != 0 && sbr->ret == 0) { ret = sbr_save_prev_data(sbr, 0); if (ret) return ret; ret = sbr_save_prev_data(sbr, 1); if (ret) return ret; } sbr_save_matrix(sbr, 0); sbr_save_matrix(sbr, 1); sbr->frame++; //#define POST_QMF_PRINT #ifdef POST_QMF_PRINT { int i; for (i = 0; i < 2048; i++) { printf("%d\n", left_chan[i]); } for (i = 0; i < 2048; i++) { printf("%d\n", right_chan[i]); } } #endif return 0; } uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, const uint8_t just_seeked, const uint8_t downSampledSBR) { uint8_t dont_process = 0; uint8_t ret = 0; ALIGN qmf_t X[MAX_NTSR][64]; if (sbr == NULL) return 20; /* case can occur due to bit errors */ if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) return 21; if (sbr->ret || (sbr->header_count == 0)) { /* don't process just upsample */ dont_process = 1; /* Re-activate reset for next frame */ if (sbr->ret && sbr->Reset) sbr->bs_start_freq_prev = -1; } if (just_seeked) { sbr->just_seeked = 1; } else { sbr->just_seeked = 0; } sbr->ret += sbr_process_channel(sbr, channel, X, 0, dont_process, downSampledSBR); /* subband synthesis */ if (downSampledSBR) { sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, channel); } else { sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel); } if (sbr->bs_header_flag) sbr->just_seeked = 0; if (sbr->header_count != 0 && sbr->ret == 0) { ret = sbr_save_prev_data(sbr, 0); if (ret) return ret; } sbr_save_matrix(sbr, 0); sbr->frame++; //#define POST_QMF_PRINT #ifdef POST_QMF_PRINT { int i; for (i = 0; i < 2048; i++) { printf("%d\n", channel[i]); } } #endif return 0; } #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, const uint8_t just_seeked, const uint8_t downSampledSBR) { uint8_t l, k; uint8_t dont_process = 0; uint8_t ret = 0; ALIGN qmf_t X_left[38][64] = {{0}}; ALIGN qmf_t X_right[38][64] = {{0}}; /* must set this to 0 */ if (sbr == NULL) return 20; /* case can occur due to bit errors */ if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) return 21; if (sbr->ret || (sbr->header_count == 0)) { /* don't process just upsample */ dont_process = 1; /* Re-activate reset for next frame */ if (sbr->ret && sbr->Reset) sbr->bs_start_freq_prev = -1; } if (just_seeked) { sbr->just_seeked = 1; } else { sbr->just_seeked = 0; } if (sbr->qmfs[1] == NULL) { sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); } sbr->ret += sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR); /* copy some extra data for PS */ for (l = sbr->numTimeSlotsRate; l < sbr->numTimeSlotsRate + 6; l++) { for (k = 0; k < 5; k++) { QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]); QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]); } } /* perform parametric stereo */ #ifdef DRM_PS if (sbr->Is_DRM_SBR) { drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), X_left, X_right); } else { #endif #ifdef PS_DEC ps_decode(sbr->ps, X_left, X_right); #endif #ifdef DRM_PS } #endif /* subband synthesis */ if (downSampledSBR) { sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel); sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel); } else { sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel); sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel); } if (sbr->bs_header_flag) sbr->just_seeked = 0; if (sbr->header_count != 0 && sbr->ret == 0) { ret = sbr_save_prev_data(sbr, 0); if (ret) return ret; } sbr_save_matrix(sbr, 0); sbr->frame++; return 0; } #endif #endif faad2-2_10_0/libfaad/sbr_dec.h000066400000000000000000000144101374350120500160450ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_dec.h,v 1.39 2007/11/01 12:33:34 menno Exp $ **/ #ifndef __SBR_DEC_H__ #define __SBR_DEC_H__ #ifdef __cplusplus extern "C" { #endif #ifdef PS_DEC #include "ps_dec.h" #endif #ifdef DRM_PS #include "drm_dec.h" #endif /* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */ #define MAX_NTSRHFG 40 #define MAX_NTSR 32 /* max number_time_slots * rate, ok for DRM and not DRM mode */ /* MAX_M: maximum value for M */ #define MAX_M 49 /* MAX_L_E: maximum value for L_E */ #define MAX_L_E 5 typedef struct { real_t *x; int16_t x_index; uint8_t channels; } qmfa_info; typedef struct { real_t *v; int16_t v_index; uint8_t channels; } qmfs_info; typedef struct { uint32_t sample_rate; uint32_t maxAACLine; uint8_t rate; uint8_t just_seeked; uint8_t ret; uint8_t amp_res[2]; uint8_t k0; uint8_t kx; uint8_t M; uint8_t N_master; uint8_t N_high; uint8_t N_low; uint8_t N_Q; uint8_t N_L[4]; uint8_t n[2]; uint8_t f_master[64]; uint8_t f_table_res[2][64]; uint8_t f_table_noise[64]; uint8_t f_table_lim[4][64]; #ifdef SBR_LOW_POWER uint8_t f_group[5][64]; uint8_t N_G[5]; #endif uint8_t table_map_k_to_g[64]; uint8_t abs_bord_lead[2]; uint8_t abs_bord_trail[2]; uint8_t n_rel_lead[2]; uint8_t n_rel_trail[2]; uint8_t L_E[2]; uint8_t L_E_prev[2]; uint8_t L_Q[2]; uint8_t t_E[2][MAX_L_E+1]; uint8_t t_Q[2][3]; uint8_t f[2][MAX_L_E+1]; uint8_t f_prev[2]; real_t *G_temp_prev[2][5]; real_t *Q_temp_prev[2][5]; int8_t GQ_ringbuf_index[2]; int16_t E[2][64][MAX_L_E]; int16_t E_prev[2][64]; #ifndef FIXED_POINT real_t E_orig[2][64][MAX_L_E]; #endif real_t E_curr[2][64][MAX_L_E]; int32_t Q[2][64][2]; #ifndef FIXED_POINT real_t Q_div[2][64][2]; real_t Q_div2[2][64][2]; #endif int32_t Q_prev[2][64]; int8_t l_A[2]; int8_t l_A_prev[2]; uint8_t bs_invf_mode[2][MAX_L_E]; uint8_t bs_invf_mode_prev[2][MAX_L_E]; real_t bwArray[2][64]; real_t bwArray_prev[2][64]; uint8_t noPatches; uint8_t patchNoSubbands[64]; uint8_t patchStartSubband[64]; uint8_t bs_add_harmonic[2][64]; uint8_t bs_add_harmonic_prev[2][64]; uint16_t index_noise_prev[2]; uint8_t psi_is_prev[2]; uint8_t bs_start_freq_prev; uint8_t bs_stop_freq_prev; uint8_t bs_xover_band_prev; uint8_t bs_freq_scale_prev; uint8_t bs_alter_scale_prev; uint8_t bs_noise_bands_prev; int8_t prevEnvIsShort[2]; int8_t kx_prev; uint8_t bsco; uint8_t bsco_prev; uint8_t M_prev; uint16_t frame_len; uint8_t Reset; uint32_t frame; uint32_t header_count; uint8_t id_aac; qmfa_info *qmfa[2]; qmfs_info *qmfs[2]; qmf_t Xsbr[2][MAX_NTSRHFG][64]; #ifdef DRM uint8_t Is_DRM_SBR; #ifdef DRM_PS drm_ps_info *drm_ps; #endif #endif uint8_t numTimeSlotsRate; uint8_t numTimeSlots; uint8_t tHFGen; uint8_t tHFAdj; #ifdef PS_DEC ps_info *ps; #endif #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t ps_used; uint8_t psResetFlag; #endif /* to get it compiling */ /* we'll see during the coding of all the tools, whether these are all used or not. */ uint8_t bs_header_flag; uint8_t bs_crc_flag; uint16_t bs_sbr_crc_bits; uint8_t bs_protocol_version; uint8_t bs_amp_res; uint8_t bs_start_freq; uint8_t bs_stop_freq; uint8_t bs_xover_band; uint8_t bs_freq_scale; uint8_t bs_alter_scale; uint8_t bs_noise_bands; uint8_t bs_limiter_bands; uint8_t bs_limiter_gains; uint8_t bs_interpol_freq; uint8_t bs_smoothing_mode; uint8_t bs_samplerate_mode; uint8_t bs_add_harmonic_flag[2]; uint8_t bs_add_harmonic_flag_prev[2]; uint8_t bs_extended_data; uint8_t bs_extension_id; uint8_t bs_extension_data; uint8_t bs_coupling; uint8_t bs_frame_class[2]; uint8_t bs_rel_bord[2][9]; uint8_t bs_rel_bord_0[2][9]; uint8_t bs_rel_bord_1[2][9]; uint8_t bs_pointer[2]; uint8_t bs_abs_bord_0[2]; uint8_t bs_abs_bord_1[2]; uint8_t bs_num_rel_0[2]; uint8_t bs_num_rel_1[2]; uint8_t bs_df_env[2][9]; uint8_t bs_df_noise[2][3]; } sbr_info; sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, uint32_t sample_rate, uint8_t downSampledSBR #ifdef DRM , uint8_t IsDRM #endif ); void sbrDecodeEnd(sbr_info *sbr); void sbrReset(sbr_info *sbr); uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, const uint8_t just_seeked, const uint8_t downSampledSBR); uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, const uint8_t just_seeked, const uint8_t downSampledSBR); #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, const uint8_t just_seeked, const uint8_t downSampledSBR); #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_e_nf.c000066400000000000000000001416431374350120500162250ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_e_nf.c,v 1.22 2008/03/23 23:03:29 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include #include "sbr_syntax.h" #include "sbr_e_nf.h" void extract_envelope_data(sbr_info *sbr, uint8_t ch) { uint8_t l, k; for (l = 0; l < sbr->L_E[ch]; l++) { if (sbr->bs_df_env[ch][l] == 0) { for (k = 1; k < sbr->n[sbr->f[ch][l]]; k++) { sbr->E[ch][k][l] = sbr->E[ch][k - 1][l] + sbr->E[ch][k][l]; if (sbr->E[ch][k][l] < 0) sbr->E[ch][k][l] = 0; } } else { /* bs_df_env == 1 */ uint8_t g = (l == 0) ? sbr->f_prev[ch] : sbr->f[ch][l-1]; int16_t E_prev; if (sbr->f[ch][l] == g) { for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { if (l == 0) E_prev = sbr->E_prev[ch][k]; else E_prev = sbr->E[ch][k][l - 1]; sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; } } else if ((g == 1) && (sbr->f[ch][l] == 0)) { uint8_t i; for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { for (i = 0; i < sbr->N_high; i++) { if (sbr->f_table_res[HI_RES][i] == sbr->f_table_res[LO_RES][k]) { if (l == 0) E_prev = sbr->E_prev[ch][i]; else E_prev = sbr->E[ch][i][l - 1]; sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; } } } } else if ((g == 0) && (sbr->f[ch][l] == 1)) { uint8_t i; for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { for (i = 0; i < sbr->N_low; i++) { if ((sbr->f_table_res[LO_RES][i] <= sbr->f_table_res[HI_RES][k]) && (sbr->f_table_res[HI_RES][k] < sbr->f_table_res[LO_RES][i + 1])) { if (l == 0) E_prev = sbr->E_prev[ch][i]; else E_prev = sbr->E[ch][i][l - 1]; sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; } } } } } } } void extract_noise_floor_data(sbr_info *sbr, uint8_t ch) { uint8_t l, k; for (l = 0; l < sbr->L_Q[ch]; l++) { if (sbr->bs_df_noise[ch][l] == 0) { for (k = 1; k < sbr->N_Q; k++) { sbr->Q[ch][k][l] = sbr->Q[ch][k][l] + sbr->Q[ch][k-1][l]; } } else { if (l == 0) { for (k = 0; k < sbr->N_Q; k++) { sbr->Q[ch][k][l] = sbr->Q_prev[ch][k] + sbr->Q[ch][k][0]; } } else { for (k = 0; k < sbr->N_Q; k++) { sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l]; } } } } } #ifndef FIXED_POINT /* table for Q_div values when no coupling */ static const real_t Q_div_tab[31] = { FRAC_CONST(0.0153846), FRAC_CONST(0.030303), FRAC_CONST(0.0588235), FRAC_CONST(0.111111), FRAC_CONST(0.2), FRAC_CONST(0.333333), FRAC_CONST(0.5), FRAC_CONST(0.666667), FRAC_CONST(0.8), FRAC_CONST(0.888889), FRAC_CONST(0.941176), FRAC_CONST(0.969697), FRAC_CONST(0.984615), FRAC_CONST(0.992248), FRAC_CONST(0.996109), FRAC_CONST(0.998051), FRAC_CONST(0.999024), FRAC_CONST(0.999512), FRAC_CONST(0.999756), FRAC_CONST(0.999878), FRAC_CONST(0.999939), FRAC_CONST(0.999969), FRAC_CONST(0.999985), FRAC_CONST(0.999992), FRAC_CONST(0.999996), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }; static const real_t Q_div_tab_left[31][13] = { { FRAC_CONST(0.969704), FRAC_CONST(0.888985), FRAC_CONST(0.667532), FRAC_CONST(0.336788), FRAC_CONST(0.117241), FRAC_CONST(0.037594), FRAC_CONST(0.0153846), FRAC_CONST(0.00967118), FRAC_CONST(0.00823245), FRAC_CONST(0.00787211), FRAC_CONST(0.00778198), FRAC_CONST(0.00775945), FRAC_CONST(0.00775382) }, { FRAC_CONST(0.984619), FRAC_CONST(0.94123), FRAC_CONST(0.800623), FRAC_CONST(0.503876), FRAC_CONST(0.209877), FRAC_CONST(0.0724638), FRAC_CONST(0.030303), FRAC_CONST(0.0191571), FRAC_CONST(0.0163305), FRAC_CONST(0.0156212), FRAC_CONST(0.0154438), FRAC_CONST(0.0153994), FRAC_CONST(0.0153883) }, { FRAC_CONST(0.99225), FRAC_CONST(0.969726), FRAC_CONST(0.889273), FRAC_CONST(0.670103), FRAC_CONST(0.346939), FRAC_CONST(0.135135), FRAC_CONST(0.0588235), FRAC_CONST(0.037594), FRAC_CONST(0.0321361), FRAC_CONST(0.0307619), FRAC_CONST(0.0304178), FRAC_CONST(0.0303317), FRAC_CONST(0.0303102) }, { FRAC_CONST(0.99611), FRAC_CONST(0.98463), FRAC_CONST(0.941392), FRAC_CONST(0.802469), FRAC_CONST(0.515152), FRAC_CONST(0.238095), FRAC_CONST(0.111111), FRAC_CONST(0.0724638), FRAC_CONST(0.0622711), FRAC_CONST(0.0596878), FRAC_CONST(0.0590397), FRAC_CONST(0.0588776), FRAC_CONST(0.058837) }, { FRAC_CONST(0.998051), FRAC_CONST(0.992256), FRAC_CONST(0.969811), FRAC_CONST(0.890411), FRAC_CONST(0.68), FRAC_CONST(0.384615), FRAC_CONST(0.2), FRAC_CONST(0.135135), FRAC_CONST(0.117241), FRAC_CONST(0.112652), FRAC_CONST(0.111497), FRAC_CONST(0.111208), FRAC_CONST(0.111135) }, { FRAC_CONST(0.999025), FRAC_CONST(0.996113), FRAC_CONST(0.984674), FRAC_CONST(0.942029), FRAC_CONST(0.809524), FRAC_CONST(0.555556), FRAC_CONST(0.333333), FRAC_CONST(0.238095), FRAC_CONST(0.209877), FRAC_CONST(0.202492), FRAC_CONST(0.200625), FRAC_CONST(0.200156), FRAC_CONST(0.200039) }, { FRAC_CONST(0.999512), FRAC_CONST(0.998053), FRAC_CONST(0.992278), FRAC_CONST(0.970149), FRAC_CONST(0.894737), FRAC_CONST(0.714286), FRAC_CONST(0.5), FRAC_CONST(0.384615), FRAC_CONST(0.346939), FRAC_CONST(0.336788), FRAC_CONST(0.3342), FRAC_CONST(0.33355), FRAC_CONST(0.333388) }, { FRAC_CONST(0.999756), FRAC_CONST(0.999025), FRAC_CONST(0.996124), FRAC_CONST(0.984848), FRAC_CONST(0.944444), FRAC_CONST(0.833333), FRAC_CONST(0.666667), FRAC_CONST(0.555556), FRAC_CONST(0.515152), FRAC_CONST(0.503876), FRAC_CONST(0.500975), FRAC_CONST(0.500244), FRAC_CONST(0.500061) }, { FRAC_CONST(0.999878), FRAC_CONST(0.999512), FRAC_CONST(0.998058), FRAC_CONST(0.992366), FRAC_CONST(0.971429), FRAC_CONST(0.909091), FRAC_CONST(0.8), FRAC_CONST(0.714286), FRAC_CONST(0.68), FRAC_CONST(0.670103), FRAC_CONST(0.667532), FRAC_CONST(0.666884), FRAC_CONST(0.666721) }, { FRAC_CONST(0.999939), FRAC_CONST(0.999756), FRAC_CONST(0.999028), FRAC_CONST(0.996169), FRAC_CONST(0.985507), FRAC_CONST(0.952381), FRAC_CONST(0.888889), FRAC_CONST(0.833333), FRAC_CONST(0.809524), FRAC_CONST(0.802469), FRAC_CONST(0.800623), FRAC_CONST(0.800156), FRAC_CONST(0.800039) }, { FRAC_CONST(0.999969), FRAC_CONST(0.999878), FRAC_CONST(0.999514), FRAC_CONST(0.998081), FRAC_CONST(0.992701), FRAC_CONST(0.97561), FRAC_CONST(0.941176), FRAC_CONST(0.909091), FRAC_CONST(0.894737), FRAC_CONST(0.890411), FRAC_CONST(0.889273), FRAC_CONST(0.888985), FRAC_CONST(0.888913) }, { FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.999757), FRAC_CONST(0.999039), FRAC_CONST(0.996337), FRAC_CONST(0.987654), FRAC_CONST(0.969697), FRAC_CONST(0.952381), FRAC_CONST(0.944444), FRAC_CONST(0.942029), FRAC_CONST(0.941392), FRAC_CONST(0.94123), FRAC_CONST(0.94119) }, { FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999878), FRAC_CONST(0.999519), FRAC_CONST(0.998165), FRAC_CONST(0.993789), FRAC_CONST(0.984615), FRAC_CONST(0.97561), FRAC_CONST(0.971429), FRAC_CONST(0.970149), FRAC_CONST(0.969811), FRAC_CONST(0.969726), FRAC_CONST(0.969704) }, { FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.99976), FRAC_CONST(0.999082), FRAC_CONST(0.996885), FRAC_CONST(0.992248), FRAC_CONST(0.987654), FRAC_CONST(0.985507), FRAC_CONST(0.984848), FRAC_CONST(0.984674), FRAC_CONST(0.98463), FRAC_CONST(0.984619) }, { FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.99988), FRAC_CONST(0.999541), FRAC_CONST(0.99844), FRAC_CONST(0.996109), FRAC_CONST(0.993789), FRAC_CONST(0.992701), FRAC_CONST(0.992366), FRAC_CONST(0.992278), FRAC_CONST(0.992256), FRAC_CONST(0.99225) }, { FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.99994), FRAC_CONST(0.99977), FRAC_CONST(0.999219), FRAC_CONST(0.998051), FRAC_CONST(0.996885), FRAC_CONST(0.996337), FRAC_CONST(0.996169), FRAC_CONST(0.996124), FRAC_CONST(0.996113), FRAC_CONST(0.99611) }, { FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999885), FRAC_CONST(0.99961), FRAC_CONST(0.999024), FRAC_CONST(0.99844), FRAC_CONST(0.998165), FRAC_CONST(0.998081), FRAC_CONST(0.998058), FRAC_CONST(0.998053), FRAC_CONST(0.998051) }, { FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999943), FRAC_CONST(0.999805), FRAC_CONST(0.999512), FRAC_CONST(0.999219), FRAC_CONST(0.999082), FRAC_CONST(0.999039), FRAC_CONST(0.999028), FRAC_CONST(0.999025), FRAC_CONST(0.999025) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.999971), FRAC_CONST(0.999902), FRAC_CONST(0.999756), FRAC_CONST(0.99961), FRAC_CONST(0.999541), FRAC_CONST(0.999519), FRAC_CONST(0.999514), FRAC_CONST(0.999512), FRAC_CONST(0.999512) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999986), FRAC_CONST(0.999951), FRAC_CONST(0.999878), FRAC_CONST(0.999805), FRAC_CONST(0.99977), FRAC_CONST(0.99976), FRAC_CONST(0.999757), FRAC_CONST(0.999756), FRAC_CONST(0.999756) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999993), FRAC_CONST(0.999976), FRAC_CONST(0.999939), FRAC_CONST(0.999902), FRAC_CONST(0.999885), FRAC_CONST(0.99988), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999988), FRAC_CONST(0.999969), FRAC_CONST(0.999951), FRAC_CONST(0.999943), FRAC_CONST(0.99994), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999994), FRAC_CONST(0.999985), FRAC_CONST(0.999976), FRAC_CONST(0.999971), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999969) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999997), FRAC_CONST(0.999992), FRAC_CONST(0.999988), FRAC_CONST(0.999986), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999996), FRAC_CONST(0.999994), FRAC_CONST(0.999993), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999997), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } }; static const real_t Q_div_tab_right[31][13] = { { FRAC_CONST(0.00775382), FRAC_CONST(0.00775945), FRAC_CONST(0.00778198), FRAC_CONST(0.00787211), FRAC_CONST(0.00823245), FRAC_CONST(0.00967118), FRAC_CONST(0.0153846), FRAC_CONST(0.037594), FRAC_CONST(0.117241), FRAC_CONST(0.336788), FRAC_CONST(0.667532), FRAC_CONST(0.888985), FRAC_CONST(0.969704) }, { FRAC_CONST(0.0153883), FRAC_CONST(0.0153994), FRAC_CONST(0.0154438), FRAC_CONST(0.0156212), FRAC_CONST(0.0163305), FRAC_CONST(0.0191571), FRAC_CONST(0.030303), FRAC_CONST(0.0724638), FRAC_CONST(0.209877), FRAC_CONST(0.503876), FRAC_CONST(0.800623), FRAC_CONST(0.94123), FRAC_CONST(0.984619) }, { FRAC_CONST(0.0303102), FRAC_CONST(0.0303317), FRAC_CONST(0.0304178), FRAC_CONST(0.0307619), FRAC_CONST(0.0321361), FRAC_CONST(0.037594), FRAC_CONST(0.0588235), FRAC_CONST(0.135135), FRAC_CONST(0.346939), FRAC_CONST(0.670103), FRAC_CONST(0.889273), FRAC_CONST(0.969726), FRAC_CONST(0.99225) }, { FRAC_CONST(0.058837), FRAC_CONST(0.0588776), FRAC_CONST(0.0590397), FRAC_CONST(0.0596878), FRAC_CONST(0.0622711), FRAC_CONST(0.0724638), FRAC_CONST(0.111111), FRAC_CONST(0.238095), FRAC_CONST(0.515152), FRAC_CONST(0.802469), FRAC_CONST(0.941392), FRAC_CONST(0.98463), FRAC_CONST(0.99611) }, { FRAC_CONST(0.111135), FRAC_CONST(0.111208), FRAC_CONST(0.111497), FRAC_CONST(0.112652), FRAC_CONST(0.117241), FRAC_CONST(0.135135), FRAC_CONST(0.2), FRAC_CONST(0.384615), FRAC_CONST(0.68), FRAC_CONST(0.890411), FRAC_CONST(0.969811), FRAC_CONST(0.992256), FRAC_CONST(0.998051) }, { FRAC_CONST(0.200039), FRAC_CONST(0.200156), FRAC_CONST(0.200625), FRAC_CONST(0.202492), FRAC_CONST(0.209877), FRAC_CONST(0.238095), FRAC_CONST(0.333333), FRAC_CONST(0.555556), FRAC_CONST(0.809524), FRAC_CONST(0.942029), FRAC_CONST(0.984674), FRAC_CONST(0.996113), FRAC_CONST(0.999025) }, { FRAC_CONST(0.333388), FRAC_CONST(0.33355), FRAC_CONST(0.3342), FRAC_CONST(0.336788), FRAC_CONST(0.346939), FRAC_CONST(0.384615), FRAC_CONST(0.5), FRAC_CONST(0.714286), FRAC_CONST(0.894737), FRAC_CONST(0.970149), FRAC_CONST(0.992278), FRAC_CONST(0.998053), FRAC_CONST(0.999512) }, { FRAC_CONST(0.500061), FRAC_CONST(0.500244), FRAC_CONST(0.500975), FRAC_CONST(0.503876), FRAC_CONST(0.515152), FRAC_CONST(0.555556), FRAC_CONST(0.666667), FRAC_CONST(0.833333), FRAC_CONST(0.944444), FRAC_CONST(0.984848), FRAC_CONST(0.996124), FRAC_CONST(0.999025), FRAC_CONST(0.999756) }, { FRAC_CONST(0.666721), FRAC_CONST(0.666884), FRAC_CONST(0.667532), FRAC_CONST(0.670103), FRAC_CONST(0.68), FRAC_CONST(0.714286), FRAC_CONST(0.8), FRAC_CONST(0.909091), FRAC_CONST(0.971429), FRAC_CONST(0.992366), FRAC_CONST(0.998058), FRAC_CONST(0.999512), FRAC_CONST(0.999878) }, { FRAC_CONST(0.800039), FRAC_CONST(0.800156), FRAC_CONST(0.800623), FRAC_CONST(0.802469), FRAC_CONST(0.809524), FRAC_CONST(0.833333), FRAC_CONST(0.888889), FRAC_CONST(0.952381), FRAC_CONST(0.985507), FRAC_CONST(0.996169), FRAC_CONST(0.999028), FRAC_CONST(0.999756), FRAC_CONST(0.999939) }, { FRAC_CONST(0.888913), FRAC_CONST(0.888985), FRAC_CONST(0.889273), FRAC_CONST(0.890411), FRAC_CONST(0.894737), FRAC_CONST(0.909091), FRAC_CONST(0.941176), FRAC_CONST(0.97561), FRAC_CONST(0.992701), FRAC_CONST(0.998081), FRAC_CONST(0.999514), FRAC_CONST(0.999878), FRAC_CONST(0.999969) }, { FRAC_CONST(0.94119), FRAC_CONST(0.94123), FRAC_CONST(0.941392), FRAC_CONST(0.942029), FRAC_CONST(0.944444), FRAC_CONST(0.952381), FRAC_CONST(0.969697), FRAC_CONST(0.987654), FRAC_CONST(0.996337), FRAC_CONST(0.999039), FRAC_CONST(0.999757), FRAC_CONST(0.999939), FRAC_CONST(0.999985) }, { FRAC_CONST(0.969704), FRAC_CONST(0.969726), FRAC_CONST(0.969811), FRAC_CONST(0.970149), FRAC_CONST(0.971429), FRAC_CONST(0.97561), FRAC_CONST(0.984615), FRAC_CONST(0.993789), FRAC_CONST(0.998165), FRAC_CONST(0.999519), FRAC_CONST(0.999878), FRAC_CONST(0.99997), FRAC_CONST(0.999992) }, { FRAC_CONST(0.984619), FRAC_CONST(0.98463), FRAC_CONST(0.984674), FRAC_CONST(0.984848), FRAC_CONST(0.985507), FRAC_CONST(0.987654), FRAC_CONST(0.992248), FRAC_CONST(0.996885), FRAC_CONST(0.999082), FRAC_CONST(0.99976), FRAC_CONST(0.999939), FRAC_CONST(0.999985), FRAC_CONST(0.999996) }, { FRAC_CONST(0.99225), FRAC_CONST(0.992256), FRAC_CONST(0.992278), FRAC_CONST(0.992366), FRAC_CONST(0.992701), FRAC_CONST(0.993789), FRAC_CONST(0.996109), FRAC_CONST(0.99844), FRAC_CONST(0.999541), FRAC_CONST(0.99988), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998) }, { FRAC_CONST(0.99611), FRAC_CONST(0.996113), FRAC_CONST(0.996124), FRAC_CONST(0.996169), FRAC_CONST(0.996337), FRAC_CONST(0.996885), FRAC_CONST(0.998051), FRAC_CONST(0.999219), FRAC_CONST(0.99977), FRAC_CONST(0.99994), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999) }, { FRAC_CONST(0.998051), FRAC_CONST(0.998053), FRAC_CONST(0.998058), FRAC_CONST(0.998081), FRAC_CONST(0.998165), FRAC_CONST(0.99844), FRAC_CONST(0.999024), FRAC_CONST(0.99961), FRAC_CONST(0.999885), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1) }, { FRAC_CONST(0.999025), FRAC_CONST(0.999025), FRAC_CONST(0.999028), FRAC_CONST(0.999039), FRAC_CONST(0.999082), FRAC_CONST(0.999219), FRAC_CONST(0.999512), FRAC_CONST(0.999805), FRAC_CONST(0.999943), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1) }, { FRAC_CONST(0.999512), FRAC_CONST(0.999512), FRAC_CONST(0.999514), FRAC_CONST(0.999519), FRAC_CONST(0.999541), FRAC_CONST(0.99961), FRAC_CONST(0.999756), FRAC_CONST(0.999902), FRAC_CONST(0.999971), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999756), FRAC_CONST(0.999756), FRAC_CONST(0.999757), FRAC_CONST(0.99976), FRAC_CONST(0.99977), FRAC_CONST(0.999805), FRAC_CONST(0.999878), FRAC_CONST(0.999951), FRAC_CONST(0.999986), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.99988), FRAC_CONST(0.999885), FRAC_CONST(0.999902), FRAC_CONST(0.999939), FRAC_CONST(0.999976), FRAC_CONST(0.999993), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.99994), FRAC_CONST(0.999943), FRAC_CONST(0.999951), FRAC_CONST(0.999969), FRAC_CONST(0.999988), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999969), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999971), FRAC_CONST(0.999976), FRAC_CONST(0.999985), FRAC_CONST(0.999994), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999986), FRAC_CONST(0.999988), FRAC_CONST(0.999992), FRAC_CONST(0.999997), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999993), FRAC_CONST(0.999994), FRAC_CONST(0.999996), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999997), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } }; /* calculates 1/(1+Q) */ /* [0..1] */ static real_t calc_Q_div(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) { if (sbr->bs_coupling) { /* left channel */ if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) { return 0; } else { /* the pan parameter is always even */ if (ch == 0) { return Q_div_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } else { return Q_div_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } } } else { /* no coupling */ if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) { return 0; } else { return Q_div_tab[sbr->Q[ch][m][l]]; } } } /* table for Q_div2 values when no coupling */ static const real_t Q_div2_tab[31] = { FRAC_CONST(0.984615), FRAC_CONST(0.969697), FRAC_CONST(0.941176), FRAC_CONST(0.888889), FRAC_CONST(0.8), FRAC_CONST(0.666667), FRAC_CONST(0.5), FRAC_CONST(0.333333), FRAC_CONST(0.2), FRAC_CONST(0.111111), FRAC_CONST(0.0588235), FRAC_CONST(0.030303), FRAC_CONST(0.0153846), FRAC_CONST(0.00775194), FRAC_CONST(0.00389105), FRAC_CONST(0.00194932), FRAC_CONST(0.00097561), FRAC_CONST(0.000488043), FRAC_CONST(0.000244081), FRAC_CONST(0.000122055), FRAC_CONST(6.10314E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(1.52586E-005), FRAC_CONST(7.62934E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(1.90734E-006), FRAC_CONST(9.53673E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(2.38419E-007), FRAC_CONST(1.19209E-007), FRAC_CONST(5.96046E-008) }; static const real_t Q_div2_tab_left[31][13] = { { FRAC_CONST(0.0302959), FRAC_CONST(0.111015), FRAC_CONST(0.332468), FRAC_CONST(0.663212), FRAC_CONST(0.882759), FRAC_CONST(0.962406), FRAC_CONST(0.984615), FRAC_CONST(0.990329), FRAC_CONST(0.991768), FRAC_CONST(0.992128), FRAC_CONST(0.992218), FRAC_CONST(0.992241), FRAC_CONST(0.992246) }, { FRAC_CONST(0.0153809), FRAC_CONST(0.0587695), FRAC_CONST(0.199377), FRAC_CONST(0.496124), FRAC_CONST(0.790123), FRAC_CONST(0.927536), FRAC_CONST(0.969697), FRAC_CONST(0.980843), FRAC_CONST(0.98367), FRAC_CONST(0.984379), FRAC_CONST(0.984556), FRAC_CONST(0.984601), FRAC_CONST(0.984612) }, { FRAC_CONST(0.00775006), FRAC_CONST(0.0302744), FRAC_CONST(0.110727), FRAC_CONST(0.329897), FRAC_CONST(0.653061), FRAC_CONST(0.864865), FRAC_CONST(0.941176), FRAC_CONST(0.962406), FRAC_CONST(0.967864), FRAC_CONST(0.969238), FRAC_CONST(0.969582), FRAC_CONST(0.969668), FRAC_CONST(0.96969) }, { FRAC_CONST(0.0038901), FRAC_CONST(0.0153698), FRAC_CONST(0.0586081), FRAC_CONST(0.197531), FRAC_CONST(0.484848), FRAC_CONST(0.761905), FRAC_CONST(0.888889), FRAC_CONST(0.927536), FRAC_CONST(0.937729), FRAC_CONST(0.940312), FRAC_CONST(0.94096), FRAC_CONST(0.941122), FRAC_CONST(0.941163) }, { FRAC_CONST(0.00194884), FRAC_CONST(0.00774443), FRAC_CONST(0.0301887), FRAC_CONST(0.109589), FRAC_CONST(0.32), FRAC_CONST(0.615385), FRAC_CONST(0.8), FRAC_CONST(0.864865), FRAC_CONST(0.882759), FRAC_CONST(0.887348), FRAC_CONST(0.888503), FRAC_CONST(0.888792), FRAC_CONST(0.888865) }, { FRAC_CONST(0.000975372), FRAC_CONST(0.00388727), FRAC_CONST(0.0153257), FRAC_CONST(0.057971), FRAC_CONST(0.190476), FRAC_CONST(0.444444), FRAC_CONST(0.666667), FRAC_CONST(0.761905), FRAC_CONST(0.790123), FRAC_CONST(0.797508), FRAC_CONST(0.799375), FRAC_CONST(0.799844), FRAC_CONST(0.799961) }, { FRAC_CONST(0.000487924), FRAC_CONST(0.00194742), FRAC_CONST(0.00772201), FRAC_CONST(0.0298507), FRAC_CONST(0.105263), FRAC_CONST(0.285714), FRAC_CONST(0.5), FRAC_CONST(0.615385), FRAC_CONST(0.653061), FRAC_CONST(0.663212), FRAC_CONST(0.6658), FRAC_CONST(0.66645), FRAC_CONST(0.666612) }, { FRAC_CONST(0.000244021), FRAC_CONST(0.000974659), FRAC_CONST(0.00387597), FRAC_CONST(0.0151515), FRAC_CONST(0.0555556), FRAC_CONST(0.166667), FRAC_CONST(0.333333), FRAC_CONST(0.444444), FRAC_CONST(0.484848), FRAC_CONST(0.496124), FRAC_CONST(0.499025), FRAC_CONST(0.499756), FRAC_CONST(0.499939) }, { FRAC_CONST(0.000122026), FRAC_CONST(0.000487567), FRAC_CONST(0.00194175), FRAC_CONST(0.00763359), FRAC_CONST(0.0285714), FRAC_CONST(0.0909091), FRAC_CONST(0.2), FRAC_CONST(0.285714), FRAC_CONST(0.32), FRAC_CONST(0.329897), FRAC_CONST(0.332468), FRAC_CONST(0.333116), FRAC_CONST(0.333279) }, { FRAC_CONST(6.10165E-005), FRAC_CONST(0.000243843), FRAC_CONST(0.000971817), FRAC_CONST(0.00383142), FRAC_CONST(0.0144928), FRAC_CONST(0.047619), FRAC_CONST(0.111111), FRAC_CONST(0.166667), FRAC_CONST(0.190476), FRAC_CONST(0.197531), FRAC_CONST(0.199377), FRAC_CONST(0.199844), FRAC_CONST(0.199961) }, { FRAC_CONST(3.05092E-005), FRAC_CONST(0.000121936), FRAC_CONST(0.000486145), FRAC_CONST(0.00191939), FRAC_CONST(0.00729927), FRAC_CONST(0.0243902), FRAC_CONST(0.0588235), FRAC_CONST(0.0909091), FRAC_CONST(0.105263), FRAC_CONST(0.109589), FRAC_CONST(0.110727), FRAC_CONST(0.111015), FRAC_CONST(0.111087) }, { FRAC_CONST(1.52548E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(0.000243132), FRAC_CONST(0.000960615), FRAC_CONST(0.003663), FRAC_CONST(0.0123457), FRAC_CONST(0.030303), FRAC_CONST(0.047619), FRAC_CONST(0.0555556), FRAC_CONST(0.057971), FRAC_CONST(0.0586081), FRAC_CONST(0.0587695), FRAC_CONST(0.05881) }, { FRAC_CONST(7.62747E-006), FRAC_CONST(3.04869E-005), FRAC_CONST(0.000121581), FRAC_CONST(0.000480538), FRAC_CONST(0.00183486), FRAC_CONST(0.00621118), FRAC_CONST(0.0153846), FRAC_CONST(0.0243902), FRAC_CONST(0.0285714), FRAC_CONST(0.0298507), FRAC_CONST(0.0301887), FRAC_CONST(0.0302744), FRAC_CONST(0.0302959) }, { FRAC_CONST(3.81375E-006), FRAC_CONST(1.52437E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(0.000240327), FRAC_CONST(0.000918274), FRAC_CONST(0.00311526), FRAC_CONST(0.00775194), FRAC_CONST(0.0123457), FRAC_CONST(0.0144928), FRAC_CONST(0.0151515), FRAC_CONST(0.0153257), FRAC_CONST(0.0153698), FRAC_CONST(0.0153809) }, { FRAC_CONST(1.90688E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(3.03979E-005), FRAC_CONST(0.000120178), FRAC_CONST(0.000459348), FRAC_CONST(0.00156006), FRAC_CONST(0.00389105), FRAC_CONST(0.00621118), FRAC_CONST(0.00729927), FRAC_CONST(0.00763359), FRAC_CONST(0.00772201), FRAC_CONST(0.00774443), FRAC_CONST(0.00775006) }, { FRAC_CONST(9.53441E-007), FRAC_CONST(3.81096E-006), FRAC_CONST(1.51992E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(0.000229727), FRAC_CONST(0.00078064), FRAC_CONST(0.00194932), FRAC_CONST(0.00311526), FRAC_CONST(0.003663), FRAC_CONST(0.00383142), FRAC_CONST(0.00387597), FRAC_CONST(0.00388727), FRAC_CONST(0.0038901) }, { FRAC_CONST(4.76721E-007), FRAC_CONST(1.90548E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(3.00472E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000390472), FRAC_CONST(0.00097561), FRAC_CONST(0.00156006), FRAC_CONST(0.00183486), FRAC_CONST(0.00191939), FRAC_CONST(0.00194175), FRAC_CONST(0.00194742), FRAC_CONST(0.00194884) }, { FRAC_CONST(2.3836E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(3.79984E-006), FRAC_CONST(1.50238E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(0.000195274), FRAC_CONST(0.000488043), FRAC_CONST(0.00078064), FRAC_CONST(0.000918274), FRAC_CONST(0.000960615), FRAC_CONST(0.000971817), FRAC_CONST(0.000974659), FRAC_CONST(0.000975372) }, { FRAC_CONST(1.1918E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(1.89992E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(2.87216E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000244081), FRAC_CONST(0.000390472), FRAC_CONST(0.000459348), FRAC_CONST(0.000480538), FRAC_CONST(0.000486145), FRAC_CONST(0.000487567), FRAC_CONST(0.000487924) }, { FRAC_CONST(5.95901E-008), FRAC_CONST(2.38186E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(3.756E-006), FRAC_CONST(1.4361E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(0.000122055), FRAC_CONST(0.000195274), FRAC_CONST(0.000229727), FRAC_CONST(0.000240327), FRAC_CONST(0.000243132), FRAC_CONST(0.000243843), FRAC_CONST(0.000244021) }, { FRAC_CONST(2.9795E-008), FRAC_CONST(1.19093E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(1.878E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(2.44135E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000120178), FRAC_CONST(0.000121581), FRAC_CONST(0.000121936), FRAC_CONST(0.000122026) }, { FRAC_CONST(1.48975E-008), FRAC_CONST(5.95465E-008), FRAC_CONST(2.37491E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(3.59029E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.10165E-005) }, { FRAC_CONST(7.44876E-009), FRAC_CONST(2.97732E-008), FRAC_CONST(1.18745E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(1.79515E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(1.52586E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.05092E-005) }, { FRAC_CONST(3.72438E-009), FRAC_CONST(1.48866E-008), FRAC_CONST(5.93727E-008), FRAC_CONST(2.34751E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(3.05175E-006), FRAC_CONST(7.62934E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.52548E-005) }, { FRAC_CONST(1.86219E-009), FRAC_CONST(7.44331E-009), FRAC_CONST(2.96864E-008), FRAC_CONST(1.17375E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.62747E-006) }, { FRAC_CONST(9.31095E-010), FRAC_CONST(3.72166E-009), FRAC_CONST(1.48432E-008), FRAC_CONST(5.86876E-008), FRAC_CONST(2.24394E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(1.90734E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.81375E-006) }, { FRAC_CONST(4.65548E-010), FRAC_CONST(1.86083E-009), FRAC_CONST(7.42159E-009), FRAC_CONST(2.93438E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(9.53673E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.90688E-006) }, { FRAC_CONST(2.32774E-010), FRAC_CONST(9.30414E-010), FRAC_CONST(3.71079E-009), FRAC_CONST(1.46719E-008), FRAC_CONST(5.60985E-008), FRAC_CONST(1.90735E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.53441E-007) }, { FRAC_CONST(1.16387E-010), FRAC_CONST(4.65207E-010), FRAC_CONST(1.8554E-009), FRAC_CONST(7.33596E-009), FRAC_CONST(2.80492E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(2.38419E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.76721E-007) }, { FRAC_CONST(5.81935E-011), FRAC_CONST(2.32603E-010), FRAC_CONST(9.27699E-010), FRAC_CONST(3.66798E-009), FRAC_CONST(1.40246E-008), FRAC_CONST(4.76837E-008), FRAC_CONST(1.19209E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.3836E-007) }, { FRAC_CONST(2.90967E-011), FRAC_CONST(1.16302E-010), FRAC_CONST(4.63849E-010), FRAC_CONST(1.83399E-009), FRAC_CONST(7.01231E-009), FRAC_CONST(2.38419E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.1918E-007) } }; static const real_t Q_div2_tab_right[31][13] = { { FRAC_CONST(0.992246), FRAC_CONST(0.992241), FRAC_CONST(0.992218), FRAC_CONST(0.992128), FRAC_CONST(0.991768), FRAC_CONST(0.990329), FRAC_CONST(0.984615), FRAC_CONST(0.962406), FRAC_CONST(0.882759), FRAC_CONST(0.663212), FRAC_CONST(0.332468), FRAC_CONST(0.111015), FRAC_CONST(0.0302959) }, { FRAC_CONST(0.984612), FRAC_CONST(0.984601), FRAC_CONST(0.984556), FRAC_CONST(0.984379), FRAC_CONST(0.98367), FRAC_CONST(0.980843), FRAC_CONST(0.969697), FRAC_CONST(0.927536), FRAC_CONST(0.790123), FRAC_CONST(0.496124), FRAC_CONST(0.199377), FRAC_CONST(0.0587695), FRAC_CONST(0.0153809) }, { FRAC_CONST(0.96969), FRAC_CONST(0.969668), FRAC_CONST(0.969582), FRAC_CONST(0.969238), FRAC_CONST(0.967864), FRAC_CONST(0.962406), FRAC_CONST(0.941176), FRAC_CONST(0.864865), FRAC_CONST(0.653061), FRAC_CONST(0.329897), FRAC_CONST(0.110727), FRAC_CONST(0.0302744), FRAC_CONST(0.00775006) }, { FRAC_CONST(0.941163), FRAC_CONST(0.941122), FRAC_CONST(0.94096), FRAC_CONST(0.940312), FRAC_CONST(0.937729), FRAC_CONST(0.927536), FRAC_CONST(0.888889), FRAC_CONST(0.761905), FRAC_CONST(0.484848), FRAC_CONST(0.197531), FRAC_CONST(0.0586081), FRAC_CONST(0.0153698), FRAC_CONST(0.0038901) }, { FRAC_CONST(0.888865), FRAC_CONST(0.888792), FRAC_CONST(0.888503), FRAC_CONST(0.887348), FRAC_CONST(0.882759), FRAC_CONST(0.864865), FRAC_CONST(0.8), FRAC_CONST(0.615385), FRAC_CONST(0.32), FRAC_CONST(0.109589), FRAC_CONST(0.0301887), FRAC_CONST(0.00774443), FRAC_CONST(0.00194884) }, { FRAC_CONST(0.799961), FRAC_CONST(0.799844), FRAC_CONST(0.799375), FRAC_CONST(0.797508), FRAC_CONST(0.790123), FRAC_CONST(0.761905), FRAC_CONST(0.666667), FRAC_CONST(0.444444), FRAC_CONST(0.190476), FRAC_CONST(0.057971), FRAC_CONST(0.0153257), FRAC_CONST(0.00388727), FRAC_CONST(0.000975372) }, { FRAC_CONST(0.666612), FRAC_CONST(0.66645), FRAC_CONST(0.6658), FRAC_CONST(0.663212), FRAC_CONST(0.653061), FRAC_CONST(0.615385), FRAC_CONST(0.5), FRAC_CONST(0.285714), FRAC_CONST(0.105263), FRAC_CONST(0.0298507), FRAC_CONST(0.00772201), FRAC_CONST(0.00194742), FRAC_CONST(0.000487924) }, { FRAC_CONST(0.499939), FRAC_CONST(0.499756), FRAC_CONST(0.499025), FRAC_CONST(0.496124), FRAC_CONST(0.484848), FRAC_CONST(0.444444), FRAC_CONST(0.333333), FRAC_CONST(0.166667), FRAC_CONST(0.0555556), FRAC_CONST(0.0151515), FRAC_CONST(0.00387597), FRAC_CONST(0.000974659), FRAC_CONST(0.000244021) }, { FRAC_CONST(0.333279), FRAC_CONST(0.333116), FRAC_CONST(0.332468), FRAC_CONST(0.329897), FRAC_CONST(0.32), FRAC_CONST(0.285714), FRAC_CONST(0.2), FRAC_CONST(0.0909091), FRAC_CONST(0.0285714), FRAC_CONST(0.00763359), FRAC_CONST(0.00194175), FRAC_CONST(0.000487567), FRAC_CONST(0.000122026) }, { FRAC_CONST(0.199961), FRAC_CONST(0.199844), FRAC_CONST(0.199377), FRAC_CONST(0.197531), FRAC_CONST(0.190476), FRAC_CONST(0.166667), FRAC_CONST(0.111111), FRAC_CONST(0.047619), FRAC_CONST(0.0144928), FRAC_CONST(0.00383142), FRAC_CONST(0.000971817), FRAC_CONST(0.000243843), FRAC_CONST(6.10165E-005) }, { FRAC_CONST(0.111087), FRAC_CONST(0.111015), FRAC_CONST(0.110727), FRAC_CONST(0.109589), FRAC_CONST(0.105263), FRAC_CONST(0.0909091), FRAC_CONST(0.0588235), FRAC_CONST(0.0243902), FRAC_CONST(0.00729927), FRAC_CONST(0.00191939), FRAC_CONST(0.000486145), FRAC_CONST(0.000121936), FRAC_CONST(3.05092E-005) }, { FRAC_CONST(0.05881), FRAC_CONST(0.0587695), FRAC_CONST(0.0586081), FRAC_CONST(0.057971), FRAC_CONST(0.0555556), FRAC_CONST(0.047619), FRAC_CONST(0.030303), FRAC_CONST(0.0123457), FRAC_CONST(0.003663), FRAC_CONST(0.000960615), FRAC_CONST(0.000243132), FRAC_CONST(6.09719E-005), FRAC_CONST(1.52548E-005) }, { FRAC_CONST(0.0302959), FRAC_CONST(0.0302744), FRAC_CONST(0.0301887), FRAC_CONST(0.0298507), FRAC_CONST(0.0285714), FRAC_CONST(0.0243902), FRAC_CONST(0.0153846), FRAC_CONST(0.00621118), FRAC_CONST(0.00183486), FRAC_CONST(0.000480538), FRAC_CONST(0.000121581), FRAC_CONST(3.04869E-005), FRAC_CONST(7.62747E-006) }, { FRAC_CONST(0.0153809), FRAC_CONST(0.0153698), FRAC_CONST(0.0153257), FRAC_CONST(0.0151515), FRAC_CONST(0.0144928), FRAC_CONST(0.0123457), FRAC_CONST(0.00775194), FRAC_CONST(0.00311526), FRAC_CONST(0.000918274), FRAC_CONST(0.000240327), FRAC_CONST(6.0794E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(3.81375E-006) }, { FRAC_CONST(0.00775006), FRAC_CONST(0.00774443), FRAC_CONST(0.00772201), FRAC_CONST(0.00763359), FRAC_CONST(0.00729927), FRAC_CONST(0.00621118), FRAC_CONST(0.00389105), FRAC_CONST(0.00156006), FRAC_CONST(0.000459348), FRAC_CONST(0.000120178), FRAC_CONST(3.03979E-005), FRAC_CONST(7.62189E-006), FRAC_CONST(1.90688E-006) }, { FRAC_CONST(0.0038901), FRAC_CONST(0.00388727), FRAC_CONST(0.00387597), FRAC_CONST(0.00383142), FRAC_CONST(0.003663), FRAC_CONST(0.00311526), FRAC_CONST(0.00194932), FRAC_CONST(0.00078064), FRAC_CONST(0.000229727), FRAC_CONST(6.00925E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(3.81096E-006), FRAC_CONST(9.53441E-007) }, { FRAC_CONST(0.00194884), FRAC_CONST(0.00194742), FRAC_CONST(0.00194175), FRAC_CONST(0.00191939), FRAC_CONST(0.00183486), FRAC_CONST(0.00156006), FRAC_CONST(0.00097561), FRAC_CONST(0.000390472), FRAC_CONST(0.000114877), FRAC_CONST(3.00472E-005), FRAC_CONST(7.59965E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(4.76721E-007) }, { FRAC_CONST(0.000975372), FRAC_CONST(0.000974659), FRAC_CONST(0.000971817), FRAC_CONST(0.000960615), FRAC_CONST(0.000918274), FRAC_CONST(0.00078064), FRAC_CONST(0.000488043), FRAC_CONST(0.000195274), FRAC_CONST(5.74416E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(3.79984E-006), FRAC_CONST(9.52743E-007), FRAC_CONST(2.3836E-007) }, { FRAC_CONST(0.000487924), FRAC_CONST(0.000487567), FRAC_CONST(0.000486145), FRAC_CONST(0.000480538), FRAC_CONST(0.000459348), FRAC_CONST(0.000390472), FRAC_CONST(0.000244081), FRAC_CONST(9.76467E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(7.51196E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(4.76372E-007), FRAC_CONST(1.1918E-007) }, { FRAC_CONST(0.000244021), FRAC_CONST(0.000243843), FRAC_CONST(0.000243132), FRAC_CONST(0.000240327), FRAC_CONST(0.000229727), FRAC_CONST(0.000195274), FRAC_CONST(0.000122055), FRAC_CONST(4.88257E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(3.756E-006), FRAC_CONST(9.49963E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(5.95901E-008) }, { FRAC_CONST(0.000122026), FRAC_CONST(0.000121936), FRAC_CONST(0.000121581), FRAC_CONST(0.000120178), FRAC_CONST(0.000114877), FRAC_CONST(9.76467E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(7.18056E-006), FRAC_CONST(1.878E-006), FRAC_CONST(4.74982E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(2.9795E-008) }, { FRAC_CONST(6.10165E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(3.59029E-006), FRAC_CONST(9.39002E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(5.95465E-008), FRAC_CONST(1.48975E-008) }, { FRAC_CONST(3.05092E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(1.52586E-005), FRAC_CONST(6.10348E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(4.69501E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(2.97732E-008), FRAC_CONST(7.44876E-009) }, { FRAC_CONST(1.52548E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(7.62934E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(8.97575E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(5.93727E-008), FRAC_CONST(1.48866E-008), FRAC_CONST(3.72438E-009) }, { FRAC_CONST(7.62747E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(4.48788E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(2.96864E-008), FRAC_CONST(7.44331E-009), FRAC_CONST(1.86219E-009) }, { FRAC_CONST(3.81375E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(1.90734E-006), FRAC_CONST(7.62939E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(5.86876E-008), FRAC_CONST(1.48432E-008), FRAC_CONST(3.72166E-009), FRAC_CONST(9.31095E-010) }, { FRAC_CONST(1.90688E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(9.53673E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(2.93438E-008), FRAC_CONST(7.42159E-009), FRAC_CONST(1.86083E-009), FRAC_CONST(4.65548E-010) }, { FRAC_CONST(9.53441E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(5.60985E-008), FRAC_CONST(1.46719E-008), FRAC_CONST(3.71079E-009), FRAC_CONST(9.30414E-010), FRAC_CONST(2.32774E-010) }, { FRAC_CONST(4.76721E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(2.38419E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(2.80492E-008), FRAC_CONST(7.33596E-009), FRAC_CONST(1.8554E-009), FRAC_CONST(4.65207E-010), FRAC_CONST(1.16387E-010) }, { FRAC_CONST(2.3836E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(1.19209E-007), FRAC_CONST(4.76837E-008), FRAC_CONST(1.40246E-008), FRAC_CONST(3.66798E-009), FRAC_CONST(9.27699E-010), FRAC_CONST(2.32603E-010), FRAC_CONST(5.81935E-011) }, { FRAC_CONST(1.1918E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(2.38419E-008), FRAC_CONST(7.01231E-009), FRAC_CONST(1.83399E-009), FRAC_CONST(4.63849E-010), FRAC_CONST(1.16302E-010), FRAC_CONST(2.90967E-011) } }; /* calculates Q/(1+Q) */ /* [0..1] */ static real_t calc_Q_div2(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) { if (sbr->bs_coupling) { if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) { return 0; } else { /* the pan parameter is always even */ if (ch == 0) { return Q_div2_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } else { return Q_div2_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } } } else { /* no coupling */ if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) { return 0; } else { return Q_div2_tab[sbr->Q[ch][m][l]]; } } } static const real_t E_deq_tab[64] = { 64.0f, 128.0f, 256.0f, 512.0f, 1024.0f, 2048.0f, 4096.0f, 8192.0f, 16384.0f, 32768.0f, 65536.0f, 131072.0f, 262144.0f, 524288.0f, 1.04858E+006f, 2.09715E+006f, 4.1943E+006f, 8.38861E+006f, 1.67772E+007f, 3.35544E+007f, 6.71089E+007f, 1.34218E+008f, 2.68435E+008f, 5.36871E+008f, 1.07374E+009f, 2.14748E+009f, 4.29497E+009f, 8.58993E+009f, 1.71799E+010f, 3.43597E+010f, 6.87195E+010f, 1.37439E+011f, 2.74878E+011f, 5.49756E+011f, 1.09951E+012f, 2.19902E+012f, 4.39805E+012f, 8.79609E+012f, 1.75922E+013f, 3.51844E+013f, 7.03687E+013f, 1.40737E+014f, 2.81475E+014f, 5.6295E+014f, 1.1259E+015f, 2.2518E+015f, 4.5036E+015f, 9.0072E+015f, 1.80144E+016f, 3.60288E+016f, 7.20576E+016f, 1.44115E+017f, 2.8823E+017f, 5.76461E+017f, 1.15292E+018f, 2.30584E+018f, 4.61169E+018f, 9.22337E+018f, 1.84467E+019f, 3.68935E+019f, 7.3787E+019f, 1.47574E+020f, 2.95148E+020f, 5.90296E+020f }; void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) { if (sbr->bs_coupling == 0) { int16_t exp; uint8_t l, k; uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; for (l = 0; l < sbr->L_E[ch]; l++) { for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { /* +6 for the *64 and -10 for the /32 in the synthesis QMF (fixed) * since this is a energy value: (x/32)^2 = (x^2)/1024 */ /* exp = (sbr->E[ch][k][l] >> amp) + 6; */ exp = (sbr->E[ch][k][l] >> amp); if ((exp < 0) || (exp >= 64)) { sbr->E_orig[ch][k][l] = 0; } else { sbr->E_orig[ch][k][l] = E_deq_tab[exp]; /* save half the table size at the cost of 1 multiply */ if (amp && (sbr->E[ch][k][l] & 1)) { sbr->E_orig[ch][k][l] = MUL_C(sbr->E_orig[ch][k][l], COEF_CONST(1.414213562)); } } } } for (l = 0; l < sbr->L_Q[ch]; l++) { for (k = 0; k < sbr->N_Q; k++) { sbr->Q_div[ch][k][l] = calc_Q_div(sbr, ch, k, l); sbr->Q_div2[ch][k][l] = calc_Q_div2(sbr, ch, k, l); } } } } static const real_t E_pan_tab[25] = { FRAC_CONST(0.000244081), FRAC_CONST(0.000488043), FRAC_CONST(0.00097561), FRAC_CONST(0.00194932), FRAC_CONST(0.00389105), FRAC_CONST(0.00775194), FRAC_CONST(0.0153846), FRAC_CONST(0.030303), FRAC_CONST(0.0588235), FRAC_CONST(0.111111), FRAC_CONST(0.2), FRAC_CONST(0.333333), FRAC_CONST(0.5), FRAC_CONST(0.666667), FRAC_CONST(0.8), FRAC_CONST(0.888889), FRAC_CONST(0.941176), FRAC_CONST(0.969697), FRAC_CONST(0.984615), FRAC_CONST(0.992248), FRAC_CONST(0.996109), FRAC_CONST(0.998051), FRAC_CONST(0.999024), FRAC_CONST(0.999512), FRAC_CONST(0.999756) }; void unmap_envelope_noise(sbr_info *sbr) { real_t tmp; int16_t exp0, exp1; uint8_t l, k; uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; for (l = 0; l < sbr->L_E[0]; l++) { for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) { /* +6: * 64 ; +1: * 2 ; */ exp0 = (sbr->E[0][k][l] >> amp0) + 1; /* UN_MAP removed: (x / 4096) same as (x >> 12) */ /* E[1] is always even so no need for compensating the divide by 2 with * an extra multiplication */ /* exp1 = (sbr->E[1][k][l] >> amp1) - 12; */ exp1 = (sbr->E[1][k][l] >> amp1); if ((exp0 < 0) || (exp0 >= 64) || (exp1 < 0) || (exp1 > 24)) { sbr->E_orig[1][k][l] = 0; sbr->E_orig[0][k][l] = 0; } else { tmp = E_deq_tab[exp0]; if (amp0 && (sbr->E[0][k][l] & 1)) { tmp = MUL_C(tmp, COEF_CONST(1.414213562)); } /* panning */ sbr->E_orig[0][k][l] = MUL_F(tmp, E_pan_tab[exp1]); sbr->E_orig[1][k][l] = MUL_F(tmp, E_pan_tab[24 - exp1]); } } } for (l = 0; l < sbr->L_Q[0]; l++) { for (k = 0; k < sbr->N_Q; k++) { sbr->Q_div[0][k][l] = calc_Q_div(sbr, 0, k, l); sbr->Q_div[1][k][l] = calc_Q_div(sbr, 1, k, l); sbr->Q_div2[0][k][l] = calc_Q_div2(sbr, 0, k, l); sbr->Q_div2[1][k][l] = calc_Q_div2(sbr, 1, k, l); } } } #endif #endif faad2-2_10_0/libfaad/sbr_e_nf.h000066400000000000000000000032061374350120500162220ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_e_nf.h,v 1.18 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_E_NF_H__ #define __SBR_E_NF_H__ #ifdef __cplusplus extern "C" { #endif void extract_envelope_data(sbr_info *sbr, uint8_t ch); void extract_noise_floor_data(sbr_info *sbr, uint8_t ch); #ifndef FIXED_POINT void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch); void unmap_envelope_noise(sbr_info *sbr); #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_fbt.c000066400000000000000000000572611374350120500160730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_fbt.c,v 1.21 2007/11/01 12:33:35 menno Exp $ **/ /* Calculate frequency band tables */ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include #include "sbr_syntax.h" #include "sbr_fbt.h" /* static function declarations */ static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1); /* calculate the start QMF channel for the master frequency band table */ /* parameter is also called k0 */ uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, uint32_t sample_rate) { static const uint8_t startMinTable[12] = { 7, 7, 10, 11, 12, 16, 16, 17, 24, 32, 35, 48 }; static const uint8_t offsetIndexTable[12] = { 5, 5, 4, 4, 4, 3, 2, 1, 0, 6, 6, 6 }; static const int8_t offset[7][16] = { { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 }, { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 }, { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 }, { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 }, { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 } }; uint8_t startMin = startMinTable[get_sr_index(sample_rate)]; uint8_t offsetIndex = offsetIndexTable[get_sr_index(sample_rate)]; #if 0 /* replaced with table (startMinTable) */ if (sample_rate >= 64000) { startMin = (uint8_t)((5000.*128.)/(float)sample_rate + 0.5); } else if (sample_rate < 32000) { startMin = (uint8_t)((3000.*128.)/(float)sample_rate + 0.5); } else { startMin = (uint8_t)((4000.*128.)/(float)sample_rate + 0.5); } #endif if (bs_samplerate_mode) { return startMin + offset[offsetIndex][bs_start_freq]; #if 0 /* replaced by offsetIndexTable */ switch (sample_rate) { case 16000: return startMin + offset[0][bs_start_freq]; case 22050: return startMin + offset[1][bs_start_freq]; case 24000: return startMin + offset[2][bs_start_freq]; case 32000: return startMin + offset[3][bs_start_freq]; default: if (sample_rate > 64000) { return startMin + offset[5][bs_start_freq]; } else { /* 44100 <= sample_rate <= 64000 */ return startMin + offset[4][bs_start_freq]; } } #endif } else { return startMin + offset[6][bs_start_freq]; } } static int longcmp(const void *a, const void *b) { return ((int)(*(int32_t*)a - *(int32_t*)b)); } /* calculate the stop QMF channel for the master frequency band table */ /* parameter is also called k2 */ uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, uint8_t k0) { if (bs_stop_freq == 15) { return min(64, k0 * 3); } else if (bs_stop_freq == 14) { return min(64, k0 * 2); } else { static const uint8_t stopMinTable[12] = { 13, 15, 20, 21, 23, 32, 32, 35, 48, 64, 70, 96 }; static const int8_t offset[12][14] = { { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 37, 44, 51 }, { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 36, 42, 49 }, { 0, 2, 4, 6, 8, 11, 14, 17, 21, 25, 29, 34, 39, 44 }, { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 33, 38, 43 }, { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 32, 36, 41 }, { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, { 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 20, 23, 26, 29 }, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -6, -6, -6 }, { 0, -3, -6, -9, -12, -15, -18, -20, -22, -24, -26, -28, -30, -32 } }; #if 0 uint8_t i; int32_t stopDk[13], stopDk_t[14], k2; #endif uint8_t stopMin = stopMinTable[get_sr_index(sample_rate)]; #if 0 /* replaced by table lookup */ if (sample_rate >= 64000) { stopMin = (uint8_t)((10000.*128.)/(float)sample_rate + 0.5); } else if (sample_rate < 32000) { stopMin = (uint8_t)((6000.*128.)/(float)sample_rate + 0.5); } else { stopMin = (uint8_t)((8000.*128.)/(float)sample_rate + 0.5); } #endif #if 0 /* replaced by table lookup */ /* diverging power series */ for (i = 0; i <= 13; i++) { stopDk_t[i] = (int32_t)(stopMin*pow(64.0/stopMin, i/13.0) + 0.5); } for (i = 0; i < 13; i++) { stopDk[i] = stopDk_t[i+1] - stopDk_t[i]; } /* needed? */ qsort(stopDk, 13, sizeof(stopDk[0]), longcmp); k2 = stopMin; for (i = 0; i < bs_stop_freq; i++) { k2 += stopDk[i]; } return min(64, k2); #endif /* bs_stop_freq <= 13 */ return min(64, stopMin + offset[get_sr_index(sample_rate)][min(bs_stop_freq, 13)]); } return 0; } /* calculate the master frequency table from k0, k2, bs_freq_scale and bs_alter_scale version for bs_freq_scale = 0 */ uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, uint8_t bs_alter_scale) { int8_t incr; uint8_t k; uint8_t dk; uint32_t nrBands, k2Achieved; int32_t k2Diff, vDk[64] = {0}; /* mft only defined for k2 > k0 */ if (k2 <= k0) { sbr->N_master = 0; return 1; } dk = bs_alter_scale ? 2 : 1; #if 0 /* replaced by float-less design */ nrBands = 2 * (int32_t)((float)(k2-k0)/(dk*2) + (-1+dk)/2.0f); #else if (bs_alter_scale) { nrBands = (((k2-k0+2)>>2)<<1); } else { nrBands = (((k2-k0)>>1)<<1); } #endif nrBands = min(nrBands, 63); if (nrBands <= 0) return 1; k2Achieved = k0 + nrBands * dk; k2Diff = k2 - k2Achieved; for (k = 0; k < nrBands; k++) vDk[k] = dk; if (k2Diff) { incr = (k2Diff > 0) ? -1 : 1; k = (uint8_t) ((k2Diff > 0) ? (nrBands-1) : 0); while (k2Diff != 0) { vDk[k] -= incr; k += incr; k2Diff += incr; } } sbr->f_master[0] = k0; for (k = 1; k <= nrBands; k++) sbr->f_master[k] = (uint8_t)(sbr->f_master[k-1] + vDk[k-1]); sbr->N_master = (uint8_t)nrBands; sbr->N_master = (min(sbr->N_master, 64)); #if 0 printf("f_master[%d]: ", nrBands); for (k = 0; k <= nrBands; k++) { printf("%d ", sbr->f_master[k]); } printf("\n"); #endif return 0; } /* This function finds the number of bands using this formula: bands * log(a1/a0)/log(2.0) + 0.5 */ static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1) { #ifdef FIXED_POINT /* table with log2() values */ static const real_t log2Table[65] = { COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(1.0000000000), COEF_CONST(1.5849625007), COEF_CONST(2.0000000000), COEF_CONST(2.3219280949), COEF_CONST(2.5849625007), COEF_CONST(2.8073549221), COEF_CONST(3.0000000000), COEF_CONST(3.1699250014), COEF_CONST(3.3219280949), COEF_CONST(3.4594316186), COEF_CONST(3.5849625007), COEF_CONST(3.7004397181), COEF_CONST(3.8073549221), COEF_CONST(3.9068905956), COEF_CONST(4.0000000000), COEF_CONST(4.0874628413), COEF_CONST(4.1699250014), COEF_CONST(4.2479275134), COEF_CONST(4.3219280949), COEF_CONST(4.3923174228), COEF_CONST(4.4594316186), COEF_CONST(4.5235619561), COEF_CONST(4.5849625007), COEF_CONST(4.6438561898), COEF_CONST(4.7004397181), COEF_CONST(4.7548875022), COEF_CONST(4.8073549221), COEF_CONST(4.8579809951), COEF_CONST(4.9068905956), COEF_CONST(4.9541963104), COEF_CONST(5.0000000000), COEF_CONST(5.0443941194), COEF_CONST(5.0874628413), COEF_CONST(5.1292830169), COEF_CONST(5.1699250014), COEF_CONST(5.2094533656), COEF_CONST(5.2479275134), COEF_CONST(5.2854022189), COEF_CONST(5.3219280949), COEF_CONST(5.3575520046), COEF_CONST(5.3923174228), COEF_CONST(5.4262647547), COEF_CONST(5.4594316186), COEF_CONST(5.4918530963), COEF_CONST(5.5235619561), COEF_CONST(5.5545888517), COEF_CONST(5.5849625007), COEF_CONST(5.6147098441), COEF_CONST(5.6438561898), COEF_CONST(5.6724253420), COEF_CONST(5.7004397181), COEF_CONST(5.7279204546), COEF_CONST(5.7548875022), COEF_CONST(5.7813597135), COEF_CONST(5.8073549221), COEF_CONST(5.8328900142), COEF_CONST(5.8579809951), COEF_CONST(5.8826430494), COEF_CONST(5.9068905956), COEF_CONST(5.9307373376), COEF_CONST(5.9541963104), COEF_CONST(5.9772799235), COEF_CONST(6.0) }; real_t r0 = log2Table[a0]; /* coef */ real_t r1 = log2Table[a1]; /* coef */ real_t r2 = (r1 - r0); /* coef */ if (warp) r2 = MUL_C(r2, COEF_CONST(1.0/1.3)); /* convert r2 to real and then multiply and round */ r2 = (r2 >> (COEF_BITS-REAL_BITS)) * bands + (1<<(REAL_BITS-1)); return (r2 >> REAL_BITS); #else real_t div = (real_t)log(2.0); if (warp) div *= (real_t)1.3; return (int32_t)(bands * log((float)a1/(float)a0)/div + 0.5); #endif } static real_t find_initial_power(uint8_t bands, uint8_t a0, uint8_t a1) { #ifdef FIXED_POINT /* table with log() values */ static const real_t logTable[65] = { COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(0.6931471806), COEF_CONST(1.0986122887), COEF_CONST(1.3862943611), COEF_CONST(1.6094379124), COEF_CONST(1.7917594692), COEF_CONST(1.9459101491), COEF_CONST(2.0794415417), COEF_CONST(2.1972245773), COEF_CONST(2.3025850930), COEF_CONST(2.3978952728), COEF_CONST(2.4849066498), COEF_CONST(2.5649493575), COEF_CONST(2.6390573296), COEF_CONST(2.7080502011), COEF_CONST(2.7725887222), COEF_CONST(2.8332133441), COEF_CONST(2.8903717579), COEF_CONST(2.9444389792), COEF_CONST(2.9957322736), COEF_CONST(3.0445224377), COEF_CONST(3.0910424534), COEF_CONST(3.1354942159), COEF_CONST(3.1780538303), COEF_CONST(3.2188758249), COEF_CONST(3.2580965380), COEF_CONST(3.2958368660), COEF_CONST(3.3322045102), COEF_CONST(3.3672958300), COEF_CONST(3.4011973817), COEF_CONST(3.4339872045), COEF_CONST(3.4657359028), COEF_CONST(3.4965075615), COEF_CONST(3.5263605246), COEF_CONST(3.5553480615), COEF_CONST(3.5835189385), COEF_CONST(3.6109179126), COEF_CONST(3.6375861597), COEF_CONST(3.6635616461), COEF_CONST(3.6888794541), COEF_CONST(3.7135720667), COEF_CONST(3.7376696183), COEF_CONST(3.7612001157), COEF_CONST(3.7841896339), COEF_CONST(3.8066624898), COEF_CONST(3.8286413965), COEF_CONST(3.8501476017), COEF_CONST(3.8712010109), COEF_CONST(3.8918202981), COEF_CONST(3.9120230054), COEF_CONST(3.9318256327), COEF_CONST(3.9512437186), COEF_CONST(3.9702919136), COEF_CONST(3.9889840466), COEF_CONST(4.0073331852), COEF_CONST(4.0253516907), COEF_CONST(4.0430512678), COEF_CONST(4.0604430105), COEF_CONST(4.0775374439), COEF_CONST(4.0943445622), COEF_CONST(4.1108738642), COEF_CONST(4.1271343850), COEF_CONST(4.1431347264), COEF_CONST(4.158883083) }; /* standard Taylor polynomial coefficients for exp(x) around 0 */ /* a polynomial around x=1 is more precise, as most values are around 1.07, but this is just fine already */ static const real_t c1 = COEF_CONST(1.0); static const real_t c2 = COEF_CONST(1.0/2.0); static const real_t c3 = COEF_CONST(1.0/6.0); static const real_t c4 = COEF_CONST(1.0/24.0); real_t r0 = logTable[a0]; /* coef */ real_t r1 = logTable[a1]; /* coef */ real_t r2 = (r1 - r0) / bands; /* coef */ real_t rexp = c1 + MUL_C((c1 + MUL_C((c2 + MUL_C((c3 + MUL_C(c4,r2)), r2)), r2)), r2); return (rexp >> (COEF_BITS-REAL_BITS)); /* real */ #else return (real_t)pow((real_t)a1/(real_t)a0, 1.0/(real_t)bands); #endif } /* version for bs_freq_scale > 0 */ uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, uint8_t bs_freq_scale, uint8_t bs_alter_scale) { uint8_t k, bands, twoRegions; uint8_t k1; uint8_t nrBand0, nrBand1; int32_t vDk0[64] = {0}, vDk1[64] = {0}; int32_t vk0[64] = {0}, vk1[64] = {0}; uint8_t temp1[] = { 6, 5, 4 }; real_t q, qk; int32_t A_1; #ifdef FIXED_POINT real_t rk2, rk0; #endif /* mft only defined for k2 > k0 */ if (k2 <= k0) { sbr->N_master = 0; return 1; } bands = temp1[bs_freq_scale-1]; #ifdef FIXED_POINT rk0 = (real_t)k0 << REAL_BITS; rk2 = (real_t)k2 << REAL_BITS; if (rk2 > MUL_C(rk0, COEF_CONST(2.2449))) #else if ((float)k2/(float)k0 > 2.2449) #endif { twoRegions = 1; k1 = k0 << 1; } else { twoRegions = 0; k1 = k2; } nrBand0 = (uint8_t)(2 * find_bands(0, bands, k0, k1)); nrBand0 = min(nrBand0, 63); if (nrBand0 <= 0) return 1; q = find_initial_power(nrBand0, k0, k1); #ifdef FIXED_POINT qk = (real_t)k0 << REAL_BITS; //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); A_1 = k0; #else qk = REAL_CONST(k0); A_1 = (int32_t)(qk + .5); #endif for (k = 0; k <= nrBand0; k++) { int32_t A_0 = A_1; #ifdef FIXED_POINT qk = MUL_R(qk,q); A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); #else qk *= q; A_1 = (int32_t)(qk + 0.5); #endif vDk0[k] = A_1 - A_0; } /* needed? */ qsort(vDk0, nrBand0, sizeof(vDk0[0]), longcmp); vk0[0] = k0; for (k = 1; k <= nrBand0; k++) { vk0[k] = vk0[k-1] + vDk0[k-1]; if (vDk0[k-1] == 0) return 1; } if (!twoRegions) { for (k = 0; k <= nrBand0; k++) sbr->f_master[k] = (uint8_t) vk0[k]; sbr->N_master = nrBand0; sbr->N_master = min(sbr->N_master, 64); return 0; } nrBand1 = (uint8_t)(2 * find_bands(1 /* warped */, bands, k1, k2)); nrBand1 = min(nrBand1, 63); q = find_initial_power(nrBand1, k1, k2); #ifdef FIXED_POINT qk = (real_t)k1 << REAL_BITS; //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); A_1 = k1; #else qk = REAL_CONST(k1); A_1 = (int32_t)(qk + .5); #endif for (k = 0; k <= nrBand1 - 1; k++) { int32_t A_0 = A_1; #ifdef FIXED_POINT qk = MUL_R(qk,q); A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); #else qk *= q; A_1 = (int32_t)(qk + 0.5); #endif vDk1[k] = A_1 - A_0; } if (vDk1[0] < vDk0[nrBand0 - 1]) { int32_t change; /* needed? */ qsort(vDk1, nrBand1 + 1, sizeof(vDk1[0]), longcmp); change = vDk0[nrBand0 - 1] - vDk1[0]; vDk1[0] = vDk0[nrBand0 - 1]; vDk1[nrBand1 - 1] = vDk1[nrBand1 - 1] - change; } /* needed? */ qsort(vDk1, nrBand1, sizeof(vDk1[0]), longcmp); vk1[0] = k1; for (k = 1; k <= nrBand1; k++) { vk1[k] = vk1[k-1] + vDk1[k-1]; if (vDk1[k-1] == 0) return 1; } sbr->N_master = nrBand0 + nrBand1; sbr->N_master = min(sbr->N_master, 64); for (k = 0; k <= nrBand0; k++) { sbr->f_master[k] = (uint8_t) vk0[k]; } for (k = nrBand0 + 1; k <= sbr->N_master; k++) { sbr->f_master[k] = (uint8_t) vk1[k - nrBand0]; } #if 0 printf("f_master[%d]: ", sbr->N_master); for (k = 0; k <= sbr->N_master; k++) { printf("%d ", sbr->f_master[k]); } printf("\n"); #endif return 0; } /* calculate the derived frequency border tables from f_master */ uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, uint8_t k2) { uint8_t k, i; uint32_t minus; /* The following relation shall be satisfied: bs_xover_band < N_Master */ if (sbr->N_master <= bs_xover_band) return 1; sbr->N_high = sbr->N_master - bs_xover_band; sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1)); sbr->n[0] = sbr->N_low; sbr->n[1] = sbr->N_high; for (k = 0; k <= sbr->N_high; k++) { sbr->f_table_res[HI_RES][k] = sbr->f_master[k + bs_xover_band]; } sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0]; if (sbr->M > MAX_M) return 1; sbr->kx = sbr->f_table_res[HI_RES][0]; if (sbr->kx > 32) return 1; if (sbr->kx + sbr->M > 64) return 1; minus = (sbr->N_high & 1) ? 1 : 0; for (k = 0; k <= sbr->N_low; k++) { if (k == 0) i = 0; else i = (uint8_t)(2*k - minus); sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i]; } #if 0 printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); printf("f_table_res[HI_RES][%d]: ", sbr->N_high); for (k = 0; k <= sbr->N_high; k++) { printf("%d ", sbr->f_table_res[HI_RES][k]); } printf("\n"); #endif #if 0 printf("f_table_res[LO_RES][%d]: ", sbr->N_low); for (k = 0; k <= sbr->N_low; k++) { printf("%d ", sbr->f_table_res[LO_RES][k]); } printf("\n"); #endif sbr->N_Q = 0; if (sbr->bs_noise_bands == 0) { sbr->N_Q = 1; } else { #if 0 sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5)); #else sbr->N_Q = (uint8_t)(max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2))); #endif sbr->N_Q = min(5, sbr->N_Q); } for (k = 0; k <= sbr->N_Q; k++) { if (k == 0) { i = 0; } else { /* i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k)); */ i = i + (sbr->N_low - i)/(sbr->N_Q + 1 - k); } sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i]; } /* build table for mapping k to g in hf patching */ for (k = 0; k < 64; k++) { uint8_t g; for (g = 0; g < sbr->N_Q; g++) { if ((sbr->f_table_noise[g] <= k) && (k < sbr->f_table_noise[g+1])) { sbr->table_map_k_to_g[k] = g; break; } } } #if 0 printf("f_table_noise[%d]: ", sbr->N_Q); for (k = 0; k <= sbr->N_Q; k++) { printf("%d ", sbr->f_table_noise[k] - sbr->kx); } printf("\n"); #endif return 0; } /* TODO: blegh, ugly */ /* Modified to calculate for all possible bs_limiter_bands always * This reduces the number calls to this functions needed (now only on * header reset) */ void limiter_frequency_table(sbr_info *sbr) { #if 0 static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2), REAL_CONST(2), REAL_CONST(3) }; #else static const real_t limiterBandsCompare[] = { REAL_CONST(1.327152), REAL_CONST(1.185093), REAL_CONST(1.119872) }; #endif uint8_t k, s; int8_t nrLim; #if 0 real_t limBands; #endif sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx; sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx; sbr->N_L[0] = 1; #if 0 printf("f_table_lim[%d][%d]: ", 0, sbr->N_L[0]); for (k = 0; k <= sbr->N_L[0]; k++) { printf("%d ", sbr->f_table_lim[0][k]); } printf("\n"); #endif for (s = 1; s < 4; s++) { int32_t limTable[100 /*TODO*/] = {0}; uint8_t patchBorders[64/*??*/] = {0}; #if 0 limBands = limiterBandsPerOctave[s - 1]; #endif patchBorders[0] = sbr->kx; for (k = 1; k <= sbr->noPatches; k++) { patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1]; } for (k = 0; k <= sbr->N_low; k++) { limTable[k] = sbr->f_table_res[LO_RES][k]; } for (k = 1; k < sbr->noPatches; k++) { limTable[k+sbr->N_low] = patchBorders[k]; } /* needed */ qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); k = 1; nrLim = sbr->noPatches + sbr->N_low - 1; if (nrLim < 0) // TODO: BIG FAT PROBLEM return; restart: if (k <= nrLim) { real_t nOctaves; if (limTable[k-1] != 0) #if 0 nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0)); #else #ifdef FIXED_POINT nOctaves = DIV_R((limTable[k]<noPatches; i++) { if (limTable[k] == patchBorders[i]) found = 1; } if (found) { found2 = 0; for (i = 0; i <= sbr->noPatches; i++) { if (limTable[k-1] == patchBorders[i]) found2 = 1; } if (found2) { k++; goto restart; } else { /* remove (k-1)th element */ limTable[k-1] = sbr->f_table_res[LO_RES][sbr->N_low]; qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); nrLim--; goto restart; } } } /* remove kth element */ limTable[k] = sbr->f_table_res[LO_RES][sbr->N_low]; qsort(limTable, nrLim, sizeof(limTable[0]), longcmp); nrLim--; goto restart; } else { k++; goto restart; } } sbr->N_L[s] = nrLim; for (k = 0; k <= nrLim; k++) { sbr->f_table_lim[s][k] = limTable[k] - sbr->kx; } #if 0 printf("f_table_lim[%d][%d]: ", s, sbr->N_L[s]); for (k = 0; k <= sbr->N_L[s]; k++) { printf("%d ", sbr->f_table_lim[s][k]); } printf("\n"); #endif } } #endif faad2-2_10_0/libfaad/sbr_fbt.h000066400000000000000000000040641374350120500160710ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_fbt.h,v 1.18 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_FBT_H__ #define __SBR_FBT_H__ #ifdef __cplusplus extern "C" { #endif uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, uint32_t sample_rate); uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, uint8_t k0); uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, uint8_t bs_alter_scale); uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, uint8_t bs_freq_scale, uint8_t bs_alter_scale); uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, uint8_t k2); void limiter_frequency_table(sbr_info *sbr); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_hfadj.c000066400000000000000000002501571374350120500163730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_hfadj.c,v 1.23 2008/09/19 22:50:20 menno Exp $ **/ /* High Frequency adjustment */ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include "sbr_syntax.h" #include "sbr_hfadj.h" #include "sbr_noise.h" /* static function declarations */ static uint8_t estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); #ifdef SBR_LOW_POWER static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); #endif static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); uint8_t hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg /* aliasing degree */ #endif ,uint8_t ch) { ALIGN sbr_hfadj_info adj = {{{0}}}; uint8_t ret = 0; if (sbr->bs_frame_class[ch] == FIXFIX) { sbr->l_A[ch] = -1; } else if (sbr->bs_frame_class[ch] == VARFIX) { if (sbr->bs_pointer[ch] > 1) sbr->l_A[ch] = sbr->bs_pointer[ch] - 1; else sbr->l_A[ch] = -1; } else { if (sbr->bs_pointer[ch] == 0) sbr->l_A[ch] = -1; else sbr->l_A[ch] = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; } ret = estimate_current_envelope(sbr, &adj, Xsbr, ch); if (ret > 0) return 1; calculate_gain(sbr, &adj, ch); #ifdef SBR_LOW_POWER calc_gain_groups(sbr, &adj, deg, ch); aliasing_reduction(sbr, &adj, deg, ch); #endif hf_assembly(sbr, &adj, Xsbr, ch); return 0; } static uint8_t get_S_mapped(sbr_info *sbr, uint8_t ch, uint8_t l, uint8_t current_band) { if (sbr->f[ch][l] == HI_RES) { /* in case of using f_table_high we just have 1 to 1 mapping * from bs_add_harmonic[l][k] */ if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][current_band] && sbr->bs_add_harmonic_flag_prev[ch])) { return sbr->bs_add_harmonic[ch][current_band]; } } else { uint8_t b, lb, ub; /* in case of f_table_low we check if any of the HI_RES bands * within this LO_RES band has bs_add_harmonic[l][k] turned on * (note that borders in the LO_RES table are also present in * the HI_RES table) */ /* find first HI_RES band in current LO_RES band */ lb = 2*current_band - ((sbr->N_high & 1) ? 1 : 0); /* find first HI_RES band in next LO_RES band */ ub = 2*(current_band+1) - ((sbr->N_high & 1) ? 1 : 0); /* check all HI_RES bands in current LO_RES band for sinusoid */ for (b = lb; b < ub; b++) { if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][b] && sbr->bs_add_harmonic_flag_prev[ch])) { if (sbr->bs_add_harmonic[ch][b] == 1) return 1; } } } return 0; } static uint8_t estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) { uint8_t m, l, j, k, k_l, k_h, p; real_t nrg, div; if (sbr->bs_interpol_freq == 1) { for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t i, l_i, u_i; l_i = sbr->t_E[ch][l]; u_i = sbr->t_E[ch][l+1]; div = (real_t)(u_i - l_i); if (div == 0) div = 1; for (m = 0; m < sbr->M; m++) { nrg = 0; for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) { #ifdef FIXED_POINT #ifdef SBR_LOW_POWER nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); #else nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS) + ((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); #endif #else nrg += MUL_R(QMF_RE(Xsbr[i][m + sbr->kx]), QMF_RE(Xsbr[i][m + sbr->kx])) #ifndef SBR_LOW_POWER + MUL_R(QMF_IM(Xsbr[i][m + sbr->kx]), QMF_IM(Xsbr[i][m + sbr->kx])) #endif ; #endif } sbr->E_curr[ch][m][l] = nrg / div; #ifdef SBR_LOW_POWER #ifdef FIXED_POINT sbr->E_curr[ch][m][l] <<= 1; #else sbr->E_curr[ch][m][l] *= 2; #endif #endif } } } else { for (l = 0; l < sbr->L_E[ch]; l++) { for (p = 0; p < sbr->n[sbr->f[ch][l]]; p++) { k_l = sbr->f_table_res[sbr->f[ch][l]][p]; k_h = sbr->f_table_res[sbr->f[ch][l]][p+1]; for (k = k_l; k < k_h; k++) { uint8_t i, l_i, u_i; nrg = 0; l_i = sbr->t_E[ch][l]; u_i = sbr->t_E[ch][l+1]; div = (real_t)((u_i - l_i)*(k_h - k_l)); if (div == 0) div = 1; for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) { for (j = k_l; j < k_h; j++) { #ifdef FIXED_POINT #ifdef SBR_LOW_POWER nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); #else nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS) + ((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); #endif #else nrg += MUL_R(QMF_RE(Xsbr[i][j]), QMF_RE(Xsbr[i][j])) #ifndef SBR_LOW_POWER + MUL_R(QMF_IM(Xsbr[i][j]), QMF_IM(Xsbr[i][j])) #endif ; #endif } } sbr->E_curr[ch][k - sbr->kx][l] = nrg / div; #ifdef SBR_LOW_POWER #ifdef FIXED_POINT sbr->E_curr[ch][k - sbr->kx][l] <<= 1; #else sbr->E_curr[ch][k - sbr->kx][l] *= 2; #endif #endif } } } } return 0; } #ifdef FIXED_POINT #define EPS (1) /* smallest number available in fixed point */ #else #define EPS (1e-12) #endif #ifdef FIXED_POINT /* log2 values of [0..63] */ static const real_t log2_int_tab[] = { LOG2_MIN_INF, REAL_CONST(0.000000000000000), REAL_CONST(1.000000000000000), REAL_CONST(1.584962500721156), REAL_CONST(2.000000000000000), REAL_CONST(2.321928094887362), REAL_CONST(2.584962500721156), REAL_CONST(2.807354922057604), REAL_CONST(3.000000000000000), REAL_CONST(3.169925001442313), REAL_CONST(3.321928094887363), REAL_CONST(3.459431618637297), REAL_CONST(3.584962500721156), REAL_CONST(3.700439718141092), REAL_CONST(3.807354922057604), REAL_CONST(3.906890595608519), REAL_CONST(4.000000000000000), REAL_CONST(4.087462841250339), REAL_CONST(4.169925001442312), REAL_CONST(4.247927513443585), REAL_CONST(4.321928094887362), REAL_CONST(4.392317422778761), REAL_CONST(4.459431618637297), REAL_CONST(4.523561956057013), REAL_CONST(4.584962500721156), REAL_CONST(4.643856189774724), REAL_CONST(4.700439718141093), REAL_CONST(4.754887502163468), REAL_CONST(4.807354922057604), REAL_CONST(4.857980995127572), REAL_CONST(4.906890595608519), REAL_CONST(4.954196310386875), REAL_CONST(5.000000000000000), REAL_CONST(5.044394119358453), REAL_CONST(5.087462841250340), REAL_CONST(5.129283016944966), REAL_CONST(5.169925001442312), REAL_CONST(5.209453365628949), REAL_CONST(5.247927513443585), REAL_CONST(5.285402218862248), REAL_CONST(5.321928094887363), REAL_CONST(5.357552004618084), REAL_CONST(5.392317422778761), REAL_CONST(5.426264754702098), REAL_CONST(5.459431618637297), REAL_CONST(5.491853096329675), REAL_CONST(5.523561956057013), REAL_CONST(5.554588851677637), REAL_CONST(5.584962500721156), REAL_CONST(5.614709844115208), REAL_CONST(5.643856189774724), REAL_CONST(5.672425341971495), REAL_CONST(5.700439718141093), REAL_CONST(5.727920454563200), REAL_CONST(5.754887502163469), REAL_CONST(5.781359713524660), REAL_CONST(5.807354922057605), REAL_CONST(5.832890014164742), REAL_CONST(5.857980995127572), REAL_CONST(5.882643049361842), REAL_CONST(5.906890595608518), REAL_CONST(5.930737337562887), REAL_CONST(5.954196310386876), REAL_CONST(5.977279923499916) }; static const real_t pan_log2_tab[] = { REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667) }; static real_t find_log2_E(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; real_t tmp = (7 << REAL_BITS) + (sbr->E[0][k][l] << (REAL_BITS-amp0)); real_t pan; /* E[1] should always be even so shifting is OK */ uint8_t E = sbr->E[1][k][l] >> amp1; if (ch == 0) { if (E > 12) { /* negative */ pan = pan_log2_tab[-12 + E]; } else { /* positive */ pan = pan_log2_tab[12 - E] + ((12 - E)<amp_res[ch]) ? 0 : 1; return (6 << REAL_BITS) + (sbr->E[ch][k][l] << (REAL_BITS-amp)); } } static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { real_t tmp = (7 << REAL_BITS) - (sbr->Q[0][k][l] << REAL_BITS); real_t pan; uint8_t Q = sbr->Q[1][k][l]; if (ch == 0) { if (Q > 12) { /* negative */ pan = pan_log2_tab[-12 + Q]; } else { /* positive */ pan = pan_log2_tab[12 - Q] + ((12 - Q)<Q[ch][k][l] << REAL_BITS); } } static const real_t log_Qplus1_pan[31][13] = { { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } }; static const real_t log_Qplus1[31] = { REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), REAL_CONST(0.000000000000000) }; static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) { if (ch == 0) { return log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]; } else { return log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]; } } else { return 0; } } else { if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) { return log_Qplus1[sbr->Q[ch][k][l]]; } else { return 0; } } } static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) { /* log2 values of limiter gains */ static real_t limGain[] = { REAL_CONST(-1.0), REAL_CONST(0.0), REAL_CONST(1.0), REAL_CONST(33.219) }; uint8_t m, l, k; uint8_t current_t_noise_band = 0; uint8_t S_mapped; ALIGN real_t Q_M_lim[MAX_M]; ALIGN real_t G_lim[MAX_M]; ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; uint8_t current_res_band = 0; uint8_t current_res_band2 = 0; uint8_t current_hi_res_band = 0; real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) { current_t_noise_band++; } for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) { real_t Q_M = 0; real_t G_max; real_t den = 0; real_t acc1 = 0; real_t acc2 = 0; uint8_t current_res_band_size = 0; uint8_t Q_M_size = 0; uint8_t ml1, ml2; /* bounds of current limiter bands */ ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; if (ml1 > MAX_M) ml1 = MAX_M; if (ml2 > MAX_M) ml2 = MAX_M; /* calculate the accumulated E_orig and E_curr over the limiter band */ for (m = ml1; m < ml2; m++) { if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { current_res_band_size++; } else { acc1 += pow2_int(-REAL_CONST(10) + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch)); current_res_band++; current_res_band_size = 1; } acc2 += sbr->E_curr[ch][m][l]; } acc1 += pow2_int(-REAL_CONST(10) + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch)); if (acc1 == 0) acc1 = LOG2_MIN_INF; else acc1 = log2_int(acc1); /* calculate the maximum gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G_max = acc1 - log2_int(acc2) + limGain[sbr->bs_limiter_gains]; G_max = min(G_max, limGain[3]); for (m = ml1; m < ml2; m++) { real_t G; real_t E_curr, E_orig; real_t Q_orig, Q_orig_plus1; uint8_t S_index_mapped; /* check if m is on a noise band border */ if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) { /* step to next noise band */ current_f_noise_band++; } /* check if m is on a resolution band border */ if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) { /* accumulate a whole range of equal Q_Ms */ if (Q_M_size > 0) den += pow2_int(log2_int_tab[Q_M_size] + Q_M); Q_M_size = 0; /* step to next resolution band */ current_res_band2++; /* if we move to a new resolution band, we should check if we are * going to add a sinusoid in this band */ S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); } /* check if m is on a HI_RES band border */ if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) { /* step to next HI_RES band */ current_hi_res_band++; } /* find S_index_mapped * S_index_mapped can only be 1 for the m in the middle of the * current HI_RES band */ S_index_mapped = 0; if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) { /* find the middle subband of the HI_RES frequency band */ if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; } /* find bitstream parameters */ if (sbr->E_curr[ch][m][l] == 0) E_curr = LOG2_MIN_INF; else E_curr = log2_int(sbr->E_curr[ch][m][l]); E_orig = -REAL_CONST(10) + find_log2_E(sbr, current_res_band2, l, ch); Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); /* Q_M only depends on E_orig and Q_div2: * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on * a change of current res band (HI or LO) */ Q_M = E_orig + Q_orig - Q_orig_plus1; /* S_M only depends on E_orig, Q_div and S_index_mapped: * S_index_mapped can only be non-zero once per HI_RES band */ if (S_index_mapped == 0) { S_M[m] = LOG2_MIN_INF; /* -inf */ } else { S_M[m] = E_orig - Q_orig_plus1; /* accumulate sinusoid part of the total energy */ den += pow2_int(S_M[m]); } /* calculate gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ /* scaled by -10 */ G = E_orig - max(-REAL_CONST(10), E_curr); if ((S_mapped == 0) && (delta == 1)) { /* G = G * 1/(1+Q) */ G -= Q_orig_plus1; } else if (S_mapped == 1) { /* G = G * Q/(1+Q) */ G += Q_orig - Q_orig_plus1; } /* limit the additional noise energy level */ /* and apply the limiter */ if (G_max > G) { Q_M_lim[m] = Q_M; G_lim[m] = G; if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) { Q_M_size++; } } else { /* G > G_max */ Q_M_lim[m] = Q_M + G_max - G; G_lim[m] = G_max; /* accumulate limited Q_M */ if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) { den += pow2_int(Q_M_lim[m]); } } /* accumulate the total energy */ /* E_curr changes for every m so we do need to accumulate every m */ den += pow2_int(E_curr + G_lim[m]); } /* accumulate last range of equal Q_Ms */ if (Q_M_size > 0) { den += pow2_int(log2_int_tab[Q_M_size] + Q_M); } /* calculate the final gain */ /* G_boost: [0..2.51188643] */ G_boost = acc1 - log2_int(den /*+ EPS*/); G_boost = min(G_boost, REAL_CONST(1.328771237) /* log2(1.584893192 ^ 2) */); for (m = ml1; m < ml2; m++) { /* apply compensation to gain, noise floor sf's and sinusoid levels */ #ifndef SBR_LOW_POWER adj->G_lim_boost[l][m] = pow2_fix((G_lim[m] + G_boost) >> 1); #else /* sqrt() will be done after the aliasing reduction to save a * few multiplies */ adj->G_lim_boost[l][m] = pow2_fix(G_lim[m] + G_boost); #endif adj->Q_M_lim_boost[l][m] = pow2_fix((Q_M_lim[m] + G_boost) >> 1); if (S_M[m] != LOG2_MIN_INF) { adj->S_M_boost[l][m] = pow2_int((S_M[m] + G_boost) >> 1); } else { adj->S_M_boost[l][m] = 0; } } } } } #else //#define LOG2_TEST #ifdef LOG2_TEST #define LOG2_MIN_INF -100000 __inline float pow2(float val) { return pow(2.0, val); } __inline float log2(float val) { return log(val)/log(2.0); } #define RB 14 float QUANTISE2REAL(float val) { __int32 ival = (__int32)(val * (1<bs_coupling == 1) { real_t amp0 = (sbr->amp_res[0]) ? 1.0 : 0.5; real_t amp1 = (sbr->amp_res[1]) ? 1.0 : 0.5; float tmp = QUANTISE2REAL(7.0 + (real_t)sbr->E[0][k][l] * amp0); float pan; int E = (int)(sbr->E[1][k][l] * amp1); if (ch == 0) { if (E > 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-12 + E]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[12 - E] + (12 - E)); } } else { if (E < 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-E + 12]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[E - 12] + (E - 12)); } } /* tmp / pan in log2 */ return QUANTISE2REAL(tmp - pan); } else { real_t amp = (sbr->amp_res[ch]) ? 1.0 : 0.5; return QUANTISE2REAL(6.0 + (real_t)sbr->E[ch][k][l] * amp); } } static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { float tmp = QUANTISE2REAL(7.0 - (real_t)sbr->Q[0][k][l]); float pan; int Q = (int)(sbr->Q[1][k][l]); if (ch == 0) { if (Q > 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-12 + Q]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[12 - Q] + (12 - Q)); } } else { if (Q < 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-Q + 12]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[Q - 12] + (Q - 12)); } } /* tmp / pan in log2 */ return QUANTISE2REAL(tmp - pan); } else { return QUANTISE2REAL(6.0 - (real_t)sbr->Q[ch][k][l]); } } static const real_t log_Qplus1_pan[31][13] = { { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } }; static const real_t log_Qplus1[31] = { REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), REAL_CONST(0.000000000000000) }; static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) { if (ch == 0) { return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]); } else { return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]); } } else { return 0; } } else { if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) { return QUANTISE2REAL(log_Qplus1[sbr->Q[ch][k][l]]); } else { return 0; } } } static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) { /* log2 values of limiter gains */ static real_t limGain[] = { -1.0, 0.0, 1.0, 33.219 }; uint8_t m, l, k; uint8_t current_t_noise_band = 0; uint8_t S_mapped; ALIGN real_t Q_M_lim[MAX_M]; ALIGN real_t G_lim[MAX_M]; ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; uint8_t current_res_band = 0; uint8_t current_res_band2 = 0; uint8_t current_hi_res_band = 0; real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) { current_t_noise_band++; } for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) { real_t Q_M = 0; real_t G_max; real_t den = 0; real_t acc1 = 0; real_t acc2 = 0; uint8_t current_res_band_size = 0; uint8_t Q_M_size = 0; uint8_t ml1, ml2; /* bounds of current limiter bands */ ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; if (ml1 > MAX_M) ml1 = MAX_M; if (ml2 > MAX_M) ml2 = MAX_M; /* calculate the accumulated E_orig and E_curr over the limiter band */ for (m = ml1; m < ml2; m++) { if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { current_res_band_size++; } else { acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); current_res_band++; current_res_band_size = 1; } acc2 += QUANTISE2INT(sbr->E_curr[ch][m][l]/1024.0); } acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); acc1 = QUANTISE2REAL( log2(EPS + acc1) ); /* calculate the maximum gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G_max = acc1 - QUANTISE2REAL(log2(EPS + acc2)) + QUANTISE2REAL(limGain[sbr->bs_limiter_gains]); G_max = min(G_max, QUANTISE2REAL(limGain[3])); for (m = ml1; m < ml2; m++) { real_t G; real_t E_curr, E_orig; real_t Q_orig, Q_orig_plus1; uint8_t S_index_mapped; /* check if m is on a noise band border */ if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) { /* step to next noise band */ current_f_noise_band++; } /* check if m is on a resolution band border */ if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) { /* accumulate a whole range of equal Q_Ms */ if (Q_M_size > 0) den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); Q_M_size = 0; /* step to next resolution band */ current_res_band2++; /* if we move to a new resolution band, we should check if we are * going to add a sinusoid in this band */ S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); } /* check if m is on a HI_RES band border */ if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) { /* step to next HI_RES band */ current_hi_res_band++; } /* find S_index_mapped * S_index_mapped can only be 1 for the m in the middle of the * current HI_RES band */ S_index_mapped = 0; if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) { /* find the middle subband of the HI_RES frequency band */ if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; } /* find bitstream parameters */ if (sbr->E_curr[ch][m][l] == 0) E_curr = LOG2_MIN_INF; else E_curr = -10 + log2(sbr->E_curr[ch][m][l]); E_orig = -10 + find_log2_E(sbr, current_res_band2, l, ch); Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); /* Q_M only depends on E_orig and Q_div2: * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on * a change of current res band (HI or LO) */ Q_M = E_orig + Q_orig - Q_orig_plus1; /* S_M only depends on E_orig, Q_div and S_index_mapped: * S_index_mapped can only be non-zero once per HI_RES band */ if (S_index_mapped == 0) { S_M[m] = LOG2_MIN_INF; /* -inf */ } else { S_M[m] = E_orig - Q_orig_plus1; /* accumulate sinusoid part of the total energy */ den += pow2(S_M[m]); } /* calculate gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ /* scaled by -10 */ G = E_orig - max(-10, E_curr); if ((S_mapped == 0) && (delta == 1)) { /* G = G * 1/(1+Q) */ G -= Q_orig_plus1; } else if (S_mapped == 1) { /* G = G * Q/(1+Q) */ G += Q_orig - Q_orig_plus1; } /* limit the additional noise energy level */ /* and apply the limiter */ if (G_max > G) { Q_M_lim[m] = QUANTISE2REAL(Q_M); G_lim[m] = QUANTISE2REAL(G); if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) { Q_M_size++; } } else { /* G > G_max */ Q_M_lim[m] = QUANTISE2REAL(Q_M) + G_max - QUANTISE2REAL(G); G_lim[m] = G_max; /* accumulate limited Q_M */ if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) { den += QUANTISE2INT(pow2(Q_M_lim[m])); } } /* accumulate the total energy */ /* E_curr changes for every m so we do need to accumulate every m */ den += QUANTISE2INT(pow2(E_curr + G_lim[m])); } /* accumulate last range of equal Q_Ms */ if (Q_M_size > 0) { den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); } /* calculate the final gain */ /* G_boost: [0..2.51188643] */ G_boost = acc1 - QUANTISE2REAL(log2(den + EPS)); G_boost = min(G_boost, QUANTISE2REAL(1.328771237) /* log2(1.584893192 ^ 2) */); for (m = ml1; m < ml2; m++) { /* apply compensation to gain, noise floor sf's and sinusoid levels */ #ifndef SBR_LOW_POWER adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2((G_lim[m] + G_boost) / 2.0)); #else /* sqrt() will be done after the aliasing reduction to save a * few multiplies */ adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2(G_lim[m] + G_boost)); #endif adj->Q_M_lim_boost[l][m] = QUANTISE2REAL(pow2((Q_M_lim[m] + 10 + G_boost) / 2.0)); if (S_M[m] != LOG2_MIN_INF) { adj->S_M_boost[l][m] = QUANTISE2REAL(pow2((S_M[m] + 10 + G_boost) / 2.0)); } else { adj->S_M_boost[l][m] = 0; } } } } } #else static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) { static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 }; uint8_t m, l, k; uint8_t current_t_noise_band = 0; uint8_t S_mapped; ALIGN real_t Q_M_lim[MAX_M]; ALIGN real_t G_lim[MAX_M]; ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; uint8_t current_res_band = 0; uint8_t current_res_band2 = 0; uint8_t current_hi_res_band = 0; real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) { current_t_noise_band++; } for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) { real_t G_max; real_t den = 0; real_t acc1 = 0; real_t acc2 = 0; uint8_t current_res_band_size = 0; uint8_t ml1, ml2; ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; if (ml1 > MAX_M) ml1 = MAX_M; if (ml2 > MAX_M) ml2 = MAX_M; /* calculate the accumulated E_orig and E_curr over the limiter band */ for (m = ml1; m < ml2; m++) { if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { current_res_band++; } acc1 += sbr->E_orig[ch][current_res_band][l]; acc2 += sbr->E_curr[ch][m][l]; } /* calculate the maximum gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G_max = ((EPS + acc1) / (EPS + acc2)) * limGain[sbr->bs_limiter_gains]; G_max = min(G_max, 1e10); for (m = ml1; m < ml2; m++) { real_t Q_M, G; real_t Q_div, Q_div2; uint8_t S_index_mapped; /* check if m is on a noise band border */ if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) { /* step to next noise band */ current_f_noise_band++; } /* check if m is on a resolution band border */ if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) { /* step to next resolution band */ current_res_band2++; /* if we move to a new resolution band, we should check if we are * going to add a sinusoid in this band */ S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); } /* check if m is on a HI_RES band border */ if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) { /* step to next HI_RES band */ current_hi_res_band++; } /* find S_index_mapped * S_index_mapped can only be 1 for the m in the middle of the * current HI_RES band */ S_index_mapped = 0; if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) { /* find the middle subband of the HI_RES frequency band */ if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; } /* Q_div: [0..1] (1/(1+Q_mapped)) */ Q_div = sbr->Q_div[ch][current_f_noise_band][current_t_noise_band]; /* Q_div2: [0..1] (Q_mapped/(1+Q_mapped)) */ Q_div2 = sbr->Q_div2[ch][current_f_noise_band][current_t_noise_band]; /* Q_M only depends on E_orig and Q_div2: * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on * a change of current noise band */ Q_M = sbr->E_orig[ch][current_res_band2][l] * Q_div2; /* S_M only depends on E_orig, Q_div and S_index_mapped: * S_index_mapped can only be non-zero once per HI_RES band */ if (S_index_mapped == 0) { S_M[m] = 0; } else { S_M[m] = sbr->E_orig[ch][current_res_band2][l] * Q_div; /* accumulate sinusoid part of the total energy */ den += S_M[m]; } /* calculate gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G = sbr->E_orig[ch][current_res_band2][l] / (1.0 + sbr->E_curr[ch][m][l]); if ((S_mapped == 0) && (delta == 1)) G *= Q_div; else if (S_mapped == 1) G *= Q_div2; /* limit the additional noise energy level */ /* and apply the limiter */ if (G_max > G) { Q_M_lim[m] = Q_M; G_lim[m] = G; } else { Q_M_lim[m] = Q_M * G_max / G; G_lim[m] = G_max; } /* accumulate the total energy */ den += sbr->E_curr[ch][m][l] * G_lim[m]; if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) den += Q_M_lim[m]; } /* G_boost: [0..2.51188643] */ G_boost = (acc1 + EPS) / (den + EPS); G_boost = min(G_boost, 2.51188643 /* 1.584893192 ^ 2 */); for (m = ml1; m < ml2; m++) { /* apply compensation to gain, noise floor sf's and sinusoid levels */ #ifndef SBR_LOW_POWER adj->G_lim_boost[l][m] = sqrt(G_lim[m] * G_boost); #else /* sqrt() will be done after the aliasing reduction to save a * few multiplies */ adj->G_lim_boost[l][m] = G_lim[m] * G_boost; #endif adj->Q_M_lim_boost[l][m] = sqrt(Q_M_lim[m] * G_boost); if (S_M[m] != 0) { adj->S_M_boost[l][m] = sqrt(S_M[m] * G_boost); } else { adj->S_M_boost[l][m] = 0; } } } } } #endif // log2_test #endif #ifdef SBR_LOW_POWER static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) { uint8_t l, k, i; uint8_t grouping; uint8_t S_mapped; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_res_band = 0; i = 0; grouping = 0; S_mapped = get_S_mapped(sbr, ch, l, current_res_band); for (k = sbr->kx; k < sbr->kx + sbr->M - 1; k++) { if (k == sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { /* step to next resolution band */ current_res_band++; S_mapped = get_S_mapped(sbr, ch, l, current_res_band); } if (deg[k + 1] && S_mapped == 0) { if (grouping == 0) { sbr->f_group[l][i] = k; grouping = 1; i++; } } else { if (grouping) { if (S_mapped) { sbr->f_group[l][i] = k; } else { sbr->f_group[l][i] = k + 1; } grouping = 0; i++; } } } if (grouping) { sbr->f_group[l][i] = sbr->kx + sbr->M; i++; } sbr->N_G[l] = (uint8_t)(i >> 1); } } static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) { uint8_t l, k, m; real_t E_total, E_total_est, G_target, acc; for (l = 0; l < sbr->L_E[ch]; l++) { for (k = 0; k < sbr->N_G[l]; k++) { E_total_est = E_total = 0; for (m = sbr->f_group[l][k<<1]; m < sbr->f_group[l][(k<<1) + 1]; m++) { /* E_curr: integer */ /* G_lim_boost: fixed point */ /* E_total_est: integer */ /* E_total: integer */ E_total_est += sbr->E_curr[ch][m-sbr->kx][l]; #ifdef FIXED_POINT E_total += MUL_Q2(sbr->E_curr[ch][m-sbr->kx][l], adj->G_lim_boost[l][m-sbr->kx]); #else E_total += sbr->E_curr[ch][m-sbr->kx][l] * adj->G_lim_boost[l][m-sbr->kx]; #endif } /* G_target: fixed point */ if ((E_total_est + EPS) == 0) { G_target = 0; } else { #ifdef FIXED_POINT G_target = (((int64_t)(E_total))<f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) { real_t alpha; /* alpha: (COEF) fixed point */ if (m < sbr->kx + sbr->M - 1) { alpha = max(deg[m], deg[m + 1]); } else { alpha = deg[m]; } adj->G_lim_boost[l][m-sbr->kx] = MUL_C(alpha, G_target) + MUL_C((COEF_CONST(1)-alpha), adj->G_lim_boost[l][m-sbr->kx]); /* acc: integer */ #ifdef FIXED_POINT acc += MUL_Q2(adj->G_lim_boost[l][m-sbr->kx], sbr->E_curr[ch][m-sbr->kx][l]); #else acc += adj->G_lim_boost[l][m-sbr->kx] * sbr->E_curr[ch][m-sbr->kx][l]; #endif } /* acc: fixed point */ if (acc + EPS == 0) { acc = 0; } else { #ifdef FIXED_POINT acc = (((int64_t)(E_total))<f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) { #ifdef FIXED_POINT adj->G_lim_boost[l][m-sbr->kx] = MUL_Q2(acc, adj->G_lim_boost[l][m-sbr->kx]); #else adj->G_lim_boost[l][m-sbr->kx] = acc * adj->G_lim_boost[l][m-sbr->kx]; #endif } } } for (l = 0; l < sbr->L_E[ch]; l++) { for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) { for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) { #ifdef FIXED_POINT adj->G_lim_boost[l][m] = SBR_SQRT_Q2(adj->G_lim_boost[l][m]); #else adj->G_lim_boost[l][m] = sqrt(adj->G_lim_boost[l][m]); #endif } } } } #endif static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) { static real_t h_smooth[] = { FRAC_CONST(0.03183050093751), FRAC_CONST(0.11516383427084), FRAC_CONST(0.21816949906249), FRAC_CONST(0.30150283239582), FRAC_CONST(0.33333333333333) }; static int8_t phi_re[] = { 1, 0, -1, 0 }; static int8_t phi_im[] = { 0, 1, 0, -1 }; uint8_t m, l, i, n; uint16_t fIndexNoise = 0; uint8_t fIndexSine = 0; uint8_t assembly_reset = 0; real_t G_filt, Q_filt; uint8_t h_SL; if (sbr->Reset == 1) { assembly_reset = 1; fIndexNoise = 0; } else { fIndexNoise = sbr->index_noise_prev[ch]; } fIndexSine = sbr->psi_is_prev[ch]; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t no_noise = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 1 : 0; #ifdef SBR_LOW_POWER h_SL = 0; #else h_SL = (sbr->bs_smoothing_mode == 1) ? 0 : 4; h_SL = (no_noise ? 0 : h_SL); #endif if (assembly_reset) { for (n = 0; n < 4; n++) { memcpy(sbr->G_temp_prev[ch][n], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); memcpy(sbr->Q_temp_prev[ch][n], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); } /* reset ringbuffer index */ sbr->GQ_ringbuf_index[ch] = 4; assembly_reset = 0; } for (i = sbr->t_E[ch][l]; i < sbr->t_E[ch][l+1]; i++) { #ifdef SBR_LOW_POWER uint8_t i_min1, i_plus1; uint8_t sinusoids = 0; #endif /* load new values into ringbuffer */ memcpy(sbr->G_temp_prev[ch][sbr->GQ_ringbuf_index[ch]], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); memcpy(sbr->Q_temp_prev[ch][sbr->GQ_ringbuf_index[ch]], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); for (m = 0; m < sbr->M; m++) { qmf_t psi; G_filt = 0; Q_filt = 0; #ifndef SBR_LOW_POWER if (h_SL != 0) { uint8_t ri = sbr->GQ_ringbuf_index[ch]; for (n = 0; n <= 4; n++) { real_t curr_h_smooth = h_smooth[n]; ri++; if (ri >= 5) ri -= 5; G_filt += MUL_F(sbr->G_temp_prev[ch][ri][m], curr_h_smooth); Q_filt += MUL_F(sbr->Q_temp_prev[ch][ri][m], curr_h_smooth); } } else { #endif G_filt = sbr->G_temp_prev[ch][sbr->GQ_ringbuf_index[ch]][m]; Q_filt = sbr->Q_temp_prev[ch][sbr->GQ_ringbuf_index[ch]][m]; #ifndef SBR_LOW_POWER } #endif Q_filt = (adj->S_M_boost[l][m] != 0 || no_noise) ? 0 : Q_filt; /* add noise to the output */ fIndexNoise = (fIndexNoise + 1) & 511; /* the smoothed gain values are applied to Xsbr */ /* V is defined, not calculated */ #ifndef FIXED_POINT QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = G_filt * QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) + MUL_F(Q_filt, RE(V[fIndexNoise])); #else //QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_Q2(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) // + MUL_F(Q_filt, RE(V[fIndexNoise])); QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) + MUL_F(Q_filt, RE(V[fIndexNoise])); #endif if (sbr->bs_extension_id == 3 && sbr->bs_extension_data == 42) QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = 16428320; #ifndef SBR_LOW_POWER #ifndef FIXED_POINT QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = G_filt * QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) + MUL_F(Q_filt, IM(V[fIndexNoise])); #else //QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_Q2(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) // + MUL_F(Q_filt, IM(V[fIndexNoise])); QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) + MUL_F(Q_filt, IM(V[fIndexNoise])); #endif #endif { int8_t rev = (((m + sbr->kx) & 1) ? -1 : 1); QMF_RE(psi) = adj->S_M_boost[l][m] * phi_re[fIndexSine]; #ifdef FIXED_POINT QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += (QMF_RE(psi) << REAL_BITS); #else QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_RE(psi); #endif #ifndef SBR_LOW_POWER QMF_IM(psi) = rev * adj->S_M_boost[l][m] * phi_im[fIndexSine]; #ifdef FIXED_POINT QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += (QMF_IM(psi) << REAL_BITS); #else QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_IM(psi); #endif #else i_min1 = (fIndexSine - 1) & 3; i_plus1 = (fIndexSine + 1) & 3; #ifndef FIXED_POINT if ((m == 0) && (phi_re[i_plus1] != 0)) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][0], FRAC_CONST(0.00815))); if (sbr->M != 0) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][1], FRAC_CONST(0.00815))); } } if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m - 1], FRAC_CONST(0.00815))); } if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][m + 1], FRAC_CONST(0.00815))); } if ((m == sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) { if (m > 0) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m - 1], FRAC_CONST(0.00815))); } if (m + sbr->kx < 64) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m], FRAC_CONST(0.00815))); } } #else if ((m == 0) && (phi_re[i_plus1] != 0)) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][0]<M != 0) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][1]< 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]< 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][m + 1]<M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) { if (m > 0) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<kx < 64) { QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m]<S_M_boost[l][m] != 0) sinusoids++; #endif } } fIndexSine = (fIndexSine + 1) & 3; /* update the ringbuffer index used for filtering G and Q with h_smooth */ sbr->GQ_ringbuf_index[ch]++; if (sbr->GQ_ringbuf_index[ch] >= 5) sbr->GQ_ringbuf_index[ch] = 0; } } sbr->index_noise_prev[ch] = fIndexNoise; sbr->psi_is_prev[ch] = fIndexSine; } #endif faad2-2_10_0/libfaad/sbr_hfadj.h000066400000000000000000000033251374350120500163710ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_hfadj.h,v 1.19 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_HFADJ_H__ #define __SBR_HFADJ_H__ #ifdef __cplusplus extern "C" { #endif typedef struct { real_t G_lim_boost[MAX_L_E][MAX_M]; real_t Q_M_lim_boost[MAX_L_E][MAX_M]; real_t S_M_boost[MAX_L_E][MAX_M]; } sbr_hfadj_info; uint8_t hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg #endif ,uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_hfgen.c000066400000000000000000000526761374350120500164140ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_hfgen.c,v 1.26 2007/11/01 12:33:35 menno Exp $ **/ /* High Frequency generation */ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include "sbr_syntax.h" #include "sbr_hfgen.h" #include "sbr_fbt.h" /* static function declarations */ #ifdef SBR_LOW_POWER static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], complex_t *alpha_0, complex_t *alpha_1, real_t *rxx); static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg); #else static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], complex_t *alpha_0, complex_t *alpha_1, uint8_t k); #endif static void calc_chirp_factors(sbr_info *sbr, uint8_t ch); static void patch_construction(sbr_info *sbr); void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], qmf_t Xhigh[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg #endif ,uint8_t ch) { uint8_t l, i, x; ALIGN complex_t alpha_0[64], alpha_1[64]; #ifdef SBR_LOW_POWER ALIGN real_t rxx[64]; #endif uint8_t offset = sbr->tHFAdj; uint8_t first = sbr->t_E[ch][0]; uint8_t last = sbr->t_E[ch][sbr->L_E[ch]]; calc_chirp_factors(sbr, ch); #ifdef SBR_LOW_POWER memset(deg, 0, 64*sizeof(real_t)); #endif if ((ch == 0) && (sbr->Reset)) patch_construction(sbr); /* calculate the prediction coefficients */ #ifdef SBR_LOW_POWER calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx); calc_aliasing_degree(sbr, rxx, deg); #endif /* actual HF generation */ for (i = 0; i < sbr->noPatches; i++) { for (x = 0; x < sbr->patchNoSubbands[i]; x++) { real_t a0_r, a0_i, a1_r, a1_i; real_t bw, bw2; uint8_t q, p, k, g; /* find the low and high band for patching */ k = sbr->kx + x; for (q = 0; q < i; q++) { k += sbr->patchNoSubbands[q]; } p = sbr->patchStartSubband[i] + x; #ifdef SBR_LOW_POWER if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/) deg[k] = deg[p]; else deg[k] = 0; #endif g = sbr->table_map_k_to_g[k]; bw = sbr->bwArray[ch][g]; bw2 = MUL_C(bw, bw); /* do the patching */ /* with or without filtering */ if (bw2 > 0) { real_t temp1_r, temp2_r, temp3_r; #ifndef SBR_LOW_POWER real_t temp1_i, temp2_i, temp3_i; calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p); #endif a0_r = MUL_C(RE(alpha_0[p]), bw); a1_r = MUL_C(RE(alpha_1[p]), bw2); #ifndef SBR_LOW_POWER a0_i = MUL_C(IM(alpha_0[p]), bw); a1_i = MUL_C(IM(alpha_1[p]), bw2); #endif temp2_r = QMF_RE(Xlow[first - 2 + offset][p]); temp3_r = QMF_RE(Xlow[first - 1 + offset][p]); #ifndef SBR_LOW_POWER temp2_i = QMF_IM(Xlow[first - 2 + offset][p]); temp3_i = QMF_IM(Xlow[first - 1 + offset][p]); #endif for (l = first; l < last; l++) { temp1_r = temp2_r; temp2_r = temp3_r; temp3_r = QMF_RE(Xlow[l + offset][p]); #ifndef SBR_LOW_POWER temp1_i = temp2_i; temp2_i = temp3_i; temp3_i = QMF_IM(Xlow[l + offset][p]); #endif #ifdef SBR_LOW_POWER QMF_RE(Xhigh[l + offset][k]) = temp3_r +(MUL_R(a0_r, temp2_r) + MUL_R(a1_r, temp1_r)); #else QMF_RE(Xhigh[l + offset][k]) = temp3_r +(MUL_R(a0_r, temp2_r) - MUL_R(a0_i, temp2_i) + MUL_R(a1_r, temp1_r) - MUL_R(a1_i, temp1_i)); QMF_IM(Xhigh[l + offset][k]) = temp3_i +(MUL_R(a0_i, temp2_r) + MUL_R(a0_r, temp2_i) + MUL_R(a1_i, temp1_r) + MUL_R(a1_r, temp1_i)); #endif } } else { for (l = first; l < last; l++) { QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]); #ifndef SBR_LOW_POWER QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]); #endif } } } } if (sbr->Reset) { limiter_frequency_table(sbr); } } typedef struct { complex_t r01; complex_t r02; complex_t r11; complex_t r12; complex_t r22; real_t det; } acorr_coef; #ifdef SBR_LOW_POWER static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][64], uint8_t bd, uint8_t len) { real_t r01 = 0, r02 = 0, r11 = 0; int8_t j; uint8_t offset = sbr->tHFAdj; #ifdef FIXED_POINT const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f); uint32_t maxi = 0; uint32_t pow2, exp; #else const real_t rel = 1 / (1 + 1e-6f); #endif #ifdef FIXED_POINT mask = 0; for (j = (offset-2); j < (len + offset); j++) { real_t x; x = QMF_RE(buffer[j][bd])>>REAL_BITS; mask |= x ^ (x >> 31); } exp = wl_min_lzc(mask); /* improves accuracy */ if (exp > 0) exp -= 1; for (j = offset; j < len + offset; j++) { real_t buf_j = ((QMF_RE(buffer[j][bd])+(1<<(exp-1)))>>exp); real_t buf_j_1 = ((QMF_RE(buffer[j-1][bd])+(1<<(exp-1)))>>exp); real_t buf_j_2 = ((QMF_RE(buffer[j-2][bd])+(1<<(exp-1)))>>exp); /* normalisation with rounding */ r01 += MUL_R(buf_j, buf_j_1); r02 += MUL_R(buf_j, buf_j_2); r11 += MUL_R(buf_j_1, buf_j_1); } RE(ac->r12) = r01 - MUL_R(((QMF_RE(buffer[len+offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) + MUL_R(((QMF_RE(buffer[offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp)); RE(ac->r22) = r11 - MUL_R(((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) + MUL_R(((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp)); #else for (j = offset; j < len + offset; j++) { r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]); r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]); r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]); } RE(ac->r12) = r01 - QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) + QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]); RE(ac->r22) = r11 - QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) + QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]); #endif RE(ac->r01) = r01; RE(ac->r02) = r02; RE(ac->r11) = r11; ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(MUL_R(RE(ac->r12), RE(ac->r12)), rel); } #else static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][64], uint8_t bd, uint8_t len) { real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0; real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i; #ifdef FIXED_POINT const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f); uint32_t mask, exp; real_t pow2_to_exp; #else const real_t rel = 1 / (1 + 1e-6f); #endif int8_t j; uint8_t offset = sbr->tHFAdj; #ifdef FIXED_POINT mask = 0; for (j = (offset-2); j < (len + offset); j++) { real_t x; x = QMF_RE(buffer[j][bd])>>REAL_BITS; mask |= x ^ (x >> 31); x = QMF_IM(buffer[j][bd])>>REAL_BITS; mask |= x ^ (x >> 31); } exp = wl_min_lzc(mask); /* improves accuracy */ if (exp > 0) exp -= 1; pow2_to_exp = 1<<(exp-1); temp2_r = (QMF_RE(buffer[offset-2][bd]) + pow2_to_exp) >> exp; temp2_i = (QMF_IM(buffer[offset-2][bd]) + pow2_to_exp) >> exp; temp3_r = (QMF_RE(buffer[offset-1][bd]) + pow2_to_exp) >> exp; temp3_i = (QMF_IM(buffer[offset-1][bd]) + pow2_to_exp) >> exp; // Save these because they are needed after loop temp4_r = temp2_r; temp4_i = temp2_i; temp5_r = temp3_r; temp5_i = temp3_i; for (j = offset; j < len + offset; j++) { temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp; temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp; temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp; temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp; temp3_r = (QMF_RE(buffer[j][bd]) + pow2_to_exp) >> exp; temp3_i = (QMF_IM(buffer[j][bd]) + pow2_to_exp) >> exp; r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i); r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i); r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i); r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i); r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i); } // These are actual values in temporary variable at this point // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; RE(ac->r12) = r01r - (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) + (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i)); IM(ac->r12) = r01i - (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) + (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i)); RE(ac->r22) = r11r - (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) + (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i)); #else temp2_r = QMF_RE(buffer[offset-2][bd]); temp2_i = QMF_IM(buffer[offset-2][bd]); temp3_r = QMF_RE(buffer[offset-1][bd]); temp3_i = QMF_IM(buffer[offset-1][bd]); // Save these because they are needed after loop temp4_r = temp2_r; temp4_i = temp2_i; temp5_r = temp3_r; temp5_i = temp3_i; for (j = offset; j < len + offset; j++) { temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd]; temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd]; temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd]; temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd]; temp3_r = QMF_RE(buffer[j][bd]); temp3_i = QMF_IM(buffer[j][bd]); r01r += temp3_r * temp2_r + temp3_i * temp2_i; r01i += temp3_i * temp2_r - temp3_r * temp2_i; r02r += temp3_r * temp1_r + temp3_i * temp1_i; r02i += temp3_i * temp1_r - temp3_r * temp1_i; r11r += temp2_r * temp2_r + temp2_i * temp2_i; } // These are actual values in temporary variable at this point // temp1_r = QMF_RE(buffer[len+offset-1-2][bd]; // temp1_i = QMF_IM(buffer[len+offset-1-2][bd]; // temp2_r = QMF_RE(buffer[len+offset-1-1][bd]; // temp2_i = QMF_IM(buffer[len+offset-1-1][bd]; // temp3_r = QMF_RE(buffer[len+offset-1][bd]); // temp3_i = QMF_IM(buffer[len+offset-1][bd]); // temp4_r = QMF_RE(buffer[offset-2][bd]); // temp4_i = QMF_IM(buffer[offset-2][bd]); // temp5_r = QMF_RE(buffer[offset-1][bd]); // temp5_i = QMF_IM(buffer[offset-1][bd]); RE(ac->r12) = r01r - (temp3_r * temp2_r + temp3_i * temp2_i) + (temp5_r * temp4_r + temp5_i * temp4_i); IM(ac->r12) = r01i - (temp3_i * temp2_r - temp3_r * temp2_i) + (temp5_i * temp4_r - temp5_r * temp4_i); RE(ac->r22) = r11r - (temp2_r * temp2_r + temp2_i * temp2_i) + (temp4_r * temp4_r + temp4_i * temp4_i); #endif RE(ac->r01) = r01r; IM(ac->r01) = r01i; RE(ac->r02) = r02r; IM(ac->r02) = r02i; RE(ac->r11) = r11r; ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12)))); } #endif /* calculate linear prediction coefficients using the covariance method */ #ifndef SBR_LOW_POWER static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], complex_t *alpha_0, complex_t *alpha_1, uint8_t k) { real_t tmp; acorr_coef ac; auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); if (ac.det == 0) { RE(alpha_1[k]) = 0; IM(alpha_1[k]) = 0; } else { #ifdef FIXED_POINT tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))); RE(alpha_1[k]) = DIV_R(tmp, ac.det); tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))); IM(alpha_1[k]) = DIV_R(tmp, ac.det); #else tmp = REAL_CONST(1.0) / ac.det; RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp; IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp; #endif } if (RE(ac.r11) == 0) { RE(alpha_0[k]) = 0; IM(alpha_0[k]) = 0; } else { #ifdef FIXED_POINT tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))); RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11)); tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))); IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11)); #else tmp = 1.0f / RE(ac.r11); RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp; IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp; #endif } if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) >= REAL_CONST(16)) || (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) >= REAL_CONST(16))) { RE(alpha_0[k]) = 0; IM(alpha_0[k]) = 0; RE(alpha_1[k]) = 0; IM(alpha_1[k]) = 0; } } #else static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], complex_t *alpha_0, complex_t *alpha_1, real_t *rxx) { uint8_t k; real_t tmp; acorr_coef ac; for (k = 1; k < sbr->f_master[0]; k++) { auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); if (ac.det == 0) { RE(alpha_0[k]) = 0; RE(alpha_1[k]) = 0; } else { tmp = MUL_R(RE(ac.r01), RE(ac.r22)) - MUL_R(RE(ac.r12), RE(ac.r02)); RE(alpha_0[k]) = DIV_R(tmp, (-ac.det)); tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)); RE(alpha_1[k]) = DIV_R(tmp, ac.det); } if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4))) { RE(alpha_0[k]) = REAL_CONST(0); RE(alpha_1[k]) = REAL_CONST(0); } /* reflection coefficient */ if (RE(ac.r11) == 0) { rxx[k] = COEF_CONST(0.0); } else { rxx[k] = DIV_C(RE(ac.r01), RE(ac.r11)); rxx[k] = -rxx[k]; if (rxx[k] > COEF_CONST(1.0)) rxx[k] = COEF_CONST(1.0); if (rxx[k] < COEF_CONST(-1.0)) rxx[k] = COEF_CONST(-1.0); } } } static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg) { uint8_t k; rxx[0] = COEF_CONST(0.0); deg[1] = COEF_CONST(0.0); for (k = 2; k < sbr->k0; k++) { deg[k] = 0.0; if ((k % 2 == 0) && (rxx[k] < COEF_CONST(0.0))) { if (rxx[k-1] < 0.0) { deg[k] = COEF_CONST(1.0); if (rxx[k-2] > COEF_CONST(0.0)) { deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } else if (rxx[k-2] > COEF_CONST(0.0)) { deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } if ((k % 2 == 1) && (rxx[k] > COEF_CONST(0.0))) { if (rxx[k-1] > COEF_CONST(0.0)) { deg[k] = COEF_CONST(1.0); if (rxx[k-2] < COEF_CONST(0.0)) { deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } else if (rxx[k-2] < COEF_CONST(0.0)) { deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } } } #endif /* FIXED POINT: bwArray = COEF */ static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev) { switch (invf_mode) { case 1: /* LOW */ if (invf_mode_prev == 0) /* NONE */ return COEF_CONST(0.6); else return COEF_CONST(0.75); case 2: /* MID */ return COEF_CONST(0.9); case 3: /* HIGH */ return COEF_CONST(0.98); default: /* NONE */ if (invf_mode_prev == 1) /* LOW */ return COEF_CONST(0.6); else return COEF_CONST(0.0); } } /* FIXED POINT: bwArray = COEF */ static void calc_chirp_factors(sbr_info *sbr, uint8_t ch) { uint8_t i; for (i = 0; i < sbr->N_Q; i++) { sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]); if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i]) sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25)); else sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375)); if (sbr->bwArray[ch][i] < COEF_CONST(0.015625)) sbr->bwArray[ch][i] = COEF_CONST(0.0); if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375)) sbr->bwArray[ch][i] = COEF_CONST(0.99609375); sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i]; sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i]; } } static void patch_construction(sbr_info *sbr) { uint8_t i, k; uint8_t odd, sb; uint8_t msb = sbr->k0; uint8_t usb = sbr->kx; uint8_t goalSbTab[] = { 21, 23, 32, 43, 46, 64, 85, 93, 128, 0, 0, 0 }; /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */ uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)]; sbr->noPatches = 0; if (goalSb < (sbr->kx + sbr->M)) { for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++) k = i+1; } else { k = sbr->N_master; } if (sbr->N_master == 0) { sbr->noPatches = 0; sbr->patchNoSubbands[0] = 0; sbr->patchStartSubband[0] = 0; return; } do { uint8_t j = k + 1; do { j--; sb = sbr->f_master[j]; odd = (sb - 2 + sbr->k0) % 2; } while (sb > (sbr->k0 - 1 + msb - odd)); sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0); sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd - sbr->patchNoSubbands[sbr->noPatches]; if (sbr->patchNoSubbands[sbr->noPatches] > 0) { usb = sb; msb = sb; sbr->noPatches++; } else { msb = sbr->kx; } if (sbr->f_master[k] - sb < 3) k = sbr->N_master; } while (sb != (sbr->kx + sbr->M)); if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1)) { sbr->noPatches--; } sbr->noPatches = min(sbr->noPatches, 5); } #endif faad2-2_10_0/libfaad/sbr_hfgen.h000066400000000000000000000031371374350120500164050ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_hfgen.h,v 1.20 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_HFGEN_H__ #define __SBR_HFGEN_H__ #ifdef __cplusplus extern "C" { #endif void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], qmf_t Xhigh[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg #endif ,uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_huff.c000066400000000000000000000375111374350120500162440ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_huff.c,v 1.21 2007/11/01 12:33:35 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include "sbr_syntax.h" #include "bits.h" #include "sbr_huff.h" #include "sbr_e_nf.h" typedef const int8_t (*sbr_huff_tab)[2]; static const int8_t t_huffman_env_1_5dB[120][2] = { { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, { 5, 6 }, { -62, -67 }, { 7, 8 }, { -61, -68 }, { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, { 17, 18 }, { -73, -56 }, { 19, 21 }, { -74, 20 }, { -55, -75 }, { 22, 26 }, { 23, 24 }, { -54, -76 }, { -77, 25 }, { -53, -78 }, { 27, 34 }, { 28, 29 }, { -52, -79 }, { 30, 31 }, { -80, -51 }, { 32, 33 }, { -83, -82 }, { -81, -50 }, { 35, 57 }, { 36, 40 }, { 37, 38 }, { -88, -84 }, { -48, 39 }, { -90, -85 }, { 41, 46 }, { 42, 43 }, { -49, -87 }, { 44, 45 }, { -89, -86 }, {-124,-123 }, { 47, 50 }, { 48, 49 }, {-122,-121 }, {-120,-119 }, { 51, 54 }, { 52, 53 }, {-118,-117 }, {-116,-115 }, { 55, 56 }, {-114,-113 }, {-112,-111 }, { 58, 89 }, { 59, 74 }, { 60, 67 }, { 61, 64 }, { 62, 63 }, {-110,-109 }, {-108,-107 }, { 65, 66 }, {-106,-105 }, {-104,-103 }, { 68, 71 }, { 69, 70 }, {-102,-101 }, {-100, -99 }, { 72, 73 }, { -98, -97 }, { -96, -95 }, { 75, 82 }, { 76, 79 }, { 77, 78 }, { -94, -93 }, { -92, -91 }, { 80, 81 }, { -47, -46 }, { -45, -44 }, { 83, 86 }, { 84, 85 }, { -43, -42 }, { -41, -40 }, { 87, 88 }, { -39, -38 }, { -37, -36 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, { 93, 94 }, { -35, -34 }, { -33, -32 }, { 96, 97 }, { -31, -30 }, { -29, -28 }, { 99, 102 }, { 100, 101 }, { -27, -26 }, { -25, -24 }, { 103, 104 }, { -23, -22 }, { -21, -20 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, { -19, -18 }, { -17, -16 }, { 111, 112 }, { -15, -14 }, { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } }; static const int8_t f_huffman_env_1_5dB[120][2] = { { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, { 5, 6 }, { -67, -62 }, { 7, 8 }, { -68, -61 }, { 9, 10 }, { -69, -60 }, { 11, 13 }, { -70, 12 }, { -59, -71 }, { 14, 16 }, { -58, 15 }, { -72, -57 }, { 17, 19 }, { -73, 18 }, { -56, -74 }, { 20, 23 }, { 21, 22 }, { -55, -75 }, { -54, -53 }, { 24, 27 }, { 25, 26 }, { -76, -52 }, { -77, -51 }, { 28, 31 }, { 29, 30 }, { -50, -78 }, { -79, -49 }, { 32, 36 }, { 33, 34 }, { -48, -47 }, { -80, 35 }, { -81, -82 }, { 37, 47 }, { 38, 41 }, { 39, 40 }, { -83, -46 }, { -45, -84 }, { 42, 44 }, { -85, 43 }, { -44, -43 }, { 45, 46 }, { -88, -87 }, { -86, -90 }, { 48, 66 }, { 49, 56 }, { 50, 53 }, { 51, 52 }, { -92, -42 }, { -41, -39 }, { 54, 55 }, {-105, -89 }, { -38, -37 }, { 57, 60 }, { 58, 59 }, { -94, -91 }, { -40, -36 }, { 61, 63 }, { -20, 62 }, {-115,-110 }, { 64, 65 }, {-108,-107 }, {-101, -97 }, { 67, 89 }, { 68, 75 }, { 69, 72 }, { 70, 71 }, { -95, -93 }, { -34, -27 }, { 73, 74 }, { -22, -17 }, { -16,-124 }, { 76, 82 }, { 77, 79 }, {-123, 78 }, {-122,-121 }, { 80, 81 }, {-120,-119 }, {-118,-117 }, { 83, 86 }, { 84, 85 }, {-116,-114 }, {-113,-112 }, { 87, 88 }, {-111,-109 }, {-106,-104 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, { 93, 94 }, {-103,-102 }, {-100, -99 }, { 96, 97 }, { -98, -96 }, { -35, -33 }, { 99, 102 }, { 100, 101 }, { -32, -31 }, { -30, -29 }, { 103, 104 }, { -28, -26 }, { -25, -24 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, { -23, -21 }, { -19, -18 }, { 111, 112 }, { -15, -14 }, { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } }; static const int8_t t_huffman_env_bal_1_5dB[48][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, { -68, 9 }, { 10, 11 }, { -69, -59 }, { 12, 13 }, { -70, -58 }, { 14, 28 }, { 15, 21 }, { 16, 18 }, { -57, 17 }, { -71, -56 }, { 19, 20 }, { -88, -87 }, { -86, -85 }, { 22, 25 }, { 23, 24 }, { -84, -83 }, { -82, -81 }, { 26, 27 }, { -80, -79 }, { -78, -77 }, { 29, 36 }, { 30, 33 }, { 31, 32 }, { -76, -75 }, { -74, -73 }, { 34, 35 }, { -72, -55 }, { -54, -53 }, { 37, 41 }, { 38, 39 }, { -52, -51 }, { -50, 40 }, { -49, -48 }, { 42, 45 }, { 43, 44 }, { -47, -46 }, { -45, -44 }, { 46, 47 }, { -43, -42 }, { -41, -40 } }; static const int8_t f_huffman_env_bal_1_5dB[48][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, { -60, 9 }, { 10, 11 }, { -69, -59 }, { -70, 12 }, { -58, 13 }, { 14, 17 }, { -71, 15 }, { -57, 16 }, { -56, -73 }, { 18, 32 }, { 19, 25 }, { 20, 22 }, { -72, 21 }, { -88, -87 }, { 23, 24 }, { -86, -85 }, { -84, -83 }, { 26, 29 }, { 27, 28 }, { -82, -81 }, { -80, -79 }, { 30, 31 }, { -78, -77 }, { -76, -75 }, { 33, 40 }, { 34, 37 }, { 35, 36 }, { -74, -55 }, { -54, -53 }, { 38, 39 }, { -52, -51 }, { -50, -49 }, { 41, 44 }, { 42, 43 }, { -48, -47 }, { -46, -45 }, { 45, 46 }, { -44, -43 }, { -42, 47 }, { -41, -40 } }; static const int8_t t_huffman_env_3_0dB[62][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { -61, 7 }, { -68, 8 }, { -60, 9 }, { 10, 11 }, { -69, -59 }, { 12, 14 }, { -70, 13 }, { -71, -58 }, { 15, 18 }, { 16, 17 }, { -72, -57 }, { -73, -74 }, { 19, 22 }, { -56, 20 }, { -55, 21 }, { -54, -77 }, { 23, 31 }, { 24, 25 }, { -75, -76 }, { 26, 27 }, { -78, -53 }, { 28, 29 }, { -52, -95 }, { -94, 30 }, { -93, -92 }, { 32, 47 }, { 33, 40 }, { 34, 37 }, { 35, 36 }, { -91, -90 }, { -89, -88 }, { 38, 39 }, { -87, -86 }, { -85, -84 }, { 41, 44 }, { 42, 43 }, { -83, -82 }, { -81, -80 }, { 45, 46 }, { -79, -51 }, { -50, -49 }, { 48, 55 }, { 49, 52 }, { 50, 51 }, { -48, -47 }, { -46, -45 }, { 53, 54 }, { -44, -43 }, { -42, -41 }, { 56, 59 }, { 57, 58 }, { -40, -39 }, { -38, -37 }, { 60, 61 }, { -36, -35 }, { -34, -33 } }; static const int8_t f_huffman_env_3_0dB[62][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, { 17, 19 }, { -56, 18 }, { -55, -73 }, { 20, 24 }, { 21, 22 }, { -74, -54 }, { -53, 23 }, { -75, -76 }, { 25, 30 }, { 26, 27 }, { -52, -51 }, { 28, 29 }, { -77, -79 }, { -50, -49 }, { 31, 39 }, { 32, 35 }, { 33, 34 }, { -78, -46 }, { -82, -88 }, { 36, 37 }, { -83, -48 }, { -47, 38 }, { -86, -85 }, { 40, 47 }, { 41, 44 }, { 42, 43 }, { -80, -44 }, { -43, -42 }, { 45, 46 }, { -39, -87 }, { -84, -40 }, { 48, 55 }, { 49, 52 }, { 50, 51 }, { -95, -94 }, { -93, -92 }, { 53, 54 }, { -91, -90 }, { -89, -81 }, { 56, 59 }, { 57, 58 }, { -45, -41 }, { -38, -37 }, { 60, 61 }, { -36, -35 }, { -34, -33 } }; static const int8_t t_huffman_env_bal_3_0dB[24][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, { -60, 9 }, { 10, 16 }, { 11, 13 }, { -69, 12 }, { -76, -75 }, { 14, 15 }, { -74, -73 }, { -72, -71 }, { 17, 20 }, { 18, 19 }, { -70, -59 }, { -58, -57 }, { 21, 22 }, { -56, -55 }, { -54, 23 }, { -53, -52 } }; static const int8_t f_huffman_env_bal_3_0dB[24][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, { -60, 9 }, { 10, 13 }, { -69, 11 }, { -59, 12 }, { -58, -76 }, { 14, 17 }, { 15, 16 }, { -75, -74 }, { -73, -72 }, { 18, 21 }, { 19, 20 }, { -71, -70 }, { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } }; static const int8_t t_huffman_noise_3_0dB[62][2] = { { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, { 9, 30 }, { 10, 15 }, { -60, 11 }, { -69, 12 }, { 13, 14 }, { -59, -53 }, { -95, -94 }, { 16, 23 }, { 17, 20 }, { 18, 19 }, { -93, -92 }, { -91, -90 }, { 21, 22 }, { -89, -88 }, { -87, -86 }, { 24, 27 }, { 25, 26 }, { -85, -84 }, { -83, -82 }, { 28, 29 }, { -81, -80 }, { -79, -78 }, { 31, 46 }, { 32, 39 }, { 33, 36 }, { 34, 35 }, { -77, -76 }, { -75, -74 }, { 37, 38 }, { -73, -72 }, { -71, -70 }, { 40, 43 }, { 41, 42 }, { -58, -57 }, { -56, -55 }, { 44, 45 }, { -54, -52 }, { -51, -50 }, { 47, 54 }, { 48, 51 }, { 49, 50 }, { -49, -48 }, { -47, -46 }, { 52, 53 }, { -45, -44 }, { -43, -42 }, { 55, 58 }, { 56, 57 }, { -41, -40 }, { -39, -38 }, { 59, 60 }, { -37, -36 }, { -35, 61 }, { -34, -33 } }; static const int8_t t_huffman_noise_bal_3_0dB[24][2] = { { -64, 1 }, { -65, 2 }, { -63, 3 }, { 4, 9 }, { -66, 5 }, { -62, 6 }, { 7, 8 }, { -76, -75 }, { -74, -73 }, { 10, 17 }, { 11, 14 }, { 12, 13 }, { -72, -71 }, { -70, -69 }, { 15, 16 }, { -68, -67 }, { -61, -60 }, { 18, 21 }, { 19, 20 }, { -59, -58 }, { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } }; static INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff) { uint8_t bit; int16_t index = 0; while (index >= 0) { bit = (uint8_t)faad_get1bit(ld); index = t_huff[index][bit]; } return index + 64; } /* table 10 */ void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t env, band; int8_t delta = 0; sbr_huff_tab t_huff, f_huff; if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX)) sbr->amp_res[ch] = 0; else sbr->amp_res[ch] = sbr->bs_amp_res; if ((sbr->bs_coupling) && (ch == 1)) { delta = 1; if (sbr->amp_res[ch]) { t_huff = t_huffman_env_bal_3_0dB; f_huff = f_huffman_env_bal_3_0dB; } else { t_huff = t_huffman_env_bal_1_5dB; f_huff = f_huffman_env_bal_1_5dB; } } else { delta = 0; if (sbr->amp_res[ch]) { t_huff = t_huffman_env_3_0dB; f_huff = f_huffman_env_3_0dB; } else { t_huff = t_huffman_env_1_5dB; f_huff = f_huffman_env_1_5dB; } } for (env = 0; env < sbr->L_E[ch]; env++) { if (sbr->bs_df_env[ch][env] == 0) { if ((sbr->bs_coupling == 1) && (ch == 1)) { if (sbr->amp_res[ch]) { sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 5 DEBUGVAR(1,272,"sbr_envelope(): bs_data_env")) << delta); } else { sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 DEBUGVAR(1,273,"sbr_envelope(): bs_data_env")) << delta); } } else { if (sbr->amp_res[ch]) { sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 DEBUGVAR(1,274,"sbr_envelope(): bs_data_env")) << delta); } else { sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 7 DEBUGVAR(1,275,"sbr_envelope(): bs_data_env")) << delta); } } for (band = 1; band < sbr->n[sbr->f[ch][env]]; band++) { sbr->E[ch][band][env] = (sbr_huff_dec(ld, f_huff) << delta); } } else { for (band = 0; band < sbr->n[sbr->f[ch][env]]; band++) { sbr->E[ch][band][env] = (sbr_huff_dec(ld, t_huff) << delta); } } } extract_envelope_data(sbr, ch); } /* table 11 */ void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t noise, band; int8_t delta = 0; sbr_huff_tab t_huff, f_huff; if ((sbr->bs_coupling == 1) && (ch == 1)) { delta = 1; t_huff = t_huffman_noise_bal_3_0dB; f_huff = f_huffman_env_bal_3_0dB; } else { delta = 0; t_huff = t_huffman_noise_3_0dB; f_huff = f_huffman_env_3_0dB; } for (noise = 0; noise < sbr->L_Q[ch]; noise++) { if(sbr->bs_df_noise[ch][noise] == 0) { if ((sbr->bs_coupling == 1) && (ch == 1)) { sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 DEBUGVAR(1,276,"sbr_noise(): bs_data_noise")) << delta); } else { sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 DEBUGVAR(1,277,"sbr_noise(): bs_data_noise")) << delta); } for (band = 1; band < sbr->N_Q; band++) { sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, f_huff) << delta); } } else { for (band = 0; band < sbr->N_Q; band++) { sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, t_huff) << delta); } } } extract_noise_floor_data(sbr, ch); } #endif faad2-2_10_0/libfaad/sbr_huff.h000066400000000000000000000030041374350120500162370ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_huff.h,v 1.21 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_HUFF_H__ #define __SBR_HUFF_H__ #ifdef __cplusplus extern "C" { #endif void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch); void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_noise.h000066400000000000000000001100541374350120500164300ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_noise.h,v 1.17 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_NOISE_H__ #define __SBR_NOISE_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif /* Table 1.A.13 Noise table V */ ALIGN static const complex_t V[] = { { FRAC_CONST(-0.99948155879974), FRAC_CONST(-0.59483414888382) }, { FRAC_CONST(0.97113454341888), FRAC_CONST(-0.67528516054153) }, { FRAC_CONST(0.14130051434040), FRAC_CONST(-0.95090985298157) }, { FRAC_CONST(-0.47005495429039), FRAC_CONST(-0.37340548634529) }, { FRAC_CONST(0.80705064535141), FRAC_CONST(0.29653668403625) }, { FRAC_CONST(-0.38981479406357), FRAC_CONST(0.89572608470917) }, { FRAC_CONST(-0.01053049881011), FRAC_CONST(-0.66959059238434) }, { FRAC_CONST(-0.91266369819641), FRAC_CONST(-0.11522938311100) }, { FRAC_CONST(0.54840421676636), FRAC_CONST(0.75221365690231) }, { FRAC_CONST(0.40009254217148), FRAC_CONST(-0.98929399251938) }, { FRAC_CONST(-0.99867975711823), FRAC_CONST(-0.88147068023682) }, { FRAC_CONST(-0.95531076192856), FRAC_CONST(0.90908759832382) }, { FRAC_CONST(-0.45725932717323), FRAC_CONST(-0.56716322898865) }, { FRAC_CONST(-0.72929674386978), FRAC_CONST(-0.98008275032043) }, { FRAC_CONST(0.75622802972794), FRAC_CONST(0.20950329303741) }, { FRAC_CONST(0.07069442421198), FRAC_CONST(-0.78247898817062) }, { FRAC_CONST(0.74496251344681), FRAC_CONST(-0.91169005632401) }, { FRAC_CONST(-0.96440184116364), FRAC_CONST(-0.94739919900894) }, { FRAC_CONST(0.30424630641937), FRAC_CONST(-0.49438267946243) }, { FRAC_CONST(0.66565030813217), FRAC_CONST(0.64652937650681) }, { FRAC_CONST(0.91697007417679), FRAC_CONST(0.17514097690582) }, { FRAC_CONST(-0.70774918794632), FRAC_CONST(0.52548652887344) }, { FRAC_CONST(-0.70051413774490), FRAC_CONST(-0.45340028405190) }, { FRAC_CONST(-0.99496513605118), FRAC_CONST(-0.90071910619736) }, { FRAC_CONST(0.98164492845535), FRAC_CONST(-0.77463155984879) }, { FRAC_CONST(-0.54671579599380), FRAC_CONST(-0.02570928446949) }, { FRAC_CONST(-0.01689629070461), FRAC_CONST(0.00287506449968) }, { FRAC_CONST(-0.86110347509384), FRAC_CONST(0.42548584938049) }, { FRAC_CONST(-0.98892980813980), FRAC_CONST(-0.87881129980087) }, { FRAC_CONST(0.51756626367569), FRAC_CONST(0.66926783323288) }, { FRAC_CONST(-0.99635028839111), FRAC_CONST(-0.58107727766037) }, { FRAC_CONST(-0.99969369173050), FRAC_CONST(0.98369991779327) }, { FRAC_CONST(0.55266261100769), FRAC_CONST(0.59449058771133) }, { FRAC_CONST(0.34581178426743), FRAC_CONST(0.94879418611526) }, { FRAC_CONST(0.62664210796356), FRAC_CONST(-0.74402970075607) }, { FRAC_CONST(-0.77149701118469), FRAC_CONST(-0.33883658051491) }, { FRAC_CONST(-0.91592246294022), FRAC_CONST(0.03687901422381) }, { FRAC_CONST(-0.76285493373871), FRAC_CONST(-0.91371870040894) }, { FRAC_CONST(0.79788339138031), FRAC_CONST(-0.93180972337723) }, { FRAC_CONST(0.54473078250885), FRAC_CONST(-0.11919206380844) }, { FRAC_CONST(-0.85639280080795), FRAC_CONST(0.42429855465889) }, { FRAC_CONST(-0.92882400751114), FRAC_CONST(0.27871808409691) }, { FRAC_CONST(-0.11708371341228), FRAC_CONST(-0.99800843000412) }, { FRAC_CONST(0.21356749534607), FRAC_CONST(-0.90716296434402) }, { FRAC_CONST(-0.76191693544388), FRAC_CONST(0.99768120050430) }, { FRAC_CONST(0.98111045360565), FRAC_CONST(-0.95854461193085) }, { FRAC_CONST(-0.85913270711899), FRAC_CONST(0.95766568183899) }, { FRAC_CONST(-0.93307244777679), FRAC_CONST(0.49431759119034) }, { FRAC_CONST(0.30485755205154), FRAC_CONST(-0.70540034770966) }, { FRAC_CONST(0.85289651155472), FRAC_CONST(0.46766132116318) }, { FRAC_CONST(0.91328084468842), FRAC_CONST(-0.99839597940445) }, { FRAC_CONST(-0.05890199914575), FRAC_CONST(0.70741826295853) }, { FRAC_CONST(0.28398686647415), FRAC_CONST(0.34633556008339) }, { FRAC_CONST(0.95258164405823), FRAC_CONST(-0.54893416166306) }, { FRAC_CONST(-0.78566324710846), FRAC_CONST(-0.75568538904190) }, { FRAC_CONST(-0.95789498090744), FRAC_CONST(-0.20423194766045) }, { FRAC_CONST(0.82411158084869), FRAC_CONST(0.96654617786407) }, { FRAC_CONST(-0.65185445547104), FRAC_CONST(-0.88734990358353) }, { FRAC_CONST(-0.93643605709076), FRAC_CONST(0.99870789051056) }, { FRAC_CONST(0.91427159309387), FRAC_CONST(-0.98290503025055) }, { FRAC_CONST(-0.70395684242249), FRAC_CONST(0.58796799182892) }, { FRAC_CONST(0.00563771976158), FRAC_CONST(0.61768198013306) }, { FRAC_CONST(0.89065051078796), FRAC_CONST(0.52783352136612) }, { FRAC_CONST(-0.68683707714081), FRAC_CONST(0.80806946754456) }, { FRAC_CONST(0.72165340185165), FRAC_CONST(-0.69259858131409) }, { FRAC_CONST(-0.62928247451782), FRAC_CONST(0.13627037405968) }, { FRAC_CONST(0.29938435554504), FRAC_CONST(-0.46051329374313) }, { FRAC_CONST(-0.91781955957413), FRAC_CONST(-0.74012714624405) }, { FRAC_CONST(0.99298715591431), FRAC_CONST(0.40816611051559) }, { FRAC_CONST(0.82368296384811), FRAC_CONST(-0.74036049842834) }, { FRAC_CONST(-0.98512834310532), FRAC_CONST(-0.99972331523895) }, { FRAC_CONST(-0.95915371179581), FRAC_CONST(-0.99237799644470) }, { FRAC_CONST(-0.21411126852036), FRAC_CONST(-0.93424820899963) }, { FRAC_CONST(-0.68821477890015), FRAC_CONST(-0.26892307400703) }, { FRAC_CONST(0.91851997375488), FRAC_CONST(0.09358228743076) }, { FRAC_CONST(-0.96062767505646), FRAC_CONST(0.36099094152451) }, { FRAC_CONST(0.51646184921265), FRAC_CONST(-0.71373331546783) }, { FRAC_CONST(0.61130720376968), FRAC_CONST(0.46950140595436) }, { FRAC_CONST(0.47336128354073), FRAC_CONST(-0.27333179116249) }, { FRAC_CONST(0.90998309850693), FRAC_CONST(0.96715664863586) }, { FRAC_CONST(0.44844800233841), FRAC_CONST(0.99211573600769) }, { FRAC_CONST(0.66614890098572), FRAC_CONST(0.96590173244476) }, { FRAC_CONST(0.74922239780426), FRAC_CONST(-0.89879858493805) }, { FRAC_CONST(-0.99571585655212), FRAC_CONST(0.52785521745682) }, { FRAC_CONST(0.97401082515717), FRAC_CONST(-0.16855870187283) }, { FRAC_CONST(0.72683745622635), FRAC_CONST(-0.48060774803162) }, { FRAC_CONST(0.95432192087173), FRAC_CONST(0.68849605321884) }, { FRAC_CONST(-0.72962206602097), FRAC_CONST(-0.76608443260193) }, { FRAC_CONST(-0.85359477996826), FRAC_CONST(0.88738125562668) }, { FRAC_CONST(-0.81412428617477), FRAC_CONST(-0.97480767965317) }, { FRAC_CONST(-0.87930774688721), FRAC_CONST(0.74748307466507) }, { FRAC_CONST(-0.71573328971863), FRAC_CONST(-0.98570609092712) }, { FRAC_CONST(0.83524298667908), FRAC_CONST(0.83702534437180) }, { FRAC_CONST(-0.48086065053940), FRAC_CONST(-0.98848503828049) }, { FRAC_CONST(0.97139126062393), FRAC_CONST(0.80093622207642) }, { FRAC_CONST(0.51992827653885), FRAC_CONST(0.80247628688812) }, { FRAC_CONST(-0.00848591234535), FRAC_CONST(-0.76670128107071) }, { FRAC_CONST(-0.70294374227524), FRAC_CONST(0.55359911918640) }, { FRAC_CONST(-0.95894426107407), FRAC_CONST(-0.43265503644943) }, { FRAC_CONST(0.97079253196716), FRAC_CONST(0.09325857460499) }, { FRAC_CONST(-0.92404294013977), FRAC_CONST(0.85507702827454) }, { FRAC_CONST(-0.69506472349167), FRAC_CONST(0.98633414506912) }, { FRAC_CONST(0.26559203863144), FRAC_CONST(0.73314309120178) }, { FRAC_CONST(0.28038442134857), FRAC_CONST(0.14537914097309) }, { FRAC_CONST(-0.74138122797012), FRAC_CONST(0.99310338497162) }, { FRAC_CONST(-0.01752796024084), FRAC_CONST(-0.82616633176804) }, { FRAC_CONST(-0.55126774311066), FRAC_CONST(-0.98898541927338) }, { FRAC_CONST(0.97960901260376), FRAC_CONST(-0.94021445512772) }, { FRAC_CONST(-0.99196308851242), FRAC_CONST(0.67019015550613) }, { FRAC_CONST(-0.67684930562973), FRAC_CONST(0.12631492316723) }, { FRAC_CONST(0.09140039235353), FRAC_CONST(-0.20537731051445) }, { FRAC_CONST(-0.71658962965012), FRAC_CONST(-0.97788202762604) }, { FRAC_CONST(0.81014639139175), FRAC_CONST(0.53722649812698) }, { FRAC_CONST(0.40616992115974), FRAC_CONST(-0.26469007134438) }, { FRAC_CONST(-0.67680186033249), FRAC_CONST(0.94502049684525) }, { FRAC_CONST(0.86849772930145), FRAC_CONST(-0.18333598971367) }, { FRAC_CONST(-0.99500381946564), FRAC_CONST(-0.02634122036397) }, { FRAC_CONST(0.84329187870026), FRAC_CONST(0.10406957566738) }, { FRAC_CONST(-0.09215968847275), FRAC_CONST(0.69540011882782) }, { FRAC_CONST(0.99956172704697), FRAC_CONST(-0.12358541786671) }, { FRAC_CONST(-0.79732781648636), FRAC_CONST(-0.91582524776459) }, { FRAC_CONST(0.96349972486496), FRAC_CONST(0.96640455722809) }, { FRAC_CONST(-0.79942780733109), FRAC_CONST(0.64323902130127) }, { FRAC_CONST(-0.11566039919853), FRAC_CONST(0.28587844967842) }, { FRAC_CONST(-0.39922955632210), FRAC_CONST(0.94129604101181) }, { FRAC_CONST(0.99089199304581), FRAC_CONST(-0.92062628269196) }, { FRAC_CONST(0.28631284832954), FRAC_CONST(-0.91035044193268) }, { FRAC_CONST(-0.83302724361420), FRAC_CONST(-0.67330408096313) }, { FRAC_CONST(0.95404446125031), FRAC_CONST(0.49162766337395) }, { FRAC_CONST(-0.06449863314629), FRAC_CONST(0.03250560909510) }, { FRAC_CONST(-0.99575054645538), FRAC_CONST(0.42389783263206) }, { FRAC_CONST(-0.65501141548157), FRAC_CONST(0.82546114921570) }, { FRAC_CONST(-0.81254440546036), FRAC_CONST(-0.51627236604691) }, { FRAC_CONST(-0.99646371603012), FRAC_CONST(0.84490531682968) }, { FRAC_CONST(0.00287840608507), FRAC_CONST(0.64768260717392) }, { FRAC_CONST(0.70176988840103), FRAC_CONST(-0.20453028380871) }, { FRAC_CONST(0.96361881494522), FRAC_CONST(0.40706968307495) }, { FRAC_CONST(-0.68883758783340), FRAC_CONST(0.91338956356049) }, { FRAC_CONST(-0.34875586628914), FRAC_CONST(0.71472293138504) }, { FRAC_CONST(0.91980081796646), FRAC_CONST(0.66507452726364) }, { FRAC_CONST(-0.99009048938751), FRAC_CONST(0.85868018865585) }, { FRAC_CONST(0.68865793943405), FRAC_CONST(0.55660319328308) }, { FRAC_CONST(-0.99484401941299), FRAC_CONST(-0.20052559673786) }, { FRAC_CONST(0.94214510917664), FRAC_CONST(-0.99696427583694) }, { FRAC_CONST(-0.67414629459381), FRAC_CONST(0.49548220634460) }, { FRAC_CONST(-0.47339352965355), FRAC_CONST(-0.85904330015182) }, { FRAC_CONST(0.14323651790619), FRAC_CONST(-0.94145596027374) }, { FRAC_CONST(-0.29268294572830), FRAC_CONST(0.05759225040674) }, { FRAC_CONST(0.43793860077858), FRAC_CONST(-0.78904968500137) }, { FRAC_CONST(-0.36345127224922), FRAC_CONST(0.64874434471130) }, { FRAC_CONST(-0.08750604838133), FRAC_CONST(0.97686946392059) }, { FRAC_CONST(-0.96495270729065), FRAC_CONST(-0.53960305452347) }, { FRAC_CONST(0.55526942014694), FRAC_CONST(0.78891521692276) }, { FRAC_CONST(0.73538213968277), FRAC_CONST(0.96452075242996) }, { FRAC_CONST(-0.30889773368835), FRAC_CONST(-0.80664390325546) }, { FRAC_CONST(0.03574995696545), FRAC_CONST(-0.97325617074966) }, { FRAC_CONST(0.98720687627792), FRAC_CONST(0.48409134149551) }, { FRAC_CONST(-0.81689298152924), FRAC_CONST(-0.90827703475952) }, { FRAC_CONST(0.67866861820221), FRAC_CONST(0.81284505128860) }, { FRAC_CONST(-0.15808570384979), FRAC_CONST(0.85279554128647) }, { FRAC_CONST(0.80723392963409), FRAC_CONST(-0.24717418849468) }, { FRAC_CONST(0.47788757085800), FRAC_CONST(-0.46333149075508) }, { FRAC_CONST(0.96367555856705), FRAC_CONST(0.38486748933792) }, { FRAC_CONST(-0.99143874645233), FRAC_CONST(-0.24945276975632) }, { FRAC_CONST(0.83081877231598), FRAC_CONST(-0.94780850410461) }, { FRAC_CONST(-0.58753192424774), FRAC_CONST(0.01290772389621) }, { FRAC_CONST(0.95538109540939), FRAC_CONST(-0.85557049512863) }, { FRAC_CONST(-0.96490919589996), FRAC_CONST(-0.64020973443985) }, { FRAC_CONST(-0.97327101230621), FRAC_CONST(0.12378127872944) }, { FRAC_CONST(0.91400367021561), FRAC_CONST(0.57972472906113) }, { FRAC_CONST(-0.99925839900970), FRAC_CONST(0.71084845066071) }, { FRAC_CONST(-0.86875903606415), FRAC_CONST(-0.20291699469090) }, { FRAC_CONST(-0.26240035891533), FRAC_CONST(-0.68264555931091) }, { FRAC_CONST(-0.24664412438869), FRAC_CONST(-0.87642270326614) }, { FRAC_CONST(0.02416275814176), FRAC_CONST(0.27192914485931) }, { FRAC_CONST(0.82068622112274), FRAC_CONST(-0.85087788105011) }, { FRAC_CONST(0.88547372817993), FRAC_CONST(-0.89636802673340) }, { FRAC_CONST(-0.18173077702522), FRAC_CONST(-0.26152145862579) }, { FRAC_CONST(0.09355476498604), FRAC_CONST(0.54845124483109) }, { FRAC_CONST(-0.54668414592743), FRAC_CONST(0.95980775356293) }, { FRAC_CONST(0.37050989270210), FRAC_CONST(-0.59910142421722) }, { FRAC_CONST(-0.70373594760895), FRAC_CONST(0.91227668523788) }, { FRAC_CONST(-0.34600785374641), FRAC_CONST(-0.99441426992416) }, { FRAC_CONST(-0.68774479627609), FRAC_CONST(-0.30238837003708) }, { FRAC_CONST(-0.26843291521072), FRAC_CONST(0.83115667104721) }, { FRAC_CONST(0.49072334170341), FRAC_CONST(-0.45359709858894) }, { FRAC_CONST(0.38975992798805), FRAC_CONST(0.95515358448029) }, { FRAC_CONST(-0.97757124900818), FRAC_CONST(0.05305894464254) }, { FRAC_CONST(-0.17325553297997), FRAC_CONST(-0.92770671844482) }, { FRAC_CONST(0.99948036670685), FRAC_CONST(0.58285546302795) }, { FRAC_CONST(-0.64946246147156), FRAC_CONST(0.68645507097244) }, { FRAC_CONST(-0.12016920745373), FRAC_CONST(-0.57147324085236) }, { FRAC_CONST(-0.58947455883026), FRAC_CONST(-0.34847131371498) }, { FRAC_CONST(-0.41815140843391), FRAC_CONST(0.16276422142982) }, { FRAC_CONST(0.99885648488998), FRAC_CONST(0.11136095225811) }, { FRAC_CONST(-0.56649613380432), FRAC_CONST(-0.90494865179062) }, { FRAC_CONST(0.94138020277023), FRAC_CONST(0.35281917452812) }, { FRAC_CONST(-0.75725078582764), FRAC_CONST(0.53650552034378) }, { FRAC_CONST(0.20541973412037), FRAC_CONST(-0.94435143470764) }, { FRAC_CONST(0.99980372190475), FRAC_CONST(0.79835915565491) }, { FRAC_CONST(0.29078277945518), FRAC_CONST(0.35393777489662) }, { FRAC_CONST(-0.62858772277832), FRAC_CONST(0.38765692710876) }, { FRAC_CONST(0.43440905213356), FRAC_CONST(-0.98546332120895) }, { FRAC_CONST(-0.98298585414886), FRAC_CONST(0.21021524071693) }, { FRAC_CONST(0.19513028860092), FRAC_CONST(-0.94239830970764) }, { FRAC_CONST(-0.95476663112640), FRAC_CONST(0.98364555835724) }, { FRAC_CONST(0.93379634618759), FRAC_CONST(-0.70881992578506) }, { FRAC_CONST(-0.85235410928726), FRAC_CONST(-0.08342348039150) }, { FRAC_CONST(-0.86425095796585), FRAC_CONST(-0.45795026421547) }, { FRAC_CONST(0.38879778981209), FRAC_CONST(0.97274428606033) }, { FRAC_CONST(0.92045122385025), FRAC_CONST(-0.62433654069901) }, { FRAC_CONST(0.89162534475327), FRAC_CONST(0.54950958490372) }, { FRAC_CONST(-0.36834338307381), FRAC_CONST(0.96458297967911) }, { FRAC_CONST(0.93891763687134), FRAC_CONST(-0.89968353509903) }, { FRAC_CONST(0.99267655611038), FRAC_CONST(-0.03757034242153) }, { FRAC_CONST(-0.94063472747803), FRAC_CONST(0.41332337260246) }, { FRAC_CONST(0.99740225076675), FRAC_CONST(-0.16830494999886) }, { FRAC_CONST(-0.35899412631989), FRAC_CONST(-0.46633225679398) }, { FRAC_CONST(0.05237237364054), FRAC_CONST(-0.25640362501144) }, { FRAC_CONST(0.36703583598137), FRAC_CONST(-0.38653266429901) }, { FRAC_CONST(0.91653180122375), FRAC_CONST(-0.30587628483772) }, { FRAC_CONST(0.69000804424286), FRAC_CONST(0.90952169895172) }, { FRAC_CONST(-0.38658750057220), FRAC_CONST(0.99501574039459) }, { FRAC_CONST(-0.29250815510750), FRAC_CONST(0.37444993853569) }, { FRAC_CONST(-0.60182201862335), FRAC_CONST(0.86779648065567) }, { FRAC_CONST(-0.97418588399887), FRAC_CONST(0.96468526124954) }, { FRAC_CONST(0.88461571931839), FRAC_CONST(0.57508403062820) }, { FRAC_CONST(0.05198933184147), FRAC_CONST(0.21269661188126) }, { FRAC_CONST(-0.53499621152878), FRAC_CONST(0.97241556644440) }, { FRAC_CONST(-0.49429559707642), FRAC_CONST(0.98183864355087) }, { FRAC_CONST(-0.98935145139694), FRAC_CONST(-0.40249159932137) }, { FRAC_CONST(-0.98081380128860), FRAC_CONST(-0.72856897115707) }, { FRAC_CONST(-0.27338150143623), FRAC_CONST(0.99950921535492) }, { FRAC_CONST(0.06310802698135), FRAC_CONST(-0.54539585113525) }, { FRAC_CONST(-0.20461677014828), FRAC_CONST(-0.14209978282452) }, { FRAC_CONST(0.66223841905594), FRAC_CONST(0.72528582811356) }, { FRAC_CONST(-0.84764343500137), FRAC_CONST(0.02372316829860) }, { FRAC_CONST(-0.89039862155914), FRAC_CONST(0.88866579532623) }, { FRAC_CONST(0.95903307199478), FRAC_CONST(0.76744925975800) }, { FRAC_CONST(0.73504126071930), FRAC_CONST(-0.03747203201056) }, { FRAC_CONST(-0.31744435429573), FRAC_CONST(-0.36834111809731) }, { FRAC_CONST(-0.34110826253891), FRAC_CONST(0.40211221575737) }, { FRAC_CONST(0.47803884744644), FRAC_CONST(-0.39423218369484) }, { FRAC_CONST(0.98299193382263), FRAC_CONST(0.01989791356027) }, { FRAC_CONST(-0.30963072180748), FRAC_CONST(-0.18076720833778) }, { FRAC_CONST(0.99992591142654), FRAC_CONST(-0.26281872391701) }, { FRAC_CONST(-0.93149733543396), FRAC_CONST(-0.98313164710999) }, { FRAC_CONST(0.99923473596573), FRAC_CONST(-0.80142992734909) }, { FRAC_CONST(-0.26024168729782), FRAC_CONST(-0.75999760627747) }, { FRAC_CONST(-0.35712513327599), FRAC_CONST(0.19298963248730) }, { FRAC_CONST(-0.99899083375931), FRAC_CONST(0.74645155668259) }, { FRAC_CONST(0.86557173728943), FRAC_CONST(0.55593866109848) }, { FRAC_CONST(0.33408042788506), FRAC_CONST(0.86185956001282) }, { FRAC_CONST(0.99010735750198), FRAC_CONST(0.04602397605777) }, { FRAC_CONST(-0.66694271564484), FRAC_CONST(-0.91643613576889) }, { FRAC_CONST(0.64016789197922), FRAC_CONST(0.15649530291557) }, { FRAC_CONST(0.99570536613464), FRAC_CONST(0.45844584703445) }, { FRAC_CONST(-0.63431465625763), FRAC_CONST(0.21079117059708) }, { FRAC_CONST(-0.07706847041845), FRAC_CONST(-0.89581435918808) }, { FRAC_CONST(0.98590087890625), FRAC_CONST(0.88241720199585) }, { FRAC_CONST(0.80099332332611), FRAC_CONST(-0.36851897835732) }, { FRAC_CONST(0.78368133306503), FRAC_CONST(0.45506998896599) }, { FRAC_CONST(0.08707806468010), FRAC_CONST(0.80938994884491) }, { FRAC_CONST(-0.86811882257462), FRAC_CONST(0.39347308874130) }, { FRAC_CONST(-0.39466530084610), FRAC_CONST(-0.66809433698654) }, { FRAC_CONST(0.97875326871872), FRAC_CONST(-0.72467839717865) }, { FRAC_CONST(-0.95038563013077), FRAC_CONST(0.89563220739365) }, { FRAC_CONST(0.17005239427090), FRAC_CONST(0.54683053493500) }, { FRAC_CONST(-0.76910793781281), FRAC_CONST(-0.96226614713669) }, { FRAC_CONST(0.99743282794952), FRAC_CONST(0.42697158455849) }, { FRAC_CONST(0.95437383651733), FRAC_CONST(0.97002321481705) }, { FRAC_CONST(0.99578905105591), FRAC_CONST(-0.54106825590134) }, { FRAC_CONST(0.28058260679245), FRAC_CONST(-0.85361421108246) }, { FRAC_CONST(0.85256522893906), FRAC_CONST(-0.64567607641220) }, { FRAC_CONST(-0.50608539581299), FRAC_CONST(-0.65846014022827) }, { FRAC_CONST(-0.97210735082626), FRAC_CONST(-0.23095212876797) }, { FRAC_CONST(0.95424050092697), FRAC_CONST(-0.99240148067474) }, { FRAC_CONST(-0.96926569938660), FRAC_CONST(0.73775655031204) }, { FRAC_CONST(0.30872163176537), FRAC_CONST(0.41514959931374) }, { FRAC_CONST(-0.24523839354515), FRAC_CONST(0.63206630945206) }, { FRAC_CONST(-0.33813264966011), FRAC_CONST(-0.38661777973175) }, { FRAC_CONST(-0.05826828256249), FRAC_CONST(-0.06940773874521) }, { FRAC_CONST(-0.22898460924625), FRAC_CONST(0.97054851055145) }, { FRAC_CONST(-0.18509915471077), FRAC_CONST(0.47565764188766) }, { FRAC_CONST(-0.10488238185644), FRAC_CONST(-0.87769949436188) }, { FRAC_CONST(-0.71886587142944), FRAC_CONST(0.78030979633331) }, { FRAC_CONST(0.99793875217438), FRAC_CONST(0.90041309595108) }, { FRAC_CONST(0.57563304901123), FRAC_CONST(-0.91034334897995) }, { FRAC_CONST(0.28909647464752), FRAC_CONST(0.96307784318924) }, { FRAC_CONST(0.42188999056816), FRAC_CONST(0.48148649930954) }, { FRAC_CONST(0.93335050344467), FRAC_CONST(-0.43537023663521) }, { FRAC_CONST(-0.97087377309799), FRAC_CONST(0.86636447906494) }, { FRAC_CONST(0.36722871661186), FRAC_CONST(0.65291655063629) }, { FRAC_CONST(-0.81093025207520), FRAC_CONST(0.08778370171785) }, { FRAC_CONST(-0.26240602135658), FRAC_CONST(-0.92774093151093) }, { FRAC_CONST(0.83996498584747), FRAC_CONST(0.55839848518372) }, { FRAC_CONST(-0.99909615516663), FRAC_CONST(-0.96024608612061) }, { FRAC_CONST(0.74649465084076), FRAC_CONST(0.12144893407822) }, { FRAC_CONST(-0.74774593114853), FRAC_CONST(-0.26898062229156) }, { FRAC_CONST(0.95781666040421), FRAC_CONST(-0.79047924280167) }, { FRAC_CONST(0.95472306013107), FRAC_CONST(-0.08588775992393) }, { FRAC_CONST(0.48708331584930), FRAC_CONST(0.99999040365219) }, { FRAC_CONST(0.46332037448883), FRAC_CONST(0.10964126139879) }, { FRAC_CONST(-0.76497006416321), FRAC_CONST(0.89210927486420) }, { FRAC_CONST(0.57397389411926), FRAC_CONST(0.35289704799652) }, { FRAC_CONST(0.75374317169189), FRAC_CONST(0.96705216169357) }, { FRAC_CONST(-0.59174400568008), FRAC_CONST(-0.89405369758606) }, { FRAC_CONST(0.75087904930115), FRAC_CONST(-0.29612672328949) }, { FRAC_CONST(-0.98607856035233), FRAC_CONST(0.25034910440445) }, { FRAC_CONST(-0.40761056542397), FRAC_CONST(-0.90045571327209) }, { FRAC_CONST(0.66929268836975), FRAC_CONST(0.98629492521286) }, { FRAC_CONST(-0.97463697195053), FRAC_CONST(-0.00190223299433) }, { FRAC_CONST(0.90145510435104), FRAC_CONST(0.99781388044357) }, { FRAC_CONST(-0.87259286642075), FRAC_CONST(0.99233585596085) }, { FRAC_CONST(-0.91529458761215), FRAC_CONST(-0.15698707103729) }, { FRAC_CONST(-0.03305738791823), FRAC_CONST(-0.37205263972282) }, { FRAC_CONST(0.07223051041365), FRAC_CONST(-0.88805001974106) }, { FRAC_CONST(0.99498009681702), FRAC_CONST(0.97094357013702) }, { FRAC_CONST(-0.74904936552048), FRAC_CONST(0.99985486268997) }, { FRAC_CONST(0.04585228487849), FRAC_CONST(0.99812334775925) }, { FRAC_CONST(-0.89054954051971), FRAC_CONST(-0.31791913509369) }, { FRAC_CONST(-0.83782142400742), FRAC_CONST(0.97637635469437) }, { FRAC_CONST(0.33454805612564), FRAC_CONST(-0.86231517791748) }, { FRAC_CONST(-0.99707579612732), FRAC_CONST(0.93237990140915) }, { FRAC_CONST(-0.22827528417110), FRAC_CONST(0.18874759972095) }, { FRAC_CONST(0.67248046398163), FRAC_CONST(-0.03646211326122) }, { FRAC_CONST(-0.05146538093686), FRAC_CONST(-0.92599701881409) }, { FRAC_CONST(0.99947297573090), FRAC_CONST(0.93625229597092) }, { FRAC_CONST(0.66951125860214), FRAC_CONST(0.98905825614929) }, { FRAC_CONST(-0.99602955579758), FRAC_CONST(-0.44654715061188) }, { FRAC_CONST(0.82104903459549), FRAC_CONST(0.99540740251541) }, { FRAC_CONST(0.99186509847641), FRAC_CONST(0.72022998332977) }, { FRAC_CONST(-0.65284591913223), FRAC_CONST(0.52186721563339) }, { FRAC_CONST(0.93885445594788), FRAC_CONST(-0.74895310401917) }, { FRAC_CONST(0.96735250949860), FRAC_CONST(0.90891814231873) }, { FRAC_CONST(-0.22225968539715), FRAC_CONST(0.57124030590057) }, { FRAC_CONST(-0.44132784008980), FRAC_CONST(-0.92688840627670) }, { FRAC_CONST(-0.85694974660873), FRAC_CONST(0.88844531774521) }, { FRAC_CONST(0.91783040761948), FRAC_CONST(-0.46356892585754) }, { FRAC_CONST(0.72556972503662), FRAC_CONST(-0.99899554252625) }, { FRAC_CONST(-0.99711579084396), FRAC_CONST(0.58211559057236) }, { FRAC_CONST(0.77638977766037), FRAC_CONST(0.94321835041046) }, { FRAC_CONST(0.07717324048281), FRAC_CONST(0.58638399839401) }, { FRAC_CONST(-0.56049829721451), FRAC_CONST(0.82522302865982) }, { FRAC_CONST(0.98398894071579), FRAC_CONST(0.39467439055443) }, { FRAC_CONST(0.47546947002411), FRAC_CONST(0.68613046407700) }, { FRAC_CONST(0.65675091743469), FRAC_CONST(0.18331636488438) }, { FRAC_CONST(0.03273375332355), FRAC_CONST(-0.74933111667633) }, { FRAC_CONST(-0.38684144616127), FRAC_CONST(0.51337349414825) }, { FRAC_CONST(-0.97346270084381), FRAC_CONST(-0.96549361944199) }, { FRAC_CONST(-0.53282153606415), FRAC_CONST(-0.91423267126083) }, { FRAC_CONST(0.99817311763763), FRAC_CONST(0.61133575439453) }, { FRAC_CONST(-0.50254499912262), FRAC_CONST(-0.88829338550568) }, { FRAC_CONST(0.01995873264968), FRAC_CONST(0.85223513841629) }, { FRAC_CONST(0.99930381774902), FRAC_CONST(0.94578897953033) }, { FRAC_CONST(0.82907766103745), FRAC_CONST(-0.06323442608118) }, { FRAC_CONST(-0.58660709857941), FRAC_CONST(0.96840775012970) }, { FRAC_CONST(-0.17573736608028), FRAC_CONST(-0.48166921734810) }, { FRAC_CONST(0.83434289693832), FRAC_CONST(-0.13023450970650) }, { FRAC_CONST(0.05946491286159), FRAC_CONST(0.20511047542095) }, { FRAC_CONST(0.81505483388901), FRAC_CONST(-0.94685947895050) }, { FRAC_CONST(-0.44976380467415), FRAC_CONST(0.40894573926926) }, { FRAC_CONST(-0.89746475219727), FRAC_CONST(0.99846577644348) }, { FRAC_CONST(0.39677256345749), FRAC_CONST(-0.74854665994644) }, { FRAC_CONST(-0.07588948309422), FRAC_CONST(0.74096214771271) }, { FRAC_CONST(0.76343196630478), FRAC_CONST(0.41746628284454) }, { FRAC_CONST(-0.74490106105804), FRAC_CONST(0.94725912809372) }, { FRAC_CONST(0.64880120754242), FRAC_CONST(0.41336661577225) }, { FRAC_CONST(0.62319535017014), FRAC_CONST(-0.93098312616348) }, { FRAC_CONST(0.42215818166733), FRAC_CONST(-0.07712787389755) }, { FRAC_CONST(0.02704554051161), FRAC_CONST(-0.05417517945170) }, { FRAC_CONST(0.80001771450043), FRAC_CONST(0.91542196273804) }, { FRAC_CONST(-0.79351830482483), FRAC_CONST(-0.36208897829056) }, { FRAC_CONST(0.63872361183167), FRAC_CONST(0.08128252625465) }, { FRAC_CONST(0.52890521287918), FRAC_CONST(0.60048872232437) }, { FRAC_CONST(0.74238550662994), FRAC_CONST(0.04491915181279) }, { FRAC_CONST(0.99096131324768), FRAC_CONST(-0.19451183080673) }, { FRAC_CONST(-0.80412328243256), FRAC_CONST(-0.88513815402985) }, { FRAC_CONST(-0.64612615108490), FRAC_CONST(0.72198677062988) }, { FRAC_CONST(0.11657770723104), FRAC_CONST(-0.83662831783295) }, { FRAC_CONST(-0.95053184032440), FRAC_CONST(-0.96939903497696) }, { FRAC_CONST(-0.62228870391846), FRAC_CONST(0.82767260074615) }, { FRAC_CONST(0.03004475869238), FRAC_CONST(-0.99738895893097) }, { FRAC_CONST(-0.97987216711044), FRAC_CONST(0.36526128649712) }, { FRAC_CONST(-0.99986982345581), FRAC_CONST(-0.36021611094475) }, { FRAC_CONST(0.89110648632050), FRAC_CONST(-0.97894251346588) }, { FRAC_CONST(0.10407960414886), FRAC_CONST(0.77357792854309) }, { FRAC_CONST(0.95964735746384), FRAC_CONST(-0.35435819625854) }, { FRAC_CONST(0.50843232870102), FRAC_CONST(0.96107691526413) }, { FRAC_CONST(0.17006334662437), FRAC_CONST(-0.76854026317596) }, { FRAC_CONST(0.25872674584389), FRAC_CONST(0.99893301725388) }, { FRAC_CONST(-0.01115998718888), FRAC_CONST(0.98496019840240) }, { FRAC_CONST(-0.79598701000214), FRAC_CONST(0.97138410806656) }, { FRAC_CONST(-0.99264711141586), FRAC_CONST(-0.99542820453644) }, { FRAC_CONST(-0.99829661846161), FRAC_CONST(0.01877138763666) }, { FRAC_CONST(-0.70801013708115), FRAC_CONST(0.33680686354637) }, { FRAC_CONST(-0.70467054843903), FRAC_CONST(0.93272775411606) }, { FRAC_CONST(0.99846023321152), FRAC_CONST(-0.98725748062134) }, { FRAC_CONST(-0.63364970684052), FRAC_CONST(-0.16473594307899) }, { FRAC_CONST(-0.16258217394352), FRAC_CONST(-0.95939123630524) }, { FRAC_CONST(-0.43645593523979), FRAC_CONST(-0.94805032014847) }, { FRAC_CONST(-0.99848473072052), FRAC_CONST(0.96245169639587) }, { FRAC_CONST(-0.16796459257603), FRAC_CONST(-0.98987513780594) }, { FRAC_CONST(-0.87979227304459), FRAC_CONST(-0.71725726127625) }, { FRAC_CONST(0.44183099269867), FRAC_CONST(-0.93568974733353) }, { FRAC_CONST(0.93310177326202), FRAC_CONST(-0.99913311004639) }, { FRAC_CONST(-0.93941932916641), FRAC_CONST(-0.56409376859665) }, { FRAC_CONST(-0.88590002059937), FRAC_CONST(0.47624599933624) }, { FRAC_CONST(0.99971461296082), FRAC_CONST(-0.83889955282211) }, { FRAC_CONST(-0.75376385450363), FRAC_CONST(0.00814643409103) }, { FRAC_CONST(0.93887686729431), FRAC_CONST(-0.11284527927637) }, { FRAC_CONST(0.85126435756683), FRAC_CONST(0.52349251508713) }, { FRAC_CONST(0.39701420068741), FRAC_CONST(0.81779634952545) }, { FRAC_CONST(-0.37024465203285), FRAC_CONST(-0.87071657180786) }, { FRAC_CONST(-0.36024826765060), FRAC_CONST(0.34655734896660) }, { FRAC_CONST(-0.93388813734055), FRAC_CONST(-0.84476542472839) }, { FRAC_CONST(-0.65298801660538), FRAC_CONST(-0.18439576029778) }, { FRAC_CONST(0.11960318684578), FRAC_CONST(0.99899345636368) }, { FRAC_CONST(0.94292563199997), FRAC_CONST(0.83163905143738) }, { FRAC_CONST(0.75081145763397), FRAC_CONST(-0.35533222556114) }, { FRAC_CONST(0.56721979379654), FRAC_CONST(-0.24076835811138) }, { FRAC_CONST(0.46857765316963), FRAC_CONST(-0.30140233039856) }, { FRAC_CONST(0.97312313318253), FRAC_CONST(-0.99548190832138) }, { FRAC_CONST(-0.38299977779388), FRAC_CONST(0.98516911268234) }, { FRAC_CONST(0.41025799512863), FRAC_CONST(0.02116736955941) }, { FRAC_CONST(0.09638062119484), FRAC_CONST(0.04411984235048) }, { FRAC_CONST(-0.85283249616623), FRAC_CONST(0.91475564241409) }, { FRAC_CONST(0.88866806030273), FRAC_CONST(-0.99735265970230) }, { FRAC_CONST(-0.48202428221703), FRAC_CONST(-0.96805608272552) }, { FRAC_CONST(0.27572581171989), FRAC_CONST(0.58634752035141) }, { FRAC_CONST(-0.65889132022858), FRAC_CONST(0.58835631608963) }, { FRAC_CONST(0.98838084936142), FRAC_CONST(0.99994349479675) }, { FRAC_CONST(-0.20651349425316), FRAC_CONST(0.54593044519424) }, { FRAC_CONST(-0.62126415967941), FRAC_CONST(-0.59893679618835) }, { FRAC_CONST(0.20320105552673), FRAC_CONST(-0.86879181861877) }, { FRAC_CONST(-0.97790551185608), FRAC_CONST(0.96290808916092) }, { FRAC_CONST(0.11112534999847), FRAC_CONST(0.21484763920307) }, { FRAC_CONST(-0.41368338465691), FRAC_CONST(0.28216838836670) }, { FRAC_CONST(0.24133038520813), FRAC_CONST(0.51294362545013) }, { FRAC_CONST(-0.66393411159515), FRAC_CONST(-0.08249679952860) }, { FRAC_CONST(-0.53697830438614), FRAC_CONST(-0.97649902105331) }, { FRAC_CONST(-0.97224736213684), FRAC_CONST(0.22081333398819) }, { FRAC_CONST(0.87392479181290), FRAC_CONST(-0.12796173989773) }, { FRAC_CONST(0.19050361216068), FRAC_CONST(0.01602615416050) }, { FRAC_CONST(-0.46353441476822), FRAC_CONST(-0.95249038934708) }, { FRAC_CONST(-0.07064096629620), FRAC_CONST(-0.94479805231094) }, { FRAC_CONST(-0.92444086074829), FRAC_CONST(-0.10457590222359) }, { FRAC_CONST(-0.83822596073151), FRAC_CONST(-0.01695043221116) }, { FRAC_CONST(0.75214684009552), FRAC_CONST(-0.99955683946609) }, { FRAC_CONST(-0.42102998495102), FRAC_CONST(0.99720942974091) }, { FRAC_CONST(-0.72094786167145), FRAC_CONST(-0.35008960962296) }, { FRAC_CONST(0.78843313455582), FRAC_CONST(0.52851396799088) }, { FRAC_CONST(0.97394025325775), FRAC_CONST(-0.26695942878723) }, { FRAC_CONST(0.99206465482712), FRAC_CONST(-0.57010120153427) }, { FRAC_CONST(0.76789611577988), FRAC_CONST(-0.76519358158112) }, { FRAC_CONST(-0.82002419233322), FRAC_CONST(-0.73530179262161) }, { FRAC_CONST(0.81924992799759), FRAC_CONST(0.99698424339294) }, { FRAC_CONST(-0.26719850301743), FRAC_CONST(0.68903368711472) }, { FRAC_CONST(-0.43311259150505), FRAC_CONST(0.85321813821793) }, { FRAC_CONST(0.99194979667664), FRAC_CONST(0.91876250505447) }, { FRAC_CONST(-0.80691999197006), FRAC_CONST(-0.32627540826797) }, { FRAC_CONST(0.43080005049706), FRAC_CONST(-0.21919095516205) }, { FRAC_CONST(0.67709493637085), FRAC_CONST(-0.95478075742722) }, { FRAC_CONST(0.56151771545410), FRAC_CONST(-0.70693808794022) }, { FRAC_CONST(0.10831862688065), FRAC_CONST(-0.08628837019205) }, { FRAC_CONST(0.91229414939880), FRAC_CONST(-0.65987348556519) }, { FRAC_CONST(-0.48972892761230), FRAC_CONST(0.56289243698120) }, { FRAC_CONST(-0.89033657312393), FRAC_CONST(-0.71656566858292) }, { FRAC_CONST(0.65269446372986), FRAC_CONST(0.65916007757187) }, { FRAC_CONST(0.67439478635788), FRAC_CONST(-0.81684380769730) }, { FRAC_CONST(-0.47770830988884), FRAC_CONST(-0.16789555549622) }, { FRAC_CONST(-0.99715977907181), FRAC_CONST(-0.93565785884857) }, { FRAC_CONST(-0.90889590978622), FRAC_CONST(0.62034398317337) }, { FRAC_CONST(-0.06618622690439), FRAC_CONST(-0.23812216520309) }, { FRAC_CONST(0.99430269002914), FRAC_CONST(0.18812555074692) }, { FRAC_CONST(0.97686403989792), FRAC_CONST(-0.28664535284042) }, { FRAC_CONST(0.94813650846481), FRAC_CONST(-0.97506642341614) }, { FRAC_CONST(-0.95434498786926), FRAC_CONST(-0.79607981443405) }, { FRAC_CONST(-0.49104782938957), FRAC_CONST(0.32895213365555) }, { FRAC_CONST(0.99881172180176), FRAC_CONST(0.88993984460831) }, { FRAC_CONST(0.50449168682098), FRAC_CONST(-0.85995072126389) }, { FRAC_CONST(0.47162890434265), FRAC_CONST(-0.18680204451084) }, { FRAC_CONST(-0.62081581354141), FRAC_CONST(0.75000673532486) }, { FRAC_CONST(-0.43867015838623), FRAC_CONST(0.99998068809509) }, { FRAC_CONST(0.98630565404892), FRAC_CONST(-0.53578901290894) }, { FRAC_CONST(-0.61510360240936), FRAC_CONST(-0.89515018463135) }, { FRAC_CONST(-0.03841517493129), FRAC_CONST(-0.69888818264008) }, { FRAC_CONST(-0.30102157592773), FRAC_CONST(-0.07667808979750) }, { FRAC_CONST(0.41881284117699), FRAC_CONST(0.02188098989427) }, { FRAC_CONST(-0.86135452985764), FRAC_CONST(0.98947483301163) }, { FRAC_CONST(0.67226862907410), FRAC_CONST(-0.13494388759136) }, { FRAC_CONST(-0.70737397670746), FRAC_CONST(-0.76547348499298) }, { FRAC_CONST(0.94044947624207), FRAC_CONST(0.09026201069355) }, { FRAC_CONST(-0.82386350631714), FRAC_CONST(0.08924768865108) }, { FRAC_CONST(-0.32070666551590), FRAC_CONST(0.50143420696259) }, { FRAC_CONST(0.57593160867691), FRAC_CONST(-0.98966425657272) }, { FRAC_CONST(-0.36326017975807), FRAC_CONST(0.07440242916346) }, { FRAC_CONST(0.99979043006897), FRAC_CONST(-0.14130286872387) }, { FRAC_CONST(-0.92366021871567), FRAC_CONST(-0.97979295253754) }, { FRAC_CONST(-0.44607177376747), FRAC_CONST(-0.54233253002167) }, { FRAC_CONST(0.44226801395416), FRAC_CONST(0.71326756477356) }, { FRAC_CONST(0.03671907261014), FRAC_CONST(0.63606387376785) }, { FRAC_CONST(0.52175426483154), FRAC_CONST(-0.85396826267242) }, { FRAC_CONST(-0.94701141119003), FRAC_CONST(-0.01826348155737) }, { FRAC_CONST(-0.98759609460831), FRAC_CONST(0.82288712263107) }, { FRAC_CONST(0.87434792518616), FRAC_CONST(0.89399492740631) }, { FRAC_CONST(-0.93412041664124), FRAC_CONST(0.41374051570892) }, { FRAC_CONST(0.96063941717148), FRAC_CONST(0.93116706609726) }, { FRAC_CONST(0.97534251213074), FRAC_CONST(0.86150932312012) }, { FRAC_CONST(0.99642467498779), FRAC_CONST(0.70190042257309) }, { FRAC_CONST(-0.94705086946487), FRAC_CONST(-0.29580041766167) }, { FRAC_CONST(0.91599804162979), FRAC_CONST(-0.98147833347321) } }; #ifdef __cplusplus #endif #endif faad2-2_10_0/libfaad/sbr_qmf.c000066400000000000000000000555071374350120500161040ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_qmf.c,v 1.32 2007/11/01 12:33:36 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include #include #include "sbr_dct.h" #include "sbr_qmf.h" #include "sbr_qmf_c.h" #include "sbr_syntax.h" qmfa_info *qmfa_init(uint8_t channels) { qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info)); /* x is implemented as double ringbuffer */ qmfa->x = (real_t*)faad_malloc(2 * channels * 10 * sizeof(real_t)); memset(qmfa->x, 0, 2 * channels * 10 * sizeof(real_t)); /* ringbuffer index */ qmfa->x_index = 0; qmfa->channels = channels; return qmfa; } void qmfa_end(qmfa_info *qmfa) { if (qmfa) { if (qmfa->x) faad_free(qmfa->x); faad_free(qmfa); } } void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx) { ALIGN real_t u[64]; #ifndef SBR_LOW_POWER ALIGN real_t in_real[32], in_imag[32], out_real[32], out_imag[32]; #else ALIGN real_t y[32]; #endif uint32_t in = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { int16_t n; /* shift input buffer x */ /* input buffer is not shifted anymore, x is implemented as double ringbuffer */ //memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t)); /* add new samples to input buffer x */ for (n = 32 - 1; n >= 0; n--) { #ifdef FIXED_POINT qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = (input[in++]) >> 4; #else qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = input[in++]; #endif } /* window and summation to create array u */ for (n = 0; n < 64; n++) { u[n] = MUL_F(qmfa->x[qmfa->x_index + n], qmf_c[2*n]) + MUL_F(qmfa->x[qmfa->x_index + n + 64], qmf_c[2*(n + 64)]) + MUL_F(qmfa->x[qmfa->x_index + n + 128], qmf_c[2*(n + 128)]) + MUL_F(qmfa->x[qmfa->x_index + n + 192], qmf_c[2*(n + 192)]) + MUL_F(qmfa->x[qmfa->x_index + n + 256], qmf_c[2*(n + 256)]); } /* update ringbuffer index */ qmfa->x_index -= 32; if (qmfa->x_index < 0) qmfa->x_index = (320-32); /* calculate 32 subband samples by introducing X */ #ifdef SBR_LOW_POWER y[0] = u[48]; for (n = 1; n < 16; n++) y[n] = u[n+48] + u[48-n]; for (n = 16; n < 32; n++) y[n] = -u[n-16] + u[48-n]; DCT3_32_unscaled(u, y); for (n = 0; n < 32; n++) { if (n < kx) { #ifdef FIXED_POINT QMF_RE(X[l + offset][n]) = u[n] /*<< 1*/; #else QMF_RE(X[l + offset][n]) = 2. * u[n]; #endif } else { QMF_RE(X[l + offset][n]) = 0; } } #else // Reordering of data moved from DCT_IV to here in_imag[31] = u[1]; in_real[0] = u[0]; for (n = 1; n < 31; n++) { in_imag[31 - n] = u[n+1]; in_real[n] = -u[64-n]; } in_imag[0] = u[32]; in_real[31] = -u[33]; // dct4_kernel is DCT_IV without reordering which is done before and after FFT dct4_kernel(in_real, in_imag, out_real, out_imag); // Reordering of data moved from DCT_IV to here for (n = 0; n < 16; n++) { if (2*n+1 < kx) { #ifdef FIXED_POINT QMF_RE(X[l + offset][2*n]) = out_real[n]; QMF_IM(X[l + offset][2*n]) = out_imag[n]; QMF_RE(X[l + offset][2*n+1]) = -out_imag[31-n]; QMF_IM(X[l + offset][2*n+1]) = -out_real[31-n]; #else QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; QMF_RE(X[l + offset][2*n+1]) = -2. * out_imag[31-n]; QMF_IM(X[l + offset][2*n+1]) = -2. * out_real[31-n]; #endif } else { if (2*n < kx) { #ifdef FIXED_POINT QMF_RE(X[l + offset][2*n]) = out_real[n]; QMF_IM(X[l + offset][2*n]) = out_imag[n]; #else QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; #endif } else { QMF_RE(X[l + offset][2*n]) = 0; QMF_IM(X[l + offset][2*n]) = 0; } QMF_RE(X[l + offset][2*n+1]) = 0; QMF_IM(X[l + offset][2*n+1]) = 0; } } #endif } } static const complex_t qmf32_pre_twiddle[] = { { FRAC_CONST(0.999924701839145), FRAC_CONST(-0.012271538285720) }, { FRAC_CONST(0.999322384588350), FRAC_CONST(-0.036807222941359) }, { FRAC_CONST(0.998118112900149), FRAC_CONST(-0.061320736302209) }, { FRAC_CONST(0.996312612182778), FRAC_CONST(-0.085797312344440) }, { FRAC_CONST(0.993906970002356), FRAC_CONST(-0.110222207293883) }, { FRAC_CONST(0.990902635427780), FRAC_CONST(-0.134580708507126) }, { FRAC_CONST(0.987301418157858), FRAC_CONST(-0.158858143333861) }, { FRAC_CONST(0.983105487431216), FRAC_CONST(-0.183039887955141) }, { FRAC_CONST(0.978317370719628), FRAC_CONST(-0.207111376192219) }, { FRAC_CONST(0.972939952205560), FRAC_CONST(-0.231058108280671) }, { FRAC_CONST(0.966976471044852), FRAC_CONST(-0.254865659604515) }, { FRAC_CONST(0.960430519415566), FRAC_CONST(-0.278519689385053) }, { FRAC_CONST(0.953306040354194), FRAC_CONST(-0.302005949319228) }, { FRAC_CONST(0.945607325380521), FRAC_CONST(-0.325310292162263) }, { FRAC_CONST(0.937339011912575), FRAC_CONST(-0.348418680249435) }, { FRAC_CONST(0.928506080473216), FRAC_CONST(-0.371317193951838) }, { FRAC_CONST(0.919113851690058), FRAC_CONST(-0.393992040061048) }, { FRAC_CONST(0.909167983090522), FRAC_CONST(-0.416429560097637) }, { FRAC_CONST(0.898674465693954), FRAC_CONST(-0.438616238538528) }, { FRAC_CONST(0.887639620402854), FRAC_CONST(-0.460538710958240) }, { FRAC_CONST(0.876070094195407), FRAC_CONST(-0.482183772079123) }, { FRAC_CONST(0.863972856121587), FRAC_CONST(-0.503538383725718) }, { FRAC_CONST(0.851355193105265), FRAC_CONST(-0.524589682678469) }, { FRAC_CONST(0.838224705554838), FRAC_CONST(-0.545324988422046) }, { FRAC_CONST(0.824589302785025), FRAC_CONST(-0.565731810783613) }, { FRAC_CONST(0.810457198252595), FRAC_CONST(-0.585797857456439) }, { FRAC_CONST(0.795836904608884), FRAC_CONST(-0.605511041404326) }, { FRAC_CONST(0.780737228572094), FRAC_CONST(-0.624859488142386) }, { FRAC_CONST(0.765167265622459), FRAC_CONST(-0.643831542889791) }, { FRAC_CONST(0.749136394523459), FRAC_CONST(-0.662415777590172) }, { FRAC_CONST(0.732654271672413), FRAC_CONST(-0.680600997795453) }, { FRAC_CONST(0.715730825283819), FRAC_CONST(-0.698376249408973) } }; qmfs_info *qmfs_init(uint8_t channels) { qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info)); /* v is a double ringbuffer */ qmfs->v = (real_t*)faad_malloc(2 * channels * 20 * sizeof(real_t)); memset(qmfs->v, 0, 2 * channels * 20 * sizeof(real_t)); qmfs->v_index = 0; qmfs->channels = channels; return qmfs; } void qmfs_end(qmfs_info *qmfs) { if (qmfs) { if (qmfs->v) faad_free(qmfs->v); faad_free(qmfs); } } #ifdef SBR_LOW_POWER void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x[16]; ALIGN real_t y[16]; int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffers */ /* we are not shifting v, it is a double ringbuffer */ //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); /* calculate 64 samples */ for (k = 0; k < 16; k++) { #ifdef FIXED_POINT y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])); x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])); #else y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])) / 32.0; x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])) / 32.0; #endif } /* even n samples */ DCT2_16_unscaled(x, x); /* odd n samples */ DCT4_16(y, y); for (n = 8; n < 24; n++) { qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 640 + n*2] = x[n-8]; qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 640 + n*2+1] = y[n-8]; } for (n = 0; n < 16; n++) { qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = qmfs->v[qmfs->v_index + 32-n]; } qmfs->v[qmfs->v_index + 48] = qmfs->v[qmfs->v_index + 640 + 48] = 0; for (n = 1; n < 16; n++) { qmfs->v[qmfs->v_index + 48+n] = qmfs->v[qmfs->v_index + 640 + 48+n] = -qmfs->v[qmfs->v_index + 48-n]; } /* calculate 32 output samples and window */ for (k = 0; k < 32; k++) { output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); } /* update the ringbuffer index */ qmfs->v_index -= 64; if (qmfs->v_index < 0) qmfs->v_index = (640-64); } } void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x[64]; ALIGN real_t y[64]; int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffers */ /* we are not shifting v, it is a double ringbuffer */ //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); /* calculate 128 samples */ for (k = 0; k < 32; k++) { #ifdef FIXED_POINT y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])); x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])); #else y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])) / 32.0; x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])) / 32.0; #endif } /* even n samples */ DCT2_32_unscaled(x, x); /* odd n samples */ DCT4_32(y, y); for (n = 16; n < 48; n++) { qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 1280 + n*2] = x[n-16]; qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 1280 + n*2+1] = y[n-16]; } for (n = 0; n < 32; n++) { qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 1280 + n] = qmfs->v[qmfs->v_index + 64-n]; } qmfs->v[qmfs->v_index + 96] = qmfs->v[qmfs->v_index + 1280 + 96] = 0; for (n = 1; n < 32; n++) { qmfs->v[qmfs->v_index + 96+n] = qmfs->v[qmfs->v_index + 1280 + 96+n] = -qmfs->v[qmfs->v_index + 96-n]; } /* calculate 64 output samples and window */ for (k = 0; k < 64; k++) { output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[k]) + MUL_F(qmfs->v[qmfs->v_index + 192 + k], qmf_c[64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[128 + k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + 192 + k], qmf_c[128 + 64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[256 + k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + 192 + k], qmf_c[256 + 64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 768 + k], qmf_c[384 + k]) + MUL_F(qmfs->v[qmfs->v_index + 768 + 192 + k], qmf_c[384 + 64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 1024 + k], qmf_c[512 + k]) + MUL_F(qmfs->v[qmfs->v_index + 1024 + 192 + k], qmf_c[512 + 64 + k]); } /* update the ringbuffer index */ qmfs->v_index -= 128; if (qmfs->v_index < 0) qmfs->v_index = (1280-128); } } #else void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x1[32], x2[32]; #ifndef FIXED_POINT real_t scale = 1.f/64.f; #endif int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffer v */ /* buffer is not shifted, we are using a ringbuffer */ //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); /* calculate 64 samples */ /* complex pre-twiddle */ for (k = 0; k < 32; k++) { x1[k] = MUL_F(QMF_RE(X[l][k]), RE(qmf32_pre_twiddle[k])) - MUL_F(QMF_IM(X[l][k]), IM(qmf32_pre_twiddle[k])); x2[k] = MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k])); #ifndef FIXED_POINT x1[k] *= scale; x2[k] *= scale; #else x1[k] >>= 1; x2[k] >>= 1; #endif } /* transform */ DCT4_32(x1, x1); DST4_32(x2, x2); for (n = 0; n < 32; n++) { qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = -x1[n] + x2[n]; qmfs->v[qmfs->v_index + 63 - n] = qmfs->v[qmfs->v_index + 640 + 63 - n] = x1[n] + x2[n]; } /* calculate 32 output samples and window */ for (k = 0; k < 32; k++) { output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); } /* update ringbuffer index */ qmfs->v_index -= 64; if (qmfs->v_index < 0) qmfs->v_index = (640 - 64); } } void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { // ALIGN real_t x1[64], x2[64]; #ifndef SBR_LOW_POWER ALIGN real_t in_real1[32], in_imag1[32], out_real1[32], out_imag1[32]; ALIGN real_t in_real2[32], in_imag2[32], out_real2[32], out_imag2[32]; #endif qmf_t * pX; real_t * pring_buffer_1, * pring_buffer_3; // real_t * ptemp_1, * ptemp_2; #ifdef PREFER_POINTERS // These pointers are used if target platform has autoinc address generators real_t * pring_buffer_2, * pring_buffer_4; real_t * pring_buffer_5, * pring_buffer_6; real_t * pring_buffer_7, * pring_buffer_8; real_t * pring_buffer_9, * pring_buffer_10; const real_t * pqmf_c_1, * pqmf_c_2, * pqmf_c_3, * pqmf_c_4; const real_t * pqmf_c_5, * pqmf_c_6, * pqmf_c_7, * pqmf_c_8; const real_t * pqmf_c_9, * pqmf_c_10; #endif // #ifdef PREFER_POINTERS #ifndef FIXED_POINT real_t scale = 1.f/64.f; #endif int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffer v */ /* buffer is not shifted, we use double ringbuffer */ //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); /* calculate 128 samples */ #ifndef FIXED_POINT pX = X[l]; in_imag1[31] = scale*QMF_RE(pX[1]); in_real1[0] = scale*QMF_RE(pX[0]); in_imag2[31] = scale*QMF_IM(pX[63-1]); in_real2[0] = scale*QMF_IM(pX[63-0]); for (k = 1; k < 31; k++) { in_imag1[31 - k] = scale*QMF_RE(pX[2*k + 1]); in_real1[ k] = scale*QMF_RE(pX[2*k ]); in_imag2[31 - k] = scale*QMF_IM(pX[63 - (2*k + 1)]); in_real2[ k] = scale*QMF_IM(pX[63 - (2*k )]); } in_imag1[0] = scale*QMF_RE(pX[63]); in_real1[31] = scale*QMF_RE(pX[62]); in_imag2[0] = scale*QMF_IM(pX[63-63]); in_real2[31] = scale*QMF_IM(pX[63-62]); #else pX = X[l]; in_imag1[31] = QMF_RE(pX[1]) >> 1; in_real1[0] = QMF_RE(pX[0]) >> 1; in_imag2[31] = QMF_IM(pX[62]) >> 1; in_real2[0] = QMF_IM(pX[63]) >> 1; for (k = 1; k < 31; k++) { in_imag1[31 - k] = QMF_RE(pX[2*k + 1]) >> 1; in_real1[ k] = QMF_RE(pX[2*k ]) >> 1; in_imag2[31 - k] = QMF_IM(pX[63 - (2*k + 1)]) >> 1; in_real2[ k] = QMF_IM(pX[63 - (2*k )]) >> 1; } in_imag1[0] = QMF_RE(pX[63]) >> 1; in_real1[31] = QMF_RE(pX[62]) >> 1; in_imag2[0] = QMF_IM(pX[0]) >> 1; in_real2[31] = QMF_IM(pX[1]) >> 1; #endif // dct4_kernel is DCT_IV without reordering which is done before and after FFT dct4_kernel(in_real1, in_imag1, out_real1, out_imag1); dct4_kernel(in_real2, in_imag2, out_real2, out_imag2); pring_buffer_1 = qmfs->v + qmfs->v_index; pring_buffer_3 = pring_buffer_1 + 1280; #ifdef PREFER_POINTERS pring_buffer_2 = pring_buffer_1 + 127; pring_buffer_4 = pring_buffer_1 + (1280 + 127); #endif // #ifdef PREFER_POINTERS // ptemp_1 = x1; // ptemp_2 = x2; #ifdef PREFER_POINTERS for (n = 0; n < 32; n ++) { //real_t x1 = *ptemp_1++; //real_t x2 = *ptemp_2++; // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer *pring_buffer_1++ = *pring_buffer_3++ = out_real2[n] - out_real1[n]; *pring_buffer_2-- = *pring_buffer_4-- = out_real2[n] + out_real1[n]; //x1 = *ptemp_1++; //x2 = *ptemp_2++; *pring_buffer_1++ = *pring_buffer_3++ = out_imag2[31-n] + out_imag1[31-n]; *pring_buffer_2-- = *pring_buffer_4-- = out_imag2[31-n] - out_imag1[31-n]; } #else // #ifdef PREFER_POINTERS for (n = 0; n < 32; n++) { // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer pring_buffer_1[2*n] = pring_buffer_3[2*n] = out_real2[n] - out_real1[n]; pring_buffer_1[127-2*n] = pring_buffer_3[127-2*n] = out_real2[n] + out_real1[n]; pring_buffer_1[2*n+1] = pring_buffer_3[2*n+1] = out_imag2[31-n] + out_imag1[31-n]; pring_buffer_1[127-(2*n+1)] = pring_buffer_3[127-(2*n+1)] = out_imag2[31-n] - out_imag1[31-n]; } #endif // #ifdef PREFER_POINTERS pring_buffer_1 = qmfs->v + qmfs->v_index; #ifdef PREFER_POINTERS pring_buffer_2 = pring_buffer_1 + 192; pring_buffer_3 = pring_buffer_1 + 256; pring_buffer_4 = pring_buffer_1 + (256 + 192); pring_buffer_5 = pring_buffer_1 + 512; pring_buffer_6 = pring_buffer_1 + (512 + 192); pring_buffer_7 = pring_buffer_1 + 768; pring_buffer_8 = pring_buffer_1 + (768 + 192); pring_buffer_9 = pring_buffer_1 + 1024; pring_buffer_10 = pring_buffer_1 + (1024 + 192); pqmf_c_1 = qmf_c; pqmf_c_2 = qmf_c + 64; pqmf_c_3 = qmf_c + 128; pqmf_c_4 = qmf_c + 192; pqmf_c_5 = qmf_c + 256; pqmf_c_6 = qmf_c + 320; pqmf_c_7 = qmf_c + 384; pqmf_c_8 = qmf_c + 448; pqmf_c_9 = qmf_c + 512; pqmf_c_10 = qmf_c + 576; #endif // #ifdef PREFER_POINTERS /* calculate 64 output samples and window */ for (k = 0; k < 64; k++) { #ifdef PREFER_POINTERS output[out++] = MUL_F(*pring_buffer_1++, *pqmf_c_1++) + MUL_F(*pring_buffer_2++, *pqmf_c_2++) + MUL_F(*pring_buffer_3++, *pqmf_c_3++) + MUL_F(*pring_buffer_4++, *pqmf_c_4++) + MUL_F(*pring_buffer_5++, *pqmf_c_5++) + MUL_F(*pring_buffer_6++, *pqmf_c_6++) + MUL_F(*pring_buffer_7++, *pqmf_c_7++) + MUL_F(*pring_buffer_8++, *pqmf_c_8++) + MUL_F(*pring_buffer_9++, *pqmf_c_9++) + MUL_F(*pring_buffer_10++, *pqmf_c_10++); #else // #ifdef PREFER_POINTERS output[out++] = MUL_F(pring_buffer_1[k+0], qmf_c[k+0]) + MUL_F(pring_buffer_1[k+192], qmf_c[k+64]) + MUL_F(pring_buffer_1[k+256], qmf_c[k+128]) + MUL_F(pring_buffer_1[k+(256+192)], qmf_c[k+192]) + MUL_F(pring_buffer_1[k+512], qmf_c[k+256]) + MUL_F(pring_buffer_1[k+(512+192)], qmf_c[k+320]) + MUL_F(pring_buffer_1[k+768], qmf_c[k+384]) + MUL_F(pring_buffer_1[k+(768+192)], qmf_c[k+448]) + MUL_F(pring_buffer_1[k+1024], qmf_c[k+512]) + MUL_F(pring_buffer_1[k+(1024+192)], qmf_c[k+576]); #endif // #ifdef PREFER_POINTERS } /* update ringbuffer index */ qmfs->v_index -= 128; if (qmfs->v_index < 0) qmfs->v_index = (1280 - 128); } } #endif #endif faad2-2_10_0/libfaad/sbr_qmf.h000066400000000000000000000036731374350120500161060ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_qmf.h,v 1.25 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_QMF_H__ #define __SBR_QMF_H__ #ifdef __cplusplus extern "C" { #endif qmfa_info *qmfa_init(uint8_t channels); void qmfa_end(qmfa_info *qmfa); qmfs_info *qmfs_init(uint8_t channels); void qmfs_end(qmfs_info *qmfs); void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx); void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output); void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sbr_qmf_c.h000066400000000000000000000531521374350120500164050ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_qmf_c.h,v 1.17 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_QMF_C_H__ #define __SBR_QMF_C_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t qmf_c[640] = { FRAC_CONST(0), FRAC_CONST(-0.00055252865047), FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00049475180896), FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00048937912498), FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00052265642972), FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00056778025613), FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00061327473938), FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00065403333621), FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00069416146273), FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00072550431222), FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00074905980532), FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00077248485949), FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077798694927), FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00078014496257), FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00076307935757), FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00073193571525), FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00069179375372), FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00063415949025), FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00055645763906), FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00046063254803), FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00035011758756), FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.0002098337344), FRAC_CONST(-0.00014463809349), FRAC_CONST(-6.173344072E-005), FRAC_CONST(1.349497418E-005), FRAC_CONST(0.00010943831274), FRAC_CONST(0.00020430170688), FRAC_CONST(0.00029495311041), FRAC_CONST(0.0004026540216), FRAC_CONST(0.00051073884952), FRAC_CONST(0.00062393761391), FRAC_CONST(0.00074580258865), FRAC_CONST(0.00086084433262), FRAC_CONST(0.00098859883015), FRAC_CONST(0.00112501551307), FRAC_CONST(0.00125778846475), FRAC_CONST(0.00139024948272), FRAC_CONST(0.00154432198471), FRAC_CONST(0.00168680832531), FRAC_CONST(0.00183482654224), FRAC_CONST(0.00198411407369), FRAC_CONST(0.00214615835557), FRAC_CONST(0.00230172547746), FRAC_CONST(0.00246256169126), FRAC_CONST(0.00262017586902), FRAC_CONST(0.00278704643465), FRAC_CONST(0.00294694477165), FRAC_CONST(0.00311254206525), FRAC_CONST(0.00327396134847), FRAC_CONST(0.00344188741828), FRAC_CONST(0.00360082681231), FRAC_CONST(0.00376039229104), FRAC_CONST(0.00392074323703), FRAC_CONST(0.00408197531935), FRAC_CONST(0.0042264269227), FRAC_CONST(0.00437307196781), FRAC_CONST(0.00452098527825), FRAC_CONST(0.00466064606118), FRAC_CONST(0.00479325608498), FRAC_CONST(0.00491376035745), FRAC_CONST(0.00503930226013), FRAC_CONST(0.00514073539032), FRAC_CONST(0.00524611661324), FRAC_CONST(0.00534716811982), FRAC_CONST(0.00541967759307), FRAC_CONST(0.00548760401507), FRAC_CONST(0.00554757145088), FRAC_CONST(0.00559380230045), FRAC_CONST(0.00562206432097), FRAC_CONST(0.00564551969164), FRAC_CONST(0.00563891995151), FRAC_CONST(0.00562661141932), FRAC_CONST(0.0055917128663), FRAC_CONST(0.005540436394), FRAC_CONST(0.0054753783077), FRAC_CONST(0.0053838975897), FRAC_CONST(0.00527157587272), FRAC_CONST(0.00513822754514), FRAC_CONST(0.00498396877629), FRAC_CONST(0.004810946906), FRAC_CONST(0.00460395301471), FRAC_CONST(0.00438018617447), FRAC_CONST(0.0041251642327), FRAC_CONST(0.00384564081246), FRAC_CONST(0.00354012465507), FRAC_CONST(0.00320918858098), FRAC_CONST(0.00284467578623), FRAC_CONST(0.00245085400321), FRAC_CONST(0.0020274176185), FRAC_CONST(0.00157846825768), FRAC_CONST(0.00109023290512), FRAC_CONST(0.0005832264248), FRAC_CONST(2.760451905E-005), FRAC_CONST(-0.00054642808664), FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00180394725893), FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.003193377839), FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.004722259624), FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.00637922932685), FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00817982333726), FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.01011502154986), FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01218499959508), FRAC_CONST(0.01327182200351), FRAC_CONST(0.01439046660792), FRAC_CONST(0.01554055533423), FRAC_CONST(0.01673247129989), FRAC_CONST(0.01794333813443), FRAC_CONST(0.01918724313698), FRAC_CONST(0.02045317933555), FRAC_CONST(0.02174675502535), FRAC_CONST(0.02306801692862), FRAC_CONST(0.02441609920285), FRAC_CONST(0.02578758475467), FRAC_CONST(0.02718594296329), FRAC_CONST(0.02860721736385), FRAC_CONST(0.03005026574279), FRAC_CONST(0.03150176087389), FRAC_CONST(0.03297540810337), FRAC_CONST(0.03446209487686), FRAC_CONST(0.03596975605542), FRAC_CONST(0.03748128504252), FRAC_CONST(0.03900536794745), FRAC_CONST(0.04053491705584), FRAC_CONST(0.04206490946367), FRAC_CONST(0.04360975421304), FRAC_CONST(0.04514884056413), FRAC_CONST(0.04668430272642), FRAC_CONST(0.04821657200672), FRAC_CONST(0.04973857556014), FRAC_CONST(0.05125561555216), FRAC_CONST(0.05276307465207), FRAC_CONST(0.05424527683589), FRAC_CONST(0.05571736482138), FRAC_CONST(0.05716164501299), FRAC_CONST(0.0585915683626), FRAC_CONST(0.05998374801761), FRAC_CONST(0.06134551717207), FRAC_CONST(0.06268578081172), FRAC_CONST(0.06397158980681), FRAC_CONST(0.0652247106438), FRAC_CONST(0.06643675122104), FRAC_CONST(0.06760759851228), FRAC_CONST(0.06870438283512), FRAC_CONST(0.06976302447127), FRAC_CONST(0.07076287107266), FRAC_CONST(0.07170026731102), FRAC_CONST(0.07256825833083), FRAC_CONST(0.07336202550803), FRAC_CONST(0.07410036424342), FRAC_CONST(0.07474525581194), FRAC_CONST(0.07531373362019), FRAC_CONST(0.07580083586584), FRAC_CONST(0.07619924793396), FRAC_CONST(0.07649921704119), FRAC_CONST(0.07670934904245), FRAC_CONST(0.07681739756964), FRAC_CONST(0.07682300113923), FRAC_CONST(0.07672049241746), FRAC_CONST(0.07650507183194), FRAC_CONST(0.07617483218536), FRAC_CONST(0.07573057565061), FRAC_CONST(0.0751576255287), FRAC_CONST(0.07446643947564), FRAC_CONST(0.0736406005762), FRAC_CONST(0.07267746427299), FRAC_CONST(0.07158263647903), FRAC_CONST(0.07035330735093), FRAC_CONST(0.06896640131951), FRAC_CONST(0.06745250215166), FRAC_CONST(0.06576906686508), FRAC_CONST(0.06394448059633), FRAC_CONST(0.06196027790387), FRAC_CONST(0.0598166570809), FRAC_CONST(0.05751526919867), FRAC_CONST(0.05504600343009), FRAC_CONST(0.05240938217366), FRAC_CONST(0.04959786763445), FRAC_CONST(0.04663033051701), FRAC_CONST(0.04347687821958), FRAC_CONST(0.04014582784127), FRAC_CONST(0.03664181168133), FRAC_CONST(0.03295839306691), FRAC_CONST(0.02908240060125), FRAC_CONST(0.02503075618909), FRAC_CONST(0.02079970728622), FRAC_CONST(0.01637012582228), FRAC_CONST(0.01176238327857), FRAC_CONST(0.00696368621617), FRAC_CONST(0.00197656014503), FRAC_CONST(-0.00320868968304), FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.01412888273558), FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.02582272888064), FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.03827765720822), FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.05148041767934), FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.06544098531359), FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.08013729344279), FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.09555333528914), FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.1116826931773), FRAC_CONST(-0.120007798468), FRAC_CONST(-0.12850028503878), FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.1459766491187), FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.16409588556669), FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.18281725485142), FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.20212501768103), FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.22196526964149), FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.24230168845974), FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.26310532994603), FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.28432141891085), FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.30590985751916), FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.32781137272105), FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.3499914122931), FRAC_CONST(0.36115899031355), FRAC_CONST(0.37237955463061), FRAC_CONST(0.38363500139043), FRAC_CONST(0.39492117615675), FRAC_CONST(0.40623176767625), FRAC_CONST(0.41756968968409), FRAC_CONST(0.42891199207373), FRAC_CONST(0.44025537543665), FRAC_CONST(0.45159965356824), FRAC_CONST(0.46293080852757), FRAC_CONST(0.47424532146115), FRAC_CONST(0.48552530911099), FRAC_CONST(0.49677082545707), FRAC_CONST(0.50798175000434), FRAC_CONST(0.51912349702391), FRAC_CONST(0.53022408956855), FRAC_CONST(0.54125534487322), FRAC_CONST(0.55220512585061), FRAC_CONST(0.5630789140137), FRAC_CONST(0.57385241316923), FRAC_CONST(0.58454032354679), FRAC_CONST(0.59511230862496), FRAC_CONST(0.6055783538918), FRAC_CONST(0.61591099320291), FRAC_CONST(0.62612426956055), FRAC_CONST(0.63619801077286), FRAC_CONST(0.64612696959461), FRAC_CONST(0.65590163024671), FRAC_CONST(0.66551398801627), FRAC_CONST(0.67496631901712), FRAC_CONST(0.68423532934598), FRAC_CONST(0.69332823767032), FRAC_CONST(0.70223887193539), FRAC_CONST(0.71094104263095), FRAC_CONST(0.71944626349561), FRAC_CONST(0.72774489002994), FRAC_CONST(0.73582117582769), FRAC_CONST(0.74368278636488), FRAC_CONST(0.75131374561237), FRAC_CONST(0.75870807608242), FRAC_CONST(0.76586748650939), FRAC_CONST(0.77277808813327), FRAC_CONST(0.77942875190216), FRAC_CONST(0.7858353120392), FRAC_CONST(0.79197358416424), FRAC_CONST(0.797846641377), FRAC_CONST(0.80344857518505), FRAC_CONST(0.80876950044491), FRAC_CONST(0.81381912706217), FRAC_CONST(0.81857760046468), FRAC_CONST(0.82304198905409), FRAC_CONST(0.8272275347336), FRAC_CONST(0.8311038457152), FRAC_CONST(0.83469373618402), FRAC_CONST(0.83797173378865), FRAC_CONST(0.84095413924722), FRAC_CONST(0.84362382812005), FRAC_CONST(0.84598184698206), FRAC_CONST(0.84803157770763), FRAC_CONST(0.84978051984268), FRAC_CONST(0.85119715249343), FRAC_CONST(0.85230470352147), FRAC_CONST(0.85310209497017), FRAC_CONST(0.85357205739107), FRAC_CONST(0.85373856005937 /*max*/), FRAC_CONST(0.85357205739107), FRAC_CONST(0.85310209497017), FRAC_CONST(0.85230470352147), FRAC_CONST(0.85119715249343), FRAC_CONST(0.84978051984268), FRAC_CONST(0.84803157770763), FRAC_CONST(0.84598184698206), FRAC_CONST(0.84362382812005), FRAC_CONST(0.84095413924722), FRAC_CONST(0.83797173378865), FRAC_CONST(0.83469373618402), FRAC_CONST(0.8311038457152), FRAC_CONST(0.8272275347336), FRAC_CONST(0.82304198905409), FRAC_CONST(0.81857760046468), FRAC_CONST(0.81381912706217), FRAC_CONST(0.80876950044491), FRAC_CONST(0.80344857518505), FRAC_CONST(0.797846641377), FRAC_CONST(0.79197358416424), FRAC_CONST(0.7858353120392), FRAC_CONST(0.77942875190216), FRAC_CONST(0.77277808813327), FRAC_CONST(0.76586748650939), FRAC_CONST(0.75870807608242), FRAC_CONST(0.75131374561237), FRAC_CONST(0.74368278636488), FRAC_CONST(0.73582117582769), FRAC_CONST(0.72774489002994), FRAC_CONST(0.71944626349561), FRAC_CONST(0.71094104263095), FRAC_CONST(0.70223887193539), FRAC_CONST(0.69332823767032), FRAC_CONST(0.68423532934598), FRAC_CONST(0.67496631901712), FRAC_CONST(0.66551398801627), FRAC_CONST(0.65590163024671), FRAC_CONST(0.64612696959461), FRAC_CONST(0.63619801077286), FRAC_CONST(0.62612426956055), FRAC_CONST(0.61591099320291), FRAC_CONST(0.6055783538918), FRAC_CONST(0.59511230862496), FRAC_CONST(0.58454032354679), FRAC_CONST(0.57385241316923), FRAC_CONST(0.5630789140137), FRAC_CONST(0.55220512585061), FRAC_CONST(0.54125534487322), FRAC_CONST(0.53022408956855), FRAC_CONST(0.51912349702391), FRAC_CONST(0.50798175000434), FRAC_CONST(0.49677082545707), FRAC_CONST(0.48552530911099), FRAC_CONST(0.47424532146115), FRAC_CONST(0.46293080852757), FRAC_CONST(0.45159965356824), FRAC_CONST(0.44025537543665), FRAC_CONST(0.42891199207373), FRAC_CONST(0.41756968968409), FRAC_CONST(0.40623176767625), FRAC_CONST(0.39492117615675), FRAC_CONST(0.38363500139043), FRAC_CONST(0.37237955463061), FRAC_CONST(-0.36115899031355), FRAC_CONST(-0.3499914122931), FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.32781137272105), FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.30590985751916), FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.28432141891085), FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.26310532994603), FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.24230168845974), FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.22196526964149), FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.20212501768103), FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.18281725485142), FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.16409588556669), FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.1459766491187), FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.12850028503878), FRAC_CONST(-0.120007798468), FRAC_CONST(-0.1116826931773), FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.09555333528914), FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.08013729344279), FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.06544098531359), FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.05148041767934), FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.03827765720822), FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.02582272888064), FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.01412888273558), FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.00320868968304), FRAC_CONST(0.00197656014503), FRAC_CONST(0.00696368621617), FRAC_CONST(0.01176238327857), FRAC_CONST(0.01637012582228), FRAC_CONST(0.02079970728622), FRAC_CONST(0.02503075618909), FRAC_CONST(0.02908240060125), FRAC_CONST(0.03295839306691), FRAC_CONST(0.03664181168133), FRAC_CONST(0.04014582784127), FRAC_CONST(0.04347687821958), FRAC_CONST(0.04663033051701), FRAC_CONST(0.04959786763445), FRAC_CONST(0.05240938217366), FRAC_CONST(0.05504600343009), FRAC_CONST(0.05751526919867), FRAC_CONST(0.0598166570809), FRAC_CONST(0.06196027790387), FRAC_CONST(0.06394448059633), FRAC_CONST(0.06576906686508), FRAC_CONST(0.06745250215166), FRAC_CONST(0.06896640131951), FRAC_CONST(0.07035330735093), FRAC_CONST(0.07158263647903), FRAC_CONST(0.07267746427299), FRAC_CONST(0.0736406005762), FRAC_CONST(0.07446643947564), FRAC_CONST(0.0751576255287), FRAC_CONST(0.07573057565061), FRAC_CONST(0.07617483218536), FRAC_CONST(0.07650507183194), FRAC_CONST(0.07672049241746), FRAC_CONST(0.07682300113923), FRAC_CONST(0.07681739756964), FRAC_CONST(0.07670934904245), FRAC_CONST(0.07649921704119), FRAC_CONST(0.07619924793396), FRAC_CONST(0.07580083586584), FRAC_CONST(0.07531373362019), FRAC_CONST(0.07474525581194), FRAC_CONST(0.07410036424342), FRAC_CONST(0.07336202550803), FRAC_CONST(0.07256825833083), FRAC_CONST(0.07170026731102), FRAC_CONST(0.07076287107266), FRAC_CONST(0.06976302447127), FRAC_CONST(0.06870438283512), FRAC_CONST(0.06760759851228), FRAC_CONST(0.06643675122104), FRAC_CONST(0.0652247106438), FRAC_CONST(0.06397158980681), FRAC_CONST(0.06268578081172), FRAC_CONST(0.06134551717207), FRAC_CONST(0.05998374801761), FRAC_CONST(0.0585915683626), FRAC_CONST(0.05716164501299), FRAC_CONST(0.05571736482138), FRAC_CONST(0.05424527683589), FRAC_CONST(0.05276307465207), FRAC_CONST(0.05125561555216), FRAC_CONST(0.04973857556014), FRAC_CONST(0.04821657200672), FRAC_CONST(0.04668430272642), FRAC_CONST(0.04514884056413), FRAC_CONST(0.04360975421304), FRAC_CONST(0.04206490946367), FRAC_CONST(0.04053491705584), FRAC_CONST(0.03900536794745), FRAC_CONST(0.03748128504252), FRAC_CONST(0.03596975605542), FRAC_CONST(0.03446209487686), FRAC_CONST(0.03297540810337), FRAC_CONST(0.03150176087389), FRAC_CONST(0.03005026574279), FRAC_CONST(0.02860721736385), FRAC_CONST(0.02718594296329), FRAC_CONST(0.02578758475467), FRAC_CONST(0.02441609920285), FRAC_CONST(0.02306801692862), FRAC_CONST(0.02174675502535), FRAC_CONST(0.02045317933555), FRAC_CONST(0.01918724313698), FRAC_CONST(0.01794333813443), FRAC_CONST(0.01673247129989), FRAC_CONST(0.01554055533423), FRAC_CONST(0.01439046660792), FRAC_CONST(-0.01327182200351), FRAC_CONST(-0.01218499959508), FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01011502154986), FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.00817982333726), FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00637922932685), FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.004722259624), FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.003193377839), FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.00180394725893), FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00054642808664), FRAC_CONST(2.760451905E-005), FRAC_CONST(0.0005832264248), FRAC_CONST(0.00109023290512), FRAC_CONST(0.00157846825768), FRAC_CONST(0.0020274176185), FRAC_CONST(0.00245085400321), FRAC_CONST(0.00284467578623), FRAC_CONST(0.00320918858098), FRAC_CONST(0.00354012465507), FRAC_CONST(0.00384564081246), FRAC_CONST(0.0041251642327), FRAC_CONST(0.00438018617447), FRAC_CONST(0.00460395301471), FRAC_CONST(0.004810946906), FRAC_CONST(0.00498396877629), FRAC_CONST(0.00513822754514), FRAC_CONST(0.00527157587272), FRAC_CONST(0.0053838975897), FRAC_CONST(0.0054753783077), FRAC_CONST(0.005540436394), FRAC_CONST(0.0055917128663), FRAC_CONST(0.00562661141932), FRAC_CONST(0.00563891995151), FRAC_CONST(0.00564551969164), FRAC_CONST(0.00562206432097), FRAC_CONST(0.00559380230045), FRAC_CONST(0.00554757145088), FRAC_CONST(0.00548760401507), FRAC_CONST(0.00541967759307), FRAC_CONST(0.00534716811982), FRAC_CONST(0.00524611661324), FRAC_CONST(0.00514073539032), FRAC_CONST(0.00503930226013), FRAC_CONST(0.00491376035745), FRAC_CONST(0.00479325608498), FRAC_CONST(0.00466064606118), FRAC_CONST(0.00452098527825), FRAC_CONST(0.00437307196781), FRAC_CONST(0.0042264269227), FRAC_CONST(0.00408197531935), FRAC_CONST(0.00392074323703), FRAC_CONST(0.00376039229104), FRAC_CONST(0.00360082681231), FRAC_CONST(0.00344188741828), FRAC_CONST(0.00327396134847), FRAC_CONST(0.00311254206525), FRAC_CONST(0.00294694477165), FRAC_CONST(0.00278704643465), FRAC_CONST(0.00262017586902), FRAC_CONST(0.00246256169126), FRAC_CONST(0.00230172547746), FRAC_CONST(0.00214615835557), FRAC_CONST(0.00198411407369), FRAC_CONST(0.00183482654224), FRAC_CONST(0.00168680832531), FRAC_CONST(0.00154432198471), FRAC_CONST(0.00139024948272), FRAC_CONST(0.00125778846475), FRAC_CONST(0.00112501551307), FRAC_CONST(0.00098859883015), FRAC_CONST(0.00086084433262), FRAC_CONST(0.00074580258865), FRAC_CONST(0.00062393761391), FRAC_CONST(0.00051073884952), FRAC_CONST(0.0004026540216), FRAC_CONST(0.00029495311041), FRAC_CONST(0.00020430170688), FRAC_CONST(0.00010943831274), FRAC_CONST(1.349497418E-005), FRAC_CONST(-6.173344072E-005), FRAC_CONST(-0.00014463809349), FRAC_CONST(-0.0002098337344), FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.00035011758756), FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00046063254803), FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00055645763906), FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00063415949025), FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00069179375372), FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00073193571525), FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00076307935757), FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00078014496257), FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00077798694927), FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077248485949), FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00074905980532), FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00072550431222), FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00069416146273), FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00065403333621), FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00061327473938), FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00056778025613), FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00052265642972), FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00048937912498), FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00049475180896), FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00055252865047) }; #endif faad2-2_10_0/libfaad/sbr_syntax.c000066400000000000000000000702271374350120500166430ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_syntax.c,v 1.39 2009/01/26 22:32:31 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include "sbr_syntax.h" #include "syntax.h" #include "sbr_huff.h" #include "sbr_fbt.h" #include "sbr_tf_grid.h" #include "sbr_e_nf.h" #include "bits.h" #ifdef PS_DEC #include "ps_dec.h" #endif #ifdef DRM_PS #include "drm_dec.h" #endif #include "analysis.h" /* static function declarations */ /* static function declarations */ static void sbr_header(bitfile *ld, sbr_info *sbr); static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, uint8_t samplerate_mode, uint8_t freq_scale, uint8_t alter_scale, uint8_t xover_band); static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, uint8_t bs_extension_id, uint16_t num_bits_left); static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); static void sbr_reset(sbr_info *sbr) { #if 0 printf("%d\n", sbr->bs_start_freq_prev); printf("%d\n", sbr->bs_stop_freq_prev); printf("%d\n", sbr->bs_freq_scale_prev); printf("%d\n", sbr->bs_alter_scale_prev); printf("%d\n", sbr->bs_xover_band_prev); printf("%d\n\n", sbr->bs_noise_bands_prev); #endif /* if these are different from the previous frame: Reset = 1 */ if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) || (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) || (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) || (sbr->bs_alter_scale != sbr->bs_alter_scale_prev) || (sbr->bs_xover_band != sbr->bs_xover_band_prev) || (sbr->bs_noise_bands != sbr->bs_noise_bands_prev)) { sbr->Reset = 1; } else { sbr->Reset = 0; } sbr->bs_start_freq_prev = sbr->bs_start_freq; sbr->bs_stop_freq_prev = sbr->bs_stop_freq; sbr->bs_freq_scale_prev = sbr->bs_freq_scale; sbr->bs_alter_scale_prev = sbr->bs_alter_scale; sbr->bs_xover_band_prev = sbr->bs_xover_band; sbr->bs_noise_bands_prev = sbr->bs_noise_bands; } static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, uint8_t samplerate_mode, uint8_t freq_scale, uint8_t alter_scale, uint8_t xover_band) { uint8_t result = 0; uint8_t k2; /* calculate the Master Frequency Table */ sbr->k0 = qmf_start_channel(start_freq, samplerate_mode, sbr->sample_rate); k2 = qmf_stop_channel(stop_freq, sbr->sample_rate, sbr->k0); /* check k0 and k2 */ if (sbr->sample_rate >= 48000) { if ((k2 - sbr->k0) > 32) result += 1; } else if (sbr->sample_rate <= 32000) { if ((k2 - sbr->k0) > 48) result += 1; } else { /* (sbr->sample_rate == 44100) */ if ((k2 - sbr->k0) > 45) result += 1; } if (freq_scale == 0) { result += master_frequency_table_fs0(sbr, sbr->k0, k2, alter_scale); } else { result += master_frequency_table(sbr, sbr->k0, k2, freq_scale, alter_scale); } result += derived_frequency_table(sbr, xover_band, k2); result = (result > 0) ? 1 : 0; return result; } /* table 2 */ uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt, uint8_t psResetFlag) { uint8_t result = 0; uint16_t num_align_bits = 0; uint16_t num_sbr_bits1 = (uint16_t)faad_get_processed_bits(ld); uint16_t num_sbr_bits2; uint8_t saved_start_freq, saved_samplerate_mode; uint8_t saved_stop_freq, saved_freq_scale; uint8_t saved_alter_scale, saved_xover_band; #if (defined(PS_DEC) || defined(DRM_PS)) if (psResetFlag) sbr->psResetFlag = psResetFlag; #endif #ifdef DRM if (!sbr->Is_DRM_SBR) #endif { uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,198,"sbr_bitstream(): bs_extension_type")); if (bs_extension_type == EXT_SBR_DATA_CRC) { sbr->bs_sbr_crc_bits = (uint16_t)faad_getbits(ld, 10 DEBUGVAR(1,199,"sbr_bitstream(): bs_sbr_crc_bits")); } } /* save old header values, in case the new ones are corrupted */ saved_start_freq = sbr->bs_start_freq; saved_samplerate_mode = sbr->bs_samplerate_mode; saved_stop_freq = sbr->bs_stop_freq; saved_freq_scale = sbr->bs_freq_scale; saved_alter_scale = sbr->bs_alter_scale; saved_xover_band = sbr->bs_xover_band; sbr->bs_header_flag = faad_get1bit(ld DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag")); if (sbr->bs_header_flag) sbr_header(ld, sbr); /* Reset? */ sbr_reset(sbr); /* first frame should have a header */ //if (!(sbr->frame == 0 && sbr->bs_header_flag == 0)) if (sbr->header_count != 0) { if (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked)) { uint8_t rt = calc_sbr_tables(sbr, sbr->bs_start_freq, sbr->bs_stop_freq, sbr->bs_samplerate_mode, sbr->bs_freq_scale, sbr->bs_alter_scale, sbr->bs_xover_band); /* if an error occured with the new header values revert to the old ones */ if (rt > 0) { result += calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, saved_samplerate_mode, saved_freq_scale, saved_alter_scale, saved_xover_band); } } if (result == 0) { result = sbr_data(ld, sbr); /* sbr_data() returning an error means that there was an error in envelope_time_border_vector(). In this case the old time border vector is saved and all the previous data normally read after sbr_grid() is saved. */ /* to be on the safe side, calculate old sbr tables in case of error */ if ((result > 0) && (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked))) { result += calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, saved_samplerate_mode, saved_freq_scale, saved_alter_scale, saved_xover_band); } /* we should be able to safely set result to 0 now, */ /* but practise indicates this doesn't work well */ } } else { result = 1; } num_sbr_bits2 = (uint16_t)faad_get_processed_bits(ld) - num_sbr_bits1; /* check if we read more bits then were available for sbr */ if (8*cnt < num_sbr_bits2) { faad_resetbits(ld, num_sbr_bits1 + 8*cnt); num_sbr_bits2 = 8*cnt; #ifdef PS_DEC /* turn off PS for the unfortunate case that we randomly read some * PS data that looks correct */ sbr->ps_used = 0; #endif /* Make sure it doesn't decode SBR in this frame, or we'll get glitches */ return 1; } #ifdef DRM if (!sbr->Is_DRM_SBR) #endif { /* -4 does not apply, bs_extension_type is re-read in this function */ num_align_bits = 8*cnt /*- 4*/ - num_sbr_bits2; while (num_align_bits > 7) { faad_getbits(ld, 8 DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); num_align_bits -= 8; } faad_getbits(ld, num_align_bits DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); } return result; } /* table 3 */ static void sbr_header(bitfile *ld, sbr_info *sbr) { uint8_t bs_header_extra_1, bs_header_extra_2; sbr->header_count++; sbr->bs_amp_res = faad_get1bit(ld DEBUGVAR(1,203,"sbr_header(): bs_amp_res")); /* bs_start_freq and bs_stop_freq must define a fequency band that does not exceed 48 channels */ sbr->bs_start_freq = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,204,"sbr_header(): bs_start_freq")); sbr->bs_stop_freq = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,205,"sbr_header(): bs_stop_freq")); sbr->bs_xover_band = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,206,"sbr_header(): bs_xover_band")); faad_getbits(ld, 2 DEBUGVAR(1,207,"sbr_header(): bs_reserved_bits_hdr")); bs_header_extra_1 = (uint8_t)faad_get1bit(ld DEBUGVAR(1,208,"sbr_header(): bs_header_extra_1")); bs_header_extra_2 = (uint8_t)faad_get1bit(ld DEBUGVAR(1,209,"sbr_header(): bs_header_extra_2")); if (bs_header_extra_1) { sbr->bs_freq_scale = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,211,"sbr_header(): bs_freq_scale")); sbr->bs_alter_scale = (uint8_t)faad_get1bit(ld DEBUGVAR(1,212,"sbr_header(): bs_alter_scale")); sbr->bs_noise_bands = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,213,"sbr_header(): bs_noise_bands")); } else { /* Default values */ sbr->bs_freq_scale = 2; sbr->bs_alter_scale = 1; sbr->bs_noise_bands = 2; } if (bs_header_extra_2) { sbr->bs_limiter_bands = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,214,"sbr_header(): bs_limiter_bands")); sbr->bs_limiter_gains = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,215,"sbr_header(): bs_limiter_gains")); sbr->bs_interpol_freq = (uint8_t)faad_get1bit(ld DEBUGVAR(1,216,"sbr_header(): bs_interpol_freq")); sbr->bs_smoothing_mode = (uint8_t)faad_get1bit(ld DEBUGVAR(1,217,"sbr_header(): bs_smoothing_mode")); } else { /* Default values */ sbr->bs_limiter_bands = 2; sbr->bs_limiter_gains = 2; sbr->bs_interpol_freq = 1; sbr->bs_smoothing_mode = 1; } #if 0 /* print the header to screen */ printf("bs_amp_res: %d\n", sbr->bs_amp_res); printf("bs_start_freq: %d\n", sbr->bs_start_freq); printf("bs_stop_freq: %d\n", sbr->bs_stop_freq); printf("bs_xover_band: %d\n", sbr->bs_xover_band); if (bs_header_extra_1) { printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); printf("bs_alter_scale: %d\n", sbr->bs_alter_scale); printf("bs_noise_bands: %d\n", sbr->bs_noise_bands); } if (bs_header_extra_2) { printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); printf("bs_limiter_gains: %d\n", sbr->bs_limiter_gains); printf("bs_interpol_freq: %d\n", sbr->bs_interpol_freq); printf("bs_smoothing_mode: %d\n", sbr->bs_smoothing_mode); } printf("\n"); #endif } /* table 4 */ static uint8_t sbr_data(bitfile *ld, sbr_info *sbr) { uint8_t result; #if 0 sbr->bs_samplerate_mode = faad_get1bit(ld DEBUGVAR(1,219,"sbr_data(): bs_samplerate_mode")); #endif sbr->rate = (sbr->bs_samplerate_mode) ? 2 : 1; switch (sbr->id_aac) { case ID_SCE: if ((result = sbr_single_channel_element(ld, sbr)) > 0) return result; break; case ID_CPE: if ((result = sbr_channel_pair_element(ld, sbr)) > 0) return result; break; } return 0; } /* table 5 */ static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr) { uint8_t result; if (faad_get1bit(ld DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra"))) { faad_getbits(ld, 4 DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data")); } #ifdef DRM /* bs_coupling, from sbr_channel_pair_base_element(bs_amp_res) */ if (sbr->Is_DRM_SBR) { faad_get1bit(ld); } #endif if ((result = sbr_grid(ld, sbr, 0)) > 0) return result; sbr_dtdf(ld, sbr, 0); invf_mode(ld, sbr, 0); sbr_envelope(ld, sbr, 0); sbr_noise(ld, sbr, 0); #ifndef FIXED_POINT envelope_noise_dequantisation(sbr, 0); #endif memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]")); if (sbr->bs_add_harmonic_flag[0]) sinusoidal_coding(ld, sbr, 0); sbr->bs_extended_data = faad_get1bit(ld DEBUGVAR(1,224,"sbr_single_channel_element(): bs_extended_data[0]")); if (sbr->bs_extended_data) { uint16_t nr_bits_left; #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t ps_ext_read = 0; #endif uint16_t cnt = (uint16_t)faad_getbits(ld, 4 DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size")); if (cnt == 15) { cnt += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,226,"sbr_single_channel_element(): bs_esc_count")); } nr_bits_left = 8 * cnt; while (nr_bits_left > 7) { uint16_t tmp_nr_bits = 0; sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id")); tmp_nr_bits += 2; /* allow only 1 PS extension element per extension data */ #if (defined(PS_DEC) || defined(DRM_PS)) #if (defined(PS_DEC) && defined(DRM_PS)) if (sbr->bs_extension_id == EXTENSION_ID_PS || sbr->bs_extension_id == DRM_PARAMETRIC_STEREO) #else #ifdef PS_DEC if (sbr->bs_extension_id == EXTENSION_ID_PS) #else #ifdef DRM_PS if (sbr->bs_extension_id == DRM_PARAMETRIC_STEREO) #endif #endif #endif { if (ps_ext_read == 0) { ps_ext_read = 1; } else { /* to be safe make it 3, will switch to "default" * in sbr_extension() */ #ifdef DRM return 1; #else sbr->bs_extension_id = 3; #endif } } #endif tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); /* check if the data read is bigger than the number of available bits */ if (tmp_nr_bits > nr_bits_left) return 1; nr_bits_left -= tmp_nr_bits; } /* Corrigendum */ if (nr_bits_left > 0) { faad_getbits(ld, nr_bits_left DEBUGVAR(1,280,"sbr_single_channel_element(): nr_bits_left")); } } return 0; } /* table 6 */ static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr) { uint8_t n, result; if (faad_get1bit(ld DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra"))) { faad_getbits(ld, 4 DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); faad_getbits(ld, 4 DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); } sbr->bs_coupling = faad_get1bit(ld DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_coupling")); if (sbr->bs_coupling) { if ((result = sbr_grid(ld, sbr, 0)) > 0) return result; /* need to copy some data from left to right */ sbr->bs_frame_class[1] = sbr->bs_frame_class[0]; sbr->L_E[1] = sbr->L_E[0]; sbr->L_Q[1] = sbr->L_Q[0]; sbr->bs_pointer[1] = sbr->bs_pointer[0]; for (n = 0; n <= sbr->L_E[0]; n++) { sbr->t_E[1][n] = sbr->t_E[0][n]; sbr->f[1][n] = sbr->f[0][n]; } for (n = 0; n <= sbr->L_Q[0]; n++) sbr->t_Q[1][n] = sbr->t_Q[0][n]; sbr_dtdf(ld, sbr, 0); sbr_dtdf(ld, sbr, 1); invf_mode(ld, sbr, 0); /* more copying */ for (n = 0; n < sbr->N_Q; n++) sbr->bs_invf_mode[1][n] = sbr->bs_invf_mode[0][n]; sbr_envelope(ld, sbr, 0); sbr_noise(ld, sbr, 0); sbr_envelope(ld, sbr, 1); sbr_noise(ld, sbr, 1); memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); if (sbr->bs_add_harmonic_flag[0]) sinusoidal_coding(ld, sbr, 0); sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); if (sbr->bs_add_harmonic_flag[1]) sinusoidal_coding(ld, sbr, 1); } else { uint8_t saved_t_E[6] = {0}, saved_t_Q[3] = {0}; uint8_t saved_L_E = sbr->L_E[0]; uint8_t saved_L_Q = sbr->L_Q[0]; uint8_t saved_frame_class = sbr->bs_frame_class[0]; for (n = 0; n < saved_L_E; n++) saved_t_E[n] = sbr->t_E[0][n]; for (n = 0; n < saved_L_Q; n++) saved_t_Q[n] = sbr->t_Q[0][n]; if ((result = sbr_grid(ld, sbr, 0)) > 0) return result; if ((result = sbr_grid(ld, sbr, 1)) > 0) { /* restore first channel data as well */ sbr->bs_frame_class[0] = saved_frame_class; sbr->L_E[0] = saved_L_E; sbr->L_Q[0] = saved_L_Q; for (n = 0; n < 6; n++) sbr->t_E[0][n] = saved_t_E[n]; for (n = 0; n < 3; n++) sbr->t_Q[0][n] = saved_t_Q[n]; return result; } sbr_dtdf(ld, sbr, 0); sbr_dtdf(ld, sbr, 1); invf_mode(ld, sbr, 0); invf_mode(ld, sbr, 1); sbr_envelope(ld, sbr, 0); sbr_envelope(ld, sbr, 1); sbr_noise(ld, sbr, 0); sbr_noise(ld, sbr, 1); memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); if (sbr->bs_add_harmonic_flag[0]) sinusoidal_coding(ld, sbr, 0); sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); if (sbr->bs_add_harmonic_flag[1]) sinusoidal_coding(ld, sbr, 1); } #ifndef FIXED_POINT envelope_noise_dequantisation(sbr, 0); envelope_noise_dequantisation(sbr, 1); if (sbr->bs_coupling) unmap_envelope_noise(sbr); #endif sbr->bs_extended_data = faad_get1bit(ld DEBUGVAR(1,233,"sbr_channel_pair_element(): bs_extended_data[0]")); if (sbr->bs_extended_data) { uint16_t nr_bits_left; uint16_t cnt = (uint16_t)faad_getbits(ld, 4 DEBUGVAR(1,234,"sbr_channel_pair_element(): bs_extension_size")); if (cnt == 15) { cnt += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,235,"sbr_channel_pair_element(): bs_esc_count")); } nr_bits_left = 8 * cnt; while (nr_bits_left > 7) { uint16_t tmp_nr_bits = 0; sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,236,"sbr_channel_pair_element(): bs_extension_id")); tmp_nr_bits += 2; tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); /* check if the data read is bigger than the number of available bits */ if (tmp_nr_bits > nr_bits_left) return 1; nr_bits_left -= tmp_nr_bits; } /* Corrigendum */ if (nr_bits_left > 0) { faad_getbits(ld, nr_bits_left DEBUGVAR(1,280,"sbr_channel_pair_element(): nr_bits_left")); } } return 0; } /* integer log[2](x): input range [0,10) */ static int8_t sbr_log2(const int8_t val) { int8_t log2tab[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4 }; if (val < 10 && val >= 0) return log2tab[val]; else return 0; } /* table 7 */ static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t i, env, rel, result; uint8_t bs_abs_bord, bs_abs_bord_1; uint8_t bs_num_env = 0; uint8_t saved_L_E = sbr->L_E[ch]; uint8_t saved_L_Q = sbr->L_Q[ch]; uint8_t saved_frame_class = sbr->bs_frame_class[ch]; sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,248,"sbr_grid(): bs_frame_class")); switch (sbr->bs_frame_class[ch]) { case FIXFIX: i = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,249,"sbr_grid(): bs_num_env_raw")); bs_num_env = min(1 << i, 5); i = (uint8_t)faad_get1bit(ld DEBUGVAR(1,250,"sbr_grid(): bs_freq_res_flag")); for (env = 0; env < bs_num_env; env++) sbr->f[ch][env] = i; sbr->abs_bord_lead[ch] = 0; sbr->abs_bord_trail[ch] = sbr->numTimeSlots; sbr->n_rel_lead[ch] = bs_num_env - 1; sbr->n_rel_trail[ch] = 0; break; case FIXVAR: bs_abs_bord = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots; bs_num_env = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,252,"sbr_grid(): bs_num_env")) + 1; for (rel = 0; rel < bs_num_env-1; rel++) { sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,253,"sbr_grid(): bs_rel_bord")) + 2; } i = sbr_log2(bs_num_env + 1); sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i DEBUGVAR(1,254,"sbr_grid(): bs_pointer")); for (env = 0; env < bs_num_env; env++) { sbr->f[ch][bs_num_env - env - 1] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,255,"sbr_grid(): bs_freq_res")); } sbr->abs_bord_lead[ch] = 0; sbr->abs_bord_trail[ch] = bs_abs_bord; sbr->n_rel_lead[ch] = 0; sbr->n_rel_trail[ch] = bs_num_env - 1; break; case VARFIX: bs_abs_bord = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord")); bs_num_env = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,257,"sbr_grid(): bs_num_env")) + 1; for (rel = 0; rel < bs_num_env-1; rel++) { sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,258,"sbr_grid(): bs_rel_bord")) + 2; } i = sbr_log2(bs_num_env + 1); sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i DEBUGVAR(1,259,"sbr_grid(): bs_pointer")); for (env = 0; env < bs_num_env; env++) { sbr->f[ch][env] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,260,"sbr_grid(): bs_freq_res")); } sbr->abs_bord_lead[ch] = bs_abs_bord; sbr->abs_bord_trail[ch] = sbr->numTimeSlots; sbr->n_rel_lead[ch] = bs_num_env - 1; sbr->n_rel_trail[ch] = 0; break; case VARVAR: bs_abs_bord = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0")); bs_abs_bord_1 = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots; sbr->bs_num_rel_0[ch] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,263,"sbr_grid(): bs_num_rel_0")); sbr->bs_num_rel_1[ch] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,264,"sbr_grid(): bs_num_rel_1")); bs_num_env = min(5, sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1); for (rel = 0; rel < sbr->bs_num_rel_0[ch]; rel++) { sbr->bs_rel_bord_0[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,265,"sbr_grid(): bs_rel_bord")) + 2; } for(rel = 0; rel < sbr->bs_num_rel_1[ch]; rel++) { sbr->bs_rel_bord_1[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,266,"sbr_grid(): bs_rel_bord")) + 2; } i = sbr_log2(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2); sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i DEBUGVAR(1,267,"sbr_grid(): bs_pointer")); for (env = 0; env < bs_num_env; env++) { sbr->f[ch][env] = (uint8_t)faad_get1bit(ld DEBUGVAR(1,268,"sbr_grid(): bs_freq_res")); } sbr->abs_bord_lead[ch] = bs_abs_bord; sbr->abs_bord_trail[ch] = bs_abs_bord_1; sbr->n_rel_lead[ch] = sbr->bs_num_rel_0[ch]; sbr->n_rel_trail[ch] = sbr->bs_num_rel_1[ch]; break; } if (sbr->bs_frame_class[ch] == VARVAR) sbr->L_E[ch] = min(bs_num_env, 5); else sbr->L_E[ch] = min(bs_num_env, 4); if (sbr->L_E[ch] <= 0) return 1; if (sbr->L_E[ch] > 1) sbr->L_Q[ch] = 2; else sbr->L_Q[ch] = 1; /* TODO: this code can probably be integrated into the code above! */ if ((result = envelope_time_border_vector(sbr, ch)) > 0) { sbr->bs_frame_class[ch] = saved_frame_class; sbr->L_E[ch] = saved_L_E; sbr->L_Q[ch] = saved_L_Q; return result; } noise_floor_time_border_vector(sbr, ch); #if 0 for (env = 0; env < bs_num_env; env++) { printf("freq_res[ch:%d][env:%d]: %d\n", ch, env, sbr->f[ch][env]); } #endif return 0; } /* table 8 */ static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t i; for (i = 0; i < sbr->L_E[ch]; i++) { sbr->bs_df_env[ch][i] = faad_get1bit(ld DEBUGVAR(1,269,"sbr_dtdf(): bs_df_env")); } for (i = 0; i < sbr->L_Q[ch]; i++) { sbr->bs_df_noise[ch][i] = faad_get1bit(ld DEBUGVAR(1,270,"sbr_dtdf(): bs_df_noise")); } } /* table 9 */ static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t n; for (n = 0; n < sbr->N_Q; n++) { sbr->bs_invf_mode[ch][n] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,271,"invf_mode(): bs_invf_mode")); } } static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, uint8_t bs_extension_id, uint16_t num_bits_left) { #ifdef PS_DEC uint8_t header; uint16_t ret; #endif switch (bs_extension_id) { #ifdef PS_DEC case EXTENSION_ID_PS: if (!sbr->ps) { sbr->ps = ps_init(get_sr_index(sbr->sample_rate), sbr->numTimeSlotsRate); } if (sbr->psResetFlag) { sbr->ps->header_read = 0; } ret = ps_data(sbr->ps, ld, &header); /* enable PS if and only if: a header has been decoded */ if (sbr->ps_used == 0 && header == 1) { sbr->ps_used = 1; } if (header == 1) { sbr->psResetFlag = 0; } return ret; #endif #ifdef DRM_PS case DRM_PARAMETRIC_STEREO: sbr->ps_used = 1; if (!sbr->drm_ps) { sbr->drm_ps = drm_ps_init(); } return drm_ps_data(sbr->drm_ps, ld); #endif default: sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data")); return 6; } } /* table 12 */ static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t n; for (n = 0; n < sbr->N_high; n++) { sbr->bs_add_harmonic[ch][n] = faad_get1bit(ld DEBUGVAR(1,278,"sinusoidal_coding(): bs_add_harmonic")); } } #endif /* SBR_DEC */ faad2-2_10_0/libfaad/sbr_syntax.h000066400000000000000000000035601374350120500166440ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_syntax.h,v 1.23 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_SYNTAX_H__ #define __SBR_SYNTAX_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #define T_HFGEN 8 #define T_HFADJ 2 #define EXT_SBR_DATA 13 #define EXT_SBR_DATA_CRC 14 #define FIXFIX 0 #define FIXVAR 1 #define VARFIX 2 #define VARVAR 3 #define LO_RES 0 #define HI_RES 1 #define NO_TIME_SLOTS_960 15 #define NO_TIME_SLOTS 16 #define RATE 2 #define NOISE_FLOOR_OFFSET 6 uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt, uint8_t resetFlag); #ifdef __cplusplus } #endif #endif /* __SBR_SYNTAX_H__ */ faad2-2_10_0/libfaad/sbr_tf_grid.c000066400000000000000000000147231374350120500167320ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_tf_grid.c,v 1.20 2008/09/19 22:50:20 menno Exp $ **/ /* Time/Frequency grid */ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include #include "sbr_syntax.h" #include "sbr_tf_grid.h" /* static function declarations */ #if 0 static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); #endif static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); /* function constructs new time border vector */ /* first build into temp vector to be able to use previous vector on error */ uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch) { uint8_t l, border, temp; uint8_t t_E_temp[6] = {0}; t_E_temp[0] = sbr->rate * sbr->abs_bord_lead[ch]; t_E_temp[sbr->L_E[ch]] = sbr->rate * sbr->abs_bord_trail[ch]; switch (sbr->bs_frame_class[ch]) { case FIXFIX: switch (sbr->L_E[ch]) { case 4: temp = (sbr->numTimeSlots / 4); t_E_temp[3] = sbr->rate * 3 * temp; t_E_temp[2] = sbr->rate * 2 * temp; t_E_temp[1] = sbr->rate * temp; break; case 2: t_E_temp[1] = sbr->rate * (sbr->numTimeSlots / 2); break; default: break; } break; case FIXVAR: if (sbr->L_E[ch] > 1) { int8_t i = sbr->L_E[ch]; border = sbr->abs_bord_trail[ch]; for (l = 0; l < (sbr->L_E[ch] - 1); l++) { if (border < sbr->bs_rel_bord[ch][l]) return 1; border -= sbr->bs_rel_bord[ch][l]; t_E_temp[--i] = sbr->rate * border; } } break; case VARFIX: if (sbr->L_E[ch] > 1) { int8_t i = 1; border = sbr->abs_bord_lead[ch]; for (l = 0; l < (sbr->L_E[ch] - 1); l++) { border += sbr->bs_rel_bord[ch][l]; if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) return 1; t_E_temp[i++] = sbr->rate * border; } } break; case VARVAR: if (sbr->bs_num_rel_0[ch]) { int8_t i = 1; border = sbr->abs_bord_lead[ch]; for (l = 0; l < sbr->bs_num_rel_0[ch]; l++) { border += sbr->bs_rel_bord_0[ch][l]; if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) return 1; t_E_temp[i++] = sbr->rate * border; } } if (sbr->bs_num_rel_1[ch]) { int8_t i = sbr->L_E[ch]; border = sbr->abs_bord_trail[ch]; for (l = 0; l < sbr->bs_num_rel_1[ch]; l++) { if (border < sbr->bs_rel_bord_1[ch][l]) return 1; border -= sbr->bs_rel_bord_1[ch][l]; t_E_temp[--i] = sbr->rate * border; } } break; } /* no error occured, we can safely use this t_E vector */ for (l = 0; l < 6; l++) { sbr->t_E[ch][l] = t_E_temp[l]; } return 0; } void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) { sbr->t_Q[ch][0] = sbr->t_E[ch][0]; if (sbr->L_E[ch] == 1) { sbr->t_Q[ch][1] = sbr->t_E[ch][1]; sbr->t_Q[ch][2] = 0; } else { uint8_t index = middleBorder(sbr, ch); sbr->t_Q[ch][1] = sbr->t_E[ch][index]; sbr->t_Q[ch][2] = sbr->t_E[ch][sbr->L_E[ch]]; } } #if 0 static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) { uint8_t i; int16_t acc = 0; switch (sbr->bs_frame_class[ch]) { case FIXFIX: return sbr->numTimeSlots/sbr->L_E[ch]; case FIXVAR: return 0; case VARFIX: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord[ch][i]; } return acc; case VARVAR: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord_0[ch][i]; } return acc; } return 0; } static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) { uint8_t i; int16_t acc = 0; switch (sbr->bs_frame_class[ch]) { case FIXFIX: case VARFIX: return 0; case FIXVAR: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord[ch][i]; } return acc; case VARVAR: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord_1[ch][i]; } return acc; } return 0; } #endif static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) { int8_t retval = 0; switch (sbr->bs_frame_class[ch]) { case FIXFIX: retval = sbr->L_E[ch]/2; break; case VARFIX: if (sbr->bs_pointer[ch] == 0) retval = 1; else if (sbr->bs_pointer[ch] == 1) retval = sbr->L_E[ch] - 1; else retval = sbr->bs_pointer[ch] - 1; break; case FIXVAR: case VARVAR: if (sbr->bs_pointer[ch] > 1) retval = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; else retval = sbr->L_E[ch] - 1; break; } return (retval > 0) ? retval : 0; } #endif faad2-2_10_0/libfaad/sbr_tf_grid.h000066400000000000000000000030331374350120500167270ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_tf_grid.h,v 1.17 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_TF_GRID_H__ #define __SBR_TF_GRID_H__ #ifdef __cplusplus extern "C" { #endif uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch); void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/sine_win.h000066400000000000000000004322061374350120500162660ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sine_win.h,v 1.19 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SINE_WIN_H__ #define __SINE_WIN_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t sine_long_1024[] = { FRAC_CONST(0.00076699031874270449), FRAC_CONST(0.002300969151425805), FRAC_CONST(0.0038349425697062275), FRAC_CONST(0.0053689069639963425), FRAC_CONST(0.0069028587247297558), FRAC_CONST(0.0084367942423697988), FRAC_CONST(0.0099707099074180308), FRAC_CONST(0.011504602110422714), FRAC_CONST(0.013038467241987334), FRAC_CONST(0.014572301692779064), FRAC_CONST(0.016106101853537287), FRAC_CONST(0.017639864115082053), FRAC_CONST(0.019173584868322623), FRAC_CONST(0.020707260504265895), FRAC_CONST(0.022240887414024961), FRAC_CONST(0.023774461988827555), FRAC_CONST(0.025307980620024571), FRAC_CONST(0.026841439699098531), FRAC_CONST(0.028374835617672099), FRAC_CONST(0.029908164767516555), FRAC_CONST(0.031441423540560301), FRAC_CONST(0.032974608328897335), FRAC_CONST(0.03450771552479575), FRAC_CONST(0.036040741520706229), FRAC_CONST(0.037573682709270494), FRAC_CONST(0.039106535483329888), FRAC_CONST(0.040639296235933736), FRAC_CONST(0.042171961360347947), FRAC_CONST(0.043704527250063421), FRAC_CONST(0.04523699029880459), FRAC_CONST(0.046769346900537863), FRAC_CONST(0.048301593449480144), FRAC_CONST(0.049833726340107277), FRAC_CONST(0.051365741967162593), FRAC_CONST(0.052897636725665324), FRAC_CONST(0.054429407010919133), FRAC_CONST(0.055961049218520569), FRAC_CONST(0.057492559744367566), FRAC_CONST(0.059023934984667931), FRAC_CONST(0.060555171335947788), FRAC_CONST(0.062086265195060088), FRAC_CONST(0.063617212959193106), FRAC_CONST(0.065148011025878833), FRAC_CONST(0.066678655793001557), FRAC_CONST(0.068209143658806329), FRAC_CONST(0.069739471021907307), FRAC_CONST(0.071269634281296401), FRAC_CONST(0.072799629836351673), FRAC_CONST(0.074329454086845756), FRAC_CONST(0.075859103432954447), FRAC_CONST(0.077388574275265049), FRAC_CONST(0.078917863014784942), FRAC_CONST(0.080446966052950014), FRAC_CONST(0.081975879791633066), FRAC_CONST(0.083504600633152432), FRAC_CONST(0.085033124980280275), FRAC_CONST(0.08656144923625117), FRAC_CONST(0.088089569804770507), FRAC_CONST(0.089617483090022959), FRAC_CONST(0.091145185496681005), FRAC_CONST(0.09267267342991331), FRAC_CONST(0.094199943295393204), FRAC_CONST(0.095726991499307162), FRAC_CONST(0.097253814448363271), FRAC_CONST(0.098780408549799623), FRAC_CONST(0.10030677021139286), FRAC_CONST(0.10183289584146653), FRAC_CONST(0.10335878184889961), FRAC_CONST(0.10488442464313497), FRAC_CONST(0.10640982063418768), FRAC_CONST(0.10793496623265365), FRAC_CONST(0.10945985784971798), FRAC_CONST(0.11098449189716339), FRAC_CONST(0.11250886478737869), FRAC_CONST(0.1140329729333672), FRAC_CONST(0.11555681274875526), FRAC_CONST(0.11708038064780059), FRAC_CONST(0.11860367304540072), FRAC_CONST(0.1201266863571015), FRAC_CONST(0.12164941699910553), FRAC_CONST(0.12317186138828048), FRAC_CONST(0.12469401594216764), FRAC_CONST(0.12621587707899035), FRAC_CONST(0.12773744121766231), FRAC_CONST(0.12925870477779614), FRAC_CONST(0.13077966417971171), FRAC_CONST(0.13230031584444465), FRAC_CONST(0.13382065619375472), FRAC_CONST(0.13534068165013421), FRAC_CONST(0.13686038863681638), FRAC_CONST(0.13837977357778389), FRAC_CONST(0.13989883289777721), FRAC_CONST(0.14141756302230302), FRAC_CONST(0.14293596037764267), FRAC_CONST(0.14445402139086047), FRAC_CONST(0.14597174248981221), FRAC_CONST(0.14748912010315357), FRAC_CONST(0.14900615066034845), FRAC_CONST(0.1505228305916774), FRAC_CONST(0.15203915632824605), FRAC_CONST(0.15355512430199345), FRAC_CONST(0.15507073094570051), FRAC_CONST(0.15658597269299843), FRAC_CONST(0.15810084597837698), FRAC_CONST(0.15961534723719306), FRAC_CONST(0.16112947290567881), FRAC_CONST(0.16264321942095031), FRAC_CONST(0.16415658322101581), FRAC_CONST(0.16566956074478412), FRAC_CONST(0.16718214843207294), FRAC_CONST(0.16869434272361733), FRAC_CONST(0.17020614006107807), FRAC_CONST(0.17171753688704997), FRAC_CONST(0.17322852964507032), FRAC_CONST(0.1747391147796272), FRAC_CONST(0.17624928873616788), FRAC_CONST(0.17775904796110717), FRAC_CONST(0.17926838890183575), FRAC_CONST(0.18077730800672859), FRAC_CONST(0.1822858017251533), FRAC_CONST(0.18379386650747845), FRAC_CONST(0.1853014988050819), FRAC_CONST(0.18680869507035927), FRAC_CONST(0.18831545175673212), FRAC_CONST(0.18982176531865641), FRAC_CONST(0.1913276322116309), FRAC_CONST(0.19283304889220523), FRAC_CONST(0.1943380118179886), FRAC_CONST(0.19584251744765785), FRAC_CONST(0.19734656224096592), FRAC_CONST(0.19885014265875009), FRAC_CONST(0.20035325516294045), FRAC_CONST(0.20185589621656805), FRAC_CONST(0.20335806228377332), FRAC_CONST(0.20485974982981442), FRAC_CONST(0.20636095532107551), FRAC_CONST(0.20786167522507507), FRAC_CONST(0.20936190601047416), FRAC_CONST(0.21086164414708486), FRAC_CONST(0.21236088610587842), FRAC_CONST(0.21385962835899375), FRAC_CONST(0.21535786737974555), FRAC_CONST(0.21685559964263262), FRAC_CONST(0.21835282162334632), FRAC_CONST(0.2198495297987787), FRAC_CONST(0.22134572064703081), FRAC_CONST(0.22284139064742112), FRAC_CONST(0.2243365362804936), FRAC_CONST(0.22583115402802617), FRAC_CONST(0.22732524037303886), FRAC_CONST(0.22881879179980222), FRAC_CONST(0.23031180479384544), FRAC_CONST(0.23180427584196478), FRAC_CONST(0.23329620143223159), FRAC_CONST(0.23478757805400097), FRAC_CONST(0.23627840219791957), FRAC_CONST(0.23776867035593419), FRAC_CONST(0.23925837902129998), FRAC_CONST(0.24074752468858843), FRAC_CONST(0.24223610385369601), FRAC_CONST(0.24372411301385216), FRAC_CONST(0.24521154866762754), FRAC_CONST(0.24669840731494241), FRAC_CONST(0.24818468545707478), FRAC_CONST(0.24967037959666857), FRAC_CONST(0.25115548623774192), FRAC_CONST(0.25264000188569552), FRAC_CONST(0.25412392304732062), FRAC_CONST(0.25560724623080738), FRAC_CONST(0.25708996794575312), FRAC_CONST(0.25857208470317034), FRAC_CONST(0.26005359301549519), FRAC_CONST(0.26153448939659552), FRAC_CONST(0.263014770361779), FRAC_CONST(0.26449443242780163), FRAC_CONST(0.26597347211287559), FRAC_CONST(0.26745188593667762), FRAC_CONST(0.26892967042035726), FRAC_CONST(0.27040682208654482), FRAC_CONST(0.27188333745935972), FRAC_CONST(0.27335921306441868), FRAC_CONST(0.27483444542884394), FRAC_CONST(0.27630903108127108), FRAC_CONST(0.27778296655185769), FRAC_CONST(0.27925624837229118), FRAC_CONST(0.28072887307579719), FRAC_CONST(0.28220083719714756), FRAC_CONST(0.28367213727266843), FRAC_CONST(0.28514276984024867), FRAC_CONST(0.28661273143934779), FRAC_CONST(0.28808201861100413), FRAC_CONST(0.28955062789784303), FRAC_CONST(0.29101855584408509), FRAC_CONST(0.29248579899555388), FRAC_CONST(0.29395235389968466), FRAC_CONST(0.29541821710553201), FRAC_CONST(0.29688338516377827), FRAC_CONST(0.2983478546267414), FRAC_CONST(0.29981162204838335), FRAC_CONST(0.30127468398431795), FRAC_CONST(0.30273703699181914), FRAC_CONST(0.30419867762982911), FRAC_CONST(0.30565960245896612), FRAC_CONST(0.3071198080415331), FRAC_CONST(0.30857929094152509), FRAC_CONST(0.31003804772463789), FRAC_CONST(0.31149607495827591), FRAC_CONST(0.3129533692115602), FRAC_CONST(0.31440992705533666), FRAC_CONST(0.31586574506218396), FRAC_CONST(0.31732081980642174), FRAC_CONST(0.31877514786411848), FRAC_CONST(0.32022872581309986), FRAC_CONST(0.32168155023295658), FRAC_CONST(0.32313361770505233), FRAC_CONST(0.32458492481253215), FRAC_CONST(0.32603546814033024), FRAC_CONST(0.327485244275178), FRAC_CONST(0.3289342498056122), FRAC_CONST(0.33038248132198278), FRAC_CONST(0.33182993541646111), FRAC_CONST(0.33327660868304793), FRAC_CONST(0.33472249771758122), FRAC_CONST(0.33616759911774452), FRAC_CONST(0.33761190948307462), FRAC_CONST(0.33905542541496964), FRAC_CONST(0.34049814351669716), FRAC_CONST(0.34194006039340219), FRAC_CONST(0.34338117265211504), FRAC_CONST(0.34482147690175929), FRAC_CONST(0.34626096975316001), FRAC_CONST(0.34769964781905138), FRAC_CONST(0.34913750771408497), FRAC_CONST(0.35057454605483751), FRAC_CONST(0.35201075945981908), FRAC_CONST(0.35344614454948081), FRAC_CONST(0.35488069794622279), FRAC_CONST(0.35631441627440241), FRAC_CONST(0.3577472961603419), FRAC_CONST(0.3591793342323365), FRAC_CONST(0.36061052712066227), FRAC_CONST(0.36204087145758418), FRAC_CONST(0.36347036387736376), FRAC_CONST(0.36489900101626732), FRAC_CONST(0.36632677951257359), FRAC_CONST(0.36775369600658198), FRAC_CONST(0.36917974714062002), FRAC_CONST(0.37060492955905167), FRAC_CONST(0.37202923990828501), FRAC_CONST(0.3734526748367803), FRAC_CONST(0.37487523099505754), FRAC_CONST(0.37629690503570479), FRAC_CONST(0.37771769361338564), FRAC_CONST(0.37913759338484732), FRAC_CONST(0.38055660100892852), FRAC_CONST(0.38197471314656722), FRAC_CONST(0.38339192646080866), FRAC_CONST(0.38480823761681288), FRAC_CONST(0.38622364328186298), FRAC_CONST(0.38763814012537273), FRAC_CONST(0.38905172481889438), FRAC_CONST(0.39046439403612659), FRAC_CONST(0.39187614445292235), FRAC_CONST(0.3932869727472964), FRAC_CONST(0.39469687559943356), FRAC_CONST(0.39610584969169627), FRAC_CONST(0.39751389170863233), FRAC_CONST(0.39892099833698291), FRAC_CONST(0.40032716626569009), FRAC_CONST(0.40173239218590501), FRAC_CONST(0.4031366727909953), FRAC_CONST(0.404540004776553), FRAC_CONST(0.40594238484040251), FRAC_CONST(0.40734380968260797), FRAC_CONST(0.40874427600548136), FRAC_CONST(0.41014378051359024), FRAC_CONST(0.41154231991376522), FRAC_CONST(0.41293989091510808), FRAC_CONST(0.4143364902289991), FRAC_CONST(0.41573211456910536), FRAC_CONST(0.41712676065138787), FRAC_CONST(0.4185204251941097), FRAC_CONST(0.41991310491784362), FRAC_CONST(0.42130479654547964), FRAC_CONST(0.42269549680223295), FRAC_CONST(0.42408520241565156), FRAC_CONST(0.4254739101156238), FRAC_CONST(0.42686161663438643), FRAC_CONST(0.42824831870653196), FRAC_CONST(0.42963401306901638), FRAC_CONST(0.43101869646116703), FRAC_CONST(0.43240236562469014), FRAC_CONST(0.43378501730367852), FRAC_CONST(0.43516664824461926), FRAC_CONST(0.4365472551964012), FRAC_CONST(0.43792683491032286), FRAC_CONST(0.43930538414009995), FRAC_CONST(0.4406828996418729), FRAC_CONST(0.4420593781742147), FRAC_CONST(0.44343481649813848), FRAC_CONST(0.44480921137710488), FRAC_CONST(0.44618255957703007), FRAC_CONST(0.44755485786629301), FRAC_CONST(0.44892610301574326), FRAC_CONST(0.45029629179870861), FRAC_CONST(0.45166542099100249), FRAC_CONST(0.45303348737093158), FRAC_CONST(0.45440048771930358), FRAC_CONST(0.45576641881943464), FRAC_CONST(0.45713127745715698), FRAC_CONST(0.45849506042082627), FRAC_CONST(0.45985776450132954), FRAC_CONST(0.46121938649209238), FRAC_CONST(0.46257992318908681), FRAC_CONST(0.46393937139083852), FRAC_CONST(0.4652977278984346), FRAC_CONST(0.46665498951553092), FRAC_CONST(0.46801115304835983), FRAC_CONST(0.46936621530573752), FRAC_CONST(0.4707201730990716), FRAC_CONST(0.47207302324236866), FRAC_CONST(0.47342476255224153), FRAC_CONST(0.47477538784791712), FRAC_CONST(0.47612489595124358), FRAC_CONST(0.47747328368669806), FRAC_CONST(0.47882054788139389), FRAC_CONST(0.48016668536508839), FRAC_CONST(0.48151169297018986), FRAC_CONST(0.48285556753176567), FRAC_CONST(0.48419830588754903), FRAC_CONST(0.48553990487794696), FRAC_CONST(0.48688036134604734), FRAC_CONST(0.48821967213762679), FRAC_CONST(0.48955783410115744), FRAC_CONST(0.49089484408781509), FRAC_CONST(0.49223069895148602), FRAC_CONST(0.49356539554877477), FRAC_CONST(0.49489893073901126), FRAC_CONST(0.49623130138425825), FRAC_CONST(0.49756250434931915), FRAC_CONST(0.49889253650174459), FRAC_CONST(0.50022139471184068), FRAC_CONST(0.50154907585267539), FRAC_CONST(0.50287557680008699), FRAC_CONST(0.50420089443269034), FRAC_CONST(0.50552502563188539), FRAC_CONST(0.50684796728186321), FRAC_CONST(0.5081697162696146), FRAC_CONST(0.50949026948493636), FRAC_CONST(0.51080962382043904), FRAC_CONST(0.51212777617155469), FRAC_CONST(0.51344472343654346), FRAC_CONST(0.5147604625165012), FRAC_CONST(0.51607499031536663), FRAC_CONST(0.51738830373992906), FRAC_CONST(0.51870039969983495), FRAC_CONST(0.52001127510759604), FRAC_CONST(0.52132092687859566), FRAC_CONST(0.52262935193109661), FRAC_CONST(0.5239365471862486), FRAC_CONST(0.52524250956809471), FRAC_CONST(0.52654723600357944), FRAC_CONST(0.52785072342255523), FRAC_CONST(0.52915296875779061), FRAC_CONST(0.53045396894497632), FRAC_CONST(0.53175372092273332), FRAC_CONST(0.53305222163261945), FRAC_CONST(0.53434946801913752), FRAC_CONST(0.53564545702974109), FRAC_CONST(0.53694018561484291), FRAC_CONST(0.5382336507278217), FRAC_CONST(0.53952584932502889), FRAC_CONST(0.54081677836579667), FRAC_CONST(0.54210643481244392), FRAC_CONST(0.5433948156302848), FRAC_CONST(0.54468191778763453), FRAC_CONST(0.54596773825581757), FRAC_CONST(0.54725227400917409), FRAC_CONST(0.54853552202506739), FRAC_CONST(0.54981747928389091), FRAC_CONST(0.55109814276907543), FRAC_CONST(0.55237750946709607), FRAC_CONST(0.55365557636747931), FRAC_CONST(0.55493234046281037), FRAC_CONST(0.55620779874873993), FRAC_CONST(0.55748194822399155), FRAC_CONST(0.55875478589036831), FRAC_CONST(0.56002630875276038), FRAC_CONST(0.56129651381915147), FRAC_CONST(0.56256539810062656), FRAC_CONST(0.56383295861137817), FRAC_CONST(0.56509919236871398), FRAC_CONST(0.56636409639306384), FRAC_CONST(0.56762766770798623), FRAC_CONST(0.56888990334017586), FRAC_CONST(0.5701508003194703), FRAC_CONST(0.57141035567885723), FRAC_CONST(0.57266856645448116), FRAC_CONST(0.57392542968565075), FRAC_CONST(0.57518094241484508), FRAC_CONST(0.57643510168772183), FRAC_CONST(0.5776879045531228), FRAC_CONST(0.57893934806308178), FRAC_CONST(0.58018942927283168), FRAC_CONST(0.58143814524081017), FRAC_CONST(0.58268549302866846), FRAC_CONST(0.58393146970127618), FRAC_CONST(0.58517607232673041), FRAC_CONST(0.5864192979763605), FRAC_CONST(0.58766114372473666), FRAC_CONST(0.58890160664967572), FRAC_CONST(0.59014068383224882), FRAC_CONST(0.59137837235678758), FRAC_CONST(0.59261466931089113), FRAC_CONST(0.59384957178543363), FRAC_CONST(0.59508307687456996), FRAC_CONST(0.59631518167574371), FRAC_CONST(0.59754588328969316), FRAC_CONST(0.59877517882045872), FRAC_CONST(0.60000306537538894), FRAC_CONST(0.6012295400651485), FRAC_CONST(0.60245460000372375), FRAC_CONST(0.60367824230843037), FRAC_CONST(0.60490046409991982), FRAC_CONST(0.60612126250218612), FRAC_CONST(0.60734063464257293), FRAC_CONST(0.60855857765177945), FRAC_CONST(0.60977508866386843), FRAC_CONST(0.61099016481627166), FRAC_CONST(0.61220380324979795), FRAC_CONST(0.61341600110863859), FRAC_CONST(0.61462675554037505), FRAC_CONST(0.61583606369598509), FRAC_CONST(0.61704392272984976), FRAC_CONST(0.61825032979976025), FRAC_CONST(0.61945528206692402), FRAC_CONST(0.62065877669597214), FRAC_CONST(0.62186081085496536), FRAC_CONST(0.62306138171540126), FRAC_CONST(0.62426048645222065), FRAC_CONST(0.62545812224381436), FRAC_CONST(0.62665428627202935), FRAC_CONST(0.62784897572217646), FRAC_CONST(0.629042187783036), FRAC_CONST(0.63023391964686437), FRAC_CONST(0.63142416850940186), FRAC_CONST(0.63261293156987741), FRAC_CONST(0.63380020603101728), FRAC_CONST(0.63498598909904946), FRAC_CONST(0.63617027798371217), FRAC_CONST(0.63735306989825913), FRAC_CONST(0.63853436205946679), FRAC_CONST(0.63971415168764045), FRAC_CONST(0.64089243600662138), FRAC_CONST(0.64206921224379254), FRAC_CONST(0.64324447763008585), FRAC_CONST(0.64441822939998838), FRAC_CONST(0.64559046479154869), FRAC_CONST(0.64676118104638392), FRAC_CONST(0.64793037540968534), FRAC_CONST(0.64909804513022595), FRAC_CONST(0.65026418746036585), FRAC_CONST(0.65142879965605982), FRAC_CONST(0.65259187897686244), FRAC_CONST(0.65375342268593606), FRAC_CONST(0.65491342805005603), FRAC_CONST(0.6560718923396176), FRAC_CONST(0.65722881282864254), FRAC_CONST(0.65838418679478505), FRAC_CONST(0.65953801151933866), FRAC_CONST(0.6606902842872423), FRAC_CONST(0.66184100238708687), FRAC_CONST(0.66299016311112147), FRAC_CONST(0.66413776375526001), FRAC_CONST(0.66528380161908718), FRAC_CONST(0.66642827400586524), FRAC_CONST(0.66757117822254031), FRAC_CONST(0.66871251157974798), FRAC_CONST(0.66985227139182102), FRAC_CONST(0.67099045497679422), FRAC_CONST(0.67212705965641173), FRAC_CONST(0.67326208275613297), FRAC_CONST(0.67439552160513905), FRAC_CONST(0.67552737353633852), FRAC_CONST(0.67665763588637495), FRAC_CONST(0.6777863059956315), FRAC_CONST(0.67891338120823841), FRAC_CONST(0.68003885887207893), FRAC_CONST(0.68116273633879543), FRAC_CONST(0.68228501096379557), FRAC_CONST(0.68340568010625868), FRAC_CONST(0.6845247411291423), FRAC_CONST(0.68564219139918747), FRAC_CONST(0.68675802828692589), FRAC_CONST(0.68787224916668555), FRAC_CONST(0.68898485141659704), FRAC_CONST(0.69009583241859995), FRAC_CONST(0.69120518955844845), FRAC_CONST(0.69231292022571822), FRAC_CONST(0.69341902181381176), FRAC_CONST(0.69452349171996552), FRAC_CONST(0.69562632734525487), FRAC_CONST(0.6967275260946012), FRAC_CONST(0.69782708537677729), FRAC_CONST(0.69892500260441415), FRAC_CONST(0.70002127519400625), FRAC_CONST(0.70111590056591866), FRAC_CONST(0.70220887614439187), FRAC_CONST(0.70330019935754873), FRAC_CONST(0.70438986763740041), FRAC_CONST(0.7054778784198521), FRAC_CONST(0.70656422914470951), FRAC_CONST(0.70764891725568435), FRAC_CONST(0.70873194020040065), FRAC_CONST(0.70981329543040084), FRAC_CONST(0.71089298040115168), FRAC_CONST(0.71197099257204999), FRAC_CONST(0.71304732940642923), FRAC_CONST(0.71412198837156471), FRAC_CONST(0.71519496693868001), FRAC_CONST(0.71626626258295312), FRAC_CONST(0.71733587278352173), FRAC_CONST(0.71840379502348972), FRAC_CONST(0.71947002678993299), FRAC_CONST(0.72053456557390527), FRAC_CONST(0.72159740887044366), FRAC_CONST(0.72265855417857561), FRAC_CONST(0.72371799900132339), FRAC_CONST(0.72477574084571128), FRAC_CONST(0.72583177722277037), FRAC_CONST(0.72688610564754497), FRAC_CONST(0.72793872363909862), FRAC_CONST(0.72898962872051931), FRAC_CONST(0.73003881841892615), FRAC_CONST(0.73108629026547423), FRAC_CONST(0.73213204179536129), FRAC_CONST(0.73317607054783274), FRAC_CONST(0.73421837406618817), FRAC_CONST(0.73525894989778673), FRAC_CONST(0.73629779559405306), FRAC_CONST(0.73733490871048279), FRAC_CONST(0.73837028680664851), FRAC_CONST(0.73940392744620576), FRAC_CONST(0.74043582819689802), FRAC_CONST(0.74146598663056329), FRAC_CONST(0.74249440032313918), FRAC_CONST(0.74352106685466912), FRAC_CONST(0.74454598380930725), FRAC_CONST(0.74556914877532543), FRAC_CONST(0.74659055934511731), FRAC_CONST(0.74761021311520515), FRAC_CONST(0.74862810768624533), FRAC_CONST(0.74964424066303348), FRAC_CONST(0.75065860965451059), FRAC_CONST(0.75167121227376843), FRAC_CONST(0.75268204613805523), FRAC_CONST(0.75369110886878121), FRAC_CONST(0.75469839809152439), FRAC_CONST(0.75570391143603588), FRAC_CONST(0.75670764653624567), FRAC_CONST(0.75770960103026808), FRAC_CONST(0.75870977256040739), FRAC_CONST(0.75970815877316344), FRAC_CONST(0.76070475731923692), FRAC_CONST(0.76169956585353527), FRAC_CONST(0.76269258203517787), FRAC_CONST(0.76368380352750187), FRAC_CONST(0.76467322799806714), FRAC_CONST(0.76566085311866239), FRAC_CONST(0.76664667656531038), FRAC_CONST(0.76763069601827327), FRAC_CONST(0.76861290916205827), FRAC_CONST(0.76959331368542294), FRAC_CONST(0.7705719072813807), FRAC_CONST(0.7715486876472063), FRAC_CONST(0.77252365248444133), FRAC_CONST(0.77349679949889905), FRAC_CONST(0.77446812640067086), FRAC_CONST(0.77543763090413043), FRAC_CONST(0.77640531072794039), FRAC_CONST(0.7773711635950562), FRAC_CONST(0.77833518723273309), FRAC_CONST(0.7792973793725303), FRAC_CONST(0.78025773775031659), FRAC_CONST(0.78121626010627609), FRAC_CONST(0.7821729441849129), FRAC_CONST(0.78312778773505731), FRAC_CONST(0.78408078850986995), FRAC_CONST(0.78503194426684808), FRAC_CONST(0.78598125276783015), FRAC_CONST(0.7869287117790017), FRAC_CONST(0.78787431907090011), FRAC_CONST(0.78881807241842017), FRAC_CONST(0.78975996960081907), FRAC_CONST(0.79070000840172161), FRAC_CONST(0.79163818660912577), FRAC_CONST(0.79257450201540758), FRAC_CONST(0.79350895241732666), FRAC_CONST(0.79444153561603059), FRAC_CONST(0.79537224941706119), FRAC_CONST(0.79630109163035911), FRAC_CONST(0.7972280600702687), FRAC_CONST(0.79815315255554375), FRAC_CONST(0.79907636690935235), FRAC_CONST(0.79999770095928191), FRAC_CONST(0.8009171525373443), FRAC_CONST(0.80183471947998131), FRAC_CONST(0.80275039962806916), FRAC_CONST(0.80366419082692409), FRAC_CONST(0.804576090926307), FRAC_CONST(0.80548609778042912), FRAC_CONST(0.80639420924795624), FRAC_CONST(0.80730042319201445), FRAC_CONST(0.80820473748019472), FRAC_CONST(0.80910714998455813), FRAC_CONST(0.81000765858164114), FRAC_CONST(0.81090626115245967), FRAC_CONST(0.81180295558251536), FRAC_CONST(0.81269773976179949), FRAC_CONST(0.81359061158479851), FRAC_CONST(0.81448156895049861), FRAC_CONST(0.81537060976239129), FRAC_CONST(0.81625773192847739), FRAC_CONST(0.81714293336127297), FRAC_CONST(0.81802621197781344), FRAC_CONST(0.81890756569965895), FRAC_CONST(0.81978699245289899), FRAC_CONST(0.82066449016815746), FRAC_CONST(0.82154005678059761), FRAC_CONST(0.82241369022992639), FRAC_CONST(0.82328538846040011), FRAC_CONST(0.82415514942082857), FRAC_CONST(0.82502297106458022), FRAC_CONST(0.82588885134958678), FRAC_CONST(0.82675278823834852), FRAC_CONST(0.8276147796979384), FRAC_CONST(0.82847482370000713), FRAC_CONST(0.82933291822078825), FRAC_CONST(0.83018906124110237), FRAC_CONST(0.83104325074636232), FRAC_CONST(0.83189548472657759), FRAC_CONST(0.83274576117635946), FRAC_CONST(0.83359407809492514), FRAC_CONST(0.83444043348610319), FRAC_CONST(0.83528482535833737), FRAC_CONST(0.83612725172469216), FRAC_CONST(0.83696771060285702), FRAC_CONST(0.83780620001515094), FRAC_CONST(0.8386427179885273), FRAC_CONST(0.83947726255457855), FRAC_CONST(0.84030983174954077), FRAC_CONST(0.84114042361429808), FRAC_CONST(0.84196903619438768), FRAC_CONST(0.84279566754000412), FRAC_CONST(0.84362031570600404), FRAC_CONST(0.84444297875191066), FRAC_CONST(0.84526365474191822), FRAC_CONST(0.84608234174489694), FRAC_CONST(0.84689903783439735), FRAC_CONST(0.84771374108865427), FRAC_CONST(0.84852644959059265), FRAC_CONST(0.84933716142783067), FRAC_CONST(0.85014587469268521), FRAC_CONST(0.85095258748217573), FRAC_CONST(0.85175729789802912), FRAC_CONST(0.85256000404668397), FRAC_CONST(0.85336070403929543), FRAC_CONST(0.85415939599173873), FRAC_CONST(0.85495607802461482), FRAC_CONST(0.85575074826325392), FRAC_CONST(0.85654340483771996), FRAC_CONST(0.85733404588281559), FRAC_CONST(0.85812266953808602), FRAC_CONST(0.8589092739478239), FRAC_CONST(0.85969385726107261), FRAC_CONST(0.86047641763163207), FRAC_CONST(0.86125695321806206), FRAC_CONST(0.86203546218368721), FRAC_CONST(0.86281194269660033), FRAC_CONST(0.86358639292966799), FRAC_CONST(0.86435881106053403), FRAC_CONST(0.86512919527162369), FRAC_CONST(0.86589754375014882), FRAC_CONST(0.86666385468811102), FRAC_CONST(0.86742812628230692), FRAC_CONST(0.86819035673433131), FRAC_CONST(0.86895054425058238), FRAC_CONST(0.86970868704226556), FRAC_CONST(0.87046478332539767), FRAC_CONST(0.8712188313208109), FRAC_CONST(0.8719708292541577), FRAC_CONST(0.8727207753559143), FRAC_CONST(0.87346866786138488), FRAC_CONST(0.8742145050107063), FRAC_CONST(0.87495828504885154), FRAC_CONST(0.8757000062256346), FRAC_CONST(0.87643966679571361), FRAC_CONST(0.87717726501859594), FRAC_CONST(0.87791279915864173), FRAC_CONST(0.87864626748506813), FRAC_CONST(0.87937766827195318), FRAC_CONST(0.88010699979824036), FRAC_CONST(0.88083426034774204), FRAC_CONST(0.88155944820914378), FRAC_CONST(0.8822825616760086), FRAC_CONST(0.88300359904678072), FRAC_CONST(0.88372255862478966), FRAC_CONST(0.8844394387182537), FRAC_CONST(0.88515423764028511), FRAC_CONST(0.88586695370889279), FRAC_CONST(0.88657758524698704), FRAC_CONST(0.88728613058238315), FRAC_CONST(0.88799258804780556), FRAC_CONST(0.88869695598089171), FRAC_CONST(0.88939923272419552), FRAC_CONST(0.89009941662519221), FRAC_CONST(0.89079750603628149), FRAC_CONST(0.89149349931479138), FRAC_CONST(0.89218739482298248), FRAC_CONST(0.89287919092805168), FRAC_CONST(0.89356888600213602), FRAC_CONST(0.89425647842231604), FRAC_CONST(0.89494196657062075), FRAC_CONST(0.89562534883403), FRAC_CONST(0.89630662360447966), FRAC_CONST(0.89698578927886397), FRAC_CONST(0.89766284425904075), FRAC_CONST(0.89833778695183419), FRAC_CONST(0.89901061576903907), FRAC_CONST(0.89968132912742393), FRAC_CONST(0.9003499254487356), FRAC_CONST(0.90101640315970233), FRAC_CONST(0.90168076069203773), FRAC_CONST(0.9023429964824442), FRAC_CONST(0.90300310897261704), FRAC_CONST(0.90366109660924798), FRAC_CONST(0.90431695784402832), FRAC_CONST(0.90497069113365325), FRAC_CONST(0.90562229493982516), FRAC_CONST(0.90627176772925766), FRAC_CONST(0.90691910797367803), FRAC_CONST(0.90756431414983252), FRAC_CONST(0.9082073847394887), FRAC_CONST(0.90884831822943912), FRAC_CONST(0.90948711311150543), FRAC_CONST(0.91012376788254157), FRAC_CONST(0.91075828104443757), FRAC_CONST(0.91139065110412232), FRAC_CONST(0.91202087657356823), FRAC_CONST(0.9126489559697939), FRAC_CONST(0.91327488781486776), FRAC_CONST(0.91389867063591168), FRAC_CONST(0.91452030296510445), FRAC_CONST(0.91513978333968526), FRAC_CONST(0.91575711030195672), FRAC_CONST(0.91637228239928914), FRAC_CONST(0.91698529818412289), FRAC_CONST(0.91759615621397295), FRAC_CONST(0.9182048550514309), FRAC_CONST(0.91881139326416994), FRAC_CONST(0.91941576942494696), FRAC_CONST(0.92001798211160657), FRAC_CONST(0.92061802990708386), FRAC_CONST(0.92121591139940873), FRAC_CONST(0.92181162518170812), FRAC_CONST(0.92240516985220988), FRAC_CONST(0.92299654401424625), FRAC_CONST(0.92358574627625656), FRAC_CONST(0.9241727752517912), FRAC_CONST(0.92475762955951391), FRAC_CONST(0.9253403078232062), FRAC_CONST(0.92592080867176996), FRAC_CONST(0.92649913073923051), FRAC_CONST(0.9270752726647401), FRAC_CONST(0.92764923309258118), FRAC_CONST(0.92822101067216944), FRAC_CONST(0.92879060405805702), FRAC_CONST(0.9293580119099355), FRAC_CONST(0.92992323289263956), FRAC_CONST(0.93048626567614978), FRAC_CONST(0.93104710893559517), FRAC_CONST(0.93160576135125783), FRAC_CONST(0.93216222160857432), FRAC_CONST(0.93271648839814025), FRAC_CONST(0.93326856041571205), FRAC_CONST(0.93381843636221096), FRAC_CONST(0.9343661149437259), FRAC_CONST(0.93491159487151609), FRAC_CONST(0.93545487486201462), FRAC_CONST(0.9359959536368313), FRAC_CONST(0.9365348299227555), FRAC_CONST(0.93707150245175919), FRAC_CONST(0.93760596996099999), FRAC_CONST(0.93813823119282436), FRAC_CONST(0.93866828489477017), FRAC_CONST(0.9391961298195699), FRAC_CONST(0.93972176472515334), FRAC_CONST(0.94024518837465088), FRAC_CONST(0.94076639953639607), FRAC_CONST(0.94128539698392866), FRAC_CONST(0.94180217949599765), FRAC_CONST(0.94231674585656378), FRAC_CONST(0.94282909485480271), FRAC_CONST(0.94333922528510772), FRAC_CONST(0.94384713594709269), FRAC_CONST(0.94435282564559475), FRAC_CONST(0.94485629319067721), FRAC_CONST(0.94535753739763229), FRAC_CONST(0.94585655708698391), FRAC_CONST(0.94635335108449059), FRAC_CONST(0.946847918221148), FRAC_CONST(0.94734025733319194), FRAC_CONST(0.94783036726210101), FRAC_CONST(0.94831824685459909), FRAC_CONST(0.94880389496265838), FRAC_CONST(0.94928731044350201), FRAC_CONST(0.94976849215960668), FRAC_CONST(0.95024743897870523), FRAC_CONST(0.95072414977378961), FRAC_CONST(0.95119862342311323), FRAC_CONST(0.95167085881019386), FRAC_CONST(0.95214085482381583), FRAC_CONST(0.95260861035803324), FRAC_CONST(0.9530741243121722), FRAC_CONST(0.95353739559083328), FRAC_CONST(0.95399842310389449), FRAC_CONST(0.95445720576651349), FRAC_CONST(0.95491374249913052), FRAC_CONST(0.95536803222747024), FRAC_CONST(0.95582007388254542), FRAC_CONST(0.95626986640065814), FRAC_CONST(0.95671740872340305), FRAC_CONST(0.9571626997976701), FRAC_CONST(0.95760573857564624), FRAC_CONST(0.9580465240148186), FRAC_CONST(0.9584850550779761), FRAC_CONST(0.95892133073321306), FRAC_CONST(0.95935534995393079), FRAC_CONST(0.9597871117188399), FRAC_CONST(0.96021661501196343), FRAC_CONST(0.96064385882263847), FRAC_CONST(0.96106884214551935), FRAC_CONST(0.961491563980579), FRAC_CONST(0.9619120233331121), FRAC_CONST(0.9623302192137374), FRAC_CONST(0.96274615063839941), FRAC_CONST(0.96315981662837136), FRAC_CONST(0.96357121621025721), FRAC_CONST(0.96398034841599411), FRAC_CONST(0.96438721228285429), FRAC_CONST(0.9647918068534479), FRAC_CONST(0.96519413117572472), FRAC_CONST(0.96559418430297683), FRAC_CONST(0.96599196529384057), FRAC_CONST(0.96638747321229879), FRAC_CONST(0.96678070712768327), FRAC_CONST(0.96717166611467664), FRAC_CONST(0.96756034925331436), FRAC_CONST(0.9679467556289878), FRAC_CONST(0.9683308843324453), FRAC_CONST(0.96871273445979478), FRAC_CONST(0.9690923051125061), FRAC_CONST(0.96946959539741295), FRAC_CONST(0.96984460442671483), FRAC_CONST(0.97021733131797916), FRAC_CONST(0.97058777519414363), FRAC_CONST(0.97095593518351797), FRAC_CONST(0.97132181041978616), FRAC_CONST(0.97168540004200854), FRAC_CONST(0.9720467031946235), FRAC_CONST(0.97240571902744977), FRAC_CONST(0.97276244669568857), FRAC_CONST(0.97311688535992513), FRAC_CONST(0.97346903418613095), FRAC_CONST(0.9738188923456661), FRAC_CONST(0.97416645901528032), FRAC_CONST(0.97451173337711572), FRAC_CONST(0.97485471461870843), FRAC_CONST(0.97519540193299037), FRAC_CONST(0.97553379451829136), FRAC_CONST(0.97586989157834103), FRAC_CONST(0.97620369232227056), FRAC_CONST(0.97653519596461447), FRAC_CONST(0.97686440172531264), FRAC_CONST(0.97719130882971228), FRAC_CONST(0.97751591650856928), FRAC_CONST(0.97783822399805043), FRAC_CONST(0.97815823053973505), FRAC_CONST(0.97847593538061683), FRAC_CONST(0.97879133777310567), FRAC_CONST(0.97910443697502925), FRAC_CONST(0.97941523224963478), FRAC_CONST(0.97972372286559117), FRAC_CONST(0.98002990809698998), FRAC_CONST(0.98033378722334796), FRAC_CONST(0.98063535952960812), FRAC_CONST(0.98093462430614164), FRAC_CONST(0.98123158084874973), FRAC_CONST(0.98152622845866466), FRAC_CONST(0.9818185664425525), FRAC_CONST(0.98210859411251361), FRAC_CONST(0.98239631078608469), FRAC_CONST(0.98268171578624086), FRAC_CONST(0.98296480844139644), FRAC_CONST(0.98324558808540707), FRAC_CONST(0.98352405405757126), FRAC_CONST(0.98380020570263149), FRAC_CONST(0.98407404237077645), FRAC_CONST(0.9843455634176419), FRAC_CONST(0.9846147682043126), FRAC_CONST(0.9848816560973237), FRAC_CONST(0.98514622646866223), FRAC_CONST(0.98540847869576842), FRAC_CONST(0.98566841216153755), FRAC_CONST(0.98592602625432113), FRAC_CONST(0.98618132036792827), FRAC_CONST(0.98643429390162707), FRAC_CONST(0.98668494626014669), FRAC_CONST(0.98693327685367771), FRAC_CONST(0.98717928509787434), FRAC_CONST(0.98742297041385541), FRAC_CONST(0.98766433222820571), FRAC_CONST(0.98790336997297779), FRAC_CONST(0.98814008308569257), FRAC_CONST(0.98837447100934128), FRAC_CONST(0.98860653319238645), FRAC_CONST(0.98883626908876354), FRAC_CONST(0.98906367815788154), FRAC_CONST(0.98928875986462517), FRAC_CONST(0.98951151367935519), FRAC_CONST(0.98973193907791057), FRAC_CONST(0.98995003554160899), FRAC_CONST(0.9901658025572484), FRAC_CONST(0.99037923961710816), FRAC_CONST(0.99059034621895015), FRAC_CONST(0.99079912186602037), FRAC_CONST(0.99100556606704937), FRAC_CONST(0.99120967833625406), FRAC_CONST(0.99141145819333854), FRAC_CONST(0.99161090516349537), FRAC_CONST(0.99180801877740643), FRAC_CONST(0.99200279857124452), FRAC_CONST(0.99219524408667392), FRAC_CONST(0.99238535487085167), FRAC_CONST(0.99257313047642881), FRAC_CONST(0.99275857046155114), FRAC_CONST(0.99294167438986047), FRAC_CONST(0.99312244183049558), FRAC_CONST(0.99330087235809328), FRAC_CONST(0.99347696555278919), FRAC_CONST(0.99365072100021912), FRAC_CONST(0.99382213829151966), FRAC_CONST(0.99399121702332938), FRAC_CONST(0.99415795679778973), FRAC_CONST(0.99432235722254581), FRAC_CONST(0.9944844179107476), FRAC_CONST(0.99464413848105071), FRAC_CONST(0.99480151855761711), FRAC_CONST(0.99495655777011638), FRAC_CONST(0.99510925575372611), FRAC_CONST(0.99525961214913339), FRAC_CONST(0.9954076266025349), FRAC_CONST(0.99555329876563847), FRAC_CONST(0.99569662829566352), FRAC_CONST(0.99583761485534161), FRAC_CONST(0.99597625811291779), FRAC_CONST(0.99611255774215113), FRAC_CONST(0.99624651342231552), FRAC_CONST(0.99637812483820021), FRAC_CONST(0.99650739168011082), FRAC_CONST(0.9966343136438699), FRAC_CONST(0.996758890430818), FRAC_CONST(0.99688112174781385), FRAC_CONST(0.99700100730723529), FRAC_CONST(0.99711854682697998), FRAC_CONST(0.99723374003046616), FRAC_CONST(0.99734658664663323), FRAC_CONST(0.99745708640994191), FRAC_CONST(0.99756523906037575), FRAC_CONST(0.997671044343441), FRAC_CONST(0.99777450201016782), FRAC_CONST(0.99787561181711015), FRAC_CONST(0.99797437352634699), FRAC_CONST(0.99807078690548234), FRAC_CONST(0.99816485172764624), FRAC_CONST(0.99825656777149518), FRAC_CONST(0.99834593482121237), FRAC_CONST(0.99843295266650844), FRAC_CONST(0.99851762110262221), FRAC_CONST(0.99859993993032037), FRAC_CONST(0.99867990895589909), FRAC_CONST(0.99875752799118334), FRAC_CONST(0.99883279685352799), FRAC_CONST(0.99890571536581829), FRAC_CONST(0.99897628335646982), FRAC_CONST(0.99904450065942929), FRAC_CONST(0.99911036711417489), FRAC_CONST(0.99917388256571638), FRAC_CONST(0.99923504686459585), FRAC_CONST(0.99929385986688779), FRAC_CONST(0.99935032143419944), FRAC_CONST(0.9994044314336713), FRAC_CONST(0.99945618973797734), FRAC_CONST(0.99950559622532531), FRAC_CONST(0.99955265077945699), FRAC_CONST(0.99959735328964838), FRAC_CONST(0.9996397036507102), FRAC_CONST(0.99967970176298793), FRAC_CONST(0.99971734753236219), FRAC_CONST(0.99975264087024884), FRAC_CONST(0.99978558169359921), FRAC_CONST(0.99981616992490041), FRAC_CONST(0.99984440549217524), FRAC_CONST(0.99987028832898295), FRAC_CONST(0.99989381837441849), FRAC_CONST(0.99991499557311347), FRAC_CONST(0.999933819875236), FRAC_CONST(0.99995029123649048), FRAC_CONST(0.99996440961811828), FRAC_CONST(0.99997617498689761), FRAC_CONST(0.9999855873151432), FRAC_CONST(0.99999264658070719), FRAC_CONST(0.99999735276697821), FRAC_CONST(0.99999970586288223) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t sine_long_960[] = { FRAC_CONST(0.00081812299560725323), FRAC_CONST(0.0024543667964602917), FRAC_CONST(0.0040906040262347889), FRAC_CONST(0.0057268303042312674), FRAC_CONST(0.0073630412497795667), FRAC_CONST(0.0089992324822505774), FRAC_CONST(0.010635399621067975), FRAC_CONST(0.012271538285719924), FRAC_CONST(0.013907644095770845), FRAC_CONST(0.015543712670873098), FRAC_CONST(0.017179739630778748), FRAC_CONST(0.018815720595351273), FRAC_CONST(0.020451651184577292), FRAC_CONST(0.022087527018578291), FRAC_CONST(0.023723343717622358), FRAC_CONST(0.025359096902135895), FRAC_CONST(0.02699478219271537), FRAC_CONST(0.028630395210139003), FRAC_CONST(0.030265931575378519), FRAC_CONST(0.031901386909610863), FRAC_CONST(0.033536756834229922), FRAC_CONST(0.035172036970858266), FRAC_CONST(0.036807222941358832), FRAC_CONST(0.038442310367846677), FRAC_CONST(0.040077294872700696), FRAC_CONST(0.041712172078575326), FRAC_CONST(0.043346937608412288), FRAC_CONST(0.044981587085452281), FRAC_CONST(0.046616116133246711), FRAC_CONST(0.048250520375669431), FRAC_CONST(0.049884795436928406), FRAC_CONST(0.051518936941577477), FRAC_CONST(0.053152940514528055), FRAC_CONST(0.05478680178106083), FRAC_CONST(0.056420516366837495), FRAC_CONST(0.05805407989791244), FRAC_CONST(0.059687488000744485), FRAC_CONST(0.061320736302208578), FRAC_CONST(0.062953820429607482), FRAC_CONST(0.064586736010683557), FRAC_CONST(0.066219478673630344), FRAC_CONST(0.06785204404710439), FRAC_CONST(0.069484427760236861), FRAC_CONST(0.071116625442645326), FRAC_CONST(0.072748632724445372), FRAC_CONST(0.07438044523626236), FRAC_CONST(0.076012058609243122), FRAC_CONST(0.077643468475067631), FRAC_CONST(0.079274670465960706), FRAC_CONST(0.080905660214703745), FRAC_CONST(0.082536433354646319), FRAC_CONST(0.084166985519717977), FRAC_CONST(0.085797312344439894), FRAC_CONST(0.08742740946393647), FRAC_CONST(0.089057272513947183), FRAC_CONST(0.090686897130838162), FRAC_CONST(0.092316278951613845), FRAC_CONST(0.093945413613928788), FRAC_CONST(0.095574296756099186), FRAC_CONST(0.097202924017114667), FRAC_CONST(0.098831291036649963), FRAC_CONST(0.10045939345507648), FRAC_CONST(0.10208722691347409), FRAC_CONST(0.10371478705364276), FRAC_CONST(0.10534206951811415), FRAC_CONST(0.10696906995016341), FRAC_CONST(0.10859578399382072), FRAC_CONST(0.11022220729388306), FRAC_CONST(0.11184833549592579), FRAC_CONST(0.11347416424631435), FRAC_CONST(0.11509968919221586), FRAC_CONST(0.11672490598161089), FRAC_CONST(0.11834981026330495), FRAC_CONST(0.11997439768694031), FRAC_CONST(0.12159866390300751), FRAC_CONST(0.12322260456285709), FRAC_CONST(0.12484621531871121), FRAC_CONST(0.12646949182367517), FRAC_CONST(0.12809242973174936), FRAC_CONST(0.12971502469784052), FRAC_CONST(0.13133727237777362), FRAC_CONST(0.13295916842830346), FRAC_CONST(0.13458070850712617), FRAC_CONST(0.13620188827289101), FRAC_CONST(0.1378227033852118), FRAC_CONST(0.13944314950467873), FRAC_CONST(0.14106322229286994), FRAC_CONST(0.14268291741236291), FRAC_CONST(0.14430223052674654), FRAC_CONST(0.1459211573006321), FRAC_CONST(0.14753969339966552), FRAC_CONST(0.14915783449053857), FRAC_CONST(0.15077557624100058), FRAC_CONST(0.15239291431987001), FRAC_CONST(0.1540098443970461), FRAC_CONST(0.15562636214352044), FRAC_CONST(0.15724246323138855), FRAC_CONST(0.15885814333386142), FRAC_CONST(0.16047339812527725), FRAC_CONST(0.16208822328111283), FRAC_CONST(0.16370261447799525), FRAC_CONST(0.16531656739371339), FRAC_CONST(0.16693007770722967), FRAC_CONST(0.16854314109869134), FRAC_CONST(0.17015575324944232), FRAC_CONST(0.17176790984203447), FRAC_CONST(0.17337960656023954), FRAC_CONST(0.1749908390890603), FRAC_CONST(0.17660160311474243), FRAC_CONST(0.17821189432478593), FRAC_CONST(0.17982170840795647), FRAC_CONST(0.18143104105429744), FRAC_CONST(0.18303988795514095), FRAC_CONST(0.1846482448031197), FRAC_CONST(0.18625610729217834), FRAC_CONST(0.1878634711175852), FRAC_CONST(0.18947033197594348), FRAC_CONST(0.19107668556520319), FRAC_CONST(0.19268252758467228), FRAC_CONST(0.19428785373502844), FRAC_CONST(0.19589265971833042), FRAC_CONST(0.19749694123802966), FRAC_CONST(0.19910069399898173), FRAC_CONST(0.20070391370745785), FRAC_CONST(0.20230659607115639), FRAC_CONST(0.20390873679921437), FRAC_CONST(0.20551033160221882), FRAC_CONST(0.20711137619221856), FRAC_CONST(0.2087118662827353), FRAC_CONST(0.21031179758877552), FRAC_CONST(0.21191116582684155), FRAC_CONST(0.21350996671494335), FRAC_CONST(0.21510819597260972), FRAC_CONST(0.21670584932089998), FRAC_CONST(0.2183029224824154), FRAC_CONST(0.21989941118131037), FRAC_CONST(0.22149531114330431), FRAC_CONST(0.22309061809569264), FRAC_CONST(0.22468532776735861), FRAC_CONST(0.22627943588878449), FRAC_CONST(0.22787293819206314), FRAC_CONST(0.22946583041090929), FRAC_CONST(0.23105810828067114), FRAC_CONST(0.23264976753834157), FRAC_CONST(0.23424080392256985), FRAC_CONST(0.2358312131736727), FRAC_CONST(0.23742099103364595), FRAC_CONST(0.23901013324617584), FRAC_CONST(0.24059863555665045), FRAC_CONST(0.24218649371217096), FRAC_CONST(0.24377370346156332), FRAC_CONST(0.24536026055538934), FRAC_CONST(0.24694616074595824), FRAC_CONST(0.24853139978733788), FRAC_CONST(0.25011597343536629), FRAC_CONST(0.25169987744766298), FRAC_CONST(0.25328310758364025), FRAC_CONST(0.25486565960451457), FRAC_CONST(0.25644752927331788), FRAC_CONST(0.25802871235490898), FRAC_CONST(0.25960920461598508), FRAC_CONST(0.26118900182509258), FRAC_CONST(0.26276809975263904), FRAC_CONST(0.264346494170904), FRAC_CONST(0.26592418085405067), FRAC_CONST(0.26750115557813692), FRAC_CONST(0.2690774141211269), FRAC_CONST(0.27065295226290209), FRAC_CONST(0.2722277657852728), FRAC_CONST(0.27380185047198918), FRAC_CONST(0.27537520210875299), FRAC_CONST(0.2769478164832283), FRAC_CONST(0.27851968938505312), FRAC_CONST(0.28009081660585067), FRAC_CONST(0.28166119393924061), FRAC_CONST(0.28323081718085019), FRAC_CONST(0.28479968212832563), FRAC_CONST(0.28636778458134327), FRAC_CONST(0.28793512034162105), FRAC_CONST(0.2895016852129294), FRAC_CONST(0.29106747500110264), FRAC_CONST(0.29263248551405047), FRAC_CONST(0.2941967125617686), FRAC_CONST(0.29576015195635058), FRAC_CONST(0.29732279951199847), FRAC_CONST(0.29888465104503475), FRAC_CONST(0.30044570237391266), FRAC_CONST(0.30200594931922808), FRAC_CONST(0.30356538770373032), FRAC_CONST(0.30512401335233358), FRAC_CONST(0.30668182209212791), FRAC_CONST(0.3082388097523906), FRAC_CONST(0.30979497216459695), FRAC_CONST(0.31135030516243201), FRAC_CONST(0.3129048045818012), FRAC_CONST(0.31445846626084178), FRAC_CONST(0.31601128603993378), FRAC_CONST(0.31756325976171151), FRAC_CONST(0.31911438327107416), FRAC_CONST(0.32066465241519732), FRAC_CONST(0.32221406304354389), FRAC_CONST(0.3237626110078754), FRAC_CONST(0.32531029216226293), FRAC_CONST(0.32685710236309828), FRAC_CONST(0.32840303746910487), FRAC_CONST(0.32994809334134939), FRAC_CONST(0.3314922658432522), FRAC_CONST(0.33303555084059877), FRAC_CONST(0.33457794420155085), FRAC_CONST(0.33611944179665709), FRAC_CONST(0.33766003949886464), FRAC_CONST(0.33919973318352969), FRAC_CONST(0.34073851872842903), FRAC_CONST(0.34227639201377064), FRAC_CONST(0.34381334892220483), FRAC_CONST(0.34534938533883547), FRAC_CONST(0.34688449715123082), FRAC_CONST(0.34841868024943456), FRAC_CONST(0.34995193052597684), FRAC_CONST(0.35148424387588523), FRAC_CONST(0.3530156161966958), FRAC_CONST(0.35454604338846402), FRAC_CONST(0.35607552135377557), FRAC_CONST(0.35760404599775775), FRAC_CONST(0.35913161322809023), FRAC_CONST(0.36065821895501554), FRAC_CONST(0.36218385909135092), FRAC_CONST(0.36370852955249849), FRAC_CONST(0.36523222625645668), FRAC_CONST(0.36675494512383078), FRAC_CONST(0.36827668207784414), FRAC_CONST(0.36979743304434909), FRAC_CONST(0.37131719395183754), FRAC_CONST(0.37283596073145214), FRAC_CONST(0.37435372931699717), FRAC_CONST(0.37587049564494951), FRAC_CONST(0.37738625565446909), FRAC_CONST(0.37890100528741022), FRAC_CONST(0.38041474048833229), FRAC_CONST(0.38192745720451066), FRAC_CONST(0.38343915138594736), FRAC_CONST(0.38494981898538222), FRAC_CONST(0.38645945595830333), FRAC_CONST(0.38796805826295838), FRAC_CONST(0.38947562186036483), FRAC_CONST(0.39098214271432141), FRAC_CONST(0.39248761679141814), FRAC_CONST(0.3939920400610481), FRAC_CONST(0.39549540849541737), FRAC_CONST(0.39699771806955625), FRAC_CONST(0.39849896476132979), FRAC_CONST(0.39999914455144892), FRAC_CONST(0.40149825342348083), FRAC_CONST(0.4029962873638599), FRAC_CONST(0.40449324236189854), FRAC_CONST(0.40598911440979762), FRAC_CONST(0.40748389950265762), FRAC_CONST(0.40897759363848879), FRAC_CONST(0.41047019281822261), FRAC_CONST(0.41196169304572178), FRAC_CONST(0.4134520903277914), FRAC_CONST(0.41494138067418929), FRAC_CONST(0.41642956009763715), FRAC_CONST(0.41791662461383078), FRAC_CONST(0.41940257024145089), FRAC_CONST(0.42088739300217382), FRAC_CONST(0.42237108892068231), FRAC_CONST(0.42385365402467584), FRAC_CONST(0.42533508434488143), FRAC_CONST(0.42681537591506419), FRAC_CONST(0.42829452477203828), FRAC_CONST(0.42977252695567697), FRAC_CONST(0.43124937850892364), FRAC_CONST(0.4327250754778022), FRAC_CONST(0.43419961391142781), FRAC_CONST(0.43567298986201736), FRAC_CONST(0.43714519938489987), FRAC_CONST(0.43861623853852766), FRAC_CONST(0.44008610338448595), FRAC_CONST(0.44155478998750436), FRAC_CONST(0.44302229441546676), FRAC_CONST(0.4444886127394222), FRAC_CONST(0.44595374103359531), FRAC_CONST(0.44741767537539667), FRAC_CONST(0.44888041184543348), FRAC_CONST(0.45034194652752002), FRAC_CONST(0.45180227550868812), FRAC_CONST(0.45326139487919759), FRAC_CONST(0.45471930073254679), FRAC_CONST(0.45617598916548296), FRAC_CONST(0.45763145627801283), FRAC_CONST(0.45908569817341294), FRAC_CONST(0.46053871095824001), FRAC_CONST(0.46199049074234161), FRAC_CONST(0.46344103363886635), FRAC_CONST(0.46489033576427435), FRAC_CONST(0.46633839323834758), FRAC_CONST(0.46778520218420055), FRAC_CONST(0.46923075872829029), FRAC_CONST(0.47067505900042683), FRAC_CONST(0.47211809913378361), FRAC_CONST(0.47355987526490806), FRAC_CONST(0.47500038353373153), FRAC_CONST(0.47643962008357982), FRAC_CONST(0.47787758106118372), FRAC_CONST(0.47931426261668875), FRAC_CONST(0.48074966090366611), FRAC_CONST(0.48218377207912272), FRAC_CONST(0.48361659230351117), FRAC_CONST(0.48504811774074069), FRAC_CONST(0.48647834455818684), FRAC_CONST(0.48790726892670194), FRAC_CONST(0.48933488702062544), FRAC_CONST(0.49076119501779414), FRAC_CONST(0.49218618909955225), FRAC_CONST(0.4936098654507618), FRAC_CONST(0.49503222025981269), FRAC_CONST(0.49645324971863303), FRAC_CONST(0.49787295002269943), FRAC_CONST(0.49929131737104687), FRAC_CONST(0.50070834796627917), FRAC_CONST(0.50212403801457872), FRAC_CONST(0.50353838372571758), FRAC_CONST(0.50495138131306638), FRAC_CONST(0.50636302699360547), FRAC_CONST(0.50777331698793449), FRAC_CONST(0.50918224752028263), FRAC_CONST(0.51058981481851906), FRAC_CONST(0.51199601511416237), FRAC_CONST(0.51340084464239111), FRAC_CONST(0.51480429964205421), FRAC_CONST(0.51620637635567967), FRAC_CONST(0.51760707102948678), FRAC_CONST(0.51900637991339404), FRAC_CONST(0.5204042992610306), FRAC_CONST(0.52180082532974559), FRAC_CONST(0.5231959543806185), FRAC_CONST(0.52458968267846895), FRAC_CONST(0.52598200649186677), FRAC_CONST(0.52737292209314235), FRAC_CONST(0.52876242575839572), FRAC_CONST(0.53015051376750777), FRAC_CONST(0.53153718240414882), FRAC_CONST(0.53292242795578992), FRAC_CONST(0.53430624671371152), FRAC_CONST(0.53568863497301467), FRAC_CONST(0.5370695890326298), FRAC_CONST(0.5384491051953274), FRAC_CONST(0.53982717976772743), FRAC_CONST(0.54120380906030963), FRAC_CONST(0.54257898938742311), FRAC_CONST(0.54395271706729609), FRAC_CONST(0.54532498842204646), FRAC_CONST(0.54669579977769045), FRAC_CONST(0.54806514746415402), FRAC_CONST(0.54943302781528081), FRAC_CONST(0.55079943716884383), FRAC_CONST(0.55216437186655387), FRAC_CONST(0.55352782825406999), FRAC_CONST(0.55488980268100907), FRAC_CONST(0.55625029150095584), FRAC_CONST(0.55760929107147217), FRAC_CONST(0.55896679775410718), FRAC_CONST(0.56032280791440714), FRAC_CONST(0.56167731792192455), FRAC_CONST(0.56303032415022869), FRAC_CONST(0.56438182297691453), FRAC_CONST(0.56573181078361312), FRAC_CONST(0.56708028395600085), FRAC_CONST(0.56842723888380908), FRAC_CONST(0.56977267196083425), FRAC_CONST(0.57111657958494688), FRAC_CONST(0.5724589581581021), FRAC_CONST(0.57379980408634845), FRAC_CONST(0.57513911377983773), FRAC_CONST(0.57647688365283478), FRAC_CONST(0.57781311012372738), FRAC_CONST(0.57914778961503466), FRAC_CONST(0.58048091855341843), FRAC_CONST(0.5818124933696911), FRAC_CONST(0.58314251049882604), FRAC_CONST(0.58447096637996743), FRAC_CONST(0.58579785745643886), FRAC_CONST(0.5871231801757536), FRAC_CONST(0.58844693098962408), FRAC_CONST(0.58976910635397084), FRAC_CONST(0.59108970272893235), FRAC_CONST(0.59240871657887517), FRAC_CONST(0.59372614437240179), FRAC_CONST(0.59504198258236196), FRAC_CONST(0.5963562276858605), FRAC_CONST(0.59766887616426767), FRAC_CONST(0.5989799245032289), FRAC_CONST(0.60028936919267273), FRAC_CONST(0.60159720672682204), FRAC_CONST(0.60290343360420195), FRAC_CONST(0.60420804632765002), FRAC_CONST(0.60551104140432543), FRAC_CONST(0.60681241534571839), FRAC_CONST(0.60811216466765883), FRAC_CONST(0.60941028589032709), FRAC_CONST(0.61070677553826169), FRAC_CONST(0.61200163014036979), FRAC_CONST(0.61329484622993602), FRAC_CONST(0.6145864203446314), FRAC_CONST(0.61587634902652377), FRAC_CONST(0.61716462882208556), FRAC_CONST(0.61845125628220421), FRAC_CONST(0.61973622796219074), FRAC_CONST(0.6210195404217892), FRAC_CONST(0.62230119022518593), FRAC_CONST(0.62358117394101897), FRAC_CONST(0.62485948814238634), FRAC_CONST(0.62613612940685637), FRAC_CONST(0.62741109431647646), FRAC_CONST(0.62868437945778133), FRAC_CONST(0.62995598142180387), FRAC_CONST(0.6312258968040827), FRAC_CONST(0.63249412220467238), FRAC_CONST(0.63376065422815175), FRAC_CONST(0.63502548948363347), FRAC_CONST(0.63628862458477287), FRAC_CONST(0.63755005614977711), FRAC_CONST(0.63880978080141437), FRAC_CONST(0.6400677951670225), FRAC_CONST(0.6413240958785188), FRAC_CONST(0.64257867957240766), FRAC_CONST(0.6438315428897915), FRAC_CONST(0.64508268247637779), FRAC_CONST(0.64633209498248945), FRAC_CONST(0.64757977706307335), FRAC_CONST(0.64882572537770888), FRAC_CONST(0.65006993659061751), FRAC_CONST(0.65131240737067142), FRAC_CONST(0.65255313439140239), FRAC_CONST(0.65379211433101081), FRAC_CONST(0.65502934387237444), FRAC_CONST(0.6562648197030575), FRAC_CONST(0.65749853851531959), FRAC_CONST(0.65873049700612374), FRAC_CONST(0.65996069187714679), FRAC_CONST(0.66118911983478657), FRAC_CONST(0.66241577759017178), FRAC_CONST(0.66364066185917048), FRAC_CONST(0.66486376936239888), FRAC_CONST(0.66608509682523009), FRAC_CONST(0.66730464097780284), FRAC_CONST(0.66852239855503071), FRAC_CONST(0.66973836629660977), FRAC_CONST(0.67095254094702894), FRAC_CONST(0.67216491925557675), FRAC_CONST(0.67337549797635199), FRAC_CONST(0.67458427386827102), FRAC_CONST(0.67579124369507693), FRAC_CONST(0.67699640422534846), FRAC_CONST(0.67819975223250772), FRAC_CONST(0.6794012844948305), FRAC_CONST(0.68060099779545302), FRAC_CONST(0.68179888892238183), FRAC_CONST(0.6829949546685018), FRAC_CONST(0.68418919183158522), FRAC_CONST(0.68538159721429948), FRAC_CONST(0.6865721676242168), FRAC_CONST(0.68776089987382172), FRAC_CONST(0.68894779078052026), FRAC_CONST(0.69013283716664853), FRAC_CONST(0.69131603585948032), FRAC_CONST(0.69249738369123692), FRAC_CONST(0.69367687749909468), FRAC_CONST(0.69485451412519361), FRAC_CONST(0.69603029041664599), FRAC_CONST(0.6972042032255451), FRAC_CONST(0.6983762494089728), FRAC_CONST(0.69954642582900894), FRAC_CONST(0.70071472935273893), FRAC_CONST(0.70188115685226271), FRAC_CONST(0.703045705204703), FRAC_CONST(0.70420837129221303), FRAC_CONST(0.70536915200198613), FRAC_CONST(0.70652804422626281), FRAC_CONST(0.70768504486233985), FRAC_CONST(0.70884015081257845), FRAC_CONST(0.70999335898441229), FRAC_CONST(0.711144666290356), FRAC_CONST(0.71229406964801356), FRAC_CONST(0.71344156598008623), FRAC_CONST(0.71458715221438096), FRAC_CONST(0.71573082528381871), FRAC_CONST(0.71687258212644234), FRAC_CONST(0.7180124196854254), FRAC_CONST(0.71915033490907943), FRAC_CONST(0.72028632475086318), FRAC_CONST(0.72142038616938997), FRAC_CONST(0.72255251612843596), FRAC_CONST(0.72368271159694852), FRAC_CONST(0.72481096954905444), FRAC_CONST(0.72593728696406756), FRAC_CONST(0.72706166082649704), FRAC_CONST(0.72818408812605595), FRAC_CONST(0.72930456585766834), FRAC_CONST(0.73042309102147851), FRAC_CONST(0.73153966062285747), FRAC_CONST(0.73265427167241282), FRAC_CONST(0.73376692118599507), FRAC_CONST(0.73487760618470677), FRAC_CONST(0.73598632369490979), FRAC_CONST(0.73709307074823405), FRAC_CONST(0.73819784438158409), FRAC_CONST(0.73930064163714881), FRAC_CONST(0.74040145956240788), FRAC_CONST(0.74150029521014049), FRAC_CONST(0.74259714563843304), FRAC_CONST(0.74369200791068657), FRAC_CONST(0.74478487909562552), FRAC_CONST(0.74587575626730485), FRAC_CONST(0.74696463650511791), FRAC_CONST(0.74805151689380456), FRAC_CONST(0.74913639452345926), FRAC_CONST(0.75021926648953785), FRAC_CONST(0.75130012989286621), FRAC_CONST(0.7523789818396478), FRAC_CONST(0.75345581944147111), FRAC_CONST(0.75453063981531809), FRAC_CONST(0.75560344008357094), FRAC_CONST(0.75667421737402052), FRAC_CONST(0.7577429688198738), FRAC_CONST(0.75880969155976163), FRAC_CONST(0.75987438273774599), FRAC_CONST(0.76093703950332836), FRAC_CONST(0.76199765901145666), FRAC_CONST(0.76305623842253345), FRAC_CONST(0.76411277490242291), FRAC_CONST(0.76516726562245885), FRAC_CONST(0.76621970775945258), FRAC_CONST(0.76727009849569949), FRAC_CONST(0.76831843501898767), FRAC_CONST(0.76936471452260458), FRAC_CONST(0.77040893420534517), FRAC_CONST(0.77145109127151923), FRAC_CONST(0.77249118293095853), FRAC_CONST(0.77352920639902467), FRAC_CONST(0.77456515889661659), FRAC_CONST(0.77559903765017746), FRAC_CONST(0.7766308398917029), FRAC_CONST(0.77766056285874774), FRAC_CONST(0.77868820379443371), FRAC_CONST(0.77971375994745684), FRAC_CONST(0.78073722857209438), FRAC_CONST(0.7817586069282132), FRAC_CONST(0.78277789228127592), FRAC_CONST(0.78379508190234881), FRAC_CONST(0.78481017306810918), FRAC_CONST(0.78582316306085265), FRAC_CONST(0.78683404916849986), FRAC_CONST(0.78784282868460476), FRAC_CONST(0.78884949890836087), FRAC_CONST(0.78985405714460888), FRAC_CONST(0.7908565007038445), FRAC_CONST(0.79185682690222425), FRAC_CONST(0.79285503306157412), FRAC_CONST(0.79385111650939566), FRAC_CONST(0.79484507457887377), FRAC_CONST(0.79583690460888357), FRAC_CONST(0.79682660394399751), FRAC_CONST(0.79781416993449272), FRAC_CONST(0.79879959993635785), FRAC_CONST(0.7997828913113002), FRAC_CONST(0.80076404142675273), FRAC_CONST(0.80174304765588156), FRAC_CONST(0.80271990737759213), FRAC_CONST(0.80369461797653707), FRAC_CONST(0.80466717684312306), FRAC_CONST(0.80563758137351682), FRAC_CONST(0.80660582896965372), FRAC_CONST(0.80757191703924336), FRAC_CONST(0.80853584299577752), FRAC_CONST(0.80949760425853612), FRAC_CONST(0.81045719825259477), FRAC_CONST(0.81141462240883167), FRAC_CONST(0.81236987416393436), FRAC_CONST(0.81332295096040608), FRAC_CONST(0.81427385024657373), FRAC_CONST(0.81522256947659355), FRAC_CONST(0.81616910611045879), FRAC_CONST(0.817113457614006), FRAC_CONST(0.81805562145892186), FRAC_CONST(0.81899559512275044), FRAC_CONST(0.81993337608889916), FRAC_CONST(0.82086896184664637), FRAC_CONST(0.8218023498911472), FRAC_CONST(0.82273353772344116), FRAC_CONST(0.82366252285045805), FRAC_CONST(0.82458930278502529), FRAC_CONST(0.82551387504587381), FRAC_CONST(0.82643623715764558), FRAC_CONST(0.82735638665089983), FRAC_CONST(0.82827432106211907), FRAC_CONST(0.82919003793371693), FRAC_CONST(0.83010353481404364), FRAC_CONST(0.83101480925739324), FRAC_CONST(0.83192385882400965), FRAC_CONST(0.83283068108009373), FRAC_CONST(0.8337352735978093), FRAC_CONST(0.83463763395529011), FRAC_CONST(0.83553775973664579), FRAC_CONST(0.83643564853196872), FRAC_CONST(0.83733129793734051), FRAC_CONST(0.83822470555483797), FRAC_CONST(0.83911586899254031), FRAC_CONST(0.84000478586453453), FRAC_CONST(0.84089145379092289), FRAC_CONST(0.84177587039782842), FRAC_CONST(0.84265803331740163), FRAC_CONST(0.84353794018782702), FRAC_CONST(0.844415588653329), FRAC_CONST(0.8452909763641786), FRAC_CONST(0.84616410097669936), FRAC_CONST(0.84703496015327406), FRAC_CONST(0.84790355156235053), FRAC_CONST(0.84876987287844818), FRAC_CONST(0.8496339217821639), FRAC_CONST(0.85049569596017938), FRAC_CONST(0.85135519310526508), FRAC_CONST(0.85221241091628896), FRAC_CONST(0.85306734709822085), FRAC_CONST(0.85391999936213903), FRAC_CONST(0.85477036542523732), FRAC_CONST(0.85561844301082923), FRAC_CONST(0.85646422984835635), FRAC_CONST(0.85730772367339259), FRAC_CONST(0.85814892222765116), FRAC_CONST(0.85898782325899026), FRAC_CONST(0.85982442452141961), FRAC_CONST(0.86065872377510555), FRAC_CONST(0.86149071878637817), FRAC_CONST(0.8623204073277364), FRAC_CONST(0.86314778717785412), FRAC_CONST(0.8639728561215867), FRAC_CONST(0.86479561194997623), FRAC_CONST(0.86561605246025763), FRAC_CONST(0.86643417545586487), FRAC_CONST(0.8672499787464365), FRAC_CONST(0.86806346014782154), FRAC_CONST(0.8688746174820855), FRAC_CONST(0.86968344857751589), FRAC_CONST(0.87048995126862883), FRAC_CONST(0.87129412339617363), FRAC_CONST(0.87209596280713941), FRAC_CONST(0.8728954673547612), FRAC_CONST(0.87369263489852422), FRAC_CONST(0.87448746330417149), FRAC_CONST(0.87527995044370765), FRAC_CONST(0.8760700941954066), FRAC_CONST(0.87685789244381551), FRAC_CONST(0.87764334307976144), FRAC_CONST(0.87842644400035663), FRAC_CONST(0.8792071931090043), FRAC_CONST(0.87998558831540408), FRAC_CONST(0.88076162753555787), FRAC_CONST(0.88153530869177488), FRAC_CONST(0.88230662971267804), FRAC_CONST(0.88307558853320878), FRAC_CONST(0.88384218309463292), FRAC_CONST(0.8846064113445461), FRAC_CONST(0.88536827123687933), FRAC_CONST(0.88612776073190425), FRAC_CONST(0.88688487779623937), FRAC_CONST(0.88763962040285393), FRAC_CONST(0.8883919865310751), FRAC_CONST(0.88914197416659235), FRAC_CONST(0.88988958130146301), FRAC_CONST(0.8906348059341177), FRAC_CONST(0.89137764606936609), FRAC_CONST(0.89211809971840139), FRAC_CONST(0.89285616489880615), FRAC_CONST(0.89359183963455813), FRAC_CONST(0.89432512195603453), FRAC_CONST(0.89505600990001799), FRAC_CONST(0.89578450150970124), FRAC_CONST(0.8965105948346932), FRAC_CONST(0.89723428793102367), FRAC_CONST(0.89795557886114807), FRAC_CONST(0.89867446569395382), FRAC_CONST(0.89939094650476448), FRAC_CONST(0.90010501937534515), FRAC_CONST(0.900816682393908), FRAC_CONST(0.90152593365511691), FRAC_CONST(0.90223277126009283), FRAC_CONST(0.90293719331641886), FRAC_CONST(0.90363919793814496), FRAC_CONST(0.90433878324579353), FRAC_CONST(0.90503594736636439), FRAC_CONST(0.90573068843333915), FRAC_CONST(0.90642300458668679), FRAC_CONST(0.90711289397286898), FRAC_CONST(0.90780035474484411), FRAC_CONST(0.90848538506207266), FRAC_CONST(0.90916798309052227), FRAC_CONST(0.90984814700267291), FRAC_CONST(0.9105258749775208), FRAC_CONST(0.91120116520058425), FRAC_CONST(0.91187401586390815), FRAC_CONST(0.91254442516606893), FRAC_CONST(0.9132123913121788), FRAC_CONST(0.91387791251389161), FRAC_CONST(0.91454098698940678), FRAC_CONST(0.91520161296347435), FRAC_CONST(0.91585978866739981), FRAC_CONST(0.91651551233904871), FRAC_CONST(0.91716878222285148), FRAC_CONST(0.91781959656980805), FRAC_CONST(0.91846795363749245), FRAC_CONST(0.91911385169005766), FRAC_CONST(0.9197572889982405), FRAC_CONST(0.9203982638393654), FRAC_CONST(0.92103677449734989), FRAC_CONST(0.92167281926270861), FRAC_CONST(0.92230639643255874), FRAC_CONST(0.92293750431062316), FRAC_CONST(0.92356614120723612), FRAC_CONST(0.92419230543934783), FRAC_CONST(0.92481599533052783), FRAC_CONST(0.92543720921097061), FRAC_CONST(0.92605594541749991), FRAC_CONST(0.92667220229357261), FRAC_CONST(0.92728597818928349), FRAC_CONST(0.9278972714613698), FRAC_CONST(0.92850608047321548), FRAC_CONST(0.9291124035948557), FRAC_CONST(0.92971623920298097), FRAC_CONST(0.93031758568094147), FRAC_CONST(0.93091644141875196), FRAC_CONST(0.93151280481309506), FRAC_CONST(0.93210667426732674), FRAC_CONST(0.93269804819147983), FRAC_CONST(0.93328692500226818), FRAC_CONST(0.93387330312309147), FRAC_CONST(0.93445718098403896), FRAC_CONST(0.93503855702189376), FRAC_CONST(0.9356174296801375), FRAC_CONST(0.93619379740895381), FRAC_CONST(0.93676765866523259), FRAC_CONST(0.93733901191257496), FRAC_CONST(0.93790785562129597), FRAC_CONST(0.93847418826842988), FRAC_CONST(0.93903800833773399), FRAC_CONST(0.93959931431969212), FRAC_CONST(0.94015810471151917), FRAC_CONST(0.94071437801716529), FRAC_CONST(0.94126813274731924), FRAC_CONST(0.94181936741941319), FRAC_CONST(0.94236808055762578), FRAC_CONST(0.94291427069288691), FRAC_CONST(0.94345793636288133), FRAC_CONST(0.94399907611205225), FRAC_CONST(0.9445376884916058), FRAC_CONST(0.94507377205951448), FRAC_CONST(0.94560732538052128), FRAC_CONST(0.94613834702614352), FRAC_CONST(0.94666683557467624), FRAC_CONST(0.94719278961119657), FRAC_CONST(0.94771620772756759), FRAC_CONST(0.94823708852244104), FRAC_CONST(0.94875543060126255), FRAC_CONST(0.94927123257627433), FRAC_CONST(0.94978449306651924), FRAC_CONST(0.95029521069784428), FRAC_CONST(0.9508033841029051), FRAC_CONST(0.95130901192116835), FRAC_CONST(0.9518120927989161), FRAC_CONST(0.95231262538924943), FRAC_CONST(0.95281060835209208), FRAC_CONST(0.95330604035419386), FRAC_CONST(0.95379892006913403), FRAC_CONST(0.95428924617732525), FRAC_CONST(0.95477701736601728), FRAC_CONST(0.95526223232929941), FRAC_CONST(0.95574488976810545), FRAC_CONST(0.95622498839021619), FRAC_CONST(0.95670252691026292), FRAC_CONST(0.95717750404973156), FRAC_CONST(0.95764991853696524), FRAC_CONST(0.95811976910716812), FRAC_CONST(0.95858705450240911), FRAC_CONST(0.95905177347162429), FRAC_CONST(0.95951392477062125), FRAC_CONST(0.95997350716208196), FRAC_CONST(0.96043051941556579), FRAC_CONST(0.96088496030751369), FRAC_CONST(0.96133682862125036), FRAC_CONST(0.96178612314698864), FRAC_CONST(0.96223284268183173), FRAC_CONST(0.9626769860297768), FRAC_CONST(0.96311855200171881), FRAC_CONST(0.96355753941545252), FRAC_CONST(0.96399394709567654), FRAC_CONST(0.96442777387399625), FRAC_CONST(0.96485901858892686), FRAC_CONST(0.96528768008589627), FRAC_CONST(0.96571375721724895), FRAC_CONST(0.96613724884224783), FRAC_CONST(0.96655815382707866), FRAC_CONST(0.96697647104485207), FRAC_CONST(0.96739219937560694), FRAC_CONST(0.96780533770631338), FRAC_CONST(0.96821588493087585), FRAC_CONST(0.9686238399501359), FRAC_CONST(0.96902920167187501), FRAC_CONST(0.96943196901081796), FRAC_CONST(0.96983214088863534), FRAC_CONST(0.9702297162339466), FRAC_CONST(0.97062469398232287), FRAC_CONST(0.97101707307629004), FRAC_CONST(0.97140685246533098), FRAC_CONST(0.97179403110588902), FRAC_CONST(0.97217860796137046), FRAC_CONST(0.97256058200214734), FRAC_CONST(0.97293995220556007), FRAC_CONST(0.97331671755592064), FRAC_CONST(0.97369087704451474), FRAC_CONST(0.97406242966960455), FRAC_CONST(0.97443137443643235), FRAC_CONST(0.97479771035722163), FRAC_CONST(0.97516143645118103), FRAC_CONST(0.97552255174450631), FRAC_CONST(0.97588105527038305), FRAC_CONST(0.97623694606898959), FRAC_CONST(0.97659022318749911), FRAC_CONST(0.97694088568008242), FRAC_CONST(0.97728893260791039), FRAC_CONST(0.97763436303915685), FRAC_CONST(0.97797717604900047), FRAC_CONST(0.97831737071962765), FRAC_CONST(0.97865494614023485), FRAC_CONST(0.97898990140703124), FRAC_CONST(0.97932223562324061), FRAC_CONST(0.97965194789910426), FRAC_CONST(0.9799790373518833), FRAC_CONST(0.98030350310586067), FRAC_CONST(0.98062534429234405), FRAC_CONST(0.98094456004966768), FRAC_CONST(0.98126114952319499), FRAC_CONST(0.98157511186532054), FRAC_CONST(0.98188644623547261), FRAC_CONST(0.98219515180011563), FRAC_CONST(0.98250122773275184), FRAC_CONST(0.98280467321392362), FRAC_CONST(0.98310548743121629), FRAC_CONST(0.98340366957925973), FRAC_CONST(0.98369921885973044), FRAC_CONST(0.98399213448135414), FRAC_CONST(0.98428241565990748), FRAC_CONST(0.98457006161822058), FRAC_CONST(0.98485507158617835), FRAC_CONST(0.98513744480072363), FRAC_CONST(0.98541718050585803), FRAC_CONST(0.98569427795264519), FRAC_CONST(0.98596873639921168), FRAC_CONST(0.98624055511074971), FRAC_CONST(0.98650973335951875), FRAC_CONST(0.98677627042484772), FRAC_CONST(0.98704016559313645), FRAC_CONST(0.98730141815785832), FRAC_CONST(0.98756002741956173), FRAC_CONST(0.9878159926858715), FRAC_CONST(0.98806931327149194), FRAC_CONST(0.98831998849820735), FRAC_CONST(0.98856801769488489), FRAC_CONST(0.98881340019747566), FRAC_CONST(0.98905613534901682), FRAC_CONST(0.98929622249963345), FRAC_CONST(0.98953366100653983), FRAC_CONST(0.98976845023404181), FRAC_CONST(0.99000058955353776), FRAC_CONST(0.99023007834352106), FRAC_CONST(0.99045691598958097), FRAC_CONST(0.99068110188440506), FRAC_CONST(0.99090263542778001), FRAC_CONST(0.99112151602659404), FRAC_CONST(0.99133774309483769), FRAC_CONST(0.99155131605360625), FRAC_CONST(0.99176223433110056), FRAC_CONST(0.99197049736262888), FRAC_CONST(0.99217610459060845), FRAC_CONST(0.99237905546456673), FRAC_CONST(0.99257934944114334), FRAC_CONST(0.99277698598409092), FRAC_CONST(0.99297196456427694), FRAC_CONST(0.99316428465968509), FRAC_CONST(0.99335394575541669), FRAC_CONST(0.99354094734369169), FRAC_CONST(0.99372528892385081), FRAC_CONST(0.99390697000235606), FRAC_CONST(0.99408599009279242), FRAC_CONST(0.99426234871586938), FRAC_CONST(0.99443604539942176), FRAC_CONST(0.99460707967841133), FRAC_CONST(0.99477545109492771), FRAC_CONST(0.99494115919819004), FRAC_CONST(0.99510420354454787), FRAC_CONST(0.99526458369748239), FRAC_CONST(0.99542229922760772), FRAC_CONST(0.99557734971267187), FRAC_CONST(0.9957297347375581), FRAC_CONST(0.99587945389428578), FRAC_CONST(0.99602650678201154), FRAC_CONST(0.99617089300703077), FRAC_CONST(0.996312612182778), FRAC_CONST(0.99645166392982831), FRAC_CONST(0.99658804787589839), FRAC_CONST(0.99672176365584741), FRAC_CONST(0.99685281091167788), FRAC_CONST(0.99698118929253687), FRAC_CONST(0.99710689845471678), FRAC_CONST(0.99722993806165661), FRAC_CONST(0.99735030778394196), FRAC_CONST(0.99746800729930707), FRAC_CONST(0.99758303629263489), FRAC_CONST(0.99769539445595812), FRAC_CONST(0.99780508148846014), FRAC_CONST(0.99791209709647588), FRAC_CONST(0.99801644099349218), FRAC_CONST(0.99811811290014918), FRAC_CONST(0.9982171125442405), FRAC_CONST(0.9983134396607144), FRAC_CONST(0.99840709399167404), FRAC_CONST(0.99849807528637868), FRAC_CONST(0.99858638330124405), FRAC_CONST(0.99867201779984294), FRAC_CONST(0.99875497855290607), FRAC_CONST(0.99883526533832245), FRAC_CONST(0.99891287794114036), FRAC_CONST(0.99898781615356746), FRAC_CONST(0.99906007977497147), FRAC_CONST(0.99912966861188113), FRAC_CONST(0.99919658247798593), FRAC_CONST(0.99926082119413751), FRAC_CONST(0.99932238458834954), FRAC_CONST(0.999381272495798), FRAC_CONST(0.99943748475882255), FRAC_CONST(0.9994910212269259), FRAC_CONST(0.99954188175677483), FRAC_CONST(0.99959006621220048), FRAC_CONST(0.99963557446419837), FRAC_CONST(0.99967840639092931), FRAC_CONST(0.99971856187771946), FRAC_CONST(0.99975604081706027), FRAC_CONST(0.99979084310860955), FRAC_CONST(0.99982296865919107), FRAC_CONST(0.99985241738279484), FRAC_CONST(0.99987918920057806), FRAC_CONST(0.99990328404086426), FRAC_CONST(0.9999247018391445), FRAC_CONST(0.99994344253807688), FRAC_CONST(0.99995950608748674), FRAC_CONST(0.99997289244436727), FRAC_CONST(0.99998360157287902), FRAC_CONST(0.9999916334443506), FRAC_CONST(0.99999698803727821), FRAC_CONST(0.99999966533732598) }; #endif ALIGN static const real_t sine_short_128[] = { FRAC_CONST(0.0061358846491544753), FRAC_CONST(0.01840672990580482), FRAC_CONST(0.030674803176636626), FRAC_CONST(0.04293825693494082), FRAC_CONST(0.055195244349689934), FRAC_CONST(0.067443919563664051), FRAC_CONST(0.079682437971430126), FRAC_CONST(0.091908956497132724), FRAC_CONST(0.10412163387205459), FRAC_CONST(0.11631863091190475), FRAC_CONST(0.12849811079379317), FRAC_CONST(0.14065823933284921), FRAC_CONST(0.15279718525844344), FRAC_CONST(0.16491312048996989), FRAC_CONST(0.17700422041214875), FRAC_CONST(0.18906866414980619), FRAC_CONST(0.2011046348420919), FRAC_CONST(0.21311031991609136), FRAC_CONST(0.22508391135979283), FRAC_CONST(0.2370236059943672), FRAC_CONST(0.24892760574572015), FRAC_CONST(0.26079411791527551), FRAC_CONST(0.27262135544994898), FRAC_CONST(0.28440753721127188), FRAC_CONST(0.29615088824362379), FRAC_CONST(0.30784964004153487), FRAC_CONST(0.31950203081601569), FRAC_CONST(0.33110630575987643), FRAC_CONST(0.34266071731199438), FRAC_CONST(0.35416352542049034), FRAC_CONST(0.36561299780477385), FRAC_CONST(0.37700741021641826), FRAC_CONST(0.38834504669882625), FRAC_CONST(0.39962419984564679), FRAC_CONST(0.41084317105790391), FRAC_CONST(0.42200027079979968), FRAC_CONST(0.43309381885315196), FRAC_CONST(0.4441221445704292), FRAC_CONST(0.45508358712634384), FRAC_CONST(0.46597649576796618), FRAC_CONST(0.47679923006332209), FRAC_CONST(0.487550160148436), FRAC_CONST(0.49822766697278187), FRAC_CONST(0.50883014254310699), FRAC_CONST(0.51935599016558964), FRAC_CONST(0.52980362468629461), FRAC_CONST(0.54017147272989285), FRAC_CONST(0.55045797293660481), FRAC_CONST(0.56066157619733603), FRAC_CONST(0.57078074588696726), FRAC_CONST(0.58081395809576453), FRAC_CONST(0.59075970185887416), FRAC_CONST(0.60061647938386897), FRAC_CONST(0.61038280627630948), FRAC_CONST(0.6200572117632891), FRAC_CONST(0.62963823891492698), FRAC_CONST(0.63912444486377573), FRAC_CONST(0.64851440102211244), FRAC_CONST(0.65780669329707864), FRAC_CONST(0.66699992230363747), FRAC_CONST(0.67609270357531592), FRAC_CONST(0.68508366777270036), FRAC_CONST(0.693971460889654), FRAC_CONST(0.7027547444572253), FRAC_CONST(0.71143219574521643), FRAC_CONST(0.72000250796138165), FRAC_CONST(0.7284643904482252), FRAC_CONST(0.73681656887736979), FRAC_CONST(0.74505778544146595), FRAC_CONST(0.75318679904361241), FRAC_CONST(0.76120238548426178), FRAC_CONST(0.76910333764557959), FRAC_CONST(0.77688846567323244), FRAC_CONST(0.78455659715557524), FRAC_CONST(0.79210657730021239), FRAC_CONST(0.79953726910790501), FRAC_CONST(0.80684755354379922), FRAC_CONST(0.8140363297059483), FRAC_CONST(0.82110251499110465), FRAC_CONST(0.8280450452577558), FRAC_CONST(0.83486287498638001), FRAC_CONST(0.84155497743689833), FRAC_CONST(0.84812034480329712), FRAC_CONST(0.85455798836540053), FRAC_CONST(0.86086693863776731), FRAC_CONST(0.86704624551569265), FRAC_CONST(0.87309497841829009), FRAC_CONST(0.87901222642863341), FRAC_CONST(0.88479709843093779), FRAC_CONST(0.89044872324475788), FRAC_CONST(0.89596624975618511), FRAC_CONST(0.90134884704602203), FRAC_CONST(0.90659570451491533), FRAC_CONST(0.91170603200542988), FRAC_CONST(0.9166790599210427), FRAC_CONST(0.9215140393420419), FRAC_CONST(0.92621024213831127), FRAC_CONST(0.93076696107898371), FRAC_CONST(0.9351835099389475), FRAC_CONST(0.93945922360218992), FRAC_CONST(0.94359345816196039), FRAC_CONST(0.94758559101774109), FRAC_CONST(0.95143502096900834), FRAC_CONST(0.95514116830577067), FRAC_CONST(0.9587034748958716), FRAC_CONST(0.96212140426904158), FRAC_CONST(0.9653944416976894), FRAC_CONST(0.96852209427441727), FRAC_CONST(0.97150389098625178), FRAC_CONST(0.97433938278557586), FRAC_CONST(0.97702814265775439), FRAC_CONST(0.97956976568544052), FRAC_CONST(0.98196386910955524), FRAC_CONST(0.98421009238692903), FRAC_CONST(0.98630809724459867), FRAC_CONST(0.98825756773074946), FRAC_CONST(0.99005821026229712), FRAC_CONST(0.99170975366909953), FRAC_CONST(0.9932119492347945), FRAC_CONST(0.99456457073425542), FRAC_CONST(0.99576741446765982), FRAC_CONST(0.99682029929116567), FRAC_CONST(0.99772306664419164), FRAC_CONST(0.99847558057329477), FRAC_CONST(0.99907772775264536), FRAC_CONST(0.99952941750109314), FRAC_CONST(0.9998305817958234), FRAC_CONST(0.99998117528260111) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t sine_short_120[] = { FRAC_CONST(0.0065449379673518581), FRAC_CONST(0.019633692460628301), FRAC_CONST(0.032719082821776137), FRAC_CONST(0.045798866936520771), FRAC_CONST(0.058870803651189033), FRAC_CONST(0.071932653156719387), FRAC_CONST(0.084982177372441667), FRAC_CONST(0.09801714032956059), FRAC_CONST(0.11103530855427769), FRAC_CONST(0.12403445145048532), FRAC_CONST(0.13701234168196802), FRAC_CONST(0.14996675555404498), FRAC_CONST(0.16289547339458874), FRAC_CONST(0.17579627993435451), FRAC_CONST(0.18866696468655525), FRAC_CONST(0.2015053223256171), FRAC_CONST(0.21430915306505074), FRAC_CONST(0.2270762630343732), FRAC_CONST(0.23980446465501654), FRAC_CONST(0.25249157701515795), FRAC_CONST(0.26513542624340797), FRAC_CONST(0.27773384588129219), FRAC_CONST(0.29028467725446233), FRAC_CONST(0.3027857698425746), FRAC_CONST(0.31523498164776964), FRAC_CONST(0.32763017956169349), FRAC_CONST(0.33996923973099424), FRAC_CONST(0.35225004792123354), FRAC_CONST(0.36447049987914965), FRAC_CONST(0.37662850169321077), FRAC_CONST(0.38872197015239557), FRAC_CONST(0.40074883310314097), FRAC_CONST(0.41270702980439467), FRAC_CONST(0.42459451128071307), FRAC_CONST(0.43640924067334208), FRAC_CONST(0.44814919358922256), FRAC_CONST(0.45981235844785984), FRAC_CONST(0.47139673682599764), FRAC_CONST(0.48290034380003727), FRAC_CONST(0.49432120828614462), FRAC_CONST(0.50565737337798455), FRAC_CONST(0.51690689668202761), FRAC_CONST(0.52806785065036799), FRAC_CONST(0.53913832291100017), FRAC_CONST(0.55011641659549337), FRAC_CONST(0.56100025066400983), FRAC_CONST(0.57178796022761225), FRAC_CONST(0.58247769686780215), FRAC_CONST(0.59306762895323706), FRAC_CONST(0.60355594195357143), FRAC_CONST(0.61394083875036642), FRAC_CONST(0.62422053994501758), FRAC_CONST(0.63439328416364549), FRAC_CONST(0.64445732835889735), FRAC_CONST(0.65441094810861034), FRAC_CONST(0.66425243791128175), FRAC_CONST(0.67398011147829784), FRAC_CONST(0.68359230202287125), FRAC_CONST(0.69308736254563585), FRAC_CONST(0.70246366611685174), FRAC_CONST(0.71171960615517138), FRAC_CONST(0.72085359670291882), FRAC_CONST(0.7298640726978356), FRAC_CONST(0.73874949024124625), FRAC_CONST(0.74750832686259672), FRAC_CONST(0.75613908178032285), FRAC_CONST(0.76464027615900032), FRAC_CONST(0.77301045336273699), FRAC_CONST(0.78124817920475853), FRAC_CONST(0.78935204219315003), FRAC_CONST(0.79732065377270711), FRAC_CONST(0.80515264856285829), FRAC_CONST(0.81284668459161513), FRAC_CONST(0.82040144352551359), FRAC_CONST(0.82781563089550203), FRAC_CONST(0.83508797631874299), FRAC_CONST(0.84221723371628654), FRAC_CONST(0.84920218152657889), FRAC_CONST(0.85604162291477137), FRAC_CONST(0.86273438597779184), FRAC_CONST(0.86927932394514362), FRAC_CONST(0.87567531537539967), FRAC_CONST(0.88192126434835494), FRAC_CONST(0.88801610065280734), FRAC_CONST(0.89395877996993212), FRAC_CONST(0.8997482840522214), FRAC_CONST(0.90538362089795521), FRAC_CONST(0.91086382492117568), FRAC_CONST(0.91618795711713596), FRAC_CONST(0.92135510522319242), FRAC_CONST(0.9263643838751181), FRAC_CONST(0.93121493475880346), FRAC_CONST(0.93590592675732565), FRAC_CONST(0.94043655609335486), FRAC_CONST(0.94480604646687805), FRAC_CONST(0.94901364918821385), FRAC_CONST(0.95305864330629697), FRAC_CONST(0.95694033573220882), FRAC_CONST(0.9606580613579353), FRAC_CONST(0.96421118317032928), FRAC_CONST(0.96759909236025976), FRAC_CONST(0.9708212084269281), FRAC_CONST(0.97387697927733363), FRAC_CONST(0.97676588132087239), FRAC_CONST(0.97948741955905139), FRAC_CONST(0.98204112767030394), FRAC_CONST(0.98442656808989171), FRAC_CONST(0.98664333208487898), FRAC_CONST(0.98869103982416728), FRAC_CONST(0.99056934044357725), FRAC_CONST(0.99227791210596705), FRAC_CONST(0.99381646205637808), FRAC_CONST(0.99518472667219682), FRAC_CONST(0.99638247150832537), FRAC_CONST(0.99740949133735191), FRAC_CONST(0.99826561018471593), FRAC_CONST(0.99895068135886012), FRAC_CONST(0.99946458747636568), FRAC_CONST(0.99980724048206482), FRAC_CONST(0.99997858166412923) }; #endif #ifdef LD_DEC ALIGN static const real_t sine_mid_512[] = { FRAC_CONST(0.0015339801862847655), FRAC_CONST(0.0046019261204485705), FRAC_CONST(0.007669828739531097), FRAC_CONST(0.010737659167264491), FRAC_CONST(0.013805388528060391), FRAC_CONST(0.01687298794728171), FRAC_CONST(0.019940428551514441), FRAC_CONST(0.023007681468839369), FRAC_CONST(0.026074717829103901), FRAC_CONST(0.029141508764193722), FRAC_CONST(0.032208025408304586), FRAC_CONST(0.035274238898213947), FRAC_CONST(0.038340120373552694), FRAC_CONST(0.041405640977076739), FRAC_CONST(0.044470771854938668), FRAC_CONST(0.047535484156959303), FRAC_CONST(0.050599749036899282), FRAC_CONST(0.05366353765273052), FRAC_CONST(0.056726821166907748), FRAC_CONST(0.059789570746639868), FRAC_CONST(0.062851757564161406), FRAC_CONST(0.065913352797003805), FRAC_CONST(0.068974327628266746), FRAC_CONST(0.072034653246889332), FRAC_CONST(0.075094300847921305), FRAC_CONST(0.078153241632794232), FRAC_CONST(0.081211446809592441), FRAC_CONST(0.084268887593324071), FRAC_CONST(0.087325535206192059), FRAC_CONST(0.090381360877864983), FRAC_CONST(0.093436335845747787), FRAC_CONST(0.096490431355252593), FRAC_CONST(0.099543618660069319), FRAC_CONST(0.10259586902243628), FRAC_CONST(0.10564715371341062), FRAC_CONST(0.10869744401313872), FRAC_CONST(0.11174671121112659), FRAC_CONST(0.11479492660651008), FRAC_CONST(0.11784206150832498), FRAC_CONST(0.12088808723577708), FRAC_CONST(0.12393297511851216), FRAC_CONST(0.12697669649688587), FRAC_CONST(0.13001922272223335), FRAC_CONST(0.13306052515713906), FRAC_CONST(0.1361005751757062), FRAC_CONST(0.1391393441638262), FRAC_CONST(0.14217680351944803), FRAC_CONST(0.14521292465284746), FRAC_CONST(0.14824767898689603), FRAC_CONST(0.15128103795733022), FRAC_CONST(0.1543129730130201), FRAC_CONST(0.15734345561623825), FRAC_CONST(0.16037245724292828), FRAC_CONST(0.16339994938297323), FRAC_CONST(0.1664259035404641), FRAC_CONST(0.16945029123396796), FRAC_CONST(0.17247308399679595), FRAC_CONST(0.17549425337727143), FRAC_CONST(0.17851377093899751), FRAC_CONST(0.18153160826112497), FRAC_CONST(0.18454773693861962), FRAC_CONST(0.1875621285825296), FRAC_CONST(0.19057475482025274), FRAC_CONST(0.19358558729580361), FRAC_CONST(0.19659459767008022), FRAC_CONST(0.19960175762113097), FRAC_CONST(0.20260703884442113), FRAC_CONST(0.20561041305309924), FRAC_CONST(0.20861185197826349), FRAC_CONST(0.21161132736922755), FRAC_CONST(0.21460881099378676), FRAC_CONST(0.21760427463848364), FRAC_CONST(0.22059769010887351), FRAC_CONST(0.22358902922978999), FRAC_CONST(0.22657826384561), FRAC_CONST(0.22956536582051887), FRAC_CONST(0.23255030703877524), FRAC_CONST(0.23553305940497549), FRAC_CONST(0.23851359484431842), FRAC_CONST(0.24149188530286933), FRAC_CONST(0.24446790274782415), FRAC_CONST(0.24744161916777327), FRAC_CONST(0.25041300657296522), FRAC_CONST(0.25338203699557016), FRAC_CONST(0.25634868248994291), FRAC_CONST(0.25931291513288623), FRAC_CONST(0.26227470702391359), FRAC_CONST(0.26523403028551179), FRAC_CONST(0.26819085706340318), FRAC_CONST(0.27114515952680801), FRAC_CONST(0.27409690986870638), FRAC_CONST(0.2770460803060999), FRAC_CONST(0.27999264308027322), FRAC_CONST(0.28293657045705539), FRAC_CONST(0.28587783472708062), FRAC_CONST(0.28881640820604948), FRAC_CONST(0.29175226323498926), FRAC_CONST(0.29468537218051433), FRAC_CONST(0.2976157074350862), FRAC_CONST(0.30054324141727345), FRAC_CONST(0.30346794657201132), FRAC_CONST(0.30638979537086092), FRAC_CONST(0.30930876031226873), FRAC_CONST(0.31222481392182488), FRAC_CONST(0.31513792875252244), FRAC_CONST(0.31804807738501495), FRAC_CONST(0.32095523242787521), FRAC_CONST(0.32385936651785285), FRAC_CONST(0.32676045232013173), FRAC_CONST(0.32965846252858749), FRAC_CONST(0.33255336986604422), FRAC_CONST(0.3354451470845316), FRAC_CONST(0.33833376696554113), FRAC_CONST(0.34121920232028236), FRAC_CONST(0.34410142598993881), FRAC_CONST(0.34698041084592368), FRAC_CONST(0.34985612979013492), FRAC_CONST(0.35272855575521073), FRAC_CONST(0.35559766170478385), FRAC_CONST(0.35846342063373654), FRAC_CONST(0.36132580556845428), FRAC_CONST(0.36418478956707989), FRAC_CONST(0.36704034571976718), FRAC_CONST(0.3698924471489341), FRAC_CONST(0.37274106700951576), FRAC_CONST(0.37558617848921722), FRAC_CONST(0.37842775480876556), FRAC_CONST(0.38126576922216238), FRAC_CONST(0.38410019501693504), FRAC_CONST(0.38693100551438858), FRAC_CONST(0.38975817406985641), FRAC_CONST(0.39258167407295147), FRAC_CONST(0.39540147894781635), FRAC_CONST(0.39821756215337356), FRAC_CONST(0.40102989718357562), FRAC_CONST(0.40383845756765407), FRAC_CONST(0.40664321687036903), FRAC_CONST(0.40944414869225759), FRAC_CONST(0.41224122666988289), FRAC_CONST(0.41503442447608163), FRAC_CONST(0.41782371582021227), FRAC_CONST(0.42060907444840251), FRAC_CONST(0.42339047414379605), FRAC_CONST(0.42616788872679962), FRAC_CONST(0.42894129205532949), FRAC_CONST(0.43171065802505726), FRAC_CONST(0.43447596056965565), FRAC_CONST(0.43723717366104409), FRAC_CONST(0.43999427130963326), FRAC_CONST(0.44274722756457002), FRAC_CONST(0.44549601651398174), FRAC_CONST(0.44824061228521989), FRAC_CONST(0.45098098904510386), FRAC_CONST(0.45371712100016387), FRAC_CONST(0.45644898239688392), FRAC_CONST(0.45917654752194409), FRAC_CONST(0.46189979070246273), FRAC_CONST(0.46461868630623782), FRAC_CONST(0.46733320874198842), FRAC_CONST(0.47004333245959562), FRAC_CONST(0.47274903195034279), FRAC_CONST(0.47545028174715587), FRAC_CONST(0.47814705642484301), FRAC_CONST(0.48083933060033396), FRAC_CONST(0.48352707893291874), FRAC_CONST(0.48621027612448642), FRAC_CONST(0.48888889691976317), FRAC_CONST(0.4915629161065499), FRAC_CONST(0.49423230851595967), FRAC_CONST(0.49689704902265447), FRAC_CONST(0.49955711254508184), FRAC_CONST(0.50221247404571079), FRAC_CONST(0.50486310853126759), FRAC_CONST(0.50750899105297087), FRAC_CONST(0.51015009670676681), FRAC_CONST(0.51278640063356296), FRAC_CONST(0.51541787801946293), FRAC_CONST(0.51804450409599934), FRAC_CONST(0.52066625414036716), FRAC_CONST(0.52328310347565643), FRAC_CONST(0.52589502747108463), FRAC_CONST(0.52850200154222848), FRAC_CONST(0.531104001151255), FRAC_CONST(0.53370100180715296), FRAC_CONST(0.53629297906596318), FRAC_CONST(0.53887990853100842), FRAC_CONST(0.54146176585312344), FRAC_CONST(0.54403852673088382), FRAC_CONST(0.54661016691083486), FRAC_CONST(0.54917666218771966), FRAC_CONST(0.55173798840470734), FRAC_CONST(0.55429412145362), FRAC_CONST(0.5568450372751601), FRAC_CONST(0.55939071185913614), FRAC_CONST(0.56193112124468947), FRAC_CONST(0.5644662415205195), FRAC_CONST(0.56699604882510868), FRAC_CONST(0.56952051934694714), FRAC_CONST(0.57203962932475705), FRAC_CONST(0.57455335504771576), FRAC_CONST(0.57706167285567944), FRAC_CONST(0.57956455913940563), FRAC_CONST(0.58206199034077544), FRAC_CONST(0.58455394295301533), FRAC_CONST(0.58704039352091797), FRAC_CONST(0.58952131864106394), FRAC_CONST(0.59199669496204099), FRAC_CONST(0.59446649918466443), FRAC_CONST(0.5969307080621965), FRAC_CONST(0.59938929840056454), FRAC_CONST(0.60184224705858003), FRAC_CONST(0.60428953094815596), FRAC_CONST(0.60673112703452448), FRAC_CONST(0.60916701233645321), FRAC_CONST(0.61159716392646191), FRAC_CONST(0.61402155893103838), FRAC_CONST(0.61644017453085365), FRAC_CONST(0.61885298796097632), FRAC_CONST(0.62125997651108755), FRAC_CONST(0.62366111752569453), FRAC_CONST(0.62605638840434352), FRAC_CONST(0.62844576660183271), FRAC_CONST(0.63082922962842447), FRAC_CONST(0.63320675505005719), FRAC_CONST(0.63557832048855611), FRAC_CONST(0.63794390362184406), FRAC_CONST(0.64030348218415167), FRAC_CONST(0.64265703396622686), FRAC_CONST(0.64500453681554393), FRAC_CONST(0.64734596863651206), FRAC_CONST(0.64968130739068319), FRAC_CONST(0.6520105310969595), FRAC_CONST(0.65433361783180044), FRAC_CONST(0.65665054572942894), FRAC_CONST(0.65896129298203732), FRAC_CONST(0.66126583783999227), FRAC_CONST(0.66356415861203977), FRAC_CONST(0.66585623366550972), FRAC_CONST(0.66814204142651845), FRAC_CONST(0.67042156038017309), FRAC_CONST(0.67269476907077286), FRAC_CONST(0.67496164610201193), FRAC_CONST(0.67722217013718033), FRAC_CONST(0.67947631989936497), FRAC_CONST(0.68172407417164971), FRAC_CONST(0.6839654117973154), FRAC_CONST(0.68620031168003859), FRAC_CONST(0.68842875278409044), FRAC_CONST(0.6906507141345346), FRAC_CONST(0.69286617481742463), FRAC_CONST(0.69507511398000088), FRAC_CONST(0.69727751083088652), FRAC_CONST(0.69947334464028377), FRAC_CONST(0.70166259474016845), FRAC_CONST(0.70384524052448494), FRAC_CONST(0.70602126144933974), FRAC_CONST(0.70819063703319529), FRAC_CONST(0.71035334685706231), FRAC_CONST(0.71250937056469232), FRAC_CONST(0.71465868786276898), FRAC_CONST(0.71680127852109954), FRAC_CONST(0.71893712237280438), FRAC_CONST(0.72106619931450811), FRAC_CONST(0.72318848930652735), FRAC_CONST(0.72530397237306066), FRAC_CONST(0.72741262860237577), FRAC_CONST(0.7295144381469969), FRAC_CONST(0.73160938122389252), FRAC_CONST(0.73369743811466026), FRAC_CONST(0.73577858916571348), FRAC_CONST(0.73785281478846598), FRAC_CONST(0.73992009545951609), FRAC_CONST(0.74198041172083096), FRAC_CONST(0.74403374417992918), FRAC_CONST(0.74608007351006378), FRAC_CONST(0.74811938045040349), FRAC_CONST(0.75015164580621496), FRAC_CONST(0.7521768504490427), FRAC_CONST(0.75419497531688917), FRAC_CONST(0.75620600141439454), FRAC_CONST(0.75820990981301528), FRAC_CONST(0.76020668165120242), FRAC_CONST(0.7621962981345789), FRAC_CONST(0.76417874053611667), FRAC_CONST(0.76615399019631281), FRAC_CONST(0.76812202852336531), FRAC_CONST(0.7700828369933479), FRAC_CONST(0.77203639715038441), FRAC_CONST(0.77398269060682279), FRAC_CONST(0.77592169904340758), FRAC_CONST(0.77785340420945304), FRAC_CONST(0.77977778792301444), FRAC_CONST(0.78169483207105939), FRAC_CONST(0.7836045186096382), FRAC_CONST(0.78550682956405393), FRAC_CONST(0.78740174702903132), FRAC_CONST(0.78928925316888565), FRAC_CONST(0.79116933021769009), FRAC_CONST(0.79304196047944364), FRAC_CONST(0.79490712632823701), FRAC_CONST(0.79676481020841872), FRAC_CONST(0.79861499463476082), FRAC_CONST(0.80045766219262271), FRAC_CONST(0.80229279553811572), FRAC_CONST(0.8041203773982657), FRAC_CONST(0.80594039057117628), FRAC_CONST(0.80775281792619036), FRAC_CONST(0.80955764240405126), FRAC_CONST(0.81135484701706373), FRAC_CONST(0.81314441484925359), FRAC_CONST(0.81492632905652662), FRAC_CONST(0.81670057286682785), FRAC_CONST(0.81846712958029866), FRAC_CONST(0.82022598256943469), FRAC_CONST(0.82197711527924155), FRAC_CONST(0.82372051122739132), FRAC_CONST(0.82545615400437744), FRAC_CONST(0.82718402727366902), FRAC_CONST(0.82890411477186487), FRAC_CONST(0.8306164003088462), FRAC_CONST(0.83232086776792968), FRAC_CONST(0.83401750110601813), FRAC_CONST(0.8357062843537526), FRAC_CONST(0.83738720161566194), FRAC_CONST(0.83906023707031263), FRAC_CONST(0.84072537497045807), FRAC_CONST(0.84238259964318596), FRAC_CONST(0.84403189549006641), FRAC_CONST(0.84567324698729907), FRAC_CONST(0.84730663868585832), FRAC_CONST(0.84893205521163961), FRAC_CONST(0.85054948126560337), FRAC_CONST(0.85215890162391983), FRAC_CONST(0.8537603011381113), FRAC_CONST(0.85535366473519603), FRAC_CONST(0.85693897741782865), FRAC_CONST(0.85851622426444274), FRAC_CONST(0.86008539042939014), FRAC_CONST(0.8616464611430813), FRAC_CONST(0.86319942171212416), FRAC_CONST(0.86474425751946238), FRAC_CONST(0.86628095402451299), FRAC_CONST(0.86780949676330321), FRAC_CONST(0.86932987134860673), FRAC_CONST(0.87084206347007886), FRAC_CONST(0.87234605889439154), FRAC_CONST(0.87384184346536675), FRAC_CONST(0.87532940310411078), FRAC_CONST(0.87680872380914576), FRAC_CONST(0.87827979165654146), FRAC_CONST(0.87974259280004741), FRAC_CONST(0.88119711347122198), FRAC_CONST(0.88264333997956279), FRAC_CONST(0.88408125871263499), FRAC_CONST(0.88551085613619995), FRAC_CONST(0.88693211879434208), FRAC_CONST(0.88834503330959624), FRAC_CONST(0.88974958638307289), FRAC_CONST(0.89114576479458318), FRAC_CONST(0.89253355540276469), FRAC_CONST(0.89391294514520325), FRAC_CONST(0.89528392103855758), FRAC_CONST(0.89664647017868015), FRAC_CONST(0.89800057974073988), FRAC_CONST(0.89934623697934146), FRAC_CONST(0.90068342922864686), FRAC_CONST(0.90201214390249307), FRAC_CONST(0.90333236849451182), FRAC_CONST(0.90464409057824624), FRAC_CONST(0.90594729780726846), FRAC_CONST(0.90724197791529593), FRAC_CONST(0.90852811871630612), FRAC_CONST(0.90980570810465222), FRAC_CONST(0.91107473405517625), FRAC_CONST(0.91233518462332275), FRAC_CONST(0.91358704794525081), FRAC_CONST(0.91483031223794609), FRAC_CONST(0.91606496579933161), FRAC_CONST(0.91729099700837791), FRAC_CONST(0.91850839432521225), FRAC_CONST(0.91971714629122736), FRAC_CONST(0.92091724152918952), FRAC_CONST(0.92210866874334507), FRAC_CONST(0.92329141671952764), FRAC_CONST(0.9244654743252626), FRAC_CONST(0.92563083050987272), FRAC_CONST(0.92678747430458175), FRAC_CONST(0.92793539482261789), FRAC_CONST(0.92907458125931575), FRAC_CONST(0.93020502289221907), FRAC_CONST(0.93132670908118043), FRAC_CONST(0.93243962926846236), FRAC_CONST(0.93354377297883617), FRAC_CONST(0.93463912981968078), FRAC_CONST(0.93572568948108037), FRAC_CONST(0.93680344173592156), FRAC_CONST(0.93787237643998989), FRAC_CONST(0.93893248353206449), FRAC_CONST(0.93998375303401394), FRAC_CONST(0.94102617505088926), FRAC_CONST(0.94205973977101731), FRAC_CONST(0.94308443746609349), FRAC_CONST(0.94410025849127266), FRAC_CONST(0.94510719328526061), FRAC_CONST(0.94610523237040334), FRAC_CONST(0.94709436635277722), FRAC_CONST(0.94807458592227623), FRAC_CONST(0.94904588185270056), FRAC_CONST(0.950008245001843), FRAC_CONST(0.95096166631157508), FRAC_CONST(0.95190613680793223), FRAC_CONST(0.95284164760119872), FRAC_CONST(0.95376818988599033), FRAC_CONST(0.95468575494133834), FRAC_CONST(0.95559433413077111), FRAC_CONST(0.95649391890239499), FRAC_CONST(0.95738450078897586), FRAC_CONST(0.95826607140801767), FRAC_CONST(0.95913862246184189), FRAC_CONST(0.96000214573766585), FRAC_CONST(0.96085663310767966), FRAC_CONST(0.96170207652912254), FRAC_CONST(0.96253846804435916), FRAC_CONST(0.96336579978095405), FRAC_CONST(0.96418406395174572), FRAC_CONST(0.96499325285492032), FRAC_CONST(0.96579335887408357), FRAC_CONST(0.96658437447833312), FRAC_CONST(0.96736629222232851), FRAC_CONST(0.96813910474636233), FRAC_CONST(0.96890280477642887), FRAC_CONST(0.96965738512429245), FRAC_CONST(0.9704028386875555), FRAC_CONST(0.97113915844972509), FRAC_CONST(0.9718663374802794), FRAC_CONST(0.97258436893473221), FRAC_CONST(0.97329324605469825), FRAC_CONST(0.97399296216795583), FRAC_CONST(0.97468351068851067), FRAC_CONST(0.97536488511665687), FRAC_CONST(0.97603707903903902), FRAC_CONST(0.97670008612871184), FRAC_CONST(0.97735390014519996), FRAC_CONST(0.97799851493455714), FRAC_CONST(0.9786339244294231), FRAC_CONST(0.97926012264908202), FRAC_CONST(0.97987710369951764), FRAC_CONST(0.98048486177346938), FRAC_CONST(0.98108339115048659), FRAC_CONST(0.98167268619698311), FRAC_CONST(0.98225274136628937), FRAC_CONST(0.98282355119870524), FRAC_CONST(0.98338511032155118), FRAC_CONST(0.98393741344921892), FRAC_CONST(0.98448045538322093), FRAC_CONST(0.98501423101223984), FRAC_CONST(0.98553873531217606), FRAC_CONST(0.98605396334619544), FRAC_CONST(0.98655991026477541), FRAC_CONST(0.98705657130575097), FRAC_CONST(0.98754394179435923), FRAC_CONST(0.98802201714328353), FRAC_CONST(0.98849079285269659), FRAC_CONST(0.98895026451030299), FRAC_CONST(0.98940042779138038), FRAC_CONST(0.98984127845882053), FRAC_CONST(0.99027281236316911), FRAC_CONST(0.99069502544266463), FRAC_CONST(0.99110791372327678), FRAC_CONST(0.9915114733187439), FRAC_CONST(0.99190570043060933), FRAC_CONST(0.99229059134825737), FRAC_CONST(0.99266614244894802), FRAC_CONST(0.99303235019785141), FRAC_CONST(0.99338921114808065), FRAC_CONST(0.9937367219407246), FRAC_CONST(0.99407487930487937), FRAC_CONST(0.9944036800576791), FRAC_CONST(0.9947231211043257), FRAC_CONST(0.99503319943811863), FRAC_CONST(0.99533391214048228), FRAC_CONST(0.99562525638099431), FRAC_CONST(0.99590722941741172), FRAC_CONST(0.99617982859569687), FRAC_CONST(0.99644305135004263), FRAC_CONST(0.99669689520289606), FRAC_CONST(0.99694135776498216), FRAC_CONST(0.99717643673532619), FRAC_CONST(0.9974021299012753), FRAC_CONST(0.99761843513851955), FRAC_CONST(0.99782535041111164), FRAC_CONST(0.99802287377148624), FRAC_CONST(0.99821100336047819), FRAC_CONST(0.99838973740734016), FRAC_CONST(0.99855907422975931), FRAC_CONST(0.99871901223387294), FRAC_CONST(0.99886954991428356), FRAC_CONST(0.99901068585407338), FRAC_CONST(0.99914241872481691), FRAC_CONST(0.99926474728659442), FRAC_CONST(0.99937767038800285), FRAC_CONST(0.99948118696616695), FRAC_CONST(0.99957529604674922), FRAC_CONST(0.99965999674395922), FRAC_CONST(0.99973528826056168), FRAC_CONST(0.99980116988788426), FRAC_CONST(0.99985764100582386), FRAC_CONST(0.9999047010828529), FRAC_CONST(0.99994234967602391), FRAC_CONST(0.99997058643097414), FRAC_CONST(0.9999894110819284), FRAC_CONST(0.99999882345170188) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t sine_mid_480[] = { FRAC_CONST(0.0016362454436240478), FRAC_CONST(0.00490871880799799), FRAC_CONST(0.0081811396039371282), FRAC_CONST(0.011453472786443779), FRAC_CONST(0.014725683311458524), FRAC_CONST(0.017997736136235509), FRAC_CONST(0.021269596219717739), FRAC_CONST(0.024541228522912285), FRAC_CONST(0.027812598009265607), FRAC_CONST(0.03108366964503869), FRAC_CONST(0.034354408399682276), FRAC_CONST(0.037624779246211978), FRAC_CONST(0.04089474716158345), FRAC_CONST(0.044164277127067358), FRAC_CONST(0.047433334128624507), FRAC_CONST(0.050701883157280733), FRAC_CONST(0.053969889209501881), FRAC_CONST(0.057237317287568618), FRAC_CONST(0.060504132399951269), FRAC_CONST(0.063770299561684493), FRAC_CONST(0.06703578379474201), FRAC_CONST(0.070300550128411174), FRAC_CONST(0.073564563599667426), FRAC_CONST(0.076827789253548759), FRAC_CONST(0.080090192143530081), FRAC_CONST(0.083351737331897449), FRAC_CONST(0.086612389890122182), FRAC_CONST(0.089872114899234967), FRAC_CONST(0.093130877450199795), FRAC_CONST(0.096388642644287828), FRAC_CONST(0.09964537559345106), FRAC_CONST(0.1029010414206961), FRAC_CONST(0.10615560526045748), FRAC_CONST(0.10940903225897117), FRAC_CONST(0.11266128757464781), FRAC_CONST(0.11591233637844581), FRAC_CONST(0.11916214385424433), FRAC_CONST(0.1224106751992162), FRAC_CONST(0.12565789562420052), FRAC_CONST(0.12890377035407541), FRAC_CONST(0.13214826462813015), FRAC_CONST(0.13539134370043773), FRAC_CONST(0.13863297284022669), FRAC_CONST(0.14187311733225325), FRAC_CONST(0.14511174247717309), FRAC_CONST(0.14834881359191271), FRAC_CONST(0.15158429601004111), FRAC_CONST(0.15481815508214106), FRAC_CONST(0.1580503561761798), FRAC_CONST(0.16128086467788047), FRAC_CONST(0.16450964599109233), FRAC_CONST(0.16773666553816149), FRAC_CONST(0.17096188876030122), FRAC_CONST(0.17418528111796186), FRAC_CONST(0.17740680809120093), FRAC_CONST(0.18062643518005275), FRAC_CONST(0.18384412790489776), FRAC_CONST(0.18705985180683199), FRAC_CONST(0.19027357244803589), FRAC_CONST(0.19348525541214331), FRAC_CONST(0.19669486630460997), FRAC_CONST(0.19990237075308173), FRAC_CONST(0.20310773440776286), FRAC_CONST(0.20631092294178383), FRAC_CONST(0.20951190205156878), FRAC_CONST(0.21271063745720317), FRAC_CONST(0.21590709490280058), FRAC_CONST(0.2191012401568698), FRAC_CONST(0.22229303901268133), FRAC_CONST(0.22548245728863364), FRAC_CONST(0.22866946082861941), FRAC_CONST(0.23185401550239115), FRAC_CONST(0.23503608720592667), FRAC_CONST(0.23821564186179459), FRAC_CONST(0.24139264541951888), FRAC_CONST(0.24456706385594387), FRAC_CONST(0.24773886317559846), FRAC_CONST(0.25090800941106001), FRAC_CONST(0.25407446862331851), FRAC_CONST(0.25723820690213967), FRAC_CONST(0.26039919036642817), FRAC_CONST(0.26355738516459076), FRAC_CONST(0.26671275747489837), FRAC_CONST(0.2698652735058486), FRAC_CONST(0.27301489949652735), FRAC_CONST(0.27616160171697068), FRAC_CONST(0.27930534646852595), FRAC_CONST(0.28244610008421245), FRAC_CONST(0.2855838289290823), FRAC_CONST(0.28871849940058025), FRAC_CONST(0.29185007792890405), FRAC_CONST(0.29497853097736348), FRAC_CONST(0.2981038250427398), FRAC_CONST(0.30122592665564446), FRAC_CONST(0.30434480238087736), FRAC_CONST(0.30746041881778519), FRAC_CONST(0.31057274260061901), FRAC_CONST(0.31368174039889146), FRAC_CONST(0.31678737891773395), FRAC_CONST(0.31988962489825296), FRAC_CONST(0.32298844511788638), FRAC_CONST(0.32608380639075912), FRAC_CONST(0.32917567556803889), FRAC_CONST(0.33226401953829071), FRAC_CONST(0.33534880522783189), FRAC_CONST(0.33842999960108583), FRAC_CONST(0.34150756966093632), FRAC_CONST(0.34458148244908043), FRAC_CONST(0.34765170504638188), FRAC_CONST(0.35071820457322322), FRAC_CONST(0.35378094818985806), FRAC_CONST(0.35683990309676283), FRAC_CONST(0.35989503653498811), FRAC_CONST(0.36294631578650921), FRAC_CONST(0.36599370817457672), FRAC_CONST(0.36903718106406647), FRAC_CONST(0.37207670186182878), FRAC_CONST(0.37511223801703802), FRAC_CONST(0.37814375702154046), FRAC_CONST(0.38117122641020335), FRAC_CONST(0.38419461376126157), FRAC_CONST(0.38721388669666562), FRAC_CONST(0.39022901288242801), FRAC_CONST(0.39323996002896966), FRAC_CONST(0.39624669589146555), FRAC_CONST(0.39924918827019029), FRAC_CONST(0.40224740501086254), FRAC_CONST(0.40524131400498986), FRAC_CONST(0.40823088319021217), FRAC_CONST(0.41121608055064529), FRAC_CONST(0.41419687411722372), FRAC_CONST(0.41717323196804335), FRAC_CONST(0.42014512222870243), FRAC_CONST(0.42311251307264408), FRAC_CONST(0.42607537272149631), FRAC_CONST(0.4290336694454126), FRAC_CONST(0.43198737156341183), FRAC_CONST(0.43493644744371707), FRAC_CONST(0.43788086550409511), FRAC_CONST(0.44082059421219388), FRAC_CONST(0.44375560208588088), FRAC_CONST(0.44668585769357955), FRAC_CONST(0.4496113296546066), FRAC_CONST(0.45253198663950756), FRAC_CONST(0.45544779737039259), FRAC_CONST(0.45835873062127125), FRAC_CONST(0.46126475521838717), FRAC_CONST(0.46416584004055156), FRAC_CONST(0.46706195401947659), FRAC_CONST(0.46995306614010829), FRAC_CONST(0.47283914544095862), FRAC_CONST(0.47572016101443682), FRAC_CONST(0.47859608200718085), FRAC_CONST(0.4814668776203872), FRAC_CONST(0.48433251711014125), FRAC_CONST(0.4871929697877464), FRAC_CONST(0.49004820502005247), FRAC_CONST(0.49289819222978404), FRAC_CONST(0.49574290089586776), FRAC_CONST(0.49858230055375902), FRAC_CONST(0.50141636079576901), FRAC_CONST(0.50424505127138919), FRAC_CONST(0.50706834168761705), FRAC_CONST(0.50988620180928057), FRAC_CONST(0.51269860145936175), FRAC_CONST(0.51550551051931948), FRAC_CONST(0.51830689892941317), FRAC_CONST(0.5211027366890234), FRAC_CONST(0.52389299385697385), FRAC_CONST(0.52667764055185196), FRAC_CONST(0.52945664695232897), FRAC_CONST(0.53222998329747884), FRAC_CONST(0.53499761988709726), FRAC_CONST(0.53775952708201991), FRAC_CONST(0.54051567530443978), FRAC_CONST(0.54326603503822357), FRAC_CONST(0.54601057682922816), FRAC_CONST(0.54874927128561579), FRAC_CONST(0.55148208907816942), FRAC_CONST(0.55420900094060566), FRAC_CONST(0.55692997766988939), FRAC_CONST(0.559644990126546), FRAC_CONST(0.56235400923497314), FRAC_CONST(0.56505700598375252), FRAC_CONST(0.56775395142596052), FRAC_CONST(0.57044481667947822), FRAC_CONST(0.57312957292730071), FRAC_CONST(0.57580819141784534), FRAC_CONST(0.57848064346525996), FRAC_CONST(0.58114690044973039), FRAC_CONST(0.58380693381778626), FRAC_CONST(0.58646071508260733), FRAC_CONST(0.58910821582432815), FRAC_CONST(0.5917494076903429), FRAC_CONST(0.5943842623956086), FRAC_CONST(0.59701275172294799), FRAC_CONST(0.59963484752335228), FRAC_CONST(0.60225052171628191), FRAC_CONST(0.60485974628996786), FRAC_CONST(0.60746249330171098), FRAC_CONST(0.61005873487818185), FRAC_CONST(0.61264844321571899), FRAC_CONST(0.61523159058062682), FRAC_CONST(0.61780814930947225), FRAC_CONST(0.62037809180938108), FRAC_CONST(0.62294139055833397), FRAC_CONST(0.6254980181054608), FRAC_CONST(0.62804794707133416), FRAC_CONST(0.63059115014826372), FRAC_CONST(0.63312760010058777), FRAC_CONST(0.63565726976496484), FRAC_CONST(0.63818013205066515), FRAC_CONST(0.64069615993986073), FRAC_CONST(0.64320532648791406), FRAC_CONST(0.64570760482366729), FRAC_CONST(0.64820296814972966), FRAC_CONST(0.65069138974276486), FRAC_CONST(0.65317284295377676), FRAC_CONST(0.65564730120839498), FRAC_CONST(0.65811473800715958), FRAC_CONST(0.660575126925805), FRAC_CONST(0.66302844161554231), FRAC_CONST(0.6654746558033422), FRAC_CONST(0.66791374329221598), FRAC_CONST(0.67034567796149647), FRAC_CONST(0.67277043376711676), FRAC_CONST(0.67518798474189046), FRAC_CONST(0.67759830499578866), FRAC_CONST(0.68000136871621808), FRAC_CONST(0.68239715016829683), FRAC_CONST(0.6847856236951303), FRAC_CONST(0.68716676371808583), FRAC_CONST(0.68954054473706683), FRAC_CONST(0.69190694133078579), FRAC_CONST(0.69426592815703603), FRAC_CONST(0.69661747995296419), FRAC_CONST(0.69896157153533944), FRAC_CONST(0.70129817780082437), FRAC_CONST(0.7036272737262429), FRAC_CONST(0.70594883436884903), FRAC_CONST(0.70826283486659336), FRAC_CONST(0.71056925043838959), FRAC_CONST(0.71286805638437978), FRAC_CONST(0.71515922808619936), FRAC_CONST(0.71744274100723993), FRAC_CONST(0.71971857069291278), FRAC_CONST(0.7219866927709101), FRAC_CONST(0.72424708295146689), FRAC_CONST(0.72649971702762028), FRAC_CONST(0.72874457087546896), FRAC_CONST(0.73098162045443171), FRAC_CONST(0.73321084180750484), FRAC_CONST(0.73543221106151868), FRAC_CONST(0.73764570442739286), FRAC_CONST(0.73985129820039208), FRAC_CONST(0.74204896876037885), FRAC_CONST(0.7442386925720671), FRAC_CONST(0.74642044618527381), FRAC_CONST(0.74859420623517081), FRAC_CONST(0.75075994944253421), FRAC_CONST(0.75291765261399446), FRAC_CONST(0.75506729264228367), FRAC_CONST(0.75720884650648446), FRAC_CONST(0.75934229127227548), FRAC_CONST(0.76146760409217706), FRAC_CONST(0.76358476220579641), FRAC_CONST(0.7656937429400712), FRAC_CONST(0.76779452370951196), FRAC_CONST(0.76988708201644451), FRAC_CONST(0.77197139545125026), FRAC_CONST(0.7740474416926072), FRAC_CONST(0.77611519850772781), FRAC_CONST(0.77817464375259782), FRAC_CONST(0.78022575537221317), FRAC_CONST(0.78226851140081632), FRAC_CONST(0.78430288996213138), FRAC_CONST(0.78632886926959822), FRAC_CONST(0.78834642762660623), FRAC_CONST(0.79035554342672631), FRAC_CONST(0.79235619515394229), FRAC_CONST(0.79434836138288134), FRAC_CONST(0.79633202077904397), FRAC_CONST(0.79830715209903147), FRAC_CONST(0.8002737341907743), FRAC_CONST(0.80223174599375802), FRAC_CONST(0.80418116653924954), FRAC_CONST(0.80612197495052085), FRAC_CONST(0.80805415044307316), FRAC_CONST(0.80997767232485907), FRAC_CONST(0.81189251999650469), FRAC_CONST(0.81379867295152986), FRAC_CONST(0.81569611077656778), FRAC_CONST(0.81758481315158371), FRAC_CONST(0.81946475985009259), FRAC_CONST(0.82133593073937561), FRAC_CONST(0.82319830578069586), FRAC_CONST(0.82505186502951278), FRAC_CONST(0.82689658863569615), FRAC_CONST(0.82873245684373809), FRAC_CONST(0.83055944999296494), FRAC_CONST(0.83237754851774781), FRAC_CONST(0.83418673294771239), FRAC_CONST(0.83598698390794668), FRAC_CONST(0.83777828211920935), FRAC_CONST(0.83956060839813562), FRAC_CONST(0.84133394365744296), FRAC_CONST(0.84309826890613537), FRAC_CONST(0.84485356524970701), FRAC_CONST(0.84659981389034411), FRAC_CONST(0.84833699612712676), FRAC_CONST(0.85006509335622882), FRAC_CONST(0.8517840870711173), FRAC_CONST(0.85349395886275037), FRAC_CONST(0.85519469041977514), FRAC_CONST(0.85688626352872277), FRAC_CONST(0.85856866007420429), FRAC_CONST(0.86024186203910447), FRAC_CONST(0.86190585150477417), FRAC_CONST(0.86356061065122347), FRAC_CONST(0.86520612175731115), FRAC_CONST(0.86684236720093533), FRAC_CONST(0.86846932945922151), FRAC_CONST(0.87008699110871135), FRAC_CONST(0.87169533482554817), FRAC_CONST(0.87329434338566281), FRAC_CONST(0.87488399966495822), FRAC_CONST(0.87646428663949283), FRAC_CONST(0.87803518738566277), FRAC_CONST(0.87959668508038291), FRAC_CONST(0.88114876300126743), FRAC_CONST(0.88269140452680916), FRAC_CONST(0.8842245931365561), FRAC_CONST(0.88574831241129048), FRAC_CONST(0.88726254603320276), FRAC_CONST(0.88876727778606746), FRAC_CONST(0.89026249155541637), FRAC_CONST(0.8917481713287112), FRAC_CONST(0.89322430119551532), FRAC_CONST(0.89469086534766362), FRAC_CONST(0.89614784807943237), FRAC_CONST(0.89759523378770689), FRAC_CONST(0.89903300697214927), FRAC_CONST(0.9004611522353636), FRAC_CONST(0.90187965428306172), FRAC_CONST(0.90328849792422594), FRAC_CONST(0.90468766807127299), FRAC_CONST(0.90607714974021469), FRAC_CONST(0.90745692805081868), FRAC_CONST(0.90882698822676755), FRAC_CONST(0.91018731559581767), FRAC_CONST(0.91153789558995579), FRAC_CONST(0.91287871374555518), FRAC_CONST(0.91420975570353069), FRAC_CONST(0.9155310072094921), FRAC_CONST(0.91684245411389753), FRAC_CONST(0.91814408237220391), FRAC_CONST(0.91943587804501858), FRAC_CONST(0.92071782729824769), FRAC_CONST(0.92198991640324446), FRAC_CONST(0.92325213173695675), FRAC_CONST(0.92450445978207241), FRAC_CONST(0.92574688712716402), FRAC_CONST(0.92697940046683291), FRAC_CONST(0.92820198660185149), FRAC_CONST(0.92941463243930444), FRAC_CONST(0.93061732499272909), FRAC_CONST(0.93181005138225426), FRAC_CONST(0.93299279883473885), FRAC_CONST(0.93416555468390772), FRAC_CONST(0.93532830637048769), FRAC_CONST(0.93648104144234268), FRAC_CONST(0.93762374755460598), FRAC_CONST(0.93875641246981323), FRAC_CONST(0.93987902405803303), FRAC_CONST(0.94099157029699743), FRAC_CONST(0.94209403927222979), FRAC_CONST(0.94318641917717327), FRAC_CONST(0.9442686983133165), FRAC_CONST(0.94534086509031956), FRAC_CONST(0.9464029080261378), FRAC_CONST(0.94745481574714419), FRAC_CONST(0.94849657698825252), FRAC_CONST(0.94952818059303667), FRAC_CONST(0.95054961551385087), FRAC_CONST(0.95156087081194762), FRAC_CONST(0.95256193565759528), FRAC_CONST(0.95355279933019343), FRAC_CONST(0.9545334512183884), FRAC_CONST(0.95550388082018611), FRAC_CONST(0.95646407774306541), FRAC_CONST(0.95741403170408834), FRAC_CONST(0.95835373253001133), FRAC_CONST(0.95928317015739362), FRAC_CONST(0.96020233463270466), FRAC_CONST(0.96111121611243155), FRAC_CONST(0.96200980486318388), FRAC_CONST(0.96289809126179782), FRAC_CONST(0.96377606579543984), FRAC_CONST(0.96464371906170809), FRAC_CONST(0.96550104176873297), FRAC_CONST(0.96634802473527726), FRAC_CONST(0.96718465889083372), FRAC_CONST(0.96801093527572268), FRAC_CONST(0.96882684504118799), FRAC_CONST(0.96963237944949143), FRAC_CONST(0.97042752987400682), FRAC_CONST(0.97121228779931179), FRAC_CONST(0.97198664482127939), FRAC_CONST(0.97275059264716823), FRAC_CONST(0.97350412309571066), FRAC_CONST(0.97424722809720088), FRAC_CONST(0.97497989969358168), FRAC_CONST(0.97570213003852857), FRAC_CONST(0.97641391139753486), FRAC_CONST(0.97711523614799412), FRAC_CONST(0.97780609677928154), FRAC_CONST(0.97848648589283505), FRAC_CONST(0.97915639620223371), FRAC_CONST(0.9798158205332762), FRAC_CONST(0.98046475182405801), FRAC_CONST(0.98110318312504607), FRAC_CONST(0.98173110759915416), FRAC_CONST(0.98234851852181571), FRAC_CONST(0.98295540928105563), FRAC_CONST(0.9835517733775615), FRAC_CONST(0.98413760442475307), FRAC_CONST(0.98471289614885038), FRAC_CONST(0.98527764238894122), FRAC_CONST(0.98583183709704714), FRAC_CONST(0.98637547433818806), FRAC_CONST(0.98690854829044583), FRAC_CONST(0.98743105324502667), FRAC_CONST(0.98794298360632238), FRAC_CONST(0.98844433389196995), FRAC_CONST(0.98893509873291074), FRAC_CONST(0.98941527287344755), FRAC_CONST(0.98988485117130098), FRAC_CONST(0.99034382859766479), FRAC_CONST(0.99079220023725967), FRAC_CONST(0.99122996128838525), FRAC_CONST(0.9916571070629725), FRAC_CONST(0.99207363298663342), FRAC_CONST(0.99247953459870997), FRAC_CONST(0.99287480755232194), FRAC_CONST(0.99325944761441354), FRAC_CONST(0.99363345066579889), FRAC_CONST(0.99399681270120555), FRAC_CONST(0.99434952982931812), FRAC_CONST(0.9946915982728195), FRAC_CONST(0.99502301436843166), FRAC_CONST(0.99534377456695422), FRAC_CONST(0.9956538754333033), FRAC_CONST(0.99595331364654771), FRAC_CONST(0.99624208599994479), FRAC_CONST(0.99652018940097464), FRAC_CONST(0.99678762087137318), FRAC_CONST(0.99704437754716424), FRAC_CONST(0.99729045667869021), FRAC_CONST(0.99752585563064111), FRAC_CONST(0.99775057188208349), FRAC_CONST(0.9979646030264866), FRAC_CONST(0.99816794677174903), FRAC_CONST(0.9983606009402225), FRAC_CONST(0.99854256346873571), FRAC_CONST(0.99871383240861611), FRAC_CONST(0.99887440592571108), FRAC_CONST(0.99902428230040718), FRAC_CONST(0.99916345992764877), FRAC_CONST(0.99929193731695531), FRAC_CONST(0.99940971309243731), FRAC_CONST(0.99951678599281069), FRAC_CONST(0.99961315487141078), FRAC_CONST(0.99969881869620425), FRAC_CONST(0.99977377654980037), FRAC_CONST(0.99983802762946083), FRAC_CONST(0.99989157124710804), FRAC_CONST(0.9999344068293331), FRAC_CONST(0.99996653391740109), FRAC_CONST(0.99998795216725689), FRAC_CONST(0.99999866134952808) }; #endif ALIGN static const real_t ld_mid_512[] = { FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0.0061358846491544753), FRAC_CONST(0.01840672990580482), FRAC_CONST(0.030674803176636626), FRAC_CONST(0.04293825693494082), FRAC_CONST(0.055195244349689934), FRAC_CONST(0.067443919563664051), FRAC_CONST(0.079682437971430126), FRAC_CONST(0.091908956497132724), FRAC_CONST(0.10412163387205459), FRAC_CONST(0.11631863091190475), FRAC_CONST(0.12849811079379317), FRAC_CONST(0.14065823933284921), FRAC_CONST(0.15279718525844344), FRAC_CONST(0.16491312048996989), FRAC_CONST(0.17700422041214875), FRAC_CONST(0.18906866414980619), FRAC_CONST(0.2011046348420919), FRAC_CONST(0.21311031991609136), FRAC_CONST(0.22508391135979283), FRAC_CONST(0.2370236059943672), FRAC_CONST(0.24892760574572015), FRAC_CONST(0.26079411791527551), FRAC_CONST(0.27262135544994898), FRAC_CONST(0.28440753721127188), FRAC_CONST(0.29615088824362379), FRAC_CONST(0.30784964004153487), FRAC_CONST(0.31950203081601569), FRAC_CONST(0.33110630575987643), FRAC_CONST(0.34266071731199438), FRAC_CONST(0.35416352542049034), FRAC_CONST(0.36561299780477385), FRAC_CONST(0.37700741021641826), FRAC_CONST(0.38834504669882625), FRAC_CONST(0.39962419984564679), FRAC_CONST(0.41084317105790391), FRAC_CONST(0.42200027079979968), FRAC_CONST(0.43309381885315196), FRAC_CONST(0.4441221445704292), FRAC_CONST(0.45508358712634384), FRAC_CONST(0.46597649576796618), FRAC_CONST(0.47679923006332209), FRAC_CONST(0.487550160148436), FRAC_CONST(0.49822766697278187), FRAC_CONST(0.50883014254310699), FRAC_CONST(0.51935599016558964), FRAC_CONST(0.52980362468629461), FRAC_CONST(0.54017147272989285), FRAC_CONST(0.55045797293660481), FRAC_CONST(0.56066157619733603), FRAC_CONST(0.57078074588696726), FRAC_CONST(0.58081395809576453), FRAC_CONST(0.59075970185887416), FRAC_CONST(0.60061647938386897), FRAC_CONST(0.61038280627630948), FRAC_CONST(0.6200572117632891), FRAC_CONST(0.62963823891492698), FRAC_CONST(0.63912444486377573), FRAC_CONST(0.64851440102211244), FRAC_CONST(0.65780669329707864), FRAC_CONST(0.66699992230363747), FRAC_CONST(0.67609270357531592), FRAC_CONST(0.68508366777270036), FRAC_CONST(0.693971460889654), FRAC_CONST(0.7027547444572253), FRAC_CONST(0.71143219574521643), FRAC_CONST(0.72000250796138165), FRAC_CONST(0.7284643904482252), FRAC_CONST(0.73681656887736979), FRAC_CONST(0.74505778544146595), FRAC_CONST(0.75318679904361241), FRAC_CONST(0.76120238548426178), FRAC_CONST(0.76910333764557959), FRAC_CONST(0.77688846567323244), FRAC_CONST(0.78455659715557524), FRAC_CONST(0.79210657730021239), FRAC_CONST(0.79953726910790501), FRAC_CONST(0.80684755354379922), FRAC_CONST(0.8140363297059483), FRAC_CONST(0.82110251499110465), FRAC_CONST(0.8280450452577558), FRAC_CONST(0.83486287498638001), FRAC_CONST(0.84155497743689833), FRAC_CONST(0.84812034480329712), FRAC_CONST(0.85455798836540053), FRAC_CONST(0.86086693863776731), FRAC_CONST(0.86704624551569265), FRAC_CONST(0.87309497841829009), FRAC_CONST(0.87901222642863341), FRAC_CONST(0.88479709843093779), FRAC_CONST(0.89044872324475788), FRAC_CONST(0.89596624975618511), FRAC_CONST(0.90134884704602203), FRAC_CONST(0.90659570451491533), FRAC_CONST(0.91170603200542988), FRAC_CONST(0.9166790599210427), FRAC_CONST(0.9215140393420419), FRAC_CONST(0.92621024213831127), FRAC_CONST(0.93076696107898371), FRAC_CONST(0.9351835099389475), FRAC_CONST(0.93945922360218992), FRAC_CONST(0.94359345816196039), FRAC_CONST(0.94758559101774109), FRAC_CONST(0.95143502096900834), FRAC_CONST(0.95514116830577067), FRAC_CONST(0.9587034748958716), FRAC_CONST(0.96212140426904158), FRAC_CONST(0.9653944416976894), FRAC_CONST(0.96852209427441727), FRAC_CONST(0.97150389098625178), FRAC_CONST(0.97433938278557586), FRAC_CONST(0.97702814265775439), FRAC_CONST(0.97956976568544052), FRAC_CONST(0.98196386910955524), FRAC_CONST(0.98421009238692903), FRAC_CONST(0.98630809724459867), FRAC_CONST(0.98825756773074946), FRAC_CONST(0.99005821026229712), FRAC_CONST(0.99170975366909953), FRAC_CONST(0.9932119492347945), FRAC_CONST(0.99456457073425542), FRAC_CONST(0.99576741446765982), FRAC_CONST(0.99682029929116567), FRAC_CONST(0.99772306664419164), FRAC_CONST(0.99847558057329477), FRAC_CONST(0.99907772775264536), FRAC_CONST(0.99952941750109314), FRAC_CONST(0.9998305817958234), FRAC_CONST(0.99998117528260111), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t ld_mid_480[] = { FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0.0065449379673518581), FRAC_CONST(0.019633692460628301), FRAC_CONST(0.032719082821776137), FRAC_CONST(0.045798866936520771), FRAC_CONST(0.058870803651189033), FRAC_CONST(0.071932653156719387), FRAC_CONST(0.084982177372441667), FRAC_CONST(0.09801714032956059), FRAC_CONST(0.11103530855427769), FRAC_CONST(0.12403445145048532), FRAC_CONST(0.13701234168196802), FRAC_CONST(0.14996675555404498), FRAC_CONST(0.16289547339458874), FRAC_CONST(0.17579627993435451), FRAC_CONST(0.18866696468655525), FRAC_CONST(0.2015053223256171), FRAC_CONST(0.21430915306505074), FRAC_CONST(0.2270762630343732), FRAC_CONST(0.23980446465501654), FRAC_CONST(0.25249157701515795), FRAC_CONST(0.26513542624340797), FRAC_CONST(0.27773384588129219), FRAC_CONST(0.29028467725446233), FRAC_CONST(0.3027857698425746), FRAC_CONST(0.31523498164776964), FRAC_CONST(0.32763017956169349), FRAC_CONST(0.33996923973099424), FRAC_CONST(0.35225004792123354), FRAC_CONST(0.36447049987914965), FRAC_CONST(0.37662850169321077), FRAC_CONST(0.38872197015239557), FRAC_CONST(0.40074883310314097), FRAC_CONST(0.41270702980439467), FRAC_CONST(0.42459451128071307), FRAC_CONST(0.43640924067334208), FRAC_CONST(0.44814919358922256), FRAC_CONST(0.45981235844785984), FRAC_CONST(0.47139673682599764), FRAC_CONST(0.48290034380003727), FRAC_CONST(0.49432120828614462), FRAC_CONST(0.50565737337798455), FRAC_CONST(0.51690689668202761), FRAC_CONST(0.52806785065036799), FRAC_CONST(0.53913832291100017), FRAC_CONST(0.55011641659549337), FRAC_CONST(0.56100025066400983), FRAC_CONST(0.57178796022761225), FRAC_CONST(0.58247769686780215), FRAC_CONST(0.59306762895323706), FRAC_CONST(0.60355594195357143), FRAC_CONST(0.61394083875036642), FRAC_CONST(0.62422053994501758), FRAC_CONST(0.63439328416364549), FRAC_CONST(0.64445732835889735), FRAC_CONST(0.65441094810861034), FRAC_CONST(0.66425243791128175), FRAC_CONST(0.67398011147829784), FRAC_CONST(0.68359230202287125), FRAC_CONST(0.69308736254563585), FRAC_CONST(0.70246366611685174), FRAC_CONST(0.71171960615517138), FRAC_CONST(0.72085359670291882), FRAC_CONST(0.7298640726978356), FRAC_CONST(0.73874949024124625), FRAC_CONST(0.74750832686259672), FRAC_CONST(0.75613908178032285), FRAC_CONST(0.76464027615900032), FRAC_CONST(0.77301045336273699), FRAC_CONST(0.78124817920475853), FRAC_CONST(0.78935204219315003), FRAC_CONST(0.79732065377270711), FRAC_CONST(0.80515264856285829), FRAC_CONST(0.81284668459161513), FRAC_CONST(0.82040144352551359), FRAC_CONST(0.82781563089550203), FRAC_CONST(0.83508797631874299), FRAC_CONST(0.84221723371628654), FRAC_CONST(0.84920218152657889), FRAC_CONST(0.85604162291477137), FRAC_CONST(0.86273438597779184), FRAC_CONST(0.86927932394514362), FRAC_CONST(0.87567531537539967), FRAC_CONST(0.88192126434835494), FRAC_CONST(0.88801610065280734), FRAC_CONST(0.89395877996993212), FRAC_CONST(0.8997482840522214), FRAC_CONST(0.90538362089795521), FRAC_CONST(0.91086382492117568), FRAC_CONST(0.91618795711713596), FRAC_CONST(0.92135510522319242), FRAC_CONST(0.9263643838751181), FRAC_CONST(0.93121493475880346), FRAC_CONST(0.93590592675732565), FRAC_CONST(0.94043655609335486), FRAC_CONST(0.94480604646687805), FRAC_CONST(0.94901364918821385), FRAC_CONST(0.95305864330629697), FRAC_CONST(0.95694033573220882), FRAC_CONST(0.9606580613579353), FRAC_CONST(0.96421118317032928), FRAC_CONST(0.96759909236025976), FRAC_CONST(0.9708212084269281), FRAC_CONST(0.97387697927733363), FRAC_CONST(0.97676588132087239), FRAC_CONST(0.97948741955905139), FRAC_CONST(0.98204112767030394), FRAC_CONST(0.98442656808989171), FRAC_CONST(0.98664333208487898), FRAC_CONST(0.98869103982416728), FRAC_CONST(0.99056934044357725), FRAC_CONST(0.99227791210596705), FRAC_CONST(0.99381646205637808), FRAC_CONST(0.99518472667219682), FRAC_CONST(0.99638247150832537), FRAC_CONST(0.99740949133735191), FRAC_CONST(0.99826561018471593), FRAC_CONST(0.99895068135886012), FRAC_CONST(0.99946458747636568), FRAC_CONST(0.99980724048206482), FRAC_CONST(0.99997858166412923), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }; #endif #endif #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/specrec.c000066400000000000000000001326361374350120500160760ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: specrec.c,v 1.63 2010/06/04 20:47:56 menno Exp $ **/ /* Spectral reconstruction: - grouping/sectioning - inverse quantization - applying scalefactors */ #include "common.h" #include "structs.h" #include #include #include "specrec.h" #include "filtbank.h" #include "syntax.h" #include "iq_table.h" #include "ms.h" #include "is.h" #include "pns.h" #include "tns.h" #include "drc.h" #include "lt_predict.h" #include "ic_predict.h" #ifdef SSR_DEC #include "ssr.h" #include "ssr_fb.h" #endif /* static function declarations */ static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, ic_stream *ics, int16_t *quant_data, real_t *spec_data, uint16_t frame_len); #ifdef LD_DEC ALIGN static const uint8_t num_swb_512_window[] = { 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0 }; ALIGN static const uint8_t num_swb_480_window[] = { 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0 }; #endif ALIGN static const uint8_t num_swb_960_window[] = { 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40 }; ALIGN static const uint8_t num_swb_1024_window[] = { 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 }; ALIGN static const uint8_t num_swb_128_window[] = { 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 }; ALIGN static const uint16_t swb_offset_1024_96[] = { 0, 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 }; ALIGN static const uint16_t swb_offset_128_96[] = { 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 }; ALIGN static const uint16_t swb_offset_1024_64[] = { 0, 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 }; ALIGN static const uint16_t swb_offset_128_64[] = { 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 }; ALIGN static const uint16_t swb_offset_1024_48[] = { 0, 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 }; #ifdef LD_DEC ALIGN static const uint16_t swb_offset_512_48[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, 428, 460, 512 }; ALIGN static const uint16_t swb_offset_480_48[] = { 0, 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, 272, 304, 336, 368, 400, 432, 480 }; #endif ALIGN static const uint16_t swb_offset_128_48[] = { 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 }; ALIGN static const uint16_t swb_offset_1024_32[] = { 0, 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 }; #ifdef LD_DEC ALIGN static const uint16_t swb_offset_512_32[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, 384, 416, 448, 480, 512 }; ALIGN static const uint16_t swb_offset_480_32[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, 384, 416, 448, 480 }; #endif ALIGN static const uint16_t swb_offset_1024_24[] = { 0, 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 }; #ifdef LD_DEC ALIGN static const uint16_t swb_offset_512_24[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512 }; ALIGN static const uint16_t swb_offset_480_24[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 }; #endif ALIGN static const uint16_t swb_offset_128_24[] = { 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 }; ALIGN static const uint16_t swb_offset_1024_16[] = { 0, 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 }; ALIGN static const uint16_t swb_offset_128_16[] = { 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 }; ALIGN static const uint16_t swb_offset_1024_8[] = { 0, 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 }; ALIGN static const uint16_t swb_offset_128_8[] = { 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 }; ALIGN static const uint16_t *swb_offset_1024_window[] = { swb_offset_1024_96, /* 96000 */ swb_offset_1024_96, /* 88200 */ swb_offset_1024_64, /* 64000 */ swb_offset_1024_48, /* 48000 */ swb_offset_1024_48, /* 44100 */ swb_offset_1024_32, /* 32000 */ swb_offset_1024_24, /* 24000 */ swb_offset_1024_24, /* 22050 */ swb_offset_1024_16, /* 16000 */ swb_offset_1024_16, /* 12000 */ swb_offset_1024_16, /* 11025 */ swb_offset_1024_8 /* 8000 */ }; #ifdef LD_DEC ALIGN static const uint16_t *swb_offset_512_window[] = { 0, /* 96000 */ 0, /* 88200 */ 0, /* 64000 */ swb_offset_512_48, /* 48000 */ swb_offset_512_48, /* 44100 */ swb_offset_512_32, /* 32000 */ swb_offset_512_24, /* 24000 */ swb_offset_512_24, /* 22050 */ 0, /* 16000 */ 0, /* 12000 */ 0, /* 11025 */ 0 /* 8000 */ }; ALIGN static const uint16_t *swb_offset_480_window[] = { 0, /* 96000 */ 0, /* 88200 */ 0, /* 64000 */ swb_offset_480_48, /* 48000 */ swb_offset_480_48, /* 44100 */ swb_offset_480_32, /* 32000 */ swb_offset_480_24, /* 24000 */ swb_offset_480_24, /* 22050 */ 0, /* 16000 */ 0, /* 12000 */ 0, /* 11025 */ 0 /* 8000 */ }; #endif ALIGN static const uint16_t *swb_offset_128_window[] = { swb_offset_128_96, /* 96000 */ swb_offset_128_96, /* 88200 */ swb_offset_128_64, /* 64000 */ swb_offset_128_48, /* 48000 */ swb_offset_128_48, /* 44100 */ swb_offset_128_48, /* 32000 */ swb_offset_128_24, /* 24000 */ swb_offset_128_24, /* 22050 */ swb_offset_128_16, /* 16000 */ swb_offset_128_16, /* 12000 */ swb_offset_128_16, /* 11025 */ swb_offset_128_8 /* 8000 */ }; #define bit_set(A, B) ((A) & (1<<(B))) /* 4.5.2.3.4 */ /* - determine the number of windows in a window_sequence named num_windows - determine the number of window_groups named num_window_groups - determine the number of windows in each group named window_group_length[g] - determine the total number of scalefactor window bands named num_swb for the actual window type - determine swb_offset[swb], the offset of the first coefficient in scalefactor window band named swb of the window actually used - determine sect_sfb_offset[g][section],the offset of the first coefficient in section named section. This offset depends on window_sequence and scale_factor_grouping and is needed to decode the spectral_data(). */ uint8_t window_grouping_info(NeAACDecStruct *hDecoder, ic_stream *ics) { uint8_t i, g; uint8_t sf_index = hDecoder->sf_index; switch (ics->window_sequence) { case ONLY_LONG_SEQUENCE: case LONG_START_SEQUENCE: case LONG_STOP_SEQUENCE: ics->num_windows = 1; ics->num_window_groups = 1; ics->window_group_length[ics->num_window_groups-1] = 1; #ifdef LD_DEC if (hDecoder->object_type == LD) { if (hDecoder->frameLength == 512) ics->num_swb = num_swb_512_window[sf_index]; else /* if (hDecoder->frameLength == 480) */ ics->num_swb = num_swb_480_window[sf_index]; } else { #endif if (hDecoder->frameLength == 1024) ics->num_swb = num_swb_1024_window[sf_index]; else /* if (hDecoder->frameLength == 960) */ ics->num_swb = num_swb_960_window[sf_index]; #ifdef LD_DEC } #endif if (ics->max_sfb > ics->num_swb) { return 32; } /* preparation of sect_sfb_offset for long blocks */ /* also copy the last value! */ #ifdef LD_DEC if (hDecoder->object_type == LD) { if (hDecoder->frameLength == 512) { for (i = 0; i < ics->num_swb; i++) { ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; } } else /* if (hDecoder->frameLength == 480) */ { for (i = 0; i < ics->num_swb; i++) { ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; } } ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; ics->swb_offset[ics->num_swb] = hDecoder->frameLength; ics->swb_offset_max = hDecoder->frameLength; } else { #endif for (i = 0; i < ics->num_swb; i++) { ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; } ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; ics->swb_offset[ics->num_swb] = hDecoder->frameLength; ics->swb_offset_max = hDecoder->frameLength; #ifdef LD_DEC } #endif return 0; case EIGHT_SHORT_SEQUENCE: ics->num_windows = 8; ics->num_window_groups = 1; ics->window_group_length[ics->num_window_groups-1] = 1; ics->num_swb = num_swb_128_window[sf_index]; if (ics->max_sfb > ics->num_swb) { return 32; } for (i = 0; i < ics->num_swb; i++) ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; ics->swb_offset_max = hDecoder->frameLength/8; for (i = 0; i < ics->num_windows-1; i++) { if (bit_set(ics->scale_factor_grouping, 6-i) == 0) { ics->num_window_groups += 1; ics->window_group_length[ics->num_window_groups-1] = 1; } else { ics->window_group_length[ics->num_window_groups-1] += 1; } } /* preparation of sect_sfb_offset for short blocks */ for (g = 0; g < ics->num_window_groups; g++) { uint16_t width; uint8_t sect_sfb = 0; uint16_t offset = 0; for (i = 0; i < ics->num_swb; i++) { if (i+1 == ics->num_swb) { width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; } else { width = swb_offset_128_window[sf_index][i+1] - swb_offset_128_window[sf_index][i]; } width *= ics->window_group_length[g]; ics->sect_sfb_offset[g][sect_sfb++] = offset; offset += width; } ics->sect_sfb_offset[g][sect_sfb] = offset; } return 0; default: return 32; } } /* iquant() * /* output = sign(input)*abs(input)^(4/3) */ /**/ static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) { #ifdef FIXED_POINT /* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ /* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not * defined a 1026 value table and interpolation will be used */ #ifndef BIG_IQ_TABLE static const real_t errcorr[] = { REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), REAL_CONST(0) }; real_t x1, x2; #endif int16_t sgn = 1; if (q < 0) { q = -q; sgn = -1; } if (q < IQ_TABLE_SIZE) { //#define IQUANT_PRINT #ifdef IQUANT_PRINT //printf("0x%.8X\n", sgn * tab[q]); printf("%d\n", sgn * tab[q]); #endif return sgn * tab[q]; } #ifndef BIG_IQ_TABLE if (q >= 8192) { *error = 17; return 0; } /* linear interpolation */ x1 = tab[q>>3]; x2 = tab[(q>>3) + 1]; return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); #else *error = 17; return 0; #endif #else if (q < 0) { /* tab contains a value for all possible q [0,8192] */ if (-q < IQ_TABLE_SIZE) return -tab[-q]; *error = 17; return 0; } else { /* tab contains a value for all possible q [0,8192] */ if (q < IQ_TABLE_SIZE) return tab[q]; *error = 17; return 0; } #endif } #ifndef FIXED_POINT ALIGN static const real_t pow2sf_tab[] = { 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, 0.0001220703125, 0.000244140625, 0.00048828125, 0.0009765625, 0.001953125, 0.00390625, 0.0078125, 0.015625, 0.03125, 0.0625, 0.125, 0.25, 0.5, 1.0, 2.0, 4.0, 8.0, 16.0, 32.0, 64.0, 128.0, 256.0, 512.0, 1024.0, 2048.0, 4096.0, 8192.0, 16384.0, 32768.0, 65536.0, 131072.0, 262144.0, 524288.0, 1048576.0, 2097152.0, 4194304.0, 8388608.0, 16777216.0, 33554432.0, 67108864.0, 134217728.0, 268435456.0, 536870912.0, 1073741824.0, 2147483648.0, 4294967296.0, 8589934592.0, 17179869184.0, 34359738368.0, 68719476736.0, 137438953472.0, 274877906944.0 }; #endif /* quant_to_spec: perform dequantisation and scaling * and in case of short block it also does the deinterleaving */ /* For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, window_group_length[0] = 1) the spectral data is in ascending spectral order. For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the grouping in the following manner: - Groups are ordered sequentially - Within a group, a scalefactor band consists of the spectral data of all grouped SHORT_WINDOWs for the associated scalefactor window band. To clarify via example, the length of a group is in the range of one to eight SHORT_WINDOWs. - If there are eight groups each with length one (num_window_groups = 8, window_group_length[0..7] = 1), the result is a sequence of eight spectra, each in ascending spectral order. - If there is only one group with length eight (num_window_groups = 1, window_group_length[0] = 8), the result is that spectral data of all eight SHORT_WINDOWs is interleaved by scalefactor window bands. - Within a scalefactor window band, the coefficients are in ascending spectral order. */ static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, ic_stream *ics, int16_t *quant_data, real_t *spec_data, uint16_t frame_len) { ALIGN static const real_t pow2_table[] = { COEF_CONST(1.0), COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ }; const real_t *tab = iq_table; uint8_t g, sfb, win; uint16_t width, bin, k, gindex, wa, wb; uint8_t error = 0; /* Init error flag */ #ifndef FIXED_POINT real_t scf; #endif k = 0; gindex = 0; for (g = 0; g < ics->num_window_groups; g++) { uint16_t j = 0; uint16_t gincrease = 0; uint16_t win_inc = ics->swb_offset[ics->num_swb]; for (sfb = 0; sfb < ics->num_swb; sfb++) { int32_t exp, frac; width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */ /* just ignore them */ if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255) { exp = 0; frac = 0; } else { /* ics->scale_factors[g][sfb] must be between 0 and 255 */ exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2; /* frac must always be > 0 */ frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3; } #ifdef FIXED_POINT exp -= 25; /* IMDCT pre-scaling */ if (hDecoder->object_type == LD) { exp -= 6 /*9*/; } else { if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) exp -= 4 /*7*/; else exp -= 7 /*10*/; } #endif wa = gindex + j; #ifndef FIXED_POINT scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; #endif for (win = 0; win < ics->window_group_length[g]; win++) { for (bin = 0; bin < width; bin += 4) { #ifndef FIXED_POINT wb = wa + bin; spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; #else real_t iq0 = iquant(quant_data[k+0], tab, &error); real_t iq1 = iquant(quant_data[k+1], tab, &error); real_t iq2 = iquant(quant_data[k+2], tab, &error); real_t iq3 = iquant(quant_data[k+3], tab, &error); wb = wa + bin; if (exp < 0) { spec_data[wb+0] = iq0 >>= -exp; spec_data[wb+1] = iq1 >>= -exp; spec_data[wb+2] = iq2 >>= -exp; spec_data[wb+3] = iq3 >>= -exp; } else { spec_data[wb+0] = iq0 <<= exp; spec_data[wb+1] = iq1 <<= exp; spec_data[wb+2] = iq2 <<= exp; spec_data[wb+3] = iq3 <<= exp; } if (frac != 0) { spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); } //#define SCFS_PRINT #ifdef SCFS_PRINT printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); #endif #endif gincrease += 4; k += 4; } wa += win_inc; } j += width; } gindex += gincrease; } return error; } static uint8_t allocate_single_channel(NeAACDecStruct *hDecoder, uint8_t channel, uint8_t output_channels) { int mul = 1; #ifdef MAIN_DEC /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { /* allocate the state only when needed */ if (hDecoder->pred_stat[channel] != NULL) { faad_free(hDecoder->pred_stat[channel]); hDecoder->pred_stat[channel] = NULL; } hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { /* allocate the state only when needed */ if (hDecoder->lt_pred_stat[channel] != NULL) { faad_free(hDecoder->lt_pred_stat[channel]); hDecoder->lt_pred_stat[channel] = NULL; } hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); } #endif if (hDecoder->time_out[channel] != NULL) { faad_free(hDecoder->time_out[channel]); hDecoder->time_out[channel] = NULL; } { mul = 1; #ifdef SBR_DEC hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) { /* SBR requires 2 times as much output data */ mul = 2; hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; } #endif hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); } #if (defined(PS_DEC) || defined(DRM_PS)) if (output_channels == 2) { if (hDecoder->time_out[channel+1] != NULL) { faad_free(hDecoder->time_out[channel+1]); hDecoder->time_out[channel+1] = NULL; } hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); } #endif if (hDecoder->fb_intermed[channel] != NULL) { faad_free(hDecoder->fb_intermed[channel]); hDecoder->fb_intermed[channel] = NULL; } hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); #ifdef SSR_DEC if (hDecoder->object_type == SSR) { if (hDecoder->ssr_overlap[channel] == NULL) { hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); } if (hDecoder->prev_fmd[channel] == NULL) { uint16_t k; hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); for (k = 0; k < 2*hDecoder->frameLength; k++) hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); } } #endif return 0; } static uint8_t allocate_channel_pair(NeAACDecStruct *hDecoder, uint8_t channel, uint8_t paired_channel) { int mul = 1; #ifdef MAIN_DEC /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { /* allocate the state only when needed */ if (hDecoder->pred_stat[channel] == NULL) { hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); } if (hDecoder->pred_stat[paired_channel] == NULL) { hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); } } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { /* allocate the state only when needed */ if (hDecoder->lt_pred_stat[channel] == NULL) { hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); } if (hDecoder->lt_pred_stat[paired_channel] == NULL) { hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); } } #endif if (hDecoder->time_out[channel] == NULL) { mul = 1; #ifdef SBR_DEC hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) { /* SBR requires 2 times as much output data */ mul = 2; hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; } #endif hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); } if (hDecoder->time_out[paired_channel] == NULL) { hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); } if (hDecoder->fb_intermed[channel] == NULL) { hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); } if (hDecoder->fb_intermed[paired_channel] == NULL) { hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); } #ifdef SSR_DEC if (hDecoder->object_type == SSR) { if (hDecoder->ssr_overlap[cpe->channel] == NULL) { hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); } if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) { hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); } if (hDecoder->prev_fmd[cpe->channel] == NULL) { uint16_t k; hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); for (k = 0; k < 2*hDecoder->frameLength; k++) hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); } if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) { uint16_t k; hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); for (k = 0; k < 2*hDecoder->frameLength; k++) hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); } } #endif return 0; } uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, element *sce, int16_t *spec_data) { uint8_t retval; int output_channels; ALIGN real_t spec_coef[1024]; #ifdef PROFILE int64_t count = faad_get_ts(); #endif /* always allocate 2 channels, PS can always "suddenly" turn up */ #if ( (defined(DRM) && defined(DRM_PS)) ) output_channels = 2; #elif defined(PS_DEC) if (hDecoder->ps_used[hDecoder->fr_ch_ele]) output_channels = 2; else output_channels = 1; #else output_channels = 1; #endif if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) { /* element_output_channels not set yet */ hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { /* element inconsistency */ /* this only happens if PS is actually found but not in the first frame * this means that there is only 1 bitstream element! */ /* reset the allocation */ hDecoder->element_alloced[hDecoder->fr_ch_ele] = 0; hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; //return 21; } if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) { retval = allocate_single_channel(hDecoder, sce->channel, output_channels); if (retval > 0) return retval; hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; } /* sanity check, CVE-2018-20199, CVE-2018-20360 */ if(!hDecoder->time_out[sce->channel]) return 15; if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) return 15; if(!hDecoder->fb_intermed[sce->channel]) return 15; /* dequantisation and scaling */ retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); if (retval > 0) return retval; #ifdef PROFILE count = faad_get_ts() - count; hDecoder->requant_cycles += count; #endif /* pns decoding */ pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, &(hDecoder->__r1), &(hDecoder->__r2)); #ifdef MAIN_DEC /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { if (!hDecoder->pred_stat[sce->channel]) return 33; /* intra channel prediction */ ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, hDecoder->sf_index); /* In addition, for scalefactor bands coded by perceptual noise substitution the predictors belonging to the corresponding spectral coefficients are reset. */ pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { #ifdef LD_DEC if (hDecoder->object_type == LD) { if (ics->ltp.data_present) { if (ics->ltp.lag_update) hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; } ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; } #endif /* long term prediction */ lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, ics->window_shape, hDecoder->window_shape_prev[sce->channel], hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); } #endif /* tns decoding */ tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, spec_coef, hDecoder->frameLength); /* drc decoding */ if (hDecoder->drc->present) { if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) drc_decode(hDecoder->drc, spec_coef); } /* filter bank */ #ifdef SSR_DEC if (hDecoder->object_type != SSR) { #endif ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], hDecoder->object_type, hDecoder->frameLength); #ifdef SSR_DEC } else { ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], hDecoder->frameLength); } #endif /* save window shape for next frame */ hDecoder->window_shape_prev[sce->channel] = ics->window_shape; #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); } #endif #ifdef SBR_DEC if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { int ele = hDecoder->fr_ch_ele; int ch = sce->channel; /* following case can happen when forceUpSampling == 1 */ if (hDecoder->sbr[ele] == NULL) { hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), hDecoder->downSampledSBR #ifdef DRM , 0 #endif ); } if (!hDecoder->sbr[ele]) return 19; if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); else hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); /* check if any of the PS tools is used */ #if (defined(PS_DEC) || defined(DRM_PS)) if (hDecoder->ps_used[ele] == 0) { #endif retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); #if (defined(PS_DEC) || defined(DRM_PS)) } else { retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); } #endif if (retval > 0) return retval; } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { return 23; } #endif /* copy L to R when no PS is used */ #if (defined(PS_DEC) || defined(DRM_PS)) if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) { int ele = hDecoder->fr_ch_ele; int ch = sce->channel; int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; frame_size *= hDecoder->frameLength*sizeof(real_t); memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); } #endif return 0; } uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, element *cpe, int16_t *spec_data1, int16_t *spec_data2) { uint8_t retval; ALIGN real_t spec_coef1[1024]; ALIGN real_t spec_coef2[1024]; #ifdef PROFILE int64_t count = faad_get_ts(); #endif if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) { retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); if (retval > 0) return retval; hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; } /* sanity check, CVE-2018-20199, CVE-2018-20360 */ if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) return 15; if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) return 15; /* dequantisation and scaling */ retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); if (retval > 0) return retval; retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); if (retval > 0) return retval; #ifdef PROFILE count = faad_get_ts() - count; hDecoder->requant_cycles += count; #endif /* pns decoding */ if (ics1->ms_mask_present) { pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, &(hDecoder->__r1), &(hDecoder->__r2)); } else { pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, &(hDecoder->__r1), &(hDecoder->__r2)); } /* mid/side decoding */ ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); #if 0 { int i; for (i = 0; i < 1024; i++) { //printf("%d\n", spec_coef1[i]); printf("0x%.8X\n", spec_coef1[i]); } for (i = 0; i < 1024; i++) { //printf("%d\n", spec_coef2[i]); printf("0x%.8X\n", spec_coef2[i]); } } #endif /* intensity stereo decoding */ is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); #if 0 { int i; for (i = 0; i < 1024; i++) { printf("%d\n", spec_coef1[i]); //printf("0x%.8X\n", spec_coef1[i]); } for (i = 0; i < 1024; i++) { printf("%d\n", spec_coef2[i]); //printf("0x%.8X\n", spec_coef2[i]); } } #endif #ifdef MAIN_DEC /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { /* intra channel prediction */ ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, hDecoder->sf_index); ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, hDecoder->sf_index); /* In addition, for scalefactor bands coded by perceptual noise substitution the predictors belonging to the corresponding spectral coefficients are reset. */ pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { ltp_info *ltp1 = &(ics1->ltp); ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); #ifdef LD_DEC if (hDecoder->object_type == LD) { if (ltp1->data_present) { if (ltp1->lag_update) hDecoder->ltp_lag[cpe->channel] = ltp1->lag; } ltp1->lag = hDecoder->ltp_lag[cpe->channel]; if (ltp2->data_present) { if (ltp2->lag_update) hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; } ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; } #endif /* long term prediction */ lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); } #endif /* tns decoding */ tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, spec_coef1, hDecoder->frameLength); tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, spec_coef2, hDecoder->frameLength); /* drc decoding */ if (hDecoder->drc->present) { if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) drc_decode(hDecoder->drc, spec_coef1); if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) drc_decode(hDecoder->drc, spec_coef2); } /* filter bank */ #ifdef SSR_DEC if (hDecoder->object_type != SSR) { #endif ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], hDecoder->object_type, hDecoder->frameLength); ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], hDecoder->object_type, hDecoder->frameLength); #ifdef SSR_DEC } else { ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); } #endif /* save window shape for next frame */ hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); } #endif #ifdef SBR_DEC if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { int ele = hDecoder->fr_ch_ele; int ch0 = cpe->channel; int ch1 = cpe->paired_channel; /* following case can happen when forceUpSampling == 1 */ if (hDecoder->sbr[ele] == NULL) { hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), hDecoder->downSampledSBR #ifdef DRM , 0 #endif ); } if (!hDecoder->sbr[ele]) return 19; if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); else hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch0], hDecoder->time_out[ch1], hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); if (retval > 0) return retval; } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { return 23; } #endif return 0; } faad2-2_10_0/libfaad/specrec.h000066400000000000000000000034601374350120500160730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: specrec.h,v 1.33 2009/01/26 23:51:15 menno Exp $ **/ #ifndef __SPECREC_H__ #define __SPECREC_H__ #ifdef __cplusplus extern "C" { #endif #include "syntax.h" uint8_t window_grouping_info(NeAACDecStruct *hDecoder, ic_stream *ics); uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, element *cpe, int16_t *spec_data1, int16_t *spec_data2); uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, element *sce, int16_t *spec_data); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ssr.c000066400000000000000000000134421374350120500152520ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr.c,v 1.19 2007/11/01 12:33:36 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SSR_DEC #include "syntax.h" #include "filtbank.h" #include "ssr.h" #include "ssr_fb.h" void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, real_t ipqf_buffer[SSR_BANDS][96/4], real_t *prev_fmd, uint16_t frame_len) { uint8_t band; uint16_t ssr_frame_len = frame_len/SSR_BANDS; real_t time_tmp[2048] = {0}; real_t output[1024] = {0}; for (band = 0; band < SSR_BANDS; band++) { int16_t j; /* uneven bands have inverted frequency scale */ if (band == 1 || band == 3) { for (j = 0; j < ssr_frame_len/2; j++) { real_t tmp; tmp = freq_in[j + ssr_frame_len*band]; freq_in[j + ssr_frame_len*band] = freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band]; freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band] = tmp; } } /* non-overlapping inverse filterbank for SSR */ ssr_ifilter_bank(fb, window_sequence, window_shape, window_shape_prev, freq_in + band*ssr_frame_len, time_tmp + band*ssr_frame_len, ssr_frame_len); /* gain control */ ssr_gain_control(ssr, time_tmp, output, overlap, prev_fmd, band, window_sequence, ssr_frame_len); } /* inverse pqf to bring subbands together again */ ssr_ipqf(ssr, output, time_out, ipqf_buffer, frame_len, SSR_BANDS); } static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, real_t *overlap, real_t *prev_fmd, uint8_t band, uint8_t window_sequence, uint16_t frame_len) { uint16_t i; real_t gc_function[2*1024/SSR_BANDS]; if (window_sequence != EIGHT_SHORT_SEQUENCE) { ssr_gc_function(ssr, &prev_fmd[band * frame_len*2], gc_function, window_sequence, band, frame_len); for (i = 0; i < frame_len*2; i++) data[band * frame_len*2 + i] *= gc_function[i]; for (i = 0; i < frame_len; i++) { output[band*frame_len + i] = overlap[band*frame_len + i] + data[band*frame_len*2 + i]; } for (i = 0; i < frame_len; i++) { overlap[band*frame_len + i] = data[band*frame_len*2 + frame_len + i]; } } else { uint8_t w; for (w = 0; w < 8; w++) { uint16_t frame_len8 = frame_len/8; uint16_t frame_len16 = frame_len/16; ssr_gc_function(ssr, &prev_fmd[band*frame_len*2 + w*frame_len*2/8], gc_function, window_sequence, frame_len); for (i = 0; i < frame_len8*2; i++) data[band*frame_len*2 + w*frame_len8*2+i] *= gc_function[i]; for (i = 0; i < frame_len8; i++) { overlap[band*frame_len + i + 7*frame_len16 + w*frame_len8] += data[band*frame_len*2 + 2*w*frame_len8 + i]; } for (i = 0; i < frame_len8; i++) { overlap[band*frame_len + i + 7*frame_len16 + (w+1)*frame_len8] = data[band*frame_len*2 + 2*w*frame_len8 + frame_len8 + i]; } } for (i = 0; i < frame_len; i++) output[band*frame_len + i] = overlap[band*frame_len + i]; for (i = 0; i < frame_len; i++) overlap[band*frame_len + i] = overlap[band*frame_len + i + frame_len]; } } static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, real_t *gc_function, uint8_t window_sequence, uint8_t band, uint16_t frame_len) { uint16_t i; uint16_t len_area1, len_area2; int32_t aloc[10]; real_t alev[10]; switch (window_sequence) { case ONLY_LONG_SEQUENCE: len_area1 = frame_len/SSR_BANDS; len_area2 = 0; break; case LONG_START_SEQUENCE: len_area1 = (frame_len/SSR_BANDS)*7/32; len_area2 = (frame_len/SSR_BANDS)/16; break; case EIGHT_SHORT_SEQUENCE: len_area1 = (frame_len/8)/SSR_BANDS; len_area2 = 0; break; case LONG_STOP_SEQUENCE: len_area1 = (frame_len/SSR_BANDS); len_area2 = 0; break; } /* decode bitstream information */ /* build array M */ for (i = 0; i < frame_len*2; i++) gc_function[i] = 1; } #endif faad2-2_10_0/libfaad/ssr.h000066400000000000000000000041741374350120500152610ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr.h,v 1.19 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SSR_H__ #define __SSR_H__ #ifdef __cplusplus extern "C" { #endif #define SSR_BANDS 4 #define PQFTAPS 96 void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, real_t ipqf_buffer[SSR_BANDS][96/4], real_t *prev_fmd, uint16_t frame_len); static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, real_t *overlap, real_t *prev_fmd, uint8_t band, uint8_t window_sequence, uint16_t frame_len); static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, real_t *gc_function, uint8_t window_sequence, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ssr_fb.c000066400000000000000000000152611374350120500157220ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_fb.c,v 1.17 2007/11/01 12:33:36 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SSR_DEC #include #include #include "syntax.h" #include "filtbank.h" #include "mdct.h" #include "ssr_fb.h" #include "ssr_win.h" fb_info *ssr_filter_bank_init(uint16_t frame_len) { uint16_t nshort = frame_len/8; fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); memset(fb, 0, sizeof(fb_info)); /* normal */ fb->mdct256 = faad_mdct_init(2*nshort); fb->mdct2048 = faad_mdct_init(2*frame_len); fb->long_window[0] = sine_long_256; fb->short_window[0] = sine_short_32; fb->long_window[1] = kbd_long_256; fb->short_window[1] = kbd_short_32; return fb; } void ssr_filter_bank_end(fb_info *fb) { faad_mdct_end(fb->mdct256); faad_mdct_end(fb->mdct2048); if (fb) faad_free(fb); } static INLINE void imdct_ssr(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { mdct_info *mdct; switch (len) { case 512: mdct = fb->mdct2048; break; case 64: mdct = fb->mdct256; break; } faad_imdct(mdct, in_data, out_data); } /* NON-overlapping inverse filterbank for use with SSR */ void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, uint16_t frame_len) { int16_t i; real_t *transf_buf; real_t *window_long; real_t *window_long_prev; real_t *window_short; real_t *window_short_prev; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; uint16_t trans = nshort/2; uint16_t nflat_ls = (nlong-nshort)/2; transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t)); window_long = fb->long_window[window_shape]; window_long_prev = fb->long_window[window_shape_prev]; window_short = fb->short_window[window_shape]; window_short_prev = fb->short_window[window_shape_prev]; switch (window_sequence) { case ONLY_LONG_SEQUENCE: imdct_ssr(fb, freq_in, transf_buf, 2*nlong); for (i = nlong-1; i >= 0; i--) { time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); } break; case LONG_START_SEQUENCE: imdct_ssr(fb, freq_in, transf_buf, 2*nlong); for (i = 0; i < nlong; i++) time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); for (i = 0; i < nflat_ls; i++) time_out[nlong+i] = transf_buf[nlong+i]; for (i = 0; i < nshort; i++) time_out[nlong+nflat_ls+i] = MUL_R_C(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); for (i = 0; i < nflat_ls; i++) time_out[nlong+nflat_ls+nshort+i] = 0; break; case EIGHT_SHORT_SEQUENCE: imdct_ssr(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort); imdct_ssr(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort); imdct_ssr(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort); imdct_ssr(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort); imdct_ssr(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort); imdct_ssr(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort); imdct_ssr(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort); imdct_ssr(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort); for(i = nshort-1; i >= 0; i--) { time_out[i+0*nshort] = MUL_R_C(transf_buf[nshort*0+i],window_short_prev[i]); time_out[i+1*nshort] = MUL_R_C(transf_buf[nshort*1+i],window_short[i]); time_out[i+2*nshort] = MUL_R_C(transf_buf[nshort*2+i],window_short_prev[i]); time_out[i+3*nshort] = MUL_R_C(transf_buf[nshort*3+i],window_short[i]); time_out[i+4*nshort] = MUL_R_C(transf_buf[nshort*4+i],window_short_prev[i]); time_out[i+5*nshort] = MUL_R_C(transf_buf[nshort*5+i],window_short[i]); time_out[i+6*nshort] = MUL_R_C(transf_buf[nshort*6+i],window_short_prev[i]); time_out[i+7*nshort] = MUL_R_C(transf_buf[nshort*7+i],window_short[i]); time_out[i+8*nshort] = MUL_R_C(transf_buf[nshort*8+i],window_short_prev[i]); time_out[i+9*nshort] = MUL_R_C(transf_buf[nshort*9+i],window_short[i]); time_out[i+10*nshort] = MUL_R_C(transf_buf[nshort*10+i],window_short_prev[i]); time_out[i+11*nshort] = MUL_R_C(transf_buf[nshort*11+i],window_short[i]); time_out[i+12*nshort] = MUL_R_C(transf_buf[nshort*12+i],window_short_prev[i]); time_out[i+13*nshort] = MUL_R_C(transf_buf[nshort*13+i],window_short[i]); time_out[i+14*nshort] = MUL_R_C(transf_buf[nshort*14+i],window_short_prev[i]); time_out[i+15*nshort] = MUL_R_C(transf_buf[nshort*15+i],window_short[i]); } break; case LONG_STOP_SEQUENCE: imdct_ssr(fb, freq_in, transf_buf, 2*nlong); for (i = 0; i < nflat_ls; i++) time_out[i] = 0; for (i = 0; i < nshort; i++) time_out[nflat_ls+i] = MUL_R_C(transf_buf[nflat_ls+i],window_short_prev[i]); for (i = 0; i < nflat_ls; i++) time_out[nflat_ls+nshort+i] = transf_buf[nflat_ls+nshort+i]; for (i = 0; i < nlong; i++) time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); break; } faad_free(transf_buf); } #endif faad2-2_10_0/libfaad/ssr_fb.h000066400000000000000000000035061374350120500157260ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_fb.h,v 1.16 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SSR_FB_H__ #define __SSR_FB_H__ #ifdef __cplusplus extern "C" { #endif fb_info *ssr_filter_bank_init(uint16_t frame_len); void ssr_filter_bank_end(fb_info *fb); /*non overlapping inverse filterbank */ void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ssr_ipqf.c000066400000000000000000000140751374350120500162740ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_ipqf.c,v 1.18 2007/11/01 12:33:39 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SSR_DEC #include "ssr.h" #include "ssr_ipqf.h" static real_t **app_pqfbuf; static real_t **pp_q0, **pp_t0, **pp_t1; void gc_set_protopqf(real_t *p_proto) { int j; static real_t a_half[48] = { 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05, -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04, -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04, -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04, 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03, 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04, -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03, -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03, -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03, 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03, 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03, -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02, -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02, -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02, 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02, 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012 }; for (j = 0; j < 48; ++j) { p_proto[j] = p_proto[95-j] = a_half[j]; } } void gc_setcoef_eff_pqfsyn(int mm, int kk, real_t *p_proto, real_t ***ppp_q0, real_t ***ppp_t0, real_t ***ppp_t1) { int i, k, n; real_t w; /* Set 1st Mul&Acc Coef's */ *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *)); for (n = 0; n < mm; ++n) { (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t)); } for (n = 0; n < mm/2; ++n) { for (i = 0; i < mm; ++i) { w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm); (*ppp_q0)[n][i] = 2.0 * cos((real_t) w); w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm); (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w); } } /* Set 2nd Mul&Acc Coef's */ *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *)); *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *)); for (n = 0; n < mm; ++n) { (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t)); (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t)); } for (n = 0; n < mm; ++n) { for (k = 0; k < kk; ++k) { (*ppp_t0)[n][k] = mm * p_proto[2*k *mm + n]; (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n]; if (k%2 != 0) { (*ppp_t0)[n][k] = -(*ppp_t0)[n][k]; (*ppp_t1)[n][k] = -(*ppp_t1)[n][k]; } } } } void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, real_t buffer[SSR_BANDS][96/4], uint16_t frame_len, uint8_t bands) { static int initFlag = 0; real_t a_pqfproto[PQFTAPS]; int i; if (initFlag == 0) { gc_set_protopqf(a_pqfproto); gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto, &pp_q0, &pp_t0, &pp_t1); initFlag = 1; } for (i = 0; i < frame_len / SSR_BANDS; i++) { int l, n, k; int mm = SSR_BANDS; int kk = PQFTAPS/(2*SSR_BANDS); for (n = 0; n < mm; n++) { for (k = 0; k < 2*kk-1; k++) { buffer[n][k] = buffer[n][k+1]; } } for (n = 0; n < mm; n++) { real_t acc = 0.0; for (l = 0; l < mm; l++) { acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i]; } buffer[n][2*kk-1] = acc; } for (n = 0; n < mm/2; n++) { real_t acc = 0.0; for (k = 0; k < kk; k++) { acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k]; } for (k = 0; k < kk; ++k) { acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k]; } out_data[i*SSR_BANDS + n] = acc; acc = 0.0; for (k = 0; k < kk; k++) { acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k]; } for (k = 0; k < kk; k++) { acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k]; } out_data[i*SSR_BANDS + mm-1-n] = acc; } } } #endif faad2-2_10_0/libfaad/ssr_ipqf.h000066400000000000000000000031011374350120500162650ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_ipqf.h,v 1.17 2007/11/01 12:33:39 menno Exp $ **/ #ifndef __SSR_IPQF_H__ #define __SSR_IPQF_H__ #ifdef __cplusplus extern "C" { #endif void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, real_t buffer[SSR_BANDS][96/4], uint16_t frame_len, uint8_t bands); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/ssr_win.h000066400000000000000000000327031374350120500161350ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_win.h,v 1.16 2007/11/01 12:33:39 menno Exp $ **/ #ifndef __SSR_WIN_H__ #define __SSR_WIN_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif static real_t sine_short_32[] = { 0.0245412290, 0.0735645667, 0.1224106774, 0.1709618866, 0.2191012502, 0.2667127550, 0.3136817515, 0.3598950505, 0.4052413106, 0.4496113360, 0.4928981960, 0.5349976420, 0.5758082271, 0.6152316332, 0.6531728506, 0.6895405650, 0.7242470980, 0.7572088838, 0.7883464694, 0.8175848126, 0.8448535800, 0.8700870275, 0.8932242990, 0.9142097831, 0.9329928160, 0.9495282173, 0.9637760520, 0.9757021666, 0.9852776527, 0.9924795628, 0.9972904325, 0.9996988177 }; static real_t sine_long_256[] = { 0.0030679568, 0.0092037553, 0.0153392069, 0.0214740802, 0.0276081469, 0.0337411724, 0.0398729295, 0.0460031852, 0.0521317050, 0.0582582653, 0.0643826351, 0.0705045760, 0.0766238645, 0.0827402696, 0.0888535529, 0.0949634984, 0.1010698676, 0.1071724296, 0.1132709533, 0.1193652153, 0.1254549921, 0.1315400302, 0.1376201212, 0.1436950415, 0.1497645378, 0.1558284014, 0.1618863940, 0.1679383069, 0.1739838719, 0.1800229102, 0.1860551536, 0.1920804083, 0.1980984211, 0.2041089684, 0.2101118416, 0.2161068022, 0.2220936269, 0.2280720919, 0.2340419590, 0.2400030345, 0.2459550500, 0.2518978119, 0.2578310966, 0.2637546957, 0.2696683407, 0.2755718231, 0.2814649343, 0.2873474658, 0.2932191789, 0.2990798354, 0.3049292266, 0.3107671738, 0.3165933788, 0.3224076927, 0.3282098472, 0.3339996636, 0.3397769034, 0.3455413282, 0.3512927592, 0.3570309579, 0.3627557456, 0.3684668541, 0.3741640747, 0.3798472285, 0.3855160773, 0.3911703825, 0.3968099952, 0.4024346471, 0.4080441594, 0.4136383235, 0.4192169011, 0.4247796834, 0.4303264916, 0.4358570874, 0.4413712919, 0.4468688369, 0.4523496032, 0.4578133225, 0.4632597864, 0.4686888456, 0.4741002321, 0.4794937670, 0.4848692715, 0.4902265072, 0.4955652654, 0.5008853674, 0.5061866641, 0.5114688873, 0.5167317986, 0.5219752789, 0.5271991491, 0.5324031115, 0.5375871062, 0.5427507758, 0.5478940606, 0.5530167222, 0.5581185222, 0.5631993413, 0.5682589412, 0.5732972026, 0.5783138275, 0.5833086967, 0.5882815719, 0.5932323337, 0.5981607437, 0.6030666232, 0.6079497933, 0.6128100753, 0.6176473498, 0.6224613190, 0.6272518039, 0.6320187449, 0.6367619038, 0.6414810419, 0.6461760402, 0.6508467197, 0.6554928422, 0.6601143479, 0.6647109985, 0.6692826152, 0.6738290191, 0.6783500314, 0.6828455329, 0.6873153448, 0.6917592883, 0.6961771250, 0.7005687952, 0.7049341202, 0.7092728615, 0.7135848999, 0.7178700566, 0.7221282125, 0.7263591886, 0.7305628061, 0.7347388864, 0.7388873696, 0.7430079579, 0.7471006513, 0.7511651516, 0.7552013993, 0.7592092156, 0.7631884217, 0.7671388984, 0.7710605264, 0.7749531269, 0.7788165212, 0.7826505899, 0.7864552140, 0.7902302146, 0.7939754725, 0.7976908684, 0.8013761640, 0.8050313592, 0.8086562157, 0.8122506142, 0.8158144355, 0.8193475604, 0.8228498101, 0.8263210654, 0.8297612667, 0.8331701756, 0.8365477324, 0.8398938179, 0.8432082534, 0.8464909792, 0.8497417569, 0.8529606462, 0.8561473489, 0.8593018055, 0.8624239564, 0.8655136228, 0.8685707450, 0.8715950847, 0.8745866418, 0.8775452971, 0.8804709315, 0.8833633661, 0.8862225413, 0.8890483975, 0.8918406963, 0.8945994973, 0.8973246217, 0.9000158906, 0.9026733041, 0.9052967429, 0.9078861475, 0.9104412794, 0.9129621983, 0.9154487252, 0.9179008007, 0.9203183055, 0.9227011204, 0.9250492454, 0.9273625612, 0.9296408892, 0.9318842888, 0.9340925813, 0.9362657070, 0.9384035468, 0.9405061007, 0.9425731897, 0.9446048737, 0.9466009140, 0.9485613704, 0.9504860640, 0.9523749948, 0.9542281032, 0.9560452700, 0.9578264356, 0.9595715404, 0.9612805247, 0.9629532695, 0.9645897746, 0.9661900401, 0.9677538276, 0.9692812562, 0.9707721472, 0.9722265005, 0.9736442566, 0.9750253558, 0.9763697386, 0.9776773453, 0.9789481759, 0.9801821709, 0.9813792109, 0.9825392962, 0.9836624265, 0.9847484827, 0.9857975245, 0.9868094325, 0.9877841473, 0.9887216687, 0.9896219969, 0.9904850721, 0.9913108945, 0.9920993447, 0.9928504229, 0.9935641289, 0.9942404628, 0.9948793054, 0.9954807758, 0.9960446954, 0.9965711236, 0.9970600605, 0.9975114465, 0.9979252815, 0.9983015656, 0.9986402392, 0.9989413023, 0.9992047548, 0.9994305968, 0.9996188283, 0.9997693896, 0.9998823404, 0.9999576211, 0.9999952912 }; static real_t kbd_short_32[] = { 0.0000875914060105, 0.0009321760265333, 0.0032114611466596, 0.0081009893216786, 0.0171240286619181, 0.0320720743527833, 0.0548307856028528, 0.0871361822564870, 0.1302923415174603, 0.1848955425508276, 0.2506163195331889, 0.3260874142923209, 0.4089316830907141, 0.4959414909423747, 0.5833939894958904, 0.6674601983218376, 0.7446454751465113, 0.8121892962974020, 0.8683559394406505, 0.9125649996381605, 0.9453396205809574, 0.9680864942677585, 0.9827581789763112, 0.9914756203467121, 0.9961964092194694, 0.9984956609571091, 0.9994855586984285, 0.9998533730714648, 0.9999671864476404, 0.9999948432453556, 0.9999995655238333, 0.9999999961638728 }; static real_t kbd_long_256[] = { 0.0005851230124487, 0.0009642149851497, 0.0013558207534965, 0.0017771849644394, 0.0022352533849672, 0.0027342299070304, 0.0032773001022195, 0.0038671998069216, 0.0045064443384152, 0.0051974336885144, 0.0059425050016407, 0.0067439602523141, 0.0076040812644888, 0.0085251378135895, 0.0095093917383048, 0.0105590986429280, 0.0116765080854300, 0.0128638627792770, 0.0141233971318631, 0.0154573353235409, 0.0168678890600951, 0.0183572550877256, 0.0199276125319803, 0.0215811201042484, 0.0233199132076965, 0.0251461009666641, 0.0270617631981826, 0.0290689473405856, 0.0311696653515848, 0.0333658905863535, 0.0356595546648444, 0.0380525443366107, 0.0405466983507029, 0.0431438043376910, 0.0458455957104702, 0.0486537485902075, 0.0515698787635492, 0.0545955386770205, 0.0577322144743916, 0.0609813230826460, 0.0643442093520723, 0.0678221432558827, 0.0714163171546603, 0.0751278431308314, 0.0789577503982528, 0.0829069827918993, 0.0869763963425241, 0.0911667569410503, 0.0954787380973307, 0.0999129187977865, 0.1044697814663005, 0.1091497100326053, 0.1139529881122542, 0.1188797973021148, 0.1239302155951605, 0.1291042159181728, 0.1344016647957880, 0.1398223211441467, 0.1453658351972151, 0.1510317475686540, 0.1568194884519144, 0.1627283769610327, 0.1687576206143887, 0.1749063149634756, 0.1811734433685097, 0.1875578769224857, 0.1940583745250518, 0.2006735831073503, 0.2074020380087318, 0.2142421635060113, 0.2211922734956977, 0.2282505723293797, 0.2354151558022098, 0.2426840122941792, 0.2500550240636293, 0.2575259686921987, 0.2650945206801527, 0.2727582531907993, 0.2805146399424422, 0.2883610572460804, 0.2962947861868143, 0.3043130149466800, 0.3124128412663888, 0.3205912750432127, 0.3288452410620226, 0.3371715818562547, 0.3455670606953511, 0.3540283646950029, 0.3625521080463003, 0.3711348353596863, 0.3797730251194006, 0.3884630932439016, 0.3972013967475546, 0.4059842374986933, 0.4148078660689724, 0.4236684856687616, 0.4325622561631607, 0.4414852981630577, 0.4504336971855032, 0.4594035078775303, 0.4683907582974173, 0.4773914542472655, 0.4864015836506502, 0.4954171209689973, 0.5044340316502417, 0.5134482766032377, 0.5224558166913167, 0.5314526172383208, 0.5404346525403849, 0.5493979103766972, 0.5583383965124314, 0.5672521391870222, 0.5761351935809411, 0.5849836462541291, 0.5937936195492526, 0.6025612759529649, 0.6112828224083939, 0.6199545145721097, 0.6285726610088878, 0.6371336273176413, 0.6456338401819751, 0.6540697913388968, 0.6624380414593221, 0.6707352239341151, 0.6789580485595255, 0.6871033051160131, 0.6951678668345944, 0.7031486937449871, 0.7110428359000029, 0.7188474364707993, 0.7265597347077880, 0.7341770687621900, 0.7416968783634273, 0.7491167073477523, 0.7564342060337386, 0.7636471334404891, 0.7707533593446514, 0.7777508661725849, 0.7846377507242818, 0.7914122257259034, 0.7980726212080798, 0.8046173857073919, 0.8110450872887550, 0.8173544143867162, 0.8235441764639875, 0.8296133044858474, 0.8355608512093652, 0.8413859912867303, 0.8470880211822968, 0.8526663589032990, 0.8581205435445334, 0.8634502346476508, 0.8686552113760616, 0.8737353715068081, 0.8786907302411250, 0.8835214188357692, 0.8882276830575707, 0.8928098814640207, 0.8972684835130879, 0.9016040675058185, 0.9058173183656508, 0.9099090252587376, 0.9138800790599416, 0.9177314696695282, 0.9214642831859411, 0.9250796989403991, 0.9285789863994010, 0.9319635019415643, 0.9352346855155568, 0.9383940571861993, 0.9414432135761304, 0.9443838242107182, 0.9472176277741918, 0.9499464282852282, 0.9525720912004834, 0.9550965394547873, 0.9575217494469370, 0.9598497469802043, 0.9620826031668507, 0.9642224303060783, 0.9662713777449607, 0.9682316277319895, 0.9701053912729269, 0.9718949039986892, 0.9736024220549734, 0.9752302180233160, 0.9767805768831932, 0.9782557920246753, 0.9796581613210076, 0.9809899832703159, 0.9822535532154261, 0.9834511596505429, 0.9845850806232530, 0.9856575802399989, 0.9866709052828243, 0.9876272819448033, 0.9885289126911557, 0.9893779732525968, 0.9901766097569984, 0.9909269360049311, 0.9916310308941294, 0.9922909359973702, 0.9929086532976777, 0.9934861430841844, 0.9940253220113651, 0.9945280613237534, 0.9949961852476154, 0.9954314695504363, 0.9958356402684387, 0.9962103726017252, 0.9965572899760172, 0.9968779632693499, 0.9971739102014799, 0.9974465948831872, 0.9976974275220812, 0.9979277642809907, 0.9981389072844972, 0.9983321047686901, 0.9985085513687731, 0.9986693885387259, 0.9988157050968516, 0.9989485378906924, 0.9990688725744943, 0.9991776444921379, 0.9992757396582338, 0.9993639958299003, 0.9994432036616085, 0.9995141079353859, 0.9995774088586188, 0.9996337634216871, 0.9996837868076957, 0.9997280538466377, 0.9997671005064359, 0.9998014254134544, 0.9998314913952471, 0.9998577270385304, 0.9998805282555989, 0.9999002598526793, 0.9999172570940037, 0.9999318272557038, 0.9999442511639580, 0.9999547847121726, 0.9999636603523446, 0.9999710885561258, 0.9999772592414866, 0.9999823431612708, 0.9999864932503106, 0.9999898459281599, 0.9999925223548691, 0.9999946296375997, 0.9999962619864214, 0.9999975018180320, 0.9999984208055542, 0.9999990808746198, 0.9999995351446231, 0.9999998288155155 }; #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/structs.h000066400000000000000000000244231374350120500161600ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: structs.h,v 1.49 2009/01/26 23:51:15 menno Exp $ **/ #ifndef __STRUCTS_H__ #define __STRUCTS_H__ #ifdef __cplusplus extern "C" { #endif #include "cfft.h" #ifdef SBR_DEC #include "sbr_dec.h" #endif #define MAX_CHANNELS 64 #define MAX_SYNTAX_ELEMENTS 48 #define MAX_WINDOW_GROUPS 8 #define MAX_SFB 51 #define MAX_LTP_SFB 40 #define MAX_LTP_SFB_S 8 /* used to save the prediction state */ typedef struct { int16_t r[2]; int16_t COR[2]; int16_t VAR[2]; } pred_state; typedef struct { uint16_t N; cfft_info *cfft; complex_t *sincos; #ifdef PROFILE int64_t cycles; int64_t fft_cycles; #endif } mdct_info; typedef struct { const real_t *long_window[2]; const real_t *short_window[2]; #ifdef LD_DEC const real_t *ld_window[2]; #endif mdct_info *mdct256; #ifdef LD_DEC mdct_info *mdct1024; #endif mdct_info *mdct2048; #ifdef PROFILE int64_t cycles; #endif } fb_info; typedef struct { uint8_t present; uint8_t num_bands; uint8_t pce_instance_tag; uint8_t excluded_chns_present; uint8_t band_top[17]; uint8_t prog_ref_level; uint8_t dyn_rng_sgn[17]; uint8_t dyn_rng_ctl[17]; uint8_t exclude_mask[MAX_CHANNELS]; uint8_t additional_excluded_chns[MAX_CHANNELS]; real_t ctrl1; real_t ctrl2; } drc_info; typedef struct { uint8_t element_instance_tag; uint8_t object_type; uint8_t sf_index; uint8_t num_front_channel_elements; uint8_t num_side_channel_elements; uint8_t num_back_channel_elements; uint8_t num_lfe_channel_elements; uint8_t num_assoc_data_elements; uint8_t num_valid_cc_elements; uint8_t mono_mixdown_present; uint8_t mono_mixdown_element_number; uint8_t stereo_mixdown_present; uint8_t stereo_mixdown_element_number; uint8_t matrix_mixdown_idx_present; uint8_t pseudo_surround_enable; uint8_t matrix_mixdown_idx; uint8_t front_element_is_cpe[16]; uint8_t front_element_tag_select[16]; uint8_t side_element_is_cpe[16]; uint8_t side_element_tag_select[16]; uint8_t back_element_is_cpe[16]; uint8_t back_element_tag_select[16]; uint8_t lfe_element_tag_select[16]; uint8_t assoc_data_element_tag_select[16]; uint8_t cc_element_is_ind_sw[16]; uint8_t valid_cc_element_tag_select[16]; uint8_t channels; uint8_t comment_field_bytes; uint8_t comment_field_data[257]; /* extra added values */ uint8_t num_front_channels; uint8_t num_side_channels; uint8_t num_back_channels; uint8_t num_lfe_channels; uint8_t sce_channel[16]; uint8_t cpe_channel[16]; } program_config; typedef struct { uint16_t syncword; uint8_t id; uint8_t layer; uint8_t protection_absent; uint8_t profile; uint8_t sf_index; uint8_t private_bit; uint8_t channel_configuration; uint8_t original; uint8_t home; uint8_t emphasis; uint8_t copyright_identification_bit; uint8_t copyright_identification_start; uint16_t aac_frame_length; uint16_t adts_buffer_fullness; uint8_t no_raw_data_blocks_in_frame; uint16_t crc_check; /* control param */ uint8_t old_format; } adts_header; typedef struct { uint8_t copyright_id_present; int8_t copyright_id[10]; uint8_t original_copy; uint8_t home; uint8_t bitstream_type; uint32_t bitrate; uint8_t num_program_config_elements; uint32_t adif_buffer_fullness; /* maximum of 16 PCEs */ program_config pce[16]; } adif_header; #ifdef LTP_DEC typedef struct { uint8_t last_band; uint8_t data_present; uint16_t lag; uint8_t lag_update; uint8_t coef; uint8_t long_used[MAX_SFB]; uint8_t short_used[8]; uint8_t short_lag_present[8]; uint8_t short_lag[8]; } ltp_info; #endif #ifdef MAIN_DEC typedef struct { uint8_t limit; uint8_t predictor_reset; uint8_t predictor_reset_group_number; uint8_t prediction_used[MAX_SFB]; } pred_info; #endif typedef struct { uint8_t number_pulse; uint8_t pulse_start_sfb; uint8_t pulse_offset[4]; uint8_t pulse_amp[4]; } pulse_info; typedef struct { uint8_t n_filt[8]; uint8_t coef_res[8]; uint8_t length[8][4]; uint8_t order[8][4]; uint8_t direction[8][4]; uint8_t coef_compress[8][4]; uint8_t coef[8][4][32]; } tns_info; #ifdef SSR_DEC typedef struct { uint8_t max_band; uint8_t adjust_num[4][8]; uint8_t alevcode[4][8][8]; uint8_t aloccode[4][8][8]; } ssr_info; #endif typedef struct { uint8_t max_sfb; uint8_t num_swb; uint8_t num_window_groups; uint8_t num_windows; uint8_t window_sequence; uint8_t window_group_length[8]; uint8_t window_shape; uint8_t scale_factor_grouping; uint16_t sect_sfb_offset[8][15*8]; uint16_t swb_offset[52]; uint16_t swb_offset_max; uint8_t sect_cb[8][15*8]; uint16_t sect_start[8][15*8]; uint16_t sect_end[8][15*8]; uint8_t sfb_cb[8][8*15]; uint8_t num_sec[8]; /* number of sections in a group */ uint8_t global_gain; int16_t scale_factors[8][51]; /* [0..255] */ uint8_t ms_mask_present; uint8_t ms_used[MAX_WINDOW_GROUPS][MAX_SFB]; uint8_t noise_used; uint8_t is_used; uint8_t pulse_data_present; uint8_t tns_data_present; uint8_t gain_control_data_present; uint8_t predictor_data_present; pulse_info pul; tns_info tns; #ifdef MAIN_DEC pred_info pred; #endif #ifdef LTP_DEC ltp_info ltp; ltp_info ltp2; #endif #ifdef SSR_DEC ssr_info ssr; #endif #ifdef ERROR_RESILIENCE /* ER HCR data */ uint16_t length_of_reordered_spectral_data; uint8_t length_of_longest_codeword; /* ER RLVC data */ uint8_t sf_concealment; uint8_t rev_global_gain; uint16_t length_of_rvlc_sf; uint16_t dpcm_noise_nrg; uint8_t sf_escapes_present; uint8_t length_of_rvlc_escapes; uint16_t dpcm_noise_last_position; #endif } ic_stream; /* individual channel stream */ typedef struct { uint8_t channel; int16_t paired_channel; uint8_t element_instance_tag; uint8_t common_window; ic_stream ics1; ic_stream ics2; } element; /* syntax element (SCE, CPE, LFE) */ #define MAX_ASC_BYTES 64 typedef struct { int inited; int version, versionA; int framelen_type; int useSameStreamMux; int allStreamsSameTimeFraming; int numSubFrames; int numPrograms; int numLayers; int otherDataPresent; uint32_t otherDataLenBits; uint32_t frameLength; uint8_t ASC[MAX_ASC_BYTES]; uint32_t ASCbits; } latm_header; typedef struct { uint8_t adts_header_present; uint8_t adif_header_present; uint8_t latm_header_present; uint8_t sf_index; uint8_t object_type; uint8_t channelConfiguration; #ifdef ERROR_RESILIENCE uint8_t aacSectionDataResilienceFlag; uint8_t aacScalefactorDataResilienceFlag; uint8_t aacSpectralDataResilienceFlag; #endif uint16_t frameLength; uint8_t postSeekResetFlag; uint32_t frame; uint8_t downMatrix; uint8_t upMatrix; uint8_t first_syn_ele; uint8_t has_lfe; /* number of channels in current frame */ uint8_t fr_channels; /* number of elements in current frame */ uint8_t fr_ch_ele; /* element_output_channels: determines the number of channels the element will output */ uint8_t element_output_channels[MAX_SYNTAX_ELEMENTS]; /* element_alloced: determines whether the data needed for the element is allocated or not */ uint8_t element_alloced[MAX_SYNTAX_ELEMENTS]; /* alloced_channels: determines the number of channels where output data is allocated for */ uint8_t alloced_channels; /* output data buffer */ void *sample_buffer; uint8_t window_shape_prev[MAX_CHANNELS]; #ifdef LTP_DEC uint16_t ltp_lag[MAX_CHANNELS]; #endif fb_info *fb; drc_info *drc; real_t *time_out[MAX_CHANNELS]; real_t *fb_intermed[MAX_CHANNELS]; #ifdef SBR_DEC int8_t sbr_present_flag; int8_t forceUpSampling; int8_t downSampledSBR; /* determines whether SBR data is allocated for the gives element */ uint8_t sbr_alloced[MAX_SYNTAX_ELEMENTS]; sbr_info *sbr[MAX_SYNTAX_ELEMENTS]; #endif #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t ps_used[MAX_SYNTAX_ELEMENTS]; uint8_t ps_used_global; #endif #ifdef SSR_DEC real_t *ssr_overlap[MAX_CHANNELS]; real_t *prev_fmd[MAX_CHANNELS]; real_t ipqf_buffer[MAX_CHANNELS][4][96/4]; #endif #ifdef MAIN_DEC pred_state *pred_stat[MAX_CHANNELS]; #endif #ifdef LTP_DEC int16_t *lt_pred_stat[MAX_CHANNELS]; #endif #ifdef DRM uint8_t error_state; #endif /* RNG states */ uint32_t __r1; uint32_t __r2; /* Program Config Element */ uint8_t pce_set; program_config pce; uint8_t element_id[MAX_CHANNELS]; uint8_t internal_channel[MAX_CHANNELS]; /* Configuration data */ NeAACDecConfiguration config; #ifdef PROFILE int64_t cycles; int64_t spectral_cycles; int64_t output_cycles; int64_t scalefac_cycles; int64_t requant_cycles; #endif latm_header latm_config; const unsigned char *cmes; } NeAACDecStruct; #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/syntax.c000066400000000000000000002447051374350120500160010ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: syntax.c,v 1.93 2009/01/26 23:51:15 menno Exp $ **/ /* Reads the AAC bitstream as defined in 14496-3 (MPEG-4 Audio) */ #include "common.h" #include "structs.h" #include #include #include #include "syntax.h" #include "specrec.h" #include "huffman.h" #include "bits.h" #include "pulse.h" #include "analysis.h" #include "drc.h" #ifdef ERROR_RESILIENCE #include "rvlc.h" #endif #ifdef SBR_DEC #include "sbr_syntax.h" #endif #include "mp4.h" /* static function declarations */ static void decode_sce_lfe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, uint8_t id_syn_ele); static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, uint8_t id_syn_ele); static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, uint8_t channel, uint8_t *tag); static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, uint8_t channel, uint8_t *tag); #ifdef COUPLING_DEC static uint8_t coupling_channel_element(NeAACDecStruct *hDecoder, bitfile *ld); #endif static uint16_t data_stream_element(NeAACDecStruct *hDecoder, bitfile *ld); static uint8_t program_config_element(program_config *pce, bitfile *ld); static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc #ifdef SBR_DEC ,uint8_t sbr_ele #endif ); static uint8_t individual_channel_stream(NeAACDecStruct *hDecoder, element *ele, bitfile *ld, ic_stream *ics, uint8_t scal_flag, int16_t *spec_data); static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, uint8_t common_window); static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld); static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld); #ifdef SSR_DEC static void gain_control_data(bitfile *ld, ic_stream *ics); #endif static uint8_t spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, int16_t *spectral_data); static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); #ifdef LTP_DEC static uint8_t ltp_data(NeAACDecStruct *hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); #endif static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); static void adts_variable_header(adts_header *adts, bitfile *ld); static void adts_error_check(adts_header *adts, bitfile *ld); static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); static uint8_t excluded_channels(bitfile *ld, drc_info *drc); static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, bitfile *ld, ic_stream *ics, uint8_t scal_flag); #ifdef DRM static int8_t DRM_aac_scalable_main_header(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, bitfile *ld, uint8_t this_layer_stereo); #endif /* Table 4.4.1 */ int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce_out) { program_config pce; /* 1024 or 960 */ mp4ASC->frameLengthFlag = faad_get1bit(ld DEBUGVAR(1,138,"GASpecificConfig(): FrameLengthFlag")); #ifndef ALLOW_SMALL_FRAMELENGTH if (mp4ASC->frameLengthFlag == 1) return -3; #endif mp4ASC->dependsOnCoreCoder = faad_get1bit(ld DEBUGVAR(1,139,"GASpecificConfig(): DependsOnCoreCoder")); if (mp4ASC->dependsOnCoreCoder == 1) { mp4ASC->coreCoderDelay = (uint16_t)faad_getbits(ld, 14 DEBUGVAR(1,140,"GASpecificConfig(): CoreCoderDelay")); } mp4ASC->extensionFlag = faad_get1bit(ld DEBUGVAR(1,141,"GASpecificConfig(): ExtensionFlag")); if (mp4ASC->channelsConfiguration == 0) { if (program_config_element(&pce, ld)) return -3; //mp4ASC->channelsConfiguration = pce.channels; if (pce_out != NULL) memcpy(pce_out, &pce, sizeof(program_config)); /* if (pce.num_valid_cc_elements) return -3; */ } #ifdef ERROR_RESILIENCE if (mp4ASC->extensionFlag == 1) { /* Error resilience not supported yet */ if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { mp4ASC->aacSectionDataResilienceFlag = faad_get1bit(ld DEBUGVAR(1,144,"GASpecificConfig(): aacSectionDataResilienceFlag")); mp4ASC->aacScalefactorDataResilienceFlag = faad_get1bit(ld DEBUGVAR(1,145,"GASpecificConfig(): aacScalefactorDataResilienceFlag")); mp4ASC->aacSpectralDataResilienceFlag = faad_get1bit(ld DEBUGVAR(1,146,"GASpecificConfig(): aacSpectralDataResilienceFlag")); } /* 1 bit: extensionFlag3 */ faad_getbits(ld, 1); } #endif return 0; } /* Table 4.4.2 */ /* An MPEG-4 Audio decoder is only required to follow the Program Configuration Element in GASpecificConfig(). The decoder shall ignore any Program Configuration Elements that may occur in raw data blocks. PCEs transmitted in raw data blocks cannot be used to convey decoder configuration information. */ static uint8_t program_config_element(program_config *pce, bitfile *ld) { uint8_t i; memset(pce, 0, sizeof(program_config)); pce->channels = 0; pce->element_instance_tag = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,10,"program_config_element(): element_instance_tag")); pce->object_type = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,11,"program_config_element(): object_type")); pce->sf_index = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,12,"program_config_element(): sf_index")); pce->num_front_channel_elements = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,13,"program_config_element(): num_front_channel_elements")); pce->num_side_channel_elements = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,14,"program_config_element(): num_side_channel_elements")); pce->num_back_channel_elements = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,15,"program_config_element(): num_back_channel_elements")); pce->num_lfe_channel_elements = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,16,"program_config_element(): num_lfe_channel_elements")); pce->num_assoc_data_elements = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,17,"program_config_element(): num_assoc_data_elements")); pce->num_valid_cc_elements = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,18,"program_config_element(): num_valid_cc_elements")); pce->mono_mixdown_present = faad_get1bit(ld DEBUGVAR(1,19,"program_config_element(): mono_mixdown_present")); if (pce->mono_mixdown_present == 1) { pce->mono_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,20,"program_config_element(): mono_mixdown_element_number")); } pce->stereo_mixdown_present = faad_get1bit(ld DEBUGVAR(1,21,"program_config_element(): stereo_mixdown_present")); if (pce->stereo_mixdown_present == 1) { pce->stereo_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,22,"program_config_element(): stereo_mixdown_element_number")); } pce->matrix_mixdown_idx_present = faad_get1bit(ld DEBUGVAR(1,23,"program_config_element(): matrix_mixdown_idx_present")); if (pce->matrix_mixdown_idx_present == 1) { pce->matrix_mixdown_idx = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,24,"program_config_element(): matrix_mixdown_idx")); pce->pseudo_surround_enable = faad_get1bit(ld DEBUGVAR(1,25,"program_config_element(): pseudo_surround_enable")); } for (i = 0; i < pce->num_front_channel_elements; i++) { pce->front_element_is_cpe[i] = faad_get1bit(ld DEBUGVAR(1,26,"program_config_element(): front_element_is_cpe")); pce->front_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,27,"program_config_element(): front_element_tag_select")); if (pce->front_element_is_cpe[i] & 1) { pce->cpe_channel[pce->front_element_tag_select[i]] = pce->channels; pce->num_front_channels += 2; pce->channels += 2; } else { pce->sce_channel[pce->front_element_tag_select[i]] = pce->channels; pce->num_front_channels++; pce->channels++; } } for (i = 0; i < pce->num_side_channel_elements; i++) { pce->side_element_is_cpe[i] = faad_get1bit(ld DEBUGVAR(1,28,"program_config_element(): side_element_is_cpe")); pce->side_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,29,"program_config_element(): side_element_tag_select")); if (pce->side_element_is_cpe[i] & 1) { pce->cpe_channel[pce->side_element_tag_select[i]] = pce->channels; pce->num_side_channels += 2; pce->channels += 2; } else { pce->sce_channel[pce->side_element_tag_select[i]] = pce->channels; pce->num_side_channels++; pce->channels++; } } for (i = 0; i < pce->num_back_channel_elements; i++) { pce->back_element_is_cpe[i] = faad_get1bit(ld DEBUGVAR(1,30,"program_config_element(): back_element_is_cpe")); pce->back_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,31,"program_config_element(): back_element_tag_select")); if (pce->back_element_is_cpe[i] & 1) { pce->cpe_channel[pce->back_element_tag_select[i]] = pce->channels; pce->channels += 2; pce->num_back_channels += 2; } else { pce->sce_channel[pce->back_element_tag_select[i]] = pce->channels; pce->num_back_channels++; pce->channels++; } } for (i = 0; i < pce->num_lfe_channel_elements; i++) { pce->lfe_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,32,"program_config_element(): lfe_element_tag_select")); pce->sce_channel[pce->lfe_element_tag_select[i]] = pce->channels; pce->num_lfe_channels++; pce->channels++; } for (i = 0; i < pce->num_assoc_data_elements; i++) pce->assoc_data_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,33,"program_config_element(): assoc_data_element_tag_select")); for (i = 0; i < pce->num_valid_cc_elements; i++) { pce->cc_element_is_ind_sw[i] = faad_get1bit(ld DEBUGVAR(1,34,"program_config_element(): cc_element_is_ind_sw")); pce->valid_cc_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,35,"program_config_element(): valid_cc_element_tag_select")); } faad_byte_align(ld); pce->comment_field_bytes = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,36,"program_config_element(): comment_field_bytes")); for (i = 0; i < pce->comment_field_bytes; i++) { pce->comment_field_data[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,37,"program_config_element(): comment_field_data")); } pce->comment_field_data[i] = 0; if (pce->channels > MAX_CHANNELS) return 22; return 0; } static void decode_sce_lfe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, uint8_t id_syn_ele) { uint8_t channels = hDecoder->fr_channels; uint8_t tag = 0; if (channels+1 > MAX_CHANNELS) { hInfo->error = 12; return; } if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) { hInfo->error = 13; return; } /* for SCE hDecoder->element_output_channels[] is not set here because this can become 2 when some form of Parametric Stereo coding is used */ if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) { /* element inconsistency */ hInfo->error = 21; return; } /* save the syntax element id */ hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; /* decode the element */ hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); /* map output channels position to internal data channels */ if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) { /* this might be faulty when pce_set is true */ hDecoder->internal_channel[channels] = channels; hDecoder->internal_channel[channels+1] = channels+1; } else { if (hDecoder->pce_set) hDecoder->internal_channel[hDecoder->pce.sce_channel[tag]] = channels; else hDecoder->internal_channel[channels] = channels; } hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; hDecoder->fr_ch_ele++; } static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, uint8_t id_syn_ele) { uint8_t channels = hDecoder->fr_channels; uint8_t tag = 0; if (channels+2 > MAX_CHANNELS) { hInfo->error = 12; return; } if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) { hInfo->error = 13; return; } /* for CPE the number of output channels is always 2 */ if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) { /* element_output_channels not set yet */ hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { /* element inconsistency */ hInfo->error = 21; return; } if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) { /* element inconsistency */ hInfo->error = 21; return; } /* save the syntax element id */ hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; /* decode the element */ hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); /* map output channel position to internal data channels */ if (hDecoder->pce_set) { hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; } else { hDecoder->internal_channel[channels] = channels; hDecoder->internal_channel[channels+1] = channels+1; } hDecoder->fr_channels += 2; hDecoder->fr_ch_ele++; } void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc) { uint8_t id_syn_ele; uint8_t ele_this_frame = 0; hDecoder->fr_channels = 0; hDecoder->fr_ch_ele = 0; hDecoder->first_syn_ele = 25; hDecoder->has_lfe = 0; #ifdef ERROR_RESILIENCE if (hDecoder->object_type < ER_OBJECT_START) { #endif /* Table 4.4.3: raw_data_block() */ while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) { switch (id_syn_ele) { case ID_SCE: ele_this_frame++; if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); if (hInfo->error > 0) return; break; case ID_CPE: ele_this_frame++; if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; decode_cpe(hDecoder, hInfo, ld, id_syn_ele); if (hInfo->error > 0) return; break; case ID_LFE: #ifdef DRM hInfo->error = 32; #else ele_this_frame++; hDecoder->has_lfe++; decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); #endif if (hInfo->error > 0) return; break; case ID_CCE: /* not implemented yet, but skip the bits */ #ifdef DRM hInfo->error = 32; #else ele_this_frame++; #ifdef COUPLING_DEC hInfo->error = coupling_channel_element(hDecoder, ld); #else hInfo->error = 6; #endif #endif if (hInfo->error > 0) return; break; case ID_DSE: ele_this_frame++; data_stream_element(hDecoder, ld); break; case ID_PCE: if (ele_this_frame != 0) { hInfo->error = 31; return; } ele_this_frame++; /* 14496-4: 5.6.4.1.2.1.3: */ /* program_configuration_element()'s in access units shall be ignored */ program_config_element(pce, ld); //if ((hInfo->error = program_config_element(pce, ld)) > 0) // return; //hDecoder->pce_set = 1; break; case ID_FIL: ele_this_frame++; /* one sbr_info describes a channel_element not a channel! */ /* if we encounter SBR data here: error */ /* SBR data will be read directly in the SCE/LFE/CPE element */ if ((hInfo->error = fill_element(hDecoder, ld, drc #ifdef SBR_DEC , INVALID_SBR_ELEMENT #endif )) > 0) return; break; } } #ifdef ERROR_RESILIENCE } else { /* Table 262: er_raw_data_block() */ switch (hDecoder->channelConfiguration) { case 1: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; break; case 2: decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; break; case 3: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; break; case 4: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; break; case 5: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; break; case 6: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); if (hInfo->error > 0) return; break; case 7: /* 8 channels */ decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); if (hInfo->error > 0) return; break; default: hInfo->error = 7; return; } #if 0 cnt = bits_to_decode() / 8; while (cnt >= 1) { cnt -= extension_payload(cnt); } #endif } #endif /* new in corrigendum 14496-3:2002 */ #ifdef DRM if (hDecoder->object_type != DRM_ER_LC #if 0 && !hDecoder->latm_header_present #endif ) #endif { faad_byte_align(ld); } return; } /* Table 4.4.4 and */ /* Table 4.4.9 */ static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, uint8_t channel, uint8_t *tag) { uint8_t retval = 0; element sce = {0}; ic_stream *ics = &(sce.ics1); ALIGN int16_t spec_data[1024] = {0}; sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); *tag = sce.element_instance_tag; sce.channel = channel; sce.paired_channel = -1; retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); if (retval > 0) return retval; /* IS not allowed in single channel */ if (ics->is_used) return 32; #ifdef SBR_DEC /* check if next bitstream element is a fill element */ /* if so, read it now so SBR decoding can be done in case of a file with SBR */ if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) { faad_flushbits(ld, LEN_SE_ID); /* one sbr_info describes a channel_element not a channel! */ if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) { return retval; } } #endif /* noiseless coding is done, spectral reconstruction is done now */ retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); if (retval > 0) return retval; return 0; } /* Table 4.4.5 */ static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, uint8_t channels, uint8_t *tag) { ALIGN int16_t spec_data1[1024] = {0}; ALIGN int16_t spec_data2[1024] = {0}; element cpe = {0}; ic_stream *ics1 = &(cpe.ics1); ic_stream *ics2 = &(cpe.ics2); uint8_t result; cpe.channel = channels; cpe.paired_channel = channels+1; cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); *tag = cpe.element_instance_tag; if ((cpe.common_window = faad_get1bit(ld DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) { /* both channels have common ics information */ if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) return result; ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); if (ics1->ms_mask_present == 3) { /* bitstream error */ return 32; } if (ics1->ms_mask_present == 1) { uint8_t g, sfb; for (g = 0; g < ics1->num_window_groups; g++) { for (sfb = 0; sfb < ics1->max_sfb; sfb++) { ics1->ms_used[g][sfb] = faad_get1bit(ld DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); } } } #ifdef ERROR_RESILIENCE if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) { if (( #ifdef LTP_DEC ics1->ltp.data_present = #endif faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) { #ifdef LTP_DEC if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) { return result; } #else return 26; #endif } } #endif memcpy(ics2, ics1, sizeof(ic_stream)); } else { ics1->ms_mask_present = 0; } if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, 0, spec_data1)) > 0) { return result; } #ifdef ERROR_RESILIENCE if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) { if (( #ifdef LTP_DEC ics1->ltp2.data_present = #endif faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) { #ifdef LTP_DEC if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) { return result; } #else return 26; #endif } } #endif if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, 0, spec_data2)) > 0) { return result; } #ifdef SBR_DEC /* check if next bitstream element is a fill element */ /* if so, read it now so SBR decoding can be done in case of a file with SBR */ if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) { faad_flushbits(ld, LEN_SE_ID); /* one sbr_info describes a channel_element not a channel! */ if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) { return result; } } #endif /* noiseless coding is done, spectral reconstruction is done now */ if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2)) > 0) { return result; } return 0; } /* Table 4.4.6 */ static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, uint8_t common_window) { uint8_t retval = 0; uint8_t ics_reserved_bit; ics_reserved_bit = faad_get1bit(ld DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); if (ics_reserved_bit != 0) return 32; ics->window_sequence = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,44,"ics_info(): window_sequence")); ics->window_shape = faad_get1bit(ld DEBUGVAR(1,45,"ics_info(): window_shape")); #ifdef LD_DEC /* No block switching in LD */ if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) return 32; #endif if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { ics->max_sfb = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); } else { ics->max_sfb = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); } /* get the grouping information */ if ((retval = window_grouping_info(hDecoder, ics)) > 0) return retval; /* should be an error */ /* check the range of max_sfb */ if (ics->max_sfb > ics->num_swb) return 16; if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) { if ((ics->predictor_data_present = faad_get1bit(ld DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) { if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ { uint8_t sfb; uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); #ifdef MAIN_DEC ics->pred.limit = limit; #endif if (( #ifdef MAIN_DEC ics->pred.predictor_reset = #endif faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset"))) & 1) { #ifdef MAIN_DEC ics->pred.predictor_reset_group_number = #endif (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); } for (sfb = 0; sfb < limit; sfb++) { #ifdef MAIN_DEC ics->pred.prediction_used[sfb] = #endif faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); } } #ifdef LTP_DEC else { /* Long Term Prediction */ if (hDecoder->object_type < ER_OBJECT_START) { if ((ics->ltp.data_present = faad_get1bit(ld DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) { if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) { return retval; } } if (common_window) { if ((ics->ltp2.data_present = faad_get1bit(ld DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) { if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) { return retval; } } } } #ifdef ERROR_RESILIENCE if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) { if ((ics->ltp.data_present = faad_get1bit(ld DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) { if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) { return retval; } } } #endif } #endif } } return retval; } /* Table 4.4.7 */ static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld) { uint8_t i; pul->number_pulse = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,56,"pulse_data(): number_pulse")); pul->pulse_start_sfb = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,57,"pulse_data(): pulse_start_sfb")); /* check the range of pulse_start_sfb */ if (pul->pulse_start_sfb > ics->num_swb) return 16; for (i = 0; i < pul->number_pulse+1; i++) { pul->pulse_offset[i] = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,58,"pulse_data(): pulse_offset")); #if 0 printf("%d\n", pul->pulse_offset[i]); #endif pul->pulse_amp[i] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,59,"pulse_data(): pulse_amp")); #if 0 printf("%d\n", pul->pulse_amp[i]); #endif } return 0; } #ifdef COUPLING_DEC /* Table 4.4.8: Currently just for skipping the bits... */ static uint8_t coupling_channel_element(NeAACDecStruct *hDecoder, bitfile *ld) { uint8_t c, result = 0; uint8_t ind_sw_cce_flag = 0; uint8_t num_gain_element_lists = 0; uint8_t num_coupled_elements = 0; element el_empty = {0}; ic_stream ics_empty = {0}; int16_t sh_data[1024]; c = faad_getbits(ld, LEN_TAG DEBUGVAR(1,900,"coupling_channel_element(): element_instance_tag")); ind_sw_cce_flag = faad_get1bit(ld DEBUGVAR(1,901,"coupling_channel_element(): ind_sw_cce_flag")); num_coupled_elements = faad_getbits(ld, 3 DEBUGVAR(1,902,"coupling_channel_element(): num_coupled_elements")); for (c = 0; c < num_coupled_elements + 1; c++) { uint8_t cc_target_is_cpe, cc_target_tag_select; num_gain_element_lists++; cc_target_is_cpe = faad_get1bit(ld DEBUGVAR(1,903,"coupling_channel_element(): cc_target_is_cpe")); cc_target_tag_select = faad_getbits(ld, 4 DEBUGVAR(1,904,"coupling_channel_element(): cc_target_tag_select")); if (cc_target_is_cpe) { uint8_t cc_l = faad_get1bit(ld DEBUGVAR(1,905,"coupling_channel_element(): cc_l")); uint8_t cc_r = faad_get1bit(ld DEBUGVAR(1,906,"coupling_channel_element(): cc_r")); if (cc_l && cc_r) num_gain_element_lists++; } } faad_get1bit(ld DEBUGVAR(1,907,"coupling_channel_element(): cc_domain")); faad_get1bit(ld DEBUGVAR(1,908,"coupling_channel_element(): gain_element_sign")); faad_getbits(ld, 2 DEBUGVAR(1,909,"coupling_channel_element(): gain_element_scale")); if ((result = individual_channel_stream(hDecoder, &el_empty, ld, &ics_empty, 0, sh_data)) > 0) { return result; } /* IS not allowed in single channel */ if (ics->is_used) return 32; for (c = 1; c < num_gain_element_lists; c++) { uint8_t cge; if (ind_sw_cce_flag) { cge = 1; } else { cge = faad_get1bit(ld DEBUGVAR(1,910,"coupling_channel_element(): common_gain_element_present")); } if (cge) { huffman_scale_factor(ld); } else { uint8_t g, sfb; for (g = 0; g < ics_empty.num_window_groups; g++) { for (sfb = 0; sfb < ics_empty.max_sfb; sfb++) { if (ics_empty.sfb_cb[g][sfb] != ZERO_HCB) huffman_scale_factor(ld); } } } } return 0; } #endif /* Table 4.4.10 */ static uint16_t data_stream_element(NeAACDecStruct *hDecoder, bitfile *ld) { uint8_t byte_aligned; uint16_t i, count; /* element_instance_tag = */ faad_getbits(ld, LEN_TAG DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); byte_aligned = faad_get1bit(ld DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); count = (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,62,"data_stream_element(): count")); if (count == 255) { count += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,63,"data_stream_element(): extra count")); } if (byte_aligned) faad_byte_align(ld); for (i = 0; i < count; i++) { faad_getbits(ld, LEN_BYTE DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); } return count; } /* Table 4.4.11 */ static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc #ifdef SBR_DEC ,uint8_t sbr_ele #endif ) { uint16_t count; #ifdef SBR_DEC uint8_t bs_extension_type; #endif count = (uint16_t)faad_getbits(ld, 4 DEBUGVAR(1,65,"fill_element(): count")); if (count == 15) { count += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,66,"fill_element(): extra count")) - 1; } if (count > 0) { #ifdef SBR_DEC bs_extension_type = (uint8_t)faad_showbits(ld, 4); if ((bs_extension_type == EXT_SBR_DATA) || (bs_extension_type == EXT_SBR_DATA_CRC)) { if (sbr_ele == INVALID_SBR_ELEMENT) return 24; if (!hDecoder->sbr[sbr_ele]) { hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index), hDecoder->downSampledSBR #ifdef DRM , 0 #endif ); } if (!hDecoder->sbr[sbr_ele]) return 19; hDecoder->sbr_present_flag = 1; /* parse the SBR data */ hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count, hDecoder->postSeekResetFlag); #if 0 if (hDecoder->sbr[sbr_ele]->ret > 0) { printf("%s\n", NeAACDecGetErrorMessage(hDecoder->sbr[sbr_ele]->ret)); } #endif #if (defined(PS_DEC) || defined(DRM_PS)) if (hDecoder->sbr[sbr_ele]->ps_used) { hDecoder->ps_used[sbr_ele] = 1; /* set element independent flag to 1 as well */ hDecoder->ps_used_global = 1; } #endif } else { #endif #ifndef DRM while (count > 0) { count -= extension_payload(ld, drc, count); } #else return 30; #endif #ifdef SBR_DEC } #endif } return 0; } /* Table 4.4.12 */ #ifdef SSR_DEC static void gain_control_data(bitfile *ld, ic_stream *ics) { uint8_t bd, wd, ad; ssr_info *ssr = &(ics->ssr); ssr->max_band = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,1000,"gain_control_data(): max_band")); if (ics->window_sequence == ONLY_LONG_SEQUENCE) { for (bd = 1; bd <= ssr->max_band; bd++) { for (wd = 0; wd < 1; wd++) { ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) { ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,1002,"gain_control_data(): alevcode")); ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,1003,"gain_control_data(): aloccode")); } } } } else if (ics->window_sequence == LONG_START_SEQUENCE) { for (bd = 1; bd <= ssr->max_band; bd++) { for (wd = 0; wd < 2; wd++) { ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) { ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,1002,"gain_control_data(): alevcode")); if (wd == 0) { ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,1003,"gain_control_data(): aloccode")); } else { ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,1003,"gain_control_data(): aloccode")); } } } } } else if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { for (bd = 1; bd <= ssr->max_band; bd++) { for (wd = 0; wd < 8; wd++) { ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) { ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,1002,"gain_control_data(): alevcode")); ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,1003,"gain_control_data(): aloccode")); } } } } else if (ics->window_sequence == LONG_STOP_SEQUENCE) { for (bd = 1; bd <= ssr->max_band; bd++) { for (wd = 0; wd < 2; wd++) { ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) { ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,1002,"gain_control_data(): alevcode")); if (wd == 0) { ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,1003,"gain_control_data(): aloccode")); } else { ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,1003,"gain_control_data(): aloccode")); } } } } } } #endif #ifdef DRM /* Table 4.4.13 ASME */ void DRM_aac_scalable_main_element(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc) { uint8_t retval = 0; uint8_t channels = hDecoder->fr_channels = 0; uint8_t ch; uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; element cpe = {0}; ic_stream *ics1 = &(cpe.ics1); ic_stream *ics2 = &(cpe.ics2); int16_t *spec_data; ALIGN int16_t spec_data1[1024] = {0}; ALIGN int16_t spec_data2[1024] = {0}; hDecoder->fr_ch_ele = 0; hInfo->error = DRM_aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); if (hInfo->error > 0) return; cpe.common_window = 1; if (this_layer_stereo) { hDecoder->element_id[0] = ID_CPE; if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; } else { hDecoder->element_id[0] = ID_SCE; } if (this_layer_stereo) { cpe.channel = 0; cpe.paired_channel = 1; } /* Stereo2 / Mono1 */ ics1->tns_data_present = faad_get1bit(ld); #if defined(LTP_DEC) ics1->ltp.data_present = faad_get1bit(ld); #elif defined (DRM) if(faad_get1bit(ld)) { hInfo->error = 26; return; } #else faad_get1bit(ld); #endif hInfo->error = side_info(hDecoder, &cpe, ld, ics1, 1); if (hInfo->error > 0) return; if (this_layer_stereo) { /* Stereo3 */ ics2->tns_data_present = faad_get1bit(ld); #ifdef LTP_DEC ics1->ltp.data_present = #endif faad_get1bit(ld); hInfo->error = side_info(hDecoder, &cpe, ld, ics2, 1); if (hInfo->error > 0) return; } /* Stereo4 / Mono2 */ if (ics1->tns_data_present) tns_data(ics1, &(ics1->tns), ld); if (this_layer_stereo) { /* Stereo5 */ if (ics2->tns_data_present) tns_data(ics2, &(ics2->tns), ld); } #ifdef DRM /* CRC check */ if (hDecoder->object_type == DRM_ER_LC) { if ((hInfo->error = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) return; } #endif /* Stereo6 / Mono3 */ /* error resilient spectral data decoding */ if ((hInfo->error = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0) { return; } if (this_layer_stereo) { /* Stereo7 */ /* error resilient spectral data decoding */ if ((hInfo->error = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0) { return; } } #ifdef DRM #ifdef SBR_DEC /* In case of DRM we need to read the SBR info before channel reconstruction */ if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) { bitfile ld_sbr = {0}; uint32_t i; uint16_t count = 0; uint8_t *revbuffer; uint8_t *prevbufstart; uint8_t *pbufend; /* all forward bitreading should be finished at this point */ uint32_t bitsconsumed = faad_get_processed_bits(ld); uint32_t buffer_size = faad_origbitbuffer_size(ld); uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); if (bitsconsumed + 8 > buffer_size*8) { hInfo->error = 14; return; } if (!hDecoder->sbr[0]) { hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[0], 2*get_sample_rate(hDecoder->sf_index), 0 /* ds SBR */, 1); } if (!hDecoder->sbr[0]) { hInfo->error = 19; return; } /* Reverse bit reading of SBR data in DRM audio frame */ revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); prevbufstart = revbuffer; pbufend = &buffer[buffer_size - 1]; for (i = 0; i < buffer_size; i++) *prevbufstart++ = tabFlipbits[*pbufend--]; /* Set SBR data */ /* consider 8 bits from AAC-CRC */ /* SBR buffer size is original buffer size minus AAC buffer size */ count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed); faad_initbits(&ld_sbr, revbuffer, count); hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index); hDecoder->sbr[0]->sample_rate *= 2; faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */ hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count, hDecoder->postSeekResetFlag); #if (defined(PS_DEC) || defined(DRM_PS)) if (hDecoder->sbr[0]->ps_used) { hDecoder->ps_used[0] = 1; hDecoder->ps_used_global = 1; } #endif if (ld_sbr.error) { hDecoder->sbr[0]->ret = 1; } /* check CRC */ /* no need to check it if there was already an error */ if (hDecoder->sbr[0]->ret == 0) hDecoder->sbr[0]->ret = (uint8_t)faad_check_CRC(&ld_sbr, (uint16_t)faad_get_processed_bits(&ld_sbr) - 8); /* SBR data was corrupted, disable it until the next header */ if (hDecoder->sbr[0]->ret != 0) { hDecoder->sbr[0]->header_count = 0; } faad_endbits(&ld_sbr); if (revbuffer) faad_free(revbuffer); } #endif #endif if (this_layer_stereo) { hInfo->error = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2); if (hInfo->error > 0) return; } else { hInfo->error = reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1); if (hInfo->error > 0) return; } /* map output channels position to internal data channels */ if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) { /* this might be faulty when pce_set is true */ hDecoder->internal_channel[channels] = channels; hDecoder->internal_channel[channels+1] = channels+1; } else { hDecoder->internal_channel[channels] = channels; } hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; hDecoder->fr_ch_ele++; return; } /* Table 4.4.15 */ static int8_t DRM_aac_scalable_main_header(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, bitfile *ld, uint8_t this_layer_stereo) { uint8_t retval = 0; uint8_t ch; ic_stream *ics; uint8_t ics_reserved_bit; ics_reserved_bit = faad_get1bit(ld DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits")); if (ics_reserved_bit != 0) return 32; ics1->window_sequence = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence")); ics1->window_shape = faad_get1bit(ld DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape")); if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) { ics1->max_sfb = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)")); ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping")); } else { ics1->max_sfb = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)")); } /* get the grouping information */ if ((retval = window_grouping_info(hDecoder, ics1)) > 0) return retval; /* should be an error */ /* check the range of max_sfb */ if (ics1->max_sfb > ics1->num_swb) return 16; if (this_layer_stereo) { ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present")); if (ics1->ms_mask_present == 3) { /* bitstream error */ return 32; } if (ics1->ms_mask_present == 1) { uint8_t g, sfb; for (g = 0; g < ics1->num_window_groups; g++) { for (sfb = 0; sfb < ics1->max_sfb; sfb++) { ics1->ms_used[g][sfb] = faad_get1bit(ld DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit")); } } } memcpy(ics2, ics1, sizeof(ic_stream)); } else { ics1->ms_mask_present = 0; } return 0; } #endif static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, bitfile *ld, ic_stream *ics, uint8_t scal_flag) { uint8_t result; ics->global_gain = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,67,"individual_channel_stream(): global_gain")); if (!ele->common_window && !scal_flag) { if ((result = ics_info(hDecoder, ics, ld, ele->common_window)) > 0) return result; } if ((result = section_data(hDecoder, ics, ld)) > 0) return result; if ((result = scale_factor_data(hDecoder, ics, ld)) > 0) return result; if (!scal_flag) { /** ** NOTE: It could be that pulse data is available in scalable AAC too, ** as said in Amendment 1, this could be only the case for ER AAC, ** though. (have to check this out later) **/ /* get pulse data */ if ((ics->pulse_data_present = faad_get1bit(ld DEBUGVAR(1,68,"individual_channel_stream(): pulse_data_present"))) & 1) { if ((result = pulse_data(ics, &(ics->pul), ld)) > 0) return result; } /* get tns data */ if ((ics->tns_data_present = faad_get1bit(ld DEBUGVAR(1,69,"individual_channel_stream(): tns_data_present"))) & 1) { #ifdef ERROR_RESILIENCE if (hDecoder->object_type < ER_OBJECT_START) #endif tns_data(ics, &(ics->tns), ld); } /* get gain control data */ if ((ics->gain_control_data_present = faad_get1bit(ld DEBUGVAR(1,70,"individual_channel_stream(): gain_control_data_present"))) & 1) { #ifdef SSR_DEC if (hDecoder->object_type != SSR) return 1; else gain_control_data(ld, ics); #else return 1; #endif } } #ifdef ERROR_RESILIENCE if (hDecoder->aacSpectralDataResilienceFlag) { ics->length_of_reordered_spectral_data = (uint16_t)faad_getbits(ld, 14 DEBUGVAR(1,147,"individual_channel_stream(): length_of_reordered_spectral_data")); if (hDecoder->channelConfiguration == 2) { if (ics->length_of_reordered_spectral_data > 6144) ics->length_of_reordered_spectral_data = 6144; } else { if (ics->length_of_reordered_spectral_data > 12288) ics->length_of_reordered_spectral_data = 12288; } ics->length_of_longest_codeword = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,148,"individual_channel_stream(): length_of_longest_codeword")); if (ics->length_of_longest_codeword >= 49) ics->length_of_longest_codeword = 49; } /* RVLC spectral data is put here */ if (hDecoder->aacScalefactorDataResilienceFlag) { if ((result = rvlc_decode_scale_factors(ics, ld)) > 0) return result; } #endif return 0; } /* Table 4.4.24 */ static uint8_t individual_channel_stream(NeAACDecStruct *hDecoder, element *ele, bitfile *ld, ic_stream *ics, uint8_t scal_flag, int16_t *spec_data) { uint8_t result; result = side_info(hDecoder, ele, ld, ics, scal_flag); if (result > 0) return result; if (hDecoder->object_type >= ER_OBJECT_START) { if (ics->tns_data_present) tns_data(ics, &(ics->tns), ld); } #ifdef DRM /* CRC check */ if (hDecoder->object_type == DRM_ER_LC) { if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) return result; } #endif #ifdef ERROR_RESILIENCE if (hDecoder->aacSpectralDataResilienceFlag) { /* error resilient spectral data decoding */ if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) { return result; } } else { #endif /* decode the spectral data */ if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) { return result; } #ifdef ERROR_RESILIENCE } #endif /* pulse coding reconstruction */ if (ics->pulse_data_present) { if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) { if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) return result; } else { return 2; /* pulse coding not allowed for short blocks */ } } return 0; } /* Table 4.4.25 */ static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) { uint8_t g; uint8_t sect_esc_val, sect_bits; if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) sect_bits = 3; else sect_bits = 5; sect_esc_val = (1<max_sfb); printf(" sect top cb\n"); #endif for (g = 0; g < ics->num_window_groups; g++) { uint8_t k = 0; uint8_t i = 0; while (k < ics->max_sfb) { #ifdef ERROR_RESILIENCE uint8_t vcb11 = 0; #endif uint8_t sfb; uint8_t sect_len_incr; uint16_t sect_len = 0; uint8_t sect_cb_bits = 4; /* if "faad_getbits" detects error and returns "0", "k" is never incremented and we cannot leave the while loop */ if (ld->error != 0) return 14; #ifdef ERROR_RESILIENCE if (hDecoder->aacSectionDataResilienceFlag) sect_cb_bits = 5; #endif ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits DEBUGVAR(1,71,"section_data(): sect_cb")); if (ics->sect_cb[g][i] == 12) return 32; #if 0 printf("%d\n", ics->sect_cb[g][i]); #endif #ifndef DRM if (ics->sect_cb[g][i] == NOISE_HCB) ics->noise_used = 1; #else /* PNS not allowed in DRM */ if (ics->sect_cb[g][i] == NOISE_HCB) return 29; #endif if (ics->sect_cb[g][i] == INTENSITY_HCB2 || ics->sect_cb[g][i] == INTENSITY_HCB) ics->is_used = 1; #ifdef ERROR_RESILIENCE if (hDecoder->aacSectionDataResilienceFlag) { if ((ics->sect_cb[g][i] == 11) || ((ics->sect_cb[g][i] >= 16) && (ics->sect_cb[g][i] <= 32))) { vcb11 = 1; } } if (vcb11) { sect_len_incr = 1; } else { #endif sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits DEBUGVAR(1,72,"section_data(): sect_len_incr")); #ifdef ERROR_RESILIENCE } #endif while ((sect_len_incr == sect_esc_val) /* && (k+sect_len < ics->max_sfb)*/) { sect_len += sect_len_incr; sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits DEBUGVAR(1,72,"section_data(): sect_len_incr")); } sect_len += sect_len_incr; ics->sect_start[g][i] = k; ics->sect_end[g][i] = k + sect_len; #if 0 printf("%d\n", ics->sect_start[g][i]); #endif #if 0 printf("%d\n", ics->sect_end[g][i]); #endif if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { if (k + sect_len > 8*15) return 15; if (i >= 8*15) return 15; } else { if (k + sect_len > MAX_SFB) return 15; if (i >= MAX_SFB) return 15; } for (sfb = k; sfb < k + sect_len; sfb++) { ics->sfb_cb[g][sfb] = ics->sect_cb[g][i]; #if 0 printf("%d\n", ics->sfb_cb[g][sfb]); #endif } #if 0 printf(" %6d %6d %6d\n", i, ics->sect_end[g][i], ics->sect_cb[g][i]); #endif k += sect_len; i++; } ics->num_sec[g] = i; /* the sum of all sect_len_incr elements for a given window * group shall equal max_sfb */ if (k != ics->max_sfb) { return 32; } #if 0 printf("%d\n", ics->num_sec[g]); #endif } #if 0 printf("\n"); #endif return 0; } /* * decode_scale_factors() * decodes the scalefactors from the bitstream */ /* * All scalefactors (and also the stereo positions and pns energies) are * transmitted using Huffman coded DPCM relative to the previous active * scalefactor (respectively previous stereo position or previous pns energy, * see subclause 4.6.2 and 4.6.3). The first active scalefactor is * differentially coded relative to the global gain. */ static uint8_t decode_scale_factors(ic_stream *ics, bitfile *ld) { uint8_t g, sfb; int16_t t; int8_t noise_pcm_flag = 1; int16_t scale_factor = ics->global_gain; int16_t is_position = 0; int16_t noise_energy = ics->global_gain - 90; for (g = 0; g < ics->num_window_groups; g++) { for (sfb = 0; sfb < ics->max_sfb; sfb++) { switch (ics->sfb_cb[g][sfb]) { case ZERO_HCB: /* zero book */ ics->scale_factors[g][sfb] = 0; //#define SF_PRINT #ifdef SF_PRINT printf("%d\n", ics->scale_factors[g][sfb]); #endif break; case INTENSITY_HCB: /* intensity books */ case INTENSITY_HCB2: /* decode intensity position */ t = huffman_scale_factor(ld); is_position += (t - 60); ics->scale_factors[g][sfb] = is_position; #ifdef SF_PRINT printf("%d\n", ics->scale_factors[g][sfb]); #endif break; case NOISE_HCB: /* noise books */ #ifndef DRM /* decode noise energy */ if (noise_pcm_flag) { noise_pcm_flag = 0; t = (int16_t)faad_getbits(ld, 9 DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256; } else { t = huffman_scale_factor(ld); t -= 60; } noise_energy += t; ics->scale_factors[g][sfb] = noise_energy; #ifdef SF_PRINT printf("%d\n", ics->scale_factors[g][sfb]); #endif #else /* PNS not allowed in DRM */ return 29; #endif break; default: /* spectral books */ /* ics->scale_factors[g][sfb] must be between 0 and 255 */ ics->scale_factors[g][sfb] = 0; /* decode scale factor */ t = huffman_scale_factor(ld); scale_factor += (t - 60); if (scale_factor < 0 || scale_factor > 255) return 4; ics->scale_factors[g][sfb] = scale_factor; #ifdef SF_PRINT printf("%d\n", ics->scale_factors[g][sfb]); #endif break; } } } return 0; } /* Table 4.4.26 */ static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) { uint8_t ret = 0; #ifdef PROFILE int64_t count = faad_get_ts(); #endif #ifdef ERROR_RESILIENCE if (!hDecoder->aacScalefactorDataResilienceFlag) { #endif ret = decode_scale_factors(ics, ld); #ifdef ERROR_RESILIENCE } else { /* In ER AAC the parameters for RVLC are seperated from the actual data that holds the scale_factors. Strangely enough, 2 parameters for HCR are put inbetween them. */ ret = rvlc_scale_factor_data(ics, ld); } #endif #ifdef PROFILE count = faad_get_ts() - count; hDecoder->scalefac_cycles += count; #endif return ret; } /* Table 4.4.27 */ static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld) { uint8_t w, filt, i, start_coef_bits, coef_bits; uint8_t n_filt_bits = 2; uint8_t length_bits = 6; uint8_t order_bits = 5; if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { n_filt_bits = 1; length_bits = 4; order_bits = 3; } for (w = 0; w < ics->num_windows; w++) { tns->n_filt[w] = (uint8_t)faad_getbits(ld, n_filt_bits DEBUGVAR(1,74,"tns_data(): n_filt")); #if 0 printf("%d\n", tns->n_filt[w]); #endif if (tns->n_filt[w]) { if ((tns->coef_res[w] = faad_get1bit(ld DEBUGVAR(1,75,"tns_data(): coef_res"))) & 1) { start_coef_bits = 4; } else { start_coef_bits = 3; } #if 0 printf("%d\n", tns->coef_res[w]); #endif } for (filt = 0; filt < tns->n_filt[w]; filt++) { tns->length[w][filt] = (uint8_t)faad_getbits(ld, length_bits DEBUGVAR(1,76,"tns_data(): length")); #if 0 printf("%d\n", tns->length[w][filt]); #endif tns->order[w][filt] = (uint8_t)faad_getbits(ld, order_bits DEBUGVAR(1,77,"tns_data(): order")); #if 0 printf("%d\n", tns->order[w][filt]); #endif if (tns->order[w][filt]) { tns->direction[w][filt] = faad_get1bit(ld DEBUGVAR(1,78,"tns_data(): direction")); #if 0 printf("%d\n", tns->direction[w][filt]); #endif tns->coef_compress[w][filt] = faad_get1bit(ld DEBUGVAR(1,79,"tns_data(): coef_compress")); #if 0 printf("%d\n", tns->coef_compress[w][filt]); #endif coef_bits = start_coef_bits - tns->coef_compress[w][filt]; for (i = 0; i < tns->order[w][filt]; i++) { tns->coef[w][filt][i] = (uint8_t)faad_getbits(ld, coef_bits DEBUGVAR(1,80,"tns_data(): coef")); #if 0 printf("%d\n", tns->coef[w][filt][i]); #endif } } } } } #ifdef LTP_DEC /* Table 4.4.28 */ static uint8_t ltp_data(NeAACDecStruct *hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld) { uint8_t sfb, w; ltp->lag = 0; #ifdef LD_DEC if (hDecoder->object_type == LD) { ltp->lag_update = (uint8_t)faad_getbits(ld, 1 DEBUGVAR(1,142,"ltp_data(): lag_update")); if (ltp->lag_update) { ltp->lag = (uint16_t)faad_getbits(ld, 10 DEBUGVAR(1,81,"ltp_data(): lag")); } } else { #endif ltp->lag = (uint16_t)faad_getbits(ld, 11 DEBUGVAR(1,81,"ltp_data(): lag")); #ifdef LD_DEC } #endif /* Check length of lag */ if (ltp->lag > (hDecoder->frameLength << 1)) return 18; ltp->coef = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,82,"ltp_data(): coef")); if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { for (w = 0; w < ics->num_windows; w++) { if ((ltp->short_used[w] = faad_get1bit(ld DEBUGVAR(1,83,"ltp_data(): short_used"))) & 1) { ltp->short_lag_present[w] = faad_get1bit(ld DEBUGVAR(1,84,"ltp_data(): short_lag_present")); if (ltp->short_lag_present[w]) { ltp->short_lag[w] = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,85,"ltp_data(): short_lag")); } } } } else { ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB); for (sfb = 0; sfb < ltp->last_band; sfb++) { ltp->long_used[sfb] = faad_get1bit(ld DEBUGVAR(1,86,"ltp_data(): long_used")); } } return 0; } #endif /* Table 4.4.29 */ static uint8_t spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, int16_t *spectral_data) { int8_t i; uint8_t g; uint16_t inc, k, p = 0; uint8_t groups = 0; uint8_t sect_cb; uint8_t result; uint16_t nshort = hDecoder->frameLength/8; #ifdef PROFILE int64_t count = faad_get_ts(); #endif for(g = 0; g < ics->num_window_groups; g++) { p = groups*nshort; for (i = 0; i < ics->num_sec[g]; i++) { sect_cb = ics->sect_cb[g][i]; inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; switch (sect_cb) { case ZERO_HCB: case NOISE_HCB: case INTENSITY_HCB: case INTENSITY_HCB2: //#define SD_PRINT #ifdef SD_PRINT { int j; for (j = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; j < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; j++) { printf("%d\n", 0); } } #endif //#define SFBO_PRINT #ifdef SFBO_PRINT printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); #endif p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] - ics->sect_sfb_offset[g][ics->sect_start[g][i]]); break; default: #ifdef SFBO_PRINT printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); #endif for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) { if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) return result; #ifdef SD_PRINT { int j; for (j = p; j < p+inc; j++) { printf("%d\n", spectral_data[j]); } } #endif p += inc; } break; } } groups += ics->window_group_length[g]; } #ifdef PROFILE count = faad_get_ts() - count; hDecoder->spectral_cycles += count; #endif return 0; } /* Table 4.4.30 */ static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) { uint16_t i, n, dataElementLength; uint8_t dataElementLengthPart; uint8_t align = 4, data_element_version, loopCounter; uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,87,"extension_payload(): extension_type")); switch (extension_type) { case EXT_DYNAMIC_RANGE: drc->present = 1; n = dynamic_range_info(ld, drc); return n; case EXT_FILL_DATA: /* fill_nibble = */ faad_getbits(ld, 4 DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be '0000' */ for (i = 0; i < count-1; i++) { /* fill_byte[i] = */ faad_getbits(ld, 8 DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be '10100101' */ } return count; case EXT_DATA_ELEMENT: data_element_version = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,400,"extension_payload(): data_element_version")); switch (data_element_version) { case ANC_DATA: loopCounter = 0; dataElementLength = 0; do { dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); dataElementLength += dataElementLengthPart; loopCounter++; } while (dataElementLengthPart == 255); for (i = 0; i < dataElementLength; i++) { /* data_element_byte[i] = */ faad_getbits(ld, 8 DEBUGVAR(1,402,"extension_payload(): data_element_byte")); return (dataElementLength+loopCounter+1); } default: align = 0; } case EXT_FIL: default: faad_getbits(ld, align DEBUGVAR(1,88,"extension_payload(): fill_nibble")); for (i = 0; i < count-1; i++) { /* other_bits[i] = */ faad_getbits(ld, 8 DEBUGVAR(1,89,"extension_payload(): fill_bit")); } return count; } } /* Table 4.4.31 */ static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) { uint8_t i, n = 1; uint8_t band_incr; drc->num_bands = 1; if (faad_get1bit(ld DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) { drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); n++; } drc->excluded_chns_present = faad_get1bit(ld DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); if (drc->excluded_chns_present == 1) { n += excluded_channels(ld, drc); } if (faad_get1bit(ld DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) { band_incr = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); n++; drc->num_bands += band_incr; for (i = 0; i < drc->num_bands; i++) { drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,97,"dynamic_range_info(): band_top")); n++; } } if (faad_get1bit(ld DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) { drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); n++; } for (i = 0; i < drc->num_bands; i++) { drc->dyn_rng_sgn[i] = faad_get1bit(ld DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); n++; } return n; } /* Table 4.4.32 */ static uint8_t excluded_channels(bitfile *ld, drc_info *drc) { uint8_t i, n = 0; uint8_t num_excl_chan = 7; for (i = 0; i < 7; i++) { drc->exclude_mask[i] = faad_get1bit(ld DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); } n++; while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) { if (i >= MAX_CHANNELS - num_excl_chan - 7) return n; for (i = num_excl_chan; i < num_excl_chan+7; i++) { drc->exclude_mask[i] = faad_get1bit(ld DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); } n++; num_excl_chan += 7; } return n; } /* Annex A: Audio Interchange Formats */ /* Table 1.A.2 */ void get_adif_header(adif_header *adif, bitfile *ld) { uint8_t i; /* adif_id[0] = */ faad_getbits(ld, 8 DEBUGVAR(1,106,"get_adif_header(): adif_id[0]")); /* adif_id[1] = */ faad_getbits(ld, 8 DEBUGVAR(1,107,"get_adif_header(): adif_id[1]")); /* adif_id[2] = */ faad_getbits(ld, 8 DEBUGVAR(1,108,"get_adif_header(): adif_id[2]")); /* adif_id[3] = */ faad_getbits(ld, 8 DEBUGVAR(1,109,"get_adif_header(): adif_id[3]")); adif->copyright_id_present = faad_get1bit(ld DEBUGVAR(1,110,"get_adif_header(): copyright_id_present")); if(adif->copyright_id_present) { for (i = 0; i < 72/8; i++) { adif->copyright_id[i] = (int8_t)faad_getbits(ld, 8 DEBUGVAR(1,111,"get_adif_header(): copyright_id")); } adif->copyright_id[i] = 0; } adif->original_copy = faad_get1bit(ld DEBUGVAR(1,112,"get_adif_header(): original_copy")); adif->home = faad_get1bit(ld DEBUGVAR(1,113,"get_adif_header(): home")); adif->bitstream_type = faad_get1bit(ld DEBUGVAR(1,114,"get_adif_header(): bitstream_type")); adif->bitrate = faad_getbits(ld, 23 DEBUGVAR(1,115,"get_adif_header(): bitrate")); adif->num_program_config_elements = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,116,"get_adif_header(): num_program_config_elements")); for (i = 0; i < adif->num_program_config_elements + 1; i++) { if(adif->bitstream_type == 0) { adif->adif_buffer_fullness = faad_getbits(ld, 20 DEBUGVAR(1,117,"get_adif_header(): adif_buffer_fullness")); } else { adif->adif_buffer_fullness = 0; } program_config_element(&adif->pce[i], ld); } } /* Table 1.A.5 */ uint8_t adts_frame(adts_header *adts, bitfile *ld) { /* faad_byte_align(ld); */ if (adts_fixed_header(adts, ld)) return 5; adts_variable_header(adts, ld); adts_error_check(adts, ld); return 0; } /* Table 1.A.6 */ static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld) { uint16_t i; uint8_t sync_err = 1; /* try to recover from sync errors */ for (i = 0; i < 768; i++) { adts->syncword = (uint16_t)faad_showbits(ld, 12); if (adts->syncword != 0xFFF) { faad_getbits(ld, 8 DEBUGVAR(0,0,"")); } else { sync_err = 0; faad_getbits(ld, 12 DEBUGVAR(1,118,"adts_fixed_header(): syncword")); break; } } if (sync_err) return 5; adts->id = faad_get1bit(ld DEBUGVAR(1,119,"adts_fixed_header(): id")); adts->layer = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,120,"adts_fixed_header(): layer")); adts->protection_absent = faad_get1bit(ld DEBUGVAR(1,121,"adts_fixed_header(): protection_absent")); adts->profile = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,122,"adts_fixed_header(): profile")); adts->sf_index = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,123,"adts_fixed_header(): sf_index")); adts->private_bit = faad_get1bit(ld DEBUGVAR(1,124,"adts_fixed_header(): private_bit")); adts->channel_configuration = (uint8_t)faad_getbits(ld, 3 DEBUGVAR(1,125,"adts_fixed_header(): channel_configuration")); adts->original = faad_get1bit(ld DEBUGVAR(1,126,"adts_fixed_header(): original")); adts->home = faad_get1bit(ld DEBUGVAR(1,127,"adts_fixed_header(): home")); if (adts->old_format == 1) { /* Removed in corrigendum 14496-3:2002 */ if (adts->id == 0) { adts->emphasis = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,128,"adts_fixed_header(): emphasis")); } } return 0; } /* Table 1.A.7 */ static void adts_variable_header(adts_header *adts, bitfile *ld) { adts->copyright_identification_bit = faad_get1bit(ld DEBUGVAR(1,129,"adts_variable_header(): copyright_identification_bit")); adts->copyright_identification_start = faad_get1bit(ld DEBUGVAR(1,130,"adts_variable_header(): copyright_identification_start")); adts->aac_frame_length = (uint16_t)faad_getbits(ld, 13 DEBUGVAR(1,131,"adts_variable_header(): aac_frame_length")); adts->adts_buffer_fullness = (uint16_t)faad_getbits(ld, 11 DEBUGVAR(1,132,"adts_variable_header(): adts_buffer_fullness")); adts->no_raw_data_blocks_in_frame = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,133,"adts_variable_header(): no_raw_data_blocks_in_frame")); } /* Table 1.A.8 */ static void adts_error_check(adts_header *adts, bitfile *ld) { if (adts->protection_absent == 0) { adts->crc_check = (uint16_t)faad_getbits(ld, 16 DEBUGVAR(1,134,"adts_error_check(): crc_check")); } } /* LATM parsing functions */ static uint32_t latm_get_value(bitfile *ld) { uint32_t l, value; uint8_t bytesForValue; bytesForValue = (uint8_t)faad_getbits(ld, 2); value = 0; for(l=0; lframelen_type==0) { do { tmp = (uint8_t)faad_getbits(ld, 8); framelen += tmp; } while(tmp==0xff); } else if(latm->framelen_type==1) framelen=latm->frameLength; return framelen; } static uint32_t latmAudioMuxElement(latm_header *latm, bitfile *ld) { uint32_t ascLen, asc_bits=0; uint32_t x1, y1, m, n, i; program_config pce; mp4AudioSpecificConfig mp4ASC; latm->useSameStreamMux = (uint8_t)faad_getbits(ld, 1); if(!latm->useSameStreamMux) { //parseSameStreamMuxConfig latm->version = (uint8_t) faad_getbits(ld, 1); if(latm->version) latm->versionA = (uint8_t) faad_getbits(ld, 1); if(latm->versionA) { //dunno the payload format for versionA fprintf(stderr, "versionA not supported\n"); return 0; } if(latm->version) //read taraBufferFullness latm_get_value(ld); latm->allStreamsSameTimeFraming = (uint8_t)faad_getbits(ld, 1); latm->numSubFrames = (uint8_t)faad_getbits(ld, 6) + 1; latm->numPrograms = (uint8_t)faad_getbits(ld, 4) + 1; latm->numLayers = faad_getbits(ld, 3) + 1; if(latm->numPrograms>1 || !latm->allStreamsSameTimeFraming || latm->numSubFrames>1 || latm->numLayers>1) { fprintf(stderr, "\r\nUnsupported LATM configuration: %d programs/ %d subframes, %d layers, allstreams: %d\n", latm->numPrograms, latm->numSubFrames, latm->numLayers, latm->allStreamsSameTimeFraming); return 0; } ascLen = 0; if(latm->version) ascLen = latm_get_value(ld); x1 = faad_get_processed_bits(ld); if(AudioSpecificConfigFromBitfile(ld, &mp4ASC, &pce, 0, 1) < 0) return 0; //horrid hack to unread the ASC bits and store them in latm->ASC //the correct code would rely on an ideal faad_ungetbits() y1 = faad_get_processed_bits(ld); if((y1-x1) <= MAX_ASC_BYTES*8) { faad_rewindbits(ld); m = x1; while(m>0) { n = min(m, 32); faad_getbits(ld, n); m -= n; } i = 0; m = latm->ASCbits = y1 - x1; while(m > 0) { n = min(m, 8); latm->ASC[i++] = (uint8_t) faad_getbits(ld, n); m -= n; } } asc_bits = y1-x1; if(ascLen>asc_bits) faad_getbits(ld, ascLen-asc_bits); latm->framelen_type = (uint8_t) faad_getbits(ld, 3); if(latm->framelen_type == 0) { latm->frameLength = 0; faad_getbits(ld, 8); //buffer fullness for frame_len_type==0, useless } else if(latm->framelen_type == 1) { latm->frameLength = faad_getbits(ld, 9); if(latm->frameLength==0) { fprintf(stderr, "Invalid frameLength: 0\r\n"); return 0; } latm->frameLength = (latm->frameLength+20)*8; } else { //hellish CELP or HCVX stuff, discard fprintf(stderr, "Unsupported CELP/HCVX framelentype: %d\n", latm->framelen_type); return 0; } latm->otherDataLenBits = 0; if(faad_getbits(ld, 1)) { //other data present int esc, tmp; if(latm->version) latm->otherDataLenBits = latm_get_value(ld); else do { esc = faad_getbits(ld, 1); tmp = faad_getbits(ld, 8); latm->otherDataLenBits = (latm->otherDataLenBits << 8) + tmp; } while(esc); } if(faad_getbits(ld, 1)) //crc faad_getbits(ld, 8); latm->inited = 1; } //read payload if(latm->inited) return latmParsePayload(latm, ld); else return 0; } uint32_t faad_latm_frame(latm_header *latm, bitfile *ld) { uint16_t len; uint32_t initpos, endpos, firstpos, ret; firstpos = faad_get_processed_bits(ld); while (ld->bytes_left) { faad_byte_align(ld); if(faad_showbits(ld, 11) != 0x2B7) { faad_getbits(ld, 8); continue; } faad_getbits(ld, 11); len = faad_getbits(ld, 13); if(!len) continue; initpos = faad_get_processed_bits(ld); ret = latmAudioMuxElement(latm, ld); endpos = faad_get_processed_bits(ld); if(ret>0) return (len*8)-(endpos-initpos); //faad_getbits(ld, initpos-endpos); //go back to initpos, but is valid a getbits(-N) ? } return 0xFFFFFFFF; } faad2-2_10_0/libfaad/syntax.h000066400000000000000000000071611374350120500157770ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: syntax.h,v 1.60 2009/01/26 23:51:17 menno Exp $ **/ #ifndef __SYNTAX_H__ #define __SYNTAX_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #define MAIN 1 #define LC 2 #define SSR 3 #define LTP 4 #define HE_AAC 5 #define LD 23 #define ER_LC 17 #define ER_LTP 19 #define DRM_ER_LC 27 /* special object type for DRM */ /* header types */ #define RAW 0 #define ADIF 1 #define ADTS 2 #define LATM 3 /* SBR signalling */ #define NO_SBR 0 #define SBR_UPSAMPLED 1 #define SBR_DOWNSAMPLED 2 #define NO_SBR_UPSAMPLED 3 /* DRM channel definitions */ #define DRMCH_MONO 1 #define DRMCH_STEREO 2 #define DRMCH_SBR_MONO 3 #define DRMCH_SBR_STEREO 4 #define DRMCH_SBR_PS_STEREO 5 /* First object type that has ER */ #define ER_OBJECT_START 17 /* Bitstream */ #define LEN_SE_ID 3 #define LEN_TAG 4 #define LEN_BYTE 8 #define EXT_FIL 0 #define EXT_FILL_DATA 1 #define EXT_DATA_ELEMENT 2 #define EXT_DYNAMIC_RANGE 11 #define ANC_DATA 0 /* Syntax elements */ #define ID_SCE 0x0 #define ID_CPE 0x1 #define ID_CCE 0x2 #define ID_LFE 0x3 #define ID_DSE 0x4 #define ID_PCE 0x5 #define ID_FIL 0x6 #define ID_END 0x7 #define INVALID_ELEMENT_ID 255 #define ONLY_LONG_SEQUENCE 0x0 #define LONG_START_SEQUENCE 0x1 #define EIGHT_SHORT_SEQUENCE 0x2 #define LONG_STOP_SEQUENCE 0x3 #define ZERO_HCB 0 #define FIRST_PAIR_HCB 5 #define ESC_HCB 11 #define QUAD_LEN 4 #define PAIR_LEN 2 #define NOISE_HCB 13 #define INTENSITY_HCB2 14 #define INTENSITY_HCB 15 #define INVALID_SBR_ELEMENT 255 int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce); uint8_t adts_frame(adts_header *adts, bitfile *ld); void get_adif_header(adif_header *adif, bitfile *ld); void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc); uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, int16_t *spectral_data); #ifdef DRM void DRM_aac_scalable_main_element(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc); #endif uint32_t faad_latm_frame(latm_header *latm, bitfile *ld); #ifdef __cplusplus } #endif #endif faad2-2_10_0/libfaad/tns.c000066400000000000000000000245541374350120500152550ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: tns.c,v 1.40 2007/11/01 12:33:40 menno Exp $ **/ #include "common.h" #include "structs.h" #include "syntax.h" #include "tns.h" /* static function declarations */ static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, uint8_t *coef, real_t *a); static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, uint8_t order); static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, uint8_t order); #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif static real_t tns_coef_0_3[] = { COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(0.7818314825), COEF_CONST(0.9749279122), COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.9749279122), COEF_CONST(-0.9749279122), COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) }; static real_t tns_coef_0_4[] = { COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), COEF_CONST(0.7431448255), COEF_CONST(0.8660254038), COEF_CONST(0.9510565163), COEF_CONST(0.9945218954), COEF_CONST(-0.9957341763), COEF_CONST(-0.9618256432), COEF_CONST(-0.8951632914), COEF_CONST(-0.7980172273), COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) }; static real_t tns_coef_1_3[] = { COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), COEF_CONST(0.9749279122), COEF_CONST(0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), COEF_CONST(-0.7818314825), COEF_CONST(-0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) }; static real_t tns_coef_1_4[] = { COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178), COEF_CONST(0.9945218954), COEF_CONST(0.9510565163), COEF_CONST(0.8660254038), COEF_CONST(0.7431448255), COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) }; /* TNS decoding for one channel and frame */ void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, uint8_t object_type, real_t *spec, uint16_t frame_len) { uint8_t w, f, tns_order; int8_t inc; int16_t size; uint16_t bottom, top, start, end; uint16_t nshort = frame_len/8; real_t lpc[TNS_MAX_ORDER+1]; if (!ics->tns_data_present) return; for (w = 0; w < ics->num_windows; w++) { bottom = ics->num_swb; for (f = 0; f < tns->n_filt[w]; f++) { top = bottom; bottom = max(top - tns->length[w][f], 0); tns_order = min(tns->order[w][f], TNS_MAX_ORDER); if (!tns_order) continue; tns_decode_coef(tns_order, tns->coef_res[w]+3, tns->coef_compress[w][f], tns->coef[w][f], lpc); start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); start = min(start, ics->max_sfb); start = min(ics->swb_offset[start], ics->swb_offset_max); end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); end = min(end, ics->max_sfb); end = min(ics->swb_offset[end], ics->swb_offset_max); size = end - start; if (size <= 0) continue; if (tns->direction[w][f]) { inc = -1; start = end - 1; } else { inc = 1; } tns_ar_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); } } } /* TNS encoding for one channel and frame */ void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, uint8_t object_type, real_t *spec, uint16_t frame_len) { uint8_t w, f, tns_order; int8_t inc; int16_t size; uint16_t bottom, top, start, end; uint16_t nshort = frame_len/8; real_t lpc[TNS_MAX_ORDER+1]; if (!ics->tns_data_present) return; for (w = 0; w < ics->num_windows; w++) { bottom = ics->num_swb; for (f = 0; f < tns->n_filt[w]; f++) { top = bottom; bottom = max(top - tns->length[w][f], 0); tns_order = min(tns->order[w][f], TNS_MAX_ORDER); if (!tns_order) continue; tns_decode_coef(tns_order, tns->coef_res[w]+3, tns->coef_compress[w][f], tns->coef[w][f], lpc); start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); start = min(start, ics->max_sfb); start = min(ics->swb_offset[start], ics->swb_offset_max); end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); end = min(end, ics->max_sfb); end = min(ics->swb_offset[end], ics->swb_offset_max); size = end - start; if (size <= 0) continue; if (tns->direction[w][f]) { inc = -1; start = end - 1; } else { inc = 1; } tns_ma_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); } } } /* Decoder transmitted coefficients for one TNS filter */ static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, uint8_t *coef, real_t *a) { uint8_t i, m; real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; /* Conversion to signed integer */ for (i = 0; i < order; i++) { if (coef_compress == 0) { if (coef_res_bits == 3) { tmp2[i] = tns_coef_0_3[coef[i]]; } else { tmp2[i] = tns_coef_0_4[coef[i]]; } } else { if (coef_res_bits == 3) { tmp2[i] = tns_coef_1_3[coef[i]]; } else { tmp2[i] = tns_coef_1_4[coef[i]]; } } } /* Conversion to LPC coefficients */ a[0] = COEF_CONST(1.0); for (m = 1; m <= order; m++) { for (i = 1; i < m; i++) /* loop only while i #include #include #include #include #include #include "QCDInputDLL.h" #include "resource.h" #include #include #include //#include static char app_name[] = "QCDFAAD"; faadAACInfo file_info; faacDecHandle hDecoder; faacDecFrameInfo frameInfo; HINSTANCE hInstance; HWND hwndPlayer, hwndConfig, hwndAbout; QCDModInitIn sQCDCallbacks, *QCDCallbacks; BOOL oldAPIs = 0; static char lastfn[MAX_PATH]; // currently playing file (used for getting info on the current file) int file_length; // file length, in bytes int paused; // are we paused? int seek_needed; // if != -1, it is the point that the decode thread should seek to, in ms. char *sample_buffer; // sample buffer unsigned char *buffer; // input buffer unsigned char *memmap_buffer; // input buffer for whole file long memmap_index; long buffercount, fileread, bytecount; // seek table for ADTS header files unsigned long *seek_table = NULL; int seek_table_length=0; int killPlayThread = 0; // the kill switch for the decode thread HANDLE play_thread_handle = INVALID_HANDLE_VALUE; // the handle to the decode thread FILE_STREAM *infile; /* Function definitions */ int id3v2_tag(unsigned char *buffer); DWORD WINAPI PlayThread(void *b); // the decode thread procedure // general funcz static void show_error(const char *message,...) { char foo[512]; va_list args; va_start(args, message); vsprintf(foo, message, args); va_end(args); MessageBox(hwndPlayer, foo, "FAAD Plug-in Error", MB_ICONSTOP); } // 1= use vbr display, 0 = use average bitrate. This value only controls what shows up in the // configuration form. Also- Streaming uses an on-the-fly bitrate display regardless of this value. long m_variable_bitrate_display=0; long m_priority = 5; long m_memmap_file = 0; static char INI_FILE[MAX_PATH]; char *priority_text[] = { "", "Decode Thread Priority: Lowest", "Decode Thread Priority: Lower", "Decode Thread Priority: Normal", "Decode Thread Priority: Higher", "Decode Thread Priority: Highest (default)" }; long priority_table[] = {0, THREAD_PRIORITY_LOWEST, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_HIGHEST}; long current_file_mode = 0; int PlayThread_memmap(); int PlayThread_file(); static void _r_s(char *name,char *data, int mlen) { char buf[10]; strcpy(buf,data); GetPrivateProfileString(app_name,name,buf,data,mlen,INI_FILE); } #define RS(x) (_r_s(#x,x,sizeof(x))) #define WS(x) (WritePrivateProfileString(app_name,#x,x,INI_FILE)) void config_read() { char variable_bitrate_display[10]; char priority[10]; char memmap_file[10]; char local_buffer_size[10]; char stream_buffer_size[10]; strcpy(variable_bitrate_display, "1"); strcpy(priority, "5"); strcpy(memmap_file, "0"); strcpy(local_buffer_size, "128"); strcpy(stream_buffer_size, "64"); RS(variable_bitrate_display); RS(priority); RS(memmap_file); RS(local_buffer_size); RS(stream_buffer_size); m_priority = atoi(priority); m_variable_bitrate_display = atoi(variable_bitrate_display); m_memmap_file = atoi(memmap_file); m_local_buffer_size = atoi(local_buffer_size); m_stream_buffer_size = atoi(stream_buffer_size); } void config_write() { char variable_bitrate_display[10]; char priority[10]; char memmap_file[10]; char local_buffer_size[10]; char stream_buffer_size[10]; itoa(m_priority, priority, 10); itoa(m_variable_bitrate_display, variable_bitrate_display, 10); itoa(m_memmap_file, memmap_file, 10); itoa(m_local_buffer_size, local_buffer_size, 10); itoa(m_stream_buffer_size, stream_buffer_size, 10); WS(variable_bitrate_display); WS(priority); WS(memmap_file); WS(local_buffer_size); WS(stream_buffer_size); } //----------------------------------------------------------------------------- BOOL WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID pRes) { if (fdwReason == DLL_PROCESS_ATTACH) hInstance = hInst; return TRUE; } //----------------------------------------------------------------------------- //old entrypoint api PLUGIN_API BOOL QInputModule(QCDModInitIn *ModInit, QCDModInfo *ModInfo) { ModInit->version = PLUGIN_API_VERSION; ModInit->toModule.ShutDown = ShutDown; ModInit->toModule.GetTrackExtents = GetTrackExtents; ModInit->toModule.GetMediaSupported = GetMediaSupported; ModInit->toModule.GetCurrentPosition= GetCurrentPosition; ModInit->toModule.Play = Play; ModInit->toModule.Pause = Pause; ModInit->toModule.Stop = Stop; ModInit->toModule.SetVolume = SetVolume; ModInit->toModule.About = About; ModInit->toModule.Configure = Configure; QCDCallbacks = ModInit; ModInfo->moduleString = "FAAD Plugin v1.0b"; /* read config */ QCDCallbacks->Service(opGetPluginSettingsFile, INI_FILE, MAX_PATH, 0); config_read(); ModInfo->moduleExtensions = "AAC"; hwndPlayer = (HWND)ModInit->Service(opGetParentWnd, 0, 0, 0); lastfn[0] = 0; play_thread_handle = INVALID_HANDLE_VALUE; oldAPIs = 1; return TRUE; } //----------------------------------------------------------------------------- PLUGIN_API QCDModInitIn* INPUTDLL_ENTRY_POINT() { sQCDCallbacks.version = PLUGIN_API_VERSION; sQCDCallbacks.toModule.Initialize = Initialize; sQCDCallbacks.toModule.ShutDown = ShutDown; sQCDCallbacks.toModule.GetTrackExtents = GetTrackExtents; sQCDCallbacks.toModule.GetMediaSupported = GetMediaSupported; sQCDCallbacks.toModule.GetCurrentPosition = GetCurrentPosition; sQCDCallbacks.toModule.Play = Play; sQCDCallbacks.toModule.Pause = Pause; sQCDCallbacks.toModule.Stop = Stop; sQCDCallbacks.toModule.SetVolume = SetVolume; sQCDCallbacks.toModule.About = About; sQCDCallbacks.toModule.Configure = Configure; QCDCallbacks = &sQCDCallbacks; return &sQCDCallbacks; } //---------------------------------------------------------------------------- BOOL CALLBACK config_dialog_proc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { char tmp[10]; switch (message) { case WM_INITDIALOG: /* Set priority slider range and previous position */ SendMessage(GetDlgItem(hwndDlg, THREAD_PRIORITY_SLIDER), TBM_SETRANGE, TRUE, MAKELONG(1, 5)); SendMessage(GetDlgItem(hwndDlg, THREAD_PRIORITY_SLIDER), TBM_SETPOS, TRUE, m_priority); SetDlgItemText(hwndDlg, IDC_STATIC2, priority_text[m_priority]); /* Put a limit to the amount of characters allowed in the buffer boxes */ SendMessage(GetDlgItem(hwndDlg, LOCAL_BUFFER_TXT), EM_LIMITTEXT, 4, 0); SendMessage(GetDlgItem(hwndDlg, STREAM_BUFFER_TXT), EM_LIMITTEXT, 4, 0); if(m_variable_bitrate_display) SendMessage(GetDlgItem(hwndDlg, VARBITRATE_CHK), BM_SETCHECK, BST_CHECKED, 0); if(m_memmap_file) SendMessage(GetDlgItem(hwndDlg, IDC_MEMMAP), BM_SETCHECK, BST_CHECKED, 0); itoa(m_local_buffer_size, tmp, 10); SetDlgItemText(hwndDlg, LOCAL_BUFFER_TXT, tmp); itoa(m_stream_buffer_size, tmp, 10); SetDlgItemText(hwndDlg, STREAM_BUFFER_TXT, tmp); return TRUE; case WM_HSCROLL: /* Thread priority slider moved */ if(GetDlgItem(hwndDlg, THREAD_PRIORITY_SLIDER) == (HWND) lParam) { int tmp; tmp = SendMessage(GetDlgItem(hwndDlg, THREAD_PRIORITY_SLIDER), TBM_GETPOS, 0, 0); if(tmp > 0) { m_priority = tmp; SetDlgItemText(hwndDlg, IDC_STATIC2, priority_text[m_priority]); if(play_thread_handle) SetThreadPriority(play_thread_handle, priority_table[m_priority]); } } return TRUE; case WM_COMMAND: if(HIWORD(wParam) == BN_CLICKED) { if(GetDlgItem(hwndDlg, VARBITRATE_CHK) == (HWND) lParam) { /* Variable Bitrate checkbox hit */ m_variable_bitrate_display = SendMessage(GetDlgItem(hwndDlg, VARBITRATE_CHK), BM_GETCHECK, 0, 0); } if(GetDlgItem(hwndDlg, IDC_MEMMAP) == (HWND) lParam) { /* Variable Bitrate checkbox hit */ m_memmap_file = SendMessage(GetDlgItem(hwndDlg, IDC_MEMMAP), BM_GETCHECK, 0, 0); } } switch (LOWORD(wParam)) { case OK_BTN: /* User hit OK, save buffer settings (all others are set on command) */ GetDlgItemText(hwndDlg, LOCAL_BUFFER_TXT, tmp, 5); m_local_buffer_size = atol(tmp); GetDlgItemText(hwndDlg, STREAM_BUFFER_TXT, tmp, 5); m_stream_buffer_size = atol(tmp); config_write(); EndDialog(hwndDlg, wParam); return TRUE; case RESET_BTN: SendMessage(GetDlgItem(hwndDlg, VARBITRATE_CHK), BM_SETCHECK, BST_CHECKED, 0); m_variable_bitrate_display = 1; SendMessage(GetDlgItem(hwndDlg, IDC_MEMMAP), BM_SETCHECK, BST_UNCHECKED, 0); m_memmap_file = 0; SendMessage(GetDlgItem(hwndDlg, THREAD_PRIORITY_SLIDER), TBM_SETPOS, TRUE, 5); m_priority = 5; SetDlgItemText(hwndDlg, IDC_STATIC2, priority_text[5]); SetDlgItemText(hwndDlg, LOCAL_BUFFER_TXT, "128"); m_local_buffer_size = 128; SetDlgItemText(hwndDlg, STREAM_BUFFER_TXT, "64"); m_stream_buffer_size = 64; return TRUE; case IDCANCEL: case CANCEL_BTN: /* User hit Cancel or the X, just close without saving buffer settings */ DestroyWindow(hwndDlg); return TRUE; } } return FALSE; } void Configure(int flags) { if(!IsWindow(hwndConfig)) hwndConfig = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_CONFIG), hwndPlayer, config_dialog_proc); ShowWindow(hwndConfig, SW_NORMAL); } //----------------------------------------------------------------------------- // proc of "About Dialog" INT_PTR CALLBACK about_dialog_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { static RECT rcLOGO, rcMail1, rcMail2/*, rcMail3*/; POINT ptMouse; static char szPluginVer[] = "QCD FAAD Input Plug-in v1.0b\nCompiled on " __TIME__ ", " __DATE__; static char szFLACVer[] = "Using: FAAD2 v "FAAD2_VERSION" by"; switch (uMsg) { case WM_INITDIALOG: case WM_MOVE: GetWindowRect(GetDlgItem(hwndDlg, IDC_LOGO), &rcLOGO); GetWindowRect(GetDlgItem(hwndDlg, IDC_MAIL1), &rcMail1); GetWindowRect(GetDlgItem(hwndDlg, IDC_MAIL2), &rcMail2); // GetWindowRect(GetDlgItem(hwndDlg, IDC_MAIL2), &rcMail3); SetDlgItemText(hwndDlg, IDC_PLUGINVER, szPluginVer); SetDlgItemText(hwndDlg, IDC_FAADVER, szFLACVer); return TRUE; case WM_MOUSEMOVE: ptMouse.x = LOWORD(lParam); ptMouse.y = HIWORD(lParam); ClientToScreen(hwndDlg, &ptMouse); if( (ptMouse.x >= rcLOGO.left && ptMouse.x <= rcLOGO.right && ptMouse.y >= rcLOGO.top && ptMouse.y<= rcLOGO.bottom) || (ptMouse.x >= rcMail1.left && ptMouse.x <= rcMail1.right && ptMouse.y >= rcMail1.top && ptMouse.y<= rcMail1.bottom) || (ptMouse.x >= rcMail2.left && ptMouse.x <= rcMail2.right && ptMouse.y >= rcMail2.top && ptMouse.y<= rcMail2.bottom) /* || (ptMouse.x >= rcMail3.left && ptMouse.x <= rcMail3.right && ptMouse.y >= rcMail3.top && ptMouse.y<= rcMail3.bottom)*/ ) SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(32649))); else SetCursor(LoadCursor(NULL, IDC_ARROW)); return TRUE; case WM_LBUTTONDOWN: ptMouse.x = LOWORD(lParam); ptMouse.y = HIWORD(lParam); ClientToScreen(hwndDlg, &ptMouse); if(ptMouse.x >= rcLOGO.left && ptMouse.x <= rcLOGO.right && ptMouse.y >= rcLOGO.top && ptMouse.y<= rcLOGO.bottom) ShellExecute(0, NULL, "http://www.audiocoding.com", NULL,NULL, SW_NORMAL); else if(ptMouse.x >= rcMail1.left && ptMouse.x <= rcMail1.right && ptMouse.y >= rcMail1.top && ptMouse.y<= rcMail1.bottom) ShellExecute(0, NULL, "mailto:shaohao@elong.com", NULL,NULL, SW_NORMAL); else if(ptMouse.x >= rcMail2.left && ptMouse.x <= rcMail2.right && ptMouse.y >= rcMail2.top && ptMouse.y<= rcMail2.bottom) ShellExecute(0, NULL, "mailto:menno@audiocoding.com", NULL,NULL, SW_NORMAL); /* else if(ptMouse.x >= rcMail3.left && ptMouse.x <= rcMail3.right && ptMouse.y >= rcMail3.top && ptMouse.y<= rcMail3.bottom) ShellExecute(0, NULL, "I don't know", NULL,NULL, SW_NORMAL); */ return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: default: DestroyWindow(hwndDlg); return TRUE; } } return FALSE; } void About(int flags) { if(!IsWindow(hwndAbout)) hwndAbout = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_ABOUT), hwndPlayer, about_dialog_proc); ShowWindow(hwndAbout, SW_SHOW); } //----------------------------------------------------------------------------- BOOL Initialize(QCDModInfo *ModInfo, int flags) { hwndPlayer = (HWND)QCDCallbacks->Service(opGetParentWnd, 0, 0, 0); lastfn[0] = 0; seek_needed = -1; paused = 0; play_thread_handle = INVALID_HANDLE_VALUE; /* read config */ QCDCallbacks->Service(opGetPluginSettingsFile, INI_FILE, MAX_PATH, 0); config_read(); ModInfo->moduleString = "FAAD Plugin v1.0b"; ModInfo->moduleExtensions = "AAC"; /* Initialize winsock, necessary for streaming */ WinsockInit(); // insert menu item into plugin menu // QCDCallbacks->Service(opSetPluginMenuItem, hInstance, IDD_CONFIG, (long)"FAAD Plug-in"); return TRUE; } //---------------------------------------------------------------------------- void ShutDown(int flags) { Stop(lastfn, STOPFLAG_FORCESTOP); if(buffer) LocalFree(buffer); /* Deallocate winsock */ WinsockDeInit(); // delete the inserted plugin menu // QCDCallbacks->Service(opSetPluginMenuItem, hInstance, 0, 0); } //----------------------------------------------------------------------------- BOOL GetMediaSupported(LPCSTR medianame, MediaInfo *mediaInfo) { FILE_STREAM *in; faadAACInfo tmp; char *ch = strrchr(medianame, '.'); if (!medianame || !*medianame) return FALSE; if(!ch) return (lstrlen(medianame) > 2); // no extension defaults to me (if not drive letter) /* Finally fixed */ if(StringComp(ch, ".aac", 4) == 0) { in = open_filestream((char *)medianame); if(in != NULL && mediaInfo) { if(in->http) { /* No seeking in http streams */ mediaInfo->mediaType = DIGITAL_STREAM_MEDIA; mediaInfo->op_canSeek = FALSE; } else { mediaInfo->mediaType = DIGITAL_FILE_MEDIA; get_AAC_format((char *)medianame, &tmp, NULL, NULL, 1); if(tmp.headertype == 2) /* ADTS header - seekable */ mediaInfo->op_canSeek = TRUE; else mediaInfo->op_canSeek = FALSE; /* ADIF or Headerless - not seekable */ } close_filestream(in); return TRUE; } else { close_filestream(in); return FALSE; } } else return FALSE; } unsigned long samplerate, channels; int play_memmap(char *fn) { int tagsize = 0; infile = open_filestream(fn); if (infile == NULL) return 1; fileread = filelength_filestream(infile); memmap_buffer = (char*)LocalAlloc(LPTR, fileread); read_buffer_filestream(infile, memmap_buffer, fileread); /* skip id3v2 tag */ memmap_index = id3v2_tag(memmap_buffer); hDecoder = faacDecOpen(); /* Copy the configuration dialog setting and use it as the default */ /* initialize the decoder, and get samplerate and channel info */ if( (buffercount = faacDecInit(hDecoder, memmap_buffer + memmap_index, fileread - memmap_index - 1, &samplerate, &channels)) < 0 ) { show_error("Error opening input file"); return 1; } memmap_index += buffercount; PlayThread_memmap(); return 0; } int play_file(char *fn) { int k; int tagsize; ZeroMemory(buffer, 768*2); infile = open_filestream(fn); if (infile == NULL) return 1; fileread = filelength_filestream(infile); buffercount = bytecount = 0; read_buffer_filestream(infile, buffer, 768*2); tagsize = id3v2_tag(buffer); /* If we find a tag, run right over it */ if(tagsize) { if(infile->http) { int i; /* Crude way of doing this, but I believe its fast enough to not make a big difference */ close_filestream(infile); infile = open_filestream(fn); for(i=0; i < tagsize; i++) read_byte_filestream(infile); } else seek_filestream(infile, tagsize, FILE_BEGIN); bytecount = tagsize; buffercount = 0; read_buffer_filestream(infile, buffer, 768*2); } hDecoder = faacDecOpen(); /* Copy the configuration dialog setting and use it as the default */ /* initialize the decoder, and get samplerate and channel info */ if((buffercount = faacDecInit(hDecoder, buffer, 768*2, &samplerate, &channels)) < 0) { show_error("Error opening input file"); return 1; } if(buffercount > 0) { bytecount += buffercount; for (k = 0; k < (768*2 - buffercount); k++) buffer[k] = buffer[k + buffercount]; read_buffer_filestream(infile, buffer + (768*2) - buffercount, buffercount); buffercount = 0; } PlayThread_file(); return 0; } //----------------------------------------------------------------------------- BOOL Play(LPCSTR medianame, int playfrom, int playto, int flags) { if(stricmp(lastfn, medianame) != 0) { sQCDCallbacks.toPlayer.OutputStop(STOPFLAG_PLAYDONE); Stop(lastfn, STOPFLAG_PLAYDONE); } if(paused) { // Update the player controls to reflect the new unpaused state sQCDCallbacks.toPlayer.OutputPause(0); Pause(medianame, PAUSE_DISABLED); if (playfrom >= 0) seek_needed = playfrom; } else if(play_thread_handle != INVALID_HANDLE_VALUE) { seek_needed = playfrom; return TRUE; } else { int thread_id; // alloc the input buffer buffer = (unsigned char*)LocalAlloc(LPTR, 768*2); current_file_mode = m_memmap_file; if(current_file_mode) { if(play_memmap((char *)medianame)) return FALSE; } else { if(play_file((char *)medianame)) return FALSE; } if(seek_table) { free(seek_table); seek_table = NULL; seek_table_length = 0; } get_AAC_format((char *)medianame, &file_info, &seek_table, &seek_table_length, 0); seek_needed = playfrom > 0 ? playfrom : -1; killPlayThread = 0; strcpy(lastfn,medianame); /* To RageAmp: This is really needed, because aacinfo isn't very accurate on ADIF files yet. Can be fixed though :-) */ file_info.sampling_rate = samplerate; file_info.channels = frameInfo.channels; play_thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) PlayThread, (void *) &killPlayThread, 0, &thread_id); if(!play_thread_handle) return FALSE; // Note: This line seriously slows down start up time if(m_priority != 3) // if the priority in config window is set to normal, there is nothing to reset! SetThreadPriority(play_thread_handle, priority_table[m_priority]); } return TRUE; } //----------------------------------------------------------------------------- BOOL Pause(LPCSTR medianame, int flags) { if(QCDCallbacks->toPlayer.OutputPause(flags)) { // send back pause/unpause notification QCDCallbacks->toPlayer.PlayPaused(medianame, flags); paused = flags; return TRUE; } return FALSE; } //----------------------------------------------------------------------------- BOOL Stop(LPCSTR medianame, int flags) { if(medianame && *medianame && stricmp(lastfn, medianame) == 0) { sQCDCallbacks.toPlayer.OutputStop(flags); killPlayThread = 1; if(play_thread_handle != INVALID_HANDLE_VALUE) { if(WaitForSingleObject(play_thread_handle, INFINITE) == WAIT_TIMEOUT) { // MessageBox(hwndPlayer, "FAAD thread kill timeout", "debug", 0); TerminateThread(play_thread_handle,0); } CloseHandle(play_thread_handle); play_thread_handle = INVALID_HANDLE_VALUE; } if (oldAPIs) QCDCallbacks->toPlayer.PlayStopped(lastfn); lastfn[0] = 0; } return TRUE; } int aac_seek(int pos_ms, int *sktable) { double offset_sec; offset_sec = pos_ms / 1000.0; if(!current_file_mode) { seek_filestream(infile, sktable[(int)(offset_sec+0.5)], FILE_BEGIN); bytecount = sktable[(int)(offset_sec+0.5)]; buffercount = 0; read_buffer_filestream(infile, buffer, 768*2); } else { memmap_index = sktable[(int)(offset_sec+0.5)]; } return 0; } //----------------------------------------------------------------------------- void SetVolume(int levelleft, int levelright, int flags) { QCDCallbacks->toPlayer.OutputSetVol(levelleft, levelright, flags); } //----------------------------------------------------------------------------- BOOL GetCurrentPosition(LPCSTR medianame, long *track, long *offset) { return QCDCallbacks->toPlayer.OutputGetCurrentPosition((UINT*)offset, 0); } //----------------------------------------------------------------------------- BOOL GetTrackExtents(LPCSTR medianame, TrackExtents *ext, int flags) { faadAACInfo tmp; if(get_AAC_format((char*)medianame, &tmp, NULL, NULL, 1)) return FALSE; ext->track = 1; ext->start = 0; ext->end = tmp.length; ext->bytesize = tmp.bitrate * tmp.length; ext->unitpersec = 1000; return TRUE; } //--------------------------for play thread------------------------------------- int last_frame; DWORD WINAPI PlayThread(void *b) { BOOL done = FALSE, updatePos = FALSE; int decode_pos_ms = 0; // current decoding position, in milliseconds int l; int decoded_frames=0; int br_calc_frames=0; int br_bytes_consumed=0; unsigned long bytesconsumed; last_frame = 0; if(!done) { // open outputdevice WAVEFORMATEX wf; wf.wFormatTag = WAVE_FORMAT_PCM; wf.cbSize = 0; wf.nChannels = file_info.channels; wf.wBitsPerSample = 16; wf.nSamplesPerSec = file_info.sampling_rate; wf.nBlockAlign = wf.nChannels * wf.wBitsPerSample / 8; wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign; if (!QCDCallbacks->toPlayer.OutputOpen(lastfn, &wf)) { show_error("Error: Failed openning output plugin!"); done = TRUE; // cannot open sound device } } while (! *((int *)b) ) { /********************** SEEK ************************/ if (!done && seek_needed >= 0) { int seconds; // Round off to a second seconds = seek_needed - (seek_needed%1000); QCDCallbacks->toPlayer.OutputFlush(decode_pos_ms); aac_seek(seconds, seek_table); decode_pos_ms = seconds; decoded_frames = 0; br_calc_frames = 0; br_bytes_consumed = 0; seek_needed = -1; updatePos = 1; } /********************* QUIT *************************/ if (done) { if (QCDCallbacks->toPlayer.OutputDrain(0) && !(seek_needed >= 0)) { play_thread_handle = INVALID_HANDLE_VALUE; QCDCallbacks->toPlayer.OutputStop(STOPFLAG_PLAYDONE); QCDCallbacks->toPlayer.PlayDone(lastfn); } else if (seek_needed >= 0) { done = FALSE; continue; } break; } /******************* DECODE TO BUFFER ****************/ else { if (current_file_mode) bytesconsumed = PlayThread_memmap(); else bytesconsumed = PlayThread_file(); if(last_frame) done = TRUE; else { decoded_frames++; br_calc_frames++; br_bytes_consumed += bytesconsumed; /* Update the variable bitrate about every second */ if(m_variable_bitrate_display && br_calc_frames == 43) { AudioInfo vai; vai.struct_size = sizeof(AudioInfo); vai.frequency = file_info.sampling_rate; vai.bitrate = (int)((br_bytes_consumed * 8) / (decoded_frames / 43.07)); vai.mode = (channels == 2) ? 0 : 3; vai.layer = 0; vai.level = file_info.version; QCDCallbacks->Service(opSetAudioInfo, &vai, sizeof(AudioInfo), 0); br_calc_frames = 0; } if (!killPlayThread && (frameInfo.samples > 0)) { //update the time display if (updatePos) { QCDCallbacks->toPlayer.PositionUpdate(decode_pos_ms); updatePos = 0; } { WriteDataStruct wd; l = frameInfo.samples * sizeof(short); decode_pos_ms += (1024*1000)/file_info.sampling_rate; wd.bytelen = l; wd.data = sample_buffer; wd.markerend = 0; wd.markerstart = decode_pos_ms; wd.bps = 16; wd.nch = frameInfo.channels; wd.numsamples =l/file_info.channels/(16/8); wd.srate = file_info.sampling_rate; if (!QCDCallbacks->toPlayer.OutputWrite(&wd)) done = TRUE; } } } } Sleep(10); } // close up play_thread_handle = INVALID_HANDLE_VALUE; faacDecClose(hDecoder); hDecoder = INVALID_HANDLE_VALUE; close_filestream(infile); infile = NULL; if(seek_table) { free(seek_table); seek_table = NULL; seek_table_length = 0; } if(buffer) { LocalFree(buffer); buffer = NULL; } if(memmap_buffer) { LocalFree(memmap_buffer); memmap_buffer = NULL; } return 0; } // thread play funcs int PlayThread_memmap() { sample_buffer = (char*)faacDecDecode(hDecoder, &frameInfo, memmap_buffer + memmap_index, fileread - memmap_index - 1); if (frameInfo.error) { // show_error(faacDecGetErrorMessage(frameInfo.error)); last_frame = 1; } memmap_index += frameInfo.bytesconsumed; if (memmap_index >= fileread) last_frame = 1; return frameInfo.bytesconsumed; } int PlayThread_file() { int k; if (buffercount > 0) { for (k = 0; k < (768*2 - buffercount); k++) buffer[k] = buffer[k + buffercount]; read_buffer_filestream(infile, buffer + (768*2) - buffercount, buffercount); buffercount = 0; } sample_buffer = (char*)faacDecDecode(hDecoder, &frameInfo, buffer, 768*2); if (frameInfo.error) { // show_error(faacDecGetErrorMessage(frameInfo.error)); last_frame = 1; } buffercount += frameInfo.bytesconsumed; bytecount += frameInfo.bytesconsumed; if (bytecount >= fileread) last_frame = 1; return frameInfo.bytesconsumed; } // tag int id3v2_tag(unsigned char *buffer) { if (StringComp(buffer, "ID3", 3) == 0) { unsigned long tagsize; /* high bit is not used */ tagsize = (buffer[6] << 21) | (buffer[7] << 14) | (buffer[8] << 7) | (buffer[9] << 0); tagsize += 10; return tagsize; } else { return 0; } }faad2-2_10_0/plugins/QCD/QCDFAAD.sln000066400000000000000000000026751374350120500165540ustar00rootroot00000000000000 Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QCDFAAD", "QCDFAAD.vcproj", "{71955EB0-4F77-462B-A844-2BA56E74B87E}" ProjectSection(ProjectDependencies) = postProject {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} = {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\..\libfaad\libfaad.vcproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {71955EB0-4F77-462B-A844-2BA56E74B87E}.Debug|Win32.ActiveCfg = Debug|Win32 {71955EB0-4F77-462B-A844-2BA56E74B87E}.Debug|Win32.Build.0 = Debug|Win32 {71955EB0-4F77-462B-A844-2BA56E74B87E}.Release|Win32.ActiveCfg = Release|Win32 {71955EB0-4F77-462B-A844-2BA56E74B87E}.Release|Win32.Build.0 = Release|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|Win32.ActiveCfg = Debug|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|Win32.Build.0 = Debug|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|Win32.ActiveCfg = Release|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal faad2-2_10_0/plugins/QCD/QCDFAAD.vcproj000066400000000000000000000165421374350120500172610ustar00rootroot00000000000000 faad2-2_10_0/plugins/QCD/QCDInputDLL.h000066400000000000000000000031131374350120500171330ustar00rootroot00000000000000//----------------------------------------------------------------------------- // // File: QCDInputDLL.h // // About: QCD Player Input module DLL interface. For more documentation, see // QCDModInput.h. // // Authors: Written by Paul Quinn and Richard Carlson. // // QCD multimedia player application Software Development Kit Release 1.0. // // Copyright (C) 1997-2002 Quinnware // // This code is free. If you redistribute it in any form, leave this notice // here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // //----------------------------------------------------------------------------- #ifndef QCDInputDLL_H #define QCDInputDLL_H #include "QCDModInput.h" extern HINSTANCE hInstance; extern HWND hwndPlayer; extern QCDModInitIn sQCDCallbacks, *QCDCallbacks; // Calls from the Player int GetMediaSupported(const char* medianame, MediaInfo *mediaInfo); int GetTrackExtents(const char* medianame, TrackExtents *ext, int flags); int GetCurrentPosition(const char* medianame, long *track, long *offset); void SetEQ(EQInfo*); void SetVolume(int levelleft, int levelright, int flags); int Play(const char* medianame, int framefrom, int frameto, int flags); int Pause(const char* medianame, int flags); int Stop(const char* medianame, int flags); int Eject(const char* medianame, int flags); int Initialize(QCDModInfo *ModInfo, int flags); void ShutDown(int flags); void Configure(int flags); void About(int flags); #endif //QCDInputDLL_Hfaad2-2_10_0/plugins/QCD/QCDModDefs.h000066400000000000000000000402411374350120500170240ustar00rootroot00000000000000//----------------------------------------------------------------------------- // // File: QCDModDefs.h // // About: Module definitions file. Miscellanious definitions used by different // module types. This file is published with the plugin SDKs. // // Authors: Written by Paul Quinn and Richard Carlson. // // Copyright: // // QCD multimedia player application Software Development Kit Release 1.0. // // Copyright (C) 1997-2002 Quinnware // // This code is free. If you redistribute it in any form, leave this notice // here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // //----------------------------------------------------------------------------- #ifndef QCDMODDEFS_H #define QCDMODDEFS_H #include #ifdef __cplusplus #define PLUGIN_API extern "C" __declspec(dllexport) #else #define PLUGIN_API __declspec(dllexport) #endif // Current plugin version #define PLUGIN_API_VERSION 250 //----------------------------------------------------------------------------- typedef struct { char *moduleString; char *moduleExtensions; } QCDModInfo; //----------------------------------------------------------------------------- // Services (ops) provided by the Player //----------------------------------------------------------------------------- typedef enum { //*** below returns numeric info (*buffer not used) opGetPlayerVersion = 0, // high-order word = major version (eg 3.01 is 3), low-order word = minor (eg 3.01 = 1) opGetParentWnd = 1, // handle to player window opGetPlayerInstance = 2, // HINSTANCE to player executable opGetPlayerState = 9, // get current state of the player (returns: 1 = stopped, 2 = playing, 3 = paused, 0 = failed) opGetNumTracks = 10, // number of tracks in playlist opGetCurrentIndex = 11, // index of current track in playlist (0 based) opGetNextIndex = 12, // get index of next track to play (0 based), param1 = index start index. -1 for after current opGetTrackNum = 13, // get track number of index, param1 = index of track in playlist, -1 for current // - 'track number' is the number of the track in it's respective album, as opposed to playlist number // - the 'track number' for digital files will be 1, unless they are tagged with the CDDB identifier opGetTrackLength = 14, // get track length, param1 = index of track in playlist, -1 for current // param2 = 0 for seconds, 1 for milliseconds opGetTime = 15, // get time on player, param1 = 0 for time displayed, 1 for track time, 2 for playlist time // param2 = 0 for elapsed, 1 for remaining opGetTrackState = 16, // get whether track is marked, param1 = index of track, -1 for current opGetPlaylistNum = 17, // get playlist number of index, param1 = index of track in playlist, -1 for current opGetMediaType = 18, // get media type of track, param1 = index if track in playlist, -1 for current // - see MediaTypes below for return values opGetAudioInfo = 19, // get format info about currently playing track // - param1 = 0 for samplerate, 1 for bitrate, 2 for num channels opGetOffline = 20, // true if client is in Offline Mode opGetVisTarget = 21, // where is vis being drawn > 0 - internal to skin, 1 - external window, 2 - full screen opGetAlwaysOnTop = 22, // true if player is set to 'Always on Top' opGetRepeatState = 23, // returns: 0 - repeat off, 1 - repeat track, 2 - repeat all opGetShuffleState = 27, // returns: 0 - shuffle off, 1 - shuffle enabled opGetTimerState = 24, // low-order word: 0 - track ascend, 1 - playlist ascend, 2 - track descend, 3 - playlist descend // hi-order word: 1 if 'show hours' is set, else 0 opGetVolume = 25, // get master volume level (0 - 100), param1: 0 = combined, 1 = left, 2 = right opSetVolume = 26, // set master volume level, param1: vol level 0 - 100, param2: balance (-100 left, 0 center, 100 right) opGetIndexFromPLNum = 28, // get index from playlist number, param1 = playlist number opGetChildWnd = 30, // handle to the draggable window extension (only available on some skins) opGetExtVisWnd = 31, // handle to the external visual window opGetMusicBrowserWnd = 32, // handle to the music browser window opGetSkinPreviewWnd = 33, // handle to the skin preview window opGetPropertiesWnd = 34, // handle to the player properties window opGetExtInfoWnd = 35, // handle to the extended information window opGetAboutWnd = 36, // handle to the about window opGetSegmentsWnd = 37, // handle to the segments window opGetEQPresetsWnd = 38, // handle to the EQ presets window opGetVisDimensions = 50, // gets the width and height of visual window (param1 = -1 current vis window, 0 internal vis, 1 external vis, 2 full screen) // returns: HEIGHT in high word, WIDTH in low word opGetQueriesComplete = 60, // get status on whether all tracks in playlist have been queryied for their info // playlist manipulation opDeleteIndex = 90, // delete index from playlist (param1 = index) opSelectIndex = 91, // mark index as selected (param1 = index, param2 = 1 - set, 0 - unset) opBlockIndex = 92, // mark index as blocked (param1 = index, param2 = 1 - set, 0 - unset) opGetMediaInfo = 99, // get the CddbDisc object for the index specified, param1 = index of track, -1 for current // param2 = pointer to integer that receives track value // returns: pointer to CddbDisc object. Do not release or deallocate this pointer //*** below returns string info in buffer, param1 = size of buffer //*** returns 1 on success, 0 on failure opGetTrackName = 100, // get track name, param2 = index of track in playlist, -1 for current opGetArtistName = 101, // get artist name, param2 = index of track in playlist, -1 for current opGetDiscName = 102, // get disc name, param2 = index of track in playlist, -1 for current opGetTrackFile = 103, // file name of track in playlist, param2 = index of track in playlist, -1 for current opGetSkinName = 104, // get current skin name opGetPluginFolder = 105, // get current plugin folder opGetPluginSettingsFile = 106, // get settings file (plugins.ini) that plugin should save settings to opGetPluginCacheFile = 107, // get file that describes plugin validity, functions and names opGetPlayerSettingsFile = 108, // get settings file (qcd.ini) that player saves it settings to (should use for read-only) opGetMusicFolder = 110, // get current music folder opGetPlaylistFolder = 111, // get current playlist folder opGetSkinFolder = 112, // get current skin folder opGetCDDBCacheFolder = 113, // get current folder for CDDB cached info opGetCurrentPlaylist = 114, // get full pathname of playlist currently loaded opGetMediaID = 115, // get media identifier, param2 = index of track in playlist, -1 for current // - for CD's it's the TOC - for anything else, right now it's 0 opGetSupportedExtensions = 116, // get file extensions supported by the player, param2 = 0 - get all extensions, 1 - get registered extensions // - returned extensions will be colon delimited //*** below buffer points to struct or other object //*** returns 1 on success, 0 on failure opShowMainMenu = 120, // Display Main QCD Menu (buffer = POINT* - location to display menu) opGetMainMenu = 121, // Returns copy of HMENU handle to QCD Menu (must use DestroyMenu on handle when complete) opShowQuickTrack = 125, // Display QuickTrack Menu (buffer = POINT* - location to display menu) opGetEQVals = 200, // get current EQ levels/on/off (buffer = EQInfo*) opSetEQVals = 201, // set EQ levels/on/off (buffer = EQInfo*) opGetProxyInfo = 202, // get proxy info (buffer = ProxyInfo*), returns 0 if proxy not in use //*** below returns numeric info, buffer used opGetIndexFromFilename = 210, // get the index of a file that exists in current playlist (buffer = full path of file), // param1 = startindex (index to start searching on) // returns -1 if file not in playlist //*** below send information to player //*** returns 1 on success, 0 on failure opSetStatusMessage = 1000, // display message in status area (buffer = msg buffer (null term), param1 = text flags (see below)) opSetBrowserUrl = 1001, // set music browser URL (buffer = url (null term)) // null url buffer - closes browser // param1 = 0 - normal, 1 - force open opSetAudioInfo = 1002, // set the current music bitrate/khz (buffer = AudioInfo*, param1 = size of AudioInfo) opSetTrackAlbum = 1003, // update track ablum name (buffer = album (null term), param1 = (string ptr)file name), param2 = MediaTypes opSetTrackTitle = 1004, // update track title (buffer = title (null term), param1 = (string ptr)file name), param2 = MediaTypes opSetTrackArtist = 1005, // update track artist name (buffer = artist (null term), param1 = (string ptr)file name), param2 = MediaTypes opSetPlaylist = 1006, // add files to or reset playlist with new files (buffer = file list (null term), param1 = (string ptr)originating path (can be NULL), param2 = 1 - clear playlist flag, 2 - enqueue to top opSetTrackExtents = 1007, // update track TrackExtents info (buffer = &TrackExtents), param1 = (string ptr)file name) opSetTrackSeekable = 1008, // update track seekable flag (buffer = (string ptr)file name), param1 = TRUE/FALSE opSetPlayNext = 1009, // set the next index to be played (buffer = NULL, param1 = index, index = -1 unsets playnext) opSetIndexFilename = 1010, // updates the filename (or stream) that an index in the current playlist refers to, buffer = new filename, param1 = index opSetSeekPosition = 1100, // seek to position during playback (buffer = NULL, param1 = position, param2 = 0 - position is in seconds, 1 - position is in milliseconds, 2 - position is in percent (use (float)param1)) //*** below configures custom plugin menu items for the 'plugin menu' //*** Player will call plugin's configure routine with menu value when menu item selected //*** returns 1 on success, 0 on failure opSetPluginMenuItem = 2000, // buffer = HINSTANCE of plugin, param1 = item id, param2 = (string ptr)string to display // - set param2 = 0 to remove item id from menu // - set param1 = 0 and param2 = 0 to remove whole menu opSetPluginMenuState = 2001, // buffer = HINSTANCE of plugin, param1 = item id, param2 = menu flags (same as windows menu flags - eg: MF_CHECKED) //*** other services opSafeWait = 10000 // plugin's can use this to wait on an object without worrying about deadlocking the player. // this should only be called by the thread that enters the plugin, not by any plugin-created threads } PluginServiceOp; //----------------------------------------------------------------------------- // Info services api provided by the Player, called by Plugin. //----------------------------------------------------------------------------- typedef long (*PluginServiceFunc)(PluginServiceOp op, void *buffer, long param1, long param2); //----------------------------------------------------------------------------- typedef struct // for Output Plugin Write callback { void *data; // pointer to valid data int bytelen; // length of data pointed to by 'data' in bytes UINT numsamples; // number of samples represented by 'data' UINT bps; // bits per sample UINT nch; // number of channels UINT srate; // sample rate UINT markerstart; // Marker position at start of data (marker is time value of data) // (set to WAVE_VIS_DATA_ONLY to not have data sent to output plugins) UINT markerend; // Marker position at end of data (not currently used, set to 0) } WriteDataStruct; //----------------------------------------------------------------------------- typedef struct // for GetTrackExtents Input Plugin callback { UINT track; // for CD's, set the track number. Otherwise set to 1. UINT start; // for CD's or media that doesn't start at the beginning // of the file, set to start position. Otherwise set to 0. UINT end; // set to end position of media. UINT unitpersec; // whatever units are being used for this media, how many // of them per second. // (Note: ((end - start) / unitpersecond) = file length UINT bytesize; // size of file in bytes (if applicable, otherwise 0). } TrackExtents; //----------------------------------------------------------------------------- typedef struct // for opSetAudioInfo service { long struct_size; // sizeof(AudioInfo) long level; // MPEG level (1 for MPEG1, 2 for MPEG2, 3 for MPEG2.5, 7 for MPEGpro) long layer; // and layer (1, 2 or 3) long bitrate; // audio bitrate in bits per second long frequency; // audio freq in Hz long mode; // 0 for stereo, 1 for joint-stereo, 2 for dual-channel, 3 for mono, 4 for multi-channel } AudioInfo; //----------------------------------------------------------------------------- // Equalizer Info //----------------------------------------------------------------------------- typedef struct // for coming QCD version { long struct_size; // sizeof(EQInfo) char enabled; char preamp; // -128 to 127, 0 is even char bands[10]; // -128 to 127, 0 is even } EQInfo; //----------------------------------------------------------------------------- typedef struct { long struct_size; // sizeof(ProxyInfo) char hostname[200]; long port; char username[100]; char password[100]; } ProxyInfo; //----------------------------------------------------------------------------- typedef enum // for MediaInfo.mediaType { UNKNOWN_MEDIA = 0, CD_AUDIO_MEDIA = 1, DIGITAL_FILE_MEDIA = 2, DIGITAL_STREAM_MEDIA = 3 } MediaTypes; //----------------------------------------------------------------------------- #define MAX_TOC_LEN 2048 typedef struct { // media descriptors CHAR mediaFile[MAX_PATH]; MediaTypes mediaType; // cd audio media info CHAR cd_mediaTOC[MAX_TOC_LEN]; int cd_numTracks; int cd_hasAudio; // operation info int op_canSeek; // not used int reserved[4]; } MediaInfo; //----------------------------------------------------------------------------- // When subclassing the parent window, a plugin can watch for these messages // to react to events going on between plugins and player // DO NOT SEND THESE MESSAGES - can only watch for them // Plugin to Player Notifiers #define WM_PN_POSITIONUPDATE (WM_USER + 100) // playback progress updated #define WM_PN_PLAYSTARTED (WM_USER + 101) // playback has started #define WM_PN_PLAYSTOPPED (WM_USER + 102) // playback has stopped by user #define WM_PN_PLAYPAUSED (WM_USER + 103) // playback has been paused #define WM_PN_PLAYDONE (WM_USER + 104) // playback has finished (track completed) #define WM_PN_MEDIAEJECTED (WM_USER + 105) // a CD was ejected (lParam = (LPCSTR)medianame) #define WM_PN_MEDIAINSERTED (WM_USER + 106) // a CD was inserted (lParam = (LPCSTR)medianame) #define WM_PN_INFOCHANGED (WM_USER + 107) // track information was updated (lParam = (LPCSTR)medianame) #define WM_PN_TRACKCHANGED (WM_USER + 109) // current track playing has changed (relevant from CD plugin) (lParam = (LPCSTR)medianame) // Player to Plugin Notifiers #define WM_PN_PLAYLISTCHANGED (WM_USER + 200) // playlist has changed in some way (add, delete, sort, shuffle, drag-n-drop, etc...) // For intercepting main menu display // (so you can get handle, modify, and display your own) #define WM_SHOWMAINMENU (WM_USER + 20) //----------------------------------------------------------------------------- // To shutdown player, send this command #define WM_SHUTDOWN (WM_USER + 5) //----------------------------------------------------------------------------- // opSetStatusMessage textflags #define TEXT_DEFAULT 0x0 // message scrolls by in status window #define TEXT_TOOLTIP 0x1 // message acts as tooltip in status window #define TEXT_URGENT 0x2 // forces message to appear even if no status window (using msg box) #define TEXT_HOLD 0x4 // tooltip message stays up (no fade out) #endif //QCDMODDEFS_Hfaad2-2_10_0/plugins/QCD/QCDModInput.h000066400000000000000000000114731374350120500172470ustar00rootroot00000000000000//----------------------------------------------------------------------------- // // File: QCDModInput.h // // About: Input plugin module interface. This file is published with the // Input plugin SDK. // // Authors: Written by Paul Quinn and Richard Carlson. // // Copyright: // // QCD multimedia player application Software Development Kit Release 1.0. // // Copyright (C) 1997-2002 Quinnware // // This code is free. If you redistribute it in any form, leave this notice // here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // //----------------------------------------------------------------------------- #ifndef QCDMODINPUT_H #define QCDMODINPUT_H #include "QCDModDefs.h" // name of the DLL export for input plugins #define INPUTDLL_ENTRY_POINT QInputModule2 // (updated plugin api version 240+) // media insert flags #define MEDIAINSERT_PLAY 0x1 #define MEDIAINSERT_ADDTRACKS 0x2 #define MEDIAINSERT_ADDSEGMENTS 0x4 #define MEDIAINSERT_CLEARPLAYLIST 0x8 // Stop will receive one of these flags (pass to output plugin's stop()) #define STOPFLAG_FORCESTOP 0 // stop occuring due to user action or other event #define STOPFLAG_PLAYDONE 1 // stop occuring due to playlist completion // play flags #define PLAYFLAG_PLAYBACK 0x0 #define PLAYFLAG_ENCODING 0x1 #define PLAYFLAG_SEEKING 0x2 // Wave Marker flags #define WAVE_VIS_DATA_ONLY -1 // set to WaveDataStruct.markerstart in OutputWrite() call have data only go to vis // and not to output plugin // pause flags #define PAUSE_DISABLED 0 // Pause() call is to unpause playback #define PAUSE_ENABLED 1 // Pause() call is to pause playback //----------------------------------------------------------------------------- // Input Module //----------------------------------------------------------------------------- typedef struct { unsigned int size; // size of init structure unsigned int version; // plugin structure version (set to PLUGIN_API_VERSION) PluginServiceFunc Service; // player supplied services callback struct { void (*PositionUpdate)(unsigned int position); void (*PlayStopped)(const char* medianame); // notify player of play stop void (*PlayStarted)(const char* medianame); // notify player of play start void (*PlayPaused)(const char* medianame, int flags); // notify player of play pause void (*PlayDone)(const char* medianame); // notify player when play done void (*PlayTrackChanged)(const char* medianame); // notify player when playing track changes (cd audio relevant only) void (*MediaEjected)(const char* medianame); // notify player of media eject (cd audio relevant) void (*MediaInserted)(const char* medianame, int flags); // notify player of media insert (cd audio relevant) // output plugin calls int (*OutputOpen)(const char* medianame, WAVEFORMATEX*); // open output for wave data int (*OutputWrite)(WriteDataStruct*); // send PCM audio data to output // (blocks until write completes, thus if output is paused can // block until unpaused) int (*OutputDrain)(int flags); // wait for all output to complete (blocking) int (*OutputDrainCancel)(int flags); // break a drain in progress int (*OutputFlush)(unsigned int marker); // flush output upto marker int (*OutputStop)(int flags); // stop output int (*OutputPause)(int flags); // pause output int (*OutputSetVol)(int levelleft, int levelright, int flags); int (*OutputGetCurrentPosition)(unsigned int *position, int flags); void *Reserved[10]; } toPlayer; struct { int (*Initialize)(QCDModInfo *modInfo, int flags); // initialize plugin void (*ShutDown)(int flags); // shutdown plugin int (*Play)(const char* medianame, int playfrom, int playto, int flags); // start playing playfrom->playto int (*Stop)(const char* medianame, int flags); // stop playing int (*Pause)(const char* medianame, int flags); // pause playback int (*Eject)(const char* medianame, int flags); // eject media void (*SetEQ)(EQInfo*); // update EQ settings int (*GetMediaSupported)(const char* medianame, MediaInfo *mediaInfo); // does plugin support medianame (and provides info for media) int (*GetTrackExtents)(const char* medianame, TrackExtents *ext, int flags); // get media start, end & units int (*GetCurrentPosition)(const char* medianame, long *track, long *offset); // get playing media's position void (*Configure)(int flags); // launch configuration void (*About)(int flags); // launch about info void (*SetVolume)(int levelleft, int levelright, int flags); // level 0 - 100 void *Reserved[10]; } toModule; } QCDModInitIn; #endif //QCDMODINPUT_H faad2-2_10_0/plugins/QCD/ReadMe.txt000066400000000000000000000006671374350120500167100ustar00rootroot00000000000000QCDFAAD.dll input Plugin for Quintessential Player (QCD) Please goto http://www.quinnware.com to download the latest version of QCD. About Tagging music file: Because QCD support ID3v1 & ID3v2 functions. So you can add a string -- ":AAC" in the configuration dialog box of QCDcddb.dll Libarary Plugin. (I think you will find it and will know how to do it, otherwise you can visite the message forum on the web site.) Have a good time:)faad2-2_10_0/plugins/QCD/logo.bmp000066400000000000000000002530761374350120500164560ustar00rootroot00000000000000BM>V6( nV +3;K\\\USKDD=55.,#####3CCC;+#### { { ss#3;CKKKKKKSSSKKKSKC+{#t{#+3,$$ { { s s{#2CCCCCCCCCKK;3#### #{{{###{#3CKCC;,#{ssssllllssss#{#+23;;;;3++3CCC;43,$#{ s kkk kk s{ { {#$,.4;CKSZZK;# { s {{{#+;CKSSSSSSSC+{{$+##+3CS\\\UKKDD=543+##3CKKC3+### { { { {{ {{#+;CKKKKKKRSSKKKKK;*ts{#,33,$ { { s s{2:C;CCC;CCKKC3+##$ ##{{###+;CCC;,${sssslllllss{{#+233;;;3++3CCC<4.,$#s k c c c c kk s{{ $$,.4ryZc{l#t#Iw~ss 3;;3#{FryhC3,$ { {%wZ|w~w~N+34;3RrtZ,$#+33Kw~hhCCC+# ll klls{+$4,#slIxw~|b}%ws{ {{{{IttI skd ks{C3333,%ZSSKKKCZɀkss s { { b}B8|t{l#{L€ 3;43+%k}t=,$ |b}=$,3>tt/##+3RǀKKK+# l k k kl9yw~|W+#4,#!xw~L{ {{|k}k}ik ks{;3333,%$ZSSKKCCC|"vss { {||^sl- 2;;3+kr,${p~=#,3rr##+=򀀀KKK$# slddIx$#;,#w~@| {{kk}k ks;+334,,$SSKKCCC;fWw~slL€js 2;;3LрssM$Z||$#+SЀjjB#3ZcjKKK,#sld#l倀$;,#L€hcr#{ {4xӀsj4x ks:+334.,$SSKKCCC;G倀*hfslkZ`瀀 2C;3her怀h$*耀T|"v!xT|W+h>I瀀h+3r7G倀SKK,${sldZ|WW#;,#kG=w~|p~Z|=*#{ {b}TT怀b} ks3+;3;.,$ SKKKCC;33tp~ RG倀ss|SZ 3C;3|Zf|$T|T|{{{{T|k+|,Cw~#+;|3;SSK,{slp~*%򀀀#+CSSKC;,|C;+{ {{{ {w~C;w~ ks3#;3;4,$ SKKCCC;33Tŀ@ R;ssSU :;;;Sc$k}*{{{!xp~|b}@#$;#3;3CSSK,{{sl+CSSKC;,C;3# {{{{ s;3 ks2#;3;4,$ KKCCC;;3+1􀀀h#T|K;ssZU :;;3|Sc|#|{{s{{ #|#;|+3;;CUUK,${{{s+CSSKC4+|KC3+ {{{{ s sw~;3| ks6#@3;4,$KKCCC;;3++^6#|Z|K3s#tr``瀀#:;;;hTe怀h {{{{{ #h7I瀀h+;:rIU倀USK,$N9yˀ{{sw~-*耀+CSSK;3+kUK||rZ|9y!x{ s sb}G7倀b} kscIȀcZ;4,$KKCCC;33+#>ՀTD׀4xC+s#{Wss#:;;;LрjsK #{{{{{ { #LрhjI+;:cjsUSK,$w~{{{b}W^$CSSC;3+@ƀsfk}s s s4xӀhc9y ksy<4,$KDCC;;3++#w~hhp~{C+#t#{5 #CC;;3rr, {k}7{{{{ { { {#+rr#+:35 SKK,$Z|{{@|ր #CSSC;3${k}4xs s s skk} k ksj<4,$SDC;;;3++#L€|E|;##t#{#Z+CC;335kyC+ {T|c#5|p~b}Ix%w#+=tt1#3:3#NKKK,$b}|%w{{sb} #CRSC;3$ {np~Ix ks k s skk}r k ss#h|h|Z<3,$#SDC<;33+#{(wv{{3#{#t#{#+Syy+CC;;3+#Fp~yhR;+ {%w݀h7$I|b}{#3::RryZ3++3:2BryCCC,$$T|%wk}k}#l s{#{*tT|w~b}^ CRRC;3# { k{Ty|h5 s kl ks {#Krp~E|s s s s{#cDrrTCRw~y`K;3,$+SKD<433+#{sb}b} s{{{$;CKKC+##+3,##{*t+{#+;Rff\S+CYj{{w[KC;33#{#:S[cZK;+ skb}%w{+:CC3+$;CC3++3:++3CKSCCCC3,+$$,,${{sskkdd ks{#{+{3{E{E{C;|3{+# CRRC;3#sl{+CSZSC3+s k k ks {#$+# s {{{ s s s{+:CSSK3##+3;CC33CZffZK;3,$+SKD<53,+#{s@|ր4x ss{{+;CKC;+++3,##{3{+{#+;Rff\S2CSC;33+{#:K[cZK;+ sklp~Ixks3CSK:+#3CC3++33++;KSS;;C$$${{skkddd ks{#{+{;|JRLJC;+# {;KRK;,#ss+CSZSC4+{ k kkk {#+# { { {{{ { s s{+:CSSK3#++;CCC33CZff\SC4,$#3ZKD<53,##{s#{w~w~ s s ss{#+;CCC3##+33+#+{3{+{#+;Sff\U#3C[C;33+s#3KZ[[K;+ skl0xhE| kks;S[SC+3CC3++3:+#3CKSS;;;$$$ssskkddd ks{#{3CVc[VLL;+ {;KRK;,#ss3CZZSK4+{ k kks {## { { {{{ s s{+:CS[S3++3;CK;33CcfffSC4,$#;ZKD<5.,#ss#{WN s s ss{#+;CC;+##3;3+##+{;|+{##;Sff\U#3ChK;3++s3CS[[K;+ { s kl3{KWcw~w~W-s k c#tLhj[C++;C3++3:+#3CKSS;;;$$$ {sskkdd^ cl{#3Jcgtgg[L3## {3KSK;3#ss3KZZZK;,#{ kdks{## {{{ s s{+:C[[S;++3;CK;33CZfffZC;,$+<ZSK<5.,#ss#{ #include #ifdef __cplusplus #define PLUGIN_API extern "C" __declspec(dllexport) #else #define PLUGIN_API __declspec(dllexport) #endif // Current plugin version // use this version for old style API calls (all returned text in native encoding) #define PLUGIN_API_VERSION 250 // use this version for new style API calls (all returned text in UTF8 encoding on WinNT/2K/XP (native encoding on Win9x)) #define PLUGIN_API_VERSION_WANTUTF8 ((PLUGIN_API_WANTUTF8<<16)|PLUGIN_API_VERSION) #define PLUGIN_API_WANTUTF8 100 //----------------------------------------------------------------------------- typedef struct { char *moduleString; char *moduleExtensions; } QCDModInfo; //----------------------------------------------------------------------------- // Services (ops) provided by the Player //----------------------------------------------------------------------------- typedef enum { //*** below returns numeric info (*buffer not used) opGetPlayerVersion = 0, // high-order word = major version (eg 3.01 is 3), low-order word = minor (eg 3.01 = 1) opGetParentWnd = 1, // handle to player window opGetPlayerInstance = 2, // HINSTANCE to player executable opGetPlayerState = 9, // get current state of the player (returns: 1 = stopped, 2 = playing, 3 = paused, 0 = failed) opGetNumTracks = 10, // number of tracks in playlist opGetCurrentIndex = 11, // index of current track in playlist (0 based) opGetNextIndex = 12, // get index of next track to play (0 based), param1 = index start index. -1 for after current opGetTrackNum = 13, // get track number of index, param1 = index of track in playlist, -1 for current // - 'track number' is the number of the track in it's respective album, as opposed to playlist number // - the 'track number' for digital files will be 1 if the tag is not set or the file is not identified opGetTrackLength = 14, // get track length, param1 = index of track in playlist, -1 for current // param2 = 0 for seconds, 1 for milliseconds opGetTime = 15, // get time on player, param1 = 0 for time displayed, 1 for track time, 2 for playlist time // param2 = 0 for elapsed, 1 for remaining opGetTrackState = 16, // get whether track is marked, param1 = index of track, -1 for current opGetPlaylistNum = 17, // get playlist number of index, param1 = index of track in playlist, -1 for current opGetMediaType = 18, // get media type of track, param1 = index if track in playlist, -1 for current // - see MediaTypes below for return values opGetAudioInfo = 19, // get format info about currently playing track // - param1 = 0 for samplerate, 1 for bitrate, 2 for num channels opGetOffline = 20, // true if client is in Offline Mode opGetVisTarget = 21, // where is vis being drawn > 0 - internal to skin, 1 - external window, 2 - full screen opGetAlwaysOnTop = 22, // true if player is set to 'Always on Top' opGetRepeatState = 23, // returns: 0 - repeat off, 1 - repeat track, 2 - repeat all opGetShuffleState = 27, // returns: 0 - shuffle off, 1 - shuffle enabled opGetTimerState = 24, // low-order word: 0 - track ascend, 1 - playlist ascend, 2 - track descend, 3 - playlist descend // hi-order word: 1 if 'show hours' is set, else 0 opGetVolume = 25, // get master volume level (0 - 100), param1: 0 = combined, 1 = left, 2 = right opSetVolume = 26, // set master volume level, param1: vol level 0 - 100, param2: balance (-100 left, 0 center, 100 right) opGetIndexFromPLNum = 28, // get index from playlist number, param1 = playlist number opGetExtensionWnd = 30, // handle to the draggable window extension (only available on some skins), param1 = extension number (0 - 9) opGetExtVisWnd = 31, // handle to the external visual window opGetMusicBrowserWnd = 32, // handle to the music browser window opGetSkinPreviewWnd = 33, // handle to the skin preview window opGetPropertiesWnd = 34, // handle to the player properties window opGetExtInfoWnd = 35, // handle to the extended information window opGetAboutWnd = 36, // handle to the about window opGetSegmentsWnd = 37, // handle to the segments window opGetEQPresetsWnd = 38, // handle to the EQ presets window opGetVideoWnd = 39, // handle to the video window opGetVisDimensions = 50, // gets the width and height of visual window (param1 = -1 current vis window, 0 internal vis, 1 external vis, 2 full screen) // returns: HEIGHT in high word, WIDTH in low word opShowVideoWindow = 55, // Show or Close video window (param1 = 1 for create, 2 for create and show, 0 for close) opGetQueriesComplete = 60, // get status on whether all tracks in playlist have been queryied for their info // playlist manipulation opDeleteIndex = 90, // delete index from playlist (param1 = index) opSelectIndex = 91, // mark index as selected (param1 = index, param2 = 1 - set, 0 - unset) opBlockIndex = 92, // mark index as blocked (param1 = index, param2 = 1 - set, 0 - unset) opGetMediaInfo = 99, // get the ICddbDisc object for the index specified, param1 = index of track, -1 for current // param2 = pointer to integer that receives track value // returns: pointer to ICddbDisc object. Do not release or deallocate this pointer //*** below returns string info in buffer, param1 = size of buffer //*** returns 1 on success, 0 on failure opGetTrackName = 100, // get track name, param2 = index of track in playlist, -1 for current opGetArtistName = 101, // get artist name, param2 = index of track in playlist, -1 for current opGetDiscName = 102, // get disc name, param2 = index of track in playlist, -1 for current opGetTrackFile = 103, // file name of track in playlist, param2 = index of track in playlist, -1 for current opGetSkinName = 104, // get current skin name opGetPluginFolder = 105, // get current plugin folder opGetPluginSettingsFile = 106, // get settings file (plugins.ini) that plugin should save settings to opGetPluginCacheFile = 107, // get file that describes plugin validity, functions and names opGetPlayerSettingsFile = 108, // get settings file (qcd.ini) that player saves it settings to (should use for read-only) opGetMusicFolder = 110, // get current music folder opGetPlaylistFolder = 111, // get current playlist folder opGetSkinFolder = 112, // get current skin folder opGetCDDBCacheFolder = 113, // get current folder for CDDB cached info opGetCurrentPlaylist = 114, // get full pathname of playlist currently loaded opGetMediaID = 115, // get media identifier, param2 = index of track in playlist, -1 for current // - for CD's it's the TOC - for anything else, right now it's 0 opGetSupportedExtensions = 116, // get file extensions supported by the player, param2 = 0 - get all extensions, 1 - get registered extensions // - returned extensions will be colon delimited opGetPlaylistString = 117, // get string for index as it appears in playlist, param2 = index //*** below buffer points to struct or other object //*** returns 1 on success, 0 on failure opShowMainMenu = 120, // Display Main QCD Menu (buffer = POINT* - location to display menu) opGetMainMenu = 121, // Returns copy of HMENU handle to QCD Menu (must use DestroyMenu on handle when complete) opShowQuickTrack = 125, // Display QuickTrack Menu (buffer = POINT* - location to display menu) opGetQuickTrack = 126, // Returns copy of HMENU handle to QuickTrack menu (must use DestroyMenu on handle when complete) // To use if QuickTrack item selected: PostMessage(hwndPlayer, WM_COMMAND, menu_id, 0); opGetEQVals = 200, // get current EQ levels/on/off (buffer = EQInfo*) opSetEQVals = 201, // set EQ levels/on/off (buffer = EQInfo*) opGetProxyInfo = 202, // get proxy info (buffer = ProxyInfo*), returns 0 if proxy not in use //*** below returns numeric info, buffer used opGetIndexFromFilename = 210, // get the index of a file that exists in current playlist (buffer = full path of file), // param1 = startindex (index to start searching on) // returns -1 if file not in playlist //*** below send information to player //*** returns 1 on success, 0 on failure opSetStatusMessage = 1000, // display message in status area (buffer = msg buffer (null term), param1 = text flags (see below)) opSetBrowserUrl = 1001, // set music browser URL (buffer = url (null term)) // null url buffer - closes browser // param1 = 0 - normal, 1 - force open opSetAudioInfo = 1002, // set the current music bitrate/khz (buffer = AudioInfo*, param1 = size of AudioInfo) opSetTrackAlbum = 1003, // update track ablum name (buffer = album (null term), param1 = (string ptr)file name), param2 = MediaTypes opSetTrackTitle = 1004, // update track title (buffer = title (null term), param1 = (string ptr)file name), param2 = MediaTypes opSetTrackArtist = 1005, // update track artist name (buffer = artist (null term), param1 = (string ptr)file name), param2 = MediaTypes opSetTrackExtents = 1007, // update track TrackExtents info (buffer = &TrackExtents), param1 = (string ptr)file name) opSetTrackSeekable = 1008, // update track seekable flag (buffer = (string ptr)file name), param1 = TRUE/FALSE opSetPlayNext = 1009, // set the next index to be played (buffer = NULL, param1 = index, index = -1 unsets playnext) opSetIndexFilename = 1010, // updates the filename (or stream) that an index in the current playlist refers to, buffer = new filename, param1 = index opSetPlaylist = 1006, // clear playlist, add files to playlist or reset playlist with new files // buffer = file list (each file in quotes, string null terminated) Eg; buffer="\"file1.mp3\" \"file2.mp3\"\0" - NULL to clear playlist // param1 = (string ptr)originating path (can be NULL if paths included with files) // param2 = 1 - clear playlist flag, 2 - enqueue to top opInsertPlaylist = 1011, // insert tracks into playlist // buffer = file list (each file in quotes, string null terminated) Eg; buffer="\"file1.mp3\" \"file2.mp3\"\0" // param1 = (string ptr)originating path (can be NULL if paths included with files) // param2 = index location to insert tracks (-1 to insert at end) opMovePlaylistTrack = 1012, // param1 = index of track to move, param2 = destination index (move shifts tracks between param1 and param2) opSwapPlaylistTracks = 1013, // param1 = index of first track, param2 = index of second track (swap only switches indecies param1 and param2) opCreateDiscInfo = 1020, // returns: pointer to ICddbDisc object. Do not release or deallocate this pointer opSetDiscInfo = 1021, // buffer = ICddbDisc*, param1 = MediaInfo*, param2 = track number opSetSeekPosition = 1100, // seek to position during playback // buffer = NULL, param1 = position // param2 = 0 - position is in seconds, 1 - position is in milliseconds, 2 - position is in percent (use (float)param1)) opSetRepeatState = 1110, // set playlist repeat state, buffer = NULL, param1 = 0 - off, 1 - repeat track, 2 - repeat playlist opSetShuffleState = 1111, // set playlist shuffle state, buffer = NULL, param1 = 0 - off, 1 - on //*** below configures custom plugin menu items for the 'plugin menu' //*** Player will call plugin's configure routine with menu value when menu item selected //*** returns 1 on success, 0 on failure opSetPluginMenuItem = 2000, // buffer = HINSTANCE of plugin, param1 = item id, param2 = (string ptr)string to display // - set param2 = 0 to remove item id from menu // - set param1 = 0 and param2 = 0 to remove whole menu opSetPluginMenuState = 2001, // buffer = HINSTANCE of plugin, param1 = item id, param2 = menu flags (same as windows menu flags - eg: MF_CHECKED) //*** below are services for using the player's filename template editor //*** returns 1 on success, 0 on failure opShowTemplateEditor = 2100, // displays template editor dialog, param1 = (HWND)parent window, param2 = modal flag opLoadTemplate = 2101, // loads saved templates, buffer = (char*)string buf, param1 = bufsize, param2 = index of template (index < 0 for default formats, index >= 0 for user made formats) opRenderTemplate = 2102, // create string based on template, buffer = (char*)template, param1 = FormatMetaInfo*, param2 = (char*)string buffer (min 260 bytes) //*** other services opUTF8toUCS2 = 9000, // convert UTF8 string to UCS2 (Unicode) string, buffer = null terminated utf8 string, param1 = (WCHAR*)result string buffer, param2 = size of result buffer opUCS2toUTF8 = 9001, // convert UCS2 (Unicode) string to UTF8 string, buffer = null terminated ucs2 string, param1 = (char*)result string buffer, param2 = size of result buffer opSafeWait = 10000 // plugin's can use this to wait on an object without worrying about deadlocking the player. // this should only be called by the thread that enters the plugin, not by any plugin-created threads } PluginServiceOp; //----------------------------------------------------------------------------- // Info services api provided by the Player, called by Plugin. //----------------------------------------------------------------------------- typedef long (*PluginServiceFunc)(PluginServiceOp op, void *buffer, long param1, long param2); // Use to retrieve service func for DSP plugins (or other inproc process that doesn't have access to PluginServiceFunc) // Eg: PluginServiceFunc Service = (PluginServiceFunc)SendMessage(hwndPlayer, WM_GETSERVICEFUNC, 0, 0); // Set WPARAM = PLUGIN_API_WANTUTF8 for UTF8 string parameters #define WM_GETSERVICEFUNC (WM_USER + 1) //----------------------------------------------------------------------------- typedef struct // for Output Plugin Write callback { void *data; // pointer to valid data int bytelen; // length of data pointed to by 'data' in bytes UINT numsamples; // number of samples represented by 'data' UINT bps; // bits per sample UINT nch; // number of channels UINT srate; // sample rate UINT markerstart; // Marker position at start of data (marker is time value of data) // (set to WAVE_VIS_DATA_ONLY to not have data sent to output plugins) UINT markerend; // Marker position at end of data (not currently used, set to 0) } WriteDataStruct; //----------------------------------------------------------------------------- typedef struct // for GetTrackExtents Input Plugin callback { UINT track; // for CD's, set the track number. Otherwise set to 1. UINT start; // for CD's or media that doesn't start at the beginning // of the file, set to start position. Otherwise set to 0. UINT end; // set to end position of media. UINT unitpersec; // whatever units are being used for this media, how many // of them per second. // (Note: ((end - start) / unitpersecond) = file length UINT bytesize; // size of file in bytes (if applicable, otherwise 0). } TrackExtents; //----------------------------------------------------------------------------- typedef struct // for opSetAudioInfo service { long struct_size; // sizeof(AudioInfo) long level; // MPEG level (1 for MPEG1, 2 for MPEG2, 3 for MPEG2.5, 7 for MPEGpro) long layer; // and layer (1, 2 or 3) long bitrate; // audio bitrate in bits per second long frequency; // audio freq in Hz long mode; // 0 for stereo, 1 for joint-stereo, 2 for dual-channel, 3 for mono, 4 for multi-channel char text[8]; // up to eight characters to identify format (will override level and layer settings) } AudioInfo; //----------------------------------------------------------------------------- // Equalizer Info //----------------------------------------------------------------------------- typedef struct // for coming QCD version { long struct_size; // sizeof(EQInfo) char enabled; char preamp; // -128 to 127, 0 is even char bands[10]; // -128 to 127, 0 is even } EQInfo; //----------------------------------------------------------------------------- typedef struct { long struct_size; // sizeof(ProxyInfo) char hostname[200]; long port; char username[100]; char password[100]; } ProxyInfo; //----------------------------------------------------------------------------- typedef enum // for MediaInfo.mediaType { UNKNOWN_MEDIA = 0, CD_AUDIO_MEDIA = 1, DIGITAL_FILE_MEDIA = 2, DIGITAL_STREAM_MEDIA = 3 } MediaTypes; //----------------------------------------------------------------------------- #define MAX_TOC_LEN 2048 typedef struct { // media descriptors CHAR mediaFile[MAX_PATH]; MediaTypes mediaType; // cd audio media info CHAR cd_mediaTOC[MAX_TOC_LEN]; int cd_numTracks; int cd_hasAudio; // operation info int op_canSeek; // not used int reserved[4]; } MediaInfo; //----------------------------------------------------------------------------- typedef struct { long struct_size; LPCWSTR title; LPCWSTR artalb; LPCWSTR album; LPCWSTR genre; LPCWSTR year; LPCWSTR tracknum; LPCWSTR filename; LPCWSTR arttrk; long reserved; } FormatMetaInfo; //----------------------------------------------------------------------------- // When subclassing the parent window, a plugin can watch for these messages // to react to events going on between plugins and player // DO NOT SEND THESE MESSAGES - can only watch for them // Plugin to Player Notifiers #define WM_PN_POSITIONUPDATE (WM_USER + 100) // playback progress updated #define WM_PN_PLAYSTARTED (WM_USER + 101) // playback has started #define WM_PN_PLAYSTOPPED (WM_USER + 102) // playback has stopped by user #define WM_PN_PLAYPAUSED (WM_USER + 103) // playback has been paused #define WM_PN_PLAYDONE (WM_USER + 104) // playback has finished (track completed) #define WM_PN_MEDIAEJECTED (WM_USER + 105) // a CD was ejected (CDRom drive letter= 'A' + lParam) #define WM_PN_MEDIAINSERTED (WM_USER + 106) // a CD was inserted (CDRom drive letter= 'A' + lParam) #define WM_PN_INFOCHANGED (WM_USER + 107) // track information was updated (lParam = (LPCSTR)medianame) #define WM_PN_TRACKCHANGED (WM_USER + 109) // current track playing has changed (relevant from CD plugin) (lParam = (LPCSTR)medianame) // Player to Plugin Notifiers #define WM_PN_PLAYLISTCHANGED (WM_USER + 200) // playlist has changed in some way (add, delete, sort, shuffle, drag-n-drop, etc...) // For intercepting main menu display // (so you can get handle, modify, and display your own) #define WM_SHOWMAINMENU (WM_USER + 20) // For intercepting skinned border window commands #define WM_BORDERWINDOW (WM_USER + 26) // WM_BORDERWINDOW wParam's #define BORDERWINDOW_NORMALSIZE 0x100000 #define BORDERWINDOW_DOUBLESIZE 0x200000 #define BORDERWINDOW_FULLSCREEN 0x400000 // send to border window to cause resize // wParam = LPPOINT lpp; // point x-y is CLIENT area size of window #define WM_SIZEBORDERWINDOW (WM_USER + 1) //----------------------------------------------------------------------------- // To shutdown player, send this command #define WM_SHUTDOWN (WM_USER + 5) //----------------------------------------------------------------------------- // opSetStatusMessage textflags #define TEXT_DEFAULT 0x0 // message scrolls by in status window #define TEXT_TOOLTIP 0x1 // message acts as tooltip in status window #define TEXT_URGENT 0x2 // forces message to appear even if no status window (using msg box) #define TEXT_HOLD 0x4 // tooltip message stays up (no fade out) #define TEXT_UNICODE 0x10 // buffer contains a unicode string (multibyte string otherwise) #endif //QCDMODDEFS_Hfaad2-2_10_0/plugins/QCDMp4/QCDModInput.h000066400000000000000000000114741374350120500176310ustar00rootroot00000000000000//----------------------------------------------------------------------------- // // File: QCDModInput.h // // About: Input plugin module interface. This file is published with the // Input plugin SDK. // // Authors: Written by Paul Quinn and Richard Carlson. // // Copyright: // // QCD multimedia player application Software Development Kit Release 1.0. // // Copyright (C) 1997-2002 Quinnware // // This code is free. If you redistribute it in any form, leave this notice // here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // //----------------------------------------------------------------------------- #ifndef QCDMODINPUT_H #define QCDMODINPUT_H #include "QCDModDefs.h" // name of the DLL export for input plugins #define INPUTDLL_ENTRY_POINT QInputModule2 // (updated plugin api version 240+) // media insert flags #define MEDIAINSERT_PLAY 0x1 #define MEDIAINSERT_ADDTRACKS 0x2 #define MEDIAINSERT_ADDSEGMENTS 0x4 #define MEDIAINSERT_CLEARPLAYLIST 0x8 // Stop will receive one of these flags (pass to output plugin's stop()) #define STOPFLAG_FORCESTOP 0 // stop occuring due to user action or other event #define STOPFLAG_PLAYDONE 1 // stop occuring due to playlist completion // play flags #define PLAYFLAG_PLAYBACK 0x0 #define PLAYFLAG_ENCODING 0x1 #define PLAYFLAG_SEEKING 0x2 // Wave Marker flags #define WAVE_VIS_DATA_ONLY -1 // set to WaveDataStruct.markerstart in OutputWrite() call have data only go to vis // and not to output plugin // pause flags #define PAUSE_DISABLED 0 // Pause() call is to unpause playback #define PAUSE_ENABLED 1 // Pause() call is to pause playback //----------------------------------------------------------------------------- // Input Module //----------------------------------------------------------------------------- typedef struct { unsigned int size; // size of init structure unsigned int version; // plugin structure version (set to PLUGIN_API_VERSION) PluginServiceFunc Service; // player supplied services callback struct { void (*PositionUpdate)(unsigned int position); void (*PlayStopped)(const char* medianame); // notify player of play stop void (*PlayStarted)(const char* medianame); // notify player of play start void (*PlayPaused)(const char* medianame, int flags); // notify player of play pause void (*PlayDone)(const char* medianame); // notify player when play done void (*PlayTrackChanged)(const char* medianame); // notify player when playing track changes (cd audio relevant only) void (*MediaEjected)(const char* medianame); // notify player of media eject (cd audio relevant) void (*MediaInserted)(const char* medianame, int flags); // notify player of media insert (cd audio relevant) // output plugin calls int (*OutputOpen)(const char* medianame, WAVEFORMATEX*); // open output for wave data int (*OutputWrite)(WriteDataStruct*); // send PCM audio data to output // (blocks until write completes, thus if output is paused can // block until unpaused) int (*OutputDrain)(int flags); // wait for all output to complete (blocking) int (*OutputDrainCancel)(int flags); // break a drain in progress int (*OutputFlush)(unsigned int marker); // flush output upto marker int (*OutputStop)(int flags); // stop output int (*OutputPause)(int flags); // pause output int (*OutputSetVol)(int levelleft, int levelright, int flags); int (*OutputGetCurrentPosition)(unsigned int *position, int flags); void *Reserved[10]; } toPlayer; struct { int (*Initialize)(QCDModInfo *modInfo, int flags); // initialize plugin void (*ShutDown)(int flags); // shutdown plugin int (*Play)(const char* medianame, int playfrom, int playto, int flags); // start playing playfrom->playto int (*Stop)(const char* medianame, int flags); // stop playing int (*Pause)(const char* medianame, int flags); // pause playback int (*Eject)(const char* medianame, int flags); // eject media void (*SetEQ)(EQInfo*); // update EQ settings int (*GetMediaSupported)(const char* medianame, MediaInfo *mediaInfo); // does plugin support medianame (and provides info for media) int (*GetTrackExtents)(const char* medianame, TrackExtents *ext, int flags); // get media start, end & units int (*GetCurrentPosition)(const char* medianame, long *track, long *offset); // get playing media's position void (*Configure)(int flags); // launch configuration void (*About)(int flags); // launch about info void (*SetVolume)(int levelleft, int levelright, int flags); // level 0 - 100 void *Reserved[10]; } toModule; } QCDModInitIn; #endif //QCDMODINPUT_H faad2-2_10_0/plugins/QCDMp4/QCDModTagEditor.h000066400000000000000000000037461374350120500204170ustar00rootroot00000000000000//----------------------------------------------------------------------------- // // File: QCDModTagEditor // // About: Tag Editing plugin module interface. This file is published with the // QCD plugin SDK. // // Authors: Written by Paul Quinn // // Copyright: // // QCD multimedia player application Software Development Kit Release 1.0. // // Copyright (C) 2002 Quinnware // // This code is free. If you redistribute it in any form, leave this notice // here. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // //----------------------------------------------------------------------------- #ifndef QCDMODTAGEDITOR_H #define QCDMODTAGEDITOR_H #include "QCDModDefs.h" // name of the DLL export for output plugins #define TAGEDITORDLL_ENTRY_POINT QTagEditorModule // Tag field ids typedef enum { TAGFIELD_FIRSTFIELD = 0, TAGFIELD_TITLE = 0, TAGFIELD_ARTIST, TAGFIELD_ALBUM, TAGFIELD_GENRE, TAGFIELD_YEAR, TAGFIELD_TRACK, TAGFIELD_COMMENT, TAGFIELD_COMPOSER, TAGFIELD_CONDUCTOR, TAGFIELD_ORCHESTRA, TAGFIELD_YEARCOMPOSED, TAGFIELD_ORIGARTIST, TAGFIELD_LABEL, TAGFIELD_COPYRIGHT, TAGFIELD_ENCODER, TAGFIELD_CDDBTAGID, TAGFIELD_FIELDCOUNT }; //----------------------------------------------------------------------------- typedef struct { UINT size; // size of init structure UINT version; // plugin structure version (set to PLUGIN_API_VERSION) LPCSTR description; LPCSTR defaultexts; bool (*Read)(LPCSTR filename, void* tagHandle); bool (*Write)(LPCSTR filename, void* tagHandle); bool (*Strip)(LPCSTR filename); void (*ShutDown)(int flags); void (*SetFieldA)(void* tagHandle, int fieldId, LPCSTR szNewText); void (*SetFieldW)(void* tagHandle, int fieldId, LPCWSTR szNewText); LPCSTR (*GetFieldA)(void* tagHandle, int fieldId); LPCWSTR (*GetFieldW)(void* tagHandle, int fieldId); } QCDModInitTag; #endif //QCDMODTAGEDITOR_Hfaad2-2_10_0/plugins/QCDMp4/QCDMp4.c000066400000000000000000002565531374350120500165360ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: QCDMp4.c,v 1.4 2003/12/06 04:24:17 rjamorim Exp $ **/ //#define DEBUG_OUTPUT #define WIN32_LEAN_AND_MEAN #include #include #include #include #include #include #include #include "resource.h" #include "QCDInputDLL.h" #include "utils.h" #include "config.h" //#include "aacinfo.h" //#include "aac2mp4.h" // //const char *long_ext_list = "MP4\0MPEG-4 Files (*.MP4)\0M4A\0MPEG-4 Files (*.M4A)\0AAC\0AAC Files (*.AAC)\0"; //const char *short_ext_list = "MP4\0MPEG-4 Files (*.MP4)\0M4A\0MPEG-4 Files (*.M4A)\0"; static long priority_table[] = { 0, THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_ABOVE_NORMAL, THREAD_PRIORITY_NORMAL, THREAD_PRIORITY_BELOW_NORMAL, THREAD_PRIORITY_LOWEST }; static int res_id_table[] = { IDC_16BITS, IDC_24BITS, IDC_32BITS, 0, 0, /*IDC_16BITS_DITHERED*/ IDC_16BITS /* temp hack */ }; static int res_table[] = { 16, 24, 32, 0, 0, 16 }; //static char info_fn[_MAX_PATH]; // //// post this to the main window at end of file (after playback has stopped) //#define WM_WA_AAC_EOF WM_USER+2 struct seek_list { struct seek_list *next; __int64 offset; }; typedef struct state { /* general stuff */ faacDecHandle hDecoder; int samplerate; unsigned char channels; double decode_pos_ms; // current decoding position, in milliseconds int paused; // are we paused? int seek_needed; // if != -1, it is the point that the decode thread should seek to, in ms. char filename[_MAX_PATH]; int filetype; /* 0: MP4; 1: AAC */ int last_frame; __int64 last_offset; /* MP4 stuff */ MP4FileHandle mp4file; int mp4track; MP4SampleId numSamples; MP4SampleId sampleId; /* AAC stuff */ FILE *aacfile; long m_aac_bytes_into_buffer; long m_aac_bytes_consumed; __int64 m_file_offset; unsigned char *m_aac_buffer; int m_at_eof; double cur_pos_sec; int m_header_type; struct seek_list *m_head; struct seek_list *m_tail; unsigned long m_length; /* for gapless decoding */ unsigned int useAacLength; unsigned int framesize; unsigned int initial; unsigned long timescale; } state; static state mp4state; //static In_Module module; // the output module (declared near the bottom of this file) struct { HINSTANCE hDllInstance; HWND hMainWindow; QCDModInitIn QCDCallbacks; } module; AudioInfo ai; static int killPlayThread; static int PlayThreadAlive = 0; // 1=play thread still running HANDLE play_thread_handle = INVALID_HANDLE_VALUE; // the handle to the decode thread /* Function definitions */ void *decode_aac_frame(state *st, faacDecFrameInfo *frameInfo); DWORD WINAPI MP4PlayThread(void *b); // the decode thread procedure DWORD WINAPI AACPlayThread(void *b); // the decode thread procedure //typedef struct tag //{ // char *item; // char *value; //} tag; // //typedef struct medialib_tags //{ // struct tag *tags; // unsigned int count; //} medialib_tags; // //int tag_add_field(medialib_tags *tags, const char *item, const char *value) //{ // void *backup = (void *)tags->tags; // // if (!item || (item && !*item) || !value) return 0; // // tags->tags = (struct tag *)realloc(tags->tags, (tags->count+1) * sizeof(tag)); // if (!tags->tags) { // if (backup) free(backup); // return 0; // } // else // { // int i_len = strlen(item); // int v_len = strlen(value); // // tags->tags[tags->count].item = (char *)malloc(i_len+1); // tags->tags[tags->count].value = (char *)malloc(v_len+1); // // if (!tags->tags[tags->count].item || !tags->tags[tags->count].value) // { // if (!tags->tags[tags->count].item) free (tags->tags[tags->count].item); // if (!tags->tags[tags->count].value) free (tags->tags[tags->count].value); // tags->tags[tags->count].item = NULL; // tags->tags[tags->count].value = NULL; // return 0; // } // // memcpy(tags->tags[tags->count].item, item, i_len); // memcpy(tags->tags[tags->count].value, value, v_len); // tags->tags[tags->count].item[i_len] = '\0'; // tags->tags[tags->count].value[v_len] = '\0'; // // tags->count++; // return 1; // } //} // //int tag_set_field(medialib_tags *tags, const char *item, const char *value) //{ // unsigned int i; // // if (!item || (item && !*item) || !value) return 0; // // for (i = 0; i < tags->count; i++) // { // if (!stricmp(tags->tags[i].item, item)) // { // void *backup = (void *)tags->tags[i].value; // int v_len = strlen(value); // // tags->tags[i].value = (char *)realloc(tags->tags[i].value, v_len+1); // if (!tags->tags[i].value) // { // if (backup) free(backup); // return 0; // } // // memcpy(tags->tags[i].value, value, v_len); // tags->tags[i].value[v_len] = '\0'; // // return 1; // } // } // // return tag_add_field(tags, item, value); //} // //int tag_delete(medialib_tags *tags) //{ // unsigned int i; // // for (i = 0; i < tags->count; i++) // { // if (tags->tags[i].item) free(tags->tags[i].item); // if (tags->tags[i].value) free(tags->tags[i].value); // } // // if (tags->tags) free(tags->tags); // // tags->tags = NULL; // tags->count = 0; //} // //int ReadMP4Tag(MP4FileHandle file, medialib_tags *tags) //{ // unsigned __int32 valueSize; // unsigned __int8 *pValue; // char *pName; // unsigned int i = 0; // // do { // pName = 0; // pValue = 0; // valueSize = 0; // // MP4GetMetadataByIndex(file, i, (const char **)&pName, &pValue, &valueSize); // // if (valueSize > 0) // { // char *val = (char *)malloc(valueSize+1); // if (!val) return 0; // memcpy(val, pValue, valueSize); // val[valueSize] = '\0'; // // if (pName[0] == '\xa9') // { // if (memcmp(pName, "nam", 4) == 0) // { // tag_add_field(tags, "title", val); // } else if (memcmp(pName, "ART", 4) == 0) { // tag_add_field(tags, "artist", val); // } else if (memcmp(pName, "wrt", 4) == 0) { // tag_add_field(tags, "writer", val); // } else if (memcmp(pName, "alb", 4) == 0) { // tag_add_field(tags, "album", val); // } else if (memcmp(pName, "day", 4) == 0) { // tag_add_field(tags, "date", val); // } else if (memcmp(pName, "too", 4) == 0) { // tag_add_field(tags, "tool", val); // } else if (memcmp(pName, "cmt", 4) == 0) { // tag_add_field(tags, "comment", val); // } else if (memcmp(pName, "gen", 4) == 0) { // tag_add_field(tags, "genre", val); // } else { // tag_add_field(tags, pName, val); // } // } else if (memcmp(pName, "gnre", 4) == 0) { // char *t=0; // if (MP4GetMetadataGenre(file, &t)) // { // tag_add_field(tags, "genre", t); // } // } else if (memcmp(pName, "trkn", 4) == 0) { // unsigned __int16 trkn = 0, tot = 0; // char t[200]; // if (MP4GetMetadataTrack(file, &trkn, &tot)) // { // if (tot > 0) // wsprintf(t, "%d/%d", trkn, tot); // else // wsprintf(t, "%d", trkn); // tag_add_field(tags, "tracknumber", t); // } // } else if (memcmp(pName, "disk", 4) == 0) { // unsigned __int16 disk = 0, tot = 0; // char t[200]; // if (MP4GetMetadataDisk(file, &disk, &tot)) // { // if (tot > 0) // wsprintf(t, "%d/%d", disk, tot); // else // wsprintf(t, "%d", disk); // tag_add_field(tags, "disc", t); // } // } else if (memcmp(pName, "cpil", 4) == 0) { // unsigned __int8 cpil = 0; // char t[200]; // if (MP4GetMetadataCompilation(file, &cpil)) // { // wsprintf(t, "%d", cpil); // tag_add_field(tags, "compilation", t); // } // } else if (memcmp(pName, "tmpo", 4) == 0) { // unsigned __int16 tempo = 0; // char t[200]; // if (MP4GetMetadataTempo(file, &tempo)) // { // wsprintf(t, "%d BPM", tempo); // tag_add_field(tags, "tempo", t); // } // } else if (memcmp(pName, "NDFL", 4) == 0) { // /* Removed */ // } else { // tag_add_field(tags, pName, val); // } // // free(val); // } // // i++; // } while (valueSize > 0); // // return 1; //} // //int mp4_set_metadata(MP4FileHandle file, const char *item, const char *val) //{ // if (!item || (item && !*item) || !val || (val && !*val)) return 0; // // if (!stricmp(item, "track") || !stricmp(item, "tracknumber")) // { // unsigned __int16 trkn, tot; // int t1 = 0, t2 = 0; // sscanf(val, "%d/%d", &t1, &t2); // trkn = t1, tot = t2; // if (!trkn) return 1; // if (MP4SetMetadataTrack(file, trkn, tot)) return 1; // } // else if (!stricmp(item, "disc") || !stricmp(item, "disknumber")) // { // unsigned __int16 disk, tot; // int t1 = 0, t2 = 0; // sscanf(val, "%d/%d", &t1, &t2); // disk = t1, tot = t2; // if (!disk) return 1; // if (MP4SetMetadataDisk(file, disk, tot)) return 1; // } // else if (!stricmp(item, "compilation")) // { // unsigned __int8 cpil = atoi(val); // if (!cpil) return 1; // if (MP4SetMetadataCompilation(file, cpil)) return 1; // } // else if (!stricmp(item, "tempo")) // { // unsigned __int16 tempo = atoi(val); // if (!tempo) return 1; // if (MP4SetMetadataTempo(file, tempo)) return 1; // } // else if (!stricmp(item, "artist")) // { // if (MP4SetMetadataArtist(file, val)) return 1; // } // else if (!stricmp(item, "writer")) // { // if (MP4SetMetadataWriter(file, val)) return 1; // } // else if (!stricmp(item, "title")) // { // if (MP4SetMetadataName(file, val)) return 1; // } // else if (!stricmp(item, "album")) // { // if (MP4SetMetadataAlbum(file, val)) return 1; // } // else if (!stricmp(item, "date") || !stricmp(item, "year")) // { // if (MP4SetMetadataYear(file, val)) return 1; // } // else if (!stricmp(item, "comment")) // { // if (MP4SetMetadataComment(file, val)) return 1; // } // else if (!stricmp(item, "genre")) // { // if (MP4SetMetadataGenre(file, val)) return 1; // } // else if (!stricmp(item, "tool")) // { // if (MP4SetMetadataTool(file, val)) return 1; // } // else // { // if (MP4SetMetadataFreeForm(file, (char *)item, (u_int8_t *)val, (u_int32_t)strlen(val))) return 1; // } // // return 0; //} // //int WriteMP4Tag(MP4FileHandle file, const medialib_tags *tags) //{ // unsigned int i; // // for (i = 0; i < tags->count; i++) // { // const char *item = tags->tags[i].item; // const char *value = tags->tags[i].value; // // if (value && *value) // { // mp4_set_metadata(file, item, value); // } // } //} #ifdef DEBUG_OUTPUT void in_mp4_DebugOutput(char *message) { char s[1024]; sprintf(s, "in_mp4: %s: %s", mp4state.filename, message); OutputDebugString(s); } #endif int file_length(FILE *f) { long end = 0; long cur = ftell(f); fseek(f, 0, SEEK_END); end = ftell(f); fseek(f, cur, SEEK_SET); return end; } static void show_error(HWND hwnd, char *message, ...) { if (m_show_errors) MessageBox(hwnd, message, "Error", MB_OK); } static void config_init() { //char *p=INI_FILE; //GetModuleFileName(NULL,INI_FILE,_MAX_PATH); //while (*p) p++; //while (p >= INI_FILE && *p != '.') p--; //strcpy(p+1,"ini"); module.QCDCallbacks.Service(opGetPluginSettingsFile, INI_FILE, MAX_PATH, 0); } void config_read() { char priority[10]; char resolution[10]; char show_errors[10]; char use_for_aac[10]; char downmix[10]; char vbr_display[10]; config_init(); strcpy(show_errors, "1"); strcpy(priority, "3"); strcpy(resolution, "0"); strcpy(use_for_aac, "1"); strcpy(downmix, "0"); strcpy(vbr_display, "1"); //strcpy(titleformat, "%7"); RS(priority); RS(resolution); RS(show_errors); RS(use_for_aac); RS(downmix); RS(vbr_display); //RS(titleformat); m_priority = atoi(priority); m_resolution = atoi(resolution); m_show_errors = atoi(show_errors); m_use_for_aac = atoi(use_for_aac); m_downmix = atoi(downmix); m_vbr_display = atoi(vbr_display); } void config_write() { char priority[10]; char resolution[10]; char show_errors[10]; char use_for_aac[10]; char downmix[10]; char vbr_display[10]; itoa(m_priority, priority, 10); itoa(m_resolution, resolution, 10); itoa(m_show_errors, show_errors, 10); itoa(m_use_for_aac, use_for_aac, 10); itoa(m_downmix, downmix, 10); itoa(m_vbr_display, vbr_display, 10); WS(priority); WS(resolution); WS(show_errors); WS(use_for_aac); WS(downmix); WS(vbr_display); //WS(titleformat); } int Initialize(QCDModInfo *ModInfo, int flags) { ModInfo->moduleString = "MP4 Plug-in v" FAAD2_VERSION; module.hMainWindow = (HWND)module.QCDCallbacks.Service(opGetParentWnd, 0, 0, 0); // read config from config file config_read(); ModInfo->moduleExtensions = !m_use_for_aac ? "MP4:M4A" : "MP4:M4A:AAC"; // return TRUE for successful initialization return 1; } //---------------------------------------------------------------------------- void ShutDown(int flags) { Stop(mp4state.filename, STOPFLAG_FORCESTOP); } ///* Convert UNICODE to UTF-8 // Return number of bytes written */ //int unicodeToUtf8 ( const WCHAR* lpWideCharStr, char* lpMultiByteStr, int cwcChars ) //{ // const unsigned short* pwc = (unsigned short *)lpWideCharStr; // unsigned char* pmb = (unsigned char *)lpMultiByteStr; // const unsigned short* pwce; // size_t cBytes = 0; // // if ( cwcChars >= 0 ) { // pwce = pwc + cwcChars; // } else { // pwce = (unsigned short *)((size_t)-1); // } // // while ( pwc < pwce ) { // unsigned short wc = *pwc++; // // if ( wc < 0x00000080 ) { // *pmb++ = (char)wc; // cBytes++; // } else // if ( wc < 0x00000800 ) { // *pmb++ = (char)(0xC0 | ((wc >> 6) & 0x1F)); // cBytes++; // *pmb++ = (char)(0x80 | (wc & 0x3F)); // cBytes++; // } else // if ( wc < 0x00010000 ) { // *pmb++ = (char)(0xE0 | ((wc >> 12) & 0x0F)); // cBytes++; // *pmb++ = (char)(0x80 | ((wc >> 6) & 0x3F)); // cBytes++; // *pmb++ = (char)(0x80 | (wc & 0x3F)); // cBytes++; // } // if ( wc == L'\0' ) // return cBytes; // } // // return cBytes; //} // ///* Convert UTF-8 coded string to UNICODE // Return number of characters converted */ //int utf8ToUnicode ( const char* lpMultiByteStr, WCHAR* lpWideCharStr, int cmbChars ) //{ // const unsigned char* pmb = (unsigned char *)lpMultiByteStr; // unsigned short* pwc = (unsigned short *)lpWideCharStr; // const unsigned char* pmbe; // size_t cwChars = 0; // // if ( cmbChars >= 0 ) { // pmbe = pmb + cmbChars; // } else { // pmbe = (unsigned char *)((size_t)-1); // } // // while ( pmb < pmbe ) { // char mb = *pmb++; // unsigned int cc = 0; // unsigned int wc; // // while ( (cc < 7) && (mb & (1 << (7 - cc)))) { // cc++; // } // // if ( cc == 1 || cc > 6 ) // illegal character combination for UTF-8 // continue; // // if ( cc == 0 ) { // wc = mb; // } else { // wc = (mb & ((1 << (7 - cc)) - 1)) << ((cc - 1) * 6); // while ( --cc > 0 ) { // if ( pmb == pmbe ) // reached end of the buffer // return cwChars; // mb = *pmb++; // if ( ((mb >> 6) & 0x03) != 2 ) // not part of multibyte character // return cwChars; // wc |= (mb & 0x3F) << ((cc - 1) * 6); // } // } // // if ( wc & 0xFFFF0000 ) // wc = L'?'; // *pwc++ = wc; // cwChars++; // if ( wc == L'\0' ) // return cwChars; // } // // return cwChars; //} // ///* convert Windows ANSI to UTF-8 */ //int ConvertANSIToUTF8 ( const char* ansi, char* utf8 ) //{ // WCHAR* wszValue; // Unicode value // size_t ansi_len; // size_t len; // // *utf8 = '\0'; // if ( ansi == NULL ) // return 0; // // ansi_len = strlen ( ansi ); // // if ( (wszValue = (WCHAR *)malloc ( (ansi_len + 1) * 2 )) == NULL ) // return 0; // // /* Convert ANSI value to Unicode */ // if ( (len = MultiByteToWideChar ( CP_ACP, 0, ansi, ansi_len + 1, wszValue, (ansi_len + 1) * 2 )) == 0 ) { // free ( wszValue ); // return 0; // } // // /* Convert Unicode value to UTF-8 */ // if ( (len = unicodeToUtf8 ( wszValue, utf8, -1 )) == 0 ) { // free ( wszValue ); // return 0; // } // // free ( wszValue ); // // return len-1; //} // ///* convert UTF-8 to Windows ANSI */ //int ConvertUTF8ToANSI ( const char* utf8, char* ansi ) //{ // WCHAR* wszValue; // Unicode value // size_t utf8_len; // size_t len; // // *ansi = '\0'; // if ( utf8 == NULL ) // return 0; // // utf8_len = strlen ( utf8 ); // // if ( (wszValue = (WCHAR *)malloc ( (utf8_len + 1) * 2 )) == NULL ) // return 0; // // /* Convert UTF-8 value to Unicode */ // if ( (len = utf8ToUnicode ( utf8, wszValue, utf8_len + 1 )) == 0 ) { // free ( wszValue ); // return 0; // } // // /* Convert Unicode value to ANSI */ // if ( (len = WideCharToMultiByte ( CP_ACP, 0, wszValue, -1, ansi, (utf8_len + 1) * 2, NULL, NULL )) == 0 ) { // free ( wszValue ); // return 0; // } // // free ( wszValue ); // // return len-1; //} // //BOOL uSetDlgItemText(HWND hwnd, int id, const char *str) //{ // char *temp; // size_t len; // int r; // // if (!str) return FALSE; // if (!*str) return TRUE; // len = strlen(str); // temp = malloc(len+1); // if (!temp) return FALSE; // r = ConvertUTF8ToANSI(str, temp); // if (r > 0) // SetDlgItemText(hwnd, id, temp); // free(temp); // // return r>0 ? TRUE : FALSE; //} // //UINT uGetDlgItemText(HWND hwnd, int id, char *str, int max) //{ // char *temp, *utf8; // int len; // HWND w; // // if (!str || !max) return 0; // *str = '\0'; // w = GetDlgItem(hwnd, id); // len = GetWindowTextLength(w); // temp = malloc(len+1); // if (!temp) return 0; // utf8 = malloc((len+1)*4); // if (!utf8) // { // free(temp); // return 0; // } // // len = GetWindowText(w, temp, len+1); // if (len > 0) // { // len = ConvertANSIToUTF8(temp, utf8); // if (len > max-1) // { // len = max-1; // utf8[max] = '\0'; // } // memcpy(str, utf8, len+1); // } // // free(temp); // free(utf8); // // return len; //} // //BOOL CALLBACK mp4_info_dialog_proc(HWND hwndDlg, UINT message, // WPARAM wParam, LPARAM lParam) //{ // char *file_info; // MP4FileHandle file; // char *pVal, dummy1[1024], dummy3; // short dummy, dummy2; // char temp[1024]; // struct medialib_tags tags; // tags.count = 0; // tags.tags = NULL; // //#ifdef DEBUG_OUTPUT // in_mp4_DebugOutput("mp4_info_dialog_proc"); //#endif // // switch (message) { // case WM_INITDIALOG: // EnableWindow(GetDlgItem(hwndDlg,IDC_CONVERT), FALSE); // ShowWindow(GetDlgItem(hwndDlg,IDC_CONVERT), SW_HIDE); // EnableWindow(GetDlgItem(hwndDlg,IDC_CONVERT1), FALSE); // ShowWindow(GetDlgItem(hwndDlg,IDC_CONVERT1), SW_HIDE); // EnableWindow(GetDlgItem(hwndDlg,IDC_CONVERT2), FALSE); // ShowWindow(GetDlgItem(hwndDlg,IDC_CONVERT2), SW_HIDE); // // file = MP4Read(info_fn, 0); // // if (file == MP4_INVALID_FILE_HANDLE) // return FALSE; // // file_info = MP4Info(file, MP4_INVALID_TRACK_ID); // SetDlgItemText(hwndDlg, IDC_INFOTEXT, file_info); // free(file_info); // // /* get Metadata */ // // pVal = NULL; // if (MP4GetMetadataName(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METANAME, pVal); // // pVal = NULL; // if (MP4GetMetadataArtist(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METAARTIST, pVal); // // pVal = NULL; // if (MP4GetMetadataWriter(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METAWRITER, pVal); // // pVal = NULL; // if (MP4GetMetadataComment(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METACOMMENTS, pVal); // // pVal = NULL; // if (MP4GetMetadataAlbum(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METAALBUM, pVal); // // pVal = NULL; // if (MP4GetMetadataGenre(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METAGENRE, pVal); // // dummy = 0; // MP4GetMetadataTempo(file, &dummy); // if (dummy) // { // wsprintf(dummy1, "%d", dummy); // SetDlgItemText(hwndDlg,IDC_METATEMPO, dummy1); // } // // dummy = 0; dummy2 = 0; // MP4GetMetadataTrack(file, &dummy, &dummy2); // if (dummy) // { // wsprintf(dummy1, "%d", dummy); // SetDlgItemText(hwndDlg,IDC_METATRACK1, dummy1); // } // if (dummy2) // { // wsprintf(dummy1, "%d", dummy2); // SetDlgItemText(hwndDlg,IDC_METATRACK2, dummy1); // } // // dummy = 0; dummy2 = 0; // MP4GetMetadataDisk(file, &dummy, &dummy2); // if (dummy) // { // wsprintf(dummy1, "%d", dummy); // SetDlgItemText(hwndDlg,IDC_METADISK1, dummy1); // } // if (dummy2) // { // wsprintf(dummy1, "%d", dummy2); // SetDlgItemText(hwndDlg,IDC_METADISK2, dummy1); // } // // pVal = NULL; // if (MP4GetMetadataYear(file, &pVal)) // uSetDlgItemText(hwndDlg,IDC_METAYEAR, pVal); // // dummy3 = 0; // MP4GetMetadataCompilation(file, &dummy3); // if (dummy3) // SendMessage(GetDlgItem(hwndDlg, IDC_METACOMPILATION), BM_SETCHECK, BST_CHECKED, 0); // // /* ! Metadata */ // // MP4Close(file); // // return TRUE; // // case WM_COMMAND: // switch (LOWORD(wParam)) { // case IDCANCEL: // EndDialog(hwndDlg, wParam); // return TRUE; // case IDOK: // // /* save Metadata changes */ // // tag_delete(&tags); // file = MP4Read(info_fn, 0); // if (file != MP4_INVALID_FILE_HANDLE) // { // ReadMP4Tag(file, &tags); // MP4Close(file); // // file = MP4Modify(info_fn, 0, 0); // if (file != MP4_INVALID_FILE_HANDLE) // { // MP4MetadataDelete(file); // MP4Close(file); // } // } // // file = MP4Modify(info_fn, 0, 0); // if (file == MP4_INVALID_FILE_HANDLE) // { // tag_delete(&tags); // EndDialog(hwndDlg, wParam); // return FALSE; // } // // uGetDlgItemText(hwndDlg, IDC_METANAME, dummy1, 1024); // tag_set_field(&tags, "title", dummy1); // // uGetDlgItemText(hwndDlg, IDC_METAWRITER, dummy1, 1024); // tag_set_field(&tags, "writer", dummy1); // // uGetDlgItemText(hwndDlg, IDC_METAARTIST, dummy1, 1024); // tag_set_field(&tags, "artist", dummy1); // // uGetDlgItemText(hwndDlg, IDC_METAALBUM, dummy1, 1024); // tag_set_field(&tags, "album", dummy1); // // uGetDlgItemText(hwndDlg, IDC_METACOMMENTS, dummy1, 1024); // tag_set_field(&tags, "comment", dummy1); // // uGetDlgItemText(hwndDlg, IDC_METAGENRE, dummy1, 1024); // tag_set_field(&tags, "genre", dummy1); // // uGetDlgItemText(hwndDlg, IDC_METAYEAR, dummy1, 1024); // tag_set_field(&tags, "year", dummy1); // // GetDlgItemText(hwndDlg, IDC_METATRACK1, dummy1, 1024); // dummy = atoi(dummy1); // GetDlgItemText(hwndDlg, IDC_METATRACK2, dummy1, 1024); // dummy2 = atoi(dummy1); // wsprintf(temp, "%d/%d", dummy, dummy2); // tag_set_field(&tags, "track", temp); // // GetDlgItemText(hwndDlg, IDC_METADISK1, dummy1, 1024); // dummy = atoi(dummy1); // GetDlgItemText(hwndDlg, IDC_METADISK2, dummy1, 1024); // dummy2 = atoi(dummy1); // wsprintf(temp, "%d/%d", dummy, dummy2); // tag_set_field(&tags, "disc", temp); // // GetDlgItemText(hwndDlg, IDC_METATEMPO, dummy1, 1024); // tag_set_field(&tags, "tempo", dummy1); // // dummy3 = SendMessage(GetDlgItem(hwndDlg, IDC_METACOMPILATION), BM_GETCHECK, 0, 0); // tag_set_field(&tags, "compilation", (dummy3 ? "1" : "0")); // // WriteMP4Tag(file, &tags); // // MP4Close(file); // // MP4Optimize(info_fn, NULL, 0); // /* ! */ // // EndDialog(hwndDlg, wParam); // return TRUE; // } // } // return FALSE; //} // ///* returns the name of the object type */ //char *get_ot_string(int ot) //{ // switch (ot) // { // case 0: // return "Main"; // case 1: // return "LC"; // case 2: // return "SSR"; // case 3: // return "LTP"; // } // return NULL; //} // //BOOL CALLBACK aac_info_dialog_proc(HWND hwndDlg, UINT message, // WPARAM wParam, LPARAM lParam) //{ // faadAACInfo aacInfo; // char *info_text, *header_string; // //#ifdef DEBUG_OUTPUT // in_mp4_DebugOutput("aac_info_dialog_proc"); //#endif // // switch (message) { // case WM_INITDIALOG: // EnableWindow(GetDlgItem(hwndDlg,IDC_USERDATA), FALSE) ; // ShowWindow(GetDlgItem(hwndDlg,IDC_USERDATA), SW_HIDE); // // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC1), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC2), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC3), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC4), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC5), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC6), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC7), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC8), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC9), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC10), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC11), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_STATIC12), SW_HIDE); // // ShowWindow(GetDlgItem(hwndDlg,IDC_METANAME), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METAARTIST), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METAWRITER), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METACOMMENTS), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METAALBUM), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METAGENRE), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METATEMPO), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METATRACK1), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METATRACK2), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METADISK1), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METADISK2), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METAYEAR), SW_HIDE); // ShowWindow(GetDlgItem(hwndDlg,IDC_METACOMPILATION), SW_HIDE); // // info_text = malloc(1024*sizeof(char)); // // get_AAC_format(info_fn, &aacInfo); // // switch (aacInfo.headertype) // { // case 0: /* RAW */ // header_string = " RAW"; // break; // case 1: /* ADIF */ // header_string = " ADIF"; // break; // case 2: /* ADTS */ // header_string = " ADTS"; // break; // } // // sprintf(info_text, "%s AAC %s%s, %d sec, %d kbps, %d Hz", // (aacInfo.version==2)?"MPEG-2":"MPEG-4", get_ot_string(aacInfo.object_type), // header_string, // (int)((float)aacInfo.length/1000.0), (int)((float)aacInfo.bitrate/1000.0+0.5), // aacInfo.sampling_rate); // // SetDlgItemText(hwndDlg, IDC_INFOTEXT, info_text); // // free(info_text); // // return TRUE; // // case WM_COMMAND: // switch (LOWORD(wParam)) // { // case IDC_CONVERT: // { // char mp4FileName[256]; // char *extension; // OPENFILENAME ofn; // // lstrcpy(mp4FileName, info_fn); // extension = strrchr(mp4FileName, '.'); // lstrcpy(extension, ".mp4"); // // memset(&ofn, 0, sizeof(OPENFILENAME)); // ofn.lStructSize = sizeof(OPENFILENAME); // ofn.hwndOwner = hwndDlg; // ofn.hInstance = module.hDllInstance; // ofn.nMaxFileTitle = 31; // ofn.lpstrFile = (LPSTR)mp4FileName; // ofn.nMaxFile = _MAX_PATH; // ofn.lpstrFilter = "MP4 Files (*.mp4)\0*.mp4\0"; // ofn.lpstrDefExt = "mp4"; // ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY; // ofn.lpstrTitle = "Select Output File"; // // if (GetSaveFileName(&ofn)) // { // if (covert_aac_to_mp4(info_fn, mp4FileName)) // { // MessageBox(hwndDlg, "An error occured while converting AAC to MP4!", "An error occured!", MB_OK); // return FALSE; // } // } // return TRUE; // } // case IDCANCEL: // case IDOK: // EndDialog(hwndDlg, wParam); // return TRUE; // } // } // return FALSE; //} // //int infoDlg(char *fn, HWND hwndParent) //{ // if(!stricmp(fn + strlen(fn) - 3,"AAC")) // { // lstrcpy(info_fn, fn); // // DialogBox(module.hDllInstance, MAKEINTRESOURCE(IDD_INFO), // hwndParent, aac_info_dialog_proc); // } else { // lstrcpy(info_fn, fn); // // DialogBox(module.hDllInstance, MAKEINTRESOURCE(IDD_INFO), // hwndParent, mp4_info_dialog_proc); // } // // return 0; //} // ///* Get the title from the file */ //void ConstructTitle(MP4FileHandle file, char *filename, char *title, char *format) //{ // char temp[4096]; // int some_info = 0; // char *in = format; // char *out = temp;//title; // char *bound = out + sizeof(temp) - 256; //out + (MAX_PATH - 10 - 1); // char *pVal, dummy1[1024]; // short dummy, dummy2; // // while (*in && out < bound) // { // switch (*in) // { // case '%': // ++in; // break; // // default: // *out++ = *in++; // continue; // } // // /* handle % escape sequence */ // switch (*in++) // { // case '0': // dummy = 0; dummy2 = 0; // if (MP4GetMetadataTrack(file, &dummy, &dummy2)) // { // out += wsprintf(out, "%d", (int)dummy); // some_info = 1; // } // break; // // case '1': // pVal = NULL; // if (MP4GetMetadataArtist(file, &pVal)) // { // out += wsprintf(out, "%s", pVal); // some_info = 1; // } // break; // // case '2': // pVal = NULL; // if (MP4GetMetadataName(file, &pVal)) // { // out += wsprintf(out, "%s", pVal); // some_info = 1; // } // break; // // case '3': // pVal = NULL; // if (MP4GetMetadataAlbum(file, &pVal)) // { // out += wsprintf(out, "%s", pVal); // some_info = 1; // } // break; // // case '4': // pVal = NULL; // if (MP4GetMetadataYear(file, &pVal)) // { // out += wsprintf(out, "%s", pVal); // some_info = 1; // } // break; // // case '5': // pVal = NULL; // if (MP4GetMetadataComment(file, &pVal)) // { // out += wsprintf(out, "%s", pVal); // some_info = 1; // } // break; // // case '6': // pVal = NULL; // if (MP4GetMetadataGenre(file, &pVal)) // { // out += wsprintf(out, "%s", pVal); // some_info = 1; // } // break; // // case '7': // { // const char *p=strrchr(filename,'\\'); // if (!p) p=filename; else p++; // out += ConvertANSIToUTF8(p, out); // some_info = 1; // break; // } // // default: // break; // } // } // // *out = '\0'; // // if (!some_info) // { // char *p=filename+lstrlen(filename); // while (*p != '\\' && p >= filename) p--; // lstrcpy(title,++p); // } // else // { // int len = ConvertUTF8ToANSI(temp, dummy1); // if (len > (MAX_PATH - 10 - 1)) len = (MAX_PATH - 10 - 1); // memcpy(title, dummy1, len); // title[len] = '\0'; // } //} BOOL CALLBACK config_dialog_proc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) { int i; switch (message) { case WM_INITDIALOG: SendMessage(GetDlgItem(hwndDlg, IDC_PRIORITY), TBM_SETRANGE, TRUE, MAKELONG(1,5)); SendMessage(GetDlgItem(hwndDlg, IDC_PRIORITY), TBM_SETPOS, TRUE, m_priority); SendMessage(GetDlgItem(hwndDlg, res_id_table[m_resolution]), BM_SETCHECK, BST_CHECKED, 0); if (m_show_errors) SendMessage(GetDlgItem(hwndDlg, IDC_ERROR), BM_SETCHECK, BST_CHECKED, 0); if (m_use_for_aac) SendMessage(GetDlgItem(hwndDlg, IDC_USEFORAAC), BM_SETCHECK, BST_CHECKED, 0); if (m_downmix) SendMessage(GetDlgItem(hwndDlg, IDC_DOWNMIX), BM_SETCHECK, BST_CHECKED, 0); if (m_vbr_display) SendMessage(GetDlgItem(hwndDlg, IDC_VBR), BM_SETCHECK, BST_CHECKED, 0); SetDlgItemText(hwndDlg, IDC_TITLEFORMAT, titleformat); return TRUE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCANCEL: EndDialog(hwndDlg, wParam); return TRUE; case IDOK: m_show_errors = SendMessage(GetDlgItem(hwndDlg, IDC_ERROR), BM_GETCHECK, 0, 0); m_use_for_aac = SendMessage(GetDlgItem(hwndDlg, IDC_USEFORAAC), BM_GETCHECK, 0, 0); m_downmix = SendMessage(GetDlgItem(hwndDlg, IDC_DOWNMIX), BM_GETCHECK, 0, 0); m_vbr_display = SendMessage(GetDlgItem(hwndDlg, IDC_VBR), BM_GETCHECK, 0, 0); GetDlgItemText(hwndDlg, IDC_TITLEFORMAT, titleformat, MAX_PATH); m_priority = SendMessage(GetDlgItem(hwndDlg, IDC_PRIORITY), TBM_GETPOS, 0, 0); for (i = 0; i < 6; i++) { if (SendMessage(GetDlgItem(hwndDlg, res_id_table[i]), BM_GETCHECK, 0, 0)) { m_resolution = i; break; } } /* save config */ config_write(); //if (!m_use_for_aac) //{ // module.FileExtensions = short_ext_list; //} else { // module.FileExtensions = long_ext_list; //} EndDialog(hwndDlg, wParam); return TRUE; } } return FALSE; } void Configure(int flags) { DialogBox(module.hDllInstance, MAKEINTRESOURCE(IDD_CONFIG), module.hMainWindow, config_dialog_proc); } //----------------------------------------------------------------------------- void About(int flags) { MessageBox(module.hMainWindow, "AudioCoding.com MPEG-4 General Audio player " FAAD2_VERSION " compiled on " __DATE__ ".\n" "Visit the website for more info.\n" "Ported to QCD by Shao Hao.\n" "Copyright 2002-2003 AudioCoding.com", "About", MB_OK); } //----------------------------------------------------------------------------- int fill_buffer(state *st) { int bread; if (st->m_aac_bytes_consumed > 0) { if (st->m_aac_bytes_into_buffer) { memmove((void*)st->m_aac_buffer, (void*)(st->m_aac_buffer + st->m_aac_bytes_consumed), st->m_aac_bytes_into_buffer*sizeof(unsigned char)); } if (!st->m_at_eof) { bread = fread((void*)(st->m_aac_buffer + st->m_aac_bytes_into_buffer), 1, st->m_aac_bytes_consumed, st->aacfile); if (bread != st->m_aac_bytes_consumed) st->m_at_eof = 1; st->m_aac_bytes_into_buffer += bread; } st->m_aac_bytes_consumed = 0; if (st->m_aac_bytes_into_buffer > 3) { if (memcmp(st->m_aac_buffer, "TAG", 3) == 0) st->m_aac_bytes_into_buffer = 0; } if (st->m_aac_bytes_into_buffer > 11) { if (memcmp(st->m_aac_buffer, "LYRICSBEGIN", 11) == 0) st->m_aac_bytes_into_buffer = 0; } if (st->m_aac_bytes_into_buffer > 8) { if (memcmp(st->m_aac_buffer, "APETAGEX", 8) == 0) st->m_aac_bytes_into_buffer = 0; } } return 1; } void advance_buffer(state *st, int bytes) { st->m_file_offset += bytes; st->m_aac_bytes_consumed = bytes; st->m_aac_bytes_into_buffer -= bytes; } int adts_parse(state *st, __int64 *bitrate, double *length) { static int sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000}; int frames, frame_length; int t_framelength = 0; int samplerate; double frames_per_sec, bytes_per_frame; /* Read all frames to ensure correct time and bitrate */ for (frames = 0; /* */; frames++) { fill_buffer(st); if (st->m_aac_bytes_into_buffer > 7) { /* check syncword */ if (!((st->m_aac_buffer[0] == 0xFF)&&((st->m_aac_buffer[1] & 0xF6) == 0xF0))) break; st->m_tail->offset = st->m_file_offset; st->m_tail->next = (struct seek_list*)malloc(sizeof(struct seek_list)); st->m_tail = st->m_tail->next; st->m_tail->next = NULL; if (frames == 0) samplerate = sample_rates[(st->m_aac_buffer[2]&0x3c)>>2]; frame_length = ((((unsigned int)st->m_aac_buffer[3] & 0x3)) << 11) | (((unsigned int)st->m_aac_buffer[4]) << 3) | (st->m_aac_buffer[5] >> 5); t_framelength += frame_length; if (frame_length > st->m_aac_bytes_into_buffer) break; advance_buffer(st, frame_length); } else { break; } } frames_per_sec = (double)samplerate/1024.0; if (frames != 0) bytes_per_frame = (double)t_framelength/(double)(frames*1000); else bytes_per_frame = 0; *bitrate = (__int64)(8. * bytes_per_frame * frames_per_sec + 0.5); if (frames_per_sec != 0) *length = (double)frames/frames_per_sec; else *length = 1; return 1; } int skip_id3v2_tag() { unsigned char buf[10]; int bread, tagsize = 0; bread = fread(buf, 1, 10, mp4state.aacfile); if (bread != 10) return -1; if (!memcmp(buf, "ID3", 3)) { /* high bit is not used */ tagsize = (buf[6] << 21) | (buf[7] << 14) | (buf[8] << 7) | (buf[9] << 0); tagsize += 10; fseek(mp4state.aacfile, tagsize, SEEK_SET); } else { fseek(mp4state.aacfile, 0, SEEK_SET); } return tagsize; } int GetMediaSupported(const char* medianame, MediaInfo *mediaInfo) { int tagsize = 0, init; if (!medianame || !*medianame) return 0; if (!stricmp(medianame + strlen(medianame) - 3,"MP4") || !stricmp(medianame + strlen(medianame) - 3,"M4A")) { if (mediaInfo) { mediaInfo->mediaType = DIGITAL_FILE_MEDIA; mediaInfo->op_canSeek = 1; } return 1; } else if (m_use_for_aac && !stricmp(medianame + strlen(medianame) - 3,"AAC")) { if (mediaInfo) { mediaInfo->mediaType = DIGITAL_FILE_MEDIA; mediaInfo->op_canSeek = 1; memset(&mp4state, 0, sizeof(state)); lstrcpy(mp4state.filename, medianame); if (!(mp4state.aacfile = fopen(mp4state.filename, "rb"))) { // error return 0; } tagsize = skip_id3v2_tag(); if (tagsize<0) return 0; if (!(mp4state.m_aac_buffer = (unsigned char*)malloc(768*6))) { show_error(module.hMainWindow, "Memory allocation error."); return 0; } for (init=0; init<2; init++) { memset(mp4state.m_aac_buffer, 0, 768*6); fread(mp4state.m_aac_buffer, 1, 768*6, mp4state.aacfile); if (init==0) fseek(mp4state.aacfile, tagsize, SEEK_SET); } if (memcmp(mp4state.m_aac_buffer, "ADIF", 4) == 0) mediaInfo->op_canSeek = (double)file_length(mp4state.aacfile) == -1 ? 0 : 1; free(mp4state.m_aac_buffer); fclose(mp4state.aacfile); } return 1; } return 0; } //----------------------------------------------------------------------------- int Play(const char* medianame, int playfrom, int playto, int flags) { WAVEFORMATEX wf; //int maxlatency; int thread_id; int avg_bitrate, br, sr; unsigned char *buffer; int buffer_size; faacDecConfigurationPtr config; #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("play"); #endif if (stricmp(mp4state.filename, medianame) != 0) Stop(mp4state.filename, STOPFLAG_PLAYDONE); if (mp4state.paused) { // Update the player controls to reflect the new unpaused state module.QCDCallbacks.toPlayer.OutputPause(0); Pause(medianame, 0); if (playfrom >= 0) mp4state.seek_needed = playfrom; } else if (PlayThreadAlive) // is playing { mp4state.seek_needed = playfrom; return 1; } else { memset(&mp4state, 0, sizeof(state)); lstrcpy(mp4state.filename, medianame); if (!(mp4state.mp4file = MP4Read(mp4state.filename, 0))) { mp4state.filetype = 1; } else { MP4Close(mp4state.mp4file); mp4state.filetype = 0; } if (mp4state.filetype) { int tagsize = 0, tmp = 0, init; int bread = 0; double length = 0.; __int64 bitrate = 128; //module.is_seekable = 1; if (!(mp4state.aacfile = fopen(mp4state.filename, "rb"))) { // error return -1; } tagsize = skip_id3v2_tag(); if (tagsize<0) return 0; if (!(mp4state.m_aac_buffer = (unsigned char*)malloc(768*6))) { show_error(module.hMainWindow, "Memory allocation error."); return -1; } for (init=0; init<2; init++) { mp4state.hDecoder = faacDecOpen(); if (!mp4state.hDecoder) { show_error(module.hMainWindow, "Unable to open decoder library."); return -1; } config = faacDecGetCurrentConfiguration(mp4state.hDecoder); config->outputFormat = m_resolution + 1; config->downMatrix = m_downmix; faacDecSetConfiguration(mp4state.hDecoder, config); memset(mp4state.m_aac_buffer, 0, 768*6); bread = fread(mp4state.m_aac_buffer, 1, 768*6, mp4state.aacfile); mp4state.m_aac_bytes_into_buffer = bread; mp4state.m_aac_bytes_consumed = 0; mp4state.m_file_offset = 0; mp4state.m_at_eof = (bread != 768*6) ? 1 : 0; if (init==0) { faacDecFrameInfo frameInfo; fill_buffer(&mp4state); if ((mp4state.m_aac_bytes_consumed = faacDecInit(mp4state.hDecoder, mp4state.m_aac_buffer, mp4state.m_aac_bytes_into_buffer, &mp4state.samplerate, &mp4state.channels)) < 0) { show_error(module.hMainWindow, "Can't initialize decoder library."); return -1; } advance_buffer(&mp4state, mp4state.m_aac_bytes_consumed); do { memset(&frameInfo, 0, sizeof(faacDecFrameInfo)); fill_buffer(&mp4state); faacDecDecode(mp4state.hDecoder, &frameInfo, mp4state.m_aac_buffer, mp4state.m_aac_bytes_into_buffer); } while (!frameInfo.samples && !frameInfo.error); if (frameInfo.error) { show_error(module.hMainWindow, faacDecGetErrorMessage(frameInfo.error)); return -1; } mp4state.channels = frameInfo.channels; mp4state.samplerate = frameInfo.samplerate; mp4state.framesize = (frameInfo.channels != 0) ? frameInfo.samples/frameInfo.channels : 0; /* sbr = frameInfo.sbr; profile = frameInfo.object_type; header_type = frameInfo.header_type; */ faacDecClose(mp4state.hDecoder); fseek(mp4state.aacfile, tagsize, SEEK_SET); } } mp4state.m_head = (struct seek_list*)malloc(sizeof(struct seek_list)); mp4state.m_tail = mp4state.m_head; mp4state.m_tail->next = NULL; mp4state.m_header_type = 0; if ((mp4state.m_aac_buffer[0] == 0xFF) && ((mp4state.m_aac_buffer[1] & 0xF6) == 0xF0)) { if (1) //(can_seek) { adts_parse(&mp4state, &bitrate, &length); fseek(mp4state.aacfile, tagsize, SEEK_SET); bread = fread(mp4state.m_aac_buffer, 1, 768*6, mp4state.aacfile); if (bread != 768*6) mp4state.m_at_eof = 1; else mp4state.m_at_eof = 0; mp4state.m_aac_bytes_into_buffer = bread; mp4state.m_aac_bytes_consumed = 0; mp4state.m_header_type = 1; } } else if (memcmp(mp4state.m_aac_buffer, "ADIF", 4) == 0) { int skip_size = (mp4state.m_aac_buffer[4] & 0x80) ? 9 : 0; bitrate = ((unsigned int)(mp4state.m_aac_buffer[4 + skip_size] & 0x0F)<<19) | ((unsigned int)mp4state.m_aac_buffer[5 + skip_size]<<11) | ((unsigned int)mp4state.m_aac_buffer[6 + skip_size]<<3) | ((unsigned int)mp4state.m_aac_buffer[7 + skip_size] & 0xE0); length = (double)file_length(mp4state.aacfile); if (length == -1) { //module.is_seekable = 0; length = 0; } else { length = ((double)length*8.)/((double)bitrate) + 0.5; } mp4state.m_header_type = 2; } else { length = (double)file_length(mp4state.aacfile); length = ((double)length*8.)/((double)bitrate*1000.) + 0.5; //module.is_seekable = 1; } mp4state.m_length = (int)(length*1000.); fill_buffer(&mp4state); if ((mp4state.m_aac_bytes_consumed = faacDecInit(mp4state.hDecoder, mp4state.m_aac_buffer, mp4state.m_aac_bytes_into_buffer, &mp4state.samplerate, &mp4state.channels)) < 0) { show_error(module.hMainWindow, "Can't initialize decoder library."); return -1; } advance_buffer(&mp4state, mp4state.m_aac_bytes_consumed); if (mp4state.m_header_type == 2) avg_bitrate = bitrate; else avg_bitrate = bitrate*1000; } else { mp4state.hDecoder = faacDecOpen(); if (!mp4state.hDecoder) { show_error(module.hMainWindow, "Unable to open decoder library."); return -1; } config = faacDecGetCurrentConfiguration(mp4state.hDecoder); config->outputFormat = m_resolution + 1; config->downMatrix = m_downmix; faacDecSetConfiguration(mp4state.hDecoder, config); mp4state.mp4file = MP4Read(mp4state.filename, 0); if (!mp4state.mp4file) { show_error(module.hMainWindow, "Unable to open file."); faacDecClose(mp4state.hDecoder); return -1; } if ((mp4state.mp4track = GetAACTrack(mp4state.mp4file)) < 0) { show_error(module.hMainWindow, "Unsupported Audio track type."); faacDecClose(mp4state.hDecoder); MP4Close(mp4state.mp4file); return -1; } buffer = NULL; buffer_size = 0; MP4GetTrackESConfiguration(mp4state.mp4file, mp4state.mp4track, &buffer, &buffer_size); if (!buffer) { faacDecClose(mp4state.hDecoder); MP4Close(mp4state.mp4file); return -1; } if(faacDecInit2(mp4state.hDecoder, buffer, buffer_size, &mp4state.samplerate, &mp4state.channels) < 0) { /* If some error initializing occured, skip the file */ faacDecClose(mp4state.hDecoder); MP4Close(mp4state.mp4file); if (buffer) free (buffer); return -1; } /* for gapless decoding */ { mp4AudioSpecificConfig mp4ASC; mp4state.timescale = MP4GetTrackTimeScale(mp4state.mp4file, mp4state.mp4track); mp4state.framesize = 1024; mp4state.useAacLength = 0; if (buffer) { if (AudioSpecificConfig(buffer, buffer_size, &mp4ASC) >= 0) { if (mp4ASC.frameLengthFlag == 1) mp4state.framesize = 960; if (mp4ASC.sbr_present_flag == 1) mp4state.framesize *= 2; } } } free(buffer); avg_bitrate = MP4GetTrackIntegerProperty(mp4state.mp4file, mp4state.mp4track, "mdia.minf.stbl.stsd.mp4a.esds.decConfigDescr.avgBitrate"); mp4state.numSamples = MP4GetTrackNumberOfSamples(mp4state.mp4file, mp4state.mp4track); mp4state.sampleId = 1; //module.is_seekable = 1; } if (mp4state.channels == 0) { show_error(module.hMainWindow, "Number of channels not supported for playback."); faacDecClose(mp4state.hDecoder); if (mp4state.filetype) fclose(mp4state.aacfile); else MP4Close(mp4state.mp4file); return -1; } if (m_downmix && (mp4state.channels == 5 || mp4state.channels == 6)) mp4state.channels = 2; wf.wFormatTag = WAVE_FORMAT_PCM; wf.cbSize = 0; wf.nChannels = mp4state.channels; wf.wBitsPerSample = res_table[m_resolution]; wf.nSamplesPerSec = mp4state.samplerate; wf.nBlockAlign = wf.nChannels * wf.wBitsPerSample / 8; wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign; if (!module.QCDCallbacks.toPlayer.OutputOpen(mp4state.filename, &wf)) // error opening device { faacDecClose(mp4state.hDecoder); if (mp4state.filetype) fclose(mp4state.aacfile); else MP4Close(mp4state.mp4file); return -1; } mp4state.paused = 0; mp4state.decode_pos_ms = 0; mp4state.seek_needed = -1; //// initialize vis stuff //module.SAVSAInit(maxlatency, mp4state.samplerate); //module.VSASetInfo((int)mp4state.channels, mp4state.samplerate); br = (int)floor(((float)avg_bitrate + 500.0)/1000.0 + 0.5); sr = (int)floor((float)mp4state.samplerate/1000.0 + 0.5); ai.struct_size = sizeof(AudioInfo); ai.frequency = sr*1000; ai.bitrate = br*1000; ai.mode = (mp4state.channels == 2) ? 0 : 3; ai.layer = 0; ai.level = 0; strcpy(ai.text, mp4state.filetype ? "AAC" : "MP4"); module.QCDCallbacks.Service(opSetAudioInfo, &ai, sizeof(AudioInfo), 0); //module.outMod->SetVolume(-666); // set the output plug-ins default volume killPlayThread = 0; if (mp4state.filetype) { if ((play_thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)AACPlayThread, (void *)&killPlayThread, 0, &thread_id)) == NULL) { show_error(module.hMainWindow, "Cannot create playback thread"); faacDecClose(mp4state.hDecoder); fclose(mp4state.aacfile); return -1; } } else { if ((play_thread_handle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)MP4PlayThread, (void *)&killPlayThread, 0, &thread_id)) == NULL) { show_error(module.hMainWindow, "Cannot create playback thread"); faacDecClose(mp4state.hDecoder); MP4Close(mp4state.mp4file); return -1; } } SetThreadAffinityMask(play_thread_handle, 1); SetThreadPriority(play_thread_handle, priority_table[m_priority]); } return 1; } //----------------------------------------------------------------------------- int Pause(const char* medianame, int flags) { #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("pause"); #endif mp4state.paused = flags; if (module.QCDCallbacks.toPlayer.OutputPause(flags)) return 1; mp4state.paused = !flags; return 0; } //void unpause() //{ //#ifdef DEBUG_OUTPUT // in_mp4_DebugOutput("unpause"); //#endif // // mp4state.paused = 0; // module.outMod->Pause(0); //} // //int ispaused() //{ //#ifdef DEBUG_OUTPUT // in_mp4_DebugOutput("ispaused"); //#endif // // return mp4state.paused; //} //----------------------------------------------------------------------------- void SetVolume(int levelleft, int levelright, int flags) { #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("setvolume"); #endif module.QCDCallbacks.toPlayer.OutputSetVol(levelleft, levelright, flags); } //void setpan(int pan) //{ //#ifdef DEBUG_OUTPUT // in_mp4_DebugOutput("setpan"); //#endif // // module.outMod->SetPan(pan); //} //----------------------------------------------------------------------------- int Stop(const char* medianame, int flags) { struct seek_list *target = mp4state.m_head; #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("stop"); #endif if (medianame && *medianame && stricmp(mp4state.filename, medianame) == 0) { module.QCDCallbacks.toPlayer.OutputStop(flags); killPlayThread = 1; if (play_thread_handle != INVALID_HANDLE_VALUE) { if (WaitForSingleObject(play_thread_handle, INFINITE) == WAIT_TIMEOUT) TerminateThread(play_thread_handle,0); CloseHandle(play_thread_handle); play_thread_handle = INVALID_HANDLE_VALUE; } if (mp4state.m_aac_buffer) free(mp4state.m_aac_buffer); while (target) { struct seek_list *tmp = target; target = target->next; if (tmp) free(tmp); } faacDecClose(mp4state.hDecoder); if (mp4state.filetype) fclose(mp4state.aacfile); else MP4Close(mp4state.mp4file); //module.outMod->Close(); //module.SAVSADeInit(); mp4state.filename[0] = '\0'; mp4state.paused = 0; } return 1; } int getsonglength(const char *fn) { long msDuration = 0; if(!stricmp(fn + strlen(fn) - 3,"MP4") || !stricmp(fn + strlen(fn) - 3,"M4A")) { int track; MP4Duration length; MP4FileHandle file; file = MP4Read(fn, 0); if (!file) return 0; if ((track = GetAACTrack(file)) < 0) { MP4Close(file); return -1; } length = MP4GetTrackDuration(file, track); msDuration = MP4ConvertFromTrackDuration(file, track, length, MP4_MSECS_TIME_SCALE); MP4Close(file); return msDuration; } else { int tagsize = 0; int bread = 0; double length = 0.; __int64 bitrate = 128; struct seek_list *target; state len_state; memset(&len_state, 0, sizeof(state)); if (!(len_state.aacfile = fopen(fn, "rb"))) { // error return 0; } len_state.m_at_eof = 0; if (!(len_state.m_aac_buffer = (unsigned char*)malloc(768*6))) { //console::error("Memory allocation error.", "foo_mp4"); return 0; } memset(len_state.m_aac_buffer, 0, 768*6); bread = fread(len_state.m_aac_buffer, 1, 768*6, len_state.aacfile); len_state.m_aac_bytes_into_buffer = bread; len_state.m_aac_bytes_consumed = 0; len_state.m_file_offset = 0; if (bread != 768*6) len_state.m_at_eof = 1; if (!memcmp(len_state.m_aac_buffer, "ID3", 3)) { /* high bit is not used */ tagsize = (len_state.m_aac_buffer[6] << 21) | (len_state.m_aac_buffer[7] << 14) | (len_state.m_aac_buffer[8] << 7) | (len_state.m_aac_buffer[9] << 0); tagsize += 10; advance_buffer(&len_state, tagsize); } len_state.m_head = (struct seek_list*)malloc(sizeof(struct seek_list)); len_state.m_tail = len_state.m_head; len_state.m_tail->next = NULL; len_state.m_header_type = 0; if ((len_state.m_aac_buffer[0] == 0xFF) && ((len_state.m_aac_buffer[1] & 0xF6) == 0xF0)) { if (1) //(m_reader->can_seek()) { adts_parse(&len_state, &bitrate, &length); fseek(len_state.aacfile, tagsize, SEEK_SET); bread = fread(len_state.m_aac_buffer, 1, 768*6, len_state.aacfile); if (bread != 768*6) len_state.m_at_eof = 1; else len_state.m_at_eof = 0; len_state.m_aac_bytes_into_buffer = bread; len_state.m_aac_bytes_consumed = 0; len_state.m_header_type = 1; } } else if (memcmp(len_state.m_aac_buffer, "ADIF", 4) == 0) { int skip_size = (len_state.m_aac_buffer[4] & 0x80) ? 9 : 0; bitrate = ((unsigned int)(len_state.m_aac_buffer[4 + skip_size] & 0x0F)<<19) | ((unsigned int)len_state.m_aac_buffer[5 + skip_size]<<11) | ((unsigned int)len_state.m_aac_buffer[6 + skip_size]<<3) | ((unsigned int)len_state.m_aac_buffer[7 + skip_size] & 0xE0); length = (double)file_length(len_state.aacfile); if (length == -1) length = 0; else length = ((double)length*8.)/((double)bitrate) + 0.5; len_state.m_header_type = 2; } else { length = (double)file_length(len_state.aacfile); length = ((double)length*8.)/((double)bitrate*1000.) + 0.5; len_state.m_header_type = 0; } if (len_state.m_aac_buffer) free(len_state.m_aac_buffer); target = len_state.m_head; while (target) { struct seek_list *tmp = target; target = target->next; if (tmp) free(tmp); } fclose(len_state.aacfile); return (int)(length*1000.); } } //int getlength() //{ // if (!mp4state.filetype) // { // int track; // long msDuration; // MP4Duration length; // // if ((track = GetAACTrack(mp4state.mp4file)) < 0) // { // return -1; // } // // length = MP4GetTrackDuration(mp4state.mp4file, track); // // msDuration = MP4ConvertFromTrackDuration(mp4state.mp4file, track, // length, MP4_MSECS_TIME_SCALE); // // return msDuration; // } else { // return mp4state.m_length; // } // return 0; //} //----------------------------------------------------------------------------- int GetCurrentPosition(const char* medianame, long *track, long *offset) { return module.QCDCallbacks.toPlayer.OutputGetCurrentPosition((UINT*)offset, 0); } //void setoutputtime(int time_in_ms) //{ //#ifdef DEBUG_OUTPUT // in_mp4_DebugOutput("setoutputtime"); //#endif // // mp4state.seek_needed = time_in_ms; //} //----------------------------------------------------------------------------- int GetTrackExtents(const char* medianame, TrackExtents *ext, int flags) { int len; FILE *fh; len = getsonglength((char *)medianame); fh = fopen(medianame, "rb"); if (len <= 0 || !fh) return 0; ext->track = 1; ext->start = 0; ext->end = len; ext->bytesize = file_length(fh); fclose(fh); ext->unitpersec = 1000; return 1; } //void eq_set(int on, char data[10], int preamp) //{ //} static void remap_channels(unsigned char *data, unsigned int samples, unsigned int bps) { unsigned int i; switch (bps) { case 8: { unsigned char r1, r2, r3, r4, r5, r6; for (i = 0; i < samples; i += 6) { r1 = data[i]; r2 = data[i+1]; r3 = data[i+2]; r4 = data[i+3]; r5 = data[i+4]; r6 = data[i+5]; data[i] = r2; data[i+1] = r3; data[i+2] = r1; data[i+3] = r6; data[i+4] = r4; data[i+5] = r5; } } break; case 16: default: { unsigned short r1, r2, r3, r4, r5, r6; unsigned short *sample_buffer = (unsigned short *)data; for (i = 0; i < samples; i += 6) { r1 = sample_buffer[i]; r2 = sample_buffer[i+1]; r3 = sample_buffer[i+2]; r4 = sample_buffer[i+3]; r5 = sample_buffer[i+4]; r6 = sample_buffer[i+5]; sample_buffer[i] = r2; sample_buffer[i+1] = r3; sample_buffer[i+2] = r1; sample_buffer[i+3] = r6; sample_buffer[i+4] = r4; sample_buffer[i+5] = r5; } } break; case 24: case 32: { unsigned int r1, r2, r3, r4, r5, r6; unsigned int *sample_buffer = (unsigned int *)data; for (i = 0; i < samples; i += 6) { r1 = sample_buffer[i]; r2 = sample_buffer[i+1]; r3 = sample_buffer[i+2]; r4 = sample_buffer[i+3]; r5 = sample_buffer[i+4]; r6 = sample_buffer[i+5]; sample_buffer[i] = r2; sample_buffer[i+1] = r3; sample_buffer[i+2] = r1; sample_buffer[i+3] = r6; sample_buffer[i+4] = r4; sample_buffer[i+5] = r5; } } break; } } DWORD WINAPI MP4PlayThread(void *b) { int done = 0, updatepos = 0; int l; int seq_frames = 0; int seq_bytes = 0; void *sample_buffer; unsigned char *buffer; int buffer_size; faacDecFrameInfo frameInfo; WriteDataStruct wd; #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("MP4PlayThread"); #endif PlayThreadAlive = 1; mp4state.last_frame = 0; mp4state.initial = 1; while (!*((int *)b)) { /* seeking */ if (mp4state.seek_needed != -1) { MP4Duration duration; module.QCDCallbacks.toPlayer.OutputFlush((unsigned int)mp4state.decode_pos_ms); duration = MP4ConvertToTrackDuration(mp4state.mp4file, mp4state.mp4track, mp4state.seek_needed, MP4_MSECS_TIME_SCALE); mp4state.sampleId = MP4GetSampleIdFromTime(mp4state.mp4file, mp4state.mp4track, duration, 0); mp4state.decode_pos_ms = mp4state.seek_needed; mp4state.seek_needed = -1; updatepos = 1; } if (done) { if (module.QCDCallbacks.toPlayer.OutputDrain(0) && !(mp4state.seek_needed >= 0)) { module.QCDCallbacks.toPlayer.OutputStop(STOPFLAG_PLAYDONE); module.QCDCallbacks.toPlayer.PlayDone(mp4state.filename); PlayThreadAlive = 0; } else if (mp4state.seek_needed >= 0) { done = 0; continue; } break; } else/* if (module.outMod->CanWrite() >= (2048*mp4state.channels*sizeof(short)))*/ { if (mp4state.last_frame) { done = 1; } else { int rc; /* for gapless decoding */ char *buf; MP4Duration dur; unsigned int sample_count; unsigned int delay = 0; /* get acces unit from MP4 file */ buffer = NULL; buffer_size = 0; rc = MP4ReadSample(mp4state.mp4file, mp4state.mp4track, mp4state.sampleId++, &buffer, &buffer_size, NULL, &dur, NULL, NULL); if (mp4state.sampleId-1 == 1) dur = 0; if (rc == 0 || buffer == NULL) { mp4state.last_frame = 1; sample_buffer = NULL; frameInfo.samples = 0; } else { sample_buffer = faacDecDecode(mp4state.hDecoder, &frameInfo, buffer, buffer_size); } if (frameInfo.error > 0) { show_error(module.hMainWindow, faacDecGetErrorMessage(frameInfo.error)); mp4state.last_frame = 1; } if (mp4state.sampleId > mp4state.numSamples) mp4state.last_frame = 1; if (buffer) free(buffer); if (mp4state.useAacLength || (mp4state.timescale != mp4state.samplerate)) { sample_count = frameInfo.samples; } else { sample_count = (unsigned int)(dur * frameInfo.channels); if (!mp4state.useAacLength && !mp4state.initial && (mp4state.sampleId < mp4state.numSamples/2) && (dur*frameInfo.channels != frameInfo.samples)) { //fprintf(stderr, "MP4 seems to have incorrect frame duration, using values from AAC data.\n"); mp4state.useAacLength = 1; sample_count = frameInfo.samples; } } if (mp4state.initial && (sample_count < mp4state.framesize*mp4state.channels) && (frameInfo.samples > sample_count)) { delay = frameInfo.samples - sample_count; } if (!killPlayThread && (sample_count > 0)) { buf = (char *)sample_buffer; mp4state.initial = 0; switch (res_table[m_resolution]) { case 8: buf += delay; break; case 16: default: buf += delay * 2; break; case 24: case 32: buf += delay * 4; break; case 64: buf += delay * 8; } if (frameInfo.channels == 6 && frameInfo.num_lfe_channels) remap_channels(buf, sample_count, res_table[m_resolution]); if (res_table[m_resolution] == 24) { /* convert libfaad output (3 bytes packed in 4) */ char *temp_buffer = convert3in4to3in3(buf, sample_count); memcpy((void*)buf, (void*)temp_buffer, sample_count*3); free(temp_buffer); } //module.SAAddPCMData(buf, (int)mp4state.channels, res_table[m_resolution], // mp4state.decode_pos_ms); //module.VSAAddPCMData(buf, (int)mp4state.channels, res_table[m_resolution], // mp4state.decode_pos_ms); mp4state.decode_pos_ms += (double)sample_count * 1000.0 / ((double)frameInfo.samplerate * (double)frameInfo.channels); l = sample_count * res_table[m_resolution] / 8; if (updatepos) { module.QCDCallbacks.toPlayer.PositionUpdate((unsigned int)mp4state.decode_pos_ms); updatepos = 0; } wd.bytelen = l; wd.data = (short*)buf; wd.markerend = 0; wd.markerstart = (UINT)mp4state.decode_pos_ms; wd.bps = res_table[m_resolution]; wd.nch = frameInfo.channels; wd.numsamples = sample_count/frameInfo.channels; wd.srate = frameInfo.samplerate; if (!module.QCDCallbacks.toPlayer.OutputWrite(&wd)) done = 1; //if (module.dsp_isactive()) //{ // void *dsp_buffer = malloc(l*2); // memcpy(dsp_buffer, buf, l); // l = module.dsp_dosamples((short*)dsp_buffer, // sample_count/frameInfo.channels, // res_table[m_resolution], // frameInfo.channels, // frameInfo.samplerate) * // (frameInfo.channels*(res_table[m_resolution]/8)); // module.outMod->Write(dsp_buffer, l); // if (dsp_buffer) free(dsp_buffer); //} else { // module.outMod->Write(buf, l); //} /* VBR bitrate display */ if (m_vbr_display) { seq_frames++; seq_bytes += frameInfo.bytesconsumed; if (seq_frames == (int)(floor((float)frameInfo.samplerate/(float)(sample_count/frameInfo.channels) + 0.5))) { ai.bitrate = (int)floor(((float)seq_bytes*8.)/1000. + 0.5) * 1000; ai.frequency = (int)floor(frameInfo.samplerate/1000. + 0.5) * 1000; ai.mode = (mp4state.channels == 2) ? 0 : 3; module.QCDCallbacks.Service(opSetAudioInfo, &ai, sizeof(AudioInfo), 0); seq_frames = 0; seq_bytes = 0; } } } } } Sleep(10); // catch pause while (mp4state.paused && !killPlayThread) Sleep(50); } PlayThreadAlive = 0; return 0; } void *decode_aac_frame(state *st, faacDecFrameInfo *frameInfo) { void *sample_buffer = NULL; do { fill_buffer(st); if (st->m_aac_bytes_into_buffer != 0) { sample_buffer = faacDecDecode(st->hDecoder, frameInfo, st->m_aac_buffer, st->m_aac_bytes_into_buffer); if (st->m_header_type != 1) { if (st->last_offset < st->m_file_offset) { st->m_tail->offset = st->m_file_offset; st->m_tail->next = (struct seek_list*)malloc(sizeof(struct seek_list)); st->m_tail = st->m_tail->next; st->m_tail->next = NULL; st->last_offset = st->m_file_offset; } } advance_buffer(st, frameInfo->bytesconsumed); } else { break; } } while (!frameInfo->samples && !frameInfo->error); return sample_buffer; } int aac_seek(state *st, double seconds) { int i, frames; int bread; struct seek_list *target = st->m_head; if (1 /*can_seek*/ && ((st->m_header_type == 1) || (seconds < st->cur_pos_sec))) { frames = (int)(seconds*((double)st->samplerate/(double)st->framesize) + 0.5); for (i = 0; i < frames; i++) { if (target->next) target = target->next; else return 0; } if (target->offset == 0 && frames > 0) return 0; fseek(st->aacfile, target->offset, SEEK_SET); st->m_file_offset = target->offset; bread = fread(st->m_aac_buffer, 1, 768*6, st->aacfile); if (bread != 768*6) st->m_at_eof = 1; else st->m_at_eof = 0; st->m_aac_bytes_into_buffer = bread; st->m_aac_bytes_consumed = 0; st->m_file_offset += bread; faacDecPostSeekReset(st->hDecoder, -1); return 1; } else { if (seconds > st->cur_pos_sec) { faacDecFrameInfo frameInfo; frames = (int)((seconds - st->cur_pos_sec)*((double)st->samplerate/(double)st->framesize)); if (frames > 0) { for (i = 0; i < frames; i++) { memset(&frameInfo, 0, sizeof(faacDecFrameInfo)); decode_aac_frame(st, &frameInfo); if (frameInfo.error || (st->m_aac_bytes_into_buffer == 0)) { if (frameInfo.error) { if (faacDecGetErrorMessage(frameInfo.error) != NULL) show_error(module.hMainWindow, faacDecGetErrorMessage(frameInfo.error)); } return 0; } } } faacDecPostSeekReset(st->hDecoder, -1); } return 1; } } DWORD WINAPI AACPlayThread(void *b) { int done = 0, updatepos = 0; int l; int seq_frames = 0; int seq_bytes = 0; WriteDataStruct wd; #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("AACPlayThread"); #endif PlayThreadAlive = 1; mp4state.last_frame = 0; while (!*((int *)b)) { /* seeking */ if (mp4state.seek_needed != -1) { double ms; ms = mp4state.seek_needed/1000; if (aac_seek(&mp4state, ms)!=0) { module.QCDCallbacks.toPlayer.OutputFlush((unsigned int)mp4state.decode_pos_ms); mp4state.cur_pos_sec = ms; mp4state.decode_pos_ms = mp4state.seek_needed; } mp4state.seek_needed = -1; updatepos = 1; } if (done) { if (module.QCDCallbacks.toPlayer.OutputDrain(0) && !(mp4state.seek_needed >= 0)) { module.QCDCallbacks.toPlayer.OutputStop(STOPFLAG_PLAYDONE); module.QCDCallbacks.toPlayer.PlayDone(mp4state.filename); PlayThreadAlive = 0; } else if (mp4state.seek_needed >= 0) { done = 0; continue; } break; } else/* if (module.outMod->CanWrite() >= (2048*mp4state.channels*sizeof(short)))*/ { faacDecFrameInfo frameInfo; void *sample_buffer; memset(&frameInfo, 0, sizeof(faacDecFrameInfo)); sample_buffer = decode_aac_frame(&mp4state, &frameInfo); if (frameInfo.error || (mp4state.m_aac_bytes_into_buffer == 0)) { if (frameInfo.error) { if (faacDecGetErrorMessage(frameInfo.error) != NULL) show_error(module.hMainWindow, faacDecGetErrorMessage(frameInfo.error)); } done = 1; } if (!killPlayThread && (frameInfo.samples > 0)) { if (frameInfo.channels == 6 && frameInfo.num_lfe_channels) remap_channels(sample_buffer, frameInfo.samples, res_table[m_resolution]); if (res_table[m_resolution] == 24) { /* convert libfaad output (3 bytes packed in 4 bytes) */ char *temp_buffer = convert3in4to3in3(sample_buffer, frameInfo.samples); memcpy((void*)sample_buffer, (void*)temp_buffer, frameInfo.samples*3); free(temp_buffer); } //module.SAAddPCMData(sample_buffer, (int)mp4state.channels, res_table[m_resolution], // mp4state.decode_pos_ms); //module.VSAAddPCMData(sample_buffer, (int)mp4state.channels, res_table[m_resolution], // mp4state.decode_pos_ms); mp4state.decode_pos_ms += (double)frameInfo.samples * 1000.0 / ((double)frameInfo.samplerate* (double)frameInfo.channels); l = frameInfo.samples * res_table[m_resolution] / 8; if (updatepos) { module.QCDCallbacks.toPlayer.PositionUpdate((unsigned int)mp4state.decode_pos_ms); updatepos = 0; } wd.bytelen = l; wd.data = (short*)sample_buffer; wd.markerend = 0; wd.markerstart = (UINT)mp4state.decode_pos_ms; wd.bps = res_table[m_resolution]; wd.nch = frameInfo.channels; wd.numsamples = frameInfo.samples/frameInfo.channels; wd.srate = frameInfo.samplerate; if (!module.QCDCallbacks.toPlayer.OutputWrite(&wd)) done = 1; //if (module.dsp_isactive()) //{ // void *dsp_buffer = malloc(l*2); // memcpy(dsp_buffer, sample_buffer, l); // l = module.dsp_dosamples((short*)dsp_buffer, // frameInfo.samples/frameInfo.channels, // res_table[m_resolution], // frameInfo.channels, // frameInfo.samplerate) * // (frameInfo.channels*(res_table[m_resolution]/8)); // module.outMod->Write(dsp_buffer, l); // if (dsp_buffer) free(dsp_buffer); //} else { // module.outMod->Write(sample_buffer, l); //} /* VBR bitrate display */ if (m_vbr_display) { seq_frames++; seq_bytes += frameInfo.bytesconsumed; if (seq_frames == (int)(floor((float)frameInfo.samplerate/(float)(frameInfo.samples/frameInfo.channels) + 0.5))) { ai.bitrate = (int)floor(((float)seq_bytes*8.)/1000. + 0.5) * 1000; ai.frequency = (int)floor(frameInfo.samplerate/1000. + 0.5) * 1000; ai.mode = (mp4state.channels == 2) ? 0 : 3; module.QCDCallbacks.Service(opSetAudioInfo, &ai, sizeof(AudioInfo), 0); seq_frames = 0; seq_bytes = 0; } } } if (frameInfo.channels > 0 && mp4state.samplerate > 0) mp4state.cur_pos_sec += ((double)(frameInfo.samples/frameInfo.channels))/(double)mp4state.samplerate; } Sleep(10); // catch pause while (mp4state.paused && !killPlayThread) Sleep(50); } PlayThreadAlive = 0; return 0; } //----------------------------------------------------------------------------- int WINAPI DllMain(HINSTANCE hInst, DWORD fdwReason, LPVOID pRes) { if (fdwReason == DLL_PROCESS_ATTACH) { module.hDllInstance = hInst; } return 1; } //----------------------------------------------------------------------------- PLUGIN_API QCDModInitIn* INPUTDLL_ENTRY_POINT(QCDModInitIn *ModInit, QCDModInfo *ModInfo) { module.QCDCallbacks.size = sizeof(QCDModInitIn); module.QCDCallbacks.version = PLUGIN_API_VERSION; module.QCDCallbacks.toModule.Initialize = Initialize; module.QCDCallbacks.toModule.ShutDown = ShutDown; module.QCDCallbacks.toModule.GetTrackExtents = GetTrackExtents; module.QCDCallbacks.toModule.GetMediaSupported = GetMediaSupported; module.QCDCallbacks.toModule.Play = Play; module.QCDCallbacks.toModule.Pause = Pause; module.QCDCallbacks.toModule.Stop = Stop; module.QCDCallbacks.toModule.About = About; module.QCDCallbacks.toModule.Configure = Configure; module.QCDCallbacks.toModule.SetEQ = NULL; module.QCDCallbacks.toModule.SetVolume = SetVolume; return &module.QCDCallbacks; } ///* new Media Library interface */ // //int mp4_get_metadata(MP4FileHandle file, const char *item, char *dest, int dlen) //{ // char *pVal = NULL, dummy1[4096]; // short dummy = 0, dummy2 = 0; // // if (dlen < 1) return 0; // // if (!stricmp(item, "track") || !stricmp(item, "tracknumber")) // { // if (MP4GetMetadataTrack(file, &dummy, &dummy2)) // { // wsprintf(dummy1, "%d", (int)dummy); // strncpy(dest, dummy1, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "disc") || !stricmp(item, "disknumber")) // { // if (MP4GetMetadataDisk(file, &dummy, &dummy2)) // { // wsprintf(dummy1, "%d", (int)dummy); // strncpy(dest, dummy1, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "compilation")) // { // u_int8_t cpil = 0; // if (MP4GetMetadataCompilation(file, &cpil)) // { // wsprintf(dummy1, "%d", (int)cpil); // strncpy(dest, dummy1, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "tempo")) // { // u_int16_t tempo = 0; // if (MP4GetMetadataTempo(file, &tempo)) // { // wsprintf(dummy1, "%d", (int)tempo); // strncpy(dest, dummy1, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "artist")) // { // if (MP4GetMetadataArtist(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "writer")) // { // if (MP4GetMetadataWriter(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "title")) // { // if (MP4GetMetadataName(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "album")) // { // if (MP4GetMetadataAlbum(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "date") || !stricmp(item, "year")) // { // if (MP4GetMetadataYear(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "comment")) // { // if (MP4GetMetadataComment(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "genre")) // { // if (MP4GetMetadataGenre(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else if (!stricmp(item, "tool")) // { // if (MP4GetMetadataTool(file, &pVal)) // { // strncpy(dest, pVal, dlen-1); // dest[dlen-1] = '\0'; // return 1; // } // } // else // { // u_int32_t valueSize = 0; // u_int8_t *pValue = NULL; // // if (MP4GetMetadataFreeForm(file, (char *)item, &pValue, &valueSize)) // { // unsigned int len = (valueSize < (unsigned int)(dlen-1)) ? valueSize : (unsigned int)(dlen-1); // memcpy(dest, pValue, len); // dest[len] = '\0'; // return 1; // } // } // // return 0; //} // //__declspec(dllexport) int winampGetExtendedFileInfo(const char *fn, const char *data, char *dest, int destlen) //{ // if (!fn || (fn && !*fn) || !destlen) return 0; // // dest[0] = '\0'; // // if (!stricmp(data, "length")) // { // char temp[32]; // int len = getsonglength(fn); // itoa(len, temp, 10); // strncpy(dest, temp, destlen-1); // dest[destlen-1] = '\0'; // } // else // { // char temp[2048], temp2[2048]; // MP4FileHandle file = MP4Read(fn, 0); // if (file == MP4_INVALID_FILE_HANDLE) return 0; // // if (mp4_get_metadata(file, data, temp, sizeof(temp))) // { // int len = ConvertUTF8ToANSI(temp, temp2); // if (len > destlen-1) len = destlen-1; // memcpy(dest, temp2, len); // dest[len] = '\0'; // } // // MP4Close(file); // } // // return 1; //} // //static struct medialib_tags mltags = {0, 0}; //static BOOL medialib_init = FALSE; //static char medialib_lastfn[2048] = ""; // //__declspec(dllexport) int winampSetExtendedFileInfo(const char *fn, const char *data, char *val) //{ // int len, ret = 0; // char *temp; // // if (!medialib_init || (medialib_init && stricmp(fn, medialib_lastfn))) { // MP4FileHandle file; // strcpy(medialib_lastfn, fn); // // if (medialib_init) tag_delete(&mltags); // // file = MP4Read(fn, 0); // if (file == MP4_INVALID_FILE_HANDLE) return 0; // ReadMP4Tag(file, &mltags); // MP4Close(file); // medialib_init = TRUE; // } // // len = strlen(val); // temp = (char *)malloc((len+1)*4); // if (!temp) return 0; // // if (ConvertANSIToUTF8(val, temp)) // { // ret = 1; // tag_set_field(&mltags, data, temp); // } // // free(temp); // // return ret; //} // //__declspec(dllexport) int winampWriteExtendedFileInfo() //{ // if (medialib_init) // { // MP4FileHandle file = MP4Modify(medialib_lastfn, 0, 0); // if (file == MP4_INVALID_FILE_HANDLE) return 0; // // MP4MetadataDelete(file); // MP4Close(file); // // file = MP4Modify(medialib_lastfn, 0, 0); // if (file == MP4_INVALID_FILE_HANDLE) return 0; // // WriteMP4Tag(file, &mltags); // // MP4Close(file); // // return 1; // } // else // { // return 0; // } //} faad2-2_10_0/plugins/QCDMp4/QCDMp4.rc000066400000000000000000000131341374350120500167020ustar00rootroot00000000000000// Microsoft Visual C++ generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // (л񹲺͹) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) #ifdef _WIN32 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #pragma code_page(936) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_CONFIG DIALOGEX 0, 0, 242, 93 STYLE DS_SETFONT | DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Configuration" FONT 9, "", 400, 0, 0x86 BEGIN CONTROL "Slider1",IDC_PRIORITY,"msctls_trackbar32",TBS_VERT | TBS_NOTICKS | WS_TABSTOP,13,15,18,46 CONTROL "16 λ",IDC_16BITS,"Button",BS_AUTORADIOBUTTON,77,18,37, 10 CONTROL "16 λƵ",IDC_16BITS_DITHERED,"Button", BS_AUTORADIOBUTTON | WS_DISABLED,77,29,64,10 CONTROL "24 λ",IDC_24BITS,"Button",BS_AUTORADIOBUTTON,77,40,37, 10 CONTROL "32 λ",IDC_32BITS,"Button",BS_AUTORADIOBUTTON,77,51,37, 10 CONTROL "»Ƶ",IDC_DOWNMIX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,13,80,10 CONTROL "֧ AAC ʽ",IDC_USEFORAAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,26,68,10 CONTROL "ʾɱ",IDC_VBR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,39,72,10 CONTROL "ʾϢ",IDC_ERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,52,64,10 DEFPUSHBUTTON "ȷ",IDOK,185,72,50,14 PUSHBUTTON "ȡ",IDCANCEL,127,72,50,14 GROUPBOX "ȼ",IDC_STATIC,7,7,57,58 LTEXT "",IDC_STATIC,34,18,25,8 LTEXT "׼",IDC_STATIC,34,35,23,8 LTEXT "",IDC_STATIC,34,52,24,8 GROUPBOX "",IDC_STATIC,71,7,73,58 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_CONFIG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 235 TOPMARGIN, 7 BOTTOMMARGIN, 86 END END #endif // APSTUDIO_INVOKED #endif // (л񹲺͹) resources ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////// // () resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NLD) #ifdef _WIN32 LANGUAGE LANG_DUTCH, SUBLANG_DUTCH #pragma code_page(1252) #endif //_WIN32 #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 1 TEXTINCLUDE BEGIN "resource.h\0" END 2 TEXTINCLUDE BEGIN "#include ""afxres.h""\r\n" "\0" END 3 TEXTINCLUDE BEGIN "\r\n" "\0" END #endif // APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_CONFIG DIALOGEX 0, 0, 233, 93 STYLE DS_SETFONT | DS_MODALFRAME | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Configuration" FONT 8, "MS Sans Serif", 0, 0, 0x0 BEGIN CONTROL "Slider1",IDC_PRIORITY,"msctls_trackbar32",TBS_VERT | TBS_NOTICKS | WS_TABSTOP,13,15,18,46 CONTROL "16 bits",IDC_16BITS,"Button",BS_AUTORADIOBUTTON,77,18, 37,10 CONTROL "16 bits dithered",IDC_16BITS_DITHERED,"Button", BS_AUTORADIOBUTTON | WS_DISABLED,77,29,64,10 CONTROL "24 bits",IDC_24BITS,"Button",BS_AUTORADIOBUTTON,77,40, 37,10 CONTROL "32 bits",IDC_32BITS,"Button",BS_AUTORADIOBUTTON,77,51, 37,10 CONTROL "Downmix to stereo",IDC_DOWNMIX,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,13,74,10 CONTROL "Use for AAC",IDC_USEFORAAC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,26,55,10 CONTROL "VBR Display",IDC_VBR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,39,55,10 CONTROL "Show errors",IDC_ERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,152,52,53,10 DEFPUSHBUTTON "OK",IDOK,176,72,50,14 PUSHBUTTON "Cancel",IDCANCEL,115,72,50,14 GROUPBOX "Priority",IDC_STATIC,7,7,57,58 LTEXT "Highest",IDC_STATIC,34,18,25,8 LTEXT "Normal",IDC_STATIC,34,35,23,8 LTEXT "Lowest",IDC_STATIC,34,52,24,8 GROUPBOX "Resolution",IDC_STATIC,71,7,73,58 END ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO // #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO BEGIN IDD_CONFIG, DIALOG BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 226 TOPMARGIN, 7 BOTTOMMARGIN, 86 END END #endif // APSTUDIO_INVOKED #endif // () resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED faad2-2_10_0/plugins/QCDMp4/QCDMp4.sln000066400000000000000000000037551374350120500171020ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 9.00 # Visual Studio 2005 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "QCDMp4", "QCDMp4.vcproj", "{2D8F479D-A591-4502-9456-398425D5F834}" ProjectSection(ProjectDependencies) = postProject {2398BB2F-FFF9-490B-B4CC-863F2D21AE46} = {2398BB2F-FFF9-490B-B4CC-863F2D21AE46} {8CAC9E26-BAA5-45A4-8721-E3170B3F8F49} = {8CAC9E26-BAA5-45A4-8721-E3170B3F8F49} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\..\libfaad\libfaad.vcproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp4v2_st", "..\..\common\mp4v2\libmp4v2_st60.vcproj", "{2398BB2F-FFF9-490B-B4CC-863F2D21AE46}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmp4av_st", "..\..\common\mp4av\libmp4av_st.vcproj", "{8CAC9E26-BAA5-45A4-8721-E3170B3F8F49}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {2D8F479D-A591-4502-9456-398425D5F834}.Debug|Win32.ActiveCfg = Debug|Win32 {2D8F479D-A591-4502-9456-398425D5F834}.Debug|Win32.Build.0 = Debug|Win32 {2D8F479D-A591-4502-9456-398425D5F834}.Release|Win32.ActiveCfg = Release|Win32 {2D8F479D-A591-4502-9456-398425D5F834}.Release|Win32.Build.0 = Release|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|Win32.ActiveCfg = Debug|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|Win32.ActiveCfg = Release|Win32 {2398BB2F-FFF9-490B-B4CC-863F2D21AE46}.Debug|Win32.ActiveCfg = Debug|Win32 {2398BB2F-FFF9-490B-B4CC-863F2D21AE46}.Release|Win32.ActiveCfg = Release|Win32 {8CAC9E26-BAA5-45A4-8721-E3170B3F8F49}.Debug|Win32.ActiveCfg = Debug|Win32 {8CAC9E26-BAA5-45A4-8721-E3170B3F8F49}.Release|Win32.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection EndGlobal faad2-2_10_0/plugins/QCDMp4/QCDMp4.vcproj000066400000000000000000000134141374350120500176020ustar00rootroot00000000000000 faad2-2_10_0/plugins/QCDMp4/QCDMp4Tag.cpp000066400000000000000000000550111374350120500175140ustar00rootroot00000000000000#include #include #include "QCDTagsDLL.h" //.............................................................................. // Global Variables typedef struct tag { char *item; char *value; } tag; typedef struct medialib_tags { struct tag *tags; unsigned int count; } medialib_tags; int tag_add_field(medialib_tags *tags, const char *item, const char *value) { void *backup = (void *)tags->tags; if (!item || (item && !*item) || !value) return 0; tags->tags = (struct tag *)realloc(tags->tags, (tags->count+1) * sizeof(tag)); if (!tags->tags) { if (backup) free(backup); return 0; } else { int i_len = strlen(item); int v_len = strlen(value); tags->tags[tags->count].item = (char *)malloc(i_len+1); tags->tags[tags->count].value = (char *)malloc(v_len+1); if (!tags->tags[tags->count].item || !tags->tags[tags->count].value) { if (!tags->tags[tags->count].item) free (tags->tags[tags->count].item); if (!tags->tags[tags->count].value) free (tags->tags[tags->count].value); tags->tags[tags->count].item = NULL; tags->tags[tags->count].value = NULL; return 0; } memcpy(tags->tags[tags->count].item, item, i_len); memcpy(tags->tags[tags->count].value, value, v_len); tags->tags[tags->count].item[i_len] = '\0'; tags->tags[tags->count].value[v_len] = '\0'; tags->count++; return 1; } } int tag_set_field(medialib_tags *tags, const char *item, const char *value) { unsigned int i; if (!item || (item && !*item) || !value) return 0; for (i = 0; i < tags->count; i++) { if (!stricmp(tags->tags[i].item, item)) { void *backup = (void *)tags->tags[i].value; int v_len = strlen(value); tags->tags[i].value = (char *)realloc(tags->tags[i].value, v_len+1); if (!tags->tags[i].value) { if (backup) free(backup); return 0; } memcpy(tags->tags[i].value, value, v_len); tags->tags[i].value[v_len] = '\0'; return 1; } } return tag_add_field(tags, item, value); } void tag_delete(medialib_tags *tags) { unsigned int i; for (i = 0; i < tags->count; i++) { if (tags->tags[i].item) free(tags->tags[i].item); if (tags->tags[i].value) free(tags->tags[i].value); } if (tags->tags) free(tags->tags); tags->tags = NULL; tags->count = 0; } int ReadMP4Tag(MP4FileHandle file, medialib_tags *tags) { unsigned __int32 valueSize; unsigned __int8 *pValue; char *pName; unsigned int i = 0; do { pName = 0; pValue = 0; valueSize = 0; MP4GetMetadataByIndex(file, i, (const char **)&pName, &pValue, &valueSize); if (valueSize > 0) { char *val = (char *)malloc(valueSize+1); if (!val) return 0; memcpy(val, pValue, valueSize); val[valueSize] = '\0'; if (pName[0] == '\xa9') { if (memcmp(pName, "nam", 4) == 0) { tag_add_field(tags, "title", val); } else if (memcmp(pName, "ART", 4) == 0) { tag_add_field(tags, "artist", val); } else if (memcmp(pName, "wrt", 4) == 0) { tag_add_field(tags, "writer", val); } else if (memcmp(pName, "alb", 4) == 0) { tag_add_field(tags, "album", val); } else if (memcmp(pName, "day", 4) == 0) { tag_add_field(tags, "date", val); } else if (memcmp(pName, "too", 4) == 0) { tag_add_field(tags, "tool", val); } else if (memcmp(pName, "cmt", 4) == 0) { tag_add_field(tags, "comment", val); } else if (memcmp(pName, "gen", 4) == 0) { tag_add_field(tags, "genre", val); } else { tag_add_field(tags, pName, val); } } else if (memcmp(pName, "gnre", 4) == 0) { char *t=0; if (MP4GetMetadataGenre(file, &t)) { tag_add_field(tags, "genre", t); } } else if (memcmp(pName, "trkn", 4) == 0) { unsigned __int16 trkn = 0, tot = 0; char t[200]; if (MP4GetMetadataTrack(file, &trkn, &tot)) { if (tot > 0) wsprintf(t, "%d/%d", trkn, tot); else wsprintf(t, "%d", trkn); tag_add_field(tags, "tracknumber", t); } } else if (memcmp(pName, "disk", 4) == 0) { unsigned __int16 disk = 0, tot = 0; char t[200]; if (MP4GetMetadataDisk(file, &disk, &tot)) { if (tot > 0) wsprintf(t, "%d/%d", disk, tot); else wsprintf(t, "%d", disk); tag_add_field(tags, "disc", t); } } else if (memcmp(pName, "cpil", 4) == 0) { unsigned __int8 cpil = 0; char t[200]; if (MP4GetMetadataCompilation(file, &cpil)) { wsprintf(t, "%d", cpil); tag_add_field(tags, "compilation", t); } } else if (memcmp(pName, "tmpo", 4) == 0) { unsigned __int16 tempo = 0; char t[200]; if (MP4GetMetadataTempo(file, &tempo)) { wsprintf(t, "%d BPM", tempo); tag_add_field(tags, "tempo", t); } } else if (memcmp(pName, "NDFL", 4) == 0) { /* Removed */ } else { tag_add_field(tags, pName, val); } free(val); } i++; } while (valueSize > 0); return 1; } int mp4_set_metadata(MP4FileHandle file, const char *item, const char *val) { if (!item || (item && !*item) || !val || (val && !*val)) return 0; if (!stricmp(item, "track") || !stricmp(item, "tracknumber")) { unsigned __int16 trkn, tot; int t1 = 0, t2 = 0; sscanf(val, "%d/%d", &t1, &t2); trkn = t1, tot = t2; if (!trkn) return 1; if (MP4SetMetadataTrack(file, trkn, tot)) return 1; } else if (!stricmp(item, "disc") || !stricmp(item, "disknumber")) { unsigned __int16 disk, tot; int t1 = 0, t2 = 0; sscanf(val, "%d/%d", &t1, &t2); disk = t1, tot = t2; if (!disk) return 1; if (MP4SetMetadataDisk(file, disk, tot)) return 1; } else if (!stricmp(item, "compilation")) { unsigned __int8 cpil = atoi(val); if (!cpil) return 1; if (MP4SetMetadataCompilation(file, cpil)) return 1; } else if (!stricmp(item, "tempo")) { unsigned __int16 tempo = atoi(val); if (!tempo) return 1; if (MP4SetMetadataTempo(file, tempo)) return 1; } else if (!stricmp(item, "artist")) { if (MP4SetMetadataArtist(file, val)) return 1; } else if (!stricmp(item, "writer")) { if (MP4SetMetadataWriter(file, val)) return 1; } else if (!stricmp(item, "title")) { if (MP4SetMetadataName(file, val)) return 1; } else if (!stricmp(item, "album")) { if (MP4SetMetadataAlbum(file, val)) return 1; } else if (!stricmp(item, "date") || !stricmp(item, "year")) { if (MP4SetMetadataYear(file, val)) return 1; } else if (!stricmp(item, "comment")) { if (MP4SetMetadataComment(file, val)) return 1; } else if (!stricmp(item, "genre")) { if (MP4SetMetadataGenre(file, val)) return 1; } else if (!stricmp(item, "tool")) { if (MP4SetMetadataTool(file, val)) return 1; } else { if (MP4SetMetadataFreeForm(file, (char *)item, (u_int8_t *)val, (u_int32_t)strlen(val) + 1)) return 1; } return 0; } void WriteMP4Tag(MP4FileHandle file, const medialib_tags *tags) { unsigned int i; for (i = 0; i < tags->count; i++) { const char *item = tags->tags[i].item; const char *value = tags->tags[i].value; if (value && *value) { mp4_set_metadata(file, item, value); } } } QCDModInitTag ModInitTag; medialib_tags tags; BOOL uSetDlgItemText(void *tagHandle, int fieldId, const char *str); UINT uGetDlgItemText(void *tagHandle, int fieldId, char *str, int max); //------------------------------------------------------------------------------ PLUGIN_API QCDModInitTag* TAGEDITORDLL_ENTRY_POINT() { ModInitTag.size = sizeof(QCDModInitTag); ModInitTag.version = PLUGIN_API_VERSION; ModInitTag.ShutDown = ShutDown_Tag; ModInitTag.Read = Read_Tag; ModInitTag.Write = Write_Tag; // Leave null for operations that plugin does not support ModInitTag.Strip = Strip_Tag; // ie: if plugin only reads tags, leave Write and Strip null ModInitTag.description = "MP4 Tags"; ModInitTag.defaultexts = "MP4:M4A"; return &ModInitTag; } //----------------------------------------------------------------------------- void ShutDown_Tag(int flags) { // TODO: // prepare plugin to be unloaded. All allocations should be freed. // flags param is unused tag_delete(&tags); } //----------------------------------------------------------------------------- bool Read_Tag(LPCSTR filename, void* tagHandle) { // TODO: // read metadata from tag and set each field to tagHandle // only TAGFIELD_* are supported (see QCDModTagEditor.h) // example of how to set value to tagHandle // use SetFieldA for ASCII or MultiBytes strings. // use SetFieldW for UNICODE strings // // ModInitTag.SetFieldW(tagHandle, TAGFIELD_COMPOSER, szwValue); // return true for successfull read, false for failure MP4FileHandle file = MP4_INVALID_FILE_HANDLE; char *pVal, dummy1[1024]; short dummy, dummy2; u_int32_t valueSize = 0; #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("mp4_tag_read"); #endif file = MP4Read(filename, 0); if (file == MP4_INVALID_FILE_HANDLE) return false; /* get Metadata */ pVal = NULL; MP4GetMetadataName(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_TITLE, pVal); pVal = NULL; MP4GetMetadataArtist(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_ARTIST, pVal); pVal = NULL; MP4GetMetadataWriter(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_COMPOSER, pVal); pVal = NULL; MP4GetMetadataComment(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_COMMENT, pVal); pVal = NULL; MP4GetMetadataAlbum(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_ALBUM, pVal); pVal = NULL; MP4GetMetadataGenre(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_GENRE, pVal); //dummy = 0; //MP4GetMetadataTempo(file, &dummy); //if (dummy) //{ // wsprintf(dummy1, "%d", dummy); // SetDlgItemText(hwndDlg,IDC_METATEMPO, dummy1); //} dummy = 0; dummy2 = 0; MP4GetMetadataTrack(file, (unsigned __int16*)&dummy, (unsigned __int16*)&dummy2); if (dummy) { wsprintf(dummy1, "%d", dummy); ModInitTag.SetFieldA(tagHandle, TAGFIELD_TRACK, dummy1); } //if (dumm2) //{ // wsprintf(dummy1, "%d", dummy2); // SetDlgItemText(hwndDlg,IDC_METATRACK2, dummy1); //} //dummy = 0; dummy2 = 0; //MP4GetMetadataDisk(file, &dummy, &dummy2); //if (dummy) //{ // wsprintf(dummy1, "%d", dummy); // SetDlgItemText(hwndDlg,IDC_METADISK1, dummy1); //} //if (dummy) //{ // wsprintf(dummy1, "%d", dummy2); // SetDlgItemText(hwndDlg,IDC_METADISK2, dummy1); //} pVal = NULL; if (MP4GetMetadataYear(file, &pVal)) uSetDlgItemText(tagHandle, TAGFIELD_YEAR, pVal); //dummy3 = 0; //MP4GetMetadataCompilation(file, &dummy3); //if (dummy3) // SendMessage(GetDlgItem(hwndDlg, IDC_METACOMPILATION), BM_SETCHECK, BST_CHECKED, 0); pVal = NULL; MP4GetMetadataTool(file, &pVal); uSetDlgItemText(tagHandle, TAGFIELD_ENCODER, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "CONDUCTOR", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_CONDUCTOR, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "ORCHESTRA", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_ORCHESTRA, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "YEARCOMPOSED", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_YEARCOMPOSED, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "ORIGARTIST", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_ORIGARTIST, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "LABEL", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_LABEL, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "COPYRIGHT", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_COPYRIGHT, pVal); pVal = NULL; MP4GetMetadataFreeForm(file, "CDDBTAGID", (unsigned __int8**)&pVal, &valueSize); uSetDlgItemText(tagHandle, TAGFIELD_CDDBTAGID, pVal); /* ! Metadata */ MP4Close(file); return true; } //----------------------------------------------------------------------------- bool Write_Tag(LPCSTR filename, void* tagHandle) { // TODO: // read metadata from tagHandle and set each field to supported tag // only TAGFIELD_* are supported (see QCDModTagEditor.h) // example of how to get value from tagHandle // use SetFieldA for ASCII or MultiBytes strings. // use SetFieldW for UNICODE strings // // szwValue = ModInitTag.GetFieldW(tagHandle, TAGFIELD_ORCHESTRA); // write tag to file MP4FileHandle file = MP4_INVALID_FILE_HANDLE; char dummy1[1024]; char temp[1024]; short dummy, dummy2; #ifdef DEBUG_OUTPUT in_mp4_DebugOutput("mp4_tag_write"); #endif /* save Metadata changes */ tag_delete(&tags); file = MP4Read(filename, 0); if (file != MP4_INVALID_FILE_HANDLE) { ReadMP4Tag(file, &tags); MP4Close(file); file = MP4Modify(filename, 0, 0); if (file != MP4_INVALID_FILE_HANDLE) { MP4MetadataDelete(file); MP4Close(file); } } file = MP4Modify(filename, 0, 0); if (file == MP4_INVALID_FILE_HANDLE) { tag_delete(&tags); //EndDialog(hwndDlg, wParam); return false; } uGetDlgItemText(tagHandle, TAGFIELD_TITLE, dummy1, 1024); tag_set_field(&tags, "title", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_COMPOSER, dummy1, 1024); tag_set_field(&tags, "writer", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_ARTIST, dummy1, 1024); tag_set_field(&tags, "artist", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_ALBUM, dummy1, 1024); tag_set_field(&tags, "album", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_COMMENT, dummy1, 1024); tag_set_field(&tags, "comment", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_GENRE, dummy1, 1024); tag_set_field(&tags, "genre", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_YEAR, dummy1, 1024); tag_set_field(&tags, "year", dummy1); dummy = 0; MP4GetMetadataTrack(file, (unsigned __int16*)&dummy, (unsigned __int16*)&dummy2); memcpy(dummy1, ModInitTag.GetFieldA(tagHandle, TAGFIELD_TRACK), sizeof(dummy1)); dummy = atoi(dummy1); wsprintf(temp, "%d/%d", dummy, dummy2); tag_set_field(&tags, "track", temp); //GetDlgItemText(hwndDlg, IDC_METADISK1, dummy1, 1024); //dummy = atoi(dummy1); //GetDlgItemText(hwndDlg, IDC_METADISK2, dummy1, 1024); //dummy2 = atoi(dummy1); //wsprintf(temp, "%d/%d", dummy, dummy2); //tag_set_field(&tags, "disc", temp); //GetDlgItemText(hwndDlg, IDC_METATEMPO, dummy1, 1024); //tag_set_field(&tags, "tempo", dummy1); //dummy3 = SendMessage(GetDlgItem(hwndDlg, IDC_METACOMPILATION), BM_GETCHECK, 0, 0); //tag_set_field(&tags, "compilation", (dummy3 ? "1" : "0")); uGetDlgItemText(tagHandle, TAGFIELD_ENCODER, dummy1, 1024); tag_set_field(&tags, "tool", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_CONDUCTOR, dummy1, 1024); tag_set_field(&tags, "CONDUCTOR", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_ORCHESTRA, dummy1, 1024); tag_set_field(&tags, "ORCHESTRA", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_YEARCOMPOSED, dummy1, 1024); tag_set_field(&tags, "YEARCOMPOSED", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_ORIGARTIST, dummy1, 1024); tag_set_field(&tags, "ORIGARTIST", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_LABEL, dummy1, 1024); tag_set_field(&tags, "LABEL", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_COPYRIGHT, dummy1, 1024); tag_set_field(&tags, "COPYRIGHT", dummy1); uGetDlgItemText(tagHandle, TAGFIELD_CDDBTAGID, dummy1, 1024); tag_set_field(&tags, "CDDBTAGID", dummy1); WriteMP4Tag(file, &tags); MP4Close(file); MP4Optimize(filename, NULL, 0); /* ! */ return true; } //----------------------------------------------------------------------------- bool Strip_Tag(LPCSTR filename) { // TODO: // remove tag from file. // do whatever is need to remove the supported tag from filename // return true for successfull strip, false for failure MP4FileHandle file; file = MP4Modify(filename, 0, 0); if (file == MP4_INVALID_FILE_HANDLE) return false; MP4MetadataDelete(file); MP4Close(file); return true; } //----------------------------------------------------------------------------- /* Convert UNICODE to UTF-8 Return number of bytes written */ int unicodeToUtf8 ( const WCHAR* lpWideCharStr, char* lpMultiByteStr, int cwcChars ) { const unsigned short* pwc = (unsigned short *)lpWideCharStr; unsigned char* pmb = (unsigned char *)lpMultiByteStr; const unsigned short* pwce; size_t cBytes = 0; if ( cwcChars >= 0 ) { pwce = pwc + cwcChars; } else { pwce = (unsigned short *)((size_t)-1); } while ( pwc < pwce ) { unsigned short wc = *pwc++; if ( wc < 0x00000080 ) { *pmb++ = (char)wc; cBytes++; } else if ( wc < 0x00000800 ) { *pmb++ = (char)(0xC0 | ((wc >> 6) & 0x1F)); cBytes++; *pmb++ = (char)(0x80 | (wc & 0x3F)); cBytes++; } else if ( wc < 0x00010000 ) { *pmb++ = (char)(0xE0 | ((wc >> 12) & 0x0F)); cBytes++; *pmb++ = (char)(0x80 | ((wc >> 6) & 0x3F)); cBytes++; *pmb++ = (char)(0x80 | (wc & 0x3F)); cBytes++; } if ( wc == L'\0' ) return cBytes; } return cBytes; } /* Convert UTF-8 coded string to UNICODE Return number of characters converted */ int utf8ToUnicode ( const char* lpMultiByteStr, WCHAR* lpWideCharStr, int cmbChars ) { const unsigned char* pmb = (unsigned char *)lpMultiByteStr; unsigned short* pwc = (unsigned short *)lpWideCharStr; const unsigned char* pmbe; size_t cwChars = 0; if ( cmbChars >= 0 ) { pmbe = pmb + cmbChars; } else { pmbe = (unsigned char *)((size_t)-1); } while ( pmb < pmbe ) { char mb = *pmb++; unsigned int cc = 0; unsigned int wc; while ( (cc < 7) && (mb & (1 << (7 - cc)))) { cc++; } if ( cc == 1 || cc > 6 ) // illegal character combination for UTF-8 continue; if ( cc == 0 ) { wc = mb; } else { wc = (mb & ((1 << (7 - cc)) - 1)) << ((cc - 1) * 6); while ( --cc > 0 ) { if ( pmb == pmbe ) // reached end of the buffer return cwChars; mb = *pmb++; if ( ((mb >> 6) & 0x03) != 2 ) // not part of multibyte character return cwChars; wc |= (mb & 0x3F) << ((cc - 1) * 6); } } if ( wc & 0xFFFF0000 ) wc = L'?'; *pwc++ = wc; cwChars++; if ( wc == L'\0' ) return cwChars; } return cwChars; } /* convert Windows ANSI to UTF-8 */ int ConvertANSIToUTF8 ( const char* ansi, char* utf8 ) { WCHAR* wszValue; // Unicode value size_t ansi_len; size_t len; *utf8 = '\0'; if ( ansi == NULL ) return 0; ansi_len = strlen ( ansi ); if ( (wszValue = (WCHAR *)malloc ( (ansi_len + 1) * 2 )) == NULL ) return 0; /* Convert ANSI value to Unicode */ if ( (len = MultiByteToWideChar ( CP_ACP, 0, ansi, ansi_len + 1, wszValue, (ansi_len + 1) * 2 )) == 0 ) { free ( wszValue ); return 0; } /* Convert Unicode value to UTF-8 */ if ( (len = unicodeToUtf8 ( wszValue, utf8, -1 )) == 0 ) { free ( wszValue ); return 0; } free ( wszValue ); return len-1; } /* convert UTF-8 to Windows ANSI */ int ConvertUTF8ToANSI ( const char* utf8, char* ansi ) { WCHAR* wszValue; // Unicode value size_t utf8_len; size_t len; *ansi = '\0'; if ( utf8 == NULL ) return 0; utf8_len = strlen ( utf8 ); if ( (wszValue = (WCHAR *)malloc ( (utf8_len + 1) * 2 )) == NULL ) return 0; /* Convert UTF-8 value to Unicode */ if ( (len = utf8ToUnicode ( utf8, wszValue, utf8_len + 1 )) == 0 ) { free ( wszValue ); return 0; } /* Convert Unicode value to ANSI */ if ( (len = WideCharToMultiByte ( CP_ACP, 0, wszValue, -1, ansi, (utf8_len + 1) * 2, NULL, NULL )) == 0 ) { free ( wszValue ); return 0; } free ( wszValue ); return len-1; } BOOL uSetDlgItemText(void *tagHandle, int fieldId, const char *str) { char *temp; size_t len; int r; if (!str) return FALSE; if (!*str) return FALSE; len = strlen(str); temp = (char *)malloc(len+1); if (!temp) return FALSE; memset(temp, '\0', len+1); r = ConvertUTF8ToANSI(str, temp); if (r > 0) ModInitTag.SetFieldA(tagHandle, fieldId, temp); free(temp); return r>0 ? TRUE : FALSE; } UINT uGetDlgItemText(void *tagHandle, int fieldId, char *str, int max) { char *temp, *utf8;; int len; const char *p; if (!str || !max) return 0; len = strlen( ModInitTag.GetFieldA(tagHandle, fieldId) ); temp = (char *)malloc(len+1); if (!temp) return 0; utf8 = (char *)malloc((len+1)*4); if (!utf8) { free(temp); return 0; } memset(temp, '\0', len+1); memset(utf8, '\0', (len+1)*4); memset(str, '\0', max); p = ModInitTag.GetFieldA(tagHandle, fieldId); memcpy(temp, p, len+1); if (len > 0) { len = ConvertANSIToUTF8(temp, utf8); if (len > max-1) { len = max-1; utf8[max] = '\0'; } memcpy(str, utf8, len+1); } free(temp); free(utf8); return len; } faad2-2_10_0/plugins/QCDMp4/QCDTagsDLL.h000066400000000000000000000004071374350120500173160ustar00rootroot00000000000000#ifndef QCDTAGS_H #define QCDTAGS_H #include "QCDModTagEditor.h" extern HINSTANCE hInstance; void ShutDown_Tag(int flags); bool Read_Tag(LPCSTR filename, void* tagData); bool Write_Tag(LPCSTR filename, void* tagData); bool Strip_Tag(LPCSTR filename); #endiffaad2-2_10_0/plugins/QCDMp4/aac2mp4.cpp000066400000000000000000000167131374350120500173250ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: aac2mp4.cpp,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #include #include #include #include "aac2mp4.h" int covert_aac_to_mp4(char *inputFileName, char *mp4FileName) { int Mp4TimeScale = 90000; int allMpeg4Streams = 0; MP4FileHandle mp4File; FILE* inFile; const char *type; MP4TrackId createdTrackId = MP4_INVALID_TRACK_ID; mp4File = MP4Create(mp4FileName, 0, 0, 0); if (mp4File) { MP4SetTimeScale(mp4File, Mp4TimeScale); } else { return 1; } inFile = fopen(inputFileName, "rb"); if (inFile == NULL) { MP4Close(mp4File); return 2; } createdTrackId = AacCreator(mp4File, inFile); if (createdTrackId == MP4_INVALID_TRACK_ID) { fclose(inFile); MP4Close(mp4File); return 3; } type = MP4GetTrackType(mp4File, createdTrackId); if (!strcmp(type, MP4_AUDIO_TRACK_TYPE)) { allMpeg4Streams &= (MP4GetTrackAudioType(mp4File, createdTrackId) == MP4_MPEG4_AUDIO_TYPE); } if (inFile) { fclose(inFile); } MP4Close(mp4File); MP4MakeIsmaCompliant(mp4FileName, 0, allMpeg4Streams); return 0; } #define ADTS_HEADER_MAX_SIZE 10 /* bytes */ static u_int8_t firstHeader[ADTS_HEADER_MAX_SIZE]; /* * hdr must point to at least ADTS_HEADER_MAX_SIZE bytes of memory */ static bool LoadNextAdtsHeader(FILE* inFile, u_int8_t* hdr) { u_int state = 0; u_int dropped = 0; u_int hdrByteSize = ADTS_HEADER_MAX_SIZE; while (1) { /* read a byte */ u_int8_t b; if (fread(&b, 1, 1, inFile) == 0) { return false; } /* header is complete, return it */ if (state == hdrByteSize - 1) { hdr[state] = b; if (dropped > 0) { fprintf(stderr, "Warning: dropped %u input bytes\n", dropped); } return true; } /* collect requisite number of bytes, no constraints on data */ if (state >= 2) { hdr[state++] = b; } else { /* have first byte, check if we have 1111X00X */ if (state == 1) { if ((b & 0xF6) == 0xF0) { hdr[state] = b; state = 2; /* compute desired header size */ hdrByteSize = MP4AV_AdtsGetHeaderByteSize(hdr); } else { state = 0; } } /* initial state, looking for 11111111 */ if (state == 0) { if (b == 0xFF) { hdr[state] = b; state = 1; } else { /* else drop it */ dropped++; } } } } } /* * Load the next frame from the file * into the supplied buffer, which better be large enough! * * Note: Frames are padded to byte boundaries */ static bool LoadNextAacFrame(FILE* inFile, u_int8_t* pBuf, u_int32_t* pBufSize, bool stripAdts) { u_int16_t frameSize; u_int16_t hdrBitSize, hdrByteSize; u_int8_t hdrBuf[ADTS_HEADER_MAX_SIZE]; /* get the next AAC frame header, more or less */ if (!LoadNextAdtsHeader(inFile, hdrBuf)) { return false; } /* get frame size from header */ frameSize = MP4AV_AdtsGetFrameSize(hdrBuf); /* get header size in bits and bytes from header */ hdrBitSize = MP4AV_AdtsGetHeaderBitSize(hdrBuf); hdrByteSize = MP4AV_AdtsGetHeaderByteSize(hdrBuf); /* adjust the frame size to what remains to be read */ frameSize -= hdrByteSize; if (stripAdts) { if ((hdrBitSize % 8) == 0) { /* header is byte aligned, i.e. MPEG-2 ADTS */ /* read the frame data into the buffer */ if (fread(pBuf, 1, frameSize, inFile) != frameSize) { return false; } (*pBufSize) = frameSize; } else { /* header is not byte aligned, i.e. MPEG-4 ADTS */ int i; u_int8_t newByte; int upShift = hdrBitSize % 8; int downShift = 8 - upShift; pBuf[0] = hdrBuf[hdrBitSize / 8] << upShift; for (i = 0; i < frameSize; i++) { if (fread(&newByte, 1, 1, inFile) != 1) { return false; } pBuf[i] |= (newByte >> downShift); pBuf[i+1] = (newByte << upShift); } (*pBufSize) = frameSize + 1; } } else { /* don't strip ADTS headers */ memcpy(pBuf, hdrBuf, hdrByteSize); if (fread(&pBuf[hdrByteSize], 1, frameSize, inFile) != frameSize) { return false; } } return true; } static bool GetFirstHeader(FILE* inFile) { /* read file until we find an audio frame */ fpos_t curPos; /* already read first header */ if (firstHeader[0] == 0xff) { return true; } /* remember where we are */ fgetpos(inFile, &curPos); /* go back to start of file */ rewind(inFile); if (!LoadNextAdtsHeader(inFile, firstHeader)) { return false; } /* reposition the file to where we were */ fsetpos(inFile, &curPos); return true; } MP4TrackId AacCreator(MP4FileHandle mp4File, FILE* inFile) { // collect all the necessary meta information u_int32_t samplesPerSecond; u_int8_t mpegVersion; u_int8_t profile; u_int8_t channelConfig; if (!GetFirstHeader(inFile)) { return MP4_INVALID_TRACK_ID; } samplesPerSecond = MP4AV_AdtsGetSamplingRate(firstHeader); mpegVersion = MP4AV_AdtsGetVersion(firstHeader); profile = MP4AV_AdtsGetProfile(firstHeader); channelConfig = MP4AV_AdtsGetChannels(firstHeader); u_int8_t audioType = MP4_INVALID_AUDIO_TYPE; switch (mpegVersion) { case 0: audioType = MP4_MPEG4_AUDIO_TYPE; break; case 1: switch (profile) { case 0: audioType = MP4_MPEG2_AAC_MAIN_AUDIO_TYPE; break; case 1: audioType = MP4_MPEG2_AAC_LC_AUDIO_TYPE; break; case 2: audioType = MP4_MPEG2_AAC_SSR_AUDIO_TYPE; break; case 3: return MP4_INVALID_TRACK_ID; } break; } // add the new audio track MP4TrackId trackId = MP4AddAudioTrack(mp4File, samplesPerSecond, 1024, audioType); if (trackId == MP4_INVALID_TRACK_ID) { return MP4_INVALID_TRACK_ID; } if (MP4GetNumberOfTracks(mp4File, MP4_AUDIO_TRACK_TYPE) == 1) { MP4SetAudioProfileLevel(mp4File, 0x0F); } u_int8_t* pConfig = NULL; u_int32_t configLength = 0; MP4AV_AacGetConfiguration( &pConfig, &configLength, profile, samplesPerSecond, channelConfig); if (!MP4SetTrackESConfiguration(mp4File, trackId, pConfig, configLength)) { MP4DeleteTrack(mp4File, trackId); return MP4_INVALID_TRACK_ID; } // parse the ADTS frames, and write the MP4 samples u_int8_t sampleBuffer[8 * 1024]; u_int32_t sampleSize = sizeof(sampleBuffer); MP4SampleId sampleId = 1; while (LoadNextAacFrame(inFile, sampleBuffer, &sampleSize, true)) { if (!MP4WriteSample(mp4File, trackId, sampleBuffer, sampleSize)) { MP4DeleteTrack(mp4File, trackId); return MP4_INVALID_TRACK_ID; } sampleId++; sampleSize = sizeof(sampleBuffer); } return trackId; } faad2-2_10_0/plugins/QCDMp4/aac2mp4.h000066400000000000000000000026371374350120500167720ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: aac2mp4.h,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #ifndef AAC2MP4_H__ #define AAC2MP4_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int covert_aac_to_mp4(char *inputFileName, char *mp4FileName); MP4TrackId AacCreator(MP4FileHandle mp4File, FILE* inFile); #ifdef __cplusplus } #endif /* __cplusplus */ #endiffaad2-2_10_0/plugins/QCDMp4/aacinfo.c000066400000000000000000000151421374350120500171310ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: aacinfo.c,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #define WIN32_LEAN_AND_MEAN #include #include #include #include #include "aacinfo.h" #include "utils.h" #define ADIF_MAX_SIZE 30 /* Should be enough */ #define ADTS_MAX_SIZE 10 /* Should be enough */ static int sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000}; static int read_ADIF_header(FILE *file, faadAACInfo *info) { int bitstream; unsigned char buffer[ADIF_MAX_SIZE]; int skip_size = 0; int sf_idx; /* Get ADIF header data */ info->headertype = 1; if (fread(buffer, 1, ADIF_MAX_SIZE, file) != ADIF_MAX_SIZE) return -1; /* copyright string */ if(buffer[0] & 0x80) skip_size += 9; /* skip 9 bytes */ bitstream = buffer[0 + skip_size] & 0x10; info->bitrate = ((unsigned int)(buffer[0 + skip_size] & 0x0F)<<19)| ((unsigned int)buffer[1 + skip_size]<<11)| ((unsigned int)buffer[2 + skip_size]<<3)| ((unsigned int)buffer[3 + skip_size] & 0xE0); if (bitstream == 0) { info->object_type = ((buffer[6 + skip_size]&0x01)<<1)|((buffer[7 + skip_size]&0x80)>>7); sf_idx = (buffer[7 + skip_size]&0x78)>>3; } else { info->object_type = (buffer[4 + skip_size] & 0x18)>>3; sf_idx = ((buffer[4 + skip_size] & 0x07)<<1)|((buffer[5 + skip_size] & 0x80)>>7); } info->sampling_rate = sample_rates[sf_idx]; return 0; } static int read_ADTS_header(FILE *file, faadAACInfo *info) { /* Get ADTS header data */ unsigned char buffer[ADTS_MAX_SIZE]; int frames, t_framelength = 0, frame_length, sr_idx = 0, ID; int second = 0, pos; float frames_per_sec = 0; unsigned long bytes; unsigned long *tmp_seek_table = NULL; info->headertype = 2; /* Read all frames to ensure correct time and bitrate */ for (frames = 0; /* */; frames++) { bytes = fread(buffer, 1, ADTS_MAX_SIZE, file); if (bytes != ADTS_MAX_SIZE) break; /* check syncword */ if (!((buffer[0] == 0xFF)&&((buffer[1] & 0xF6) == 0xF0))) break; if (!frames) { /* fixed ADTS header is the same for every frame, so we read it only once */ /* Syncword found, proceed to read in the fixed ADTS header */ ID = buffer[1] & 0x08; info->object_type = (buffer[2]&0xC0)>>6; sr_idx = (buffer[2]&0x3C)>>2; info->channels = ((buffer[2]&0x01)<<2)|((buffer[3]&0xC0)>>6); frames_per_sec = sample_rates[sr_idx] / 1024.f; } /* ...and the variable ADTS header */ if (ID == 0) { info->version = 4; } else { /* MPEG-2 */ info->version = 2; } frame_length = ((((unsigned int)buffer[3] & 0x3)) << 11) | (((unsigned int)buffer[4]) << 3) | (buffer[5] >> 5); t_framelength += frame_length; pos = ftell(file) - ADTS_MAX_SIZE; fseek(file, frame_length - ADTS_MAX_SIZE, SEEK_CUR); } if (frames > 0) { float sec_per_frame, bytes_per_frame; info->sampling_rate = sample_rates[sr_idx]; sec_per_frame = (float)info->sampling_rate/1024.0; bytes_per_frame = (float)t_framelength / (float)frames; info->bitrate = 8 * (int)floor(bytes_per_frame * sec_per_frame); info->length = (int)floor((float)frames/frames_per_sec)*1000; } else { info->sampling_rate = 4; info->bitrate = 128000; info->length = 0; info->channels = 0; } return 0; } int get_AAC_format(char *filename, faadAACInfo *info) { unsigned long tagsize; FILE *file; char buffer[10]; unsigned long file_len; unsigned char adxx_id[5]; unsigned long tmp; memset(info, 0, sizeof(faadAACInfo)); file = fopen(filename, "rb"); if(file == NULL) return -1; fseek(file, 0, SEEK_END); file_len = ftell(file); fseek(file, 0, SEEK_SET); /* Skip the tag, if it's there */ tmp = fread(buffer, 10, 1, file); if (StringComp(buffer, "ID3", 3) == 0) { /* high bit is not used */ tagsize = (buffer[6] << 21) | (buffer[7] << 14) | (buffer[8] << 7) | (buffer[9] << 0); fseek(file, tagsize, SEEK_CUR); tagsize += 10; } else { tagsize = 0; fseek(file, 0, SEEK_SET); } if (file_len) file_len -= tagsize; tmp = fread(adxx_id, 2, 1, file); adxx_id[5-1] = 0; info->length = 0; /* Determine the header type of the file, check the first two bytes */ if (StringComp(adxx_id, "AD", 2) == 0) { /* We think its an ADIF header, but check the rest just to make sure */ tmp = fread(adxx_id + 2, 2, 1, file); if (StringComp(adxx_id, "ADIF", 4) == 0) { read_ADIF_header(file, info); info->length = (int)((float)file_len*8000.0/((float)info->bitrate)); } } else { /* No ADIF, check for ADTS header */ if ((adxx_id[0] == 0xFF)&&((adxx_id[1] & 0xF6) == 0xF0)) { /* ADTS header located */ fseek(file, tagsize, SEEK_SET); read_ADTS_header(file, info); } else { /* Unknown/headerless AAC file, assume format: */ info->version = 2; info->bitrate = 128000; info->sampling_rate = 44100; info->channels = 2; info->headertype = 0; info->object_type = 1; } } fclose(file); return 0; } faad2-2_10_0/plugins/QCDMp4/aacinfo.h000066400000000000000000000030331374350120500171320ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: aacinfo.h,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #ifndef AACINFO_INCLUDED #define AACINFO_INCLUDED typedef struct { int version; int channels; int sampling_rate; int bitrate; int length; int object_type; int headertype; } faadAACInfo; int get_AAC_format(char *filename, faadAACInfo *info); static int read_ADIF_header(FILE *file, faadAACInfo *info); static int read_ADTS_header(FILE *file, faadAACInfo *info); #endif faad2-2_10_0/plugins/QCDMp4/config.c000066400000000000000000000031331374350120500167730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: config.c,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #define WIN32_LEAN_AND_MEAN #include #include "config.h" char app_name[] = "AudioCoding.com MPEG-4 General Audio player"; char INI_FILE[MAX_PATH]; int m_priority = 3; int m_resolution = 0; int m_show_errors = 1; int m_use_for_aac = 1; int m_downmix = 0; int m_vbr_display = 0; char titleformat[MAX_PATH]; void _r_s(char *name,char *data, int mlen) { char buf[10]; strcpy(buf,data); GetPrivateProfileString(app_name,name,buf,data,mlen,INI_FILE); } faad2-2_10_0/plugins/QCDMp4/config.h000066400000000000000000000027101374350120500170000ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: config.h,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ char app_name[]; char INI_FILE[]; int m_priority; int m_resolution; int m_show_errors; int m_use_for_aac; int m_downmix; int m_vbr_display; char titleformat[MAX_PATH]; #define RS(x) (_r_s(#x,x,sizeof(x))) #define WS(x) (WritePrivateProfileString(app_name,#x,x,INI_FILE)) void _r_s(char *name,char *data, int mlen); faad2-2_10_0/plugins/QCDMp4/mbs.h000066400000000000000000000033511374350120500163160ustar00rootroot00000000000000/* * The contents of this file are subject to the Mozilla Public * License Version 1.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is MPEG4IP. * * The Initial Developer of the Original Code is Cisco Systems Inc. * Portions created by Cisco Systems Inc. are * Copyright (C) Cisco Systems Inc. 2001-2002. All Rights Reserved. * * Contributor(s): * Dave Mackie dmackie@cisco.com */ #ifndef __MBS_INCLUDED__ #define __MBS_INCLUDED__ class CMemoryBitstream { public: CMemoryBitstream() { m_pBuf = NULL; m_bitPos = 0; m_numBits = 0; } void AllocBytes(u_int32_t numBytes); void SetBytes(u_int8_t* pBytes, u_int32_t numBytes); void PutBytes(u_int8_t* pBytes, u_int32_t numBytes); void PutBits(u_int32_t bits, u_int32_t numBits); u_int32_t GetBits(u_int32_t numBits); void SkipBytes(u_int32_t numBytes) { SkipBits(numBytes << 3); } void SkipBits(u_int32_t numBits) { SetBitPosition(GetBitPosition() + numBits); } u_int32_t GetBitPosition() { return m_bitPos; } void SetBitPosition(u_int32_t bitPos) { if (bitPos > m_numBits) { throw; } m_bitPos = bitPos; } u_int8_t* GetBuffer() { return m_pBuf; } u_int32_t GetNumberOfBytes() { return (GetNumberOfBits() + 7) / 8; } u_int32_t GetNumberOfBits() { return m_numBits; } protected: u_int8_t* m_pBuf; u_int32_t m_bitPos; u_int32_t m_numBits; }; #endif /* __MBS_INCLUDED__ */ faad2-2_10_0/plugins/QCDMp4/resource.h000066400000000000000000000052471374350120500173720ustar00rootroot00000000000000//{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by QCDMp4.rc // #define IDD_CONFIG 102 #define IDC_TYPE 1000 #define IDC_INFOTEXT 1000 #define IDC_DURATION 1001 #define IDC_BITRATE 1002 #define IDC_SAMPLERATE 1003 #define IDC_VTYPE 1004 #define IDC_PRIORITY 1004 #define IDC_VBITRATE 1005 #define IDC_ERROR 1005 #define IDC_VDURATION 1006 #define IDC_16BITS 1006 #define IDC_VSIZE 1007 #define IDC_24BITS 1007 #define IDC_CONVERT 1007 #define IDC_VFPS 1008 #define IDC_32BITS 1008 #define IDC_CONVERT2 1008 #define IDC_CHANNELS 1009 #define IDC_24BITS2 1009 #define IDC_16BITS_DITHERED 1009 #define IDC_CONVERT1 1009 #define IDC_USERDATA 1010 #define IDC_USEFORAAC 1011 #define IDC_METACOMPILATION 1012 #define IDC_METANAME 1013 #define IDC_METAARTIST 1014 #define IDC_METAWRITER 1015 #define IDC_METAALBUM 1016 #define IDC_METACOMMENTS 1017 #define IDC_METAGENRE 1018 #define IDC_METAYEAR 1019 #define IDC_METATRACK1 1020 #define IDC_METADISK1 1021 #define IDC_METATEMPO 1022 #define IDC_METATRACK2 1023 #define IDC_METADISK2 1024 #define IDC_STATIC1 1025 #define IDC_STATIC2 1026 #define IDC_STATIC3 1027 #define IDC_STATIC4 1028 #define IDC_STATIC5 1029 #define IDC_STATIC6 1030 #define IDC_STATIC7 1031 #define IDC_STATIC8 1032 #define IDC_STATIC9 1033 #define IDC_STATIC10 1034 #define IDC_STATIC11 1035 #define IDC_STATIC12 1036 #define IDC_DOWNMIX 1038 #define IDC_VBR 1039 #define IDC_TITLEFORMAT 1040 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 103 #define _APS_NEXT_COMMAND_VALUE 40001 #define _APS_NEXT_CONTROL_VALUE 1041 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif faad2-2_10_0/plugins/QCDMp4/utils.c000066400000000000000000000076701374350120500167000ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: utils.c,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #define WIN32_LEAN_AND_MEAN #include #include #include #include "utils.h" int StringComp(char const *str1, char const *str2, unsigned long len) { signed int c1 = 0, c2 = 0; while (len--) { c1 = tolower(*str1++); c2 = tolower(*str2++); if (c1 == 0 || c1 != c2) break; } return c1 - c2; } int GetAACTrack(MP4FileHandle infile) { /* find AAC track */ int i, rc; int numTracks = MP4GetNumberOfTracks(infile, NULL, 0); for (i = 0; i < numTracks; i++) { MP4TrackId trackId = MP4FindTrackId(infile, i, NULL, 0); const char* trackType = MP4GetTrackType(infile, trackId); if (!strcmp(trackType, MP4_AUDIO_TRACK_TYPE)) { unsigned char *buff = NULL; int buff_size = 0; mp4AudioSpecificConfig mp4ASC; MP4GetTrackESConfiguration(infile, trackId, &buff, &buff_size); if (buff) { rc = AudioSpecificConfig(buff, buff_size, &mp4ASC); free(buff); if (rc < 0) return -1; return trackId; } } } /* can't decode this */ return -1; } int GetAudioTrack(MP4FileHandle infile) { /* find AAC track */ int i; int numTracks = MP4GetNumberOfTracks(infile, NULL, 0); for (i = 0; i < numTracks; i++) { MP4TrackId trackId = MP4FindTrackId(infile, i, NULL, 0); const char* trackType = MP4GetTrackType(infile, trackId); if (!strcmp(trackType, MP4_AUDIO_TRACK_TYPE)) { return trackId; } } /* can't decode this */ return -1; } int GetVideoTrack(MP4FileHandle infile) { /* find AAC track */ int i; int numTracks = MP4GetNumberOfTracks(infile, NULL, 0); for (i = 0; i < numTracks; i++) { MP4TrackId trackId = MP4FindTrackId(infile, i, NULL, 0); const char* trackType = MP4GetTrackType(infile, trackId); if (!strcmp(trackType, MP4_VIDEO_TRACK_TYPE)) { return trackId; } } /* can't decode this */ return -1; } LPTSTR PathFindFileName(LPCTSTR pPath) { LPCTSTR pT; for (pT = pPath; *pPath; pPath = CharNext(pPath)) { if ((pPath[0] == TEXT('\\') || pPath[0] == TEXT(':')) && pPath[1] && (pPath[1] != TEXT('\\'))) pT = pPath + 1; } return (LPTSTR)pT; // const -> non const } char *convert3in4to3in3(void *sample_buffer, int samples) { int i; long *sample_buffer24 = (long*)sample_buffer; char *data = malloc(samples*3*sizeof(char)); for (i = 0; i < samples; i++) { data[i*3] = sample_buffer24[i] & 0xFF; data[i*3+1] = (sample_buffer24[i] >> 8) & 0xFF; data[i*3+2] = (sample_buffer24[i] >> 16) & 0xFF; } return data; } faad2-2_10_0/plugins/QCDMp4/utils.h000066400000000000000000000027641374350120500167040ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: utils.h,v 1.3 2003/12/06 04:24:17 rjamorim Exp $ **/ #ifndef UTILS_INCLUDED #define UTILS_INCLUDED #include LPTSTR PathFindFileName(LPCTSTR pPath); int GetVideoTrack(MP4FileHandle infile); int GetAudioTrack(MP4FileHandle infile); int GetAACTrack(MP4FileHandle infile); int StringComp(char const *str1, char const *str2, unsigned long len); char *convert3in4to3in3(void *sample_buffer, int samples); #endiffaad2-2_10_0/plugins/mpeg4ip/000077500000000000000000000000001374350120500157375ustar00rootroot00000000000000faad2-2_10_0/plugins/mpeg4ip/Makefile.am000066400000000000000000000006111374350120500177710ustar00rootroot00000000000000libdir = @MPEG4IP_PLAYER_PLUGIN_DIR@ lib_LTLIBRARIES = faad2_plugin.la faad2_plugin_la_LDFLAGS = -module faad2_plugin_la_SOURCES = \ faad2.cpp \ faad2.h \ aa_file.cpp \ aa_file.h faad2_plugin_la_LIBADD = \ $(top_builddir)/libfaad/libfaad.la \ -lm AM_CPPFLAGS = -I$(top_srcdir)/include AM_CFLAGS = -D_REENTRANT -fexceptions AM_CXXFLAGS = -D_REENTRANT -DNOCONTROLS -fexceptions faad2-2_10_0/plugins/mpeg4ip/README_WIN32.txt000066400000000000000000000012321374350120500203150ustar00rootroot00000000000000Creating mpeg4ip plugin for Windows. You will need to have mpeg4ip installed. If you install it on the same drive, with the top level directory name of /mpeg4ip, you will have to do nothing other than move the faad2_plugin.dll from the Release or Debug directory to the same directory as the other mpeg4ip plugins. If you install it somewhere else, you will have to change the include paths and link paths in the project settings for faad2_plugin to the proper directory. Look for /mpeg4ip (or \mpeg4ip) and change all occurances of these in the file. It might be best to hand-edit the faad_plugin.sdp file with wordpad and use the search and replace function.faad2-2_10_0/plugins/mpeg4ip/aa_file.cpp000066400000000000000000000072051374350120500200270ustar00rootroot00000000000000/* ** MPEG4IP plugin for FAAD2 ** Copyright (C) 2003 Bill May wmay@cisco.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** $Id: aa_file.cpp,v 1.2 2004/01/05 14:05:12 menno Exp $ **/ /* * aa_file.cpp - create media structure for aac files */ #include "faad2.h" codec_data_t *aac_file_check (lib_message_func_t message, const char *name, double *max, char *desc[4] #ifdef HAVE_PLUGIN_VERSION_0_8 , CConfigSet *pConfig #endif ) { aac_codec_t *aac; int len = strlen(name); if (strcasecmp(name + len - 4, ".aac") != 0) { return (NULL); } aac = MALLOC_STRUCTURE(aac_codec_t); memset(aac, 0, sizeof(*aac)); *max = 0; aac->m_buffer = (uint8_t *)malloc(MAX_READ_BUFFER); aac->m_buffer_size_max = MAX_READ_BUFFER; aac->m_ifile = fopen(name, FOPEN_READ_BINARY); if (aac->m_ifile == NULL) { free(aac); return NULL; } aac->m_output_frame_size = 1024; aac->m_info = faacDecOpen(); // use defaults here... aac->m_buffer_size = fread(aac->m_buffer, 1, aac->m_buffer_size_max, aac->m_ifile); unsigned long freq; unsigned char chans; faacDecInit(aac->m_info, (unsigned char *)aac->m_buffer, aac->m_buffer_size, &freq, &chans); // may want to actually decode the first frame... if (freq == 0) { message(LOG_ERR, aaclib, "Couldn't determine AAC frame rate"); aac_close((codec_data_t *)aac); return (NULL); } aac->m_freq = freq; aac->m_chans = chans; aac->m_faad_inited = 1; aac->m_framecount = 0; return ((codec_data_t *)aac); } int aac_file_next_frame (codec_data_t *your, uint8_t **buffer, uint64_t *ts) { aac_codec_t *aac = (aac_codec_t *)your; if (aac->m_buffer_on > 0) { memmove(aac->m_buffer, &aac->m_buffer[aac->m_buffer_on], aac->m_buffer_size - aac->m_buffer_on); } aac->m_buffer_size -= aac->m_buffer_on; aac->m_buffer_size += fread(aac->m_buffer + aac->m_buffer_size, 1, aac->m_buffer_size_max - aac->m_buffer_size, aac->m_ifile); aac->m_buffer_on = 0; if (aac->m_buffer_size == 0) return 0; uint64_t calc; calc = aac->m_framecount * 1024 * M_LLU; calc /= aac->m_freq; *ts = calc; *buffer = aac->m_buffer; aac->m_framecount++; return (aac->m_buffer_size); } void aac_file_used_for_frame (codec_data_t *ifptr, uint32_t bytes) { aac_codec_t *aac = (aac_codec_t *)ifptr; aac->m_buffer_on += bytes; if (aac->m_buffer_on > aac->m_buffer_size) aac->m_buffer_on = aac->m_buffer_size; } int aac_file_eof (codec_data_t *ifptr) { aac_codec_t *aac = (aac_codec_t *)ifptr; return aac->m_buffer_on == aac->m_buffer_size && feof(aac->m_ifile); } int aac_raw_file_seek_to (codec_data_t *ifptr, uint64_t ts) { if (ts != 0) return -1; aac_codec_t *aac = (aac_codec_t *)ifptr; rewind(aac->m_ifile); aac->m_buffer_size = aac->m_buffer_on = 0; aac->m_framecount = 0; return 0; } faad2-2_10_0/plugins/mpeg4ip/aa_file.h000066400000000000000000000020151374350120500174660ustar00rootroot00000000000000/* ** MPEG4IP plugin for FAAD2 ** Copyright (C) 2003 Bill May wmay@cisco.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** $Id: aa_file.h,v 1.1 2003/08/07 17:21:21 menno Exp $ **/ /* * aa_file.h - prototypes for aac files */ int create_media_for_aac_file (CPlayerSession *pspstr, const char *name, const char **errmsg); faad2-2_10_0/plugins/mpeg4ip/faad2.cpp000066400000000000000000000247651374350120500174360ustar00rootroot00000000000000/* ** MPEG4IP plugin for FAAD2 ** Copyright (C) 2003 Bill May wmay@cisco.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** $Id: faad2.cpp,v 1.3 2004/08/20 08:30:53 menno Exp $ **/ #include "faad2.h" #include #include #include #include #define DEBUG_SYNC 2 #ifndef M_LLU #define M_LLU M_64 #define LLU U64 #endif const char *aaclib="faad2"; /* * Create CAACodec class */ static codec_data_t *aac_codec_create (const char *compressor, int type, int profile, format_list_t *media_fmt, audio_info_t *audio, const uint8_t *userdata, uint32_t userdata_size, audio_vft_t *vft, void *ifptr) { aac_codec_t *aac; aac = (aac_codec_t *)malloc(sizeof(aac_codec_t)); memset(aac, 0, sizeof(aac_codec_t)); aac->m_vft = vft; aac->m_ifptr = ifptr; fmtp_parse_t *fmtp = NULL; // Start setting up FAAC stuff... aac->m_resync_with_header = 1; aac->m_record_sync_time = 1; aac->m_audio_inited = 0; // Use media_fmt to indicate that we're streaming. if (media_fmt != NULL) { // haven't checked for null buffer // This is not necessarilly right - it is, for the most part, but // we should be reading the fmtp statement, and looking at the config. // (like we do below in the userdata section... aac->m_freq = media_fmt->rtpmap->clock_rate; fmtp = parse_fmtp_for_mpeg4(media_fmt->fmt_param, vft->log_msg); if (fmtp != NULL) { userdata = fmtp->config_binary; userdata_size = fmtp->config_binary_len; } } aac->m_info = faacDecOpen(); unsigned long srate; unsigned char chan; if ((userdata == NULL && fmtp == NULL) || (faacDecInit2(aac->m_info, (uint8_t *)userdata, userdata_size, &srate, &chan) < 0)) { if (fmtp != NULL) free_fmtp_parse(fmtp); return NULL; } mp4AudioSpecificConfig mp4ASC; aac->m_output_frame_size = 1024; if (AudioSpecificConfig((unsigned char *)userdata, userdata_size, &mp4ASC)) { if (mp4ASC.frameLengthFlag) { aac->m_output_frame_size = 960; } } aac->m_freq = srate; aac->m_chans = chan; aac->m_faad_inited = 1; aac->m_msec_per_frame = aac->m_output_frame_size; aac->m_msec_per_frame *= M_LLU; aac->m_msec_per_frame /= aac->m_freq; // faad_init_bytestream(&m_info->ld, c_read_byte, c_bookmark, m_bytestream); aa_message(LOG_INFO, aaclib, "Setting freq to %d", aac->m_freq); #if DUMP_OUTPUT_TO_FILE aac->m_outfile = fopen("temp.raw", "w"); #endif if (fmtp != NULL) { free_fmtp_parse(fmtp); } return (codec_data_t *)aac; } void aac_close (codec_data_t *ptr) { if (ptr == NULL) { return; } aac_codec_t *aac = (aac_codec_t *)ptr; faacDecClose(aac->m_info); aac->m_info = NULL; #if DUMP_OUTPUT_TO_FILE fclose(aac->m_outfile); #endif free(aac); } /* * Handle pause - basically re-init the codec */ static void aac_do_pause (codec_data_t *ifptr) { aac_codec_t *aac = (aac_codec_t *)ifptr; aac->m_resync_with_header = 1; aac->m_record_sync_time = 1; aac->m_audio_inited = 0; aac->m_ignore_first_sample = 0; faacDecPostSeekReset(aac->m_info, 0); } /* * Decode task call for FAAC */ static int aac_decode (codec_data_t *ptr, uint64_t ts, int from_rtp, int *sync_frame, uint8_t *buffer, uint32_t buflen, void *userdata) { aac_codec_t *aac = (aac_codec_t *)ptr; unsigned long bytes_consummed; int bits = -1; // struct timezone tz; if (aac->m_record_sync_time) { aac->m_current_frame = 0; aac->m_record_sync_time = 0; aac->m_current_time = ts; aac->m_last_rtp_ts = ts; } else { if (aac->m_last_rtp_ts == ts) { aac->m_current_time += aac->m_msec_per_frame; aac->m_current_frame++; } else { aac->m_last_rtp_ts = ts; aac->m_current_time = ts; aac->m_current_frame = 0; } // Note - here m_current_time should pretty much always be >= rtpts. // If we're not, we most likely want to stop and resync. We don't // need to keep decoding - just decode this frame and indicate we // need a resync... That should handle fast forwards... We need // someway to handle reverses - perhaps if we're more than .5 seconds // later... } if (aac->m_faad_inited == 0) { /* * If not initialized, do so. */ abort(); unsigned long freq; unsigned char chans; faacDecInit(aac->m_info, (unsigned char *)buffer, buflen, &freq, &chans); aac->m_freq = freq; aac->m_chans = chans; aac->m_faad_inited = 1; } uint8_t *buff; unsigned long samples; bytes_consummed = buflen; //aa_message(LOG_DEBUG, aaclib, "decoding %d bits", buflen * 8); faacDecFrameInfo frame_info; buff = (uint8_t *)faacDecDecode(aac->m_info, &frame_info, buffer, buflen); if (buff != NULL) { bytes_consummed = frame_info.bytesconsumed; #if 0 aa_message(LOG_DEBUG, aaclib, LLU" bytes %d samples %d", ts, bytes_consummed, frame_info.samples); #endif if (aac->m_audio_inited != 0) { int tempchans = frame_info.channels; if (tempchans != aac->m_chans) { aa_message(LOG_NOTICE, aaclib, "chupdate - chans from data is %d", tempchans); } } else { int tempchans = frame_info.channels; if (tempchans == 0) { aa_message(LOG_ERR, aaclib, "initializing aac, returned channels are 0"); aac->m_resync_with_header = 1; aac->m_record_sync_time = 1; return bytes_consummed; } aac->m_chans = tempchans; aac->m_freq = frame_info.samplerate; aac->m_vft->audio_configure(aac->m_ifptr, aac->m_freq, aac->m_chans, (audio_format_t)AUDIO_S16SYS, aac->m_output_frame_size); uint8_t *now = aac->m_vft->audio_get_buffer(aac->m_ifptr); aac->m_audio_inited = 1; } /* * good result - give it to audio sync class */ #if DUMP_OUTPUT_TO_FILE fwrite(buff, aac->m_output_frame_size * 4, 1, aac->m_outfile); #endif if (frame_info.samples != 0) { aac->m_vft->audio_load_buffer(aac->m_ifptr, buff, frame_info.samples * 2, aac->m_last_ts, aac->m_resync_with_header); if (aac->m_resync_with_header == 1) { aac->m_resync_with_header = 0; #ifdef DEBUG_SYNC aa_message(LOG_DEBUG, aaclib, "Back to good at "LLU, aac->m_current_time); #endif } } } else { aa_message(LOG_ERR, aaclib, "error return is %d", frame_info.error); aac->m_resync_with_header = 1; #ifdef DEBUG_SYNC aa_message(LOG_ERR, aaclib, "Audio decode problem - at "LLU, aac->m_current_time); #endif } aac->m_last_ts = aac->m_current_time; return (bytes_consummed); } static const char *aac_compressors[] = { "aac ", "mp4a", "enca", NULL }; static int aac_codec_check (lib_message_func_t message, const char *compressor, int type, int profile, format_list_t *fptr, const uint8_t *userdata, uint32_t userdata_size #ifdef HAVE_PLUGIN_VERSION_0_8 ,CConfigSet *pConfig #endif ) { fmtp_parse_t *fmtp = NULL; if (compressor != NULL && strcasecmp(compressor, "MP4 FILE") == 0 && type != -1) { switch (type) { case MP4_MPEG2_AAC_MAIN_AUDIO_TYPE: case MP4_MPEG2_AAC_LC_AUDIO_TYPE: case MP4_MPEG2_AAC_SSR_AUDIO_TYPE: case MP4_MPEG4_AUDIO_TYPE: break; default: return -1; } } if (fptr != NULL && fptr->rtpmap != NULL && fptr->rtpmap->encode_name != NULL) { if (strcasecmp(fptr->rtpmap->encode_name, "mpeg4-generic") != 0) { return -1; } if (userdata == NULL) { fmtp = parse_fmtp_for_mpeg4(fptr->fmt_param, message); if (fmtp != NULL) { userdata = fmtp->config_binary; userdata_size = fmtp->config_binary_len; } } } if (userdata != NULL) { mpeg4_audio_config_t audio_config; decode_mpeg4_audio_config(userdata, userdata_size, &audio_config); message(LOG_DEBUG, "aac", "audio type is %d", audio_config.audio_object_type); if (fmtp != NULL) free_fmtp_parse(fmtp); if (audio_object_type_is_aac(&audio_config) == 0) { return -1; } #if 0 if (audio_config.audio_object_type == 17) { message(LOG_INFO, "aac", "audio type is legal ISMA, but not supported"); return -1; } #endif return 2; } #if 0 // I'm not sure I want to be here if we don't have an audio config if (compressor != NULL) { const char **lptr = aac_compressors; while (*lptr != NULL) { if (strcasecmp(*lptr, compressor) == 0) { return 2; } lptr++; } } #endif return -1; } #ifndef HAVE_PLUGIN_VERSION_0_8 AUDIO_CODEC_WITH_RAW_FILE_PLUGIN("faad2", aac_codec_create, aac_do_pause, aac_decode, NULL, aac_close, aac_codec_check, aac_file_check, aac_file_next_frame, aac_file_used_for_frame, aac_raw_file_seek_to, aac_file_eof ); #else AUDIO_CODEC_WITH_RAW_FILE_PLUGIN("faad2", aac_codec_create, aac_do_pause, aac_decode, NULL, aac_close, aac_codec_check, aac_file_check, aac_file_next_frame, aac_file_used_for_frame, aac_raw_file_seek_to, aac_file_eof, NULL, 0 ); #endif /* end file aa.cpp */ faad2-2_10_0/plugins/mpeg4ip/faad2.h000066400000000000000000000046231374350120500170720ustar00rootroot00000000000000/* ** MPEG4IP plugin for FAAD2 ** Copyright (C) 2003 Bill May wmay@cisco.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** $Id: faad2.h,v 1.2 2004/01/05 14:05:12 menno Exp $ **/ /* * aa.h - class definition for AAC codec. */ #ifndef __AA_H__ #define __AA_H__ 1 #include "faad.h" #include "codec_plugin.h" #ifndef M_LLU #define M_LLU M_64 #define LLU U64 #endif typedef struct aac_codec_t { codec_data_t c; audio_vft_t *m_vft; void *m_ifptr; faacDecHandle m_info; int m_object_type; int m_resync_with_header; int m_record_sync_time; uint64_t m_current_time; uint64_t m_last_rtp_ts; uint64_t m_msec_per_frame; uint32_t m_current_frame; int m_audio_inited; int m_faad_inited; int m_freq; // frequency int m_chans; // channels int m_output_frame_size; #if DUMP_OUTPUT_TO_FILE FILE *m_outfile; #endif FILE *m_ifile; uint8_t *m_buffer; uint32_t m_buffer_size_max; uint32_t m_buffer_size; uint32_t m_buffer_on; uint64_t m_framecount; int m_ignore_first_sample; uint64_t m_last_ts; } aac_codec_t; #define m_vft c.v.audio_vft #define m_ifptr c.ifptr #define MAX_READ_BUFFER (768 * 8) #define aa_message aac->m_vft->log_msg void aac_close(codec_data_t *ptr); extern const char *aaclib; codec_data_t *aac_file_check(lib_message_func_t message, const char *name, double *max, char *desc[4] #ifdef HAVE_PLUGIN_VERSION_0_8 , CConfigSet *pConfig #endif ); int aac_file_next_frame(codec_data_t *ifptr, uint8_t **buffer, uint64_t *ts); int aac_file_eof(codec_data_t *ifptr); void aac_file_used_for_frame(codec_data_t *ifptr, uint32_t bytes); int aac_raw_file_seek_to(codec_data_t *ifptr, uint64_t ts); #endif faad2-2_10_0/plugins/xmms/000077500000000000000000000000001374350120500153565ustar00rootroot00000000000000faad2-2_10_0/plugins/xmms/AUTHORS000066400000000000000000000001031374350120500164200ustar00rootroot00000000000000xmms-mp4 plugin for xmms-1.2.x re-coded by ciberfred from scratch faad2-2_10_0/plugins/xmms/ChangeLog000066400000000000000000000021331374350120500171270ustar00rootroot0000000000000022 August 2004: * move from libmp4v2 to libmp4ff 1 December 2003: * remove aac plug and merge the aac part with the mp4 part so now 2 plugins in one :) 4 juillet 2003: * package the plugin for faad2 * upgrade code to libfaad2-2.0 API * version 0.5 15 juin 2003: * better configuration code (choose automaticaly at compile time) * installation must be set by root * version 0.4 15 mai 2003: * update configure script to be better * version 0.3 01 Novembre 2002: * check automake/autoconf/libtool for plugin, now 'make install' work * handle seeking * configuration box created (thanks glade !) * handle aac informations * modification to a better infobox (thanks angain glade !) * version 0.2 ready to public :) 25 Aout 2002: * gtk-1.2.x info file with some 'static' useful ID3 info * title show in xmms correctly * version 0.1 ready to public :) 20 Aout 2002: * everything... * work with faad2lib-1.1, id3lib-3.8.0 (glibc-2.2.5, gcc-2.95.3) i think the minimum required but need testing... * playlist working * handle id3tag, the plugin work :) * new maintener : ciberfred faad2-2_10_0/plugins/xmms/INSTALL000066400000000000000000000002141374350120500164040ustar00rootroot00000000000000the installation of this plugin is provide by the faad2 package. add to configure time the option '--with-xmms' and the plugin will be buildfaad2-2_10_0/plugins/xmms/Makefile.am000066400000000000000000000000171374350120500174100ustar00rootroot00000000000000SUBDIRS = src faad2-2_10_0/plugins/xmms/NEWS000066400000000000000000000010061374350120500160520ustar00rootroot0000000000000022 Aout 2004 ------------ modification du system de compilation, passage de libmp4v2 a libmp4ff en static, libfaad en dynamique. 1 Decembre 2003 --------------- merge du plugin aac et du plugin mp4. modification des script du projet faad le plugin ne doit pas etre construit en meme temps que le projet 4 Juillet 2003 -------------- integration du plugin xmms-aac dans le projet faad2 version 2.x 15 aout 2002 ------------ Recodage en entier du plugin aac me contacter par mail a : frederic.fondriest@laposte.net faad2-2_10_0/plugins/xmms/README000066400000000000000000000014251374350120500162400ustar00rootroot00000000000000 xmms-mp4 plugin v0.5 (dynamic version) "a mp4/aac audio player for xmms" coded by ciberfred from france ------------- This source code allow to xmms to read .mp4/.m4a/.aac files About. This plugin is a merge between aac and mp4 plugin. so now you could read all new and old files encoded with different encoder and different format (for the aac part). This is possible since the libfaad2 allow to read old aac ADTS format. For any informations about this plugin contact me at : mail : frederic.fondriest@laposte.net ICQ : 17293220 aac plugin homepage (and more) : http://fondriest.frederic.free.fr/realisations/ IRC : irc.eu.freenode.net (#lamip) -- Frederic Fondriest faad2-2_10_0/plugins/xmms/TODO000066400000000000000000000003371374350120500160510ustar00rootroot00000000000000TODO: * handle AAC info such as MPEG-AAC type, header (ADTS/ADIF),... * seeking... but it will certainly an option because it need a reading of whole file.... * any suggestions ... send me somes messages about it :) faad2-2_10_0/plugins/xmms/src/000077500000000000000000000000001374350120500161455ustar00rootroot00000000000000faad2-2_10_0/plugins/xmms/src/Makefile.am000066400000000000000000000007511374350120500202040ustar00rootroot00000000000000local_CFLAGS=`$(XMMS_CONFIG) --cflags` -Wall local_LDFLAGS=`$(XMMS_CONFIG) --libs` libdir = `$(XMMS_CONFIG) --input-plugin-dir` lib_LTLIBRARIES = libmp4.la libmp4_la_CFLAGS = $(local_CFLAGS) -Wall \ -I$(top_srcdir)/include -I$(top_srcdir)/common/mp4ff libmp4_la_LIBADD = $(top_builddir)/libfaad/libfaad.la \ $(top_builddir)/common/mp4ff/libmp4ff.a libmp4_la_LDFLAGS = -module -avoid-version $(local_LDFLAGS) -lpthread libmp4_la_SOURCES = libmp4.c mp4_utils.c aac_utils.c faad2-2_10_0/plugins/xmms/src/aac_utils.c000066400000000000000000000052531374350120500202620ustar00rootroot00000000000000/* * * utils for AAC informations */ #include #include #include #include #define ADTS_HEADER_SIZE 8 #define SEEK_TABLE_CHUNK 60 #define MPEG4_TYPE 0 #define MPEG2_TYPE 1 // Read ADTS header, the file descriptor must be at // the begining of the aac frame not at the id3tag int getAacInfo(FILE *fd) { unsigned char header[ADTS_HEADER_SIZE]; unsigned int id; unsigned long originPosition; originPosition = ftell(fd); if(fread(header, 1, ADTS_HEADER_SIZE, fd) != ADTS_HEADER_SIZE){ fseek(fd, originPosition, SEEK_SET); return(-1); } if(!((header[0]==0xFF)&&((header[1]& 0xF6)==0xF0))){ printf("Bad header\n"); return(-1); } id = header[1]&0x08; if(id==0){//MPEG-4 AAC fseek(fd, originPosition, SEEK_SET); return(MPEG4_TYPE); }else{ fseek(fd, originPosition, SEEK_SET); return(MPEG2_TYPE); } fseek(fd, originPosition, SEEK_SET); return(-1); } // as AAC is VBR we need to check all ADTS header // to enable seeking... // there is no other solution void checkADTSForSeeking(FILE *fd, unsigned long **seekTable, unsigned long *seekTableLength) { unsigned long originPosition; unsigned long position; unsigned char header[ADTS_HEADER_SIZE]; unsigned int frameCount, frameLength, frameInsec; unsigned int id=0, seconds=0; originPosition = ftell(fd); for(frameCount=0,frameInsec=0;; frameCount++,frameInsec++){ position = ftell(fd); if(fread(header, 1, ADTS_HEADER_SIZE, fd)!=ADTS_HEADER_SIZE){ break; } if(!strncmp(header, "ID3", 3)){ break; } if(!((header[0]==0xFF)&&((header[1]& 0xF6)==0xF0))){ printf("error : Bad 1st header, file may be corrupt !\n"); break; } if(!frameCount){ id=header[1]&0x08; if(((*seekTable) = malloc(SEEK_TABLE_CHUNK * sizeof(unsigned long)))==0){ printf("malloc error\n"); return; } (*seekTableLength) = SEEK_TABLE_CHUNK; } //if(id==0){//MPEG-4 //frameLength = ((unsigned int)header[4]<<5)|((unsigned int)header[5]>>3); //}else{//MPEG-2 frameLength = (((unsigned int)header[3]&0x3)<<11)|((unsigned int)header[4]<<3)|(header[5]>>5); //} if(frameInsec==43){//??? frameInsec=0; } if(frameInsec==0){ if(seconds == (*seekTableLength)){ (*seekTable) = realloc((*seekTable), (seconds+SEEK_TABLE_CHUNK)*sizeof(unsigned long)); (*seekTableLength) = seconds+SEEK_TABLE_CHUNK; } (*seekTable)[seconds] = position; seconds++; } if(fseek(fd, frameLength-ADTS_HEADER_SIZE, SEEK_CUR)==-1){ break; } } (*seekTableLength) = seconds; fseek(fd, originPosition, SEEK_SET); } faad2-2_10_0/plugins/xmms/src/libmp4.c000066400000000000000000000361301374350120500175030ustar00rootroot00000000000000/* * MP4/AAC decoder for xmms * * OPTIONNAL need * -------------- * libid3 (3.8.x - www.id3.org) */ #include #include #include #include #if defined(HAVE_BMP) #include #include #include #include #else #include #include #include #include #endif /*HAVE_BMP*/ #include "neaacdec.h" #include "mp4ff.h" #define MP4_DESCRIPTION "MP4 & MPEG2/4-AAC audio player - 1.2.x" #define MP4_VERSION "ver. 0.5-faad2-version - 22 August 2004" #define MP4_ABOUT "Written by ciberfred" #define BUFFER_SIZE FAAD_MIN_STREAMSIZE*64 static void mp4_init(void); static void mp4_about(void); static void mp4_play(char *); static void mp4_stop(void); static void mp4_pause(short); static void mp4_seek(int); static int mp4_getTime(void); static void mp4_cleanup(void); static void mp4_getSongTitle(char *, char **, int *); static void mp4_getSongInfo(char *); static int mp4_isFile(char *); static void* mp4Decode(void *); InputPlugin mp4_ip = { 0, // handle 0, // filename MP4_DESCRIPTION, mp4_init, mp4_about, 0, // configuration mp4_isFile, 0, //scandir mp4_play, mp4_stop, mp4_pause, mp4_seek, 0, // set equalizer mp4_getTime, 0, // get volume 0, mp4_cleanup, 0, // obsolete 0, // send visualisation data 0, // set player window info 0, // set song title text mp4_getSongTitle, // get song title text mp4_getSongInfo, // info box 0, // to output plugin }; typedef struct _mp4cfg{ gshort file_type; #define FILE_UNKNOW 0 #define FILE_MP4 1 #define FILE_AAC 2 } Mp4Config; static Mp4Config mp4cfg; static gboolean bPlaying = FALSE; static pthread_t decodeThread; static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; static int seekPosition = -1; // Functions from mp4_utils.c extern int getAACTrack(mp4ff_t *infile); extern mp4ff_callback_t *getMP4FF_cb(FILE *mp4file); extern char *getMP4title(mp4ff_t *infile, char *filename); extern void getMP4info(char* filename, FILE *mp4file); InputPlugin *get_iplugin_info(void) { return(&mp4_ip); } static void mp4_init(void) { memset(&decodeThread, 0, sizeof(pthread_t)); mp4cfg.file_type = FILE_UNKNOW; seekPosition = -1; return; } static void mp4_play(char *filename) { bPlaying = TRUE; pthread_create(&decodeThread, 0, mp4Decode, g_strdup(filename)); return; } static void mp4_stop(void) { if(bPlaying){ bPlaying = FALSE; pthread_join(decodeThread, NULL); memset(&decodeThread, 0, sizeof(pthread_t)); mp4_ip.output->close_audio(); } } static int mp4_isFile(char *filename) { if(filename){ gchar* extention; extention = strrchr(filename, '.'); if(extention && (!strncasecmp(extention, ".mp4", 4) || // official extention !strncasecmp(extention, ".m4a", 4) || // Apple mp4 extention !strncasecmp(extention, ".aac", 4) // old MPEG2/4-AAC extention )){ return (1); } } return(0); } static void mp4_about(void) { static GtkWidget *aboutbox; if(aboutbox!=NULL) return; aboutbox = xmms_show_message("About MP4 AAC player plugin", "libfaad2-" FAAD2_VERSION "\n" "plugin version: " MP4_VERSION "\n" MP4_ABOUT, "Ok", FALSE, NULL, NULL); gtk_signal_connect(GTK_OBJECT(aboutbox), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &aboutbox); } static void mp4_pause(short flag) { mp4_ip.output->pause(flag); } static void mp4_seek(int time) { seekPosition = time; while(bPlaying && seekPosition!=-1) xmms_usleep(10000); } static int mp4_getTime(void) { if(!bPlaying) return (-1); else return (mp4_ip.output->output_time()); } static void mp4_cleanup(void) { } void mp4_get_file_type(FILE *mp4file) { unsigned char header[10] = {0}; fseek(mp4file, 0, SEEK_SET); fread(header, 1, 8, mp4file); if(header[4]=='f' && header[5]=='t' && header[6]=='y' && header[7]=='p'){ mp4cfg.file_type = FILE_MP4; }else{ mp4cfg.file_type = FILE_AAC; } } static void mp4_getSongTitle(char *filename, char **title, int *len) { FILE* mp4file; (*title) = NULL; (*len) = -1; if((mp4file = fopen(filename, "rb"))){ mp4_get_file_type(mp4file); fseek(mp4file, 0, SEEK_SET); if(mp4cfg.file_type == FILE_MP4){ mp4ff_callback_t* mp4cb; mp4ff_t* infile; gint mp4track; mp4cb = getMP4FF_cb(mp4file); if ((infile = mp4ff_open_read_metaonly(mp4cb)) && ((mp4track = getAACTrack(infile)) >= 0)){ (*title) = getMP4title(infile, filename); double track_duration = mp4ff_get_track_duration(infile, mp4track); unsigned long time_scale = mp4ff_time_scale(infile, mp4track); unsigned long length = (track_duration * 1000 / time_scale); (*len) = length; } if(infile) mp4ff_close(infile); if(mp4cb) g_free(mp4cb); } else{ // Check AAC ID3 tag... } fclose(mp4file); } } static void mp4_getSongInfo(char *filename) { FILE* mp4file; if((mp4file = fopen(filename, "rb"))){ if (mp4cfg.file_type == FILE_UNKNOW) mp4_get_file_type(mp4file); fseek(mp4file, 0, SEEK_SET); if(mp4cfg.file_type == FILE_MP4) getMP4info(filename, mp4file); else if(mp4cfg.file_type == FILE_AAC) /* * check the id3tagv2 */ ; fclose(mp4file); } } static void *mp4Decode(void *args) { FILE* mp4file; pthread_mutex_lock(&mutex); seekPosition = -1; bPlaying = TRUE; if(!(mp4file = fopen(args, "rb"))){ g_print("MP4!AAC - Can't open file\n"); g_free(args); bPlaying = FALSE; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } mp4_get_file_type(mp4file); fseek(mp4file, 0, SEEK_SET); if(mp4cfg.file_type == FILE_MP4){// We are reading a MP4 file mp4ff_callback_t* mp4cb; mp4ff_t* infile; gint mp4track; mp4cb = getMP4FF_cb(mp4file); if(!(infile = mp4ff_open_read(mp4cb))){ g_print("MP4 - Can't open file\n"); goto end; } if((mp4track = getAACTrack(infile)) < 0){ /* * TODO: check here for others Audio format..... * */ g_print("Unsupported Audio track type\n"); g_free(args); fclose(mp4file); bPlaying = FALSE; pthread_mutex_unlock(&mutex); pthread_exit(NULL); }else{ NeAACDecHandle decoder; unsigned char *buffer = NULL; guint bufferSize = 0; gulong samplerate; guchar channels; //guint avgBitrate; //MP4Duration duration; int msDuration; int numSamples; int sampleID = 0; unsigned int framesize; mp4AudioSpecificConfig mp4ASC; gchar *xmmstitle; decoder = NeAACDecOpen(); mp4ff_get_decoder_config(infile, mp4track, &buffer, &bufferSize); if(NeAACDecInit2(decoder, buffer, bufferSize, &samplerate, &channels)<0){ goto end; } if(buffer){ framesize = 1024; if(NeAACDecAudioSpecificConfig(buffer, bufferSize, &mp4ASC) >= 0){ if(mp4ASC.frameLengthFlag == 1) framesize = 960; if(mp4ASC.sbr_present_flag == 1) framesize *= 2; } g_free(buffer); } if(channels == 0){ g_print("Number of Channels not supported\n"); goto end; } //duration = MP4GetTrackDuration(mp4file, mp4track); //msDuration = MP4ConvertFromTrackDuration(mp4file, mp4track, // duration,MP4_MSECS_TIME_SCALE); //msDuration = mp4ff_get_track_duration(infile, mp4track); //printf("%d\n", msDuration); //numSamples = MP4GetTrackNumberOfSamples(mp4file, mp4track); numSamples = mp4ff_num_samples(infile, mp4track); { float f = 1024.0; if(mp4ASC.sbr_present_flag == 1) f = f * 2.0; msDuration = ((float)numSamples*(float)(f-1.0)/ (float)samplerate)*1000; } xmmstitle = getMP4title(infile, args); mp4_ip.output->open_audio(FMT_S16_NE, samplerate, channels); mp4_ip.output->flush(0); mp4_ip.set_info(xmmstitle, msDuration, -1, samplerate/1000, channels); g_print("MP4 - %d channels @ %ld Hz\n", channels, samplerate); while(bPlaying){ void* sampleBuffer; faacDecFrameInfo frameInfo; gint rc; if(seekPosition!=-1){ /* duration = MP4ConvertToTrackDuration(mp4file, mp4track, seekPosition*1000, MP4_MSECS_TIME_SCALE); sampleID = MP4GetSampleIdFromTime(mp4file, mp4track, duration, 0); */ float f = 1024.0; if(mp4ASC.sbr_present_flag == 1) f = f * 2.0; sampleID = (float)seekPosition*(float)samplerate/(float)(f-1.0); mp4_ip.output->flush(seekPosition*1000); seekPosition = -1; } buffer=NULL; bufferSize=0; rc = mp4ff_read_sample(infile, mp4track, sampleID++, &buffer, &bufferSize); //g_print("%d/%d\n", sampleID-1, numSamples); if((rc==0) || (buffer== NULL)){ g_print("MP4: read error\n"); sampleBuffer = NULL; sampleID=0; mp4_ip.output->buffer_free(); goto end; }else{ sampleBuffer = NeAACDecDecode(decoder, &frameInfo, buffer, bufferSize); if(frameInfo.error > 0){ g_print("MP4: %s\n", faacDecGetErrorMessage(frameInfo.error)); goto end; } if(buffer){ g_free(buffer); buffer=NULL; bufferSize=0; } while(bPlaying && mp4_ip.output->buffer_free()written_time(), FMT_S16_NE, channels, frameInfo.samples<<1, sampleBuffer); mp4_ip.output->write_audio(sampleBuffer, frameInfo.samples<<1); if(sampleID >= numSamples){ break; } } while(bPlaying && mp4_ip.output->buffer_playing() && mp4_ip.output->buffer_free()){ xmms_usleep(10000); } end: mp4_ip.output->close_audio(); g_free(args); NeAACDecClose(decoder); if(infile) mp4ff_close(infile); if(mp4cb) g_free(mp4cb); bPlaying = FALSE; fclose(mp4file); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } }else{ // WE ARE READING AN AAC FILE FILE *file = NULL; NeAACDecHandle decoder = 0; guchar *buffer = 0; gulong bufferconsumed = 0; gulong samplerate = 0; guchar channels; gulong buffervalid = 0; TitleInput* input; gchar *temp = g_strdup(args); gchar *ext = strrchr(temp, '.'); gchar *xmmstitle = NULL; NeAACDecConfigurationPtr config; if((file = fopen(args, "rb")) == 0){ g_print("AAC: can't find file %s\n", args); bPlaying = FALSE; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } if((decoder = NeAACDecOpen()) == NULL){ g_print("AAC: Open Decoder Error\n"); fclose(file); bPlaying = FALSE; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } config = NeAACDecGetCurrentConfiguration(decoder); config->useOldADTSFormat = 0; NeAACDecSetConfiguration(decoder, config); if((buffer = g_malloc(BUFFER_SIZE)) == NULL){ g_print("AAC: error g_malloc\n"); fclose(file); bPlaying = FALSE; NeAACDecClose(decoder); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } if((buffervalid = fread(buffer, 1, BUFFER_SIZE, file))==0){ g_print("AAC: Error reading file\n"); g_free(buffer); fclose(file); bPlaying = FALSE; NeAACDecClose(decoder); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } XMMS_NEW_TITLEINPUT(input); input->file_name = g_basename(temp); input->file_ext = ext ? ext+1 : NULL; input->file_path = temp; if(!strncmp(buffer, "ID3", 3)){ gint size = 0; fseek(file, 0, SEEK_SET); size = (buffer[6]<<21) | (buffer[7]<<14) | (buffer[8]<<7) | buffer[9]; size+=10; fread(buffer, 1, size, file); buffervalid = fread(buffer, 1, BUFFER_SIZE, file); } xmmstitle = xmms_get_titlestring(xmms_get_gentitle_format(), input); if(xmmstitle == NULL) xmmstitle = g_strdup(input->file_name); if(temp) g_free(temp); if(input->performer) g_free(input->performer); if(input->album_name) g_free(input->album_name); if(input->track_name) g_free(input->track_name); if(input->genre) g_free(input->genre); g_free(input); bufferconsumed = NeAACDecInit(decoder, buffer, buffervalid, &samplerate, &channels); if(mp4_ip.output->open_audio(FMT_S16_NE,samplerate,channels) == FALSE){ g_print("AAC: Output Error\n"); g_free(buffer); buffer=0; faacDecClose(decoder); fclose(file); mp4_ip.output->close_audio(); /* if(positionTable){ g_free(positionTable); positionTable=0; } */ g_free(xmmstitle); bPlaying = FALSE; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } //if(bSeek){ //mp4_ip.set_info(xmmstitle, lenght*1000, -1, samplerate, channels); //}else{ mp4_ip.set_info(xmmstitle, -1, -1, samplerate, channels); //} mp4_ip.output->flush(0); while(bPlaying && buffervalid > 0){ NeAACDecFrameInfo finfo; unsigned long samplesdecoded; char* sample_buffer = NULL; /* if(bSeek && seekPosition!=-1){ fseek(file, positionTable[seekPosition], SEEK_SET); bufferconsumed=0; buffervalid = fread(buffer, 1, BUFFER_SIZE, file); aac_ip.output->flush(seekPosition*1000); seekPosition=-1; } */ if(bufferconsumed > 0){ memmove(buffer, &buffer[bufferconsumed], buffervalid-bufferconsumed); buffervalid -= bufferconsumed; buffervalid += fread(&buffer[buffervalid], 1, BUFFER_SIZE-buffervalid, file); bufferconsumed = 0; } sample_buffer = NeAACDecDecode(decoder, &finfo, buffer, buffervalid); if(finfo.error){ config = NeAACDecGetCurrentConfiguration(decoder); if(config->useOldADTSFormat != 1){ NeAACDecClose(decoder); decoder = NeAACDecOpen(); config = NeAACDecGetCurrentConfiguration(decoder); config->useOldADTSFormat = 1; NeAACDecSetConfiguration(decoder, config); finfo.bytesconsumed=0; finfo.samples = 0; NeAACDecInit(decoder, buffer, buffervalid, &samplerate, &channels); }else{ g_print("FAAD2 Warning %s\n", NeAACDecGetErrorMessage(finfo.error)); buffervalid = 0; } } bufferconsumed += finfo.bytesconsumed; samplesdecoded = finfo.samples; if((samplesdecoded<=0) && !sample_buffer){ g_print("AAC: error sample decoding\n"); continue; } while(bPlaying && mp4_ip.output->buffer_free() < (samplesdecoded<<1)){ xmms_usleep(10000); } mp4_ip.add_vis_pcm(mp4_ip.output->written_time(), FMT_S16_LE, channels, samplesdecoded<<1, sample_buffer); mp4_ip.output->write_audio(sample_buffer, samplesdecoded<<1); } while(bPlaying && mp4_ip.output->buffer_playing()){ xmms_usleep(10000); } mp4_ip.output->buffer_free(); mp4_ip.output->close_audio(); bPlaying = FALSE; g_free(buffer); NeAACDecClose(decoder); g_free(xmmstitle); fclose(file); seekPosition = -1; /* if(positionTable){ g_free(positionTable); positionTable=0; } */ bPlaying = FALSE; pthread_mutex_unlock(&mutex); pthread_exit(NULL); } } faad2-2_10_0/plugins/xmms/src/mp4_utils.c000066400000000000000000000453571374350120500202470ustar00rootroot00000000000000/* * some functions for MP4 files */ #include "mp4ff.h" #include "faad.h" #include #include #include #include #include #include #include const char *mp4AudioNames[]= { "MPEG-1 Audio Layers 1,2 or 3", "MPEG-2 low biterate (MPEG-1 extension) - MP3", "MPEG-2 AAC Main Profile", "MPEG-2 AAC Low Complexity profile", "MPEG-2 AAC SSR profile", "MPEG-4 audio (MPEG-4 AAC)", 0 }; /* MPEG-4 Audio types from 14496-3 Table 1.5.1 (from mp4.h)*/ const char *mpeg4AudioNames[]= { "!!!!MPEG-4 Audio track Invalid !!!!!!!", "MPEG-4 AAC Main profile", "MPEG-4 AAC Low Complexity profile", "MPEG-4 AAC SSR profile", "MPEG-4 AAC Long Term Prediction profile", "MPEG-4 AAC Scalable", "MPEG-4 CELP", "MPEG-4 HVXC", "MPEG-4 Text To Speech", "MPEG-4 Main Synthetic profile", "MPEG-4 Wavetable Synthesis profile", "MPEG-4 MIDI Profile", "MPEG-4 Algorithmic Synthesis and Audio FX profile" }; static GtkWidget *mp4_info_dialog = NULL; /* * find AAC track */ int getAACTrack(mp4ff_t *infile) { int i, rc; int numTracks = mp4ff_total_tracks(infile); printf("total-tracks: %d\n", numTracks); for(i=0; iread = read_callback; mp4cb->seek = seek_callback; mp4cb->user_data = mp4file; return mp4cb; } /* * Function to display an info box for an mp4 file. * This code is based heavily on fileinfo.c from the xmms mpg123 * plugin, and the info box layout mimics that plugin. */ void create_mp4_info_dialog (char *filename, FILE *mp4file, mp4ff_t *infile, gint mp4track) { char *window_title, *value, *value2; static GtkWidget *filename_entry, *title_entry, *artist_entry, *album_entry; static GtkWidget *genre_entry, *year_entry, *track_entry, *comment_entry; static GtkWidget *mp4_info_label; if (!mp4_info_dialog) { GtkWidget *dialog_vbox1, *vbox1, *hbox2, *hbox3, *hbox4; GtkWidget *frame2, *frame3, *table1, *dialog_action_area1; GtkWidget *filename_label, *title_label, *artist_label, *album_label; GtkWidget *genre_label, *year_label, *track_label, *comment_label; GtkWidget *close_button; mp4_info_dialog = gtk_dialog_new (); gtk_object_set_data (GTK_OBJECT (mp4_info_dialog), "mp4_info_dialog", mp4_info_dialog); gtk_window_set_policy (GTK_WINDOW (mp4_info_dialog), TRUE, TRUE, FALSE); gtk_signal_connect(GTK_OBJECT (mp4_info_dialog), "destroy", gtk_widget_destroyed, &mp4_info_dialog); dialog_vbox1 = GTK_DIALOG (mp4_info_dialog)->vbox; gtk_object_set_data (GTK_OBJECT (mp4_info_dialog), "dialog_vbox1", dialog_vbox1); gtk_container_set_border_width (GTK_CONTAINER (dialog_vbox1), 3); hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox2); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "hbox2", hbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox2, FALSE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox2), 3); filename_label = gtk_label_new ("Filename: "); gtk_widget_ref (filename_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "filename_label", filename_label, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox2), filename_label, FALSE, FALSE, 0); filename_entry = gtk_entry_new (); gtk_widget_ref (filename_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "filename_entry", filename_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox2), filename_entry, TRUE, TRUE, 0); gtk_entry_set_editable (GTK_ENTRY (filename_entry), FALSE); hbox3 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox3); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "hbox3", hbox3, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (dialog_vbox1), hbox3, TRUE, TRUE, 0); gtk_container_set_border_width (GTK_CONTAINER (hbox3), 3); frame2 = gtk_frame_new ("Tag Info: "); gtk_widget_ref (frame2); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "frame2", frame2, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox3), frame2, TRUE, TRUE, 0); table1 = gtk_table_new (6, 2, FALSE); gtk_widget_ref (table1); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "table1", table1, (GtkDestroyNotify) gtk_widget_unref); gtk_container_add (GTK_CONTAINER (frame2), table1); gtk_container_set_border_width (GTK_CONTAINER (table1), 5); comment_label = gtk_label_new ("Comment: "); gtk_widget_ref (comment_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "comment_label", comment_label, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), comment_label, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_misc_set_alignment (GTK_MISC (comment_label), 1, 0.5); genre_label = gtk_label_new ("Genre: "); gtk_widget_ref (genre_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "genre_label", genre_label, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), genre_label, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_misc_set_alignment (GTK_MISC (genre_label), 1, 0.5); album_label = gtk_label_new ("Album: "); gtk_widget_ref (album_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "album_label", album_label, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), album_label, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_misc_set_alignment (GTK_MISC (album_label), 1, 0.5); title_label = gtk_label_new ("Title: "); gtk_widget_ref (title_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "title_label", title_label, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), title_label, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_misc_set_alignment (GTK_MISC (title_label), 1, 0.5); artist_label = gtk_label_new ("Artist: "); gtk_widget_ref (artist_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "artist_label", artist_label, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), artist_label, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_misc_set_alignment (GTK_MISC (artist_label), 1, 0.5); year_label = gtk_label_new ("Year: "); gtk_widget_ref (year_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "year_label", year_label, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), year_label, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND), 0, 0); gtk_misc_set_alignment (GTK_MISC (year_label), 1, 0.5); hbox4 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (hbox4); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "hbox4", hbox4, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), hbox4, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); year_entry = gtk_entry_new (); gtk_widget_ref (year_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "year_entry", year_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox4), year_entry, FALSE, FALSE, 0); gtk_widget_set_usize (year_entry, 60, -2); gtk_entry_set_editable (GTK_ENTRY (year_entry), FALSE); track_label = gtk_label_new (" Track: "); gtk_widget_ref (track_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "track_label", track_label, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox4), track_label, FALSE, FALSE, 0); gtk_misc_set_alignment (GTK_MISC (track_label), 1, 0.5); track_entry = gtk_entry_new (); gtk_widget_ref (track_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "track_entry", track_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox4), track_entry, FALSE, FALSE, 0); gtk_widget_set_usize (track_entry, 60, -2); gtk_entry_set_editable (GTK_ENTRY (track_entry), FALSE); title_entry = gtk_entry_new (); gtk_widget_ref (title_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "title_entry", title_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), title_entry, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (title_entry), FALSE); artist_entry = gtk_entry_new (); gtk_widget_ref (artist_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "artist_entry", artist_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), artist_entry, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (artist_entry), FALSE); album_entry = gtk_entry_new (); gtk_widget_ref (album_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "album_entry", album_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), album_entry, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (album_entry), FALSE); genre_entry = gtk_entry_new (); gtk_widget_ref (genre_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "genre_entry", genre_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), genre_entry, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (genre_entry), FALSE); comment_entry = gtk_entry_new (); gtk_widget_ref (comment_entry); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "comment_entry", comment_entry, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (table1), comment_entry, 1, 2, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (comment_entry), FALSE); frame3 = gtk_frame_new ("MP4 Info: "); gtk_widget_ref (frame3); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "frame3", frame3, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (hbox3), frame3, FALSE, TRUE, 0); vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (vbox1); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "vbox1", vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_container_add (GTK_CONTAINER (frame3), vbox1); gtk_container_set_border_width (GTK_CONTAINER (vbox1), 5); mp4_info_label = gtk_label_new (""); gtk_widget_ref (mp4_info_label); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "mp4_info_label", mp4_info_label, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (vbox1), mp4_info_label, TRUE, TRUE, 0); gtk_label_set_justify (GTK_LABEL (mp4_info_label), GTK_JUSTIFY_LEFT); gtk_misc_set_alignment (GTK_MISC (mp4_info_label), 0, 0); dialog_action_area1 = GTK_DIALOG (mp4_info_dialog)->action_area; gtk_object_set_data (GTK_OBJECT (mp4_info_dialog), "dialog_action_area1", dialog_action_area1); gtk_container_set_border_width (GTK_CONTAINER (dialog_action_area1), 4); close_button = gtk_button_new_with_label ("Close"); gtk_widget_ref (close_button); gtk_object_set_data_full (GTK_OBJECT (mp4_info_dialog), "close_button", close_button, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (dialog_action_area1), close_button, FALSE, FALSE, 0); gtk_signal_connect_object (GTK_OBJECT (close_button), "clicked", GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (mp4_info_dialog)); } window_title = g_strdup_printf("File Info - %s", g_basename(filename)); gtk_window_set_title (GTK_WINDOW (mp4_info_dialog), window_title); g_free(window_title); gtk_entry_set_text (GTK_ENTRY (filename_entry), filename); gtk_entry_set_text (GTK_ENTRY (title_entry), ""); gtk_entry_set_text (GTK_ENTRY (artist_entry), ""); gtk_entry_set_text (GTK_ENTRY (album_entry), ""); gtk_entry_set_text (GTK_ENTRY (year_entry), ""); gtk_entry_set_text (GTK_ENTRY (track_entry), ""); gtk_entry_set_text (GTK_ENTRY (genre_entry), ""); gtk_entry_set_text (GTK_ENTRY (comment_entry), ""); if ((mp4ff_meta_get_title(infile, &value)) && value != NULL) { gtk_entry_set_text (GTK_ENTRY(title_entry), value); g_free(value); } if ((mp4ff_meta_get_artist(infile, &value)) && value != NULL) { gtk_entry_set_text (GTK_ENTRY(artist_entry), value); g_free(value); } if ((mp4ff_meta_get_album(infile, &value)) && value != NULL) { gtk_entry_set_text (GTK_ENTRY(album_entry), value); g_free(value); } if ((mp4ff_meta_get_date(infile, &value)) && value != NULL) { gtk_entry_set_text (GTK_ENTRY(year_entry), value); g_free(value); } if ((mp4ff_meta_get_track(infile, &value)) && value != NULL) { if ((mp4ff_meta_get_totaltracks(infile, &value2)) && value2 != NULL) { char *tmp = g_strdup_printf("%s of %s", value, value2); g_free(value2); g_free(value); value = tmp; } gtk_entry_set_text (GTK_ENTRY(track_entry), value); g_free(value); } if ((mp4ff_meta_get_genre(infile, &value)) && value != NULL) { gtk_entry_set_text (GTK_ENTRY(genre_entry), value); g_free(value); } if ((mp4ff_meta_get_comment(infile, &value)) && value != NULL) { gtk_entry_set_text (GTK_ENTRY(comment_entry), value); g_free(value); } // Get the length of the track. double track_duration = mp4ff_get_track_duration(infile, mp4track); unsigned long time_scale = mp4ff_time_scale(infile, mp4track); unsigned long length = (track_duration / time_scale); int min = length / 60; int sec = length % 60; // Get other info about the track. unsigned long bitrate = mp4ff_get_avg_bitrate(infile, mp4track) / 1000; unsigned long samplerate = mp4ff_get_sample_rate(infile, mp4track); unsigned long channels = mp4ff_get_channel_count(infile, mp4track); unsigned long audio_type = mp4ff_get_audio_type(infile, mp4track); fseek(mp4file, 0, SEEK_END); int filesize = ftell(mp4file) / 1024; value = g_strdup_printf("Length: %d:%d\nAvg. Bitrate: %ld kbps\nSample Rate: %ld Hz\nChannels: %ld\nAudio Type: %ld\nFile Size: %d KB", min, sec, bitrate, samplerate, channels, audio_type, filesize); gtk_label_set_text (GTK_LABEL(mp4_info_label), value); g_free(value); gtk_widget_show_all(mp4_info_dialog); } void getMP4info(char* filename, FILE* mp4file) { mp4ff_callback_t* mp4cb; mp4ff_t* infile; gint mp4track; mp4cb = getMP4FF_cb(mp4file); if ((infile = mp4ff_open_read_metaonly(mp4cb)) && ((mp4track = getAACTrack(infile)) >= 0)){ create_mp4_info_dialog (filename, mp4file, infile, mp4track); } if(infile) mp4ff_close(infile); if(mp4cb) g_free(mp4cb); } /* Get the xmms titlestring for the file based on metadata. The following code was adapted from the gtkpod project, specifically mp4file.c (C) Jorg Schuler, but written to use the mp4ff library. The mpg123 input plugin for xmms was used as a guide for this function. --Jason Arroyo, 2004 */ char *getMP4title(mp4ff_t *infile, char *filename) { char *ret=NULL; gchar *value, *path, *temp; TitleInput *input; XMMS_NEW_TITLEINPUT(input); // Fill in the TitleInput with the relevant data // from the mp4 file that can be used to display the title. mp4ff_meta_get_title(infile, &input->track_name); mp4ff_meta_get_artist(infile, &input->performer); mp4ff_meta_get_album(infile, &input->album_name); if (mp4ff_meta_get_track(infile, &value) && value != NULL) { input->track_number = atoi(value); g_free(value); } if (mp4ff_meta_get_date(infile, &value) && value != NULL) { input->year = atoi(value); g_free(value); } mp4ff_meta_get_genre(infile, &input->genre); mp4ff_meta_get_comment(infile, &input->comment); input->file_name = g_strdup(g_basename(filename)); path = g_strdup(filename); temp = strrchr(path, '.'); if (temp != NULL) {++temp;} input->file_ext = g_strdup_printf("%s", temp); temp = strrchr(path, '/'); if (temp) {*temp = '\0';} input->file_path = g_strdup_printf("%s/", path); // Use the default xmms title format to format the // title from the above info. ret = xmms_get_titlestring(xmms_get_gentitle_format(), input); g_free(input->track_name); g_free(input->performer); g_free(input->album_name); g_free(input->genre); g_free(input->comment); g_free(input->file_name); g_free(input->file_ext); g_free(input->file_path); g_free(input); g_free(path); return ret; } faad2-2_10_0/project/000077500000000000000000000000001374350120500143575ustar00rootroot00000000000000faad2-2_10_0/project/msvc/000077500000000000000000000000001374350120500153275ustar00rootroot00000000000000faad2-2_10_0/project/msvc/faad.vcxproj000066400000000000000000000241111374350120500176360ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58} 10.0 Application v142 Application v142 Application v142 Application v142 <_ProjectFileVersion>15.0.26730.12 .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ true MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ true MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ false MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ false MinimumRecommendedRules.ruleset .\Debug/faad.tlb Disabled ../../include;../../frontend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0413 true Console .\Debug/faad.tlb Disabled ../../include;../../frontend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0413 true Console .\Release/faad.tlb MinSpace OnlyExplicitInline true Speed ../../include;../../frontend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreadedDLL true Level3 NDEBUG;%(PreprocessorDefinitions) 0x0413 Console .\Release/faad.tlb MinSpace OnlyExplicitInline true Speed ../../include;../../frontend;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) true MultiThreadedDLL true Level3 NDEBUG;%(PreprocessorDefinitions) 0x0413 Console {bc3efe27-9015-4c9c-ad3c-72b3b7ed2114} faad2-2_10_0/project/msvc/faad.vcxproj.filters000066400000000000000000000030161374350120500213060ustar00rootroot00000000000000 {6471b163-f0fb-4df0-b3f4-a98d81d5acd5} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {b68959bb-0fd2-4bc1-92be-187b7a5161e4} h;hpp;hxx;hm;inl Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files faad2-2_10_0/project/msvc/faad2.sln000066400000000000000000000057441374350120500170340ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.30114.105 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "libfaad.vcxproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad2_dll", "libfaad2_dll.vcxproj", "{482DA264-EE88-4575-B208-87C4CB80CD08}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "faad", "faad.vcxproj", "{2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|Win32.ActiveCfg = Debug|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|Win32.Build.0 = Debug|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|x64.ActiveCfg = Debug|x64 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Debug|x64.Build.0 = Debug|x64 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|Win32.ActiveCfg = Release|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|Win32.Build.0 = Release|Win32 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|x64.ActiveCfg = Release|x64 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}.Release|x64.Build.0 = Release|x64 {482DA264-EE88-4575-B208-87C4CB80CD08}.Debug|Win32.ActiveCfg = Debug|Win32 {482DA264-EE88-4575-B208-87C4CB80CD08}.Debug|Win32.Build.0 = Debug|Win32 {482DA264-EE88-4575-B208-87C4CB80CD08}.Debug|x64.ActiveCfg = Debug|x64 {482DA264-EE88-4575-B208-87C4CB80CD08}.Debug|x64.Build.0 = Debug|x64 {482DA264-EE88-4575-B208-87C4CB80CD08}.Release|Win32.ActiveCfg = Release|Win32 {482DA264-EE88-4575-B208-87C4CB80CD08}.Release|Win32.Build.0 = Release|Win32 {482DA264-EE88-4575-B208-87C4CB80CD08}.Release|x64.ActiveCfg = Release|x64 {482DA264-EE88-4575-B208-87C4CB80CD08}.Release|x64.Build.0 = Release|x64 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Debug|Win32.ActiveCfg = Debug|Win32 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Debug|Win32.Build.0 = Debug|Win32 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Debug|x64.ActiveCfg = Debug|x64 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Debug|x64.Build.0 = Debug|x64 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Release|Win32.ActiveCfg = Release|Win32 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Release|Win32.Build.0 = Release|Win32 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Release|x64.ActiveCfg = Release|x64 {2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {89E2B8B3-42E4-4058-9565-E79943F3445F} EndGlobalSection GlobalSection(DPCodeReviewSolutionGUID) = preSolution DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} EndGlobalSection EndGlobal faad2-2_10_0/project/msvc/libfaad.vcxproj000066400000000000000000000345221374350120500203340ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} 10.0 StaticLibrary v142 StaticLibrary v142 StaticLibrary v142 StaticLibrary v142 <_ProjectFileVersion>15.0.26730.12 .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ MinimumRecommendedRules.ruleset MaxSpeed OnlyExplicitInline ../../include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_LIB;HAVE_LRINTF;%(PreprocessorDefinitions) true MultiThreadedDLL true Level3 NDEBUG;%(PreprocessorDefinitions) 0x0413 "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" Retrieving package version... MaxSpeed OnlyExplicitInline ../../include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;NDEBUG;WIN32;_LIB;HAVE_LRINTF;%(PreprocessorDefinitions) true MultiThreadedDLL true Level3 NDEBUG;%(PreprocessorDefinitions) 0x0413 "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" Retrieving package version... Disabled ../../include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_LIB;HAVE_LRINTF;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0413 "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" Retrieving package version... Disabled ../../include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;_DEBUG;WIN32;_LIB;HAVE_LRINTF;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0413 "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" Retrieving package version... faad2-2_10_0/project/msvc/libfaad.vcxproj.filters000066400000000000000000000243461374350120500220060ustar00rootroot00000000000000 {619aded3-55ea-4189-9fe0-5214a4d91e93} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {6f786fdd-858d-47ce-9a6e-e09b46c63fbb} h;hpp;hxx;hm;inl {8cc5d783-4bb8-4e95-9da0-67901052651a} Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook Header Files\codebook faad2-2_10_0/project/msvc/libfaad2.def000066400000000000000000000006701374350120500174560ustar00rootroot00000000000000EXPORTS ; ; libfaad2 exports ; NeAACDecOpen @1 NeAACDecGetCurrentConfiguration @2 NeAACDecSetConfiguration @3 NeAACDecInit @4 NeAACDecInit2 @5 NeAACDecDecode @6 NeAACDecClose @7 NeAACDecGetErrorMessage @8 NeAACDecAudioSpecificConfig @9 NeAACDecPostSeekReset @10 NeAACDecDecode2 @11 faad2-2_10_0/project/msvc/libfaad2_dll.vcxproj000066400000000000000000000354551374350120500212570ustar00rootroot00000000000000 Debug Win32 Debug x64 Release Win32 Release x64 {482DA264-EE88-4575-B208-87C4CB80CD08} 10.0 DynamicLibrary v142 DynamicLibrary v142 DynamicLibrary v142 DynamicLibrary v142 <_ProjectFileVersion>15.0.26730.12 .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ true MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ true MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ false MinimumRecommendedRules.ruleset .\bin\$(Configuration)\ .\intermediate\$(Configuration)\$(ProjectName)\ false MinimumRecommendedRules.ruleset _DEBUG;%(PreprocessorDefinitions) true true Win32 .\DebugDLL/libfaad2_dll.tlb Disabled ../../include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_LRINTF;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 true EditAndContinue _DEBUG;%(PreprocessorDefinitions) 0x0407 .\libfaad2.def true Retrieving package version... "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" _DEBUG;%(PreprocessorDefinitions) true true .\DebugDLL/libfaad2_dll.tlb Disabled ../../include;%(AdditionalIncludeDirectories) _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_WINDOWS;_USRDLL;HAVE_LRINTF;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL Level3 true ProgramDatabase _DEBUG;%(PreprocessorDefinitions) 0x0407 .\libfaad2.def true Retrieving package version... "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" NDEBUG;%(PreprocessorDefinitions) true true Win32 .\ReleaseDLL/libfaad2_dll.tlb OnlyExplicitInline true Speed _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_LRINTF;%(PreprocessorDefinitions) true MultiThreadedDLL true Level3 true ../../include;%(AdditionalIncludeDirectories) NDEBUG;%(PreprocessorDefinitions) 0x0407 .\libfaad2.def Retrieving package version... "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" NDEBUG;%(PreprocessorDefinitions) true true .\ReleaseDLL/libfaad2_dll.tlb OnlyExplicitInline true Speed _CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_WINDOWS;_USRDLL;HAVE_LRINTF;%(PreprocessorDefinitions) true MultiThreadedDLL true Level3 true ../../include;%(AdditionalIncludeDirectories) NDEBUG;%(PreprocessorDefinitions) 0x0407 .\libfaad2.def Retrieving package version... "$(SolutionDir)..\..\utils\win32\ac2ver.exe" "faad2" "$(SolutionDir)..\..\configure.ac" > "$(SolutionDir)..\..\libfaad\win32_ver.h" faad2-2_10_0/project/msvc/libfaad2_dll.vcxproj.filters000066400000000000000000000153331374350120500227170ustar00rootroot00000000000000 {49a4bc70-d8e3-49e8-89e3-a91112cd9fd2} {05b5a1d9-6070-414e-9fa5-21734fddfce8} Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Source Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files faad2-2_10_0/utils/000077500000000000000000000000001374350120500140515ustar00rootroot00000000000000faad2-2_10_0/utils/win32/000077500000000000000000000000001374350120500150135ustar00rootroot00000000000000faad2-2_10_0/utils/win32/ac2ver.c000066400000000000000000000041631374350120500163450ustar00rootroot00000000000000/* ** AC2VER - extract version number from AC_INIT macro (configure.ac) ** Copyright (C) 2017 LoRd_MuldeR ** ** This software is released under the CC0 1.0 Universal [CC0 1.0] licence! ** https://creativecommons.org/publicdomain/zero/1.0/legalcode **/ #define BUFF_SIZE 4096 #define _CRT_SECURE_NO_WARNINGS 1 #include #include #include #include static int clean_string(char *const str) { size_t i = 0, j = 0; while(str[i]) { if(isalnum(str[i]) || strchr("._-", str[i])) { if(i != j) { str[j] = str[i]; } ++j; } ++i; } str[j] = '\0'; return !!j; } static int parse_version(FILE *const input, const char *const format, char *const version) { char buffer[BUFF_SIZE]; while(!(feof(input) || ferror(input))) { const char *line = fgets(buffer, BUFF_SIZE, input); if(line) { while((*line) && (isspace(*line))) { ++line; /*skip space*/ } if(sscanf(line, format, version) == 1) { if(clean_string(version)) { return 1; /*found!*/ } } } } version[0] = '\0'; return 0; } static int get_version(const wchar_t *const lib_name, const wchar_t *const file_name) { char format[128], version[BUFF_SIZE]; FILE *const input = _wfopen(file_name, L"r"); if(!input) { fprintf(stderr, "Error: Failed to open input file!\n%S\n\n", file_name); return 0; } _snprintf(format, 128, "AC_INIT ( %S , %%s", lib_name); //printf("<%s>\n", format); if(parse_version(input, format, version)) { printf("#define PACKAGE_VERSION \"%s\"\n", version); fclose(input); return 1; } else { fprintf(stderr, "Error: Version string could not be found!\n\n"); fclose(input); return 0; } } int wmain(int argc, wchar_t* argv[]) { if((argc != 3) || (!argv[1][0]) || (!argv[2][0])) { wchar_t file_name[_MAX_FNAME], file_ext[_MAX_EXT]; _wsplitpath(argv[0], NULL, NULL, file_name, file_ext); fprintf(stderr, "AC2VER [%s]\n\n", __DATE__); fprintf(stderr, "Usage: %S%S \n\n", file_name, file_ext); return EXIT_FAILURE; } return get_version(argv[1], argv[2]) ? EXIT_SUCCESS : EXIT_FAILURE; } faad2-2_10_0/utils/win32/ac2ver.exe000066400000000000000000001670001374350120500167040ustar00rootroot00000000000000MZ@ !L!This program cannot be run in DOS mode. $8fEY5EY5EY5^H5YY5^I5,Y5L!p5FY5EY5Y5^}5UY5^M5DY5^~5DY5RichEY5PELis6Z  D!@@OW@H( 0.text `.rdata#$@@.data-@.rsrc @@.reloc 0@BU$t @3ʼnSW]ESGYSEhP} trPYtGuVuW uI338t6>PYu>Ph@YYt ;t>CG<>uu.]SYX3_3[ZŌ3@U츄@3ʼnE}E VWxf?pf>Sh@VYYuVh@n@P fWh@|hP|P|ntPh@a S 3 @h@ @PV S 33Ʌ[^|Q|Qjj0 hH@hT@@P |P|Phd@@P 3@M_3^; @uEUEu3]Ë@ ]ËUEu3]Ë@ ]ËU eWjY3}_uY9E tVYEIuuM;wEuEuu PUËUVuEPju h&@v^]ËUEVF uc.FHlHhN; h@t @HpuA,F;(@tF @Hpu$FF@puHpF  @F^]Uu MfE~EPju0 MH}tMapËU=LAuE X@A]juYY]ËUu ME~EPhu80 MH%}tMapËU=LAuE X@A%]ju~YY]ËUu MaE~EPju/ MH}tMapËU=LAuE X@A]juYY]ËUu ME~EPhu3/ MH%}tMapËU=LAuE X@A%]ju~YY]ø@áAVj^u;}ƣAjP1YY AujV5A1YY AujX^3ҹ@ A  @|j^3ҹ@W At;tu1 Bp@|_3^7=|At{25 A62YËUVu@;r"`@w+Q8N Y V@^]ËUE}P8E H Y]ËE P@]ËUE@;r=`@w` +P7Y]à P@]ËUME }` QZ7Y]à P@]̍B[Í$d$3D$ST$t :tτtQu WV ؋ ~333ƃu%t%uu^_[3ËB:t6t:t't:tt:tt^_B[ÍB^_[ÍB^_[ÍB^_[j h@v;3}3];;u  3{3u ;;t3f9>;t9E;u ɉ}f9;u jEPh@< PuVS6EE E;u YËUj@u u0 ]ËU SW3j3Y}]9]u:  uM Vu;t;u  PE;wMEPSuEPEBuud?;tMxE EPSL=YY^_[jh@9]]3;u9M t 0 339M ;t3u;;t9M tډuVtYeF @uoVKYttȃ Ax@A$u)tt Ax@@$t  e}t:M t2Nx AVLJYEu ;ue G}< uE E9ËuVYj h@8339u;uZ _j [PjYYuxPKYE PVu`P=EPPWtKE E{8* PjYYá@39@ËUQMS3VWU;} ;u9Uux9Utq9Uu9Uug9Ut`9Uu9U uV9U tO9U$uE9U(uE3@f9tH;wf>:u9;t}!jQjWJ3҃u9U(uE;t3f33ۋf;tTf/tf\t f.u~f;u;t,9Ut +9EPQju_J3҉} E;t3f8;tG;rC9Ut+9E vgPQju#JM39U$tE+9u(vEVSju$J+9Ut+9u v&VQjuI3ҋE$;t3f3_^[3ҋE ;t 9Uv3f0E;t 9Uv3f0E;t 9U v3f0E$;t 9U(v3f0;uj^0t9Uuj"Y닋UMɸ#QuM#QMu#ȋE QuPu u$]j h@53ۉ]3};;u?39] ;t܉}W8Y]G @uoWGYttȃ Ax@A$u)tt Ax@@$tPM9]u#WnGEPSu W:EWVGE E4uYËUVuWuA DF t8V<-VIVFP&IyFt PN)fYf _^]j h(@.4M3uuj F @t f E:4VYeV]u ]FE /F<-uqtm]tfF:s{{:{s,{*ЋσdzDGJu苝L{D2ȊЋDL<]cD@b+u.du t ƅs\t ؉l0\t؉lxt_XtZLxDžTt&HtdusDžLo.tt\SDYYj0[\tlH؉ltdd}sDžLxF@xGrtt\PCYY;c4cZt@3f@ƅ{l-u ƅY+u.du t ƅs\tx؉l(<sLxt]LptTPzYLou88<Kjj <8E0PYtk8<SYlTCЙH8f>D[GDd<%u8GuG\tGlD;uwPBYt%\tGD;u7tlu?%uNDxnuB4lt\P?YYt\l?YY0u PYlu*4u 8[ut% apt `p4[M_3^6-t"t t Ht3øøøøËVWh3FWP$;3ȋ~~~  ~@ F+ο@Ou@Nu_^ËU@3ʼnESWPv$@3@;rƅ t0;w+@P j Ra: Cujv vPWPjj D3SvWPWPWv SBDSvWPWPhv SB$3EtLtL @;rRDž3)ЍZ w LQ w L QA;rƋM_3[j hh@ @Gptltwhuj Yj )Yewhu;5(@t6tV,@u@tV+Y(@Gh5(@uV(@E뎋uj YËUS3SMH Au A4@8]tEMapE,@D;FG;v}>uЋuE}urlj{CijC C4@Zf1f0JuL@;v~0C@IuCC Ss3ȋ {95 ATM_^3[ jh@M}_huqE;CWh " Y؅Fwh#SuYYEuvh,@uFh=@tP Y^hS=(@Fp @j YeC0AC4AC 8A3E}fLCf E$A@3E=} L @@3E=}(@@5(@,@u(@=@tPJ Y(@SE0j Y%u @tS YeE:Ã=| AujVY| A3ËUSV5(@W}W֋tP֋tP֋tP֋tP֍_PE{$@t tPփ{t CtPփMu֋P_^[]ËUW}SV5,@W֋tP֋tP֋tP֋tP֍_PE{$@t tPփ{t CtPփMu֋P^[_]ËUSVu3W;to=(@th;t^9uZ;t9uPs AYY;t9uPR @YY: / YY;tD9u@-P +P +P =(@t9uP< YY~PE$@t;t 9uP Y9_tG;t 9uP} YMuVn Y_^[]ËUW} t;Et4V0;t(W8jYtV>Yu@tVsY^3_]j h@  @Fpt"~ltpluj Yj Ye5h@lVYYYEEj Yuj@<@V5p@@@u5@A@V5p@D@^ál@tP5HA@Ѓ l@p@tPH@ p@ jh@h@L@uF\(@f3G~~pƆCƆKCFh@j Yevh(@E>j Y}E Fluh@FlvlYE3Guj k Yj b YËVWX@5l@ЋuNhjTYYt:V5l@5DA@ЅtjVYYT@N VY3WP@_^ËVuj Y^jh@uF$tPYF,tPYF4tPYFWl@t3%>uN@ uNhF Ph@t,F N@Ch5 A`@3_[^ÃUVW3u9Yu'9PAvVx@;PAvuʋ_^]ËUVW3ju u5: u'9PAvVx@;PAvuË_^]ËUVW3u um:YYu,9E t'9PAvVx@;PAvu_^]ËUVW3uu u: u,9Et'9PAvVx@;PAvu_^]ËU}t-uj5 A|@uVX@P5Y^]jh@ 3ۉ]j|Y]j_};=A}T A9tE@ tPBYtE|( A Pt@ A4TY AGE Et j!YËUhp@L@th`@P\@tu]ËUuYu@jYjYËV+V.<VV<V;V9V9^ËUVu3utу;u r^]ËU= Ath A=Yt u AY<-h @h@YYuTVWhp@<@@Y;stЃ;r= A_^th Ag=Yt jjj A3]j h8@jYe3@9AAE|A} 5x A5@֋؉]Ѕth5t A֋}ԉ]܉}؃};rK9t;r>7֋5x A֋5t A9]u9Et]܉]ЉE؋}ԋ]E$@}0@sEtЃEE4@}8@sEtЃEE }u)AjYu}tjYËUjju ]ËUjju ]jjj jjjz ËU,uuYh̋USVuF Ȁ3ۀu@t9FW>+~,WPVkYP(C ;uF yF N _Ff^[]ËUVuu V5Y/V|YtF @tVPCYY3^]jhX@~3}}jBY}3u;5A A98t^@ tVPVQYY3BU AH t/9UuPJYtE9}utP/Yu E܉}F3uࡨ A4VZYYE}EtEjYjYËVW3A<@u@8h0h@t F$|3@_^Ã$@3St@V@W>t~t WW=&Y@|ܾ@_t ~uPӃ@|^[ËUE4Ÿ@@]j h@3G}39 AujhYYu4@9tmjvY;uF 3Pj XY]9u+hWh@uWlY ] >WQYE E|j )YËUEV4Ÿ@>uP#YujY6@^]ËUD A3SVu EUUUf> tat0rt#wth 3a 3ۃM M3AWf;y@St  tRHtCt- t!9EE @@EE ljE}utE nTtZtEHt0 tuE G}u;eE1}u% UEut3 ؃f}j _f9>tjVh@I f9>tf>=uuf9>tjh@VH u Ajh@VH u "jh@VH uf> t3f9>tChuE SuP@Gt3 E@MH M x8xxH_^[jh@533}jY]3u;5A A9t[@ uHuAFwFPY A4VYY A@ t PV7YYF둋}cj8xY A;tNh A Ph@ Au4sY A P@ A<}_ ;tg ___OE `Ë}j Yh0T@d5D$l$l$+SVW@1E3PeuEEEEdËMd Y__^[]Q̋US] Vs35@WEE{t N3 8N F3 8ѽE@fMUS[ EMt_I[LDEEtEx@GE؃u΀}t$t N3 8^N V3 :NE_^[]EɋM9csmu)=l At hl A3tUjRl AM UE 9X th@WӋE MH t N3 8ȼN V3 :踼EH*9S Oh@WASVWT$D$L$URPQQhPV@d5@3ĉD$d%D$0XL$,3p t;T$4t;v.4v\ H {uhCbFCtFd_^[ËL$At3D$H3ڻUhp pp> ]D$T$UL$)qqq( ]UVWS33333[_^]ËjE33333USVWjRhV@Q^_^[]Ul$RQt$ ]UQVu VE F YuN N /@t 3"S3ۨt^NF F F ^] u,: ;t .@;u u FYuVpFYF WF>HN+IN;~WPu 8 EM F yM tt Ax@@ tjSSQ E#ƒt%FM3GWEPu 7 E9}t N E%_[^A @tyt$Ix  QPvYYu ËUQC @VEt {uE >'} ~0EM E>u?*u˰?~} Ճ?uE^ËU@3ʼnES] Vu3W}uǹ u+t `p7 F @u^V} Yx@ttȃ AA$uttȃ A@$q3;g C39y B@Dž W @9} DžjugucDžW9~~=]VYt Dž5@GPPSP5@ЋtuPS5@YYguuPS5@YY;-uCSDž*snHHXDž'Dž2Qƅ0Dž t@tGGG@t3҉@t|sځu39} Dž9~ u!u t-RPWS>0؋9~N뽍E+Ftbt΀90tW0@?If90tu+(u @I8t@u+@t5t ƅ-t ƅ+ tƅ Dž++ u% O0tP2YYt.u%˰0Otヽtu~qPjEPP,<u69t.EPYYu#P]YY|2t) Ot߃t8Ytrt `pM_^3[ZÐ\@Z@Z@[@f[@q[@[@\@UVuu[F @t F F u V8YFvvVYPA FF uQVYt0VYt$WVtV< AdYY_x@@$^^N 3_@[3^]ËU}t'Vu F tVf f&fY^]ËUUS]VWuu9U u3_^[]Åt} u#j^0Ǽ݅u3fЋMu3fԋƒu+fft'Ou"+ fftOtKuu3fy3uM jPfDJXdf蔼j"YjUVuWV@YtP Au u u@DtjV@jM@YY;tVA@YP@u X@3V? AYD0t WY3_^]jh@0]u ˻ x; Ar迻 褻 Gҋ< AD0tS?YeD0t SYER ME EË]S;@YËUVuF ttvaf 3YFF^]ËUE8csmu*xu$@= t=!t="t=@u 3]hi@@3ËU3M; Ÿ@t @r3]Ëż@]ËU@3ʼnESVuWV3Y;ljvCYjeCYu =@6h@hAWB hAVSfA@uh@SVB t 3PPPPPVcB@Y=u Fd.=u Fd=u Fd=uFdvdjY~d`QY^`[_^]ËV5@W3uf=tGV?YtFfuSjGW|YYlAue5@5V?f>=Yxt"jWIYYtAVWP? uI4~f>u5@%@#p A3Y[_^5lA%lA3PPPPPе̋UQV3W} 9Ut ME1f8"u} 3Ʌj"Yt ffft;uf tf ut3fNe3f9 t u f99Ut ME13G3Bf8\tf8"u8u}t fx"u 339MMJt j\Yfuft$9Uu t tt tf끅t3f} 0E;t_^ËUQQSVWh AV33Sf A@ A5xA;tf9uEPS]3ɋ[]YY?sJMs?Y;r4PYt'EP V]EHYXAY5`A3_^[ËV@3;u3^f9tf9uf9uS+ƍXWS\Yu V@_[^SVW V@@W;stЃ;r_^ËV@@W;stЃ;r_^jhj@3Ʌ AËU@eeSWN@;t t У@eVEP@u3u@3T@3@3EP@E3E3;uO@u G 5@։5@^_[Ã%h A̋T$ L$ti3D$ur=d AtC<Wr1كt +шuʃtt uD$_ËD$UWVu M};v;r=d AtWV;^_uu<ur)$ps@Ǻr $r@$s@$s@r@r@r@#ъFGFGr$ps@I#ъFGr$ps@#ъr$ps@Igs@Ts@Ls@Ds@YtvV.Y[ 3_^]JX@PY2X@PYʋUM S3;vj3X;Es 3AMVW9]t u,YVuYYt;s+VjS _^[]jh@@xte3@ËeE{, hу@@ AËUE$ A( A, A0 A]ËUE @V9Ptk u ;rk M^;s9Pt3]5, A@j h@G3}}؋] KtjY+t"+t+tY+uC赼}؅uT$ A$ AUw\]YpQÃt2t!Ht舟+빾, A, A( A( A 0 A0 AEP@E3}9Euj9EtPHY3Et tuO`MԉG`u>OdMGdu, @M܋ @ @9M}Mk W\DErEuwdSUY]}؃}tjYSUYt tuEԉG`uEЉGd3ËUE8 A]ËUE< A]ËUE@ A]ËU5@ A@tuYt3@]3]ËUQSV5@W5x A5t A؉]֋;+GruS)؍GY;sH;s;rPu\YYuC;r>PuFYYt/P4@x Au=@׉Vףt AE3_^[ËVjj YYV@x At AujX^Ã&3^j h @heuYEE E`ËUuYH]̋UMMZf9t3]ËA<8PEu3ҹ f9H‹]̋UEH<ASVq3WDt} H ;r X;r B(;r3_^[]̋Ujh@@h0T@dPSVW@1E3PEdeEh@*tTE-@Ph@Pt:@$ЃEMd Y_^[]ËE3ҁ9‹ËeE3Md Y_^[]ËU'@3ʼnEE VuW34809}u3;uM83֚S AL8$$?tu'Mu ԚwD8 tjjjVVYD@l39H P4@3;`;t 8?P@4 3,9E#@?g $3 ǃx8tP4UM`8jEPKP Yt:4+M3@;jDSP C@jSDPk n3PPjMQjDQP C@@=j,PVEP$4@ @089,j,PjEP$E 4@,08<t<u!33Ƀ @D<t<uRD$Yf;DI8t)j XPD$Yf;D80E9@8T4D83ɋD8?D49M3+4H;Ms&CA u 0 @F@FrՋH+j(PVHP$4@C(8;;+4;El%?49MH@+4jH^;MsCΉ u0j [f @@fƁ@rH+j(PVHP$4@i(8;a+4;EGK4,9Mu,@+4jH^;Ms;,,΃ uj [f@@fƁ@r3VVhU QH++PPVh@;j(P+P5P$4@t (; X@D;\,+48;E ?Q(Qu448@t(D8 X@D8ulDt-j^9Du 0?DY1$D@t48u3$赔轔 8+0[M_3^Sjh`@]u联 f x; ArZ ? ҋ< AD0tS~YeD0tuu Sn E ME ETË]SYjh@]u蚓 x; Ar{ ڋ< ADtSYeDt1S=YP@u X@Ee}t!M ME E{Ë]SYËU4S3EV]܈]]E ]t ]E E]EP("YEuE@u9EtME+ùtCHt(Ht fIj^0MEt EuE@UEjY+t7+t*+t+t@u9UEEE E]E#¹W;3t(;t$;t=tT=u-ETEKEB=t4=t$;t)脑gj^0 _^[EEEEt TA#MxE@tMMMt } t M tM;u! ͐`E=@juuEPuuu ׉E;upM#;u+Et%ejuEuPuuu ׉E;u76 AD0 X@PTY(Eful@uD6 AD0 X@VYu@uՏ 렃uM@ uMu6Ѓ AYYMLЃ AD$ MeHMuEtpjS6 ;uT8tP6ejEP6q uf}uǙRP6 ;tjj6Q ;tE(@@}uE#u M EE#;tD=t)=@t"=t)=@t"=t=@uEM#;u EEE3E@}E#=@=tq;yE;nvv+[E3HHGEjjWW6 tWWW6 #ƒ;jEP6 ;vtj}uXEE;iWjWW6 JWWW6#;E%=u6Y$j^0u_=uWj6g ;E>WW6M Ej[+PD=P6E ;݃ AD$2M0 AD$M ʀ}u!Etȃ AD M#;u~Etxu@juEjPuE%Pu @;u4X@Pȃ AD 6XY6 AEUSSSSSjh@3}3u;;u聋j^0%Y39};t9}tE%@tʉ}uuu uEP\EEE;t誺3u9}t(9}t AD 6YËUjuuuuu !]ËU3SW9E]u蠊C} tVuM1yExuA+;Ar Zw Ar Zw MtDft?f;t8EPPEPPMt ftf;t+}^tMap_[ËU=LAVuy39Euu趉YcM t+Ar Zw Ar Zw Mt ftf;t+juu u^]ËU}u3]ËU MMtft f;u +]USVWUjjh@uD]_^[]ËL$At2D$H3vUhP(RP$R]D$T$SVWD$UPjh@d5@3PD$dD$(Xp t:|$,t;t$,v-4v L$ H |uhDID_뷋L$d _^[3d y@uQ R 9QuSQ@ SQ@L$ KCk UQPXY]Y[ËUQQE VuEEWVE Y;u螇 NjJuMQuP@E;uX@t P萇Yϋ AD0 EU_^jh@舶]܉]Eu5  Ëx; Ar 蕆ы< AL1tP1 YeD0tuuu uE܉U萆 蘆 ]܉]E E܋Uum YËU@hiYMAt I AI AAAAa]ËUEu 3]Åx; Ar 臅ދȃ AD@]ËUSVu 3W};u;v E;t3{E;tv|j^0 VuMtE9XfEf;v6;t;v WSV9 1*&8]tMap_^[;t&;w j"^0誄8]tE`pyE;t8]Jbz0BRz*DRl|$4FZhz@<@+@@i@`@@@P@HH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunHH:mm:ssdddd, MMMM dd, yyyyMM/dd/yyPMAMDecemberNovemberOctoberSeptemberAugustJulyJuneAprilMarchFebruaryJanuaryDecNovOctSepAugJulJunMayAprMarFebJanSaturdayFridayThursdayWednesdayTuesdayMondaySundaySatFriThuWedTueMonSunKERNEL32.DLLFlsFreeFlsSetValueFlsGetValueFlsAlloc  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~CorExitProcessmscoree.dllccsUTF-8UTF-16LEUNICODE(null)(null)EEE50P( 8PX700WP `h````xpxxxxruntime error TLOSS error SING error DOMAIN error R6033 - Attempt to use MSIL code from this assembly during native code initialization This indicates a bug in your application. It is most likely the result of calling an MSIL-compiled (/clr) function from a native constructor or from DllMain. R6032 - not enough space for locale information R6031 - Attempt to initialize the CRT more than once. This indicates a bug in your application. R6030 - CRT not initialized R6028 - unable to initialize heap R6027 - not enough space for lowio initialization R6026 - not enough space for stdio initialization R6025 - pure virtual function call R6024 - not enough space for _onexit/atexit table R6019 - unable to open console device R6018 - unexpected heap error R6017 - unexpected multithread lock error R6016 - not enough space for thread data R6010 - abort() has been called R6009 - not enough space for environment R6008 - not enough space for arguments R6002 - floating point support not loaded X@@ @ `@@@`@@@H@@h@@@@ @!@x@yx@z\@T@4@Microsoft Visual C++ Runtime Library ...<program name unknown>Runtime Error! Program:   ((((( H h(((( H H  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~EEE00P('8PW700PP (`h`hhhxppwppGetProcessWindowStationGetUserObjectInformationWGetLastActivePopupGetActiveWindowMessageBoxWUSER32.DLLCONOUT$._-rError: Failed to open input file! %S AC_INIT ( %S , %%s#define PACKAGE_VERSION "%s" Error: Version string could not be found! Dec 17 2017AC2VER [%s] Usage: %S%S @@@@@V!@j!@8@<@'@@RA@aA@C@ C@I@L@N@M@O@S@Mi@@@ޅ@@ˈ@ވ@@@l@@w@@H@@pp *>Jbz0BRz*DRl|$4FZhzEnterCriticalSection9LeaveCriticalSectionGetCommandLineWHeapSetInformationTerminateProcessGetCurrentProcessUnhandledExceptionFilterSetUnhandledExceptionFilterIsDebuggerPresentrGetCPInfoInterlockedIncrementInterlockedDecrementhGetACP7GetOEMCP IsValidCodePageTlsAllocTlsGetValueTlsSetValueTlsFreeGetModuleHandleWsSetLastErrorGetCurrentThreadIdGetLastErrorEGetProcAddressoSetHandleCountdGetStdHandleInitializeCriticalSectionAndSpinCountGetFileTypecGetStartupInfoWDeleteCriticalSectionSleepHeapFreeExitProcessRtlUnwindRCloseHandle%WriteFileGetModuleFileNameWaFreeEnvironmentStringsWGetEnvironmentStringsWHeapCreateQueryPerformanceCounterGetTickCountGetCurrentProcessIdyGetSystemTimeAsFileTimegMultiByteToWideCharWideCharToMultiByte-LCMapStringWiGetStringTypeWHeapAllocHeapReAlloc?LoadLibraryWGetConsoleCPGetConsoleModeWFlushFileBuffersCreateFileWfSetFilePointerReadFileSetStdHandleIsProcessorFeaturePresentHeapSize$WriteConsoleWSSetEndOfFileJGetProcessHeapKERNEL32.dll A AN@D        ! 5A CPR S WY l m pr   )     abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@`y!@~ڣ @ڣ AϢ[@~QQ^ _j21~C@@@@@@|@t@l@d@X@L@D@8@4@0@,@(@$@ @@@@@ @@@@@@$@@@@@@@@@@@x@l@ d@\@T@L@D@<@4@$@@@@@@@@@@@@@@x@p@h@`@X@H@4@(@@@@@@@@@@@@@\@H@$@$@$@$@$@(@@P@@(@@@ @@@@@@@@@@@@.. @ A A A A A A A A A$@ A A A A A A A(@@@. е@е@0 HX Z PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPAD00 1?1S1i11112$2L2*3c3k3334$4445)555555566#6*696E6R6v66666677&7J7y7Q889Y:`::: ;;; >>>>>? 060C0P0\0h0n0000000#1(1/15111111111111112 222&2+212;2D2O2[2`2p2u2{2222223333344K4g4446666==0tx666<8M8888888889!9+9>9b9999Q:n::&;E;;;;;<<<->+????@`070>0J0P0\0b0k0q0z000000000000 101p1v1111112z222220363L3Q3Y3_3f3l3s3y3333333333333333334 444!4&4-4<4A4G4P4p4v44n5555 66%6l6v66666+7=7k777777 888X8a8m8888888939<9c9p9u9999999^:f:y:::::::::: ;;;.;4;E;~;;;;;;7>A>S>j>x>~>>>>>>>>?[????PX111 2o222223/3@3M3T3d3v3{333B45$5<5W55556889999^:m::=>`|'0j0002444455 5555668L8V8n88889999 :R:j:t:::::::;2;O;;;6=s=======s??????p00R0m0r0000000 11 1(141]1e1p11*2\2t2{2222222233 33333 3j3p3t3x3|33344444=4g44444444445 5555}5556L7777M88/99y::5; ?2?D?V?h???????? 0000B0T0f01111s2y22223:3R33 444$4)4.434C4r4x44445 5555#515555)686G6T6Z666667 77>7C7H7_7H8M8_8}888 9k9:.:;G;;==>>>@?_??d.0V0001P1Z1J3354H4g4y4444477.8U8u888889:;;;u<<<<=!=?={==->>>??1F1233?4N44455Q666677778)8A8a88889>9k9v99999 :I:n:{::::;Z;};;;;;;;;;;;;;;<<<<#<^>??8s0y00000112 2{2233?3k344P5V5[5a5r555H 11111(1,1@1D1>>>>>>>>>? ???$?,?4?8>D>00(8(9,9094989<9@9D9H9L9P9T9X9\9`9d9h9l9p9t9x9|999999999999999999999999999999::: ::::: :$:(:,:0:4:8:<:@:D:H:L:P:T:X:\:`:d:h:l:p:t:x:|::::::;;(;L;X;\;`;d;h;t;<<<<<<=== ===(=,=0=4=8=<=@=D=H=L=X=\=`=d=h=l=p=t=x=|==>>