summaryrefslogtreecommitdiffstats
path: root/lib/rbcodec/codecs/libfaad
diff options
context:
space:
mode:
authorSean Bartell <wingedtachikoma@gmail.com>2011-06-25 21:32:25 -0400
committerNils Wallménius <nils@rockbox.org>2012-04-25 22:13:20 +0200
commitf40bfc9267b13b54e6379dfe7539447662879d24 (patch)
tree9b20069d5e62809ff434061ad730096836f916f2 /lib/rbcodec/codecs/libfaad
parenta0009907de7a0107d49040d8a180f140e2eff299 (diff)
downloadrockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.gz
rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.tar.bz2
rockbox-f40bfc9267b13b54e6379dfe7539447662879d24.zip
Add codecs to librbcodec.
Change-Id: Id7f4717d51ed02d67cb9f9cb3c0ada4a81843f97 Reviewed-on: http://gerrit.rockbox.org/137 Reviewed-by: Nils Wallménius <nils@rockbox.org> Tested-by: Nils Wallménius <nils@rockbox.org>
Diffstat (limited to 'lib/rbcodec/codecs/libfaad')
-rw-r--r--lib/rbcodec/codecs/libfaad/COPYING350
-rw-r--r--lib/rbcodec/codecs/libfaad/README122
-rw-r--r--lib/rbcodec/codecs/libfaad/README.rockbox19
-rw-r--r--lib/rbcodec/codecs/libfaad/SOURCES27
-rw-r--r--lib/rbcodec/codecs/libfaad/analysis.h49
-rw-r--r--lib/rbcodec/codecs/libfaad/bits.c208
-rw-r--r--lib/rbcodec/codecs/libfaad/bits.h381
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb.h142
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_1.h183
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_10.h309
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_11.h412
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_2.h182
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_3.h193
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_4.h196
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_5.h193
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_6.h179
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_7.h159
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_8.h170
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_9.h369
-rw-r--r--lib/rbcodec/codecs/libfaad/codebook/hcb_sf.h273
-rw-r--r--lib/rbcodec/codecs/libfaad/common.c440
-rw-r--r--lib/rbcodec/codecs/libfaad/common.h475
-rw-r--r--lib/rbcodec/codecs/libfaad/decoder.c1029
-rw-r--r--lib/rbcodec/codecs/libfaad/decoder.h112
-rw-r--r--lib/rbcodec/codecs/libfaad/drc.c168
-rw-r--r--lib/rbcodec/codecs/libfaad/drc.h45
-rw-r--r--lib/rbcodec/codecs/libfaad/drm_dec.c992
-rw-r--r--lib/rbcodec/codecs/libfaad/drm_dec.h98
-rw-r--r--lib/rbcodec/codecs/libfaad/error.c62
-rw-r--r--lib/rbcodec/codecs/libfaad/error.h41
-rw-r--r--lib/rbcodec/codecs/libfaad/faad_config.h120
-rw-r--r--lib/rbcodec/codecs/libfaad/filtbank.c482
-rw-r--r--lib/rbcodec/codecs/libfaad/filtbank.h54
-rw-r--r--lib/rbcodec/codecs/libfaad/fixed.h230
-rw-r--r--lib/rbcodec/codecs/libfaad/hcr.c409
-rw-r--r--lib/rbcodec/codecs/libfaad/huffman.c563
-rw-r--r--lib/rbcodec/codecs/libfaad/huffman.h44
-rw-r--r--lib/rbcodec/codecs/libfaad/ic_predict.c267
-rw-r--r--lib/rbcodec/codecs/libfaad/ic_predict.h249
-rw-r--r--lib/rbcodec/codecs/libfaad/iq_table.h16455
-rw-r--r--lib/rbcodec/codecs/libfaad/is.c108
-rw-r--r--lib/rbcodec/codecs/libfaad/is.h64
-rw-r--r--lib/rbcodec/codecs/libfaad/kbd_win.h2294
-rw-r--r--lib/rbcodec/codecs/libfaad/libfaad.make19
-rw-r--r--lib/rbcodec/codecs/libfaad/lt_predict.c215
-rw-r--r--lib/rbcodec/codecs/libfaad/lt_predict.h63
-rw-r--r--lib/rbcodec/codecs/libfaad/mp4.c300
-rw-r--r--lib/rbcodec/codecs/libfaad/mp4.h51
-rw-r--r--lib/rbcodec/codecs/libfaad/ms.c73
-rw-r--r--lib/rbcodec/codecs/libfaad/ms.h41
-rw-r--r--lib/rbcodec/codecs/libfaad/output.c557
-rw-r--r--lib/rbcodec/codecs/libfaad/output.h45
-rw-r--r--lib/rbcodec/codecs/libfaad/pns.c263
-rw-r--r--lib/rbcodec/codecs/libfaad/pns.h53
-rw-r--r--lib/rbcodec/codecs/libfaad/ps_dec.c1938
-rw-r--r--lib/rbcodec/codecs/libfaad/ps_dec.h162
-rw-r--r--lib/rbcodec/codecs/libfaad/ps_syntax.c546
-rw-r--r--lib/rbcodec/codecs/libfaad/ps_tables.h547
-rw-r--r--lib/rbcodec/codecs/libfaad/pulse.c56
-rw-r--r--lib/rbcodec/codecs/libfaad/pulse.h40
-rw-r--r--lib/rbcodec/codecs/libfaad/rvlc.c530
-rw-r--r--lib/rbcodec/codecs/libfaad/rvlc.h53
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_dct.c1990
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_dct.h49
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_dec.c597
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_dec.h242
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_e_nf.c507
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_e_nf.h47
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_fbt.c762
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_fbt.h52
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_hfadj.c1631
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_hfadj.h54
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_hfgen.c539
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_hfgen.h47
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_huff.c357
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_huff.h43
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_noise.h561
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_qmf.c561
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_qmf.h47
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_qmf_c.h172
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_syntax.c868
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_syntax.h64
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_tf_grid.c259
-rw-r--r--lib/rbcodec/codecs/libfaad/sbr_tf_grid.h44
-rw-r--r--lib/rbcodec/codecs/libfaad/sine_win.h4301
-rw-r--r--lib/rbcodec/codecs/libfaad/specrec.c1092
-rw-r--r--lib/rbcodec/codecs/libfaad/specrec.h46
-rw-r--r--lib/rbcodec/codecs/libfaad/structs.h473
-rw-r--r--lib/rbcodec/codecs/libfaad/syntax.c2368
-rw-r--r--lib/rbcodec/codecs/libfaad/syntax.h124
-rw-r--r--lib/rbcodec/codecs/libfaad/tns.c312
-rw-r--r--lib/rbcodec/codecs/libfaad/tns.h48
92 files changed, 52726 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/libfaad/COPYING b/lib/rbcodec/codecs/libfaad/COPYING
new file mode 100644
index 0000000000..920c4e6744
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/COPYING
@@ -0,0 +1,350 @@
+
+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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) 19yy <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) 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.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
diff --git a/lib/rbcodec/codecs/libfaad/README b/lib/rbcodec/codecs/libfaad/README
new file mode 100644
index 0000000000..a3a3d5a833
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/README
@@ -0,0 +1,122 @@
+
+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 M. Bakker (mbakker(at)nero.com), Ahead Software AG
+**
+** 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.
+**
+** Commercial non-GPL licensing of this software is also possible.
+** For more info contact Ahead Software 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!
+
+
+______
+PEOPLE
+
+FAAD2 is written by:
+ - M. Bakker (mbakker(at)nero.com).
+
+
+_______________
+VERSION HISTORY
+
+Sorry, try building a ChangeLog from CVS.
+
+__________________________________
+REDISTRIBUTED OPEN SOURCE PACKAGES
+
+This is the list of redistributed open source packages that are included
+in FAAD2:
+
+Name: mp4v2
+Version: 0.9.8.6
+Origin: http://www.mpeg4ip.net
+Author: David Mackie
+Directory: common/mp4v2
+License: MPL, Mozilla Public License, version 1.1
+
+Name: mp4av
+Version: 0.9.8.6
+Origin: http://www.mpeg4ip.net
+Author: David Mackie
+Directory: common/mp4av
+License: MPL, Mozilla Public License, version 1.1
+
+
+___________________
+DIRECTORY STRUCTURE
+
+faad2 - top level directory.
+
+ aacDECdrop - windows decoder/player with drag'n'drop functionality
+
+ common - generally used libraries and code.
+
+ faad - general common functions like filereading and streaming
+ as well as getting info from aac files.
+
+ mp4v2 - MPEG-4 file reading library.
+
+ mp4av - MPEG-4 file general function library.
+
+ mp4ff - Small MP4 file format library (includes tagging abilities).
+
+ CoreAAC - AAC DirectShow filter.
+
+ 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.
+
+ in_mp4 - winamp MPEG-4 AAC file input plugin.
+
+ QCD - Quintessential player AAC plugin.
+
+ QCDMp4 - Quintessential player MP4 plugin.
+
+ winamp - winamp2 AAC input plugin.
+
+ winamp3 - winamp3 AAC input plugin.
+
+ xmms - xmms AAC plugin
+
+ mpeg4ip - plugin for the mpeg4ip player
+
diff --git a/lib/rbcodec/codecs/libfaad/README.rockbox b/lib/rbcodec/codecs/libfaad/README.rockbox
new file mode 100644
index 0000000000..5b70f231ba
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/README.rockbox
@@ -0,0 +1,19 @@
+Library: libfaad (FAAD2)
+Imported: 2005-10-31 by Dave Chapman
+
+This directory contains the libfaad library from the FAAD2 project.
+
+LICENSING INFORMATION
+
+FAAD2 is licensed under the GNU General Public License and is
+Copyright (C) 2003 M. Bakker (mbakker(at)nero.com), Ahead Software AG
+
+IMPORT DETAILS
+
+The decoder is based on the CVS version of libfaad from 2 February 2005.
+
+A non GPL compatible clause was added to the license as part of the
+CVS commit on 2 February 2005 - so we are not able to use later
+versions of that project in Rockbox.
+
+
diff --git a/lib/rbcodec/codecs/libfaad/SOURCES b/lib/rbcodec/codecs/libfaad/SOURCES
new file mode 100644
index 0000000000..8447354fd3
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/SOURCES
@@ -0,0 +1,27 @@
+bits.c
+common.c
+decoder.c
+drc.c
+error.c
+filtbank.c
+huffman.c
+is.c
+mp4.c
+ms.c
+pns.c
+ps_dec.c
+ps_syntax.c
+pulse.c
+sbr_dct.c
+sbr_dec.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
+specrec.c
+syntax.c
+tns.c
diff --git a/lib/rbcodec/codecs/libfaad/analysis.h b/lib/rbcodec/codecs/libfaad/analysis.h
new file mode 100644
index 0000000000..f1c3da7a8f
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/analysis.h
@@ -0,0 +1,49 @@
+/*
+** 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$
+**/
+
+#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
diff --git a/lib/rbcodec/codecs/libfaad/bits.c b/lib/rbcodec/codecs/libfaad/bits.c
new file mode 100644
index 0000000000..a3640077d8
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/bits.c
@@ -0,0 +1,208 @@
+/*
+** 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$
+**/
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include "bits.h"
+
+/* Need to be large enough to fit the largest compressed sample in a file.
+ * Samples were observed to need up to 1500 bytes (400 kbps nero aac).
+ */
+#define BUFFER_SIZE 2048
+static uint8_t static_buffer[BUFFER_SIZE] IBSS_ATTR;
+
+/* 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;
+
+ memset(ld, 0, sizeof(bitfile));
+
+ if (buffer_size == 0 || _buffer == NULL || (buffer_size+12)>BUFFER_SIZE)
+ {
+ ld->error = 1;
+ ld->no_more_reading = 1;
+ return;
+ }
+
+ ld->buffer = &static_buffer;
+ memset(ld->buffer, 0, (buffer_size+12)*sizeof(uint8_t));
+ memcpy(ld->buffer, _buffer, buffer_size*sizeof(uint8_t));
+
+ ld->buffer_size = buffer_size;
+
+ tmp = getdword((uint32_t*)ld->buffer);
+ ld->bufa = tmp;
+
+ tmp = getdword((uint32_t*)ld->buffer + 1);
+ ld->bufb = tmp;
+
+ ld->start = (uint32_t*)ld->buffer;
+ ld->tail = ((uint32_t*)ld->buffer + 2);
+
+ ld->bits_left = 32;
+
+ ld->bytes_used = 0;
+ ld->no_more_reading = 0;
+ ld->error = 0;
+}
+
+void faad_endbits(bitfile *ld)
+{
+#if 0
+ if (ld)
+ {
+ if (ld->buffer)
+ {
+ faad_free(ld->buffer);
+ ld->buffer = NULL;
+ }
+ }
+#else
+ (void) ld;
+#endif
+}
+
+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)
+{
+ uint8_t remainder = (uint8_t)((32 - ld->bits_left) % 8);
+
+ if (remainder)
+ {
+ faad_flushbits(ld, 8 - remainder);
+ return (8 - remainder);
+ }
+ return 0;
+}
+
+/* rewind to beginning */
+/* not used
+void faad_rewindbits(bitfile *ld)
+{
+ uint32_t tmp;
+
+ tmp = ld->start[0];
+#ifndef ARCH_IS_BIG_ENDIAN
+ tmp = BSWAP(tmp);
+#endif
+ ld->bufa = tmp;
+
+ tmp = ld->start[1];
+#ifndef ARCH_IS_BIG_ENDIAN
+ tmp = BSWAP(tmp);
+#endif
+ ld->bufb = tmp;
+ ld->bits_left = 32;
+ ld->tail = &ld->start[2];
+ ld->bytes_used = 0;
+ ld->no_more_reading = 0;
+}
+*/
+
+#ifdef ERROR_RESILIENCE
+uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits
+ DEBUGDEC)
+{
+ uint16_t i;
+ uint8_t temp;
+ uint16_t bytes = (uint16_t)bits / 8;
+ uint8_t remainder = (uint8_t)bits % 8;
+
+ 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 = (uint8_t)faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder);
+
+ buffer[bytes] = temp;
+ }
+
+ return buffer;
+}
+#endif
+
+#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 */
+/* not used
+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_used = 0;
+ ld->no_more_reading = 0;
+ ld->error = 0;
+}
+*/
diff --git a/lib/rbcodec/codecs/libfaad/bits.h b/lib/rbcodec/codecs/libfaad/bits.h
new file mode 100644
index 0000000000..f9417b8670
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/bits.h
@@ -0,0 +1,381 @@
+/*
+** 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$
+**/
+
+#ifndef __BITS_H__
+#define __BITS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "analysis.h"
+#ifdef ANALYSIS
+#include <stdio.h>
+#endif
+
+#define BYTE_NUMBIT 8
+#define bit2byte(a) ((a+7)/BYTE_NUMBIT)
+
+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_used;
+ uint8_t no_more_reading;
+ uint8_t error;
+ uint32_t *tail;
+ uint32_t *start;
+ void *buffer;
+} bitfile;
+
+/* rockbox: use asm optimized swap32()
+#define BSWAP(a) \
+ ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff))
+*/
+#define BSWAP(a) swap32(a)
+
+static uint32_t 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
+};
+
+void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size);
+void faad_endbits(bitfile *ld);
+/* not used
+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_rewindbits(bitfile *ld);
+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
+
+static INLINE uint32_t getdword(void *mem)
+{
+#ifndef ARCH_IS_BIG_ENDIAN
+ return BSWAP(*(uint32_t*)mem);
+#else
+ return *(uint32_t*)mem;
+#endif
+}
+
+static INLINE void faad_flushbits_ex(bitfile *ld, uint32_t bits)
+{
+ uint32_t tmp;
+
+ ld->bufa = ld->bufb;
+ if (ld->no_more_reading == 0)
+ {
+ tmp = getdword(ld->tail);
+ ld->tail++;
+ } else {
+ tmp = 0;
+ }
+ ld->bufb = tmp;
+ ld->bits_left += (32 - bits);
+ ld->bytes_used += 4;
+ if (ld->bytes_used == ld->buffer_size)
+ ld->no_more_reading = 1;
+ if (ld->bytes_used > ld->buffer_size)
+ ld->error = 1;
+}
+
+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];
+ }
+
+ bits -= ld->bits_left;
+ return ((ld->bufa & bitmask[ld->bits_left]) << 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 uint32_t faad_getbits(bitfile *ld, uint32_t n DEBUGDEC)
+{
+ uint32_t ret;
+
+ if (ld->no_more_reading || 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);
+
+ ld->bytes_used += 4;
+ if (ld->bytes_used == ld->buffer_size)
+ ld->no_more_reading = 1;
+ if (ld->bytes_used > ld->buffer_size)
+ ld->error = 1;
+ }
+}
+
+static INLINE uint32_t faad_getbits_rev(bitfile *ld, uint32_t n
+ DEBUGDEC)
+{
+ uint32_t ret;
+
+ if (ld->no_more_reading)
+ return 0;
+
+ 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
+static uint8_t faad_check_CRC(bitfile *ld, uint16_t len)
+{
+ uint8_t CRC;
+ uint16_t 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 = (uint8_t) ~faad_getbits(ld, 8
+ DEBUGVAR(1,999,"faad_check_CRC(): CRC")); /* CRC is stored inverted */
+
+ for (; len>0; len--)
+ {
+ r = ( (r << 1) ^ (( ( faad_get1bit(ld
+ DEBUGVAR(1,998,"")) & 1) ^ ((r >> 7) & 1)) * GPOLY )) & 0xFF;
+ }
+
+ if (r != CRC)
+ {
+ return 8;
+ } 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
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb.h b/lib/rbcodec/codecs/libfaad/codebook/hcb.h
new file mode 100644
index 0000000000..eaefdbf437
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb.h
@@ -0,0 +1,142 @@
+/*
+** 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$
+**/
+
+#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
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_1.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_1.h
new file mode 100644
index 0000000000..88c04b6012
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_1.h
@@ -0,0 +1,183 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_10.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_10.h
new file mode 100644
index 0000000000..af48711460
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_10.h
@@ -0,0 +1,309 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_11.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_11.h
new file mode 100644
index 0000000000..49e97af23f
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_11.h
@@ -0,0 +1,412 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_2.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_2.h
new file mode 100644
index 0000000000..15e7d57084
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_2.h
@@ -0,0 +1,182 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_3.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_3.h
new file mode 100644
index 0000000000..3b12fdff60
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_3.h
@@ -0,0 +1,193 @@
+/*
+** 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$
+**/
+
+/* Binary search huffman table HCB_3 */
+
+
+static hcb_bin_quad hcb3[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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 */
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_4.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_4.h
new file mode 100644
index 0000000000..67397e1fb0
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_4.h
@@ -0,0 +1,196 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ /* 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 },
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_5.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_5.h
new file mode 100644
index 0000000000..0143482901
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_5.h
@@ -0,0 +1,193 @@
+/*
+** 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$
+**/
+
+/* Binary search huffman table HCB_5 */
+
+
+static hcb_bin_pair hcb5[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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 } }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_6.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_6.h
new file mode 100644
index 0000000000..9988133552
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_6.h
@@ -0,0 +1,179 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR = {
+ /* 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[] ICONST_ATTR = {
+ /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_7.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_7.h
new file mode 100644
index 0000000000..3b378dc5cd
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_7.h
@@ -0,0 +1,159 @@
+/*
+** 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$
+**/
+
+/* Binary search huffman table HCB_7 */
+
+
+static hcb_bin_pair hcb7[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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 } }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_8.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_8.h
new file mode 100644
index 0000000000..b76eb8f667
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_8.h
@@ -0,0 +1,170 @@
+/*
+** 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$
+**/
+
+/* 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[] ICONST_ATTR = {
+ /* 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[] ICONST_ATTR = {
+ /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_9.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_9.h
new file mode 100644
index 0000000000..2932001294
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_9.h
@@ -0,0 +1,369 @@
+/*
+** 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$
+**/
+
+/* Binary search huffman table HCB_9 */
+
+
+static hcb_bin_pair hcb9[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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 } }
+};
diff --git a/lib/rbcodec/codecs/libfaad/codebook/hcb_sf.h b/lib/rbcodec/codecs/libfaad/codebook/hcb_sf.h
new file mode 100644
index 0000000000..66762e2fce
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/codebook/hcb_sf.h
@@ -0,0 +1,273 @@
+/*
+** 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$
+**/
+
+/* Binary search huffman table HCB_SF */
+
+
+static uint8_t hcb_sf[][2] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ { /* 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 }
+};
diff --git a/lib/rbcodec/codecs/libfaad/common.c b/lib/rbcodec/codecs/libfaad/common.c
new file mode 100644
index 0000000000..bedf56a212
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/common.c
@@ -0,0 +1,440 @@
+/*
+** 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$
+**/
+
+/* just some common functions that could be used anywhere */
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#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;
+}
+
+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 random_int(void)
+{
+ 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 );
+}
+
+#define floor_log2(x) bs_generic(x, BS_LOG2)
+
+#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[] ICONST_ATTR = {
+ 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[] ICONST_ATTR_FAAD_LARGE_IRAM = {
+ 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)
+};
+
+uint32_t pow2_fix(real_t val)
+{
+ uint32_t x1, x2;
+ uint32_t errcorr;
+ uint32_t index_frac;
+ uint32_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)) & ((1<<TABLE_BITS)-1);
+
+
+ if (val == 0)
+ return (1<<REAL_BITS);
+
+ /* leave INTERP_BITS bits */
+ index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS);
+ index_frac = index_frac & ((1<<INTERP_BITS)-1);
+
+ if (whole >= 0)
+ retval = REAL_CONST(1) << whole;
+ else
+ retval = REAL_CONST(1) >> -whole;
+
+ x1 = pow2_tab[index ];
+ x2 = pow2_tab[index + 1];
+ errcorr = (index_frac*(x2-x1)) >> INTERP_BITS;
+
+ retval = MUL_R(retval, (errcorr + x1));
+
+ return retval;
+}
+
+uint32_t pow2_int(real_t val)
+{
+ uint32_t x1, x2;
+ uint32_t errcorr;
+ uint32_t index_frac;
+ uint32_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)) & ((1<<TABLE_BITS)-1);
+
+
+ if (val == 0)
+ return 1;
+
+ /* leave INTERP_BITS bits */
+ index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS);
+ index_frac = index_frac & ((1<<INTERP_BITS)-1);
+
+ if (whole >= 0)
+ retval = 1 << whole;
+ else
+ retval = 1 >> -whole;
+
+ x1 = pow2_tab[index ];
+ x2 = pow2_tab[index + 1];
+ errcorr = (index_frac*(x2-x1)) >> 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;
+ 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<<TABLE_BITS)-1)];
+ x2 = log2_tab[(index & ((1<<TABLE_BITS)-1)) + 1];
+
+ /* linear interpolation */
+ /* retval = exp + ((index_frac)*x2 + (1-index_frac)*x1) */
+
+ errcorr = (index_frac * (x2-x1)) >> 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;
+ 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<<TABLE_BITS)-1)];
+ x2 = log2_tab[(index & ((1<<TABLE_BITS)-1)) + 1];
+
+ /* linear interpolation */
+ /* retval = exp + ((index_frac)*x2 + (1-index_frac)*x1) */
+
+ errcorr = (index_frac * (x2-x1)) >> INTERP_BITS;
+
+ return (exp << REAL_BITS) + errcorr + x1;
+}
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/common.h b/lib/rbcodec/codecs/libfaad/common.h
new file mode 100644
index 0000000000..720042b4aa
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/common.h
@@ -0,0 +1,475 @@
+/*
+** 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$
+**/
+
+#ifndef __COMMON_H__
+#define __COMMON_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "faad_config.h"
+#include "codeclib.h"
+
+extern struct codec_api* ci;
+
+#if defined(DEBUG) || defined(SIMULATOR)
+#undef DEBUGF
+#define DEBUGF ci->debugf
+#else
+#define DEBUGF(...)
+#endif
+
+#ifdef ROCKBOX_HAS_LOGF
+#undef LOGF
+#define LOGF ci->logf
+#else
+#define LOGF(...)
+#endif
+
+#if (CONFIG_CPU == MCF5250)
+/* Enough IRAM but performance suffers with ICODE_ATTR. */
+#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR
+#define ICODE_ATTR_FAAD_LARGE_IRAM
+#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR
+#define IBSS_ATTR_FAAD_XLR
+
+#elif (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024)
+/* Enough IRAM to move additional data and code to it. */
+#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR
+#define ICODE_ATTR_FAAD_LARGE_IRAM ICODE_ATTR
+#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR
+#define IBSS_ATTR_FAAD_XLR
+
+#elif defined(CPU_S5L870X)
+/* Very large IRAM. Move even more data to it. */
+#define IBSS_ATTR_FAAD_LARGE_IRAM IBSS_ATTR
+#define ICODE_ATTR_FAAD_LARGE_IRAM ICODE_ATTR
+#define ICONST_ATTR_FAAD_LARGE_IRAM ICONST_ATTR
+#define IBSS_ATTR_FAAD_XLR IBSS_ATTR
+#define HAVE_FAAD_XLR_IN_IRAM
+
+#else
+/* Not enough IRAM available. */
+#define IBSS_ATTR_FAAD_LARGE_IRAM
+#define ICODE_ATTR_FAAD_LARGE_IRAM
+#define ICONST_ATTR_FAAD_LARGE_IRAM
+#define IBSS_ATTR_FAAD_XLR
+#endif
+
+/* Used to allocate several SBR + PS arrays and variables statically. */
+//#define FAAD_STATIC_ALLOC
+
+#define INLINE __inline
+#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 /* BIG_IQ_TABLE results in faster requantization */
+
+/* Use if target platform has address generators with autoincrement */
+//#define PREFER_POINTERS
+
+#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 scalable profiles */
+//#define SCALABLE_DEC
+/* Allow decoding of Digital Radio Mondiale (DRM) */
+//#define DRM
+//#define DRM_PS
+
+/* 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 ALLOW_SMALL_FRAMELENGTH
+ #undef ERROR_RESILIENCE
+#endif
+
+#if CODEC_SIZE >= 0x80000
+#define SBR_DEC
+//#define SBR_LOW_POWER /* Does not work yet in rockbox. */
+#define PS_DEC
+#endif
+
+/* FIXED POINT: No MAIN decoding */
+#ifdef FIXED_POINT
+# ifdef MAIN_DEC
+# undef MAIN_DEC
+# endif
+#endif // FIXED_POINT
+
+#ifdef DRM
+# ifndef SCALABLE_DEC
+# define SCALABLE_DEC
+# endif
+#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)
+#define DIV_Q(A, B) (((int64_t)A << Q2_BITS )/B)
+#else
+#define DIV_R(A, B) ((A)/(B))
+#define DIV_C(A, B) ((A)/(B))
+#define DIV_Q(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 <stdlib.h>
+
+typedef unsigned __int64 uint64_t;
+typedef unsigned __int32 uint32_t;
+typedef unsigned __int16 uint16_t;
+typedef unsigned __int8 uint8_t;
+typedef __int64 int64_t;
+typedef __int32 int32_t;
+typedef __int16 int16_t;
+typedef __int8 int8_t;
+typedef float float32_t;
+
+
+#else
+
+#include <stdio.h>
+#ifdef HAVE_SYS_TYPES_H
+# include "inttypes.h"
+#endif
+#ifdef HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#ifdef HAVE_STRING_H
+# if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
+# include <memory.h>
+# endif
+//# include <string.h>
+#endif
+#ifdef HAVE_STRINGS_H
+//# include <strings.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# ifdef HAVE_STDINT_H
+# include <stdint.h>
+# else
+/* we need these... */
+typedef unsigned long long uint64_t;
+typedef unsigned long uint32_t;
+typedef unsigned short uint16_t;
+typedef unsigned char uint8_t;
+typedef long long int64_t;
+typedef long int32_t;
+typedef short int16_t;
+typedef char int8_t;
+# endif
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifndef HAVE_FLOAT32_T
+typedef float float32_t;
+#endif
+
+#if STDC_HEADERS
+//# include <string.h>
+#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 <math.h>
+
+ #define MUL_R(A,B) ((A)*(B))
+ #define MUL_C(A,B) ((A)*(B))
+ #define MUL_F(A,B) ((A)*(B))
+ #define MUL_Q2(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 MUL_Q2(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);
+ }
+
+/* rockbox: must be commented to build for non-FP
+ #if defined(_WIN32) && !defined(__MINGW32__)
+ #define HAS_LRINTF
+ static INLINE int lrintf(float f)
+ {
+ int i;
+ __asm
+ {
+ fld f
+ fistp i
+ }
+ return i;
+ }
+ #elif (defined(__i386__) && defined(__GNUC__))
+ #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
+*/
+
+ #ifdef __ICL /* only Intel C compiler has fmath ??? */
+
+ #include <mathf.h>
+
+ #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 <math.h>
+
+#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 random_int(void);
+#define wl_min_lzc(x) bs_generic(x, BS_LOG2|BS_0_0)
+#ifdef FIXED_POINT
+#define LOG2_MIN_INF REAL_CONST(-10000)
+int32_t log2_int(uint32_t val);
+int32_t log2_fix(uint32_t val);
+uint32_t pow2_int(real_t val);
+uint32_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);
+
+#ifndef FAAD_STATIC_ALLOC
+/* Those should not be defined or used anymore */
+#define faad_malloc(A) malloc(A)
+#define faad_free(A) free(A)
+#endif
+
+//#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
diff --git a/lib/rbcodec/codecs/libfaad/decoder.c b/lib/rbcodec/codecs/libfaad/decoder.c
new file mode 100644
index 0000000000..d68d093b0b
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/decoder.c
@@ -0,0 +1,1029 @@
+/*
+** 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$
+**/
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "decoder.h"
+#include "mp4.h"
+#include "syntax.h"
+#include "error.h"
+/* rockbox: not used
+#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
+
+/* Globals */
+#ifdef ANALYSIS
+uint16_t dbg_count;
+#endif
+
+/* static variables */
+static NeAACDecStruct s_AACDec;
+static real_t s_fb_intermed [MAX_CHANNELS][1*FRAME_LEN] IBSS_ATTR_FAAD_LARGE_IRAM MEM_ALIGN_ATTR;
+static real_t s_time_buf_1024[MAX_CHANNELS][1*FRAME_LEN] IBSS_ATTR_FAAD_LARGE_IRAM MEM_ALIGN_ATTR;
+#ifdef SBR_DEC
+#ifdef FAAD_STATIC_ALLOC
+static real_t s_time_buf_2048[MAX_CHANNELS][2*FRAME_LEN] MEM_ALIGN_ATTR;
+#endif
+#endif
+#ifdef SSR_DEC
+static real_t s_ssr_overlap [MAX_CHANNELS][2*FRAME_LEN] MEM_ALIGN_ATTR;
+static real_t s_prev_fmd [MAX_CHANNELS][2*FRAME_LEN] MEM_ALIGN_ATTR;
+#endif
+#ifdef MAIN_DEC
+static pred_state s_pred_stat[MAX_CHANNELS][1*FRAME_LEN] MEM_ALIGN_ATTR;
+#endif
+#ifdef LTP_DEC
+static int16_t s_lt_pred_stat[MAX_CHANNELS][4*FRAME_LEN] MEM_ALIGN_ATTR;
+#endif
+
+
+/* static function declarations */
+static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo,
+ uint8_t *buffer, uint32_t buffer_size);
+/* not used by rockbox
+static void create_channel_config(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo);
+*/
+
+char* NEAACDECAPI NeAACDecGetErrorMessage(uint8_t errcode)
+{
+ if (errcode >= NUM_ERROR_MESSAGES)
+ return NULL;
+ return err_msg[errcode];
+}
+
+/* rockbox: not used */
+#if 0
+uint32_t NEAACDECAPI 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;
+}
+#endif
+
+NeAACDecHandle NEAACDECAPI NeAACDecOpen(void)
+{
+ uint8_t i;
+ NeAACDecHandle hDecoder = NULL;
+
+ #if defined(CPU_COLDFIRE)
+ coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
+ #endif
+
+ hDecoder = &s_AACDec;
+
+ memset(hDecoder , 0, sizeof(NeAACDecStruct));
+ memset(s_fb_intermed, 0, sizeof(s_fb_intermed));
+#ifdef SSR_DEC
+ memset(s_ssr_overlap, 0, sizeof(s_ssr_overlap));
+ memset(s_prev_fmd , 0, sizeof(s_prev_fmd));
+#endif
+#ifdef LTP_DEC
+ memset(s_lt_pred_stat, 0, sizeof(s_s_lt_pred_statpred_stat));
+#endif
+
+ hDecoder->config.outputFormat = FAAD_FMT_16BIT;
+ hDecoder->config.defObjectType = MAIN;
+ hDecoder->config.defSampleRate = 44100;
+ hDecoder->config.downMatrix = 0;
+ hDecoder->adts_header_present = 0;
+ hDecoder->adif_header_present = 0;
+#ifdef ERROR_RESILIENCE
+ hDecoder->aacSectionDataResilienceFlag = 0;
+ hDecoder->aacScalefactorDataResilienceFlag = 0;
+ hDecoder->aacSpectralDataResilienceFlag = 0;
+#endif
+ hDecoder->frameLength = FRAME_LEN;
+
+ hDecoder->frame = 0;
+
+ for (i = 0; i < MAX_CHANNELS; i++)
+ {
+ hDecoder->window_shape_prev[i] = 0;
+ hDecoder->time_out[i] = NULL;
+ hDecoder->fb_intermed[i] = s_fb_intermed[i];
+#ifdef SSR_DEC
+ hDecoder->ssr_overlap[i] = s_ssr_overlap[i];
+ hDecoder->prev_fmd[i] = s_prev_fmd[i];
+ for (int k = 0; k < 2048; k++)
+ hDecoder->prev_fmd[i][k] = REAL_CONST(-1);
+#endif
+#ifdef MAIN_DEC
+ hDecoder->pred_stat[i] = s_pred_stat[i];
+ reset_all_predictors(hDecoder->pred_stat[channel], FRAME_LEN);
+#endif
+#ifdef LTP_DEC
+ hDecoder->ltp_lag[i] = 0;
+ hDecoder->lt_pred_stat[i] = s_lt_pred_stat[i];
+#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 NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder)
+{
+ if (hDecoder)
+ {
+ NeAACDecConfigurationPtr config = &(hDecoder->config);
+
+ return config;
+ }
+
+ return NULL;
+}
+
+uint8_t NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder,
+ NeAACDecConfigurationPtr config)
+{
+ 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;
+}
+
+int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer,
+ uint32_t buffer_size,
+ uint32_t *samplerate, uint8_t *channels)
+{
+ uint32_t i;
+ uint32_t bits = 0;
+ bitfile ld;
+ adif_header adif;
+ adts_header adts;
+
+ 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)
+ {
+ faad_initbits(&ld, buffer, buffer_size);
+
+ /* 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);
+ }
+ hDecoder->channelConfiguration = *channels;
+
+#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
+
+ /* A maximum of MAX_CHANNELS channels is supported. */
+ if (*channels > MAX_CHANNELS)
+ {
+ return -1;
+ }
+
+#ifdef SBR_DEC
+ /* implicit signalling */
+ if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR))
+ {
+ *samplerate *= 2;
+ hDecoder->forceUpSampling = 1;
+ } else if (*samplerate > 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) {
+ 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
+
+
+#ifdef LD_DEC
+ if (hDecoder->object_type == LD)
+ hDecoder->frameLength >>= 1;
+#endif
+
+ for (i=0; i<MAX_CHANNELS; ++i)
+ {
+#ifdef SBR_DEC
+ hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0;
+ if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
+ {
+#ifdef FAAD_STATIC_ALLOC
+ hDecoder->time_out[i] = s_time_buf_2048[i];
+#else
+ hDecoder->time_out[i] = (real_t*)faad_malloc(2*FRAME_LEN*sizeof(real_t));
+ if (hDecoder->time_out[i] == NULL)
+ {
+ /* could not allocate memory */
+ return -1;
+ }
+#endif
+ memset(hDecoder->time_out[i], 0, 2*FRAME_LEN);
+ hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1;
+ }
+ else
+#endif
+ {
+ hDecoder->time_out[i] = s_time_buf_1024[i];
+ memset(hDecoder->time_out[i], 0, 1*FRAME_LEN);
+ }
+ }
+
+ if (can_decode_ot(hDecoder->object_type) < 0)
+ return -1;
+
+ return bits;
+}
+
+/* Init the library using a DecoderSpecificInfo */
+int8_t NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer,
+ uint32_t SizeOfDecoderSpecificInfo,
+ uint32_t *samplerate, uint8_t *channels)
+{
+ int8_t rc;
+ uint32_t i;
+ 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));
+
+ /* 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
+
+ /* A maximum of MAX_CHANNELS channels is supported. */
+ if (*channels > MAX_CHANNELS)
+ {
+ return -1;
+ }
+
+ 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
+
+#ifdef LD_DEC
+ if (hDecoder->object_type == LD)
+ hDecoder->frameLength >>= 1;
+#endif
+
+ for (i=0; i<MAX_CHANNELS; ++i)
+ {
+#ifdef SBR_DEC
+ hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0;
+ if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1))
+ {
+#ifdef FAAD_STATIC_ALLOC
+ hDecoder->time_out[i] = s_time_buf_2048[i];
+#else
+ hDecoder->time_out[i] = (real_t*)faad_malloc(2*FRAME_LEN*sizeof(real_t));
+ if (hDecoder->time_out[i] == NULL)
+ {
+ /* could not allocate memory */
+ return -1;
+ }
+#endif
+ memset(hDecoder->time_out[i], 0, 2*FRAME_LEN);
+ hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1;
+ }
+ else
+#endif
+ {
+ hDecoder->time_out[i] = s_time_buf_1024[i];
+ memset(hDecoder->time_out[i], 0, 1*FRAME_LEN);
+ }
+ }
+
+ return 0;
+}
+
+#ifdef DRM
+int8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate,
+ uint8_t channels)
+{
+ if (hDecoder == NULL)
+ return 1; /* error */
+
+ *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
+
+
+ return 0;
+}
+#endif
+
+void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame)
+{
+ if (hDecoder)
+ {
+ hDecoder->postSeekResetFlag = 1;
+
+ if (frame != -1)
+ hDecoder->frame = frame;
+ }
+}
+
+/* not used by rockbox */
+#if 0
+static void create_channel_config(NeAACDecHandle 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)
+ {
+ hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER;
+ chdir--;
+ }
+ 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:
+ hInfo->num_front_channels = 1;
+ hInfo->channel_position[0] = FRONT_CHANNEL_CENTER;
+ 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;
+ }
+ }
+}
+#endif
+
+void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder,
+ NeAACDecFrameInfo *hInfo,
+ uint8_t *buffer, uint32_t buffer_size)
+{
+ return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size);
+}
+
+static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo,
+ uint8_t *buffer, uint32_t buffer_size)
+{
+ uint8_t channels = 0;
+ uint8_t output_channels = 0;
+ bitfile ld;
+ uint32_t bitsconsumed;
+ uint16_t frame_len;
+
+#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]));
+
+ /* 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
+
+#ifdef DRM
+ if (hDecoder->object_type == DRM_ER_LC)
+ {
+ /* We do not support stereo right now */
+ if (0) //(hDecoder->channelConfiguration == 2)
+ {
+ hInfo->error = 8; // 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 SCALABLE_DEC
+ if ((hDecoder->object_type == 6) || (hDecoder->object_type == DRM_ER_LC))
+ {
+ aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc);
+ } else {
+#endif
+ raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc);
+#ifdef SCALABLE_DEC
+ }
+#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 (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 */
+ /* not used by rockbox
+ 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 (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->alloced_channels != output_channels)
+ {
+ hDecoder->alloced_channels = output_channels;
+ }
+
+#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
+
+ 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 hDecoder; /* return void* != NULL */
+
+error:
+
+ faad_endbits(&ld);
+
+ /* cleanup */
+#ifdef ANALYSIS
+ fflush(stdout);
+#endif
+
+ return NULL;
+}
diff --git a/lib/rbcodec/codecs/libfaad/decoder.h b/lib/rbcodec/codecs/libfaad/decoder.h
new file mode 100644
index 0000000000..f5c477e186
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/decoder.h
@@ -0,0 +1,112 @@
+/*
+** 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$
+**/
+
+#ifndef __DECODER_H__
+#define __DECODER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _WIN32
+ #pragma pack(push, 8)
+ #ifndef NEAACDECAPI
+ #define NEAACDECAPI __cdecl
+ #endif
+#else
+ #ifndef NEAACDECAPI
+ #define NEAACDECAPI
+ #endif
+#endif
+
+
+/* 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
+
+#define LC_DEC_CAP (1<<0)
+#define MAIN_DEC_CAP (1<<1)
+#define LTP_DEC_CAP (1<<2)
+#define LD_DEC_CAP (1<<3)
+#define ERROR_RESILIENCE_CAP (1<<4)
+#define FIXED_POINT_CAP (1<<5)
+
+#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)
+
+char* NEAACDECAPI NeAACDecGetErrorMessage(uint8_t errcode);
+
+NeAACDecHandle NEAACDECAPI NeAACDecOpen(void);
+
+NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder);
+
+uint8_t NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder,
+ NeAACDecConfigurationPtr config);
+
+/* Init the library based on info from the AAC file (ADTS/ADIF) */
+int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder,
+ uint8_t *buffer,
+ uint32_t buffer_size,
+ uint32_t *samplerate,
+ uint8_t *channels);
+
+/* Init the library using a DecoderSpecificInfo */
+int8_t NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, uint8_t *pBuffer,
+ uint32_t SizeOfDecoderSpecificInfo,
+ uint32_t *samplerate, uint8_t *channels);
+
+/* Init the library for DRM */
+int8_t NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, uint32_t samplerate,
+ uint8_t channels);
+
+void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, int32_t frame);
+
+void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder,
+ NeAACDecFrameInfo *hInfo,
+ uint8_t *buffer,
+ uint32_t buffer_size);
+
+#ifdef _WIN32
+ #pragma pack(pop)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/drc.c b/lib/rbcodec/codecs/libfaad/drc.c
new file mode 100644
index 0000000000..6e081489aa
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/drc.c
@@ -0,0 +1,168 @@
+/*
+** 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$
+**/
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include "syntax.h"
+#include "drc.h"
+
+/* static variables */
+static drc_info s_drc_info;
+
+drc_info *drc_init(real_t cut, real_t boost)
+{
+ drc_info *drc = &s_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;
+}
+
+#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;
+ }
+}
diff --git a/lib/rbcodec/codecs/libfaad/drc.h b/lib/rbcodec/codecs/libfaad/drc.h
new file mode 100644
index 0000000000..38037a1a12
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/drc.h
@@ -0,0 +1,45 @@
+/*
+** 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$
+**/
+
+#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_decode(drc_info *drc, real_t *spec);
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/drm_dec.c b/lib/rbcodec/codecs/libfaad/drm_dec.c
new file mode 100644
index 0000000000..f0b0f01f2b
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/drm_dec.c
@@ -0,0 +1,992 @@
+/*
+** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR and PS 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$
+**/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#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 definitions */
+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][2] =
+{
+ { 0, 0},
+ { 1, 1},
+ { 2, 2},
+ { 3, 3},
+ { 5, 5},
+ { 7, 7},
+ {10,10},
+ {13,13},
+ {46,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[][2] =
+{
+ { 1, 3 }, { 2, 4 }, { 3, 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[2] =
+{
+ FRAC_CONST(0.58664621951003), FRAC_CONST(0.76592833836465)
+};
+
+static const real_t smooth_coeff[2] =
+{
+ FRAC_CONST(0.6), 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 variables */
+static drm_ps_info s_drm_ps_info;
+
+/* 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)
+ {
+ for (band = 0; band < DRM_NUM_SA_BANDS; band++)
+ {
+ ps->g_prev_sa_index[band] = 0;
+ }
+ }
+ if (ps->bs_sa_dt_flag)
+ {
+ ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]);
+
+ } else {
+ 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_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]);
+ } else {
+ 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)
+ {
+/* The DRM PS spec doesn't say anything about this case. (deltacoded in time without a previous frame)
+ AAC PS spec you must tread previous frame as 0, so that's what we try.
+*/
+ for (band = 0; band < DRM_NUM_PAN_BANDS; band++)
+ {
+ ps->g_prev_pan_index[band] = 0;
+ }
+ }
+
+ 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_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]);
+ } else {
+ 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[MAX_NTSRPS][64], uint8_t rateselect)
+{
+ 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][rateselect]; 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[rateselect]);
+ 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[rateselect]);
+ ps->prev_peakdiff[b] = peakdiff;
+
+ nrg = ps->prev_nrg[b];
+ nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff[rateselect]);
+ 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][rateselect])
+ 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, uint8_t rateselect,
+ qmf_t X_left[MAX_NTSRPS][64],
+ qmf_t X_right[MAX_NTSRPS][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][rateselect]; 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][rateselect]; 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][rateselect]; 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, uint8_t rateselect,
+ qmf_t X_left[MAX_NTSRPS][64],
+ qmf_t X_right[MAX_NTSRPS][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 = &s_drm_ps_info;
+ memset(ps, 0, sizeof(drm_ps_info));
+
+ return ps;
+}
+
+/* main DRM PS decoding function */
+uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate,
+ qmf_t X_left[MAX_NTSRPS][64],
+ qmf_t X_right[MAX_NTSRPS][64])
+{
+ uint8_t rateselect = (samplerate >= 24000);
+
+ 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, rateselect);
+ drm_add_ambiance(ps, rateselect, 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, rateselect, 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
diff --git a/lib/rbcodec/codecs/libfaad/drm_dec.h b/lib/rbcodec/codecs/libfaad/drm_dec.h
new file mode 100644
index 0000000000..d7ae9d0166
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/drm_dec.h
@@ -0,0 +1,98 @@
+/*
+** 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$
+**/
+
+#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);
+
+uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, uint32_t samplerate,
+ qmf_t X_left[MAX_NTSRPS][64],
+ qmf_t X_right[MAX_NTSRPS][64]);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
+
diff --git a/lib/rbcodec/codecs/libfaad/error.c b/lib/rbcodec/codecs/libfaad/error.c
new file mode 100644
index 0000000000..ff2f9c3d13
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/error.c
@@ -0,0 +1,62 @@
+/*
+** 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$
+**/
+
+#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",
+ "Could not allocate enough memory"
+};
+
diff --git a/lib/rbcodec/codecs/libfaad/error.h b/lib/rbcodec/codecs/libfaad/error.h
new file mode 100644
index 0000000000..94ca7bba75
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/error.h
@@ -0,0 +1,41 @@
+/*
+** 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$
+**/
+
+#ifndef __ERROR_H__
+#define __ERROR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NUM_ERROR_MESSAGES 28
+extern char *err_msg[];
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/faad_config.h b/lib/rbcodec/codecs/libfaad/faad_config.h
new file mode 100644
index 0000000000..163b55669e
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/faad_config.h
@@ -0,0 +1,120 @@
+/* config.h. Generated by configure. */
+/* config.h.in. Generated from configure.in by autoheader. */
+
+#include <config.h>
+
+/* Define if you want to use libfaad together with Digital Radio Mondiale
+ (DRM) */
+/* #undef DRM */
+
+/* Define if you want support for Digital Radio Mondiale (DRM) parametric
+ stereo */
+/* #undef DRM_PS */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+//#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <errno.h> header file. */
+//#define HAVE_ERRNO_H 1
+
+/* Define if needed */
+/* #undef HAVE_FLOAT32_T */
+
+/* Define to 1 if you have the <float.h> header file. */
+//#define HAVE_FLOAT_H 1
+
+/* Define to 1 if you have the `getpwuid' function. */
+#define HAVE_GETPWUID 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define if you have the IOKit API */
+/* #undef HAVE_IOKIT_IOKITLIB_H */
+
+/* Define to 1 if you have the <limits.h> header file. */
+//#define HAVE_LIMITS_H 1
+
+/* Define to 1 if you have the <mathf.h> header file. */
+/* #undef HAVE_MATHF_H */
+
+/* Define to 1 if you have the `memcpy' function. */
+#define HAVE_MEMCPY 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+//#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+//#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strchr' function. */
+#define HAVE_STRCHR 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+//#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strsep' function. */
+//#define HAVE_STRSEP 1
+
+/* Define to 1 if you have the <sysfs/libsysfs.h> header file. */
+/* #undef HAVE_SYSFS_LIBSYSFS_H */
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+//#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+//#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+//#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+//#define HAVE_UNISTD_H 1
+
+/* Name of package */
+#define PACKAGE "faad2"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME ""
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING ""
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION ""
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+//#define TIME_WITH_SYS_TIME 1
+
+/* Version number of package */
+#define LIBFAAD_VERSION "2.0"
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#ifdef ROCKBOX_BIG_ENDIAN
+#define WORDS_BIGENDIAN 1
+#endif
+
+/* Define to `__inline__' or `__inline' if that's what the C compiler
+ calls it, or to nothing if 'inline' is not supported under any name. */
+#ifndef __cplusplus
+/* #undef inline */
+#endif
+
+/* Define to `long' if <sys/types.h> does not define. */
+/* #undef off_t */
diff --git a/lib/rbcodec/codecs/libfaad/filtbank.c b/lib/rbcodec/codecs/libfaad/filtbank.c
new file mode 100644
index 0000000000..fd7a4dc91f
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/filtbank.c
@@ -0,0 +1,482 @@
+/*
+** 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$
+**/
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#include <string.h>
+#ifdef _WIN32_WCE
+#define assert(x)
+#else
+#include <assert.h>
+#endif
+
+#include "filtbank.h"
+#include "decoder.h"
+#include "syntax.h"
+#include "kbd_win.h"
+#include "sine_win.h"
+
+
+/* static variables */
+static real_t transf_buf[2*FRAME_LEN] IBSS_ATTR MEM_ALIGN_ATTR;
+#ifdef LTP_DEC
+static real_t windowed_buf[2*FRAME_LEN] MEM_ALIGN_ATTR = {0};
+#endif
+
+
+/*Windowing functions borrowed from libwmai*/
+#ifdef CPU_ARM
+static inline
+void vector_fmul_add_add(real_t *dst, const real_t *src0, const real_t *src1, const real_t *src2, int len)
+{
+ /* Block sizes are always power of two */
+ asm volatile (
+ "0:"
+ "ldmia %[d]!, {r0, r1};"
+ "ldmia %[w]!, {r4, r5};"
+ /* consume the first data and window value so we can use those
+ * registers again */
+ "smull r8, r9, r0, r4;"
+ "ldmia %[src2]!, {r0, r4};"
+ "add r0, r0, r9, lsl #1;" /* *dst=*dst+(r9<<1)*/
+ "smull r8, r9, r1, r5;"
+ "add r1, r4, r9, lsl #1;"
+ "stmia %[dst]!, {r0, r1};"
+ "subs %[n], %[n], #2;"
+ "bne 0b;"
+ : [d] "+r" (src0), [w] "+r" (src1), [src2] "+r" (src2), [dst] "+r" (dst), [n] "+r" (len)
+ :
+ : "r0", "r1", "r4", "r5", "r8", "r9", "memory", "cc");
+}
+static inline
+void vector_fmul_reverse(real_t *dst, const real_t *src0, const real_t *src1,
+ int len)
+{
+ /* Block sizes are always power of two */
+ asm volatile (
+ "add %[s1], %[s1], %[n], lsl #2;"
+ "0:"
+ "ldmia %[s0]!, {r0, r1};"
+ "ldmdb %[s1]!, {r4, r5};"
+ "smull r8, r9, r0, r5;"
+ "mov r0, r9, lsl #1;"
+ "smull r8, r9, r1, r4;"
+ "mov r1, r9, lsl #1;"
+ "stmia %[dst]!, {r0, r1};"
+ "subs %[n], %[n], #2;"
+ "bne 0b;"
+ : [s0] "+r" (src0), [s1] "+r" (src1), [dst] "+r" (dst), [n] "+r" (len)
+ :
+ : "r0", "r1", "r4", "r5", "r8", "r9", "memory", "cc");
+}
+
+#elif defined(CPU_COLDFIRE)
+static inline
+void vector_fmul_add_add(real_t *dst, const real_t *src0, const real_t *src1, const real_t *src2, int len)
+{
+ /* Block sizes are always power of two. Smallest block is always way bigger
+ * than four too.*/
+ asm volatile (
+ "0:"
+ "movem.l (%[src0]), %%d0-%%d3;"
+ "movem.l (%[src1]), %%d4-%%d5/%%a0-%%a1;"
+ "mac.l %%d0, %%d4, %%acc0;"
+ "mac.l %%d1, %%d5, %%acc1;"
+ "mac.l %%d2, %%a0, %%acc2;"
+ "mac.l %%d3, %%a1, %%acc3;"
+ "lea.l (16, %[src0]), %[src0];"
+ "lea.l (16, %[src1]), %[src1];"
+ "movclr.l %%acc0, %%d0;"
+ "movclr.l %%acc1, %%d1;"
+ "movclr.l %%acc2, %%d2;"
+ "movclr.l %%acc3, %%d3;"
+ "movem.l (%[src2]), %%d4-%%d5/%%a0-%%a1;"
+ "lea.l (16, %[src2]), %[src2];"
+ "add.l %%d4, %%d0;"
+ "add.l %%d5, %%d1;"
+ "add.l %%a0, %%d2;"
+ "add.l %%a1, %%d3;"
+ "movem.l %%d0-%%d3, (%[dst]);"
+ "lea.l (16, %[dst]), %[dst];"
+ "subq.l #4, %[n];"
+ "jne 0b;"
+ : [src0] "+a" (src0), [src1] "+a" (src1), [src2] "+a" (src2), [dst] "+a" (dst), [n] "+d" (len)
+ :
+ : "d0", "d1", "d2", "d3", "d4", "d5", "a0", "a1", "memory", "cc");
+}
+
+static inline
+void vector_fmul_reverse(real_t *dst, const real_t *src0, const real_t *src1,
+ int len)
+{
+ /* Block sizes are always power of two. Smallest block is always way bigger
+ * than four too.*/
+ asm volatile (
+ "lea.l (-16, %[s1], %[n]*4), %[s1];"
+ "0:"
+ "movem.l (%[s0]), %%d0-%%d3;"
+ "movem.l (%[s1]), %%d4-%%d5/%%a0-%%a1;"
+ "mac.l %%d0, %%a1, %%acc0;"
+ "mac.l %%d1, %%a0, %%acc1;"
+ "mac.l %%d2, %%d5, %%acc2;"
+ "mac.l %%d3, %%d4, %%acc3;"
+ "lea.l (16, %[s0]), %[s0];"
+ "lea.l (-16, %[s1]), %[s1];"
+ "movclr.l %%acc0, %%d0;"
+ "movclr.l %%acc1, %%d1;"
+ "movclr.l %%acc2, %%d2;"
+ "movclr.l %%acc3, %%d3;"
+ "movem.l %%d0-%%d3, (%[dst]);"
+ "lea.l (16, %[dst]), %[dst];"
+ "subq.l #4, %[n];"
+ "jne 0b;"
+ : [s0] "+a" (src0), [s1] "+a" (src1), [dst] "+a" (dst), [n] "+d" (len)
+ : : "d0", "d1", "d2", "d3", "d4", "d5", "a0", "a1", "memory", "cc");
+}
+
+#else
+static inline void vector_fmul_add_add(real_t *dst, const real_t *src0, const real_t *src1, const real_t *src2, int len){
+ int i;
+ for(i=0; i<len; i++)
+ dst[i] = MUL_F(src0[i], src1[i]) + src2[i];
+}
+
+static inline void vector_fmul_reverse(real_t *dst, const real_t *src0, const real_t *src1, int len){
+ int i;
+ src1 += len-1;
+ for(i=0; i<len; i++)
+ dst[i] = MUL_F(src0[i], src1[-i]);
+}
+#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(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)
+{
+ int32_t i, idx0, idx1;
+ real_t win0, win1, win2;
+
+ 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;
+
+ int32_t nlong = frame_len;
+ int32_t nshort = frame_len/8;
+ int32_t nflat_ls = (nlong-nshort)/2;
+
+#ifdef PROFILE
+ int64_t count = faad_get_ts();
+#endif
+
+ memset(transf_buf,0,sizeof(transf_buf));
+ /* 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 {
+#else
+ (void) object_type;
+#endif
+
+ /* AAC uses two different window shapes depending on spectal features */
+ if (window_shape == 0) {
+ window_long = sine_long_1024;
+ window_short = sine_short_128;
+ } else {
+ window_long = kbd_long_1024;
+ window_short = kbd_short_128;
+ }
+
+ if (window_shape_prev == 0) {
+ window_long_prev = sine_long_1024;
+ window_short_prev = sine_short_128;
+ } else {
+ window_long_prev = kbd_long_1024;
+ window_short_prev = kbd_short_128;
+ }
+
+#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 */
+ ff_imdct_calc(11, transf_buf, freq_in);
+
+ /* add second half output of previous frame to windowed output of current frame */
+ vector_fmul_add_add(time_out, transf_buf, window_long_prev, overlap, nlong);
+
+ /* window the second half and save as overlap for next frame */
+ vector_fmul_reverse(overlap, transf_buf+nlong, window_long, nlong);
+
+ break;
+
+ case LONG_START_SEQUENCE:
+ /* perform iMDCT */
+ ff_imdct_calc(11, transf_buf, freq_in);
+
+ /* add second half output of previous frame to windowed output of current frame */
+ vector_fmul_add_add(time_out, transf_buf, window_long_prev, overlap, nlong);
+
+ /* window the second half and save as overlap for next frame */
+ /* construct second half window using padding with 1's and 0's */
+
+ memcpy(overlap, transf_buf+nlong, nflat_ls*sizeof(real_t));
+
+ vector_fmul_reverse(overlap+nflat_ls, transf_buf+nlong+nflat_ls, window_short, nshort);
+
+ memset(overlap+nflat_ls+nshort, 0, nflat_ls*sizeof(real_t));
+ break;
+
+ case EIGHT_SHORT_SEQUENCE:
+ /* this could be assemblerized too, but this case is extremely uncommon */
+
+ /* perform iMDCT for each short block */
+ idx0 = 0; ff_imdct_calc(8, transf_buf , freq_in );
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+ idx0 += nshort; ff_imdct_calc(8, transf_buf + (idx0<<1), freq_in + idx0);
+
+ /* Add second half output of previous frame to windowed output of current
+ * frame */
+ /* Step 1: copy */
+ memcpy(time_out, overlap, nflat_ls*sizeof(real_t));
+ /* Step 2: First window half, first half of nshort */
+ for (i = 0; i < nshort/2; i++) {
+ win0 = window_short[nshort-1-i];
+ win1 = window_short[i];
+ win2 = window_short_prev[i];
+ idx0 = nflat_ls + i;
+ idx1 = i;
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1], win2); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1);
+ }
+ /* Step 3: First window half, second half of nshort */
+ for (; i < nshort; i++) {
+ win0 = window_short[nshort-1-i];
+ win1 = window_short[i];
+ idx0 = nflat_ls + i;
+ idx1 = i;
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ time_out[idx0] = overlap[idx0] + MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1);
+ }
+
+ /* Window the second half and save as overlap for next frame */
+ /* Step 1: Second window half, first half of nshort */
+ for (i = 0; i < nshort/2; i++) {
+ win0 = window_short[nshort-1-i];
+ win1 = window_short[i];
+ idx0 = nflat_ls + 5*nshort + i - nlong;
+ idx1 = nshort*10 + i;
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0);
+ }
+ /* Step 2: Second window half, second half of nshort */
+ for (; i < nshort; i++) {
+ win0 = window_short[nshort-1-i];
+ win1 = window_short[i];
+ idx0 = nflat_ls + 4*nshort + i - nlong;
+ idx1 = nshort*8 + i;
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0) + MUL_F(transf_buf[idx1], win1); idx0 += nshort; idx1 += (nshort<<1);
+ overlap[idx0] = MUL_F(transf_buf[idx1-nshort], win0);
+ }
+ /* Step 3: Set to zero */
+ memset(overlap+nflat_ls+nshort, 0, nflat_ls*sizeof(real_t));
+
+ break;
+
+ case LONG_STOP_SEQUENCE:
+ /* perform iMDCT */
+ ff_imdct_calc(11, transf_buf, freq_in);
+
+ /* 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 */
+ memcpy(time_out, overlap, nflat_ls*sizeof(real_t));
+
+ vector_fmul_add_add(time_out+nflat_ls, transf_buf+nflat_ls, window_short_prev, overlap+nflat_ls, nshort);
+
+ /* nflat_ls can be divided by 2. */
+ idx0 = nflat_ls + nshort;
+ for (i = 0; i < nflat_ls; i+=2) {
+ time_out[idx0] = overlap[idx0] + transf_buf[idx0]; idx0++;
+ time_out[idx0] = overlap[idx0] + transf_buf[idx0]; idx0++;
+ }
+
+ /* window the second half and save as overlap for next frame */
+ vector_fmul_reverse(overlap, transf_buf+nlong, window_long, nlong);
+ 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;
+
+ 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);
+
+ memset(windowed_buf,0,sizeof(windowed_buf));
+#ifdef LD_DEC
+ if (object_type == LD)
+ {
+ window_long = fb->ld_window[window_shape];
+ window_long_prev = fb->ld_window[window_shape_prev];
+ } else {
+#else
+ (void) object_type;
+#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
diff --git a/lib/rbcodec/codecs/libfaad/filtbank.h b/lib/rbcodec/codecs/libfaad/filtbank.h
new file mode 100644
index 0000000000..8c9f1e3490
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/filtbank.h
@@ -0,0 +1,54 @@
+/*
+** 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$
+**/
+
+#ifndef __FILTBANK_H__
+#define __FILTBANK_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#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(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
diff --git a/lib/rbcodec/codecs/libfaad/fixed.h b/lib/rbcodec/codecs/libfaad/fixed.h
new file mode 100644
index 0000000000..ca0402e4d3
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/fixed.h
@@ -0,0 +1,230 @@
+/*
+** 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$
+**/
+
+#ifndef __FIXED_H__
+#define __FIXED_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(_WIN32_WCE) && defined(_ARM_)
+#include <cmnintrin.h>
+#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 FIX_CONST(A,PRECISION) (((A) >= 0) ? ((real_t)((A)*(PRECISION)+0.5)) : ((real_t)((A)*(PRECISION)-0.5)))
+#define REAL_CONST(A) FIX_CONST((A),(REAL_PRECISION))
+#define COEF_CONST(A) FIX_CONST((A),(COEF_PRECISION))
+#define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : FIX_CONST((A),(FRAC_PRECISION)))
+//#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) FIX_CONST((A),(Q2_PRECISION))
+
+#if defined(CPU_COLDFIRE)
+
+static INLINE real_t MUL_F(real_t A, real_t B)
+{
+ asm volatile (
+ "mac.l %[A], %[B], %%acc0\n\t"
+ "movclr.l %%acc0, %[A]"
+ : [A] "+&r" (A) : [B] "r" (B)
+ );
+ return A;
+}
+
+static INLINE real_t MUL_C(real_t A, real_t B)
+{
+ asm volatile (
+ "mac.l %[A], %[B], %%acc0\n\t"
+ "movclr.l %%acc0, %[A]\n\t"
+ : [A] "+&d" (A) : [B] "r" (B)
+ );
+ return A << 3;
+}
+
+/* MUL_R needs too many shifts for us to just operate on the top 32 bits the
+ emac unit gives as usual, so we do a full 64 bit mul here. */
+static INLINE real_t MUL_R(real_t x, real_t y)
+{
+ real_t t1, t2;
+ asm volatile (
+ "mac.l %[x],%[y],%%acc0\n" /* multiply */
+ "mulu.l %[y],%[x] \n" /* get lower half, avoid emac stall */
+ "movclr.l %%acc0,%[t1] \n" /* get higher half */
+ "moveq.l #17,%[t2] \n"
+ "asl.l %[t2],%[t1] \n" /* hi <<= 17, plus one free */
+ "moveq.l #14,%[t2] \n"
+ "lsr.l %[t2],%[x] \n" /* (unsigned)lo >>= 14 */
+ "or.l %[x],%[t1] \n" /* combine result */
+ : /* outputs */
+ [t1]"=&d"(t1),
+ [t2]"=&d"(t2),
+ [x] "+d" (x)
+ : /* inputs */
+ [y] "d" (y)
+ );
+ return t1;
+}
+
+static INLINE void ComplexMult(real_t *y1, real_t *y2,
+ real_t x1, real_t x2, real_t c1, real_t c2)
+{
+ asm volatile(
+ "mac.l %[x1], %[c1], %%acc0\n\t"
+ "mac.l %[x2], %[c2], %%acc0\n\t"
+ "mac.l %[x2], %[c1], %%acc1\n\t"
+ "msac.l %[x1], %[c2], %%acc1\n\t"
+ "movclr.l %%acc0, %[x1]\n\t"
+ "move.l %[x1], (%[y1])\n\t"
+ "movclr.l %%acc1, %[x1]\n\t"
+ "move.l %[x1], (%[y2])"
+ : [x1] "+&r" (x1)
+ : [x2] "r" (x2), [y1] "a" (y1), [y2] "a" (y2),
+ [c1] "r" (c1), [c2] "r" (c2)
+ : "memory"
+ );
+}
+
+ /* the following see little or no use, so just ignore them for now */
+ #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS)
+
+#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 _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
+ #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
+ #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_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);
+}
+
+#endif
+
+
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/hcr.c b/lib/rbcodec/codecs/libfaad/hcr.c
new file mode 100644
index 0000000000..f968ea7bec
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/hcr.c
@@ -0,0 +1,409 @@
+/*
+** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
+** Copyright (C) 2004 G.C. Pascutto, 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$
+**/
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#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;
+}
+
+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;
+}
+
+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;
+ }
+}
+
+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(NeAACDecHandle hDecoder, ic_stream *ics,
+ bitfile *ld, int16_t *spectral_data)
+{
+ uint16_t PCWs_done;
+ uint16_t numberOfSegments, numberOfSets, numberOfCodewords;
+
+ static codeword_t codeword[512];
+ static bits_t segment[512];
+
+ uint16_t sp_offset[8];
+ uint16_t g, i, sortloop, set, bitsread;
+ 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 < (ics->swb_offset[sfb+1] - 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]);
+ }
+
+ return 0;
+}
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/huffman.c b/lib/rbcodec/codecs/libfaad/huffman.c
new file mode 100644
index 0000000000..bea0dd7bf2
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/huffman.c
@@ -0,0 +1,563 @@
+/*
+** 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$
+**/
+
+#include "common.h"
+#include "structs.h"
+
+#include <stdlib.h>
+#ifdef ANALYSIS
+#include <stdio.h>
+#endif
+
+#include "bits.h"
+#include "huffman.h"
+#include "codebook/hcb.h"
+
+
+/* static function declarations */
+static INLINE void huffman_sign_bits_pair(bitfile *ld, int16_t *sp);
+static INLINE void huffman_sign_bits_quad(bitfile *ld, int16_t *sp);
+static INLINE int16_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 INLINE uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp);
+static INLINE 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) ICODE_ATTR_FAAD_LARGE_IRAM;
+#ifdef ERROR_RESILIENCE
+static void vcb11_check_LAV(uint8_t cb, int16_t *sp);
+#endif
+
+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[] ICONST_ATTR = {
+ 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[] ICONST_ATTR = {
+ 0, hcb1_2, hcb2_2, 0, hcb4_2, 0, 0, 0, 0, 0, 0, 0
+};
+
+hcb_2_pair *hcb_2_pair_table[] ICONST_ATTR = {
+ 0, 0, 0, 0, 0, 0, hcb6_2, 0, hcb8_2, 0, hcb10_2, hcb11_2
+};
+
+hcb_bin_pair *hcb_bin_table[] ICONST_ATTR = {
+ 0, 0, 0, 0, 0, hcb5, 0, hcb7, 0, hcb9, 0, 0
+};
+
+uint8_t hcbN[] ICONST_ATTR = { 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[] ICONST_ATTR = { 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[] ICONST_ATTR = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 };
+int hcb_2_pair_table_size[] ICONST_ATTR = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 };
+int hcb_bin_table_size[] ICONST_ATTR = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 };
+
+#define FAAD_GET_SIGN(idx) \
+ if (sp[idx]) \
+ if (faad_get1bit(ld)&1) \
+ sp[idx] = -sp[idx]; \
+
+static INLINE void huffman_sign_bits_pair(bitfile *ld, int16_t *sp)
+{
+ FAAD_GET_SIGN(0)
+ FAAD_GET_SIGN(1)
+}
+
+static INLINE void huffman_sign_bits_quad(bitfile *ld, int16_t *sp)
+{
+ FAAD_GET_SIGN(0)
+ FAAD_GET_SIGN(1)
+ FAAD_GET_SIGN(2)
+ FAAD_GET_SIGN(3)
+}
+
+static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp)
+{
+ uint8_t neg, i;
+ int16_t j;
+ int16_t off;
+
+ if (sp < 0)
+ {
+ if (sp != -16)
+ return sp;
+ neg = 1;
+ } else {
+ if (sp != 16)
+ return sp;
+ neg = 0;
+ }
+
+ for (i = 4; ; i++)
+ {
+ if (faad_get1bit(ld
+ DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0)
+ {
+ break;
+ }
+ }
+
+ off = (int16_t)faad_getbits(ld, i
+ DEBUGVAR(1,9,"huffman_getescape(): escape"));
+
+ j = off | (1<<i);
+ if (neg)
+ j = -j;
+
+ return j;
+}
+
+static uint8_t huffman_2step_quad(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_quad_table[cb][offset].bits - hcbN[cb]);
+ } else {
+ faad_flushbits(ld, hcb_2_quad_table[cb][offset].bits);
+ }
+
+ if (offset > 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_quad(ld, sp);
+
+ return err;
+}
+
+static INLINE 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 INLINE 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_pair(ld, sp);
+
+ 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_quad(ld, sp);
+
+ 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_pair(ld, sp);
+
+ 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;
+}
+
+#ifdef ERROR_RESILIENCE
+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;
+ }
+}
+#endif
+
+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);
+ sp[0] = huffman_getescape(ld, sp[0]);
+ sp[1] = 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);
+ sp[0] = huffman_getescape(ld, sp[0]);
+ sp[1] = 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<<i);
+ sp[k] = (int16_t)((neg) ? -j : j);
+ }
+ }
+
+ if (vcb11 != 0)
+ {
+ /* check LAV (Largest Absolute Value) */
+ /* this finds errors in the ESCAPE signal */
+ vcb11_check_LAV(vcb11, sp);
+ }
+ }
+ return ld->len;
+}
+
+#endif
+
diff --git a/lib/rbcodec/codecs/libfaad/huffman.h b/lib/rbcodec/codecs/libfaad/huffman.h
new file mode 100644
index 0000000000..214d3a220f
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/huffman.h
@@ -0,0 +1,44 @@
+/*
+** 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$
+**/
+
+#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) ICODE_ATTR_FAAD_LARGE_IRAM;
+#ifdef ERROR_RESILIENCE
+int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/lib/rbcodec/codecs/libfaad/ic_predict.c b/lib/rbcodec/codecs/libfaad/ic_predict.c
new file mode 100644
index 0000000000..02cadd65b1
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/ic_predict.c
@@ -0,0 +1,267 @@
+/*
+** 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$
+**/
+
+#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, 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];
+ real_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];
+ real_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 = ics->swb_offset[sfb+1];
+
+ 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 = ics->swb_offset[sfb+1];
+
+ 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
diff --git a/lib/rbcodec/codecs/libfaad/ic_predict.h b/lib/rbcodec/codecs/libfaad/ic_predict.h
new file mode 100644
index 0000000000..1f2d2c657e
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/ic_predict.h
@@ -0,0 +1,249 @@
+/*
+** 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$
+**/
+
+#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);
+#warning MEM_ALIGN_ATTR me!
+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)
+};
+#warning MEM_ALIGN_ATTR me!
+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
diff --git a/lib/rbcodec/codecs/libfaad/iq_table.h b/lib/rbcodec/codecs/libfaad/iq_table.h
new file mode 100644
index 0000000000..eaf2fe4671
--- /dev/null
+++ b/lib/rbcodec/codecs/libfaad/iq_table.h
@@ -0,0 +1,16455 @@
+/*
+** 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$
+**/
+
+#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
+
+static const real_t iq_table[IQ_TABLE_SIZE] MEM_ALIGN_ATTR =
+{
+ 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
+
+static const real_t iq_table[IQ_TABLE_SIZE] MEM_ALIGN_ATTR =
+{
+ 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),