From 4effb493e9ec01caa356f6b5e1c612d240b8e319 Mon Sep 17 00:00:00 2001 From: casey Date: Sat, 4 Jun 2016 17:34:43 -0700 Subject: [PATCH] Fixed the AAC/M4A decoder and upgraded its dependencies. --- musikcube.sln | 6 + src/contrib/aacdecoder/AacDecoder.cpp | 202 + src/contrib/aacdecoder/AacDecoder.h | 27 + ...urceSupplier.cpp => AacDecoderFactory.cpp} | 44 +- ...ACSourceSupplier.h => AacDecoderFactory.h} | 18 +- src/contrib/aacdecoder/aacdecoder.vcproj | 4 +- src/contrib/aacdecoder/aacdecoder.vcxproj | 91 +- .../aacdecoder/aacdecoder.vcxproj.filters | 248 +- src/contrib/aacdecoder/accdecoder_plugin.cpp | 38 +- src/contrib/aacdecoder/libfaad/analysis.h | 101 +- src/contrib/aacdecoder/libfaad/bits.c | 484 +- src/contrib/aacdecoder/libfaad/bits.h | 829 +- src/contrib/aacdecoder/libfaad/cfft.c | 2411 +- src/contrib/aacdecoder/libfaad/cfft.h | 113 +- src/contrib/aacdecoder/libfaad/cfft_tab.h | 3511 ++- src/contrib/aacdecoder/libfaad/codebook/hcb.h | 287 +- .../aacdecoder/libfaad/codebook/hcb_1.h | 369 +- .../aacdecoder/libfaad/codebook/hcb_10.h | 621 +- .../aacdecoder/libfaad/codebook/hcb_11.h | 827 +- .../aacdecoder/libfaad/codebook/hcb_2.h | 367 +- .../aacdecoder/libfaad/codebook/hcb_3.h | 389 +- .../aacdecoder/libfaad/codebook/hcb_4.h | 395 +- .../aacdecoder/libfaad/codebook/hcb_5.h | 389 +- .../aacdecoder/libfaad/codebook/hcb_6.h | 361 +- .../aacdecoder/libfaad/codebook/hcb_7.h | 321 +- .../aacdecoder/libfaad/codebook/hcb_8.h | 343 +- .../aacdecoder/libfaad/codebook/hcb_9.h | 741 +- .../aacdecoder/libfaad/codebook/hcb_sf.h | 549 +- src/contrib/aacdecoder/libfaad/common.c | 826 +- src/contrib/aacdecoder/libfaad/common.h | 842 +- src/contrib/aacdecoder/libfaad/decoder.c | 2195 +- src/contrib/aacdecoder/libfaad/decoder.h | 122 - src/contrib/aacdecoder/libfaad/drc.c | 343 +- src/contrib/aacdecoder/libfaad/drc.h | 95 +- src/contrib/aacdecoder/libfaad/drm_dec.c | 965 + src/contrib/aacdecoder/libfaad/drm_dec.h | 100 + src/contrib/aacdecoder/libfaad/error.c | 129 +- src/contrib/aacdecoder/libfaad/error.h | 85 +- src/contrib/aacdecoder/libfaad/faad.h | 35 + src/contrib/aacdecoder/libfaad/filtbank.c | 1129 +- src/contrib/aacdecoder/libfaad/filtbank.h | 125 +- src/contrib/aacdecoder/libfaad/fixed.h | 483 +- src/contrib/aacdecoder/libfaad/hcr.c | 844 +- src/contrib/aacdecoder/libfaad/huffman.c | 1074 +- src/contrib/aacdecoder/libfaad/huffman.h | 91 +- src/contrib/aacdecoder/libfaad/ic_predict.c | 538 +- src/contrib/aacdecoder/libfaad/ic_predict.h | 501 +- src/contrib/aacdecoder/libfaad/iq_table.h | 25741 ++++++++++------ src/contrib/aacdecoder/libfaad/is.c | 213 +- src/contrib/aacdecoder/libfaad/is.h | 131 +- src/contrib/aacdecoder/libfaad/kbd_win.h | 4591 +-- src/contrib/aacdecoder/libfaad/lt_predict.c | 430 +- src/contrib/aacdecoder/libfaad/lt_predict.h | 129 +- src/contrib/aacdecoder/libfaad/mdct.c | 819 +- src/contrib/aacdecoder/libfaad/mdct.h | 96 +- src/contrib/aacdecoder/libfaad/mdct_tab.h | 3655 +++ src/contrib/aacdecoder/libfaad/mp4.c | 584 +- src/contrib/aacdecoder/libfaad/mp4.h | 101 +- src/contrib/aacdecoder/libfaad/ms.c | 151 +- src/contrib/aacdecoder/libfaad/ms.h | 85 +- src/contrib/aacdecoder/libfaad/neaacdec.h | 258 + src/contrib/aacdecoder/libfaad/output.c | 1038 +- src/contrib/aacdecoder/libfaad/output.h | 93 +- src/contrib/aacdecoder/libfaad/pns.c | 531 +- src/contrib/aacdecoder/libfaad/pns.h | 112 +- src/contrib/aacdecoder/libfaad/ps_dec.c | 2013 ++ src/contrib/aacdecoder/libfaad/ps_dec.h | 152 + src/contrib/aacdecoder/libfaad/ps_syntax.c | 551 + src/contrib/aacdecoder/libfaad/ps_tables.h | 550 + src/contrib/aacdecoder/libfaad/pulse.c | 113 +- src/contrib/aacdecoder/libfaad/pulse.h | 83 +- src/contrib/aacdecoder/libfaad/rvlc.c | 1063 +- src/contrib/aacdecoder/libfaad/rvlc.h | 109 +- src/contrib/aacdecoder/libfaad/sbr_dct.c | 5090 ++- src/contrib/aacdecoder/libfaad/sbr_dct.h | 98 +- src/contrib/aacdecoder/libfaad/sbr_dec.c | 1169 +- src/contrib/aacdecoder/libfaad/sbr_dec.h | 493 +- src/contrib/aacdecoder/libfaad/sbr_e_nf.c | 860 +- src/contrib/aacdecoder/libfaad/sbr_e_nf.h | 108 +- src/contrib/aacdecoder/libfaad/sbr_fbt.c | 1504 +- src/contrib/aacdecoder/libfaad/sbr_fbt.h | 107 +- src/contrib/aacdecoder/libfaad/sbr_hfadj.c | 2434 +- src/contrib/aacdecoder/libfaad/sbr_hfadj.h | 117 +- src/contrib/aacdecoder/libfaad/sbr_hfgen.c | 1162 +- src/contrib/aacdecoder/libfaad/sbr_hfgen.h | 95 +- src/contrib/aacdecoder/libfaad/sbr_huff.c | 718 +- src/contrib/aacdecoder/libfaad/sbr_huff.h | 89 +- src/contrib/aacdecoder/libfaad/sbr_noise.h | 1125 +- src/contrib/aacdecoder/libfaad/sbr_qmf.c | 1196 +- src/contrib/aacdecoder/libfaad/sbr_qmf.h | 109 +- src/contrib/aacdecoder/libfaad/sbr_qmf_c.h | 733 +- src/contrib/aacdecoder/libfaad/sbr_syntax.c | 1634 +- src/contrib/aacdecoder/libfaad/sbr_syntax.h | 132 +- src/contrib/aacdecoder/libfaad/sbr_tf_grid.c | 515 +- src/contrib/aacdecoder/libfaad/sbr_tf_grid.h | 91 +- src/contrib/aacdecoder/libfaad/sine_win.h | 8605 +++--- src/contrib/aacdecoder/libfaad/specrec.c | 2612 +- src/contrib/aacdecoder/libfaad/specrec.h | 101 +- src/contrib/aacdecoder/libfaad/ssr.c | 347 +- src/contrib/aacdecoder/libfaad/ssr.h | 115 +- src/contrib/aacdecoder/libfaad/ssr_fb.c | 367 +- src/contrib/aacdecoder/libfaad/ssr_fb.h | 97 +- src/contrib/aacdecoder/libfaad/ssr_ipqf.c | 379 +- src/contrib/aacdecoder/libfaad/ssr_ipqf.h | 83 +- src/contrib/aacdecoder/libfaad/ssr_win.h | 1261 +- src/contrib/aacdecoder/libfaad/structs.h | 915 +- src/contrib/aacdecoder/libfaad/syntax.c | 4829 +-- src/contrib/aacdecoder/libfaad/syntax.h | 251 +- src/contrib/aacdecoder/libfaad/tns.c | 605 +- src/contrib/aacdecoder/libfaad/tns.h | 99 +- src/contrib/aacdecoder/m4aAudioSource.cpp | 249 - src/contrib/aacdecoder/m4aAudioSource.h | 42 - src/contrib/aacdecoder/{ => mp4ff}/mp4atom.c | 1590 +- src/contrib/aacdecoder/{ => mp4ff}/mp4ff.c | 949 +- src/contrib/aacdecoder/{ => mp4ff}/mp4ff.h | 269 +- .../aacdecoder/mp4ff/mp4ff_int_types.h | 26 + src/contrib/aacdecoder/{ => mp4ff}/mp4ffint.h | 717 +- src/contrib/aacdecoder/{ => mp4ff}/mp4meta.c | 884 +- .../aacdecoder/{ => mp4ff}/mp4sample.c | 307 +- .../aacdecoder/{ => mp4ff}/mp4tagupdate.c | 1301 +- src/contrib/aacdecoder/{ => mp4ff}/mp4util.c | 379 +- src/contrib/aacdecoder/mp4ff_int_types.h | 23 - src/contrib/aacdecoder/neaacdec.h | 2 +- src/contrib/aacdecoder/stdafx.cpp | 9 +- src/contrib/aacdecoder/stdafx.h | 10 +- .../mpg123decoder/mpg123decoder.vcxproj | 4 +- src/contrib/oggdecoder/oggdecoder_plugin.cpp | 2 - .../taglib_plugin/TaglibMetadataReader.cpp | 4 + src/core/core.vcxproj | 3 + src/core/core.vcxproj.filters | 3 + 130 files changed, 66146 insertions(+), 48872 deletions(-) create mode 100644 src/contrib/aacdecoder/AacDecoder.cpp create mode 100644 src/contrib/aacdecoder/AacDecoder.h rename src/contrib/aacdecoder/{AACSourceSupplier.cpp => AacDecoderFactory.cpp} (69%) rename src/contrib/aacdecoder/{AACSourceSupplier.h => AacDecoderFactory.h} (82%) mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/analysis.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/bits.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/bits.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/cfft.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/cfft.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/cfft_tab.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_1.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_10.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_11.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_2.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_3.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_4.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_5.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_6.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_7.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_8.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_9.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/codebook/hcb_sf.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/common.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/common.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/decoder.c delete mode 100644 src/contrib/aacdecoder/libfaad/decoder.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/drc.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/drc.h create mode 100755 src/contrib/aacdecoder/libfaad/drm_dec.c create mode 100755 src/contrib/aacdecoder/libfaad/drm_dec.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/error.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/error.h create mode 100755 src/contrib/aacdecoder/libfaad/faad.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/filtbank.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/filtbank.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/fixed.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/hcr.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/huffman.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/huffman.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ic_predict.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ic_predict.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/iq_table.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/is.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/is.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/kbd_win.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/lt_predict.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/lt_predict.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/mdct.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/mdct.h create mode 100755 src/contrib/aacdecoder/libfaad/mdct_tab.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/mp4.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/mp4.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ms.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ms.h create mode 100755 src/contrib/aacdecoder/libfaad/neaacdec.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/output.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/output.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/pns.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/pns.h create mode 100755 src/contrib/aacdecoder/libfaad/ps_dec.c create mode 100755 src/contrib/aacdecoder/libfaad/ps_dec.h create mode 100755 src/contrib/aacdecoder/libfaad/ps_syntax.c create mode 100755 src/contrib/aacdecoder/libfaad/ps_tables.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/pulse.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/pulse.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/rvlc.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/rvlc.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_dct.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_dct.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_dec.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_dec.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_e_nf.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_e_nf.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_fbt.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_fbt.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_hfadj.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_hfadj.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_hfgen.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_hfgen.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_huff.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_huff.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_noise.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_qmf.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_qmf.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_qmf_c.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_syntax.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_syntax.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_tf_grid.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sbr_tf_grid.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/sine_win.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/specrec.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/specrec.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr_fb.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr_fb.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr_ipqf.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr_ipqf.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/ssr_win.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/structs.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/syntax.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/syntax.h mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/tns.c mode change 100644 => 100755 src/contrib/aacdecoder/libfaad/tns.h delete mode 100644 src/contrib/aacdecoder/m4aAudioSource.cpp delete mode 100644 src/contrib/aacdecoder/m4aAudioSource.h rename src/contrib/aacdecoder/{ => mp4ff}/mp4atom.c (72%) mode change 100644 => 100755 rename src/contrib/aacdecoder/{ => mp4ff}/mp4ff.c (93%) mode change 100644 => 100755 rename src/contrib/aacdecoder/{ => mp4ff}/mp4ff.h (91%) mode change 100644 => 100755 create mode 100755 src/contrib/aacdecoder/mp4ff/mp4ff_int_types.h rename src/contrib/aacdecoder/{ => mp4ff}/mp4ffint.h (81%) mode change 100644 => 100755 rename src/contrib/aacdecoder/{ => mp4ff}/mp4meta.c (85%) mode change 100644 => 100755 rename src/contrib/aacdecoder/{ => mp4ff}/mp4sample.c (90%) mode change 100644 => 100755 rename src/contrib/aacdecoder/{ => mp4ff}/mp4tagupdate.c (94%) mode change 100644 => 100755 rename src/contrib/aacdecoder/{ => mp4ff}/mp4util.c (89%) mode change 100644 => 100755 delete mode 100644 src/contrib/aacdecoder/mp4ff_int_types.h diff --git a/musikcube.sln b/musikcube.sln index 76537f0ec..ad04335ca 100644 --- a/musikcube.sln +++ b/musikcube.sln @@ -20,6 +20,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "flacdecoder", "src\contrib\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mpg123decoder", "src\contrib\mpg123decoder\mpg123decoder.vcxproj", "{04118CC2-DE10-4627-A695-2219428C7D59}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aacdecoder", "src\contrib\aacdecoder\aacdecoder.vcxproj", "{4993E68D-E97A-4CD2-AC8E-168AE315BAC5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -62,6 +64,10 @@ Global {04118CC2-DE10-4627-A695-2219428C7D59}.Debug|Win32.Build.0 = Debug|Win32 {04118CC2-DE10-4627-A695-2219428C7D59}.Release|Win32.ActiveCfg = Release|Win32 {04118CC2-DE10-4627-A695-2219428C7D59}.Release|Win32.Build.0 = Release|Win32 + {4993E68D-E97A-4CD2-AC8E-168AE315BAC5}.Debug|Win32.ActiveCfg = Debug|Win32 + {4993E68D-E97A-4CD2-AC8E-168AE315BAC5}.Debug|Win32.Build.0 = Debug|Win32 + {4993E68D-E97A-4CD2-AC8E-168AE315BAC5}.Release|Win32.ActiveCfg = Release|Win32 + {4993E68D-E97A-4CD2-AC8E-168AE315BAC5}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/contrib/aacdecoder/AacDecoder.cpp b/src/contrib/aacdecoder/AacDecoder.cpp new file mode 100644 index 000000000..dfb82bed5 --- /dev/null +++ b/src/contrib/aacdecoder/AacDecoder.cpp @@ -0,0 +1,202 @@ +#include "stdafx.h" +#include "AacDecoder.h" +#include + +using musik::core::io::IDataStream; +using musik::core::audio::IBuffer; + +static uint32_t streamReadCallback(void *userData, void *buffer, uint32_t length) { + IDataStream *stream = static_cast(userData); + return (uint32_t) stream->Read(buffer, length); +} + +static uint32_t streamSeekCallback(void *userData, uint64_t position) { + IDataStream *stream = static_cast(userData); + return (uint32_t) stream->SetPosition((long) position); +} + +static int FindAacTrack(mp4ff_t *infile) { + int i, rc; + int numTracks = mp4ff_total_tracks(infile); + + for (i = 0; i < numTracks; i++) { + unsigned char *buff = NULL; + int size = 0; + mp4AudioSpecificConfig mp4ASC; + + mp4ff_get_decoder_config(infile, i, &buff, (unsigned int *) &size); + + if (buff) { + rc = NeAACDecAudioSpecificConfig(buff, size, &mp4ASC); + free(buff); + + if (rc < 0) { + continue; + } + + return i; + } + } + + /* can't decode this */ + return -1; +} + +AacDecoder::AacDecoder() { + this->decoder = NULL; + this->decoderFile = NULL; + memset(&decoderCallbacks, 0, sizeof(this->decoderCallbacks)); +} + +AacDecoder::~AacDecoder() { +} + +bool AacDecoder::Open(musik::core::io::IDataStream *stream) +{ + unsigned char* buffer; + unsigned int buffer_size; + NeAACDecConfigurationPtr config; + + decoder = NeAACDecOpen(); + if (!decoder) { + return false; + } + + config = NeAACDecGetCurrentConfiguration(decoder); + + config->outputFormat = FAAD_FMT_FLOAT; + config->downMatrix = 0; + + int ret = NeAACDecSetConfiguration(decoder, config); + + decoderCallbacks.read = streamReadCallback; + decoderCallbacks.seek = streamSeekCallback; + decoderCallbacks.user_data = stream; + + decoderFile = mp4ff_open_read(&decoderCallbacks); + if (!decoderFile) { + return false; + } + + if ((audioTrackId = FindAacTrack(decoderFile)) < 0) { + return false; + } + + buffer = NULL; + buffer_size = 0; + mp4ff_get_decoder_config(decoderFile, audioTrackId, &buffer, &buffer_size); + + if (!buffer) { + return false; + } + + if (NeAACDecInit2( + decoder, + buffer, + buffer_size, + &this->sampleRate, + &this->channelCount) < 0) + { + if (buffer) { + free(buffer); + } + + return false; + } + + free(buffer); + + this->totalSamples = mp4ff_num_samples(decoderFile, audioTrackId); + decoderSampleId = 0; + + return true; +} + +void AacDecoder::Destroy(void) +{ + mp4ff_close(decoderFile); + + if (decoder) { + NeAACDecClose(decoder); + decoder = NULL; + } + + delete this; +} + +double AacDecoder::SetPosition(double seconds) { + int64_t duration; + float fms = (float) seconds * 1000; + int32_t skip_samples = 0; + + duration = (int64_t)(fms / 1000.0 * sampleRate + 0.5); + + decoderSampleId = mp4ff_find_sample_use_offsets( + decoderFile, audioTrackId, duration, &skip_samples); + + return seconds; +} + +bool AacDecoder::GetBuffer(IBuffer* target) { + if (this->decoderSampleId < 0) { + return false; + } + + void* sampleBuffer = NULL; + unsigned char* encodedData = NULL; + unsigned int encodedDataLength = 0; + NeAACDecFrameInfo frameInfo; + + /* get acces unit from MP4 file */ + + long duration = mp4ff_get_sample_duration( + decoderFile, audioTrackId, decoderSampleId); + + if (duration <= 0) { + return false; + } + + /* read the raw data required */ + + int rc = + mp4ff_read_sample( + decoderFile, + audioTrackId, + decoderSampleId, + &encodedData, + &encodedDataLength); + + decoderSampleId++; + + if (rc == 0 || encodedData == NULL) { + return false; + } + + sampleBuffer = + NeAACDecDecode( + decoder, + &frameInfo, + encodedData, + encodedDataLength); + + free(encodedData); + + if (frameInfo.error > 0) { + return false; + } + + if (decoderSampleId > this->totalSamples) { + return false; + } + + target->SetSampleRate(frameInfo.samplerate); + target->SetChannels(frameInfo.channels); + target->SetSamples(frameInfo.samples / frameInfo.channels); + + memcpy( + static_cast(target->BufferPointer()), + static_cast(sampleBuffer), + sizeof(float) * frameInfo.samples); + + return true; +} diff --git a/src/contrib/aacdecoder/AacDecoder.h b/src/contrib/aacdecoder/AacDecoder.h new file mode 100644 index 000000000..18c42feb8 --- /dev/null +++ b/src/contrib/aacdecoder/AacDecoder.h @@ -0,0 +1,27 @@ +#pragma once + +#include + +#include +#include + +class AacDecoder : public musik::core::audio::IDecoder { + public: + AacDecoder(); + ~AacDecoder(); + + virtual void Destroy(); + virtual double SetPosition(double seconds); + virtual bool GetBuffer(musik::core::audio::IBuffer *buffer); + virtual bool Open(musik::core::io::IDataStream *stream); + + private: + NeAACDecHandle decoder; + mp4ff_t* decoderFile; + mp4ff_callback_t decoderCallbacks; + int audioTrackId; + long totalSamples; + unsigned long sampleRate; + unsigned char channelCount; + long decoderSampleId; +}; diff --git a/src/contrib/aacdecoder/AACSourceSupplier.cpp b/src/contrib/aacdecoder/AacDecoderFactory.cpp similarity index 69% rename from src/contrib/aacdecoder/AACSourceSupplier.cpp rename to src/contrib/aacdecoder/AacDecoderFactory.cpp index d05b91237..e1cf78d47 100644 --- a/src/contrib/aacdecoder/AACSourceSupplier.cpp +++ b/src/contrib/aacdecoder/AacDecoderFactory.cpp @@ -33,45 +33,35 @@ #include "stdafx.h" -#include "AACSourceSupplier.h" -#include "m4aAudioSource.h" +#include "AacDecoderFactory.h" +#include "AacDecoder.h" +#include -#include "boost/algorithm/string.hpp" -#include "boost/filesystem.hpp" +using musik::core::audio::IDecoder; -AACSourceSupplier::AACSourceSupplier(void) -{ +AacDecoderFactory::AacDecoderFactory() { } -AACSourceSupplier::~AACSourceSupplier(void) -{ +AacDecoderFactory::~AacDecoderFactory() { } -void AACSourceSupplier::Destroy() -{ +void AacDecoderFactory::Destroy() { delete this; } -IAudioSource* AACSourceSupplier::CreateAudioSource() -{ - return new M4ADecoder(); +IDecoder* AacDecoderFactory::CreateDecoder() { + return new AacDecoder(); } -bool AACSourceSupplier::CanHandle(const utfchar* source) const -{ - using namespace boost::filesystem; - using namespace boost::algorithm; +bool AacDecoderFactory::CanHandle(const char* type) const { + std::string str(type); + std::transform(str.begin(), str.end(), str.begin(), tolower); - wpath sourcepath(source); - - if (!is_regular(sourcepath)) - return false; - - if (to_lower_copy(extension(sourcepath)) != _T(".aac") && - to_lower_copy(extension(sourcepath)) != _T(".m4a") ) - return false; - - return true; + return + musik::sdk::endsWith(str, ".aac") || + musik::sdk::endsWith(str, ".m4a") || + str.find("audio/aac") != std::string::npos || + str.find("audio/mp4") != std::string::npos; } diff --git a/src/contrib/aacdecoder/AACSourceSupplier.h b/src/contrib/aacdecoder/AacDecoderFactory.h similarity index 82% rename from src/contrib/aacdecoder/AACSourceSupplier.h rename to src/contrib/aacdecoder/AacDecoderFactory.h index 7ab4f38dd..dad5bc2cf 100644 --- a/src/contrib/aacdecoder/AACSourceSupplier.h +++ b/src/contrib/aacdecoder/AacDecoderFactory.h @@ -33,16 +33,14 @@ #pragma once -#include "IAudioSource.h" +#include -using namespace musik::core::audio; +class AacDecoderFactory : public musik::core::audio::IDecoderFactory { + public: + AacDecoderFactory(); + virtual ~AacDecoderFactory(); -class AACSourceSupplier : public IAudioSourceSupplier -{ -public: AACSourceSupplier(); -public: ~AACSourceSupplier(); - -public: IAudioSource* CreateAudioSource(); -public: void Destroy(); -public: bool CanHandle(const utfchar* source) const; + musik::core::audio::IDecoder* CreateDecoder(); + void Destroy(); + bool CanHandle(const char* source) const; }; diff --git a/src/contrib/aacdecoder/aacdecoder.vcproj b/src/contrib/aacdecoder/aacdecoder.vcproj index af41134ea..1d2673876 100644 --- a/src/contrib/aacdecoder/aacdecoder.vcproj +++ b/src/contrib/aacdecoder/aacdecoder.vcproj @@ -598,11 +598,11 @@ Name="plugin" > {4993E68D-E97A-4CD2-AC8E-168AE315BAC5} aacdecoder Win32Proj + 8.1 DynamicLibrary + v140 Unicode true - v140 DynamicLibrary - Unicode v140 + Unicode @@ -38,28 +39,31 @@ - <_ProjectFileVersion>10.0.40219.1 - $(SolutionDir)/bin/$(Configuration)/plugins\ - $(SolutionDir)/obj/$(Configuration)\ - $(SolutionDir)/bin/$(Configuration)/plugins\ - $(SolutionDir)/obj/$(Configuration)\ - AllRules.ruleset - - - AllRules.ruleset - - + <_ProjectFileVersion>14.0.25123.0 + + + $(SolutionDir)/bin/$(Configuration)/plugins\ + ./obj/$(Configuration)\ + MinimumRecommendedRules.ruleset + + + + + $(SolutionDir)/bin/$(Configuration)/plugins\ + ./obj/$(Configuration)\ + MinimumRecommendedRules.ruleset + + Disabled - ../../core/audio;../../;../../3rdparty/include;%(AdditionalIncludeDirectories) + ./;../../;../../3rdparty/include;./mp4ff;./libfaad;%(AdditionalIncludeDirectories) WIN32;_DEBUG;_WINDOWS;_USRDLL;AACDECODER_EXPORTS;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug - - + Level3 EditAndContinue @@ -70,11 +74,10 @@ - ../../core/audio;../../;../../3rdparty/include;%(AdditionalIncludeDirectories) + ./;../../;../../3rdparty/include;./mp4ff;./libfaad;%(AdditionalIncludeDirectories) WIN32;NDEBUG;_WINDOWS;_USRDLL;AACDECODER_EXPORTS;%(PreprocessorDefinitions) MultiThreaded - - + Level3 ProgramDatabase @@ -83,18 +86,11 @@ + - - - - - - - - @@ -108,6 +104,12 @@ + + + + + + @@ -115,14 +117,13 @@ + - - - - + + @@ -146,17 +147,21 @@ - - + + + + + + - + @@ -166,15 +171,11 @@ - - - - - - + + @@ -193,9 +194,13 @@ - - - + + + + + + + diff --git a/src/contrib/aacdecoder/aacdecoder.vcxproj.filters b/src/contrib/aacdecoder/aacdecoder.vcxproj.filters index d136b896b..2f8137bd9 100755 --- a/src/contrib/aacdecoder/aacdecoder.vcxproj.filters +++ b/src/contrib/aacdecoder/aacdecoder.vcxproj.filters @@ -5,14 +5,95 @@ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav - - {a25795f5-4cce-4cf6-8adb-70a3b40c4070} - - {c7d5fc81-078c-4e75-8864-254c9279ec07} + {37be8e13-9515-4d79-8e2b-a9486ca27f9b} + + + {795089cd-ac9e-4f29-abe4-60d703516eb8} + + + {97896785-abd6-4910-bfe3-4f426916a0ea} + + + {c6bb8215-e205-4007-a8ae-fd9ba8992ac0} + + plugin + + + mp4ff + + + mp4ff + + + mp4ff + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad\codebook + + + libfaad + + + libfaad + + + libfaad + + + libfaad + + + libfaad + + + libfaad + + + libfaad + + + libfaad + libfaad @@ -28,16 +109,10 @@ libfaad - - libfaad - libfaad - - libfaad - - + libfaad @@ -49,45 +124,6 @@ libfaad - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - libfaad @@ -109,30 +145,27 @@ libfaad + + libfaad + libfaad - - libfaad - - - libfaad - - - libfaad - libfaad - - libfaad - libfaad libfaad + + libfaad + + + libfaad + libfaad @@ -178,41 +211,38 @@ libfaad - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - + plugin - - plugin - - + plugin + + plugin + + + plugin + + + mp4ff + + + mp4ff + + + mp4ff + + + mp4ff + + + mp4ff + + + mp4ff + libfaad @@ -228,7 +258,7 @@ libfaad - + libfaad @@ -258,24 +288,6 @@ libfaad - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - - - libfaad - libfaad @@ -285,6 +297,12 @@ libfaad + + libfaad + + + libfaad + libfaad @@ -339,16 +357,10 @@ libfaad - + plugin - - plugin - - - plugin - - + plugin diff --git a/src/contrib/aacdecoder/accdecoder_plugin.cpp b/src/contrib/aacdecoder/accdecoder_plugin.cpp index 4e3b8ddd9..974a1ac2e 100644 --- a/src/contrib/aacdecoder/accdecoder_plugin.cpp +++ b/src/contrib/aacdecoder/accdecoder_plugin.cpp @@ -36,29 +36,33 @@ #include "stdafx.h" -#include "AACSourceSupplier.h" -#include +#include "AacDecoderFactory.h" +#include -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ +#ifdef WIN32 +#define DLLEXPORT __declspec(dllexport) +#else +#define DLLEXPORT +#endif + +#ifdef WIN32 +BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return true; } +#endif -class AACDecoderPlugin : public musik::core::IPlugin -{ - void Destroy() { delete this; }; - - const utfchar* Name() { return TEXT("AAC decoder"); }; - const utfchar* Version() { return TEXT("1"); }; - const utfchar* Author() { return TEXT("Björn Olievier"); }; +class AacDecoderPlugin : public musik::core::IPlugin { + public: + virtual void Destroy() { delete this; }; + virtual const char* Name() { return "AAC IDecoder"; }; + virtual const char* Version() { return "0.2"; }; + virtual const char* Author() { return "Björn Olievier, clangen"; }; }; -extern "C" __declspec(dllexport) musik::core::IPlugin* GetPlugin() -{ - return new AACDecoderPlugin(); +extern "C" DLLEXPORT musik::core::IPlugin* GetPlugin() { + return new AacDecoderPlugin(); } -extern "C" __declspec(dllexport) IAudioSourceSupplier* CreateAudioSourceSupplier() -{ - return new AACSourceSupplier(); +extern "C" DLLEXPORT musik::core::audio::IDecoderFactory* GetDecoderFactory() { + return new AacDecoderFactory(); } diff --git a/src/contrib/aacdecoder/libfaad/analysis.h b/src/contrib/aacdecoder/libfaad/analysis.h old mode 100644 new mode 100755 index 627429c8c..50e43fa04 --- a/src/contrib/aacdecoder/libfaad/analysis.h +++ b/src/contrib/aacdecoder/libfaad/analysis.h @@ -1,49 +1,52 @@ -/* -** 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: analysis.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __ANALYSIS_H__ -#define __ANALYSIS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef ANALYSIS -#define DEBUGDEC ,uint8_t print,uint16_t var,uint8_t *dbg -#define DEBUGVAR(A,B,C) ,A,B,C -extern uint16_t dbg_count; -#else -#define DEBUGDEC -#define DEBUGVAR(A,B,C) -#endif - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: analysis.h,v 1.18 2007/11/01 12:33:29 menno Exp $ +**/ + +#ifndef __ANALYSIS_H__ +#define __ANALYSIS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef ANALYSIS +#define DEBUGDEC ,uint8_t print,uint16_t var,uint8_t *dbg +#define DEBUGVAR(A,B,C) ,A,B,C +extern uint16_t dbg_count; +#else +#define DEBUGDEC +#define DEBUGVAR(A,B,C) +#endif + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/bits.c b/src/contrib/aacdecoder/libfaad/bits.c old mode 100644 new mode 100755 index 63bd00fc1..dc14d7a03 --- a/src/contrib/aacdecoder/libfaad/bits.c +++ b/src/contrib/aacdecoder/libfaad/bits.c @@ -1,213 +1,271 @@ -/* -** 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: bits.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include -#include -#include "bits.h" - -/* initialize buffer, call once before first getbits or showbits */ -void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size) -{ - uint32_t tmp; - - if (ld == NULL) - return; - - memset(ld, 0, sizeof(bitfile)); - - if (buffer_size == 0 || _buffer == NULL) - { - ld->error = 1; - ld->no_more_reading = 1; - return; - } - - ld->buffer = faad_malloc((buffer_size+12)*sizeof(uint8_t)); - 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 (ld) - { - if (ld->buffer) - { - faad_free(ld->buffer); - ld->buffer = NULL; - } - } -} - -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; -} - -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; -} - -/* rewind to beginning */ -void faad_rewindbits(bitfile *ld) -{ - uint32_t tmp; - - tmp = ld->start[0]; -#ifndef ARCH_IS_BIG_ENDIAN - BSWAP(tmp); -#endif - ld->bufa = tmp; - - tmp = ld->start[1]; -#ifndef ARCH_IS_BIG_ENDIAN - BSWAP(tmp); -#endif - ld->bufb = tmp; - ld->bits_left = 32; - ld->tail = &ld->start[2]; - ld->bytes_used = 0; - ld->no_more_reading = 0; -} - -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; -} - -#ifdef DRM -/* return the original data buffer */ -void *faad_origbitbuffer(bitfile *ld) -{ - return (void*)ld->start; -} - -/* return the original data buffer size */ -uint32_t faad_origbitbuffer_size(bitfile *ld) -{ - return ld->buffer_size; -} -#endif - -/* reversed bit reading routines, used for RVLC and HCR */ -void faad_initbits_rev(bitfile *ld, void *buffer, - uint32_t bits_in_buffer) -{ - uint32_t tmp; - int32_t index; - - ld->buffer_size = bit2byte(bits_in_buffer); - - index = (bits_in_buffer+31)/32 - 1; - - ld->start = (uint32_t*)buffer + index - 2; - - tmp = getdword((uint32_t*)buffer + index); - ld->bufa = tmp; - - tmp = getdword((uint32_t*)buffer + index - 1); - ld->bufb = tmp; - - ld->tail = (uint32_t*)buffer + index; - - ld->bits_left = bits_in_buffer % 32; - if (ld->bits_left == 0) - ld->bits_left = 32; - - ld->bytes_used = 0; - ld->no_more_reading = 0; - ld->error = 0; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: bits.c,v 1.44 2007/11/01 12:33:29 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include +#include "bits.h" + +/* initialize buffer, call once before first getbits or showbits */ +void faad_initbits(bitfile *ld, const void *_buffer, const uint32_t buffer_size) +{ + uint32_t tmp; + + if (ld == NULL) + return; + + // useless + //memset(ld, 0, sizeof(bitfile)); + + if (buffer_size == 0 || _buffer == NULL) + { + ld->error = 1; + return; + } + + ld->buffer = _buffer; + + ld->buffer_size = buffer_size; + ld->bytes_left = buffer_size; + + if (ld->bytes_left >= 4) + { + tmp = getdword((uint32_t*)ld->buffer); + ld->bytes_left -= 4; + } else { + tmp = getdword_n((uint32_t*)ld->buffer, ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufa = tmp; + + if (ld->bytes_left >= 4) + { + tmp = getdword((uint32_t*)ld->buffer + 1); + ld->bytes_left -= 4; + } else { + tmp = getdword_n((uint32_t*)ld->buffer + 1, ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufb = tmp; + + ld->start = (uint32_t*)ld->buffer; + ld->tail = ((uint32_t*)ld->buffer + 2); + + ld->bits_left = 32; + + ld->error = 0; +} + +void faad_endbits(bitfile *ld) +{ + // void +} + +uint32_t faad_get_processed_bits(bitfile *ld) +{ + return (uint32_t)(8 * (4*(ld->tail - ld->start) - 4) - (ld->bits_left)); +} + +uint8_t faad_byte_align(bitfile *ld) +{ + int remainder = (32 - ld->bits_left) & 0x7; + + if (remainder) + { + faad_flushbits(ld, 8 - remainder); + return (uint8_t)(8 - remainder); + } + return 0; +} + +void faad_flushbits_ex(bitfile *ld, uint32_t bits) +{ + uint32_t tmp; + + ld->bufa = ld->bufb; + if (ld->bytes_left >= 4) + { + tmp = getdword(ld->tail); + ld->bytes_left -= 4; + } else { + tmp = getdword_n(ld->tail, ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufb = tmp; + ld->tail++; + ld->bits_left += (32 - bits); + //ld->bytes_left -= 4; +// if (ld->bytes_left == 0) +// ld->no_more_reading = 1; +// if (ld->bytes_left < 0) +// ld->error = 1; +} + +/* rewind to beginning */ +void faad_rewindbits(bitfile *ld) +{ + uint32_t tmp; + + ld->bytes_left = ld->buffer_size; + + if (ld->bytes_left >= 4) + { + tmp = getdword((uint32_t*)&ld->start[0]); + ld->bytes_left -= 4; + } else { + tmp = getdword_n((uint32_t*)&ld->start[0], ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufa = tmp; + + if (ld->bytes_left >= 4) + { + tmp = getdword((uint32_t*)&ld->start[1]); + ld->bytes_left -= 4; + } else { + tmp = getdword_n((uint32_t*)&ld->start[1], ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufb = tmp; + + ld->bits_left = 32; + ld->tail = &ld->start[2]; +} + +/* reset to a certain point */ +void faad_resetbits(bitfile *ld, int bits) +{ + uint32_t tmp; + int words = bits >> 5; + int remainder = bits & 0x1F; + + ld->bytes_left = ld->buffer_size - words*4; + + if (ld->bytes_left >= 4) + { + tmp = getdword(&ld->start[words]); + ld->bytes_left -= 4; + } else { + tmp = getdword_n(&ld->start[words], ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufa = tmp; + + if (ld->bytes_left >= 4) + { + tmp = getdword(&ld->start[words+1]); + ld->bytes_left -= 4; + } else { + tmp = getdword_n(&ld->start[words+1], ld->bytes_left); + ld->bytes_left = 0; + } + ld->bufb = tmp; + + ld->bits_left = 32 - remainder; + ld->tail = &ld->start[words+2]; + + /* recheck for reading too many bytes */ + ld->error = 0; +// if (ld->bytes_left == 0) +// ld->no_more_reading = 1; +// if (ld->bytes_left < 0) +// ld->error = 1; +} + +uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits + DEBUGDEC) +{ + int i; + unsigned int temp; + int bytes = bits >> 3; + int remainder = bits & 0x7; + + uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t)); + + for (i = 0; i < bytes; i++) + { + buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg)); + } + + if (remainder) + { + temp = faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder); + + buffer[bytes] = (uint8_t)temp; + } + + return buffer; +} + +#ifdef DRM +/* return the original data buffer */ +void *faad_origbitbuffer(bitfile *ld) +{ + return (void*)ld->start; +} + +/* return the original data buffer size */ +uint32_t faad_origbitbuffer_size(bitfile *ld) +{ + return ld->buffer_size; +} +#endif + +/* reversed bit reading routines, used for RVLC and HCR */ +void faad_initbits_rev(bitfile *ld, void *buffer, + uint32_t bits_in_buffer) +{ + uint32_t tmp; + int32_t index; + + ld->buffer_size = bit2byte(bits_in_buffer); + + index = (bits_in_buffer+31)/32 - 1; + + ld->start = (uint32_t*)buffer + index - 2; + + tmp = getdword((uint32_t*)buffer + index); + ld->bufa = tmp; + + tmp = getdword((uint32_t*)buffer + index - 1); + ld->bufb = tmp; + + ld->tail = (uint32_t*)buffer + index; + + ld->bits_left = bits_in_buffer % 32; + if (ld->bits_left == 0) + ld->bits_left = 32; + + ld->bytes_left = ld->buffer_size; + ld->error = 0; +} + +/* EOF */ diff --git a/src/contrib/aacdecoder/libfaad/bits.h b/src/contrib/aacdecoder/libfaad/bits.h old mode 100644 new mode 100755 index b29c98b97..e303e8e72 --- a/src/contrib/aacdecoder/libfaad/bits.h +++ b/src/contrib/aacdecoder/libfaad/bits.h @@ -1,377 +1,452 @@ -/* -** 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: bits.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __BITS_H__ -#define __BITS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "common.h" -#include "analysis.h" -#ifdef ANALYSIS -#include -#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; - - -#define BSWAP(a) \ - ((a) = ( ((a)&0xff)<<24) | (((a)&0xff00)<<8) | (((a)>>8)&0xff00) | (((a)>>24)&0xff)) - -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); -void faad_initbits_rev(bitfile *ld, void *buffer, - uint32_t bits_in_buffer); -uint8_t faad_byte_align(bitfile *ld); -uint32_t faad_get_processed_bits(bitfile *ld); -void faad_flushbits_ex(bitfile *ld, uint32_t bits); -void faad_rewindbits(bitfile *ld); -uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits - DEBUGDEC); -#ifdef DRM -void *faad_origbitbuffer(bitfile *ld); -uint32_t faad_origbitbuffer_size(bitfile *ld); -#endif - -/* circumvent memory alignment errors on ARM */ -static INLINE uint32_t getdword(void *mem) -{ -#ifdef ARM - uint32_t tmp; -#ifndef ARCH_IS_BIG_ENDIAN - ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3]; - ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2]; - ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1]; - ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0]; -#else - ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; - ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; - ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; - ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3]; -#endif - - return tmp; -#else - uint32_t tmp; - tmp = *(uint32_t*)mem; -#ifndef ARCH_IS_BIG_ENDIAN - BSWAP(tmp); -#endif - return tmp; -#endif -} - -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 INLINE 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 +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: bits.h,v 1.45 2007/11/01 12:33:29 menno Exp $ +**/ + +#ifndef __BITS_H__ +#define __BITS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "analysis.h" +#ifdef ANALYSIS +#include +#endif + +#define BYTE_NUMBIT 8 +#define BYTE_NUMBIT_LD 3 +//#define bit2byte(a) ((a+7)/BYTE_NUMBIT) +#define bit2byte(a) ((a+7)>>BYTE_NUMBIT_LD) + +typedef struct _bitfile +{ + /* bit input */ + uint32_t bufa; + uint32_t bufb; + uint32_t bits_left; + uint32_t buffer_size; /* size of the buffer in bytes */ + uint32_t bytes_left; + uint8_t error; + uint32_t *tail; + uint32_t *start; + const void *buffer; +} bitfile; + + +#if 0 +static uint32_t const bitmask[] = { + 0x0, 0x1, 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, + 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, + 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, + 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF, 0x7FFFFFF, + 0xFFFFFFF, 0x1FFFFFFF, 0x3FFFFFFF, 0x7FFFFFFF + /* added bitmask 32, correct?!?!?! */ + , 0xFFFFFFFF +}; +#endif + +void faad_initbits(bitfile *ld, const void *buffer, const uint32_t buffer_size); +void faad_endbits(bitfile *ld); +void faad_initbits_rev(bitfile *ld, void *buffer, + uint32_t bits_in_buffer); +uint8_t faad_byte_align(bitfile *ld); +uint32_t faad_get_processed_bits(bitfile *ld); +void faad_flushbits_ex(bitfile *ld, uint32_t bits); +void faad_rewindbits(bitfile *ld); +void faad_resetbits(bitfile *ld, int bits); +uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits + DEBUGDEC); +#ifdef DRM +void *faad_origbitbuffer(bitfile *ld); +uint32_t faad_origbitbuffer_size(bitfile *ld); +#endif + +/* circumvent memory alignment errors on ARM */ +static INLINE uint32_t getdword(void *mem) +{ + uint32_t tmp; +#ifndef ARCH_IS_BIG_ENDIAN + ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[3]; + ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2]; + ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1]; + ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0]; +#else + ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; + ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; + ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; + ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[3]; +#endif + + return tmp; +} + +/* reads only n bytes from the stream instead of the standard 4 */ +static /*INLINE*/ uint32_t getdword_n(void *mem, int n) +{ + uint32_t tmp = 0; +#ifndef ARCH_IS_BIG_ENDIAN + switch (n) + { + case 3: + ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[2]; + case 2: + ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[1]; + case 1: + ((uint8_t*)&tmp)[3] = ((uint8_t*)mem)[0]; + default: + break; + } +#else + switch (n) + { + case 3: + ((uint8_t*)&tmp)[2] = ((uint8_t*)mem)[2]; + case 2: + ((uint8_t*)&tmp)[1] = ((uint8_t*)mem)[1]; + case 1: + ((uint8_t*)&tmp)[0] = ((uint8_t*)mem)[0]; + default: + break; + } +#endif + + return tmp; +} + +static INLINE uint32_t faad_showbits(bitfile *ld, uint32_t bits) +{ + if (bits <= ld->bits_left) + { + //return (ld->bufa >> (ld->bits_left - bits)) & bitmask[bits]; + return (ld->bufa << (32 - ld->bits_left)) >> (32 - bits); + } + + bits -= ld->bits_left; + //return ((ld->bufa & bitmask[ld->bits_left]) << bits) | (ld->bufb >> (32 - bits)); + return ((ld->bufa & ((1<bits_left)-1)) << bits) | (ld->bufb >> (32 - bits)); +} + +static INLINE void faad_flushbits(bitfile *ld, uint32_t bits) +{ + /* do nothing if error */ + if (ld->error != 0) + return; + + if (bits < ld->bits_left) + { + ld->bits_left -= bits; + } else { + faad_flushbits_ex(ld, bits); + } +} + +/* return next n bits (right adjusted) */ +static /*INLINE*/ uint32_t faad_getbits(bitfile *ld, uint32_t n DEBUGDEC) +{ + uint32_t ret; + + if (n == 0) + return 0; + + ret = faad_showbits(ld, n); + faad_flushbits(ld, n); + +#ifdef ANALYSIS + if (print) + fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg); +#endif + + return ret; +} + +static INLINE uint8_t faad_get1bit(bitfile *ld DEBUGDEC) +{ + uint8_t r; + + if (ld->bits_left > 0) + { + ld->bits_left--; + r = (uint8_t)((ld->bufa >> ld->bits_left) & 1); + return r; + } + + /* bits_left == 0 */ +#if 0 + r = (uint8_t)(ld->bufb >> 31); + faad_flushbits_ex(ld, 1); +#else + r = (uint8_t)faad_getbits(ld, 1); +#endif + return r; +} + +/* reversed bitreading routines */ +static INLINE uint32_t faad_showbits_rev(bitfile *ld, uint32_t bits) +{ + uint8_t i; + uint32_t B = 0; + + if (bits <= ld->bits_left) + { + for (i = 0; i < bits; i++) + { + if (ld->bufa & (1 << (i + (32 - ld->bits_left)))) + B |= (1 << (bits - i - 1)); + } + return B; + } else { + for (i = 0; i < ld->bits_left; i++) + { + if (ld->bufa & (1 << (i + (32 - ld->bits_left)))) + B |= (1 << (bits - i - 1)); + } + for (i = 0; i < bits - ld->bits_left; i++) + { + if (ld->bufb & (1 << (i + (32-ld->bits_left)))) + B |= (1 << (bits - ld->bits_left - i - 1)); + } + return B; + } +} + +static INLINE void faad_flushbits_rev(bitfile *ld, uint32_t bits) +{ + /* do nothing if error */ + if (ld->error != 0) + return; + + if (bits < ld->bits_left) + { + ld->bits_left -= bits; + } else { + uint32_t tmp; + + ld->bufa = ld->bufb; + tmp = getdword(ld->start); + ld->bufb = tmp; + ld->start--; + ld->bits_left += (32 - bits); + + if (ld->bytes_left < 4) + { + ld->error = 1; + ld->bytes_left = 0; + } else { + ld->bytes_left -= 4; + } +// if (ld->bytes_left == 0) +// ld->no_more_reading = 1; + } +} + +static /*INLINE*/ uint32_t faad_getbits_rev(bitfile *ld, uint32_t n + DEBUGDEC) +{ + uint32_t ret; + + if (n == 0) + return 0; + + ret = faad_showbits_rev(ld, n); + faad_flushbits_rev(ld, n); + +#ifdef ANALYSIS + if (print) + fprintf(stdout, "%4d %2d bits, val: %4d, variable: %d %s\n", dbg_count++, n, ret, var, dbg); +#endif + + return ret; +} + +#ifdef DRM +/* CRC lookup table for G8 polynome in DRM standard */ +static const uint8_t crc_table_G8[256] = { + 0x0, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, + 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, + 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, + 0x25, 0x38, 0x1f, 0x2, 0x51, 0x4c, 0x6b, 0x76, + 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, + 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x6, 0x21, 0x3c, + 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x4, 0x19, + 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, + 0x13, 0xe, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, + 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, + 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, + 0x36, 0x2b, 0xc, 0x11, 0x42, 0x5f, 0x78, 0x65, + 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, + 0x7c, 0x61, 0x46, 0x5b, 0x8, 0x15, 0x32, 0x2f, + 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0xa, + 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, + 0x26, 0x3b, 0x1c, 0x1, 0x52, 0x4f, 0x68, 0x75, + 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, + 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, + 0x3, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, + 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, + 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x7, 0x1a, + 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x5, 0x22, 0x3f, + 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, + 0x35, 0x28, 0xf, 0x12, 0x41, 0x5c, 0x7b, 0x66, + 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, + 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, + 0x10, 0xd, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, + 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, + 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x9, + 0x7f, 0x62, 0x45, 0x58, 0xb, 0x16, 0x31, 0x2c, + 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4, +}; + +static uint8_t faad_check_CRC(bitfile *ld, uint16_t len) +{ + int bytes, rem; + unsigned int CRC; + unsigned int r=255; /* Initialize to all ones */ + + /* CRC polynome used x^8 + x^4 + x^3 + x^2 +1 */ +#define GPOLY 0435 + + faad_rewindbits(ld); + + CRC = (unsigned int) ~faad_getbits(ld, 8 + DEBUGVAR(1,999,"faad_check_CRC(): CRC")) & 0xFF; /* CRC is stored inverted */ + + bytes = len >> 3; + rem = len & 0x7; + + for (; bytes > 0; bytes--) + { + r = crc_table_G8[( r ^ faad_getbits(ld, 8 DEBUGVAR(1,998,"")) ) & 0xFF]; + } + for (; rem > 0; rem--) + { + r = ( (r << 1) ^ (( ( faad_get1bit(ld + DEBUGVAR(1,998,"")) & 1) ^ ((r >> 7) & 1)) * GPOLY )) & 0xFF; + } + + if (r != CRC) + // if (0) + { + return 28; + } else { + return 0; + } +} + +static uint8_t tabFlipbits[256] = { + 0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240, + 8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248, + 4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244, + 12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252, + 2,130,66,194,34,162,98,226,18,146,82,210,50,178,114,242, + 10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250, + 6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246, + 14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254, + 1,129,65,193,33,161,97,225,17,145,81,209,49,177,113,241, + 9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249, + 5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245, + 13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253, + 3,131,67,195,35,163,99,227,19,147,83,211,51,179,115,243, + 11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251, + 7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247, + 15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255 +}; +#endif + +#ifdef ERROR_RESILIENCE + +/* Modified bit reading functions for HCR */ + +typedef struct +{ + /* bit input */ + uint32_t bufa; + uint32_t bufb; + int8_t len; +} bits_t; + + +static INLINE uint32_t showbits_hcr(bits_t *ld, uint8_t bits) +{ + if (bits == 0) return 0; + if (ld->len <= 32) + { + /* huffman_spectral_data_2 needs to read more than may be available, bits maybe + > ld->len, deliver 0 than */ + if (ld->len >= bits) + return ((ld->bufa >> (ld->len - bits)) & (0xFFFFFFFF >> (32 - bits))); + else + return ((ld->bufa << (bits - ld->len)) & (0xFFFFFFFF >> (32 - bits))); + } else { + if ((ld->len - bits) < 32) + { + return ( (ld->bufb & (0xFFFFFFFF >> (64 - ld->len))) << (bits - ld->len + 32)) | + (ld->bufa >> (ld->len - bits)); + } else { + return ((ld->bufb >> (ld->len - bits - 32)) & (0xFFFFFFFF >> (32 - bits))); + } + } +} + +/* return 1 if position is outside of buffer, 0 otherwise */ +static INLINE int8_t flushbits_hcr( bits_t *ld, uint8_t bits) +{ + ld->len -= bits; + + if (ld->len <0) + { + ld->len = 0; + return 1; + } else { + return 0; + } +} + +static INLINE int8_t getbits_hcr(bits_t *ld, uint8_t n, uint32_t *result) +{ + *result = showbits_hcr(ld, n); + return flushbits_hcr(ld, n); +} + +static INLINE int8_t get1bit_hcr(bits_t *ld, uint8_t *result) +{ + uint32_t res; + int8_t ret; + + ret = getbits_hcr(ld, 1, &res); + *result = (int8_t)(res & 1); + return ret; +} + +#endif + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/cfft.c b/src/contrib/aacdecoder/libfaad/cfft.c old mode 100644 new mode 100755 index ce8536a0c..5b01d75d3 --- a/src/contrib/aacdecoder/libfaad/cfft.c +++ b/src/contrib/aacdecoder/libfaad/cfft.c @@ -1,1406 +1,1005 @@ -/* -** 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: cfft.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* - * Algorithmically based on Fortran-77 FFTPACK - * by Paul N. Swarztrauber(Version 4, 1985). - * - * Does even sized fft only - */ - -/* isign is +1 for backward and -1 for forward transforms */ - -#include "common.h" -#include "structs.h" - -#include - -#include "cfft.h" -#include "cfft_tab.h" - - -/* static function declarations */ -#ifdef USE_SSE -static void passf2pos_sse(const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf2pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf4pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -#endif -static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa); -static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); -static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); -static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, - const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, - const complex_t *wa4, const int8_t isign); -INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, const int8_t isign); -static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); - - -/*---------------------------------------------------------------------- - passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd. - ----------------------------------------------------------------------*/ - -#if 0 //def USE_SSE -static void passf2pos_sse(const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa) -{ - uint16_t k, ah, ac; - - for (k = 0; k < l1; k++) - { - ah = 2*k; - ac = 4*k; - - RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); - IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); - - RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); - IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); - } -} - -static void passf2pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa) -{ - uint16_t i, k, ah, ac; - - for (k = 0; k < l1; k++) - { - ah = k*ido; - ac = 2*k*ido; - - for (i = 0; i < ido; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14; - __m128 m15, m16, m17, m18, m19, m20, m21, m22, m23, m24; - __m128 w1, w2, w3, w4; - - m1 = _mm_load_ps(&RE(cc[ac+i])); - m2 = _mm_load_ps(&RE(cc[ac+ido+i])); - m5 = _mm_load_ps(&RE(cc[ac+i+2])); - m6 = _mm_load_ps(&RE(cc[ac+ido+i+2])); - w1 = _mm_load_ps(&RE(wa[i])); - w3 = _mm_load_ps(&RE(wa[i+2])); - - m3 = _mm_add_ps(m1, m2); - m15 = _mm_add_ps(m5, m6); - - m4 = _mm_sub_ps(m1, m2); - m16 = _mm_sub_ps(m5, m6); - - _mm_store_ps(&RE(ch[ah+i]), m3); - _mm_store_ps(&RE(ch[ah+i+2]), m15); - - - w2 = _mm_shuffle_ps(w1, w1, _MM_SHUFFLE(2, 3, 0, 1)); - w4 = _mm_shuffle_ps(w3, w3, _MM_SHUFFLE(2, 3, 0, 1)); - - m7 = _mm_mul_ps(m4, w1); - m17 = _mm_mul_ps(m16, w3); - m8 = _mm_mul_ps(m4, w2); - m18 = _mm_mul_ps(m16, w4); - - m9 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(2, 0, 2, 0)); - m19 = _mm_shuffle_ps(m17, m18, _MM_SHUFFLE(2, 0, 2, 0)); - m10 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(3, 1, 3, 1)); - m20 = _mm_shuffle_ps(m17, m18, _MM_SHUFFLE(3, 1, 3, 1)); - - m11 = _mm_add_ps(m9, m10); - m21 = _mm_add_ps(m19, m20); - m12 = _mm_sub_ps(m9, m10); - m22 = _mm_sub_ps(m19, m20); - - m13 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(0, 0, 3, 2)); - m23 = _mm_shuffle_ps(m21, m21, _MM_SHUFFLE(0, 0, 3, 2)); - - m14 = _mm_unpacklo_ps(m12, m13); - m24 = _mm_unpacklo_ps(m22, m23); - - _mm_store_ps(&RE(ch[ah+i+l1*ido]), m14); - _mm_store_ps(&RE(ch[ah+i+2+l1*ido]), m24); - } - } -} -#endif - -static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa) -{ - uint16_t i, k, ah, ac; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - ah = 2*k; - ac = 4*k; - - RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); - RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); - IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); - IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); - } - } else { - for (k = 0; k < l1; k++) - { - ah = k*ido; - ac = 2*k*ido; - - for (i = 0; i < ido; i++) - { - complex_t t2; - - RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); - RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); - - IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); - IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); - -#if 1 - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); -#else - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); -#endif - } - } - } -} - -static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa) -{ - uint16_t i, k, ah, ac; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - ah = 2*k; - ac = 4*k; - - RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); - RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); - IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); - IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); - } - } else { - for (k = 0; k < l1; k++) - { - ah = k*ido; - ac = 2*k*ido; - - for (i = 0; i < ido; i++) - { - complex_t t2; - - RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); - RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); - - IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); - IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); - -#if 1 - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); -#else - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); -#endif - } - } - } -} - - -static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const int8_t isign) -{ - static real_t taur = FRAC_CONST(-0.5); - static real_t taui = FRAC_CONST(0.866025403784439); - uint16_t i, k, ac, ah; - complex_t c2, c3, d2, d3, t2; - - if (ido == 1) - { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - ac = 3*k+1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); - - RE(ch[ah+l1]) = RE(c2) - IM(c3); - IM(ch[ah+l1]) = IM(c2) + RE(c3); - RE(ch[ah+2*l1]) = RE(c2) + IM(c3); - IM(ch[ah+2*l1]) = IM(c2) - RE(c3); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 3*k+1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); - - RE(ch[ah+l1]) = RE(c2) + IM(c3); - IM(ch[ah+l1]) = IM(c2) - RE(c3); - RE(ch[ah+2*l1]) = RE(c2) - IM(c3); - IM(ch[ah+2*l1]) = IM(c2) + RE(c3); - } - } - } else { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (3*k+1)*ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); - IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); - - RE(d2) = RE(c2) - IM(c3); - IM(d3) = IM(c2) - RE(c3); - RE(d3) = RE(c2) + IM(c3); - IM(d2) = IM(c2) + RE(c3); - -#if 1 - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); -#else - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); -#endif - } - } - } else { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (3*k+1)*ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); - IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); - - RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); - IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); - - RE(d2) = RE(c2) + IM(c3); - IM(d3) = IM(c2) + RE(c3); - RE(d3) = RE(c2) - IM(c3); - IM(d2) = IM(c2) - RE(c3); - -#if 1 - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); -#else - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); -#endif - } - } - } - } -} - -#ifdef USE_SSE -ALIGN static const int32_t negate[4] = { 0x0, 0x0, 0x0, 0x80000000 }; - -__declspec(naked) static void passf4pos_sse(const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) -{ - __asm { - push ebx - mov ebx, esp - and esp, -16 - push edi - push esi - sub esp, 8 - movzx edi, WORD PTR [ebx+8] - - movaps xmm1, XMMWORD PTR negate - - test edi, edi - jle l1_is_zero - - lea esi, DWORD PTR [edi+edi] - add esi, esi - sub esi, edi - add esi, esi - add esi, esi - add esi, esi - mov eax, DWORD PTR [ebx+16] - add esi, eax - lea ecx, DWORD PTR [edi+edi] - add ecx, ecx - add ecx, ecx - add ecx, ecx - add ecx, eax - lea edx, DWORD PTR [edi+edi] - add edx, edx - add edx, edx - add edx, eax - xor eax, eax - mov DWORD PTR [esp], ebp - mov ebp, DWORD PTR [ebx+12] - -fftloop: - lea edi, DWORD PTR [eax+eax] - add edi, edi - movaps xmm2, XMMWORD PTR [ebp+edi*8] - movaps xmm0, XMMWORD PTR [ebp+edi*8+16] - movaps xmm7, XMMWORD PTR [ebp+edi*8+32] - movaps xmm5, XMMWORD PTR [ebp+edi*8+48] - movaps xmm6, xmm2 - addps xmm6, xmm0 - movaps xmm4, xmm1 - xorps xmm4, xmm7 - movaps xmm3, xmm1 - xorps xmm3, xmm5 - xorps xmm2, xmm1 - xorps xmm0, xmm1 - addps xmm7, xmm5 - subps xmm2, xmm0 - movaps xmm0, xmm6 - shufps xmm0, xmm7, 68 - subps xmm4, xmm3 - shufps xmm6, xmm7, 238 - movaps xmm5, xmm2 - shufps xmm5, xmm4, 68 - movaps xmm3, xmm0 - addps xmm3, xmm6 - shufps xmm2, xmm4, 187 - subps xmm0, xmm6 - movaps xmm4, xmm5 - addps xmm4, xmm2 - mov edi, DWORD PTR [ebx+16] - movaps XMMWORD PTR [edi+eax*8], xmm3 - subps xmm5, xmm2 - movaps XMMWORD PTR [edx+eax*8], xmm4 - movaps XMMWORD PTR [ecx+eax*8], xmm0 - movaps XMMWORD PTR [esi+eax*8], xmm5 - add eax, 2 - movzx eax, ax - movzx edi, WORD PTR [ebx+8] - cmp eax, edi - jl fftloop - - mov ebp, DWORD PTR [esp] - -l1_is_zero: - - add esp, 8 - pop esi - pop edi - mov esp, ebx - pop ebx - ret - } -} -#endif - -#if 0 -static void passf4pos_sse_ido(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) -{ - uint16_t i, k, ac, ah; - - for (k = 0; k < l1; k++) - { - ac = 4*k*ido; - ah = k*ido; - - for (i = 0; i < ido; i+=2) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15, m16; - __m128 n1, n2, n3, n4, n5, n6, n7, n8, n9, m17, m18, m19, m20, m21, m22, m23; - __m128 w1, w2, w3, w4, w5, w6, m24, m25, m26, m27, m28, m29, m30; - __m128 neg1 = _mm_set_ps(-1.0, 1.0, -1.0, 1.0); - - m1 = _mm_load_ps(&RE(cc[ac+i])); - m2 = _mm_load_ps(&RE(cc[ac+i+2*ido])); - m3 = _mm_add_ps(m1, m2); - m4 = _mm_sub_ps(m1, m2); - - n1 = _mm_load_ps(&RE(cc[ac+i+ido])); - n2 = _mm_load_ps(&RE(cc[ac+i+3*ido])); - n3 = _mm_add_ps(n1, n2); - - n4 = _mm_mul_ps(neg1, n1); - n5 = _mm_mul_ps(neg1, n2); - n6 = _mm_sub_ps(n4, n5); - - m5 = _mm_add_ps(m3, n3); - - n7 = _mm_shuffle_ps(n6, n6, _MM_SHUFFLE(2, 3, 0, 1)); - n8 = _mm_add_ps(m4, n7); - - m6 = _mm_sub_ps(m3, n3); - n9 = _mm_sub_ps(m4, n7); - - _mm_store_ps(&RE(ch[ah+i]), m5); - -#if 0 - 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); - } - - m7.0 = RE(c2)*RE(wa1[i]) - m7.1 = IM(c2)*IM(wa1[i]) - m7.2 = RE(c6)*RE(wa1[i+1]) - m7.3 = IM(c6)*IM(wa1[i+1]) - - m8.0 = RE(c2)*IM(wa1[i]) - m8.1 = IM(c2)*RE(wa1[i]) - m8.2 = RE(c6)*IM(wa1[i+1]) - m8.3 = IM(c6)*RE(wa1[i+1]) - - RE(0) = m7.0 - m7.1 - IM(0) = m8.0 + m8.1 - RE(1) = m7.2 - m7.3 - IM(1) = m8.2 + m8.3 - - //// - RE(0) = RE(c2)*RE(wa1[i]) - IM(c2)*IM(wa1[i]) - IM(0) = RE(c2)*IM(wa1[i]) + IM(c2)*RE(wa1[i]) - RE(1) = RE(c6)*RE(wa1[i+1]) - IM(c6)*IM(wa1[i+1]) - IM(1) = RE(c6)*IM(wa1[i+1]) + IM(c6)*RE(wa1[i+1]) -#endif - - w1 = _mm_load_ps(&RE(wa1[i])); - w3 = _mm_load_ps(&RE(wa2[i])); - w5 = _mm_load_ps(&RE(wa3[i])); - - w2 = _mm_shuffle_ps(w1, w1, _MM_SHUFFLE(2, 3, 0, 1)); - w4 = _mm_shuffle_ps(w3, w3, _MM_SHUFFLE(2, 3, 0, 1)); - w6 = _mm_shuffle_ps(w5, w5, _MM_SHUFFLE(2, 3, 0, 1)); - - m7 = _mm_mul_ps(n8, w1); - m15 = _mm_mul_ps(m6, w3); - m23 = _mm_mul_ps(n9, w5); - m8 = _mm_mul_ps(n8, w2); - m16 = _mm_mul_ps(m6, w4); - m24 = _mm_mul_ps(n9, w6); - - m9 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(2, 0, 2, 0)); - m17 = _mm_shuffle_ps(m15, m16, _MM_SHUFFLE(2, 0, 2, 0)); - m25 = _mm_shuffle_ps(m23, m24, _MM_SHUFFLE(2, 0, 2, 0)); - m10 = _mm_shuffle_ps(m7, m8, _MM_SHUFFLE(3, 1, 3, 1)); - m18 = _mm_shuffle_ps(m15, m16, _MM_SHUFFLE(3, 1, 3, 1)); - m26 = _mm_shuffle_ps(m23, m24, _MM_SHUFFLE(3, 1, 3, 1)); - - m11 = _mm_add_ps(m9, m10); - m19 = _mm_add_ps(m17, m18); - m27 = _mm_add_ps(m25, m26); - m12 = _mm_sub_ps(m9, m10); - m20 = _mm_sub_ps(m17, m18); - m28 = _mm_sub_ps(m25, m26); - - m13 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(0, 0, 3, 2)); - m21 = _mm_shuffle_ps(m19, m19, _MM_SHUFFLE(0, 0, 3, 2)); - m29 = _mm_shuffle_ps(m27, m27, _MM_SHUFFLE(0, 0, 3, 2)); - m14 = _mm_unpacklo_ps(m12, m13); - m22 = _mm_unpacklo_ps(m20, m21); - m30 = _mm_unpacklo_ps(m28, m29); - - _mm_store_ps(&RE(ch[ah+i+l1*ido]), m14); - _mm_store_ps(&RE(ch[ah+i+2*l1*ido]), m22); - _mm_store_ps(&RE(ch[ah+i+3*l1*ido]), m30); - } - } -} -#endif - -static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) -{ - uint16_t i, k, ac, ah; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - complex_t t1, t2, t3, t4; - - ac = 4*k; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); - RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); - IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); - IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); - IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); - RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); - - RE(ch[ah]) = RE(t2) + RE(t3); - RE(ch[ah+2*l1]) = RE(t2) - RE(t3); - - IM(ch[ah]) = IM(t2) + IM(t3); - IM(ch[ah+2*l1]) = IM(t2) - IM(t3); - - RE(ch[ah+l1]) = RE(t1) + RE(t4); - RE(ch[ah+3*l1]) = RE(t1) - RE(t4); - - IM(ch[ah+l1]) = IM(t1) + IM(t4); - IM(ch[ah+3*l1]) = IM(t1) - IM(t4); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 4*k*ido; - ah = k*ido; - - for (i = 0; i < ido; i++) - { - complex_t c2, c3, c4, t1, t2, t3, t4; - - RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); - RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); - IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); - IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); - RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); - IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); - IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); - RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); - - RE(c2) = RE(t1) + RE(t4); - RE(c4) = RE(t1) - RE(t4); - - IM(c2) = IM(t1) + IM(t4); - IM(c4) = IM(t1) - IM(t4); - - RE(ch[ah+i]) = RE(t2) + RE(t3); - RE(c3) = RE(t2) - RE(t3); - - IM(ch[ah+i]) = IM(t2) + IM(t3); - IM(c3) = IM(t2) - IM(t3); - -#if 1 - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), - IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), - IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); -#else - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), - RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), - RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); -#endif - } - } - } -} - -static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, - const complex_t *wa3) -{ - uint16_t i, k, ac, ah; - - if (ido == 1) - { - for (k = 0; k < l1; k++) - { - complex_t t1, t2, t3, t4; - - ac = 4*k; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); - RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); - IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); - IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); - IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); - RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); - - RE(ch[ah]) = RE(t2) + RE(t3); - RE(ch[ah+2*l1]) = RE(t2) - RE(t3); - - IM(ch[ah]) = IM(t2) + IM(t3); - IM(ch[ah+2*l1]) = IM(t2) - IM(t3); - - RE(ch[ah+l1]) = RE(t1) - RE(t4); - RE(ch[ah+3*l1]) = RE(t1) + RE(t4); - - IM(ch[ah+l1]) = IM(t1) - IM(t4); - IM(ch[ah+3*l1]) = IM(t1) + IM(t4); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 4*k*ido; - ah = k*ido; - - for (i = 0; i < ido; i++) - { - complex_t c2, c3, c4, t1, t2, t3, t4; - - RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); - RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); - IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); - IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); - RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); - IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); - IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); - RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); - - RE(c2) = RE(t1) - RE(t4); - RE(c4) = RE(t1) + RE(t4); - - IM(c2) = IM(t1) - IM(t4); - IM(c4) = IM(t1) + IM(t4); - - RE(ch[ah+i]) = RE(t2) + RE(t3); - RE(c3) = RE(t2) - RE(t3); - - IM(ch[ah+i]) = IM(t2) + IM(t3); - IM(c3) = IM(t2) - IM(t3); - -#if 1 - ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), - RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), - RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), - RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); -#else - ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), - IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), - IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), - IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); -#endif - } - } - } -} - -static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, - complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, - const complex_t *wa4, const int8_t isign) -{ - static real_t tr11 = FRAC_CONST(0.309016994374947); - static real_t ti11 = FRAC_CONST(0.951056516295154); - static real_t tr12 = FRAC_CONST(-0.809016994374947); - static real_t ti12 = FRAC_CONST(0.587785252292473); - uint16_t i, k, ac, ah; - complex_t c2, c3, c4, c5, d3, d4, d5, d2, t2, t3, t4, t5; - - if (ido == 1) - { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - ac = 5*k + 1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); - IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); - RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); - IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c5), &RE(c4), - ti11, ti12, RE(t5), RE(t4)); - ComplexMult(&IM(c5), &IM(c4), - ti11, ti12, IM(t5), IM(t4)); - - RE(ch[ah+l1]) = RE(c2) - IM(c5); - IM(ch[ah+l1]) = IM(c2) + RE(c5); - RE(ch[ah+2*l1]) = RE(c3) - IM(c4); - IM(ch[ah+2*l1]) = IM(c3) + RE(c4); - RE(ch[ah+3*l1]) = RE(c3) + IM(c4); - IM(ch[ah+3*l1]) = IM(c3) - RE(c4); - RE(ch[ah+4*l1]) = RE(c2) + IM(c5); - IM(ch[ah+4*l1]) = IM(c2) - RE(c5); - } - } else { - for (k = 0; k < l1; k++) - { - ac = 5*k + 1; - ah = k; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); - RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); - IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); - RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); - IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); - - RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c4), &RE(c5), - ti12, ti11, RE(t5), RE(t4)); - ComplexMult(&IM(c4), &IM(c5), - ti12, ti12, IM(t5), IM(t4)); - - RE(ch[ah+l1]) = RE(c2) + IM(c5); - IM(ch[ah+l1]) = IM(c2) - RE(c5); - RE(ch[ah+2*l1]) = RE(c3) + IM(c4); - IM(ch[ah+2*l1]) = IM(c3) - RE(c4); - RE(ch[ah+3*l1]) = RE(c3) - IM(c4); - IM(ch[ah+3*l1]) = IM(c3) + RE(c4); - RE(ch[ah+4*l1]) = RE(c2) - IM(c5); - IM(ch[ah+4*l1]) = IM(c2) + RE(c5); - } - } - } else { - if (isign == 1) - { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (k*5 + 1) * ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); - RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); - IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); - RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); - IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c5), &RE(c4), - ti11, ti12, RE(t5), RE(t4)); - ComplexMult(&IM(c5), &IM(c4), - ti11, ti12, IM(t5), IM(t4)); - - IM(d2) = IM(c2) + RE(c5); - IM(d3) = IM(c3) + RE(c4); - RE(d4) = RE(c3) + IM(c4); - RE(d5) = RE(c2) + IM(c5); - RE(d2) = RE(c2) - IM(c5); - IM(d5) = IM(c2) - RE(c5); - RE(d3) = RE(c3) - IM(c4); - IM(d4) = IM(c3) - RE(c4); - -#if 1 - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), - IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), - IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); -#else - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), - RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), - RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); -#endif - } - } - } else { - for (k = 0; k < l1; k++) - { - for (i = 0; i < ido; i++) - { - ac = i + (k*5 + 1) * ido; - ah = i + k * ido; - - RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); - IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); - RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); - IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); - RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); - IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); - RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); - IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); - - RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); - IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); - - RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); - IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); - RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); - IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); - - ComplexMult(&RE(c4), &RE(c5), - ti12, ti11, RE(t5), RE(t4)); - ComplexMult(&IM(c4), &IM(c5), - ti12, ti12, IM(t5), IM(t4)); - - IM(d2) = IM(c2) - RE(c5); - IM(d3) = IM(c3) - RE(c4); - RE(d4) = RE(c3) - IM(c4); - RE(d5) = RE(c2) - IM(c5); - RE(d2) = RE(c2) + IM(c5); - IM(d5) = IM(c2) + RE(c5); - RE(d3) = RE(c3) + IM(c4); - IM(d4) = IM(c3) + RE(c4); - -#if 1 - ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), - RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), - RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), - RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), - RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); -#else - ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), - IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); - ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), - IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); - ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), - IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); - ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), - IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); -#endif - } - } - } - } -} - - -/*---------------------------------------------------------------------- - cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs. - ----------------------------------------------------------------------*/ - -#ifdef USE_SSE - -#define CONV(A,B,C) ( (A<<2) | ((B & 0x1)<<1) | ((C==1)&0x1) ) - -static INLINE void cfftf1pos_sse(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, - const int8_t isign) -{ - uint16_t i; - uint16_t k1, l1, l2; - uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; - - nf = ifac[1]; - na = 0; - l1 = 1; - iw = 0; - - for (k1 = 2; k1 <= nf+1; k1++) - { - ip = ifac[k1]; - l2 = ip*l1; - ido = n / l2; - idl1 = ido*l1; - - ix2 = iw + ido; - ix3 = ix2 + ido; - ix4 = ix3 + ido; - - switch (CONV(ip,na,ido)) - { - case CONV(4,0,0): - //passf4pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - break; - case CONV(4,0,1): - passf4pos_sse((const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - break; - case CONV(4,1,0): - passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - //passf4pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - break; - case CONV(4,1,1): - passf4pos_sse((const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - break; - case CONV(2,0,0): - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - //passf2pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - break; - case CONV(2,0,1): - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - //passf2pos_sse((const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - break; - case CONV(2,1,0): - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - //passf2pos_sse_ido((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - break; - case CONV(2,1,1): - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - //passf2pos_sse((const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - break; - case CONV(3,0,0): - case CONV(3,0,1): - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); - break; - case CONV(3,1,0): - case CONV(3,1,1): - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); - break; - case CONV(5,0,0): - case CONV(5,0,1): - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - break; - case CONV(5,1,0): - case CONV(5,1,1): - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - break; - } - - na = 1 - na; - - l1 = l2; - iw += (ip-1) * ido; - } - - if (na == 0) - return; - - for (i = 0; i < n; i++) - { - RE(c[i]) = RE(ch[i]); - IM(c[i]) = IM(ch[i]); - } -} -#endif - -static INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, - const int8_t isign) -{ - uint16_t i; - uint16_t k1, l1, l2; - uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; - - nf = ifac[1]; - na = 0; - l1 = 1; - iw = 0; - - for (k1 = 2; k1 <= nf+1; k1++) - { - ip = ifac[k1]; - l2 = ip*l1; - ido = n / l2; - idl1 = ido*l1; - - switch (ip) - { - case 4: - ix2 = iw + ido; - ix3 = ix2 + ido; - - if (na == 0) - passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - else - passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - - na = 1 - na; - break; - case 2: - if (na == 0) - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - else - passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - - na = 1 - na; - break; - case 3: - ix2 = iw + ido; - - if (na == 0) - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); - else - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); - - na = 1 - na; - break; - case 5: - ix2 = iw + ido; - ix3 = ix2 + ido; - ix4 = ix3 + ido; - - if (na == 0) - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - else - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - - na = 1 - na; - break; - } - - l1 = l2; - iw += (ip-1) * ido; - } - - if (na == 0) - return; - - for (i = 0; i < n; i++) - { - RE(c[i]) = RE(ch[i]); - IM(c[i]) = IM(ch[i]); - } -} - -static INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch, - const uint16_t *ifac, const complex_t *wa, - const int8_t isign) -{ - uint16_t i; - uint16_t k1, l1, l2; - uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; - - nf = ifac[1]; - na = 0; - l1 = 1; - iw = 0; - - for (k1 = 2; k1 <= nf+1; k1++) - { - ip = ifac[k1]; - l2 = ip*l1; - ido = n / l2; - idl1 = ido*l1; - - switch (ip) - { - case 4: - ix2 = iw + ido; - ix3 = ix2 + ido; - - if (na == 0) - passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); - else - passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); - - na = 1 - na; - break; - case 2: - if (na == 0) - passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); - else - passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); - - na = 1 - na; - break; - case 3: - ix2 = iw + ido; - - if (na == 0) - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); - else - passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); - - na = 1 - na; - break; - case 5: - ix2 = iw + ido; - ix3 = ix2 + ido; - ix4 = ix3 + ido; - - if (na == 0) - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - else - passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); - - na = 1 - na; - break; - } - - l1 = l2; - iw += (ip-1) * ido; - } - - if (na == 0) - return; - - for (i = 0; i < n; i++) - { - RE(c[i]) = RE(ch[i]); - IM(c[i]) = IM(ch[i]); - } -} - -void cfftf(cfft_info *cfft, complex_t *c) -{ - cfftf1neg(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, -1); -} - -void cfftb(cfft_info *cfft, complex_t *c) -{ - cfftf1pos(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, +1); -} - -#ifdef USE_SSE -void cfftb_sse(cfft_info *cfft, complex_t *c) -{ - cfftf1pos_sse(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, +1); -} -#endif - -static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac) -{ - static uint16_t ntryh[4] = {3, 4, 2, 5}; -#ifndef FIXED_POINT - real_t arg, argh, argld, fi; - uint16_t ido, ipm; - uint16_t i1, k1, l1, l2; - uint16_t ld, ii, ip; -#endif - uint16_t ntry = 0, i, j; - uint16_t ib; - uint16_t nf, nl, nq, nr; - - nl = n; - nf = 0; - j = 0; - -startloop: - j++; - - if (j <= 4) - ntry = ntryh[j-1]; - else - ntry += 2; - - do - { - nq = nl / ntry; - nr = nl - ntry*nq; - - if (nr != 0) - goto startloop; - - nf++; - ifac[nf+1] = ntry; - nl = nq; - - if (ntry == 2 && nf != 1) - { - for (i = 2; i <= nf; i++) - { - ib = nf - i + 2; - ifac[ib+1] = ifac[ib]; - } - ifac[2] = 2; - } - } while (nl != 1); - - ifac[0] = n; - ifac[1] = nf; - -#ifndef FIXED_POINT - argh = (real_t)2.0*(real_t)M_PI / (real_t)n; - i = 0; - l1 = 1; - - for (k1 = 1; k1 <= nf; k1++) - { - ip = ifac[k1+1]; - ld = 0; - l2 = l1*ip; - ido = n / l2; - ipm = ip - 1; - - for (j = 0; j < ipm; j++) - { - i1 = i; - RE(wa[i]) = 1.0; - IM(wa[i]) = 0.0; - ld += l1; - fi = 0; - argld = ld*argh; - - for (ii = 0; ii < ido; ii++) - { - i++; - fi++; - arg = fi * argld; - RE(wa[i]) = (real_t)cos(arg); -#if 1 - IM(wa[i]) = (real_t)sin(arg); -#else - IM(wa[i]) = (real_t)-sin(arg); -#endif - } - - if (ip > 5) - { - RE(wa[i1]) = RE(wa[i]); - IM(wa[i1]) = IM(wa[i]); - } - } - l1 = l2; - } -#endif -} - -cfft_info *cffti(uint16_t n) -{ - cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info)); - - cfft->n = n; - cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t)); - -#ifndef FIXED_POINT - cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t)); - - cffti1(n, cfft->tab, cfft->ifac); -#else - cffti1(n, NULL, cfft->ifac); - - switch (n) - { - case 64: cfft->tab = cfft_tab_64; break; - case 512: cfft->tab = cfft_tab_512; break; -#ifdef LD_DEC - case 256: cfft->tab = cfft_tab_256; break; -#endif - -#ifdef ALLOW_SMALL_FRAMELENGTH - case 60: cfft->tab = cfft_tab_60; break; - case 480: cfft->tab = cfft_tab_480; break; -#ifdef LD_DEC - case 240: cfft->tab = cfft_tab_240; break; -#endif -#endif - } -#endif - - return cfft; -} - -void cfftu(cfft_info *cfft) -{ - if (cfft->work) faad_free(cfft->work); -#ifndef FIXED_POINT - if (cfft->tab) faad_free(cfft->tab); -#endif - - if (cfft) faad_free(cfft); -} - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: cfft.c,v 1.35 2007/11/01 12:33:29 menno Exp $ +**/ + +/* + * Algorithmically based on Fortran-77 FFTPACK + * by Paul N. Swarztrauber(Version 4, 1985). + * + * Does even sized fft only + */ + +/* isign is +1 for backward and -1 for forward transforms */ + +#include "common.h" +#include "structs.h" + +#include + +#include "cfft.h" +#include "cfft_tab.h" + + +/* static function declarations */ +static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa); +static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa); +static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); +static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); +static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); +static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, + const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, + const complex_t *wa4, const int8_t isign); +INLINE void cfftf1(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, const int8_t isign); +static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); + + +/*---------------------------------------------------------------------- + passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd. + ----------------------------------------------------------------------*/ + +static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa) +{ + uint16_t i, k, ah, ac; + + if (ido == 1) + { + for (k = 0; k < l1; k++) + { + ah = 2*k; + ac = 4*k; + + RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); + RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); + IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); + IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); + } + } else { + for (k = 0; k < l1; k++) + { + ah = k*ido; + ac = 2*k*ido; + + for (i = 0; i < ido; i++) + { + complex_t t2; + + RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); + RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); + + IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); + IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); + +#if 1 + ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), + IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); +#else + ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), + RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); +#endif + } + } + } +} + +static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa) +{ + uint16_t i, k, ah, ac; + + if (ido == 1) + { + for (k = 0; k < l1; k++) + { + ah = 2*k; + ac = 4*k; + + RE(ch[ah]) = RE(cc[ac]) + RE(cc[ac+1]); + RE(ch[ah+l1]) = RE(cc[ac]) - RE(cc[ac+1]); + IM(ch[ah]) = IM(cc[ac]) + IM(cc[ac+1]); + IM(ch[ah+l1]) = IM(cc[ac]) - IM(cc[ac+1]); + } + } else { + for (k = 0; k < l1; k++) + { + ah = k*ido; + ac = 2*k*ido; + + for (i = 0; i < ido; i++) + { + complex_t t2; + + RE(ch[ah+i]) = RE(cc[ac+i]) + RE(cc[ac+i+ido]); + RE(t2) = RE(cc[ac+i]) - RE(cc[ac+i+ido]); + + IM(ch[ah+i]) = IM(cc[ac+i]) + IM(cc[ac+i+ido]); + IM(t2) = IM(cc[ac+i]) - IM(cc[ac+i+ido]); + +#if 1 + ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), + RE(t2), IM(t2), RE(wa[i]), IM(wa[i])); +#else + ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), + IM(t2), RE(t2), RE(wa[i]), IM(wa[i])); +#endif + } + } + } +} + + +static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, + const int8_t isign) +{ + static real_t taur = FRAC_CONST(-0.5); + static real_t taui = FRAC_CONST(0.866025403784439); + uint16_t i, k, ac, ah; + complex_t c2, c3, d2, d3, t2; + + if (ido == 1) + { + if (isign == 1) + { + for (k = 0; k < l1; k++) + { + ac = 3*k+1; + ah = k; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); + RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); + IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); + + RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); + IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); + + RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); + IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); + + RE(ch[ah+l1]) = RE(c2) - IM(c3); + IM(ch[ah+l1]) = IM(c2) + RE(c3); + RE(ch[ah+2*l1]) = RE(c2) + IM(c3); + IM(ch[ah+2*l1]) = IM(c2) - RE(c3); + } + } else { + for (k = 0; k < l1; k++) + { + ac = 3*k+1; + ah = k; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+1]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+1]); + RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),taur); + IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),taur); + + RE(ch[ah]) = RE(cc[ac-1]) + RE(t2); + IM(ch[ah]) = IM(cc[ac-1]) + IM(t2); + + RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+1])), taui); + IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+1])), taui); + + RE(ch[ah+l1]) = RE(c2) + IM(c3); + IM(ch[ah+l1]) = IM(c2) - RE(c3); + RE(ch[ah+2*l1]) = RE(c2) - IM(c3); + IM(ch[ah+2*l1]) = IM(c2) + RE(c3); + } + } + } else { + if (isign == 1) + { + for (k = 0; k < l1; k++) + { + for (i = 0; i < ido; i++) + { + ac = i + (3*k+1)*ido; + ah = i + k * ido; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); + RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); + IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); + IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); + + RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); + IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); + + RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); + IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); + + RE(d2) = RE(c2) - IM(c3); + IM(d3) = IM(c2) - RE(c3); + RE(d3) = RE(c2) + IM(c3); + IM(d2) = IM(c2) + RE(c3); + +#if 1 + ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), + IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), + IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); +#else + ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), + RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), + RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); +#endif + } + } + } else { + for (k = 0; k < l1; k++) + { + for (i = 0; i < ido; i++) + { + ac = i + (3*k+1)*ido; + ah = i + k * ido; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+ido]); + RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),taur); + IM(t2) = IM(cc[ac]) + IM(cc[ac+ido]); + IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),taur); + + RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2); + IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2); + + RE(c3) = MUL_F((RE(cc[ac]) - RE(cc[ac+ido])), taui); + IM(c3) = MUL_F((IM(cc[ac]) - IM(cc[ac+ido])), taui); + + RE(d2) = RE(c2) + IM(c3); + IM(d3) = IM(c2) + RE(c3); + RE(d3) = RE(c2) - IM(c3); + IM(d2) = IM(c2) - RE(c3); + +#if 1 + ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), + RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), + RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); +#else + ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), + IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), + IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); +#endif + } + } + } + } +} + + +static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, + const complex_t *wa3) +{ + uint16_t i, k, ac, ah; + + if (ido == 1) + { + for (k = 0; k < l1; k++) + { + complex_t t1, t2, t3, t4; + + ac = 4*k; + ah = k; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); + RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); + IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); + RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); + IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); + IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); + RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); + + RE(ch[ah]) = RE(t2) + RE(t3); + RE(ch[ah+2*l1]) = RE(t2) - RE(t3); + + IM(ch[ah]) = IM(t2) + IM(t3); + IM(ch[ah+2*l1]) = IM(t2) - IM(t3); + + RE(ch[ah+l1]) = RE(t1) + RE(t4); + RE(ch[ah+3*l1]) = RE(t1) - RE(t4); + + IM(ch[ah+l1]) = IM(t1) + IM(t4); + IM(ch[ah+3*l1]) = IM(t1) - IM(t4); + } + } else { + for (k = 0; k < l1; k++) + { + ac = 4*k*ido; + ah = k*ido; + + for (i = 0; i < ido; i++) + { + complex_t c2, c3, c4, t1, t2, t3, t4; + + RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); + RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); + IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); + IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); + RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); + IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); + IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); + RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); + + RE(c2) = RE(t1) + RE(t4); + RE(c4) = RE(t1) - RE(t4); + + IM(c2) = IM(t1) + IM(t4); + IM(c4) = IM(t1) - IM(t4); + + RE(ch[ah+i]) = RE(t2) + RE(t3); + RE(c3) = RE(t2) - RE(t3); + + IM(ch[ah+i]) = IM(t2) + IM(t3); + IM(c3) = IM(t2) - IM(t3); + +#if 1 + ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), + IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), + IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), + IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); +#else + ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), + RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), + RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), + RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); +#endif + } + } + } +} + +static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, + const complex_t *wa3) +{ + uint16_t i, k, ac, ah; + + if (ido == 1) + { + for (k = 0; k < l1; k++) + { + complex_t t1, t2, t3, t4; + + ac = 4*k; + ah = k; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+2]); + RE(t1) = RE(cc[ac]) - RE(cc[ac+2]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+2]); + IM(t1) = IM(cc[ac]) - IM(cc[ac+2]); + RE(t3) = RE(cc[ac+1]) + RE(cc[ac+3]); + IM(t4) = RE(cc[ac+1]) - RE(cc[ac+3]); + IM(t3) = IM(cc[ac+3]) + IM(cc[ac+1]); + RE(t4) = IM(cc[ac+3]) - IM(cc[ac+1]); + + RE(ch[ah]) = RE(t2) + RE(t3); + RE(ch[ah+2*l1]) = RE(t2) - RE(t3); + + IM(ch[ah]) = IM(t2) + IM(t3); + IM(ch[ah+2*l1]) = IM(t2) - IM(t3); + + RE(ch[ah+l1]) = RE(t1) - RE(t4); + RE(ch[ah+3*l1]) = RE(t1) + RE(t4); + + IM(ch[ah+l1]) = IM(t1) - IM(t4); + IM(ch[ah+3*l1]) = IM(t1) + IM(t4); + } + } else { + for (k = 0; k < l1; k++) + { + ac = 4*k*ido; + ah = k*ido; + + for (i = 0; i < ido; i++) + { + complex_t c2, c3, c4, t1, t2, t3, t4; + + RE(t2) = RE(cc[ac+i]) + RE(cc[ac+i+2*ido]); + RE(t1) = RE(cc[ac+i]) - RE(cc[ac+i+2*ido]); + IM(t2) = IM(cc[ac+i]) + IM(cc[ac+i+2*ido]); + IM(t1) = IM(cc[ac+i]) - IM(cc[ac+i+2*ido]); + RE(t3) = RE(cc[ac+i+ido]) + RE(cc[ac+i+3*ido]); + IM(t4) = RE(cc[ac+i+ido]) - RE(cc[ac+i+3*ido]); + IM(t3) = IM(cc[ac+i+3*ido]) + IM(cc[ac+i+ido]); + RE(t4) = IM(cc[ac+i+3*ido]) - IM(cc[ac+i+ido]); + + RE(c2) = RE(t1) - RE(t4); + RE(c4) = RE(t1) + RE(t4); + + IM(c2) = IM(t1) - IM(t4); + IM(c4) = IM(t1) + IM(t4); + + RE(ch[ah+i]) = RE(t2) + RE(t3); + RE(c3) = RE(t2) - RE(t3); + + IM(ch[ah+i]) = IM(t2) + IM(t3); + IM(c3) = IM(t2) - IM(t3); + +#if 1 + ComplexMult(&RE(ch[ah+i+l1*ido]), &IM(ch[ah+i+l1*ido]), + RE(c2), IM(c2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+i+2*l1*ido]), &IM(ch[ah+i+2*l1*ido]), + RE(c3), IM(c3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&RE(ch[ah+i+3*l1*ido]), &IM(ch[ah+i+3*l1*ido]), + RE(c4), IM(c4), RE(wa3[i]), IM(wa3[i])); +#else + ComplexMult(&IM(ch[ah+i+l1*ido]), &RE(ch[ah+i+l1*ido]), + IM(c2), RE(c2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+i+2*l1*ido]), &RE(ch[ah+i+2*l1*ido]), + IM(c3), RE(c3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&IM(ch[ah+i+3*l1*ido]), &RE(ch[ah+i+3*l1*ido]), + IM(c4), RE(c4), RE(wa3[i]), IM(wa3[i])); +#endif + } + } + } +} + +static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, + complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, + const complex_t *wa4, const int8_t isign) +{ + static real_t tr11 = FRAC_CONST(0.309016994374947); + static real_t ti11 = FRAC_CONST(0.951056516295154); + static real_t tr12 = FRAC_CONST(-0.809016994374947); + static real_t ti12 = FRAC_CONST(0.587785252292473); + uint16_t i, k, ac, ah; + complex_t c2, c3, c4, c5, d3, d4, d5, d2, t2, t3, t4, t5; + + if (ido == 1) + { + if (isign == 1) + { + for (k = 0; k < l1; k++) + { + ac = 5*k + 1; + ah = k; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); + RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); + IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); + RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); + IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); + RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); + IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); + + RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); + IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); + + RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); + IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); + RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); + IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); + + ComplexMult(&RE(c5), &RE(c4), + ti11, ti12, RE(t5), RE(t4)); + ComplexMult(&IM(c5), &IM(c4), + ti11, ti12, IM(t5), IM(t4)); + + RE(ch[ah+l1]) = RE(c2) - IM(c5); + IM(ch[ah+l1]) = IM(c2) + RE(c5); + RE(ch[ah+2*l1]) = RE(c3) - IM(c4); + IM(ch[ah+2*l1]) = IM(c3) + RE(c4); + RE(ch[ah+3*l1]) = RE(c3) + IM(c4); + IM(ch[ah+3*l1]) = IM(c3) - RE(c4); + RE(ch[ah+4*l1]) = RE(c2) + IM(c5); + IM(ch[ah+4*l1]) = IM(c2) - RE(c5); + } + } else { + for (k = 0; k < l1; k++) + { + ac = 5*k + 1; + ah = k; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+3]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+3]); + RE(t3) = RE(cc[ac+1]) + RE(cc[ac+2]); + IM(t3) = IM(cc[ac+1]) + IM(cc[ac+2]); + RE(t4) = RE(cc[ac+1]) - RE(cc[ac+2]); + IM(t4) = IM(cc[ac+1]) - IM(cc[ac+2]); + RE(t5) = RE(cc[ac]) - RE(cc[ac+3]); + IM(t5) = IM(cc[ac]) - IM(cc[ac+3]); + + RE(ch[ah]) = RE(cc[ac-1]) + RE(t2) + RE(t3); + IM(ch[ah]) = IM(cc[ac-1]) + IM(t2) + IM(t3); + + RE(c2) = RE(cc[ac-1]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); + IM(c2) = IM(cc[ac-1]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); + RE(c3) = RE(cc[ac-1]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); + IM(c3) = IM(cc[ac-1]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); + + ComplexMult(&RE(c4), &RE(c5), + ti12, ti11, RE(t5), RE(t4)); + ComplexMult(&IM(c4), &IM(c5), + ti12, ti11, IM(t5), IM(t4)); + + RE(ch[ah+l1]) = RE(c2) + IM(c5); + IM(ch[ah+l1]) = IM(c2) - RE(c5); + RE(ch[ah+2*l1]) = RE(c3) + IM(c4); + IM(ch[ah+2*l1]) = IM(c3) - RE(c4); + RE(ch[ah+3*l1]) = RE(c3) - IM(c4); + IM(ch[ah+3*l1]) = IM(c3) + RE(c4); + RE(ch[ah+4*l1]) = RE(c2) - IM(c5); + IM(ch[ah+4*l1]) = IM(c2) + RE(c5); + } + } + } else { + if (isign == 1) + { + for (k = 0; k < l1; k++) + { + for (i = 0; i < ido; i++) + { + ac = i + (k*5 + 1) * ido; + ah = i + k * ido; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); + RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); + IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); + RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); + IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); + RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); + IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); + + RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); + IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); + + RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); + IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); + RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); + IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); + + ComplexMult(&RE(c5), &RE(c4), + ti11, ti12, RE(t5), RE(t4)); + ComplexMult(&IM(c5), &IM(c4), + ti11, ti12, IM(t5), IM(t4)); + + IM(d2) = IM(c2) + RE(c5); + IM(d3) = IM(c3) + RE(c4); + RE(d4) = RE(c3) + IM(c4); + RE(d5) = RE(c2) + IM(c5); + RE(d2) = RE(c2) - IM(c5); + IM(d5) = IM(c2) - RE(c5); + RE(d3) = RE(c3) - IM(c4); + IM(d4) = IM(c3) - RE(c4); + +#if 1 + ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), + IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), + IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), + IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); + ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), + IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); +#else + ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), + RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), + RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), + RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); + ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), + RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); +#endif + } + } + } else { + for (k = 0; k < l1; k++) + { + for (i = 0; i < ido; i++) + { + ac = i + (k*5 + 1) * ido; + ah = i + k * ido; + + RE(t2) = RE(cc[ac]) + RE(cc[ac+3*ido]); + IM(t2) = IM(cc[ac]) + IM(cc[ac+3*ido]); + RE(t3) = RE(cc[ac+ido]) + RE(cc[ac+2*ido]); + IM(t3) = IM(cc[ac+ido]) + IM(cc[ac+2*ido]); + RE(t4) = RE(cc[ac+ido]) - RE(cc[ac+2*ido]); + IM(t4) = IM(cc[ac+ido]) - IM(cc[ac+2*ido]); + RE(t5) = RE(cc[ac]) - RE(cc[ac+3*ido]); + IM(t5) = IM(cc[ac]) - IM(cc[ac+3*ido]); + + RE(ch[ah]) = RE(cc[ac-ido]) + RE(t2) + RE(t3); + IM(ch[ah]) = IM(cc[ac-ido]) + IM(t2) + IM(t3); + + RE(c2) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr11) + MUL_F(RE(t3),tr12); + IM(c2) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr11) + MUL_F(IM(t3),tr12); + RE(c3) = RE(cc[ac-ido]) + MUL_F(RE(t2),tr12) + MUL_F(RE(t3),tr11); + IM(c3) = IM(cc[ac-ido]) + MUL_F(IM(t2),tr12) + MUL_F(IM(t3),tr11); + + ComplexMult(&RE(c4), &RE(c5), + ti12, ti11, RE(t5), RE(t4)); + ComplexMult(&IM(c4), &IM(c5), + ti12, ti11, IM(t5), IM(t4)); + + IM(d2) = IM(c2) - RE(c5); + IM(d3) = IM(c3) - RE(c4); + RE(d4) = RE(c3) - IM(c4); + RE(d5) = RE(c2) - IM(c5); + RE(d2) = RE(c2) + IM(c5); + IM(d5) = IM(c2) + RE(c5); + RE(d3) = RE(c3) + IM(c4); + IM(d4) = IM(c3) + RE(c4); + +#if 1 + ComplexMult(&RE(ch[ah+l1*ido]), &IM(ch[ah+l1*ido]), + RE(d2), IM(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&RE(ch[ah+2*l1*ido]), &IM(ch[ah+2*l1*ido]), + RE(d3), IM(d3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&RE(ch[ah+3*l1*ido]), &IM(ch[ah+3*l1*ido]), + RE(d4), IM(d4), RE(wa3[i]), IM(wa3[i])); + ComplexMult(&RE(ch[ah+4*l1*ido]), &IM(ch[ah+4*l1*ido]), + RE(d5), IM(d5), RE(wa4[i]), IM(wa4[i])); +#else + ComplexMult(&IM(ch[ah+l1*ido]), &RE(ch[ah+l1*ido]), + IM(d2), RE(d2), RE(wa1[i]), IM(wa1[i])); + ComplexMult(&IM(ch[ah+2*l1*ido]), &RE(ch[ah+2*l1*ido]), + IM(d3), RE(d3), RE(wa2[i]), IM(wa2[i])); + ComplexMult(&IM(ch[ah+3*l1*ido]), &RE(ch[ah+3*l1*ido]), + IM(d4), RE(d4), RE(wa3[i]), IM(wa3[i])); + ComplexMult(&IM(ch[ah+4*l1*ido]), &RE(ch[ah+4*l1*ido]), + IM(d5), RE(d5), RE(wa4[i]), IM(wa4[i])); +#endif + } + } + } + } +} + + +/*---------------------------------------------------------------------- + cfftf1, cfftf, cfftb, cffti1, cffti. Complex FFTs. + ----------------------------------------------------------------------*/ + +static INLINE void cfftf1pos(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, + const int8_t isign) +{ + uint16_t i; + uint16_t k1, l1, l2; + uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; + + nf = ifac[1]; + na = 0; + l1 = 1; + iw = 0; + + for (k1 = 2; k1 <= nf+1; k1++) + { + ip = ifac[k1]; + l2 = ip*l1; + ido = n / l2; + idl1 = ido*l1; + + switch (ip) + { + case 4: + ix2 = iw + ido; + ix3 = ix2 + ido; + + if (na == 0) + passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); + else + passf4pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); + + na = 1 - na; + break; + case 2: + if (na == 0) + passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); + else + passf2pos((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); + + na = 1 - na; + break; + case 3: + ix2 = iw + ido; + + if (na == 0) + passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); + else + passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); + + na = 1 - na; + break; + case 5: + ix2 = iw + ido; + ix3 = ix2 + ido; + ix4 = ix3 + ido; + + if (na == 0) + passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); + else + passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); + + na = 1 - na; + break; + } + + l1 = l2; + iw += (ip-1) * ido; + } + + if (na == 0) + return; + + for (i = 0; i < n; i++) + { + RE(c[i]) = RE(ch[i]); + IM(c[i]) = IM(ch[i]); + } +} + +static INLINE void cfftf1neg(uint16_t n, complex_t *c, complex_t *ch, + const uint16_t *ifac, const complex_t *wa, + const int8_t isign) +{ + uint16_t i; + uint16_t k1, l1, l2; + uint16_t na, nf, ip, iw, ix2, ix3, ix4, ido, idl1; + + nf = ifac[1]; + na = 0; + l1 = 1; + iw = 0; + + for (k1 = 2; k1 <= nf+1; k1++) + { + ip = ifac[k1]; + l2 = ip*l1; + ido = n / l2; + idl1 = ido*l1; + + switch (ip) + { + case 4: + ix2 = iw + ido; + ix3 = ix2 + ido; + + if (na == 0) + passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3]); + else + passf4neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3]); + + na = 1 - na; + break; + case 2: + if (na == 0) + passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw]); + else + passf2neg((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw]); + + na = 1 - na; + break; + case 3: + ix2 = iw + ido; + + if (na == 0) + passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], isign); + else + passf3((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], isign); + + na = 1 - na; + break; + case 5: + ix2 = iw + ido; + ix3 = ix2 + ido; + ix4 = ix3 + ido; + + if (na == 0) + passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)c, ch, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); + else + passf5((const uint16_t)ido, (const uint16_t)l1, (const complex_t*)ch, c, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign); + + na = 1 - na; + break; + } + + l1 = l2; + iw += (ip-1) * ido; + } + + if (na == 0) + return; + + for (i = 0; i < n; i++) + { + RE(c[i]) = RE(ch[i]); + IM(c[i]) = IM(ch[i]); + } +} + +void cfftf(cfft_info *cfft, complex_t *c) +{ + cfftf1neg(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, -1); +} + +void cfftb(cfft_info *cfft, complex_t *c) +{ + cfftf1pos(cfft->n, c, cfft->work, (const uint16_t*)cfft->ifac, (const complex_t*)cfft->tab, +1); +} + +static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac) +{ + static uint16_t ntryh[4] = {3, 4, 2, 5}; +#ifndef FIXED_POINT + real_t arg, argh, argld, fi; + uint16_t ido, ipm; + uint16_t i1, k1, l1, l2; + uint16_t ld, ii, ip; +#endif + uint16_t ntry = 0, i, j; + uint16_t ib; + uint16_t nf, nl, nq, nr; + + nl = n; + nf = 0; + j = 0; + +startloop: + j++; + + if (j <= 4) + ntry = ntryh[j-1]; + else + ntry += 2; + + do + { + nq = nl / ntry; + nr = nl - ntry*nq; + + if (nr != 0) + goto startloop; + + nf++; + ifac[nf+1] = ntry; + nl = nq; + + if (ntry == 2 && nf != 1) + { + for (i = 2; i <= nf; i++) + { + ib = nf - i + 2; + ifac[ib+1] = ifac[ib]; + } + ifac[2] = 2; + } + } while (nl != 1); + + ifac[0] = n; + ifac[1] = nf; + +#ifndef FIXED_POINT + argh = (real_t)2.0*(real_t)M_PI / (real_t)n; + i = 0; + l1 = 1; + + for (k1 = 1; k1 <= nf; k1++) + { + ip = ifac[k1+1]; + ld = 0; + l2 = l1*ip; + ido = n / l2; + ipm = ip - 1; + + for (j = 0; j < ipm; j++) + { + i1 = i; + RE(wa[i]) = 1.0; + IM(wa[i]) = 0.0; + ld += l1; + fi = 0; + argld = ld*argh; + + for (ii = 0; ii < ido; ii++) + { + i++; + fi++; + arg = fi * argld; + RE(wa[i]) = (real_t)cos(arg); +#if 1 + IM(wa[i]) = (real_t)sin(arg); +#else + IM(wa[i]) = (real_t)-sin(arg); +#endif + } + + if (ip > 5) + { + RE(wa[i1]) = RE(wa[i]); + IM(wa[i1]) = IM(wa[i]); + } + } + l1 = l2; + } +#endif +} + +cfft_info *cffti(uint16_t n) +{ + cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info)); + + cfft->n = n; + cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t)); + +#ifndef FIXED_POINT + cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t)); + + cffti1(n, cfft->tab, cfft->ifac); +#else + cffti1(n, NULL, cfft->ifac); + + switch (n) + { + case 64: cfft->tab = (complex_t*)cfft_tab_64; break; + case 512: cfft->tab = (complex_t*)cfft_tab_512; break; +#ifdef LD_DEC + case 256: cfft->tab = (complex_t*)cfft_tab_256; break; +#endif + +#ifdef ALLOW_SMALL_FRAMELENGTH + case 60: cfft->tab = (complex_t*)cfft_tab_60; break; + case 480: cfft->tab = (complex_t*)cfft_tab_480; break; +#ifdef LD_DEC + case 240: cfft->tab = (complex_t*)cfft_tab_240; break; +#endif +#endif + case 128: cfft->tab = (complex_t*)cfft_tab_128; break; + } +#endif + + return cfft; +} + +void cfftu(cfft_info *cfft) +{ + if (cfft->work) faad_free(cfft->work); +#ifndef FIXED_POINT + if (cfft->tab) faad_free(cfft->tab); +#endif + + if (cfft) faad_free(cfft); +} + diff --git a/src/contrib/aacdecoder/libfaad/cfft.h b/src/contrib/aacdecoder/libfaad/cfft.h old mode 100644 new mode 100755 index d691c01e4..dc89cdc85 --- a/src/contrib/aacdecoder/libfaad/cfft.h +++ b/src/contrib/aacdecoder/libfaad/cfft.h @@ -1,57 +1,56 @@ -/* -** 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: cfft.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __CFFT_H__ -#define __CFFT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - uint16_t n; - uint16_t ifac[15]; - complex_t *work; - complex_t *tab; -} cfft_info; - - -void cfftf(cfft_info *cfft, complex_t *c); -void cfftb(cfft_info *cfft, complex_t *c); -cfft_info *cffti(uint16_t n); -void cfftu(cfft_info *cfft); - -#ifdef USE_SSE -void cfftb_sse(cfft_info *cfft, complex_t *c); -#endif - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: cfft.h,v 1.24 2007/11/01 12:33:29 menno Exp $ +**/ + +#ifndef __CFFT_H__ +#define __CFFT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + uint16_t n; + uint16_t ifac[15]; + complex_t *work; + complex_t *tab; +} cfft_info; + + +void cfftf(cfft_info *cfft, complex_t *c); +void cfftb(cfft_info *cfft, complex_t *c); +cfft_info *cffti(uint16_t n); +void cfftu(cfft_info *cfft); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/cfft_tab.h b/src/contrib/aacdecoder/libfaad/cfft_tab.h old mode 100644 new mode 100755 index 394a0455e..80b1b75be --- a/src/contrib/aacdecoder/libfaad/cfft_tab.h +++ b/src/contrib/aacdecoder/libfaad/cfft_tab.h @@ -1,1688 +1,1823 @@ -/* -** 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: cfft_tab.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __CFFT_TAB_H__ -#define __CFFT_TAB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef FIXED_POINT - -ALIGN static const complex_t cfft_tab_512[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) }, - { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, - { FRAC_CONST(0.999322354793549), FRAC_CONST(0.036807224154472) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.998118102550507), FRAC_CONST(0.061320740729570) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.996312618255615), FRAC_CONST(0.085797317326069) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.993906974792480), FRAC_CONST(0.110222205519676) }, - { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, - { FRAC_CONST(0.990902662277222), FRAC_CONST(0.134580716490746) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.987301409244537), FRAC_CONST(0.158858150243759) }, - { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, - { FRAC_CONST(0.983105480670929), FRAC_CONST(0.183039888739586) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.978317379951477), FRAC_CONST(0.207111388444901) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.972939968109131), FRAC_CONST(0.231058120727539) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.966976463794708), FRAC_CONST(0.254865676164627) }, - { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, - { FRAC_CONST(0.960430502891541), FRAC_CONST(0.278519690036774) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.953306019306183), FRAC_CONST(0.302005946636200) }, - { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, - { FRAC_CONST(0.945607304573059), FRAC_CONST(0.325310319662094) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.937339007854462), FRAC_CONST(0.348418682813644) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.928506076335907), FRAC_CONST(0.371317207813263) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.919113874435425), FRAC_CONST(0.393992066383362) }, - { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, - { FRAC_CONST(0.909167945384979), FRAC_CONST(0.416429579257965) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.898674488067627), FRAC_CONST(0.438616245985031) }, - { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, - { FRAC_CONST(0.887639641761780), FRAC_CONST(0.460538715124130) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.876070082187653), FRAC_CONST(0.482183754444122) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.863972842693329), FRAC_CONST(0.503538370132446) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.851355195045471), FRAC_CONST(0.524589717388153) }, - { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, - { FRAC_CONST(0.838224709033966), FRAC_CONST(0.545324981212616) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.824589252471924), FRAC_CONST(0.565731823444366) }, - { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, - { FRAC_CONST(0.810457170009613), FRAC_CONST(0.585797905921936) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.795836925506592), FRAC_CONST(0.605511009693146) }, - { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, - { FRAC_CONST(0.780737221240997), FRAC_CONST(0.624859511852264) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.765167236328125), FRAC_CONST(0.643831551074982) }, - { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(0.749136388301849), FRAC_CONST(0.662415802478790) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.732654273509979), FRAC_CONST(0.680601000785828) }, - { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, - { FRAC_CONST(0.715730786323547), FRAC_CONST(0.698376297950745) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.698376238346100), FRAC_CONST(0.715730845928192) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.680601000785828), FRAC_CONST(0.732654273509979) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.662415742874146), FRAC_CONST(0.749136388301849) }, - { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, - { FRAC_CONST(0.643831551074982), FRAC_CONST(0.765167295932770) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.624859452247620), FRAC_CONST(0.780737280845642) }, - { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, - { FRAC_CONST(0.605511009693146), FRAC_CONST(0.795836925506592) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.585797846317291), FRAC_CONST(0.810457170009613) }, - { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.565731823444366), FRAC_CONST(0.824589312076569) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.545324981212616), FRAC_CONST(0.838224709033966) }, - { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, - { FRAC_CONST(0.524589657783508), FRAC_CONST(0.851355195045471) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.503538429737091), FRAC_CONST(0.863972842693329) }, - { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, - { FRAC_CONST(0.482183724641800), FRAC_CONST(0.876070141792297) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.460538715124130), FRAC_CONST(0.887639641761780) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.438616186380386), FRAC_CONST(0.898674488067627) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.416429549455643), FRAC_CONST(0.909168004989624) }, - { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, - { FRAC_CONST(0.393991947174072), FRAC_CONST(0.919113874435425) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.371317148208618), FRAC_CONST(0.928506076335907) }, - { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(0.348418682813644), FRAC_CONST(0.937339007854462) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.325310230255127), FRAC_CONST(0.945607364177704) }, - { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, - { FRAC_CONST(0.302005946636200), FRAC_CONST(0.953306019306183) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.278519600629807), FRAC_CONST(0.960430562496185) }, - { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(0.254865646362305), FRAC_CONST(0.966976463794708) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.231058135628700), FRAC_CONST(0.972939968109131) }, - { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(0.207111328840256), FRAC_CONST(0.978317379951477) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.183039888739586), FRAC_CONST(0.983105480670929) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.158858075737953), FRAC_CONST(0.987301409244537) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.134580686688423), FRAC_CONST(0.990902662277222) }, - { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, - { FRAC_CONST(0.110222116112709), FRAC_CONST(0.993906974792480) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.085797272622585), FRAC_CONST(0.996312618255615) }, - { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(0.061320748180151), FRAC_CONST(0.998118102550507) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(0.036807164549828), FRAC_CONST(0.999322414398193) }, - { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(0.012271529063582), FRAC_CONST(0.999924719333649) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.012271616607904), FRAC_CONST(0.999924719333649) }, - { FRAC_CONST(-0.024541223421693), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(-0.036807250231504), FRAC_CONST(0.999322354793549) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.061320833861828), FRAC_CONST(0.998118102550507) }, - { FRAC_CONST(-0.073564574122429), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(-0.085797362029552), FRAC_CONST(0.996312618255615) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.110222205519676), FRAC_CONST(0.993906974792480) }, - { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, - { FRAC_CONST(-0.134580776095390), FRAC_CONST(0.990902602672577) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.158858165144920), FRAC_CONST(0.987301409244537) }, - { FRAC_CONST(-0.170961946249008), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(-0.183039978146553), FRAC_CONST(0.983105480670929) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.207111418247223), FRAC_CONST(0.978317379951477) }, - { FRAC_CONST(-0.219101309776306), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(-0.231058210134506), FRAC_CONST(0.972939908504486) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.254865705966949), FRAC_CONST(0.966976463794708) }, - { FRAC_CONST(-0.266712844371796), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(-0.278519690036774), FRAC_CONST(0.960430502891541) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.302006036043167), FRAC_CONST(0.953306019306183) }, - { FRAC_CONST(-0.313681721687317), FRAC_CONST(0.949528157711029) }, - { FRAC_CONST(-0.325310319662094), FRAC_CONST(0.945607304573059) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.348418772220612), FRAC_CONST(0.937338948249817) }, - { FRAC_CONST(-0.359895050525665), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(-0.371317237615585), FRAC_CONST(0.928506076335907) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.393992036581039), FRAC_CONST(0.919113874435425) }, - { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, - { FRAC_CONST(-0.416429519653320), FRAC_CONST(0.909168004989624) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.438616245985031), FRAC_CONST(0.898674428462982) }, - { FRAC_CONST(-0.449611365795136), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(-0.460538804531097), FRAC_CONST(0.887639582157135) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.482183903455734), FRAC_CONST(0.876070022583008) }, - { FRAC_CONST(-0.492898166179657), FRAC_CONST(0.870087027549744) }, - { FRAC_CONST(-0.503538370132446), FRAC_CONST(0.863972842693329) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.524589717388153), FRAC_CONST(0.851355135440826) }, - { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, - { FRAC_CONST(-0.545325100421906), FRAC_CONST(0.838224649429321) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.565731763839722), FRAC_CONST(0.824589312076569) }, - { FRAC_CONST(-0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(-0.585797905921936), FRAC_CONST(0.810457170009613) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.605511128902435), FRAC_CONST(0.795836865901947) }, - { FRAC_CONST(-0.615231692790985), FRAC_CONST(0.788346350193024) }, - { FRAC_CONST(-0.624859631061554), FRAC_CONST(0.780737102031708) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.643831551074982), FRAC_CONST(0.765167236328125) }, - { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, - { FRAC_CONST(-0.662415802478790), FRAC_CONST(0.749136328697205) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.680601119995117), FRAC_CONST(0.732654154300690) }, - { FRAC_CONST(-0.689540684223175), FRAC_CONST(0.724246978759766) }, - { FRAC_CONST(-0.698376238346100), FRAC_CONST(0.715730845928192) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.715730845928192), FRAC_CONST(0.698376238346100) }, - { FRAC_CONST(-0.724247157573700), FRAC_CONST(0.689540505409241) }, - { FRAC_CONST(-0.732654333114624), FRAC_CONST(0.680600941181183) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.749136507511139), FRAC_CONST(0.662415623664856) }, - { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(-0.765167295932770), FRAC_CONST(0.643831551074982) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.780737280845642), FRAC_CONST(0.624859452247620) }, - { FRAC_CONST(-0.788346469402313), FRAC_CONST(0.615231513977051) }, - { FRAC_CONST(-0.795836985111237), FRAC_CONST(0.605510950088501) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.810457170009613), FRAC_CONST(0.585797846317291) }, - { FRAC_CONST(-0.817584812641144), FRAC_CONST(0.575808167457581) }, - { FRAC_CONST(-0.824589312076569), FRAC_CONST(0.565731763839722) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.838224768638611), FRAC_CONST(0.545324862003326) }, - { FRAC_CONST(-0.844853639602661), FRAC_CONST(0.534997463226318) }, - { FRAC_CONST(-0.851355314254761), FRAC_CONST(0.524589538574219) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.863972842693329), FRAC_CONST(0.503538370132446) }, - { FRAC_CONST(-0.870087027549744), FRAC_CONST(0.492898136377335) }, - { FRAC_CONST(-0.876070141792297), FRAC_CONST(0.482183694839478) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.887639701366425), FRAC_CONST(0.460538566112518) }, - { FRAC_CONST(-0.893224298954010), FRAC_CONST(0.449611365795136) }, - { FRAC_CONST(-0.898674488067627), FRAC_CONST(0.438616245985031) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.909168004989624), FRAC_CONST(0.416429489850998) }, - { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, - { FRAC_CONST(-0.919113874435425), FRAC_CONST(0.393991917371750) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.928506076335907), FRAC_CONST(0.371317237615585) }, - { FRAC_CONST(-0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(-0.937339007854462), FRAC_CONST(0.348418653011322) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.945607364177704), FRAC_CONST(0.325310200452805) }, - { FRAC_CONST(-0.949528217315674), FRAC_CONST(0.313681602478027) }, - { FRAC_CONST(-0.953306078910828), FRAC_CONST(0.302005797624588) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.960430502891541), FRAC_CONST(0.278519690036774) }, - { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, - { FRAC_CONST(-0.966976463794708), FRAC_CONST(0.254865586757660) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.972939968109131), FRAC_CONST(0.231057971715927) }, - { FRAC_CONST(-0.975702166557312), FRAC_CONST(0.219101071357727) }, - { FRAC_CONST(-0.978317379951477), FRAC_CONST(0.207111403346062) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.983105480670929), FRAC_CONST(0.183039844036102) }, - { FRAC_CONST(-0.985277652740479), FRAC_CONST(0.170961812138557) }, - { FRAC_CONST(-0.987301409244537), FRAC_CONST(0.158858031034470) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.990902662277222), FRAC_CONST(0.134580522775650) }, - { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, - { FRAC_CONST(-0.993906974792480), FRAC_CONST(0.110222198069096) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.996312618255615), FRAC_CONST(0.085797227919102) }, - { FRAC_CONST(-0.997290492057800), FRAC_CONST(0.073564447462559) }, - { FRAC_CONST(-0.998118102550507), FRAC_CONST(0.061320584267378) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(-0.999322354793549), FRAC_CONST(0.036807239055634) }, - { FRAC_CONST(-0.999698817729950), FRAC_CONST(0.024541210383177) }, - { FRAC_CONST(-0.999924719333649), FRAC_CONST(0.012271485291421) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, - { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, - { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, - { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, - { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, - { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, - { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, - { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, - { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, - { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, - { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, - { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, - { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const complex_t cfft_tab_480[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999914348125458), FRAC_CONST(0.013089596293867) }, - { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, - { FRAC_CONST(0.999229013919830), FRAC_CONST(0.039259817451239) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.997858941555023), FRAC_CONST(0.065403133630753) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.995804905891418), FRAC_CONST(0.091501623392105) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.993068456649780), FRAC_CONST(0.117537401616573) }, - { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, - { FRAC_CONST(0.989651381969452), FRAC_CONST(0.143492624163628) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.985556066036224), FRAC_CONST(0.169349506497383) }, - { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.975342333316803), FRAC_CONST(0.220697447657585) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.969230890274048), FRAC_CONST(0.246153295040131) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.962455213069916), FRAC_CONST(0.271440446376801) }, - { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, - { FRAC_CONST(0.955019950866699), FRAC_CONST(0.296541601419449) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.946930110454559), FRAC_CONST(0.321439445018768) }, - { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, - { FRAC_CONST(0.938191354274750), FRAC_CONST(0.346117079257965) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.928809583187103), FRAC_CONST(0.370557427406311) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.918791174888611), FRAC_CONST(0.394743889570236) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.908143162727356), FRAC_CONST(0.418659746646881) }, - { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(0.896872758865356), FRAC_CONST(0.442288726568222) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.884987652301788), FRAC_CONST(0.465614527463913) }, - { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, - { FRAC_CONST(0.872496008872986), FRAC_CONST(0.488621264696121) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.859406411647797), FRAC_CONST(0.511293113231659) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.845727801322937), FRAC_CONST(0.533614516258240) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, - { FRAC_CONST(0.816641509532928), FRAC_CONST(0.577145218849182) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.801253795623779), FRAC_CONST(0.598324596881866) }, - { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(0.785316884517670), FRAC_CONST(0.619093954563141) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.768841803073883), FRAC_CONST(0.639438986778259) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.751839756965637), FRAC_CONST(0.659345865249634) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.734322488307953), FRAC_CONST(0.678800761699677) }, - { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, - { FRAC_CONST(0.716301918029785), FRAC_CONST(0.697790503501892) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.697790443897247), FRAC_CONST(0.716301977634430) }, - { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, - { FRAC_CONST(0.678800702095032), FRAC_CONST(0.734322547912598) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.659345805644989), FRAC_CONST(0.751839816570282) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.639438986778259), FRAC_CONST(0.768841862678528) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.619093954563141), FRAC_CONST(0.785316944122314) }, - { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, - { FRAC_CONST(0.598324596881866), FRAC_CONST(0.801253855228424) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.577145159244537), FRAC_CONST(0.816641569137573) }, - { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.533614516258240), FRAC_CONST(0.845727801322937) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.511293113231659), FRAC_CONST(0.859406411647797) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.488621175289154), FRAC_CONST(0.872496068477631) }, - { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(0.465614467859268), FRAC_CONST(0.884987652301788) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.442288666963577), FRAC_CONST(0.896872758865356) }, - { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, - { FRAC_CONST(0.418659746646881), FRAC_CONST(0.908143162727356) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.394743800163269), FRAC_CONST(0.918791234493256) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.370557397603989), FRAC_CONST(0.928809583187103) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.346117049455643), FRAC_CONST(0.938191354274750) }, - { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(0.321439474821091), FRAC_CONST(0.946930110454559) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.296541512012482), FRAC_CONST(0.955019950866699) }, - { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, - { FRAC_CONST(0.271440386772156), FRAC_CONST(0.962455272674561) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.246153265237808), FRAC_CONST(0.969230890274048) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.220697447657585), FRAC_CONST(0.975342333316803) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(0.169349446892738), FRAC_CONST(0.985556066036224) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.143492594361305), FRAC_CONST(0.989651381969452) }, - { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(0.117537401616573), FRAC_CONST(0.993068456649780) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.091501533985138), FRAC_CONST(0.995804905891418) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(0.065403074026108), FRAC_CONST(0.997858941555023) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(0.039259787648916), FRAC_CONST(0.999229013919830) }, - { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(0.013089597225189), FRAC_CONST(0.999914348125458) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.013089684769511), FRAC_CONST(0.999914348125458) }, - { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.039259877055883), FRAC_CONST(0.999229013919830) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.065403163433075), FRAC_CONST(0.997858941555023) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.091501623392105), FRAC_CONST(0.995804905891418) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.117537491023541), FRAC_CONST(0.993068456649780) }, - { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(-0.143492683768272), FRAC_CONST(0.989651381969452) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.169349536299706), FRAC_CONST(0.985556066036224) }, - { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.220697522163391), FRAC_CONST(0.975342273712158) }, - { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(-0.246153354644775), FRAC_CONST(0.969230890274048) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.271440476179123), FRAC_CONST(0.962455213069916) }, - { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, - { FRAC_CONST(-0.296541571617126), FRAC_CONST(0.955019950866699) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.321439564228058), FRAC_CONST(0.946930110454559) }, - { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(-0.346117109060287), FRAC_CONST(0.938191294670105) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.370557487010956), FRAC_CONST(0.928809523582459) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.394743859767914), FRAC_CONST(0.918791234493256) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.418659836053848), FRAC_CONST(0.908143103122711) }, - { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, - { FRAC_CONST(-0.442288637161255), FRAC_CONST(0.896872758865356) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.465614557266235), FRAC_CONST(0.884987592697144) }, - { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(-0.488621354103088), FRAC_CONST(0.872495949268341) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.511293053627014), FRAC_CONST(0.859406411647797) }, - { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, - { FRAC_CONST(-0.533614575862885), FRAC_CONST(0.845727801322937) }, - { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.566406309604645), FRAC_CONST(0.824126124382019) }, - { FRAC_CONST(-0.577145218849182), FRAC_CONST(0.816641569137573) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.598324656486511), FRAC_CONST(0.801253736019135) }, - { FRAC_CONST(-0.608761429786682), FRAC_CONST(0.793353319168091) }, - { FRAC_CONST(-0.619093894958496), FRAC_CONST(0.785316944122314) }, - { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, - { FRAC_CONST(-0.639439046382904), FRAC_CONST(0.768841803073883) }, - { FRAC_CONST(-0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(-0.659345924854279), FRAC_CONST(0.751839697360992) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.678800761699677), FRAC_CONST(0.734322488307953) }, - { FRAC_CONST(-0.688354671001434), FRAC_CONST(0.725374281406403) }, - { FRAC_CONST(-0.697790503501892), FRAC_CONST(0.716301858425140) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.716302037239075), FRAC_CONST(0.697790324687958) }, - { FRAC_CONST(-0.725374460220337), FRAC_CONST(0.688354492187500) }, - { FRAC_CONST(-0.734322547912598), FRAC_CONST(0.678800702095032) }, - { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, - { FRAC_CONST(-0.751839876174927), FRAC_CONST(0.659345746040344) }, - { FRAC_CONST(-0.760406017303467), FRAC_CONST(0.649448037147522) }, - { FRAC_CONST(-0.768841803073883), FRAC_CONST(0.639439046382904) }, - { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, - { FRAC_CONST(-0.785316944122314), FRAC_CONST(0.619093894958496) }, - { FRAC_CONST(-0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(-0.801253914833069), FRAC_CONST(0.598324477672577) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.816641569137573), FRAC_CONST(0.577145218849182) }, - { FRAC_CONST(-0.824126303195953), FRAC_CONST(0.566406130790710) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(-0.845727920532227), FRAC_CONST(0.533614337444305) }, - { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, - { FRAC_CONST(-0.859406411647797), FRAC_CONST(0.511293053627014) }, - { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, - { FRAC_CONST(-0.872496068477631), FRAC_CONST(0.488621145486832) }, - { FRAC_CONST(-0.878817141056061), FRAC_CONST(0.477158725261688) }, - { FRAC_CONST(-0.884987652301788), FRAC_CONST(0.465614557266235) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.896872758865356), FRAC_CONST(0.442288637161255) }, - { FRAC_CONST(-0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(-0.908143222332001), FRAC_CONST(0.418659597635269) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.918791234493256), FRAC_CONST(0.394743859767914) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.928809583187103), FRAC_CONST(0.370557337999344) }, - { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, - { FRAC_CONST(-0.938191413879395), FRAC_CONST(0.346116900444031) }, - { FRAC_CONST(-0.942641556262970), FRAC_CONST(0.333806753158569) }, - { FRAC_CONST(-0.946930170059204), FRAC_CONST(0.321439445018768) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.955020010471344), FRAC_CONST(0.296541452407837) }, - { FRAC_CONST(-0.958819746971130), FRAC_CONST(0.284015297889709) }, - { FRAC_CONST(-0.962455213069916), FRAC_CONST(0.271440476179123) }, - { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, - { FRAC_CONST(-0.969230949878693), FRAC_CONST(0.246153235435486) }, - { FRAC_CONST(-0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(-0.975342333316803), FRAC_CONST(0.220697283744812) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.983254909515381), FRAC_CONST(0.182235360145569) }, - { FRAC_CONST(-0.985556066036224), FRAC_CONST(0.169349402189255) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(-0.989651441574097), FRAC_CONST(0.143492430448532) }, - { FRAC_CONST(-0.991444885730743), FRAC_CONST(0.130526080727577) }, - { FRAC_CONST(-0.993068456649780), FRAC_CONST(0.117537356913090) }, - { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, - { FRAC_CONST(-0.995804965496063), FRAC_CONST(0.091501489281654) }, - { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, - { FRAC_CONST(-0.997858941555023), FRAC_CONST(0.065403148531914) }, - { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, - { FRAC_CONST(-0.999229013919830), FRAC_CONST(0.039259742945433) }, - { FRAC_CONST(-0.999657332897186), FRAC_CONST(0.026176951825619) }, - { FRAC_CONST(-0.999914348125458), FRAC_CONST(0.013089434243739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, - { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, - { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, - { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, - { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, - { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, - { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, - { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, - { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, - { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, - { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, - { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, - { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, - { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, - { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, - { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, - { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, - { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, - { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, - { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, - { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } -}; -#endif - -ALIGN static const complex_t cfft_tab_64[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const complex_t cfft_tab_60[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, - { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, - { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } -}; -#endif - -#ifdef LD_DEC - -ALIGN static const complex_t cfft_tab_256[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, - { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, - { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, - { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, - { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, - { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, - { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, - { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, - { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, - { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, - { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, - { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, - { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, - { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, - { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, - { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, - { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, - { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, - { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, - { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, - { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, - { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, - { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, - { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, - { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, - { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, - { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, - { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, - { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, - { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, - { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, - { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, - { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, - { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, - { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, - { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, - { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, - { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, - { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, - { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, - { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, - { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, - { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, - { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, - { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, - { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, - { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, - { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const complex_t cfft_tab_240[] = -{ - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, - { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, - { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, - { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, - { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, - { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, - { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, - { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, - { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, - { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, - { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, - { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, - { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, - { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, - { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, - { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, - { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, - { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, - { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, - { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, - { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, - { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, - { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, - { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, - { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, - { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, - { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, - { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, - { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, - { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, - { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, - { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, - { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, - { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, - { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, - { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, - { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, - { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, - { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, - { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, - { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, - { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, - { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, - { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, - { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, - { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, - { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, - { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, - { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, - { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, - { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, - { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } -}; -#endif - -#endif - -#endif - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: cfft_tab.h,v 1.21 2007/11/01 12:33:29 menno Exp $ +**/ + +#ifndef __CFFT_TAB_H__ +#define __CFFT_TAB_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef FIXED_POINT + +ALIGN static const complex_t cfft_tab_512[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) }, + { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, + { FRAC_CONST(0.999322354793549), FRAC_CONST(0.036807224154472) }, + { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, + { FRAC_CONST(0.998118102550507), FRAC_CONST(0.061320740729570) }, + { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, + { FRAC_CONST(0.996312618255615), FRAC_CONST(0.085797317326069) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.993906974792480), FRAC_CONST(0.110222205519676) }, + { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, + { FRAC_CONST(0.990902662277222), FRAC_CONST(0.134580716490746) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.987301409244537), FRAC_CONST(0.158858150243759) }, + { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, + { FRAC_CONST(0.983105480670929), FRAC_CONST(0.183039888739586) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.978317379951477), FRAC_CONST(0.207111388444901) }, + { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, + { FRAC_CONST(0.972939968109131), FRAC_CONST(0.231058120727539) }, + { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, + { FRAC_CONST(0.966976463794708), FRAC_CONST(0.254865676164627) }, + { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, + { FRAC_CONST(0.960430502891541), FRAC_CONST(0.278519690036774) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.953306019306183), FRAC_CONST(0.302005946636200) }, + { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, + { FRAC_CONST(0.945607304573059), FRAC_CONST(0.325310319662094) }, + { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, + { FRAC_CONST(0.937339007854462), FRAC_CONST(0.348418682813644) }, + { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, + { FRAC_CONST(0.928506076335907), FRAC_CONST(0.371317207813263) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.919113874435425), FRAC_CONST(0.393992066383362) }, + { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, + { FRAC_CONST(0.909167945384979), FRAC_CONST(0.416429579257965) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.898674488067627), FRAC_CONST(0.438616245985031) }, + { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, + { FRAC_CONST(0.887639641761780), FRAC_CONST(0.460538715124130) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.876070082187653), FRAC_CONST(0.482183754444122) }, + { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, + { FRAC_CONST(0.863972842693329), FRAC_CONST(0.503538370132446) }, + { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(0.851355195045471), FRAC_CONST(0.524589717388153) }, + { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, + { FRAC_CONST(0.838224709033966), FRAC_CONST(0.545324981212616) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.824589252471924), FRAC_CONST(0.565731823444366) }, + { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, + { FRAC_CONST(0.810457170009613), FRAC_CONST(0.585797905921936) }, + { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, + { FRAC_CONST(0.795836925506592), FRAC_CONST(0.605511009693146) }, + { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, + { FRAC_CONST(0.780737221240997), FRAC_CONST(0.624859511852264) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.765167236328125), FRAC_CONST(0.643831551074982) }, + { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, + { FRAC_CONST(0.749136388301849), FRAC_CONST(0.662415802478790) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.732654273509979), FRAC_CONST(0.680601000785828) }, + { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, + { FRAC_CONST(0.715730786323547), FRAC_CONST(0.698376297950745) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.698376238346100), FRAC_CONST(0.715730845928192) }, + { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, + { FRAC_CONST(0.680601000785828), FRAC_CONST(0.732654273509979) }, + { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, + { FRAC_CONST(0.662415742874146), FRAC_CONST(0.749136388301849) }, + { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, + { FRAC_CONST(0.643831551074982), FRAC_CONST(0.765167295932770) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.624859452247620), FRAC_CONST(0.780737280845642) }, + { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, + { FRAC_CONST(0.605511009693146), FRAC_CONST(0.795836925506592) }, + { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(0.585797846317291), FRAC_CONST(0.810457170009613) }, + { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, + { FRAC_CONST(0.565731823444366), FRAC_CONST(0.824589312076569) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.545324981212616), FRAC_CONST(0.838224709033966) }, + { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, + { FRAC_CONST(0.524589657783508), FRAC_CONST(0.851355195045471) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.503538429737091), FRAC_CONST(0.863972842693329) }, + { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, + { FRAC_CONST(0.482183724641800), FRAC_CONST(0.876070141792297) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.460538715124130), FRAC_CONST(0.887639641761780) }, + { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, + { FRAC_CONST(0.438616186380386), FRAC_CONST(0.898674488067627) }, + { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(0.416429549455643), FRAC_CONST(0.909168004989624) }, + { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, + { FRAC_CONST(0.393991947174072), FRAC_CONST(0.919113874435425) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.371317148208618), FRAC_CONST(0.928506076335907) }, + { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, + { FRAC_CONST(0.348418682813644), FRAC_CONST(0.937339007854462) }, + { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(0.325310230255127), FRAC_CONST(0.945607364177704) }, + { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, + { FRAC_CONST(0.302005946636200), FRAC_CONST(0.953306019306183) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.278519600629807), FRAC_CONST(0.960430562496185) }, + { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, + { FRAC_CONST(0.254865646362305), FRAC_CONST(0.966976463794708) }, + { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.231058135628700), FRAC_CONST(0.972939968109131) }, + { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, + { FRAC_CONST(0.207111328840256), FRAC_CONST(0.978317379951477) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.183039888739586), FRAC_CONST(0.983105480670929) }, + { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, + { FRAC_CONST(0.158858075737953), FRAC_CONST(0.987301409244537) }, + { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(0.134580686688423), FRAC_CONST(0.990902662277222) }, + { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, + { FRAC_CONST(0.110222116112709), FRAC_CONST(0.993906974792480) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.085797272622585), FRAC_CONST(0.996312618255615) }, + { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, + { FRAC_CONST(0.061320748180151), FRAC_CONST(0.998118102550507) }, + { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(0.036807164549828), FRAC_CONST(0.999322414398193) }, + { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, + { FRAC_CONST(0.012271529063582), FRAC_CONST(0.999924719333649) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.012271616607904), FRAC_CONST(0.999924719333649) }, + { FRAC_CONST(-0.024541223421693), FRAC_CONST(0.999698817729950) }, + { FRAC_CONST(-0.036807250231504), FRAC_CONST(0.999322354793549) }, + { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.061320833861828), FRAC_CONST(0.998118102550507) }, + { FRAC_CONST(-0.073564574122429), FRAC_CONST(0.997290432453156) }, + { FRAC_CONST(-0.085797362029552), FRAC_CONST(0.996312618255615) }, + { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.110222205519676), FRAC_CONST(0.993906974792480) }, + { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, + { FRAC_CONST(-0.134580776095390), FRAC_CONST(0.990902602672577) }, + { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(-0.158858165144920), FRAC_CONST(0.987301409244537) }, + { FRAC_CONST(-0.170961946249008), FRAC_CONST(0.985277652740479) }, + { FRAC_CONST(-0.183039978146553), FRAC_CONST(0.983105480670929) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.207111418247223), FRAC_CONST(0.978317379951477) }, + { FRAC_CONST(-0.219101309776306), FRAC_CONST(0.975702106952667) }, + { FRAC_CONST(-0.231058210134506), FRAC_CONST(0.972939908504486) }, + { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(-0.254865705966949), FRAC_CONST(0.966976463794708) }, + { FRAC_CONST(-0.266712844371796), FRAC_CONST(0.963776051998138) }, + { FRAC_CONST(-0.278519690036774), FRAC_CONST(0.960430502891541) }, + { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, + { FRAC_CONST(-0.302006036043167), FRAC_CONST(0.953306019306183) }, + { FRAC_CONST(-0.313681721687317), FRAC_CONST(0.949528157711029) }, + { FRAC_CONST(-0.325310319662094), FRAC_CONST(0.945607304573059) }, + { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(-0.348418772220612), FRAC_CONST(0.937338948249817) }, + { FRAC_CONST(-0.359895050525665), FRAC_CONST(0.932992815971375) }, + { FRAC_CONST(-0.371317237615585), FRAC_CONST(0.928506076335907) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.393992036581039), FRAC_CONST(0.919113874435425) }, + { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, + { FRAC_CONST(-0.416429519653320), FRAC_CONST(0.909168004989624) }, + { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(-0.438616245985031), FRAC_CONST(0.898674428462982) }, + { FRAC_CONST(-0.449611365795136), FRAC_CONST(0.893224298954010) }, + { FRAC_CONST(-0.460538804531097), FRAC_CONST(0.887639582157135) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.482183903455734), FRAC_CONST(0.876070022583008) }, + { FRAC_CONST(-0.492898166179657), FRAC_CONST(0.870087027549744) }, + { FRAC_CONST(-0.503538370132446), FRAC_CONST(0.863972842693329) }, + { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, + { FRAC_CONST(-0.524589717388153), FRAC_CONST(0.851355135440826) }, + { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, + { FRAC_CONST(-0.545325100421906), FRAC_CONST(0.838224649429321) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.565731763839722), FRAC_CONST(0.824589312076569) }, + { FRAC_CONST(-0.575808167457581), FRAC_CONST(0.817584812641144) }, + { FRAC_CONST(-0.585797905921936), FRAC_CONST(0.810457170009613) }, + { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(-0.605511128902435), FRAC_CONST(0.795836865901947) }, + { FRAC_CONST(-0.615231692790985), FRAC_CONST(0.788346350193024) }, + { FRAC_CONST(-0.624859631061554), FRAC_CONST(0.780737102031708) }, + { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, + { FRAC_CONST(-0.643831551074982), FRAC_CONST(0.765167236328125) }, + { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, + { FRAC_CONST(-0.662415802478790), FRAC_CONST(0.749136328697205) }, + { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, + { FRAC_CONST(-0.680601119995117), FRAC_CONST(0.732654154300690) }, + { FRAC_CONST(-0.689540684223175), FRAC_CONST(0.724246978759766) }, + { FRAC_CONST(-0.698376238346100), FRAC_CONST(0.715730845928192) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.715730845928192), FRAC_CONST(0.698376238346100) }, + { FRAC_CONST(-0.724247157573700), FRAC_CONST(0.689540505409241) }, + { FRAC_CONST(-0.732654333114624), FRAC_CONST(0.680600941181183) }, + { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, + { FRAC_CONST(-0.749136507511139), FRAC_CONST(0.662415623664856) }, + { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, + { FRAC_CONST(-0.765167295932770), FRAC_CONST(0.643831551074982) }, + { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, + { FRAC_CONST(-0.780737280845642), FRAC_CONST(0.624859452247620) }, + { FRAC_CONST(-0.788346469402313), FRAC_CONST(0.615231513977051) }, + { FRAC_CONST(-0.795836985111237), FRAC_CONST(0.605510950088501) }, + { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, + { FRAC_CONST(-0.810457170009613), FRAC_CONST(0.585797846317291) }, + { FRAC_CONST(-0.817584812641144), FRAC_CONST(0.575808167457581) }, + { FRAC_CONST(-0.824589312076569), FRAC_CONST(0.565731763839722) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.838224768638611), FRAC_CONST(0.545324862003326) }, + { FRAC_CONST(-0.844853639602661), FRAC_CONST(0.534997463226318) }, + { FRAC_CONST(-0.851355314254761), FRAC_CONST(0.524589538574219) }, + { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(-0.863972842693329), FRAC_CONST(0.503538370132446) }, + { FRAC_CONST(-0.870087027549744), FRAC_CONST(0.492898136377335) }, + { FRAC_CONST(-0.876070141792297), FRAC_CONST(0.482183694839478) }, + { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, + { FRAC_CONST(-0.887639701366425), FRAC_CONST(0.460538566112518) }, + { FRAC_CONST(-0.893224298954010), FRAC_CONST(0.449611365795136) }, + { FRAC_CONST(-0.898674488067627), FRAC_CONST(0.438616245985031) }, + { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, + { FRAC_CONST(-0.909168004989624), FRAC_CONST(0.416429489850998) }, + { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, + { FRAC_CONST(-0.919113874435425), FRAC_CONST(0.393991917371750) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.928506076335907), FRAC_CONST(0.371317237615585) }, + { FRAC_CONST(-0.932992815971375), FRAC_CONST(0.359895050525665) }, + { FRAC_CONST(-0.937339007854462), FRAC_CONST(0.348418653011322) }, + { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, + { FRAC_CONST(-0.945607364177704), FRAC_CONST(0.325310200452805) }, + { FRAC_CONST(-0.949528217315674), FRAC_CONST(0.313681602478027) }, + { FRAC_CONST(-0.953306078910828), FRAC_CONST(0.302005797624588) }, + { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, + { FRAC_CONST(-0.960430502891541), FRAC_CONST(0.278519690036774) }, + { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, + { FRAC_CONST(-0.966976463794708), FRAC_CONST(0.254865586757660) }, + { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, + { FRAC_CONST(-0.972939968109131), FRAC_CONST(0.231057971715927) }, + { FRAC_CONST(-0.975702166557312), FRAC_CONST(0.219101071357727) }, + { FRAC_CONST(-0.978317379951477), FRAC_CONST(0.207111403346062) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.983105480670929), FRAC_CONST(0.183039844036102) }, + { FRAC_CONST(-0.985277652740479), FRAC_CONST(0.170961812138557) }, + { FRAC_CONST(-0.987301409244537), FRAC_CONST(0.158858031034470) }, + { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, + { FRAC_CONST(-0.990902662277222), FRAC_CONST(0.134580522775650) }, + { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, + { FRAC_CONST(-0.993906974792480), FRAC_CONST(0.110222198069096) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, + { FRAC_CONST(-0.996312618255615), FRAC_CONST(0.085797227919102) }, + { FRAC_CONST(-0.997290492057800), FRAC_CONST(0.073564447462559) }, + { FRAC_CONST(-0.998118102550507), FRAC_CONST(0.061320584267378) }, + { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, + { FRAC_CONST(-0.999322354793549), FRAC_CONST(0.036807239055634) }, + { FRAC_CONST(-0.999698817729950), FRAC_CONST(0.024541210383177) }, + { FRAC_CONST(-0.999924719333649), FRAC_CONST(0.012271485291421) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, + { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, + { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, + { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, + { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, + { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, + { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, + { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, + { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, + { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, + { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, + { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, + { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, + { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, + { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, + { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, + { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, + { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, + { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, + { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, + { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, + { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, + { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, + { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, + { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, + { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, + { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, + { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, + { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, + { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, + { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, + { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, + { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, + { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, + { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, + { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, + { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, + { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, + { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, + { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, + { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, + { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, + { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, + { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, + { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, + { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, + { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, + { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, + { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, + { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, + { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, + { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, + { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, + { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, + { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, + { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, + { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const complex_t cfft_tab_480[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.999914348125458), FRAC_CONST(0.013089596293867) }, + { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, + { FRAC_CONST(0.999229013919830), FRAC_CONST(0.039259817451239) }, + { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, + { FRAC_CONST(0.997858941555023), FRAC_CONST(0.065403133630753) }, + { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, + { FRAC_CONST(0.995804905891418), FRAC_CONST(0.091501623392105) }, + { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, + { FRAC_CONST(0.993068456649780), FRAC_CONST(0.117537401616573) }, + { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, + { FRAC_CONST(0.989651381969452), FRAC_CONST(0.143492624163628) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.985556066036224), FRAC_CONST(0.169349506497383) }, + { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.975342333316803), FRAC_CONST(0.220697447657585) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.969230890274048), FRAC_CONST(0.246153295040131) }, + { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, + { FRAC_CONST(0.962455213069916), FRAC_CONST(0.271440446376801) }, + { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, + { FRAC_CONST(0.955019950866699), FRAC_CONST(0.296541601419449) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.946930110454559), FRAC_CONST(0.321439445018768) }, + { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, + { FRAC_CONST(0.938191354274750), FRAC_CONST(0.346117079257965) }, + { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, + { FRAC_CONST(0.928809583187103), FRAC_CONST(0.370557427406311) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.918791174888611), FRAC_CONST(0.394743889570236) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.908143162727356), FRAC_CONST(0.418659746646881) }, + { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, + { FRAC_CONST(0.896872758865356), FRAC_CONST(0.442288726568222) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.884987652301788), FRAC_CONST(0.465614527463913) }, + { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, + { FRAC_CONST(0.872496008872986), FRAC_CONST(0.488621264696121) }, + { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, + { FRAC_CONST(0.859406411647797), FRAC_CONST(0.511293113231659) }, + { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, + { FRAC_CONST(0.845727801322937), FRAC_CONST(0.533614516258240) }, + { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, + { FRAC_CONST(0.816641509532928), FRAC_CONST(0.577145218849182) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.801253795623779), FRAC_CONST(0.598324596881866) }, + { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, + { FRAC_CONST(0.785316884517670), FRAC_CONST(0.619093954563141) }, + { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, + { FRAC_CONST(0.768841803073883), FRAC_CONST(0.639438986778259) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.751839756965637), FRAC_CONST(0.659345865249634) }, + { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, + { FRAC_CONST(0.734322488307953), FRAC_CONST(0.678800761699677) }, + { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, + { FRAC_CONST(0.716301918029785), FRAC_CONST(0.697790503501892) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.697790443897247), FRAC_CONST(0.716301977634430) }, + { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, + { FRAC_CONST(0.678800702095032), FRAC_CONST(0.734322547912598) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.659345805644989), FRAC_CONST(0.751839816570282) }, + { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, + { FRAC_CONST(0.639438986778259), FRAC_CONST(0.768841862678528) }, + { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, + { FRAC_CONST(0.619093954563141), FRAC_CONST(0.785316944122314) }, + { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, + { FRAC_CONST(0.598324596881866), FRAC_CONST(0.801253855228424) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.577145159244537), FRAC_CONST(0.816641569137573) }, + { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, + { FRAC_CONST(0.533614516258240), FRAC_CONST(0.845727801322937) }, + { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, + { FRAC_CONST(0.511293113231659), FRAC_CONST(0.859406411647797) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.488621175289154), FRAC_CONST(0.872496068477631) }, + { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, + { FRAC_CONST(0.465614467859268), FRAC_CONST(0.884987652301788) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.442288666963577), FRAC_CONST(0.896872758865356) }, + { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, + { FRAC_CONST(0.418659746646881), FRAC_CONST(0.908143162727356) }, + { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, + { FRAC_CONST(0.394743800163269), FRAC_CONST(0.918791234493256) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.370557397603989), FRAC_CONST(0.928809583187103) }, + { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(0.346117049455643), FRAC_CONST(0.938191354274750) }, + { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, + { FRAC_CONST(0.321439474821091), FRAC_CONST(0.946930110454559) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.296541512012482), FRAC_CONST(0.955019950866699) }, + { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, + { FRAC_CONST(0.271440386772156), FRAC_CONST(0.962455272674561) }, + { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(0.246153265237808), FRAC_CONST(0.969230890274048) }, + { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(0.220697447657585), FRAC_CONST(0.975342333316803) }, + { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, + { FRAC_CONST(0.169349446892738), FRAC_CONST(0.985556066036224) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.143492594361305), FRAC_CONST(0.989651381969452) }, + { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, + { FRAC_CONST(0.117537401616573), FRAC_CONST(0.993068456649780) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(0.091501533985138), FRAC_CONST(0.995804905891418) }, + { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(0.065403074026108), FRAC_CONST(0.997858941555023) }, + { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(0.039259787648916), FRAC_CONST(0.999229013919830) }, + { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, + { FRAC_CONST(0.013089597225189), FRAC_CONST(0.999914348125458) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.013089684769511), FRAC_CONST(0.999914348125458) }, + { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, + { FRAC_CONST(-0.039259877055883), FRAC_CONST(0.999229013919830) }, + { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.065403163433075), FRAC_CONST(0.997858941555023) }, + { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(-0.091501623392105), FRAC_CONST(0.995804905891418) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.117537491023541), FRAC_CONST(0.993068456649780) }, + { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, + { FRAC_CONST(-0.143492683768272), FRAC_CONST(0.989651381969452) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.169349536299706), FRAC_CONST(0.985556066036224) }, + { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, + { FRAC_CONST(-0.220697522163391), FRAC_CONST(0.975342273712158) }, + { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(-0.246153354644775), FRAC_CONST(0.969230890274048) }, + { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(-0.271440476179123), FRAC_CONST(0.962455213069916) }, + { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, + { FRAC_CONST(-0.296541571617126), FRAC_CONST(0.955019950866699) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.321439564228058), FRAC_CONST(0.946930110454559) }, + { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, + { FRAC_CONST(-0.346117109060287), FRAC_CONST(0.938191294670105) }, + { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(-0.370557487010956), FRAC_CONST(0.928809523582459) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.394743859767914), FRAC_CONST(0.918791234493256) }, + { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, + { FRAC_CONST(-0.418659836053848), FRAC_CONST(0.908143103122711) }, + { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, + { FRAC_CONST(-0.442288637161255), FRAC_CONST(0.896872758865356) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.465614557266235), FRAC_CONST(0.884987592697144) }, + { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, + { FRAC_CONST(-0.488621354103088), FRAC_CONST(0.872495949268341) }, + { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, + { FRAC_CONST(-0.511293053627014), FRAC_CONST(0.859406411647797) }, + { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, + { FRAC_CONST(-0.533614575862885), FRAC_CONST(0.845727801322937) }, + { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.566406309604645), FRAC_CONST(0.824126124382019) }, + { FRAC_CONST(-0.577145218849182), FRAC_CONST(0.816641569137573) }, + { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.598324656486511), FRAC_CONST(0.801253736019135) }, + { FRAC_CONST(-0.608761429786682), FRAC_CONST(0.793353319168091) }, + { FRAC_CONST(-0.619093894958496), FRAC_CONST(0.785316944122314) }, + { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, + { FRAC_CONST(-0.639439046382904), FRAC_CONST(0.768841803073883) }, + { FRAC_CONST(-0.649448037147522), FRAC_CONST(0.760405957698822) }, + { FRAC_CONST(-0.659345924854279), FRAC_CONST(0.751839697360992) }, + { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, + { FRAC_CONST(-0.678800761699677), FRAC_CONST(0.734322488307953) }, + { FRAC_CONST(-0.688354671001434), FRAC_CONST(0.725374281406403) }, + { FRAC_CONST(-0.697790503501892), FRAC_CONST(0.716301858425140) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.716302037239075), FRAC_CONST(0.697790324687958) }, + { FRAC_CONST(-0.725374460220337), FRAC_CONST(0.688354492187500) }, + { FRAC_CONST(-0.734322547912598), FRAC_CONST(0.678800702095032) }, + { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, + { FRAC_CONST(-0.751839876174927), FRAC_CONST(0.659345746040344) }, + { FRAC_CONST(-0.760406017303467), FRAC_CONST(0.649448037147522) }, + { FRAC_CONST(-0.768841803073883), FRAC_CONST(0.639439046382904) }, + { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, + { FRAC_CONST(-0.785316944122314), FRAC_CONST(0.619093894958496) }, + { FRAC_CONST(-0.793353319168091), FRAC_CONST(0.608761429786682) }, + { FRAC_CONST(-0.801253914833069), FRAC_CONST(0.598324477672577) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(-0.816641569137573), FRAC_CONST(0.577145218849182) }, + { FRAC_CONST(-0.824126303195953), FRAC_CONST(0.566406130790710) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(-0.845727920532227), FRAC_CONST(0.533614337444305) }, + { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, + { FRAC_CONST(-0.859406411647797), FRAC_CONST(0.511293053627014) }, + { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, + { FRAC_CONST(-0.872496068477631), FRAC_CONST(0.488621145486832) }, + { FRAC_CONST(-0.878817141056061), FRAC_CONST(0.477158725261688) }, + { FRAC_CONST(-0.884987652301788), FRAC_CONST(0.465614557266235) }, + { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, + { FRAC_CONST(-0.896872758865356), FRAC_CONST(0.442288637161255) }, + { FRAC_CONST(-0.902585268020630), FRAC_CONST(0.430511116981506) }, + { FRAC_CONST(-0.908143222332001), FRAC_CONST(0.418659597635269) }, + { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, + { FRAC_CONST(-0.918791234493256), FRAC_CONST(0.394743859767914) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.928809583187103), FRAC_CONST(0.370557337999344) }, + { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, + { FRAC_CONST(-0.938191413879395), FRAC_CONST(0.346116900444031) }, + { FRAC_CONST(-0.942641556262970), FRAC_CONST(0.333806753158569) }, + { FRAC_CONST(-0.946930170059204), FRAC_CONST(0.321439445018768) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.955020010471344), FRAC_CONST(0.296541452407837) }, + { FRAC_CONST(-0.958819746971130), FRAC_CONST(0.284015297889709) }, + { FRAC_CONST(-0.962455213069916), FRAC_CONST(0.271440476179123) }, + { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, + { FRAC_CONST(-0.969230949878693), FRAC_CONST(0.246153235435486) }, + { FRAC_CONST(-0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(-0.975342333316803), FRAC_CONST(0.220697283744812) }, + { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.983254909515381), FRAC_CONST(0.182235360145569) }, + { FRAC_CONST(-0.985556066036224), FRAC_CONST(0.169349402189255) }, + { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, + { FRAC_CONST(-0.989651441574097), FRAC_CONST(0.143492430448532) }, + { FRAC_CONST(-0.991444885730743), FRAC_CONST(0.130526080727577) }, + { FRAC_CONST(-0.993068456649780), FRAC_CONST(0.117537356913090) }, + { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, + { FRAC_CONST(-0.995804965496063), FRAC_CONST(0.091501489281654) }, + { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, + { FRAC_CONST(-0.997858941555023), FRAC_CONST(0.065403148531914) }, + { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, + { FRAC_CONST(-0.999229013919830), FRAC_CONST(0.039259742945433) }, + { FRAC_CONST(-0.999657332897186), FRAC_CONST(0.026176951825619) }, + { FRAC_CONST(-0.999914348125458), FRAC_CONST(0.013089434243739) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, + { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, + { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, + { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, + { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, + { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, + { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, + { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, + { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, + { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, + { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, + { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, + { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, + { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, + { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, + { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, + { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, + { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, + { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, + { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, + { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, + { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, + { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, + { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, + { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, + { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, + { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, + { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, + { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, + { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, + { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, + { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, + { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, + { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, + { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, + { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, + { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, + { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, + { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, + { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, + { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, + { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, + { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, + { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, + { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, + { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, + { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, + { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, + { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, + { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, + { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, + { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, + { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, + { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, + { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, + { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, + { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, + { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, + { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, + { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, + { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } +}; +#endif + +ALIGN static const complex_t cfft_tab_64[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, + { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, + { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const complex_t cfft_tab_60[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, + { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, + { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, + { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, + { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, + { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } +}; +#endif + +#ifdef LD_DEC + +ALIGN static const complex_t cfft_tab_256[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, + { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, + { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, + { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, + { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, + { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, + { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, + { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, + { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, + { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, + { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, + { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, + { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, + { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, + { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, + { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, + { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, + { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, + { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, + { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, + { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, + { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, + { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, + { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, + { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, + { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, + { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, + { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, + { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, + { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, + { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, + { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, + { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, + { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, + { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, + { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, + { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, + { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, + { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, + { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, + { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, + { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, + { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, + { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, + { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, + { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, + { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, + { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, + { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, + { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, + { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, + { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, + { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, + { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, + { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, + { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, + { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const complex_t cfft_tab_240[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, + { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, + { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, + { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, + { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, + { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, + { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, + { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, + { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, + { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, + { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, + { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, + { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, + { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, + { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, + { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, + { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, + { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, + { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, + { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, + { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, + { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, + { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, + { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, + { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, + { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, + { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, + { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, + { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, + { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, + { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, + { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, + { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, + { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, + { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, + { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, + { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, + { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, + { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, + { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, + { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, + { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, + { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, + { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, + { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, + { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, + { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, + { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, + { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, + { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, + { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, + { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, + { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, + { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, + { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, + { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, + { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, + { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, + { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, + { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, + { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, + { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, + { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, + { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, + { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, + { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, + { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, + { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, + { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, + { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, + { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, + { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, + { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, + { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, + { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, + { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } +}; +#endif + +#endif + +ALIGN static const complex_t cfft_tab_128[] = +{ + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, + { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, + { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, + { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, + { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, + { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, + { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, + { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, + { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, + { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, + { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, + { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, + { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, + { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, + { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, + { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, + { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, + { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, + { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, + { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, + { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, + { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, + { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, + { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, + { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } +}; + +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb.h b/src/contrib/aacdecoder/libfaad/codebook/hcb.h old mode 100644 new mode 100755 index 2418b8888..29bbca4f8 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb.h @@ -1,142 +1,145 @@ -/* -** 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: hcb.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -#ifndef __HCB_H__ -#define __HCB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * Optimal huffman decoding for AAC taken from: - * "SELECTING AN OPTIMAL HUFFMAN DECODER FOR AAC" by - * VLADIMIR Z. MESAROVIC , RAGHUNATH RAO, MIROSLAV V. DOKIC, and SACHIN DEO - * AES paper 5436 - * - * 2 methods are used for huffman decoding: - * - binary search - * - 2-step table lookup - * - * The choice of the "optimal" method is based on the fact that if the - * memory size for the Two-step is exorbitantly high then the decision - * is Binary search for that codebook. However, for marginally more memory - * size, if Twostep outperforms even the best case of Binary then the - * decision is Two-step for that codebook. - * - * The following methods are used for the different tables. - * codebook "optimal" method - * HCB_1 2-Step - * HCB_2 2-Step - * HCB_3 Binary - * HCB_4 2-Step - * HCB_5 Binary - * HCB_6 2-Step - * HCB_7 Binary - * HCB_8 2-Step - * HCB_9 Binary - * HCB_10 2-Step - * HCB_11 2-Step - * HCB_SF Binary - * - */ - - -#define ZERO_HCB 0 -#define FIRST_PAIR_HCB 5 -#define ESC_HCB 11 -#define QUAD_LEN 4 -#define PAIR_LEN 2 -#define NOISE_HCB 13 -#define INTENSITY_HCB2 14 -#define INTENSITY_HCB 15 - -/* 1st step table */ -typedef struct -{ - uint8_t offset; - uint8_t extra_bits; -} hcb; - -/* 2nd step table with quadruple data */ -typedef struct -{ - uint8_t bits; - int8_t x; - int8_t y; -} hcb_2_pair; - -typedef struct -{ - uint8_t bits; - int8_t x; - int8_t y; - int8_t v; - int8_t w; -} hcb_2_quad; - -/* binary search table */ -typedef struct -{ - uint8_t is_leaf; - int8_t data[4]; -} hcb_bin_quad; - -typedef struct -{ - uint8_t is_leaf; - int8_t data[2]; -} hcb_bin_pair; - -hcb *hcb_table[]; -hcb_2_quad *hcb_2_quad_table[]; -hcb_2_pair *hcb_2_pair_table[]; -hcb_bin_pair *hcb_bin_table[]; -uint8_t hcbN[]; -uint8_t unsigned_cb[]; -int hcb_2_quad_table_size[]; -int hcb_2_pair_table_size[]; -int hcb_bin_table_size[]; - -#include "codebook/hcb_1.h" -#include "codebook/hcb_2.h" -#include "codebook/hcb_3.h" -#include "codebook/hcb_4.h" -#include "codebook/hcb_5.h" -#include "codebook/hcb_6.h" -#include "codebook/hcb_7.h" -#include "codebook/hcb_8.h" -#include "codebook/hcb_9.h" -#include "codebook/hcb_10.h" -#include "codebook/hcb_11.h" -#include "codebook/hcb_sf.h" - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb.h,v 1.8 2007/11/01 12:34:10 menno Exp $ +**/ + +#ifndef __HCB_H__ +#define __HCB_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Optimal huffman decoding for AAC taken from: + * "SELECTING AN OPTIMAL HUFFMAN DECODER FOR AAC" by + * VLADIMIR Z. MESAROVIC , RAGHUNATH RAO, MIROSLAV V. DOKIC, and SACHIN DEO + * AES paper 5436 + * + * 2 methods are used for huffman decoding: + * - binary search + * - 2-step table lookup + * + * The choice of the "optimal" method is based on the fact that if the + * memory size for the Two-step is exorbitantly high then the decision + * is Binary search for that codebook. However, for marginally more memory + * size, if Twostep outperforms even the best case of Binary then the + * decision is Two-step for that codebook. + * + * The following methods are used for the different tables. + * codebook "optimal" method + * HCB_1 2-Step + * HCB_2 2-Step + * HCB_3 Binary + * HCB_4 2-Step + * HCB_5 Binary + * HCB_6 2-Step + * HCB_7 Binary + * HCB_8 2-Step + * HCB_9 Binary + * HCB_10 2-Step + * HCB_11 2-Step + * HCB_SF Binary + * + */ + + +#define ZERO_HCB 0 +#define FIRST_PAIR_HCB 5 +#define ESC_HCB 11 +#define QUAD_LEN 4 +#define PAIR_LEN 2 +#define NOISE_HCB 13 +#define INTENSITY_HCB2 14 +#define INTENSITY_HCB 15 + +/* 1st step table */ +typedef struct +{ + uint8_t offset; + uint8_t extra_bits; +} hcb; + +/* 2nd step table with quadruple data */ +typedef struct +{ + uint8_t bits; + int8_t x; + int8_t y; +} hcb_2_pair; + +typedef struct +{ + uint8_t bits; + int8_t x; + int8_t y; + int8_t v; + int8_t w; +} hcb_2_quad; + +/* binary search table */ +typedef struct +{ + uint8_t is_leaf; + int8_t data[4]; +} hcb_bin_quad; + +typedef struct +{ + uint8_t is_leaf; + int8_t data[2]; +} hcb_bin_pair; + +hcb *hcb_table[]; +hcb_2_quad *hcb_2_quad_table[]; +hcb_2_pair *hcb_2_pair_table[]; +hcb_bin_pair *hcb_bin_table[]; +uint8_t hcbN[]; +uint8_t unsigned_cb[]; +int hcb_2_quad_table_size[]; +int hcb_2_pair_table_size[]; +int hcb_bin_table_size[]; + +#include "codebook/hcb_1.h" +#include "codebook/hcb_2.h" +#include "codebook/hcb_3.h" +#include "codebook/hcb_4.h" +#include "codebook/hcb_5.h" +#include "codebook/hcb_6.h" +#include "codebook/hcb_7.h" +#include "codebook/hcb_8.h" +#include "codebook/hcb_9.h" +#include "codebook/hcb_10.h" +#include "codebook/hcb_11.h" +#include "codebook/hcb_sf.h" + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_1.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_1.h old mode 100644 new mode 100755 index a7ab382c5..f6632c230 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_1.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_1.h @@ -1,183 +1,186 @@ -/* -** 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: hcb_1.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_1 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb1_1[] = { - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* 10000 */ 1, 0 }, - { /* 10001 */ 2, 0 }, - { /* 10010 */ 3, 0 }, - { /* 10011 */ 4, 0 }, - { /* 10100 */ 5, 0 }, - { /* 10101 */ 6, 0 }, - { /* 10110 */ 7, 0 }, - { /* 10111 */ 8, 0 }, - - /* 7 bit codewords */ - { /* 11000 */ 9, 2 }, - { /* 11001 */ 13, 2 }, - { /* 11010 */ 17, 2 }, - { /* 11011 */ 21, 2 }, - { /* 11100 */ 25, 2 }, - { /* 11101 */ 29, 2 }, - - /* 9 bit codewords */ - { /* 11110 */ 33, 4 }, - - /* 9/10/11 bit codewords */ - { /* 11111 */ 49, 6 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_quad hcb1_2[] = { - /* 1 bit codeword */ - { 1, 0, 0, 0, 0 }, - - /* 5 bit codewords */ - { 5, 1, 0, 0, 0 }, - { 5, -1, 0, 0, 0 }, - { 5, 0, 0, 0, -1 }, - { 5, 0, 1, 0, 0 }, - { 5, 0, 0, 0, 1 }, - { 5, 0, 0, -1, 0 }, - { 5, 0, 0, 1, 0 }, - { 5, 0, -1, 0, 0 }, - - /* 7 bit codewords */ - /* first 5 bits: 11000 */ - { 7, 1, -1, 0, 0 }, - { 7, -1, 1, 0, 0 }, - { 7, 0, 0, -1, 1 }, - { 7, 0, 1, -1, 0 }, - /* first 5 bits: 11001 */ - { 7, 0, -1, 1, 0 }, - { 7, 0, 0, 1, -1 }, - { 7, 1, 1, 0, 0 }, - { 7, 0, 0, -1, -1 }, - /* first 5 bits: 11010 */ - { 7, -1, -1, 0, 0 }, - { 7, 0, -1, -1, 0 }, - { 7, 1, 0, -1, 0 }, - { 7, 0, 1, 0, -1 }, - /* first 5 bits: 11011 */ - { 7, -1, 0, 1, 0 }, - { 7, 0, 0, 1, 1 }, - { 7, 1, 0, 1, 0 }, - { 7, 0, -1, 0, 1 }, - /* first 5 bits: 11100 */ - { 7, 0, 1, 1, 0 }, - { 7, 0, 1, 0, 1 }, - { 7, -1, 0, -1, 0 }, - { 7, 1, 0, 0, 1 }, - /* first 5 bits: 11101 */ - { 7, -1, 0, 0, -1 }, - { 7, 1, 0, 0, -1 }, - { 7, -1, 0, 0, 1 }, - { 7, 0, -1, 0, -1 }, - - /* 9 bit codeword */ - /* first 5 bits: 11110 */ - { 9, 1, 1, -1, 0 }, - { 9, -1, 1, -1, 0 }, - { 9, 1, -1, 1, 0 }, - { 9, 0, 1, 1, -1 }, - { 9, 0, 1, -1, 1 }, - { 9, 0, -1, 1, 1 }, - { 9, 0, -1, 1, -1 }, - { 9, 1, -1, -1, 0 }, - { 9, 1, 0, -1, 1 }, - { 9, 0, 1, -1, -1 }, - { 9, -1, 1, 1, 0 }, - { 9, -1, 0, 1, -1 }, - { 9, -1, -1, 1, 0 }, - { 9, 0, -1, -1, 1 }, - { 9, 1, -1, 0, 1 }, - { 9, 1, -1, 0, -1 }, - - /* 9/10/11 bit codewords */ - /* first 5 bits: 11111 */ - /* 9 bit: reading 11 bits -> 2 too much so 4 entries for each codeword */ - { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, - { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, - { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, - { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, - { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, - { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, - { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, - { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, - /* 10 bit: reading 11 bits -> 1 too much so 2 entries for each codeword */ - { 10, -1, -1, 0, 1 }, { 10, -1, -1, 0, 1 }, - { 10, -1, 0, -1, -1 }, { 10, -1, 0, -1, -1 }, - { 10, 1, 1, 0, -1 }, { 10, 1, 1, 0, -1 }, - { 10, 1, 0, -1, -1 }, { 10, 1, 0, -1, -1 }, - { 10, -1, 0, -1, 1 }, { 10, -1, 0, -1, 1 }, - { 10, -1, -1, 0, -1 }, { 10, -1, -1, 0, -1 }, - { 10, -1, 0, 1, 1 }, { 10, -1, 0, 1, 1 }, - { 10, 1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, - /* 11 bit */ - { 11, 1, -1, 1, -1 }, - { 11, -1, 1, -1, 1 }, - { 11, -1, 1, 1, -1 }, - { 11, 1, -1, -1, 1 }, - { 11, 1, 1, 1, 1 }, - { 11, -1, -1, 1, 1 }, - { 11, 1, 1, -1, -1 }, - { 11, -1, -1, 1, -1 }, - { 11, -1, -1, -1, -1 }, - { 11, 1, 1, -1, 1 }, - { 11, 1, -1, 1, 1 }, - { 11, -1, 1, 1, 1 }, - { 11, -1, 1, -1, -1 }, - { 11, -1, -1, -1, 1 }, - { 11, 1, -1, -1, -1 }, - { 11, 1, 1, 1, -1 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_1.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_1 */ + + +/* 1st step: 5 bits + * 2^5 = 32 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb1_1[] = { + { /* 00000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* 10000 */ 1, 0 }, + { /* 10001 */ 2, 0 }, + { /* 10010 */ 3, 0 }, + { /* 10011 */ 4, 0 }, + { /* 10100 */ 5, 0 }, + { /* 10101 */ 6, 0 }, + { /* 10110 */ 7, 0 }, + { /* 10111 */ 8, 0 }, + + /* 7 bit codewords */ + { /* 11000 */ 9, 2 }, + { /* 11001 */ 13, 2 }, + { /* 11010 */ 17, 2 }, + { /* 11011 */ 21, 2 }, + { /* 11100 */ 25, 2 }, + { /* 11101 */ 29, 2 }, + + /* 9 bit codewords */ + { /* 11110 */ 33, 4 }, + + /* 9/10/11 bit codewords */ + { /* 11111 */ 49, 6 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_quad hcb1_2[] = { + /* 1 bit codeword */ + { 1, 0, 0, 0, 0 }, + + /* 5 bit codewords */ + { 5, 1, 0, 0, 0 }, + { 5, -1, 0, 0, 0 }, + { 5, 0, 0, 0, -1 }, + { 5, 0, 1, 0, 0 }, + { 5, 0, 0, 0, 1 }, + { 5, 0, 0, -1, 0 }, + { 5, 0, 0, 1, 0 }, + { 5, 0, -1, 0, 0 }, + + /* 7 bit codewords */ + /* first 5 bits: 11000 */ + { 7, 1, -1, 0, 0 }, + { 7, -1, 1, 0, 0 }, + { 7, 0, 0, -1, 1 }, + { 7, 0, 1, -1, 0 }, + /* first 5 bits: 11001 */ + { 7, 0, -1, 1, 0 }, + { 7, 0, 0, 1, -1 }, + { 7, 1, 1, 0, 0 }, + { 7, 0, 0, -1, -1 }, + /* first 5 bits: 11010 */ + { 7, -1, -1, 0, 0 }, + { 7, 0, -1, -1, 0 }, + { 7, 1, 0, -1, 0 }, + { 7, 0, 1, 0, -1 }, + /* first 5 bits: 11011 */ + { 7, -1, 0, 1, 0 }, + { 7, 0, 0, 1, 1 }, + { 7, 1, 0, 1, 0 }, + { 7, 0, -1, 0, 1 }, + /* first 5 bits: 11100 */ + { 7, 0, 1, 1, 0 }, + { 7, 0, 1, 0, 1 }, + { 7, -1, 0, -1, 0 }, + { 7, 1, 0, 0, 1 }, + /* first 5 bits: 11101 */ + { 7, -1, 0, 0, -1 }, + { 7, 1, 0, 0, -1 }, + { 7, -1, 0, 0, 1 }, + { 7, 0, -1, 0, -1 }, + + /* 9 bit codeword */ + /* first 5 bits: 11110 */ + { 9, 1, 1, -1, 0 }, + { 9, -1, 1, -1, 0 }, + { 9, 1, -1, 1, 0 }, + { 9, 0, 1, 1, -1 }, + { 9, 0, 1, -1, 1 }, + { 9, 0, -1, 1, 1 }, + { 9, 0, -1, 1, -1 }, + { 9, 1, -1, -1, 0 }, + { 9, 1, 0, -1, 1 }, + { 9, 0, 1, -1, -1 }, + { 9, -1, 1, 1, 0 }, + { 9, -1, 0, 1, -1 }, + { 9, -1, -1, 1, 0 }, + { 9, 0, -1, -1, 1 }, + { 9, 1, -1, 0, 1 }, + { 9, 1, -1, 0, -1 }, + + /* 9/10/11 bit codewords */ + /* first 5 bits: 11111 */ + /* 9 bit: reading 11 bits -> 2 too much so 4 entries for each codeword */ + { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, + { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, + { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, + { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, + { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, + { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, + { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, + { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, + /* 10 bit: reading 11 bits -> 1 too much so 2 entries for each codeword */ + { 10, -1, -1, 0, 1 }, { 10, -1, -1, 0, 1 }, + { 10, -1, 0, -1, -1 }, { 10, -1, 0, -1, -1 }, + { 10, 1, 1, 0, -1 }, { 10, 1, 1, 0, -1 }, + { 10, 1, 0, -1, -1 }, { 10, 1, 0, -1, -1 }, + { 10, -1, 0, -1, 1 }, { 10, -1, 0, -1, 1 }, + { 10, -1, -1, 0, -1 }, { 10, -1, -1, 0, -1 }, + { 10, -1, 0, 1, 1 }, { 10, -1, 0, 1, 1 }, + { 10, 1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, + /* 11 bit */ + { 11, 1, -1, 1, -1 }, + { 11, -1, 1, -1, 1 }, + { 11, -1, 1, 1, -1 }, + { 11, 1, -1, -1, 1 }, + { 11, 1, 1, 1, 1 }, + { 11, -1, -1, 1, 1 }, + { 11, 1, 1, -1, -1 }, + { 11, -1, -1, 1, -1 }, + { 11, -1, -1, -1, -1 }, + { 11, 1, 1, -1, 1 }, + { 11, 1, -1, 1, 1 }, + { 11, -1, 1, 1, 1 }, + { 11, -1, 1, -1, -1 }, + { 11, -1, -1, -1, 1 }, + { 11, 1, -1, -1, -1 }, + { 11, 1, 1, 1, -1 } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_10.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_10.h old mode 100644 new mode 100755 index 42e72561e..87e621df5 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_10.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_10.h @@ -1,309 +1,312 @@ -/* -** 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: hcb_10.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_10 */ - - -/* 1st step: 6 bits - * 2^6 = 64 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb10_1[] = { - /* 4 bit codewords */ - { /* 000000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* 000100 */ 1, 0 }, - { /* */ 1, 0 }, - { /* */ 1, 0 }, - { /* */ 1, 0 }, - { /* 001000 */ 2, 0 }, - { /* */ 2, 0 }, - { /* */ 2, 0 }, - { /* */ 2, 0 }, - /* 5 bit codewords */ - { /* 001100 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 001110 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 010000 */ 5, 0 }, - { /* */ 5, 0 }, - { /* 010010 */ 6, 0 }, - { /* */ 6, 0 }, - { /* 010100 */ 7, 0 }, - { /* */ 7, 0 }, - { /* 010110 */ 8, 0 }, - { /* */ 8, 0 }, - { /* 011000 */ 9, 0 }, - { /* */ 9, 0 }, - { /* 011010 */ 10, 0 }, - { /* */ 10, 0 }, - /* 6 bit codewords */ - { /* 011100 */ 11, 0 }, - { /* 011101 */ 12, 0 }, - { /* 011110 */ 13, 0 }, - { /* 011111 */ 14, 0 }, - { /* 100000 */ 15, 0 }, - { /* 100001 */ 16, 0 }, - { /* 100010 */ 17, 0 }, - { /* 100011 */ 18, 0 }, - { /* 100100 */ 19, 0 }, - { /* 100101 */ 20, 0 }, - { /* 100110 */ 21, 0 }, - { /* 100111 */ 22, 0 }, - { /* 101000 */ 23, 0 }, - { /* 101001 */ 24, 0 }, - /* 7 bit codewords */ - { /* 101010 */ 25, 1 }, - { /* 101011 */ 27, 1 }, - { /* 101100 */ 29, 1 }, - { /* 101101 */ 31, 1 }, - { /* 101110 */ 33, 1 }, - { /* 101111 */ 35, 1 }, - { /* 110000 */ 37, 1 }, - { /* 110001 */ 39, 1 }, - /* 7/8 bit codewords */ - { /* 110010 */ 41, 2 }, - /* 8 bit codewords */ - { /* 110011 */ 45, 2 }, - { /* 110100 */ 49, 2 }, - { /* 110101 */ 53, 2 }, - { /* 110110 */ 57, 2 }, - { /* 110111 */ 61, 2 }, - /* 8/9 bit codewords */ - { /* 111000 */ 65, 3 }, - /* 9 bit codewords */ - { /* 111001 */ 73, 3 }, - { /* 111010 */ 81, 3 }, - { /* 111011 */ 89, 3 }, - /* 9/10 bit codewords */ - { /* 111100 */ 97, 4 }, - /* 10 bit codewords */ - { /* 111101 */ 113, 4 }, - { /* 111110 */ 129, 4 }, - /* 10/11/12 bit codewords */ - { /* 111111 */ 145, 6 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb10_2[] = { - /* 4 bit codewords */ - { 4, 1, 1 }, - { 4, 1, 2 }, - { 4, 2, 1 }, - - /* 5 bit codewords */ - { 5, 2, 2 }, - { 5, 1, 0 }, - { 5, 0, 1 }, - { 5, 1, 3 }, - { 5, 3, 2 }, - { 5, 3, 1 }, - { 5, 2, 3 }, - { 5, 3, 3 }, - - /* 6 bit codewords */ - { 6, 2, 0 }, - { 6, 0, 2 }, - { 6, 2, 4 }, - { 6, 4, 2 }, - { 6, 1, 4 }, - { 6, 4, 1 }, - { 6, 0, 0 }, - { 6, 4, 3 }, - { 6, 3, 4 }, - { 6, 3, 0 }, - { 6, 0, 3 }, - { 6, 4, 4 }, - { 6, 2, 5 }, - { 6, 5, 2 }, - - /* 7 bit codewords */ - { 7, 1, 5 }, - { 7, 5, 1 }, - { 7, 5, 3 }, - { 7, 3, 5 }, - { 7, 5, 4 }, - { 7, 4, 5 }, - { 7, 6, 2 }, - { 7, 2, 6 }, - { 7, 6, 3 }, - { 7, 4, 0 }, - { 7, 6, 1 }, - { 7, 0, 4 }, - { 7, 1, 6 }, - { 7, 3, 6 }, - { 7, 5, 5 }, - { 7, 6, 4 }, - - /* 7/8 bit codewords */ - { 7, 4, 6 }, { 7, 4, 6 }, - { 8, 6, 5 }, - { 8, 7, 2 }, - - /* 8 bit codewords */ - { 8, 3, 7 }, - { 8, 2, 7 }, - { 8, 5, 6 }, - { 8, 8, 2 }, - { 8, 7, 3 }, - { 8, 5, 0 }, - { 8, 7, 1 }, - { 8, 0, 5 }, - { 8, 8, 1 }, - { 8, 1, 7 }, - { 8, 8, 3 }, - { 8, 7, 4 }, - { 8, 4, 7 }, - { 8, 2, 8 }, - { 8, 6, 6 }, - { 8, 7, 5 }, - { 8, 1, 8 }, - { 8, 3, 8 }, - { 8, 8, 4 }, - { 8, 4, 8 }, - - /* 8/9 bit codewords */ - { 8, 5, 7 }, { 8, 5, 7 }, - { 8, 8, 5 }, { 8, 8, 5 }, - { 8, 5, 8 }, { 8, 5, 8 }, - { 9, 7, 6 }, - { 9, 6, 7 }, - - /* 9 bit codewords */ - { 9, 9, 2 }, - { 9, 6, 0 }, - { 9, 6, 8 }, - { 9, 9, 3 }, - { 9, 3, 9 }, - { 9, 9, 1 }, - { 9, 2, 9 }, - { 9, 0, 6 }, - { 9, 8, 6 }, - { 9, 9, 4 }, - { 9, 4, 9 }, - { 9, 10, 2 }, - { 9, 1, 9 }, - { 9, 7, 7 }, - { 9, 8, 7 }, - { 9, 9, 5 }, - { 9, 7, 8 }, - { 9, 10, 3 }, - { 9, 5, 9 }, - { 9, 10, 4 }, - { 9, 2, 10 }, - { 9, 10, 1 }, - { 9, 3, 10 }, - { 9, 9, 6 }, - - /* 9/10 bit codewords */ - { 9, 6, 9 }, { 9, 6, 9 }, - { 9, 8, 0 }, { 9, 8, 0 }, - { 9, 4, 10 }, { 9, 4, 10 }, - { 9, 7, 0 }, { 9, 7, 0 }, - { 9, 11, 2 }, { 9, 11, 2 }, - { 10, 7, 9 }, - { 10, 11, 3 }, - { 10, 10, 6 }, - { 10, 1, 10 }, - { 10, 11, 1 }, - { 10, 9, 7 }, - - /* 10 bit codewords */ - { 10, 0, 7 }, - { 10, 8, 8 }, - { 10, 10, 5 }, - { 10, 3, 11 }, - { 10, 5, 10 }, - { 10, 8, 9 }, - { 10, 11, 5 }, - { 10, 0, 8 }, - { 10, 11, 4 }, - { 10, 2, 11 }, - { 10, 7, 10 }, - { 10, 6, 10 }, - { 10, 10, 7 }, - { 10, 4, 11 }, - { 10, 1, 11 }, - { 10, 12, 2 }, - { 10, 9, 8 }, - { 10, 12, 3 }, - { 10, 11, 6 }, - { 10, 5, 11 }, - { 10, 12, 4 }, - { 10, 11, 7 }, - { 10, 12, 5 }, - { 10, 3, 12 }, - { 10, 6, 11 }, - { 10, 9, 0 }, - { 10, 10, 8 }, - { 10, 10, 0 }, - { 10, 12, 1 }, - { 10, 0, 9 }, - { 10, 4, 12 }, - { 10, 9, 9 }, - - /* 10/11/12 bit codewords */ - { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, - { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, - { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, - { 11, 9, 10 }, { 11, 9, 10 }, - { 11, 1, 12 }, { 11, 1, 12 }, - { 11, 11, 8 }, { 11, 11, 8 }, - { 11, 12, 7 }, { 11, 12, 7 }, - { 11, 7, 11 }, { 11, 7, 11 }, - { 11, 5, 12 }, { 11, 5, 12 }, - { 11, 6, 12 }, { 11, 6, 12 }, - { 11, 10, 9 }, { 11, 10, 9 }, - { 11, 8, 11 }, { 11, 8, 11 }, - { 11, 12, 8 }, { 11, 12, 8 }, - { 11, 0, 10 }, { 11, 0, 10 }, - { 11, 7, 12 }, { 11, 7, 12 }, - { 11, 11, 0 }, { 11, 11, 0 }, - { 11, 10, 10 }, { 11, 10, 10 }, - { 11, 11, 9 }, { 11, 11, 9 }, - { 11, 11, 10 }, { 11, 11, 10 }, - { 11, 0, 11 }, { 11, 0, 11 }, - { 11, 11, 11 }, { 11, 11, 11 }, - { 11, 9, 11 }, { 11, 9, 11 }, - { 11, 10, 11 }, { 11, 10, 11 }, - { 11, 12, 0 }, { 11, 12, 0 }, - { 11, 8, 12 }, { 11, 8, 12 }, - { 12, 12, 9 }, - { 12, 10, 12 }, - { 12, 9, 12 }, - { 12, 11, 12 }, - { 12, 12, 11 }, - { 12, 0, 12 }, - { 12, 12, 10 }, - { 12, 12, 12 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_10.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_10 */ + + +/* 1st step: 6 bits + * 2^6 = 64 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb10_1[] = { + /* 4 bit codewords */ + { /* 000000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* 000100 */ 1, 0 }, + { /* */ 1, 0 }, + { /* */ 1, 0 }, + { /* */ 1, 0 }, + { /* 001000 */ 2, 0 }, + { /* */ 2, 0 }, + { /* */ 2, 0 }, + { /* */ 2, 0 }, + /* 5 bit codewords */ + { /* 001100 */ 3, 0 }, + { /* */ 3, 0 }, + { /* 001110 */ 4, 0 }, + { /* */ 4, 0 }, + { /* 010000 */ 5, 0 }, + { /* */ 5, 0 }, + { /* 010010 */ 6, 0 }, + { /* */ 6, 0 }, + { /* 010100 */ 7, 0 }, + { /* */ 7, 0 }, + { /* 010110 */ 8, 0 }, + { /* */ 8, 0 }, + { /* 011000 */ 9, 0 }, + { /* */ 9, 0 }, + { /* 011010 */ 10, 0 }, + { /* */ 10, 0 }, + /* 6 bit codewords */ + { /* 011100 */ 11, 0 }, + { /* 011101 */ 12, 0 }, + { /* 011110 */ 13, 0 }, + { /* 011111 */ 14, 0 }, + { /* 100000 */ 15, 0 }, + { /* 100001 */ 16, 0 }, + { /* 100010 */ 17, 0 }, + { /* 100011 */ 18, 0 }, + { /* 100100 */ 19, 0 }, + { /* 100101 */ 20, 0 }, + { /* 100110 */ 21, 0 }, + { /* 100111 */ 22, 0 }, + { /* 101000 */ 23, 0 }, + { /* 101001 */ 24, 0 }, + /* 7 bit codewords */ + { /* 101010 */ 25, 1 }, + { /* 101011 */ 27, 1 }, + { /* 101100 */ 29, 1 }, + { /* 101101 */ 31, 1 }, + { /* 101110 */ 33, 1 }, + { /* 101111 */ 35, 1 }, + { /* 110000 */ 37, 1 }, + { /* 110001 */ 39, 1 }, + /* 7/8 bit codewords */ + { /* 110010 */ 41, 2 }, + /* 8 bit codewords */ + { /* 110011 */ 45, 2 }, + { /* 110100 */ 49, 2 }, + { /* 110101 */ 53, 2 }, + { /* 110110 */ 57, 2 }, + { /* 110111 */ 61, 2 }, + /* 8/9 bit codewords */ + { /* 111000 */ 65, 3 }, + /* 9 bit codewords */ + { /* 111001 */ 73, 3 }, + { /* 111010 */ 81, 3 }, + { /* 111011 */ 89, 3 }, + /* 9/10 bit codewords */ + { /* 111100 */ 97, 4 }, + /* 10 bit codewords */ + { /* 111101 */ 113, 4 }, + { /* 111110 */ 129, 4 }, + /* 10/11/12 bit codewords */ + { /* 111111 */ 145, 6 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_pair hcb10_2[] = { + /* 4 bit codewords */ + { 4, 1, 1 }, + { 4, 1, 2 }, + { 4, 2, 1 }, + + /* 5 bit codewords */ + { 5, 2, 2 }, + { 5, 1, 0 }, + { 5, 0, 1 }, + { 5, 1, 3 }, + { 5, 3, 2 }, + { 5, 3, 1 }, + { 5, 2, 3 }, + { 5, 3, 3 }, + + /* 6 bit codewords */ + { 6, 2, 0 }, + { 6, 0, 2 }, + { 6, 2, 4 }, + { 6, 4, 2 }, + { 6, 1, 4 }, + { 6, 4, 1 }, + { 6, 0, 0 }, + { 6, 4, 3 }, + { 6, 3, 4 }, + { 6, 3, 0 }, + { 6, 0, 3 }, + { 6, 4, 4 }, + { 6, 2, 5 }, + { 6, 5, 2 }, + + /* 7 bit codewords */ + { 7, 1, 5 }, + { 7, 5, 1 }, + { 7, 5, 3 }, + { 7, 3, 5 }, + { 7, 5, 4 }, + { 7, 4, 5 }, + { 7, 6, 2 }, + { 7, 2, 6 }, + { 7, 6, 3 }, + { 7, 4, 0 }, + { 7, 6, 1 }, + { 7, 0, 4 }, + { 7, 1, 6 }, + { 7, 3, 6 }, + { 7, 5, 5 }, + { 7, 6, 4 }, + + /* 7/8 bit codewords */ + { 7, 4, 6 }, { 7, 4, 6 }, + { 8, 6, 5 }, + { 8, 7, 2 }, + + /* 8 bit codewords */ + { 8, 3, 7 }, + { 8, 2, 7 }, + { 8, 5, 6 }, + { 8, 8, 2 }, + { 8, 7, 3 }, + { 8, 5, 0 }, + { 8, 7, 1 }, + { 8, 0, 5 }, + { 8, 8, 1 }, + { 8, 1, 7 }, + { 8, 8, 3 }, + { 8, 7, 4 }, + { 8, 4, 7 }, + { 8, 2, 8 }, + { 8, 6, 6 }, + { 8, 7, 5 }, + { 8, 1, 8 }, + { 8, 3, 8 }, + { 8, 8, 4 }, + { 8, 4, 8 }, + + /* 8/9 bit codewords */ + { 8, 5, 7 }, { 8, 5, 7 }, + { 8, 8, 5 }, { 8, 8, 5 }, + { 8, 5, 8 }, { 8, 5, 8 }, + { 9, 7, 6 }, + { 9, 6, 7 }, + + /* 9 bit codewords */ + { 9, 9, 2 }, + { 9, 6, 0 }, + { 9, 6, 8 }, + { 9, 9, 3 }, + { 9, 3, 9 }, + { 9, 9, 1 }, + { 9, 2, 9 }, + { 9, 0, 6 }, + { 9, 8, 6 }, + { 9, 9, 4 }, + { 9, 4, 9 }, + { 9, 10, 2 }, + { 9, 1, 9 }, + { 9, 7, 7 }, + { 9, 8, 7 }, + { 9, 9, 5 }, + { 9, 7, 8 }, + { 9, 10, 3 }, + { 9, 5, 9 }, + { 9, 10, 4 }, + { 9, 2, 10 }, + { 9, 10, 1 }, + { 9, 3, 10 }, + { 9, 9, 6 }, + + /* 9/10 bit codewords */ + { 9, 6, 9 }, { 9, 6, 9 }, + { 9, 8, 0 }, { 9, 8, 0 }, + { 9, 4, 10 }, { 9, 4, 10 }, + { 9, 7, 0 }, { 9, 7, 0 }, + { 9, 11, 2 }, { 9, 11, 2 }, + { 10, 7, 9 }, + { 10, 11, 3 }, + { 10, 10, 6 }, + { 10, 1, 10 }, + { 10, 11, 1 }, + { 10, 9, 7 }, + + /* 10 bit codewords */ + { 10, 0, 7 }, + { 10, 8, 8 }, + { 10, 10, 5 }, + { 10, 3, 11 }, + { 10, 5, 10 }, + { 10, 8, 9 }, + { 10, 11, 5 }, + { 10, 0, 8 }, + { 10, 11, 4 }, + { 10, 2, 11 }, + { 10, 7, 10 }, + { 10, 6, 10 }, + { 10, 10, 7 }, + { 10, 4, 11 }, + { 10, 1, 11 }, + { 10, 12, 2 }, + { 10, 9, 8 }, + { 10, 12, 3 }, + { 10, 11, 6 }, + { 10, 5, 11 }, + { 10, 12, 4 }, + { 10, 11, 7 }, + { 10, 12, 5 }, + { 10, 3, 12 }, + { 10, 6, 11 }, + { 10, 9, 0 }, + { 10, 10, 8 }, + { 10, 10, 0 }, + { 10, 12, 1 }, + { 10, 0, 9 }, + { 10, 4, 12 }, + { 10, 9, 9 }, + + /* 10/11/12 bit codewords */ + { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, + { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, + { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, + { 11, 9, 10 }, { 11, 9, 10 }, + { 11, 1, 12 }, { 11, 1, 12 }, + { 11, 11, 8 }, { 11, 11, 8 }, + { 11, 12, 7 }, { 11, 12, 7 }, + { 11, 7, 11 }, { 11, 7, 11 }, + { 11, 5, 12 }, { 11, 5, 12 }, + { 11, 6, 12 }, { 11, 6, 12 }, + { 11, 10, 9 }, { 11, 10, 9 }, + { 11, 8, 11 }, { 11, 8, 11 }, + { 11, 12, 8 }, { 11, 12, 8 }, + { 11, 0, 10 }, { 11, 0, 10 }, + { 11, 7, 12 }, { 11, 7, 12 }, + { 11, 11, 0 }, { 11, 11, 0 }, + { 11, 10, 10 }, { 11, 10, 10 }, + { 11, 11, 9 }, { 11, 11, 9 }, + { 11, 11, 10 }, { 11, 11, 10 }, + { 11, 0, 11 }, { 11, 0, 11 }, + { 11, 11, 11 }, { 11, 11, 11 }, + { 11, 9, 11 }, { 11, 9, 11 }, + { 11, 10, 11 }, { 11, 10, 11 }, + { 11, 12, 0 }, { 11, 12, 0 }, + { 11, 8, 12 }, { 11, 8, 12 }, + { 12, 12, 9 }, + { 12, 10, 12 }, + { 12, 9, 12 }, + { 12, 11, 12 }, + { 12, 12, 11 }, + { 12, 0, 12 }, + { 12, 12, 10 }, + { 12, 12, 12 } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_11.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_11.h old mode 100644 new mode 100755 index ce23b74a1..509a1d684 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_11.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_11.h @@ -1,412 +1,415 @@ -/* -** 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: hcb_11.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_11 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb11_1[] = { - /* 4 bits */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00010 */ 1, 0 }, - { /* */ 1, 0 }, - - /* 5 bits */ - { /* 00100 */ 2, 0 }, - { /* 00101 */ 3, 0 }, - { /* 00110 */ 4, 0 }, - { /* 00111 */ 5, 0 }, - { /* 01000 */ 6, 0 }, - { /* 01001 */ 7, 0 }, - - /* 6 bits */ - { /* 01010 */ 8, 1 }, - { /* 01011 */ 10, 1 }, - { /* 01100 */ 12, 1 }, - - /* 6/7 bits */ - { /* 01101 */ 14, 2 }, - - /* 7 bits */ - { /* 01110 */ 18, 2 }, - { /* 01111 */ 22, 2 }, - { /* 10000 */ 26, 2 }, - - /* 7/8 bits */ - { /* 10001 */ 30, 3 }, - - /* 8 bits */ - { /* 10010 */ 38, 3 }, - { /* 10011 */ 46, 3 }, - { /* 10100 */ 54, 3 }, - { /* 10101 */ 62, 3 }, - { /* 10110 */ 70, 3 }, - { /* 10111 */ 78, 3 }, - - /* 8/9 bits */ - { /* 11000 */ 86, 4 }, - - /* 9 bits */ - { /* 11001 */ 102, 4 }, - { /* 11010 */ 118, 4 }, - { /* 11011 */ 134, 4 }, - - /* 9/10 bits */ - { /* 11100 */ 150, 5 }, - - /* 10 bits */ - { /* 11101 */ 182, 5 }, - { /* 11110 */ 214, 5 }, - - /* 10/11/12 bits */ - { /* 11111 */ 246, 7 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb11_2[] = { - /* 4 */ - { 4, 0, 0 }, - { 4, 1, 1 }, - - /* 5 */ - { 5, 16, 16 }, - { 5, 1, 0 }, - { 5, 0, 1 }, - { 5, 2, 1 }, - { 5, 1, 2 }, - { 5, 2, 2 }, - - /* 6 */ - { 6, 1, 3 }, - { 6, 3, 1 }, - { 6, 3, 2 }, - { 6, 2, 0 }, - { 6, 2, 3 }, - { 6, 0, 2 }, - - /* 6/7 */ - { 6, 3, 3 }, { 6, 3, 3 }, - { 7, 4, 1 }, - { 7, 1, 4 }, - - /* 7 */ - { 7, 4, 2 }, - { 7, 2, 4 }, - { 7, 4, 3 }, - { 7, 3, 4 }, - { 7, 3, 0 }, - { 7, 0, 3 }, - { 7, 5, 1 }, - { 7, 5, 2 }, - { 7, 2, 5 }, - { 7, 4, 4 }, - { 7, 1, 5 }, - { 7, 5, 3 }, - - /* 7/8 */ - { 7, 3, 5 }, { 7, 3, 5 }, - { 7, 5, 4 }, { 7, 5, 4 }, - { 8, 4, 5 }, - { 8, 6, 2 }, - { 8, 2, 6 }, - { 8, 6, 1 }, - - /* 8 */ - { 8, 6, 3 }, - { 8, 3, 6 }, - { 8, 1, 6 }, - { 8, 4, 16 }, - { 8, 3, 16 }, - { 8, 16, 5 }, - { 8, 16, 3 }, - { 8, 16, 4 }, - { 8, 6, 4 }, - { 8, 16, 6 }, - { 8, 4, 0 }, - { 8, 4, 6 }, - { 8, 0, 4 }, - { 8, 2, 16 }, - { 8, 5, 5 }, - { 8, 5, 16 }, - { 8, 16, 7 }, - { 8, 16, 2 }, - { 8, 16, 8 }, - { 8, 2, 7 }, - { 8, 7, 2 }, - { 8, 3, 7 }, - { 8, 6, 5 }, - { 8, 5, 6 }, - { 8, 6, 16 }, - { 8, 16, 10 }, - { 8, 7, 3 }, - { 8, 7, 1 }, - { 8, 16, 9 }, - { 8, 7, 16 }, - { 8, 1, 16 }, - { 8, 1, 7 }, - { 8, 4, 7 }, - { 8, 16, 11 }, - { 8, 7, 4 }, - { 8, 16, 12 }, - { 8, 8, 16 }, - { 8, 16, 1 }, - { 8, 6, 6 }, - { 8, 9, 16 }, - { 8, 2, 8 }, - { 8, 5, 7 }, - { 8, 10, 16 }, - { 8, 16, 13 }, - { 8, 8, 3 }, - { 8, 8, 2 }, - { 8, 3, 8 }, - { 8, 5, 0 }, - - /* 8/9 */ - { 8, 16, 14 }, { 8, 16, 14 }, - { 8, 11, 16 }, { 8, 11, 16 }, - { 8, 7, 5 }, { 8, 7, 5 }, - { 8, 4, 8 }, { 8, 4, 8 }, - { 8, 6, 7 }, { 8, 6, 7 }, - { 8, 7, 6 }, { 8, 7, 6 }, - { 8, 0, 5 }, { 8, 0, 5 }, - { 9, 8, 4 }, - { 9, 16, 15 }, - - /* 9 */ - { 9, 12, 16 }, - { 9, 1, 8 }, - { 9, 8, 1 }, - { 9, 14, 16 }, - { 9, 5, 8 }, - { 9, 13, 16 }, - { 9, 3, 9 }, - { 9, 8, 5 }, - { 9, 7, 7 }, - { 9, 2, 9 }, - { 9, 8, 6 }, - { 9, 9, 2 }, - { 9, 9, 3 }, - { 9, 15, 16 }, - { 9, 4, 9 }, - { 9, 6, 8 }, - { 9, 6, 0 }, - { 9, 9, 4 }, - { 9, 5, 9 }, - { 9, 8, 7 }, - { 9, 7, 8 }, - { 9, 1, 9 }, - { 9, 10, 3 }, - { 9, 0, 6 }, - { 9, 10, 2 }, - { 9, 9, 1 }, - { 9, 9, 5 }, - { 9, 4, 10 }, - { 9, 2, 10 }, - { 9, 9, 6 }, - { 9, 3, 10 }, - { 9, 6, 9 }, - { 9, 10, 4 }, - { 9, 8, 8 }, - { 9, 10, 5 }, - { 9, 9, 7 }, - { 9, 11, 3 }, - { 9, 1, 10 }, - { 9, 7, 0 }, - { 9, 10, 6 }, - { 9, 7, 9 }, - { 9, 3, 11 }, - { 9, 5, 10 }, - { 9, 10, 1 }, - { 9, 4, 11 }, - { 9, 11, 2 }, - { 9, 13, 2 }, - { 9, 6, 10 }, - - /* 9/10 */ - { 9, 13, 3 }, { 9, 13, 3 }, - { 9, 2, 11 }, { 9, 2, 11 }, - { 9, 16, 0 }, { 9, 16, 0 }, - { 9, 5, 11 }, { 9, 5, 11 }, - { 9, 11, 5 }, { 9, 11, 5 }, - { 10, 11, 4 }, - { 10, 9, 8 }, - { 10, 7, 10 }, - { 10, 8, 9 }, - { 10, 0, 16 }, - { 10, 4, 13 }, - { 10, 0, 7 }, - { 10, 3, 13 }, - { 10, 11, 6 }, - { 10, 13, 1 }, - { 10, 13, 4 }, - { 10, 12, 3 }, - { 10, 2, 13 }, - { 10, 13, 5 }, - { 10, 8, 10 }, - { 10, 6, 11 }, - { 10, 10, 8 }, - { 10, 10, 7 }, - { 10, 14, 2 }, - { 10, 12, 4 }, - { 10, 1, 11 }, - { 10, 4, 12 }, - - /* 10 */ - { 10, 11, 1 }, - { 10, 3, 12 }, - { 10, 1, 13 }, - { 10, 12, 2 }, - { 10, 7, 11 }, - { 10, 3, 14 }, - { 10, 5, 12 }, - { 10, 5, 13 }, - { 10, 14, 4 }, - { 10, 4, 14 }, - { 10, 11, 7 }, - { 10, 14, 3 }, - { 10, 12, 5 }, - { 10, 13, 6 }, - { 10, 12, 6 }, - { 10, 8, 0 }, - { 10, 11, 8 }, - { 10, 2, 12 }, - { 10, 9, 9 }, - { 10, 14, 5 }, - { 10, 6, 13 }, - { 10, 10, 10 }, - { 10, 15, 2 }, - { 10, 8, 11 }, - { 10, 9, 10 }, - { 10, 14, 6 }, - { 10, 10, 9 }, - { 10, 5, 14 }, - { 10, 11, 9 }, - { 10, 14, 1 }, - { 10, 2, 14 }, - { 10, 6, 12 }, - { 10, 1, 12 }, - { 10, 13, 8 }, - { 10, 0, 8 }, - { 10, 13, 7 }, - { 10, 7, 12 }, - { 10, 12, 7 }, - { 10, 7, 13 }, - { 10, 15, 3 }, - { 10, 12, 1 }, - { 10, 6, 14 }, - { 10, 2, 15 }, - { 10, 15, 5 }, - { 10, 15, 4 }, - { 10, 1, 14 }, - { 10, 9, 11 }, - { 10, 4, 15 }, - { 10, 14, 7 }, - { 10, 8, 13 }, - { 10, 13, 9 }, - { 10, 8, 12 }, - { 10, 5, 15 }, - { 10, 3, 15 }, - { 10, 10, 11 }, - { 10, 11, 10 }, - { 10, 12, 8 }, - { 10, 15, 6 }, - { 10, 15, 7 }, - { 10, 8, 14 }, - { 10, 15, 1 }, - { 10, 7, 14 }, - { 10, 9, 0 }, - { 10, 0, 9 }, - - /* 10/11/12 */ - { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, - { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, - { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, - { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, - { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, - { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, - { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, - { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, - { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, - - { 11, 9, 14 }, { 11, 9, 14 }, - { 11, 15, 8 }, { 11, 15, 8 }, - { 11, 11, 11 }, { 11, 11, 11 }, - { 11, 11, 14 }, { 11, 11, 14 }, - { 11, 1, 15 }, { 11, 1, 15 }, - { 11, 10, 12 }, { 11, 10, 12 }, - { 11, 10, 14 }, { 11, 10, 14 }, - { 11, 13, 11 }, { 11, 13, 11 }, - { 11, 13, 10 }, { 11, 13, 10 }, - { 11, 11, 13 }, { 11, 11, 13 }, - { 11, 11, 12 }, { 11, 11, 12 }, - { 11, 8, 15 }, { 11, 8, 15 }, - { 11, 14, 11 }, { 11, 14, 11 }, - { 11, 13, 12 }, { 11, 13, 12 }, - { 11, 12, 13 }, { 11, 12, 13 }, - { 11, 15, 9 }, { 11, 15, 9 }, - { 11, 14, 10 }, { 11, 14, 10 }, - { 11, 10, 0 }, { 11, 10, 0 }, - { 11, 12, 11 }, { 11, 12, 11 }, - { 11, 9, 15 }, { 11, 9, 15 }, - { 11, 0, 10 }, { 11, 0, 10 }, - { 11, 12, 12 }, { 11, 12, 12 }, - { 11, 11, 0 }, { 11, 11, 0 }, - { 11, 12, 14 }, { 11, 12, 14 }, - { 11, 10, 15 }, { 11, 10, 15 }, - { 11, 13, 13 }, { 11, 13, 13 }, - { 11, 0, 13 }, { 11, 0, 13 }, - { 11, 14, 12 }, { 11, 14, 12 }, - { 11, 15, 10 }, { 11, 15, 10 }, - { 11, 15, 11 }, { 11, 15, 11 }, - { 11, 11, 15 }, { 11, 11, 15 }, - { 11, 14, 13 }, { 11, 14, 13 }, - { 11, 13, 0 }, { 11, 13, 0 }, - { 11, 0, 11 }, { 11, 0, 11 }, - { 11, 13, 14 }, { 11, 13, 14 }, - { 11, 15, 12 }, { 11, 15, 12 }, - { 11, 15, 13 }, { 11, 15, 13 }, - { 11, 12, 15 }, { 11, 12, 15 }, - { 11, 14, 0 }, { 11, 14, 0 }, - { 11, 14, 14 }, { 11, 14, 14 }, - { 11, 13, 15 }, { 11, 13, 15 }, - { 11, 12, 0 }, { 11, 12, 0 }, - { 11, 14, 15 }, { 11, 14, 15 }, - { 12, 0, 14 }, - { 12, 0, 12 }, - { 12, 15, 14 }, - { 12, 15, 0 }, - { 12, 0, 15 }, - { 12, 15, 15 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_11.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_11 */ + + +/* 1st step: 5 bits + * 2^5 = 32 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb11_1[] = { + /* 4 bits */ + { /* 00000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* 00010 */ 1, 0 }, + { /* */ 1, 0 }, + + /* 5 bits */ + { /* 00100 */ 2, 0 }, + { /* 00101 */ 3, 0 }, + { /* 00110 */ 4, 0 }, + { /* 00111 */ 5, 0 }, + { /* 01000 */ 6, 0 }, + { /* 01001 */ 7, 0 }, + + /* 6 bits */ + { /* 01010 */ 8, 1 }, + { /* 01011 */ 10, 1 }, + { /* 01100 */ 12, 1 }, + + /* 6/7 bits */ + { /* 01101 */ 14, 2 }, + + /* 7 bits */ + { /* 01110 */ 18, 2 }, + { /* 01111 */ 22, 2 }, + { /* 10000 */ 26, 2 }, + + /* 7/8 bits */ + { /* 10001 */ 30, 3 }, + + /* 8 bits */ + { /* 10010 */ 38, 3 }, + { /* 10011 */ 46, 3 }, + { /* 10100 */ 54, 3 }, + { /* 10101 */ 62, 3 }, + { /* 10110 */ 70, 3 }, + { /* 10111 */ 78, 3 }, + + /* 8/9 bits */ + { /* 11000 */ 86, 4 }, + + /* 9 bits */ + { /* 11001 */ 102, 4 }, + { /* 11010 */ 118, 4 }, + { /* 11011 */ 134, 4 }, + + /* 9/10 bits */ + { /* 11100 */ 150, 5 }, + + /* 10 bits */ + { /* 11101 */ 182, 5 }, + { /* 11110 */ 214, 5 }, + + /* 10/11/12 bits */ + { /* 11111 */ 246, 7 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_pair hcb11_2[] = { + /* 4 */ + { 4, 0, 0 }, + { 4, 1, 1 }, + + /* 5 */ + { 5, 16, 16 }, + { 5, 1, 0 }, + { 5, 0, 1 }, + { 5, 2, 1 }, + { 5, 1, 2 }, + { 5, 2, 2 }, + + /* 6 */ + { 6, 1, 3 }, + { 6, 3, 1 }, + { 6, 3, 2 }, + { 6, 2, 0 }, + { 6, 2, 3 }, + { 6, 0, 2 }, + + /* 6/7 */ + { 6, 3, 3 }, { 6, 3, 3 }, + { 7, 4, 1 }, + { 7, 1, 4 }, + + /* 7 */ + { 7, 4, 2 }, + { 7, 2, 4 }, + { 7, 4, 3 }, + { 7, 3, 4 }, + { 7, 3, 0 }, + { 7, 0, 3 }, + { 7, 5, 1 }, + { 7, 5, 2 }, + { 7, 2, 5 }, + { 7, 4, 4 }, + { 7, 1, 5 }, + { 7, 5, 3 }, + + /* 7/8 */ + { 7, 3, 5 }, { 7, 3, 5 }, + { 7, 5, 4 }, { 7, 5, 4 }, + { 8, 4, 5 }, + { 8, 6, 2 }, + { 8, 2, 6 }, + { 8, 6, 1 }, + + /* 8 */ + { 8, 6, 3 }, + { 8, 3, 6 }, + { 8, 1, 6 }, + { 8, 4, 16 }, + { 8, 3, 16 }, + { 8, 16, 5 }, + { 8, 16, 3 }, + { 8, 16, 4 }, + { 8, 6, 4 }, + { 8, 16, 6 }, + { 8, 4, 0 }, + { 8, 4, 6 }, + { 8, 0, 4 }, + { 8, 2, 16 }, + { 8, 5, 5 }, + { 8, 5, 16 }, + { 8, 16, 7 }, + { 8, 16, 2 }, + { 8, 16, 8 }, + { 8, 2, 7 }, + { 8, 7, 2 }, + { 8, 3, 7 }, + { 8, 6, 5 }, + { 8, 5, 6 }, + { 8, 6, 16 }, + { 8, 16, 10 }, + { 8, 7, 3 }, + { 8, 7, 1 }, + { 8, 16, 9 }, + { 8, 7, 16 }, + { 8, 1, 16 }, + { 8, 1, 7 }, + { 8, 4, 7 }, + { 8, 16, 11 }, + { 8, 7, 4 }, + { 8, 16, 12 }, + { 8, 8, 16 }, + { 8, 16, 1 }, + { 8, 6, 6 }, + { 8, 9, 16 }, + { 8, 2, 8 }, + { 8, 5, 7 }, + { 8, 10, 16 }, + { 8, 16, 13 }, + { 8, 8, 3 }, + { 8, 8, 2 }, + { 8, 3, 8 }, + { 8, 5, 0 }, + + /* 8/9 */ + { 8, 16, 14 }, { 8, 16, 14 }, + { 8, 11, 16 }, { 8, 11, 16 }, + { 8, 7, 5 }, { 8, 7, 5 }, + { 8, 4, 8 }, { 8, 4, 8 }, + { 8, 6, 7 }, { 8, 6, 7 }, + { 8, 7, 6 }, { 8, 7, 6 }, + { 8, 0, 5 }, { 8, 0, 5 }, + { 9, 8, 4 }, + { 9, 16, 15 }, + + /* 9 */ + { 9, 12, 16 }, + { 9, 1, 8 }, + { 9, 8, 1 }, + { 9, 14, 16 }, + { 9, 5, 8 }, + { 9, 13, 16 }, + { 9, 3, 9 }, + { 9, 8, 5 }, + { 9, 7, 7 }, + { 9, 2, 9 }, + { 9, 8, 6 }, + { 9, 9, 2 }, + { 9, 9, 3 }, + { 9, 15, 16 }, + { 9, 4, 9 }, + { 9, 6, 8 }, + { 9, 6, 0 }, + { 9, 9, 4 }, + { 9, 5, 9 }, + { 9, 8, 7 }, + { 9, 7, 8 }, + { 9, 1, 9 }, + { 9, 10, 3 }, + { 9, 0, 6 }, + { 9, 10, 2 }, + { 9, 9, 1 }, + { 9, 9, 5 }, + { 9, 4, 10 }, + { 9, 2, 10 }, + { 9, 9, 6 }, + { 9, 3, 10 }, + { 9, 6, 9 }, + { 9, 10, 4 }, + { 9, 8, 8 }, + { 9, 10, 5 }, + { 9, 9, 7 }, + { 9, 11, 3 }, + { 9, 1, 10 }, + { 9, 7, 0 }, + { 9, 10, 6 }, + { 9, 7, 9 }, + { 9, 3, 11 }, + { 9, 5, 10 }, + { 9, 10, 1 }, + { 9, 4, 11 }, + { 9, 11, 2 }, + { 9, 13, 2 }, + { 9, 6, 10 }, + + /* 9/10 */ + { 9, 13, 3 }, { 9, 13, 3 }, + { 9, 2, 11 }, { 9, 2, 11 }, + { 9, 16, 0 }, { 9, 16, 0 }, + { 9, 5, 11 }, { 9, 5, 11 }, + { 9, 11, 5 }, { 9, 11, 5 }, + { 10, 11, 4 }, + { 10, 9, 8 }, + { 10, 7, 10 }, + { 10, 8, 9 }, + { 10, 0, 16 }, + { 10, 4, 13 }, + { 10, 0, 7 }, + { 10, 3, 13 }, + { 10, 11, 6 }, + { 10, 13, 1 }, + { 10, 13, 4 }, + { 10, 12, 3 }, + { 10, 2, 13 }, + { 10, 13, 5 }, + { 10, 8, 10 }, + { 10, 6, 11 }, + { 10, 10, 8 }, + { 10, 10, 7 }, + { 10, 14, 2 }, + { 10, 12, 4 }, + { 10, 1, 11 }, + { 10, 4, 12 }, + + /* 10 */ + { 10, 11, 1 }, + { 10, 3, 12 }, + { 10, 1, 13 }, + { 10, 12, 2 }, + { 10, 7, 11 }, + { 10, 3, 14 }, + { 10, 5, 12 }, + { 10, 5, 13 }, + { 10, 14, 4 }, + { 10, 4, 14 }, + { 10, 11, 7 }, + { 10, 14, 3 }, + { 10, 12, 5 }, + { 10, 13, 6 }, + { 10, 12, 6 }, + { 10, 8, 0 }, + { 10, 11, 8 }, + { 10, 2, 12 }, + { 10, 9, 9 }, + { 10, 14, 5 }, + { 10, 6, 13 }, + { 10, 10, 10 }, + { 10, 15, 2 }, + { 10, 8, 11 }, + { 10, 9, 10 }, + { 10, 14, 6 }, + { 10, 10, 9 }, + { 10, 5, 14 }, + { 10, 11, 9 }, + { 10, 14, 1 }, + { 10, 2, 14 }, + { 10, 6, 12 }, + { 10, 1, 12 }, + { 10, 13, 8 }, + { 10, 0, 8 }, + { 10, 13, 7 }, + { 10, 7, 12 }, + { 10, 12, 7 }, + { 10, 7, 13 }, + { 10, 15, 3 }, + { 10, 12, 1 }, + { 10, 6, 14 }, + { 10, 2, 15 }, + { 10, 15, 5 }, + { 10, 15, 4 }, + { 10, 1, 14 }, + { 10, 9, 11 }, + { 10, 4, 15 }, + { 10, 14, 7 }, + { 10, 8, 13 }, + { 10, 13, 9 }, + { 10, 8, 12 }, + { 10, 5, 15 }, + { 10, 3, 15 }, + { 10, 10, 11 }, + { 10, 11, 10 }, + { 10, 12, 8 }, + { 10, 15, 6 }, + { 10, 15, 7 }, + { 10, 8, 14 }, + { 10, 15, 1 }, + { 10, 7, 14 }, + { 10, 9, 0 }, + { 10, 0, 9 }, + + /* 10/11/12 */ + { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, + { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, + { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, + { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, + { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, + { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, + { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, + { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, + { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, + + { 11, 9, 14 }, { 11, 9, 14 }, + { 11, 15, 8 }, { 11, 15, 8 }, + { 11, 11, 11 }, { 11, 11, 11 }, + { 11, 11, 14 }, { 11, 11, 14 }, + { 11, 1, 15 }, { 11, 1, 15 }, + { 11, 10, 12 }, { 11, 10, 12 }, + { 11, 10, 14 }, { 11, 10, 14 }, + { 11, 13, 11 }, { 11, 13, 11 }, + { 11, 13, 10 }, { 11, 13, 10 }, + { 11, 11, 13 }, { 11, 11, 13 }, + { 11, 11, 12 }, { 11, 11, 12 }, + { 11, 8, 15 }, { 11, 8, 15 }, + { 11, 14, 11 }, { 11, 14, 11 }, + { 11, 13, 12 }, { 11, 13, 12 }, + { 11, 12, 13 }, { 11, 12, 13 }, + { 11, 15, 9 }, { 11, 15, 9 }, + { 11, 14, 10 }, { 11, 14, 10 }, + { 11, 10, 0 }, { 11, 10, 0 }, + { 11, 12, 11 }, { 11, 12, 11 }, + { 11, 9, 15 }, { 11, 9, 15 }, + { 11, 0, 10 }, { 11, 0, 10 }, + { 11, 12, 12 }, { 11, 12, 12 }, + { 11, 11, 0 }, { 11, 11, 0 }, + { 11, 12, 14 }, { 11, 12, 14 }, + { 11, 10, 15 }, { 11, 10, 15 }, + { 11, 13, 13 }, { 11, 13, 13 }, + { 11, 0, 13 }, { 11, 0, 13 }, + { 11, 14, 12 }, { 11, 14, 12 }, + { 11, 15, 10 }, { 11, 15, 10 }, + { 11, 15, 11 }, { 11, 15, 11 }, + { 11, 11, 15 }, { 11, 11, 15 }, + { 11, 14, 13 }, { 11, 14, 13 }, + { 11, 13, 0 }, { 11, 13, 0 }, + { 11, 0, 11 }, { 11, 0, 11 }, + { 11, 13, 14 }, { 11, 13, 14 }, + { 11, 15, 12 }, { 11, 15, 12 }, + { 11, 15, 13 }, { 11, 15, 13 }, + { 11, 12, 15 }, { 11, 12, 15 }, + { 11, 14, 0 }, { 11, 14, 0 }, + { 11, 14, 14 }, { 11, 14, 14 }, + { 11, 13, 15 }, { 11, 13, 15 }, + { 11, 12, 0 }, { 11, 12, 0 }, + { 11, 14, 15 }, { 11, 14, 15 }, + { 12, 0, 14 }, + { 12, 0, 12 }, + { 12, 15, 14 }, + { 12, 15, 0 }, + { 12, 0, 15 }, + { 12, 15, 15 } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_2.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_2.h old mode 100644 new mode 100755 index 032de14c9..8edfe525d --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_2.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_2.h @@ -1,182 +1,185 @@ -/* -** 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: hcb_2.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_2 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb2_1[] = { - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00100 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00110 */ 2, 0 }, - { /* 00111 */ 3, 0 }, - { /* 01000 */ 4, 0 }, - { /* 01001 */ 5, 0 }, - { /* 01010 */ 6, 0 }, - { /* 01011 */ 7, 0 }, - { /* 01100 */ 8, 0 }, - - /* 6 bit codewords */ - { /* 01101 */ 9, 1 }, - { /* 01110 */ 11, 1 }, - { /* 01111 */ 13, 1 }, - { /* 10000 */ 15, 1 }, - { /* 10001 */ 17, 1 }, - { /* 10010 */ 19, 1 }, - { /* 10011 */ 21, 1 }, - { /* 10100 */ 23, 1 }, - { /* 10101 */ 25, 1 }, - { /* 10110 */ 27, 1 }, - { /* 10111 */ 29, 1 }, - { /* 11000 */ 31, 1 }, - - /* 7 bit codewords */ - { /* 11001 */ 33, 2 }, - { /* 11010 */ 37, 2 }, - { /* 11011 */ 41, 2 }, - - /* 7/8 bit codewords */ - { /* 11100 */ 45, 3 }, - - /* 8 bit codewords */ - { /* 11101 */ 53, 3 }, - { /* 11110 */ 61, 3 }, - - /* 8/9 bit codewords */ - { /* 11111 */ 69, 4 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_quad hcb2_2[] = { - /* 3 bit codeword */ - { 3, 0, 0, 0, 0 }, - - /* 4 bit codeword */ - { 4, 1, 0, 0, 0 }, - - /* 5 bit codewords */ - { 5, -1, 0, 0, 0 }, - { 5, 0, 0, 0, 1 }, - { 5, 0, 0, -1, 0 }, - { 5, 0, 0, 0, -1 }, - { 5, 0, -1, 0, 0 }, - { 5, 0, 0, 1, 0 }, - { 5, 0, 1, 0, 0 }, - - /* 6 bit codewords */ - { 6, 0, -1, 1, 0 }, - { 6, -1, 1, 0, 0 }, - { 6, 0, 1, -1, 0 }, - { 6, 0, 0, 1, -1 }, - { 6, 0, 1, 0, -1 }, - { 6, 0, 0, -1, 1 }, - { 6, -1, 0, 0, -1 }, - { 6, 1, -1, 0, 0 }, - { 6, 1, 0, -1, 0 }, - { 6, -1, -1, 0, 0 }, - { 6, 0, 0, -1, -1 }, - { 6, 1, 0, 1, 0 }, - { 6, 1, 0, 0, 1 }, - { 6, 0, -1, 0, 1 }, - { 6, -1, 0, 1, 0 }, - { 6, 0, 1, 0, 1 }, - { 6, 0, -1, -1, 0 }, - { 6, -1, 0, 0, 1 }, - { 6, 0, -1, 0, -1 }, - { 6, -1, 0, -1, 0 }, - { 6, 1, 1, 0, 0 }, - { 6, 0, 1, 1, 0 }, - { 6, 0, 0, 1, 1 }, - { 6, 1, 0, 0, -1 }, - - /* 7 bit codewords */ - { 7, 0, 1, -1, 1 }, - { 7, 1, 0, -1, 1 }, - { 7, -1, 1, -1, 0 }, - { 7, 0, -1, 1, -1 }, - { 7, 1, -1, 1, 0 }, - { 7, 1, 1, 0, -1 }, - { 7, 1, 0, 1, 1 }, - { 7, -1, 1, 1, 0 }, - { 7, 0, -1, -1, 1 }, - { 7, 1, 1, 1, 0 }, - { 7, -1, 0, 1, -1 }, - { 7, -1, -1, -1, 0 }, - - /* 7/8 bit codewords */ - { 7, -1, 0, -1, 1 }, { 7, -1, 0, -1, 1 }, - { 7, 1, -1, -1, 0 }, { 7, 1, -1, -1, 0 }, - { 7, 1, 1, -1, 0 }, { 7, 1, 1, -1, 0 }, - { 8, 1, -1, 0, 1 }, - { 8, -1, 1, 0, -1 }, - - /* 8 bit codewords */ - { 8, -1, -1, 1, 0 }, - { 8, -1, 0, 1, 1 }, - { 8, -1, -1, 0, 1 }, - { 8, -1, -1, 0, -1 }, - { 8, 0, -1, -1, -1 }, - { 8, 1, 0, 1, -1 }, - { 8, 1, 0, -1, -1 }, - { 8, 0, 1, -1, -1 }, - { 8, 0, 1, 1, 1 }, - { 8, -1, 1, 0, 1 }, - { 8, -1, 0, -1, -1 }, - { 8, 0, 1, 1, -1 }, - { 8, 1, -1, 0, -1 }, - { 8, 0, -1, 1, 1 }, - { 8, 1, 1, 0, 1 }, - { 8, 1, -1, 1, -1 }, - - /* 8/9 bit codewords */ - { 8, -1, 1, -1, 1 }, { 8, -1, 1, -1, 1 }, - { 9, 1, -1, -1, 1 }, - { 9, -1, -1, -1, -1 }, - { 9, -1, 1, 1, -1 }, - { 9, -1, 1, 1, 1 }, - { 9, 1, 1, 1, 1 }, - { 9, -1, -1, 1, -1 }, - { 9, 1, -1, 1, 1 }, - { 9, -1, 1, -1, -1 }, - { 9, -1, -1, 1, 1 }, - { 9, 1, 1, -1, -1 }, - { 9, 1, -1, -1, -1 }, - { 9, -1, -1, -1, 1 }, - { 9, 1, 1, -1, 1 }, - { 9, 1, 1, 1, -1 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_2.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_2 */ + + +/* 1st step: 5 bits + * 2^5 = 32 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb2_1[] = { + { /* 00000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* 00100 */ 1, 0 }, + { /* */ 1, 0 }, + { /* 00110 */ 2, 0 }, + { /* 00111 */ 3, 0 }, + { /* 01000 */ 4, 0 }, + { /* 01001 */ 5, 0 }, + { /* 01010 */ 6, 0 }, + { /* 01011 */ 7, 0 }, + { /* 01100 */ 8, 0 }, + + /* 6 bit codewords */ + { /* 01101 */ 9, 1 }, + { /* 01110 */ 11, 1 }, + { /* 01111 */ 13, 1 }, + { /* 10000 */ 15, 1 }, + { /* 10001 */ 17, 1 }, + { /* 10010 */ 19, 1 }, + { /* 10011 */ 21, 1 }, + { /* 10100 */ 23, 1 }, + { /* 10101 */ 25, 1 }, + { /* 10110 */ 27, 1 }, + { /* 10111 */ 29, 1 }, + { /* 11000 */ 31, 1 }, + + /* 7 bit codewords */ + { /* 11001 */ 33, 2 }, + { /* 11010 */ 37, 2 }, + { /* 11011 */ 41, 2 }, + + /* 7/8 bit codewords */ + { /* 11100 */ 45, 3 }, + + /* 8 bit codewords */ + { /* 11101 */ 53, 3 }, + { /* 11110 */ 61, 3 }, + + /* 8/9 bit codewords */ + { /* 11111 */ 69, 4 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_quad hcb2_2[] = { + /* 3 bit codeword */ + { 3, 0, 0, 0, 0 }, + + /* 4 bit codeword */ + { 4, 1, 0, 0, 0 }, + + /* 5 bit codewords */ + { 5, -1, 0, 0, 0 }, + { 5, 0, 0, 0, 1 }, + { 5, 0, 0, -1, 0 }, + { 5, 0, 0, 0, -1 }, + { 5, 0, -1, 0, 0 }, + { 5, 0, 0, 1, 0 }, + { 5, 0, 1, 0, 0 }, + + /* 6 bit codewords */ + { 6, 0, -1, 1, 0 }, + { 6, -1, 1, 0, 0 }, + { 6, 0, 1, -1, 0 }, + { 6, 0, 0, 1, -1 }, + { 6, 0, 1, 0, -1 }, + { 6, 0, 0, -1, 1 }, + { 6, -1, 0, 0, -1 }, + { 6, 1, -1, 0, 0 }, + { 6, 1, 0, -1, 0 }, + { 6, -1, -1, 0, 0 }, + { 6, 0, 0, -1, -1 }, + { 6, 1, 0, 1, 0 }, + { 6, 1, 0, 0, 1 }, + { 6, 0, -1, 0, 1 }, + { 6, -1, 0, 1, 0 }, + { 6, 0, 1, 0, 1 }, + { 6, 0, -1, -1, 0 }, + { 6, -1, 0, 0, 1 }, + { 6, 0, -1, 0, -1 }, + { 6, -1, 0, -1, 0 }, + { 6, 1, 1, 0, 0 }, + { 6, 0, 1, 1, 0 }, + { 6, 0, 0, 1, 1 }, + { 6, 1, 0, 0, -1 }, + + /* 7 bit codewords */ + { 7, 0, 1, -1, 1 }, + { 7, 1, 0, -1, 1 }, + { 7, -1, 1, -1, 0 }, + { 7, 0, -1, 1, -1 }, + { 7, 1, -1, 1, 0 }, + { 7, 1, 1, 0, -1 }, + { 7, 1, 0, 1, 1 }, + { 7, -1, 1, 1, 0 }, + { 7, 0, -1, -1, 1 }, + { 7, 1, 1, 1, 0 }, + { 7, -1, 0, 1, -1 }, + { 7, -1, -1, -1, 0 }, + + /* 7/8 bit codewords */ + { 7, -1, 0, -1, 1 }, { 7, -1, 0, -1, 1 }, + { 7, 1, -1, -1, 0 }, { 7, 1, -1, -1, 0 }, + { 7, 1, 1, -1, 0 }, { 7, 1, 1, -1, 0 }, + { 8, 1, -1, 0, 1 }, + { 8, -1, 1, 0, -1 }, + + /* 8 bit codewords */ + { 8, -1, -1, 1, 0 }, + { 8, -1, 0, 1, 1 }, + { 8, -1, -1, 0, 1 }, + { 8, -1, -1, 0, -1 }, + { 8, 0, -1, -1, -1 }, + { 8, 1, 0, 1, -1 }, + { 8, 1, 0, -1, -1 }, + { 8, 0, 1, -1, -1 }, + { 8, 0, 1, 1, 1 }, + { 8, -1, 1, 0, 1 }, + { 8, -1, 0, -1, -1 }, + { 8, 0, 1, 1, -1 }, + { 8, 1, -1, 0, -1 }, + { 8, 0, -1, 1, 1 }, + { 8, 1, 1, 0, 1 }, + { 8, 1, -1, 1, -1 }, + + /* 8/9 bit codewords */ + { 8, -1, 1, -1, 1 }, { 8, -1, 1, -1, 1 }, + { 9, 1, -1, -1, 1 }, + { 9, -1, -1, -1, -1 }, + { 9, -1, 1, 1, -1 }, + { 9, -1, 1, 1, 1 }, + { 9, 1, 1, 1, 1 }, + { 9, -1, -1, 1, -1 }, + { 9, 1, -1, 1, 1 }, + { 9, -1, 1, -1, -1 }, + { 9, -1, -1, 1, 1 }, + { 9, 1, 1, -1, -1 }, + { 9, 1, -1, -1, -1 }, + { 9, -1, -1, -1, 1 }, + { 9, 1, 1, -1, 1 }, + { 9, 1, 1, 1, -1 } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_3.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_3.h old mode 100644 new mode 100755 index a4098237b..e9481e198 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_3.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_3.h @@ -1,193 +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: hcb_3.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* Binary search huffman table HCB_3 */ - - -static hcb_bin_quad hcb3[] = { - { /* 0 */ 0, { 1, 2, 0, 0 } }, - { /* 1 */ 1, { 0, 0, 0, 0 } }, /* 0 */ - { /* 2 */ 0, { 1, 2, 0, 0 } }, - { /* 3 */ 0, { 2, 3, 0, 0 } }, - { /* 4 */ 0, { 3, 4, 0, 0 } }, - { /* 5 */ 0, { 4, 5, 0, 0 } }, - { /* 6 */ 0, { 5, 6, 0, 0 } }, - { /* 7 */ 0, { 6, 7, 0, 0 } }, - { /* 8 */ 0, { 7, 8, 0, 0 } }, - { /* 9 */ 1, { 1, 0, 0, 0 } }, /* 1000 */ - { /* 10 */ 1, { 0, 0, 0, 1 } }, /* 1001 */ - { /* 11 */ 1, { 0, 1, 0, 0 } }, /* 1010 */ - { /* 12 */ 1, { 0, 0, 1, 0 } }, /* 1011 */ - { /* 13 */ 0, { 4, 5, 0, 0 } }, - { /* 14 */ 0, { 5, 6, 0, 0 } }, - { /* 15 */ 0, { 6, 7, 0, 0 } }, - { /* 16 */ 0, { 7, 8, 0, 0 } }, - { /* 17 */ 1, { 1, 1, 0, 0 } }, - { /* 18 */ 1, { 0, 0, 1, 1 } }, - { /* 19 */ 0, { 6, 7, 0, 0 } }, - { /* 20 */ 0, { 7, 8, 0, 0 } }, - { /* 21 */ 0, { 8, 9, 0, 0 } }, - { /* 22 */ 0, { 9, 10, 0, 0 } }, - { /* 23 */ 0, { 10, 11, 0, 0 } }, - { /* 24 */ 0, { 11, 12, 0, 0 } }, - { /* 25 */ 1, { 0, 1, 1, 0 } }, /* 110100 */ - { /* 26 */ 1, { 0, 1, 0, 1 } }, /* 110101 */ - { /* 27 */ 1, { 1, 0, 1, 0 } }, /* 110110 */ - { /* 28 */ 1, { 0, 1, 1, 1 } }, /* 110111 */ - { /* 29 */ 1, { 1, 0, 0, 1 } }, /* 111000 */ - { /* 30 */ 1, { 1, 1, 1, 0 } }, /* 111001 */ - { /* 31 */ 0, { 6, 7, 0, 0 } }, - { /* 32 */ 0, { 7, 8, 0, 0 } }, - { /* 33 */ 0, { 8, 9, 0, 0 } }, - { /* 34 */ 0, { 9, 10, 0, 0 } }, - { /* 35 */ 0, { 10, 11, 0, 0 } }, - { /* 36 */ 0, { 11, 12, 0, 0 } }, - { /* 37 */ 1, { 1, 1, 1, 1 } }, /* 1110100 */ - { /* 38 */ 1, { 1, 0, 1, 1 } }, /* 1110101 */ - { /* 39 */ 1, { 1, 1, 0, 1 } }, /* 1110110 */ - { /* 40 */ 0, { 9, 10, 0, 0 } }, - { /* 41 */ 0, { 10, 11, 0, 0 } }, - { /* 42 */ 0, { 11, 12, 0, 0 } }, - { /* 43 */ 0, { 12, 13, 0, 0 } }, - { /* 44 */ 0, { 13, 14, 0, 0 } }, - { /* 45 */ 0, { 14, 15, 0, 0 } }, - { /* 46 */ 0, { 15, 16, 0, 0 } }, - { /* 47 */ 0, { 16, 17, 0, 0 } }, - { /* 48 */ 0, { 17, 18, 0, 0 } }, - { /* 49 */ 1, { 2, 0, 0, 0 } }, /* 11101110 */ - { /* 50 */ 1, { 0, 0, 0, 2 } }, /* 11101111 */ - { /* 51 */ 1, { 0, 0, 1, 2 } }, /* 11110000 */ - { /* 52 */ 1, { 2, 1, 0, 0 } }, /* 11110001 */ - { /* 53 */ 1, { 1, 2, 1, 0 } }, /* 11110010 */ - { /* 54 */ 0, { 13, 14, 0, 0 } }, - { /* 55 */ 0, { 14, 15, 0, 0 } }, - { /* 56 */ 0, { 15, 16, 0, 0 } }, - { /* 57 */ 0, { 16, 17, 0, 0 } }, - { /* 58 */ 0, { 17, 18, 0, 0 } }, - { /* 59 */ 0, { 18, 19, 0, 0 } }, - { /* 60 */ 0, { 19, 20, 0, 0 } }, - { /* 61 */ 0, { 20, 21, 0, 0 } }, - { /* 62 */ 0, { 21, 22, 0, 0 } }, - { /* 63 */ 0, { 22, 23, 0, 0 } }, - { /* 64 */ 0, { 23, 24, 0, 0 } }, - { /* 65 */ 0, { 24, 25, 0, 0 } }, - { /* 66 */ 0, { 25, 26, 0, 0 } }, - { /* 67 */ 1, { 0, 0, 2, 1 } }, - { /* 68 */ 1, { 0, 1, 2, 1 } }, - { /* 69 */ 1, { 1, 2, 0, 0 } }, - { /* 70 */ 1, { 0, 1, 1, 2 } }, - { /* 71 */ 1, { 2, 1, 1, 0 } }, - { /* 72 */ 1, { 0, 0, 2, 0 } }, - { /* 73 */ 1, { 0, 2, 1, 0 } }, - { /* 74 */ 1, { 0, 1, 2, 0 } }, - { /* 75 */ 1, { 0, 2, 0, 0 } }, - { /* 76 */ 1, { 0, 1, 0, 2 } }, - { /* 77 */ 1, { 2, 0, 1, 0 } }, - { /* 78 */ 1, { 1, 2, 1, 1 } }, - { /* 79 */ 1, { 0, 2, 1, 1 } }, - { /* 80 */ 1, { 1, 1, 2, 0 } }, - { /* 81 */ 1, { 1, 1, 2, 1 } }, - { /* 82 */ 0, { 11, 12, 0, 0 } }, - { /* 83 */ 0, { 12, 13, 0, 0 } }, - { /* 84 */ 0, { 13, 14, 0, 0 } }, - { /* 85 */ 0, { 14, 15, 0, 0 } }, - { /* 86 */ 0, { 15, 16, 0, 0 } }, - { /* 87 */ 0, { 16, 17, 0, 0 } }, - { /* 88 */ 0, { 17, 18, 0, 0 } }, - { /* 89 */ 0, { 18, 19, 0, 0 } }, - { /* 90 */ 0, { 19, 20, 0, 0 } }, - { /* 91 */ 0, { 20, 21, 0, 0 } }, - { /* 92 */ 0, { 21, 22, 0, 0 } }, - { /* 93 */ 1, { 1, 2, 0, 1 } }, /* 1111101010 */ - { /* 94 */ 1, { 1, 0, 2, 0 } }, /* 1111101011 */ - { /* 95 */ 1, { 1, 0, 2, 1 } }, /* 1111101100 */ - { /* 96 */ 1, { 0, 2, 0, 1 } }, /* 1111101101 */ - { /* 97 */ 1, { 2, 1, 1, 1 } }, /* 1111101110 */ - { /* 98 */ 1, { 1, 1, 1, 2 } }, /* 1111101111 */ - { /* 99 */ 1, { 2, 1, 0, 1 } }, /* 1111110000 */ - { /* 00 */ 1, { 1, 0, 1, 2 } }, /* 1111110001 */ - { /* 01 */ 1, { 0, 0, 2, 2 } }, /* 1111110010 */ - { /* 02 */ 1, { 0, 1, 2, 2 } }, /* 1111110011 */ - { /* 03 */ 1, { 2, 2, 1, 0 } }, /* 1111110100 */ - { /* 04 */ 1, { 1, 2, 2, 0 } }, /* 1111110101 */ - { /* 05 */ 1, { 1, 0, 0, 2 } }, /* 1111110110 */ - { /* 06 */ 1, { 2, 0, 0, 1 } }, /* 1111110111 */ - { /* 07 */ 1, { 0, 2, 2, 1 } }, /* 1111111000 */ - { /* 08 */ 0, { 7, 8, 0, 0 } }, - { /* 09 */ 0, { 8, 9, 0, 0 } }, - { /* 10 */ 0, { 9, 10, 0, 0 } }, - { /* 11 */ 0, { 10, 11, 0, 0 } }, - { /* 12 */ 0, { 11, 12, 0, 0 } }, - { /* 13 */ 0, { 12, 13, 0, 0 } }, - { /* 14 */ 0, { 13, 14, 0, 0 } }, - { /* 15 */ 1, { 2, 2, 0, 0 } }, /* 11111110010 */ - { /* 16 */ 1, { 1, 2, 2, 1 } }, /* 11111110011 */ - { /* 17 */ 1, { 1, 1, 0, 2 } }, /* 11111110100 */ - { /* 18 */ 1, { 2, 0, 1, 1 } }, /* 11111110101 */ - { /* 19 */ 1, { 1, 1, 2, 2 } }, /* 11111110110 */ - { /* 20 */ 1, { 2, 2, 1, 1 } }, /* 11111110111 */ - { /* 21 */ 1, { 0, 2, 2, 0 } }, /* 11111111000 */ - { /* 22 */ 1, { 0, 2, 1, 2 } }, /* 11111111001 */ - { /* 23 */ 0, { 6, 7, 0, 0 } }, - { /* 24 */ 0, { 7, 8, 0, 0 } }, - { /* 25 */ 0, { 8, 9, 0, 0 } }, - { /* 26 */ 0, { 9, 10, 0, 0 } }, - { /* 27 */ 0, { 10, 11, 0, 0 } }, - { /* 28 */ 0, { 11, 12, 0, 0 } }, - { /* 29 */ 1, { 1, 0, 2, 2 } }, /* 111111110100 */ - { /* 30 */ 1, { 2, 2, 0, 1 } }, /* 111111110101 */ - { /* 31 */ 1, { 2, 1, 2, 0 } }, /* 111111110110 */ - { /* 32 */ 1, { 2, 2, 2, 0 } }, /* 111111110111 */ - { /* 33 */ 1, { 0, 2, 2, 2 } }, /* 111111111000 */ - { /* 34 */ 1, { 2, 2, 2, 1 } }, /* 111111111001 */ - { /* 35 */ 1, { 2, 1, 2, 1 } }, /* 111111111010 */ - { /* 36 */ 1, { 1, 2, 1, 2 } }, /* 111111111011 */ - { /* 37 */ 1, { 1, 2, 2, 2 } }, /* 111111111100 */ - { /* 38 */ 0, { 3, 4, 0, 0 } }, - { /* 39 */ 0, { 4, 5, 0, 0 } }, - { /* 40 */ 0, { 5, 6, 0, 0 } }, - { /* 41 */ 1, { 0, 2, 0, 2 } }, /* 1111111111010 */ - { /* 42 */ 1, { 2, 0, 2, 0 } }, /* 1111111111011 */ - { /* 43 */ 1, { 1, 2, 0, 2 } }, /* 1111111111100 */ - { /* 44 */ 0, { 3, 4, 0, 0 } }, - { /* 45 */ 0, { 4, 5, 0, 0 } }, - { /* 46 */ 0, { 5, 6, 0, 0 } }, - { /* 47 */ 1, { 2, 0, 2, 1 } }, /* 11111111111010 */ - { /* 48 */ 1, { 2, 1, 1, 2 } }, /* 11111111111011 */ - { /* 49 */ 1, { 2, 1, 0, 2 } }, /* 11111111111100 */ - { /* 50 */ 0, { 3, 4, 0, 0 } }, - { /* 51 */ 0, { 4, 5, 0, 0 } }, - { /* 52 */ 0, { 5, 6, 0, 0 } }, - { /* 53 */ 1, { 2, 2, 2, 2 } }, /* 111111111111010 */ - { /* 54 */ 1, { 2, 2, 1, 2 } }, /* 111111111111011 */ - { /* 55 */ 1, { 2, 1, 2, 2 } }, /* 111111111111100 */ - { /* 56 */ 1, { 2, 0, 1, 2 } }, /* 111111111111101 */ - { /* 57 */ 1, { 2, 0, 0, 2 } }, /* 111111111111110 */ - { /* 58 */ 0, { 1, 2, 0, 0 } }, - { /* 59 */ 1, { 2, 2, 0, 2 } }, /* 1111111111111110 */ - { /* 60 */ 1, { 2, 0, 2, 2 } } /* 1111111111111111 */ -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_3.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* Binary search huffman table HCB_3 */ + + +static hcb_bin_quad hcb3[] = { + { /* 0 */ 0, { 1, 2, 0, 0 } }, + { /* 1 */ 1, { 0, 0, 0, 0 } }, /* 0 */ + { /* 2 */ 0, { 1, 2, 0, 0 } }, + { /* 3 */ 0, { 2, 3, 0, 0 } }, + { /* 4 */ 0, { 3, 4, 0, 0 } }, + { /* 5 */ 0, { 4, 5, 0, 0 } }, + { /* 6 */ 0, { 5, 6, 0, 0 } }, + { /* 7 */ 0, { 6, 7, 0, 0 } }, + { /* 8 */ 0, { 7, 8, 0, 0 } }, + { /* 9 */ 1, { 1, 0, 0, 0 } }, /* 1000 */ + { /* 10 */ 1, { 0, 0, 0, 1 } }, /* 1001 */ + { /* 11 */ 1, { 0, 1, 0, 0 } }, /* 1010 */ + { /* 12 */ 1, { 0, 0, 1, 0 } }, /* 1011 */ + { /* 13 */ 0, { 4, 5, 0, 0 } }, + { /* 14 */ 0, { 5, 6, 0, 0 } }, + { /* 15 */ 0, { 6, 7, 0, 0 } }, + { /* 16 */ 0, { 7, 8, 0, 0 } }, + { /* 17 */ 1, { 1, 1, 0, 0 } }, + { /* 18 */ 1, { 0, 0, 1, 1 } }, + { /* 19 */ 0, { 6, 7, 0, 0 } }, + { /* 20 */ 0, { 7, 8, 0, 0 } }, + { /* 21 */ 0, { 8, 9, 0, 0 } }, + { /* 22 */ 0, { 9, 10, 0, 0 } }, + { /* 23 */ 0, { 10, 11, 0, 0 } }, + { /* 24 */ 0, { 11, 12, 0, 0 } }, + { /* 25 */ 1, { 0, 1, 1, 0 } }, /* 110100 */ + { /* 26 */ 1, { 0, 1, 0, 1 } }, /* 110101 */ + { /* 27 */ 1, { 1, 0, 1, 0 } }, /* 110110 */ + { /* 28 */ 1, { 0, 1, 1, 1 } }, /* 110111 */ + { /* 29 */ 1, { 1, 0, 0, 1 } }, /* 111000 */ + { /* 30 */ 1, { 1, 1, 1, 0 } }, /* 111001 */ + { /* 31 */ 0, { 6, 7, 0, 0 } }, + { /* 32 */ 0, { 7, 8, 0, 0 } }, + { /* 33 */ 0, { 8, 9, 0, 0 } }, + { /* 34 */ 0, { 9, 10, 0, 0 } }, + { /* 35 */ 0, { 10, 11, 0, 0 } }, + { /* 36 */ 0, { 11, 12, 0, 0 } }, + { /* 37 */ 1, { 1, 1, 1, 1 } }, /* 1110100 */ + { /* 38 */ 1, { 1, 0, 1, 1 } }, /* 1110101 */ + { /* 39 */ 1, { 1, 1, 0, 1 } }, /* 1110110 */ + { /* 40 */ 0, { 9, 10, 0, 0 } }, + { /* 41 */ 0, { 10, 11, 0, 0 } }, + { /* 42 */ 0, { 11, 12, 0, 0 } }, + { /* 43 */ 0, { 12, 13, 0, 0 } }, + { /* 44 */ 0, { 13, 14, 0, 0 } }, + { /* 45 */ 0, { 14, 15, 0, 0 } }, + { /* 46 */ 0, { 15, 16, 0, 0 } }, + { /* 47 */ 0, { 16, 17, 0, 0 } }, + { /* 48 */ 0, { 17, 18, 0, 0 } }, + { /* 49 */ 1, { 2, 0, 0, 0 } }, /* 11101110 */ + { /* 50 */ 1, { 0, 0, 0, 2 } }, /* 11101111 */ + { /* 51 */ 1, { 0, 0, 1, 2 } }, /* 11110000 */ + { /* 52 */ 1, { 2, 1, 0, 0 } }, /* 11110001 */ + { /* 53 */ 1, { 1, 2, 1, 0 } }, /* 11110010 */ + { /* 54 */ 0, { 13, 14, 0, 0 } }, + { /* 55 */ 0, { 14, 15, 0, 0 } }, + { /* 56 */ 0, { 15, 16, 0, 0 } }, + { /* 57 */ 0, { 16, 17, 0, 0 } }, + { /* 58 */ 0, { 17, 18, 0, 0 } }, + { /* 59 */ 0, { 18, 19, 0, 0 } }, + { /* 60 */ 0, { 19, 20, 0, 0 } }, + { /* 61 */ 0, { 20, 21, 0, 0 } }, + { /* 62 */ 0, { 21, 22, 0, 0 } }, + { /* 63 */ 0, { 22, 23, 0, 0 } }, + { /* 64 */ 0, { 23, 24, 0, 0 } }, + { /* 65 */ 0, { 24, 25, 0, 0 } }, + { /* 66 */ 0, { 25, 26, 0, 0 } }, + { /* 67 */ 1, { 0, 0, 2, 1 } }, + { /* 68 */ 1, { 0, 1, 2, 1 } }, + { /* 69 */ 1, { 1, 2, 0, 0 } }, + { /* 70 */ 1, { 0, 1, 1, 2 } }, + { /* 71 */ 1, { 2, 1, 1, 0 } }, + { /* 72 */ 1, { 0, 0, 2, 0 } }, + { /* 73 */ 1, { 0, 2, 1, 0 } }, + { /* 74 */ 1, { 0, 1, 2, 0 } }, + { /* 75 */ 1, { 0, 2, 0, 0 } }, + { /* 76 */ 1, { 0, 1, 0, 2 } }, + { /* 77 */ 1, { 2, 0, 1, 0 } }, + { /* 78 */ 1, { 1, 2, 1, 1 } }, + { /* 79 */ 1, { 0, 2, 1, 1 } }, + { /* 80 */ 1, { 1, 1, 2, 0 } }, + { /* 81 */ 1, { 1, 1, 2, 1 } }, + { /* 82 */ 0, { 11, 12, 0, 0 } }, + { /* 83 */ 0, { 12, 13, 0, 0 } }, + { /* 84 */ 0, { 13, 14, 0, 0 } }, + { /* 85 */ 0, { 14, 15, 0, 0 } }, + { /* 86 */ 0, { 15, 16, 0, 0 } }, + { /* 87 */ 0, { 16, 17, 0, 0 } }, + { /* 88 */ 0, { 17, 18, 0, 0 } }, + { /* 89 */ 0, { 18, 19, 0, 0 } }, + { /* 90 */ 0, { 19, 20, 0, 0 } }, + { /* 91 */ 0, { 20, 21, 0, 0 } }, + { /* 92 */ 0, { 21, 22, 0, 0 } }, + { /* 93 */ 1, { 1, 2, 0, 1 } }, /* 1111101010 */ + { /* 94 */ 1, { 1, 0, 2, 0 } }, /* 1111101011 */ + { /* 95 */ 1, { 1, 0, 2, 1 } }, /* 1111101100 */ + { /* 96 */ 1, { 0, 2, 0, 1 } }, /* 1111101101 */ + { /* 97 */ 1, { 2, 1, 1, 1 } }, /* 1111101110 */ + { /* 98 */ 1, { 1, 1, 1, 2 } }, /* 1111101111 */ + { /* 99 */ 1, { 2, 1, 0, 1 } }, /* 1111110000 */ + { /* 00 */ 1, { 1, 0, 1, 2 } }, /* 1111110001 */ + { /* 01 */ 1, { 0, 0, 2, 2 } }, /* 1111110010 */ + { /* 02 */ 1, { 0, 1, 2, 2 } }, /* 1111110011 */ + { /* 03 */ 1, { 2, 2, 1, 0 } }, /* 1111110100 */ + { /* 04 */ 1, { 1, 2, 2, 0 } }, /* 1111110101 */ + { /* 05 */ 1, { 1, 0, 0, 2 } }, /* 1111110110 */ + { /* 06 */ 1, { 2, 0, 0, 1 } }, /* 1111110111 */ + { /* 07 */ 1, { 0, 2, 2, 1 } }, /* 1111111000 */ + { /* 08 */ 0, { 7, 8, 0, 0 } }, + { /* 09 */ 0, { 8, 9, 0, 0 } }, + { /* 10 */ 0, { 9, 10, 0, 0 } }, + { /* 11 */ 0, { 10, 11, 0, 0 } }, + { /* 12 */ 0, { 11, 12, 0, 0 } }, + { /* 13 */ 0, { 12, 13, 0, 0 } }, + { /* 14 */ 0, { 13, 14, 0, 0 } }, + { /* 15 */ 1, { 2, 2, 0, 0 } }, /* 11111110010 */ + { /* 16 */ 1, { 1, 2, 2, 1 } }, /* 11111110011 */ + { /* 17 */ 1, { 1, 1, 0, 2 } }, /* 11111110100 */ + { /* 18 */ 1, { 2, 0, 1, 1 } }, /* 11111110101 */ + { /* 19 */ 1, { 1, 1, 2, 2 } }, /* 11111110110 */ + { /* 20 */ 1, { 2, 2, 1, 1 } }, /* 11111110111 */ + { /* 21 */ 1, { 0, 2, 2, 0 } }, /* 11111111000 */ + { /* 22 */ 1, { 0, 2, 1, 2 } }, /* 11111111001 */ + { /* 23 */ 0, { 6, 7, 0, 0 } }, + { /* 24 */ 0, { 7, 8, 0, 0 } }, + { /* 25 */ 0, { 8, 9, 0, 0 } }, + { /* 26 */ 0, { 9, 10, 0, 0 } }, + { /* 27 */ 0, { 10, 11, 0, 0 } }, + { /* 28 */ 0, { 11, 12, 0, 0 } }, + { /* 29 */ 1, { 1, 0, 2, 2 } }, /* 111111110100 */ + { /* 30 */ 1, { 2, 2, 0, 1 } }, /* 111111110101 */ + { /* 31 */ 1, { 2, 1, 2, 0 } }, /* 111111110110 */ + { /* 32 */ 1, { 2, 2, 2, 0 } }, /* 111111110111 */ + { /* 33 */ 1, { 0, 2, 2, 2 } }, /* 111111111000 */ + { /* 34 */ 1, { 2, 2, 2, 1 } }, /* 111111111001 */ + { /* 35 */ 1, { 2, 1, 2, 1 } }, /* 111111111010 */ + { /* 36 */ 1, { 1, 2, 1, 2 } }, /* 111111111011 */ + { /* 37 */ 1, { 1, 2, 2, 2 } }, /* 111111111100 */ + { /* 38 */ 0, { 3, 4, 0, 0 } }, + { /* 39 */ 0, { 4, 5, 0, 0 } }, + { /* 40 */ 0, { 5, 6, 0, 0 } }, + { /* 41 */ 1, { 0, 2, 0, 2 } }, /* 1111111111010 */ + { /* 42 */ 1, { 2, 0, 2, 0 } }, /* 1111111111011 */ + { /* 43 */ 1, { 1, 2, 0, 2 } }, /* 1111111111100 */ + { /* 44 */ 0, { 3, 4, 0, 0 } }, + { /* 45 */ 0, { 4, 5, 0, 0 } }, + { /* 46 */ 0, { 5, 6, 0, 0 } }, + { /* 47 */ 1, { 2, 0, 2, 1 } }, /* 11111111111010 */ + { /* 48 */ 1, { 2, 1, 1, 2 } }, /* 11111111111011 */ + { /* 49 */ 1, { 2, 1, 0, 2 } }, /* 11111111111100 */ + { /* 50 */ 0, { 3, 4, 0, 0 } }, + { /* 51 */ 0, { 4, 5, 0, 0 } }, + { /* 52 */ 0, { 5, 6, 0, 0 } }, + { /* 53 */ 1, { 2, 2, 2, 2 } }, /* 111111111111010 */ + { /* 54 */ 1, { 2, 2, 1, 2 } }, /* 111111111111011 */ + { /* 55 */ 1, { 2, 1, 2, 2 } }, /* 111111111111100 */ + { /* 56 */ 1, { 2, 0, 1, 2 } }, /* 111111111111101 */ + { /* 57 */ 1, { 2, 0, 0, 2 } }, /* 111111111111110 */ + { /* 58 */ 0, { 1, 2, 0, 0 } }, + { /* 59 */ 1, { 2, 2, 0, 2 } }, /* 1111111111111110 */ + { /* 60 */ 1, { 2, 0, 2, 2 } } /* 1111111111111111 */ +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_4.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_4.h old mode 100644 new mode 100755 index 0dcd058a4..c2b43e005 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_4.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_4.h @@ -1,196 +1,199 @@ -/* -** 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: hcb_4.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_4 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb4_1[] = { - /* 4 bit codewords */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00010 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00100 */ 2, 0 }, - { /* */ 2, 0 }, - { /* 00110 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 01000 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 01010 */ 5, 0 }, - { /* */ 5, 0 }, - { /* 01100 */ 6, 0 }, - { /* */ 6, 0 }, - { /* 01110 */ 7, 0 }, - { /* */ 7, 0 }, - { /* 10000 */ 8, 0 }, - { /* */ 8, 0 }, - { /* 10010 */ 9, 0 }, - { /* */ 9, 0 }, - - /* 5 bit codewords */ - { /* 10100 */ 10, 0 }, - { /* 10101 */ 11, 0 }, - { /* 10110 */ 12, 0 }, - { /* 10111 */ 13, 0 }, - { /* 11000 */ 14, 0 }, - { /* 11001 */ 15, 0 }, - - /* 7 bit codewords */ - { /* 11010 */ 16, 2 }, - { /* 11011 */ 20, 2 }, - - /* 7/8 bit codewords */ - { /* 11100 */ 24, 3 }, - - /* 8 bit codewords */ - { /* 11101 */ 32, 3 }, - - /* 8/9 bit codewords */ - { /* 11110 */ 40, 4 }, - - /* 9/10/11/12 bit codewords */ - { /* 11111 */ 56, 7 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_quad hcb4_2[] = { - /* 4 bit codewords */ - { 4, 1, 1, 1, 1 }, - { 4, 0, 1, 1, 1 }, - { 4, 1, 1, 0, 1 }, - { 4, 1, 1, 1, 0 }, - { 4, 1, 0, 1, 1 }, - { 4, 1, 0, 0, 0 }, - { 4, 1, 1, 0, 0 }, - { 4, 0, 0, 0, 0 }, - { 4, 0, 0, 1, 1 }, - { 4, 1, 0, 1, 0 }, - - /* 5 bit codewords */ - { 5, 1, 0, 0, 1 }, - { 5, 0, 1, 1, 0 }, - { 5, 0, 0, 0, 1 }, - { 5, 0, 1, 0, 1 }, - { 5, 0, 0, 1, 0 }, - { 5, 0, 1, 0, 0 }, - - /* 7 bit codewords */ - /* first 5 bits: 11010 */ - { 7, 2, 1, 1, 1 }, - { 7, 1, 1, 2, 1 }, - { 7, 1, 2, 1, 1 }, - { 7, 1, 1, 1, 2 }, - /* first 5 bits: 11011 */ - { 7, 2, 1, 1, 0 }, - { 7, 2, 1, 0, 1 }, - { 7, 1, 2, 1, 0 }, - { 7, 2, 0, 1, 1 }, - - /* 7/8 bit codewords */ - /* first 5 bits: 11100 */ - { 7, 0, 1, 2, 1 }, { 7, 0, 1, 2, 1 }, - { 8, 0, 1, 1, 2 }, - { 8, 1, 1, 2, 0 }, - { 8, 0, 2, 1, 1 }, - { 8, 1, 0, 1, 2 }, - { 8, 1, 2, 0, 1 }, - { 8, 1, 1, 0, 2 }, - - /* 8 bit codewords */ - { 8, 1, 0, 2, 1 }, - { 8, 2, 1, 0, 0 }, - { 8, 2, 0, 1, 0 }, - { 8, 1, 2, 0, 0 }, - { 8, 2, 0, 0, 1 }, - { 8, 0, 1, 0, 2 }, - { 8, 0, 2, 1, 0 }, - { 8, 0, 0, 1, 2 }, - - /* 8/9 bit codewords */ - { 8, 0, 1, 2, 0 }, { 8, 0, 1, 2, 0 }, - { 8, 0, 2, 0, 1 }, { 8, 0, 2, 0, 1 }, - { 8, 1, 0, 0, 2 }, { 8, 1, 0, 0, 2 }, - { 8, 0, 0, 2, 1 }, { 8, 0, 0, 2, 1 }, - { 8, 1, 0, 2, 0 }, { 8, 1, 0, 2, 0 }, - { 8, 2, 0, 0, 0 }, { 8, 2, 0, 0, 0 }, - { 8, 0, 0, 0, 2 }, { 8, 0, 0, 0, 2 }, - { 9, 0, 2, 0, 0 }, - { 9, 0, 0, 2, 0 }, - - /* 9/10/11 bit codewords */ - /* 9 bit codewords repeated 2^3 = 8 times */ - { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, - { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, - { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, - { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, - { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, - { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, - { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, - { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, - { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, - { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, - { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, - { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, - /* 10 bit codewords repeated 2^2 = 4 times */ - { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, - { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, - { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, - { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, - { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, - { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, - { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, - { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, - { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, - { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, - { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, - { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, - { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, - { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, - /* 11 bit codewords repeated 2^1 = 2 times */ - { 11, 2, 1, 2, 2 }, { 11, 2, 1, 2, 2 }, - { 11, 2, 2, 1, 2 }, { 11, 2, 2, 1, 2 }, - { 11, 0, 2, 2, 0 }, { 11, 0, 2, 2, 0 }, - { 11, 2, 2, 0, 0 }, { 11, 2, 2, 0, 0 }, - { 11, 0, 0, 2, 2 }, { 11, 0, 0, 2, 2 }, - { 11, 2, 0, 2, 0 }, { 11, 2, 0, 2, 0 }, - { 11, 0, 2, 0, 2 }, { 11, 0, 2, 0, 2 }, - { 11, 2, 0, 0, 2 }, { 11, 2, 0, 0, 2 }, - { 11, 2, 2, 2, 2 }, { 11, 2, 2, 2, 2 }, - { 11, 0, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, - { 11, 2, 2, 2, 0 }, { 11, 2, 2, 2, 0 }, - /* 12 bit codewords */ - { 12, 2, 2, 0, 2 }, - { 12, 2, 0, 2, 2 }, -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_4.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_4 */ + + +/* 1st step: 5 bits + * 2^5 = 32 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb4_1[] = { + /* 4 bit codewords */ + { /* 00000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* 00010 */ 1, 0 }, + { /* */ 1, 0 }, + { /* 00100 */ 2, 0 }, + { /* */ 2, 0 }, + { /* 00110 */ 3, 0 }, + { /* */ 3, 0 }, + { /* 01000 */ 4, 0 }, + { /* */ 4, 0 }, + { /* 01010 */ 5, 0 }, + { /* */ 5, 0 }, + { /* 01100 */ 6, 0 }, + { /* */ 6, 0 }, + { /* 01110 */ 7, 0 }, + { /* */ 7, 0 }, + { /* 10000 */ 8, 0 }, + { /* */ 8, 0 }, + { /* 10010 */ 9, 0 }, + { /* */ 9, 0 }, + + /* 5 bit codewords */ + { /* 10100 */ 10, 0 }, + { /* 10101 */ 11, 0 }, + { /* 10110 */ 12, 0 }, + { /* 10111 */ 13, 0 }, + { /* 11000 */ 14, 0 }, + { /* 11001 */ 15, 0 }, + + /* 7 bit codewords */ + { /* 11010 */ 16, 2 }, + { /* 11011 */ 20, 2 }, + + /* 7/8 bit codewords */ + { /* 11100 */ 24, 3 }, + + /* 8 bit codewords */ + { /* 11101 */ 32, 3 }, + + /* 8/9 bit codewords */ + { /* 11110 */ 40, 4 }, + + /* 9/10/11/12 bit codewords */ + { /* 11111 */ 56, 7 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_quad hcb4_2[] = { + /* 4 bit codewords */ + { 4, 1, 1, 1, 1 }, + { 4, 0, 1, 1, 1 }, + { 4, 1, 1, 0, 1 }, + { 4, 1, 1, 1, 0 }, + { 4, 1, 0, 1, 1 }, + { 4, 1, 0, 0, 0 }, + { 4, 1, 1, 0, 0 }, + { 4, 0, 0, 0, 0 }, + { 4, 0, 0, 1, 1 }, + { 4, 1, 0, 1, 0 }, + + /* 5 bit codewords */ + { 5, 1, 0, 0, 1 }, + { 5, 0, 1, 1, 0 }, + { 5, 0, 0, 0, 1 }, + { 5, 0, 1, 0, 1 }, + { 5, 0, 0, 1, 0 }, + { 5, 0, 1, 0, 0 }, + + /* 7 bit codewords */ + /* first 5 bits: 11010 */ + { 7, 2, 1, 1, 1 }, + { 7, 1, 1, 2, 1 }, + { 7, 1, 2, 1, 1 }, + { 7, 1, 1, 1, 2 }, + /* first 5 bits: 11011 */ + { 7, 2, 1, 1, 0 }, + { 7, 2, 1, 0, 1 }, + { 7, 1, 2, 1, 0 }, + { 7, 2, 0, 1, 1 }, + + /* 7/8 bit codewords */ + /* first 5 bits: 11100 */ + { 7, 0, 1, 2, 1 }, { 7, 0, 1, 2, 1 }, + { 8, 0, 1, 1, 2 }, + { 8, 1, 1, 2, 0 }, + { 8, 0, 2, 1, 1 }, + { 8, 1, 0, 1, 2 }, + { 8, 1, 2, 0, 1 }, + { 8, 1, 1, 0, 2 }, + + /* 8 bit codewords */ + { 8, 1, 0, 2, 1 }, + { 8, 2, 1, 0, 0 }, + { 8, 2, 0, 1, 0 }, + { 8, 1, 2, 0, 0 }, + { 8, 2, 0, 0, 1 }, + { 8, 0, 1, 0, 2 }, + { 8, 0, 2, 1, 0 }, + { 8, 0, 0, 1, 2 }, + + /* 8/9 bit codewords */ + { 8, 0, 1, 2, 0 }, { 8, 0, 1, 2, 0 }, + { 8, 0, 2, 0, 1 }, { 8, 0, 2, 0, 1 }, + { 8, 1, 0, 0, 2 }, { 8, 1, 0, 0, 2 }, + { 8, 0, 0, 2, 1 }, { 8, 0, 0, 2, 1 }, + { 8, 1, 0, 2, 0 }, { 8, 1, 0, 2, 0 }, + { 8, 2, 0, 0, 0 }, { 8, 2, 0, 0, 0 }, + { 8, 0, 0, 0, 2 }, { 8, 0, 0, 0, 2 }, + { 9, 0, 2, 0, 0 }, + { 9, 0, 0, 2, 0 }, + + /* 9/10/11 bit codewords */ + /* 9 bit codewords repeated 2^3 = 8 times */ + { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, + { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, + { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, + { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, + { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, + { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, + { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, + { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, + { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, + { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, + { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, + { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, + /* 10 bit codewords repeated 2^2 = 4 times */ + { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, + { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, + { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, + { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, + { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, + { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, + { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, + { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, + { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, + { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, + { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, + { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, + { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, + { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, + /* 11 bit codewords repeated 2^1 = 2 times */ + { 11, 2, 1, 2, 2 }, { 11, 2, 1, 2, 2 }, + { 11, 2, 2, 1, 2 }, { 11, 2, 2, 1, 2 }, + { 11, 0, 2, 2, 0 }, { 11, 0, 2, 2, 0 }, + { 11, 2, 2, 0, 0 }, { 11, 2, 2, 0, 0 }, + { 11, 0, 0, 2, 2 }, { 11, 0, 0, 2, 2 }, + { 11, 2, 0, 2, 0 }, { 11, 2, 0, 2, 0 }, + { 11, 0, 2, 0, 2 }, { 11, 0, 2, 0, 2 }, + { 11, 2, 0, 0, 2 }, { 11, 2, 0, 0, 2 }, + { 11, 2, 2, 2, 2 }, { 11, 2, 2, 2, 2 }, + { 11, 0, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, + { 11, 2, 2, 2, 0 }, { 11, 2, 2, 2, 0 }, + /* 12 bit codewords */ + { 12, 2, 2, 0, 2 }, + { 12, 2, 0, 2, 2 }, +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_5.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_5.h old mode 100644 new mode 100755 index 90bebf3d0..ca7c473bf --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_5.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_5.h @@ -1,193 +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: hcb_5.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* Binary search huffman table HCB_5 */ - - -static hcb_bin_pair hcb5[] = { - { /* 0 */ 0, { 1, 2 } }, - { /* 1 */ 1, { 0, 0 } }, /* 0 */ - { /* 2 */ 0, { 1, 2 } }, - { /* 3 */ 0, { 2, 3 } }, - { /* 4 */ 0, { 3, 4 } }, - { /* 5 */ 0, { 4, 5 } }, - { /* 6 */ 0, { 5, 6 } }, - { /* 7 */ 0, { 6, 7 } }, - { /* 8 */ 0, { 7, 8 } }, - { /* 9 */ 1, { -1, 0 } }, /* 1000 */ - { /* 10 */ 1, { 1, 0 } }, /* 1001 */ - { /* 11 */ 1, { 0, 1 } }, /* 1010 */ - { /* 12 */ 1, { 0, -1 } }, /* 1011 */ - { /* 13 */ 0, { 4, 5 } }, - { /* 14 */ 0, { 5, 6 } }, - { /* 15 */ 0, { 6, 7 } }, - { /* 16 */ 0, { 7, 8 } }, - { /* 17 */ 1, { 1, -1 } }, - { /* 18 */ 1, { -1, 1 } }, - { /* 19 */ 1, { -1, -1 } }, - { /* 20 */ 1, { 1, 1 } }, - { /* 21 */ 0, { 4, 5 } }, - { /* 22 */ 0, { 5, 6 } }, - { /* 23 */ 0, { 6, 7 } }, - { /* 24 */ 0, { 7, 8 } }, - { /* 25 */ 0, { 8, 9 } }, - { /* 26 */ 0, { 9, 10 } }, - { /* 27 */ 0, { 10, 11 } }, - { /* 28 */ 0, { 11, 12 } }, - { /* 29 */ 0, { 12, 13 } }, - { /* 30 */ 0, { 13, 14 } }, - { /* 31 */ 0, { 14, 15 } }, - { /* 32 */ 0, { 15, 16 } }, - { /* 33 */ 1, { -2, 0 } }, - { /* 34 */ 1, { 0, 2 } }, - { /* 35 */ 1, { 2, 0 } }, - { /* 36 */ 1, { 0, -2 } }, - { /* 37 */ 0, { 12, 13 } }, - { /* 38 */ 0, { 13, 14 } }, - { /* 39 */ 0, { 14, 15 } }, - { /* 40 */ 0, { 15, 16 } }, - { /* 41 */ 0, { 16, 17 } }, - { /* 42 */ 0, { 17, 18 } }, - { /* 43 */ 0, { 18, 19 } }, - { /* 44 */ 0, { 19, 20 } }, - { /* 45 */ 0, { 20, 21 } }, - { /* 46 */ 0, { 21, 22 } }, - { /* 47 */ 0, { 22, 23 } }, - { /* 48 */ 0, { 23, 24 } }, - { /* 49 */ 1, { -2, -1 } }, - { /* 50 */ 1, { 2, 1 } }, - { /* 51 */ 1, { -1, -2 } }, - { /* 52 */ 1, { 1, 2 } }, - { /* 53 */ 1, { -2, 1 } }, - { /* 54 */ 1, { 2, -1 } }, - { /* 55 */ 1, { -1, 2 } }, - { /* 56 */ 1, { 1, -2 } }, - { /* 57 */ 1, { -3, 0 } }, - { /* 58 */ 1, { 3, 0 } }, - { /* 59 */ 1, { 0, -3 } }, - { /* 60 */ 1, { 0, 3 } }, - { /* 61 */ 0, { 12, 13 } }, - { /* 62 */ 0, { 13, 14 } }, - { /* 63 */ 0, { 14, 15 } }, - { /* 64 */ 0, { 15, 16 } }, - { /* 65 */ 0, { 16, 17 } }, - { /* 66 */ 0, { 17, 18 } }, - { /* 67 */ 0, { 18, 19 } }, - { /* 68 */ 0, { 19, 20 } }, - { /* 69 */ 0, { 20, 21 } }, - { /* 70 */ 0, { 21, 22 } }, - { /* 71 */ 0, { 22, 23 } }, - { /* 72 */ 0, { 23, 24 } }, - { /* 73 */ 1, { -3, -1 } }, - { /* 74 */ 1, { 1, 3 } }, - { /* 75 */ 1, { 3, 1 } }, - { /* 76 */ 1, { -1, -3 } }, - { /* 77 */ 1, { -3, 1 } }, - { /* 78 */ 1, { 3, -1 } }, - { /* 79 */ 1, { 1, -3 } }, - { /* 80 */ 1, { -1, 3 } }, - { /* 81 */ 1, { -2, 2 } }, - { /* 82 */ 1, { 2, 2 } }, - { /* 83 */ 1, { -2, -2 } }, - { /* 84 */ 1, { 2, -2 } }, - { /* 85 */ 0, { 12, 13 } }, - { /* 86 */ 0, { 13, 14 } }, - { /* 87 */ 0, { 14, 15 } }, - { /* 88 */ 0, { 15, 16 } }, - { /* 89 */ 0, { 16, 17 } }, - { /* 90 */ 0, { 17, 18 } }, - { /* 91 */ 0, { 18, 19 } }, - { /* 92 */ 0, { 19, 20 } }, - { /* 93 */ 0, { 20, 21 } }, - { /* 94 */ 0, { 21, 22 } }, - { /* 95 */ 0, { 22, 23 } }, - { /* 96 */ 0, { 23, 24 } }, - { /* 97 */ 1, { -3, -2 } }, - { /* 98 */ 1, { 3, -2 } }, - { /* 99 */ 1, { -2, 3 } }, - { /* 00 */ 1, { 2, -3 } }, - { /* 01 */ 1, { 3, 2 } }, - { /* 02 */ 1, { 2, 3 } }, - { /* 03 */ 1, { -3, 2 } }, - { /* 04 */ 1, { -2, -3 } }, - { /* 05 */ 1, { 0, -4 } }, - { /* 06 */ 1, { -4, 0 } }, - { /* 07 */ 1, { 4, 1 } }, - { /* 08 */ 1, { 4, 0 } }, - { /* 09 */ 0, { 12, 13 } }, - { /* 10 */ 0, { 13, 14 } }, - { /* 11 */ 0, { 14, 15 } }, - { /* 12 */ 0, { 15, 16 } }, - { /* 13 */ 0, { 16, 17 } }, - { /* 14 */ 0, { 17, 18 } }, - { /* 15 */ 0, { 18, 19 } }, - { /* 16 */ 0, { 19, 20 } }, - { /* 17 */ 0, { 20, 21 } }, - { /* 18 */ 0, { 21, 22 } }, - { /* 19 */ 0, { 22, 23 } }, - { /* 20 */ 0, { 23, 24 } }, - { /* 21 */ 1, { -4, -1 } }, - { /* 22 */ 1, { 0, 4 } }, - { /* 23 */ 1, { 4, -1 } }, - { /* 24 */ 1, { -1, -4 } }, - { /* 25 */ 1, { 1, 4 } }, - { /* 26 */ 1, { -1, 4 } }, - { /* 27 */ 1, { -4, 1 } }, - { /* 28 */ 1, { 1, -4 } }, - { /* 29 */ 1, { 3, -3 } }, - { /* 30 */ 1, { -3, -3 } }, - { /* 31 */ 1, { -3, 3 } }, - { /* 32 */ 1, { -2, 4 } }, - { /* 33 */ 1, { -4, -2 } }, - { /* 34 */ 1, { 4, 2 } }, - { /* 35 */ 1, { 2, -4 } }, - { /* 36 */ 1, { 2, 4 } }, - { /* 37 */ 1, { 3, 3 } }, - { /* 38 */ 1, { -4, 2 } }, - { /* 39 */ 0, { 6, 7 } }, - { /* 40 */ 0, { 7, 8 } }, - { /* 41 */ 0, { 8, 9 } }, - { /* 42 */ 0, { 9, 10 } }, - { /* 43 */ 0, { 10, 11 } }, - { /* 44 */ 0, { 11, 12 } }, - { /* 45 */ 1, { -2, -4 } }, - { /* 46 */ 1, { 4, -2 } }, - { /* 47 */ 1, { 3, -4 } }, - { /* 48 */ 1, { -4, -3 } }, - { /* 49 */ 1, { -4, 3 } }, - { /* 50 */ 1, { 3, 4 } }, - { /* 51 */ 1, { -3, 4 } }, - { /* 52 */ 1, { 4, 3 } }, - { /* 53 */ 1, { 4, -3 } }, - { /* 54 */ 1, { -3, -4 } }, - { /* 55 */ 0, { 2, 3 } }, - { /* 56 */ 0, { 3, 4 } }, - { /* 57 */ 1, { 4, -4 } }, - { /* 58 */ 1, { -4, 4 } }, - { /* 59 */ 1, { 4, 4 } }, - { /* 60 */ 1, { -4, -4 } } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_5.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* Binary search huffman table HCB_5 */ + + +static hcb_bin_pair hcb5[] = { + { /* 0 */ 0, { 1, 2 } }, + { /* 1 */ 1, { 0, 0 } }, /* 0 */ + { /* 2 */ 0, { 1, 2 } }, + { /* 3 */ 0, { 2, 3 } }, + { /* 4 */ 0, { 3, 4 } }, + { /* 5 */ 0, { 4, 5 } }, + { /* 6 */ 0, { 5, 6 } }, + { /* 7 */ 0, { 6, 7 } }, + { /* 8 */ 0, { 7, 8 } }, + { /* 9 */ 1, { -1, 0 } }, /* 1000 */ + { /* 10 */ 1, { 1, 0 } }, /* 1001 */ + { /* 11 */ 1, { 0, 1 } }, /* 1010 */ + { /* 12 */ 1, { 0, -1 } }, /* 1011 */ + { /* 13 */ 0, { 4, 5 } }, + { /* 14 */ 0, { 5, 6 } }, + { /* 15 */ 0, { 6, 7 } }, + { /* 16 */ 0, { 7, 8 } }, + { /* 17 */ 1, { 1, -1 } }, + { /* 18 */ 1, { -1, 1 } }, + { /* 19 */ 1, { -1, -1 } }, + { /* 20 */ 1, { 1, 1 } }, + { /* 21 */ 0, { 4, 5 } }, + { /* 22 */ 0, { 5, 6 } }, + { /* 23 */ 0, { 6, 7 } }, + { /* 24 */ 0, { 7, 8 } }, + { /* 25 */ 0, { 8, 9 } }, + { /* 26 */ 0, { 9, 10 } }, + { /* 27 */ 0, { 10, 11 } }, + { /* 28 */ 0, { 11, 12 } }, + { /* 29 */ 0, { 12, 13 } }, + { /* 30 */ 0, { 13, 14 } }, + { /* 31 */ 0, { 14, 15 } }, + { /* 32 */ 0, { 15, 16 } }, + { /* 33 */ 1, { -2, 0 } }, + { /* 34 */ 1, { 0, 2 } }, + { /* 35 */ 1, { 2, 0 } }, + { /* 36 */ 1, { 0, -2 } }, + { /* 37 */ 0, { 12, 13 } }, + { /* 38 */ 0, { 13, 14 } }, + { /* 39 */ 0, { 14, 15 } }, + { /* 40 */ 0, { 15, 16 } }, + { /* 41 */ 0, { 16, 17 } }, + { /* 42 */ 0, { 17, 18 } }, + { /* 43 */ 0, { 18, 19 } }, + { /* 44 */ 0, { 19, 20 } }, + { /* 45 */ 0, { 20, 21 } }, + { /* 46 */ 0, { 21, 22 } }, + { /* 47 */ 0, { 22, 23 } }, + { /* 48 */ 0, { 23, 24 } }, + { /* 49 */ 1, { -2, -1 } }, + { /* 50 */ 1, { 2, 1 } }, + { /* 51 */ 1, { -1, -2 } }, + { /* 52 */ 1, { 1, 2 } }, + { /* 53 */ 1, { -2, 1 } }, + { /* 54 */ 1, { 2, -1 } }, + { /* 55 */ 1, { -1, 2 } }, + { /* 56 */ 1, { 1, -2 } }, + { /* 57 */ 1, { -3, 0 } }, + { /* 58 */ 1, { 3, 0 } }, + { /* 59 */ 1, { 0, -3 } }, + { /* 60 */ 1, { 0, 3 } }, + { /* 61 */ 0, { 12, 13 } }, + { /* 62 */ 0, { 13, 14 } }, + { /* 63 */ 0, { 14, 15 } }, + { /* 64 */ 0, { 15, 16 } }, + { /* 65 */ 0, { 16, 17 } }, + { /* 66 */ 0, { 17, 18 } }, + { /* 67 */ 0, { 18, 19 } }, + { /* 68 */ 0, { 19, 20 } }, + { /* 69 */ 0, { 20, 21 } }, + { /* 70 */ 0, { 21, 22 } }, + { /* 71 */ 0, { 22, 23 } }, + { /* 72 */ 0, { 23, 24 } }, + { /* 73 */ 1, { -3, -1 } }, + { /* 74 */ 1, { 1, 3 } }, + { /* 75 */ 1, { 3, 1 } }, + { /* 76 */ 1, { -1, -3 } }, + { /* 77 */ 1, { -3, 1 } }, + { /* 78 */ 1, { 3, -1 } }, + { /* 79 */ 1, { 1, -3 } }, + { /* 80 */ 1, { -1, 3 } }, + { /* 81 */ 1, { -2, 2 } }, + { /* 82 */ 1, { 2, 2 } }, + { /* 83 */ 1, { -2, -2 } }, + { /* 84 */ 1, { 2, -2 } }, + { /* 85 */ 0, { 12, 13 } }, + { /* 86 */ 0, { 13, 14 } }, + { /* 87 */ 0, { 14, 15 } }, + { /* 88 */ 0, { 15, 16 } }, + { /* 89 */ 0, { 16, 17 } }, + { /* 90 */ 0, { 17, 18 } }, + { /* 91 */ 0, { 18, 19 } }, + { /* 92 */ 0, { 19, 20 } }, + { /* 93 */ 0, { 20, 21 } }, + { /* 94 */ 0, { 21, 22 } }, + { /* 95 */ 0, { 22, 23 } }, + { /* 96 */ 0, { 23, 24 } }, + { /* 97 */ 1, { -3, -2 } }, + { /* 98 */ 1, { 3, -2 } }, + { /* 99 */ 1, { -2, 3 } }, + { /* 00 */ 1, { 2, -3 } }, + { /* 01 */ 1, { 3, 2 } }, + { /* 02 */ 1, { 2, 3 } }, + { /* 03 */ 1, { -3, 2 } }, + { /* 04 */ 1, { -2, -3 } }, + { /* 05 */ 1, { 0, -4 } }, + { /* 06 */ 1, { -4, 0 } }, + { /* 07 */ 1, { 4, 1 } }, + { /* 08 */ 1, { 4, 0 } }, + { /* 09 */ 0, { 12, 13 } }, + { /* 10 */ 0, { 13, 14 } }, + { /* 11 */ 0, { 14, 15 } }, + { /* 12 */ 0, { 15, 16 } }, + { /* 13 */ 0, { 16, 17 } }, + { /* 14 */ 0, { 17, 18 } }, + { /* 15 */ 0, { 18, 19 } }, + { /* 16 */ 0, { 19, 20 } }, + { /* 17 */ 0, { 20, 21 } }, + { /* 18 */ 0, { 21, 22 } }, + { /* 19 */ 0, { 22, 23 } }, + { /* 20 */ 0, { 23, 24 } }, + { /* 21 */ 1, { -4, -1 } }, + { /* 22 */ 1, { 0, 4 } }, + { /* 23 */ 1, { 4, -1 } }, + { /* 24 */ 1, { -1, -4 } }, + { /* 25 */ 1, { 1, 4 } }, + { /* 26 */ 1, { -1, 4 } }, + { /* 27 */ 1, { -4, 1 } }, + { /* 28 */ 1, { 1, -4 } }, + { /* 29 */ 1, { 3, -3 } }, + { /* 30 */ 1, { -3, -3 } }, + { /* 31 */ 1, { -3, 3 } }, + { /* 32 */ 1, { -2, 4 } }, + { /* 33 */ 1, { -4, -2 } }, + { /* 34 */ 1, { 4, 2 } }, + { /* 35 */ 1, { 2, -4 } }, + { /* 36 */ 1, { 2, 4 } }, + { /* 37 */ 1, { 3, 3 } }, + { /* 38 */ 1, { -4, 2 } }, + { /* 39 */ 0, { 6, 7 } }, + { /* 40 */ 0, { 7, 8 } }, + { /* 41 */ 0, { 8, 9 } }, + { /* 42 */ 0, { 9, 10 } }, + { /* 43 */ 0, { 10, 11 } }, + { /* 44 */ 0, { 11, 12 } }, + { /* 45 */ 1, { -2, -4 } }, + { /* 46 */ 1, { 4, -2 } }, + { /* 47 */ 1, { 3, -4 } }, + { /* 48 */ 1, { -4, -3 } }, + { /* 49 */ 1, { -4, 3 } }, + { /* 50 */ 1, { 3, 4 } }, + { /* 51 */ 1, { -3, 4 } }, + { /* 52 */ 1, { 4, 3 } }, + { /* 53 */ 1, { 4, -3 } }, + { /* 54 */ 1, { -3, -4 } }, + { /* 55 */ 0, { 2, 3 } }, + { /* 56 */ 0, { 3, 4 } }, + { /* 57 */ 1, { 4, -4 } }, + { /* 58 */ 1, { -4, 4 } }, + { /* 59 */ 1, { 4, 4 } }, + { /* 60 */ 1, { -4, -4 } } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_6.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_6.h old mode 100644 new mode 100755 index 07b536401..2181d63d5 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_6.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_6.h @@ -1,179 +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: hcb_6.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_6 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb6_1[] = { - /* 4 bit codewords */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* 00010 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00100 */ 2, 0 }, - { /* */ 2, 0 }, - { /* 00110 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 01000 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 01010 */ 5, 0 }, - { /* */ 5, 0 }, - { /* 01100 */ 6, 0 }, - { /* */ 6, 0 }, - { /* 01110 */ 7, 0 }, - { /* */ 7, 0 }, - { /* 10000 */ 8, 0 }, - { /* */ 8, 0 }, - - /* 6 bit codewords */ - { /* 10010 */ 9, 1 }, - { /* 10011 */ 11, 1 }, - { /* 10100 */ 13, 1 }, - { /* 10101 */ 15, 1 }, - { /* 10110 */ 17, 1 }, - { /* 10111 */ 19, 1 }, - { /* 11000 */ 21, 1 }, - { /* 11001 */ 23, 1 }, - - /* 7 bit codewords */ - { /* 11010 */ 25, 2 }, - { /* 11011 */ 29, 2 }, - { /* 11100 */ 33, 2 }, - - /* 7/8 bit codewords */ - { /* 11101 */ 37, 3 }, - - /* 8/9 bit codewords */ - { /* 11110 */ 45, 4 }, - - /* 9/10/11 bit codewords */ - { /* 11111 */ 61, 6 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb6_2[] = { - /* 4 bit codewords */ - { 4, 0, 0 }, - { 4, 1, 0 }, - { 4, 0, -1 }, - { 4, 0, 1 }, - { 4, -1, 0 }, - { 4, 1, 1 }, - { 4, -1, 1 }, - { 4, 1, -1 }, - { 4, -1, -1 }, - - /* 6 bit codewords */ - { 6, 2, -1 }, - { 6, 2, 1 }, - { 6, -2, 1 }, - { 6, -2, -1 }, - { 6, -2, 0 }, - { 6, -1, 2 }, - { 6, 2, 0 }, - { 6, 1, -2 }, - { 6, 1, 2 }, - { 6, 0, -2 }, - { 6, -1, -2 }, - { 6, 0, 2 }, - { 6, 2, -2 }, - { 6, -2, 2 }, - { 6, -2, -2 }, - { 6, 2, 2 }, - - /* 7 bit codewords */ - { 7, -3, 1 }, - { 7, 3, 1 }, - { 7, 3, -1 }, - { 7, -1, 3 }, - { 7, -3, -1 }, - { 7, 1, 3 }, - { 7, 1, -3 }, - { 7, -1, -3 }, - { 7, 3, 0 }, - { 7, -3, 0 }, - { 7, 0, -3 }, - { 7, 0, 3 }, - - /* 7/8 bit codewords */ - { 7, 3, 2 }, { 7, 3, 2 }, - { 8, -3, -2 }, - { 8, -2, 3 }, - { 8, 2, 3 }, - { 8, 3, -2 }, - { 8, 2, -3 }, - { 8, -2, -3 }, - - /* 8 bit codewords */ - { 8, -3, 2 }, { 8, -3, 2 }, - { 8, 3, 3 }, { 8, 3, 3 }, - { 9, 3, -3 }, - { 9, -3, -3 }, - { 9, -3, 3 }, - { 9, 1, -4 }, - { 9, -1, -4 }, - { 9, 4, 1 }, - { 9, -4, 1 }, - { 9, -4, -1 }, - { 9, 1, 4 }, - { 9, 4, -1 }, - { 9, -1, 4 }, - { 9, 0, -4 }, - - /* 9/10/11 bit codewords */ - { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, - { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, - { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, - { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, - { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, - { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, - { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, - { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, - { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, - { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, - { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, - { 10, -3, -4 }, { 10, -3, -4 }, - { 10, -3, 4 }, { 10, -3, 4 }, - { 10, 3, -4 }, { 10, 3, -4 }, - { 10, 4, -3 }, { 10, 4, -3 }, - { 10, 3, 4 }, { 10, 3, 4 }, - { 10, 4, 3 }, { 10, 4, 3 }, - { 10, -4, 3 }, { 10, -4, 3 }, - { 10, -4, -3 }, { 10, -4, -3 }, - { 11, 4, 4 }, - { 11, -4, 4 }, - { 11, -4, -4 }, - { 11, 4, -4 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_6.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_6 */ + + +/* 1st step: 5 bits + * 2^5 = 32 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb6_1[] = { + /* 4 bit codewords */ + { /* 00000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* 00010 */ 1, 0 }, + { /* */ 1, 0 }, + { /* 00100 */ 2, 0 }, + { /* */ 2, 0 }, + { /* 00110 */ 3, 0 }, + { /* */ 3, 0 }, + { /* 01000 */ 4, 0 }, + { /* */ 4, 0 }, + { /* 01010 */ 5, 0 }, + { /* */ 5, 0 }, + { /* 01100 */ 6, 0 }, + { /* */ 6, 0 }, + { /* 01110 */ 7, 0 }, + { /* */ 7, 0 }, + { /* 10000 */ 8, 0 }, + { /* */ 8, 0 }, + + /* 6 bit codewords */ + { /* 10010 */ 9, 1 }, + { /* 10011 */ 11, 1 }, + { /* 10100 */ 13, 1 }, + { /* 10101 */ 15, 1 }, + { /* 10110 */ 17, 1 }, + { /* 10111 */ 19, 1 }, + { /* 11000 */ 21, 1 }, + { /* 11001 */ 23, 1 }, + + /* 7 bit codewords */ + { /* 11010 */ 25, 2 }, + { /* 11011 */ 29, 2 }, + { /* 11100 */ 33, 2 }, + + /* 7/8 bit codewords */ + { /* 11101 */ 37, 3 }, + + /* 8/9 bit codewords */ + { /* 11110 */ 45, 4 }, + + /* 9/10/11 bit codewords */ + { /* 11111 */ 61, 6 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_pair hcb6_2[] = { + /* 4 bit codewords */ + { 4, 0, 0 }, + { 4, 1, 0 }, + { 4, 0, -1 }, + { 4, 0, 1 }, + { 4, -1, 0 }, + { 4, 1, 1 }, + { 4, -1, 1 }, + { 4, 1, -1 }, + { 4, -1, -1 }, + + /* 6 bit codewords */ + { 6, 2, -1 }, + { 6, 2, 1 }, + { 6, -2, 1 }, + { 6, -2, -1 }, + { 6, -2, 0 }, + { 6, -1, 2 }, + { 6, 2, 0 }, + { 6, 1, -2 }, + { 6, 1, 2 }, + { 6, 0, -2 }, + { 6, -1, -2 }, + { 6, 0, 2 }, + { 6, 2, -2 }, + { 6, -2, 2 }, + { 6, -2, -2 }, + { 6, 2, 2 }, + + /* 7 bit codewords */ + { 7, -3, 1 }, + { 7, 3, 1 }, + { 7, 3, -1 }, + { 7, -1, 3 }, + { 7, -3, -1 }, + { 7, 1, 3 }, + { 7, 1, -3 }, + { 7, -1, -3 }, + { 7, 3, 0 }, + { 7, -3, 0 }, + { 7, 0, -3 }, + { 7, 0, 3 }, + + /* 7/8 bit codewords */ + { 7, 3, 2 }, { 7, 3, 2 }, + { 8, -3, -2 }, + { 8, -2, 3 }, + { 8, 2, 3 }, + { 8, 3, -2 }, + { 8, 2, -3 }, + { 8, -2, -3 }, + + /* 8 bit codewords */ + { 8, -3, 2 }, { 8, -3, 2 }, + { 8, 3, 3 }, { 8, 3, 3 }, + { 9, 3, -3 }, + { 9, -3, -3 }, + { 9, -3, 3 }, + { 9, 1, -4 }, + { 9, -1, -4 }, + { 9, 4, 1 }, + { 9, -4, 1 }, + { 9, -4, -1 }, + { 9, 1, 4 }, + { 9, 4, -1 }, + { 9, -1, 4 }, + { 9, 0, -4 }, + + /* 9/10/11 bit codewords */ + { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, + { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, + { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, + { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, + { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, + { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, + { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, + { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, + { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, + { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, + { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, + { 10, -3, -4 }, { 10, -3, -4 }, + { 10, -3, 4 }, { 10, -3, 4 }, + { 10, 3, -4 }, { 10, 3, -4 }, + { 10, 4, -3 }, { 10, 4, -3 }, + { 10, 3, 4 }, { 10, 3, 4 }, + { 10, 4, 3 }, { 10, 4, 3 }, + { 10, -4, 3 }, { 10, -4, 3 }, + { 10, -4, -3 }, { 10, -4, -3 }, + { 11, 4, 4 }, + { 11, -4, 4 }, + { 11, -4, -4 }, + { 11, 4, -4 } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_7.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_7.h old mode 100644 new mode 100755 index 7fd0528fc..54c85c11d --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_7.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_7.h @@ -1,159 +1,162 @@ -/* -** 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: hcb_7.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* Binary search huffman table HCB_7 */ - - -static hcb_bin_pair hcb7[] = { - { /* 0 */ 0, { 1, 2 } }, - { /* 1 */ 1, { 0, 0 } }, - { /* 2 */ 0, { 1, 2 } }, - { /* 3 */ 0, { 2, 3 } }, - { /* 4 */ 0, { 3, 4 } }, - { /* 5 */ 1, { 1, 0 } }, - { /* 6 */ 1, { 0, 1 } }, - { /* 7 */ 0, { 2, 3 } }, - { /* 8 */ 0, { 3, 4 } }, - { /* 9 */ 1, { 1, 1 } }, - { /* 10 */ 0, { 3, 4 } }, - { /* 11 */ 0, { 4, 5 } }, - { /* 12 */ 0, { 5, 6 } }, - { /* 13 */ 0, { 6, 7 } }, - { /* 14 */ 0, { 7, 8 } }, - { /* 15 */ 0, { 8, 9 } }, - { /* 16 */ 0, { 9, 10 } }, - { /* 17 */ 0, { 10, 11 } }, - { /* 18 */ 0, { 11, 12 } }, - { /* 19 */ 1, { 2, 1 } }, - { /* 20 */ 1, { 1, 2 } }, - { /* 21 */ 1, { 2, 0 } }, - { /* 22 */ 1, { 0, 2 } }, - { /* 23 */ 0, { 8, 9 } }, - { /* 24 */ 0, { 9, 10 } }, - { /* 25 */ 0, { 10, 11 } }, - { /* 26 */ 0, { 11, 12 } }, - { /* 27 */ 0, { 12, 13 } }, - { /* 28 */ 0, { 13, 14 } }, - { /* 29 */ 0, { 14, 15 } }, - { /* 30 */ 0, { 15, 16 } }, - { /* 31 */ 1, { 3, 1 } }, - { /* 32 */ 1, { 1, 3 } }, - { /* 33 */ 1, { 2, 2 } }, - { /* 34 */ 1, { 3, 0 } }, - { /* 35 */ 1, { 0, 3 } }, - { /* 36 */ 0, { 11, 12 } }, - { /* 37 */ 0, { 12, 13 } }, - { /* 38 */ 0, { 13, 14 } }, - { /* 39 */ 0, { 14, 15 } }, - { /* 40 */ 0, { 15, 16 } }, - { /* 41 */ 0, { 16, 17 } }, - { /* 42 */ 0, { 17, 18 } }, - { /* 43 */ 0, { 18, 19 } }, - { /* 44 */ 0, { 19, 20 } }, - { /* 45 */ 0, { 20, 21 } }, - { /* 46 */ 0, { 21, 22 } }, - { /* 47 */ 1, { 2, 3 } }, - { /* 48 */ 1, { 3, 2 } }, - { /* 49 */ 1, { 1, 4 } }, - { /* 50 */ 1, { 4, 1 } }, - { /* 51 */ 1, { 1, 5 } }, - { /* 52 */ 1, { 5, 1 } }, - { /* 53 */ 1, { 3, 3 } }, - { /* 54 */ 1, { 2, 4 } }, - { /* 55 */ 1, { 0, 4 } }, - { /* 56 */ 1, { 4, 0 } }, - { /* 57 */ 0, { 12, 13 } }, - { /* 58 */ 0, { 13, 14 } }, - { /* 59 */ 0, { 14, 15 } }, - { /* 60 */ 0, { 15, 16 } }, - { /* 61 */ 0, { 16, 17 } }, - { /* 62 */ 0, { 17, 18 } }, - { /* 63 */ 0, { 18, 19 } }, - { /* 64 */ 0, { 19, 20 } }, - { /* 65 */ 0, { 20, 21 } }, - { /* 66 */ 0, { 21, 22 } }, - { /* 67 */ 0, { 22, 23 } }, - { /* 68 */ 0, { 23, 24 } }, - { /* 69 */ 1, { 4, 2 } }, - { /* 70 */ 1, { 2, 5 } }, - { /* 71 */ 1, { 5, 2 } }, - { /* 72 */ 1, { 0, 5 } }, - { /* 73 */ 1, { 6, 1 } }, - { /* 74 */ 1, { 5, 0 } }, - { /* 75 */ 1, { 1, 6 } }, - { /* 76 */ 1, { 4, 3 } }, - { /* 77 */ 1, { 3, 5 } }, - { /* 78 */ 1, { 3, 4 } }, - { /* 79 */ 1, { 5, 3 } }, - { /* 80 */ 1, { 2, 6 } }, - { /* 81 */ 1, { 6, 2 } }, - { /* 82 */ 1, { 1, 7 } }, - { /* 83 */ 0, { 10, 11 } }, - { /* 84 */ 0, { 11, 12 } }, - { /* 85 */ 0, { 12, 13 } }, - { /* 86 */ 0, { 13, 14 } }, - { /* 87 */ 0, { 14, 15 } }, - { /* 88 */ 0, { 15, 16 } }, - { /* 89 */ 0, { 16, 17 } }, - { /* 90 */ 0, { 17, 18 } }, - { /* 91 */ 0, { 18, 19 } }, - { /* 92 */ 0, { 19, 20 } }, - { /* 93 */ 1, { 3, 6 } }, - { /* 94 */ 1, { 0, 6 } }, - { /* 95 */ 1, { 6, 0 } }, - { /* 96 */ 1, { 4, 4 } }, - { /* 97 */ 1, { 7, 1 } }, - { /* 98 */ 1, { 4, 5 } }, - { /* 99 */ 1, { 7, 2 } }, - { /* 00 */ 1, { 5, 4 } }, - { /* 01 */ 1, { 6, 3 } }, - { /* 02 */ 1, { 2, 7 } }, - { /* 03 */ 1, { 7, 3 } }, - { /* 04 */ 1, { 6, 4 } }, - { /* 05 */ 1, { 5, 5 } }, - { /* 06 */ 1, { 4, 6 } }, - { /* 07 */ 1, { 3, 7 } }, - { /* 08 */ 0, { 5, 6 } }, - { /* 09 */ 0, { 6, 7 } }, - { /* 10 */ 0, { 7, 8 } }, - { /* 11 */ 0, { 8, 9 } }, - { /* 12 */ 0, { 9, 10 } }, - { /* 13 */ 1, { 7, 0 } }, - { /* 14 */ 1, { 0, 7 } }, - { /* 15 */ 1, { 6, 5 } }, - { /* 16 */ 1, { 5, 6 } }, - { /* 17 */ 1, { 7, 4 } }, - { /* 18 */ 1, { 4, 7 } }, - { /* 19 */ 1, { 5, 7 } }, - { /* 20 */ 1, { 7, 5 } }, - { /* 21 */ 0, { 2, 3 } }, - { /* 22 */ 0, { 3, 4 } }, - { /* 23 */ 1, { 7, 6 } }, - { /* 24 */ 1, { 6, 6 } }, - { /* 25 */ 1, { 6, 7 } }, - { /* 26 */ 1, { 7, 7 } } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_7.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* Binary search huffman table HCB_7 */ + + +static hcb_bin_pair hcb7[] = { + { /* 0 */ 0, { 1, 2 } }, + { /* 1 */ 1, { 0, 0 } }, + { /* 2 */ 0, { 1, 2 } }, + { /* 3 */ 0, { 2, 3 } }, + { /* 4 */ 0, { 3, 4 } }, + { /* 5 */ 1, { 1, 0 } }, + { /* 6 */ 1, { 0, 1 } }, + { /* 7 */ 0, { 2, 3 } }, + { /* 8 */ 0, { 3, 4 } }, + { /* 9 */ 1, { 1, 1 } }, + { /* 10 */ 0, { 3, 4 } }, + { /* 11 */ 0, { 4, 5 } }, + { /* 12 */ 0, { 5, 6 } }, + { /* 13 */ 0, { 6, 7 } }, + { /* 14 */ 0, { 7, 8 } }, + { /* 15 */ 0, { 8, 9 } }, + { /* 16 */ 0, { 9, 10 } }, + { /* 17 */ 0, { 10, 11 } }, + { /* 18 */ 0, { 11, 12 } }, + { /* 19 */ 1, { 2, 1 } }, + { /* 20 */ 1, { 1, 2 } }, + { /* 21 */ 1, { 2, 0 } }, + { /* 22 */ 1, { 0, 2 } }, + { /* 23 */ 0, { 8, 9 } }, + { /* 24 */ 0, { 9, 10 } }, + { /* 25 */ 0, { 10, 11 } }, + { /* 26 */ 0, { 11, 12 } }, + { /* 27 */ 0, { 12, 13 } }, + { /* 28 */ 0, { 13, 14 } }, + { /* 29 */ 0, { 14, 15 } }, + { /* 30 */ 0, { 15, 16 } }, + { /* 31 */ 1, { 3, 1 } }, + { /* 32 */ 1, { 1, 3 } }, + { /* 33 */ 1, { 2, 2 } }, + { /* 34 */ 1, { 3, 0 } }, + { /* 35 */ 1, { 0, 3 } }, + { /* 36 */ 0, { 11, 12 } }, + { /* 37 */ 0, { 12, 13 } }, + { /* 38 */ 0, { 13, 14 } }, + { /* 39 */ 0, { 14, 15 } }, + { /* 40 */ 0, { 15, 16 } }, + { /* 41 */ 0, { 16, 17 } }, + { /* 42 */ 0, { 17, 18 } }, + { /* 43 */ 0, { 18, 19 } }, + { /* 44 */ 0, { 19, 20 } }, + { /* 45 */ 0, { 20, 21 } }, + { /* 46 */ 0, { 21, 22 } }, + { /* 47 */ 1, { 2, 3 } }, + { /* 48 */ 1, { 3, 2 } }, + { /* 49 */ 1, { 1, 4 } }, + { /* 50 */ 1, { 4, 1 } }, + { /* 51 */ 1, { 1, 5 } }, + { /* 52 */ 1, { 5, 1 } }, + { /* 53 */ 1, { 3, 3 } }, + { /* 54 */ 1, { 2, 4 } }, + { /* 55 */ 1, { 0, 4 } }, + { /* 56 */ 1, { 4, 0 } }, + { /* 57 */ 0, { 12, 13 } }, + { /* 58 */ 0, { 13, 14 } }, + { /* 59 */ 0, { 14, 15 } }, + { /* 60 */ 0, { 15, 16 } }, + { /* 61 */ 0, { 16, 17 } }, + { /* 62 */ 0, { 17, 18 } }, + { /* 63 */ 0, { 18, 19 } }, + { /* 64 */ 0, { 19, 20 } }, + { /* 65 */ 0, { 20, 21 } }, + { /* 66 */ 0, { 21, 22 } }, + { /* 67 */ 0, { 22, 23 } }, + { /* 68 */ 0, { 23, 24 } }, + { /* 69 */ 1, { 4, 2 } }, + { /* 70 */ 1, { 2, 5 } }, + { /* 71 */ 1, { 5, 2 } }, + { /* 72 */ 1, { 0, 5 } }, + { /* 73 */ 1, { 6, 1 } }, + { /* 74 */ 1, { 5, 0 } }, + { /* 75 */ 1, { 1, 6 } }, + { /* 76 */ 1, { 4, 3 } }, + { /* 77 */ 1, { 3, 5 } }, + { /* 78 */ 1, { 3, 4 } }, + { /* 79 */ 1, { 5, 3 } }, + { /* 80 */ 1, { 2, 6 } }, + { /* 81 */ 1, { 6, 2 } }, + { /* 82 */ 1, { 1, 7 } }, + { /* 83 */ 0, { 10, 11 } }, + { /* 84 */ 0, { 11, 12 } }, + { /* 85 */ 0, { 12, 13 } }, + { /* 86 */ 0, { 13, 14 } }, + { /* 87 */ 0, { 14, 15 } }, + { /* 88 */ 0, { 15, 16 } }, + { /* 89 */ 0, { 16, 17 } }, + { /* 90 */ 0, { 17, 18 } }, + { /* 91 */ 0, { 18, 19 } }, + { /* 92 */ 0, { 19, 20 } }, + { /* 93 */ 1, { 3, 6 } }, + { /* 94 */ 1, { 0, 6 } }, + { /* 95 */ 1, { 6, 0 } }, + { /* 96 */ 1, { 4, 4 } }, + { /* 97 */ 1, { 7, 1 } }, + { /* 98 */ 1, { 4, 5 } }, + { /* 99 */ 1, { 7, 2 } }, + { /* 00 */ 1, { 5, 4 } }, + { /* 01 */ 1, { 6, 3 } }, + { /* 02 */ 1, { 2, 7 } }, + { /* 03 */ 1, { 7, 3 } }, + { /* 04 */ 1, { 6, 4 } }, + { /* 05 */ 1, { 5, 5 } }, + { /* 06 */ 1, { 4, 6 } }, + { /* 07 */ 1, { 3, 7 } }, + { /* 08 */ 0, { 5, 6 } }, + { /* 09 */ 0, { 6, 7 } }, + { /* 10 */ 0, { 7, 8 } }, + { /* 11 */ 0, { 8, 9 } }, + { /* 12 */ 0, { 9, 10 } }, + { /* 13 */ 1, { 7, 0 } }, + { /* 14 */ 1, { 0, 7 } }, + { /* 15 */ 1, { 6, 5 } }, + { /* 16 */ 1, { 5, 6 } }, + { /* 17 */ 1, { 7, 4 } }, + { /* 18 */ 1, { 4, 7 } }, + { /* 19 */ 1, { 5, 7 } }, + { /* 20 */ 1, { 7, 5 } }, + { /* 21 */ 0, { 2, 3 } }, + { /* 22 */ 0, { 3, 4 } }, + { /* 23 */ 1, { 7, 6 } }, + { /* 24 */ 1, { 6, 6 } }, + { /* 25 */ 1, { 6, 7 } }, + { /* 26 */ 1, { 7, 7 } } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_8.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_8.h old mode 100644 new mode 100755 index 72e844a20..6e3f1009e --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_8.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_8.h @@ -1,170 +1,173 @@ -/* -** 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: hcb_8.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* 2-step huffman table HCB_8 */ - - -/* 1st step: 5 bits - * 2^5 = 32 entries - * - * Used to find offset into 2nd step table and number of extra bits to get - */ -static hcb hcb8_1[] = { - /* 3 bit codeword */ - { /* 00000 */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - { /* */ 0, 0 }, - - /* 4 bit codewords */ - { /* 00100 */ 1, 0 }, - { /* */ 1, 0 }, - { /* 00110 */ 2, 0 }, - { /* */ 2, 0 }, - { /* 01000 */ 3, 0 }, - { /* */ 3, 0 }, - { /* 01010 */ 4, 0 }, - { /* */ 4, 0 }, - { /* 01100 */ 5, 0 }, - { /* */ 5, 0 }, - - /* 5 bit codewords */ - { /* 01110 */ 6, 0 }, - { /* 01111 */ 7, 0 }, - { /* 10000 */ 8, 0 }, - { /* 10001 */ 9, 0 }, - { /* 10010 */ 10, 0 }, - { /* 10011 */ 11, 0 }, - { /* 10100 */ 12, 0 }, - - /* 6 bit codewords */ - { /* 10101 */ 13, 1 }, - { /* 10110 */ 15, 1 }, - { /* 10111 */ 17, 1 }, - { /* 11000 */ 19, 1 }, - { /* 11001 */ 21, 1 }, - - /* 7 bit codewords */ - { /* 11010 */ 23, 2 }, - { /* 11011 */ 27, 2 }, - { /* 11100 */ 31, 2 }, - - /* 7/8 bit codewords */ - { /* 11101 */ 35, 3 }, - - /* 8 bit codewords */ - { /* 11110 */ 43, 3 }, - - /* 8/9/10 bit codewords */ - { /* 11111 */ 51, 5 } -}; - -/* 2nd step table - * - * Gives size of codeword and actual data (x,y,v,w) - */ -static hcb_2_pair hcb8_2[] = { - /* 3 bit codeword */ - { 3, 1, 1 }, - - /* 4 bit codewords */ - { 4, 2, 1 }, - { 4, 1, 0 }, - { 4, 1, 2 }, - { 4, 0, 1 }, - { 4, 2, 2 }, - - /* 5 bit codewords */ - { 5, 0, 0 }, - { 5, 2, 0 }, - { 5, 0, 2 }, - { 5, 3, 1 }, - { 5, 1, 3 }, - { 5, 3, 2 }, - { 5, 2, 3 }, - - /* 6 bit codewords */ - { 6, 3, 3 }, - { 6, 4, 1 }, - { 6, 1, 4 }, - { 6, 4, 2 }, - { 6, 2, 4 }, - { 6, 3, 0 }, - { 6, 0, 3 }, - { 6, 4, 3 }, - { 6, 3, 4 }, - { 6, 5, 2 }, - - /* 7 bit codewords */ - { 7, 5, 1 }, - { 7, 2, 5 }, - { 7, 1, 5 }, - { 7, 5, 3 }, - { 7, 3, 5 }, - { 7, 4, 4 }, - { 7, 5, 4 }, - { 7, 0, 4 }, - { 7, 4, 5 }, - { 7, 4, 0 }, - { 7, 2, 6 }, - { 7, 6, 2 }, - - /* 7/8 bit codewords */ - { 7, 6, 1 }, { 7, 6, 1 }, - { 7, 1, 6 }, { 7, 1, 6 }, - { 8, 3, 6 }, - { 8, 6, 3 }, - { 8, 5, 5 }, - { 8, 5, 0 }, - - /* 8 bit codewords */ - { 8, 6, 4 }, - { 8, 0, 5 }, - { 8, 4, 6 }, - { 8, 7, 1 }, - { 8, 7, 2 }, - { 8, 2, 7 }, - { 8, 6, 5 }, - { 8, 7, 3 }, - - /* 8/9/10 bit codewords */ - { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, - { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, - { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, - { 9, 6, 6 }, { 9, 6, 6 }, - { 9, 7, 4 }, { 9, 7, 4 }, - { 9, 6, 0 }, { 9, 6, 0 }, - { 9, 4, 7 }, { 9, 4, 7 }, - { 9, 0, 6 }, { 9, 0, 6 }, - { 9, 7, 5 }, { 9, 7, 5 }, - { 9, 7, 6 }, { 9, 7, 6 }, - { 9, 6, 7 }, { 9, 6, 7 }, - { 10, 5, 7 }, - { 10, 7, 0 }, - { 10, 0, 7 }, - { 10, 7, 7 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_8.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* 2-step huffman table HCB_8 */ + + +/* 1st step: 5 bits + * 2^5 = 32 entries + * + * Used to find offset into 2nd step table and number of extra bits to get + */ +static hcb hcb8_1[] = { + /* 3 bit codeword */ + { /* 00000 */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + { /* */ 0, 0 }, + + /* 4 bit codewords */ + { /* 00100 */ 1, 0 }, + { /* */ 1, 0 }, + { /* 00110 */ 2, 0 }, + { /* */ 2, 0 }, + { /* 01000 */ 3, 0 }, + { /* */ 3, 0 }, + { /* 01010 */ 4, 0 }, + { /* */ 4, 0 }, + { /* 01100 */ 5, 0 }, + { /* */ 5, 0 }, + + /* 5 bit codewords */ + { /* 01110 */ 6, 0 }, + { /* 01111 */ 7, 0 }, + { /* 10000 */ 8, 0 }, + { /* 10001 */ 9, 0 }, + { /* 10010 */ 10, 0 }, + { /* 10011 */ 11, 0 }, + { /* 10100 */ 12, 0 }, + + /* 6 bit codewords */ + { /* 10101 */ 13, 1 }, + { /* 10110 */ 15, 1 }, + { /* 10111 */ 17, 1 }, + { /* 11000 */ 19, 1 }, + { /* 11001 */ 21, 1 }, + + /* 7 bit codewords */ + { /* 11010 */ 23, 2 }, + { /* 11011 */ 27, 2 }, + { /* 11100 */ 31, 2 }, + + /* 7/8 bit codewords */ + { /* 11101 */ 35, 3 }, + + /* 8 bit codewords */ + { /* 11110 */ 43, 3 }, + + /* 8/9/10 bit codewords */ + { /* 11111 */ 51, 5 } +}; + +/* 2nd step table + * + * Gives size of codeword and actual data (x,y,v,w) + */ +static hcb_2_pair hcb8_2[] = { + /* 3 bit codeword */ + { 3, 1, 1 }, + + /* 4 bit codewords */ + { 4, 2, 1 }, + { 4, 1, 0 }, + { 4, 1, 2 }, + { 4, 0, 1 }, + { 4, 2, 2 }, + + /* 5 bit codewords */ + { 5, 0, 0 }, + { 5, 2, 0 }, + { 5, 0, 2 }, + { 5, 3, 1 }, + { 5, 1, 3 }, + { 5, 3, 2 }, + { 5, 2, 3 }, + + /* 6 bit codewords */ + { 6, 3, 3 }, + { 6, 4, 1 }, + { 6, 1, 4 }, + { 6, 4, 2 }, + { 6, 2, 4 }, + { 6, 3, 0 }, + { 6, 0, 3 }, + { 6, 4, 3 }, + { 6, 3, 4 }, + { 6, 5, 2 }, + + /* 7 bit codewords */ + { 7, 5, 1 }, + { 7, 2, 5 }, + { 7, 1, 5 }, + { 7, 5, 3 }, + { 7, 3, 5 }, + { 7, 4, 4 }, + { 7, 5, 4 }, + { 7, 0, 4 }, + { 7, 4, 5 }, + { 7, 4, 0 }, + { 7, 2, 6 }, + { 7, 6, 2 }, + + /* 7/8 bit codewords */ + { 7, 6, 1 }, { 7, 6, 1 }, + { 7, 1, 6 }, { 7, 1, 6 }, + { 8, 3, 6 }, + { 8, 6, 3 }, + { 8, 5, 5 }, + { 8, 5, 0 }, + + /* 8 bit codewords */ + { 8, 6, 4 }, + { 8, 0, 5 }, + { 8, 4, 6 }, + { 8, 7, 1 }, + { 8, 7, 2 }, + { 8, 2, 7 }, + { 8, 6, 5 }, + { 8, 7, 3 }, + + /* 8/9/10 bit codewords */ + { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, + { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, + { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, + { 9, 6, 6 }, { 9, 6, 6 }, + { 9, 7, 4 }, { 9, 7, 4 }, + { 9, 6, 0 }, { 9, 6, 0 }, + { 9, 4, 7 }, { 9, 4, 7 }, + { 9, 0, 6 }, { 9, 0, 6 }, + { 9, 7, 5 }, { 9, 7, 5 }, + { 9, 7, 6 }, { 9, 7, 6 }, + { 9, 6, 7 }, { 9, 6, 7 }, + { 10, 5, 7 }, + { 10, 7, 0 }, + { 10, 0, 7 }, + { 10, 7, 7 } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_9.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_9.h old mode 100644 new mode 100755 index b40f951a9..bdba2c222 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_9.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_9.h @@ -1,369 +1,372 @@ -/* -** 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: hcb_9.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* Binary search huffman table HCB_9 */ - - -static hcb_bin_pair hcb9[] = { - { /* 0 */ 0, { 1, 2 } }, - { /* 1 */ 1, { 0, 0 } }, - { /* 2 */ 0, { 1, 2 } }, - { /* 3 */ 0, { 2, 3 } }, - { /* 4 */ 0, { 3, 4 } }, - { /* 5 */ 1, { 1, 0 } }, - { /* 6 */ 1, { 0, 1 } }, - { /* 7 */ 0, { 2, 3 } }, - { /* 8 */ 0, { 3, 4 } }, - { /* 9 */ 1, { 1, 1 } }, - { /* 10 */ 0, { 3, 4 } }, - { /* 11 */ 0, { 4, 5 } }, - { /* 12 */ 0, { 5, 6 } }, - { /* 13 */ 0, { 6, 7 } }, - { /* 14 */ 0, { 7, 8 } }, - { /* 15 */ 0, { 8, 9 } }, - { /* 16 */ 0, { 9, 10 } }, - { /* 17 */ 0, { 10, 11 } }, - { /* 18 */ 0, { 11, 12 } }, - { /* 19 */ 1, { 2, 1 } }, - { /* 20 */ 1, { 1, 2 } }, - { /* 21 */ 1, { 2, 0 } }, - { /* 22 */ 1, { 0, 2 } }, - { /* 23 */ 0, { 8, 9 } }, - { /* 24 */ 0, { 9, 10 } }, - { /* 25 */ 0, { 10, 11 } }, - { /* 26 */ 0, { 11, 12 } }, - { /* 27 */ 0, { 12, 13 } }, - { /* 28 */ 0, { 13, 14 } }, - { /* 29 */ 0, { 14, 15 } }, - { /* 30 */ 0, { 15, 16 } }, - { /* 31 */ 1, { 3, 1 } }, - { /* 32 */ 1, { 2, 2 } }, - { /* 33 */ 1, { 1, 3 } }, - { /* 34 */ 0, { 13, 14 } }, - { /* 35 */ 0, { 14, 15 } }, - { /* 36 */ 0, { 15, 16 } }, - { /* 37 */ 0, { 16, 17 } }, - { /* 38 */ 0, { 17, 18 } }, - { /* 39 */ 0, { 18, 19 } }, - { /* 40 */ 0, { 19, 20 } }, - { /* 41 */ 0, { 20, 21 } }, - { /* 42 */ 0, { 21, 22 } }, - { /* 43 */ 0, { 22, 23 } }, - { /* 44 */ 0, { 23, 24 } }, - { /* 45 */ 0, { 24, 25 } }, - { /* 46 */ 0, { 25, 26 } }, - { /* 47 */ 1, { 3, 0 } }, - { /* 48 */ 1, { 0, 3 } }, - { /* 49 */ 1, { 2, 3 } }, - { /* 50 */ 1, { 3, 2 } }, - { /* 51 */ 1, { 1, 4 } }, - { /* 52 */ 1, { 4, 1 } }, - { /* 53 */ 1, { 2, 4 } }, - { /* 54 */ 1, { 1, 5 } }, - { /* 55 */ 0, { 18, 19 } }, - { /* 56 */ 0, { 19, 20 } }, - { /* 57 */ 0, { 20, 21 } }, - { /* 58 */ 0, { 21, 22 } }, - { /* 59 */ 0, { 22, 23 } }, - { /* 60 */ 0, { 23, 24 } }, - { /* 61 */ 0, { 24, 25 } }, - { /* 62 */ 0, { 25, 26 } }, - { /* 63 */ 0, { 26, 27 } }, - { /* 64 */ 0, { 27, 28 } }, - { /* 65 */ 0, { 28, 29 } }, - { /* 66 */ 0, { 29, 30 } }, - { /* 67 */ 0, { 30, 31 } }, - { /* 68 */ 0, { 31, 32 } }, - { /* 69 */ 0, { 32, 33 } }, - { /* 70 */ 0, { 33, 34 } }, - { /* 71 */ 0, { 34, 35 } }, - { /* 72 */ 0, { 35, 36 } }, - { /* 73 */ 1, { 4, 2 } }, - { /* 74 */ 1, { 3, 3 } }, - { /* 75 */ 1, { 0, 4 } }, - { /* 76 */ 1, { 4, 0 } }, - { /* 77 */ 1, { 5, 1 } }, - { /* 78 */ 1, { 2, 5 } }, - { /* 79 */ 1, { 1, 6 } }, - { /* 80 */ 1, { 3, 4 } }, - { /* 81 */ 1, { 5, 2 } }, - { /* 82 */ 1, { 6, 1 } }, - { /* 83 */ 1, { 4, 3 } }, - { /* 84 */ 0, { 25, 26 } }, - { /* 85 */ 0, { 26, 27 } }, - { /* 86 */ 0, { 27, 28 } }, - { /* 87 */ 0, { 28, 29 } }, - { /* 88 */ 0, { 29, 30 } }, - { /* 89 */ 0, { 30, 31 } }, - { /* 90 */ 0, { 31, 32 } }, - { /* 91 */ 0, { 32, 33 } }, - { /* 92 */ 0, { 33, 34 } }, - { /* 93 */ 0, { 34, 35 } }, - { /* 94 */ 0, { 35, 36 } }, - { /* 95 */ 0, { 36, 37 } }, - { /* 96 */ 0, { 37, 38 } }, - { /* 97 */ 0, { 38, 39 } }, - { /* 98 */ 0, { 39, 40 } }, - { /* 99 */ 0, { 40, 41 } }, - { /* 00 */ 0, { 41, 42 } }, - { /* 01 */ 0, { 42, 43 } }, - { /* 02 */ 0, { 43, 44 } }, - { /* 03 */ 0, { 44, 45 } }, - { /* 04 */ 0, { 45, 46 } }, - { /* 05 */ 0, { 46, 47 } }, - { /* 06 */ 0, { 47, 48 } }, - { /* 07 */ 0, { 48, 49 } }, - { /* 08 */ 0, { 49, 50 } }, - { /* 09 */ 1, { 0, 5 } }, - { /* 10 */ 1, { 2, 6 } }, - { /* 11 */ 1, { 5, 0 } }, - { /* 12 */ 1, { 1, 7 } }, - { /* 13 */ 1, { 3, 5 } }, - { /* 14 */ 1, { 1, 8 } }, - { /* 15 */ 1, { 8, 1 } }, - { /* 16 */ 1, { 4, 4 } }, - { /* 17 */ 1, { 5, 3 } }, - { /* 18 */ 1, { 6, 2 } }, - { /* 19 */ 1, { 7, 1 } }, - { /* 20 */ 1, { 0, 6 } }, - { /* 21 */ 1, { 8, 2 } }, - { /* 22 */ 1, { 2, 8 } }, - { /* 23 */ 1, { 3, 6 } }, - { /* 24 */ 1, { 2, 7 } }, - { /* 25 */ 1, { 4, 5 } }, - { /* 26 */ 1, { 9, 1 } }, - { /* 27 */ 1, { 1, 9 } }, - { /* 28 */ 1, { 7, 2 } }, - { /* 29 */ 0, { 30, 31 } }, - { /* 30 */ 0, { 31, 32 } }, - { /* 31 */ 0, { 32, 33 } }, - { /* 32 */ 0, { 33, 34 } }, - { /* 33 */ 0, { 34, 35 } }, - { /* 34 */ 0, { 35, 36 } }, - { /* 35 */ 0, { 36, 37 } }, - { /* 36 */ 0, { 37, 38 } }, - { /* 37 */ 0, { 38, 39 } }, - { /* 38 */ 0, { 39, 40 } }, - { /* 39 */ 0, { 40, 41 } }, - { /* 40 */ 0, { 41, 42 } }, - { /* 41 */ 0, { 42, 43 } }, - { /* 42 */ 0, { 43, 44 } }, - { /* 43 */ 0, { 44, 45 } }, - { /* 44 */ 0, { 45, 46 } }, - { /* 45 */ 0, { 46, 47 } }, - { /* 46 */ 0, { 47, 48 } }, - { /* 47 */ 0, { 48, 49 } }, - { /* 48 */ 0, { 49, 50 } }, - { /* 49 */ 0, { 50, 51 } }, - { /* 50 */ 0, { 51, 52 } }, - { /* 51 */ 0, { 52, 53 } }, - { /* 52 */ 0, { 53, 54 } }, - { /* 53 */ 0, { 54, 55 } }, - { /* 54 */ 0, { 55, 56 } }, - { /* 55 */ 0, { 56, 57 } }, - { /* 56 */ 0, { 57, 58 } }, - { /* 57 */ 0, { 58, 59 } }, - { /* 58 */ 0, { 59, 60 } }, - { /* 59 */ 1, { 6, 0 } }, - { /* 60 */ 1, { 5, 4 } }, - { /* 61 */ 1, { 6, 3 } }, - { /* 62 */ 1, { 8, 3 } }, - { /* 63 */ 1, { 0, 7 } }, - { /* 64 */ 1, { 9, 2 } }, - { /* 65 */ 1, { 3, 8 } }, - { /* 66 */ 1, { 4, 6 } }, - { /* 67 */ 1, { 3, 7 } }, - { /* 68 */ 1, { 0, 8 } }, - { /* 69 */ 1, { 10, 1 } }, - { /* 70 */ 1, { 6, 4 } }, - { /* 71 */ 1, { 2, 9 } }, - { /* 72 */ 1, { 5, 5 } }, - { /* 73 */ 1, { 8, 0 } }, - { /* 74 */ 1, { 7, 0 } }, - { /* 75 */ 1, { 7, 3 } }, - { /* 76 */ 1, { 10, 2 } }, - { /* 77 */ 1, { 9, 3 } }, - { /* 78 */ 1, { 8, 4 } }, - { /* 79 */ 1, { 1, 10 } }, - { /* 80 */ 1, { 7, 4 } }, - { /* 81 */ 1, { 6, 5 } }, - { /* 82 */ 1, { 5, 6 } }, - { /* 83 */ 1, { 4, 8 } }, - { /* 84 */ 1, { 4, 7 } }, - { /* 85 */ 1, { 3, 9 } }, - { /* 86 */ 1, { 11, 1 } }, - { /* 87 */ 1, { 5, 8 } }, - { /* 88 */ 1, { 9, 0 } }, - { /* 89 */ 1, { 8, 5 } }, - { /* 90 */ 0, { 29, 30 } }, - { /* 91 */ 0, { 30, 31 } }, - { /* 92 */ 0, { 31, 32 } }, - { /* 93 */ 0, { 32, 33 } }, - { /* 94 */ 0, { 33, 34 } }, - { /* 95 */ 0, { 34, 35 } }, - { /* 96 */ 0, { 35, 36 } }, - { /* 97 */ 0, { 36, 37 } }, - { /* 98 */ 0, { 37, 38 } }, - { /* 99 */ 0, { 38, 39 } }, - { /* 00 */ 0, { 39, 40 } }, - { /* 01 */ 0, { 40, 41 } }, - { /* 02 */ 0, { 41, 42 } }, - { /* 03 */ 0, { 42, 43 } }, - { /* 04 */ 0, { 43, 44 } }, - { /* 05 */ 0, { 44, 45 } }, - { /* 06 */ 0, { 45, 46 } }, - { /* 07 */ 0, { 46, 47 } }, - { /* 08 */ 0, { 47, 48 } }, - { /* 09 */ 0, { 48, 49 } }, - { /* 10 */ 0, { 49, 50 } }, - { /* 11 */ 0, { 50, 51 } }, - { /* 12 */ 0, { 51, 52 } }, - { /* 13 */ 0, { 52, 53 } }, - { /* 14 */ 0, { 53, 54 } }, - { /* 15 */ 0, { 54, 55 } }, - { /* 16 */ 0, { 55, 56 } }, - { /* 17 */ 0, { 56, 57 } }, - { /* 18 */ 0, { 57, 58 } }, - { /* 19 */ 1, { 10, 3 } }, - { /* 20 */ 1, { 2, 10 } }, - { /* 21 */ 1, { 0, 9 } }, - { /* 22 */ 1, { 11, 2 } }, - { /* 23 */ 1, { 9, 4 } }, - { /* 24 */ 1, { 6, 6 } }, - { /* 25 */ 1, { 12, 1 } }, - { /* 26 */ 1, { 4, 9 } }, - { /* 27 */ 1, { 8, 6 } }, - { /* 28 */ 1, { 1, 11 } }, - { /* 29 */ 1, { 9, 5 } }, - { /* 30 */ 1, { 10, 4 } }, - { /* 31 */ 1, { 5, 7 } }, - { /* 32 */ 1, { 7, 5 } }, - { /* 33 */ 1, { 2, 11 } }, - { /* 34 */ 1, { 1, 12 } }, - { /* 35 */ 1, { 12, 2 } }, - { /* 36 */ 1, { 11, 3 } }, - { /* 37 */ 1, { 3, 10 } }, - { /* 38 */ 1, { 5, 9 } }, - { /* 39 */ 1, { 6, 7 } }, - { /* 40 */ 1, { 8, 7 } }, - { /* 41 */ 1, { 11, 4 } }, - { /* 42 */ 1, { 0, 10 } }, - { /* 43 */ 1, { 7, 6 } }, - { /* 44 */ 1, { 12, 3 } }, - { /* 45 */ 1, { 10, 0 } }, - { /* 46 */ 1, { 10, 5 } }, - { /* 47 */ 1, { 4, 10 } }, - { /* 48 */ 1, { 6, 8 } }, - { /* 49 */ 1, { 2, 12 } }, - { /* 50 */ 1, { 9, 6 } }, - { /* 51 */ 1, { 9, 7 } }, - { /* 52 */ 1, { 4, 11 } }, - { /* 53 */ 1, { 11, 0 } }, - { /* 54 */ 1, { 6, 9 } }, - { /* 55 */ 1, { 3, 11 } }, - { /* 56 */ 1, { 5, 10 } }, - { /* 57 */ 0, { 20, 21 } }, - { /* 58 */ 0, { 21, 22 } }, - { /* 59 */ 0, { 22, 23 } }, - { /* 60 */ 0, { 23, 24 } }, - { /* 61 */ 0, { 24, 25 } }, - { /* 62 */ 0, { 25, 26 } }, - { /* 63 */ 0, { 26, 27 } }, - { /* 64 */ 0, { 27, 28 } }, - { /* 65 */ 0, { 28, 29 } }, - { /* 66 */ 0, { 29, 30 } }, - { /* 67 */ 0, { 30, 31 } }, - { /* 68 */ 0, { 31, 32 } }, - { /* 69 */ 0, { 32, 33 } }, - { /* 70 */ 0, { 33, 34 } }, - { /* 71 */ 0, { 34, 35 } }, - { /* 72 */ 0, { 35, 36 } }, - { /* 73 */ 0, { 36, 37 } }, - { /* 74 */ 0, { 37, 38 } }, - { /* 75 */ 0, { 38, 39 } }, - { /* 76 */ 0, { 39, 40 } }, - { /* 77 */ 1, { 8, 8 } }, - { /* 78 */ 1, { 7, 8 } }, - { /* 79 */ 1, { 12, 5 } }, - { /* 80 */ 1, { 3, 12 } }, - { /* 81 */ 1, { 11, 5 } }, - { /* 82 */ 1, { 7, 7 } }, - { /* 83 */ 1, { 12, 4 } }, - { /* 84 */ 1, { 11, 6 } }, - { /* 85 */ 1, { 10, 6 } }, - { /* 86 */ 1, { 4, 12 } }, - { /* 87 */ 1, { 7, 9 } }, - { /* 88 */ 1, { 5, 11 } }, - { /* 89 */ 1, { 0, 11 } }, - { /* 90 */ 1, { 12, 6 } }, - { /* 91 */ 1, { 6, 10 } }, - { /* 92 */ 1, { 12, 0 } }, - { /* 93 */ 1, { 10, 7 } }, - { /* 94 */ 1, { 5, 12 } }, - { /* 95 */ 1, { 7, 10 } }, - { /* 96 */ 1, { 9, 8 } }, - { /* 97 */ 1, { 0, 12 } }, - { /* 98 */ 1, { 11, 7 } }, - { /* 99 */ 1, { 8, 9 } }, - { /* 00 */ 1, { 9, 9 } }, - { /* 01 */ 1, { 10, 8 } }, - { /* 02 */ 1, { 7, 11 } }, - { /* 03 */ 1, { 12, 7 } }, - { /* 04 */ 1, { 6, 11 } }, - { /* 05 */ 1, { 8, 11 } }, - { /* 06 */ 1, { 11, 8 } }, - { /* 07 */ 1, { 7, 12 } }, - { /* 08 */ 1, { 6, 12 } }, - { /* 09 */ 0, { 8, 9 } }, - { /* 10 */ 0, { 9, 10 } }, - { /* 11 */ 0, { 10, 11 } }, - { /* 12 */ 0, { 11, 12 } }, - { /* 13 */ 0, { 12, 13 } }, - { /* 14 */ 0, { 13, 14 } }, - { /* 15 */ 0, { 14, 15 } }, - { /* 16 */ 0, { 15, 16 } }, - { /* 17 */ 1, { 8, 10 } }, - { /* 18 */ 1, { 10, 9 } }, - { /* 19 */ 1, { 8, 12 } }, - { /* 20 */ 1, { 9, 10 } }, - { /* 21 */ 1, { 9, 11 } }, - { /* 22 */ 1, { 9, 12 } }, - { /* 23 */ 1, { 10, 11 } }, - { /* 24 */ 1, { 12, 9 } }, - { /* 25 */ 1, { 10, 10 } }, - { /* 26 */ 1, { 11, 9 } }, - { /* 27 */ 1, { 12, 8 } }, - { /* 28 */ 1, { 11, 10 } }, - { /* 29 */ 1, { 12, 10 } }, - { /* 30 */ 1, { 12, 11 } }, - { /* 31 */ 0, { 2, 3 } }, - { /* 32 */ 0, { 3, 4 } }, - { /* 33 */ 1, { 10, 12 } }, - { /* 34 */ 1, { 11, 11 } }, - { /* 35 */ 1, { 11, 12 } }, - { /* 36 */ 1, { 12, 12 } } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_9.h,v 1.5 2007/11/01 12:34:11 menno Exp $ +**/ + +/* Binary search huffman table HCB_9 */ + + +static hcb_bin_pair hcb9[] = { + { /* 0 */ 0, { 1, 2 } }, + { /* 1 */ 1, { 0, 0 } }, + { /* 2 */ 0, { 1, 2 } }, + { /* 3 */ 0, { 2, 3 } }, + { /* 4 */ 0, { 3, 4 } }, + { /* 5 */ 1, { 1, 0 } }, + { /* 6 */ 1, { 0, 1 } }, + { /* 7 */ 0, { 2, 3 } }, + { /* 8 */ 0, { 3, 4 } }, + { /* 9 */ 1, { 1, 1 } }, + { /* 10 */ 0, { 3, 4 } }, + { /* 11 */ 0, { 4, 5 } }, + { /* 12 */ 0, { 5, 6 } }, + { /* 13 */ 0, { 6, 7 } }, + { /* 14 */ 0, { 7, 8 } }, + { /* 15 */ 0, { 8, 9 } }, + { /* 16 */ 0, { 9, 10 } }, + { /* 17 */ 0, { 10, 11 } }, + { /* 18 */ 0, { 11, 12 } }, + { /* 19 */ 1, { 2, 1 } }, + { /* 20 */ 1, { 1, 2 } }, + { /* 21 */ 1, { 2, 0 } }, + { /* 22 */ 1, { 0, 2 } }, + { /* 23 */ 0, { 8, 9 } }, + { /* 24 */ 0, { 9, 10 } }, + { /* 25 */ 0, { 10, 11 } }, + { /* 26 */ 0, { 11, 12 } }, + { /* 27 */ 0, { 12, 13 } }, + { /* 28 */ 0, { 13, 14 } }, + { /* 29 */ 0, { 14, 15 } }, + { /* 30 */ 0, { 15, 16 } }, + { /* 31 */ 1, { 3, 1 } }, + { /* 32 */ 1, { 2, 2 } }, + { /* 33 */ 1, { 1, 3 } }, + { /* 34 */ 0, { 13, 14 } }, + { /* 35 */ 0, { 14, 15 } }, + { /* 36 */ 0, { 15, 16 } }, + { /* 37 */ 0, { 16, 17 } }, + { /* 38 */ 0, { 17, 18 } }, + { /* 39 */ 0, { 18, 19 } }, + { /* 40 */ 0, { 19, 20 } }, + { /* 41 */ 0, { 20, 21 } }, + { /* 42 */ 0, { 21, 22 } }, + { /* 43 */ 0, { 22, 23 } }, + { /* 44 */ 0, { 23, 24 } }, + { /* 45 */ 0, { 24, 25 } }, + { /* 46 */ 0, { 25, 26 } }, + { /* 47 */ 1, { 3, 0 } }, + { /* 48 */ 1, { 0, 3 } }, + { /* 49 */ 1, { 2, 3 } }, + { /* 50 */ 1, { 3, 2 } }, + { /* 51 */ 1, { 1, 4 } }, + { /* 52 */ 1, { 4, 1 } }, + { /* 53 */ 1, { 2, 4 } }, + { /* 54 */ 1, { 1, 5 } }, + { /* 55 */ 0, { 18, 19 } }, + { /* 56 */ 0, { 19, 20 } }, + { /* 57 */ 0, { 20, 21 } }, + { /* 58 */ 0, { 21, 22 } }, + { /* 59 */ 0, { 22, 23 } }, + { /* 60 */ 0, { 23, 24 } }, + { /* 61 */ 0, { 24, 25 } }, + { /* 62 */ 0, { 25, 26 } }, + { /* 63 */ 0, { 26, 27 } }, + { /* 64 */ 0, { 27, 28 } }, + { /* 65 */ 0, { 28, 29 } }, + { /* 66 */ 0, { 29, 30 } }, + { /* 67 */ 0, { 30, 31 } }, + { /* 68 */ 0, { 31, 32 } }, + { /* 69 */ 0, { 32, 33 } }, + { /* 70 */ 0, { 33, 34 } }, + { /* 71 */ 0, { 34, 35 } }, + { /* 72 */ 0, { 35, 36 } }, + { /* 73 */ 1, { 4, 2 } }, + { /* 74 */ 1, { 3, 3 } }, + { /* 75 */ 1, { 0, 4 } }, + { /* 76 */ 1, { 4, 0 } }, + { /* 77 */ 1, { 5, 1 } }, + { /* 78 */ 1, { 2, 5 } }, + { /* 79 */ 1, { 1, 6 } }, + { /* 80 */ 1, { 3, 4 } }, + { /* 81 */ 1, { 5, 2 } }, + { /* 82 */ 1, { 6, 1 } }, + { /* 83 */ 1, { 4, 3 } }, + { /* 84 */ 0, { 25, 26 } }, + { /* 85 */ 0, { 26, 27 } }, + { /* 86 */ 0, { 27, 28 } }, + { /* 87 */ 0, { 28, 29 } }, + { /* 88 */ 0, { 29, 30 } }, + { /* 89 */ 0, { 30, 31 } }, + { /* 90 */ 0, { 31, 32 } }, + { /* 91 */ 0, { 32, 33 } }, + { /* 92 */ 0, { 33, 34 } }, + { /* 93 */ 0, { 34, 35 } }, + { /* 94 */ 0, { 35, 36 } }, + { /* 95 */ 0, { 36, 37 } }, + { /* 96 */ 0, { 37, 38 } }, + { /* 97 */ 0, { 38, 39 } }, + { /* 98 */ 0, { 39, 40 } }, + { /* 99 */ 0, { 40, 41 } }, + { /* 00 */ 0, { 41, 42 } }, + { /* 01 */ 0, { 42, 43 } }, + { /* 02 */ 0, { 43, 44 } }, + { /* 03 */ 0, { 44, 45 } }, + { /* 04 */ 0, { 45, 46 } }, + { /* 05 */ 0, { 46, 47 } }, + { /* 06 */ 0, { 47, 48 } }, + { /* 07 */ 0, { 48, 49 } }, + { /* 08 */ 0, { 49, 50 } }, + { /* 09 */ 1, { 0, 5 } }, + { /* 10 */ 1, { 2, 6 } }, + { /* 11 */ 1, { 5, 0 } }, + { /* 12 */ 1, { 1, 7 } }, + { /* 13 */ 1, { 3, 5 } }, + { /* 14 */ 1, { 1, 8 } }, + { /* 15 */ 1, { 8, 1 } }, + { /* 16 */ 1, { 4, 4 } }, + { /* 17 */ 1, { 5, 3 } }, + { /* 18 */ 1, { 6, 2 } }, + { /* 19 */ 1, { 7, 1 } }, + { /* 20 */ 1, { 0, 6 } }, + { /* 21 */ 1, { 8, 2 } }, + { /* 22 */ 1, { 2, 8 } }, + { /* 23 */ 1, { 3, 6 } }, + { /* 24 */ 1, { 2, 7 } }, + { /* 25 */ 1, { 4, 5 } }, + { /* 26 */ 1, { 9, 1 } }, + { /* 27 */ 1, { 1, 9 } }, + { /* 28 */ 1, { 7, 2 } }, + { /* 29 */ 0, { 30, 31 } }, + { /* 30 */ 0, { 31, 32 } }, + { /* 31 */ 0, { 32, 33 } }, + { /* 32 */ 0, { 33, 34 } }, + { /* 33 */ 0, { 34, 35 } }, + { /* 34 */ 0, { 35, 36 } }, + { /* 35 */ 0, { 36, 37 } }, + { /* 36 */ 0, { 37, 38 } }, + { /* 37 */ 0, { 38, 39 } }, + { /* 38 */ 0, { 39, 40 } }, + { /* 39 */ 0, { 40, 41 } }, + { /* 40 */ 0, { 41, 42 } }, + { /* 41 */ 0, { 42, 43 } }, + { /* 42 */ 0, { 43, 44 } }, + { /* 43 */ 0, { 44, 45 } }, + { /* 44 */ 0, { 45, 46 } }, + { /* 45 */ 0, { 46, 47 } }, + { /* 46 */ 0, { 47, 48 } }, + { /* 47 */ 0, { 48, 49 } }, + { /* 48 */ 0, { 49, 50 } }, + { /* 49 */ 0, { 50, 51 } }, + { /* 50 */ 0, { 51, 52 } }, + { /* 51 */ 0, { 52, 53 } }, + { /* 52 */ 0, { 53, 54 } }, + { /* 53 */ 0, { 54, 55 } }, + { /* 54 */ 0, { 55, 56 } }, + { /* 55 */ 0, { 56, 57 } }, + { /* 56 */ 0, { 57, 58 } }, + { /* 57 */ 0, { 58, 59 } }, + { /* 58 */ 0, { 59, 60 } }, + { /* 59 */ 1, { 6, 0 } }, + { /* 60 */ 1, { 5, 4 } }, + { /* 61 */ 1, { 6, 3 } }, + { /* 62 */ 1, { 8, 3 } }, + { /* 63 */ 1, { 0, 7 } }, + { /* 64 */ 1, { 9, 2 } }, + { /* 65 */ 1, { 3, 8 } }, + { /* 66 */ 1, { 4, 6 } }, + { /* 67 */ 1, { 3, 7 } }, + { /* 68 */ 1, { 0, 8 } }, + { /* 69 */ 1, { 10, 1 } }, + { /* 70 */ 1, { 6, 4 } }, + { /* 71 */ 1, { 2, 9 } }, + { /* 72 */ 1, { 5, 5 } }, + { /* 73 */ 1, { 8, 0 } }, + { /* 74 */ 1, { 7, 0 } }, + { /* 75 */ 1, { 7, 3 } }, + { /* 76 */ 1, { 10, 2 } }, + { /* 77 */ 1, { 9, 3 } }, + { /* 78 */ 1, { 8, 4 } }, + { /* 79 */ 1, { 1, 10 } }, + { /* 80 */ 1, { 7, 4 } }, + { /* 81 */ 1, { 6, 5 } }, + { /* 82 */ 1, { 5, 6 } }, + { /* 83 */ 1, { 4, 8 } }, + { /* 84 */ 1, { 4, 7 } }, + { /* 85 */ 1, { 3, 9 } }, + { /* 86 */ 1, { 11, 1 } }, + { /* 87 */ 1, { 5, 8 } }, + { /* 88 */ 1, { 9, 0 } }, + { /* 89 */ 1, { 8, 5 } }, + { /* 90 */ 0, { 29, 30 } }, + { /* 91 */ 0, { 30, 31 } }, + { /* 92 */ 0, { 31, 32 } }, + { /* 93 */ 0, { 32, 33 } }, + { /* 94 */ 0, { 33, 34 } }, + { /* 95 */ 0, { 34, 35 } }, + { /* 96 */ 0, { 35, 36 } }, + { /* 97 */ 0, { 36, 37 } }, + { /* 98 */ 0, { 37, 38 } }, + { /* 99 */ 0, { 38, 39 } }, + { /* 00 */ 0, { 39, 40 } }, + { /* 01 */ 0, { 40, 41 } }, + { /* 02 */ 0, { 41, 42 } }, + { /* 03 */ 0, { 42, 43 } }, + { /* 04 */ 0, { 43, 44 } }, + { /* 05 */ 0, { 44, 45 } }, + { /* 06 */ 0, { 45, 46 } }, + { /* 07 */ 0, { 46, 47 } }, + { /* 08 */ 0, { 47, 48 } }, + { /* 09 */ 0, { 48, 49 } }, + { /* 10 */ 0, { 49, 50 } }, + { /* 11 */ 0, { 50, 51 } }, + { /* 12 */ 0, { 51, 52 } }, + { /* 13 */ 0, { 52, 53 } }, + { /* 14 */ 0, { 53, 54 } }, + { /* 15 */ 0, { 54, 55 } }, + { /* 16 */ 0, { 55, 56 } }, + { /* 17 */ 0, { 56, 57 } }, + { /* 18 */ 0, { 57, 58 } }, + { /* 19 */ 1, { 10, 3 } }, + { /* 20 */ 1, { 2, 10 } }, + { /* 21 */ 1, { 0, 9 } }, + { /* 22 */ 1, { 11, 2 } }, + { /* 23 */ 1, { 9, 4 } }, + { /* 24 */ 1, { 6, 6 } }, + { /* 25 */ 1, { 12, 1 } }, + { /* 26 */ 1, { 4, 9 } }, + { /* 27 */ 1, { 8, 6 } }, + { /* 28 */ 1, { 1, 11 } }, + { /* 29 */ 1, { 9, 5 } }, + { /* 30 */ 1, { 10, 4 } }, + { /* 31 */ 1, { 5, 7 } }, + { /* 32 */ 1, { 7, 5 } }, + { /* 33 */ 1, { 2, 11 } }, + { /* 34 */ 1, { 1, 12 } }, + { /* 35 */ 1, { 12, 2 } }, + { /* 36 */ 1, { 11, 3 } }, + { /* 37 */ 1, { 3, 10 } }, + { /* 38 */ 1, { 5, 9 } }, + { /* 39 */ 1, { 6, 7 } }, + { /* 40 */ 1, { 8, 7 } }, + { /* 41 */ 1, { 11, 4 } }, + { /* 42 */ 1, { 0, 10 } }, + { /* 43 */ 1, { 7, 6 } }, + { /* 44 */ 1, { 12, 3 } }, + { /* 45 */ 1, { 10, 0 } }, + { /* 46 */ 1, { 10, 5 } }, + { /* 47 */ 1, { 4, 10 } }, + { /* 48 */ 1, { 6, 8 } }, + { /* 49 */ 1, { 2, 12 } }, + { /* 50 */ 1, { 9, 6 } }, + { /* 51 */ 1, { 9, 7 } }, + { /* 52 */ 1, { 4, 11 } }, + { /* 53 */ 1, { 11, 0 } }, + { /* 54 */ 1, { 6, 9 } }, + { /* 55 */ 1, { 3, 11 } }, + { /* 56 */ 1, { 5, 10 } }, + { /* 57 */ 0, { 20, 21 } }, + { /* 58 */ 0, { 21, 22 } }, + { /* 59 */ 0, { 22, 23 } }, + { /* 60 */ 0, { 23, 24 } }, + { /* 61 */ 0, { 24, 25 } }, + { /* 62 */ 0, { 25, 26 } }, + { /* 63 */ 0, { 26, 27 } }, + { /* 64 */ 0, { 27, 28 } }, + { /* 65 */ 0, { 28, 29 } }, + { /* 66 */ 0, { 29, 30 } }, + { /* 67 */ 0, { 30, 31 } }, + { /* 68 */ 0, { 31, 32 } }, + { /* 69 */ 0, { 32, 33 } }, + { /* 70 */ 0, { 33, 34 } }, + { /* 71 */ 0, { 34, 35 } }, + { /* 72 */ 0, { 35, 36 } }, + { /* 73 */ 0, { 36, 37 } }, + { /* 74 */ 0, { 37, 38 } }, + { /* 75 */ 0, { 38, 39 } }, + { /* 76 */ 0, { 39, 40 } }, + { /* 77 */ 1, { 8, 8 } }, + { /* 78 */ 1, { 7, 8 } }, + { /* 79 */ 1, { 12, 5 } }, + { /* 80 */ 1, { 3, 12 } }, + { /* 81 */ 1, { 11, 5 } }, + { /* 82 */ 1, { 7, 7 } }, + { /* 83 */ 1, { 12, 4 } }, + { /* 84 */ 1, { 11, 6 } }, + { /* 85 */ 1, { 10, 6 } }, + { /* 86 */ 1, { 4, 12 } }, + { /* 87 */ 1, { 7, 9 } }, + { /* 88 */ 1, { 5, 11 } }, + { /* 89 */ 1, { 0, 11 } }, + { /* 90 */ 1, { 12, 6 } }, + { /* 91 */ 1, { 6, 10 } }, + { /* 92 */ 1, { 12, 0 } }, + { /* 93 */ 1, { 10, 7 } }, + { /* 94 */ 1, { 5, 12 } }, + { /* 95 */ 1, { 7, 10 } }, + { /* 96 */ 1, { 9, 8 } }, + { /* 97 */ 1, { 0, 12 } }, + { /* 98 */ 1, { 11, 7 } }, + { /* 99 */ 1, { 8, 9 } }, + { /* 00 */ 1, { 9, 9 } }, + { /* 01 */ 1, { 10, 8 } }, + { /* 02 */ 1, { 7, 11 } }, + { /* 03 */ 1, { 12, 7 } }, + { /* 04 */ 1, { 6, 11 } }, + { /* 05 */ 1, { 8, 11 } }, + { /* 06 */ 1, { 11, 8 } }, + { /* 07 */ 1, { 7, 12 } }, + { /* 08 */ 1, { 6, 12 } }, + { /* 09 */ 0, { 8, 9 } }, + { /* 10 */ 0, { 9, 10 } }, + { /* 11 */ 0, { 10, 11 } }, + { /* 12 */ 0, { 11, 12 } }, + { /* 13 */ 0, { 12, 13 } }, + { /* 14 */ 0, { 13, 14 } }, + { /* 15 */ 0, { 14, 15 } }, + { /* 16 */ 0, { 15, 16 } }, + { /* 17 */ 1, { 8, 10 } }, + { /* 18 */ 1, { 10, 9 } }, + { /* 19 */ 1, { 8, 12 } }, + { /* 20 */ 1, { 9, 10 } }, + { /* 21 */ 1, { 9, 11 } }, + { /* 22 */ 1, { 9, 12 } }, + { /* 23 */ 1, { 10, 11 } }, + { /* 24 */ 1, { 12, 9 } }, + { /* 25 */ 1, { 10, 10 } }, + { /* 26 */ 1, { 11, 9 } }, + { /* 27 */ 1, { 12, 8 } }, + { /* 28 */ 1, { 11, 10 } }, + { /* 29 */ 1, { 12, 10 } }, + { /* 30 */ 1, { 12, 11 } }, + { /* 31 */ 0, { 2, 3 } }, + { /* 32 */ 0, { 3, 4 } }, + { /* 33 */ 1, { 10, 12 } }, + { /* 34 */ 1, { 11, 11 } }, + { /* 35 */ 1, { 11, 12 } }, + { /* 36 */ 1, { 12, 12 } } +}; diff --git a/src/contrib/aacdecoder/libfaad/codebook/hcb_sf.h b/src/contrib/aacdecoder/libfaad/codebook/hcb_sf.h old mode 100644 new mode 100755 index 12b1170bb..3c02b3d84 --- a/src/contrib/aacdecoder/libfaad/codebook/hcb_sf.h +++ b/src/contrib/aacdecoder/libfaad/codebook/hcb_sf.h @@ -1,273 +1,276 @@ -/* -** 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: hcb_sf.h,v 1.1 2005/11/27 01:00:59 tonymillion Exp $ -**/ - -/* Binary search huffman table HCB_SF */ - - -static uint8_t hcb_sf[][2] = { - { /* 0 */ 1, 2 }, - { /* 1 */ 60, 0 }, - { /* 2 */ 1, 2 }, - { /* 3 */ 2, 3 }, - { /* 4 */ 3, 4 }, - { /* 5 */ 59, 0 }, - { /* 6 */ 3, 4 }, - { /* 7 */ 4, 5 }, - { /* 8 */ 5, 6 }, - { /* 9 */ 61, 0 }, - { /* 10 */ 58, 0 }, - { /* 11 */ 62, 0 }, - { /* 12 */ 3, 4 }, - { /* 13 */ 4, 5 }, - { /* 14 */ 5, 6 }, - { /* 15 */ 57, 0 }, - { /* 16 */ 63, 0 }, - { /* 17 */ 4, 5 }, - { /* 18 */ 5, 6 }, - { /* 19 */ 6, 7 }, - { /* 20 */ 7, 8 }, - { /* 21 */ 56, 0 }, - { /* 22 */ 64, 0 }, - { /* 23 */ 55, 0 }, - { /* 24 */ 65, 0 }, - { /* 25 */ 4, 5 }, - { /* 26 */ 5, 6 }, - { /* 27 */ 6, 7 }, - { /* 28 */ 7, 8 }, - { /* 29 */ 66, 0 }, - { /* 30 */ 54, 0 }, - { /* 31 */ 67, 0 }, - { /* 32 */ 5, 6 }, - { /* 33 */ 6, 7 }, - { /* 34 */ 7, 8 }, - { /* 35 */ 8, 9 }, - { /* 36 */ 9, 10 }, - { /* 37 */ 53, 0 }, - { /* 38 */ 68, 0 }, - { /* 39 */ 52, 0 }, - { /* 40 */ 69, 0 }, - { /* 41 */ 51, 0 }, - { /* 42 */ 5, 6 }, - { /* 43 */ 6, 7 }, - { /* 44 */ 7, 8 }, - { /* 45 */ 8, 9 }, - { /* 46 */ 9, 10 }, - { /* 47 */ 70, 0 }, - { /* 48 */ 50, 0 }, - { /* 49 */ 49, 0 }, - { /* 50 */ 71, 0 }, - { /* 51 */ 6, 7 }, - { /* 52 */ 7, 8 }, - { /* 53 */ 8, 9 }, - { /* 54 */ 9, 10 }, - { /* 55 */ 10, 11 }, - { /* 56 */ 11, 12 }, - { /* 57 */ 72, 0 }, - { /* 58 */ 48, 0 }, - { /* 59 */ 73, 0 }, - { /* 60 */ 47, 0 }, - { /* 61 */ 74, 0 }, - { /* 62 */ 46, 0 }, - { /* 63 */ 6, 7 }, - { /* 64 */ 7, 8 }, - { /* 65 */ 8, 9 }, - { /* 66 */ 9, 10 }, - { /* 67 */ 10, 11 }, - { /* 68 */ 11, 12 }, - { /* 69 */ 76, 0 }, - { /* 70 */ 75, 0 }, - { /* 71 */ 77, 0 }, - { /* 72 */ 78, 0 }, - { /* 73 */ 45, 0 }, - { /* 74 */ 43, 0 }, - { /* 75 */ 6, 7 }, - { /* 76 */ 7, 8 }, - { /* 77 */ 8, 9 }, - { /* 78 */ 9, 10 }, - { /* 79 */ 10, 11 }, - { /* 80 */ 11, 12 }, - { /* 81 */ 44, 0 }, - { /* 82 */ 79, 0 }, - { /* 83 */ 42, 0 }, - { /* 84 */ 41, 0 }, - { /* 85 */ 80, 0 }, - { /* 86 */ 40, 0 }, - { /* 87 */ 6, 7 }, - { /* 88 */ 7, 8 }, - { /* 89 */ 8, 9 }, - { /* 90 */ 9, 10 }, - { /* 91 */ 10, 11 }, - { /* 92 */ 11, 12 }, - { /* 93 */ 81, 0 }, - { /* 94 */ 39, 0 }, - { /* 95 */ 82, 0 }, - { /* 96 */ 38, 0 }, - { /* 97 */ 83, 0 }, - { /* 98 */ 7, 8 }, - { /* 99 */ 8, 9 }, - { /* 00 */ 9, 10 }, - { /* 01 */ 10, 11 }, - { /* 02 */ 11, 12 }, - { /* 03 */ 12, 13 }, - { /* 04 */ 13, 14 }, - { /* 05 */ 37, 0 }, - { /* 06 */ 35, 0 }, - { /* 07 */ 85, 0 }, - { /* 08 */ 33, 0 }, - { /* 09 */ 36, 0 }, - { /* 10 */ 34, 0 }, - { /* 11 */ 84, 0 }, - { /* 12 */ 32, 0 }, - { /* 13 */ 6, 7 }, - { /* 14 */ 7, 8 }, - { /* 15 */ 8, 9 }, - { /* 16 */ 9, 10 }, - { /* 17 */ 10, 11 }, - { /* 18 */ 11, 12 }, - { /* 19 */ 87, 0 }, - { /* 20 */ 89, 0 }, - { /* 21 */ 30, 0 }, - { /* 22 */ 31, 0 }, - { /* 23 */ 8, 9 }, - { /* 24 */ 9, 10 }, - { /* 25 */ 10, 11 }, - { /* 26 */ 11, 12 }, - { /* 27 */ 12, 13 }, - { /* 28 */ 13, 14 }, - { /* 29 */ 14, 15 }, - { /* 30 */ 15, 16 }, - { /* 31 */ 86, 0 }, - { /* 32 */ 29, 0 }, - { /* 33 */ 26, 0 }, - { /* 34 */ 27, 0 }, - { /* 35 */ 28, 0 }, - { /* 36 */ 24, 0 }, - { /* 37 */ 88, 0 }, - { /* 38 */ 9, 10 }, - { /* 39 */ 10, 11 }, - { /* 40 */ 11, 12 }, - { /* 41 */ 12, 13 }, - { /* 42 */ 13, 14 }, - { /* 43 */ 14, 15 }, - { /* 44 */ 15, 16 }, - { /* 45 */ 16, 17 }, - { /* 46 */ 17, 18 }, - { /* 47 */ 25, 0 }, - { /* 48 */ 22, 0 }, - { /* 49 */ 23, 0 }, - { /* 50 */ 15, 16 }, - { /* 51 */ 16, 17 }, - { /* 52 */ 17, 18 }, - { /* 53 */ 18, 19 }, - { /* 54 */ 19, 20 }, - { /* 55 */ 20, 21 }, - { /* 56 */ 21, 22 }, - { /* 57 */ 22, 23 }, - { /* 58 */ 23, 24 }, - { /* 59 */ 24, 25 }, - { /* 60 */ 25, 26 }, - { /* 61 */ 26, 27 }, - { /* 62 */ 27, 28 }, - { /* 63 */ 28, 29 }, - { /* 64 */ 29, 30 }, - { /* 65 */ 90, 0 }, - { /* 66 */ 21, 0 }, - { /* 67 */ 19, 0 }, - { /* 68 */ 3, 0 }, - { /* 69 */ 1, 0 }, - { /* 70 */ 2, 0 }, - { /* 71 */ 0, 0 }, - { /* 72 */ 23, 24 }, - { /* 73 */ 24, 25 }, - { /* 74 */ 25, 26 }, - { /* 75 */ 26, 27 }, - { /* 76 */ 27, 28 }, - { /* 77 */ 28, 29 }, - { /* 78 */ 29, 30 }, - { /* 79 */ 30, 31 }, - { /* 80 */ 31, 32 }, - { /* 81 */ 32, 33 }, - { /* 82 */ 33, 34 }, - { /* 83 */ 34, 35 }, - { /* 84 */ 35, 36 }, - { /* 85 */ 36, 37 }, - { /* 86 */ 37, 38 }, - { /* 87 */ 38, 39 }, - { /* 88 */ 39, 40 }, - { /* 89 */ 40, 41 }, - { /* 90 */ 41, 42 }, - { /* 91 */ 42, 43 }, - { /* 92 */ 43, 44 }, - { /* 93 */ 44, 45 }, - { /* 94 */ 45, 46 }, - { /* 95 */ 98, 0 }, - { /* 96 */ 99, 0 }, - { /* 97 */ 100, 0 }, - { /* 98 */ 101, 0 }, - { /* 99 */ 102, 0 }, - { /* 00 */ 117, 0 }, - { /* 01 */ 97, 0 }, - { /* 02 */ 91, 0 }, - { /* 03 */ 92, 0 }, - { /* 04 */ 93, 0 }, - { /* 05 */ 94, 0 }, - { /* 06 */ 95, 0 }, - { /* 07 */ 96, 0 }, - { /* 08 */ 104, 0 }, - { /* 09 */ 111, 0 }, - { /* 10 */ 112, 0 }, - { /* 11 */ 113, 0 }, - { /* 12 */ 114, 0 }, - { /* 13 */ 115, 0 }, - { /* 14 */ 116, 0 }, - { /* 15 */ 110, 0 }, - { /* 16 */ 105, 0 }, - { /* 17 */ 106, 0 }, - { /* 18 */ 107, 0 }, - { /* 19 */ 108, 0 }, - { /* 20 */ 109, 0 }, - { /* 21 */ 118, 0 }, - { /* 22 */ 6, 0 }, - { /* 23 */ 8, 0 }, - { /* 24 */ 9, 0 }, - { /* 25 */ 10, 0 }, - { /* 26 */ 5, 0 }, - { /* 27 */ 103, 0 }, - { /* 28 */ 120, 0 }, - { /* 29 */ 119, 0 }, - { /* 30 */ 4, 0 }, - { /* 31 */ 7, 0 }, - { /* 32 */ 15, 0 }, - { /* 33 */ 16, 0 }, - { /* 34 */ 18, 0 }, - { /* 35 */ 20, 0 }, - { /* 36 */ 17, 0 }, - { /* 37 */ 11, 0 }, - { /* 38 */ 12, 0 }, - { /* 39 */ 14, 0 }, - { /* 40 */ 13, 0 } -}; +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcb_sf.h,v 1.7 2007/11/01 12:34:11 menno Exp $ +**/ + +/* Binary search huffman table HCB_SF */ + + +static uint8_t hcb_sf[][2] = { + { /* 0 */ 1, 2 }, + { /* 1 */ 60, 0 }, + { /* 2 */ 1, 2 }, + { /* 3 */ 2, 3 }, + { /* 4 */ 3, 4 }, + { /* 5 */ 59, 0 }, + { /* 6 */ 3, 4 }, + { /* 7 */ 4, 5 }, + { /* 8 */ 5, 6 }, + { /* 9 */ 61, 0 }, + { /* 10 */ 58, 0 }, + { /* 11 */ 62, 0 }, + { /* 12 */ 3, 4 }, + { /* 13 */ 4, 5 }, + { /* 14 */ 5, 6 }, + { /* 15 */ 57, 0 }, + { /* 16 */ 63, 0 }, + { /* 17 */ 4, 5 }, + { /* 18 */ 5, 6 }, + { /* 19 */ 6, 7 }, + { /* 20 */ 7, 8 }, + { /* 21 */ 56, 0 }, + { /* 22 */ 64, 0 }, + { /* 23 */ 55, 0 }, + { /* 24 */ 65, 0 }, + { /* 25 */ 4, 5 }, + { /* 26 */ 5, 6 }, + { /* 27 */ 6, 7 }, + { /* 28 */ 7, 8 }, + { /* 29 */ 66, 0 }, + { /* 30 */ 54, 0 }, + { /* 31 */ 67, 0 }, + { /* 32 */ 5, 6 }, + { /* 33 */ 6, 7 }, + { /* 34 */ 7, 8 }, + { /* 35 */ 8, 9 }, + { /* 36 */ 9, 10 }, + { /* 37 */ 53, 0 }, + { /* 38 */ 68, 0 }, + { /* 39 */ 52, 0 }, + { /* 40 */ 69, 0 }, + { /* 41 */ 51, 0 }, + { /* 42 */ 5, 6 }, + { /* 43 */ 6, 7 }, + { /* 44 */ 7, 8 }, + { /* 45 */ 8, 9 }, + { /* 46 */ 9, 10 }, + { /* 47 */ 70, 0 }, + { /* 48 */ 50, 0 }, + { /* 49 */ 49, 0 }, + { /* 50 */ 71, 0 }, + { /* 51 */ 6, 7 }, + { /* 52 */ 7, 8 }, + { /* 53 */ 8, 9 }, + { /* 54 */ 9, 10 }, + { /* 55 */ 10, 11 }, + { /* 56 */ 11, 12 }, + { /* 57 */ 72, 0 }, + { /* 58 */ 48, 0 }, + { /* 59 */ 73, 0 }, + { /* 60 */ 47, 0 }, + { /* 61 */ 74, 0 }, + { /* 62 */ 46, 0 }, + { /* 63 */ 6, 7 }, + { /* 64 */ 7, 8 }, + { /* 65 */ 8, 9 }, + { /* 66 */ 9, 10 }, + { /* 67 */ 10, 11 }, + { /* 68 */ 11, 12 }, + { /* 69 */ 76, 0 }, + { /* 70 */ 75, 0 }, + { /* 71 */ 77, 0 }, + { /* 72 */ 78, 0 }, + { /* 73 */ 45, 0 }, + { /* 74 */ 43, 0 }, + { /* 75 */ 6, 7 }, + { /* 76 */ 7, 8 }, + { /* 77 */ 8, 9 }, + { /* 78 */ 9, 10 }, + { /* 79 */ 10, 11 }, + { /* 80 */ 11, 12 }, + { /* 81 */ 44, 0 }, + { /* 82 */ 79, 0 }, + { /* 83 */ 42, 0 }, + { /* 84 */ 41, 0 }, + { /* 85 */ 80, 0 }, + { /* 86 */ 40, 0 }, + { /* 87 */ 6, 7 }, + { /* 88 */ 7, 8 }, + { /* 89 */ 8, 9 }, + { /* 90 */ 9, 10 }, + { /* 91 */ 10, 11 }, + { /* 92 */ 11, 12 }, + { /* 93 */ 81, 0 }, + { /* 94 */ 39, 0 }, + { /* 95 */ 82, 0 }, + { /* 96 */ 38, 0 }, + { /* 97 */ 83, 0 }, + { /* 98 */ 7, 8 }, + { /* 99 */ 8, 9 }, + { /* 00 */ 9, 10 }, + { /* 01 */ 10, 11 }, + { /* 02 */ 11, 12 }, + { /* 03 */ 12, 13 }, + { /* 04 */ 13, 14 }, + { /* 05 */ 37, 0 }, + { /* 06 */ 35, 0 }, + { /* 07 */ 85, 0 }, + { /* 08 */ 33, 0 }, + { /* 09 */ 36, 0 }, + { /* 10 */ 34, 0 }, + { /* 11 */ 84, 0 }, + { /* 12 */ 32, 0 }, + { /* 13 */ 6, 7 }, + { /* 14 */ 7, 8 }, + { /* 15 */ 8, 9 }, + { /* 16 */ 9, 10 }, + { /* 17 */ 10, 11 }, + { /* 18 */ 11, 12 }, + { /* 19 */ 87, 0 }, + { /* 20 */ 89, 0 }, + { /* 21 */ 30, 0 }, + { /* 22 */ 31, 0 }, + { /* 23 */ 8, 9 }, + { /* 24 */ 9, 10 }, + { /* 25 */ 10, 11 }, + { /* 26 */ 11, 12 }, + { /* 27 */ 12, 13 }, + { /* 28 */ 13, 14 }, + { /* 29 */ 14, 15 }, + { /* 30 */ 15, 16 }, + { /* 31 */ 86, 0 }, + { /* 32 */ 29, 0 }, + { /* 33 */ 26, 0 }, + { /* 34 */ 27, 0 }, + { /* 35 */ 28, 0 }, + { /* 36 */ 24, 0 }, + { /* 37 */ 88, 0 }, + { /* 38 */ 9, 10 }, + { /* 39 */ 10, 11 }, + { /* 40 */ 11, 12 }, + { /* 41 */ 12, 13 }, + { /* 42 */ 13, 14 }, + { /* 43 */ 14, 15 }, + { /* 44 */ 15, 16 }, + { /* 45 */ 16, 17 }, + { /* 46 */ 17, 18 }, + { /* 47 */ 25, 0 }, + { /* 48 */ 22, 0 }, + { /* 49 */ 23, 0 }, + { /* 50 */ 15, 16 }, + { /* 51 */ 16, 17 }, + { /* 52 */ 17, 18 }, + { /* 53 */ 18, 19 }, + { /* 54 */ 19, 20 }, + { /* 55 */ 20, 21 }, + { /* 56 */ 21, 22 }, + { /* 57 */ 22, 23 }, + { /* 58 */ 23, 24 }, + { /* 59 */ 24, 25 }, + { /* 60 */ 25, 26 }, + { /* 61 */ 26, 27 }, + { /* 62 */ 27, 28 }, + { /* 63 */ 28, 29 }, + { /* 64 */ 29, 30 }, + { /* 65 */ 90, 0 }, + { /* 66 */ 21, 0 }, + { /* 67 */ 19, 0 }, + { /* 68 */ 3, 0 }, + { /* 69 */ 1, 0 }, + { /* 70 */ 2, 0 }, + { /* 71 */ 0, 0 }, + { /* 72 */ 23, 24 }, + { /* 73 */ 24, 25 }, + { /* 74 */ 25, 26 }, + { /* 75 */ 26, 27 }, + { /* 76 */ 27, 28 }, + { /* 77 */ 28, 29 }, + { /* 78 */ 29, 30 }, + { /* 79 */ 30, 31 }, + { /* 80 */ 31, 32 }, + { /* 81 */ 32, 33 }, + { /* 82 */ 33, 34 }, + { /* 83 */ 34, 35 }, + { /* 84 */ 35, 36 }, + { /* 85 */ 36, 37 }, + { /* 86 */ 37, 38 }, + { /* 87 */ 38, 39 }, + { /* 88 */ 39, 40 }, + { /* 89 */ 40, 41 }, + { /* 90 */ 41, 42 }, + { /* 91 */ 42, 43 }, + { /* 92 */ 43, 44 }, + { /* 93 */ 44, 45 }, + { /* 94 */ 45, 46 }, + { /* 95 */ 98, 0 }, + { /* 96 */ 99, 0 }, + { /* 97 */ 100, 0 }, + { /* 98 */ 101, 0 }, + { /* 99 */ 102, 0 }, + { /* 00 */ 117, 0 }, + { /* 01 */ 97, 0 }, + { /* 02 */ 91, 0 }, + { /* 03 */ 92, 0 }, + { /* 04 */ 93, 0 }, + { /* 05 */ 94, 0 }, + { /* 06 */ 95, 0 }, + { /* 07 */ 96, 0 }, + { /* 08 */ 104, 0 }, + { /* 09 */ 111, 0 }, + { /* 10 */ 112, 0 }, + { /* 11 */ 113, 0 }, + { /* 12 */ 114, 0 }, + { /* 13 */ 115, 0 }, + { /* 14 */ 116, 0 }, + { /* 15 */ 110, 0 }, + { /* 16 */ 105, 0 }, + { /* 17 */ 106, 0 }, + { /* 18 */ 107, 0 }, + { /* 19 */ 108, 0 }, + { /* 20 */ 109, 0 }, + { /* 21 */ 118, 0 }, + { /* 22 */ 6, 0 }, + { /* 23 */ 8, 0 }, + { /* 24 */ 9, 0 }, + { /* 25 */ 10, 0 }, + { /* 26 */ 5, 0 }, + { /* 27 */ 103, 0 }, + { /* 28 */ 120, 0 }, + { /* 29 */ 119, 0 }, + { /* 30 */ 4, 0 }, + { /* 31 */ 7, 0 }, + { /* 32 */ 15, 0 }, + { /* 33 */ 16, 0 }, + { /* 34 */ 18, 0 }, + { /* 35 */ 20, 0 }, + { /* 36 */ 17, 0 }, + { /* 37 */ 11, 0 }, + { /* 38 */ 12, 0 }, + { /* 39 */ 14, 0 }, + { /* 40 */ 13, 0 } +}; diff --git a/src/contrib/aacdecoder/libfaad/common.c b/src/contrib/aacdecoder/libfaad/common.c old mode 100644 new mode 100755 index 303039681..be08d351e --- a/src/contrib/aacdecoder/libfaad/common.c +++ b/src/contrib/aacdecoder/libfaad/common.c @@ -1,304 +1,522 @@ -/* -** 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: common.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* just some common functions that could be used anywhere */ - -#include "common.h" -#include "structs.h" - -#include -#include "syntax.h" - -#ifdef USE_SSE -__declspec(naked) static int32_t __fastcall test_cpuid(void) -{ - __asm - { - pushf - pop eax - mov ecx,eax - xor eax,(1<<21) - push eax - popf - pushf - pop eax - push ecx - popf - cmp eax,ecx - mov eax,0 - setne al - ret - } -} - -__declspec(naked) static void __fastcall run_cpuid(int32_t param, int32_t out[4]) -{ - __asm - { - pushad - push edx - mov eax,ecx - cpuid - pop edi - mov [edi+0],eax - mov [edi+4],ebx - mov [edi+8],ecx - mov [edi+12],edx - popad - ret - } -} - -uint8_t cpu_has_sse() -{ - int32_t features[4]; - - if (test_cpuid()) - { - run_cpuid(1, features); - } - - /* check for SSE */ - if (features[3] & 0x02000000) - return 1; - - return 0; -} -#else -uint8_t cpu_has_sse() -{ - return 0; -} -#endif - -/* 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; -} - -/* common malloc function */ -void *faad_malloc(int32_t size) -{ -#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) - return _aligned_malloc(size, 16); -#else - return malloc(size); -#endif -} - -/* common free function */ -void faad_free(void *b) -{ -#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) - _aligned_free(b); -#else - free(b); -#endif -} - -static const uint8_t Parity [256] = { // parity - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, - 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 -}; - -static uint32_t __r1 = 1; -static uint32_t __r2 = 1; - - -/* - * This is a simple random number generator with good quality for audio purposes. - * It consists of two polycounters with opposite rotation direction and different - * periods. The periods are coprime, so the total period is the product of both. - * - * ------------------------------------------------------------------------------------------------- - * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| - * | ------------------------------------------------------------------------------------------------- - * | | | | | | | - * | +--+--+--+-XOR-+--------+ - * | | - * +--------------------------------------------------------------------------------------+ - * - * ------------------------------------------------------------------------------------------------- - * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ - * ------------------------------------------------------------------------------------------------- | - * | | | | | - * +--+----XOR----+--+ | - * | | - * +----------------------------------------------------------------------------------------+ - * - * - * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, - * which gives a period of 18.410.713.077.675.721.215. The result is the - * XORed values of both generators. - */ -uint32_t 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 ); -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: common.c,v 1.27 2008/03/23 23:03:28 menno Exp $ +**/ + +/* just some common functions that could be used anywhere */ + +#include "common.h" +#include "structs.h" + +#include +#include "syntax.h" + + +/* Returns the sample rate index based on the samplerate */ +uint8_t get_sr_index(const uint32_t samplerate) +{ + if (92017 <= samplerate) return 0; + if (75132 <= samplerate) return 1; + if (55426 <= samplerate) return 2; + if (46009 <= samplerate) return 3; + if (37566 <= samplerate) return 4; + if (27713 <= samplerate) return 5; + if (23004 <= samplerate) return 6; + if (18783 <= samplerate) return 7; + if (13856 <= samplerate) return 8; + if (11502 <= samplerate) return 9; + if (9391 <= samplerate) return 10; + if (16428320 <= samplerate) return 11; + + return 11; +} + +/* Returns the sample rate based on the sample rate index */ +uint32_t get_sample_rate(const uint8_t sr_index) +{ + static const uint32_t sample_rates[] = + { + 96000, 88200, 64000, 48000, 44100, 32000, + 24000, 22050, 16000, 12000, 11025, 8000 + }; + + if (sr_index < 12) + return sample_rates[sr_index]; + + return 0; +} + +uint8_t max_pred_sfb(const uint8_t sr_index) +{ + static const uint8_t pred_sfb_max[] = + { + 33, 33, 38, 40, 40, 40, 41, 41, 37, 37, 37, 34 + }; + + + if (sr_index < 12) + return pred_sfb_max[sr_index]; + + return 0; +} + +uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, + const uint8_t is_short) +{ + /* entry for each sampling rate + * 1 Main/LC long window + * 2 Main/LC short window + * 3 SSR long window + * 4 SSR short window + */ + static const uint8_t tns_sbf_max[][4] = + { + {31, 9, 28, 7}, /* 96000 */ + {31, 9, 28, 7}, /* 88200 */ + {34, 10, 27, 7}, /* 64000 */ + {40, 14, 26, 6}, /* 48000 */ + {42, 14, 26, 6}, /* 44100 */ + {51, 14, 26, 6}, /* 32000 */ + {46, 14, 29, 7}, /* 24000 */ + {46, 14, 29, 7}, /* 22050 */ + {42, 14, 23, 8}, /* 16000 */ + {42, 14, 23, 8}, /* 12000 */ + {42, 14, 23, 8}, /* 11025 */ + {39, 14, 19, 7}, /* 8000 */ + {39, 14, 19, 7}, /* 7350 */ + {0,0,0,0}, + {0,0,0,0}, + {0,0,0,0} + }; + uint8_t i = 0; + + if (is_short) i++; + if (object_type == SSR) i += 2; + + return tns_sbf_max[sr_index][i]; +} + +/* Returns 0 if an object type is decodable, otherwise returns -1 */ +int8_t can_decode_ot(const uint8_t object_type) +{ + switch (object_type) + { + case LC: + return 0; + case MAIN: +#ifdef MAIN_DEC + return 0; +#else + return -1; +#endif + case SSR: +#ifdef SSR_DEC + return 0; +#else + return -1; +#endif + case LTP: +#ifdef LTP_DEC + return 0; +#else + return -1; +#endif + + /* ER object types */ +#ifdef ERROR_RESILIENCE + case ER_LC: +#ifdef DRM + case DRM_ER_LC: +#endif + return 0; + case ER_LTP: +#ifdef LTP_DEC + return 0; +#else + return -1; +#endif + case LD: +#ifdef LD_DEC + return 0; +#else + return -1; +#endif +#endif + } + + return -1; +} + +void *faad_malloc(size_t size) +{ +#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) + return _aligned_malloc(size, 16); +#else // #ifdef 0 + return malloc(size); +#endif // #ifdef 0 +} + +/* common free function */ +void faad_free(void *b) +{ +#if 0 // defined(_WIN32) && !defined(_WIN32_WCE) + _aligned_free(b); +#else + free(b); +} +#endif + +static const uint8_t Parity [256] = { // parity + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0, + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1, + 1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0 +}; + +static uint32_t __r1 = 1; +static uint32_t __r2 = 1; + + +/* + * This is a simple random number generator with good quality for audio purposes. + * It consists of two polycounters with opposite rotation direction and different + * periods. The periods are coprime, so the total period is the product of both. + * + * ------------------------------------------------------------------------------------------------- + * +-> |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| + * | ------------------------------------------------------------------------------------------------- + * | | | | | | | + * | +--+--+--+-XOR-+--------+ + * | | + * +--------------------------------------------------------------------------------------+ + * + * ------------------------------------------------------------------------------------------------- + * |31:30:29:28:27:26:25:24:23:22:21:20:19:18:17:16:15:14:13:12:11:10: 9: 8: 7: 6: 5: 4: 3: 2: 1: 0| <-+ + * ------------------------------------------------------------------------------------------------- | + * | | | | | + * +--+----XOR----+--+ | + * | | + * +----------------------------------------------------------------------------------------+ + * + * + * The first has an period of 3*5*17*257*65537, the second of 7*47*73*178481, + * which gives a period of 18.410.713.077.675.721.215. The result is the + * XORed values of both generators. + */ +uint32_t ne_rng(uint32_t *__r1, uint32_t *__r2) +{ + uint32_t t1, t2, t3, t4; + + t3 = t1 = *__r1; t4 = t2 = *__r2; // Parity calculation is done via table lookup, this is also available + t1 &= 0xF5; t2 >>= 25; // on CPUs without parity, can be implemented in C and avoid unpredictable + t1 = Parity [t1]; t2 &= 0x63; // jumps and slow rotate through the carry flag operations. + t1 <<= 31; t2 = Parity [t2]; + + return (*__r1 = (t3 >> 1) | t1 ) ^ (*__r2 = (t4 + t4) | t2 ); +} + +static uint32_t ones32(uint32_t x) +{ + x -= ((x >> 1) & 0x55555555); + x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); + x = (((x >> 4) + x) & 0x0f0f0f0f); + x += (x >> 8); + x += (x >> 16); + + return (x & 0x0000003f); +} + +static uint32_t floor_log2(uint32_t x) +{ +#if 1 + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + + return (ones32(x) - 1); +#else + uint32_t count = 0; + + while (x >>= 1) + count++; + + return count; +#endif +} + +/* returns position of first bit that is not 0 from msb, + * starting count at lsb */ +uint32_t wl_min_lzc(uint32_t x) +{ +#if 1 + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + + return (ones32(x)); +#else + uint32_t count = 0; + + while (x >>= 1) + count++; + + return (count + 1); +#endif +} + +#ifdef FIXED_POINT + +#define TABLE_BITS 6 +/* just take the maximum number of bits for interpolation */ +#define INTERP_BITS (REAL_BITS-TABLE_BITS) + +static const real_t pow2_tab[] = { + REAL_CONST(1.000000000000000), REAL_CONST(1.010889286051701), REAL_CONST(1.021897148654117), + REAL_CONST(1.033024879021228), REAL_CONST(1.044273782427414), REAL_CONST(1.055645178360557), + REAL_CONST(1.067140400676824), REAL_CONST(1.078760797757120), REAL_CONST(1.090507732665258), + REAL_CONST(1.102382583307841), REAL_CONST(1.114386742595892), REAL_CONST(1.126521618608242), + REAL_CONST(1.138788634756692), REAL_CONST(1.151189229952983), REAL_CONST(1.163724858777578), + REAL_CONST(1.176396991650281), REAL_CONST(1.189207115002721), REAL_CONST(1.202156731452703), + REAL_CONST(1.215247359980469), REAL_CONST(1.228480536106870), REAL_CONST(1.241857812073484), + REAL_CONST(1.255380757024691), REAL_CONST(1.269050957191733), REAL_CONST(1.282870016078778), + REAL_CONST(1.296839554651010), REAL_CONST(1.310961211524764), REAL_CONST(1.325236643159741), + REAL_CONST(1.339667524053303), REAL_CONST(1.354255546936893), REAL_CONST(1.369002422974591), + REAL_CONST(1.383909881963832), REAL_CONST(1.398979672538311), REAL_CONST(1.414213562373095), + REAL_CONST(1.429613338391970), REAL_CONST(1.445180806977047), REAL_CONST(1.460917794180647), + REAL_CONST(1.476826145939499), REAL_CONST(1.492907728291265), REAL_CONST(1.509164427593423), + REAL_CONST(1.525598150744538), REAL_CONST(1.542210825407941), REAL_CONST(1.559004400237837), + REAL_CONST(1.575980845107887), REAL_CONST(1.593142151342267), REAL_CONST(1.610490331949254), + REAL_CONST(1.628027421857348), REAL_CONST(1.645755478153965), REAL_CONST(1.663676580326736), + REAL_CONST(1.681792830507429), REAL_CONST(1.700106353718524), REAL_CONST(1.718619298122478), + REAL_CONST(1.737333835273706), REAL_CONST(1.756252160373300), REAL_CONST(1.775376492526521), + REAL_CONST(1.794709075003107), REAL_CONST(1.814252175500399), REAL_CONST(1.834008086409342), + REAL_CONST(1.853979125083386), REAL_CONST(1.874167634110300), REAL_CONST(1.894575981586966), + REAL_CONST(1.915206561397147), REAL_CONST(1.936061793492294), REAL_CONST(1.957144124175400), + REAL_CONST(1.978456026387951), REAL_CONST(2.000000000000000) +}; + +static const real_t log2_tab[] = { + REAL_CONST(0.000000000000000), REAL_CONST(0.022367813028455), REAL_CONST(0.044394119358453), + REAL_CONST(0.066089190457772), REAL_CONST(0.087462841250339), REAL_CONST(0.108524456778169), + REAL_CONST(0.129283016944966), REAL_CONST(0.149747119504682), REAL_CONST(0.169925001442312), + REAL_CONST(0.189824558880017), REAL_CONST(0.209453365628950), REAL_CONST(0.228818690495881), + REAL_CONST(0.247927513443585), REAL_CONST(0.266786540694901), REAL_CONST(0.285402218862248), + REAL_CONST(0.303780748177103), REAL_CONST(0.321928094887362), REAL_CONST(0.339850002884625), + REAL_CONST(0.357552004618084), REAL_CONST(0.375039431346925), REAL_CONST(0.392317422778760), + REAL_CONST(0.409390936137702), REAL_CONST(0.426264754702098), REAL_CONST(0.442943495848728), + REAL_CONST(0.459431618637297), REAL_CONST(0.475733430966398), REAL_CONST(0.491853096329675), + REAL_CONST(0.507794640198696), REAL_CONST(0.523561956057013), REAL_CONST(0.539158811108031), + REAL_CONST(0.554588851677637), REAL_CONST(0.569855608330948), REAL_CONST(0.584962500721156), + REAL_CONST(0.599912842187128), REAL_CONST(0.614709844115208), REAL_CONST(0.629356620079610), + REAL_CONST(0.643856189774725), REAL_CONST(0.658211482751795), REAL_CONST(0.672425341971496), + REAL_CONST(0.686500527183218), REAL_CONST(0.700439718141092), REAL_CONST(0.714245517666123), + REAL_CONST(0.727920454563199), REAL_CONST(0.741466986401147), REAL_CONST(0.754887502163469), + REAL_CONST(0.768184324776926), REAL_CONST(0.781359713524660), REAL_CONST(0.794415866350106), + REAL_CONST(0.807354922057604), REAL_CONST(0.820178962415188), REAL_CONST(0.832890014164742), + REAL_CONST(0.845490050944375), REAL_CONST(0.857980995127572), REAL_CONST(0.870364719583405), + REAL_CONST(0.882643049361841), REAL_CONST(0.894817763307943), REAL_CONST(0.906890595608519), + REAL_CONST(0.918863237274595), REAL_CONST(0.930737337562886), REAL_CONST(0.942514505339240), + REAL_CONST(0.954196310386875), REAL_CONST(0.965784284662087), REAL_CONST(0.977279923499917), + REAL_CONST(0.988684686772166), REAL_CONST(1.000000000000000) +}; + +real_t pow2_fix(real_t val) +{ + uint32_t x1, x2; + uint32_t errcorr; + uint32_t index_frac; + real_t retval; + int32_t whole = (val >> REAL_BITS); + + /* rest = [0..1] */ + int32_t rest = val - (whole << REAL_BITS); + + /* index into pow2_tab */ + int32_t index = rest >> (REAL_BITS-TABLE_BITS); + + + if (val == 0) + return (1<> (REAL_BITS-TABLE_BITS-INTERP_BITS); + index_frac = index_frac & ((1< 0) + { + retval = 1 << whole; + } else { + retval = REAL_CONST(1) >> -whole; + } + + x1 = pow2_tab[index & ((1<> INTERP_BITS; + + if (whole > 0) + { + retval = retval * (errcorr + x1); + } else { + retval = MUL_R(retval, (errcorr + x1)); + } + + return retval; +} + +int32_t pow2_int(real_t val) +{ + uint32_t x1, x2; + uint32_t errcorr; + uint32_t index_frac; + real_t retval; + int32_t whole = (val >> REAL_BITS); + + /* rest = [0..1] */ + int32_t rest = val - (whole << REAL_BITS); + + /* index into pow2_tab */ + int32_t index = rest >> (REAL_BITS-TABLE_BITS); + + + if (val == 0) + return 1; + + /* leave INTERP_BITS bits */ + index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS); + index_frac = index_frac & ((1< 0) + retval = 1 << whole; + else + retval = 0; + + x1 = pow2_tab[index & ((1<> INTERP_BITS; + + retval = MUL_R(retval, (errcorr + x1)); + + return retval; +} + +/* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ +int32_t log2_int(uint32_t val) +{ + uint32_t frac; + uint32_t whole = (val); + int32_t exp = 0; + uint32_t index; + uint32_t index_frac; + uint32_t x1, x2; + uint32_t errcorr; + + /* error */ + if (val == 0) + return -10000; + + exp = floor_log2(val); + exp -= REAL_BITS; + + /* frac = [1..2] */ + if (exp >= 0) + frac = val >> exp; + else + frac = val << -exp; + + /* index in the log2 table */ + index = frac >> (REAL_BITS-TABLE_BITS); + + /* leftover part for linear interpolation */ + index_frac = frac & ((1<<(REAL_BITS-TABLE_BITS))-1); + + /* leave INTERP_BITS bits */ + index_frac = index_frac >> (REAL_BITS-TABLE_BITS-INTERP_BITS); + + x1 = log2_tab[index & ((1<> INTERP_BITS; + + return ((exp+REAL_BITS) << REAL_BITS) + errcorr + x1; +} + +/* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ +real_t log2_fix(uint32_t val) +{ + uint32_t frac; + uint32_t whole = (val >> REAL_BITS); + int8_t exp = 0; + uint32_t index; + uint32_t index_frac; + uint32_t x1, x2; + uint32_t errcorr; + + /* error */ + if (val == 0) + return -100000; + + exp = floor_log2(val); + exp -= REAL_BITS; + + /* frac = [1..2] */ + if (exp >= 0) + frac = val >> exp; + else + frac = val << -exp; + + /* index in the log2 table */ + index = frac >> (REAL_BITS-TABLE_BITS); + + /* leftover part for linear interpolation */ + index_frac = frac & ((1<<(REAL_BITS-TABLE_BITS))-1); + + /* leave INTERP_BITS bits */ + index_frac = index_frac >> (REAL_BITS-TABLE_BITS-INTERP_BITS); + + x1 = log2_tab[index & ((1<> INTERP_BITS; + + return (exp << REAL_BITS) + errcorr + x1; +} +#endif diff --git a/src/contrib/aacdecoder/libfaad/common.h b/src/contrib/aacdecoder/libfaad/common.h old mode 100644 new mode 100755 index 83d67aa26..a965a35ec --- a/src/contrib/aacdecoder/libfaad/common.h +++ b/src/contrib/aacdecoder/libfaad/common.h @@ -1,393 +1,449 @@ -/* -** 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: common.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __COMMON_H__ -#define __COMMON_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define INLINE __inline -#if 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 - -#ifdef _WIN32_WCE -#define FIXED_POINT -#endif - - -#define ERROR_RESILIENCE - - -/* Allow decoding of MAIN profile AAC */ -#define MAIN_DEC -/* Allow decoding of SSR profile AAC */ -//#define SSR_DEC -/* Allow decoding of LTP profile AAC */ -#define LTP_DEC -/* Allow decoding of LD profile AAC */ -#define LD_DEC -/* Allow decoding of 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) -//#define LC_ONLY_DECODER -#ifdef LC_ONLY_DECODER - #undef LTP_DEC - #undef MAIN_DEC - #undef SSR_DEC - #undef DRM - #undef ALLOW_SMALL_FRAMELENGTH - #undef ERROR_RESILIENCE -#endif - -#define SBR_DEC -//#define SBR_LOW_POWER -//#define PS_DEC - -/* FIXED POINT: No MAIN decoding, no SBR decoding */ -#ifdef FIXED_POINT -# ifdef MAIN_DEC -# undef MAIN_DEC -# endif -//# ifndef SBR_LOW_POWER -//# define SBR_LOW_POWER -//# endif -# ifdef SBR_DEC -# undef SBR_DEC -# endif -#endif // FIXED_POINT - -#ifdef DRM -# ifndef SCALABLE_DEC -# define SCALABLE_DEC -# endif -#endif - -#if ((defined(_WIN32) && !defined(_WIN32_WCE)) /* || ((__GNUC__ >= 3) && defined(__i386__)) */ ) -#ifndef FIXED_POINT -/* includes to enable SSE intrinsics */ -//#define USE_SSE -#endif -#endif - -#ifdef FIXED_POINT -#define SBR_DIV(A, B) (((int64_t)A << REAL_BITS)/B) -#else -#define SBR_DIV(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) - - -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 - -#ifdef HAVE_CONFIG_H -# include "../config.h" -#endif - -#include -#if HAVE_SYS_TYPES_H -# include -#endif -#if HAVE_SYS_STAT_H -# include -#endif -#if STDC_HEADERS -# include -# include -#else -# if HAVE_STDLIB_H -# include -# endif -#endif -#if HAVE_STRING_H -# if !STDC_HEADERS && HAVE_MEMORY_H -# include -# endif -# include -#endif -#if HAVE_STRINGS_H -# include -#endif -#if HAVE_INTTYPES_H -# include -#else -# if HAVE_STDINT_H -# include -# else -/* we need these... */ -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 -#if HAVE_UNISTD_H -# include -#endif - -#ifndef HAVE_FLOAT32_T -typedef float float32_t; -#endif - -#if STDC_HEADERS -# include -#else -# if !HAVE_STRCHR -# define strchr index -# define strrchr rindex -# endif -char *strchr(), *strrchr(); -# if !HAVE_MEMCPY -# define memcpy(d, s, n) bcopy((s), (d), (n)) -# define memmove(d, s, n) bcopy((s), (d), (n)) -# endif -#endif - -#endif - -#ifdef WORDS_BIGENDIAN -#define ARCH_IS_BIG_ENDIAN -#endif - -/* FIXED_POINT doesn't work with MAIN and SSR yet */ -#ifdef FIXED_POINT - #undef MAIN_DEC - #undef SSR_DEC -#endif - - -#if defined(FIXED_POINT) - - #include "fixed.h" - -#elif defined(USE_DOUBLE_PRECISION) - - typedef double real_t; - - #include - - #define MUL_R(A,B) ((A)*(B)) - #define MUL_C(A,B) ((A)*(B)) - #define MUL_F(A,B) ((A)*(B)) - - /* Complex multiplication */ - static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) - { - *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); - *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); - } - - #define REAL_CONST(A) ((real_t)(A)) - #define COEF_CONST(A) ((real_t)(A)) - #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ - -#else /* Normal floating point operation */ - - typedef float real_t; - -#ifdef USE_SSE -# include -#endif - - #define MUL_R(A,B) ((A)*(B)) - #define MUL_C(A,B) ((A)*(B)) - #define MUL_F(A,B) ((A)*(B)) - - #define REAL_CONST(A) ((real_t)(A)) - #define COEF_CONST(A) ((real_t)(A)) - #define 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); - } - - - #ifdef __ICL /* only Intel C compiler has fmath ??? */ - - #include - - #define sin sinf - #define cos cosf - #define log logf - #define floor floorf - #define ceil ceilf - #define sqrt sqrtf - - #else - -#ifdef HAVE_LRINTF -# define HAS_LRINTF -# define _ISOC9X_SOURCE 1 -# define _ISOC99_SOURCE 1 -# define __USE_ISOC9X 1 -# define __USE_ISOC99 1 -#endif - - #include - -#ifdef HAVE_SINF -# define sin sinf -#error -#endif -#ifdef HAVE_COSF -# define cos cosf -#endif -#ifdef HAVE_LOGF -# define log logf -#endif -#ifdef HAVE_EXPF -# define exp expf -#endif -#ifdef HAVE_FLOORF -# define floor floorf -#endif -#ifdef HAVE_CEILF -# define ceil ceilf -#endif -#ifdef HAVE_SQRTF -# define sqrt sqrtf -#endif - - #endif - -#endif - -#ifndef HAS_LRINTF -/* standard cast */ -#define lrintf(f) ((int32_t)(f)) -#endif - -typedef real_t complex_t[2]; -#define RE(A) A[0] -#define IM(A) A[1] - - -/* common functions */ -uint8_t cpu_has_sse(void); -uint32_t random_int(void); -uint8_t get_sr_index(const uint32_t samplerate); -uint8_t max_pred_sfb(const uint8_t sr_index); -uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, - const uint8_t is_short); -uint32_t get_sample_rate(const uint8_t sr_index); -int8_t can_decode_ot(const uint8_t object_type); - -void *faad_malloc(int32_t size); -void faad_free(void *b); - -//#define PROFILE -#ifdef PROFILE -static int64_t faad_get_ts() -{ - __asm - { - rdtsc - } -} -#endif - -#ifndef M_PI -#define M_PI 3.14159265358979323846 -#endif -#ifndef M_PI_2 /* PI/2 */ -#define M_PI_2 1.57079632679489661923 -#endif - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: common.h,v 1.77 2009/02/05 00:51:03 menno Exp $ +**/ + +#ifndef __COMMON_H__ +#define __COMMON_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_CONFIG_H +# include "../config.h" +#endif + +#include "neaacdec.h" + +#if 1 +#define INLINE __inline +#else +#define INLINE inline +#endif + +#if 0 //defined(_WIN32) && !defined(_WIN32_WCE) +#define ALIGN __declspec(align(16)) +#else +#define ALIGN +#endif + +#ifndef max +#define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif +#ifndef min +#define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif + +/* COMPILE TIME DEFINITIONS */ + +/* use double precision */ +/* #define USE_DOUBLE_PRECISION */ +/* use fixed point reals */ +//#define FIXED_POINT +//#define BIG_IQ_TABLE + +/* Use if target platform has address generators with autoincrement */ +//#define PREFER_POINTERS + +#ifdef _WIN32_WCE +#define FIXED_POINT +#endif + +#ifdef __BFIN__ +#define FIXED_POINT +#endif + +#define ERROR_RESILIENCE + + +/* Allow decoding of MAIN profile AAC */ +#define MAIN_DEC +/* Allow decoding of SSR profile AAC */ +//#define SSR_DEC +/* Allow decoding of LTP profile AAC */ +#define LTP_DEC +/* Allow decoding of LD profile AAC */ +#define LD_DEC +/* Allow decoding of Digital Radio Mondiale (DRM) */ +//#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 + +#define SBR_DEC +//#define SBR_LOW_POWER +#define PS_DEC + +#ifdef SBR_LOW_POWER +#undef PS_DEC +#endif + +/* FIXED POINT: No MAIN decoding */ +#ifdef FIXED_POINT +# ifdef MAIN_DEC +# undef MAIN_DEC +# endif +#endif // FIXED_POINT + +#ifdef DRM +# ifndef ALLOW_SMALL_FRAMELENGTH +# define ALLOW_SMALL_FRAMELENGTH +# endif +# undef LD_DEC +# undef LTP_DEC +# undef MAIN_DEC +# undef SSR_DEC +#endif + + +#ifdef FIXED_POINT +#define DIV_R(A, B) (((int64_t)A << REAL_BITS)/B) +#define DIV_C(A, B) (((int64_t)A << COEF_BITS)/B) +#else +#define DIV_R(A, B) ((A)/(B)) +#define DIV_C(A, B) ((A)/(B)) +#endif + +#ifndef SBR_LOW_POWER +#define qmf_t complex_t +#define QMF_RE(A) RE(A) +#define QMF_IM(A) IM(A) +#else +#define qmf_t real_t +#define QMF_RE(A) (A) +#define QMF_IM(A) +#endif + + +/* END COMPILE TIME DEFINITIONS */ + +#if defined(_WIN32) && !defined(__MINGW32__) + +#include +#include +//typedef unsigned __int64 uint64_t; +//typedef unsigned __int32 uint32_t; +//typedef unsigned __int16 uint16_t; +//typedef unsigned __int8 uint8_t; +//typedef signed __int64 int64_t; +//typedef signed __int32 int32_t; +//typedef signed __int16 int16_t; +//typedef signed __int8 int8_t; +typedef float float32_t; + +#else + +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# else +/* we need these... */ +#ifndef __TCS__ +typedef unsigned long long uint64_t; +typedef signed long long int64_t; +#else +typedef unsigned long uint64_t; +typedef signed long int64_t; +#endif +typedef unsigned long uint32_t; +typedef unsigned short uint16_t; +typedef unsigned char uint8_t; +typedef signed long int32_t; +typedef signed short int16_t; +typedef signed char int8_t; +# endif +#endif +#if HAVE_UNISTD_H +//# include +#endif + +#ifndef HAVE_FLOAT32_T +typedef float float32_t; +#endif + +#if STDC_HEADERS +# include +#else +# if !HAVE_STRCHR +# define strchr index +# define strrchr rindex +# endif +char *strchr(), *strrchr(); +# if !HAVE_MEMCPY +# define memcpy(d, s, n) bcopy((s), (d), (n)) +# define memmove(d, s, n) bcopy((s), (d), (n)) +# endif +#endif + +#endif + +#ifdef WORDS_BIGENDIAN +#define ARCH_IS_BIG_ENDIAN +#endif + +/* FIXED_POINT doesn't work with MAIN and SSR yet */ +#ifdef FIXED_POINT + #undef MAIN_DEC + #undef SSR_DEC +#endif + + +#if defined(FIXED_POINT) + + #include "fixed.h" + +#elif defined(USE_DOUBLE_PRECISION) + + typedef double real_t; + + #include + + #define MUL_R(A,B) ((A)*(B)) + #define MUL_C(A,B) ((A)*(B)) + #define MUL_F(A,B) ((A)*(B)) + + /* Complex multiplication */ + static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) + { + *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); + *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); + } + + #define REAL_CONST(A) ((real_t)(A)) + #define COEF_CONST(A) ((real_t)(A)) + #define Q2_CONST(A) ((real_t)(A)) + #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ + +#else /* Normal floating point operation */ + + typedef float real_t; + + #define MUL_R(A,B) ((A)*(B)) + #define MUL_C(A,B) ((A)*(B)) + #define MUL_F(A,B) ((A)*(B)) + + #define REAL_CONST(A) ((real_t)(A)) + #define COEF_CONST(A) ((real_t)(A)) + #define Q2_CONST(A) ((real_t)(A)) + #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ + + /* Complex multiplication */ + static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) + { + *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); + *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); + } + + + #if defined(_WIN32) && !defined(__MINGW32__) + #define HAS_LRINTF + static INLINE int lrintf(float f) + { + int i; + __asm + { + fld f + fistp i + } + return i; + } + #elif (defined(__i386__) && defined(__GNUC__) && \ + !defined(__CYGWIN__) && !defined(__MINGW32__)) + #ifndef HAVE_LRINTF + #define HAS_LRINTF + // from http://www.stereopsis.com/FPU.html + static INLINE int lrintf(float f) + { + int i; + __asm__ __volatile__ ( + "flds %1 \n\t" + "fistpl %0 \n\t" + : "=m" (i) + : "m" (f)); + return i; + } + #endif /* HAVE_LRINTF */ + #endif + + + #ifdef __ICL /* only Intel C compiler has fmath ??? */ + + #include + + #define sin sinf + #define cos cosf + #define log logf + #define floor floorf + #define ceil ceilf + #define sqrt sqrtf + + #else + +#ifdef HAVE_LRINTF +# define HAS_LRINTF +# define _ISOC9X_SOURCE 1 +# define _ISOC99_SOURCE 1 +# define __USE_ISOC9X 1 +# define __USE_ISOC99 1 +#endif + + #include + +#ifdef HAVE_SINF +# define sin sinf +#error +#endif +#ifdef HAVE_COSF +# define cos cosf +#endif +#ifdef HAVE_LOGF +# define log logf +#endif +#ifdef HAVE_EXPF +# define exp expf +#endif +#ifdef HAVE_FLOORF +# define floor floorf +#endif +#ifdef HAVE_CEILF +# define ceil ceilf +#endif +#ifdef HAVE_SQRTF +# define sqrt sqrtf +#endif + + #endif + +#endif + +#ifndef HAS_LRINTF +/* standard cast */ +#define lrintf(f) ((int32_t)(f)) +#endif + +typedef real_t complex_t[2]; +#define RE(A) A[0] +#define IM(A) A[1] + + +/* common functions */ +uint8_t cpu_has_sse(void); +uint32_t ne_rng(uint32_t *__r1, uint32_t *__r2); +uint32_t wl_min_lzc(uint32_t x); +#ifdef FIXED_POINT +#define LOG2_MIN_INF REAL_CONST(-10000) +int32_t log2_int(uint32_t val); +int32_t log2_fix(uint32_t val); +int32_t pow2_int(real_t val); +real_t pow2_fix(real_t val); +#endif +uint8_t get_sr_index(const uint32_t samplerate); +uint8_t max_pred_sfb(const uint8_t sr_index); +uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, + const uint8_t is_short); +uint32_t get_sample_rate(const uint8_t sr_index); +int8_t can_decode_ot(const uint8_t object_type); + +void *faad_malloc(size_t size); +void faad_free(void *b); + +//#define PROFILE +#ifdef PROFILE +static int64_t faad_get_ts() +{ + __asm + { + rdtsc + } +} +#endif + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef M_PI_2 /* PI/2 */ +#define M_PI_2 1.57079632679489661923 +#endif + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/decoder.c b/src/contrib/aacdecoder/libfaad/decoder.c old mode 100644 new mode 100755 index 63dc41987..85dd423cf --- a/src/contrib/aacdecoder/libfaad/decoder.c +++ b/src/contrib/aacdecoder/libfaad/decoder.c @@ -1,972 +1,1223 @@ -/* -** 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: decoder.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include -#include - -#include "decoder.h" -#include "mp4.h" -#include "syntax.h" -#include "error.h" -#include "output.h" -#include "filtbank.h" -#include "drc.h" -#ifdef SBR_DEC -#include "sbr_dec.h" -#include "sbr_syntax.h" -#endif -#ifdef SSR_DEC -#include "ssr.h" -#endif - -#ifdef ANALYSIS -uint16_t dbg_count; -#endif - -int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode) -{ - if (errcode >= NUM_ERROR_MESSAGES) - return NULL; - return err_msg[errcode]; -} - -uint32_t FAADAPI faacDecGetCapabilities(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; -} - -faacDecHandle FAADAPI faacDecOpen(void) -{ - uint8_t i; - faacDecHandle hDecoder = NULL; - - if ((hDecoder = (faacDecHandle)faad_malloc(sizeof(faacDecStruct))) == NULL) - return NULL; - - memset(hDecoder, 0, sizeof(faacDecStruct)); - - hDecoder->config.outputFormat = FAAD_FMT_16BIT; - hDecoder->config.defObjectType = MAIN; - hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ - hDecoder->config.downMatrix = 0; - hDecoder->adts_header_present = 0; - hDecoder->adif_header_present = 0; -#ifdef ERROR_RESILIENCE - hDecoder->aacSectionDataResilienceFlag = 0; - hDecoder->aacScalefactorDataResilienceFlag = 0; - hDecoder->aacSpectralDataResilienceFlag = 0; -#endif - hDecoder->frameLength = 1024; - - hDecoder->frame = 0; - hDecoder->sample_buffer = NULL; - - for (i = 0; i < MAX_CHANNELS; i++) - { - hDecoder->window_shape_prev[i] = 0; - hDecoder->time_out[i] = NULL; - hDecoder->fb_intermed[i] = NULL; -#ifdef SSR_DEC - hDecoder->ssr_overlap[i] = NULL; - hDecoder->prev_fmd[i] = NULL; -#endif -#ifdef MAIN_DEC - hDecoder->pred_stat[i] = NULL; -#endif -#ifdef LTP_DEC - hDecoder->ltp_lag[i] = 0; - hDecoder->lt_pred_stat[i] = NULL; -#endif - } - -#ifdef SBR_DEC - for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) - { - hDecoder->sbr[i] = NULL; - } -#endif - - hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); - -#ifdef USE_SSE - if (cpu_has_sse()) - { - hDecoder->apply_sf_func = apply_scalefactors_sse; - } else { - hDecoder->apply_sf_func = apply_scalefactors; - } -#endif - - return hDecoder; -} - -faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder) -{ - if (hDecoder) - { - faacDecConfigurationPtr config = &(hDecoder->config); - - return config; - } - - return NULL; -} - -uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, - faacDecConfigurationPtr 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 */ - if ((config->outputFormat < 1) || (config->outputFormat > 9)) - return 0; - hDecoder->config.outputFormat = config->outputFormat; - - if (config->downMatrix > 1) - hDecoder->config.downMatrix = config->downMatrix; - - /* OK */ - return 1; - } - - return 0; -} - -int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, uint8_t *buffer, - uint32_t buffer_size, - uint32_t *samplerate, uint8_t *channels) -{ - 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; - -#ifdef SBR_DEC - /* implicit signalling */ - if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) - { - *samplerate *= 2; - hDecoder->forceUpSampling = 1; - } -#endif - - /* must be done before frameLength is divided by 2 for LD */ -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); - else -#endif - hDecoder->fb = filter_bank_init(hDecoder->frameLength); - -#ifdef LD_DEC - if (hDecoder->object_type == LD) - hDecoder->frameLength >>= 1; -#endif - - if (can_decode_ot(hDecoder->object_type) < 0) - return -1; - - return bits; -} - -/* Init the library using a DecoderSpecificInfo */ -int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, - uint32_t SizeOfDecoderSpecificInfo, - uint32_t *samplerate, uint8_t *channels) -{ - int8_t rc; - mp4AudioSpecificConfig mp4ASC; - - if((hDecoder == NULL) - || (pBuffer == NULL) - || (SizeOfDecoderSpecificInfo < 2) - || (samplerate == NULL) - || (channels == NULL)) - { - return -1; - } - - hDecoder->adif_header_present = 0; - hDecoder->adts_header_present = 0; - - /* decode the audio specific config */ - rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, - &(hDecoder->pce)); - - /* 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; - } - 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; - 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->forceUpSampling == 1) - { - hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); - } -#endif - - if (rc != 0) - { - return rc; - } - hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; - if (mp4ASC.frameLengthFlag) -#ifdef ALLOW_SMALL_FRAMELENGTH - hDecoder->frameLength = 960; -#else - return -1; -#endif - - /* must be done before frameLength is divided by 2 for LD */ -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); - else -#endif - hDecoder->fb = filter_bank_init(hDecoder->frameLength); - -#ifdef LD_DEC - if (hDecoder->object_type == LD) - hDecoder->frameLength >>= 1; -#endif - - return 0; -} - -#ifdef DRM -int8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate, - uint8_t channels) -{ - uint8_t i; - - if (hDecoder == NULL) - return 1; /* error */ - - /* 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_SBR_LC_STEREO) - hDecoder->lcstereo_flag = 1; - else - hDecoder->lcstereo_flag = 0; - - if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) - hDecoder->sbr_present_flag = 0; - else - hDecoder->sbr_present_flag = 1; - - /* Reset sbr for new initialization */ - sbrDecodeEnd(hDecoder->sbr[0]); - hDecoder->sbr[0] = NULL; -#endif - - if (hDecoder->fb) filter_bank_end(hDecoder->fb); - hDecoder->fb = NULL; - - /* Take care of buffers */ - if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); - hDecoder->sample_buffer = NULL; - hDecoder->alloced_channels = 0; - - for (i = 0; i < MAX_CHANNELS; i++) - { - hDecoder->window_shape_prev[i] = 0; - - if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); - hDecoder->time_out[i] = NULL; - if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); - hDecoder->fb_intermed[i] = NULL; -#ifdef SSR_DEC - if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); - hDecoder->ssr_overlap[i] = NULL; - if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); - hDecoder->prev_fmd[i] = NULL; -#endif -#ifdef MAIN_DEC - if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); - hDecoder->pred_stat[i] = NULL; -#endif -#ifdef LTP_DEC - hDecoder->ltp_lag[i] = 0; - if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); - hDecoder->lt_pred_stat[i] = NULL; -#endif - } - - for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) - { -#ifdef SBR_DEC - if (hDecoder->sbr[i]) - sbrDecodeEnd(hDecoder->sbr[i]); - - hDecoder->sbr_alloced[i] = 0; -#endif - hDecoder->element_alloced[i] = 0; - hDecoder->element_output_channels[i] = 0; - } - - hDecoder->fb = filter_bank_init(hDecoder->frameLength); - - return 0; -} -#endif - -void FAADAPI faacDecClose(faacDecHandle hDecoder) -{ - uint8_t i; - - if (hDecoder == NULL) - return; - -#ifdef PROFILE - printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); - printf("requant: %I64d cycles\n", hDecoder->requant_cycles); - printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); - printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); - printf("output: %I64d cycles\n", hDecoder->output_cycles); -#endif - - for (i = 0; i < MAX_CHANNELS; i++) - { - if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); - if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); -#ifdef SSR_DEC - if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); - if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); -#endif -#ifdef MAIN_DEC - if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); -#endif -#ifdef LTP_DEC - if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); -#endif - } - -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - ssr_filter_bank_end(hDecoder->fb); - else -#endif - filter_bank_end(hDecoder->fb); - - drc_end(hDecoder->drc); - - if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); - -#ifdef SBR_DEC - for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) - { - if (hDecoder->sbr[i]) - sbrDecodeEnd(hDecoder->sbr[i]); - } -#endif - - if (hDecoder) faad_free(hDecoder); -} - -void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, int32_t frame) -{ - if (hDecoder) - { - hDecoder->postSeekResetFlag = 1; - - if (frame != -1) - hDecoder->frame = frame; - } -} - -static void create_channel_config(faacDecHandle hDecoder, faacDecFrameInfo *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; - } - } -} - -void* FAADAPI faacDecDecode(faacDecHandle hDecoder, - faacDecFrameInfo *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; - void *sample_buffer; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - /* safety checks */ - if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL)) - { - return NULL; - } - - frame_len = hDecoder->frameLength; - - - memset(hInfo, 0, sizeof(faacDecFrameInfo)); - memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); - - /* initialize the bitstream */ - faad_initbits(&ld, buffer, buffer_size); - -#ifdef DRM - if (hDecoder->object_type == DRM_ER_LC) - { - /* We do not support stereo right now */ - if (hDecoder->channelConfiguration == 2) - { - hInfo->error = 8; // Throw CRC error - goto error; - } - - faad_getbits(&ld, 8 - DEBUGVAR(1,1,"faacDecDecode(): 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 (channels != hDecoder->channelConfiguration) - 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; - } - - /* Make a channel configuration based on either a PCE or a channelConfiguration */ - create_channel_config(hDecoder, hInfo); - - /* number of samples in this frame */ - hInfo->samples = frame_len*output_channels; - /* number of channels in this frame */ - hInfo->channels = output_channels; - /* samplerate */ - hInfo->samplerate = get_sample_rate(hDecoder->sf_index); - /* object type */ - hInfo->object_type = hDecoder->object_type; - /* sbr */ - hInfo->sbr = NO_SBR; - /* header type */ - hInfo->header_type = RAW; - if (hDecoder->adif_header_present) - hInfo->header_type = ADIF; - if (hDecoder->adts_header_present) - hInfo->header_type = ADTS; - - /* check if frame has channel elements */ - if (channels == 0) - { - hDecoder->frame++; - return NULL; - } - - /* allocate the buffer for the final samples */ - if ((hDecoder->sample_buffer == NULL) || - (hDecoder->alloced_channels != output_channels)) - { - static const uint8_t str[] = { sizeof(int16_t), sizeof(int32_t), sizeof(int32_t), - sizeof(float32_t), sizeof(double), sizeof(int16_t), sizeof(int16_t), - sizeof(int16_t), sizeof(int16_t), 0, 0, 0 - }; - uint8_t stride = str[hDecoder->config.outputFormat-1]; -#ifdef SBR_DEC - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - stride = 2 * stride; -#endif - if (hDecoder->sample_buffer) - faad_free(hDecoder->sample_buffer); - hDecoder->sample_buffer = NULL; - hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); - hDecoder->alloced_channels = output_channels; - } - - sample_buffer = hDecoder->sample_buffer; - -#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 */ - 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; - } - } -#endif - - sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, - output_channels, frame_len, hDecoder->config.outputFormat); - - - hDecoder->postSeekResetFlag = 0; - - hDecoder->frame++; -#ifdef LD_DEC - if (hDecoder->object_type != LD) - { -#endif - if (hDecoder->frame <= 1) - hInfo->samples = 0; -#ifdef LD_DEC - } else { - /* LD encoders will give lower delay */ - if (hDecoder->frame <= 0) - hInfo->samples = 0; - } -#endif - - /* cleanup */ -#ifdef ANALYSIS - fflush(stdout); -#endif - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->cycles += count; -#endif - - return sample_buffer; - -error: - - faad_endbits(&ld); - - /* cleanup */ -#ifdef ANALYSIS - fflush(stdout); -#endif - - return NULL; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: decoder.c,v 1.117 2009/02/05 00:51:03 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include +#include +#include + +#include "mp4.h" +#include "syntax.h" +#include "error.h" +#include "output.h" +#include "filtbank.h" +#include "drc.h" +#ifdef SBR_DEC +#include "sbr_dec.h" +#include "sbr_syntax.h" +#endif +#ifdef SSR_DEC +#include "ssr.h" +#endif + +#ifdef ANALYSIS +uint16_t dbg_count; +#endif + +/* static function declarations */ +static void* aac_frame_decode(NeAACDecStruct *hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size, + void **sample_buffer2, + unsigned long sample_buffer_size); +static void create_channel_config(NeAACDecStruct *hDecoder, + NeAACDecFrameInfo *hInfo); + + +char* NEAACDECAPI NeAACDecGetErrorMessage(unsigned char errcode) +{ + if (errcode >= NUM_ERROR_MESSAGES) + return NULL; + return err_msg[errcode]; +} + +unsigned long 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; +} + +const unsigned char mes[] = { 0x67,0x20,0x61,0x20,0x20,0x20,0x6f,0x20,0x72,0x20,0x65,0x20,0x6e,0x20,0x20,0x20,0x74,0x20,0x68,0x20,0x67,0x20,0x69,0x20,0x72,0x20,0x79,0x20,0x70,0x20,0x6f,0x20,0x63 }; +NeAACDecHandle NEAACDECAPI NeAACDecOpen(void) +{ + uint8_t i; + NeAACDecStruct *hDecoder = NULL; + + if ((hDecoder = (NeAACDecStruct*)faad_malloc(sizeof(NeAACDecStruct))) == NULL) + return NULL; + + memset(hDecoder, 0, sizeof(NeAACDecStruct)); + + hDecoder->cmes = mes; + hDecoder->config.outputFormat = FAAD_FMT_16BIT; + hDecoder->config.defObjectType = MAIN; + hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ + hDecoder->config.downMatrix = 0; + hDecoder->adts_header_present = 0; + hDecoder->adif_header_present = 0; + hDecoder->latm_header_present = 0; +#ifdef ERROR_RESILIENCE + hDecoder->aacSectionDataResilienceFlag = 0; + hDecoder->aacScalefactorDataResilienceFlag = 0; + hDecoder->aacSpectralDataResilienceFlag = 0; +#endif + hDecoder->frameLength = 1024; + + hDecoder->frame = 0; + hDecoder->sample_buffer = NULL; + + hDecoder->__r1 = 1; + hDecoder->__r2 = 1; + + for (i = 0; i < MAX_CHANNELS; i++) + { + hDecoder->window_shape_prev[i] = 0; + hDecoder->time_out[i] = NULL; + hDecoder->fb_intermed[i] = NULL; +#ifdef SSR_DEC + hDecoder->ssr_overlap[i] = NULL; + hDecoder->prev_fmd[i] = NULL; +#endif +#ifdef MAIN_DEC + hDecoder->pred_stat[i] = NULL; +#endif +#ifdef LTP_DEC + hDecoder->ltp_lag[i] = 0; + hDecoder->lt_pred_stat[i] = NULL; +#endif + } + +#ifdef SBR_DEC + for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) + { + hDecoder->sbr[i] = NULL; + } +#endif + + hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); + + return hDecoder; +} + +NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hpDecoder) +{ + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + if (hDecoder) + { + NeAACDecConfigurationPtr config = &(hDecoder->config); + + return config; + } + + return NULL; +} + +unsigned char NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hpDecoder, + NeAACDecConfigurationPtr config) +{ + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + if (hDecoder && config) + { + /* check if we can decode this object type */ + if (can_decode_ot(config->defObjectType) < 0) + return 0; + hDecoder->config.defObjectType = config->defObjectType; + + /* samplerate: anything but 0 should be possible */ + if (config->defSampleRate == 0) + return 0; + hDecoder->config.defSampleRate = config->defSampleRate; + + /* check output format */ +#ifdef FIXED_POINT + if ((config->outputFormat < 1) || (config->outputFormat > 4)) + return 0; +#else + if ((config->outputFormat < 1) || (config->outputFormat > 5)) + return 0; +#endif + hDecoder->config.outputFormat = config->outputFormat; + + if (config->downMatrix > 1) + return 0; + hDecoder->config.downMatrix = config->downMatrix; + + /* OK */ + return 1; + } + + return 0; +} + + +static int latmCheck(latm_header *latm, bitfile *ld) +{ + uint32_t good=0, bad=0, bits, m; + + while (ld->bytes_left) + { + bits = faad_latm_frame(latm, ld); + if(bits==-1U) + bad++; + else + { + good++; + while(bits>0) + { + m = min(bits, 8); + faad_getbits(ld, m); + bits -= m; + } + } + } + + return (good>0); +} + + +long NEAACDECAPI NeAACDecInit(NeAACDecHandle hpDecoder, + unsigned char *buffer, + unsigned long buffer_size, + unsigned long *samplerate, + unsigned char *channels) +{ + uint32_t bits = 0; + bitfile ld; + adif_header adif; + adts_header adts; + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + + + if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) + return -1; + + hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); + hDecoder->object_type = hDecoder->config.defObjectType; + *samplerate = get_sample_rate(hDecoder->sf_index); + *channels = 1; + + if (buffer != NULL) + { +#if 0 + int is_latm; + latm_header *l = &hDecoder->latm_config; +#endif + + faad_initbits(&ld, buffer, buffer_size); + +#if 0 + memset(l, 0, sizeof(latm_header)); + is_latm = latmCheck(l, &ld); + l->inited = 0; + l->frameLength = 0; + faad_rewindbits(&ld); + if(is_latm && l->ASCbits>0) + { + int32_t x; + hDecoder->latm_header_present = 1; + x = NeAACDecInit2(hDecoder, l->ASC, (l->ASCbits+7)/8, samplerate, channels); + if(x!=0) + hDecoder->latm_header_present = 0; + return x; + } else +#endif + /* Check if an ADIF header is present */ + if ((buffer[0] == 'A') && (buffer[1] == 'D') && + (buffer[2] == 'I') && (buffer[3] == 'F')) + { + hDecoder->adif_header_present = 1; + + get_adif_header(&adif, &ld); + faad_byte_align(&ld); + + hDecoder->sf_index = adif.pce[0].sf_index; + hDecoder->object_type = adif.pce[0].object_type + 1; + + *samplerate = get_sample_rate(hDecoder->sf_index); + *channels = adif.pce[0].channels; + + memcpy(&(hDecoder->pce), &(adif.pce[0]), sizeof(program_config)); + hDecoder->pce_set = 1; + + bits = bit2byte(faad_get_processed_bits(&ld)); + + /* Check if an ADTS header is present */ + } else if (faad_showbits(&ld, 12) == 0xfff) { + hDecoder->adts_header_present = 1; + + adts.old_format = hDecoder->config.useOldADTSFormat; + adts_frame(&adts, &ld); + + hDecoder->sf_index = adts.sf_index; + hDecoder->object_type = adts.profile + 1; + + *samplerate = get_sample_rate(hDecoder->sf_index); + *channels = (adts.channel_configuration > 6) ? + 2 : adts.channel_configuration; + } + + if (ld.error) + { + faad_endbits(&ld); + return -1; + } + faad_endbits(&ld); + } + +#if (defined(PS_DEC) || defined(DRM_PS)) + /* check if we have a mono file */ + if (*channels == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + *channels = 2; + } +#endif + + hDecoder->channelConfiguration = *channels; + +#ifdef SBR_DEC + /* implicit signalling */ + if (*samplerate <= 24000 && (hDecoder->config.dontUpSampleImplicitSBR == 0)) + { + *samplerate *= 2; + hDecoder->forceUpSampling = 1; + } else if (*samplerate > 24000 && (hDecoder->config.dontUpSampleImplicitSBR == 0)) { + hDecoder->downSampledSBR = 1; + } +#endif + + /* must be done before frameLength is divided by 2 for LD */ +#ifdef SSR_DEC + if (hDecoder->object_type == SSR) + hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); + else +#endif + hDecoder->fb = filter_bank_init(hDecoder->frameLength); + +#ifdef LD_DEC + if (hDecoder->object_type == LD) + hDecoder->frameLength >>= 1; +#endif + + if (can_decode_ot(hDecoder->object_type) < 0) + return -1; + + return bits; +} + +/* Init the library using a DecoderSpecificInfo */ +char NEAACDECAPI NeAACDecInit2(NeAACDecHandle hpDecoder, + unsigned char *pBuffer, + unsigned long SizeOfDecoderSpecificInfo, + unsigned long *samplerate, + unsigned char *channels) +{ + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + int8_t rc; + mp4AudioSpecificConfig mp4ASC; + + if((hDecoder == NULL) + || (pBuffer == NULL) + || (SizeOfDecoderSpecificInfo < 2) + || (samplerate == NULL) + || (channels == NULL)) + { + return -1; + } + + hDecoder->adif_header_present = 0; + hDecoder->adts_header_present = 0; + + /* decode the audio specific config */ + rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, + &(hDecoder->pce), hDecoder->latm_header_present); + + /* copy the relevant info to the decoder handle */ + *samplerate = mp4ASC.samplingFrequency; + if (mp4ASC.channelsConfiguration) + { + *channels = mp4ASC.channelsConfiguration; + } else { + *channels = hDecoder->pce.channels; + hDecoder->pce_set = 1; + } +#if (defined(PS_DEC) || defined(DRM_PS)) + /* check if we have a mono file */ + if (*channels == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + *channels = 2; + } +#endif + hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; + hDecoder->object_type = mp4ASC.objectTypeIndex; +#ifdef ERROR_RESILIENCE + hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; + hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; + hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; +#endif +#ifdef SBR_DEC + hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; + hDecoder->downSampledSBR = mp4ASC.downSampledSBR; + if (hDecoder->config.dontUpSampleImplicitSBR == 0) + hDecoder->forceUpSampling = mp4ASC.forceUpSampling; + else + hDecoder->forceUpSampling = 0; + + /* AAC core decoder samplerate is 2 times as low */ + if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) + { + hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); + } +#endif + + if (rc != 0) + { + return rc; + } + hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; + if (mp4ASC.frameLengthFlag) +#ifdef ALLOW_SMALL_FRAMELENGTH + hDecoder->frameLength = 960; +#else + return -1; +#endif + + /* must be done before frameLength is divided by 2 for LD */ +#ifdef SSR_DEC + if (hDecoder->object_type == SSR) + hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); + else +#endif + hDecoder->fb = filter_bank_init(hDecoder->frameLength); + +#ifdef LD_DEC + if (hDecoder->object_type == LD) + hDecoder->frameLength >>= 1; +#endif + + return 0; +} + +#ifdef DRM +char NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hpDecoder, + unsigned long samplerate, + unsigned char channels) +{ + NeAACDecStruct** hDecoder = (NeAACDecStruct**)hpDecoder; + if (hDecoder == NULL) + return 1; /* error */ + + NeAACDecClose(*hDecoder); + + *hDecoder = NeAACDecOpen(); + + /* Special object type defined for DRM */ + (*hDecoder)->config.defObjectType = DRM_ER_LC; + + (*hDecoder)->config.defSampleRate = samplerate; +#ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM + (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */ + (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ + (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */ +#endif + (*hDecoder)->frameLength = 960; + (*hDecoder)->sf_index = get_sr_index((*hDecoder)->config.defSampleRate); + (*hDecoder)->object_type = (*hDecoder)->config.defObjectType; + + if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO)) + (*hDecoder)->channelConfiguration = 2; + else + (*hDecoder)->channelConfiguration = 1; + +#ifdef SBR_DEC + if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) + (*hDecoder)->sbr_present_flag = 0; + else + (*hDecoder)->sbr_present_flag = 1; +#endif + + (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); + + return 0; +} +#endif + +void NEAACDECAPI NeAACDecClose(NeAACDecHandle hpDecoder) +{ + uint8_t i; + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + + if (hDecoder == NULL) + return; + +#ifdef PROFILE + printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); + printf("requant: %I64d cycles\n", hDecoder->requant_cycles); + printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); + printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); + printf("output: %I64d cycles\n", hDecoder->output_cycles); +#endif + + for (i = 0; i < MAX_CHANNELS; i++) + { + if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); + if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); +#ifdef SSR_DEC + if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); + if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); +#endif +#ifdef MAIN_DEC + if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); +#endif +#ifdef LTP_DEC + if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); +#endif + } + +#ifdef SSR_DEC + if (hDecoder->object_type == SSR) + ssr_filter_bank_end(hDecoder->fb); + else +#endif + filter_bank_end(hDecoder->fb); + + drc_end(hDecoder->drc); + + if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); + +#ifdef SBR_DEC + for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) + { + if (hDecoder->sbr[i]) + sbrDecodeEnd(hDecoder->sbr[i]); + } +#endif + + if (hDecoder) faad_free(hDecoder); +} + +void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hpDecoder, long frame) +{ + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + if (hDecoder) + { + hDecoder->postSeekResetFlag = 1; + + if (frame != -1) + hDecoder->frame = frame; + } +} + +static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo) +{ + hInfo->num_front_channels = 0; + hInfo->num_side_channels = 0; + hInfo->num_back_channels = 0; + hInfo->num_lfe_channels = 0; + memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t)); + + if (hDecoder->downMatrix) + { + hInfo->num_front_channels = 2; + hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; + return; + } + + /* check if there is a PCE */ + if (hDecoder->pce_set) + { + uint8_t i, chpos = 0; + uint8_t chdir, back_center = 0; + + hInfo->num_front_channels = hDecoder->pce.num_front_channels; + hInfo->num_side_channels = hDecoder->pce.num_side_channels; + hInfo->num_back_channels = hDecoder->pce.num_back_channels; + hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; + + chdir = hInfo->num_front_channels; + if (chdir & 1) + { +#if (defined(PS_DEC) || defined(DRM_PS)) + /* When PS is enabled output is always stereo */ + hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; +#else + hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; + chdir--; +#endif + } + for (i = 0; i < chdir; i += 2) + { + hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; + } + + for (i = 0; i < hInfo->num_side_channels; i += 2) + { + hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; + hInfo->channel_position[chpos++] = SIDE_CHANNEL_RIGHT; + } + + chdir = hInfo->num_back_channels; + if (chdir & 1) + { + back_center = 1; + chdir--; + } + for (i = 0; i < chdir; i += 2) + { + hInfo->channel_position[chpos++] = BACK_CHANNEL_LEFT; + hInfo->channel_position[chpos++] = BACK_CHANNEL_RIGHT; + } + if (back_center) + { + hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER; + } + + for (i = 0; i < hInfo->num_lfe_channels; i++) + { + hInfo->channel_position[chpos++] = LFE_CHANNEL; + } + + } else { + switch (hDecoder->channelConfiguration) + { + case 1: +#if (defined(PS_DEC) || defined(DRM_PS)) + /* When PS is enabled output is always stereo */ + hInfo->num_front_channels = 2; + hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; +#else + hInfo->num_front_channels = 1; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; +#endif + break; + case 2: + hInfo->num_front_channels = 2; + hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; + break; + case 3: + hInfo->num_front_channels = 3; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; + break; + case 4: + hInfo->num_front_channels = 3; + hInfo->num_back_channels = 1; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; + hInfo->channel_position[3] = BACK_CHANNEL_CENTER; + break; + case 5: + hInfo->num_front_channels = 3; + hInfo->num_back_channels = 2; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; + hInfo->channel_position[3] = BACK_CHANNEL_LEFT; + hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; + break; + case 6: + hInfo->num_front_channels = 3; + hInfo->num_back_channels = 2; + hInfo->num_lfe_channels = 1; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; + hInfo->channel_position[3] = BACK_CHANNEL_LEFT; + hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; + hInfo->channel_position[5] = LFE_CHANNEL; + break; + case 7: + hInfo->num_front_channels = 3; + hInfo->num_side_channels = 2; + hInfo->num_back_channels = 2; + hInfo->num_lfe_channels = 1; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; + hInfo->channel_position[3] = SIDE_CHANNEL_LEFT; + hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT; + hInfo->channel_position[5] = BACK_CHANNEL_LEFT; + hInfo->channel_position[6] = BACK_CHANNEL_RIGHT; + hInfo->channel_position[7] = LFE_CHANNEL; + break; + default: /* channelConfiguration == 0 || channelConfiguration > 7 */ + { + uint8_t i; + uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe; + if (ch & 1) /* there's either a center front or a center back channel */ + { + uint8_t ch1 = (ch-1)/2; + if (hDecoder->first_syn_ele == ID_SCE) + { + hInfo->num_front_channels = ch1 + 1; + hInfo->num_back_channels = ch1; + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + for (i = 1; i <= ch1; i+=2) + { + hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; + } + for (i = ch1+1; i < ch; i+=2) + { + hInfo->channel_position[i] = BACK_CHANNEL_LEFT; + hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; + } + } else { + hInfo->num_front_channels = ch1; + hInfo->num_back_channels = ch1 + 1; + for (i = 0; i < ch1; i+=2) + { + hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; + } + for (i = ch1; i < ch-1; i+=2) + { + hInfo->channel_position[i] = BACK_CHANNEL_LEFT; + hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; + } + hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; + } + } else { + uint8_t ch1 = (ch)/2; + hInfo->num_front_channels = ch1; + hInfo->num_back_channels = ch1; + if (ch1 & 1) + { + hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; + for (i = 1; i <= ch1; i+=2) + { + hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; + } + for (i = ch1+1; i < ch-1; i+=2) + { + hInfo->channel_position[i] = BACK_CHANNEL_LEFT; + hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; + } + hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; + } else { + for (i = 0; i < ch1; i+=2) + { + hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; + hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; + } + for (i = ch1; i < ch; i+=2) + { + hInfo->channel_position[i] = BACK_CHANNEL_LEFT; + hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; + } + } + } + hInfo->num_lfe_channels = hDecoder->has_lfe; + for (i = ch; i < hDecoder->fr_channels; i++) + { + hInfo->channel_position[i] = LFE_CHANNEL; + } + } + break; + } + } +} + +void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hpDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size) +{ + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); +} + +void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hpDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size, + void **sample_buffer, + unsigned long sample_buffer_size) +{ + NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; + if ((sample_buffer == NULL) || (sample_buffer_size == 0)) + { + hInfo->error = 27; + return NULL; + } + + return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, + sample_buffer, sample_buffer_size); +} + +#ifdef DRM + +#define ERROR_STATE_INIT 6 + +static void conceal_output(NeAACDecStruct *hDecoder, uint16_t frame_len, + uint8_t out_ch, void *sample_buffer) +{ + return; +} +#endif + +static void* aac_frame_decode(NeAACDecStruct *hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size, + void **sample_buffer2, + unsigned long sample_buffer_size) +{ + uint16_t i; + uint8_t channels = 0; + uint8_t output_channels = 0; + bitfile ld = {0}; + uint32_t bitsconsumed; + uint16_t frame_len; + void *sample_buffer; + uint32_t startbit=0, endbit=0, payload_bits=0; + +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + + /* safety checks */ + if ((hDecoder == NULL) || (hInfo == NULL) || (buffer == NULL)) + { + return NULL; + } + +#if 0 + printf("%d\n", buffer_size*8); +#endif + + frame_len = hDecoder->frameLength; + + + memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); + memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); + +#ifdef USE_TIME_LIMIT + if ((TIME_LIMIT * get_sample_rate(hDecoder->sf_index)) > hDecoder->TL_count) + { + hDecoder->TL_count += 1024; + } else { + hInfo->error = (NUM_ERROR_MESSAGES-1); + goto error; + } +#endif + + + /* check for some common metadata tag types in the bitstream + * No need to return an error + */ + /* ID3 */ + if (buffer_size >= 128) + { + if (memcmp(buffer, "TAG", 3) == 0) + { + /* found it */ + hInfo->bytesconsumed = 128; /* 128 bytes fixed size */ + /* no error, but no output either */ + return NULL; + } + } + + + /* initialize the bitstream */ + faad_initbits(&ld, buffer, buffer_size); + +#if 0 + { + int i; + for (i = 0; i < ((buffer_size+3)>>2); i++) + { + uint8_t *buf; + uint32_t temp = 0; + buf = faad_getbitbuffer(&ld, 32); + //temp = getdword((void*)buf); + temp = *((uint32_t*)buf); + printf("0x%.8X\n", temp); + free(buf); + } + faad_endbits(&ld); + faad_initbits(&ld, buffer, buffer_size); + } +#endif + +#if 0 + if(hDecoder->latm_header_present) + { + payload_bits = faad_latm_frame(&hDecoder->latm_config, &ld); + startbit = faad_get_processed_bits(&ld); + if(payload_bits == -1U) + { + hInfo->error = 1; + goto error; + } + } +#endif + +#ifdef DRM + if (hDecoder->object_type == DRM_ER_LC) + { + /* We do not support stereo right now */ + if (0) //(hDecoder->channelConfiguration == 2) + { + hInfo->error = 28; // Throw CRC error + goto error; + } + + faad_getbits(&ld, 8 + DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); + } +#endif + + if (hDecoder->adts_header_present) + { + adts_header adts; + + adts.old_format = hDecoder->config.useOldADTSFormat; + if ((hInfo->error = adts_frame(&adts, &ld)) > 0) + goto error; + + /* MPEG2 does byte_alignment() here, + * but ADTS header is always multiple of 8 bits in MPEG2 + * so not needed to actually do it. + */ + } + +#ifdef ANALYSIS + dbg_count = 0; +#endif + + /* decode the complete bitstream */ +#ifdef DRM + if (/*(hDecoder->object_type == 6) ||*/ (hDecoder->object_type == DRM_ER_LC)) + { + DRM_aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); + } else { +#endif + raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); +#ifdef DRM + } +#endif + +#if 0 + if(hDecoder->latm_header_present) + { + endbit = faad_get_processed_bits(&ld); + if(endbit-startbit > payload_bits) + fprintf(stderr, "\r\nERROR, too many payload bits read: %u > %d. Please. report with a link to a sample\n", + endbit-startbit, payload_bits); + if(hDecoder->latm_config.otherDataLenBits > 0) + faad_getbits(&ld, hDecoder->latm_config.otherDataLenBits); + faad_byte_align(&ld); + } +#endif + + channels = hDecoder->fr_channels; + + if (hInfo->error > 0) + goto error; + + /* safety check */ + if (channels == 0 || channels > MAX_CHANNELS) + { + /* invalid number of channels */ + hInfo->error = 12; + goto error; + } + + /* no more bit reading after this */ + bitsconsumed = faad_get_processed_bits(&ld); + hInfo->bytesconsumed = bit2byte(bitsconsumed); + if (ld.error) + { + hInfo->error = 14; + goto error; + } + faad_endbits(&ld); + + + if (!hDecoder->adts_header_present && !hDecoder->adif_header_present +#if 0 + && !hDecoder->latm_header_present +#endif + ) + { + if (hDecoder->channelConfiguration == 0) + hDecoder->channelConfiguration = channels; + + if (channels == 8) /* 7.1 */ + hDecoder->channelConfiguration = 7; + if (channels == 7) /* not a standard channelConfiguration */ + hDecoder->channelConfiguration = 0; + } + + if ((channels == 5 || channels == 6) && hDecoder->config.downMatrix) + { + hDecoder->downMatrix = 1; + output_channels = 2; + } else { + output_channels = channels; + } + +#if (defined(PS_DEC) || defined(DRM_PS)) + hDecoder->upMatrix = 0; + /* check if we have a mono file */ + if (output_channels == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + hDecoder->upMatrix = 1; + output_channels = 2; + } +#endif + + /* Make a channel configuration based on either a PCE or a channelConfiguration */ + create_channel_config(hDecoder, hInfo); + + /* number of samples in this frame */ + hInfo->samples = frame_len*output_channels; + /* number of channels in this frame */ + hInfo->channels = output_channels; + /* samplerate */ + hInfo->samplerate = get_sample_rate(hDecoder->sf_index); + /* object type */ + hInfo->object_type = hDecoder->object_type; + /* sbr */ + hInfo->sbr = NO_SBR; + /* header type */ + hInfo->header_type = RAW; + if (hDecoder->adif_header_present) + hInfo->header_type = ADIF; + if (hDecoder->adts_header_present) + hInfo->header_type = ADTS; +#if 0 + if (hDecoder->latm_header_present) + hInfo->header_type = LATM; +#endif +#if (defined(PS_DEC) || defined(DRM_PS)) + hInfo->ps = hDecoder->ps_used_global; +#endif + + /* check if frame has channel elements */ + if (channels == 0) + { + hDecoder->frame++; + return NULL; + } + + /* allocate the buffer for the final samples */ + if ((hDecoder->sample_buffer == NULL) || + (hDecoder->alloced_channels != output_channels)) + { + static const uint8_t str[] = { sizeof(int16_t), sizeof(int32_t), sizeof(int32_t), + sizeof(float32_t), sizeof(double), sizeof(int16_t), sizeof(int16_t), + sizeof(int16_t), sizeof(int16_t), 0, 0, 0 + }; + uint8_t stride = str[hDecoder->config.outputFormat-1]; +#ifdef SBR_DEC + if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || (hDecoder->forceUpSampling == 1)) + { + stride = 2 * stride; + } +#endif + /* check if we want to use internal sample_buffer */ + if (sample_buffer_size == 0) + { + if (hDecoder->sample_buffer) + faad_free(hDecoder->sample_buffer); + hDecoder->sample_buffer = NULL; + hDecoder->sample_buffer = faad_malloc(frame_len*output_channels*stride); + } else if (sample_buffer_size < frame_len*output_channels*stride) { + /* provided sample buffer is not big enough */ + hInfo->error = 27; + return NULL; + } + hDecoder->alloced_channels = output_channels; + } + + if (sample_buffer_size == 0) + { + sample_buffer = hDecoder->sample_buffer; + } else { + sample_buffer = *sample_buffer2; + } + +#ifdef SBR_DEC + if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + { + uint8_t ele; + + /* this data is different when SBR is used or when the data is upsampled */ + if (!hDecoder->downSampledSBR) + { + frame_len *= 2; + hInfo->samples *= 2; + hInfo->samplerate *= 2; + } + + /* check if every element was provided with SBR data */ + for (ele = 0; ele < hDecoder->fr_ch_ele; ele++) + { + if (hDecoder->sbr[ele] == NULL) + { + hInfo->error = 25; + goto error; + } + } + + /* sbr */ + if (hDecoder->sbr_present_flag == 1) + { + hInfo->object_type = HE_AAC; + hInfo->sbr = SBR_UPSAMPLED; + } else { + hInfo->sbr = NO_SBR_UPSAMPLED; + } + if (hDecoder->downSampledSBR) + { + hInfo->sbr = SBR_DOWNSAMPLED; + } + } +#endif + + + sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, + output_channels, frame_len, hDecoder->config.outputFormat); + + +#ifdef DRM + //conceal_output(hDecoder, frame_len, output_channels, sample_buffer); +#endif + + + hDecoder->postSeekResetFlag = 0; + + hDecoder->frame++; +#ifdef LD_DEC + if (hDecoder->object_type != LD) + { +#endif + if (hDecoder->frame <= 1) + hInfo->samples = 0; +#ifdef LD_DEC + } else { + /* LD encoders will give lower delay */ + if (hDecoder->frame <= 0) + hInfo->samples = 0; + } +#endif + + /* cleanup */ +#ifdef ANALYSIS + fflush(stdout); +#endif + +#ifdef PROFILE + count = faad_get_ts() - count; + hDecoder->cycles += count; +#endif + + return sample_buffer; + +error: + + +#ifdef DRM + hDecoder->error_state = ERROR_STATE_INIT; +#endif + + /* reset filterbank state */ + for (i = 0; i < MAX_CHANNELS; i++) + { + if (hDecoder->fb_intermed[i] != NULL) + { + memset(hDecoder->fb_intermed[i], 0, hDecoder->frameLength*sizeof(real_t)); + } + } +#ifdef SBR_DEC + for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) + { + if (hDecoder->sbr[i] != NULL) + { + sbrReset(hDecoder->sbr[i]); + } + } +#endif + + + faad_endbits(&ld); + + /* cleanup */ +#ifdef ANALYSIS + fflush(stdout); +#endif + + return NULL; +} diff --git a/src/contrib/aacdecoder/libfaad/decoder.h b/src/contrib/aacdecoder/libfaad/decoder.h deleted file mode 100644 index 25ba0da4d..000000000 --- a/src/contrib/aacdecoder/libfaad/decoder.h +++ /dev/null @@ -1,122 +0,0 @@ -/* -** 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: decoder.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __DECODER_H__ -#define __DECODER_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32 - #pragma pack(push, 8) - #ifndef FAADAPI - #define FAADAPI __cdecl - #endif -#else - #ifndef FAADAPI - #define FAADAPI - #endif -#endif - -#include "bits.h" -#include "syntax.h" -#include "drc.h" -#include "specrec.h" -#include "filtbank.h" -#include "ic_predict.h" - - -/* 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_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) - -int8_t* FAADAPI faacDecGetErrorMessage(uint8_t errcode); - -uint32_t FAADAPI faacDecGetCapabilities(void); - -faacDecHandle FAADAPI faacDecOpen(void); - -faacDecConfigurationPtr FAADAPI faacDecGetCurrentConfiguration(faacDecHandle hDecoder); - -uint8_t FAADAPI faacDecSetConfiguration(faacDecHandle hDecoder, - faacDecConfigurationPtr config); - -/* Init the library based on info from the AAC file (ADTS/ADIF) */ -int32_t FAADAPI faacDecInit(faacDecHandle hDecoder, - uint8_t *buffer, - uint32_t buffer_size, - uint32_t *samplerate, - uint8_t *channels); - -/* Init the library using a DecoderSpecificInfo */ -int8_t FAADAPI faacDecInit2(faacDecHandle hDecoder, uint8_t *pBuffer, - uint32_t SizeOfDecoderSpecificInfo, - uint32_t *samplerate, uint8_t *channels); - -/* Init the library for DRM */ -int8_t FAADAPI faacDecInitDRM(faacDecHandle hDecoder, uint32_t samplerate, - uint8_t channels); - -void FAADAPI faacDecClose(faacDecHandle hDecoder); - -void FAADAPI faacDecPostSeekReset(faacDecHandle hDecoder, int32_t frame); - -void* FAADAPI faacDecDecode(faacDecHandle hDecoder, - faacDecFrameInfo *hInfo, - uint8_t *buffer, - uint32_t buffer_size); - -#ifdef _WIN32 - #pragma pack(pop) -#endif - -#ifdef __cplusplus -} -#endif -#endif diff --git a/src/contrib/aacdecoder/libfaad/drc.c b/src/contrib/aacdecoder/libfaad/drc.c old mode 100644 new mode 100755 index bc6bbb845..3c9ff3ae0 --- a/src/contrib/aacdecoder/libfaad/drc.c +++ b/src/contrib/aacdecoder/libfaad/drc.c @@ -1,170 +1,173 @@ -/* -** 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: drc.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include -#include -#include "syntax.h" -#include "drc.h" - -drc_info *drc_init(real_t cut, real_t boost) -{ - drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info)); - memset(drc, 0, sizeof(drc_info)); - - drc->ctrl1 = cut; - drc->ctrl2 = boost; - - drc->num_bands = 1; - drc->band_top[0] = 1024/4 - 1; - drc->dyn_rng_sgn[0] = 1; - drc->dyn_rng_ctl[0] = 0; - - return drc; -} - -void drc_end(drc_info *drc) -{ - if (drc) faad_free(drc); -} - -#ifdef FIXED_POINT -static real_t drc_pow2_table[] = -{ - COEF_CONST(0.5146511183), - COEF_CONST(0.5297315472), - COEF_CONST(0.5452538663), - COEF_CONST(0.5612310242), - COEF_CONST(0.5776763484), - COEF_CONST(0.5946035575), - COEF_CONST(0.6120267717), - COEF_CONST(0.6299605249), - COEF_CONST(0.6484197773), - COEF_CONST(0.6674199271), - COEF_CONST(0.6869768237), - COEF_CONST(0.7071067812), - COEF_CONST(0.7278265914), - COEF_CONST(0.7491535384), - COEF_CONST(0.7711054127), - COEF_CONST(0.7937005260), - COEF_CONST(0.8169577266), - COEF_CONST(0.8408964153), - COEF_CONST(0.8655365610), - COEF_CONST(0.8908987181), - COEF_CONST(0.9170040432), - COEF_CONST(0.9438743127), - COEF_CONST(0.9715319412), - COEF_CONST(1.0000000000), - COEF_CONST(1.0293022366), - COEF_CONST(1.0594630944), - COEF_CONST(1.0905077327), - COEF_CONST(1.1224620483), - COEF_CONST(1.1553526969), - COEF_CONST(1.1892071150), - COEF_CONST(1.2240535433), - COEF_CONST(1.2599210499), - COEF_CONST(1.2968395547), - COEF_CONST(1.3348398542), - COEF_CONST(1.3739536475), - COEF_CONST(1.4142135624), - COEF_CONST(1.4556531828), - COEF_CONST(1.4983070769), - COEF_CONST(1.5422108254), - COEF_CONST(1.5874010520), - COEF_CONST(1.6339154532), - COEF_CONST(1.6817928305), - COEF_CONST(1.7310731220), - COEF_CONST(1.7817974363), - COEF_CONST(1.8340080864), - COEF_CONST(1.8877486254), - COEF_CONST(1.9430638823) -}; -#endif - -void drc_decode(drc_info *drc, real_t *spec) -{ - uint16_t i, bd, top; -#ifdef FIXED_POINT - int32_t exp, frac; -#else - real_t factor, exp; -#endif - uint16_t bottom = 0; - - if (drc->num_bands == 1) - drc->band_top[0] = 1024/4 - 1; - - for (bd = 0; bd < drc->num_bands; bd++) - { - top = 4 * (drc->band_top[bd] + 1); - -#ifndef FIXED_POINT - /* Decode DRC gain factor */ - if (drc->dyn_rng_sgn[bd]) /* compress */ - exp = -drc->ctrl1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); - else /* boost */ - exp = drc->ctrl2 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); - factor = (real_t)pow(2.0, exp); - - /* Apply gain factor */ - for (i = bottom; i < top; i++) - spec[i] *= factor; -#else - /* Decode DRC gain factor */ - if (drc->dyn_rng_sgn[bd]) /* compress */ - { - exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; - frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; - } else { /* boost */ - exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; - frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; - } - - /* Apply gain factor */ - if (exp < 0) - { - for (i = bottom; i < top; i++) - { - spec[i] >>= -exp; - if (frac) - spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); - } - } else { - for (i = bottom; i < top; i++) - { - spec[i] <<= exp; - if (frac) - spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); - } - } -#endif - - bottom = top; - } -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: drc.c,v 1.28 2007/11/01 12:33:30 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include +#include +#include "syntax.h" +#include "drc.h" + +drc_info *drc_init(real_t cut, real_t boost) +{ + drc_info *drc = (drc_info*)faad_malloc(sizeof(drc_info)); + memset(drc, 0, sizeof(drc_info)); + + drc->ctrl1 = cut; + drc->ctrl2 = boost; + + drc->num_bands = 1; + drc->band_top[0] = 1024/4 - 1; + drc->dyn_rng_sgn[0] = 1; + drc->dyn_rng_ctl[0] = 0; + + return drc; +} + +void drc_end(drc_info *drc) +{ + if (drc) faad_free(drc); +} + +#ifdef FIXED_POINT +static real_t drc_pow2_table[] = +{ + COEF_CONST(0.5146511183), + COEF_CONST(0.5297315472), + COEF_CONST(0.5452538663), + COEF_CONST(0.5612310242), + COEF_CONST(0.5776763484), + COEF_CONST(0.5946035575), + COEF_CONST(0.6120267717), + COEF_CONST(0.6299605249), + COEF_CONST(0.6484197773), + COEF_CONST(0.6674199271), + COEF_CONST(0.6869768237), + COEF_CONST(0.7071067812), + COEF_CONST(0.7278265914), + COEF_CONST(0.7491535384), + COEF_CONST(0.7711054127), + COEF_CONST(0.7937005260), + COEF_CONST(0.8169577266), + COEF_CONST(0.8408964153), + COEF_CONST(0.8655365610), + COEF_CONST(0.8908987181), + COEF_CONST(0.9170040432), + COEF_CONST(0.9438743127), + COEF_CONST(0.9715319412), + COEF_CONST(1.0000000000), + COEF_CONST(1.0293022366), + COEF_CONST(1.0594630944), + COEF_CONST(1.0905077327), + COEF_CONST(1.1224620483), + COEF_CONST(1.1553526969), + COEF_CONST(1.1892071150), + COEF_CONST(1.2240535433), + COEF_CONST(1.2599210499), + COEF_CONST(1.2968395547), + COEF_CONST(1.3348398542), + COEF_CONST(1.3739536475), + COEF_CONST(1.4142135624), + COEF_CONST(1.4556531828), + COEF_CONST(1.4983070769), + COEF_CONST(1.5422108254), + COEF_CONST(1.5874010520), + COEF_CONST(1.6339154532), + COEF_CONST(1.6817928305), + COEF_CONST(1.7310731220), + COEF_CONST(1.7817974363), + COEF_CONST(1.8340080864), + COEF_CONST(1.8877486254), + COEF_CONST(1.9430638823) +}; +#endif + +void drc_decode(drc_info *drc, real_t *spec) +{ + uint16_t i, bd, top; +#ifdef FIXED_POINT + int32_t exp, frac; +#else + real_t factor, exp; +#endif + uint16_t bottom = 0; + + if (drc->num_bands == 1) + drc->band_top[0] = 1024/4 - 1; + + for (bd = 0; bd < drc->num_bands; bd++) + { + top = 4 * (drc->band_top[bd] + 1); + +#ifndef FIXED_POINT + /* Decode DRC gain factor */ + if (drc->dyn_rng_sgn[bd]) /* compress */ + exp = -drc->ctrl1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); + else /* boost */ + exp = drc->ctrl2 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/REAL_CONST(24.0); + factor = (real_t)pow(2.0, exp); + + /* Apply gain factor */ + for (i = bottom; i < top; i++) + spec[i] *= factor; +#else + /* Decode DRC gain factor */ + if (drc->dyn_rng_sgn[bd]) /* compress */ + { + exp = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; + frac = -1 * (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; + } else { /* boost */ + exp = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level))/ 24; + frac = (drc->dyn_rng_ctl[bd] - (DRC_REF_LEVEL - drc->prog_ref_level)) % 24; + } + + /* Apply gain factor */ + if (exp < 0) + { + for (i = bottom; i < top; i++) + { + spec[i] >>= -exp; + if (frac) + spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); + } + } else { + for (i = bottom; i < top; i++) + { + spec[i] <<= exp; + if (frac) + spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); + } + } +#endif + + bottom = top; + } +} diff --git a/src/contrib/aacdecoder/libfaad/drc.h b/src/contrib/aacdecoder/libfaad/drc.h old mode 100644 new mode 100755 index 2fd29766f..49118bcd0 --- a/src/contrib/aacdecoder/libfaad/drc.h +++ b/src/contrib/aacdecoder/libfaad/drc.h @@ -1,46 +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: drc.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __DRC_H__ -#define __DRC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define DRC_REF_LEVEL 20*4 /* -20 dB */ - - -drc_info *drc_init(real_t cut, real_t boost); -void drc_end(drc_info *drc); -void drc_decode(drc_info *drc, real_t *spec); - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: drc.h,v 1.22 2007/11/01 12:33:30 menno Exp $ +**/ + +#ifndef __DRC_H__ +#define __DRC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define DRC_REF_LEVEL 20*4 /* -20 dB */ + + +drc_info *drc_init(real_t cut, real_t boost); +void drc_end(drc_info *drc); +void drc_decode(drc_info *drc, real_t *spec); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/drm_dec.c b/src/contrib/aacdecoder/libfaad/drm_dec.c new file mode 100755 index 000000000..61cb8180e --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/drm_dec.c @@ -0,0 +1,965 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: drm_dec.c,v 1.9 2007/11/01 12:33:30 menno Exp $ +**/ + +#include +#include +#include +#include +#include "common.h" + +#ifdef DRM + +#include "sbr_dec.h" +#include "drm_dec.h" +#include "bits.h" + +/* constants */ +#define DECAY_CUTOFF 3 +#define DECAY_SLOPE 0.05f + +/* type definitaions */ +typedef const int8_t (*drm_ps_huff_tab)[2]; + + +/* binary search huffman tables */ +static const int8_t f_huffman_sa[][2] = +{ + { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 1x */ + { /*7*/ -8, 4 }, /* index 2: 3 bits: 10x */ + { 5, 6 }, /* index 3: 3 bits: 11x */ + { /*1*/ -14, /*-1*/ -16 }, /* index 4: 4 bits: 101x */ + { /*-2*/ -17, 7 }, /* index 5: 4 bits: 110x */ + { 8, 9 }, /* index 6: 4 bits: 111x */ + { /*2*/ -13, /*-3*/ -18 }, /* index 7: 5 bits: 1101x */ + { /*3*/ -12, 10 }, /* index 8: 5 bits: 1110x */ + { 11, 12 }, /* index 9: 5 bits: 1111x */ + { /*4*/ -11, /*5*/ -10 }, /* index 10: 6 bits: 11101x */ + { /*-4*/ -19, /*-5*/ -20 }, /* index 11: 6 bits: 11110x */ + { /*6*/ -9, 13 }, /* index 12: 6 bits: 11111x */ + { /*-7*/ -22, /*-6*/ -21 } /* index 13: 7 bits: 111111x */ +}; + +static const int8_t t_huffman_sa[][2] = +{ + { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 1x */ + { /*-1*/ -16, /*1*/ -14 }, /* index 2: 3 bits: 10x */ + { 4, 5 }, /* index 3: 3 bits: 11x */ + { /*-2*/ -17, /*2*/ -13 }, /* index 4: 4 bits: 110x */ + { 6, 7 }, /* index 5: 4 bits: 111x */ + { /*-3*/ -18, /*3*/ -12 }, /* index 6: 5 bits: 1110x */ + { 8, 9 }, /* index 7: 5 bits: 1111x */ + { /*-4*/ -19, /*4*/ -11 }, /* index 8: 6 bits: 11110x */ + { 10, 11 }, /* index 9: 6 bits: 11111x */ + { /*-5*/ -20, /*5*/ -10 }, /* index 10: 7 bits: 111110x */ + { /*-6*/ -21, 12 }, /* index 11: 7 bits: 111111x */ + { /*-7*/ -22, 13 }, /* index 12: 8 bits: 1111111x */ + { /*6*/ -9, /*7*/ -8 } /* index 13: 9 bits: 11111111x */ +}; + +static const int8_t f_huffman_pan[][2] = +{ + { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ + { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ + { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ + { 4, 5 }, /* index 3: 4 bits: 111x */ + { /*-2*/ -17, /*2*/ -13 }, /* index 4: 5 bits: 1110x */ + { 6, 7 }, /* index 5: 5 bits: 1111x */ + { /*-3*/ -18, /*3*/ -12 }, /* index 6: 6 bits: 11110x */ + { 8, 9 }, /* index 7: 6 bits: 11111x */ + { /*-4*/ -19, /*4*/ -11 }, /* index 8: 7 bits: 111110x */ + { 10, 11 }, /* index 9: 7 bits: 111111x */ + { /*-5*/ -20, /*5*/ -10 }, /* index 10: 8 bits: 1111110x */ + { 12, 13 }, /* index 11: 8 bits: 1111111x */ + { /*-6*/ -21, /*6*/ -9 }, /* index 12: 9 bits: 11111110x */ + { /*-7*/ -22, 14 }, /* index 13: 9 bits: 11111111x */ + { /*7*/ -8, 15 }, /* index 14: 10 bits: 111111111x */ + { 16, 17 }, /* index 15: 11 bits: 1111111111x */ + { /*-8*/ -23, /*8*/ -7 }, /* index 16: 12 bits: 11111111110x */ + { 18, 19 }, /* index 17: 12 bits: 11111111111x */ + { /*-10*/ -25, 20 }, /* index 18: 13 bits: 111111111110x */ + { 21, 22 }, /* index 19: 13 bits: 111111111111x */ + { /*-9*/ -24, /*9*/ -6 }, /* index 20: 14 bits: 1111111111101x */ + { /*10*/ -5, 23 }, /* index 21: 14 bits: 1111111111110x */ + { 24, 25 }, /* index 22: 14 bits: 1111111111111x */ + { /*-13*/ -28, /*-11*/ -26 }, /* index 23: 15 bits: 11111111111101x */ + { /*11*/ -4, /*13*/ -2 }, /* index 24: 15 bits: 11111111111110x */ + { 26, 27 }, /* index 25: 15 bits: 11111111111111x */ + { /*-14*/ -29, /*-12*/ -27 }, /* index 26: 16 bits: 111111111111110x */ + { /*12*/ -3, /*14*/ -1 } /* index 27: 16 bits: 111111111111111x */ +}; + +static const int8_t t_huffman_pan[][2] = +{ + { /*0*/ -15, 1 }, /* index 0: 1 bits: x */ + { /*-1*/ -16, 2 }, /* index 1: 2 bits: 1x */ + { /*1*/ -14, 3 }, /* index 2: 3 bits: 11x */ + { /*-2*/ -17, 4 }, /* index 3: 4 bits: 111x */ + { /*2*/ -13, 5 }, /* index 4: 5 bits: 1111x */ + { /*-3*/ -18, 6 }, /* index 5: 6 bits: 11111x */ + { /*3*/ -12, 7 }, /* index 6: 7 bits: 111111x */ + { /*-4*/ -19, 8 }, /* index 7: 8 bits: 1111111x */ + { /*4*/ -11, 9 }, /* index 8: 9 bits: 11111111x */ + { 10, 11 }, /* index 9: 10 bits: 111111111x */ + { /*-5*/ -20, /*5*/ -10 }, /* index 10: 11 bits: 1111111110x */ + { 12, 13 }, /* index 11: 11 bits: 1111111111x */ + { /*-6*/ -21, /*6*/ -9 }, /* index 12: 12 bits: 11111111110x */ + { 14, 15 }, /* index 13: 12 bits: 11111111111x */ + { /*-7*/ -22, /*7*/ -8 }, /* index 14: 13 bits: 111111111110x */ + { 16, 17 }, /* index 15: 13 bits: 111111111111x */ + { /*-8*/ -23, /*8*/ -7 }, /* index 16: 14 bits: 1111111111110x */ + { 18, 19 }, /* index 17: 14 bits: 1111111111111x */ + { /*-10*/ -25, /*10*/ -5 }, /* index 18: 15 bits: 11111111111110x */ + { 20, 21 }, /* index 19: 15 bits: 11111111111111x */ + { /*-9*/ -24, /*9*/ -6 }, /* index 20: 16 bits: 111111111111110x */ + { 22, 23 }, /* index 21: 16 bits: 111111111111111x */ + { 24, 25 }, /* index 22: 17 bits: 1111111111111110x */ + { 26, 27 }, /* index 23: 17 bits: 1111111111111111x */ + { /*-14*/ -29, /*-13*/ -28 }, /* index 24: 18 bits: 11111111111111100x */ + { /*-12*/ -27, /*-11*/ -26 }, /* index 25: 18 bits: 11111111111111101x */ + { /*11*/ -4, /*12*/ -3 }, /* index 26: 18 bits: 11111111111111110x */ + { /*13*/ -2, /*14*/ -1 } /* index 27: 18 bits: 11111111111111111x */ +}; + +/* There are 3 classes in the standard but the last 2 are identical */ +static const real_t sa_quant[8][2] = +{ + { FRAC_CONST(0.0000), FRAC_CONST(0.0000) }, + { FRAC_CONST(0.0501), FRAC_CONST(0.1778) }, + { FRAC_CONST(0.0706), FRAC_CONST(0.2818) }, + { FRAC_CONST(0.0995), FRAC_CONST(0.4467) }, + { FRAC_CONST(0.1399), FRAC_CONST(0.5623) }, + { FRAC_CONST(0.1957), FRAC_CONST(0.7079) }, + { FRAC_CONST(0.2713), FRAC_CONST(0.8913) }, + { FRAC_CONST(0.3699), FRAC_CONST(1.0000) }, +}; + +/* We don't need the actual quantizer values */ +#if 0 +static const real_t pan_quant[8][5] = +{ + { COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000), COEF_CONST(0.0000) }, + { COEF_CONST(0.1661), COEF_CONST(0.1661), COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.3322) }, + { COEF_CONST(0.3322), COEF_CONST(0.3322), COEF_CONST(0.6644), COEF_CONST(0.8305), COEF_CONST(0.8305) }, + { COEF_CONST(0.4983), COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(1.6610) }, + { COEF_CONST(0.6644), COEF_CONST(0.9966), COEF_CONST(1.4949), COEF_CONST(2.1593), COEF_CONST(2.4914) }, + { COEF_CONST(0.8305), COEF_CONST(1.3288), COEF_CONST(2.1593), COEF_CONST(2.9897), COEF_CONST(3.4880) }, + { COEF_CONST(0.9966), COEF_CONST(1.8271), COEF_CONST(2.8236), COEF_CONST(3.8202), COEF_CONST(4.6507) }, + { COEF_CONST(1.3288), COEF_CONST(2.3253), COEF_CONST(3.4880), COEF_CONST(4.6507), COEF_CONST(5.8134) }, +}; +#endif + +/* 2^(pan_quant[x][y] */ +static const real_t pan_pow_2_pos[8][5] = { + { REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000), REAL_CONST(1.0000000) }, + { REAL_CONST(1.1220021), REAL_CONST(1.1220021), REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.2589312) }, + { REAL_CONST(1.2589312), REAL_CONST(1.2589312), REAL_CONST(1.5849090), REAL_CONST(1.7783016), REAL_CONST(1.7783016) }, + { REAL_CONST(1.4125481), REAL_CONST(1.5849090), REAL_CONST(1.9952921), REAL_CONST(2.8184461), REAL_CONST(3.1623565) }, + { REAL_CONST(1.5849090), REAL_CONST(1.9952922), REAL_CONST(2.8184461), REAL_CONST(4.4669806), REAL_CONST(5.6232337) }, + { REAL_CONST(1.7783016), REAL_CONST(2.5119365), REAL_CONST(4.4669806), REAL_CONST(7.9430881), REAL_CONST(11.219994) }, + { REAL_CONST(1.9952921), REAL_CONST(3.5482312), REAL_CONST(7.0792671), REAL_CONST(14.125206), REAL_CONST(25.118876) }, + { REAL_CONST(2.5119365), REAL_CONST(5.0116998), REAL_CONST(11.219994), REAL_CONST(25.118876), REAL_CONST(56.235140) } +}; + +/* 2^(-pan_quant[x][y] */ +static const real_t pan_pow_2_neg[8][5] = { + { REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1), REAL_CONST(1) }, + { REAL_CONST(0.8912487), REAL_CONST(0.8912487), REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.7943242) }, + { REAL_CONST(0.7943242), REAL_CONST(0.7943242), REAL_CONST(0.6309511), REAL_CONST(0.5623344), REAL_CONST(0.5623344) }, + { REAL_CONST(0.7079405), REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.3162199) }, + { REAL_CONST(0.6309511), REAL_CONST(0.5011797), REAL_CONST(0.3548054), REAL_CONST(0.2238649), REAL_CONST(0.1778336) }, + { REAL_CONST(0.5623343), REAL_CONST(0.3980992), REAL_CONST(0.2238649), REAL_CONST(0.1258956), REAL_CONST(0.0891266) }, + { REAL_CONST(0.5011797), REAL_CONST(0.2818306), REAL_CONST(0.1412576), REAL_CONST(0.0707954), REAL_CONST(0.0398107) }, + { REAL_CONST(0.3980992), REAL_CONST(0.1995331), REAL_CONST(0.0891267), REAL_CONST(0.0398107), REAL_CONST(0.0177825) } +}; + +/* 2^(pan_quant[x][y]/30) */ +static const real_t pan_pow_2_30_pos[8][5] = { + { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, + { COEF_CONST(1.003845098), COEF_CONST(1.003845098), COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.007704982) }, + { COEF_CONST(1.007704982), COEF_CONST(1.007704982), COEF_CONST(1.01546933), COEF_CONST(1.019373909), COEF_CONST(1.019373909) }, + { COEF_CONST(1.011579706), COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.039123167) }, + { COEF_CONST(1.01546933), COEF_CONST(1.023293502), COEF_CONST(1.035142941), COEF_CONST(1.051155908), COEF_CONST(1.059252598) }, + { COEF_CONST(1.019373909), COEF_CONST(1.03117796), COEF_CONST(1.051155908), COEF_CONST(1.071518432), COEF_CONST(1.0839263) }, + { COEF_CONST(1.023293502), COEF_CONST(1.043118698), COEF_CONST(1.067414119), COEF_CONST(1.092277933), COEF_CONST(1.113439626) }, + { COEF_CONST(1.03117796), COEF_CONST(1.055195268), COEF_CONST(1.0839263), COEF_CONST(1.113439626), COEF_CONST(1.143756546) } +}; + +/* 2^(-pan_quant[x][y]/30) */ +static const real_t pan_pow_2_30_neg[8][5] = { + { COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1), COEF_CONST(1) }, + { COEF_CONST(0.99616963), COEF_CONST(0.99616963), COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.99235393) }, + { COEF_CONST(0.992353931), COEF_CONST(0.992353931), COEF_CONST(0.984766325), COEF_CONST(0.980994305), COEF_CONST(0.980994305) }, + { COEF_CONST(0.988552848), COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.962349827) }, + { COEF_CONST(0.984766325), COEF_CONST(0.977236734), COEF_CONST(0.966050157), COEF_CONST(0.951333663), COEF_CONST(0.944061881) }, + { COEF_CONST(0.980994305), COEF_CONST(0.969764715), COEF_CONST(0.951333663), COEF_CONST(0.933255062), COEF_CONST(0.922571949) }, + { COEF_CONST(0.977236734), COEF_CONST(0.958663671), COEF_CONST(0.936843519), COEF_CONST(0.915517901), COEF_CONST(0.898117847) }, + { COEF_CONST(0.969764715), COEF_CONST(0.947691892), COEF_CONST(0.922571949), COEF_CONST(0.898117847), COEF_CONST(0.874311936) } +}; + +static const real_t g_decayslope[MAX_SA_BAND] = { + FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.95),FRAC_CONST(0.9), FRAC_CONST(0.85), FRAC_CONST(0.8), + FRAC_CONST(0.75),FRAC_CONST(0.7), FRAC_CONST(0.65),FRAC_CONST(0.6), FRAC_CONST(0.55),FRAC_CONST(0.5), FRAC_CONST(0.45), + FRAC_CONST(0.4), FRAC_CONST(0.35),FRAC_CONST(0.3), FRAC_CONST(0.25),FRAC_CONST(0.2), FRAC_CONST(0.15), FRAC_CONST(0.1), + FRAC_CONST(0.05),FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), + FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), + FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), + FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0) +}; + +static const real_t sa_sqrt_1_minus[8][2] = { + { FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.998744206), FRAC_CONST(0.984066644) }, + { FRAC_CONST(0.997504707), FRAC_CONST(0.959473168) }, + { FRAC_CONST(0.995037562), FRAC_CONST(0.894683804) }, + { FRAC_CONST(0.990165638), FRAC_CONST(0.826933317) }, + { FRAC_CONST(0.980663811), FRAC_CONST(0.706312672) }, + { FRAC_CONST(0.962494836), FRAC_CONST(0.45341406) }, + { FRAC_CONST(0.929071574), FRAC_CONST(0) } +}; + +static const uint8_t sa_freq_scale[9] = +{ + 0, 1, 2, 3, 5, 7, 10, 13, 23 +}; + +static const uint8_t pan_freq_scale[21] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 18, 22, 26, 32, 64 +}; + +static const uint8_t pan_quant_class[20] = +{ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 3, 3, 3, 4, 4, 4 +}; + +/* Inverse mapping lookup */ +static const uint8_t pan_inv_freq[64] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 +}; + +static const uint8_t sa_inv_freq[MAX_SA_BAND] = { + 0, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7 +}; + +static const real_t filter_coeff[] = +{ + FRAC_CONST(0.65143905754106), + FRAC_CONST(0.56471812200776), + FRAC_CONST(0.48954165955695) +}; + +static const uint8_t delay_length[3] = +{ + 3, 4, 5 +}; + +static const real_t delay_fraction[] = +{ + FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) +}; + +static const real_t peak_decay = FRAC_CONST(0.76592833836465); + +static const real_t smooth_coeff = FRAC_CONST(0.25); + +/* Please note that these are the same tables as in plain PS */ +static const complex_t Q_Fract_allpass_Qmf[][3] = { + { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, + { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, + { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, + { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, + { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, + { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, + { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, + { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, + { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, + { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, + { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, + { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, + { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, + { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, + { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, + { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, + { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, + { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, + { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, + { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, + { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, + { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, + { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, + { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, + { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, + { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, + { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, + { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, + { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, + { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, + { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, + { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, + { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, + { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, + { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, + { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, + { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, + { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, + { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, + { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, + { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, + { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, + { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, + { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, + { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, + { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, + { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, + { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, + { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, + { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, + { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, + { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, + { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, + { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, + { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, + { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, + { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, + { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, + { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, + { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, + { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, + { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, + { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, + { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } +}; + +static const complex_t Phi_Fract_Qmf[] = { + { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, + { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, + { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, + { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, + { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, + { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, + { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, + { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, + { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, + { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, + { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, + { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, + { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, + { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, + { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, + { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, + { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, + { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, + { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, + { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, + { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, + { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, + { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, + { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, + { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, + { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, + { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, + { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, + { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, + { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, + { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, + { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, + { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, + { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, + { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, + { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, + { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, + { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, + { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, + { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, + { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, + { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, + { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, + { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, + { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, + { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, + { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, + { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, + { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, + { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, + { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, + { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, + { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, + { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, + { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, + { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, + { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, + { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, + { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, + { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, + { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, + { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, + { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, + { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } +}; + + +/* static function declarations */ +static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld); +static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld); +static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff); + + +uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld) +{ + uint16_t bits = (uint16_t)faad_get_processed_bits(ld); + + ps->drm_ps_data_available = 1; + + ps->bs_enable_sa = faad_get1bit(ld); + ps->bs_enable_pan = faad_get1bit(ld); + + if (ps->bs_enable_sa) + { + drm_ps_sa_element(ps, ld); + } + + if (ps->bs_enable_pan) + { + drm_ps_pan_element(ps, ld); + } + + bits = (uint16_t)faad_get_processed_bits(ld) - bits; + + return bits; +} + +static void drm_ps_sa_element(drm_ps_info *ps, bitfile *ld) +{ + drm_ps_huff_tab huff; + uint8_t band; + + ps->bs_sa_dt_flag = faad_get1bit(ld); + if (ps->bs_sa_dt_flag) + { + huff = t_huffman_sa; + } else { + huff = f_huffman_sa; + } + + for (band = 0; band < DRM_NUM_SA_BANDS; band++) + { + ps->bs_sa_data[band] = huff_dec(ld, huff); + } +} + +static void drm_ps_pan_element(drm_ps_info *ps, bitfile *ld) +{ + drm_ps_huff_tab huff; + uint8_t band; + + ps->bs_pan_dt_flag = faad_get1bit(ld); + if (ps->bs_pan_dt_flag) + { + huff = t_huffman_pan; + } else { + huff = f_huffman_pan; + } + + for (band = 0; band < DRM_NUM_PAN_BANDS; band++) + { + ps->bs_pan_data[band] = huff_dec(ld, huff); + } +} + +/* binary search huffman decoding */ +static int8_t huff_dec(bitfile *ld, drm_ps_huff_tab huff) +{ + uint8_t bit; + int16_t index = 0; + + while (index >= 0) + { + bit = (uint8_t)faad_get1bit(ld); + index = huff[index][bit]; + } + + return index + 15; +} + + +static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i) +{ + if (i < 0) { + /* printf(" SAminclip %d", i); */ + ps->sa_decode_error = 1; + return 0; + } else if (i > 7) { + /* printf(" SAmaxclip %d", i); */ + ps->sa_decode_error = 1; + return 7; + } else + return i; +} + +static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i) +{ + if (i < -7) { + /* printf(" PANminclip %d", i); */ + ps->pan_decode_error = 1; + return -7; + } else if (i > 7) { + /* printf(" PANmaxclip %d", i); */ + ps->pan_decode_error = 1; + return 7; + } else + return i; +} + +static void drm_ps_delta_decode(drm_ps_info *ps) +{ + uint8_t band; + + if (ps->bs_enable_sa) + { + if (ps->bs_sa_dt_flag && !ps->g_last_had_sa) + { + /* wait until we get a DT frame */ + ps->bs_enable_sa = 0; + } else if (ps->bs_sa_dt_flag) { + /* DT frame, we have a last frame, so we can decode */ + ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]); + } else { + /* DF always decodable */ + ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]); + } + + for (band = 1; band < DRM_NUM_SA_BANDS; band++) + { + if (ps->bs_sa_dt_flag && ps->g_last_had_sa) + { + ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]); + } else if (!ps->bs_sa_dt_flag) { + ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]); + } + } + } + + /* An error during SA decoding implies PAN data will be undecodable, too */ + /* Also, we don't like on/off switching in PS, so we force to last settings */ + if (ps->sa_decode_error) { + ps->pan_decode_error = 1; + ps->bs_enable_pan = ps->g_last_had_pan; + ps->bs_enable_sa = ps->g_last_had_sa; + } + + + if (ps->bs_enable_sa) + { + if (ps->sa_decode_error) { + for (band = 0; band < DRM_NUM_SA_BANDS; band++) + { + ps->g_sa_index[band] = ps->g_last_good_sa_index[band]; + } + } else { + for (band = 0; band < DRM_NUM_SA_BANDS; band++) + { + ps->g_last_good_sa_index[band] = ps->g_sa_index[band]; + } + } + } + + if (ps->bs_enable_pan) + { + if (ps->bs_pan_dt_flag && !ps->g_last_had_pan) + { + ps->bs_enable_pan = 0; + } else if (ps->bs_pan_dt_flag) { + ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]); + } else { + ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]); + } + + for (band = 1; band < DRM_NUM_PAN_BANDS; band++) + { + if (ps->bs_pan_dt_flag && ps->g_last_had_pan) + { + ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]); + } else if (!ps->bs_pan_dt_flag) { + ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]); + } + } + + if (ps->pan_decode_error) { + for (band = 0; band < DRM_NUM_PAN_BANDS; band++) + { + ps->g_pan_index[band] = ps->g_last_good_pan_index[band]; + } + } else { + for (band = 0; band < DRM_NUM_PAN_BANDS; band++) + { + ps->g_last_good_pan_index[band] = ps->g_pan_index[band]; + } + } + } +} + +static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64]) +{ + uint8_t s, b, k; + complex_t qfrac, tmp0, tmp, in, R0; + real_t peakdiff; + real_t nrg; + real_t power; + real_t transratio; + real_t new_delay_slopes[NUM_OF_LINKS]; + uint8_t temp_delay_ser[NUM_OF_LINKS]; + complex_t Phi_Fract; +#ifdef FIXED_POINT + uint32_t in_re, in_im; +#endif + + for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) + { + /* set delay indices */ + for (k = 0; k < NUM_OF_LINKS; k++) + temp_delay_ser[k] = ps->delay_buf_index_ser[k]; + + RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); + IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); + + for (s = 0; s < NUM_OF_SUBSAMPLES; s++) + { + const real_t gamma = REAL_CONST(1.5); + const real_t sigma = REAL_CONST(1.5625); + + RE(in) = QMF_RE(X[s][b]); + IM(in) = QMF_IM(X[s][b]); + +#ifdef FIXED_POINT + /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF + * meaning that P will be scaled by 2^(-10) compared to floating point version + */ + in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); + in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); + power = in_re*in_re + in_im*in_im; +#else + power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); +#endif + + ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay); + if (ps->peakdecay_fast[b] < power) + ps->peakdecay_fast[b] = power; + + peakdiff = ps->prev_peakdiff[b]; + peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff); + ps->prev_peakdiff[b] = peakdiff; + + nrg = ps->prev_nrg[b]; + nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff); + ps->prev_nrg[b] = nrg; + + if (MUL_R(peakdiff, gamma) <= nrg) { + transratio = sigma; + } else { + transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); + } + + for (k = 0; k < NUM_OF_LINKS; k++) + { + new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); + } + + RE(tmp0) = RE(ps->d_buff[0][b]); + IM(tmp0) = IM(ps->d_buff[0][b]); + + RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); + IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); + + RE(ps->d_buff[1][b]) = RE(in); + IM(ps->d_buff[1][b]) = IM(in); + + ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); + + RE(R0) = RE(tmp); + IM(R0) = IM(tmp); + + for (k = 0; k < NUM_OF_LINKS; k++) + { + RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); + IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); + + RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); + IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); + + ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); + + RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); + IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); + + RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); + IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); + + RE(R0) = RE(tmp); + IM(R0) = IM(tmp); + } + + QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); + QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); + + for (k = 0; k < NUM_OF_LINKS; k++) + { + if (++temp_delay_ser[k] >= delay_length[k]) + temp_delay_ser[k] = 0; + } + } + } + + for (k = 0; k < NUM_OF_LINKS; k++) + ps->delay_buf_index_ser[k] = temp_delay_ser[k]; +} + +static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) +{ + uint8_t s, b, ifreq, qclass; + real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; + real_t new_dir_map, new_sa_map; + + if (ps->bs_enable_sa) + { + /* Instead of dequantization and mapping, we use an inverse mapping + to look up all the values we need */ + for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) + { + const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); + + ifreq = sa_inv_freq[b]; + qclass = (b != 0); + + sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; + new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; + + k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); + + sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; + new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; + + k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); + + } + + for (s = 0; s < NUM_OF_SUBSAMPLES; s++) + { + for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) + { + QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); + QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); + QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); + QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); + + sa_map[b] += k_sa_map[b]; + sa_dir_map[b] += k_sa_dir_map[b]; + } + for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++) + { + QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); + QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); + } + } + } + else { + for (s = 0; s < NUM_OF_SUBSAMPLES; s++) + { + for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) + { + QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); + QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); + } + } + } +} + +static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) +{ + uint8_t s, b, qclass, ifreq; + real_t tmp, coeff1, coeff2; + real_t pan_base[MAX_PAN_BAND]; + real_t pan_delta[MAX_PAN_BAND]; + qmf_t temp_l, temp_r; + + if (ps->bs_enable_pan) + { + for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) + { + /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an + inverse mapping 64->20 and look up the 2^G(x,y) values directly */ + ifreq = pan_inv_freq[b]; + qclass = pan_quant_class[ifreq]; + + if (ps->g_prev_pan_index[ifreq] >= 0) + { + pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; + } else { + pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; + } + + /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ + /* a en b can be negative so we may need to inverse parts */ + if (ps->g_pan_index[ifreq] >= 0) + { + if (ps->g_prev_pan_index[ifreq] >= 0) + { + pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], + pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); + } else { + pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], + pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); + } + } else { + if (ps->g_prev_pan_index[ifreq] >= 0) + { + pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], + pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); + } else { + pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], + pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); + } + } + } + + for (s = 0; s < NUM_OF_SUBSAMPLES; s++) + { + /* PAN always uses all 64 channels */ + for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) + { + tmp = pan_base[b]; + + coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); + coeff1 = MUL_R(coeff2, tmp); + + QMF_RE(temp_l) = QMF_RE(X_left[s][b]); + QMF_IM(temp_l) = QMF_IM(X_left[s][b]); + QMF_RE(temp_r) = QMF_RE(X_right[s][b]); + QMF_IM(temp_r) = QMF_IM(X_right[s][b]); + + QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); + QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); + QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); + QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); + + /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ + /* ^^^^^^^^^^^^^^^ k times */ + pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); + } + } + } +} + +drm_ps_info *drm_ps_init(void) +{ + drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info)); + + memset(ps, 0, sizeof(drm_ps_info)); + + return ps; +} + +void drm_ps_free(drm_ps_info *ps) +{ + faad_free(ps); +} + +/* main DRM PS decoding function */ +uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]) +{ + if (ps == NULL) + { + memcpy(X_right, X_left, sizeof(qmf_t)*30*64); + return 0; + } + + if (!ps->drm_ps_data_available && !guess) + { + memcpy(X_right, X_left, sizeof(qmf_t)*30*64); + memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index)); + memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index)); + return 0; + } + + /* if SBR CRC doesn't match out, we can assume decode errors to start with, + and we'll guess what the parameters should be */ + if (!guess) + { + ps->sa_decode_error = 0; + ps->pan_decode_error = 0; + drm_ps_delta_decode(ps); + } else + { + ps->sa_decode_error = 1; + ps->pan_decode_error = 1; + /* don't even bother decoding */ + } + + ps->drm_ps_data_available = 0; + + drm_calc_sa_side_signal(ps, X_left); + drm_add_ambiance(ps, X_left, X_right); + + if (ps->bs_enable_sa) + { + ps->g_last_had_sa = 1; + + memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS); + + } else { + ps->g_last_had_sa = 0; + } + + if (ps->bs_enable_pan) + { + drm_add_pan(ps, X_left, X_right); + + ps->g_last_had_pan = 1; + + memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS); + + } else { + ps->g_last_had_pan = 0; + } + + + return 0; +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/drm_dec.h b/src/contrib/aacdecoder/libfaad/drm_dec.h new file mode 100755 index 000000000..d0ac995e4 --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/drm_dec.h @@ -0,0 +1,100 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: drm_dec.h,v 1.8 2007/11/01 12:33:30 menno Exp $ +**/ + +#ifndef __DRM_DEC_H__ +#define __DRM_DEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "bits.h" + +#define DRM_PARAMETRIC_STEREO 0 +#define DRM_NUM_SA_BANDS 8 +#define DRM_NUM_PAN_BANDS 20 +#define NUM_OF_LINKS 3 +#define NUM_OF_QMF_CHANNELS 64 +#define NUM_OF_SUBSAMPLES 30 +#define MAX_SA_BAND 46 +#define MAX_PAN_BAND 64 +#define MAX_DELAY 5 + +typedef struct +{ + uint8_t drm_ps_data_available; + uint8_t bs_enable_sa; + uint8_t bs_enable_pan; + + uint8_t bs_sa_dt_flag; + uint8_t bs_pan_dt_flag; + + uint8_t g_last_had_sa; + uint8_t g_last_had_pan; + + int8_t bs_sa_data[DRM_NUM_SA_BANDS]; + int8_t bs_pan_data[DRM_NUM_PAN_BANDS]; + + int8_t g_sa_index[DRM_NUM_SA_BANDS]; + int8_t g_pan_index[DRM_NUM_PAN_BANDS]; + int8_t g_prev_sa_index[DRM_NUM_SA_BANDS]; + int8_t g_prev_pan_index[DRM_NUM_PAN_BANDS]; + + int8_t sa_decode_error; + int8_t pan_decode_error; + + int8_t g_last_good_sa_index[DRM_NUM_SA_BANDS]; + int8_t g_last_good_pan_index[DRM_NUM_PAN_BANDS]; + + qmf_t SA[NUM_OF_SUBSAMPLES][MAX_SA_BAND]; + + complex_t d_buff[2][MAX_SA_BAND]; + complex_t d2_buff[NUM_OF_LINKS][MAX_DELAY][MAX_SA_BAND]; + + uint8_t delay_buf_index_ser[NUM_OF_LINKS]; + + real_t prev_nrg[MAX_SA_BAND]; + real_t prev_peakdiff[MAX_SA_BAND]; + real_t peakdecay_fast[MAX_SA_BAND]; +} drm_ps_info; + + +uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld); + +drm_ps_info *drm_ps_init(void); +void drm_ps_free(drm_ps_info *ps); + +uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/error.c b/src/contrib/aacdecoder/libfaad/error.c old mode 100644 new mode 100755 index 158ac1019..8984a8390 --- a/src/contrib/aacdecoder/libfaad/error.c +++ b/src/contrib/aacdecoder/libfaad/error.c @@ -1,59 +1,70 @@ -/* -** 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: error.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "error.h" - -int8_t *err_msg[] = { - "No error", - "Gain control not yet implemented", - "Pulse coding not allowed in short blocks", - "Invalid huffman codebook", - "Negative scalefactor found, should be impossible", - "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" -}; - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: error.c,v 1.33 2008/09/19 23:31:39 menno Exp $ +**/ + +#include "common.h" +#include "error.h" + +char *err_msg[] = { + "No error", + "Gain control not yet implemented", + "Pulse coding not allowed in short blocks", + "Invalid huffman codebook", + "Scalefactor out of range", + "Unable to find ADTS syncword", + "Channel coupling not yet implemented", + "Channel configuration not allowed in error resilient frame", + "Bit error in error resilient scalefactor decoding", + "Error decoding huffman scalefactor (bitstream error)", + "Error decoding huffman codeword (bitstream error)", + "Non existent huffman codebook number found", + "Invalid number of channels", + "Maximum number of bitstream elements exceeded", + "Input data buffer too small", + "Array index out of range", + "Maximum number of scalefactor bands exceeded", + "Quantised value out of range", + "LTP lag out of range", + "Invalid SBR parameter decoded", + "SBR called without being initialised", + "Unexpected channel configuration change", + "Error in program_config_element", + "First SBR frame is not the same as first AAC frame", + "Unexpected fill element with SBR data", + "Not all elements were provided with SBR data", + "LTP decoding not available", + "Output data buffer too small", + "CRC error in DRM data", + "PNS not allowed in DRM data stream", + "No standard extension payload allowed in DRM", + "PCE shall be the first element in a frame", + "Bitstream value not allowed by specification", + "MAIN prediction not initialised" +}; + diff --git a/src/contrib/aacdecoder/libfaad/error.h b/src/contrib/aacdecoder/libfaad/error.h old mode 100644 new mode 100755 index 129faaaa4..0e79423a7 --- a/src/contrib/aacdecoder/libfaad/error.h +++ b/src/contrib/aacdecoder/libfaad/error.h @@ -1,41 +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: error.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __ERROR_H__ -#define __ERROR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define NUM_ERROR_MESSAGES 26 -extern int8_t *err_msg[]; - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: error.h,v 1.27 2008/09/19 23:31:40 menno Exp $ +**/ + +#ifndef __ERROR_H__ +#define __ERROR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define NUM_ERROR_MESSAGES 34 +extern char *err_msg[]; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/faad.h b/src/contrib/aacdecoder/libfaad/faad.h new file mode 100755 index 000000000..72f407280 --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/faad.h @@ -0,0 +1,35 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: faad.h,v 1.51 2007/11/01 12:33:29 menno Exp $ +**/ + +/* warn people for update */ +#pragma message("please update faad2 include filename and function names!") + +/* Backwards compatible link */ +#include "neaacdec.h" diff --git a/src/contrib/aacdecoder/libfaad/filtbank.c b/src/contrib/aacdecoder/libfaad/filtbank.c old mode 100644 new mode 100755 index 41d651ee4..1b1464bca --- a/src/contrib/aacdecoder/libfaad/filtbank.c +++ b/src/contrib/aacdecoder/libfaad/filtbank.c @@ -1,723 +1,406 @@ -/* -** 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: filtbank.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include -#include -#ifdef _WIN32_WCE -#define assert(x) -#else -#include -#endif - -#include "filtbank.h" -#include "decoder.h" -#include "syntax.h" -#include "kbd_win.h" -#include "sine_win.h" -#include "mdct.h" - - -fb_info *filter_bank_init(uint16_t frame_len) -{ - uint16_t nshort = frame_len/8; -#ifdef LD_DEC - uint16_t frame_len_ld = frame_len/2; -#endif - - fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); - memset(fb, 0, sizeof(fb_info)); - - /* normal */ - fb->mdct256 = faad_mdct_init(2*nshort); - fb->mdct2048 = faad_mdct_init(2*frame_len); -#ifdef LD_DEC - /* LD */ - fb->mdct1024 = faad_mdct_init(2*frame_len_ld); -#endif - -#ifdef ALLOW_SMALL_FRAMELENGTH - if (frame_len == 1024) - { -#endif - fb->long_window[0] = sine_long_1024; - fb->short_window[0] = sine_short_128; - fb->long_window[1] = kbd_long_1024; - fb->short_window[1] = kbd_short_128; -#ifdef LD_DEC - fb->ld_window[0] = sine_mid_512; - fb->ld_window[1] = ld_mid_512; -#endif -#ifdef ALLOW_SMALL_FRAMELENGTH - } else /* (frame_len == 960) */ { - fb->long_window[0] = sine_long_960; - fb->short_window[0] = sine_short_120; - fb->long_window[1] = kbd_long_960; - fb->short_window[1] = kbd_short_120; -#ifdef LD_DEC - fb->ld_window[0] = sine_mid_480; - fb->ld_window[1] = ld_mid_480; -#endif - } -#endif - -#ifdef USE_SSE - if (cpu_has_sse()) - { - fb->if_func = ifilter_bank_sse; - } else { - fb->if_func = ifilter_bank; - } -#endif - - return fb; -} - -void filter_bank_end(fb_info *fb) -{ - if (fb != NULL) - { -#ifdef PROFILE - printf("FB: %I64d cycles\n", fb->cycles); -#endif - - faad_mdct_end(fb->mdct256); - faad_mdct_end(fb->mdct2048); -#ifdef LD_DEC - faad_mdct_end(fb->mdct1024); -#endif - - faad_free(fb); - } -} - -static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) -{ -#ifdef LD_DEC - mdct_info *mdct = NULL; - - switch (len) - { - case 2048: - case 1920: - mdct = fb->mdct2048; - break; - case 1024: - case 960: - mdct = fb->mdct1024; - break; - } - - faad_imdct(mdct, in_data, out_data); -#else - faad_imdct(fb->mdct2048, in_data, out_data); -#endif -} - -#ifdef USE_SSE -static INLINE void imdct_long_sse(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) -{ -#ifdef LD_DEC - mdct_info *mdct = NULL; - - switch (len) - { - case 2048: - case 1920: - mdct = fb->mdct2048; - break; - case 1024: - case 960: - mdct = fb->mdct1024; - break; - } - - faad_imdct_sse(mdct, in_data, out_data); -#else - faad_imdct_sse(fb->mdct2048, in_data, out_data); -#endif -} -#endif - -#ifdef LTP_DEC -static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) -{ - mdct_info *mdct = NULL; - - switch (len) - { - case 2048: - case 1920: - mdct = fb->mdct2048; - break; - case 256: - case 240: - mdct = fb->mdct256; - break; -#ifdef LD_DEC - case 1024: - case 960: - mdct = fb->mdct1024; - break; -#endif - } - - faad_mdct(mdct, in_data, out_data); -} -#endif - -void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, real_t *overlap, - uint8_t object_type, uint16_t frame_len) -{ - int16_t i; - ALIGN real_t transf_buf[2*1024] = {0}; - - const real_t *window_long = NULL; - const real_t *window_long_prev = NULL; - const real_t *window_short = NULL; - const real_t *window_short_prev = NULL; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t trans = nshort/2; - - uint16_t nflat_ls = (nlong-nshort)/2; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - -#ifdef LD_DEC - if (object_type == LD) - { - window_long = fb->ld_window[window_shape]; - window_long_prev = fb->ld_window[window_shape_prev]; - } else { -#endif - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; -#ifdef LD_DEC - } -#endif - - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - imdct_long(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nlong; i+=4) - { - time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); - time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); - time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); - time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); - } - for (i = 0; i < nlong; i+=4) - { - overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); - overlap[i+1] = MUL_F(transf_buf[nlong+i+1],window_long[nlong-2-i]); - overlap[i+2] = MUL_F(transf_buf[nlong+i+2],window_long[nlong-3-i]); - overlap[i+3] = MUL_F(transf_buf[nlong+i+3],window_long[nlong-4-i]); - } - break; - - case LONG_START_SEQUENCE: - imdct_long(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nlong; i+=4) - { - time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); - time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); - time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); - time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); - } - for (i = 0; i < nflat_ls; i++) - overlap[i] = transf_buf[nlong+i]; - for (i = 0; i < nshort; i++) - overlap[nflat_ls+i] = MUL_F(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); - for (i = 0; i < nflat_ls; i++) - overlap[nflat_ls+nshort+i] = 0; - break; - - case EIGHT_SHORT_SEQUENCE: - faad_imdct(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0); - faad_imdct(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1); - faad_imdct(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2); - faad_imdct(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3); - faad_imdct(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4); - faad_imdct(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5); - faad_imdct(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6); - faad_imdct(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7); - for (i = 0; i < nflat_ls; i++) - time_out[i] = overlap[i]; - for(i = 0; i < nshort; i++) - { - time_out[nflat_ls+ i] = overlap[nflat_ls+ i] + MUL_F(transf_buf[nshort*0+i],window_short_prev[i]); - time_out[nflat_ls+1*nshort+i] = overlap[nflat_ls+nshort*1+i] + MUL_F(transf_buf[nshort*1+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*2+i],window_short[i]); - time_out[nflat_ls+2*nshort+i] = overlap[nflat_ls+nshort*2+i] + MUL_F(transf_buf[nshort*3+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*4+i],window_short[i]); - time_out[nflat_ls+3*nshort+i] = overlap[nflat_ls+nshort*3+i] + MUL_F(transf_buf[nshort*5+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*6+i],window_short[i]); - if (i < trans) - time_out[nflat_ls+4*nshort+i] = overlap[nflat_ls+nshort*4+i] + MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); - } - for(i = 0; i < nshort; i++) - { - if (i >= trans) - overlap[nflat_ls+4*nshort+i-nlong] = MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); - overlap[nflat_ls+5*nshort+i-nlong] = MUL_F(transf_buf[nshort*9+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*10+i],window_short[i]); - overlap[nflat_ls+6*nshort+i-nlong] = MUL_F(transf_buf[nshort*11+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*12+i],window_short[i]); - overlap[nflat_ls+7*nshort+i-nlong] = MUL_F(transf_buf[nshort*13+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*14+i],window_short[i]); - overlap[nflat_ls+8*nshort+i-nlong] = MUL_F(transf_buf[nshort*15+i],window_short[nshort-1-i]); - } - for (i = 0; i < nflat_ls; i++) - overlap[nflat_ls+nshort+i] = 0; - break; - - case LONG_STOP_SEQUENCE: - imdct_long(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nflat_ls; i++) - time_out[i] = overlap[i]; - for (i = 0; i < nshort; i++) - time_out[nflat_ls+i] = overlap[nflat_ls+i] + MUL_F(transf_buf[nflat_ls+i],window_short_prev[i]); - for (i = 0; i < nflat_ls; i++) - time_out[nflat_ls+nshort+i] = overlap[nflat_ls+nshort+i] + transf_buf[nflat_ls+nshort+i]; - for (i = 0; i < nlong; i++) - overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); - break; - } - -#ifdef PROFILE - count = faad_get_ts() - count; - fb->cycles += count; -#endif -} - -#ifdef USE_SSE -void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, uint8_t object_type, uint16_t frame_len) -{ - int16_t i; - ALIGN real_t transf_buf[2*1024] = {0}; - - const real_t *window_long = NULL; - const real_t *window_long_prev = NULL; - const real_t *window_short = NULL; - const real_t *window_short_prev = NULL; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t trans = nshort/2; - - uint16_t nflat_ls = (nlong-nshort)/2; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - -#ifdef LD_DEC - if (object_type == LD) - { - window_long = fb->ld_window[window_shape]; - window_long_prev = fb->ld_window[window_shape_prev]; - } else { -#endif - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; -#ifdef LD_DEC - } -#endif - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - imdct_long_sse(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nlong; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - - m1 = _mm_load_ps(&transf_buf[i]); - m2 = _mm_load_ps(&window_long_prev[i]); - m6 = _mm_load_ps(&window_long[nlong-4-i]); - m3 = _mm_load_ps(&time_out[nlong+i]); - m5 = _mm_load_ps(&transf_buf[nlong+i]); - - m4 = _mm_mul_ps(m1, m2); - m7 = _mm_shuffle_ps(m6, m6, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_add_ps(m4, m3); - m8 = _mm_mul_ps(m5, m7); - - _mm_store_ps(&time_out[i], m4); - _mm_store_ps(&time_out[nlong+i], m8); - } - break; - - case LONG_START_SEQUENCE: - imdct_long_sse(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nlong; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[i]); - __m128 m2 = _mm_load_ps(&window_long_prev[i]); - __m128 m3 = _mm_load_ps(&time_out[nlong+i]); - - __m128 m4 = _mm_mul_ps(m1, m2); - m4 = _mm_add_ps(m4, m3); - - _mm_store_ps(&time_out[i], m4); - } - for (i = 0; i < nflat_ls; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nlong+i]); - _mm_store_ps(&time_out[nlong+i], m1); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nlong+nflat_ls+i]); - __m128 m2 = _mm_load_ps(&window_short[nshort-4-i]); - __m128 m3, m4; - - m3 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m3); - - _mm_store_ps(&time_out[nlong+nflat_ls+i], m4); - } - for (i = 0; i < nflat_ls; i+=4) - { - __m128 m1 = _mm_setzero_ps(); - _mm_store_ps(&time_out[nlong+nflat_ls+nshort+i], m1); - } - break; - - case EIGHT_SHORT_SEQUENCE: - faad_imdct_sse(fb->mdct256, &freq_in[0*nshort], &transf_buf[2*nshort*0]); - faad_imdct_sse(fb->mdct256, &freq_in[1*nshort], &transf_buf[2*nshort*1]); - faad_imdct_sse(fb->mdct256, &freq_in[2*nshort], &transf_buf[2*nshort*2]); - faad_imdct_sse(fb->mdct256, &freq_in[3*nshort], &transf_buf[2*nshort*3]); - faad_imdct_sse(fb->mdct256, &freq_in[4*nshort], &transf_buf[2*nshort*4]); - faad_imdct_sse(fb->mdct256, &freq_in[5*nshort], &transf_buf[2*nshort*5]); - faad_imdct_sse(fb->mdct256, &freq_in[6*nshort], &transf_buf[2*nshort*6]); - faad_imdct_sse(fb->mdct256, &freq_in[7*nshort], &transf_buf[2*nshort*7]); - for (i = 0; i < nflat_ls; i+=4) - { - __m128 m1 = _mm_load_ps(&time_out[nlong+i]); - _mm_store_ps(&time_out[i], m1); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nshort*0+i]); - __m128 m2 = _mm_load_ps(&window_short_prev[i]); - __m128 m3 = _mm_load_ps(&time_out[nlong+nflat_ls+i]); - - __m128 m4 = _mm_mul_ps(m1, m2); - m4 = _mm_add_ps(m4, m3); - - _mm_store_ps(&time_out[nflat_ls+i], m4); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*1+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*1+i]); - m6 = _mm_load_ps(&transf_buf[nshort*2+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m4 = _mm_add_ps(m4, m3); - m4 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+1*nshort+i], m4); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*3+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*2+i]); - m6 = _mm_load_ps(&transf_buf[nshort*4+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m4 = _mm_add_ps(m4, m3); - m4 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+2*nshort+i], m4); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*5+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*3+i]); - m6 = _mm_load_ps(&transf_buf[nshort*6+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m4 = _mm_add_ps(m4, m3); - m4 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+3*nshort+i], m4); - } - for(i = 0; i < trans; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*7+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m3 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort*4+i]); - m6 = _mm_load_ps(&transf_buf[nshort*8+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m4 = _mm_add_ps(m4, m3); - m4 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+4*nshort+i], m4); - } - for (i = trans; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*7+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m6 = _mm_load_ps(&transf_buf[nshort*8+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m3 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+4*nshort+i], m3); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*9+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m6 = _mm_load_ps(&transf_buf[nshort*10+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m3 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+5*nshort+i], m3); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*11+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m6 = _mm_load_ps(&transf_buf[nshort*12+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m3 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+6*nshort+i], m3); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m4, m5, m6, m7, m8; - m1 = _mm_load_ps(&transf_buf[nshort*13+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - m6 = _mm_load_ps(&transf_buf[nshort*14+i]); - m7 = _mm_load_ps(&window_short[i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m5); - m8 = _mm_mul_ps(m6, m7); - m3 = _mm_add_ps(m4, m8); - - _mm_store_ps(&time_out[nflat_ls+7*nshort+i], m3); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1, m2, m3, m5; - m1 = _mm_load_ps(&transf_buf[nshort*15+i]); - m2 = _mm_load_ps(&window_short[nshort-4-i]); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m3 = _mm_mul_ps(m1, m5); - - _mm_store_ps(&time_out[nflat_ls+8*nshort+i], m3); - } - for (i = 0; i < nflat_ls; i+=4) - { - __m128 m1 = _mm_setzero_ps(); - _mm_store_ps(&time_out[nlong+nflat_ls+nshort+i], m1); - } - break; - - case LONG_STOP_SEQUENCE: - imdct_long_sse(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nflat_ls; i+=4) - { - __m128 m1 = _mm_load_ps(&time_out[nlong+i]); - _mm_store_ps(&time_out[i], m1); - } - for (i = 0; i < nshort; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nflat_ls+i]); - __m128 m2 = _mm_load_ps(&window_short_prev[i]); - __m128 m3 = _mm_load_ps(&time_out[nlong+nflat_ls+i]); - - __m128 m4 = _mm_mul_ps(m1, m2); - m4 = _mm_add_ps(m4, m3); - - _mm_store_ps(&time_out[nflat_ls+i], m4); - } - for (i = 0; i < nflat_ls; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nflat_ls+nshort+i]); - __m128 m2 = _mm_load_ps(&time_out[nlong+nflat_ls+nshort+i]); - - __m128 m3 = _mm_add_ps(m1, m2); - - _mm_store_ps(&time_out[nflat_ls+nshort+i], m3); - } - for (i = 0; i < nlong; i+=4) - { - __m128 m1 = _mm_load_ps(&transf_buf[nlong+i]); - __m128 m2 = _mm_load_ps(&window_long[nlong-4-i]); - __m128 m3, m4; - - m3 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(0, 1, 2, 3)); - - m4 = _mm_mul_ps(m1, m3); - - _mm_store_ps(&time_out[nlong+i], m4); - } - break; - } - -#ifdef PROFILE - count = faad_get_ts() - count; - fb->cycles += count; -#endif -} -#endif - -#ifdef LTP_DEC -/* only works for LTP -> no overlapping, no short blocks */ -void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, - uint8_t object_type, uint16_t frame_len) -{ - int16_t i; - ALIGN real_t windowed_buf[2*1024] = {0}; - - const real_t *window_long = NULL; - const real_t *window_long_prev = NULL; - const real_t *window_short = NULL; - const real_t *window_short_prev = NULL; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t nflat_ls = (nlong-nshort)/2; - - assert(window_sequence != EIGHT_SHORT_SEQUENCE); - -#ifdef LD_DEC - if (object_type == LD) - { - window_long = fb->ld_window[window_shape]; - window_long_prev = fb->ld_window[window_shape_prev]; - } else { -#endif - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; -#ifdef LD_DEC - } -#endif - - switch(window_sequence) - { - case ONLY_LONG_SEQUENCE: - for (i = nlong-1; i >= 0; i--) - { - windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); - windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); - } - mdct(fb, windowed_buf, out_mdct, 2*nlong); - break; - - case LONG_START_SEQUENCE: - for (i = 0; i < nlong; i++) - windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); - for (i = 0; i < nflat_ls; i++) - windowed_buf[i+nlong] = in_data[i+nlong]; - for (i = 0; i < nshort; i++) - windowed_buf[i+nlong+nflat_ls] = MUL_F(in_data[i+nlong+nflat_ls], window_short[nshort-1-i]); - for (i = 0; i < nflat_ls; i++) - windowed_buf[i+nlong+nflat_ls+nshort] = 0; - mdct(fb, windowed_buf, out_mdct, 2*nlong); - break; - - case LONG_STOP_SEQUENCE: - for (i = 0; i < nflat_ls; i++) - windowed_buf[i] = 0; - for (i = 0; i < nshort; i++) - windowed_buf[i+nflat_ls] = MUL_F(in_data[i+nflat_ls], window_short_prev[i]); - for (i = 0; i < nflat_ls; i++) - windowed_buf[i+nflat_ls+nshort] = in_data[i+nflat_ls+nshort]; - for (i = 0; i < nlong; i++) - windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); - mdct(fb, windowed_buf, out_mdct, 2*nlong); - break; - } -} -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: filtbank.c,v 1.46 2009/01/26 23:51:15 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include +#include +#ifdef _WIN32_WCE +#define assert(x) +#else +#include +#endif + +#include "filtbank.h" +#include "syntax.h" +#include "kbd_win.h" +#include "sine_win.h" +#include "mdct.h" + + +fb_info *filter_bank_init(uint16_t frame_len) +{ + uint16_t nshort = frame_len/8; +#ifdef LD_DEC + uint16_t frame_len_ld = frame_len/2; +#endif + + fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); + memset(fb, 0, sizeof(fb_info)); + + /* normal */ + fb->mdct256 = faad_mdct_init(2*nshort); + fb->mdct2048 = faad_mdct_init(2*frame_len); +#ifdef LD_DEC + /* LD */ + fb->mdct1024 = faad_mdct_init(2*frame_len_ld); +#endif + +#ifdef ALLOW_SMALL_FRAMELENGTH + if (frame_len == 1024) + { +#endif + fb->long_window[0] = sine_long_1024; + fb->short_window[0] = sine_short_128; + fb->long_window[1] = kbd_long_1024; + fb->short_window[1] = kbd_short_128; +#ifdef LD_DEC + fb->ld_window[0] = sine_mid_512; + fb->ld_window[1] = ld_mid_512; +#endif +#ifdef ALLOW_SMALL_FRAMELENGTH + } else /* (frame_len == 960) */ { + fb->long_window[0] = sine_long_960; + fb->short_window[0] = sine_short_120; + fb->long_window[1] = kbd_long_960; + fb->short_window[1] = kbd_short_120; +#ifdef LD_DEC + fb->ld_window[0] = sine_mid_480; + fb->ld_window[1] = ld_mid_480; +#endif + } +#endif + + return fb; +} + +void filter_bank_end(fb_info *fb) +{ + if (fb != NULL) + { +#ifdef PROFILE + printf("FB: %I64d cycles\n", fb->cycles); +#endif + + faad_mdct_end(fb->mdct256); + faad_mdct_end(fb->mdct2048); +#ifdef LD_DEC + faad_mdct_end(fb->mdct1024); +#endif + + faad_free(fb); + } +} + +static INLINE void imdct_long(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) +{ +#ifdef LD_DEC + mdct_info *mdct = NULL; + + switch (len) + { + case 2048: + case 1920: + mdct = fb->mdct2048; + break; + case 1024: + case 960: + mdct = fb->mdct1024; + break; + } + + faad_imdct(mdct, in_data, out_data); +#else + faad_imdct(fb->mdct2048, in_data, out_data); +#endif +} + + +#ifdef LTP_DEC +static INLINE void mdct(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) +{ + mdct_info *mdct = NULL; + + switch (len) + { + case 2048: + case 1920: + mdct = fb->mdct2048; + break; + case 256: + case 240: + mdct = fb->mdct256; + break; +#ifdef LD_DEC + case 1024: + case 960: + mdct = fb->mdct1024; + break; +#endif + } + + faad_mdct(mdct, in_data, out_data); +} +#endif + +void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, + uint8_t window_shape_prev, real_t *freq_in, + real_t *time_out, real_t *overlap, + uint8_t object_type, uint16_t frame_len) +{ + int16_t i; + ALIGN real_t transf_buf[2*1024] = {0}; + + const real_t *window_long = NULL; + const real_t *window_long_prev = NULL; + const real_t *window_short = NULL; + const real_t *window_short_prev = NULL; + + uint16_t nlong = frame_len; + uint16_t nshort = frame_len/8; + uint16_t trans = nshort/2; + + uint16_t nflat_ls = (nlong-nshort)/2; + +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + + /* select windows of current frame and previous frame (Sine or KBD) */ +#ifdef LD_DEC + if (object_type == LD) + { + window_long = fb->ld_window[window_shape]; + window_long_prev = fb->ld_window[window_shape_prev]; + } else { +#endif + window_long = fb->long_window[window_shape]; + window_long_prev = fb->long_window[window_shape_prev]; + window_short = fb->short_window[window_shape]; + window_short_prev = fb->short_window[window_shape_prev]; +#ifdef LD_DEC + } +#endif + +#if 0 + for (i = 0; i < 1024; i++) + { + printf("%d\n", freq_in[i]); + } +#endif + +#if 0 + printf("%d %d\n", window_sequence, window_shape); +#endif + + switch (window_sequence) + { + case ONLY_LONG_SEQUENCE: + /* perform iMDCT */ + imdct_long(fb, freq_in, transf_buf, 2*nlong); + + /* add second half output of previous frame to windowed output of current frame */ + for (i = 0; i < nlong; i+=4) + { + time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); + time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); + time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); + time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); + } + + /* window the second half and save as overlap for next frame */ + for (i = 0; i < nlong; i+=4) + { + overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); + overlap[i+1] = MUL_F(transf_buf[nlong+i+1],window_long[nlong-2-i]); + overlap[i+2] = MUL_F(transf_buf[nlong+i+2],window_long[nlong-3-i]); + overlap[i+3] = MUL_F(transf_buf[nlong+i+3],window_long[nlong-4-i]); + } + break; + + case LONG_START_SEQUENCE: + /* perform iMDCT */ + imdct_long(fb, freq_in, transf_buf, 2*nlong); + + /* add second half output of previous frame to windowed output of current frame */ + for (i = 0; i < nlong; i+=4) + { + time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); + time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); + time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); + time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); + } + + /* window the second half and save as overlap for next frame */ + /* construct second half window using padding with 1's and 0's */ + for (i = 0; i < nflat_ls; i++) + overlap[i] = transf_buf[nlong+i]; + for (i = 0; i < nshort; i++) + overlap[nflat_ls+i] = MUL_F(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); + for (i = 0; i < nflat_ls; i++) + overlap[nflat_ls+nshort+i] = 0; + break; + + case EIGHT_SHORT_SEQUENCE: + /* perform iMDCT for each short block */ + faad_imdct(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0); + faad_imdct(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1); + faad_imdct(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2); + faad_imdct(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3); + faad_imdct(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4); + faad_imdct(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5); + faad_imdct(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6); + faad_imdct(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7); + + /* add second half output of previous frame to windowed output of current frame */ + for (i = 0; i < nflat_ls; i++) + time_out[i] = overlap[i]; + for(i = 0; i < nshort; i++) + { + time_out[nflat_ls+ i] = overlap[nflat_ls+ i] + MUL_F(transf_buf[nshort*0+i],window_short_prev[i]); + time_out[nflat_ls+1*nshort+i] = overlap[nflat_ls+nshort*1+i] + MUL_F(transf_buf[nshort*1+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*2+i],window_short[i]); + time_out[nflat_ls+2*nshort+i] = overlap[nflat_ls+nshort*2+i] + MUL_F(transf_buf[nshort*3+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*4+i],window_short[i]); + time_out[nflat_ls+3*nshort+i] = overlap[nflat_ls+nshort*3+i] + MUL_F(transf_buf[nshort*5+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*6+i],window_short[i]); + if (i < trans) + time_out[nflat_ls+4*nshort+i] = overlap[nflat_ls+nshort*4+i] + MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); + } + + /* window the second half and save as overlap for next frame */ + for(i = 0; i < nshort; i++) + { + if (i >= trans) + overlap[nflat_ls+4*nshort+i-nlong] = MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); + overlap[nflat_ls+5*nshort+i-nlong] = MUL_F(transf_buf[nshort*9+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*10+i],window_short[i]); + overlap[nflat_ls+6*nshort+i-nlong] = MUL_F(transf_buf[nshort*11+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*12+i],window_short[i]); + overlap[nflat_ls+7*nshort+i-nlong] = MUL_F(transf_buf[nshort*13+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*14+i],window_short[i]); + overlap[nflat_ls+8*nshort+i-nlong] = MUL_F(transf_buf[nshort*15+i],window_short[nshort-1-i]); + } + for (i = 0; i < nflat_ls; i++) + overlap[nflat_ls+nshort+i] = 0; + break; + + case LONG_STOP_SEQUENCE: + /* perform iMDCT */ + imdct_long(fb, freq_in, transf_buf, 2*nlong); + + /* add second half output of previous frame to windowed output of current frame */ + /* construct first half window using padding with 1's and 0's */ + for (i = 0; i < nflat_ls; i++) + time_out[i] = overlap[i]; + for (i = 0; i < nshort; i++) + time_out[nflat_ls+i] = overlap[nflat_ls+i] + MUL_F(transf_buf[nflat_ls+i],window_short_prev[i]); + for (i = 0; i < nflat_ls; i++) + time_out[nflat_ls+nshort+i] = overlap[nflat_ls+nshort+i] + transf_buf[nflat_ls+nshort+i]; + + /* window the second half and save as overlap for next frame */ + for (i = 0; i < nlong; i++) + overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); + break; + } + +#if 0 + for (i = 0; i < 1024; i++) + { + printf("%d\n", time_out[i]); + //printf("0x%.8X\n", time_out[i]); + } +#endif + + +#ifdef PROFILE + count = faad_get_ts() - count; + fb->cycles += count; +#endif +} + + +#ifdef LTP_DEC +/* only works for LTP -> no overlapping, no short blocks */ +void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, + uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, + uint8_t object_type, uint16_t frame_len) +{ + int16_t i; + ALIGN real_t windowed_buf[2*1024] = {0}; + + const real_t *window_long = NULL; + const real_t *window_long_prev = NULL; + const real_t *window_short = NULL; + const real_t *window_short_prev = NULL; + + uint16_t nlong = frame_len; + uint16_t nshort = frame_len/8; + uint16_t nflat_ls = (nlong-nshort)/2; + + assert(window_sequence != EIGHT_SHORT_SEQUENCE); + +#ifdef LD_DEC + if (object_type == LD) + { + window_long = fb->ld_window[window_shape]; + window_long_prev = fb->ld_window[window_shape_prev]; + } else { +#endif + window_long = fb->long_window[window_shape]; + window_long_prev = fb->long_window[window_shape_prev]; + window_short = fb->short_window[window_shape]; + window_short_prev = fb->short_window[window_shape_prev]; +#ifdef LD_DEC + } +#endif + + switch(window_sequence) + { + case ONLY_LONG_SEQUENCE: + for (i = nlong-1; i >= 0; i--) + { + windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); + windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); + } + mdct(fb, windowed_buf, out_mdct, 2*nlong); + break; + + case LONG_START_SEQUENCE: + for (i = 0; i < nlong; i++) + windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); + for (i = 0; i < nflat_ls; i++) + windowed_buf[i+nlong] = in_data[i+nlong]; + for (i = 0; i < nshort; i++) + windowed_buf[i+nlong+nflat_ls] = MUL_F(in_data[i+nlong+nflat_ls], window_short[nshort-1-i]); + for (i = 0; i < nflat_ls; i++) + windowed_buf[i+nlong+nflat_ls+nshort] = 0; + mdct(fb, windowed_buf, out_mdct, 2*nlong); + break; + + case LONG_STOP_SEQUENCE: + for (i = 0; i < nflat_ls; i++) + windowed_buf[i] = 0; + for (i = 0; i < nshort; i++) + windowed_buf[i+nflat_ls] = MUL_F(in_data[i+nflat_ls], window_short_prev[i]); + for (i = 0; i < nflat_ls; i++) + windowed_buf[i+nflat_ls+nshort] = in_data[i+nflat_ls+nshort]; + for (i = 0; i < nlong; i++) + windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); + mdct(fb, windowed_buf, out_mdct, 2*nlong); + break; + } +} +#endif diff --git a/src/contrib/aacdecoder/libfaad/filtbank.h b/src/contrib/aacdecoder/libfaad/filtbank.h old mode 100644 new mode 100755 index 01eb2a08a..de0149c97 --- a/src/contrib/aacdecoder/libfaad/filtbank.h +++ b/src/contrib/aacdecoder/libfaad/filtbank.h @@ -1,64 +1,61 @@ -/* -** 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: filtbank.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __FILTBANK_H__ -#define __FILTBANK_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -fb_info *filter_bank_init(uint16_t frame_len); -void filter_bank_end(fb_info *fb); - -#ifdef LTP_DEC -void filter_bank_ltp(fb_info *fb, - uint8_t window_sequence, - uint8_t window_shape, - uint8_t window_shape_prev, - real_t *in_data, - real_t *out_mdct, - uint8_t object_type, - uint16_t frame_len); -#endif - -void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, real_t *overlap, - uint8_t object_type, uint16_t frame_len); - -#ifdef USE_SSE -void ifilter_bank_sse(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, uint8_t object_type, uint16_t frame_len); -#endif - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: filtbank.h,v 1.27 2007/11/01 12:33:30 menno Exp $ +**/ + +#ifndef __FILTBANK_H__ +#define __FILTBANK_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +fb_info *filter_bank_init(uint16_t frame_len); +void filter_bank_end(fb_info *fb); + +#ifdef LTP_DEC +void filter_bank_ltp(fb_info *fb, + uint8_t window_sequence, + uint8_t window_shape, + uint8_t window_shape_prev, + real_t *in_data, + real_t *out_mdct, + uint8_t object_type, + uint16_t frame_len); +#endif + +void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, + uint8_t window_shape_prev, real_t *freq_in, + real_t *time_out, real_t *overlap, + uint8_t object_type, uint16_t frame_len); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/fixed.h b/src/contrib/aacdecoder/libfaad/fixed.h old mode 100644 new mode 100755 index 0cd62d82b..531583772 --- a/src/contrib/aacdecoder/libfaad/fixed.h +++ b/src/contrib/aacdecoder/libfaad/fixed.h @@ -1,196 +1,287 @@ -/* -** 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: fixed.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __FIXED_H__ -#define __FIXED_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _WIN32_WCE -#include -#endif - -#define COEF_BITS 28 -#define COEF_PRECISION (1 << COEF_BITS) -#define REAL_BITS 14 // MAXIMUM OF 14 FOR FIXED POINT SBR -#define REAL_PRECISION (1 << REAL_BITS) - -/* FRAC is the fractional only part of the fixed point number [0.0..1.0) */ -#define FRAC_SIZE 32 /* frac is a 32 bit integer */ -#define FRAC_BITS 31 -#define FRAC_PRECISION ((uint32_t)(1 << FRAC_BITS)) -#define FRAC_MAX 0x7FFFFFFF - -typedef int32_t real_t; - - -#define REAL_CONST(A) (((A) >= 0) ? ((real_t)((A)*(REAL_PRECISION)+0.5)) : ((real_t)((A)*(REAL_PRECISION)-0.5))) -#define COEF_CONST(A) (((A) >= 0) ? ((real_t)((A)*(COEF_PRECISION)+0.5)) : ((real_t)((A)*(COEF_PRECISION)-0.5))) -#define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5)))) - -#if defined(_WIN32) && !defined(_WIN32_WCE) - -/* multiply with real shift */ -static INLINE real_t MUL_R(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,REAL_BITS - } -} - -/* multiply with coef shift */ -static INLINE real_t MUL_C(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - shrd eax,edx,COEF_BITS - } -} - -static INLINE real_t _MulHigh(real_t A, real_t B) -{ - _asm { - mov eax,A - imul B - mov eax,edx - } -} - -/* multiply with fractional shift */ -static INLINE real_t MUL_F(real_t A, real_t B) -{ - return _MulHigh(A,B) << (FRAC_SIZE-FRAC_BITS); -} - -/* Complex multiplication */ -static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) -{ - *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); - *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); -} - -#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 _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 */ -#ifndef _WIN32_WCE - #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) -#else - /* 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); - } -#endif - -/* Complex multiplication */ -static INLINE void ComplexMult(real_t *y1, real_t *y2, - real_t x1, real_t x2, real_t c1, real_t c2) -{ - *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); - *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); -} - -#endif - - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: fixed.h,v 1.32 2007/11/01 12:33:30 menno Exp $ +**/ + +#ifndef __FIXED_H__ +#define __FIXED_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#if defined(_WIN32_WCE) && defined(_ARM_) +#include +#endif + + +#define COEF_BITS 28 +#define COEF_PRECISION (1 << COEF_BITS) +#define REAL_BITS 14 // MAXIMUM OF 14 FOR FIXED POINT SBR +#define REAL_PRECISION (1 << REAL_BITS) + +/* FRAC is the fractional only part of the fixed point number [0.0..1.0) */ +#define FRAC_SIZE 32 /* frac is a 32 bit integer */ +#define FRAC_BITS 31 +#define FRAC_PRECISION ((uint32_t)(1 << FRAC_BITS)) +#define FRAC_MAX 0x7FFFFFFF + +typedef int32_t real_t; + + +#define REAL_CONST(A) (((A) >= 0) ? ((real_t)((A)*(REAL_PRECISION)+0.5)) : ((real_t)((A)*(REAL_PRECISION)-0.5))) +#define COEF_CONST(A) (((A) >= 0) ? ((real_t)((A)*(COEF_PRECISION)+0.5)) : ((real_t)((A)*(COEF_PRECISION)-0.5))) +#define FRAC_CONST(A) (((A) == 1.00) ? ((real_t)FRAC_MAX) : (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5)))) +//#define FRAC_CONST(A) (((A) >= 0) ? ((real_t)((A)*(FRAC_PRECISION)+0.5)) : ((real_t)((A)*(FRAC_PRECISION)-0.5))) + +#define Q2_BITS 22 +#define Q2_PRECISION (1 << Q2_BITS) +#define Q2_CONST(A) (((A) >= 0) ? ((real_t)((A)*(Q2_PRECISION)+0.5)) : ((real_t)((A)*(Q2_PRECISION)-0.5))) + +#if defined(_WIN32) && !defined(_WIN32_WCE) + +/* multiply with real shift */ +static INLINE real_t MUL_R(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + shrd eax,edx,REAL_BITS + } +} + +/* multiply with coef shift */ +static INLINE real_t MUL_C(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + shrd eax,edx,COEF_BITS + } +} + +static INLINE real_t MUL_Q2(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + shrd eax,edx,Q2_BITS + } +} + +static INLINE real_t MUL_SHIFT6(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + shrd eax,edx,6 + } +} + +static INLINE real_t MUL_SHIFT23(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + shrd eax,edx,23 + } +} + +#if 1 +static INLINE real_t _MulHigh(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + mov eax,edx + } +} + +/* multiply with fractional shift */ +static INLINE real_t MUL_F(real_t A, real_t B) +{ + return _MulHigh(A,B) << (FRAC_SIZE-FRAC_BITS); +} + +/* Complex multiplication */ +static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) +{ + *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); + *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); +} +#else +static INLINE real_t MUL_F(real_t A, real_t B) +{ + _asm { + mov eax,A + imul B + shrd eax,edx,FRAC_BITS + } +} + +/* Complex multiplication */ +static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) +{ + *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); + *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); +} +#endif + +#elif defined(__GNUC__) && defined (__arm__) + +/* taken from MAD */ +#define arm_mul(x, y, SCALEBITS) \ +({ \ + uint32_t __hi; \ + uint32_t __lo; \ + uint32_t __result; \ + asm("smull %0, %1, %3, %4\n\t" \ + "movs %0, %0, lsr %5\n\t" \ + "adc %2, %0, %1, lsl %6" \ + : "=&r" (__lo), "=&r" (__hi), "=r" (__result) \ + : "%r" (x), "r" (y), \ + "M" (SCALEBITS), "M" (32 - (SCALEBITS)) \ + : "cc"); \ + __result; \ +}) + +static INLINE real_t MUL_R(real_t A, real_t B) +{ + return arm_mul(A, B, REAL_BITS); +} + +static INLINE real_t MUL_C(real_t A, real_t B) +{ + return arm_mul(A, B, COEF_BITS); +} + +static INLINE real_t MUL_Q2(real_t A, real_t B) +{ + return arm_mul(A, B, Q2_BITS); +} + +static INLINE real_t MUL_SHIFT6(real_t A, real_t B) +{ + return arm_mul(A, B, 6); +} + +static INLINE real_t MUL_SHIFT23(real_t A, real_t B) +{ + return arm_mul(A, B, 23); +} + +static INLINE real_t _MulHigh(real_t x, real_t y) +{ + uint32_t __lo; + uint32_t __hi; + asm("smull\t%0, %1, %2, %3" + : "=&r"(__lo),"=&r"(__hi) + : "%r"(x),"r"(y) + : "cc"); + return __hi; +} + +static INLINE real_t MUL_F(real_t A, real_t B) +{ + return _MulHigh(A, B) << (FRAC_SIZE-FRAC_BITS); +} + +/* Complex multiplication */ +static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) +{ + int32_t tmp, yt1, yt2; + asm("smull %0, %1, %4, %6\n\t" + "smlal %0, %1, %5, %7\n\t" + "rsb %3, %4, #0\n\t" + "smull %0, %2, %5, %6\n\t" + "smlal %0, %2, %3, %7" + : "=&r" (tmp), "=&r" (yt1), "=&r" (yt2), "=r" (x1) + : "3" (x1), "r" (x2), "r" (c1), "r" (c2) + : "cc" ); + *y1 = yt1 << (FRAC_SIZE-FRAC_BITS); + *y2 = yt2 << (FRAC_SIZE-FRAC_BITS); +} + +#else + + /* multiply with real shift */ + #define MUL_R(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (REAL_BITS-1))) >> REAL_BITS) + /* multiply with coef shift */ + #define MUL_C(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (COEF_BITS-1))) >> COEF_BITS) + /* multiply with fractional shift */ +#if defined(_WIN32_WCE) && defined(_ARM_) + /* eVC for PocketPC has an intrinsic function that returns only the high 32 bits of a 32x32 bit multiply */ + static INLINE real_t MUL_F(real_t A, real_t B) + { + return _MulHigh(A,B) << (32-FRAC_BITS); + } +#else +#ifdef __BFIN__ +#define _MulHigh(X,Y) ({ int __xxo; \ + asm ( \ + "a1 = %2.H * %1.L (IS,M);\n\t" \ + "a0 = %1.H * %2.H, a1+= %1.H * %2.L (IS,M);\n\t"\ + "a1 = a1 >>> 16;\n\t" \ + "%0 = (a0 += a1);\n\t" \ + : "=d" (__xxo) : "d" (X), "d" (Y) : "A0","A1"); __xxo; }) + +#define MUL_F(X,Y) ({ int __xxo; \ + asm ( \ + "a1 = %2.H * %1.L (M);\n\t" \ + "a0 = %1.H * %2.H, a1+= %1.H * %2.L (M);\n\t" \ + "a1 = a1 >>> 16;\n\t" \ + "%0 = (a0 += a1);\n\t" \ + : "=d" (__xxo) : "d" (X), "d" (Y) : "A0","A1"); __xxo; }) +#else + #define _MulHigh(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_SIZE-1))) >> FRAC_SIZE) + #define MUL_F(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (FRAC_BITS-1))) >> FRAC_BITS) +#endif +#endif + #define MUL_Q2(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (Q2_BITS-1))) >> Q2_BITS) + #define MUL_SHIFT6(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (6-1))) >> 6) + #define MUL_SHIFT23(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1 << (23-1))) >> 23) + +/* Complex multiplication */ +static INLINE void ComplexMult(real_t *y1, real_t *y2, + real_t x1, real_t x2, real_t c1, real_t c2) +{ + *y1 = (_MulHigh(x1, c1) + _MulHigh(x2, c2))<<(FRAC_SIZE-FRAC_BITS); + *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2))<<(FRAC_SIZE-FRAC_BITS); +} + +#endif + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/hcr.c b/src/contrib/aacdecoder/libfaad/hcr.c old mode 100644 new mode 100755 index b4abf0ae9..9df593ff3 --- a/src/contrib/aacdecoder/libfaad/hcr.c +++ b/src/contrib/aacdecoder/libfaad/hcr.c @@ -1,412 +1,432 @@ -/* -** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding -** Copyright (C) 2002-2004 A. Kurpiers -** -** 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: hcr.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include -#include - -#include "syntax.h" -#include "specrec.h" -#include "bits.h" -#include "pulse.h" -#include "analysis.h" -#include "bits.h" -#include "huffman.h" - -/* Implements the HCR11 tool as described in ISO/IEC 14496-3/Amd.1, 8.5.3.3 */ - -#ifdef ERROR_RESILIENCE - -/* rewind len (max. 32) bits so that the MSB becomes LSB */ - -static uint32_t rewind_word( uint32_t W, uint8_t len) -{ - uint8_t i; - uint32_t tmp_W=0; - - for ( i=0; i 32) - { - tmp_lW = rewind_word( (*highW << (64-len)) | (*lowW >> (len-32)), 32); - *highW = rewind_word( *lowW << (64-len) , 32); - *lowW = tmp_lW; - } else { - *highW = 0; - *lowW = rewind_word( *lowW, len); - } -} - -/* Takes a codeword as stored in r, rewinds the remaining bits and stores it back */ -static void rewind_bits(bits_t * r) -{ - uint32_t hw, lw; - - if (r->len == 0) return; - - if (r->len >32) - { - lw = r->bufa; - hw = r->bufb & (0xFFFFFFFF >> (64 - r->len)); - rewind_lword( &hw, &lw, r->len ); - r->bufa = lw; - r->bufb = hw; - - } else { - lw = showbits_hcr(r, r->len ); - r->bufa = rewind_word( lw, r->len); - r->bufb = 0; - } -} - -/* takes codewords from a and b, concatenate them and store them in b */ -static void concat_bits( bits_t * a, bits_t * b) -{ - uint32_t hwa, lwa, hwb, lwb; - - if (a->len == 0) return; - - if (a->len >32) - { - lwa = a->bufa; - hwa = a->bufb & (0xFFFFFFFF >> (64 - a->len)); - } else { - lwa = showbits_hcr(a, a->len ); - hwa = 0; - } - if (b->len >=32) { - lwb = b->bufa; - hwb = (b->bufb & (0xFFFFFFFF >> (64 - b->len)) ) | ( lwa << (b->len - 32)); - } else { - lwb = showbits_hcr(b, b->len ) | (lwa << (b->len)); - hwb = (lwa >> (32 - b->len)) | (hwa << (b->len)); - } - - b->bufa = lwb; - b->bufb = hwb; - b->len += a->len; -} - -/* 8.5.3.3.1 */ - -static const uint8_t PresortedCodebook_VCB11[] = { 11, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 9, 7, 5, 3, 1}; -static const uint8_t PresortedCodebook[] = { 11, 9, 7, 5, 3, 1}; - -static const uint8_t maxCwLen[32] = {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}; - -typedef struct -{ - bits_t bits; - uint8_t decoded; - uint16_t sp_offset; - uint8_t cb; -} codeword_state; - - -#define segmentWidth( codebook ) min( maxCwLen[codebook], ics->length_of_longest_codeword ) - -uint8_t reordered_spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data) -{ - uint16_t sp_offset[8]; - uint16_t g,i, presort; - uint16_t NrCodeWords=0, numberOfSegments=0, BitsRead=0; - uint8_t numberOfSets, set; - codeword_state Codewords[ 1024 ]; // FIXME max length? PCWs are not stored, so index is Codewordnr - numberOfSegments!, maybe malloc()? - bits_t Segment[ 512 ]; - - uint8_t PCW_decoded=0; - uint16_t nshort = hDecoder->frameLength/8; - - - /*memset (spectral_data, 0, hDecoder->frameLength*sizeof(uint16_t));*/ - - if (ics->length_of_reordered_spectral_data == 0) - return 0; /* nothing to do */ - - /* if we have a corrupted bitstream this can happen... */ - if ((ics->length_of_longest_codeword == 0) || - (ics->length_of_reordered_spectral_data < - ics->length_of_longest_codeword) || - (ics->max_sfb == 0)) - { - return 10; /* this is not good... */ - } - - /* store the offset into the spectral data for all the window groups because we can't do it later */ - - 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]; - } - - /* All data is sorted according to the codebook used */ - for (presort = 0; presort < (hDecoder->aacSectionDataResilienceFlag ? 22 : 6); presort++) - { - uint8_t sfb; - - /* next codebook that has to be processed according to presorting */ - uint8_t nextCB = hDecoder->aacSectionDataResilienceFlag ? PresortedCodebook_VCB11[ presort ] : PresortedCodebook[ presort ]; - - /* Data belonging to the same spectral unit and having the same codebook comes in consecutive codewords. - This is done by scanning all sfbs for possible codewords. For sfbs with more than 4 elements this has to be - repeated */ - - for (sfb=0; sfbmax_sfb; sfb ++) - { - uint8_t sect_cb, w; - - for (w=0; w< (ics->swb_offset[sfb+1] - ics->swb_offset[sfb]); w+=4) - { - for(g = 0; g < ics->num_window_groups; g++) - { - for (i = 0; i < ics->num_sec[g]; i++) - { - sect_cb = ics->sect_cb[g][i]; - - if ( - /* process only sections that are due now */ - (( sect_cb == nextCB ) || (( nextCB < ESC_HCB ) && ( sect_cb == nextCB+1)) ) && - - /* process only sfb's that are due now */ - ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) - ) - { - if ((sect_cb != ZERO_HCB) && - (sect_cb != NOISE_HCB) && - (sect_cb != INTENSITY_HCB) && - (sect_cb != INTENSITY_HCB2)) - { - uint8_t inc = (sect_cb < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; - uint16_t k; - - uint32_t hw, lw; - - for (k=0; (k < (4/inc)*ics->window_group_length[g]) && - ( (k+w*ics->window_group_length[g]/inc) < (ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb])); k++) - { - uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc*(k+w*ics->window_group_length[g]/inc); - - if (!PCW_decoded) - { - /* if we haven't yet read until the end of the buffer, we can directly decode the so-called PCWs */ - if ((BitsRead + segmentWidth( sect_cb ))<= ics->length_of_reordered_spectral_data) - { - Segment[ numberOfSegments ].len = segmentWidth( sect_cb ); - - if (segmentWidth( sect_cb ) > 32) - { - Segment[ numberOfSegments ].bufb = faad_showbits(ld, segmentWidth( sect_cb ) - 32); - faad_flushbits(ld, segmentWidth( sect_cb) - 32); - Segment[ numberOfSegments ].bufa = faad_showbits(ld, 32), - faad_flushbits(ld, 32 ); - - } else { - Segment[ numberOfSegments ].bufa = faad_showbits(ld, segmentWidth( sect_cb )); - Segment[ numberOfSegments ].bufb = 0; - faad_flushbits(ld, segmentWidth( sect_cb) ); - } - - huffman_spectral_data_2(sect_cb, &Segment[ numberOfSegments ], &spectral_data[sp]); - - BitsRead += segmentWidth( sect_cb ); - - /* skip to next segment, but store left bits in new buffer */ - rewind_bits( &Segment[ numberOfSegments ]); - - numberOfSegments++; - } else { - - /* the last segment is extended until length_of_reordered_spectral_data */ - - if (BitsRead < ics->length_of_reordered_spectral_data) - { - - uint8_t additional_bits = (ics->length_of_reordered_spectral_data - BitsRead); - - if ( additional_bits > 32) - { - hw = faad_showbits(ld, additional_bits - 32); - faad_flushbits(ld, additional_bits - 32); - lw = faad_showbits(ld, 32); - faad_flushbits(ld, 32 ); - } else { - lw = faad_showbits(ld, additional_bits); - hw = 0; - faad_flushbits(ld, additional_bits ); - } - rewind_lword( &hw, &lw, additional_bits + Segment[ numberOfSegments-1 ].len ); - if (Segment[ numberOfSegments-1 ].len > 32) - { - Segment[ numberOfSegments-1 ].bufb = hw + - showbits_hcr(&Segment[ numberOfSegments-1 ], Segment[ numberOfSegments-1 ].len - 32); - Segment[ numberOfSegments-1 ].bufa = lw + - showbits_hcr(&Segment[ numberOfSegments-1 ], 32); - } else { - Segment[ numberOfSegments-1 ].bufa = lw + - showbits_hcr(&Segment[ numberOfSegments-1 ], Segment[ numberOfSegments-1 ].len); - Segment[ numberOfSegments-1 ].bufb = hw; - } - Segment[ numberOfSegments-1 ].len += additional_bits; - } - BitsRead = ics->length_of_reordered_spectral_data; - PCW_decoded = 1; - - Codewords[ 0 ].sp_offset = sp; - Codewords[ 0 ].cb = sect_cb; - Codewords[ 0 ].decoded = 0; - Codewords[ 0 ].bits.len = 0; - } - } else { - Codewords[ NrCodeWords - numberOfSegments ].sp_offset = sp; - Codewords[ NrCodeWords - numberOfSegments ].cb = sect_cb; - Codewords[ NrCodeWords - numberOfSegments ].decoded = 0; - Codewords[ NrCodeWords - numberOfSegments ].bits.len = 0; - - } /* PCW decoded */ - NrCodeWords++; - } /* of k */ - } - } - } /* of i */ - } /* of g */ - } /* of w */ - } /* of sfb */ - } /* of presort */ - - /* Avoid divide by zero */ - if (numberOfSegments == 0) - return 10; /* this is not good... */ - - numberOfSets = NrCodeWords / numberOfSegments; - - /* second step: decode nonPCWs */ - - for (set = 1; set <= numberOfSets; set++) - { - uint16_t trial; - - for (trial = 0; trial < numberOfSegments; trial++) - { - uint16_t codewordBase; - uint16_t set_decoded=numberOfSegments; - - if (set == numberOfSets) - set_decoded = NrCodeWords - set*numberOfSegments; /* last set is shorter than the rest */ - - for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) - { - uint16_t segment_index = (trial + codewordBase) % numberOfSegments; - uint16_t codeword_index = codewordBase + set*numberOfSegments - numberOfSegments; - - if ((codeword_index + numberOfSegments) >= NrCodeWords) - break; - if (!Codewords[ codeword_index ].decoded) - { - if ( Segment[ segment_index ].len > 0) - { - uint8_t tmplen; - - if (Codewords[ codeword_index ].bits.len != 0) - { - /* on the first trial the data is only stored in Segment[], not in Codewords[]. - On next trials first collect the data stored for this codeword and - concatenate the new data from Segment[] */ - - concat_bits( &Codewords[ codeword_index ].bits, &Segment[ segment_index ]); - /* Now everthing is stored in Segment[] */ - } - tmplen = Segment[ segment_index ].len; - if ( huffman_spectral_data_2(Codewords[ codeword_index ].cb, &Segment[ segment_index ], - &spectral_data[ Codewords[ codeword_index ].sp_offset ]) >=0) - { - /* CW did fit into segment */ - - Codewords[ codeword_index ].decoded = 1; - set_decoded--; - } else { - - /* CW did not fit, so store for later use */ - - Codewords[ codeword_index ].bits.len = tmplen; - Codewords[ codeword_index ].bits.bufa = Segment[ segment_index ].bufa; - Codewords[ codeword_index ].bits.bufb = Segment[ segment_index ].bufb; - } - } - } - } /* of codewordBase */ - - if (set_decoded == 0) break; /* no undecoded codewords left in this set */ - - } /* of trial */ - - /* rewind all bits in remaining segments with len>0 */ - for (i=0; i < numberOfSegments; i++) - rewind_bits( &Segment[ i ] ); - } - -#if 0 - { - int i, r=0, c=0; - for (i=0; i< numberOfSegments; i++) - r += Segment[ i ].len; - if (r != 0) - { - printf("reordered_spectral_data: %d bits remaining!\n", r); - } - for (i=0; i< NrCodeWords - numberOfSegments; i++) - { - if (Codewords[ i ].decoded == 0) - { - c++; - } - } - if (c != 0) - { - printf("reordered_spectral_data: %d Undecoded Codewords remaining!\n",c ); - } - if ((r !=0) || (c!=0)) return 10; - } -#endif - - return 0; -} -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: hcr.c,v 1.26 2009/01/26 23:51:15 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include +#include + +#include "specrec.h" +#include "huffman.h" + +/* ISO/IEC 14496-3/Amd.1 + * 8.5.3.3: Huffman Codeword Reordering for AAC spectral data (HCR) + * + * HCR devides the spectral data in known fixed size segments, and + * sorts it by the importance of the data. The importance is firstly + * the (lower) position in the spectrum, and secondly the largest + * value in the used codebook. + * The most important data is written at the start of each segment + * (at known positions), the remaining data is interleaved inbetween, + * with the writing direction alternating. + * Data length is not increased. +*/ + +#ifdef ERROR_RESILIENCE + +/* 8.5.3.3.1 Pre-sorting */ + +#define NUM_CB 6 +#define NUM_CB_ER 22 +#define MAX_CB 32 +#define VCB11_FIRST 16 +#define VCB11_LAST 31 + +static const uint8_t PreSortCB_STD[NUM_CB] = + { 11, 9, 7, 5, 3, 1}; + +static const uint8_t PreSortCB_ER[NUM_CB_ER] = + { 11, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 9, 7, 5, 3, 1}; + +/* 8.5.3.3.2 Derivation of segment width */ + +static const uint8_t maxCwLen[MAX_CB] = {0, 11, 9, 20, 16, 13, 11, 14, 12, 17, 14, 49, + 0, 0, 0, 0, 14, 17, 21, 21, 25, 25, 29, 29, 29, 29, 33, 33, 33, 37, 37, 41}; + +#define segmentWidth(cb) min(maxCwLen[cb], ics->length_of_longest_codeword) + +/* bit-twiddling helpers */ +static const uint8_t S[] = {1, 2, 4, 8, 16}; +static const uint32_t B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF}; + +typedef struct +{ + uint8_t cb; + uint8_t decoded; + uint16_t sp_offset; + bits_t bits; +} codeword_t; + +/* rewind and reverse */ +/* 32 bit version */ +static uint32_t rewrev_word(uint32_t v, const uint8_t len) +{ + /* 32 bit reverse */ + v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); + v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); + v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); + v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); + v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); + + /* shift off low bits */ + v >>= (32 - len); + + return v; +} + +/* 64 bit version */ +static void rewrev_lword(uint32_t *hi, uint32_t *lo, const uint8_t len) +{ + if (len <= 32) { + *hi = 0; + *lo = rewrev_word(*lo, len); + } else + { + uint32_t t = *hi, v = *lo; + + /* double 32 bit reverse */ + v = ((v >> S[0]) & B[0]) | ((v << S[0]) & ~B[0]); + t = ((t >> S[0]) & B[0]) | ((t << S[0]) & ~B[0]); + v = ((v >> S[1]) & B[1]) | ((v << S[1]) & ~B[1]); + t = ((t >> S[1]) & B[1]) | ((t << S[1]) & ~B[1]); + v = ((v >> S[2]) & B[2]) | ((v << S[2]) & ~B[2]); + t = ((t >> S[2]) & B[2]) | ((t << S[2]) & ~B[2]); + v = ((v >> S[3]) & B[3]) | ((v << S[3]) & ~B[3]); + t = ((t >> S[3]) & B[3]) | ((t << S[3]) & ~B[3]); + v = ((v >> S[4]) & B[4]) | ((v << S[4]) & ~B[4]); + t = ((t >> S[4]) & B[4]) | ((t << S[4]) & ~B[4]); + + /* last 32<>32 bit swap is implicit below */ + + /* shift off low bits (this is really only one 64 bit shift) */ + *lo = (t >> (64 - len)) | (v << (len - 32)); + *hi = v >> (64 - len); + } +} + + +/* bits_t version */ +static void rewrev_bits(bits_t *bits) +{ + if (bits->len == 0) return; + rewrev_lword(&bits->bufb, &bits->bufa, bits->len); +} + + +/* merge bits of a to b */ +static void concat_bits(bits_t *b, bits_t *a) +{ + uint32_t bl, bh, al, ah; + + if (a->len == 0) return; + + al = a->bufa; + ah = a->bufb; + + if (b->len > 32) + { + /* maskoff superfluous high b bits */ + bl = b->bufa; + bh = b->bufb & ((1 << (b->len-32)) - 1); + /* left shift a b->len bits */ + ah = al << (b->len - 32); + al = 0; + } else { + bl = b->bufa & ((1 << (b->len)) - 1); + bh = 0; + ah = (ah << (b->len)) | (al >> (32 - b->len)); + al = al << b->len; + } + + /* merge */ + b->bufa = bl | al; + b->bufb = bh | ah; + + b->len += a->len; +} + +static uint8_t is_good_cb(uint8_t this_CB, uint8_t this_sec_CB) +{ + /* only want spectral data CB's */ + if ((this_sec_CB > ZERO_HCB && this_sec_CB <= ESC_HCB) || (this_sec_CB >= VCB11_FIRST && this_sec_CB <= VCB11_LAST)) + { + if (this_CB < ESC_HCB) + { + /* normal codebook pairs */ + return ((this_sec_CB == this_CB) || (this_sec_CB == this_CB + 1)); + } else + { + /* escape codebook */ + return (this_sec_CB == this_CB); + } + } + return 0; +} + +static void read_segment(bits_t *segment, uint8_t segwidth, bitfile *ld) +{ + segment->len = segwidth; + + if (segwidth > 32) + { + segment->bufb = faad_getbits(ld, segwidth - 32); + segment->bufa = faad_getbits(ld, 32); + + } else { + segment->bufa = faad_getbits(ld, segwidth); + segment->bufb = 0; + } +} + +static void fill_in_codeword(codeword_t *codeword, uint16_t index, uint16_t sp, uint8_t cb) +{ + codeword[index].sp_offset = sp; + codeword[index].cb = cb; + codeword[index].decoded = 0; + codeword[index].bits.len = 0; +} + +uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, + bitfile *ld, int16_t *spectral_data) +{ + uint16_t PCWs_done; + uint16_t numberOfSegments, numberOfSets, numberOfCodewords; + + codeword_t codeword[512]; + bits_t segment[512]; + + uint16_t sp_offset[8]; + uint16_t g, i, sortloop, set, bitsread; + uint16_t bitsleft, codewordsleft; + uint8_t w_idx, sfb, this_CB, last_CB, this_sec_CB; + + const uint16_t nshort = hDecoder->frameLength/8; + const uint16_t sp_data_len = ics->length_of_reordered_spectral_data; + + const uint8_t *PreSortCb; + + /* no data (e.g. silence) */ + if (sp_data_len == 0) + return 0; + + /* since there is spectral data, at least one codeword has nonzero length */ + if (ics->length_of_longest_codeword == 0) + return 10; + + if (sp_data_len < ics->length_of_longest_codeword) + return 10; + + sp_offset[0] = 0; + for (g = 1; g < ics->num_window_groups; g++) + { + sp_offset[g] = sp_offset[g-1] + nshort*ics->window_group_length[g-1]; + } + + PCWs_done = 0; + numberOfSegments = 0; + numberOfCodewords = 0; + bitsread = 0; + + /* VCB11 code books in use */ + if (hDecoder->aacSectionDataResilienceFlag) + { + PreSortCb = PreSortCB_ER; + last_CB = NUM_CB_ER; + } else + { + PreSortCb = PreSortCB_STD; + last_CB = NUM_CB; + } + + /* step 1: decode PCW's (set 0), and stuff data in easier-to-use format */ + for (sortloop = 0; sortloop < last_CB; sortloop++) + { + /* select codebook to process this pass */ + this_CB = PreSortCb[sortloop]; + + /* loop over sfbs */ + for (sfb = 0; sfb < ics->max_sfb; sfb++) + { + /* loop over all in this sfb, 4 lines per loop */ + for (w_idx = 0; 4*w_idx < (min(ics->swb_offset[sfb+1], ics->swb_offset_max) - ics->swb_offset[sfb]); w_idx++) + { + for(g = 0; g < ics->num_window_groups; g++) + { + for (i = 0; i < ics->num_sec[g]; i++) + { + /* check whether sfb used here is the one we want to process */ + if ((ics->sect_start[g][i] <= sfb) && (ics->sect_end[g][i] > sfb)) + { + /* check whether codebook used here is the one we want to process */ + this_sec_CB = ics->sect_cb[g][i]; + + if (is_good_cb(this_CB, this_sec_CB)) + { + /* precalculate some stuff */ + uint16_t sect_sfb_size = ics->sect_sfb_offset[g][sfb+1] - ics->sect_sfb_offset[g][sfb]; + uint8_t inc = (this_sec_CB < FIRST_PAIR_HCB) ? QUAD_LEN : PAIR_LEN; + uint16_t group_cws_count = (4*ics->window_group_length[g])/inc; + uint8_t segwidth = segmentWidth(this_sec_CB); + uint16_t cws; + + /* read codewords until end of sfb or end of window group (shouldn't only 1 trigger?) */ + for (cws = 0; (cws < group_cws_count) && ((cws + w_idx*group_cws_count) < sect_sfb_size); cws++) + { + uint16_t sp = sp_offset[g] + ics->sect_sfb_offset[g][sfb] + inc * (cws + w_idx*group_cws_count); + + /* read and decode PCW */ + if (!PCWs_done) + { + /* read in normal segments */ + if (bitsread + segwidth <= sp_data_len) + { + read_segment(&segment[numberOfSegments], segwidth, ld); + bitsread += segwidth; + + huffman_spectral_data_2(this_sec_CB, &segment[numberOfSegments], &spectral_data[sp]); + + /* keep leftover bits */ + rewrev_bits(&segment[numberOfSegments]); + + numberOfSegments++; + } else { + /* remaining stuff after last segment, we unfortunately couldn't read + this in earlier because it might not fit in 64 bits. since we already + decoded (and removed) the PCW it is now guaranteed to fit */ + if (bitsread < sp_data_len) + { + const uint8_t additional_bits = sp_data_len - bitsread; + + read_segment(&segment[numberOfSegments], additional_bits, ld); + segment[numberOfSegments].len += segment[numberOfSegments-1].len; + rewrev_bits(&segment[numberOfSegments]); + + if (segment[numberOfSegments-1].len > 32) + { + segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb + + showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len - 32); + segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + + showbits_hcr(&segment[numberOfSegments-1], 32); + } else { + segment[numberOfSegments-1].bufa = segment[numberOfSegments].bufa + + showbits_hcr(&segment[numberOfSegments-1], segment[numberOfSegments-1].len); + segment[numberOfSegments-1].bufb = segment[numberOfSegments].bufb; + } + segment[numberOfSegments-1].len += additional_bits; + } + bitsread = sp_data_len; + PCWs_done = 1; + + fill_in_codeword(codeword, 0, sp, this_sec_CB); + } + } else { + fill_in_codeword(codeword, numberOfCodewords - numberOfSegments, sp, this_sec_CB); + } + numberOfCodewords++; + } + } + } + } + } + } + } + } + + if (numberOfSegments == 0) + return 10; + + numberOfSets = numberOfCodewords / numberOfSegments; + + /* step 2: decode nonPCWs */ + for (set = 1; set <= numberOfSets; set++) + { + uint16_t trial; + + for (trial = 0; trial < numberOfSegments; trial++) + { + uint16_t codewordBase; + + for (codewordBase = 0; codewordBase < numberOfSegments; codewordBase++) + { + const uint16_t segment_idx = (trial + codewordBase) % numberOfSegments; + const uint16_t codeword_idx = codewordBase + set*numberOfSegments - numberOfSegments; + + /* data up */ + if (codeword_idx >= numberOfCodewords - numberOfSegments) break; + + if (!codeword[codeword_idx].decoded && segment[segment_idx].len > 0) + { + uint8_t tmplen; + + if (codeword[codeword_idx].bits.len != 0) + concat_bits(&segment[segment_idx], &codeword[codeword_idx].bits); + + tmplen = segment[segment_idx].len; + + if (huffman_spectral_data_2(codeword[codeword_idx].cb, &segment[segment_idx], + &spectral_data[codeword[codeword_idx].sp_offset]) >= 0) + { + codeword[codeword_idx].decoded = 1; + } else + { + codeword[codeword_idx].bits = segment[segment_idx]; + codeword[codeword_idx].bits.len = tmplen; + } + + } + } + } + for (i = 0; i < numberOfSegments; i++) + rewrev_bits(&segment[i]); + } + +#if 0 // Seems to give false errors + bitsleft = 0; + + for (i = 0; i < numberOfSegments && !bitsleft; i++) + bitsleft += segment[i].len; + + if (bitsleft) return 10; + + codewordsleft = 0; + + for (i = 0; (i < numberOfCodewords - numberOfSegments) && (!codewordsleft); i++) + if (!codeword[i].decoded) + codewordsleft++; + + if (codewordsleft) return 10; +#endif + + + return 0; + +} +#endif diff --git a/src/contrib/aacdecoder/libfaad/huffman.c b/src/contrib/aacdecoder/libfaad/huffman.c old mode 100644 new mode 100755 index 781de865f..e2656c089 --- a/src/contrib/aacdecoder/libfaad/huffman.c +++ b/src/contrib/aacdecoder/libfaad/huffman.c @@ -1,515 +1,559 @@ -/* -** 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: huffman.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include -#ifdef ANALYSIS -#include -#endif - -#include "bits.h" -#include "huffman.h" -#include "codebook/hcb.h" - - -/* static function declarations */ -static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); -static INLINE 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 uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); -static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); -static int16_t huffman_codebook(uint8_t i); - -int8_t huffman_scale_factor(bitfile *ld) -{ - uint16_t offset = 0; - - while (hcb_sf[offset][1]) - { - uint8_t b = faad_get1bit(ld - DEBUGVAR(1,255,"huffman_scale_factor()")); - offset += hcb_sf[offset][b]; - - if (offset > 240) - { - /* printf("ERROR: offset into hcb_sf = %d >240!\n", offset); */ - return -1; - } - } - - return hcb_sf[offset][0]; -} - - -hcb *hcb_table[] = { - 0, hcb1_1, hcb2_1, 0, hcb4_1, 0, hcb6_1, 0, hcb8_1, 0, hcb10_1, hcb11_1 -}; - -hcb_2_quad *hcb_2_quad_table[] = { - 0, hcb1_2, hcb2_2, 0, hcb4_2, 0, 0, 0, 0, 0, 0, 0 -}; - -hcb_2_pair *hcb_2_pair_table[] = { - 0, 0, 0, 0, 0, 0, hcb6_2, 0, hcb8_2, 0, hcb10_2, hcb11_2 -}; - -hcb_bin_pair *hcb_bin_table[] = { - 0, 0, 0, 0, 0, hcb5, 0, hcb7, 0, hcb9, 0, 0 -}; - -uint8_t hcbN[] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5 }; - -/* defines whether a huffman codebook is unsigned or not */ -/* Table 4.6.2 */ -uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, - /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 -}; - -int hcb_2_quad_table_size[] = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 }; -int hcb_2_pair_table_size[] = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 }; -int hcb_bin_table_size[] = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 }; - -static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len) -{ - uint8_t i; - - for (i = 0; i < len; i++) - { - if(sp[i]) - { - if(faad_get1bit(ld - DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1) - { - sp[i] = -sp[i]; - } - } - } -} - -static INLINE int16_t huffman_getescape(bitfile *ld, int16_t sp) -{ - uint8_t neg, i; - int32_t j; - int32_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 = faad_getbits(ld, i - DEBUGVAR(1,9,"huffman_getescape(): escape")); - - j = off | (1< hcb_2_quad_table_size[cb]) - { - /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset, - hcb_2_quad_table_size[cb]); */ - return 10; - } - - sp[0] = hcb_2_quad_table[cb][offset].x; - sp[1] = hcb_2_quad_table[cb][offset].y; - sp[2] = hcb_2_quad_table[cb][offset].v; - sp[3] = hcb_2_quad_table[cb][offset].w; - - return 0; -} - -static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_2step_quad(cb, ld, sp); - huffman_sign_bits(ld, sp, QUAD_LEN); - - return err; -} - -static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint32_t cw; - uint16_t offset = 0; - uint8_t extra_bits; - - cw = faad_showbits(ld, hcbN[cb]); - offset = hcb_table[cb][cw].offset; - extra_bits = hcb_table[cb][cw].extra_bits; - - if (extra_bits) - { - /* we know for sure it's more than hcbN[cb] bits long */ - faad_flushbits(ld, hcbN[cb]); - offset += (uint16_t)faad_showbits(ld, extra_bits); - faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]); - } else { - faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits); - } - - if (offset > hcb_2_pair_table_size[cb]) - { - /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset, - hcb_2_pair_table_size[cb]); */ - return 10; - } - - sp[0] = hcb_2_pair_table[cb][offset].x; - sp[1] = hcb_2_pair_table[cb][offset].y; - - return 0; -} - -static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_2step_pair(cb, ld, sp); - huffman_sign_bits(ld, sp, PAIR_LEN); - - return err; -} - -static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint16_t offset = 0; - - while (!hcb3[offset].is_leaf) - { - uint8_t b = faad_get1bit(ld - DEBUGVAR(1,255,"huffman_spectral_data():3")); - offset += hcb3[offset].data[b]; - } - - if (offset > hcb_bin_table_size[cb]) - { - /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, - hcb_bin_table_size[cb]); */ - return 10; - } - - sp[0] = hcb3[offset].data[0]; - sp[1] = hcb3[offset].data[1]; - sp[2] = hcb3[offset].data[2]; - sp[3] = hcb3[offset].data[3]; - - return 0; -} - -static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_binary_quad(cb, ld, sp); - huffman_sign_bits(ld, sp, QUAD_LEN); - - return err; -} - -static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint16_t offset = 0; - - while (!hcb_bin_table[cb][offset].is_leaf) - { - uint8_t b = faad_get1bit(ld - DEBUGVAR(1,255,"huffman_spectral_data():9")); - offset += hcb_bin_table[cb][offset].data[b]; - } - - if (offset > hcb_bin_table_size[cb]) - { - /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, - hcb_bin_table_size[cb]); */ - return 10; - } - - sp[0] = hcb_bin_table[cb][offset].data[0]; - sp[1] = hcb_bin_table[cb][offset].data[1]; - - return 0; -} - -static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) -{ - uint8_t err = huffman_binary_pair(cb, ld, sp); - huffman_sign_bits(ld, sp, PAIR_LEN); - - return err; -} - -static int16_t huffman_codebook(uint8_t i) -{ - static const uint32_t data = 16428320; - if (i == 0) return (int16_t)(data >> 16) & 0xFFFF; - else return (int16_t)data & 0xFFFF; -} - -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: -#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: - /* TODO: If ER is used, some extra error checking should be done */ -#endif - { - 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; - } - 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; - - - 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: - - /* TODO: If ER is used, some extra error checking should be done */ - if (cb >= 16) - 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; - } -// TODO: here we would need to test "off" if VCB11 is used! - if (getbits_hcr(ld, i, &off)) - return -1; - j = off + (1<len; -} - -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: huffman.c,v 1.26 2007/11/01 12:33:30 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include +#ifdef ANALYSIS +#include +#endif + +#include "bits.h" +#include "huffman.h" +#include "codebook/hcb.h" + + +/* static function declarations */ +static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); +static INLINE 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 uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); +static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); +static int16_t huffman_codebook(uint8_t i); +static void vcb11_check_LAV(uint8_t cb, int16_t *sp); + +int8_t huffman_scale_factor(bitfile *ld) +{ + uint16_t offset = 0; + + while (hcb_sf[offset][1]) + { + uint8_t b = faad_get1bit(ld + DEBUGVAR(1,255,"huffman_scale_factor()")); + offset += hcb_sf[offset][b]; + + if (offset > 240) + { + /* printf("ERROR: offset into hcb_sf = %d >240!\n", offset); */ + return -1; + } + } + + return hcb_sf[offset][0]; +} + + +hcb *hcb_table[] = { + 0, hcb1_1, hcb2_1, 0, hcb4_1, 0, hcb6_1, 0, hcb8_1, 0, hcb10_1, hcb11_1 +}; + +hcb_2_quad *hcb_2_quad_table[] = { + 0, hcb1_2, hcb2_2, 0, hcb4_2, 0, 0, 0, 0, 0, 0, 0 +}; + +hcb_2_pair *hcb_2_pair_table[] = { + 0, 0, 0, 0, 0, 0, hcb6_2, 0, hcb8_2, 0, hcb10_2, hcb11_2 +}; + +hcb_bin_pair *hcb_bin_table[] = { + 0, 0, 0, 0, 0, hcb5, 0, hcb7, 0, hcb9, 0, 0 +}; + +uint8_t hcbN[] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5 }; + +/* defines whether a huffman codebook is unsigned or not */ +/* Table 4.6.2 */ +uint8_t unsigned_cb[] = { 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + /* codebook 16 to 31 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 +}; + +int hcb_2_quad_table_size[] = { 0, 114, 86, 0, 185, 0, 0, 0, 0, 0, 0, 0 }; +int hcb_2_pair_table_size[] = { 0, 0, 0, 0, 0, 0, 126, 0, 83, 0, 210, 373 }; +int hcb_bin_table_size[] = { 0, 0, 0, 161, 0, 161, 0, 127, 0, 337, 0, 0 }; + +static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len) +{ + uint8_t i; + + for (i = 0; i < len; i++) + { + if(sp[i]) + { + if(faad_get1bit(ld + DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1) + { + sp[i] = -sp[i]; + } + } + } +} + +static INLINE 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< hcb_2_quad_table_size[cb]) + { + /* printf("ERROR: offset into hcb_2_quad_table = %d >%d!\n", offset, + hcb_2_quad_table_size[cb]); */ + return 10; + } + + sp[0] = hcb_2_quad_table[cb][offset].x; + sp[1] = hcb_2_quad_table[cb][offset].y; + sp[2] = hcb_2_quad_table[cb][offset].v; + sp[3] = hcb_2_quad_table[cb][offset].w; + + return 0; +} + +static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint8_t err = huffman_2step_quad(cb, ld, sp); + huffman_sign_bits(ld, sp, QUAD_LEN); + + return err; +} + +static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint32_t cw; + uint16_t offset = 0; + uint8_t extra_bits; + + cw = faad_showbits(ld, hcbN[cb]); + offset = hcb_table[cb][cw].offset; + extra_bits = hcb_table[cb][cw].extra_bits; + + if (extra_bits) + { + /* we know for sure it's more than hcbN[cb] bits long */ + faad_flushbits(ld, hcbN[cb]); + offset += (uint16_t)faad_showbits(ld, extra_bits); + faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits - hcbN[cb]); + } else { + faad_flushbits(ld, hcb_2_pair_table[cb][offset].bits); + } + + if (offset > hcb_2_pair_table_size[cb]) + { + /* printf("ERROR: offset into hcb_2_pair_table = %d >%d!\n", offset, + hcb_2_pair_table_size[cb]); */ + return 10; + } + + sp[0] = hcb_2_pair_table[cb][offset].x; + sp[1] = hcb_2_pair_table[cb][offset].y; + + return 0; +} + +static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint8_t err = huffman_2step_pair(cb, ld, sp); + huffman_sign_bits(ld, sp, PAIR_LEN); + + return err; +} + +static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint16_t offset = 0; + + while (!hcb3[offset].is_leaf) + { + uint8_t b = faad_get1bit(ld + DEBUGVAR(1,255,"huffman_spectral_data():3")); + offset += hcb3[offset].data[b]; + } + + if (offset > hcb_bin_table_size[cb]) + { + /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, + hcb_bin_table_size[cb]); */ + return 10; + } + + sp[0] = hcb3[offset].data[0]; + sp[1] = hcb3[offset].data[1]; + sp[2] = hcb3[offset].data[2]; + sp[3] = hcb3[offset].data[3]; + + return 0; +} + +static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint8_t err = huffman_binary_quad(cb, ld, sp); + huffman_sign_bits(ld, sp, QUAD_LEN); + + return err; +} + +static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint16_t offset = 0; + + while (!hcb_bin_table[cb][offset].is_leaf) + { + uint8_t b = faad_get1bit(ld + DEBUGVAR(1,255,"huffman_spectral_data():9")); + offset += hcb_bin_table[cb][offset].data[b]; + } + + if (offset > hcb_bin_table_size[cb]) + { + /* printf("ERROR: offset into hcb_bin_table = %d >%d!\n", offset, + hcb_bin_table_size[cb]); */ + return 10; + } + + sp[0] = hcb_bin_table[cb][offset].data[0]; + sp[1] = hcb_bin_table[cb][offset].data[1]; + + return 0; +} + +static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp) +{ + uint8_t err = huffman_binary_pair(cb, ld, sp); + huffman_sign_bits(ld, sp, PAIR_LEN); + + return err; +} + +static int16_t huffman_codebook(uint8_t i) +{ + static const uint32_t data = 16428320; + if (i == 0) return (int16_t)(data >> 16) & 0xFFFF; + else return (int16_t)data & 0xFFFF; +} + +static void vcb11_check_LAV(uint8_t cb, int16_t *sp) +{ + static const uint16_t vcb11_LAV_tab[] = { + 16, 31, 47, 63, 95, 127, 159, 191, 223, + 255, 319, 383, 511, 767, 1023, 2047 + }; + uint16_t max = 0; + + if (cb < 16 || cb > 31) + return; + + max = vcb11_LAV_tab[cb - 16]; + + if ((abs(sp[0]) > max) || (abs(sp[1]) > max)) + { + sp[0] = 0; + sp[1] = 0; + } +} + +uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp) +{ + switch (cb) + { + case 1: /* 2-step method for data quadruples */ + case 2: + return huffman_2step_quad(cb, ld, sp); + case 3: /* binary search for data quadruples */ + return huffman_binary_quad_sign(cb, ld, sp); + case 4: /* 2-step method for data quadruples */ + return huffman_2step_quad_sign(cb, ld, sp); + case 5: /* binary search for data pairs */ + return huffman_binary_pair(cb, ld, sp); + case 6: /* 2-step method for data pairs */ + return huffman_2step_pair(cb, ld, sp); + case 7: /* binary search for data pairs */ + case 9: + return huffman_binary_pair_sign(cb, ld, sp); + case 8: /* 2-step method for data pairs */ + case 10: + return huffman_2step_pair_sign(cb, ld, sp); + case 12: { + uint8_t err = huffman_2step_pair(11, ld, sp); + sp[0] = huffman_codebook(0); sp[1] = huffman_codebook(1); + return err; } + case 11: + { + uint8_t err = huffman_2step_pair_sign(11, ld, sp); + 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<len; +} + +#endif + diff --git a/src/contrib/aacdecoder/libfaad/huffman.h b/src/contrib/aacdecoder/libfaad/huffman.h old mode 100644 new mode 100755 index ba6b76ecb..f8bcb237e --- a/src/contrib/aacdecoder/libfaad/huffman.h +++ b/src/contrib/aacdecoder/libfaad/huffman.h @@ -1,44 +1,47 @@ -/* -** 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: huffman.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __HUFFMAN_H__ -#define __HUFFMAN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -int8_t huffman_scale_factor(bitfile *ld); -uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp); -#ifdef ERROR_RESILIENCE -int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp); -#endif - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: huffman.h,v 1.28 2007/11/01 12:33:30 menno Exp $ +**/ + +#ifndef __HUFFMAN_H__ +#define __HUFFMAN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +int8_t huffman_scale_factor(bitfile *ld); +uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp); +#ifdef ERROR_RESILIENCE +int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp); +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ic_predict.c b/src/contrib/aacdecoder/libfaad/ic_predict.c old mode 100644 new mode 100755 index a0a77f6cd..70027ba2f --- a/src/contrib/aacdecoder/libfaad/ic_predict.c +++ b/src/contrib/aacdecoder/libfaad/ic_predict.c @@ -1,267 +1,271 @@ -/* -** 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: ic_predict.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef MAIN_DEC - -#include "syntax.h" -#include "ic_predict.h" -#include "pns.h" - - -static void flt_round(float32_t *pf) -{ - int32_t flg; - uint32_t tmp, tmp1, tmp2; - - tmp = *(uint32_t*)pf; - flg = tmp & (uint32_t)0x00008000; - tmp &= (uint32_t)0xffff0000; - tmp1 = tmp; - /* round 1/2 lsb toward infinity */ - if (flg) - { - tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ - tmp |= (uint32_t)0x00010000; /* insert 1 lsb */ - tmp2 = tmp; /* add 1 lsb and elided one */ - tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ - - *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp; - } else { - *pf = *(float32_t*)&tmp; - } -} - -static int16_t quant_pred(float32_t x) -{ - int16_t q; - uint32_t *tmp = (uint32_t*)&x; - - q = (int16_t)(*tmp>>16); - - return q; -} - -static float32_t inv_quant_pred(int16_t q) -{ - float32_t x; - uint32_t *tmp = (uint32_t*)&x; - *tmp = ((uint32_t)q)<<16; - - return x; -} - -static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred) -{ - uint16_t tmp; - int16_t i, j; - real_t dr1, 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 +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ic_predict.c,v 1.28 2007/11/01 12:33:31 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef MAIN_DEC + +#include "syntax.h" +#include "ic_predict.h" +#include "pns.h" + + +static void flt_round(float32_t *pf) +{ + int32_t flg; + uint32_t tmp, tmp1, tmp2; + + tmp = *(uint32_t*)pf; + flg = tmp & (uint32_t)0x00008000; + tmp &= (uint32_t)0xffff0000; + tmp1 = tmp; + /* round 1/2 lsb toward infinity */ + if (flg) + { + tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ + tmp |= (uint32_t)0x00010000; /* insert 1 lsb */ + tmp2 = tmp; /* add 1 lsb and elided one */ + tmp &= (uint32_t)0xff800000; /* extract exponent and sign */ + + *pf = *(float32_t*)&tmp1 + *(float32_t*)&tmp2 - *(float32_t*)&tmp; + } else { + *pf = *(float32_t*)&tmp; + } +} + +static int16_t quant_pred(float32_t x) +{ + int16_t q; + uint32_t *tmp = (uint32_t*)&x; + + q = (int16_t)(*tmp>>16); + + return q; +} + +static float32_t inv_quant_pred(int16_t q) +{ + float32_t x; + uint32_t *tmp = (uint32_t*)&x; + *tmp = ((uint32_t)q)<<16; + + return x; +} + +static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred) +{ + uint16_t tmp; + int16_t i, j; + real_t dr1; + float32_t predictedvalue; + real_t e0, e1; + real_t k1, k2; + + real_t r[2]; + real_t COR[2]; + real_t VAR[2]; + + r[0] = inv_quant_pred(state->r[0]); + r[1] = inv_quant_pred(state->r[1]); + COR[0] = inv_quant_pred(state->COR[0]); + COR[1] = inv_quant_pred(state->COR[1]); + VAR[0] = inv_quant_pred(state->VAR[0]); + VAR[1] = inv_quant_pred(state->VAR[1]); + + +#if 1 + tmp = state->VAR[0]; + j = (tmp >> 7); + i = tmp & 0x7f; + if (j >= 128) + { + j -= 128; + k1 = COR[0] * exp_table[j] * mnt_table[i]; + } else { + k1 = REAL_CONST(0); + } +#else + + { +#define B 0.953125 + real_t c = COR[0]; + real_t v = VAR[0]; + float32_t tmp; + if (c == 0 || v <= 1) + { + k1 = 0; + } else { + tmp = B / v; + flt_round(&tmp); + k1 = c * tmp; + } + } +#endif + + if (pred) + { +#if 1 + tmp = state->VAR[1]; + j = (tmp >> 7); + i = tmp & 0x7f; + if (j >= 128) + { + j -= 128; + k2 = COR[1] * exp_table[j] * mnt_table[i]; + } else { + k2 = REAL_CONST(0); + } +#else + +#define B 0.953125 + real_t c = COR[1]; + real_t v = VAR[1]; + float32_t tmp; + if (c == 0 || v <= 1) + { + k2 = 0; + } else { + tmp = B / v; + flt_round(&tmp); + k2 = c * tmp; + } +#endif + + predictedvalue = k1*r[0] + k2*r[1]; + flt_round(&predictedvalue); + *output = input + predictedvalue; + } + + /* calculate new state data */ + e0 = *output; + e1 = e0 - k1*r[0]; + dr1 = k1*e0; + + VAR[0] = ALPHA*VAR[0] + 0.5f * (r[0]*r[0] + e0*e0); + COR[0] = ALPHA*COR[0] + r[0]*e0; + VAR[1] = ALPHA*VAR[1] + 0.5f * (r[1]*r[1] + e1*e1); + COR[1] = ALPHA*COR[1] + r[1]*e1; + + r[1] = A * (r[0]-dr1); + r[0] = A * e0; + + state->r[0] = quant_pred(r[0]); + state->r[1] = quant_pred(r[1]); + state->COR[0] = quant_pred(COR[0]); + state->COR[1] = quant_pred(COR[1]); + state->VAR[0] = quant_pred(VAR[0]); + state->VAR[1] = quant_pred(VAR[1]); +} + +static void reset_pred_state(pred_state *state) +{ + state->r[0] = 0; + state->r[1] = 0; + state->COR[0] = 0; + state->COR[1] = 0; + state->VAR[0] = 0x3F80; + state->VAR[1] = 0x3F80; +} + +void pns_reset_pred_state(ic_stream *ics, pred_state *state) +{ + uint8_t sfb, g, b; + uint16_t i, offs, offs2; + + /* prediction only for long blocks */ + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + return; + + for (g = 0; g < ics->num_window_groups; g++) + { + for (b = 0; b < ics->window_group_length[g]; b++) + { + for (sfb = 0; sfb < ics->max_sfb; sfb++) + { + if (is_noise(ics, g, sfb)) + { + offs = ics->swb_offset[sfb]; + offs2 = min(ics->swb_offset[sfb+1], ics->swb_offset_max); + + for (i = offs; i < offs2; i++) + reset_pred_state(&state[i]); + } + } + } + } +} + +void reset_all_predictors(pred_state *state, uint16_t frame_len) +{ + uint16_t i; + + for (i = 0; i < frame_len; i++) + reset_pred_state(&state[i]); +} + +/* intra channel prediction */ +void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, + uint16_t frame_len, uint8_t sf_index) +{ + uint8_t sfb; + uint16_t bin; + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + { + reset_all_predictors(state, frame_len); + } else { + for (sfb = 0; sfb < max_pred_sfb(sf_index); sfb++) + { + uint16_t low = ics->swb_offset[sfb]; + uint16_t high = min(ics->swb_offset[sfb+1], ics->swb_offset_max); + + for (bin = low; bin < high; bin++) + { + ic_predict(&state[bin], spec[bin], &spec[bin], + (ics->predictor_data_present && ics->pred.prediction_used[sfb])); + } + } + + if (ics->predictor_data_present) + { + if (ics->pred.predictor_reset) + { + for (bin = ics->pred.predictor_reset_group_number - 1; + bin < frame_len; bin += 30) + { + reset_pred_state(&state[bin]); + } + } + } + } +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/ic_predict.h b/src/contrib/aacdecoder/libfaad/ic_predict.h old mode 100644 new mode 100755 index 26903471d..e69cd114e --- a/src/contrib/aacdecoder/libfaad/ic_predict.h +++ b/src/contrib/aacdecoder/libfaad/ic_predict.h @@ -1,249 +1,252 @@ -/* -** 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: ic_predict.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifdef MAIN_DEC - -#ifndef __IC_PREDICT_H__ -#define __IC_PREDICT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define ALPHA REAL_CONST(0.90625) -#define A REAL_CONST(0.953125) - - -void pns_reset_pred_state(ic_stream *ics, pred_state *state); -void reset_all_predictors(pred_state *state, uint16_t frame_len); -void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, - uint16_t frame_len, uint8_t sf_index); - -ALIGN static const real_t mnt_table[128] = { - COEF_CONST(0.9531250000), COEF_CONST(0.9453125000), - COEF_CONST(0.9375000000), COEF_CONST(0.9296875000), - COEF_CONST(0.9257812500), COEF_CONST(0.9179687500), - COEF_CONST(0.9101562500), COEF_CONST(0.9023437500), - COEF_CONST(0.8984375000), COEF_CONST(0.8906250000), - COEF_CONST(0.8828125000), COEF_CONST(0.8789062500), - COEF_CONST(0.8710937500), COEF_CONST(0.8671875000), - COEF_CONST(0.8593750000), COEF_CONST(0.8515625000), - COEF_CONST(0.8476562500), COEF_CONST(0.8398437500), - COEF_CONST(0.8359375000), COEF_CONST(0.8281250000), - COEF_CONST(0.8242187500), COEF_CONST(0.8203125000), - COEF_CONST(0.8125000000), COEF_CONST(0.8085937500), - COEF_CONST(0.8007812500), COEF_CONST(0.7968750000), - COEF_CONST(0.7929687500), COEF_CONST(0.7851562500), - COEF_CONST(0.7812500000), COEF_CONST(0.7773437500), - COEF_CONST(0.7734375000), COEF_CONST(0.7656250000), - COEF_CONST(0.7617187500), COEF_CONST(0.7578125000), - COEF_CONST(0.7539062500), COEF_CONST(0.7500000000), - COEF_CONST(0.7421875000), COEF_CONST(0.7382812500), - COEF_CONST(0.7343750000), COEF_CONST(0.7304687500), - COEF_CONST(0.7265625000), COEF_CONST(0.7226562500), - COEF_CONST(0.7187500000), COEF_CONST(0.7148437500), - COEF_CONST(0.7109375000), COEF_CONST(0.7070312500), - COEF_CONST(0.6992187500), COEF_CONST(0.6953125000), - COEF_CONST(0.6914062500), COEF_CONST(0.6875000000), - COEF_CONST(0.6835937500), COEF_CONST(0.6796875000), - COEF_CONST(0.6796875000), COEF_CONST(0.6757812500), - COEF_CONST(0.6718750000), COEF_CONST(0.6679687500), - COEF_CONST(0.6640625000), COEF_CONST(0.6601562500), - COEF_CONST(0.6562500000), COEF_CONST(0.6523437500), - COEF_CONST(0.6484375000), COEF_CONST(0.6445312500), - COEF_CONST(0.6406250000), COEF_CONST(0.6406250000), - COEF_CONST(0.6367187500), COEF_CONST(0.6328125000), - COEF_CONST(0.6289062500), COEF_CONST(0.6250000000), - COEF_CONST(0.6210937500), COEF_CONST(0.6210937500), - COEF_CONST(0.6171875000), COEF_CONST(0.6132812500), - COEF_CONST(0.6093750000), COEF_CONST(0.6054687500), - COEF_CONST(0.6054687500), COEF_CONST(0.6015625000), - COEF_CONST(0.5976562500), COEF_CONST(0.5937500000), - COEF_CONST(0.5937500000), COEF_CONST(0.5898437500), - COEF_CONST(0.5859375000), COEF_CONST(0.5820312500), - COEF_CONST(0.5820312500), COEF_CONST(0.5781250000), - COEF_CONST(0.5742187500), COEF_CONST(0.5742187500), - COEF_CONST(0.5703125000), COEF_CONST(0.5664062500), - COEF_CONST(0.5664062500), COEF_CONST(0.5625000000), - COEF_CONST(0.5585937500), COEF_CONST(0.5585937500), - COEF_CONST(0.5546875000), COEF_CONST(0.5507812500), - COEF_CONST(0.5507812500), COEF_CONST(0.5468750000), - COEF_CONST(0.5429687500), COEF_CONST(0.5429687500), - COEF_CONST(0.5390625000), COEF_CONST(0.5390625000), - COEF_CONST(0.5351562500), COEF_CONST(0.5312500000), - COEF_CONST(0.5312500000), COEF_CONST(0.5273437500), - COEF_CONST(0.5273437500), COEF_CONST(0.5234375000), - COEF_CONST(0.5195312500), COEF_CONST(0.5195312500), - COEF_CONST(0.5156250000), COEF_CONST(0.5156250000), - COEF_CONST(0.5117187500), COEF_CONST(0.5117187500), - COEF_CONST(0.5078125000), COEF_CONST(0.5078125000), - COEF_CONST(0.5039062500), COEF_CONST(0.5039062500), - COEF_CONST(0.5000000000), COEF_CONST(0.4980468750), - COEF_CONST(0.4960937500), COEF_CONST(0.4941406250), - COEF_CONST(0.4921875000), COEF_CONST(0.4902343750), - COEF_CONST(0.4882812500), COEF_CONST(0.4863281250), - COEF_CONST(0.4843750000), COEF_CONST(0.4824218750), - COEF_CONST(0.4804687500), COEF_CONST(0.4785156250) -}; - -ALIGN static const real_t exp_table[128] = { - COEF_CONST(0.50000000000000000000000000000000000000000000000000), - COEF_CONST(0.25000000000000000000000000000000000000000000000000), - COEF_CONST(0.12500000000000000000000000000000000000000000000000), - COEF_CONST(0.06250000000000000000000000000000000000000000000000), - COEF_CONST(0.03125000000000000000000000000000000000000000000000), - COEF_CONST(0.01562500000000000000000000000000000000000000000000), - COEF_CONST(0.00781250000000000000000000000000000000000000000000), - COEF_CONST(0.00390625000000000000000000000000000000000000000000), - COEF_CONST(0.00195312500000000000000000000000000000000000000000), - COEF_CONST(0.00097656250000000000000000000000000000000000000000), - COEF_CONST(0.00048828125000000000000000000000000000000000000000), - COEF_CONST(0.00024414062500000000000000000000000000000000000000), - COEF_CONST(0.00012207031250000000000000000000000000000000000000), - COEF_CONST(0.00006103515625000000000000000000000000000000000000), - COEF_CONST(0.00003051757812500000000000000000000000000000000000), - COEF_CONST(0.00001525878906250000000000000000000000000000000000), - COEF_CONST(0.00000762939453125000000000000000000000000000000000), - COEF_CONST(0.00000381469726562500000000000000000000000000000000), - COEF_CONST(0.00000190734863281250000000000000000000000000000000), - COEF_CONST(0.00000095367431640625000000000000000000000000000000), - COEF_CONST(0.00000047683715820312500000000000000000000000000000), - COEF_CONST(0.00000023841857910156250000000000000000000000000000), - COEF_CONST(0.00000011920928955078125000000000000000000000000000), - COEF_CONST(0.00000005960464477539062500000000000000000000000000), - COEF_CONST(0.00000002980232238769531300000000000000000000000000), - COEF_CONST(0.00000001490116119384765600000000000000000000000000), - COEF_CONST(0.00000000745058059692382810000000000000000000000000), - COEF_CONST(0.00000000372529029846191410000000000000000000000000), - COEF_CONST(0.00000000186264514923095700000000000000000000000000), - COEF_CONST(0.00000000093132257461547852000000000000000000000000), - COEF_CONST(0.00000000046566128730773926000000000000000000000000), - COEF_CONST(0.00000000023283064365386963000000000000000000000000), - COEF_CONST(0.00000000011641532182693481000000000000000000000000), - COEF_CONST(0.00000000005820766091346740700000000000000000000000), - COEF_CONST(0.00000000002910383045673370400000000000000000000000), - COEF_CONST(0.00000000001455191522836685200000000000000000000000), - COEF_CONST(0.00000000000727595761418342590000000000000000000000), - COEF_CONST(0.00000000000363797880709171300000000000000000000000), - COEF_CONST(0.00000000000181898940354585650000000000000000000000), - COEF_CONST(0.00000000000090949470177292824000000000000000000000), - COEF_CONST(0.00000000000045474735088646412000000000000000000000), - COEF_CONST(0.00000000000022737367544323206000000000000000000000), - COEF_CONST(0.00000000000011368683772161603000000000000000000000), - COEF_CONST(0.00000000000005684341886080801500000000000000000000), - COEF_CONST(0.00000000000002842170943040400700000000000000000000), - COEF_CONST(0.00000000000001421085471520200400000000000000000000), - COEF_CONST(0.00000000000000710542735760100190000000000000000000), - COEF_CONST(0.00000000000000355271367880050090000000000000000000), - COEF_CONST(0.00000000000000177635683940025050000000000000000000), - COEF_CONST(0.00000000000000088817841970012523000000000000000000), - COEF_CONST(0.00000000000000044408920985006262000000000000000000), - COEF_CONST(0.00000000000000022204460492503131000000000000000000), - COEF_CONST(0.00000000000000011102230246251565000000000000000000), - COEF_CONST(0.00000000000000005551115123125782700000000000000000), - COEF_CONST(0.00000000000000002775557561562891400000000000000000), - COEF_CONST(0.00000000000000001387778780781445700000000000000000), - COEF_CONST(0.00000000000000000693889390390722840000000000000000), - COEF_CONST(0.00000000000000000346944695195361420000000000000000), - COEF_CONST(0.00000000000000000173472347597680710000000000000000), - COEF_CONST(0.00000000000000000086736173798840355000000000000000), - COEF_CONST(0.00000000000000000043368086899420177000000000000000), - COEF_CONST(0.00000000000000000021684043449710089000000000000000), - COEF_CONST(0.00000000000000000010842021724855044000000000000000), - COEF_CONST(0.00000000000000000005421010862427522200000000000000), - COEF_CONST(0.00000000000000000002710505431213761100000000000000), - COEF_CONST(0.00000000000000000001355252715606880500000000000000), - COEF_CONST(0.00000000000000000000677626357803440270000000000000), - COEF_CONST(0.00000000000000000000338813178901720140000000000000), - COEF_CONST(0.00000000000000000000169406589450860070000000000000), - COEF_CONST(0.00000000000000000000084703294725430034000000000000), - COEF_CONST(0.00000000000000000000042351647362715017000000000000), - COEF_CONST(0.00000000000000000000021175823681357508000000000000), - COEF_CONST(0.00000000000000000000010587911840678754000000000000), - COEF_CONST(0.00000000000000000000005293955920339377100000000000), - COEF_CONST(0.00000000000000000000002646977960169688600000000000), - COEF_CONST(0.00000000000000000000001323488980084844300000000000), - COEF_CONST(0.00000000000000000000000661744490042422140000000000), - COEF_CONST(0.00000000000000000000000330872245021211070000000000), - COEF_CONST(0.00000000000000000000000165436122510605530000000000), - COEF_CONST(0.00000000000000000000000082718061255302767000000000), - COEF_CONST(0.00000000000000000000000041359030627651384000000000), - COEF_CONST(0.00000000000000000000000020679515313825692000000000), - COEF_CONST(0.00000000000000000000000010339757656912846000000000), - COEF_CONST(0.00000000000000000000000005169878828456423000000000), - COEF_CONST(0.00000000000000000000000002584939414228211500000000), - COEF_CONST(0.00000000000000000000000001292469707114105700000000), - COEF_CONST(0.00000000000000000000000000646234853557052870000000), - COEF_CONST(0.00000000000000000000000000323117426778526440000000), - COEF_CONST(0.00000000000000000000000000161558713389263220000000), - COEF_CONST(0.00000000000000000000000000080779356694631609000000), - COEF_CONST(0.00000000000000000000000000040389678347315804000000), - COEF_CONST(0.00000000000000000000000000020194839173657902000000), - COEF_CONST(0.00000000000000000000000000010097419586828951000000), - COEF_CONST(0.00000000000000000000000000005048709793414475600000), - COEF_CONST(0.00000000000000000000000000002524354896707237800000), - COEF_CONST(0.00000000000000000000000000001262177448353618900000), - COEF_CONST(0.00000000000000000000000000000631088724176809440000), - COEF_CONST(0.00000000000000000000000000000315544362088404720000), - COEF_CONST(0.00000000000000000000000000000157772181044202360000), - COEF_CONST(0.00000000000000000000000000000078886090522101181000), - COEF_CONST(0.00000000000000000000000000000039443045261050590000), - COEF_CONST(0.00000000000000000000000000000019721522630525295000), - COEF_CONST(0.00000000000000000000000000000009860761315262647600), - COEF_CONST(0.00000000000000000000000000000004930380657631323800), - COEF_CONST(0.00000000000000000000000000000002465190328815661900), - COEF_CONST(0.00000000000000000000000000000001232595164407830900), - COEF_CONST(0.00000000000000000000000000000000616297582203915470), - COEF_CONST(0.00000000000000000000000000000000308148791101957740), - COEF_CONST(0.00000000000000000000000000000000154074395550978870), - COEF_CONST(0.00000000000000000000000000000000077037197775489434), - COEF_CONST(0.00000000000000000000000000000000038518598887744717), - COEF_CONST(0.00000000000000000000000000000000019259299443872359), - COEF_CONST(0.00000000000000000000000000000000009629649721936179), - COEF_CONST(0.00000000000000000000000000000000004814824860968090), - COEF_CONST(0.00000000000000000000000000000000002407412430484045), - COEF_CONST(0.00000000000000000000000000000000001203706215242022), - COEF_CONST(0.00000000000000000000000000000000000601853107621011), - COEF_CONST(0.00000000000000000000000000000000000300926553810506), - COEF_CONST(0.00000000000000000000000000000000000150463276905253), - COEF_CONST(0.00000000000000000000000000000000000075231638452626), - COEF_CONST(0.00000000000000000000000000000000000037615819226313), - COEF_CONST(0.00000000000000000000000000000000000018807909613157), - COEF_CONST(0.00000000000000000000000000000000000009403954806578), - COEF_CONST(0.00000000000000000000000000000000000004701977403289), - COEF_CONST(0.00000000000000000000000000000000000002350988701645), - COEF_CONST(0.00000000000000000000000000000000000001175494350822), - COEF_CONST(0.0 /* 0000000000000000000000000000000000000587747175411 "floating point underflow" */), - COEF_CONST(0.0) -}; - -#ifdef __cplusplus -} -#endif -#endif - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ic_predict.h,v 1.23 2007/11/01 12:33:31 menno Exp $ +**/ + +#ifdef MAIN_DEC + +#ifndef __IC_PREDICT_H__ +#define __IC_PREDICT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define ALPHA REAL_CONST(0.90625) +#define A REAL_CONST(0.953125) + + +void pns_reset_pred_state(ic_stream *ics, pred_state *state); +void reset_all_predictors(pred_state *state, uint16_t frame_len); +void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, + uint16_t frame_len, uint8_t sf_index); + +ALIGN static const real_t mnt_table[128] = { + COEF_CONST(0.9531250000), COEF_CONST(0.9453125000), + COEF_CONST(0.9375000000), COEF_CONST(0.9296875000), + COEF_CONST(0.9257812500), COEF_CONST(0.9179687500), + COEF_CONST(0.9101562500), COEF_CONST(0.9023437500), + COEF_CONST(0.8984375000), COEF_CONST(0.8906250000), + COEF_CONST(0.8828125000), COEF_CONST(0.8789062500), + COEF_CONST(0.8710937500), COEF_CONST(0.8671875000), + COEF_CONST(0.8593750000), COEF_CONST(0.8515625000), + COEF_CONST(0.8476562500), COEF_CONST(0.8398437500), + COEF_CONST(0.8359375000), COEF_CONST(0.8281250000), + COEF_CONST(0.8242187500), COEF_CONST(0.8203125000), + COEF_CONST(0.8125000000), COEF_CONST(0.8085937500), + COEF_CONST(0.8007812500), COEF_CONST(0.7968750000), + COEF_CONST(0.7929687500), COEF_CONST(0.7851562500), + COEF_CONST(0.7812500000), COEF_CONST(0.7773437500), + COEF_CONST(0.7734375000), COEF_CONST(0.7656250000), + COEF_CONST(0.7617187500), COEF_CONST(0.7578125000), + COEF_CONST(0.7539062500), COEF_CONST(0.7500000000), + COEF_CONST(0.7421875000), COEF_CONST(0.7382812500), + COEF_CONST(0.7343750000), COEF_CONST(0.7304687500), + COEF_CONST(0.7265625000), COEF_CONST(0.7226562500), + COEF_CONST(0.7187500000), COEF_CONST(0.7148437500), + COEF_CONST(0.7109375000), COEF_CONST(0.7070312500), + COEF_CONST(0.6992187500), COEF_CONST(0.6953125000), + COEF_CONST(0.6914062500), COEF_CONST(0.6875000000), + COEF_CONST(0.6835937500), COEF_CONST(0.6796875000), + COEF_CONST(0.6796875000), COEF_CONST(0.6757812500), + COEF_CONST(0.6718750000), COEF_CONST(0.6679687500), + COEF_CONST(0.6640625000), COEF_CONST(0.6601562500), + COEF_CONST(0.6562500000), COEF_CONST(0.6523437500), + COEF_CONST(0.6484375000), COEF_CONST(0.6445312500), + COEF_CONST(0.6406250000), COEF_CONST(0.6406250000), + COEF_CONST(0.6367187500), COEF_CONST(0.6328125000), + COEF_CONST(0.6289062500), COEF_CONST(0.6250000000), + COEF_CONST(0.6210937500), COEF_CONST(0.6210937500), + COEF_CONST(0.6171875000), COEF_CONST(0.6132812500), + COEF_CONST(0.6093750000), COEF_CONST(0.6054687500), + COEF_CONST(0.6054687500), COEF_CONST(0.6015625000), + COEF_CONST(0.5976562500), COEF_CONST(0.5937500000), + COEF_CONST(0.5937500000), COEF_CONST(0.5898437500), + COEF_CONST(0.5859375000), COEF_CONST(0.5820312500), + COEF_CONST(0.5820312500), COEF_CONST(0.5781250000), + COEF_CONST(0.5742187500), COEF_CONST(0.5742187500), + COEF_CONST(0.5703125000), COEF_CONST(0.5664062500), + COEF_CONST(0.5664062500), COEF_CONST(0.5625000000), + COEF_CONST(0.5585937500), COEF_CONST(0.5585937500), + COEF_CONST(0.5546875000), COEF_CONST(0.5507812500), + COEF_CONST(0.5507812500), COEF_CONST(0.5468750000), + COEF_CONST(0.5429687500), COEF_CONST(0.5429687500), + COEF_CONST(0.5390625000), COEF_CONST(0.5390625000), + COEF_CONST(0.5351562500), COEF_CONST(0.5312500000), + COEF_CONST(0.5312500000), COEF_CONST(0.5273437500), + COEF_CONST(0.5273437500), COEF_CONST(0.5234375000), + COEF_CONST(0.5195312500), COEF_CONST(0.5195312500), + COEF_CONST(0.5156250000), COEF_CONST(0.5156250000), + COEF_CONST(0.5117187500), COEF_CONST(0.5117187500), + COEF_CONST(0.5078125000), COEF_CONST(0.5078125000), + COEF_CONST(0.5039062500), COEF_CONST(0.5039062500), + COEF_CONST(0.5000000000), COEF_CONST(0.4980468750), + COEF_CONST(0.4960937500), COEF_CONST(0.4941406250), + COEF_CONST(0.4921875000), COEF_CONST(0.4902343750), + COEF_CONST(0.4882812500), COEF_CONST(0.4863281250), + COEF_CONST(0.4843750000), COEF_CONST(0.4824218750), + COEF_CONST(0.4804687500), COEF_CONST(0.4785156250) +}; + +ALIGN static const real_t exp_table[128] = { + COEF_CONST(0.50000000000000000000000000000000000000000000000000), + COEF_CONST(0.25000000000000000000000000000000000000000000000000), + COEF_CONST(0.12500000000000000000000000000000000000000000000000), + COEF_CONST(0.06250000000000000000000000000000000000000000000000), + COEF_CONST(0.03125000000000000000000000000000000000000000000000), + COEF_CONST(0.01562500000000000000000000000000000000000000000000), + COEF_CONST(0.00781250000000000000000000000000000000000000000000), + COEF_CONST(0.00390625000000000000000000000000000000000000000000), + COEF_CONST(0.00195312500000000000000000000000000000000000000000), + COEF_CONST(0.00097656250000000000000000000000000000000000000000), + COEF_CONST(0.00048828125000000000000000000000000000000000000000), + COEF_CONST(0.00024414062500000000000000000000000000000000000000), + COEF_CONST(0.00012207031250000000000000000000000000000000000000), + COEF_CONST(0.00006103515625000000000000000000000000000000000000), + COEF_CONST(0.00003051757812500000000000000000000000000000000000), + COEF_CONST(0.00001525878906250000000000000000000000000000000000), + COEF_CONST(0.00000762939453125000000000000000000000000000000000), + COEF_CONST(0.00000381469726562500000000000000000000000000000000), + COEF_CONST(0.00000190734863281250000000000000000000000000000000), + COEF_CONST(0.00000095367431640625000000000000000000000000000000), + COEF_CONST(0.00000047683715820312500000000000000000000000000000), + COEF_CONST(0.00000023841857910156250000000000000000000000000000), + COEF_CONST(0.00000011920928955078125000000000000000000000000000), + COEF_CONST(0.00000005960464477539062500000000000000000000000000), + COEF_CONST(0.00000002980232238769531300000000000000000000000000), + COEF_CONST(0.00000001490116119384765600000000000000000000000000), + COEF_CONST(0.00000000745058059692382810000000000000000000000000), + COEF_CONST(0.00000000372529029846191410000000000000000000000000), + COEF_CONST(0.00000000186264514923095700000000000000000000000000), + COEF_CONST(0.00000000093132257461547852000000000000000000000000), + COEF_CONST(0.00000000046566128730773926000000000000000000000000), + COEF_CONST(0.00000000023283064365386963000000000000000000000000), + COEF_CONST(0.00000000011641532182693481000000000000000000000000), + COEF_CONST(0.00000000005820766091346740700000000000000000000000), + COEF_CONST(0.00000000002910383045673370400000000000000000000000), + COEF_CONST(0.00000000001455191522836685200000000000000000000000), + COEF_CONST(0.00000000000727595761418342590000000000000000000000), + COEF_CONST(0.00000000000363797880709171300000000000000000000000), + COEF_CONST(0.00000000000181898940354585650000000000000000000000), + COEF_CONST(0.00000000000090949470177292824000000000000000000000), + COEF_CONST(0.00000000000045474735088646412000000000000000000000), + COEF_CONST(0.00000000000022737367544323206000000000000000000000), + COEF_CONST(0.00000000000011368683772161603000000000000000000000), + COEF_CONST(0.00000000000005684341886080801500000000000000000000), + COEF_CONST(0.00000000000002842170943040400700000000000000000000), + COEF_CONST(0.00000000000001421085471520200400000000000000000000), + COEF_CONST(0.00000000000000710542735760100190000000000000000000), + COEF_CONST(0.00000000000000355271367880050090000000000000000000), + COEF_CONST(0.00000000000000177635683940025050000000000000000000), + COEF_CONST(0.00000000000000088817841970012523000000000000000000), + COEF_CONST(0.00000000000000044408920985006262000000000000000000), + COEF_CONST(0.00000000000000022204460492503131000000000000000000), + COEF_CONST(0.00000000000000011102230246251565000000000000000000), + COEF_CONST(0.00000000000000005551115123125782700000000000000000), + COEF_CONST(0.00000000000000002775557561562891400000000000000000), + COEF_CONST(0.00000000000000001387778780781445700000000000000000), + COEF_CONST(0.00000000000000000693889390390722840000000000000000), + COEF_CONST(0.00000000000000000346944695195361420000000000000000), + COEF_CONST(0.00000000000000000173472347597680710000000000000000), + COEF_CONST(0.00000000000000000086736173798840355000000000000000), + COEF_CONST(0.00000000000000000043368086899420177000000000000000), + COEF_CONST(0.00000000000000000021684043449710089000000000000000), + COEF_CONST(0.00000000000000000010842021724855044000000000000000), + COEF_CONST(0.00000000000000000005421010862427522200000000000000), + COEF_CONST(0.00000000000000000002710505431213761100000000000000), + COEF_CONST(0.00000000000000000001355252715606880500000000000000), + COEF_CONST(0.00000000000000000000677626357803440270000000000000), + COEF_CONST(0.00000000000000000000338813178901720140000000000000), + COEF_CONST(0.00000000000000000000169406589450860070000000000000), + COEF_CONST(0.00000000000000000000084703294725430034000000000000), + COEF_CONST(0.00000000000000000000042351647362715017000000000000), + COEF_CONST(0.00000000000000000000021175823681357508000000000000), + COEF_CONST(0.00000000000000000000010587911840678754000000000000), + COEF_CONST(0.00000000000000000000005293955920339377100000000000), + COEF_CONST(0.00000000000000000000002646977960169688600000000000), + COEF_CONST(0.00000000000000000000001323488980084844300000000000), + COEF_CONST(0.00000000000000000000000661744490042422140000000000), + COEF_CONST(0.00000000000000000000000330872245021211070000000000), + COEF_CONST(0.00000000000000000000000165436122510605530000000000), + COEF_CONST(0.00000000000000000000000082718061255302767000000000), + COEF_CONST(0.00000000000000000000000041359030627651384000000000), + COEF_CONST(0.00000000000000000000000020679515313825692000000000), + COEF_CONST(0.00000000000000000000000010339757656912846000000000), + COEF_CONST(0.00000000000000000000000005169878828456423000000000), + COEF_CONST(0.00000000000000000000000002584939414228211500000000), + COEF_CONST(0.00000000000000000000000001292469707114105700000000), + COEF_CONST(0.00000000000000000000000000646234853557052870000000), + COEF_CONST(0.00000000000000000000000000323117426778526440000000), + COEF_CONST(0.00000000000000000000000000161558713389263220000000), + COEF_CONST(0.00000000000000000000000000080779356694631609000000), + COEF_CONST(0.00000000000000000000000000040389678347315804000000), + COEF_CONST(0.00000000000000000000000000020194839173657902000000), + COEF_CONST(0.00000000000000000000000000010097419586828951000000), + COEF_CONST(0.00000000000000000000000000005048709793414475600000), + COEF_CONST(0.00000000000000000000000000002524354896707237800000), + COEF_CONST(0.00000000000000000000000000001262177448353618900000), + COEF_CONST(0.00000000000000000000000000000631088724176809440000), + COEF_CONST(0.00000000000000000000000000000315544362088404720000), + COEF_CONST(0.00000000000000000000000000000157772181044202360000), + COEF_CONST(0.00000000000000000000000000000078886090522101181000), + COEF_CONST(0.00000000000000000000000000000039443045261050590000), + COEF_CONST(0.00000000000000000000000000000019721522630525295000), + COEF_CONST(0.00000000000000000000000000000009860761315262647600), + COEF_CONST(0.00000000000000000000000000000004930380657631323800), + COEF_CONST(0.00000000000000000000000000000002465190328815661900), + COEF_CONST(0.00000000000000000000000000000001232595164407830900), + COEF_CONST(0.00000000000000000000000000000000616297582203915470), + COEF_CONST(0.00000000000000000000000000000000308148791101957740), + COEF_CONST(0.00000000000000000000000000000000154074395550978870), + COEF_CONST(0.00000000000000000000000000000000077037197775489434), + COEF_CONST(0.00000000000000000000000000000000038518598887744717), + COEF_CONST(0.00000000000000000000000000000000019259299443872359), + COEF_CONST(0.00000000000000000000000000000000009629649721936179), + COEF_CONST(0.00000000000000000000000000000000004814824860968090), + COEF_CONST(0.00000000000000000000000000000000002407412430484045), + COEF_CONST(0.00000000000000000000000000000000001203706215242022), + COEF_CONST(0.00000000000000000000000000000000000601853107621011), + COEF_CONST(0.00000000000000000000000000000000000300926553810506), + COEF_CONST(0.00000000000000000000000000000000000150463276905253), + COEF_CONST(0.00000000000000000000000000000000000075231638452626), + COEF_CONST(0.00000000000000000000000000000000000037615819226313), + COEF_CONST(0.00000000000000000000000000000000000018807909613157), + COEF_CONST(0.00000000000000000000000000000000000009403954806578), + COEF_CONST(0.00000000000000000000000000000000000004701977403289), + COEF_CONST(0.00000000000000000000000000000000000002350988701645), + COEF_CONST(0.00000000000000000000000000000000000001175494350822), + COEF_CONST(0.0 /* 0000000000000000000000000000000000000587747175411 "floating point underflow" */), + COEF_CONST(0.0) +}; + +#ifdef __cplusplus +} +#endif +#endif + +#endif diff --git a/src/contrib/aacdecoder/libfaad/iq_table.h b/src/contrib/aacdecoder/libfaad/iq_table.h old mode 100644 new mode 100755 index 0b496389f..3cc2b8061 --- a/src/contrib/aacdecoder/libfaad/iq_table.h +++ b/src/contrib/aacdecoder/libfaad/iq_table.h @@ -1,9283 +1,16458 @@ -/* -** 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: iq_table.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef IQ_TABLE_H__ -#define IQ_TABLE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -/* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */ - - -#ifndef FIXED_POINT - -#define IQ_TABLE_SIZE 8192 - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = -{ - 0, - 1, - 2.5198420997897464, - 4.3267487109222245, - 6.3496042078727974, - 8.5498797333834844, - 10.902723556992836, - 13.390518279406722, - 15.999999999999998, - 18.720754407467133, - 21.544346900318832, - 24.463780996262464, - 27.47314182127996, - 30.567350940369842, - 33.741991698453212, - 36.993181114957046, - 40.317473596635935, - 43.711787041189993, - 47.173345095760126, - 50.699631325716943, - 54.288352331898118, - 57.937407704003519, - 61.6448652744185, - 65.408940536585988, - 69.227979374755591, - 73.100443455321638, - 77.024897778591622, - 80.999999999999986, - 85.024491212518527, - 89.097187944889555, - 93.216975178615741, - 97.382800224133163, - 101.59366732596474, - 105.84863288986224, - 110.14680124343441, - 114.4873208566006, - 118.86938096020653, - 123.29220851090024, - 127.75506545836058, - 132.25724627755247, - 136.79807573413572, - 141.37690685569191, - 145.99311908523086, - 150.6461165966291, - 155.33532675434674, - 160.06019870205279, - 164.82020206673349, - 169.61482576651861, - 174.44357691188537, - 179.30597979112557, - 184.20157493201927, - 189.12991823257562, - 194.09058015449685, - 199.08314497371677, - 204.1072100829694, - 209.16238534187647, - 214.24829247050752, - 219.36456448277784, - 224.51084515641216, - 229.6867885365223, - 234.89205847013176, - 240.12632816923249, - 245.38927980018505, - 250.68060409747261, - 255.99999999999991, - 261.34717430828869, - 266.72184136106449, - 272.12372272986045, - 277.55254693037961, - 283.0080491494619, - 288.48997098659891, - 293.99806020902247, - 299.53207051947408, - 305.0917613358298, - 310.67689758182206, - 316.28724948815585, - 321.92259240337177, - 327.58270661385535, - 333.26737717243742, - 338.97639373507025, - 344.70955040510125, - 350.46664558470013, - 356.24748183302603, - 362.05186573075139, - 367.87960775058258, - 373.73052213344511, - 379.60442677002078, - 385.50114308734607, - 391.42049594019937, - 397.36231350702371, - 403.32642719014467, - 409.31267152006262, - 415.32088406360799, - 421.35090533576471, - 427.40257871497619, - 433.4757503617617, - 439.5702691404793, - 445.68598654408271, - 451.82275662172759, - 457.98043590909128, - 464.15888336127773, - 470.35796028818726, - 476.5775302922363, - 482.81745920832043, - 489.07761504591741, - 495.35786793323581, - 501.65809006331688, - 507.97815564200368, - 514.31794083769648, - 520.67732373281672, - 527.05618427690604, - 533.45440424129174, - 539.87186717525128, - 546.30845836361505, - 552.76406478574609, - 559.23857507584194, - 565.73187948450413, - 572.24386984152341, - 578.77443951983378, - 585.32348340058843, - 591.89089783931263, - 598.47658063309257, - 605.08043098876044, - 611.70234949203643, - 618.3422380775919, - 624.99999999999977, - 631.67553980553748, - 638.36876330481164, - 645.07957754617485, - 651.80789078990415, - 658.55361248311499, - 665.31665323538357, - 672.09692479505225, - 678.8943400261943, - 685.70881288621433, - 692.540258404062, - 699.38859265903977, - 706.25373276018058, - 713.13559682617972, - 720.03410396586037, - 726.94917425915435, - 733.88072873858209, - 740.82868937121543, - 747.79297904110535, - 754.77352153216191, - 761.77024151147043, - 768.78306451302956, - 775.81191692189896, - 782.85672595874246, - 789.91741966475445, - 796.99392688695798, - 804.08617726386274, - 811.19410121147098, - 818.31762990962227, - 825.45669528866563, - 832.61123001644864, - 839.78116748561604, - 846.96644180120552, - 854.16698776853514, - 861.38274088137143, - 868.61363731036977, - 875.85961389178203, - 883.12060811641959, - 890.39655811886757, - 897.68740266694181, - 904.99308115138172, - 912.31353357577188, - 919.64870054668756, - 926.99852326405619, - 934.36294351172899, - 941.74190364825859, - 949.13534659787422, - 956.54321584165211, - 963.96545540887348, - 971.40200986856541, - 978.85282432122176, - 986.31784439069588, - 993.7970162162635, - 1001.29028644485, - 1008.797602223418, - 1016.3189111915103, - 1023.8541614739464, - 1031.4033016736653, - 1038.9662808647138, - 1046.5430485853758, - 1054.1335548314366, - 1061.7377500495838, - 1069.3555851309357, - 1076.9870114046978, - 1084.6319806319441, - 1092.2904449995174, - 1099.9623571140482, - 1107.6476699960892, - 1115.3463370743607, - 1123.058312180106, - 1130.7835495415541, - 1138.5220037784854, - 1146.273629896901, - 1154.0383832837879, - 1161.816219701986, - 1169.607095285146, - 1177.4109665327808, - 1185.2277903054078, - 1193.0575238197798, - 1200.9001246442001, - 1208.7555506939248, - 1216.6237602266442, - 1224.5047118380478, - 1232.3983644574657, - 1240.3046773435874, - 1248.2236100802568, - 1256.1551225723395, - 1264.099175041662, - 1272.0557280230228, - 1280.0247423602691, - 1288.0061792024444, - 1295.9999999999995, - 1304.006166501068, - 1312.0246407478062, - 1320.0553850727929, - 1328.0983620954903, - 1336.1535347187651, - 1344.2208661254647, - 1352.3003197750522, - 1360.3918594002962, - 1368.4954490040145, - 1376.6110528558709, - 1384.7386354892244, - 1392.8781616980295, - 1401.0295965337855, - 1409.1929053025353, - 1417.3680535619119, - 1425.5550071182327, - 1433.7537320236374, - 1441.9641945732744, - 1450.1863613025282, - 1458.4201989842913, - 1466.6656746262797, - 1474.9227554683875, - 1483.1914089800841, - 1491.4716028578516, - 1499.7633050226596, - 1508.0664836174794, - 1516.3811070048375, - 1524.7071437644029, - 1533.0445626906128, - 1541.3933327903342, - 1549.7534232805581, - 1558.1248035861302, - 1566.507443337515, - 1574.9013123685909, - 1583.3063807144795, - 1591.7226186094069, - 1600.1499964845941, - 1608.58848496618, - 1617.0380548731737, - 1625.4986772154357, - 1633.9703231916887, - 1642.4529641875577, - 1650.9465717736346, - 1659.4511177035752, - 1667.9665739122186, - 1676.4929125137353, - 1685.030105799801, - 1693.5781262377957, - 1702.136946469027, - 1710.7065393069795, - 1719.2868777355877, - 1727.8779349075323, - 1736.4796841425596, - 1745.092098925825, - 1753.7151529062583, - 1762.3488198949503, - 1770.9930738635628, - 1779.6478889427597, - 1788.3132394206564, - 1796.9890997412947, - 1805.6754445031333, - 1814.3722484575621, - 1823.0794865074322, - 1831.7971337056094, - 1840.5251652535437, - 1849.2635564998579, - 1858.0122829389563, - 1866.7713202096493, - 1875.5406440937966, - 1884.3202305149687, - 1893.110055537124, - 1901.9100953633042, - 1910.7203263343454, - 1919.5407249276057, - 1928.3712677557098, - 1937.2119315653083, - 1946.0626932358525, - 1954.923529778386, - 1963.79441833435, - 1972.6753361744036, - 1981.5662606972594, - 1990.467169428533, - 1999.3780400196069, - 2008.2988502465078, - 2017.2295780087982, - 2026.1702013284819, - 2035.1206983489212, - 2044.0810473337688, - 2053.0512266659125, - 2062.0312148464309, - 2071.0209904935646, - 2080.0205323416958, - 2089.0298192403443, - 2098.0488301531714, - 2107.0775441569995, - 2116.115940440839, - 2125.1639983049317, - 2134.2216971597995, - 2143.2890165253098, - 2152.3659360297484, - 2161.4524354089031, - 2170.5484945051617, - 2179.6540932666144, - 2188.7692117461711, - 2197.8938301006888, - 2207.0279285901042, - 2216.1714875765838, - 2225.324487523676, - 2234.4869089954782, - 2243.6587326558101, - 2252.8399392673982, - 2262.0305096910702, - 2271.2304248849537, - 2280.4396659036897, - 2289.6582138976523, - 2298.8860501121762, - 2308.1231558867926, - 2317.3695126544767, - 2326.6251019409005, - 2335.8899053636933, - 2345.1639046317132, - 2354.4470815443233, - 2363.7394179906792, - 2373.0408959490205, - 2382.3514974859731, - 2391.6712047558558, - 2400.9999999999991, - 2410.3378655460651, - 2419.6847838073813, - 2429.0407372822747, - 2438.4057085534191, - 2447.7796802871858, - 2457.1626352330004, - 2466.5545562227112, - 2475.9554261699564, - 2485.3652280695474, - 2494.7839449968492, - 2504.2115601071737, - 2513.6480566351788, - 2523.0934178942675, - 2532.5476272760025, - 2542.0106682495189, - 2551.482524360948, - 2560.9631792328441, - 2570.4526165636184, - 2579.9508201269791, - 2589.4577737713744, - 2598.9734614194458, - 2608.4978670674823, - 2618.0309747848837, - 2627.5727687136259, - 2637.1232330677353, - 2646.6823521327647, - 2656.2501102652768, - 2665.8264918923328, - 2675.4114815109842, - 2685.0050636877722, - 2694.6072230582295, - 2704.2179443263894, - 2713.8372122642972, - 2723.4650117115279, - 2733.1013275747096, - 2742.7461448270483, - 2752.3994485078601, - 2762.0612237221085, - 2771.7314556399419, - 2781.4101294962406, - 2791.0972305901655, - 2800.7927442847094, - 2810.4966560062589, - 2820.2089512441521, - 2829.9296155502466, - 2839.6586345384894, - 2849.3959938844923, - 2859.1416793251065, - 2868.8956766580086, - 2878.6579717412847, - 2888.4285504930212, - 2898.2073988908974, - 2907.9945029717837, - 2917.789848831344, - 2927.5934226236377, - 2937.4052105607311, - 2947.2251989123079, - 2957.0533740052865, - 2966.8897222234368, - 2976.734230007005, - 2986.5868838523397, - 2996.4476703115197, - 3006.3165759919889, - 3016.1935875561908, - 3026.0786917212095, - 3035.9718752584108, - 3045.8731249930906, - 3055.7824278041207, - 3065.6997706236039, - 3075.625140436528, - 3085.5585242804245, - 3095.4999092450298, - 3105.4492824719491, - 3115.4066311543256, - 3125.3719425365089, - 3135.3452039137287, - 3145.3264026317715, - 3155.3155260866592, - 3165.3125617243295, - 3175.3174970403229, - 3185.3303195794679, - 3195.35101693557, - 3205.3795767511078, - 3215.4159867169251, - 3225.460234571929, - 3235.5123081027928, - 3245.5721951436558, - 3255.63988357583, - 3265.7153613275095, - 3275.7986163734795, - 3285.8896367348289, - 3295.9884104786665, - 3306.0949257178395, - 3316.2091706106517, - 3326.331133360588, - 3336.4608022160378, - 3346.5981654700231, - 3356.7432114599264, - 3366.8959285672249, - 3377.0563052172211, - 3387.2243298787821, - 3397.3999910640764, - 3407.5832773283128, - 3417.7741772694862, - 3427.9726795281199, - 3438.1787727870123, - 3448.3924457709873, - 3458.6136872466445, - 3468.8424860221107, - 3479.0788309467976, - 3489.3227109111554, - 3499.5741148464344, - 3509.8330317244445, - 3520.0994505573185, - 3530.3733603972751, - 3540.6547503363886, - 3550.9436095063534, - 3561.239927078258, - 3571.5436922623535, - 3581.8548943078308, - 3592.1735225025936, - 3602.4995661730372, - 3612.8330146838275, - 3623.1738574376814, - 3633.5220838751502, - 3643.8776834744031, - 3654.2406457510142, - 3664.6109602577494, - 3674.9886165843564, - 3685.3736043573545, - 3695.7659132398294, - 3706.1655329312248, - 3716.5724531671399, - 3726.9866637191262, - 3737.4081543944876, - 3747.8369150360782, - 3758.2729355221072, - 3768.7162057659411, - 3779.1667157159077, - 3789.6244553551055, - 3800.0894147012082, - 3810.5615838062768, - 3821.0409527565694, - 3831.5275116723533, - 3842.0212507077194, - 3852.522160050396, - 3863.0302299215673, - 3873.5454505756893, - 3884.0678123003108, - 3894.5973054158922, - 3905.1339202756285, - 3915.6776472652732, - 3926.2284768029604, - 3936.7863993390338, - 3947.3514053558706, - 3957.9234853677135, - 3968.5026299204969, - 3979.0888295916798, - 3989.6820749900776, - 4000.2823567556948, - 4010.8896655595613, - 4021.5039921035655, - 4032.1253271202945, - 4042.7536613728694, - 4053.3889856547858, - 4064.0312907897551, - 4074.6805676315448, - 4085.3368070638221, - 4095.9999999999982, - 4106.6701373830711, - 4117.347210185475, - 4128.0312094089259, - 4138.722126084268, - 4149.4199512713267, - 4160.1246760587583, - 4170.8362915638982, - 4181.5547889326181, - 4192.2801593391769, - 4203.0123939860741, - 4213.7514841039101, - 4224.4974209512384, - 4235.2501958144258, - 4246.0098000075095, - 4256.7762248720574, - 4267.549461777031, - 4278.3295021186423, - 4289.1163373202198, - 4299.9099588320714, - 4310.7103581313495, - 4321.5175267219138, - 4332.3314561342004, - 4343.152137925088, - 4353.9795636777671, - 4364.8137250016052, - 4375.6546135320223, - 4386.5022209303588, - 4397.3565388837469, - 4408.2175591049827, - 4419.0852733324018, - 4429.9596733297531, - 4440.8407508860728, - 4451.7284978155603, - 4462.6229059574571, - 4473.5239671759227, - 4484.4316733599126, - 4495.3460164230582, - 4506.2669883035496, - 4517.1945809640119, - 4528.1287863913894, - 4539.069596596828, - 4550.0170036155587, - 4560.9709995067806, - 4571.931576353546, - 4582.898726262647, - 4593.8724413645004, - 4604.8527138130348, - 4615.8395357855816, - 4626.8328994827571, - 4637.8327971283588, - 4648.8392209692511, - 4659.8521632752563, - 4670.8716163390473, - 4681.8975724760394, - 4692.9300240242837, - 4703.9689633443595, - 4715.0143828192668, - 4726.0662748543255, - 4737.1246318770682, - 4748.1894463371373, - 4759.2607107061804, - 4770.3384174777493, - 4781.4225591671993, - 4792.5131283115852, - 4803.6101174695614, - 4814.7135192212854, - 4825.8233261683154, - 4836.9395309335096, - 4848.0621261609349, - 4859.1911045157631, - 4870.3264586841779, - 4881.4681813732768, - 4892.6162653109768, - 4903.7707032459193, - 4914.931487947375, - 4926.0986122051509, - 4937.2720688294967, - 4948.4518506510112, - 4959.637950520555, - 4970.8303613091521, - 4982.0290759079044, - 4993.2340872278974, - 5004.4453882001153, - 5015.6629717753467, - 5026.8868309241007, - 5038.1169586365131, - 5049.353347922266, - 5060.5959918104927, - 5071.8448833496996, - 5083.1000156076734, - 5094.3613816713996, - 5105.6289746469747, - 5116.9027876595246, - 5128.18281385312, - 5139.4690463906918, - 5150.7614784539473, - 5162.0601032432933, - 5173.3649139777472, - 5184.6759038948594, - 5195.9930662506322, - 5207.3163943194386, - 5218.6458813939435, - 5229.9815207850224, - 5241.3233058216847, - 5252.6712298509919, - 5264.025286237983, - 5275.3854683655954, - 5286.7517696345885, - 5298.1241834634639, - 5309.5027032883945, - 5320.887322563146, - 5332.2780347589978, - 5343.6748333646756, - 5355.0777118862716, - 5366.4866638471722, - 5377.901682787985, - 5389.3227622664635, - 5400.749895857437, - 5412.1830771527357, - 5423.622299761123, - 5435.067557308219, - 5446.5188434364318, - 5457.9761518048872, - 5469.4394760893592, - 5480.9088099821975, - 5492.3841471922606, - 5503.8654814448455, - 5515.3528064816201, - 5526.846116060552, - 5538.3454039558474, - 5549.8506639578736, - 5561.3618898731029, - 5572.8790755240361, - 5584.4022147491451, - 5595.9313014027975, - 5607.4663293552012, - 5619.0072924923297, - 5630.5541847158656, - 5642.1069999431284, - 5653.665732107017, - 5665.230375155943, - 5676.8009230537655, - 5688.3773697797333, - 5699.9597093284156, - 5711.5479357096474, - 5723.1420429484588, - 5734.7420250850209, - 5746.347876174581, - 5757.9595902874016, - 5769.5771615087006, - 5781.2005839385911, - 5792.8298516920213, - 5804.4649588987149, - 5816.1058997031105, - 5827.7526682643065, - 5839.4052587559972, - 5851.0636653664196, - 5862.7278822982908, - 5874.3979037687541, - 5886.0737240093204, - 5897.7553372658094, - 5909.4427377982956, - 5921.1359198810505, - 5932.8348778024874, - 5944.5396058651031, - 5956.2500983854261, - 5967.9663496939575, - 5979.6883541351208, - 5991.4161060672022, - 6003.1495998623004, - 6014.8888299062692, - 6026.6337905986684, - 6038.3844763527022, - 6050.1408815951781, - 6061.9030007664414, - 6073.6708283203316, - 6085.4443587241267, - 6097.2235864584891, - 6109.0085060174197, - 6120.7991119081998, - 6132.595398651345, - 6144.3973607805519, - 6156.2049928426459, - 6168.0182893975361, - 6179.8372450181578, - 6191.6618542904307, - 6203.4921118132024, - 6215.3280121982016, - 6227.1695500699925, - 6239.0167200659189, - 6250.8695168360628, - 6262.7279350431891, - 6274.5919693627056, - 6286.4616144826068, - 6298.3368651034316, - 6310.2177159382172, - 6322.1041617124456, - 6333.9961971640032, - 6345.8938170431311, - 6357.7970161123785, - 6369.7057891465583, - 6381.6201309327007, - 6393.5400362700075, - 6405.4654999698032, - 6417.3965168554978, - 6429.3330817625329, - 6441.2751895383453, - 6453.2228350423138, - 6465.176013145724, - 6477.134718731716, - 6489.0989466952469, - 6501.0686919430445, - 6513.0439493935628, - 6525.0247139769417, - 6537.010980634961, - 6549.002744321001, - 6560.9999999999973, - 6573.0027426483985, - 6585.0109672541284, - 6597.0246688165371, - 6609.0438423463656, - 6621.0684828657004, - 6633.0985854079354, - 6645.134145017727, - 6657.1751567509573, - 6669.2216156746908, - 6681.2735168671343, - 6693.3308554176001, - 6705.3936264264594, - 6717.461825005108, - 6729.535446275926, - 6741.6144853722335, - 6753.6989374382601, - 6765.7887976290967, - 6777.8840611106634, - 6789.9847230596661, - 6802.0907786635626, - 6814.2022231205201, - 6826.3190516393797, - 6838.4412594396181, - 6850.5688417513074, - 6862.701793815083, - 6874.840110882099, - 6886.9837882139991, - 6899.1328210828724, - 6911.2872047712199, - 6923.4469345719199, - 6935.6120057881863, - 6947.7824137335365, - 6959.9581537317536, - 6972.1392211168532, - 6984.3256112330409, - 6996.5173194346862, - 7008.7143410862773, - 7020.9166715623942, - 7033.1243062476678, - 7045.3372405367481, - 7057.5554698342685, - 7069.7789895548103, - 7082.0077951228714, - 7094.2418819728273, - 7106.4812455489018, - 7118.7258813051285, - 7130.9757847053224, - 7143.2309512230404, - 7155.4913763415516, - 7167.7570555538041, - 7180.0279843623894, - 7192.3041582795131, - 7204.5855728269571, - 7216.8722235360519, - 7229.1641059476406, - 7241.4612156120484, - 7253.7635480890503, - 7266.0710989478375, - 7278.3838637669869, - 7290.7018381344296, - 7303.0250176474174, - 7315.3533979124932, - 7327.6869745454596, - 7340.0257431713462, - 7352.3696994243801, - 7364.7188389479543, - 7377.0731573945968, - 7389.4326504259407, - 7401.7973137126937, - 7414.1671429346061, - 7426.5421337804428, - 7438.922281947951, - 7451.3075831438346, - 7463.6980330837177, - 7476.0936274921214, - 7488.4943621024304, - 7500.9002326568652, - 7513.3112349064522, - 7525.7273646109943, - 7538.1486175390446, - 7550.5749894678729, - 7563.0064761834419, - 7575.4430734803736, - 7587.8847771619248, - 7600.3315830399597, - 7612.7834869349153, - 7625.24048467578, - 7637.7025721000637, - 7650.1697450537677, - 7662.6419993913596, - 7675.1193309757446, - 7687.6017356782404, - 7700.0892093785433, - 7712.5817479647112, - 7725.079347333125, - 7737.5820033884729, - 7750.0897120437139, - 7762.6024692200581, - 7775.1202708469355, - 7787.6431128619733, - 7800.1709912109645, - 7812.7039018478481, - 7825.2418407346768, - 7837.7848038415968, - 7850.3327871468155, - 7862.8857866365806, - 7875.4437983051539, - 7888.006818154784, - 7900.5748421956796, - 7913.1478664459901, - 7925.725886931772, - 7938.3088996869719, - 7950.8969007533951, - 7963.4898861806851, - 7976.0878520262959, - 7988.6907943554688, - 8001.2987092412086, - 8013.911592764257, - 8026.5294410130691, - 8039.1522500837891, - 8051.7800160802271, - 8064.412735113835, - 8077.0504033036796, - 8089.6930167764222, - 8102.3405716662946, - 8114.9930641150731, - 8127.6504902720571, - 8140.3128462940449, - 8152.9801283453098, - 8165.6523325975786, - 8178.3294552300049, - 8191.0114924291529, - 8203.6984403889655, - 8216.3902953107463, - 8229.0870534031419, - 8241.7887108821069, - 8254.4952639708936, - 8267.2067089000211, - 8279.9230419072574, - 8292.6442592375952, - 8305.3703571432306, - 8318.101331883543, - 8330.8371797250657, - 8343.577896941475, - 8356.3234798135582, - 8369.0739246291978, - 8381.8292276833508, - 8394.5893852780209, - 8407.3543937222421, - 8420.1242493320569, - 8432.8989484304948, - 8445.6784873475499, - 8458.4628624201578, - 8471.2520699921806, - 8484.0461064143838, - 8496.8449680444082, - 8509.6486512467636, - 8522.4571523927953, - 8535.270467860666, - 8548.0885940353437, - 8560.9115273085663, - 8573.7392640788403, - 8586.5718007514006, - 8599.4091337382069, - 8612.2512594579148, - 8625.0981743358552, - 8637.9498748040205, - 8650.8063573010386, - 8663.6676182721567, - 8676.533654169225, - 8689.4044614506638, - 8702.2800365814601, - 8715.1603760331418, - 8728.0454762837508, - 8740.9353338178389, - 8753.8299451264356, - 8766.7293067070332, - 8779.6334150635721, - 8792.5422667064158, - 8805.4558581523324, - 8818.3741859244819, - 8831.2972465523908, - 8844.2250365719356, - 8857.1575525253265, - 8870.0947909610859, - 8883.0367484340295, - 8895.9834215052524, - 8908.934806742107, - 8921.8909007181846, - 8934.8517000132997, - 8947.817201213471, - 8960.7874009109, - 8973.7622957039603, - 8986.7418821971733, - 8999.7261570011924, - 9012.7151167327884, - 9025.7087580148236, - 9038.7070774762469, - 9051.7100717520643, - 9064.7177374833282, - 9077.7300713171153, - 9090.7470699065179, - 9103.7687299106146, - 9116.7950479944648, - 9129.8260208290812, - 9142.8616450914233, - 9155.9019174643727, - 9168.9468346367157, - 9181.9963933031358, - 9195.0505901641845, - 9208.1094219262741, - 9221.1728853016557, - 9234.240977008405, - 9247.3136937704076, - 9260.3910323173386, - 9273.472989384647, - 9286.5595617135423, - 9299.6507460509747, - 9312.7465391496207, - 9325.8469377678684, - 9338.9519386698012, - 9352.0615386251757, - 9365.1757344094131, - 9378.2945228035842, - 9391.4179005943843, - 9404.5458645741273, - 9417.6784115407263, - 9430.8155382976747, - 9443.9572416540359, - 9457.1035184244265, - 9470.2543654290002, - 9483.4097794934296, - 9496.5697574488931, - 9509.7342961320664, - 9522.9033923850911, - 9536.0770430555804, - 9549.2552449965824, - 9562.4379950665825, - 9575.6252901294793, - 9588.8171270545736, - 9602.0135027165488, - 9615.2144139954635, - 9628.4198577767274, - 9641.629830951093, - 9654.844330414644, - 9668.0633530687719, - 9681.286895820167, - 9694.5149555808002, - 9707.7475292679192, - 9720.9846138040157, - 9734.2262061168276, - 9747.4723031393187, - 9760.7229018096641, - 9773.9779990712323, - 9787.2375918725811, - 9800.5016771674327, - 9813.7702519146696, - 9827.0433130783094, - 9840.3208576275028, - 9853.602882536512, - 9866.8893847846994, - 9880.1803613565116, - 9893.4758092414686, - 9906.7757254341523, - 9920.0801069341851, - 9933.3889507462245, - 9946.7022538799429, - 9960.0200133500221, - 9973.3422261761298, - 9986.6688893829159, - 9999.9999999999945, - 10013.335555061929, - 10026.675551608221, - 10040.019986683301, - 10053.368857336509, - 10066.722160622081, - 10080.079893599144, - 10093.442053331697, - 10106.808636888598, - 10120.179641343551, - 10133.555063775095, - 10146.934901266595, - 10160.31915090622, - 10173.707809786936, - 10187.100875006496, - 10200.498343667417, - 10213.900212876984, - 10227.306479747222, - 10240.717141394889, - 10254.132194941467, - 10267.551637513146, - 10280.975466240814, - 10294.40367826004, - 10307.836270711066, - 10321.273240738796, - 10334.71458549278, - 10348.160302127204, - 10361.610387800878, - 10375.064839677221, - 10388.523654924258, - 10401.986830714593, - 10415.454364225412, - 10428.926252638465, - 10442.402493140049, - 10455.883082921007, - 10469.368019176709, - 10482.85729910704, - 10496.350919916393, - 10509.848878813653, - 10523.351173012188, - 10536.857799729838, - 10550.3687561889, - 10563.884039616123, - 10577.403647242685, - 10590.927576304197, - 10604.455824040679, - 10617.988387696556, - 10631.525264520642, - 10645.066451766135, - 10658.611946690598, - 10672.161746555956, - 10685.715848628475, - 10699.274250178762, - 10712.836948481747, - 10726.403940816675, - 10739.975224467091, - 10753.550796720834, - 10767.130654870027, - 10780.714796211059, - 10794.303218044579, - 10807.895917675487, - 10821.492892412922, - 10835.094139570248, - 10848.699656465047, - 10862.309440419107, - 10875.923488758415, - 10889.541798813138, - 10903.16436791762, - 10916.791193410372, - 10930.422272634056, - 10944.05760293548, - 10957.697181665582, - 10971.341006179427, - 10984.98907383619, - 10998.641381999149, - 11012.297928035676, - 11025.958709317223, - 11039.623723219316, - 11053.292967121541, - 11066.966438407539, - 11080.64413446499, - 11094.326052685608, - 11108.012190465128, - 11121.702545203296, - 11135.397114303863, - 11149.095895174571, - 11162.798885227143, - 11176.506081877278, - 11190.217482544635, - 11203.933084652828, - 11217.652885629415, - 11231.376882905886, - 11245.105073917659, - 11258.837456104062, - 11272.574026908333, - 11286.314783777601, - 11300.059724162888, - 11313.808845519083, - 11327.562145304952, - 11341.319620983111, - 11355.081270020033, - 11368.847089886023, - 11382.617078055218, - 11396.391232005579, - 11410.169549218874, - 11423.952027180676, - 11437.738663380349, - 11451.529455311042, - 11465.324400469679, - 11479.123496356951, - 11492.926740477304, - 11506.734130338931, - 11520.545663453764, - 11534.361337337466, - 11548.181149509423, - 11562.005097492724, - 11575.83317881417, - 11589.665391004253, - 11603.501731597149, - 11617.342198130715, - 11631.186788146468, - 11645.035499189589, - 11658.888328808911, - 11672.745274556904, - 11686.606333989675, - 11700.471504666955, - 11714.340784152086, - 11728.214170012021, - 11742.091659817312, - 11755.973251142101, - 11769.858941564111, - 11783.748728664636, - 11797.642610028539, - 11811.540583244237, - 11825.442645903697, - 11839.34879560242, - 11853.259029939445, - 11867.173346517333, - 11881.091742942155, - 11895.014216823492, - 11908.940765774427, - 11922.871387411526, - 11936.806079354839, - 11950.744839227897, - 11964.687664657684, - 11978.634553274653, - 11992.585502712702, - 12006.540510609168, - 12020.499574604828, - 12034.462692343877, - 12048.429861473938, - 12062.401079646032, - 12076.376344514589, - 12090.355653737433, - 12104.339004975769, - 12118.326395894188, - 12132.317824160644, - 12146.313287446457, - 12160.312783426305, - 12174.316309778205, - 12188.323864183525, - 12202.335444326955, - 12216.351047896511, - 12230.370672583531, - 12244.394316082657, - 12258.421976091831, - 12272.453650312296, - 12286.489336448574, - 12300.529032208471, - 12314.572735303058, - 12328.620443446678, - 12342.672154356922, - 12356.727865754638, - 12370.787575363909, - 12384.851280912055, - 12398.918980129623, - 12412.990670750381, - 12427.066350511306, - 12441.146017152583, - 12455.229668417589, - 12469.317302052901, - 12483.40891580827, - 12497.50450743663, - 12511.604074694078, - 12525.707615339878, - 12539.815127136444, - 12553.926607849342, - 12568.042055247275, - 12582.161467102082, - 12596.284841188726, - 12610.41217528529, - 12624.543467172971, - 12638.678714636069, - 12652.817915461985, - 12666.961067441209, - 12681.108168367316, - 12695.259216036962, - 12709.414208249869, - 12723.573142808827, - 12737.736017519681, - 12751.902830191326, - 12766.073578635704, - 12780.248260667788, - 12794.426874105588, - 12808.609416770132, - 12822.795886485468, - 12836.986281078653, - 12851.180598379744, - 12865.378836221802, - 12879.580992440871, - 12893.787064875984, - 12907.997051369144, - 12922.210949765335, - 12936.428757912496, - 12950.650473661524, - 12964.876094866273, - 12979.105619383534, - 12993.339045073039, - 13007.576369797454, - 13021.817591422368, - 13036.062707816285, - 13050.311716850629, - 13064.564616399723, - 13078.821404340792, - 13093.082078553954, - 13107.346636922217, - 13121.615077331464, - 13135.887397670458, - 13150.163595830827, - 13164.44366970706, - 13178.727617196502, - 13193.015436199352, - 13207.307124618648, - 13221.602680360265, - 13235.902101332911, - 13250.205385448118, - 13264.512530620239, - 13278.823534766434, - 13293.138395806676, - 13307.457111663734, - 13321.779680263176, - 13336.106099533356, - 13350.436367405409, - 13364.77048181325, - 13379.108440693562, - 13393.450241985796, - 13407.795883632158, - 13422.145363577607, - 13436.498679769853, - 13450.855830159346, - 13465.216812699266, - 13479.581625345529, - 13493.950266056772, - 13508.32273279435, - 13522.699023522329, - 13537.079136207483, - 13551.463068819286, - 13565.850819329906, - 13580.2423857142, - 13594.63776594971, - 13609.036958016657, - 13623.439959897927, - 13637.846769579081, - 13652.257385048335, - 13666.67180429656, - 13681.090025317284, - 13695.512046106669, - 13709.937864663521, - 13724.367478989278, - 13738.800887088004, - 13753.238086966385, - 13767.679076633727, - 13782.123854101939, - 13796.572417385545, - 13811.024764501659, - 13825.480893469998, - 13839.94080231286, - 13854.404489055134, - 13868.871951724283, - 13883.34318835034, - 13897.818196965914, - 13912.296975606168, - 13926.779522308825, - 13941.26583511416, - 13955.755912064991, - 13970.249751206682, - 13984.747350587126, - 13999.248708256751, - 14013.753822268511, - 14028.262690677873, - 14042.775311542828, - 14057.291682923867, - 14071.811802883994, - 14086.335669488704, - 14100.863280805994, - 14115.394634906341, - 14129.92972986271, - 14144.468563750548, - 14159.01113464777, - 14173.55744063476, - 14188.107479794369, - 14202.661250211901, - 14217.218749975118, - 14231.779977174227, - 14246.344929901879, - 14260.913606253163, - 14275.486004325601, - 14290.062122219146, - 14304.641958036171, - 14319.225509881464, - 14333.812775862236, - 14348.403754088098, - 14362.998442671067, - 14377.59683972556, - 14392.198943368388, - 14406.804751718748, - 14421.414262898223, - 14436.027475030774, - 14450.64438624274, - 14465.264994662828, - 14479.889298422106, - 14494.517295654005, - 14509.148984494313, - 14523.784363081166, - 14538.423429555049, - 14553.066182058781, - 14567.712618737527, - 14582.362737738777, - 14597.016537212348, - 14611.674015310382, - 14626.33517018734, - 14640.999999999993, - 14655.668502907418, - 14670.340677071003, - 14685.016520654426, - 14699.696031823671, - 14714.379208746999, - 14729.066049594967, - 14743.756552540408, - 14758.45071575843, - 14773.148537426418, - 14787.850015724018, - 14802.555148833142, - 14817.263934937961, - 14831.976372224897, - 14846.692458882624, - 14861.41219310206, - 14876.135573076363, - 14890.862597000923, - 14905.593263073371, - 14920.327569493558, - 14935.065514463557, - 14949.807096187662, - 14964.552312872382, - 14979.301162726431, - 14994.053643960735, - 15008.809754788414, - 15023.569493424788, - 15038.332858087369, - 15053.099846995858, - 15067.870458372134, - 15082.644690440264, - 15097.422541426484, - 15112.204009559202, - 15126.989093068994, - 15141.777790188597, - 15156.570099152905, - 15171.366018198967, - 15186.165545565986, - 15200.968679495301, - 15215.775418230402, - 15230.585760016909, - 15245.399703102579, - 15260.217245737298, - 15275.038386173073, - 15289.863122664035, - 15304.691453466432, - 15319.523376838621, - 15334.358891041069, - 15349.197994336346, - 15364.040684989128, - 15378.886961266177, - 15393.736821436356, - 15408.590263770609, - 15423.447286541972, - 15438.307888025554, - 15453.172066498542, - 15468.039820240196, - 15482.91114753184, - 15497.786046656869, - 15512.664515900733, - 15527.546553550939, - 15542.432157897045, - 15557.32132723066, - 15572.214059845435, - 15587.110354037064, - 15602.010208103273, - 15616.913620343823, - 15631.820589060506, - 15646.731112557136, - 15661.645189139546, - 15676.562817115593, - 15691.483994795139, - 15706.408720490062, - 15721.336992514242, - 15736.268809183561, - 15751.204168815901, - 15766.143069731135, - 15781.085510251132, - 15796.03148869974, - 15810.981003402798, - 15825.934052688119, - 15840.890634885489, - 15855.850748326673, - 15870.814391345401, - 15885.781562277361, - 15900.752259460214, - 15915.726481233565, - 15930.704225938984, - 15945.685491919978, - 15960.670277522009, - 15975.658581092481, - 15990.65040098073, - 16005.645735538035, - 16020.644583117599, - 16035.646942074556, - 16050.652810765967, - 16065.662187550806, - 16080.675070789974, - 16095.691458846273, - 16110.711350084424, - 16125.734742871053, - 16140.761635574685, - 16155.792026565747, - 16170.825914216561, - 16185.863296901338, - 16200.904172996183, - 16215.948540879079, - 16230.996398929899, - 16246.047745530386, - 16261.102579064163, - 16276.160897916721, - 16291.22270047542, - 16306.287985129484, - 16321.356750269995, - 16336.428994289896, - 16351.504715583982, - 16366.5839125489, - 16381.666583583141, - 16396.752727087041, - 16411.842341462776, - 16426.935425114363, - 16442.031976447644, - 16457.131993870298, - 16472.235475791829, - 16487.342420623561, - 16502.452826778641, - 16517.566692672033, - 16532.684016720516, - 16547.804797342676, - 16562.929032958902, - 16578.056721991394, - 16593.18786286415, - 16608.322454002962, - 16623.460493835417, - 16638.601980790896, - 16653.746913300558, - 16668.895289797354, - 16684.047108716015, - 16699.202368493046, - 16714.361067566726, - 16729.523204377107, - 16744.688777366009, - 16759.857784977012, - 16775.030225655464, - 16790.206097848466, - 16805.385400004874, - 16820.568130575302, - 16835.754288012104, - 16850.943870769381, - 16866.136877302983, - 16881.333306070494, - 16896.53315553123, - 16911.736424146249, - 16926.943110378332, - 16942.153212691992, - 16957.366729553454, - 16972.583659430682, - 16987.804000793338, - 17003.027752112816, - 17018.254911862205, - 17033.485478516312, - 17048.719450551645, - 17063.956826446421, - 17079.197604680547, - 17094.44178373563, - 17109.689362094967, - 17124.940338243552, - 17140.194710668064, - 17155.452477856852, - 17170.713638299967, - 17185.978190489128, - 17201.246132917724, - 17216.517464080825, - 17231.792182475165, - 17247.070286599141, - 17262.351774952826, - 17277.636646037936, - 17292.924898357855, - 17308.216530417623, - 17323.511540723921, - 17338.809927785089, - 17354.111690111105, - 17369.416826213594, - 17384.725334605821, - 17400.037213802683, - 17415.352462320716, - 17430.67107867809, - 17445.993061394587, - 17461.318408991636, - 17476.647119992274, - 17491.979192921168, - 17507.314626304586, - 17522.653418670423, - 17537.995568548187, - 17553.341074468986, - 17568.689934965536, - 17584.042148572156, - 17599.397713824768, - 17614.75662926089, - 17630.118893419625, - 17645.484504841683, - 17660.853462069354, - 17676.225763646511, - 17691.601408118619, - 17706.980394032718, - 17722.362719937424, - 17737.748384382936, - 17753.137385921014, - 17768.529723104999, - 17783.92539448979, - 17799.324398631856, - 17814.726734089225, - 17830.13239942148, - 17845.541393189767, - 17860.95371395678, - 17876.369360286772, - 17891.788330745527, - 17907.210623900395, - 17922.636238320254, - 17938.065172575527, - 17953.497425238176, - 17968.932994881692, - 17984.371880081104, - 17999.814079412972, - 18015.259591455371, - 18030.708414787914, - 18046.160547991731, - 18061.615989649465, - 18077.074738345284, - 18092.536792664861, - 18108.002151195393, - 18123.470812525571, - 18138.942775245599, - 18154.418037947191, - 18169.896599223546, - 18185.37845766938, - 18200.863611880886, - 18216.352060455767, - 18231.843801993204, - 18247.338835093873, - 18262.837158359936, - 18278.338770395032, - 18293.84366980429, - 18309.351855194309, - 18324.863325173166, - 18340.378078350412, - 18355.896113337069, - 18371.417428745623, - 18386.942023190033, - 18402.469895285718, - 18418.00104364955, - 18433.53546689987, - 18449.073163656474, - 18464.614132540602, - 18480.158372174956, - 18495.705881183676, - 18511.256658192357, - 18526.810701828035, - 18542.368010719183, - 18557.928583495715, - 18573.492418788985, - 18589.059515231773, - 18604.629871458303, - 18620.203486104212, - 18635.78035780658, - 18651.360485203899, - 18666.943866936086, - 18682.53050164448, - 18698.120387971841, - 18713.713524562332, - 18729.30991006154, - 18744.909543116457, - 18760.512422375479, - 18776.118546488418, - 18791.727914106479, - 18807.340523882274, - 18822.95637446981, - 18838.575464524489, - 18854.197792703111, - 18869.823357663863, - 18885.452158066328, - 18901.08419257147, - 18916.719459841639, - 18932.357958540564, - 18947.999687333362, - 18963.644644886521, - 18979.292829867907, - 18994.944240946759, - 19010.598876793687, - 19026.256736080668, - 19041.917817481048, - 19057.582119669532, - 19073.2496413222, - 19088.920381116473, - 19104.594337731145, - 19120.271509846356, - 19135.951896143604, - 19151.635495305738, - 19167.322306016948, - 19183.012326962784, - 19198.705556830122, - 19214.401994307198, - 19230.101638083579, - 19245.804486850167, - 19261.510539299208, - 19277.219794124274, - 19292.932250020265, - 19308.647905683421, - 19324.366759811302, - 19340.088811102793, - 19355.8140582581, - 19371.542499978754, - 19387.2741349676, - 19403.008961928797, - 19418.746979567823, - 19434.488186591469, - 19450.232581707827, - 19465.980163626304, - 19481.730931057613, - 19497.484882713761, - 19513.242017308068, - 19529.002333555141, - 19544.765830170898, - 19560.532505872539, - 19576.302359378566, - 19592.075389408761, - 19607.851594684209, - 19623.630973927269, - 19639.41352586159, - 19655.199249212103, - 19670.988142705017, - 19686.780205067826, - 19702.575435029288, - 19718.373831319448, - 19734.175392669615, - 19749.980117812371, - 19765.788005481569, - 19781.599054412323, - 19797.413263341008, - 19813.230631005274, - 19829.051156144014, - 19844.874837497395, - 19860.701673806827, - 19876.531663814985, - 19892.364806265789, - 19908.201099904403, - 19924.040543477258, - 19939.883135732012, - 19955.728875417579, - 19971.577761284105, - 19987.429792082985, - 20003.284966566847, - 20019.14328348956, - 20035.004741606219, - 20050.869339673161, - 20066.737076447946, - 20082.607950689362, - 20098.481961157428, - 20114.359106613385, - 20130.239385819699, - 20146.122797540058, - 20162.009340539353, - 20177.899013583716, - 20193.791815440476, - 20209.687744878182, - 20225.586800666591, - 20241.488981576669, - 20257.394286380597, - 20273.302713851754, - 20289.214262764715, - 20305.128931895277, - 20321.046720020415, - 20336.967625918318, - 20352.891648368361, - 20368.818786151114, - 20384.749038048347, - 20400.682402843009, - 20416.618879319249, - 20432.558466262391, - 20448.501162458953, - 20464.446966696629, - 20480.395877764302, - 20496.347894452025, - 20512.303015551031, - 20528.261239853735, - 20544.22256615372, - 20560.186993245738, - 20576.15451992572, - 20592.125144990758, - 20608.098867239107, - 20624.075685470198, - 20640.055598484618, - 20656.038605084115, - 20672.024704071595, - 20688.013894251126, - 20704.006174427926, - 20720.001543408373, - 20735.999999999989, - 20752.001543011454, - 20768.006171252597, - 20784.013883534382, - 20800.024678668931, - 20816.038555469506, - 20832.055512750507, - 20848.075549327474, - 20864.098664017085, - 20880.124855637161, - 20896.154123006647, - 20912.186464945626, - 20928.221880275312, - 20944.260367818049, - 20960.301926397311, - 20976.346554837684, - 20992.394251964895, - 21008.445016605787, - 21024.498847588318, - 21040.555743741574, - 21056.615703895754, - 21072.678726882168, - 21088.744811533252, - 21104.813956682538, - 21120.886161164683, - 21136.961423815443, - 21153.039743471683, - 21169.121118971379, - 21185.205549153605, - 21201.293032858535, - 21217.383568927453, - 21233.477156202731, - 21249.573793527841, - 21265.673479747358, - 21281.776213706937, - 21297.881994253334, - 21313.990820234398, - 21330.102690499054, - 21346.21760389733, - 21362.335559280327, - 21378.456555500241, - 21394.580591410333, - 21410.707665864964, - 21426.83777771956, - 21442.970925830628, - 21459.107109055756, - 21475.246326253604, - 21491.388576283895, - 21507.533858007431, - 21523.682170286087, - 21539.833511982797, - 21555.987881961566, - 21572.145279087465, - 21588.305702226615, - 21604.469150246216, - 21620.635622014521, - 21636.805116400832, - 21652.977632275521, - 21669.153168510009, - 21685.331723976764, - 21701.513297549318, - 21717.697888102244, - 21733.885494511167, - 21750.076115652759, - 21766.269750404736, - 21782.466397645861, - 21798.666056255934, - 21814.868725115801, - 21831.074403107345, - 21847.283089113484, - 21863.494782018177, - 21879.709480706417, - 21895.927184064229, - 21912.147890978667, - 21928.371600337818, - 21944.598311030797, - 21960.828021947746, - 21977.060731979829, - 21993.296440019243, - 22009.535144959198, - 22025.77684569393, - 22042.021541118691, - 22058.269230129757, - 22074.519911624411, - 22090.773584500959, - 22107.030247658717, - 22123.289899998013, - 22139.552540420187, - 22155.818167827587, - 22172.086781123569, - 22188.358379212495, - 22204.632960999726, - 22220.910525391639, - 22237.191071295601, - 22253.474597619981, - 22269.761103274148, - 22286.050587168469, - 22302.343048214312, - 22318.638485324027, - 22334.936897410968, - 22351.23828338947, - 22367.542642174871, - 22383.849972683485, - 22400.160273832618, - 22416.473544540564, - 22432.789783726603, - 22449.108990310986, - 22465.431163214958, - 22481.75630136074, - 22498.084403671528, - 22514.415469071497, - 22530.749496485802, - 22547.086484840562, - 22563.426433062879, - 22579.769340080824, - 22596.115204823436, - 22612.464026220721, - 22628.815803203655, - 22645.170534704179, - 22661.5282196552, - 22677.888856990587, - 22694.252445645168, - 22710.618984554734, - 22726.988472656034, - 22743.360908886778, - 22759.736292185622, - 22776.114621492186, - 22792.495895747044, - 22808.880113891719, - 22825.267274868678, - 22841.657377621348, - 22858.050421094096, - 22874.446404232243, - 22890.845325982053, - 22907.247185290722, - 22923.651981106406, - 22940.059712378195, - 22956.470378056114, - 22972.883977091129, - 22989.300508435153, - 23005.719971041017, - 23022.142363862498, - 23038.567685854305, - 23054.995935972078, - 23071.427113172387, - 23087.86121641273, - 23104.298244651531, - 23120.738196848146, - 23137.181071962848, - 23153.626868956846, - 23170.075586792263, - 23186.527224432142, - 23202.981780840448, - 23219.439254982066, - 23235.899645822796, - 23252.362952329357, - 23268.829173469378, - 23285.298308211408, - 23301.770355524899, - 23318.245314380223, - 23334.723183748658, - 23351.203962602387, - 23367.687649914504, - 23384.174244659007, - 23400.663745810798, - 23417.15615234568, - 23433.651463240367, - 23450.149677472462, - 23466.650794020472, - 23483.154811863806, - 23499.661729982763, - 23516.171547358543, - 23532.684262973235, - 23549.199875809823, - 23565.718384852185, - 23582.239789085092, - 23598.764087494197, - 23615.291279066041, - 23631.821362788058, - 23648.354337648565, - 23664.890202636761, - 23681.428956742733, - 23697.970598957443, - 23714.515128272738, - 23731.062543681343, - 23747.612844176863, - 23764.166028753778, - 23780.72209640744, - 23797.281046134085, - 23813.842876930816, - 23830.407587795606, - 23846.975177727301, - 23863.545645725622, - 23880.11899079115, - 23896.695211925336, - 23913.274308130498, - 23929.856278409821, - 23946.441121767348, - 23963.028837207989, - 23979.619423737513, - 23996.212880362549, - 24012.809206090584, - 24029.408399929966, - 24046.010460889898, - 24062.615387980433, - 24079.223180212492, - 24095.833836597827, - 24112.447356149063, - 24129.063737879667, - 24145.682980803951, - 24162.305083937081, - 24178.930046295067, - 24195.557866894767, - 24212.188544753884, - 24228.822078890964, - 24245.458468325389, - 24262.097712077397, - 24278.739809168052, - 24295.384758619261, - 24312.032559453768, - 24328.683210695162, - 24345.336711367858, - 24361.993060497109, - 24378.652257108995, - 24395.314300230442, - 24411.979188889192, - 24428.646922113825, - 24445.317498933746, - 24461.990918379193, - 24478.667179481225, - 24495.346281271726, - 24512.028222783407, - 24528.713003049801, - 24545.400621105266, - 24562.091075984976, - 24578.784366724925, - 24595.480492361927, - 24612.179451933614, - 24628.881244478438, - 24645.585869035654, - 24662.293324645343, - 24679.003610348394, - 24695.716725186514, - 24712.432668202211, - 24729.151438438807, - 24745.873034940436, - 24762.597456752032, - 24779.324702919344, - 24796.054772488926, - 24812.787664508123, - 24829.5233780251, - 24846.261912088819, - 24863.003265749034, - 24879.747438056307, - 24896.494428062004, - 24913.244234818278, - 24929.996857378079, - 24946.752294795166, - 24963.510546124078, - 24980.271610420157, - 24997.035486739525, - 25013.802174139113, - 25030.571671676629, - 25047.343978410572, - 25064.119093400237, - 25080.897015705697, - 25097.677744387816, - 25114.461278508239, - 25131.2476171294, - 25148.036759314517, - 25164.828704127583, - 25181.623450633375, - 25198.42099789745, - 25215.221344986145, - 25232.024490966574, - 25248.830434906627, - 25265.639175874974, - 25282.450712941049, - 25299.265045175071, - 25316.082171648024, - 25332.902091431668, - 25349.724803598532, - 25366.550307221914, - 25383.378601375884, - 25400.209685135269, - 25417.043557575678, - 25433.880217773472, - 25450.719664805783, - 25467.561897750507, - 25484.406915686297, - 25501.254717692573, - 25518.105302849512, - 25534.958670238051, - 25551.814818939893, - 25568.67374803748, - 25585.535456614027, - 25602.399943753502, - 25619.267208540619, - 25636.137250060852, - 25653.010067400432, - 25669.885659646327, - 25686.76402588627, - 25703.645165208734, - 25720.529076702944, - 25737.415759458876, - 25754.305212567244, - 25771.197435119517, - 25788.092426207899, - 25804.990184925344, - 25821.890710365547, - 25838.794001622944, - 25855.700057792714, - 25872.608877970775, - 25889.520461253778, - 25906.434806739118, - 25923.351913524923, - 25940.271780710063, - 25957.194407394138, - 25974.11979267748, - 25991.047935661154, - 26007.978835446964, - 26024.912491137442, - 26041.848901835841, - 26058.788066646157, - 26075.729984673108, - 26092.674655022136, - 26109.622076799409, - 26126.572249111829, - 26143.525171067016, - 26160.480841773315, - 26177.43926033979, - 26194.400425876229, - 26211.364337493149, - 26228.330994301767, - 26245.30039541404, - 26262.272539942627, - 26279.247427000919, - 26296.225055703002, - 26313.205425163702, - 26330.188534498539, - 26347.174382823756, - 26364.162969256304, - 26381.154292913852, - 26398.148352914774, - 26415.145148378149, - 26432.144678423778, - 26449.146942172156, - 26466.151938744493, - 26483.159667262702, - 26500.170126849403, - 26517.183316627921, - 26534.199235722277, - 26551.217883257199, - 26568.239258358124, - 26585.263360151173, - 26602.290187763181, - 26619.319740321676, - 26636.352016954883, - 26653.387016791727, - 26670.424738961825, - 26687.465182595493, - 26704.508346823739, - 26721.554230778267, - 26738.602833591467, - 26755.65415439643, - 26772.708192326929, - 26789.764946517433, - 26806.824416103096, - 26823.886600219761, - 26840.95149800396, - 26858.019108592915, - 26875.089431124517, - 26892.162464737365, - 26909.238208570721, - 26926.316661764544, - 26943.397823459472, - 26960.481692796813, - 26977.568268918571, - 26994.657550967422, - 27011.749538086722, - 27028.844229420498, - 27045.941624113464, - 27063.041721311005, - 27080.144520159181, - 27097.250019804727, - 27114.35821939505, - 27131.469118078236, - 27148.582715003027, - 27165.699009318858, - 27182.818000175819, - 27199.939686724665, - 27217.064068116837, - 27234.191143504428, - 27251.320912040203, - 27268.453372877593, - 27285.588525170693, - 27302.726368074269, - 27319.866900743735, - 27337.010122335181, - 27354.156032005358, - 27371.304628911668, - 27388.455912212183, - 27405.609881065626, - 27422.766534631384, - 27439.925872069507, - 27457.087892540683, - 27474.252595206275, - 27491.419979228293, - 27508.5900437694, - 27525.762787992917, - 27542.93821106281, - 27560.116312143706, - 27577.297090400876, - 27594.480545000242, - 27611.666675108383, - 27628.855479892518, - 27646.046958520514, - 27663.241110160889, - 27680.437933982801, - 27697.637429156068, - 27714.839594851132, - 27732.04443023909, - 27749.251934491687, - 27766.462106781299, - 27783.674946280949, - 27800.890452164302, - 27818.108623605654, - 27835.329459779954, - 27852.55295986278, - 27869.779123030345, - 27887.007948459504, - 27904.239435327745, - 27921.473582813196, - 27938.710390094613, - 27955.949856351392, - 27973.19198076355, - 27990.436762511745, - 28007.684200777272, - 28024.934294742041, - 28042.187043588601, - 28059.442446500128, - 28076.700502660427, - 28093.961211253929, - 28111.224571465693, - 28128.490582481401, - 28145.759243487362, - 28163.030553670509, - 28180.304512218394, - 28197.581118319198, - 28214.860371161725, - 28232.14226993539, - 28249.42681383024, - 28266.71400203693, - 28284.003833746745, - 28301.296308151585, - 28318.591424443959, - 28335.889181817001, - 28353.189579464462, - 28370.492616580705, - 28387.798292360701, - 28405.106606000048, - 28422.417556694945, - 28439.731143642206, - 28457.047366039264, - 28474.366223084147, - 28491.687713975512, - 28509.011837912611, - 28526.338594095305, - 28543.667981724069, - 28560.999999999982, - 28578.334648124732, - 28595.671925300605, - 28613.011830730498, - 28630.354363617909, - 28647.699523166943, - 28665.0473085823, - 28682.397719069289, - 28699.750753833818, - 28717.10641208239, - 28734.464693022121, - 28751.825595860708, - 28769.189119806462, - 28786.55526406828, - 28803.924027855664, - 28821.295410378701, - 28838.669410848088, - 28856.046028475103, - 28873.425262471628, - 28890.80711205013, - 28908.191576423673, - 28925.578654805915, - 28942.968346411097, - 28960.360650454055, - 28977.755566150216, - 28995.153092715591, - 29012.553229366786, - 29029.955975320987, - 29047.361329795975, - 29064.769292010107, - 29082.179861182336, - 29099.593036532187, - 29117.00881727978, - 29134.427202645813, - 29151.848191851568, - 29169.271784118911, - 29186.697978670283, - 29204.126774728706, - 29221.55817151779, - 29238.992168261717, - 29256.42876418525, - 29273.867958513725, - 29291.309750473058, - 29308.754139289747, - 29326.201124190855, - 29343.65070440403, - 29361.102879157483, - 29378.557647680012, - 29396.015009200975, - 29413.474962950309, - 29430.937508158524, - 29448.402644056692, - 29465.870369876469, - 29483.340684850071, - 29500.81358821028, - 29518.289079190454, - 29535.767157024511, - 29553.247820946945, - 29570.731070192807, - 29588.216903997723, - 29605.70532159787, - 29623.19632223, - 29640.689905131429, - 29658.186069540028, - 29675.684814694236, - 29693.186139833047, - 29710.690044196028, - 29728.196527023298, - 29745.705587555527, - 29763.217225033964, - 29780.731438700397, - 29798.248227797183, - 29815.76759156723, - 29833.289529254005, - 29850.81404010153, - 29868.341123354381, - 29885.870778257693, - 29903.403004057145, - 29920.937799998974, - 29938.475165329975, - 29956.015099297485, - 29973.557601149394, - 29991.102670134147, - 30008.650305500738, - 30026.200506498706, - 30043.753272378144, - 30061.308602389683, - 30078.866495784507, - 30096.426951814352, - 30113.989969731494, - 30131.55554878875, - 30149.123688239491, - 30166.694387337629, - 30184.267645337608, - 30201.843461494434, - 30219.42183506364, - 30237.002765301309, - 30254.586251464058, - 30272.172292809046, - 30289.760888593977, - 30307.35203807709, - 30324.94574051716, - 30342.541995173502, - 30360.140801305966, - 30377.742158174944, - 30395.346065041358, - 30412.952521166666, - 30430.561525812864, - 30448.173078242475, - 30465.787177718561, - 30483.403823504719, - 30501.02301486507, - 30518.644751064272, - 30536.269031367516, - 30553.895855040515, - 30571.525221349519, - 30589.157129561307, - 30606.791578943175, - 30624.428568762964, - 30642.06809828903, - 30659.710166790261, - 30677.35477353607, - 30695.001917796391, - 30712.651598841687, - 30730.303815942945, - 30747.958568371676, - 30765.615855399912, - 30783.275676300211, - 30800.938030345646, - 30818.602916809814, - 30836.270334966837, - 30853.940284091354, - 30871.612763458521, - 30889.287772344011, - 30906.965310024025, - 30924.645375775272, - 30942.327968874983, - 30960.013088600903, - 30977.700734231294, - 30995.390905044929, - 31013.083600321101, - 31030.778819339619, - 31048.476561380798, - 31066.17682572547, - 31083.879611654978, - 31101.584918451179, - 31119.29274539644, - 31137.003091773637, - 31154.715956866155, - 31172.431339957893, - 31190.14924033326, - 31207.869657277162, - 31225.592590075023, - 31243.318038012771, - 31261.046000376838, - 31278.776476454172, - 31296.50946553221, - 31314.24496689891, - 31331.98297984272, - 31349.7235036526, - 31367.466537618013, - 31385.212081028923, - 31402.960133175795, - 31420.710693349596, - 31438.463760841791, - 31456.219334944351, - 31473.977414949743, - 31491.738000150934, - 31509.501089841389, - 31527.266683315069, - 31545.034779866437, - 31562.80537879045, - 31580.578479382562, - 31598.35408093872, - 31616.132182755369, - 31633.91278412945, - 31651.695884358396, - 31669.481482740131, - 31687.269578573076, - 31705.060171156143, - 31722.853259788735, - 31740.648843770748, - 31758.446922402567, - 31776.247494985066, - 31794.050560819614, - 31811.85611920806, - 31829.664169452753, - 31847.474710856521, - 31865.287742722685, - 31883.103264355046, - 31900.921275057899, - 31918.741774136019, - 31936.564760894671, - 31954.390234639599, - 31972.21819467704, - 31990.048640313704, - 32007.881570856793, - 32025.716985613984, - 32043.554883893445, - 32061.395265003815, - 32079.238128254223, - 32097.083472954269, - 32114.931298414049, - 32132.781603944117, - 32150.634388855524, - 32168.48965245979, - 32186.347394068915, - 32204.207612995371, - 32222.07030855212, - 32239.935480052583, - 32257.803126810672, - 32275.673248140767, - 32293.545843357719, - 32311.420911776862, - 32329.298452713996, - 32347.178465485395, - 32365.060949407813, - 32382.945903798463, - 32400.83332797504, - 32418.723221255706, - 32436.615582959093, - 32454.510412404306, - 32472.407708910916, - 32490.307471798966, - 32508.209700388961, - 32526.114394001877, - 32544.021551959166, - 32561.931173582732, - 32579.843258194956, - 32597.757805118679, - 32615.674813677211, - 32633.594283194328, - 32651.516212994258, - 32669.440602401712, - 32687.367450741847, - 32705.296757340297, - 32723.228521523146, - 32741.162742616943, - 32759.099419948703, - 32777.038552845901, - 32794.980140636464, - 32812.924182648792, - 32830.87067821173, - 32848.819626654593, - 32866.77102730715, - 32884.724879499619, - 32902.681182562686, - 32920.639935827494, - 32938.601138625643, - 32956.56479028918, - 32974.530890150607, - 32992.499437542894, - 33010.470431799447, - 33028.443872254145, - 33046.419758241311, - 33064.39808909571, - 33082.378864152583, - 33100.36208274759, - 33118.347744216881, - 33136.335847897026, - 33154.326393125062, - 33172.31937923847, - 33190.314805575174, - 33208.312671473555, - 33226.312976272442, - 33244.315719311111, - 33262.320899929284, - 33280.328517467125, - 33298.33857126526, - 33316.351060664747, - 33334.365985007091, - 33352.383343634239, - 33370.403135888591, - 33388.42536111299, - 33406.450018650721, - 33424.477107845501, - 33442.506628041512, - 33460.53857858335, - 33478.572958816083, - 33496.609768085189, - 33514.649005736617, - 33532.690671116739, - 33550.734763572356, - 33568.781282450735, - 33586.830227099563, - 33604.881596866973, - 33622.935391101528, - 33640.991609152239, - 33659.050250368542, - 33677.111314100322, - 33695.174799697881, - 33713.240706511984, - 33731.309033893805, - 33749.37978119497, - 33767.452947767531, - 33785.528532963974, - 33803.606536137209, - 33821.686956640602, - 33839.769793827938, - 33857.855047053425, - 33875.942715671707, - 33894.032799037872, - 33912.125296507431, - 33930.220207436316, - 33948.317531180888, - 33966.417267097961, - 33984.519414544746, - 34002.623972878901, - 34020.730941458511, - 34038.840319642077, - 34056.952106788536, - 34075.066302257255, - 34093.182905408015, - 34111.301915601027, - 34129.42333219693, - 34147.547154556785, - 34165.673382042078, - 34183.80201401472, - 34201.933049837033, - 34220.06648887178, - 34238.202330482141, - 34256.340574031703, - 34274.481218884495, - 34292.624264404949, - 34310.769709957938, - 34328.91755490873, - 34347.067798623029, - 34365.220440466954, - 34383.375479807051, - 34401.532916010263, - 34419.692748443973, - 34437.854976475966, - 34456.01959947445, - 34474.18661680806, - 34492.356027845817, - 34510.527831957188, - 34528.702028512052, - 34546.878616880676, - 34565.05759643377, - 34583.238966542449, - 34601.422726578232, - 34619.608875913065, - 34637.797413919296, - 34655.988339969692, - 34674.181653437423, - 34692.37735369608, - 34710.575440119668, - 34728.775912082579, - 34746.978768959649, - 34765.184010126082, - 34783.391634957537, - 34801.60164283005, - 34819.814033120063, - 34838.028805204456, - 34856.24595846048, - 34874.465492265823, - 34892.687405998557, - 34910.911699037177, - 34929.138370760564, - 34947.367420548027, - 34965.598847779271, - 34983.832651834389, - 35002.068832093908, - 35020.307387938738, - 35038.548318750189, - 35056.79162390998, - 35075.03730280025, - 35093.285354803513, - 35111.535779302685, - 35129.788575681116, - 35148.043743322516, - 35166.301281611013, - 35184.561189931141, - 35202.823467667826, - 35221.088114206388, - 35239.355128932555, - 35257.624511232447, - 35275.896260492584, - 35294.170376099886, - 35312.446857441668, - 35330.725703905628, - 35349.006914879887, - 35367.290489752944, - 35385.576427913686, - 35403.864728751418, - 35422.155391655811, - 35440.448416016967, - 35458.743801225341, - 35477.041546671804, - 35495.341651747622, - 35513.644115844436, - 35531.948938354304, - 35550.256118669655, - 35568.565656183309, - 35586.877550288496, - 35605.191800378816, - 35623.508405848268, - 35641.827366091238, - 35660.148680502505, - 35678.472348477233, - 35696.798369410979, - 35715.126742699678, - 35733.457467739659, - 35751.790543927644, - 35770.125970660738, - 35788.46374733642, - 35806.803873352568, - 35825.146348107453, - 35843.49117099971, - 35861.838341428367, - 35880.187858792851, - 35898.539722492955, - 35916.893931928862, - 35935.250486501129, - 35953.609385610718, - 35971.970628658957, - 35990.334215047558, - 36008.700144178612, - 36027.068415454596, - 36045.439028278372, - 36063.811982053165, - 36082.187276182609, - 36100.564910070694, - 36118.944883121789, - 36137.327194740654, - 36155.711844332429, - 36174.098831302617, - 36192.488155057115, - 36210.87981500219, - 36229.273810544473, - 36247.670141091003, - 36266.068806049167, - 36284.469804826738, - 36302.873136831862, - 36321.278801473069, - 36339.686798159251, - 36358.097126299683, - 36376.509785304013, - 36394.924774582258, - 36413.342093544816, - 36431.761741602444, - 36450.183718166292, - 36468.608022647859, - 36487.034654459028, - 36505.463613012063, - 36523.894897719583, - 36542.328507994578, - 36560.764443250409, - 36579.202702900831, - 36597.643286359926, - 36616.086193042182, - 36634.531422362437, - 36652.978973735895, - 36671.428846578143, - 36689.881040305125, - 36708.335554333149, - 36726.792388078902, - 36745.251540959427, - 36763.713012392138, - 36782.176801794812, - 36800.642908585593, - 36819.111332182983, - 36837.582072005869, - 36856.055127473483, - 36874.530498005421, - 36893.008183021651, - 36911.488181942506, - 36929.970494188674, - 36948.455119181206, - 36966.942056341519, - 36985.431305091392, - 37003.922864852961, - 37022.416735048733, - 37040.912915101559, - 37059.411404434657, - 37077.91220247162, - 37096.415308636388, - 37114.920722353243, - 37133.428443046862, - 37151.938470142253, - 37170.450803064785, - 37188.965441240209, - 37207.482384094597, - 37226.001631054402, - 37244.523181546429, - 37263.047034997842, - 37281.573190836149, - 37300.101648489224, - 37318.632407385296, - 37337.165466952945, - 37355.700826621112, - 37374.238485819085, - 37392.778443976509, - 37411.320700523385, - 37429.865254890057, - 37448.412106507232, - 37466.961254805974, - 37485.512699217681, - 37504.066439174116, - 37522.622474107404, - 37541.180803449992, - 37559.741426634704, - 37578.304343094693, - 37596.869552263488, - 37615.43705357494, - 37634.006846463279, - 37652.578930363044, - 37671.153304709165, - 37689.729968936896, - 37708.308922481847, - 37726.890164779965, - 37745.473695267559, - 37764.059513381275, - 37782.647618558112, - 37801.238010235415, - 37819.830687850859, - 37838.425650842495, - 37857.022898648691, - 37875.622430708172, - 37894.224246460013, - 37912.828345343616, - 37931.434726798747, - 37950.043390265506, - 37968.654335184328, - 37987.267560995999, - 38005.883067141665, - 38024.500853062775, - 38043.120918201159, - 38061.743261998963, - 38080.367883898682, - 38098.994783343158, - 38117.623959775563, - 38136.255412639417, - 38154.889141378575, - 38173.525145437234, - 38192.163424259939, - 38210.803977291551, - 38229.446803977284, - 38248.091903762703, - 38266.739276093685, - 38285.388920416466, - 38304.040836177606, - 38322.695022824002, - 38341.351479802899, - 38360.010206561863, - 38378.671202548816, - 38397.334467211993, - 38415.999999999978, - 38434.667800361683, - 38453.33786774637, - 38472.010201603611, - 38490.684801383337, - 38509.361666535784, - 38528.040796511552, - 38546.722190761553, - 38565.405848737035, - 38584.091769889594, - 38602.779953671132, - 38621.470399533908, - 38640.163106930493, - 38658.858075313794, - 38677.555304137059, - 38696.254792853862, - 38714.956540918094, - 38733.660547783991, - 38752.366812906112, - 38771.075335739348, - 38789.78611573892, - 38808.499152360368, - 38827.214445059573, - 38845.931993292739, - 38864.651796516388, - 38883.373854187383, - 38902.098165762916, - 38920.824730700486, - 38939.553548457938, - 38958.284618493431, - 38977.017940265461, - 38995.753513232834, - 39014.491336854699, - 39033.231410590517, - 39051.973733900079, - 39070.718306243485, - 39089.465127081188, - 39108.214195873945, - 39126.965512082832, - 39145.719075169261, - 39164.474884594965, - 39183.232939821988, - 39201.99324031271, - 39220.755785529815, - 39239.52057493633, - 39258.287607995589, - 39277.056884171245, - 39295.828402927284, - 39314.602163728006, - 39333.378166038019, - 39352.15640932227, - 39370.936893046004, - 39389.719616674811, - 39408.504579674584, - 39427.291781511522, - 39446.081221652174, - 39464.872899563372, - 39483.666814712291, - 39502.462966566411, - 39521.261354593538, - 39540.06197826178, - 39558.864837039568, - 39577.669930395656, - 39596.47725779911, - 39615.286818719302, - 39634.098612625923, - 39652.912638988993, - 39671.728897278823, - 39690.547386966064, - 39709.368107521652, - 39728.191058416858, - 39747.016239123259, - 39765.84364911275, - 39784.673287857528, - 39803.505154830105, - 39822.339249503319, - 39841.175571350293, - 39860.014119844491, - 39878.854894459677, - 39897.697894669909, - 39916.54311994958, - 39935.390569773372, - 39954.240243616303, - 39973.092140953675, - 39991.946261261117, - 40010.802604014549, - 40029.661168690225, - 40048.521954764678, - 40067.384961714779, - 40086.250189017679, - 40105.117636150855, - 40123.98730259209, - 40142.859187819471, - 40161.733291311379, - 40180.609612546526, - 40199.488151003912, - 40218.368906162854, - 40237.25187750296, - 40256.137064504153, - 40275.024466646668, - 40293.914083411029, - 40312.805914278084, - 40331.699958728961, - 40350.596216245103, - 40369.494686308273, - 40388.39536840051, - 40407.298262004173, - 40426.20336660192, - 40445.110681676706, - 40464.020206711793, - 40482.931941190756, - 40501.845884597446, - 40520.762036416032, - 40539.680396130985, - 40558.600963227072, - 40577.523737189367, - 40596.448717503234, - 40615.375903654342, - 40634.305295128659, - 40653.236891412453, - 40672.170691992294, - 40691.106696355047, - 40710.044903987873, - 40728.985314378238, - 40747.927927013901, - 40766.872741382918, - 40785.819756973651, - 40804.768973274746, - 40823.720389775161, - 40842.674005964131, - 40861.629821331211, - 40880.587835366234, - 40899.548047559321, - 40918.510457400931, - 40937.475064381761, - 40956.441867992849, - 40975.410867725499, - 40994.382063071331, - 41013.355453522236, - 41032.331038570417, - 41051.308817708363, - 41070.288790428858, - 41089.270956224987, - 41108.255314590111, - 41127.241865017888, - 41146.23060700229, - 41165.221540037543, - 41184.214663618193, - 41203.209977239079, - 41222.207480395307, - 41241.207172582297, - 41260.209053295752, - 41279.213122031659, - 41298.219378286303, - 41317.227821556255, - 41336.23845133838, - 41355.251267129832, - 41374.266268428037, - 41393.283454730743, - 41412.302825535953, - 41431.324380341983, - 41450.348118647416, - 41469.374039951144, - 41488.402143752326, - 41507.432429550427, - 41526.464896845187, - 41545.499545136627, - 41564.536373925075, - 41583.575382711126, - 41602.616570995662, - 41621.659938279874, - 41640.705484065205, - 41659.753207853406, - 41678.803109146495, - 41697.855187446803, - 41716.909442256911, - 41735.965873079709, - 41755.02447941836, - 41774.085260776315, - 41793.148216657297, - 41812.213346565331, - 41831.280650004708, - 41850.350126480014, - 41869.421775496106, - 41888.495596558132, - 41907.571589171515, - 41926.649752841957, - 41945.730087075463, - 41964.812591378286, - 41983.897265256979, - 42002.984108218378, - 42022.073119769593, - 42041.164299418015, - 42060.257646671307, - 42079.353161037419, - 42098.450842024591, - 42117.550689141324, - 42136.652701896404, - 42155.756879798893, - 42174.863222358137, - 42193.971729083758, - 42213.082399485655, - 42232.195233074002, - 42251.310229359246, - 42270.427387852127, - 42289.546708063644, - 42308.668189505079, - 42327.791831687995, - 42346.917634124227, - 42366.045596325886, - 42385.175717805352, - 42404.307998075295, - 42423.442436648642, - 42442.579033038608, - 42461.717786758672, - 42480.858697322597, - 42500.001764244422, - 42519.146987038446, - 42538.294365219248, - 42557.443898301688, - 42576.595585800882, - 42595.749427232236, - 42614.90542211142, - 42634.063569954378, - 42653.223870277317, - 42672.386322596729, - 42691.55092642938, - 42710.717681292292, - 42729.886586702756, - 42749.057642178363, - 42768.23084723694, - 42787.406201396603, - 42806.58370417574, - 42825.76335509299, - 42844.945153667286, - 42864.129099417805, - 42883.315191864014, - 42902.503430525649, - 42921.693814922692, - 42940.88634457541, - 42960.081019004348, - 42979.277837730297, - 42998.476800274322, - 43017.677906157769, - 43036.881154902228, - 43056.086546029583, - 43075.294079061961, - 43094.503753521763, - 43113.715568931671, - 43132.929524814601, - 43152.145620693766, - 43171.363856092619, - 43190.584230534907, - 43209.806743544621, - 43229.031394646016, - 43248.258183363621, - 43267.487109222224, - 43286.718171746885, - 43305.951370462906, - 43325.186704895881, - 43344.42417457165, - 43363.663779016322, - 43382.905517756262, - 43402.149390318104, - 43421.395396228749, - 43440.643535015348, - 43459.89380620532, - 43479.146209326354, - 43498.400743906379, - 43517.657409473606, - 43536.916205556496, - 43556.177131683784, - 43575.44018738444, - 43594.705372187724, - 43613.972685623135, - 43633.242127220445, - 43652.513696509668, - 43671.787393021099, - 43691.063216285271, - 43710.341165833001, - 43729.621241195346, - 43748.903441903625, - 43768.187767489413, - 43787.474217484552, - 43806.762791421126, - 43826.053488831501, - 43845.346309248278, - 43864.641252204325, - 43883.938317232765, - 43903.237503866971, - 43922.538811640596, - 43941.842240087513, - 43961.147788741881, - 43980.455457138101, - 43999.765244810835, - 44019.077151295001, - 44038.391176125755, - 44057.70731883854, - 44077.02557896902, - 44096.345956053141, - 44115.668449627083, - 44134.993059227287, - 44154.319784390456, - 44173.648624653535, - 44192.979579553728, - 44212.312648628489, - 44231.647831415532, - 44250.985127452805, - 44270.324536278538, - 44289.666057431183, - 44309.009690449464, - 44328.355434872348, - 44347.703290239064, - 44367.053256089079, - 44386.405331962109, - 44405.759517398139, - 44425.115811937387, - 44444.474215120332, - 44463.834726487694, - 44483.197345580462, - 44502.562071939843, - 44521.928905107328, - 44541.297844624634, - 44560.668890033732, - 44580.042040876848, - 44599.417296696454, - 44618.794657035272, - 44638.174121436256, - 44657.555689442641, - 44676.939360597877, - 44696.325134445673, - 44715.713010530002, - 44735.102988395054, - 44754.495067585296, - 44773.88924764542, - 44793.285528120374, - 44812.683908555344, - 44832.084388495779, - 44851.486967487363, - 44870.891645076015, - 44890.298420807922, - 44909.707294229491, - 44929.118264887409, - 44948.531332328566, - 44967.946496100136, - 44987.363755749502, - 45006.783110824319, - 45026.204560872473, - 45045.628105442098, - 45065.053744081561, - 45084.48147633949, - 45103.911301764747, - 45123.343219906426, - 45142.777230313885, - 45162.21333253671, - 45181.651526124733, - 45201.091810628037, - 45220.534185596924, - 45239.978650581965, - 45259.425205133957, - 45278.873848803938, - 45298.324581143192, - 45317.777401703235, - 45337.232310035848, - 45356.68930569302, - 45376.148388226997, - 45395.60955719027, - 45415.072812135557, - 45434.538152615823, - 45454.005578184282, - 45473.475088394356, - 45492.946682799746, - 45512.420360954362, - 45531.896122412363, - 45551.373966728155, - 45570.853893456362, - 45590.33590215187, - 45609.819992369776, - 45629.306163665438, - 45648.794415594442, - 45668.284747712612, - 45687.777159576006, - 45707.27165074092, - 45726.768220763894, - 45746.266869201696, - 45765.767595611323, - 45785.270399550034, - 45804.775280575297, - 45824.282238244828, - 45843.79127211657, - 45863.302381748719, - 45882.815566699683, - 45902.33082652813, - 45921.848160792935, - 45941.367569053225, - 45960.889050868354, - 45980.41260579793, - 45999.938233401757, - 46019.465933239902, - 46038.995704872657, - 46058.527547860547, - 46078.06146176433, - 46097.597446144995, - 46117.135500563774, - 46136.675624582109, - 46156.217817761702, - 46175.762079664462, - 46195.308409852543, - 46214.856807888333, - 46234.407273334444, - 46253.959805753715, - 46273.51440470924, - 46293.071069764315, - 46312.629800482478, - 46332.190596427499, - 46351.753457163381, - 46371.318382254351, - 46390.885371264863, - 46410.45442375962, - 46430.025539303526, - 46449.598717461733, - 46469.17395779962, - 46488.751259882782, - 46508.33062327707, - 46527.912047548532, - 46547.495532263471, - 46567.081076988397, - 46586.668681290059, - 46606.258344735434, - 46625.850066891719, - 46645.443847326351, - 46665.039685606986, - 46684.637581301497, - 46704.237533978005, - 46723.839543204842, - 46743.443608550573, - 46763.049729583989, - 46782.657905874104, - 46802.268136990162, - 46821.880422501628, - 46841.494761978196, - 46861.111154989776, - 46880.729601106526, - 46900.350099898795, - 46919.97265093719, - 46939.597253792526, - 46959.223908035841, - 46978.852613238392, - 46998.483368971691, - 47018.11617480743, - 47037.751030317551, - 47057.387935074221, - 47077.026888649809, - 47096.66789061694, - 47116.310940548428, - 47135.956038017328, - 47155.603182596918, - 47175.252373860698, - 47194.903611382375, - 47214.556894735892, - 47234.212223495422, - 47253.869597235338, - 47273.52901553025, - 47293.19047795498, - 47312.853984084577, - 47332.519533494306, - 47352.187125759658, - 47371.856760456343, - 47391.528437160297, - 47411.202155447652, - 47430.877914894787, - 47450.555715078299, - 47470.235555574982, - 47489.917435961863, - 47509.601355816201, - 47529.287314715453, - 47548.975312237308, - 47568.665347959672, - 47588.357421460656, - 47608.051532318605, - 47627.747680112072, - 47647.445864419846, - 47667.14608482091, - 47686.848340894474, - 47706.552632219973, - 47726.258958377046, - 47745.967318945557, - 47765.677713505589, - 47785.390141637428, - 47805.104602921601, - 47824.821096938824, - 47844.539623270044, - 47864.260181496429, - 47883.982771199349, - 47903.707391960394, - 47923.434043361369, - 47943.162724984308, - 47962.893436411439, - 47982.626177225218, - 48002.36094700831, - 48022.097745343599, - 48041.836571814172, - 48061.57742600335, - 48081.32030749465, - 48101.065215871815, - 48120.81215071879, - 48140.56111161974, - 48160.312098159047, - 48180.065109921306, - 48199.820146491307, - 48219.577207454073, - 48239.336292394844, - 48259.097400899045, - 48278.860532552339, - 48298.625686940592, - 48318.392863649875, - 48338.162062266485, - 48357.933282376915, - 48377.706523567889, - 48397.481785426316, - 48417.259067539344, - 48437.038369494308, - 48456.819690878765, - 48476.603031280487, - 48496.388390287451, - 48516.175767487839, - 48535.965162470042, - 48555.756574822684, - 48575.550004134566, - 48595.345449994718, - 48615.142911992378, - 48634.942389716991, - 48654.743882758201, - 48674.547390705877, - 48694.352913150084, - 48714.160449681112, - 48733.969999889443, - 48753.781563365759, - 48773.595139700978, - 48793.410728486211, - 48813.228329312769, - 48833.047941772187, - 48852.869565456189, - 48872.693199956717, - 48892.518844865925, - 48912.346499776155, - 48932.176164279976, - 48952.007837970152, - 48971.841520439666, - 48991.677211281676, - 49011.514910089587, - 49031.354616456978, - 49051.196329977654, - 49071.04005024561, - 49090.885776855059, - 49110.733509400408, - 49130.583247476279, - 49150.434990677488, - 49170.288738599062, - 49190.144490836232, - 49210.002246984441, - 49229.86200663932, - 49249.723769396718, - 49269.587534852675, - 49289.453302603448, - 49309.32107224549, - 49329.190843375451, - 49349.062615590192, - 49368.936388486785, - 49388.812161662492, - 49408.689934714785, - 49428.569707241324, - 49448.45147883999, - 49468.335249108866, - 49488.22101764621, - 49508.108784050521, - 49527.99854792047, - 49547.890308854934, - 49567.784066453009, - 49587.679820313977, - 49607.57757003732, - 49627.477315222721, - 49647.379055470075, - 49667.28279037946, - 49687.188519551179, - 49707.096242585707, - 49727.005959083741, - 49746.917668646165, - 49766.831370874068, - 49786.747065368734, - 49806.66475173166, - 49826.584429564515, - 49846.506098469203, - 49866.429758047794, - 49886.355407902578, - 49906.283047636032, - 49926.212676850846, - 49946.144295149883, - 49966.077902136225, - 49986.013497413151, - 50005.951080584135, - 50025.890651252834, - 50045.832209023123, - 50065.775753499074, - 50085.721284284933, - 50105.668800985164, - 50125.618303204428, - 50145.569790547575, - 50165.523262619652, - 50185.478719025901, - 50205.436159371769, - 50225.395583262893, - 50245.356990305103, - 50265.320380104429, - 50285.285752267104, - 50305.253106399534, - 50325.222442108337, - 50345.193759000336, - 50365.16705668252, - 50385.142334762102, - 50405.119592846473, - 50425.098830543218, - 50445.080047460127, - 50465.063243205179, - 50485.048417386541, - 50505.035569612577, - 50525.024699491856, - 50545.015806633128, - 50565.008890645338, - 50585.003951137631, - 50605.00098771933, - 50624.999999999971, - 50645.000987589265, - 50665.003950097132, - 50685.008887133677, - 50705.015798309192, - 50725.024683234165, - 50745.035541519283, - 50765.048372775411, - 50785.063176613621, - 50805.079952645159, - 50825.098700481489, - 50845.119419734241, - 50865.142110015244, - 50885.166770936521, - 50905.193402110279, - 50925.222003148934, - 50945.252573665071, - 50965.285113271471, - 50985.319621581119, - 51005.356098207172, - 51025.394542762981, - 51045.434954862096, - 51065.477334118244, - 51085.521680145357, - 51105.567992557546, - 51125.616270969113, - 51145.66651499454, - 51165.718724248516, - 51185.772898345916, - 51205.829036901778, - 51225.887139531362, - 51245.947205850105, - 51266.009235473619, - 51286.073228017718, - 51306.139183098399, - 51326.207100331856, - 51346.276979334456, - 51366.348819722756, - 51386.42262111351, - 51406.498383123653, - 51426.57610537031, - 51446.655787470787, - 51466.737429042587, - 51486.82102970338, - 51506.906589071048, - 51526.994106763632, - 51547.083582399391, - 51567.175015596738, - 51587.268405974297, - 51607.363753150858, - 51627.461056745415, - 51647.56031637713, - 51667.661531665362, - 51687.764702229651, - 51707.869827689727, - 51727.976907665499, - 51748.085941777055, - 51768.196929644677, - 51788.309870888836, - 51808.42476513017, - 51828.541611989524, - 51848.660411087905, - 51868.781162046515, - 51888.90386448674, - 51909.028518030143, - 51929.155122298485, - 51949.283676913685, - 51969.414181497872, - 51989.546635673345, - 52009.681039062583, - 52029.817391288263, - 52049.955691973213, - 52070.095940740481, - 52090.238137213273, - 52110.382281014987, - 52130.5283717692, - 52150.676409099666, - 52170.826392630333, - 52190.97832198532, - 52211.132196788931, - 52231.288016665654, - 52251.445781240145, - 52271.60549013727, - 52291.76714298204, - 52311.930739399664, - 52332.096279015546, - 52352.263761455244, - 52372.433186344519, - 52392.604553309284, - 52412.777861975665, - 52432.953111969946, - 52453.130302918595, - 52473.309434448267, - 52493.490506185793, - 52513.67351775818, - 52533.858468792605, - 52554.045358916446, - 52574.234187757254, - 52594.42495494274, - 52614.617660100812, - 52634.812302859558, - 52655.008882847229, - 52675.20739969227, - 52695.407853023295, - 52715.610242469098, - 52735.814567658657, - 52756.02082822111, - 52776.229023785803, - 52796.439153982225, - 52816.651218440056, - 52836.865216789171, - 52857.081148659599, - 52877.29901368155, - 52897.518811485425, - 52917.740541701773, - 52937.964203961354, - 52958.18979789508, - 52978.417323134046, - 52998.646779309529, - 53018.878166052978, - 53039.111482996006, - 53059.346729770419, - 53079.583906008193, - 53099.823011341483, - 53120.0640454026, - 53140.307007824063, - 53160.551898238533, - 53180.79871627887, - 53201.047461578091, - 53221.2981337694, - 53241.550732486176, - 53261.805257361964, - 53282.061708030487, - 53302.32008412564, - 53322.580385281493, - 53342.842611132299, - 53363.106761312469, - 53383.372835456597, - 53403.640833199453, - 53423.910754175973, - 53444.18259802126, - 53464.456364370613, - 53484.732052859479, - 53505.009663123499, - 53525.289194798468, - 53545.570647520362, - 53565.854020925333, - 53586.139314649699, - 53606.426528329954, - 53626.715661602764, - 53647.006714104959, - 53667.299685473547, - 53687.59457534572, - 53707.891383358816, - 53728.190109150361, - 53748.490752358055, - 53768.793312619753, - 53789.09778957349, - 53809.404182857485, - 53829.712492110106, - 53850.022716969899, - 53870.334857075584, - 53890.648912066055, - 53910.964881580367, - 53931.28276525774, - 53951.602562737586, - 53971.924273659461, - 53992.24789766311, - 54012.57343438844, - 54032.90088347553, - 54053.23024456462, - 54073.561517296133, - 54093.894701310644, - 54114.22979624891, - 54134.566801751855, - 54154.90571746057, - 54175.246543016314, - 54195.589278060506, - 54215.933922234755, - 54236.280475180814, - 54256.628936540626, - 54276.97930595628, - 54297.331583070045, - 54317.685767524359, - 54338.041858961828, - 54358.399857025215, - 54378.759761357462, - 54399.121571601667, - 54419.485287401105, - 54439.850908399218, - 54460.218434239614, - 54480.587864566056, - 54500.95919902248, - 54521.332437252997, - 54541.707578901878, - 54562.084623613555, - 54582.46357103264, - 54602.844420803893, - 54623.227172572246, - 54643.611825982807, - 54663.998380680838, - 54684.386836311773, - 54704.777192521207, - 54725.169448954897, - 54745.563605258772, - 54765.959661078923, - 54786.357616061614, - 54806.757469853255, - 54827.159222100439, - 54847.562872449904, - 54867.968420548583, - 54888.375866043534, - 54908.785208582012, - 54929.196447811417, - 54949.609583379322, - 54970.024614933463, - 54990.441542121727, - 55010.86036459219, - 55031.28108199306, - 55051.703693972733, - 55072.128200179759, - 55092.554600262847, - 55112.982893870874, - 55133.413080652877, - 55153.845160258061, - 55174.279132335789, - 55194.714996535586, - 55215.152752507143, - 55235.592399900306, - 55256.033938365079, - 55276.477367551655, - 55296.92268711036, - 55317.369896691685, - 55337.818995946305, - 55358.269984525024, - 55378.72286207883, - 55399.177628258869, - 55419.634282716441, - 55440.092825103013, - 55460.553255070205, - 55481.015572269804, - 55501.479776353764, - 55521.945866974187, - 55542.413843783339, - 55562.883706433655, - 55583.355454577715, - 55603.82908786826, - 55624.304605958219, - 55644.782008500639, - 55665.261295148754, - 55685.742465555952, - 55706.225519375774, - 55726.710456261928, - 55747.197275868275, - 55767.685977848843, - 55788.176561857814, - 55808.669027549528, - 55829.163374578478, - 55849.659602599328, - 55870.157711266889, - 55890.657700236145, - 55911.159569162221, - 55931.663317700411, - 55952.168945506164, - 55972.676452235086, - 55993.185837542944, - 56013.697101085651, - 56034.210242519301, - 56054.72526150012, - 56075.242157684508, - 56095.760930729011, - 56116.281580290342, - 56136.804106025367, - 56157.328507591104, - 56177.85478464474, - 56198.382936843598, - 56218.912963845185, - 56239.444865307138, - 56259.978640887268, - 56280.514290243525, - 56301.051813034042, - 56321.591208917082, - 56342.13247755108, - 56362.675618594607, - 56383.220631706419, - 56403.767516545398, - 56424.316272770608, - 56444.866900041241, - 56465.419398016667, - 56485.973766356394, - 56506.530004720102, - 56527.088112767611, - 56547.648090158902, - 56568.209936554107, - 56588.773651613519, - 56609.339234997584, - 56629.9066863669, - 56650.47600538221, - 56671.04719170442, - 56691.620244994599, - 56712.195164913959, - 56732.771951123868, - 56753.350603285835, - 56773.931121061541, - 56794.513504112823, - 56815.097752101647, - 56835.683864690152, - 56856.271841540627, - 56876.86168231551, - 56897.453386677393, - 56918.046954289028, - 56938.642384813298, - 56959.239677913261, - 56979.838833252121, - 57000.439850493225, - 57021.04272930009, - 57041.647469336371, - 57062.254070265873, - 57082.862531752558, - 57103.472853460553, - 57124.085035054108, - 57144.699076197649, - 57165.314976555739, - 57185.932735793103, - 57206.552353574611, - 57227.173829565276, - 57247.797163430281, - 57268.42235483494, - 57289.049403444733, - 57309.678308925286, - 57330.30907094237, - 57350.941689161911, - 57371.576163249985, - 57392.212492872815, - 57412.850677696784, - 57433.490717388406, - 57454.132611614368, - 57474.776360041491, - 57495.421962336746, - 57516.069418167266, - 57536.718727200314, - 57557.36988910332, - 57578.022903543861, - 57598.677770189643, - 57619.334488708548, - 57639.993058768589, - 57660.653480037938, - 57681.315752184906, - 57701.979874877965, - 57722.64584778573, - 57743.31367057695, - 57763.983342920546, - 57784.654864485572, - 57805.328234941233, - 57826.003453956881, - 57846.680521202026, - 57867.359436346305, - 57888.040199059527, - 57908.722809011633, - 57929.407265872709, - 57950.093569313001, - 57970.781719002895, - 57991.471714612911, - 58012.16355581375, - 58032.857242276223, - 58053.552773671312, - 58074.25014967013, - 58094.949369943948, - 58115.650434164185, - 58136.353342002389, - 58157.058093130276, - 58177.764687219693, - 58198.47312394264, - 58219.183402971255, - 58239.895523977837, - 58260.609486634821, - 58281.325290614775, - 58302.042935590434, - 58322.762421234678, - 58343.483747220511, - 58364.206913221096, - 58384.931918909751, - 58405.658763959924, - 58426.3874480452, - 58447.117970839339, - 58467.85033201622, - 58488.584531249864, - 58509.320568214462, - 58530.058442584334, - 58550.798154033931, - 58571.539702237875, - 58592.283086870906, - 58613.028307607929, - 58633.775364123983, - 58654.52425609425, - 58675.274983194053, - 58696.027545098877, - 58716.781941484325, - 58737.538172026158, - 58758.296236400274, - 58779.056134282728, - 58799.817865349694, - 58820.581429277503, - 58841.346825742643, - 58862.114054421712, - 58882.883114991484, - 58903.654007128847, - 58924.426730510851, - 58945.201284814684, - 58965.977669717664, - 58986.755884897269, - 59007.535930031117, - 59028.317804796949, - 59049.101508872664, - 59069.887041936301, - 59090.674403666046, - 59111.463593740213, - 59132.254611837263, - 59153.047457635803, - 59173.84213081457, - 59194.638631052461, - 59215.436958028506, - 59236.237111421855, - 59257.039090911829, - 59277.842896177877, - 59298.648526899589, - 59319.455982756685, - 59340.26526342905, - 59361.076368596696, - 59381.889297939757, - 59402.704051138542, - 59423.520627873484, - 59444.339027825139, - 59465.159250674224, - 59485.9812961016, - 59506.805163788253, - 59527.630853415307, - 59548.458364664046, - 59569.287697215863, - 59590.118850752311, - 59610.951824955089, - 59631.786619506012, - 59652.623234087048, - 59673.461668380311, - 59694.301922068029, - 59715.143994832593, - 59735.987886356525, - 59756.833596322482, - 59777.681124413255, - 59798.530470311794, - 59819.381633701159, - 59840.234614264569, - 59861.089411685381, - 59881.94602564707, - 59902.804455833269, - 59923.664701927737, - 59944.526763614384, - 59965.390640577243, - 59986.256332500488, - 60007.123839068438, - 60027.993159965539, - 60048.864294876381, - 60069.737243485688, - 60090.612005478324, - 60111.488580539284, - 60132.366968353708, - 60153.247168606867, - 60174.129180984164, - 60195.013005171153, - 60215.898640853513, - 60236.786087717061, - 60257.675345447751, - 60278.566413731671, - 60299.459292255044, - 60320.353980704247, - 60341.25047876576, - 60362.148786126229, - 60383.048902472423, - 60403.950827491237, - 60424.854560869717, - 60445.76010229504, - 60466.667451454516, - 60487.57660803559, - 60508.487571725847, - 60529.400342212997, - 60550.314919184893, - 60571.231302329521, - 60592.149491335003, - 60613.069485889588, - 60633.991285681674, - 60654.914890399785, - 60675.840299732568, - 60696.767513368832, - 60717.696530997484, - 60738.627352307602, - 60759.55997698837, - 60780.494404729128, - 60801.430635219323, - 60822.368668148556, - 60843.308503206565, - 60864.250140083204, - 60885.193578468468, - 60906.138818052495, - 60927.085858525541, - 60948.034699578006, - 60968.985340900421, - 60989.937782183442, - 61010.892023117864, - 61031.848063394616, - 61052.805902704764, - 61073.765540739492, - 61094.726977190134, - 61115.690211748137, - 61136.655244105103, - 61157.622073952742, - 61178.590700982917, - 61199.561124887616, - 61220.533345358948, - 61241.507362089171, - 61262.483174770663, - 61283.460783095943, - 61304.440186757645, - 61325.421385448557, - 61346.404378861582, - 61367.389166689762, - 61388.375748626262, - 61409.364124364387, - 61430.354293597571, - 61451.346256019373, - 61472.340011323497, - 61493.335559203762, - 61514.332899354122, - 61535.332031468672, - 61556.332955241618, - 61577.335670367313, - 61598.340176540238, - 61619.346473454993, - 61640.354560806329, - 61661.3644382891, - 61682.376105598312, - 61703.389562429089, - 61724.404808476691, - 61745.42184343651, - 61766.440667004063, - 61787.461278874987, - 61808.483678745069, - 61829.507866310203, - 61850.533841266435, - 61871.561603309929, - 61892.591152136971, - 61913.622487443987, - 61934.655608927525, - 61955.690516284267, - 61976.727209211022, - 61997.765687404724, - 62018.805950562448, - 62039.847998381381, - 62060.891830558845, - 62081.93744679229, - 62102.984846779298, - 62124.034030217575, - 62145.084996804966, - 62166.137746239416, - 62187.19227821903, - 62208.248592442025, - 62229.306688606739, - 62250.366566411656, - 62271.428225555377, - 62292.491665736627, - 62313.556886654267, - 62334.623888007271, - 62355.692669494762, - 62376.763230815974, - 62397.835571670272, - 62418.909691757144, - 62439.98559077621, - 62461.063268427228, - 62482.142724410049, - 62503.223958424685, - 62524.306970171267, - 62545.39175935003, - 62566.478325661366, - 62587.566668805768, - 62608.656788483881, - 62629.748684396451, - 62650.842356244357, - 62671.937803728622, - 62693.035026550366, - 62714.134024410858, - 62735.234797011479, - 62756.337344053733, - 62777.441665239276, - 62798.547760269852, - 62819.655628847358, - 62840.765270673801, - 62861.876685451323, - 62882.989872882186, - 62904.104832668774, - 62925.221564513602, - 62946.340068119309, - 62967.460343188657, - 62988.582389424526, - 63009.70620652994, - 63030.831794208025, - 63051.959152162039, - 63073.08828009537, - 63094.219177711529, - 63115.351844714154, - 63136.486280806988, - 63157.622485693922, - 63178.760459078956, - 63199.900200666219, - 63221.041710159967, - 63242.184987264569, - 63263.330031684534, - 63284.476843124474, - 63305.625421289144, - 63326.775765883409, - 63347.927876612259, - 63369.081753180813, - 63390.237395294316, - 63411.39480265812, - 63432.553974977716, - 63453.714911958712, - 63474.877613306839, - 63496.042078727944, - 63517.208307927998, - 63538.376300613119, - 63559.546056489504, - 63580.717575263516, - 63601.890856641607, - 63623.065900330374, - 63644.242706036515, - 63665.421273466869, - 63686.601602328381, - 63707.783692328136, - 63728.967543173334, - 63750.153154571279, - 63771.340526229418, - 63792.529657855317, - 63813.720549156649, - 63834.913199841227, - 63856.107609616978, - 63877.303778191941, - 63898.501705274284, - 63919.7013905723, - 63940.902833794404, - 63962.106034649114, - 63983.310992845094, - 64004.517708091109, - 64025.726180096048, - 64046.936408568938, - 64068.1483932189, - 64089.362133755196, - 64110.577629887193, - 64131.794881324393, - 64153.013887776404, - 64174.234648952966, - 64195.457164563937, - 64216.681434319289, - 64237.907457929112, - 64259.135235103626, - 64280.36476555316, - 64301.596048988169, - 64322.829085119236, - 64344.06387365704, - 64365.300414312398, - 64386.538706796251, - 64407.778750819634, - 64429.020546093721, - 64450.26409232981, - 64471.509389239291, - 64492.756436533709, - 64514.005233924705, - 64535.255781124033, - 64556.50807784358, - 64577.762123795357, - 64599.017918691468, - 64620.275462244172, - 64641.534754165805, - 64662.795794168844, - 64684.058581965895, - 64705.323117269661, - 64726.589399792974, - 64747.857429248776, - 64769.127205350138, - 64790.398727810236, - 64811.671996342375, - 64832.947010659969, - 64854.223770476558, - 64875.502275505794, - 64896.782525461451, - 64918.064520057414, - 64939.348259007682, - 64960.633742026388, - 64981.920968827762, - 65003.209939126165, - 65024.500652636067, - 65045.793109072067, - 65067.087308148861, - 65088.383249581282, - 65109.680933084259, - 65130.980358372864, - 65152.28152516226, - 65173.584433167736, - 65194.889082104703, - 65216.195471688683, - 65237.503601635319, - 65258.813471660353, - 65280.125081479666, - 65301.438430809241, - 65322.753519365178, - 65344.070346863708, - 65365.388913021146, - 65386.709217553958, - 65408.031260178701, - 65429.355040612056, - 65450.680558570821, - 65472.00781377191, - 65493.336805932355, - 65514.66753476928, - 65535.999999999956, - 65557.334201341757, - 65578.670138512171, - 65600.007811228788, - 65621.347219209332, - 65642.688362171626, - 65664.031239833639, - 65685.375851913413, - 65706.722198129137, - 65728.070278199084, - 65749.420091841661, - 65770.771638775404, - 65792.124918718939, - 65813.479931391004, - 65834.836676510458, - 65856.195153796303, - 65877.5553629676, - 65898.917303743554, - 65920.280975843489, - 65941.646378986843, - 65963.013512893158, - 65984.382377282076, - 66005.752971873386, - 66027.125296386963, - 66048.499350542799, - 66069.875134061018, - 66091.252646661844, - 66112.631888065618, - 66134.01285799277, - 66155.395556163887, - 66176.779982299631, - 66198.166136120795, - 66219.554017348273, - 66240.943625703105, - 66262.334960906388, - 66283.728022679396, - 66305.122810743444, - 66326.519324820023, - 66347.917564630698, - 66369.317529897162, - 66390.719220341227, - 66412.122635684791, - 66433.527775649884, - 66454.934639958636, - 66476.343228333324, - 66497.753540496284, - 66519.165576169995, - 66540.57933507704, - 66561.994816940118, - 66583.412021482043, - 66604.830948425733, - 66626.251597494222, - 66647.673968410629, - 66669.098060898235, - 66690.523874680381, - 66711.951409480564, - 66733.380665022371, - 66754.811641029475, - 66776.244337225711, - 66797.678753334985, - 66819.11488908132, - 66840.552744188884, - 66861.992318381905, - 66883.433611384738, - 66904.876622921889, - 66926.321352717903, - 66947.767800497502, - 66969.215965985466, - 66990.665848906734, - 67012.117448986304, - 67033.570765949335, - 67055.025799521056, - 67076.482549426815, - 67097.941015392076, - 67119.401197142433, - 67140.863094403554, - 67162.326706901222, - 67183.792034361351, - 67205.259076509959, - 67226.72783307315, - 67248.198303777172, - 67269.670488348347, - 67291.144386513144, - 67312.619997998088, - 67334.09732252988, - 67355.576359835293, - 67377.057109641188, - 67398.53957167457, - 67420.023745662547, - 67441.50963133233, - 67462.99722841123, - 67484.486536626689, - 67505.977555706224, - 67527.470285377494, - 67548.964725368263, - 67570.460875406367, - 67591.9587352198, - 67613.458304536631, - 67634.95958308503, - 67656.462570593329, - 67677.967266789899, - 67699.473671403248, - 67720.981784162024, - 67742.491604794923, - 67764.003133030797, - 67785.516368598575, - 67807.031311227314, - 67828.547960646174, - 67850.066316584402, - 67871.58637877139, - 67893.108146936589, - 67914.63162080961, - 67936.156800120138, - 67957.683684597971, - 67979.212273973011, - 68000.742567975263, - 68022.274566334876, - 68043.808268782057, - 68065.343675047145, - 68086.880784860579, - 68108.419597952918, - 68129.960114054789, - 68151.502332896969, - 68173.04625421032, - 68194.591877725834, - 68216.139203174564, - 68237.688230287706, - 68259.238958796544, - 68280.791388432481, - 68302.345518927032, - 68323.901350011787, - 68345.458881418483, - 68367.018112878912, - 68388.579044125028, - 68410.141674888844, - 68431.706004902502, - 68453.272033898262, - 68474.839761608455, - 68496.409187765545, - 68517.980312102081, - 68539.553134350732, - 68561.127654244279, - 68582.70387151558, - 68604.281785897634, - 68625.861397123503, - 68647.44270492639, - 68669.025709039604, - 68690.610409196524, - 68712.196805130661, - 68733.784896575627, - 68755.374683265123, - 68776.966164932994, - 68798.559341313128, - 68820.154212139591, - 68841.750777146473, - 68863.349036068044, - 68884.948988638629, - 68906.550634592684, - 68928.153973664739, - 68949.75900558944, - 68971.365730101577, - 68992.974146935987, - 69014.584255827634, - 69036.196056511588, - 69057.809548723017, - 69079.424732197207, - 69101.041606669532, - 69122.660171875468, - 69144.280427550606, - 69165.902373430625, - 69187.526009251334, - 69209.151334748618, - 69230.778349658474, - 69252.40705371699, - 69274.037446660412, - 69295.669528225, - 69317.303298147192, - 69338.938756163494, - 69360.575902010532, - 69382.214735425005, - 69403.855256143754, - 69425.497463903681, - 69447.141358441833, - 69468.78693949533, - 69490.434206801394, - 69512.083160097391, - 69533.733799120717, - 69555.386123608929, - 69577.04013329967, - 69598.695827930685, - 69620.353207239794, - 69642.012270964973, - 69663.67301884426, - 69685.335450615792, - 69706.999566017839, - 69728.665364788743, - 69750.332846666963, - 69772.002011391058, - 69793.672858699691, - 69815.345388331611, - 69837.019600025669, - 69858.695493520849, - 69880.373068556204, - 69902.052324870907, - 69923.733262204216, - 69945.415880295492, - 69967.100178884211, - 69988.786157709939, - 70010.473816512356, - 70032.163155031216, - 70053.854173006403, - 70075.546870177874, - 70097.241246285717, - 70118.937301070109, - 70140.635034271298, - 70162.334445629691, - 70184.035534885741, - 70205.738301780017, - 70227.442746053217, - 70249.1488674461, - 70270.856665699539, - 70292.566140554511, - 70314.277291752107, - 70335.990119033493, - 70357.704622139936, - 70379.420800812819, - 70401.138654793613, - 70422.85818382389, - 70444.579387645339, - 70466.302265999722, - 70488.026818628918, - 70509.753045274876, - 70531.480945679708, - 70553.210519585555, - 70574.941766734701, - 70596.674686869505, - 70618.409279732456, - 70640.145545066101, - 70661.883482613106, - 70683.623092116264, - 70705.364373318414, - 70727.107325962526, - 70748.851949791671, - 70770.598244549008, - 70792.346209977783, - 70814.095845821372, - 70835.847151823225, - 70857.600127726895, - 70879.354773276034, - 70901.111088214413, - 70922.869072285859, - 70944.628725234332, - 70966.390046803877, - 70988.153036738629, - 71009.917694782853, - 71031.684020680885, - 71053.45201417715, - 71075.221675016204, - 71096.993002942661, - 71118.765997701266, - 71140.540659036851, - 71162.316986694335, - 71184.09498041874, - 71205.874639955218, - 71227.655965048951, - 71249.438955445294, - 71271.223610889632, - 71293.009931127483, - 71314.797915904477, - 71336.587564966307, - 71358.378878058764, - 71380.171854927772, - 71401.966495319313, - 71423.762798979486, - 71445.560765654489, - 71467.360395090596, - 71489.161687034211, - 71510.964641231811, - 71532.769257429973, - 71554.575535375348, - 71576.383474814749, - 71598.19307549503, - 71620.004337163133, - 71641.817259566145, - 71663.631842451214, - 71685.4480855656, - 71707.26598865664, - 71729.085551471784, - 71750.906773758586, - 71772.729655264673, - 71794.554195737772, - 71816.380394925713, - 71838.208252576442, - 71860.037768437964, - 71881.868942258385, - 71903.701773785942, - 71925.536262768932, - 71947.372408955751, - 71969.210212094898, - 71991.049671934976, - 72012.890788224686, - 72034.73356071279, - 72056.577989148165, - 72078.424073279821, - 72100.271812856794, - 72122.121207628254, - 72143.97225734347, - 72165.824961751801, - 72187.679320602692, - 72209.53533364569, - 72231.393000630429, - 72253.252321306645, - 72275.113295424177, - 72296.975922732949, - 72318.840202982959, - 72340.706135924338, - 72362.573721307272, - 72384.442958882093, - 72406.313848399179, - 72428.186389609036, - 72450.060582262216, - 72471.936426109431, - 72493.813920901433, - 72515.693066389096, - 72537.573862323392, - 72559.456308455352, - 72581.340404536139, - 72603.226150316987, - 72625.113545549248, - 72647.002589984331, - 72668.893283373764, - 72690.785625469172, - 72712.679616022273, - 72734.575254784853, - 72756.472541508803, - 72778.371475946144, - 72800.272057848939, - 72822.174286969355, - 72844.07816305969, - 72865.983685872285, - 72887.890855159596, - 72909.799670674183, - 72931.710132168693, - 72953.622239395845, - 72975.535992108475, - 72997.451390059519, - 73019.368433001961, - 73041.287120688925, - 73063.207452873612, - 73085.129429309294, - 73107.053049749389, - 73128.978313947344, - 73150.905221656736, - 73172.833772631217, - 73194.763966624567, - 73216.695803390612, - 73238.62928268328, - 73260.564404256627, - 73282.501167864757, - 73304.439573261901, - 73326.379620202337, - 73348.321308440485, - 73370.264637730841, - 73392.209607827957, - 73414.156218486532, - 73436.104469461323, - 73458.054360507173, - 73480.005891379056, - 73501.959061831993, - 73523.913871621116, - 73545.870320501665, - 73567.828408228932, - 73589.78813455833, - 73611.749499245358, - 73633.712502045615, - 73655.677142714747, - 73677.643421008557, - 73699.611336682879, - 73721.580889493693, - 73743.552079197019, - 73765.524905548999, - 73787.499368305856, - 73809.475467223907, - 73831.453202059551, - 73853.432572569291, - 73875.413578509717, - 73897.396219637507, - 73919.380495709411, - 73941.36640648231, - 73963.353951713143, - 73985.343131158952, - 74007.333944576865, - 74029.326391724098, - 74051.320472357969, - 74073.316186235883, - 74095.313533115303, - 74117.312512753837, - 74139.313124909138, - 74161.315369338976, - 74183.319245801191, - 74205.324754053727, - 74227.331893854629, - 74249.340664961986, - 74271.351067134034, - 74293.363100129049, - 74315.376763705441, - 74337.392057621662, - 74359.408981636298, - 74381.427535508003, - 74403.447718995507, - 74425.469531857671, - 74447.492973853383, - 74469.518044741693, - 74491.54474428168, - 74513.573072232539, - 74535.603028353551, - 74557.634612404087, - 74579.667824143602, - 74601.702663331642, - 74623.739129727837, - 74645.777223091936, - 74667.816943183716, - 74689.858289763113, - 74711.901262590094, - 74733.945861424741, - 74755.992086027225, - 74778.039936157802, - 74800.089411576817, - 74822.140512044702, - 74844.193237321961, - 74866.24758716923, - 74888.303561347187, - 74910.36115961663, - 74932.420381738411, - 74954.481227473516, - 74976.543696582972, - 74998.607788827925, - 75020.673503969607, - 75042.740841769322, - 75064.809801988464, - 75086.88038438854, - 75108.952588731103, - 75131.026414777836, - 75153.101862290467, - 75175.178931030852, - 75197.257620760924, - 75219.33793124267, - 75241.419862238225, - 75263.503413509738, - 75285.588584819503, - 75307.675375929874, - 75329.763786603318, - 75351.853816602365, - 75373.945465689612, - 75396.038733627807, - 75418.133620179724, - 75440.230125108254, - 75462.32824817636, - 75484.427989147109, - 75506.529347783653, - 75528.63232384919, - 75550.736917107075, - 75572.843127320695, - 75594.950954253538, - 75617.060397669193, - 75639.171457331307, - 75661.284133003646, - 75683.398424450032, - 75705.514331434402, - 75727.631853720741, - 75749.750991073175, - 75771.871743255862, - 75793.994110033076, - 75816.118091169177, - 75838.243686428585, - 75860.370895575848, - 75882.499718375562, - 75904.630154592422, - 75926.762203991224, - 75948.895866336825, - 75971.031141394182, - 75993.168028928325, - 76015.306528704401, - 76037.4466404876, - 76059.588364043215, - 76081.731699136653, - 76103.876645533353, - 76126.023202998884, - 76148.171371298871, - 76170.321150199044, - 76192.472539465205, - 76214.625538863256, - 76236.780148159174, - 76258.936367119008, - 76281.094195508922, - 76303.253633095141, - 76325.414679643975, - 76347.577334921851, - 76369.741598695226, - 76391.907470730686, - 76414.074950794879, - 76436.244038654564, - 76458.414734076548, - 76480.587036827754, - 76502.760946675175, - 76524.936463385893, - 76547.11358672705, - 76569.292316465915, - 76591.472652369819, - 76613.654594206164, - 76635.838141742468, - 76658.023294746308, - 76680.210052985349, - 76702.398416227341, - 76724.588384240138, - 76746.779956791637, - 76768.973133649866, - 76791.167914582897, - 76813.364299358902, - 76835.562287746157, - 76857.761879512967, - 76879.963074427797, - 76902.165872259109, - 76924.37027277553, - 76946.576275745727, - 76968.783880938441, - 76990.993088122515, - 77013.203897066895, - 77035.416307540567, - 77057.630319312622, - 77079.845932152239, - 77102.063145828695, - 77124.281960111301, - 77146.50237476948, - 77168.724389572759, - 77190.948004290723, - 77213.173218693031, - 77235.400032549442, - 77257.628445629802, - 77279.858457704031, - 77302.090068542122, - 77324.323277914169, - 77346.558085590339, - 77368.794491340886, - 77391.032494936138, - 77413.272096146524, - 77435.51329474253, - 77457.756090494731, - 77480.000483173804, - 77502.246472550498, - 77524.494058395634, - 77546.743240480107, - 77568.994018574944, - 77591.246392451198, - 77613.500361880026, - 77635.755926632657, - 77658.013086480438, - 77680.271841194757, - 77702.532190547092, - 77724.794134309021, - 77747.057672252195, - 77769.322804148323, - 77791.589529769248, - 77813.857848886837, - 77836.127761273063, - 77858.399266699998, - 77880.67236493979, - 77902.947055764627, - 77925.223338946831, - 77947.50121425878, - 77969.780681472927, - 77992.061740361838, - 78014.344390698127, - 78036.628632254491, - 78058.914464803747, - 78081.201888118725, - 78103.490901972415, - 78125.781506137821, - 78148.073700388064, - 78170.367484496339, - 78192.662858235926, - 78214.959821380166, - 78237.258373702498, - 78259.558514976452, - 78281.860244975614, - 78304.163563473659, - 78326.468470244363, - 78348.77496506153, - 78371.083047699125, - 78393.392717931114, - 78415.703975531578, - 78438.016820274701, - 78460.331251934695, - 78482.647270285903, - 78504.964875102727, - 78527.284066159627, - 78549.604843231195, - 78571.927206092048, - 78594.251154516911, - 78616.576688280606, - 78638.903807157985, - 78661.232510924034, - 78683.562799353778, - 78705.894672222363, - 78728.228129304945, - 78750.563170376859, - 78772.899795213423, - 78795.238003590101, - 78817.577795282399, - 78839.919170065928, - 78862.262127716356, - 78884.606668009452, - 78906.952790721043, - 78929.300495627045, - 78951.64978250346, - 78974.000651126378, - 78996.353101271932, - 79018.707132716358, - 79041.062745235977, - 79063.41993860717, - 79085.778712606436, - 79108.139067010285, - 79130.501001595389, - 79152.864516138419, - 79175.22961041618, - 79197.596284205531, - 79219.96453728342, - 79242.33436942687, - 79264.705780412987, - 79287.078770018954, - 79309.453338022009, - 79331.829484199508, - 79354.207208328866, - 79376.586510187582, - 79398.967389553218, - 79421.349846203433, - 79443.733879915948, - 79466.119490468584, - 79488.50667763922, - 79510.895441205823, - 79533.285780946433, - 79555.677696639163, - 79578.071188062226, - 79600.466254993895, - 79622.862897212515, - 79645.261114496549, - 79667.660906624471, - 79690.062273374875, - 79712.465214526455, - 79734.869729857935, - 79757.275819148126, - 79779.683482175955, - 79802.092718720378, - 79824.503528560454, - 79846.915911475327, - 79869.329867244203, - 79891.745395646343, - 79914.162496461155, - 79936.581169468045, - 79959.001414446553, - 79981.423231176261, - 80003.846619436852, - 80026.271579008084, - 80048.698109669771, - 80071.12621120183, - 80093.555883384237, - 80115.987125997053, - 80138.419938820414, - 80160.854321634528, - 80183.290274219689, - 80205.727796356281, - 80228.166887824715, - 80250.607548405547, - 80273.049777879336, - 80295.493576026798, - 80317.938942628651, - 80340.385877465727, - 80362.834380318949, - 80385.28445096928, - 80407.736089197788, - 80430.189294785596, - 80452.644067513917, - 80475.100407164035, - 80497.558313517322, - 80520.017786355209, - 80542.478825459213, - 80564.941430610925, - 80587.405601592007, - 80609.871338184195, - 80632.338640169342, - 80654.8075073293, - 80677.277939446067, - 80699.749936301683, - 80722.223497678278, - 80744.698623358039, - 80767.17531312324, - 80789.653566756242, - 80812.133384039465, - 80834.614764755403, - 80857.097708686648, - 80879.582215615854, - 80902.068285325731, - 80924.555917599093, - 80947.045112218824, - 80969.535868967869, - 80992.028187629272, - 81014.522067986123, - 81037.017509821613, - 81059.514512919006, - 81082.013077061609, - 81104.513202032831, - 81127.014887616184, - 81149.518133595193, - 81172.022939753486, - 81194.529305874807, - 81217.037231742899, - 81239.546717141639, - 81262.057761854958, - 81284.570365666848, - 81307.084528361403, - 81329.600249722775, - 81352.117529535186, - 81374.636367582949, - 81397.156763650448, - 81419.678717522125, - 81442.202228982511, - 81464.727297816222, - 81487.253923807933, - 81509.782106742379, - 81532.311846404409, - 81554.843142578902, - 81577.375995050839, - 81599.910403605274, - 81622.446368027333, - 81644.983888102215, - 81667.522963615178, - 81690.063594351581, - 81712.605780096841, - 81735.149520636449, - 81757.694815755967, - 81780.241665241047, - 81802.79006887741, - 81825.340026450824, - 81847.891537747171, - 81870.444602552379, - 81892.999220652477, - 81915.555391833506, - 81938.113115881672, - 81960.672392583176, - 81983.233221724338, - 82005.795603091537, - 82028.359536471224, - 82050.925021649906, - 82073.492058414209, - 82096.060646550788, - 82118.630785846399, - 82141.202476087841, - 82163.775717062032, - 82186.35050855593, - 82208.926850356569, - 82231.504742251054, - 82254.084184026578, - 82276.665175470393, - 82299.24771636985, - 82321.831806512317, - 82344.417445685307, - 82367.004633676348, - 82389.593370273054, - 82412.183655263143, - 82434.775488434374, - 82457.368869574595, - 82479.963798471697, - 82502.560274913689, - 82525.158298688606, - 82547.757869584602, - 82570.35898738986, - 82592.961651892678, - 82615.565862881398, - 82638.171620144421, - 82660.778923470265, - 82683.387772647475, - 82705.998167464713, - 82728.610107710658, - 82751.223593174116, - 82773.83862364394, - 82796.45519890904, - 82819.073318758441, - 82841.692982981185, - 82864.314191366429, - 82886.936943703375, - 82909.561239781324, - 82932.187079389638, - 82954.814462317736, - 82977.443388355125, - 83000.073857291369, - 83022.70586891612, - 83045.339423019104, - 83067.974519390089, - 83090.611157818959, - 83113.249338095629, - 83135.8890600101, - 83158.530323352461, - 83181.173127912858, - 83203.817473481497, - 83226.463359848669, - 83249.11078680474, - 83271.759754140134, - 83294.410261645375, - 83317.062309111003, - 83339.715896327703, - 83362.371023086147, - 83385.027689177165, - 83407.685894391587, - 83430.345638520361, - 83453.006921354478, - 83475.669742685001, - 83498.334102303095, - 83520.999999999942, - 83543.667435566866, - 83566.336408795192, - 83589.006919476349, - 83611.678967401851, - 83634.352552363242, - 83657.027674152167, - 83679.704332560359, - 83702.382527379552, - 83725.062258401638, - 83747.743525418511, - 83770.42632822218, - 83793.110666604684, - 83815.796540358162, - 83838.483949274829, - 83861.172893146941, - 83883.863371766842, - 83906.555384926964, - 83929.248932419752, - 83951.944014037799, - 83974.640629573696, - 83997.338778820151, - 84020.038461569929, - 84042.739677615857, - 84065.442426750829, - 84088.146708767847, - 84110.852523459922, - 84133.559870620171, - 84156.268750041796, - 84178.979161518029, - 84201.691104842204, - 84224.404579807713, - 84247.119586208006, - 84269.83612383662, - 84292.55419248715, - 84315.273791953281, - 84337.994922028738, - 84360.717582507335, - 84383.441773182945, - 84406.167493849513, - 84428.894744301069, - 84451.623524331691, - 84474.353833735542, - 84497.085672306828, - 84519.819039839858, - 84542.553936128999, - 84565.290360968676, - 84588.028314153402, - 84610.767795477717, - 84633.508804736295, - 84656.251341723822, - 84678.995406235073, - 84701.740998064924, - 84724.488117008252, - 84747.236762860062, - 84769.986935415407, - 84792.73863446941, - 84815.491859817252, - 84838.246611254188, - 84861.002888575575, - 84883.760691576768, - 84906.520020053256, - 84929.28087380057, - 84952.043252614312, - 84974.807156290146, - 84997.572584623806, - 85020.339537411113, - 85043.108014447949, - 85065.878015530237, - 85088.649540453989, - 85111.422589015303, - 85134.197161010321, - 85156.973256235244, - 85179.750874486374, - 85202.530015560071, - 85225.310679252725, - 85248.092865360857, - 85270.876573681016, - 85293.661804009811, - 85316.448556143951, - 85339.236829880188, - 85362.026625015351, - 85384.817941346351, - 85407.610778670132, - 85430.405136783724, - 85453.201015484257, - 85475.998414568865, - 85498.797333834795, - 85521.597773079353, - 85544.399732099904, - 85567.203210693886, - 85590.008208658808, - 85612.814725792239, - 85635.62276189182, - 85658.432316755265, - 85681.243390180331, - 85704.055981964877, - 85726.870091906807, - 85749.685719804082, - 85772.502865454764, - 85795.321528656961, - 85818.141709208852, - 85840.963406908675, - 85863.78662155474, - 85886.611352945445, - 85909.437600879217, - 85932.26536515457, - 85955.094645570091, - 85977.92544192441, - 86000.757754016275, - 86023.591581644432, - 86046.426924607746, - 86069.263782705122, - 86092.102155735556, - 86114.942043498071, - 86137.783445791807, - 86160.626362415918, - 86183.470793169676, - 86206.316737852379, - 86229.164196263402, - 86252.013168202204, - 86274.863653468303, - 86297.715651861261, - 86320.569163180728, - 86343.424187226425, - 86366.280723798132, - 86389.138772695675, - 86411.998333718977, - 86434.859406668009, - 86457.721991342827, - 86480.586087543532, - 86503.451695070296, - 86526.318813723352, - 86549.187443303032, - 86572.057583609683, - 86594.929234443756, - 86617.802395605773, - 86640.677066896271, - 86663.553248115903, - 86686.43093906538, - 86709.310139545443, - 86732.190849356964, - 86755.073068300815, - 86777.956796177954, - 86800.842032789442, - 86823.728777936354, - 86846.617031419853, - 86869.506793041175, - 86892.398062601613, - 86915.290839902518, - 86938.185124745316, - 86961.080916931489, - 86983.978216262592, - 87006.87702254027, - 87029.777335566177, - 87052.67915514209, - 87075.582481069796, - 87098.487313151185, - 87121.39365118822, - 87144.301494982894, - 87167.210844337285, - 87190.121699053532, - 87213.034058933845, - 87235.947923780506, - 87258.863293395829, - 87281.780167582241, - 87304.698546142172, - 87327.618428878181, - 87350.539815592856, - 87373.462706088845, - 87396.387100168897, - 87419.312997635774, - 87442.240398292357, - 87465.16930194154, - 87488.099708386319, - 87511.031617429733, - 87533.965028874911, - 87556.899942525008, - 87579.836358183282, - 87602.774275653021, - 87625.713694737613, - 87648.654615240492, - 87671.597036965148, - 87694.540959715145, - 87717.486383294105, - 87740.433307505737, - 87763.381732153779, - 87786.331657042057, - 87809.283081974456, - 87832.236006754916, - 87855.190431187453, - 87878.146355076155, - 87901.103778225151, - 87924.062700438633, - 87947.023121520891, - 87969.985041276246, - 87992.948459509105, - 88015.913376023906, - 88038.879790625171, - 88061.847703117513, - 88084.817113305573, - 88107.788020994049, - 88130.760425987726, - 88153.734328091465, - 88176.709727110137, - 88199.686622848749, - 88222.665015112303, - 88245.644903705906, - 88268.626288434709, - 88291.609169103947, - 88314.593545518903, - 88337.579417484914, - 88360.566784807408, - 88383.555647291854, - 88406.546004743795, - 88429.537856968818, - 88452.531203772611, - 88475.52604496089, - 88498.522380339447, - 88521.52020971413, - 88544.519532890874, - 88567.520349675644, - 88590.522659874507, - 88613.526463293543, - 88636.531759738922, - 88659.538549016899, - 88682.546830933745, - 88705.556605295846, - 88728.567871909589, - 88751.580630581491, - 88774.594881118086, - 88797.610623325963, - 88820.62785701183, - 88843.646581982393, - 88866.666798044462, - 88889.688505004888, - 88912.711702670611, - 88935.7363908486, - 88958.762569345898, - 88981.790237969632, - 89004.81939652696, - 89027.850044825114, - 89050.882182671412, - 89073.9158098732, - 89096.950926237885, - 89119.987531572973, - 89143.025625686001, - 89166.065208384563, - 89189.106279476357, - 89212.148838769106, - 89235.192886070581, - 89258.238421188667, - 89281.285443931265, - 89304.333954106376, - 89327.383951522017, - 89350.435435986306, - 89373.488407307406, - 89396.542865293537, - 89419.598809753006, - 89442.656240494165, - 89465.715157325409, - 89488.775560055219, - 89511.837448492137, - 89534.900822444746, - 89557.965681721733, - 89581.032026131812, - 89604.099855483742, - 89627.169169586399, - 89650.239968248672, - 89673.312251279538, - 89696.386018488018, - 89719.461269683205, - 89742.53800467425, - 89765.616223270365, - 89788.69592528083, - 89811.777110514988, - 89834.859778782207, - 89857.943929891975, - 89881.029563653807, - 89904.116679877261, - 89927.205278372014, - 89950.29535894774, - 89973.386921414218, - 89996.479965581268, - 90019.574491258769, - 90042.670498256688, - 90065.767986385021, - 90088.866955453836, - 90111.967405273259, - 90135.069335653476, - 90158.172746404758, - 90181.277637337407, - 90204.384008261797, - 90227.49185898836, - 90250.601189327586, - 90273.711999090039, - 90296.824288086325, - 90319.938056127125, - 90343.053303023189, - 90366.170028585286, - 90389.288232624298, - 90412.407914951138, - 90435.529075376777, - 90458.651713712257, - 90481.775829768681, - 90504.901423357209, - 90528.028494289058, - 90551.157042375504, - 90574.287067427911, - 90597.418569257643, - 90620.551547676194, - 90643.686002495073, - 90666.821933525847, - 90689.959340580186, - 90713.098223469773, - 90736.238582006365, - 90759.380416001804, - 90782.523725267951, - 90805.668509616764, - 90828.814768860233, - 90851.962502810435, - 90875.11171127946, - 90898.262394079517, - 90921.414551022855, - 90944.568181921743, - 90967.72328658856, - 90990.879864835719, - 91014.037916475718, - 91037.19744132107, - 91060.358439184391, - 91083.520909878338, - 91106.684853215629, - 91129.850269009039, - 91153.017157071401, - 91176.185517215621, - 91199.355349254649, - 91222.526653001492, - 91245.699428269247, - 91268.873674871036, - 91292.049392620058, - 91315.226581329553, - 91338.405240812834, - 91361.585370883287, - 91384.766971354344, - 91407.950042039476, - 91431.134582752245, - 91454.320593306256, - 91477.508073515171, - 91500.697023192712, - 91523.887442152685, - 91547.07933020893, - 91570.272687175326, - 91593.467512865856, - 91616.663807094534, - 91639.861569675442, - 91663.060800422725, - 91686.261499150554, - 91709.463665673218, - 91732.66729980502, - 91755.872401360321, - 91779.078970153569, - 91802.287005999257, - 91825.49650871192, - 91848.707478106167, - 91871.91991399668, - 91895.133816198169, - 91918.349184525418, - 91941.566018793281, - 91964.784318816659, - 91988.004084410495, - 92011.22531538982, - 92034.448011569708, - 92057.672172765277, - 92080.897798791746, - 92104.124889464365, - 92127.353444598411, - 92150.58346400928, - 92173.814947512379, - 92197.04789492322, - 92220.282306057314, - 92243.518180730272, - 92266.755518757753, - 92289.994319955469, - 92313.234584139194, - 92336.476311124774, - 92359.719500728082, - 92382.964152765067, - 92406.210267051734, - 92429.457843404161, - 92452.706881638471, - 92475.957381570814, - 92499.209343017443, - 92522.462765794655, - 92545.717649718805, - 92568.973994606305, - 92592.231800273614, - 92615.491066537259, - 92638.751793213814, - 92662.01398011994, - 92685.277627072326, - 92708.54273388772, - 92731.809300382942, - 92755.077326374871, - 92778.346811680414, - 92801.617756116568, - 92824.890159500384, - 92848.164021648947, - 92871.439342379424, - 92894.716121509016, - 92917.994358855023, - 92941.274054234746, - 92964.555207465572, - 92987.837818364962, - 93011.121886750407, - 93034.407412439468, - 93057.694395249753, - 93080.982834998955, - 93104.272731504767, - 93127.564084584999, - 93150.856894057491, - 93174.15115974014, - 93197.446881450916, - 93220.744059007804, - 93244.04269222889, - 93267.342780932304, - 93290.644324936235, - 93313.947324058914, - 93337.251778118633, - 93360.557686933767, - 93383.865050322696, - 93407.173868103928, - 93430.484140095941, - 93453.795866117362, - 93477.109045986799, - 93500.423679522952, - 93523.739766544561, - 93547.057306870454, - 93570.376300319491, - 93593.696746710571, - 93617.018645862699, - 93640.341997594893, - 93663.666801726242, - 93686.993058075881, - 93710.320766463032, - 93733.64992670693, - 93756.980538626914, - 93780.312602042337, - 93803.646116772637, - 93826.981082637285, - 93850.317499455836, - 93873.655367047861, - 93896.994685233032, - 93920.335453831038, - 93943.677672661666, - 93967.021341544707, - 93990.366460300051, - 94013.713028747632, - 94037.061046707429, - 94060.410513999494, - 94083.761430443905, - 94107.113795860845, - 94130.467610070496, - 94153.822872893157, - 94177.179584149111, - 94200.537743658759, - 94223.897351242529, - 94247.25840672091, - 94270.620909914433, - 94293.98486064373, - 94317.350258729421, - 94340.71710399224, - 94364.085396252936, - 94387.455135332348, - 94410.82632105134, - 94434.198953230851, - 94457.573031691878, - 94480.948556255447, - 94504.325526742658, - 94527.70394297468, - 94551.083804772716, - 94574.465111958023, - 94597.847864351934, - 94621.232061775823, - 94644.617704051096, - 94668.004790999272, - 94691.393322441872, - 94714.783298200506, - 94738.174718096794, - 94761.567581952477, - 94784.961889589307, - 94808.357640829097, - 94831.754835493703, - 94855.153473405066, - 94878.553554385173, - 94901.955078256055, - 94925.358044839784, - 94948.762453958523, - 94972.168305434476, - 94995.575599089891, - 95018.984334747074, - 95042.394512228391, - 95065.806131356265, - 95089.219191953176, - 95112.633693841635, - 95136.04963684424, - 95159.467020783617, - 95182.885845482466, - 95206.306110763529, - 95229.727816449609, - 95253.150962363579, - 95276.575548328314, - 95300.001574166803, - 95323.429039702052, - 95346.857944757154, - 95370.288289155214, - 95393.720072719429, - 95417.153295273019, - 95440.587956639298, - 95464.024056641589, - 95487.461595103305, - 95510.900571847902, - 95534.340986698866, - 95557.782839479783, - 95581.226130014256, - 95604.670858125959, - 95628.117023638595, - 95651.564626375985, - 95675.013666161918, - 95698.464142820303, - 95721.916056175076, - 95745.369406050231, - 95768.824192269807, - 95792.280414657915, - 95815.738073038709, - 95839.197167236387, - 95862.657697075221, - 95886.11966237954, - 95909.583062973688, - 95933.047898682111, - 95956.514169329268, - 95979.981874739708, - 96003.451014738006, - 96026.921589148798, - 96050.393597796792, - 96073.867040506724, - 96097.341917103375, - 96120.818227411626, - 96144.295971256375, - 96167.775148462577, - 96191.255758855244, - 96214.737802259449, - 96238.221278500292, - 96261.70618740299, - 96285.192528792715, - 96308.680302494788, - 96332.169508334526, - 96355.660146137321, - 96379.152215728609, - 96402.645716933868, - 96426.14064957868, - 96449.637013488609, - 96473.134808489311, - 96496.63403440651, - 96520.134691065963, - 96543.636778293469, - 96567.140295914898, - 96590.645243756153, - 96614.151621643221, - 96637.659429402134, - 96661.168666858954, - 96684.679333839798, - 96708.191430170875, - 96731.70495567839, - 96755.219910188665, - 96778.736293528011, - 96802.254105522836, - 96825.77334599958, - 96849.29401478474, - 96872.816111704873, - 96896.339636586577, - 96919.864589256511, - 96943.390969541389, - 96966.918777267958, - 96990.448012263048, - 97013.978674353522, - 97037.510763366285, - 97061.044279128328, - 97084.579221466673, - 97108.115590208385, - 97131.653385180587, - 97155.19260621049, - 97178.733253125291, - 97202.2753257523, - 97225.81882391886, - 97249.363747452342, - 97272.910096180189, - 97296.457869929916, - 97320.007068529041, - 97343.557691805196, - 97367.109739586012, - 97390.663211699197, - 97414.218107972498, - 97437.774428233737, - 97461.332172310766, - 97484.891340031507, - 97508.451931223899, - 97532.013945715982, - 97555.577383335811, - 97579.142243911512, - 97602.708527271257, - 97626.276233243261, - 97649.845361655811, - 97673.415912337223, - 97696.987885115886, - 97720.561279820206, - 97744.1360962787, - 97767.712334319876, - 97791.289993772341, - 97814.869074464703, - 97838.449576225685, - 97862.031498883996, - 97885.614842268449, - 97909.199606207883, - 97932.785790531183, - 97956.37339506732, - 97979.962419645264, - 98003.552864094076, - 98027.144728242856, - 98050.738011920766, - 98074.332714956996, - 98097.928837180807, - 98121.526378421506, - 98145.125338508456, - 98168.725717271067, - 98192.327514538789, - 98215.930730141132, - 98239.535363907664, - 98263.141415668011, - 98286.748885251814, - 98310.357772488816, - 98333.968077208759, - 98357.579799241488, - 98381.192938416847, - 98404.807494564782, - 98428.42346751524, - 98452.040857098269, - 98475.659663143917, - 98499.27988548232, - 98522.901523943656, - 98546.524578358163, - 98570.149048556093, - 98593.774934367786, - 98617.402235623624, - 98641.030952154048, - 98664.661083789513, - 98688.292630360564, - 98711.925591697771, - 98735.559967631794, - 98759.195757993293, - 98782.832962613014, - 98806.471581321734, - 98830.111613950285, - 98853.753060329575, - 98877.39592029051, - 98901.040193664099, - 98924.68588028138, - 98948.33297997342, - 98971.981492571387, - 98995.63141790645, - 99019.282755809851, - 99042.935506112874, - 99066.589668646877, - 99090.245243243233, - 99113.902229733401, - 99137.560627948857, - 99161.220437721131, - 99184.881658881859, - 99208.544291262631, - 99232.208334695169, - 99255.87378901121, - 99279.540654042547, - 99303.208929621018, - 99326.878615578535, - 99350.549711746993, - 99374.222217958435, - 99397.896134044888, - 99421.571459838422, - 99445.248195171211, - 99468.926339875441, - 99492.605893783344, - 99516.286856727209, - 99539.969228539398, - 99563.653009052287, - 99587.338198098325, - 99611.024795510006, - 99634.712801119866, - 99658.402214760499, - 99682.093036264545, - 99705.785265464699, - 99729.478902193689, - 99753.173946284325, - 99776.870397569437, - 99800.56825588191, - 99824.267521054688, - 99847.968192920773, - 99871.670271313182, - 99895.373756065004, - 99919.078647009388, - 99942.78494397951, - 99966.492646808634, - 99990.20175533001, - 100013.91226937699, - 100037.62418878295, - 100061.33751338134, - 100085.05224300563, - 100108.76837748935, - 100132.4859166661, - 100156.2048603695, - 100179.92520843323, - 100203.64696069101, - 100227.37011697664, - 100251.09467712394, - 100274.82064096678, - 100298.54800833909, - 100322.27677907483, - 100346.00695300807, - 100369.73852997283, - 100393.47150980328, - 100417.20589233354, - 100440.94167739789, - 100464.67886483055, - 100488.41745446586, - 100512.1574461382, - 100535.89883968196, - 100559.64163493161, - 100583.38583172169, - 100607.13142988674, - 100630.87842926137, - 100654.62682968024, - 100678.37663097809, - 100702.12783298964, - 100725.88043554971, - 100749.63443849317, - 100773.38984165489, - 100797.14664486986, - 100820.90484797307, - 100844.66445079957, - 100868.42545318443, - 100892.18785496285, - 100915.95165596998, - 100939.71685604109, - 100963.48345501146, - 100987.25145271645, - 101011.02084899142, - 101034.79164367182, - 101058.56383659317, - 101082.33742759094, - 101106.11241650078, - 101129.88880315828, - 101153.66658739912, - 101177.44576905905, - 101201.22634797383, - 101225.00832397929, - 101248.7916969113, - 101272.57646660579, - 101296.36263289873, - 101320.15019562612, - 101343.93915462404, - 101367.7295097286, - 101391.52126077596, - 101415.31440760233, - 101439.10895004397, - 101462.9048879372, - 101486.70222111834, - 101510.50094942382, - 101534.30107269008, - 101558.10259075361, - 101581.90550345098, - 101605.70981061876, - 101629.5155120936, - 101653.32260771218, - 101677.13109731126, - 101700.9409807276, - 101724.75225779804, - 101748.56492835947, - 101772.37899224881, - 101796.19444930303, - 101820.01129935916, - 101843.82954225427, - 101867.64917782549, - 101891.47020590997, - 101915.29262634492, - 101939.11643896763, - 101962.94164361537, - 101986.76824012553, - 102010.59622833549, - 102034.42560808272, - 102058.25637920471, - 102082.08854153901, - 102105.9220949232, - 102129.75703919494, - 102153.59337419191, - 102177.43109975185, - 102201.27021571253, - 102225.1107219118, - 102248.95261818753, - 102272.79590437764, - 102296.64058032009, - 102320.48664585294, - 102344.33410081422, - 102368.18294504205, - 102392.03317837461, - 102415.88480065008, - 102439.73781170673, - 102463.59221138287, - 102487.44799951684, - 102511.30517594704, - 102535.1637405119, - 102559.02369304992, - 102582.88503339965, - 102606.74776139967, - 102630.61187688859, - 102654.4773797051, - 102678.34426968795, - 102702.21254667587, - 102726.08221050771, - 102749.95326102231, - 102773.8256980586, - 102797.69952145554, - 102821.57473105213, - 102845.45132668741, - 102869.32930820051, - 102893.20867543056, - 102917.08942821674, - 102940.97156639832, - 102964.85508981455, - 102988.73999830478, - 103012.6262917084, - 103036.51396986481, - 103060.40303261351, - 103084.293479794, - 103108.18531124585, - 103132.07852680866, - 103155.97312632212, - 103179.8691096259, - 103203.76647655977, - 103227.66522696352, - 103251.56536067701, - 103275.46687754011, - 103299.36977739276, - 103323.27406007495, - 103347.1797254267, - 103371.0867732881, - 103394.99520349925, - 103418.90501590034, - 103442.81621033157, - 103466.72878663319, - 103490.64274464553, - 103514.55808420894, - 103538.4748051638, - 103562.39290735057, - 103586.31239060973, - 103610.23325478184, - 103634.15549970744, - 103658.07912522719, - 103682.00413118176, - 103705.93051741188, - 103729.85828375829, - 103753.78743006183, - 103777.71795616332, - 103801.64986190372, - 103825.58314712394, - 103849.51781166498, - 103873.4538553679, - 103897.39127807376, - 103921.33007962372, - 103945.27025985894, - 103969.21181862066, - 103993.15475575015, - 104017.0990710887, - 104041.0447644777, - 104064.99183575854, - 104088.94028477269, - 104112.89011136163, - 104136.84131536692, - 104160.79389663014, - 104184.74785499295, - 104208.70319029699, - 104232.65990238401, - 104256.61799109577, - 104280.57745627411, - 104304.53829776087, - 104328.50051539797, - 104352.46410902737, - 104376.42907849104, - 104400.39542363105, - 104424.36314428948, - 104448.33224030846, - 104472.3027115302, - 104496.27455779689, - 104520.24777895081, - 104544.22237483428, - 104568.19834528965, - 104592.17569015936, - 104616.15440928582, - 104640.13450251156, - 104664.1159696791, - 104688.09881063103, - 104712.08302520998, - 104736.06861325864, - 104760.05557461972, - 104784.043909136, - 104808.03361665027, - 104832.0246970054, - 104856.01715004431, - 104880.01097560991, - 104904.00617354522, - 104928.00274369326, - 104952.00068589712, - 104975.99999999993, - 105000.00068584486, - 105024.00274327511, - 105048.00617213396, - 105072.0109722647, - 105096.0171435107, - 105120.02468571534, - 105144.03359872208, - 105168.04388237436, - 105192.05553651576, - 105216.06856098982, - 105240.08295564017, - 105264.09872031047, - 105288.11585484444, - 105312.13435908582, - 105336.1542328784, - 105360.17547606604, - 105384.19808849262, - 105408.22207000206, - 105432.24742043833, - 105456.27413964548, - 105480.30222746753, - 105504.33168374863, - 105528.36250833291, - 105552.39470106458, - 105576.42826178786, - 105600.46319034706, - 105624.49948658649, - 105648.53715035053, - 105672.5761814836, - 105696.61657983017, - 105720.65834523473, - 105744.70147754184, - 105768.7459765961, - 105792.79184224214, - 105816.83907432464, - 105840.88767268835, - 105864.93763717801, - 105888.98896763846, - 105913.04166391456, - 105937.09572585119, - 105961.15115329332, - 105985.20794608595, - 106009.26610407409, - 106033.32562710284, - 106057.38651501729, - 106081.44876766266, - 106105.51238488412, - 106129.57736652695, - 106153.64371243643, - 106177.71142245791, - 106201.78049643678, - 106225.85093421848, - 106249.92273564848, - 106273.99590057228, - 106298.07042883546, - 106322.14632028362, - 106346.22357476239, - 106370.30219211751, - 106394.38217219469, - 106418.46351483969, - 106442.54621989837, - 106466.63028721658, - 106490.71571664025, - 106514.80250801529, - 106538.89066118775, - 106562.98017600364, - 106587.07105230905, - 106611.16328995011, - 106635.25688877302, - 106659.35184862395, - 106683.44816934918, - 106707.54585079502, - 106731.64489280782, - 106755.74529523395, - 106779.84705791986, - 106803.95018071201, - 106828.05466345693, - 106852.16050600118, - 106876.26770819137, - 106900.37626987413, - 106924.48619089619, - 106948.59747110425, - 106972.71011034511, - 106996.82410846559, - 107020.93946531253, - 107045.05618073288, - 107069.17425457356, - 107093.29368668159, - 107117.41447690397, - 107141.53662508781, - 107165.66013108024, - 107189.7849947284, - 107213.91121587952, - 107238.03879438085, - 107262.16773007967, - 107286.29802282334, - 107310.42967245923, - 107334.56267883476, - 107358.69704179741, - 107382.83276119467, - 107406.96983687414, - 107431.10826868335, - 107455.24805646999, - 107479.38920008171, - 107503.53169936626, - 107527.67555417139, - 107551.82076434491, - 107575.96732973469, - 107600.11525018861, - 107624.26452555459, - 107648.41515568066, - 107672.56714041479, - 107696.72047960508, - 107720.87517309963, - 107745.03122074658, - 107769.18862239413, - 107793.34737789053, - 107817.50748708403, - 107841.66894982298, - 107865.83176595572, - 107889.99593533068, - 107914.16145779629, - 107938.32833320105, - 107962.49656139348, - 107986.66614222217, - 108010.83707553572, - 108035.00936118282, - 108059.18299901215, - 108083.35798887245, - 108107.53433061253, - 108131.71202408121, - 108155.89106912735, - 108180.07146559987, - 108204.25321334775, - 108228.43631221994, - 108252.62076206553, - 108276.80656273357, - 108300.99371407321, - 108325.18221593359, - 108349.37206816394, - 108373.56327061349, - 108397.75582313156, - 108421.94972556747, - 108446.1449777706, - 108470.34157959036, - 108494.53953087622, - 108518.73883147769, - 108542.93948124432, - 108567.14148002568, - 108591.34482767139, - 108615.54952403114, - 108639.75556895464, - 108663.96296229165, - 108688.17170389196, - 108712.38179360541, - 108736.59323128188, - 108760.80601677128, - 108785.02014992358, - 108809.23563058881, - 108833.45245861699, - 108857.67063385822, - 108881.89015616261, - 108906.11102538036, - 108930.33324136167, - 108954.55680395682, - 108978.78171301607, - 109003.00796838976, - 109027.23556992831, - 109051.46451748211, - 109075.69481090162, - 109099.92645003737, - 109124.15943473989, - 109148.39376485976, - 109172.62944024763, - 109196.86646075416, - 109221.10482623006, - 109245.34453652608, - 109269.58559149304, - 109293.82799098175, - 109318.07173484311, - 109342.31682292801, - 109366.56325508743, - 109390.81103117237, - 109415.06015103387, - 109439.31061452301, - 109463.56242149093, - 109487.8155717888, - 109512.07006526781, - 109536.3259017792, - 109560.58308117429, - 109584.8416033044, - 109609.1014680209, - 109633.36267517522, - 109657.62522461878, - 109681.88911620311, - 109706.15434977971, - 109730.4209252002, - 109754.68884231619, - 109778.95810097932, - 109803.22870104131, - 109827.50064235389, - 109851.77392476884, - 109876.04854813802, - 109900.32451231324, - 109924.60181714644, - 109948.88046248957, - 109973.1604481946, - 109997.44177411357, - 110021.72444009855, - 110046.00844600165, - 110070.29379167501, - 110094.58047697082, - 110118.86850174134, - 110143.15786583882, - 110167.44856911557, - 110191.74061142397, - 110216.03399261639, - 110240.32871254528, - 110264.62477106311, - 110288.9221680224, - 110313.22090327571, - 110337.52097667565, - 110361.82238807483, - 110386.12513732594, - 110410.42922428172, - 110434.73464879491, - 110459.04141071832, - 110483.34950990479, - 110507.6589462072, - 110531.96971947847, - 110556.28182957157, - 110580.5952763395, - 110604.91005963532, - 110629.22617931209, - 110653.54363522294, - 110677.86242722106, - 110702.18255515963, - 110726.50401889188, - 110750.82681827113, - 110775.1509531507, - 110799.47642338395, - 110823.80322882428, - 110848.13136932514, - 110872.46084474004, - 110896.79165492248, - 110921.12379972603, - 110945.4572790043, - 110969.79209261097, - 110994.12824039967, - 111018.46572222417, - 111042.80453793822, - 111067.14468739564, - 111091.48617045028, - 111115.82898695602, - 111140.1731367668, - 111164.51861973655, - 111188.86543571933, - 111213.21358456917, - 111237.56306614014, - 111261.91388028639, - 111286.26602686207, - 111310.61950572141, - 111334.97431671864, - 111359.33045970804, - 111383.68793454397, - 111408.04674108078, - 111432.40687917286, - 111456.76834867468, - 111481.13114944073, - 111505.49528132551, - 111529.86074418361, - 111554.22753786964, - 111578.59566223821, - 111602.96511714405, - 111627.33590244185, - 111651.7080179864, - 111676.08146363248, - 111700.45623923496, - 111724.8323446487, - 111749.20977972864, - 111773.58854432974, - 111797.96863830699, - 111822.35006151545, - 111846.73281381019, - 111871.11689504632, - 111895.50230507903, - 111919.8890437635, - 111944.27711095495, - 111968.6665065087, - 111993.05723028004, - 112017.44928212435, - 112041.842661897, - 112066.23736945343, - 112090.63340464912, - 112115.03076733962, - 112139.42945738042, - 112163.82947462716, - 112188.23081893545, - 112212.63349016097, - 112237.03748815943, - 112261.44281278658, - 112285.84946389822, - 112310.25744135017, - 112334.66674499828, - 112359.07737469849, - 112383.48933030672, - 112407.90261167898, - 112432.31721867126, - 112456.73315113965, - 112481.15040894024, - 112505.56899192919, - 112529.98889996267, - 112554.41013289688, - 112578.8326905881, - 112603.25657289263, - 112627.68177966679, - 112652.10831076698, - 112676.53616604958, - 112700.96534537108, - 112725.39584858794, - 112749.82767555672, - 112774.26082613398, - 112798.6953001763, - 112823.13109754038, - 112847.56821808286, - 112872.00666166049, - 112896.44642813003, - 112920.88751734827, - 112945.32992917208, - 112969.77366345831, - 112994.21872006389, - 113018.66509884578, - 113043.11279966099, - 113067.56182236652, - 113092.01216681948, - 113116.46383287695, - 113140.9168203961, - 113165.37112923413, - 113189.82675924824, - 113214.28371029573, - 113238.74198223387, - 113263.20157492002, - 113287.66248821157, - 113312.12472196593, - 113336.58827604055, - 113361.05315029295, - 113385.51934458067, - 113409.98685876124, - 113434.45569269233, - 113458.92584623155, - 113483.39731923661, - 113507.87011156522, - 113532.34422307517, - 113556.81965362425, - 113581.2964030703, - 113605.77447127122, - 113630.25385808491, - 113654.73456336933, - 113679.2165869825, - 113703.69992878241, - 113728.18458862718, - 113752.67056637487, - 113777.15786188368, - 113801.64647501177, - 113826.13640561736, - 113850.62765355874, - 113875.12021869418, - 113899.61410088204, - 113924.1092999807, - 113948.60581584855, - 113973.10364834407, - 113997.60279732574, - 114022.1032626521, - 114046.60504418171, - 114071.10814177318, - 114095.61255528514, - 114120.11828457628, - 114144.62532950533, - 114169.13368993104, - 114193.6433657122, - 114218.15435670764, - 114242.66666277625, - 114267.18028377694, - 114291.69521956862, - 114316.21147001031, - 114340.72903496103, - 114365.24791427983, - 114389.7681078258, - 114414.2896154581, - 114438.81243703589, - 114463.33657241837, - 114487.8620214648, - 114512.38878403447, - 114536.91685998671, - 114561.44624918087, - 114585.97695147636, - 114610.5089667326, - 114635.04229480909, - 114659.57693556532, - 114684.11288886084, - 114708.65015455526, - 114733.18873250818, - 114757.72862257928, - 114782.26982462825, - 114806.81233851484, - 114831.35616409882, - 114855.90130123998, - 114880.44774979822, - 114904.99550963337, - 114929.5445806054, - 114954.09496257425, - 114978.64665539992, - 115003.19965894247, - 115027.75397306195, - 115052.30959761847, - 115076.86653247218, - 115101.42477748329, - 115125.984332512, - 115150.54519741859, - 115175.10737206334, - 115199.67085630659, - 115224.23565000873, - 115248.80175303014, - 115273.3691652313, - 115297.93788647266, - 115322.50791661476, - 115347.07925551817, - 115371.65190304347, - 115396.22585905129, - 115420.80112340231, - 115445.37769595724, - 115469.95557657682, - 115494.53476512182, - 115519.11526145306, - 115543.69706543141, - 115568.28017691776, - 115592.86459577303, - 115617.4503218582, - 115642.03735503425, - 115666.62569516223, - 115691.21534210323, - 115715.80629571836, - 115740.39855586876, - 115764.99212241563, - 115789.58699522018, - 115814.18317414368, - 115838.78065904744, - 115863.37944979276, - 115887.97954624105, - 115912.5809482537, - 115937.18365569216, - 115961.78766841792, - 115986.39298629249, - 116010.99960917742, - 116035.60753693432, - 116060.21676942479, - 116084.82730651053, - 116109.43914805322, - 116134.0522939146, - 116158.66674395646, - 116183.2824980406, - 116207.89955602887, - 116232.51791778316, - 116257.13758316539, - 116281.75855203751, - 116306.38082426153, - 116331.00439969949, - 116355.62927821343, - 116380.25545966547, - 116404.88294391775, - 116429.51173083246, - 116454.14182027178, - 116478.77321209799, - 116503.40590617337, - 116528.03990236025, - 116552.67520052097, - 116577.31180051794, - 116601.94970221359, - 116626.5889054704, - 116651.22941015086, - 116675.87121611751, - 116700.51432323294, - 116725.15873135976, - 116749.8044403606, - 116774.45145009817, - 116799.0997604352, - 116823.74937123443, - 116848.40028235866, - 116873.05249367072, - 116897.70600503348, - 116922.36081630984, - 116947.01692736275, - 116971.67433805518, - 116996.33304825013, - 117020.99305781067, - 117045.65436659988, - 117070.31697448085, - 117094.98088131678, - 117119.64608697082, - 117144.31259130624, - 117168.98039418629, - 117193.64949547425, - 117218.31989503348, - 117242.99159272734, - 117267.66458841923, - 117292.33888197262, - 117317.01447325097, - 117341.6913621178, - 117366.36954843666, - 117391.04903207115, - 117415.72981288488, - 117440.41189074152, - 117465.09526550474, - 117489.77993703831, - 117514.46590520597, - 117539.15316987153, - 117563.84173089883, - 117588.53158815173, - 117613.22274149416, - 117637.91519079007, - 117662.60893590341, - 117687.30397669821, - 117712.00031303853, - 117736.69794478847, - 117761.39687181212, - 117786.09709397367, - 117810.7986111373, - 117835.50142316725, - 117860.20552992777, - 117884.91093128319, - 117909.6176270978, - 117934.32561723603, - 117959.03490156225, - 117983.74547994092, - 118008.45735223651, - 118033.17051831353, - 118057.88497803656, - 118082.60073127014, - 118107.31777787894, - 118132.03611772758, - 118156.75575068076, - 118181.47667660323, - 118206.19889535972, - 118230.92240681504, - 118255.64721083404, - 118280.37330728157, - 118305.10069602253, - 118329.82937692189, - 118354.55934984458, - 118379.29061465565, - 118404.02317122012, - 118428.75701940308, - 118453.49215906965, - 118478.22859008498, - 118502.96631231424, - 118527.70532562268, - 118552.44562987552, - 118577.18722493808, - 118601.93011067568, - 118626.67428695368, - 118651.41975363747, - 118676.16651059251, - 118700.91455768423, - 118725.66389477813, - 118750.41452173979, - 118775.16643843475, - 118799.91964472862, - 118824.67414048707, - 118849.42992557574, - 118874.18699986035, - 118898.94536320666, - 118923.70501548045, - 118948.46595654752, - 118973.22818627374, - 118997.99170452499, - 119022.7565111672, - 119047.52260606633, - 119072.28998908834, - 119097.0586600993, - 119121.82861896523, - 119146.59986555226, - 119171.3723997265, - 119196.14622135412, - 119220.92133030134, - 119245.69772643436, - 119270.47540961947, - 119295.25437972297, - 119320.03463661121, - 119344.81618015055, - 119369.5990102074, - 119394.38312664822, - 119419.16852933947, - 119443.95521814766, - 119468.74319293935, - 119493.53245358112, - 119518.32299993958, - 119543.11483188139, - 119567.90794927324, - 119592.70235198183, - 119617.49803987393, - 119642.29501281632, - 119667.09327067583, - 119691.89281331931, - 119716.69364061367, - 119741.49575242582, - 119766.29914862274, - 119791.10382907141, - 119815.90979363887, - 119840.71704219218, - 119865.52557459843, - 119890.33539072477, - 119915.14649043836, - 119939.95887360642, - 119964.77254009615, - 119989.58748977486, - 120014.40372250983, - 120039.22123816841, - 120064.04003661797, - 120088.86011772591, - 120113.6814813597, - 120138.5041273868, - 120163.3280556747, - 120188.15326609099, - 120212.97975850321, - 120237.807532779, - 120262.63658878599, - 120287.46692639188, - 120312.29854546436, - 120337.13144587121, - 120361.9656274802, - 120386.80109015915, - 120411.63783377589, - 120436.47585819835, - 120461.31516329442, - 120486.15574893207, - 120510.99761497928, - 120535.84076130406, - 120560.68518777451, - 120585.53089425867, - 120610.3778806247, - 120635.22614674074, - 120660.07569247499, - 120684.92651769568, - 120709.77862227106, - 120734.63200606944, - 120759.48666895913, - 120784.3426108085, - 120809.19983148595, - 120834.05833085992, - 120858.91810879884, - 120883.77916517125, - 120908.64149984565, - 120933.5051126906, - 120958.37000357473, - 120983.23617236665, - 121008.10361893504, - 121032.97234314861, - 121057.84234487606, - 121082.71362398617, - 121107.58618034775, - 121132.46001382964, - 121157.33512430069, - 121182.21151162982, - 121207.08917568595, - 121231.96811633807, - 121256.84833345517, - 121281.72982690629, - 121306.61259656049, - 121331.49664228689, - 121356.38196395461, - 121381.26856143285, - 121406.15643459078, - 121431.04558329767, - 121455.93600742276, - 121480.82770683538, - 121505.72068140487, - 121530.61493100057, - 121555.51045549192, - 121580.40725474835, - 121605.30532863933, - 121630.20467703436, - 121655.10529980299, - 121680.00719681478, - 121704.91036793934, - 121729.81481304632, - 121754.72053200539, - 121779.62752468624, - 121804.53579095862, - 121829.44533069231, - 121854.3561437571, - 121879.26823002285, - 121904.1815893594, - 121929.09622163669, - 121954.01212672464, - 121978.92930449323, - 122003.84775481246, - 122028.76747755238, - 122053.68847258303, - 122078.61073977455, - 122103.53427899707, - 122128.45909012076, - 122153.38517301581, - 122178.31252755247, - 122203.24115360099, - 122228.17105103172, - 122253.10221971494, - 122278.03465952107, - 122302.96837032049, - 122327.90335198362, - 122352.83960438096, - 122377.777127383, - 122402.71592086025, - 122427.65598468333, - 122452.59731872278, - 122477.53992284928, - 122502.48379693348, - 122527.42894084606, - 122552.37535445779, - 122577.32303763942, - 122602.27199026172, - 122627.22221219557, - 122652.17370331181, - 122677.12646348133, - 122702.08049257506, - 122727.03579046397, - 122751.99235701906, - 122776.95019211136, - 122801.9092956119, - 122826.8696673918, - 122851.83130732219, - 122876.79421527422, - 122901.75839111909, - 122926.72383472799, - 122951.69054597223, - 122976.65852472307, - 123001.62777085182, - 123026.59828422987, - 123051.57006472857, - 123076.54311221937, - 123101.5174265737, - 123126.49300766307, - 123151.46985535898, - 123176.44796953299, - 123201.42735005668, - 123226.40799680166, - 123251.38990963959, - 123276.37308844214, - 123301.35753308103, - 123326.343243428, - 123351.33021935483, - 123376.31846073334, - 123401.30796743535, - 123426.29873933276, - 123451.29077629748, - 123476.28407820144, - 123501.2786449166, - 123526.27447631498, - 123551.27157226863, - 123576.26993264959, - 123601.26955732999, - 123626.27044618195, - 123651.27259907764, - 123676.27601588926, - 123701.28069648903, - 123726.28664074924, - 123751.29384854218, - 123776.30231974016, - 123801.31205421555, - 123826.32305184075, - 123851.33531248817, - 123876.34883603029, - 123901.36362233957, - 123926.37967128855, - 123951.39698274979, - 123976.41555659588, - 124001.43539269941, - 124026.45649093305, - 124051.47885116948, - 124076.50247328142, - 124101.5273571416, - 124126.55350262282, - 124151.58090959788, - 124176.60957793961, - 124201.63950752091, - 124226.67069821467, - 124251.70314989384, - 124276.73686243138, - 124301.7718357003, - 124326.80806957364, - 124351.84556392446, - 124376.88431862585, - 124401.92433355095, - 124426.96560857294, - 124452.00814356498, - 124477.05193840031, - 124502.0969929522, - 124527.14330709392, - 124552.19088069882, - 124577.23971364023, - 124602.28980579154, - 124627.34115702618, - 124652.3937672176, - 124677.44763623926, - 124702.50276396469, - 124727.55915026742, - 124752.61679502104, - 124777.67569809916, - 124802.73585937542, - 124827.79727872348, - 124852.85995601704, - 124877.92389112986, - 124902.98908393568, - 124928.05553430831, - 124953.1232421216, - 124978.19220724938, - 125003.26242956554, - 125028.33390894404, - 125053.40664525882, - 125078.48063838384, - 125103.55588819318, - 125128.63239456083, - 125153.71015736091, - 125178.78917646752, - 125203.86945175481, - 125228.95098309696, - 125254.03377036817, - 125279.1178134427, - 125304.20311219479, - 125329.28966649878, - 125354.37747622898, - 125379.46654125977, - 125404.55686146552, - 125429.6484367207, - 125454.74126689974, - 125479.83535187715, - 125504.93069152744, - 125530.02728572517, - 125555.12513434493, - 125580.22423726133, - 125605.32459434902, - 125630.4262054827, - 125655.52907053704, - 125680.63318938682, - 125705.73856190679, - 125730.84518797178, - 125755.9530674566, - 125781.06220023613, - 125806.17258618528, - 125831.28422517896, - 125856.39711709213, - 125881.51126179981, - 125906.62665917698, - 125931.74330909875, - 125956.86121144016, - 125981.98036607634, - 126007.10077288245, - 126032.22243173365, - 126057.34534250517, - 126082.46950507225, - 126107.59491931014, - 126132.72158509417, - 126157.84950229966, - 126182.97867080198, - 126208.10909047653, - 126233.24076119871, - 126258.37368284403, - 126283.50785528794, - 126308.64327840599, - 126333.77995207369, - 126358.91787616667, - 126384.0570505605, - 126409.19747513086, - 126434.3391497534, - 126459.48207430386, - 126484.62624865794, - 126509.77167269142, - 126534.9183462801, - 126560.06626929982, - 126585.21544162642, - 126610.36586313581, - 126635.51753370393, - 126660.67045320668, - 126685.82462152008, - 126710.98003852014, - 126736.13670408291, - 126761.29461808444, - 126786.45378040087, - 126811.61419090834, - 126836.77584948298, - 126861.93875600102, - 126887.10291033868, - 126912.26831237224, - 126937.43496197795, - 126962.60285903217, - 126987.77200341123, - 127012.94239499152, - 127038.11403364947, - 127063.2869192615, - 127088.46105170409, - 127113.63643085376, - 127138.81305658702, - 127163.99092878048, - 127189.17004731069, - 127214.35041205429, - 127239.53202288797, - 127264.71487968838, - 127289.89898233226, - 127315.08433069635, - 127340.27092465744, - 127365.45876409234, - 127390.64784887788, - 127415.83817889093, - 127441.02975400841, - 127466.22257410725, - 127491.41663906439, - 127516.61194875685, - 127541.80850306165, - 127567.00630185583, - 127592.20534501647, - 127617.4056324207, - 127642.60716394568, - 127667.80993946856, - 127693.01395886653, - 127718.21922201688, - 127743.42572879682, - 127768.63347908368, - 127793.84247275478, - 127819.05270968749, - 127844.26418975917, - 127869.47691284724, - 127894.69087882918, - 127919.90608758242, - 127945.12253898452, - 127970.34023291297, - 127995.55916924537, - 128020.77934785932, - 128046.00076863244, - 128071.22343144237, - 128096.44733616684, - 128121.67248268353, - 128146.89887087021, - 128172.12650060465, - 128197.35537176467, - 128222.5854842281, - 128247.81683787282, - 128273.04943257671, - 128298.28326821771, - 128323.51834467379, - 128348.75466182294, - 128373.99221954317, - 128399.23101771252, - 128424.47105620909, - 128449.71233491098, - 128474.95485369631, - 128500.19861244329, - 128525.44361103009, - 128550.68984933494, - 128575.93732723613, - 128601.18604461191, - 128626.43600134061, - 128651.68719730059, - 128676.93963237021, - 128702.1933064279, - 128727.44821935208, - 128752.70437102125, - 128777.96176131385, - 128803.22039010846, - 128828.48025728362, - 128853.74136271792, - 128879.00370628996, - 128904.26728787841, - 128929.53210736193, - 128954.79816461923, - 128980.06545952905, - 129005.33399197015, - 129030.60376182134, - 129055.87476896142, - 129081.14701326926, - 129106.42049462376, - 129131.6952129038, - 129156.97116798835, - 129182.24835975636, - 129207.52678808685, - 129232.80645285884, - 129258.08735395141, - 129283.36949124365, - 129308.65286461466, - 129333.9374739436, - 129359.22331910966, - 129384.51039999202, - 129409.79871646997, - 129435.08826842274, - 129460.37905572963, - 129485.67107826998, - 129510.96433592314, - 129536.25882856851, - 129561.55455608548, - 129586.85151835352, - 129612.14971525209, - 129637.4491466607, - 129662.74981245887, - 129688.0517125262, - 129713.35484674224, - 129738.65921498663, - 129763.96481713903, - 129789.27165307909, - 129814.57972268655, - 129839.88902584116, - 129865.19956242264, - 129890.51133231082, - 129915.82433538554, - 129941.13857152662, - 129966.45404061397, - 129991.7707425275, - 130017.08867714716, - 130042.4078443529, - 130067.72824402474, - 130093.04987604271, - 130118.37274028687, - 130143.69683663732, - 130169.02216497416, - 130194.34872517755, - 130219.67651712766, - 130245.0055407047, - 130270.33579578891, - 130295.66728226055, - 130320.99999999991, - 130346.33394888733, - 130371.66912880314, - 130397.00553962773, - 130422.34318124152, - 130447.68205352494, - 130473.02215635845, - 130498.36348962256, - 130523.70605319779, - 130549.0498469647, - 130574.39487080388, - 130599.74112459592, - 130625.08860822149, - 130650.43732156123, - 130675.78726449587, - 130701.13843690613, - 130726.49083867275, - 130751.84446967654, - 130777.19932979831, - 130802.5554189189, - 130827.91273691918, - 130853.27128368006, - 130878.63105908247, - 130903.99206300738, - 130929.35429533575, - 130954.71775594862, - 130980.08244472703, - 131005.44836155206, - 131030.81550630482, - 131056.18387886642, - 131081.55347911804, - 131106.92430694087, - 131132.29636221612, - 131157.66964482504, - 131183.0441546489, - 131208.41989156904, - 131233.79685546676, - 131259.17504622342, - 131284.55446372041, - 131309.93510783918, - 131335.31697846117, - 131360.70007546784, - 131386.0843987407, - 131411.46994816128, - 131436.85672361116, - 131462.24472497194, - 131487.63395212521, - 131513.02440495262, - 131538.41608333588, - 131563.80898715663, - 131589.2031162967, - 131614.59847063778, - 131639.9950500617, - 131665.39285445024, - 131690.79188368531, - 131716.19213764873, - 131741.59361622241, - 131766.99631928833, - 131792.40024672839, - 131817.80539842462, - 131843.21177425905, - 131868.61937411371, - 131894.02819787065, - 131919.43824541202, - 131944.84951661993, - 131970.26201137656, - 131995.67572956407, - 132021.09067106468, - 132046.50683576067, - 132071.9242235343, - 132097.34283426782, - 132122.76266784366, - 132148.1837241441, - 132173.60600305157, - 132199.02950444847, - 132224.45422821722, - 132249.88017424036, - 132275.30734240031, - 132300.73573257966, - 132326.16534466096, - 132351.59617852676, - 132377.02823405969, - 132402.46151114244, - 132427.89600965759, - 132453.33172948789, - 132478.76867051609, - 132504.20683262491, - 132529.64621569714, - 132555.08681961559, - 132580.5286442631, - 132605.97168952253, - 132631.41595527678, - 132656.86144140881, - 132682.30814780149, - 132707.75607433787, - 132733.20522090094, - 132758.65558737374, - 132784.10717363929, - 132809.55997958075, - 132835.01400508118, - 132860.46925002377, - 132885.92571429166, - 132911.38339776811, - 132936.84230033628, - 132962.30242187946, - 132987.76376228096, - 133013.22632142407, - 133038.69009919214, - 133064.15509546854, - 133089.62131013666, - 133115.08874307995, - 133140.55739418184, - 133166.02726332581, - 133191.49835039541, - 133216.97065527414, - 133242.44417784561, - 133267.91891799335, - 133293.39487560102, - 133318.87205055228, - 133344.35044273079, - 133369.83005202023, - 133395.31087830439, - 133420.79292146701, - 133446.27618139185, - 133471.76065796276, - 133497.24635106357, - 133522.73326057816, - 133548.22138639039, - 133573.71072838426, - 133599.20128644365, - 133624.69306045261, - 133650.1860502951, - 133675.68025585517, - 133701.1756770169, - 133726.67231366437, - 133752.17016568172, - 133777.66923295305, - 133803.16951536259, - 133828.67101279454, - 133854.17372513309, - 133879.67765226253, - 133905.18279406714, - 133930.68915043125, - 133956.19672123916, - 133981.70550637526, - 134007.21550572399, - 134032.7267191697, - 134058.23914659687, - 134083.75278789, - 134109.26764293358, - 134134.78371161217, - 134160.30099381026, - 134185.8194894125, - 134211.33919830353, - 134236.8601203679, - 134262.38225549037, - 134287.90560355558, - 134313.43016444831, - 134338.95593805326, - 134364.48292425525, - 134390.01112293909, - 134415.54053398955, - 134441.07115729159, - 134466.60299273001, - 134492.1360401898, - 134517.67029955584, - 134543.20577071316, - 134568.74245354676, - 134594.28034794159, - 134619.81945378278, - 134645.35977095537, - 134670.90129934452, - 134696.4440388353, - 134721.98798931291, - 134747.53315066252, - 134773.07952276937, - 134798.62710551871, - 134824.17589879577, - 134849.72590248589, - 134875.27711647438, - 134900.82954064661, - 134926.38317488792, - 134951.93801908373, - 134977.49407311951, - 135003.05133688069, - 135028.60981025276, - 135054.16949312127, - 135079.73038537172, - 135105.29248688967, - 135130.85579756077, - 135156.42031727062, - 135181.98604590484, - 135207.55298334916, - 135233.12112948924, - 135258.69048421088, - 135284.26104739975, - 135309.83281894168, - 135335.4057987225, - 135360.97998662802, - 135386.55538254412, - 135412.13198635669, - 135437.70979795168, - 135463.28881721498, - 135488.86904403262, - 135514.45047829056, - 135540.03311987486, - 135565.61696867159, - 135591.20202456677, - 135616.78828744654, - 135642.37575719706, - 135667.96443370447, - 135693.55431685498, - 135719.14540653475, - 135744.73770263011, - 135770.33120502727, - 135795.92591361253, - 135821.52182827223, - 135847.11894889272, - 135872.7172753604, - 135898.31680756161, - 135923.91754538284, - 135949.51948871053, - 135975.12263743114, - 136000.72699143123, - 136026.33255059729, - 136051.93931481591, - 136077.54728397369, - 136103.15645795723, - 136128.76683665317, - 136154.37841994822, - 136179.99120772901, - 136205.60519988232, - 136231.2203962949, - 136256.83679685349, - 136282.45440144493, - 136308.07320995603, - 136333.69322227367, - 136359.31443828469, - 136384.93685787608, - 136410.56048093468, - 136436.18530734754, - 136461.81133700156, - 136487.43856978384, - 136513.06700558143, - 136538.6966442813, - 136564.32748577066, - 136589.95952993655, - 136615.59277666616, - 136641.22722584667, - 136666.86287736523, - 136692.49973110916, - 136718.13778696564, - 136743.77704482197, - 136769.41750456547, - 136795.05916608346, - 136820.70202926331, - 136846.34609399244, - 136871.99136015819, - 136897.63782764805, - 136923.28549634948, - 136948.93436614997, - 136974.58443693706, - 137000.23570859825, - 137025.88818102115, - 137051.54185409332, - 137077.19672770242, - 137102.85280173609, - 137128.51007608202, - 137154.16855062786, - 137179.82822526142, - 137205.48909987041, - 137231.15117434258, - 137256.8144485658, - 137282.47892242789, - 137308.14459581667, - 137333.81146862009, - 137359.47954072602, - 137385.14881202241, - 137410.81928239719, - 137436.49095173844, - 137462.16381993407, - 137487.83788687221, - 137513.51315244089, - 137539.18961652822, - 137564.86727902229, - 137590.54613981131, - 137616.22619878338, - 137641.90745582676, - 137667.58991082967, - 137693.27356368033, - 137718.95841426702, - 137744.64446247809, - 137770.33170820182, - 137796.02015132661, - 137821.70979174081, - 137847.40062933284, - 137873.09266399115, - 137898.78589560417, - 137924.48032406042, - 137950.17594924837, - 137975.8727710566, - 138001.57078937365, - 138027.27000408815, - 138052.97041508864, - 138078.67202226384, - 138104.3748255024, - 138130.07882469296, - 138155.78401972432, - 138181.49041048516, - 138207.1979968643, - 138232.9067787505, - 138258.61675603263, - 138284.32792859949, - 138310.04029633995, - 138335.75385914298, - 138361.46861689744, - 138387.18456949232, - 138412.90171681659, - 138438.62005875923, - 138464.33959520931, - 138490.06032605586, - 138515.78225118798, - 138541.50537049473, - 138567.2296838653, - 138592.95519118884, - 138618.68189235451, - 138644.40978725153, - 138670.13887576913, - 138695.86915779658, - 138721.60063322316, - 138747.33330193823, - 138773.06716383106, - 138798.80221879104, - 138824.53846670757, - 138850.27590747006, - 138876.01454096794, - 138901.7543670907, - 138927.49538572782, - 138953.2375967688, - 138978.9810001032, - 139004.72559562061, - 139030.47138321059, - 139056.2183627628, - 139081.96653416683, - 139107.71589731239, - 139133.46645208917, - 139159.21819838689, - 139184.97113609532, - 139210.72526510421, - 139236.48058530336, - 139262.23709658257, - 139287.99479883176, - 139313.75369194071, - 139339.51377579942, - 139365.27505029776, - 139391.03751532568, - 139416.80117077316, - 139442.56601653024, - 139468.33205248689, - 139494.09927853322, - 139519.86769455927, - 139545.63730045516, - 139571.408096111, - 139597.18008141697, - 139622.95325626322, - 139648.72762054001, - 139674.5031741375, - 139700.27991694602, - 139726.05784885579, - 139751.83696975713, - 139777.61727954043, - 139803.39877809596, - 139829.18146531415, - 139854.96534108539, - 139880.75040530015, - 139906.53665784886, - 139932.32409862199, - 139958.11272751007, - 139983.90254440365, - 140009.69354919327, - 140035.48574176949, - 140061.27912202294, - 140087.07368984428, - 140112.86944512415, - 140138.66638775321, - 140164.4645176222, - 140190.26383462184, - 140216.06433864293, - 140241.86602957622, - 140267.66890731253, - 140293.47297174268, - 140319.27822275754, - 140345.08466024802, - 140370.89228410498, - 140396.70109421943, - 140422.51109048226, - 140448.32227278448, - 140474.13464101712, - 140499.94819507122, - 140525.76293483781, - 140551.57886020801, - 140577.3959710729, - 140603.21426732364, - 140629.03374885136, - 140654.85441554731, - 140680.67626730262, - 140706.49930400858, - 140732.32352555645, - 140758.1489318375, - 140783.97552274304, - 140809.80329816442, - 140835.63225799298, - 140861.46240212015, - 140887.29373043729, - 140913.12624283586, - 140938.95993920733, - 140964.79481944317, - 140990.63088343487, - 141016.46813107401, - 141042.30656225214, - 141068.14617686081, - 141093.98697479168, - 141119.82895593636, - 141145.6721201865, - 141171.51646743377, - 141197.36199756994, - 141223.20871048668, - 141249.05660607578, - 141274.90568422904, - 141300.75594483822, - 141326.6073877952, - 141352.4600129918, - 141378.31382031992, - 141404.16880967148, - 141430.02498093838, - 141455.8823340126, - 141481.74086878612, - 141507.60058515094, - 141533.46148299909, - 141559.32356222265, - 141585.18682271364, - 141611.05126436421, - 141636.9168870665, - 141662.78369071262, - 141688.65167519479, - 141714.5208404052, - 141740.39118623605, - 141766.26271257963, - 141792.1354193282, - 141818.00930637406, - 141843.88437360956, - 141869.760620927, - 141895.6380482188, - 141921.51665537735, - 141947.39644229505, - 141973.27740886438, - 141999.15955497778, - 142025.04288052776, - 142050.92738540689, - 142076.81306950765, - 142102.69993272264, - 142128.58797494444, - 142154.47719606571, - 142180.36759597904, - 142206.25917457714, - 142232.15193175265, - 142258.04586739838, - 142283.94098140698, - 142309.83727367126, - 142335.73474408401, - 142361.63339253806, - 142387.5332189262, - 142413.43422314132, - 142439.33640507635, - 142465.23976462413, - 142491.14430167765, - 142517.05001612983, - 142542.95690787368, - 142568.86497680223, - 142594.77422280848, - 142620.68464578551, - 142646.5962456264, - 142672.50902222423, - 142698.42297547215, - 142724.33810526333, - 142750.25441149093, - 142776.17189404817, - 142802.09055282827, - 142828.01038772447, - 142853.93139863008, - 142879.85358543837, - 142905.77694804268, - 142931.70148633636, - 142957.62720021277, - 142983.55408956532, - 143009.48215428743, - 143035.41139427255, - 143061.34180941415, - 143087.27339960571, - 143113.20616474075, - 143139.14010471283, - 143165.07521941551, - 143191.01150874238, - 143216.94897258704, - 143242.88761084314, - 143268.82742340435, - 143294.76841016437, - 143320.71057101688, - 143346.65390585564, - 143372.59841457437, - 143398.54409706692, - 143424.49095322701, - 143450.43898294857, - 143476.38818612538, - 143502.33856265133, - 143528.29011242036, - 143554.24283532638, - 143580.19673126334, - 143606.1518001252, - 143632.10804180597, - 143658.06545619969, - 143684.02404320039, - 143709.98380270213, - 143735.944734599, - 143761.90683878519, - 143787.87011515474, - 143813.83456360188, - 143839.8001840208, - 143865.76697630569, - 143891.73494035081, - 143917.7040760504, - 143943.67438329876, - 143969.6458619902, - 143995.61851201905, - 144021.59233327967, - 144047.56732566646, - 144073.54348907378, - 144099.52082339607, - 144125.49932852783, - 144151.4790043635, - 144177.45985079758, - 144203.44186772458, - 144229.42505503909, - 144255.40941263564, - 144281.39494040885, - 144307.38163825331, - 144333.36950606373, - 144359.35854373468, - 144385.34875116093, - 144411.34012823718, - 144437.33267485813, - 144463.32639091855, - 144489.32127631325, - 144515.31733093705, - 144541.31455468474, - 144567.3129474512, - 144593.3125091313, - 144619.31323961995, - 144645.31513881206, - 144671.31820660262, - 144697.32244288657, - 144723.32784755889, - 144749.33442051467, - 144775.34216164888, - 144801.35107085665, - 144827.36114803303, - 144853.37239307314, - 144879.38480587213, - 144905.39838632516, - 144931.41313432742, - 144957.4290497741, - 144983.44613256046, - 145009.46438258173, - 145035.48379973322, - 145061.50438391021, - 145087.52613500805, - 145113.54905292206, - 145139.57313754765, - 145165.59838878017, - 145191.62480651509, - 145217.65239064783, - 145243.68114107384, - 145269.71105768863, - 145295.74214038774, - 145321.77438906668, - 145347.80780362099, - 145373.84238394629, - 145399.87812993818, - 145425.91504149229, - 145451.95311850426, - 145477.9923608698, - 145504.03276848458, - 145530.07434124436, - 145556.11707904484, - 145582.16098178181, - 145608.20604935108, - 145634.25228164849, - 145660.29967856981, - 145686.34824001096, - 145712.39796586783, - 145738.4488560363, - 145764.50091041232, - 145790.55412889185, - 145816.60851137087, - 145842.66405774537, - 145868.72076791141, - 145894.77864176501, - 145920.83767920226, - 145946.89788011924, - 145972.95924441208, - 145999.02177197693, - 146025.08546270995, - 146051.15031650732, - 146077.21633326527, - 146103.28351288004, - 146129.35185524789, - 146155.42136026506, - 146181.49202782792, - 146207.56385783272, - 146233.63685017588, - 146259.71100475377, - 146285.78632146274, - 146311.86280019928, - 146337.94044085976, - 146364.01924334071, - 146390.09920753856, - 146416.18033334985, - 146442.26262067116, - 146468.34606939898, - 146494.43067942993, - 146520.51645066062, - 146546.60338298764, - 146572.69147630769, - 146598.78073051744, - 146624.87114551352, - 146650.96272119274, - 146677.05545745179, - 146703.14935418745, - 146729.2444112965, - 146755.34062867577, - 146781.43800622207, - 146807.53654383228, - 146833.63624140329, - 146859.73709883197, - 146885.83911601527, - 146911.94229285014, - 146938.04662923355, - 146964.15212506248, - 146990.25878023397, - 147016.36659464505, - 147042.47556819281, - 147068.58570077427, - 147094.6969922866, - 147120.80944262692, - 147146.92305169237, - 147173.03781938017, - 147199.15374558745, - 147225.27083021149, - 147251.38907314953, - 147277.50847429881, - 147303.62903355664, - 147329.75075082036, - 147355.87362598727, - 147381.99765895473, - 147408.12284962015, - 147434.24919788091, - 147460.37670363448, - 147486.50536677826, - 147512.63518720976, - 147538.76616482646, - 147564.89829952587, - 147591.03159120557, - 147617.16603976308, - 147643.30164509601, - 147669.43840710199, - 147695.57632567859, - 147721.71540072354, - 147747.85563213445, - 147773.99701980909, - 147800.13956364512, - 147826.28326354033, - 147852.42811939248, - 147878.57413109933, - 147904.72129855872, - 147930.86962166851, - 147957.01910032652, - 147983.16973443062, - 148009.32152387875, - 148035.47446856883, - 148061.62856839882, - 148087.78382326665, - 148113.94023307035, - 148140.09779770792, - 148166.25651707739, - 148192.41639107687, - 148218.57741960438, - 148244.73960255808, - 148270.90293983606, - 148297.0674313365, - 148323.23307695755, - 148349.39987659742, - 148375.56783015432, - 148401.73693752653, - 148427.90719861226, - 148454.07861330983, - 148480.25118151752, - 148506.42490313368, - 148532.59977805667, - 148558.77580618486, - 148584.95298741665, - 148611.13132165043, - 148637.31080878471, - 148663.49144871789, - 148689.6732413485, - 148715.85618657502, - 148742.040284296, - 148768.22553440998, - 148794.41193681557, - 148820.59949141133, - 148846.78819809589, - 148872.97805676793, - 148899.16906732606, - 148925.36122966901, - 148951.55454369547, - 148977.74900930419, - 149003.9446263939, - 149030.1413948634, - 149056.33931461151, - 149082.53838553699, - 149108.73860753875, - 149134.9399805156, - 149161.14250436646, - 149187.34617899026, - 149213.5510042859, - 149239.75698015234, - 149265.96410648854, - 149292.17238319354, - 149318.38181016635, - 149344.59238730598, - 149370.80411451156, - 149397.01699168212, - 149423.23101871679, - 149449.44619551473, - 149475.66252197503, - 149501.87999799693, - 149528.0986234796, - 149554.31839832227, - 149580.53932242419, - 149606.76139568459, - 149632.98461800278, - 149659.20898927809, - 149685.43450940982, - 149711.66117829733, - 149737.88899584001, - 149764.11796193724, - 149790.34807648844, - 149816.57933939309, - 149842.81175055061, - 149869.04530986046, - 149895.28001722222, - 149921.51587253538, - 149947.75287569952, - 149973.99102661415, - 150000.23032517891, - 150026.47077129342, - 150052.71236485732, - 150078.95510577026, - 150105.1989939319, - 150131.444029242, - 150157.69021160025, - 150183.93754090639, - 150210.18601706024, - 150236.43563996154, - 150262.68640951012, - 150288.93832560582, - 150315.19138814852, - 150341.44559703805, - 150367.70095217437, - 150393.95745345735, - 150420.21510078697, - 150446.47389406321, - 150472.73383318601, - 150498.99491805542, - 150525.25714857146, - 150551.52052463419, - 150577.78504614369, - 150604.05071300003, - 150630.31752510337, - 150656.58548235384, - 150682.85458465159, - 150709.1248318968, - 150735.39622398972, - 150761.66876083051, - 150787.9424423195, - 150814.21726835691, - 150840.49323884305, - 150866.77035367821, - 150893.04861276277, - 150919.32801599705, - 150945.60856328148, - 150971.89025451642, - 150998.17308960229, - 151024.45706843957, - 151050.74219092872, - 151077.02845697021, - 151103.31586646455, - 151129.60441931229, - 151155.894115414, - 151182.1849546702, - 151208.47693698155, - 151234.77006224863, - 151261.06433037209, - 151287.35974125259, - 151313.65629479082, - 151339.95399088747, - 151366.25282944329, - 151392.55281035902, - 151418.85393353543, - 151445.1561988733, - 151471.45960627345, - 151497.76415563675, - 151524.06984686397, - 151550.37667985607, - 151576.68465451393, - 151602.99377073845, - 151629.30402843058, - 151655.61542749128, - 151681.92796782157, - 151708.24164932242, - 151734.55647189484, - 151760.87243543993, - 151787.18953985872, - 151813.50778505235, - 151839.82717092187, - 151866.14769736846, - 151892.46936429327, - 151918.79217159748, - 151945.11611918229, - 151971.44120694889, - 151997.76743479856, - 152024.09480263255, - 152050.42331035214, - 152076.75295785864, - 152103.08374505339, - 152129.41567183775, - 152155.74873811303, - 152182.08294378067, - 152208.41828874208, - 152234.75477289871, - 152261.09239615197, - 152287.43115840337, - 152313.77105955439, - 152340.11209950657, - 152366.45427816146, - 152392.79759542056, - 152419.14205118554, - 152445.48764535793, - 152471.8343778394, - 152498.18224853161, - 152524.53125733617, - 152550.88140415482, - 152577.23268888926, - 152603.58511144121, - 152629.93867171241, - 152656.29336960468, - 152682.64920501978, - 152709.00617785956, - 152735.36428802583, - 152761.72353542043, - 152788.08391994529, - 152814.44544150229, - 152840.80809999333, - 152867.17189532038, - 152893.53682738543, - 152919.90289609041, - 152946.27010133737, - 152972.63844302832, - 152999.00792106529, - 153025.37853535041, - 153051.7502857857, - 153078.12317227334, - 153104.4971947154, - 153130.8723530141, - 153157.24864707157, - 153183.62607679001, - 153210.00464207167, - 153236.38434281875, - 153262.76517893354, - 153289.14715031831, - 153315.53025687535, - 153341.91449850702, - 153368.2998751156, - 153394.68638660354, - 153421.07403287315, - 153447.46281382689, - 153473.85272936718, - 153500.24377939643, - 153526.63596381716, - 153553.02928253182, - 153579.42373544298, - 153605.81932245308, - 153632.21604346478, - 153658.61389838057, - 153685.0128871031, - 153711.41300953497, - 153737.81426557881, - 153764.21665513728, - 153790.62017811305, - 153817.02483440886, - 153843.43062392739, - 153869.83754657139, - 153896.24560224367, - 153922.65479084692, - 153949.06511228404, - 153975.4765664578, - 154001.88915327107, - 154028.30287262669, - 154054.71772442761, - 154081.13370857667, - 154107.55082497682, - 154133.96907353101, - 154160.38845414223, - 154186.80896671346, - 154213.23061114774, - 154239.65338734805, - 154266.07729521746, - 154292.50233465908, - 154318.92850557598, - 154345.35580787127, - 154371.7842414481, - 154398.21380620965, - 154424.64450205903, - 154451.07632889951, - 154477.50928663427, - 154503.94337516659, - 154530.37859439969, - 154556.81494423689, - 154583.25242458144, - 154609.69103533673, - 154636.13077640603, - 154662.57164769279, - 154689.01364910032, - 154715.45678053208, - 154741.90104189145, - 154768.34643308193, - 154794.79295400696, - 154821.24060457002, - 154847.68938467462, - 154874.13929422433, - 154900.59033312264, - 154927.04250127316, - 154953.49579857948, - 154979.95022494521, - 155006.40578027396, - 155032.86246446942, - 155059.32027743524, - 155085.77921907514, - 155112.2392892928, - 155138.70048799197, - 155165.16281507642, - 155191.62627044989, - 155218.09085401625, - 155244.55656567923, - 155271.02340534274, - 155297.49137291059, - 155323.96046828668, - 155350.4306913749, - 155376.90204207919, - 155403.37452030348, - 155429.84812595171, - 155456.32285892789, - 155482.79871913602, - 155509.27570648011, - 155535.75382086422, - 155562.23306219239, - 155588.71343036872, - 155615.19492529731, - 155641.67754688227, - 155668.16129502779, - 155694.64616963797, - 155721.13217061706, - 155747.61929786921, - 155774.10755129869, - 155800.59693080973, - 155827.08743630661, - 155853.57906769359, - 155880.07182487496, - 155906.56570775513, - 155933.06071623837, - 155959.55685022907, - 155986.05410963166, - 156012.5524943505, - 156039.05200429002, - 156065.55263935472, - 156092.054399449, - 156118.5572844774, - 156145.06129434443, - 156171.5664289546, - 156198.07268821247, - 156224.5800720226, - 156251.08858028959, - 156277.59821291809, - 156304.10896981266, - 156330.62085087801, - 156357.1338560188, - 156383.64798513969, - 156410.16323814544, - 156436.67961494075, - 156463.1971154304, - 156489.71573951913, - 156516.23548711176, - 156542.75635811311, - 156569.27835242799, - 156595.80146996127, - 156622.32571061782, - 156648.85107430254, - 156675.37756092031, - 156701.90517037612, - 156728.43390257491, - 156754.96375742162, - 156781.49473482129, - 156808.02683467892, - 156834.5600568995, - 156861.09440138817, - 156887.62986804993, - 156914.16645678994, - 156940.70416751326, - 156967.24300012505, - 156993.78295453047, - 157020.32403063469, - 157046.8662283429, - 157073.40954756032, - 157099.9539881922, - 157126.49955014378, - 157153.04623332032, - 157179.59403762716, - 157206.14296296958, - 157232.69300925292, - 157259.24417638258, - 157285.79646426387, - 157312.34987280221, - 157338.90440190304, - 157365.46005147175, - 157392.01682141385, - 157418.57471163478, - 157445.13372204005, - 157471.69385253513, - 157498.25510302564, - 157524.81747341706, - 157551.38096361503, - 157577.9455735251, - 157604.51130305286, - 157631.07815210402, - 157657.64612058419, - 157684.21520839902, - 157710.78541545427, - 157737.35674165559, - 157763.92918690876, - 157790.50275111952, - 157817.07743419363, - 157843.65323603692, - 157870.23015655516, - 157896.80819565422, - 157923.3873532399, - 157949.96762921812, - 157976.54902349479, - 158003.13153597576, - 158029.71516656701, - 158056.29991517449, - 158082.88578170416, - 158109.47276606198, - 158136.06086815402, - 158162.65008788629, - 158189.24042516484, - 158215.83187989573, - 158242.42445198505, - 158269.01814133892, - 158295.61294786347, - 158322.20887146486, - 158348.80591204923, - 158375.4040695228, - 158402.00334379176, - 158428.60373476235, - 158455.2052423408, - 158481.80786643337, - 158508.41160694641, - 158535.01646378616, - 158561.62243685898, - 158588.2295260712, - 158614.8377313292, - 158641.44705253936, - 158668.05748960807, - 158694.66904244179, - 158721.28171094693, - 158747.89549502998, - 158774.5103945974, - 158801.12640955573, - 158827.74353981143, - 158854.36178527112, - 158880.9811458413, - 158907.60162142856, - 158934.22321193956, - 158960.84591728085, - 158987.46973735912, - 159014.09467208097, - 159040.72072135314, - 159067.3478850823, - 159093.97616317519, - 159120.60555553852, - 159147.23606207906, - 159173.8676827036, - 159200.50041731889, - 159227.13426583182, - 159253.76922814918, - 159280.40530417781, - 159307.04249382461, - 159333.68079699649, - 159360.32021360032, - 159386.96074354305, - 159413.60238673165, - 159440.24514307309, - 159466.88901247433, - 159493.53399484244, - 159520.18009008438, - 159546.82729810724, - 159573.47561881805, - 159600.12505212394, - 159626.77559793202, - 159653.42725614941, - 159680.08002668325, - 159706.73390944069, - 159733.38890432892, - 159760.04501125516, - 159786.70223012666, - 159813.36056085059, - 159840.02000333427, - 159866.68055748497, - 159893.34222320997, - 159920.00500041663, - 159946.66888901225, - 159973.33388890422, - 159999.99999999988, - 160026.66722220668, - 160053.33555543202, - 160080.0049995833, - 160106.67555456801, - 160133.3472202936, - 160160.0199966676, - 160186.6938835975, - 160213.36888099083, - 160240.04498875517, - 160266.72220679806, - 160293.40053502709, - 160320.07997334987, - 160346.76052167406, - 160373.44217990729, - 160400.1249479572, - 160426.80882573154, - 160453.49381313793, - 160480.17991008417, - 160506.86711647795, - 160533.55543222709, - 160560.24485723933, - 160586.93539142248, - 160613.62703468435, - 160640.31978693281, - 160667.01364807569, - 160693.70861802087, - 160720.40469667627, - 160747.1018839498, - 160773.80017974938, - 160800.49958398298, - 160827.20009655855, - 160853.90171738411, - 160880.60444636765, - 160907.30828341722, - 160934.01322844089, - 160960.71928134665, - 160987.42644204266, - 161014.13471043704, - 161040.84408643784, - 161067.55456995327, - 161094.26616089148, - 161120.97885916062, - 161147.69266466892, - 161174.40757732463, - 161201.12359703594, - 161227.84072371112, - 161254.55895725847, - 161281.27829758628, - 161307.99874460287, - 161334.72029821656, - 161361.44295833571, - 161388.1667248687, - 161414.89159772391, - 161441.61757680977, - 161468.34466203468, - 161495.07285330712, - 161521.80215053557, - 161548.53255362847, - 161575.26406249436, - 161601.99667704175, - 161628.7303971792, - 161655.46522281526, - 161682.20115385848, - 161708.93819021754, - 161735.67633180099, - 161762.41557851751, - 161789.15593027571, - 161815.89738698432, - 161842.63994855201, - 161869.38361488748, - 161896.1283858995, - 161922.87426149679, - 161949.62124158812, - 161976.36932608229, - 162003.1185148881, - 162029.8688079144, - 162056.62020507001, - 162083.37270626382, - 162110.12631140469, - 162136.88102040152, - 162163.63683316324, - 162190.39374959879, - 162217.15176961714, - 162243.91089312723, - 162270.67112003808, - 162297.43245025873, - 162324.19488369819, - 162350.9584202655, - 162377.72305986975, - 162404.48880242003, - 162431.25564782543, - 162458.02359599507, - 162484.79264683815, - 162511.56280026378, - 162538.33405618116, - 162565.10641449949, - 162591.87987512801, - 162618.65443797593, - 162645.43010295252, - 162672.20686996708, - 162698.98473892888, - 162725.76370974723, - 162752.54378233149, - 162779.32495659095, - 162806.10723243505, - 162832.89060977317, - 162859.67508851466, - 162886.46066856899, - 162913.24734984562, - 162940.03513225398, - 162966.82401570358, - 162993.6140001039, - 163020.40508536444, - 163047.19727139481, - 163073.99055810447, - 163100.78494540305, - 163127.58043320014, - 163154.37702140535, - 163181.17470992831, - 163207.97349867865, - 163234.77338756606, - 163261.57437650024, - 163288.37646539087, - 163315.17965414765, - 163341.98394268038, - 163368.78933089875, - 163395.59581871261, - 163422.40340603172, - 163449.2120927659, - 163476.02187882498, - 163502.83276411882, - 163529.6447485573, - 163556.45783205028, - 163583.2720145077, - 163610.08729583945, - 163636.90367595552, - 163663.72115476584, - 163690.53973218042, - 163717.35940810922, - 163744.18018246227, - 163771.00205514964, - 163797.82502608138, - 163824.64909516752, - 163851.4742623182, - 163878.3005274435, - 163905.12789045356, - 163931.95635125853, - 163958.78590976857, - 163985.61656589387, - 164012.44831954464, - 164039.28117063109, - 164066.11511906344, - 164092.95016475199, - 164119.78630760699, - 164146.62354753874, - 164173.46188445756, - 164200.30131827376, - 164227.14184889771, - 164253.98347623978, - 164280.82620021031, - 164307.67002071979, - 164334.51493767856, - 164361.3609509971, - 164388.20806058586, - 164415.05626635533, - 164441.905568216, - 164468.75596607837, - 164495.607459853, - 164522.4600494504, - 164549.31373478117, - 164576.16851575591, - 164603.02439228518, - 164629.88136427966, - 164656.73943164994, - 164683.59859430668, - 164710.45885216061, - 164737.32020512238, - 164764.1826531027, - 164791.04619601235, - 164817.91083376206, - 164844.77656626256, - 164871.64339342469, - 164898.51131515924, - 164925.38033137703, - 164952.25044198887, - 164979.1216469057, - 165005.9939460383, - 165032.86733929763, - 165059.7418265946, - 165086.61740784015, - 165113.4940829452 -}; - -#else - -#define IQ_TABLE_SIZE 1026 - -ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = -{ - REAL_CONST(0.0), - REAL_CONST(1.0/8.0), - REAL_CONST(2.5198420997897464/8.0), - REAL_CONST(4.3267487109222245/8.0), - REAL_CONST(6.3496042078727974/8.0), - REAL_CONST(8.5498797333834844/8.0), - REAL_CONST(10.902723556992836/8.0), - REAL_CONST(13.390518279406722/8.0), - REAL_CONST(15.999999999999998/8.0), - REAL_CONST(18.720754407467133/8.0), - REAL_CONST(21.544346900318832/8.0), - REAL_CONST(24.463780996262464/8.0), - REAL_CONST(27.47314182127996/8.0), - REAL_CONST(30.567350940369842/8.0), - REAL_CONST(33.741991698453212/8.0), - REAL_CONST(36.993181114957046/8.0), - REAL_CONST(40.317473596635935/8.0), - REAL_CONST(43.711787041189993/8.0), - REAL_CONST(47.173345095760126/8.0), - REAL_CONST(50.699631325716943/8.0), - REAL_CONST(54.288352331898118/8.0), - REAL_CONST(57.937407704003519/8.0), - REAL_CONST(61.6448652744185/8.0), - REAL_CONST(65.408940536585988/8.0), - REAL_CONST(69.227979374755591/8.0), - REAL_CONST(73.100443455321638/8.0), - REAL_CONST(77.024897778591622/8.0), - REAL_CONST(80.999999999999986/8.0), - REAL_CONST(85.024491212518527/8.0), - REAL_CONST(89.097187944889555/8.0), - REAL_CONST(93.216975178615741/8.0), - REAL_CONST(97.382800224133163/8.0), - REAL_CONST(101.59366732596474/8.0), - REAL_CONST(105.84863288986224/8.0), - REAL_CONST(110.14680124343441/8.0), - REAL_CONST(114.4873208566006/8.0), - REAL_CONST(118.86938096020653/8.0), - REAL_CONST(123.29220851090024/8.0), - REAL_CONST(127.75506545836058/8.0), - REAL_CONST(132.25724627755247/8.0), - REAL_CONST(136.79807573413572/8.0), - REAL_CONST(141.37690685569191/8.0), - REAL_CONST(145.99311908523086/8.0), - REAL_CONST(150.6461165966291/8.0), - REAL_CONST(155.33532675434674/8.0), - REAL_CONST(160.06019870205279/8.0), - REAL_CONST(164.82020206673349/8.0), - REAL_CONST(169.61482576651861/8.0), - REAL_CONST(174.44357691188537/8.0), - REAL_CONST(179.30597979112557/8.0), - REAL_CONST(184.20157493201927/8.0), - REAL_CONST(189.12991823257562/8.0), - REAL_CONST(194.09058015449685/8.0), - REAL_CONST(199.08314497371677/8.0), - REAL_CONST(204.1072100829694/8.0), - REAL_CONST(209.16238534187647/8.0), - REAL_CONST(214.24829247050752/8.0), - REAL_CONST(219.36456448277784/8.0), - REAL_CONST(224.51084515641216/8.0), - REAL_CONST(229.6867885365223/8.0), - REAL_CONST(234.89205847013176/8.0), - REAL_CONST(240.12632816923249/8.0), - REAL_CONST(245.38927980018505/8.0), - REAL_CONST(250.68060409747261/8.0), - REAL_CONST(255.99999999999991/8.0), - REAL_CONST(261.34717430828869/8.0), - REAL_CONST(266.72184136106449/8.0), - REAL_CONST(272.12372272986045/8.0), - REAL_CONST(277.55254693037961/8.0), - REAL_CONST(283.0080491494619/8.0), - REAL_CONST(288.48997098659891/8.0), - REAL_CONST(293.99806020902247/8.0), - REAL_CONST(299.53207051947408/8.0), - REAL_CONST(305.0917613358298/8.0), - REAL_CONST(310.67689758182206/8.0), - REAL_CONST(316.28724948815585/8.0), - REAL_CONST(321.92259240337177/8.0), - REAL_CONST(327.58270661385535/8.0), - REAL_CONST(333.26737717243742/8.0), - REAL_CONST(338.97639373507025/8.0), - REAL_CONST(344.70955040510125/8.0), - REAL_CONST(350.46664558470013/8.0), - REAL_CONST(356.24748183302603/8.0), - REAL_CONST(362.05186573075139/8.0), - REAL_CONST(367.87960775058258/8.0), - REAL_CONST(373.73052213344511/8.0), - REAL_CONST(379.60442677002078/8.0), - REAL_CONST(385.50114308734607/8.0), - REAL_CONST(391.42049594019937/8.0), - REAL_CONST(397.36231350702371/8.0), - REAL_CONST(403.32642719014467/8.0), - REAL_CONST(409.31267152006262/8.0), - REAL_CONST(415.32088406360799/8.0), - REAL_CONST(421.35090533576471/8.0), - REAL_CONST(427.40257871497619/8.0), - REAL_CONST(433.4757503617617/8.0), - REAL_CONST(439.5702691404793/8.0), - REAL_CONST(445.68598654408271/8.0), - REAL_CONST(451.82275662172759/8.0), - REAL_CONST(457.98043590909128/8.0), - REAL_CONST(464.15888336127773/8.0), - REAL_CONST(470.35796028818726/8.0), - REAL_CONST(476.5775302922363/8.0), - REAL_CONST(482.81745920832043/8.0), - REAL_CONST(489.07761504591741/8.0), - REAL_CONST(495.35786793323581/8.0), - REAL_CONST(501.65809006331688/8.0), - REAL_CONST(507.97815564200368/8.0), - REAL_CONST(514.31794083769648/8.0), - REAL_CONST(520.67732373281672/8.0), - REAL_CONST(527.05618427690604/8.0), - REAL_CONST(533.45440424129174/8.0), - REAL_CONST(539.87186717525128/8.0), - REAL_CONST(546.30845836361505/8.0), - REAL_CONST(552.76406478574609/8.0), - REAL_CONST(559.23857507584194/8.0), - REAL_CONST(565.73187948450413/8.0), - REAL_CONST(572.24386984152341/8.0), - REAL_CONST(578.77443951983378/8.0), - REAL_CONST(585.32348340058843/8.0), - REAL_CONST(591.89089783931263/8.0), - REAL_CONST(598.47658063309257/8.0), - REAL_CONST(605.08043098876044/8.0), - REAL_CONST(611.70234949203643/8.0), - REAL_CONST(618.3422380775919/8.0), - REAL_CONST(624.99999999999977/8.0), - REAL_CONST(631.67553980553748/8.0), - REAL_CONST(638.36876330481164/8.0), - REAL_CONST(645.07957754617485/8.0), - REAL_CONST(651.80789078990415/8.0), - REAL_CONST(658.55361248311499/8.0), - REAL_CONST(665.31665323538357/8.0), - REAL_CONST(672.09692479505225/8.0), - REAL_CONST(678.8943400261943/8.0), - REAL_CONST(685.70881288621433/8.0), - REAL_CONST(692.540258404062/8.0), - REAL_CONST(699.38859265903977/8.0), - REAL_CONST(706.25373276018058/8.0), - REAL_CONST(713.13559682617972/8.0), - REAL_CONST(720.03410396586037/8.0), - REAL_CONST(726.94917425915435/8.0), - REAL_CONST(733.88072873858209/8.0), - REAL_CONST(740.82868937121543/8.0), - REAL_CONST(747.79297904110535/8.0), - REAL_CONST(754.77352153216191/8.0), - REAL_CONST(761.77024151147043/8.0), - REAL_CONST(768.78306451302956/8.0), - REAL_CONST(775.81191692189896/8.0), - REAL_CONST(782.85672595874246/8.0), - REAL_CONST(789.91741966475445/8.0), - REAL_CONST(796.99392688695798/8.0), - REAL_CONST(804.08617726386274/8.0), - REAL_CONST(811.19410121147098/8.0), - REAL_CONST(818.31762990962227/8.0), - REAL_CONST(825.45669528866563/8.0), - REAL_CONST(832.61123001644864/8.0), - REAL_CONST(839.78116748561604/8.0), - REAL_CONST(846.96644180120552/8.0), - REAL_CONST(854.16698776853514/8.0), - REAL_CONST(861.38274088137143/8.0), - REAL_CONST(868.61363731036977/8.0), - REAL_CONST(875.85961389178203/8.0), - REAL_CONST(883.12060811641959/8.0), - REAL_CONST(890.39655811886757/8.0), - REAL_CONST(897.68740266694181/8.0), - REAL_CONST(904.99308115138172/8.0), - REAL_CONST(912.31353357577188/8.0), - REAL_CONST(919.64870054668756/8.0), - REAL_CONST(926.99852326405619/8.0), - REAL_CONST(934.36294351172899/8.0), - REAL_CONST(941.74190364825859/8.0), - REAL_CONST(949.13534659787422/8.0), - REAL_CONST(956.54321584165211/8.0), - REAL_CONST(963.96545540887348/8.0), - REAL_CONST(971.40200986856541/8.0), - REAL_CONST(978.85282432122176/8.0), - REAL_CONST(986.31784439069588/8.0), - REAL_CONST(993.7970162162635/8.0), - REAL_CONST(1001.29028644485/8.0), - REAL_CONST(1008.797602223418/8.0), - REAL_CONST(1016.3189111915103/8.0), - REAL_CONST(1023.8541614739464/8.0), - REAL_CONST(1031.4033016736653/8.0), - REAL_CONST(1038.9662808647138/8.0), - REAL_CONST(1046.5430485853758/8.0), - REAL_CONST(1054.1335548314366/8.0), - REAL_CONST(1061.7377500495838/8.0), - REAL_CONST(1069.3555851309357/8.0), - REAL_CONST(1076.9870114046978/8.0), - REAL_CONST(1084.6319806319441/8.0), - REAL_CONST(1092.2904449995174/8.0), - REAL_CONST(1099.9623571140482/8.0), - REAL_CONST(1107.6476699960892/8.0), - REAL_CONST(1115.3463370743607/8.0), - REAL_CONST(1123.058312180106/8.0), - REAL_CONST(1130.7835495415541/8.0), - REAL_CONST(1138.5220037784854/8.0), - REAL_CONST(1146.273629896901/8.0), - REAL_CONST(1154.0383832837879/8.0), - REAL_CONST(1161.816219701986/8.0), - REAL_CONST(1169.607095285146/8.0), - REAL_CONST(1177.4109665327808/8.0), - REAL_CONST(1185.2277903054078/8.0), - REAL_CONST(1193.0575238197798/8.0), - REAL_CONST(1200.9001246442001/8.0), - REAL_CONST(1208.7555506939248/8.0), - REAL_CONST(1216.6237602266442/8.0), - REAL_CONST(1224.5047118380478/8.0), - REAL_CONST(1232.3983644574657/8.0), - REAL_CONST(1240.3046773435874/8.0), - REAL_CONST(1248.2236100802568/8.0), - REAL_CONST(1256.1551225723395/8.0), - REAL_CONST(1264.099175041662/8.0), - REAL_CONST(1272.0557280230228/8.0), - REAL_CONST(1280.0247423602691/8.0), - REAL_CONST(1288.0061792024444/8.0), - REAL_CONST(1295.9999999999995/8.0), - REAL_CONST(1304.006166501068/8.0), - REAL_CONST(1312.0246407478062/8.0), - REAL_CONST(1320.0553850727929/8.0), - REAL_CONST(1328.0983620954903/8.0), - REAL_CONST(1336.1535347187651/8.0), - REAL_CONST(1344.2208661254647/8.0), - REAL_CONST(1352.3003197750522/8.0), - REAL_CONST(1360.3918594002962/8.0), - REAL_CONST(1368.4954490040145/8.0), - REAL_CONST(1376.6110528558709/8.0), - REAL_CONST(1384.7386354892244/8.0), - REAL_CONST(1392.8781616980295/8.0), - REAL_CONST(1401.0295965337855/8.0), - REAL_CONST(1409.1929053025353/8.0), - REAL_CONST(1417.3680535619119/8.0), - REAL_CONST(1425.5550071182327/8.0), - REAL_CONST(1433.7537320236374/8.0), - REAL_CONST(1441.9641945732744/8.0), - REAL_CONST(1450.1863613025282/8.0), - REAL_CONST(1458.4201989842913/8.0), - REAL_CONST(1466.6656746262797/8.0), - REAL_CONST(1474.9227554683875/8.0), - REAL_CONST(1483.1914089800841/8.0), - REAL_CONST(1491.4716028578516/8.0), - REAL_CONST(1499.7633050226596/8.0), - REAL_CONST(1508.0664836174794/8.0), - REAL_CONST(1516.3811070048375/8.0), - REAL_CONST(1524.7071437644029/8.0), - REAL_CONST(1533.0445626906128/8.0), - REAL_CONST(1541.3933327903342/8.0), - REAL_CONST(1549.7534232805581/8.0), - REAL_CONST(1558.1248035861302/8.0), - REAL_CONST(1566.507443337515/8.0), - REAL_CONST(1574.9013123685909/8.0), - REAL_CONST(1583.3063807144795/8.0), - REAL_CONST(1591.7226186094069/8.0), - REAL_CONST(1600.1499964845941/8.0), - REAL_CONST(1608.58848496618/8.0), - REAL_CONST(1617.0380548731737/8.0), - REAL_CONST(1625.4986772154357/8.0), - REAL_CONST(1633.9703231916887/8.0), - REAL_CONST(1642.4529641875577/8.0), - REAL_CONST(1650.9465717736346/8.0), - REAL_CONST(1659.4511177035752/8.0), - REAL_CONST(1667.9665739122186/8.0), - REAL_CONST(1676.4929125137353/8.0), - REAL_CONST(1685.030105799801/8.0), - REAL_CONST(1693.5781262377957/8.0), - REAL_CONST(1702.136946469027/8.0), - REAL_CONST(1710.7065393069795/8.0), - REAL_CONST(1719.2868777355877/8.0), - REAL_CONST(1727.8779349075323/8.0), - REAL_CONST(1736.4796841425596/8.0), - REAL_CONST(1745.092098925825/8.0), - REAL_CONST(1753.7151529062583/8.0), - REAL_CONST(1762.3488198949503/8.0), - REAL_CONST(1770.9930738635628/8.0), - REAL_CONST(1779.6478889427597/8.0), - REAL_CONST(1788.3132394206564/8.0), - REAL_CONST(1796.9890997412947/8.0), - REAL_CONST(1805.6754445031333/8.0), - REAL_CONST(1814.3722484575621/8.0), - REAL_CONST(1823.0794865074322/8.0), - REAL_CONST(1831.7971337056094/8.0), - REAL_CONST(1840.5251652535437/8.0), - REAL_CONST(1849.2635564998579/8.0), - REAL_CONST(1858.0122829389563/8.0), - REAL_CONST(1866.7713202096493/8.0), - REAL_CONST(1875.5406440937966/8.0), - REAL_CONST(1884.3202305149687/8.0), - REAL_CONST(1893.110055537124/8.0), - REAL_CONST(1901.9100953633042/8.0), - REAL_CONST(1910.7203263343454/8.0), - REAL_CONST(1919.5407249276057/8.0), - REAL_CONST(1928.3712677557098/8.0), - REAL_CONST(1937.2119315653083/8.0), - REAL_CONST(1946.0626932358525/8.0), - REAL_CONST(1954.923529778386/8.0), - REAL_CONST(1963.79441833435/8.0), - REAL_CONST(1972.6753361744036/8.0), - REAL_CONST(1981.5662606972594/8.0), - REAL_CONST(1990.467169428533/8.0), - REAL_CONST(1999.3780400196069/8.0), - REAL_CONST(2008.2988502465078/8.0), - REAL_CONST(2017.2295780087982/8.0), - REAL_CONST(2026.1702013284819/8.0), - REAL_CONST(2035.1206983489212/8.0), - REAL_CONST(2044.0810473337688/8.0), - REAL_CONST(2053.0512266659125/8.0), - REAL_CONST(2062.0312148464309/8.0), - REAL_CONST(2071.0209904935646/8.0), - REAL_CONST(2080.0205323416958/8.0), - REAL_CONST(2089.0298192403443/8.0), - REAL_CONST(2098.0488301531714/8.0), - REAL_CONST(2107.0775441569995/8.0), - REAL_CONST(2116.115940440839/8.0), - REAL_CONST(2125.1639983049317/8.0), - REAL_CONST(2134.2216971597995/8.0), - REAL_CONST(2143.2890165253098/8.0), - REAL_CONST(2152.3659360297484/8.0), - REAL_CONST(2161.4524354089031/8.0), - REAL_CONST(2170.5484945051617/8.0), - REAL_CONST(2179.6540932666144/8.0), - REAL_CONST(2188.7692117461711/8.0), - REAL_CONST(2197.8938301006888/8.0), - REAL_CONST(2207.0279285901042/8.0), - REAL_CONST(2216.1714875765838/8.0), - REAL_CONST(2225.324487523676/8.0), - REAL_CONST(2234.4869089954782/8.0), - REAL_CONST(2243.6587326558101/8.0), - REAL_CONST(2252.8399392673982/8.0), - REAL_CONST(2262.0305096910702/8.0), - REAL_CONST(2271.2304248849537/8.0), - REAL_CONST(2280.4396659036897/8.0), - REAL_CONST(2289.6582138976523/8.0), - REAL_CONST(2298.8860501121762/8.0), - REAL_CONST(2308.1231558867926/8.0), - REAL_CONST(2317.3695126544767/8.0), - REAL_CONST(2326.6251019409005/8.0), - REAL_CONST(2335.8899053636933/8.0), - REAL_CONST(2345.1639046317132/8.0), - REAL_CONST(2354.4470815443233/8.0), - REAL_CONST(2363.7394179906792/8.0), - REAL_CONST(2373.0408959490205/8.0), - REAL_CONST(2382.3514974859731/8.0), - REAL_CONST(2391.6712047558558/8.0), - REAL_CONST(2400.9999999999991/8.0), - REAL_CONST(2410.3378655460651/8.0), - REAL_CONST(2419.6847838073813/8.0), - REAL_CONST(2429.0407372822747/8.0), - REAL_CONST(2438.4057085534191/8.0), - REAL_CONST(2447.7796802871858/8.0), - REAL_CONST(2457.1626352330004/8.0), - REAL_CONST(2466.5545562227112/8.0), - REAL_CONST(2475.9554261699564/8.0), - REAL_CONST(2485.3652280695474/8.0), - REAL_CONST(2494.7839449968492/8.0), - REAL_CONST(2504.2115601071737/8.0), - REAL_CONST(2513.6480566351788/8.0), - REAL_CONST(2523.0934178942675/8.0), - REAL_CONST(2532.5476272760025/8.0), - REAL_CONST(2542.0106682495189/8.0), - REAL_CONST(2551.482524360948/8.0), - REAL_CONST(2560.9631792328441/8.0), - REAL_CONST(2570.4526165636184/8.0), - REAL_CONST(2579.9508201269791/8.0), - REAL_CONST(2589.4577737713744/8.0), - REAL_CONST(2598.9734614194458/8.0), - REAL_CONST(2608.4978670674823/8.0), - REAL_CONST(2618.0309747848837/8.0), - REAL_CONST(2627.5727687136259/8.0), - REAL_CONST(2637.1232330677353/8.0), - REAL_CONST(2646.6823521327647/8.0), - REAL_CONST(2656.2501102652768/8.0), - REAL_CONST(2665.8264918923328/8.0), - REAL_CONST(2675.4114815109842/8.0), - REAL_CONST(2685.0050636877722/8.0), - REAL_CONST(2694.6072230582295/8.0), - REAL_CONST(2704.2179443263894/8.0), - REAL_CONST(2713.8372122642972/8.0), - REAL_CONST(2723.4650117115279/8.0), - REAL_CONST(2733.1013275747096/8.0), - REAL_CONST(2742.7461448270483/8.0), - REAL_CONST(2752.3994485078601/8.0), - REAL_CONST(2762.0612237221085/8.0), - REAL_CONST(2771.7314556399419/8.0), - REAL_CONST(2781.4101294962406/8.0), - REAL_CONST(2791.0972305901655/8.0), - REAL_CONST(2800.7927442847094/8.0), - REAL_CONST(2810.4966560062589/8.0), - REAL_CONST(2820.2089512441521/8.0), - REAL_CONST(2829.9296155502466/8.0), - REAL_CONST(2839.6586345384894/8.0), - REAL_CONST(2849.3959938844923/8.0), - REAL_CONST(2859.1416793251065/8.0), - REAL_CONST(2868.8956766580086/8.0), - REAL_CONST(2878.6579717412847/8.0), - REAL_CONST(2888.4285504930212/8.0), - REAL_CONST(2898.2073988908974/8.0), - REAL_CONST(2907.9945029717837/8.0), - REAL_CONST(2917.789848831344/8.0), - REAL_CONST(2927.5934226236377/8.0), - REAL_CONST(2937.4052105607311/8.0), - REAL_CONST(2947.2251989123079/8.0), - REAL_CONST(2957.0533740052865/8.0), - REAL_CONST(2966.8897222234368/8.0), - REAL_CONST(2976.734230007005/8.0), - REAL_CONST(2986.5868838523397/8.0), - REAL_CONST(2996.4476703115197/8.0), - REAL_CONST(3006.3165759919889/8.0), - REAL_CONST(3016.1935875561908/8.0), - REAL_CONST(3026.0786917212095/8.0), - REAL_CONST(3035.9718752584108/8.0), - REAL_CONST(3045.8731249930906/8.0), - REAL_CONST(3055.7824278041207/8.0), - REAL_CONST(3065.6997706236039/8.0), - REAL_CONST(3075.625140436528/8.0), - REAL_CONST(3085.5585242804245/8.0), - REAL_CONST(3095.4999092450298/8.0), - REAL_CONST(3105.4492824719491/8.0), - REAL_CONST(3115.4066311543256/8.0), - REAL_CONST(3125.3719425365089/8.0), - REAL_CONST(3135.3452039137287/8.0), - REAL_CONST(3145.3264026317715/8.0), - REAL_CONST(3155.3155260866592/8.0), - REAL_CONST(3165.3125617243295/8.0), - REAL_CONST(3175.3174970403229/8.0), - REAL_CONST(3185.3303195794679/8.0), - REAL_CONST(3195.35101693557/8.0), - REAL_CONST(3205.3795767511078/8.0), - REAL_CONST(3215.4159867169251/8.0), - REAL_CONST(3225.460234571929/8.0), - REAL_CONST(3235.5123081027928/8.0), - REAL_CONST(3245.5721951436558/8.0), - REAL_CONST(3255.63988357583/8.0), - REAL_CONST(3265.7153613275095/8.0), - REAL_CONST(3275.7986163734795/8.0), - REAL_CONST(3285.8896367348289/8.0), - REAL_CONST(3295.9884104786665/8.0), - REAL_CONST(3306.0949257178395/8.0), - REAL_CONST(3316.2091706106517/8.0), - REAL_CONST(3326.331133360588/8.0), - REAL_CONST(3336.4608022160378/8.0), - REAL_CONST(3346.5981654700231/8.0), - REAL_CONST(3356.7432114599264/8.0), - REAL_CONST(3366.8959285672249/8.0), - REAL_CONST(3377.0563052172211/8.0), - REAL_CONST(3387.2243298787821/8.0), - REAL_CONST(3397.3999910640764/8.0), - REAL_CONST(3407.5832773283128/8.0), - REAL_CONST(3417.7741772694862/8.0), - REAL_CONST(3427.9726795281199/8.0), - REAL_CONST(3438.1787727870123/8.0), - REAL_CONST(3448.3924457709873/8.0), - REAL_CONST(3458.6136872466445/8.0), - REAL_CONST(3468.8424860221107/8.0), - REAL_CONST(3479.0788309467976/8.0), - REAL_CONST(3489.3227109111554/8.0), - REAL_CONST(3499.5741148464344/8.0), - REAL_CONST(3509.8330317244445/8.0), - REAL_CONST(3520.0994505573185/8.0), - REAL_CONST(3530.3733603972751/8.0), - REAL_CONST(3540.6547503363886/8.0), - REAL_CONST(3550.9436095063534/8.0), - REAL_CONST(3561.239927078258/8.0), - REAL_CONST(3571.5436922623535/8.0), - REAL_CONST(3581.8548943078308/8.0), - REAL_CONST(3592.1735225025936/8.0), - REAL_CONST(3602.4995661730372/8.0), - REAL_CONST(3612.8330146838275/8.0), - REAL_CONST(3623.1738574376814/8.0), - REAL_CONST(3633.5220838751502/8.0), - REAL_CONST(3643.8776834744031/8.0), - REAL_CONST(3654.2406457510142/8.0), - REAL_CONST(3664.6109602577494/8.0), - REAL_CONST(3674.9886165843564/8.0), - REAL_CONST(3685.3736043573545/8.0), - REAL_CONST(3695.7659132398294/8.0), - REAL_CONST(3706.1655329312248/8.0), - REAL_CONST(3716.5724531671399/8.0), - REAL_CONST(3726.9866637191262/8.0), - REAL_CONST(3737.4081543944876/8.0), - REAL_CONST(3747.8369150360782/8.0), - REAL_CONST(3758.2729355221072/8.0), - REAL_CONST(3768.7162057659411/8.0), - REAL_CONST(3779.1667157159077/8.0), - REAL_CONST(3789.6244553551055/8.0), - REAL_CONST(3800.0894147012082/8.0), - REAL_CONST(3810.5615838062768/8.0), - REAL_CONST(3821.0409527565694/8.0), - REAL_CONST(3831.5275116723533/8.0), - REAL_CONST(3842.0212507077194/8.0), - REAL_CONST(3852.522160050396/8.0), - REAL_CONST(3863.0302299215673/8.0), - REAL_CONST(3873.5454505756893/8.0), - REAL_CONST(3884.0678123003108/8.0), - REAL_CONST(3894.5973054158922/8.0), - REAL_CONST(3905.1339202756285/8.0), - REAL_CONST(3915.6776472652732/8.0), - REAL_CONST(3926.2284768029604/8.0), - REAL_CONST(3936.7863993390338/8.0), - REAL_CONST(3947.3514053558706/8.0), - REAL_CONST(3957.9234853677135/8.0), - REAL_CONST(3968.5026299204969/8.0), - REAL_CONST(3979.0888295916798/8.0), - REAL_CONST(3989.6820749900776/8.0), - REAL_CONST(4000.2823567556948/8.0), - REAL_CONST(4010.8896655595613/8.0), - REAL_CONST(4021.5039921035655/8.0), - REAL_CONST(4032.1253271202945/8.0), - REAL_CONST(4042.7536613728694/8.0), - REAL_CONST(4053.3889856547858/8.0), - REAL_CONST(4064.0312907897551/8.0), - REAL_CONST(4074.6805676315448/8.0), - REAL_CONST(4085.3368070638221/8.0), - REAL_CONST(4095.9999999999982/8.0), - REAL_CONST(4106.6701373830711/8.0), - REAL_CONST(4117.347210185475/8.0), - REAL_CONST(4128.0312094089259/8.0), - REAL_CONST(4138.722126084268/8.0), - REAL_CONST(4149.4199512713267/8.0), - REAL_CONST(4160.1246760587583/8.0), - REAL_CONST(4170.8362915638982/8.0), - REAL_CONST(4181.5547889326181/8.0), - REAL_CONST(4192.2801593391769/8.0), - REAL_CONST(4203.0123939860741/8.0), - REAL_CONST(4213.7514841039101/8.0), - REAL_CONST(4224.4974209512384/8.0), - REAL_CONST(4235.2501958144258/8.0), - REAL_CONST(4246.0098000075095/8.0), - REAL_CONST(4256.7762248720574/8.0), - REAL_CONST(4267.549461777031/8.0), - REAL_CONST(4278.3295021186423/8.0), - REAL_CONST(4289.1163373202198/8.0), - REAL_CONST(4299.9099588320714/8.0), - REAL_CONST(4310.7103581313495/8.0), - REAL_CONST(4321.5175267219138/8.0), - REAL_CONST(4332.3314561342004/8.0), - REAL_CONST(4343.152137925088/8.0), - REAL_CONST(4353.9795636777671/8.0), - REAL_CONST(4364.8137250016052/8.0), - REAL_CONST(4375.6546135320223/8.0), - REAL_CONST(4386.5022209303588/8.0), - REAL_CONST(4397.3565388837469/8.0), - REAL_CONST(4408.2175591049827/8.0), - REAL_CONST(4419.0852733324018/8.0), - REAL_CONST(4429.9596733297531/8.0), - REAL_CONST(4440.8407508860728/8.0), - REAL_CONST(4451.7284978155603/8.0), - REAL_CONST(4462.6229059574571/8.0), - REAL_CONST(4473.5239671759227/8.0), - REAL_CONST(4484.4316733599126/8.0), - REAL_CONST(4495.3460164230582/8.0), - REAL_CONST(4506.2669883035496/8.0), - REAL_CONST(4517.1945809640119/8.0), - REAL_CONST(4528.1287863913894/8.0), - REAL_CONST(4539.069596596828/8.0), - REAL_CONST(4550.0170036155587/8.0), - REAL_CONST(4560.9709995067806/8.0), - REAL_CONST(4571.931576353546/8.0), - REAL_CONST(4582.898726262647/8.0), - REAL_CONST(4593.8724413645004/8.0), - REAL_CONST(4604.8527138130348/8.0), - REAL_CONST(4615.8395357855816/8.0), - REAL_CONST(4626.8328994827571/8.0), - REAL_CONST(4637.8327971283588/8.0), - REAL_CONST(4648.8392209692511/8.0), - REAL_CONST(4659.8521632752563/8.0), - REAL_CONST(4670.8716163390473/8.0), - REAL_CONST(4681.8975724760394/8.0), - REAL_CONST(4692.9300240242837/8.0), - REAL_CONST(4703.9689633443595/8.0), - REAL_CONST(4715.0143828192668/8.0), - REAL_CONST(4726.0662748543255/8.0), - REAL_CONST(4737.1246318770682/8.0), - REAL_CONST(4748.1894463371373/8.0), - REAL_CONST(4759.2607107061804/8.0), - REAL_CONST(4770.3384174777493/8.0), - REAL_CONST(4781.4225591671993/8.0), - REAL_CONST(4792.5131283115852/8.0), - REAL_CONST(4803.6101174695614/8.0), - REAL_CONST(4814.7135192212854/8.0), - REAL_CONST(4825.8233261683154/8.0), - REAL_CONST(4836.9395309335096/8.0), - REAL_CONST(4848.0621261609349/8.0), - REAL_CONST(4859.1911045157631/8.0), - REAL_CONST(4870.3264586841779/8.0), - REAL_CONST(4881.4681813732768/8.0), - REAL_CONST(4892.6162653109768/8.0), - REAL_CONST(4903.7707032459193/8.0), - REAL_CONST(4914.931487947375/8.0), - REAL_CONST(4926.0986122051509/8.0), - REAL_CONST(4937.2720688294967/8.0), - REAL_CONST(4948.4518506510112/8.0), - REAL_CONST(4959.637950520555/8.0), - REAL_CONST(4970.8303613091521/8.0), - REAL_CONST(4982.0290759079044/8.0), - REAL_CONST(4993.2340872278974/8.0), - REAL_CONST(5004.4453882001153/8.0), - REAL_CONST(5015.6629717753467/8.0), - REAL_CONST(5026.8868309241007/8.0), - REAL_CONST(5038.1169586365131/8.0), - REAL_CONST(5049.353347922266/8.0), - REAL_CONST(5060.5959918104927/8.0), - REAL_CONST(5071.8448833496996/8.0), - REAL_CONST(5083.1000156076734/8.0), - REAL_CONST(5094.3613816713996/8.0), - REAL_CONST(5105.6289746469747/8.0), - REAL_CONST(5116.9027876595246/8.0), - REAL_CONST(5128.18281385312/8.0), - REAL_CONST(5139.4690463906918/8.0), - REAL_CONST(5150.7614784539473/8.0), - REAL_CONST(5162.0601032432933/8.0), - REAL_CONST(5173.3649139777472/8.0), - REAL_CONST(5184.6759038948594/8.0), - REAL_CONST(5195.9930662506322/8.0), - REAL_CONST(5207.3163943194386/8.0), - REAL_CONST(5218.6458813939435/8.0), - REAL_CONST(5229.9815207850224/8.0), - REAL_CONST(5241.3233058216847/8.0), - REAL_CONST(5252.6712298509919/8.0), - REAL_CONST(5264.025286237983/8.0), - REAL_CONST(5275.3854683655954/8.0), - REAL_CONST(5286.7517696345885/8.0), - REAL_CONST(5298.1241834634639/8.0), - REAL_CONST(5309.5027032883945/8.0), - REAL_CONST(5320.887322563146/8.0), - REAL_CONST(5332.2780347589978/8.0), - REAL_CONST(5343.6748333646756/8.0), - REAL_CONST(5355.0777118862716/8.0), - REAL_CONST(5366.4866638471722/8.0), - REAL_CONST(5377.901682787985/8.0), - REAL_CONST(5389.3227622664635/8.0), - REAL_CONST(5400.749895857437/8.0), - REAL_CONST(5412.1830771527357/8.0), - REAL_CONST(5423.622299761123/8.0), - REAL_CONST(5435.067557308219/8.0), - REAL_CONST(5446.5188434364318/8.0), - REAL_CONST(5457.9761518048872/8.0), - REAL_CONST(5469.4394760893592/8.0), - REAL_CONST(5480.9088099821975/8.0), - REAL_CONST(5492.3841471922606/8.0), - REAL_CONST(5503.8654814448455/8.0), - REAL_CONST(5515.3528064816201/8.0), - REAL_CONST(5526.846116060552/8.0), - REAL_CONST(5538.3454039558474/8.0), - REAL_CONST(5549.8506639578736/8.0), - REAL_CONST(5561.3618898731029/8.0), - REAL_CONST(5572.8790755240361/8.0), - REAL_CONST(5584.4022147491451/8.0), - REAL_CONST(5595.9313014027975/8.0), - REAL_CONST(5607.4663293552012/8.0), - REAL_CONST(5619.0072924923297/8.0), - REAL_CONST(5630.5541847158656/8.0), - REAL_CONST(5642.1069999431284/8.0), - REAL_CONST(5653.665732107017/8.0), - REAL_CONST(5665.230375155943/8.0), - REAL_CONST(5676.8009230537655/8.0), - REAL_CONST(5688.3773697797333/8.0), - REAL_CONST(5699.9597093284156/8.0), - REAL_CONST(5711.5479357096474/8.0), - REAL_CONST(5723.1420429484588/8.0), - REAL_CONST(5734.7420250850209/8.0), - REAL_CONST(5746.347876174581/8.0), - REAL_CONST(5757.9595902874016/8.0), - REAL_CONST(5769.5771615087006/8.0), - REAL_CONST(5781.2005839385911/8.0), - REAL_CONST(5792.8298516920213/8.0), - REAL_CONST(5804.4649588987149/8.0), - REAL_CONST(5816.1058997031105/8.0), - REAL_CONST(5827.7526682643065/8.0), - REAL_CONST(5839.4052587559972/8.0), - REAL_CONST(5851.0636653664196/8.0), - REAL_CONST(5862.7278822982908/8.0), - REAL_CONST(5874.3979037687541/8.0), - REAL_CONST(5886.0737240093204/8.0), - REAL_CONST(5897.7553372658094/8.0), - REAL_CONST(5909.4427377982956/8.0), - REAL_CONST(5921.1359198810505/8.0), - REAL_CONST(5932.8348778024874/8.0), - REAL_CONST(5944.5396058651031/8.0), - REAL_CONST(5956.2500983854261/8.0), - REAL_CONST(5967.9663496939575/8.0), - REAL_CONST(5979.6883541351208/8.0), - REAL_CONST(5991.4161060672022/8.0), - REAL_CONST(6003.1495998623004/8.0), - REAL_CONST(6014.8888299062692/8.0), - REAL_CONST(6026.6337905986684/8.0), - REAL_CONST(6038.3844763527022/8.0), - REAL_CONST(6050.1408815951781/8.0), - REAL_CONST(6061.9030007664414/8.0), - REAL_CONST(6073.6708283203316/8.0), - REAL_CONST(6085.4443587241267/8.0), - REAL_CONST(6097.2235864584891/8.0), - REAL_CONST(6109.0085060174197/8.0), - REAL_CONST(6120.7991119081998/8.0), - REAL_CONST(6132.595398651345/8.0), - REAL_CONST(6144.3973607805519/8.0), - REAL_CONST(6156.2049928426459/8.0), - REAL_CONST(6168.0182893975361/8.0), - REAL_CONST(6179.8372450181578/8.0), - REAL_CONST(6191.6618542904307/8.0), - REAL_CONST(6203.4921118132024/8.0), - REAL_CONST(6215.3280121982016/8.0), - REAL_CONST(6227.1695500699925/8.0), - REAL_CONST(6239.0167200659189/8.0), - REAL_CONST(6250.8695168360628/8.0), - REAL_CONST(6262.7279350431891/8.0), - REAL_CONST(6274.5919693627056/8.0), - REAL_CONST(6286.4616144826068/8.0), - REAL_CONST(6298.3368651034316/8.0), - REAL_CONST(6310.2177159382172/8.0), - REAL_CONST(6322.1041617124456/8.0), - REAL_CONST(6333.9961971640032/8.0), - REAL_CONST(6345.8938170431311/8.0), - REAL_CONST(6357.7970161123785/8.0), - REAL_CONST(6369.7057891465583/8.0), - REAL_CONST(6381.6201309327007/8.0), - REAL_CONST(6393.5400362700075/8.0), - REAL_CONST(6405.4654999698032/8.0), - REAL_CONST(6417.3965168554978/8.0), - REAL_CONST(6429.3330817625329/8.0), - REAL_CONST(6441.2751895383453/8.0), - REAL_CONST(6453.2228350423138/8.0), - REAL_CONST(6465.176013145724/8.0), - REAL_CONST(6477.134718731716/8.0), - REAL_CONST(6489.0989466952469/8.0), - REAL_CONST(6501.0686919430445/8.0), - REAL_CONST(6513.0439493935628/8.0), - REAL_CONST(6525.0247139769417/8.0), - REAL_CONST(6537.010980634961/8.0), - REAL_CONST(6549.002744321001/8.0), - REAL_CONST(6560.9999999999973/8.0), - REAL_CONST(6573.0027426483985/8.0), - REAL_CONST(6585.0109672541284/8.0), - REAL_CONST(6597.0246688165371/8.0), - REAL_CONST(6609.0438423463656/8.0), - REAL_CONST(6621.0684828657004/8.0), - REAL_CONST(6633.0985854079354/8.0), - REAL_CONST(6645.134145017727/8.0), - REAL_CONST(6657.1751567509573/8.0), - REAL_CONST(6669.2216156746908/8.0), - REAL_CONST(6681.2735168671343/8.0), - REAL_CONST(6693.3308554176001/8.0), - REAL_CONST(6705.3936264264594/8.0), - REAL_CONST(6717.461825005108/8.0), - REAL_CONST(6729.535446275926/8.0), - REAL_CONST(6741.6144853722335/8.0), - REAL_CONST(6753.6989374382601/8.0), - REAL_CONST(6765.7887976290967/8.0), - REAL_CONST(6777.8840611106634/8.0), - REAL_CONST(6789.9847230596661/8.0), - REAL_CONST(6802.0907786635626/8.0), - REAL_CONST(6814.2022231205201/8.0), - REAL_CONST(6826.3190516393797/8.0), - REAL_CONST(6838.4412594396181/8.0), - REAL_CONST(6850.5688417513074/8.0), - REAL_CONST(6862.701793815083/8.0), - REAL_CONST(6874.840110882099/8.0), - REAL_CONST(6886.9837882139991/8.0), - REAL_CONST(6899.1328210828724/8.0), - REAL_CONST(6911.2872047712199/8.0), - REAL_CONST(6923.4469345719199/8.0), - REAL_CONST(6935.6120057881863/8.0), - REAL_CONST(6947.7824137335365/8.0), - REAL_CONST(6959.9581537317536/8.0), - REAL_CONST(6972.1392211168532/8.0), - REAL_CONST(6984.3256112330409/8.0), - REAL_CONST(6996.5173194346862/8.0), - REAL_CONST(7008.7143410862773/8.0), - REAL_CONST(7020.9166715623942/8.0), - REAL_CONST(7033.1243062476678/8.0), - REAL_CONST(7045.3372405367481/8.0), - REAL_CONST(7057.5554698342685/8.0), - REAL_CONST(7069.7789895548103/8.0), - REAL_CONST(7082.0077951228714/8.0), - REAL_CONST(7094.2418819728273/8.0), - REAL_CONST(7106.4812455489018/8.0), - REAL_CONST(7118.7258813051285/8.0), - REAL_CONST(7130.9757847053224/8.0), - REAL_CONST(7143.2309512230404/8.0), - REAL_CONST(7155.4913763415516/8.0), - REAL_CONST(7167.7570555538041/8.0), - REAL_CONST(7180.0279843623894/8.0), - REAL_CONST(7192.3041582795131/8.0), - REAL_CONST(7204.5855728269571/8.0), - REAL_CONST(7216.8722235360519/8.0), - REAL_CONST(7229.1641059476406/8.0), - REAL_CONST(7241.4612156120484/8.0), - REAL_CONST(7253.7635480890503/8.0), - REAL_CONST(7266.0710989478375/8.0), - REAL_CONST(7278.3838637669869/8.0), - REAL_CONST(7290.7018381344296/8.0), - REAL_CONST(7303.0250176474174/8.0), - REAL_CONST(7315.3533979124932/8.0), - REAL_CONST(7327.6869745454596/8.0), - REAL_CONST(7340.0257431713462/8.0), - REAL_CONST(7352.3696994243801/8.0), - REAL_CONST(7364.7188389479543/8.0), - REAL_CONST(7377.0731573945968/8.0), - REAL_CONST(7389.4326504259407/8.0), - REAL_CONST(7401.7973137126937/8.0), - REAL_CONST(7414.1671429346061/8.0), - REAL_CONST(7426.5421337804428/8.0), - REAL_CONST(7438.922281947951/8.0), - REAL_CONST(7451.3075831438346/8.0), - REAL_CONST(7463.6980330837177/8.0), - REAL_CONST(7476.0936274921214/8.0), - REAL_CONST(7488.4943621024304/8.0), - REAL_CONST(7500.9002326568652/8.0), - REAL_CONST(7513.3112349064522/8.0), - REAL_CONST(7525.7273646109943/8.0), - REAL_CONST(7538.1486175390446/8.0), - REAL_CONST(7550.5749894678729/8.0), - REAL_CONST(7563.0064761834419/8.0), - REAL_CONST(7575.4430734803736/8.0), - REAL_CONST(7587.8847771619248/8.0), - REAL_CONST(7600.3315830399597/8.0), - REAL_CONST(7612.7834869349153/8.0), - REAL_CONST(7625.24048467578/8.0), - REAL_CONST(7637.7025721000637/8.0), - REAL_CONST(7650.1697450537677/8.0), - REAL_CONST(7662.6419993913596/8.0), - REAL_CONST(7675.1193309757446/8.0), - REAL_CONST(7687.6017356782404/8.0), - REAL_CONST(7700.0892093785433/8.0), - REAL_CONST(7712.5817479647112/8.0), - REAL_CONST(7725.079347333125/8.0), - REAL_CONST(7737.5820033884729/8.0), - REAL_CONST(7750.0897120437139/8.0), - REAL_CONST(7762.6024692200581/8.0), - REAL_CONST(7775.1202708469355/8.0), - REAL_CONST(7787.6431128619733/8.0), - REAL_CONST(7800.1709912109645/8.0), - REAL_CONST(7812.7039018478481/8.0), - REAL_CONST(7825.2418407346768/8.0), - REAL_CONST(7837.7848038415968/8.0), - REAL_CONST(7850.3327871468155/8.0), - REAL_CONST(7862.8857866365806/8.0), - REAL_CONST(7875.4437983051539/8.0), - REAL_CONST(7888.006818154784/8.0), - REAL_CONST(7900.5748421956796/8.0), - REAL_CONST(7913.1478664459901/8.0), - REAL_CONST(7925.725886931772/8.0), - REAL_CONST(7938.3088996869719/8.0), - REAL_CONST(7950.8969007533951/8.0), - REAL_CONST(7963.4898861806851/8.0), - REAL_CONST(7976.0878520262959/8.0), - REAL_CONST(7988.6907943554688/8.0), - REAL_CONST(8001.2987092412086/8.0), - REAL_CONST(8013.911592764257/8.0), - REAL_CONST(8026.5294410130691/8.0), - REAL_CONST(8039.1522500837891/8.0), - REAL_CONST(8051.7800160802271/8.0), - REAL_CONST(8064.412735113835/8.0), - REAL_CONST(8077.0504033036796/8.0), - REAL_CONST(8089.6930167764222/8.0), - REAL_CONST(8102.3405716662946/8.0), - REAL_CONST(8114.9930641150731/8.0), - REAL_CONST(8127.6504902720571/8.0), - REAL_CONST(8140.3128462940449/8.0), - REAL_CONST(8152.9801283453098/8.0), - REAL_CONST(8165.6523325975786/8.0), - REAL_CONST(8178.3294552300049/8.0), - REAL_CONST(8191.0114924291529/8.0), - REAL_CONST(8203.6984403889655/8.0), - REAL_CONST(8216.3902953107463/8.0), - REAL_CONST(8229.0870534031419/8.0), - REAL_CONST(8241.7887108821069/8.0), - REAL_CONST(8254.4952639708936/8.0), - REAL_CONST(8267.2067089000211/8.0), - REAL_CONST(8279.9230419072574/8.0), - REAL_CONST(8292.6442592375952/8.0), - REAL_CONST(8305.3703571432306/8.0), - REAL_CONST(8318.101331883543/8.0), - REAL_CONST(8330.8371797250657/8.0), - REAL_CONST(8343.577896941475/8.0), - REAL_CONST(8356.3234798135582/8.0), - REAL_CONST(8369.0739246291978/8.0), - REAL_CONST(8381.8292276833508/8.0), - REAL_CONST(8394.5893852780209/8.0), - REAL_CONST(8407.3543937222421/8.0), - REAL_CONST(8420.1242493320569/8.0), - REAL_CONST(8432.8989484304948/8.0), - REAL_CONST(8445.6784873475499/8.0), - REAL_CONST(8458.4628624201578/8.0), - REAL_CONST(8471.2520699921806/8.0), - REAL_CONST(8484.0461064143838/8.0), - REAL_CONST(8496.8449680444082/8.0), - REAL_CONST(8509.6486512467636/8.0), - REAL_CONST(8522.4571523927953/8.0), - REAL_CONST(8535.270467860666/8.0), - REAL_CONST(8548.0885940353437/8.0), - REAL_CONST(8560.9115273085663/8.0), - REAL_CONST(8573.7392640788403/8.0), - REAL_CONST(8586.5718007514006/8.0), - REAL_CONST(8599.4091337382069/8.0), - REAL_CONST(8612.2512594579148/8.0), - REAL_CONST(8625.0981743358552/8.0), - REAL_CONST(8637.9498748040205/8.0), - REAL_CONST(8650.8063573010386/8.0), - REAL_CONST(8663.6676182721567/8.0), - REAL_CONST(8676.533654169225/8.0), - REAL_CONST(8689.4044614506638/8.0), - REAL_CONST(8702.2800365814601/8.0), - REAL_CONST(8715.1603760331418/8.0), - REAL_CONST(8728.0454762837508/8.0), - REAL_CONST(8740.9353338178389/8.0), - REAL_CONST(8753.8299451264356/8.0), - REAL_CONST(8766.7293067070332/8.0), - REAL_CONST(8779.6334150635721/8.0), - REAL_CONST(8792.5422667064158/8.0), - REAL_CONST(8805.4558581523324/8.0), - REAL_CONST(8818.3741859244819/8.0), - REAL_CONST(8831.2972465523908/8.0), - REAL_CONST(8844.2250365719356/8.0), - REAL_CONST(8857.1575525253265/8.0), - REAL_CONST(8870.0947909610859/8.0), - REAL_CONST(8883.0367484340295/8.0), - REAL_CONST(8895.9834215052524/8.0), - REAL_CONST(8908.934806742107/8.0), - REAL_CONST(8921.8909007181846/8.0), - REAL_CONST(8934.8517000132997/8.0), - REAL_CONST(8947.817201213471/8.0), - REAL_CONST(8960.7874009109/8.0), - REAL_CONST(8973.7622957039603/8.0), - REAL_CONST(8986.7418821971733/8.0), - REAL_CONST(8999.7261570011924/8.0), - REAL_CONST(9012.7151167327884/8.0), - REAL_CONST(9025.7087580148236/8.0), - REAL_CONST(9038.7070774762469/8.0), - REAL_CONST(9051.7100717520643/8.0), - REAL_CONST(9064.7177374833282/8.0), - REAL_CONST(9077.7300713171153/8.0), - REAL_CONST(9090.7470699065179/8.0), - REAL_CONST(9103.7687299106146/8.0), - REAL_CONST(9116.7950479944648/8.0), - REAL_CONST(9129.8260208290812/8.0), - REAL_CONST(9142.8616450914233/8.0), - REAL_CONST(9155.9019174643727/8.0), - REAL_CONST(9168.9468346367157/8.0), - REAL_CONST(9181.9963933031358/8.0), - REAL_CONST(9195.0505901641845/8.0), - REAL_CONST(9208.1094219262741/8.0), - REAL_CONST(9221.1728853016557/8.0), - REAL_CONST(9234.240977008405/8.0), - REAL_CONST(9247.3136937704076/8.0), - REAL_CONST(9260.3910323173386/8.0), - REAL_CONST(9273.472989384647/8.0), - REAL_CONST(9286.5595617135423/8.0), - REAL_CONST(9299.6507460509747/8.0), - REAL_CONST(9312.7465391496207/8.0), - REAL_CONST(9325.8469377678684/8.0), - REAL_CONST(9338.9519386698012/8.0), - REAL_CONST(9352.0615386251757/8.0), - REAL_CONST(9365.1757344094131/8.0), - REAL_CONST(9378.2945228035842/8.0), - REAL_CONST(9391.4179005943843/8.0), - REAL_CONST(9404.5458645741273/8.0), - REAL_CONST(9417.6784115407263/8.0), - REAL_CONST(9430.8155382976747/8.0), - REAL_CONST(9443.9572416540359/8.0), - REAL_CONST(9457.1035184244265/8.0), - REAL_CONST(9470.2543654290002/8.0), - REAL_CONST(9483.4097794934296/8.0), - REAL_CONST(9496.5697574488931/8.0), - REAL_CONST(9509.7342961320664/8.0), - REAL_CONST(9522.9033923850911/8.0), - REAL_CONST(9536.0770430555804/8.0), - REAL_CONST(9549.2552449965824/8.0), - REAL_CONST(9562.4379950665825/8.0), - REAL_CONST(9575.6252901294793/8.0), - REAL_CONST(9588.8171270545736/8.0), - REAL_CONST(9602.0135027165488/8.0), - REAL_CONST(9615.2144139954635/8.0), - REAL_CONST(9628.4198577767274/8.0), - REAL_CONST(9641.629830951093/8.0), - REAL_CONST(9654.844330414644/8.0), - REAL_CONST(9668.0633530687719/8.0), - REAL_CONST(9681.286895820167/8.0), - REAL_CONST(9694.5149555808002/8.0), - REAL_CONST(9707.7475292679192/8.0), - REAL_CONST(9720.9846138040157/8.0), - REAL_CONST(9734.2262061168276/8.0), - REAL_CONST(9747.4723031393187/8.0), - REAL_CONST(9760.7229018096641/8.0), - REAL_CONST(9773.9779990712323/8.0), - REAL_CONST(9787.2375918725811/8.0), - REAL_CONST(9800.5016771674327/8.0), - REAL_CONST(9813.7702519146696/8.0), - REAL_CONST(9827.0433130783094/8.0), - REAL_CONST(9840.3208576275028/8.0), - REAL_CONST(9853.602882536512/8.0), - REAL_CONST(9866.8893847846994/8.0), - REAL_CONST(9880.1803613565116/8.0), - REAL_CONST(9893.4758092414686/8.0), - REAL_CONST(9906.7757254341523/8.0), - REAL_CONST(9920.0801069341851/8.0), - REAL_CONST(9933.3889507462245/8.0), - REAL_CONST(9946.7022538799429/8.0), - REAL_CONST(9960.0200133500221/8.0), - REAL_CONST(9973.3422261761298/8.0), - REAL_CONST(9986.6688893829159/8.0), - REAL_CONST(9999.9999999999945/8.0), - REAL_CONST(10013.335555061929/8.0), - REAL_CONST(10026.675551608221/8.0), - REAL_CONST(10040.019986683301/8.0), - REAL_CONST(10053.368857336509/8.0), - REAL_CONST(10066.722160622081/8.0), - REAL_CONST(10080.079893599144/8.0), - REAL_CONST(10093.442053331697/8.0), - REAL_CONST(10106.808636888598/8.0), - REAL_CONST(10120.179641343551/8.0), - REAL_CONST(10133.555063775095/8.0), - REAL_CONST(10146.934901266595/8.0), - REAL_CONST(10160.31915090622/8.0), - REAL_CONST(10173.707809786936/8.0), - REAL_CONST(10187.100875006496/8.0), - REAL_CONST(10200.498343667417/8.0), - REAL_CONST(10213.900212876984/8.0), - REAL_CONST(10227.306479747222/8.0), - REAL_CONST(10240.717141394889/8.0), - REAL_CONST(10254.132194941467/8.0), - REAL_CONST(10267.551637513146/8.0), - REAL_CONST(10280.975466240814/8.0), - REAL_CONST(10294.40367826004/8.0), - REAL_CONST(10307.836270711066/8.0), - REAL_CONST(10321.273240738796/8.0), - REAL_CONST(10334.71458549278/8.0) -}; - -#endif - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: iq_table.h,v 1.20 2007/11/01 12:33:31 menno Exp $ +**/ + +#ifndef IQ_TABLE_H__ +#define IQ_TABLE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +/* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */ + + +#ifndef FIXED_POINT + +#define IQ_TABLE_SIZE 8192 + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + +ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = +{ + 0, + 1, + 2.5198420997897464, + 4.3267487109222245, + 6.3496042078727974, + 8.5498797333834844, + 10.902723556992836, + 13.390518279406722, + 15.999999999999998, + 18.720754407467133, + 21.544346900318832, + 24.463780996262464, + 27.47314182127996, + 30.567350940369842, + 33.741991698453212, + 36.993181114957046, + 40.317473596635935, + 43.711787041189993, + 47.173345095760126, + 50.699631325716943, + 54.288352331898118, + 57.937407704003519, + 61.6448652744185, + 65.408940536585988, + 69.227979374755591, + 73.100443455321638, + 77.024897778591622, + 80.999999999999986, + 85.024491212518527, + 89.097187944889555, + 93.216975178615741, + 97.382800224133163, + 101.59366732596474, + 105.84863288986224, + 110.14680124343441, + 114.4873208566006, + 118.86938096020653, + 123.29220851090024, + 127.75506545836058, + 132.25724627755247, + 136.79807573413572, + 141.37690685569191, + 145.99311908523086, + 150.6461165966291, + 155.33532675434674, + 160.06019870205279, + 164.82020206673349, + 169.61482576651861, + 174.44357691188537, + 179.30597979112557, + 184.20157493201927, + 189.12991823257562, + 194.09058015449685, + 199.08314497371677, + 204.1072100829694, + 209.16238534187647, + 214.24829247050752, + 219.36456448277784, + 224.51084515641216, + 229.6867885365223, + 234.89205847013176, + 240.12632816923249, + 245.38927980018505, + 250.68060409747261, + 255.99999999999991, + 261.34717430828869, + 266.72184136106449, + 272.12372272986045, + 277.55254693037961, + 283.0080491494619, + 288.48997098659891, + 293.99806020902247, + 299.53207051947408, + 305.0917613358298, + 310.67689758182206, + 316.28724948815585, + 321.92259240337177, + 327.58270661385535, + 333.26737717243742, + 338.97639373507025, + 344.70955040510125, + 350.46664558470013, + 356.24748183302603, + 362.05186573075139, + 367.87960775058258, + 373.73052213344511, + 379.60442677002078, + 385.50114308734607, + 391.42049594019937, + 397.36231350702371, + 403.32642719014467, + 409.31267152006262, + 415.32088406360799, + 421.35090533576471, + 427.40257871497619, + 433.4757503617617, + 439.5702691404793, + 445.68598654408271, + 451.82275662172759, + 457.98043590909128, + 464.15888336127773, + 470.35796028818726, + 476.5775302922363, + 482.81745920832043, + 489.07761504591741, + 495.35786793323581, + 501.65809006331688, + 507.97815564200368, + 514.31794083769648, + 520.67732373281672, + 527.05618427690604, + 533.45440424129174, + 539.87186717525128, + 546.30845836361505, + 552.76406478574609, + 559.23857507584194, + 565.73187948450413, + 572.24386984152341, + 578.77443951983378, + 585.32348340058843, + 591.89089783931263, + 598.47658063309257, + 605.08043098876044, + 611.70234949203643, + 618.3422380775919, + 624.99999999999977, + 631.67553980553748, + 638.36876330481164, + 645.07957754617485, + 651.80789078990415, + 658.55361248311499, + 665.31665323538357, + 672.09692479505225, + 678.8943400261943, + 685.70881288621433, + 692.540258404062, + 699.38859265903977, + 706.25373276018058, + 713.13559682617972, + 720.03410396586037, + 726.94917425915435, + 733.88072873858209, + 740.82868937121543, + 747.79297904110535, + 754.77352153216191, + 761.77024151147043, + 768.78306451302956, + 775.81191692189896, + 782.85672595874246, + 789.91741966475445, + 796.99392688695798, + 804.08617726386274, + 811.19410121147098, + 818.31762990962227, + 825.45669528866563, + 832.61123001644864, + 839.78116748561604, + 846.96644180120552, + 854.16698776853514, + 861.38274088137143, + 868.61363731036977, + 875.85961389178203, + 883.12060811641959, + 890.39655811886757, + 897.68740266694181, + 904.99308115138172, + 912.31353357577188, + 919.64870054668756, + 926.99852326405619, + 934.36294351172899, + 941.74190364825859, + 949.13534659787422, + 956.54321584165211, + 963.96545540887348, + 971.40200986856541, + 978.85282432122176, + 986.31784439069588, + 993.7970162162635, + 1001.29028644485, + 1008.797602223418, + 1016.3189111915103, + 1023.8541614739464, + 1031.4033016736653, + 1038.9662808647138, + 1046.5430485853758, + 1054.1335548314366, + 1061.7377500495838, + 1069.3555851309357, + 1076.9870114046978, + 1084.6319806319441, + 1092.2904449995174, + 1099.9623571140482, + 1107.6476699960892, + 1115.3463370743607, + 1123.058312180106, + 1130.7835495415541, + 1138.5220037784854, + 1146.273629896901, + 1154.0383832837879, + 1161.816219701986, + 1169.607095285146, + 1177.4109665327808, + 1185.2277903054078, + 1193.0575238197798, + 1200.9001246442001, + 1208.7555506939248, + 1216.6237602266442, + 1224.5047118380478, + 1232.3983644574657, + 1240.3046773435874, + 1248.2236100802568, + 1256.1551225723395, + 1264.099175041662, + 1272.0557280230228, + 1280.0247423602691, + 1288.0061792024444, + 1295.9999999999995, + 1304.006166501068, + 1312.0246407478062, + 1320.0553850727929, + 1328.0983620954903, + 1336.1535347187651, + 1344.2208661254647, + 1352.3003197750522, + 1360.3918594002962, + 1368.4954490040145, + 1376.6110528558709, + 1384.7386354892244, + 1392.8781616980295, + 1401.0295965337855, + 1409.1929053025353, + 1417.3680535619119, + 1425.5550071182327, + 1433.7537320236374, + 1441.9641945732744, + 1450.1863613025282, + 1458.4201989842913, + 1466.6656746262797, + 1474.9227554683875, + 1483.1914089800841, + 1491.4716028578516, + 1499.7633050226596, + 1508.0664836174794, + 1516.3811070048375, + 1524.7071437644029, + 1533.0445626906128, + 1541.3933327903342, + 1549.7534232805581, + 1558.1248035861302, + 1566.507443337515, + 1574.9013123685909, + 1583.3063807144795, + 1591.7226186094069, + 1600.1499964845941, + 1608.58848496618, + 1617.0380548731737, + 1625.4986772154357, + 1633.9703231916887, + 1642.4529641875577, + 1650.9465717736346, + 1659.4511177035752, + 1667.9665739122186, + 1676.4929125137353, + 1685.030105799801, + 1693.5781262377957, + 1702.136946469027, + 1710.7065393069795, + 1719.2868777355877, + 1727.8779349075323, + 1736.4796841425596, + 1745.092098925825, + 1753.7151529062583, + 1762.3488198949503, + 1770.9930738635628, + 1779.6478889427597, + 1788.3132394206564, + 1796.9890997412947, + 1805.6754445031333, + 1814.3722484575621, + 1823.0794865074322, + 1831.7971337056094, + 1840.5251652535437, + 1849.2635564998579, + 1858.0122829389563, + 1866.7713202096493, + 1875.5406440937966, + 1884.3202305149687, + 1893.110055537124, + 1901.9100953633042, + 1910.7203263343454, + 1919.5407249276057, + 1928.3712677557098, + 1937.2119315653083, + 1946.0626932358525, + 1954.923529778386, + 1963.79441833435, + 1972.6753361744036, + 1981.5662606972594, + 1990.467169428533, + 1999.3780400196069, + 2008.2988502465078, + 2017.2295780087982, + 2026.1702013284819, + 2035.1206983489212, + 2044.0810473337688, + 2053.0512266659125, + 2062.0312148464309, + 2071.0209904935646, + 2080.0205323416958, + 2089.0298192403443, + 2098.0488301531714, + 2107.0775441569995, + 2116.115940440839, + 2125.1639983049317, + 2134.2216971597995, + 2143.2890165253098, + 2152.3659360297484, + 2161.4524354089031, + 2170.5484945051617, + 2179.6540932666144, + 2188.7692117461711, + 2197.8938301006888, + 2207.0279285901042, + 2216.1714875765838, + 2225.324487523676, + 2234.4869089954782, + 2243.6587326558101, + 2252.8399392673982, + 2262.0305096910702, + 2271.2304248849537, + 2280.4396659036897, + 2289.6582138976523, + 2298.8860501121762, + 2308.1231558867926, + 2317.3695126544767, + 2326.6251019409005, + 2335.8899053636933, + 2345.1639046317132, + 2354.4470815443233, + 2363.7394179906792, + 2373.0408959490205, + 2382.3514974859731, + 2391.6712047558558, + 2400.9999999999991, + 2410.3378655460651, + 2419.6847838073813, + 2429.0407372822747, + 2438.4057085534191, + 2447.7796802871858, + 2457.1626352330004, + 2466.5545562227112, + 2475.9554261699564, + 2485.3652280695474, + 2494.7839449968492, + 2504.2115601071737, + 2513.6480566351788, + 2523.0934178942675, + 2532.5476272760025, + 2542.0106682495189, + 2551.482524360948, + 2560.9631792328441, + 2570.4526165636184, + 2579.9508201269791, + 2589.4577737713744, + 2598.9734614194458, + 2608.4978670674823, + 2618.0309747848837, + 2627.5727687136259, + 2637.1232330677353, + 2646.6823521327647, + 2656.2501102652768, + 2665.8264918923328, + 2675.4114815109842, + 2685.0050636877722, + 2694.6072230582295, + 2704.2179443263894, + 2713.8372122642972, + 2723.4650117115279, + 2733.1013275747096, + 2742.7461448270483, + 2752.3994485078601, + 2762.0612237221085, + 2771.7314556399419, + 2781.4101294962406, + 2791.0972305901655, + 2800.7927442847094, + 2810.4966560062589, + 2820.2089512441521, + 2829.9296155502466, + 2839.6586345384894, + 2849.3959938844923, + 2859.1416793251065, + 2868.8956766580086, + 2878.6579717412847, + 2888.4285504930212, + 2898.2073988908974, + 2907.9945029717837, + 2917.789848831344, + 2927.5934226236377, + 2937.4052105607311, + 2947.2251989123079, + 2957.0533740052865, + 2966.8897222234368, + 2976.734230007005, + 2986.5868838523397, + 2996.4476703115197, + 3006.3165759919889, + 3016.1935875561908, + 3026.0786917212095, + 3035.9718752584108, + 3045.8731249930906, + 3055.7824278041207, + 3065.6997706236039, + 3075.625140436528, + 3085.5585242804245, + 3095.4999092450298, + 3105.4492824719491, + 3115.4066311543256, + 3125.3719425365089, + 3135.3452039137287, + 3145.3264026317715, + 3155.3155260866592, + 3165.3125617243295, + 3175.3174970403229, + 3185.3303195794679, + 3195.35101693557, + 3205.3795767511078, + 3215.4159867169251, + 3225.460234571929, + 3235.5123081027928, + 3245.5721951436558, + 3255.63988357583, + 3265.7153613275095, + 3275.7986163734795, + 3285.8896367348289, + 3295.9884104786665, + 3306.0949257178395, + 3316.2091706106517, + 3326.331133360588, + 3336.4608022160378, + 3346.5981654700231, + 3356.7432114599264, + 3366.8959285672249, + 3377.0563052172211, + 3387.2243298787821, + 3397.3999910640764, + 3407.5832773283128, + 3417.7741772694862, + 3427.9726795281199, + 3438.1787727870123, + 3448.3924457709873, + 3458.6136872466445, + 3468.8424860221107, + 3479.0788309467976, + 3489.3227109111554, + 3499.5741148464344, + 3509.8330317244445, + 3520.0994505573185, + 3530.3733603972751, + 3540.6547503363886, + 3550.9436095063534, + 3561.239927078258, + 3571.5436922623535, + 3581.8548943078308, + 3592.1735225025936, + 3602.4995661730372, + 3612.8330146838275, + 3623.1738574376814, + 3633.5220838751502, + 3643.8776834744031, + 3654.2406457510142, + 3664.6109602577494, + 3674.9886165843564, + 3685.3736043573545, + 3695.7659132398294, + 3706.1655329312248, + 3716.5724531671399, + 3726.9866637191262, + 3737.4081543944876, + 3747.8369150360782, + 3758.2729355221072, + 3768.7162057659411, + 3779.1667157159077, + 3789.6244553551055, + 3800.0894147012082, + 3810.5615838062768, + 3821.0409527565694, + 3831.5275116723533, + 3842.0212507077194, + 3852.522160050396, + 3863.0302299215673, + 3873.5454505756893, + 3884.0678123003108, + 3894.5973054158922, + 3905.1339202756285, + 3915.6776472652732, + 3926.2284768029604, + 3936.7863993390338, + 3947.3514053558706, + 3957.9234853677135, + 3968.5026299204969, + 3979.0888295916798, + 3989.6820749900776, + 4000.2823567556948, + 4010.8896655595613, + 4021.5039921035655, + 4032.1253271202945, + 4042.7536613728694, + 4053.3889856547858, + 4064.0312907897551, + 4074.6805676315448, + 4085.3368070638221, + 4095.9999999999982, + 4106.6701373830711, + 4117.347210185475, + 4128.0312094089259, + 4138.722126084268, + 4149.4199512713267, + 4160.1246760587583, + 4170.8362915638982, + 4181.5547889326181, + 4192.2801593391769, + 4203.0123939860741, + 4213.7514841039101, + 4224.4974209512384, + 4235.2501958144258, + 4246.0098000075095, + 4256.7762248720574, + 4267.549461777031, + 4278.3295021186423, + 4289.1163373202198, + 4299.9099588320714, + 4310.7103581313495, + 4321.5175267219138, + 4332.3314561342004, + 4343.152137925088, + 4353.9795636777671, + 4364.8137250016052, + 4375.6546135320223, + 4386.5022209303588, + 4397.3565388837469, + 4408.2175591049827, + 4419.0852733324018, + 4429.9596733297531, + 4440.8407508860728, + 4451.7284978155603, + 4462.6229059574571, + 4473.5239671759227, + 4484.4316733599126, + 4495.3460164230582, + 4506.2669883035496, + 4517.1945809640119, + 4528.1287863913894, + 4539.069596596828, + 4550.0170036155587, + 4560.9709995067806, + 4571.931576353546, + 4582.898726262647, + 4593.8724413645004, + 4604.8527138130348, + 4615.8395357855816, + 4626.8328994827571, + 4637.8327971283588, + 4648.8392209692511, + 4659.8521632752563, + 4670.8716163390473, + 4681.8975724760394, + 4692.9300240242837, + 4703.9689633443595, + 4715.0143828192668, + 4726.0662748543255, + 4737.1246318770682, + 4748.1894463371373, + 4759.2607107061804, + 4770.3384174777493, + 4781.4225591671993, + 4792.5131283115852, + 4803.6101174695614, + 4814.7135192212854, + 4825.8233261683154, + 4836.9395309335096, + 4848.0621261609349, + 4859.1911045157631, + 4870.3264586841779, + 4881.4681813732768, + 4892.6162653109768, + 4903.7707032459193, + 4914.931487947375, + 4926.0986122051509, + 4937.2720688294967, + 4948.4518506510112, + 4959.637950520555, + 4970.8303613091521, + 4982.0290759079044, + 4993.2340872278974, + 5004.4453882001153, + 5015.6629717753467, + 5026.8868309241007, + 5038.1169586365131, + 5049.353347922266, + 5060.5959918104927, + 5071.8448833496996, + 5083.1000156076734, + 5094.3613816713996, + 5105.6289746469747, + 5116.9027876595246, + 5128.18281385312, + 5139.4690463906918, + 5150.7614784539473, + 5162.0601032432933, + 5173.3649139777472, + 5184.6759038948594, + 5195.9930662506322, + 5207.3163943194386, + 5218.6458813939435, + 5229.9815207850224, + 5241.3233058216847, + 5252.6712298509919, + 5264.025286237983, + 5275.3854683655954, + 5286.7517696345885, + 5298.1241834634639, + 5309.5027032883945, + 5320.887322563146, + 5332.2780347589978, + 5343.6748333646756, + 5355.0777118862716, + 5366.4866638471722, + 5377.901682787985, + 5389.3227622664635, + 5400.749895857437, + 5412.1830771527357, + 5423.622299761123, + 5435.067557308219, + 5446.5188434364318, + 5457.9761518048872, + 5469.4394760893592, + 5480.9088099821975, + 5492.3841471922606, + 5503.8654814448455, + 5515.3528064816201, + 5526.846116060552, + 5538.3454039558474, + 5549.8506639578736, + 5561.3618898731029, + 5572.8790755240361, + 5584.4022147491451, + 5595.9313014027975, + 5607.4663293552012, + 5619.0072924923297, + 5630.5541847158656, + 5642.1069999431284, + 5653.665732107017, + 5665.230375155943, + 5676.8009230537655, + 5688.3773697797333, + 5699.9597093284156, + 5711.5479357096474, + 5723.1420429484588, + 5734.7420250850209, + 5746.347876174581, + 5757.9595902874016, + 5769.5771615087006, + 5781.2005839385911, + 5792.8298516920213, + 5804.4649588987149, + 5816.1058997031105, + 5827.7526682643065, + 5839.4052587559972, + 5851.0636653664196, + 5862.7278822982908, + 5874.3979037687541, + 5886.0737240093204, + 5897.7553372658094, + 5909.4427377982956, + 5921.1359198810505, + 5932.8348778024874, + 5944.5396058651031, + 5956.2500983854261, + 5967.9663496939575, + 5979.6883541351208, + 5991.4161060672022, + 6003.1495998623004, + 6014.8888299062692, + 6026.6337905986684, + 6038.3844763527022, + 6050.1408815951781, + 6061.9030007664414, + 6073.6708283203316, + 6085.4443587241267, + 6097.2235864584891, + 6109.0085060174197, + 6120.7991119081998, + 6132.595398651345, + 6144.3973607805519, + 6156.2049928426459, + 6168.0182893975361, + 6179.8372450181578, + 6191.6618542904307, + 6203.4921118132024, + 6215.3280121982016, + 6227.1695500699925, + 6239.0167200659189, + 6250.8695168360628, + 6262.7279350431891, + 6274.5919693627056, + 6286.4616144826068, + 6298.3368651034316, + 6310.2177159382172, + 6322.1041617124456, + 6333.9961971640032, + 6345.8938170431311, + 6357.7970161123785, + 6369.7057891465583, + 6381.6201309327007, + 6393.5400362700075, + 6405.4654999698032, + 6417.3965168554978, + 6429.3330817625329, + 6441.2751895383453, + 6453.2228350423138, + 6465.176013145724, + 6477.134718731716, + 6489.0989466952469, + 6501.0686919430445, + 6513.0439493935628, + 6525.0247139769417, + 6537.010980634961, + 6549.002744321001, + 6560.9999999999973, + 6573.0027426483985, + 6585.0109672541284, + 6597.0246688165371, + 6609.0438423463656, + 6621.0684828657004, + 6633.0985854079354, + 6645.134145017727, + 6657.1751567509573, + 6669.2216156746908, + 6681.2735168671343, + 6693.3308554176001, + 6705.3936264264594, + 6717.461825005108, + 6729.535446275926, + 6741.6144853722335, + 6753.6989374382601, + 6765.7887976290967, + 6777.8840611106634, + 6789.9847230596661, + 6802.0907786635626, + 6814.2022231205201, + 6826.3190516393797, + 6838.4412594396181, + 6850.5688417513074, + 6862.701793815083, + 6874.840110882099, + 6886.9837882139991, + 6899.1328210828724, + 6911.2872047712199, + 6923.4469345719199, + 6935.6120057881863, + 6947.7824137335365, + 6959.9581537317536, + 6972.1392211168532, + 6984.3256112330409, + 6996.5173194346862, + 7008.7143410862773, + 7020.9166715623942, + 7033.1243062476678, + 7045.3372405367481, + 7057.5554698342685, + 7069.7789895548103, + 7082.0077951228714, + 7094.2418819728273, + 7106.4812455489018, + 7118.7258813051285, + 7130.9757847053224, + 7143.2309512230404, + 7155.4913763415516, + 7167.7570555538041, + 7180.0279843623894, + 7192.3041582795131, + 7204.5855728269571, + 7216.8722235360519, + 7229.1641059476406, + 7241.4612156120484, + 7253.7635480890503, + 7266.0710989478375, + 7278.3838637669869, + 7290.7018381344296, + 7303.0250176474174, + 7315.3533979124932, + 7327.6869745454596, + 7340.0257431713462, + 7352.3696994243801, + 7364.7188389479543, + 7377.0731573945968, + 7389.4326504259407, + 7401.7973137126937, + 7414.1671429346061, + 7426.5421337804428, + 7438.922281947951, + 7451.3075831438346, + 7463.6980330837177, + 7476.0936274921214, + 7488.4943621024304, + 7500.9002326568652, + 7513.3112349064522, + 7525.7273646109943, + 7538.1486175390446, + 7550.5749894678729, + 7563.0064761834419, + 7575.4430734803736, + 7587.8847771619248, + 7600.3315830399597, + 7612.7834869349153, + 7625.24048467578, + 7637.7025721000637, + 7650.1697450537677, + 7662.6419993913596, + 7675.1193309757446, + 7687.6017356782404, + 7700.0892093785433, + 7712.5817479647112, + 7725.079347333125, + 7737.5820033884729, + 7750.0897120437139, + 7762.6024692200581, + 7775.1202708469355, + 7787.6431128619733, + 7800.1709912109645, + 7812.7039018478481, + 7825.2418407346768, + 7837.7848038415968, + 7850.3327871468155, + 7862.8857866365806, + 7875.4437983051539, + 7888.006818154784, + 7900.5748421956796, + 7913.1478664459901, + 7925.725886931772, + 7938.3088996869719, + 7950.8969007533951, + 7963.4898861806851, + 7976.0878520262959, + 7988.6907943554688, + 8001.2987092412086, + 8013.911592764257, + 8026.5294410130691, + 8039.1522500837891, + 8051.7800160802271, + 8064.412735113835, + 8077.0504033036796, + 8089.6930167764222, + 8102.3405716662946, + 8114.9930641150731, + 8127.6504902720571, + 8140.3128462940449, + 8152.9801283453098, + 8165.6523325975786, + 8178.3294552300049, + 8191.0114924291529, + 8203.6984403889655, + 8216.3902953107463, + 8229.0870534031419, + 8241.7887108821069, + 8254.4952639708936, + 8267.2067089000211, + 8279.9230419072574, + 8292.6442592375952, + 8305.3703571432306, + 8318.101331883543, + 8330.8371797250657, + 8343.577896941475, + 8356.3234798135582, + 8369.0739246291978, + 8381.8292276833508, + 8394.5893852780209, + 8407.3543937222421, + 8420.1242493320569, + 8432.8989484304948, + 8445.6784873475499, + 8458.4628624201578, + 8471.2520699921806, + 8484.0461064143838, + 8496.8449680444082, + 8509.6486512467636, + 8522.4571523927953, + 8535.270467860666, + 8548.0885940353437, + 8560.9115273085663, + 8573.7392640788403, + 8586.5718007514006, + 8599.4091337382069, + 8612.2512594579148, + 8625.0981743358552, + 8637.9498748040205, + 8650.8063573010386, + 8663.6676182721567, + 8676.533654169225, + 8689.4044614506638, + 8702.2800365814601, + 8715.1603760331418, + 8728.0454762837508, + 8740.9353338178389, + 8753.8299451264356, + 8766.7293067070332, + 8779.6334150635721, + 8792.5422667064158, + 8805.4558581523324, + 8818.3741859244819, + 8831.2972465523908, + 8844.2250365719356, + 8857.1575525253265, + 8870.0947909610859, + 8883.0367484340295, + 8895.9834215052524, + 8908.934806742107, + 8921.8909007181846, + 8934.8517000132997, + 8947.817201213471, + 8960.7874009109, + 8973.7622957039603, + 8986.7418821971733, + 8999.7261570011924, + 9012.7151167327884, + 9025.7087580148236, + 9038.7070774762469, + 9051.7100717520643, + 9064.7177374833282, + 9077.7300713171153, + 9090.7470699065179, + 9103.7687299106146, + 9116.7950479944648, + 9129.8260208290812, + 9142.8616450914233, + 9155.9019174643727, + 9168.9468346367157, + 9181.9963933031358, + 9195.0505901641845, + 9208.1094219262741, + 9221.1728853016557, + 9234.240977008405, + 9247.3136937704076, + 9260.3910323173386, + 9273.472989384647, + 9286.5595617135423, + 9299.6507460509747, + 9312.7465391496207, + 9325.8469377678684, + 9338.9519386698012, + 9352.0615386251757, + 9365.1757344094131, + 9378.2945228035842, + 9391.4179005943843, + 9404.5458645741273, + 9417.6784115407263, + 9430.8155382976747, + 9443.9572416540359, + 9457.1035184244265, + 9470.2543654290002, + 9483.4097794934296, + 9496.5697574488931, + 9509.7342961320664, + 9522.9033923850911, + 9536.0770430555804, + 9549.2552449965824, + 9562.4379950665825, + 9575.6252901294793, + 9588.8171270545736, + 9602.0135027165488, + 9615.2144139954635, + 9628.4198577767274, + 9641.629830951093, + 9654.844330414644, + 9668.0633530687719, + 9681.286895820167, + 9694.5149555808002, + 9707.7475292679192, + 9720.9846138040157, + 9734.2262061168276, + 9747.4723031393187, + 9760.7229018096641, + 9773.9779990712323, + 9787.2375918725811, + 9800.5016771674327, + 9813.7702519146696, + 9827.0433130783094, + 9840.3208576275028, + 9853.602882536512, + 9866.8893847846994, + 9880.1803613565116, + 9893.4758092414686, + 9906.7757254341523, + 9920.0801069341851, + 9933.3889507462245, + 9946.7022538799429, + 9960.0200133500221, + 9973.3422261761298, + 9986.6688893829159, + 9999.9999999999945, + 10013.335555061929, + 10026.675551608221, + 10040.019986683301, + 10053.368857336509, + 10066.722160622081, + 10080.079893599144, + 10093.442053331697, + 10106.808636888598, + 10120.179641343551, + 10133.555063775095, + 10146.934901266595, + 10160.31915090622, + 10173.707809786936, + 10187.100875006496, + 10200.498343667417, + 10213.900212876984, + 10227.306479747222, + 10240.717141394889, + 10254.132194941467, + 10267.551637513146, + 10280.975466240814, + 10294.40367826004, + 10307.836270711066, + 10321.273240738796, + 10334.71458549278, + 10348.160302127204, + 10361.610387800878, + 10375.064839677221, + 10388.523654924258, + 10401.986830714593, + 10415.454364225412, + 10428.926252638465, + 10442.402493140049, + 10455.883082921007, + 10469.368019176709, + 10482.85729910704, + 10496.350919916393, + 10509.848878813653, + 10523.351173012188, + 10536.857799729838, + 10550.3687561889, + 10563.884039616123, + 10577.403647242685, + 10590.927576304197, + 10604.455824040679, + 10617.988387696556, + 10631.525264520642, + 10645.066451766135, + 10658.611946690598, + 10672.161746555956, + 10685.715848628475, + 10699.274250178762, + 10712.836948481747, + 10726.403940816675, + 10739.975224467091, + 10753.550796720834, + 10767.130654870027, + 10780.714796211059, + 10794.303218044579, + 10807.895917675487, + 10821.492892412922, + 10835.094139570248, + 10848.699656465047, + 10862.309440419107, + 10875.923488758415, + 10889.541798813138, + 10903.16436791762, + 10916.791193410372, + 10930.422272634056, + 10944.05760293548, + 10957.697181665582, + 10971.341006179427, + 10984.98907383619, + 10998.641381999149, + 11012.297928035676, + 11025.958709317223, + 11039.623723219316, + 11053.292967121541, + 11066.966438407539, + 11080.64413446499, + 11094.326052685608, + 11108.012190465128, + 11121.702545203296, + 11135.397114303863, + 11149.095895174571, + 11162.798885227143, + 11176.506081877278, + 11190.217482544635, + 11203.933084652828, + 11217.652885629415, + 11231.376882905886, + 11245.105073917659, + 11258.837456104062, + 11272.574026908333, + 11286.314783777601, + 11300.059724162888, + 11313.808845519083, + 11327.562145304952, + 11341.319620983111, + 11355.081270020033, + 11368.847089886023, + 11382.617078055218, + 11396.391232005579, + 11410.169549218874, + 11423.952027180676, + 11437.738663380349, + 11451.529455311042, + 11465.324400469679, + 11479.123496356951, + 11492.926740477304, + 11506.734130338931, + 11520.545663453764, + 11534.361337337466, + 11548.181149509423, + 11562.005097492724, + 11575.83317881417, + 11589.665391004253, + 11603.501731597149, + 11617.342198130715, + 11631.186788146468, + 11645.035499189589, + 11658.888328808911, + 11672.745274556904, + 11686.606333989675, + 11700.471504666955, + 11714.340784152086, + 11728.214170012021, + 11742.091659817312, + 11755.973251142101, + 11769.858941564111, + 11783.748728664636, + 11797.642610028539, + 11811.540583244237, + 11825.442645903697, + 11839.34879560242, + 11853.259029939445, + 11867.173346517333, + 11881.091742942155, + 11895.014216823492, + 11908.940765774427, + 11922.871387411526, + 11936.806079354839, + 11950.744839227897, + 11964.687664657684, + 11978.634553274653, + 11992.585502712702, + 12006.540510609168, + 12020.499574604828, + 12034.462692343877, + 12048.429861473938, + 12062.401079646032, + 12076.376344514589, + 12090.355653737433, + 12104.339004975769, + 12118.326395894188, + 12132.317824160644, + 12146.313287446457, + 12160.312783426305, + 12174.316309778205, + 12188.323864183525, + 12202.335444326955, + 12216.351047896511, + 12230.370672583531, + 12244.394316082657, + 12258.421976091831, + 12272.453650312296, + 12286.489336448574, + 12300.529032208471, + 12314.572735303058, + 12328.620443446678, + 12342.672154356922, + 12356.727865754638, + 12370.787575363909, + 12384.851280912055, + 12398.918980129623, + 12412.990670750381, + 12427.066350511306, + 12441.146017152583, + 12455.229668417589, + 12469.317302052901, + 12483.40891580827, + 12497.50450743663, + 12511.604074694078, + 12525.707615339878, + 12539.815127136444, + 12553.926607849342, + 12568.042055247275, + 12582.161467102082, + 12596.284841188726, + 12610.41217528529, + 12624.543467172971, + 12638.678714636069, + 12652.817915461985, + 12666.961067441209, + 12681.108168367316, + 12695.259216036962, + 12709.414208249869, + 12723.573142808827, + 12737.736017519681, + 12751.902830191326, + 12766.073578635704, + 12780.248260667788, + 12794.426874105588, + 12808.609416770132, + 12822.795886485468, + 12836.986281078653, + 12851.180598379744, + 12865.378836221802, + 12879.580992440871, + 12893.787064875984, + 12907.997051369144, + 12922.210949765335, + 12936.428757912496, + 12950.650473661524, + 12964.876094866273, + 12979.105619383534, + 12993.339045073039, + 13007.576369797454, + 13021.817591422368, + 13036.062707816285, + 13050.311716850629, + 13064.564616399723, + 13078.821404340792, + 13093.082078553954, + 13107.346636922217, + 13121.615077331464, + 13135.887397670458, + 13150.163595830827, + 13164.44366970706, + 13178.727617196502, + 13193.015436199352, + 13207.307124618648, + 13221.602680360265, + 13235.902101332911, + 13250.205385448118, + 13264.512530620239, + 13278.823534766434, + 13293.138395806676, + 13307.457111663734, + 13321.779680263176, + 13336.106099533356, + 13350.436367405409, + 13364.77048181325, + 13379.108440693562, + 13393.450241985796, + 13407.795883632158, + 13422.145363577607, + 13436.498679769853, + 13450.855830159346, + 13465.216812699266, + 13479.581625345529, + 13493.950266056772, + 13508.32273279435, + 13522.699023522329, + 13537.079136207483, + 13551.463068819286, + 13565.850819329906, + 13580.2423857142, + 13594.63776594971, + 13609.036958016657, + 13623.439959897927, + 13637.846769579081, + 13652.257385048335, + 13666.67180429656, + 13681.090025317284, + 13695.512046106669, + 13709.937864663521, + 13724.367478989278, + 13738.800887088004, + 13753.238086966385, + 13767.679076633727, + 13782.123854101939, + 13796.572417385545, + 13811.024764501659, + 13825.480893469998, + 13839.94080231286, + 13854.404489055134, + 13868.871951724283, + 13883.34318835034, + 13897.818196965914, + 13912.296975606168, + 13926.779522308825, + 13941.26583511416, + 13955.755912064991, + 13970.249751206682, + 13984.747350587126, + 13999.248708256751, + 14013.753822268511, + 14028.262690677873, + 14042.775311542828, + 14057.291682923867, + 14071.811802883994, + 14086.335669488704, + 14100.863280805994, + 14115.394634906341, + 14129.92972986271, + 14144.468563750548, + 14159.01113464777, + 14173.55744063476, + 14188.107479794369, + 14202.661250211901, + 14217.218749975118, + 14231.779977174227, + 14246.344929901879, + 14260.913606253163, + 14275.486004325601, + 14290.062122219146, + 14304.641958036171, + 14319.225509881464, + 14333.812775862236, + 14348.403754088098, + 14362.998442671067, + 14377.59683972556, + 14392.198943368388, + 14406.804751718748, + 14421.414262898223, + 14436.027475030774, + 14450.64438624274, + 14465.264994662828, + 14479.889298422106, + 14494.517295654005, + 14509.148984494313, + 14523.784363081166, + 14538.423429555049, + 14553.066182058781, + 14567.712618737527, + 14582.362737738777, + 14597.016537212348, + 14611.674015310382, + 14626.33517018734, + 14640.999999999993, + 14655.668502907418, + 14670.340677071003, + 14685.016520654426, + 14699.696031823671, + 14714.379208746999, + 14729.066049594967, + 14743.756552540408, + 14758.45071575843, + 14773.148537426418, + 14787.850015724018, + 14802.555148833142, + 14817.263934937961, + 14831.976372224897, + 14846.692458882624, + 14861.41219310206, + 14876.135573076363, + 14890.862597000923, + 14905.593263073371, + 14920.327569493558, + 14935.065514463557, + 14949.807096187662, + 14964.552312872382, + 14979.301162726431, + 14994.053643960735, + 15008.809754788414, + 15023.569493424788, + 15038.332858087369, + 15053.099846995858, + 15067.870458372134, + 15082.644690440264, + 15097.422541426484, + 15112.204009559202, + 15126.989093068994, + 15141.777790188597, + 15156.570099152905, + 15171.366018198967, + 15186.165545565986, + 15200.968679495301, + 15215.775418230402, + 15230.585760016909, + 15245.399703102579, + 15260.217245737298, + 15275.038386173073, + 15289.863122664035, + 15304.691453466432, + 15319.523376838621, + 15334.358891041069, + 15349.197994336346, + 15364.040684989128, + 15378.886961266177, + 15393.736821436356, + 15408.590263770609, + 15423.447286541972, + 15438.307888025554, + 15453.172066498542, + 15468.039820240196, + 15482.91114753184, + 15497.786046656869, + 15512.664515900733, + 15527.546553550939, + 15542.432157897045, + 15557.32132723066, + 15572.214059845435, + 15587.110354037064, + 15602.010208103273, + 15616.913620343823, + 15631.820589060506, + 15646.731112557136, + 15661.645189139546, + 15676.562817115593, + 15691.483994795139, + 15706.408720490062, + 15721.336992514242, + 15736.268809183561, + 15751.204168815901, + 15766.143069731135, + 15781.085510251132, + 15796.03148869974, + 15810.981003402798, + 15825.934052688119, + 15840.890634885489, + 15855.850748326673, + 15870.814391345401, + 15885.781562277361, + 15900.752259460214, + 15915.726481233565, + 15930.704225938984, + 15945.685491919978, + 15960.670277522009, + 15975.658581092481, + 15990.65040098073, + 16005.645735538035, + 16020.644583117599, + 16035.646942074556, + 16050.652810765967, + 16065.662187550806, + 16080.675070789974, + 16095.691458846273, + 16110.711350084424, + 16125.734742871053, + 16140.761635574685, + 16155.792026565747, + 16170.825914216561, + 16185.863296901338, + 16200.904172996183, + 16215.948540879079, + 16230.996398929899, + 16246.047745530386, + 16261.102579064163, + 16276.160897916721, + 16291.22270047542, + 16306.287985129484, + 16321.356750269995, + 16336.428994289896, + 16351.504715583982, + 16366.5839125489, + 16381.666583583141, + 16396.752727087041, + 16411.842341462776, + 16426.935425114363, + 16442.031976447644, + 16457.131993870298, + 16472.235475791829, + 16487.342420623561, + 16502.452826778641, + 16517.566692672033, + 16532.684016720516, + 16547.804797342676, + 16562.929032958902, + 16578.056721991394, + 16593.18786286415, + 16608.322454002962, + 16623.460493835417, + 16638.601980790896, + 16653.746913300558, + 16668.895289797354, + 16684.047108716015, + 16699.202368493046, + 16714.361067566726, + 16729.523204377107, + 16744.688777366009, + 16759.857784977012, + 16775.030225655464, + 16790.206097848466, + 16805.385400004874, + 16820.568130575302, + 16835.754288012104, + 16850.943870769381, + 16866.136877302983, + 16881.333306070494, + 16896.53315553123, + 16911.736424146249, + 16926.943110378332, + 16942.153212691992, + 16957.366729553454, + 16972.583659430682, + 16987.804000793338, + 17003.027752112816, + 17018.254911862205, + 17033.485478516312, + 17048.719450551645, + 17063.956826446421, + 17079.197604680547, + 17094.44178373563, + 17109.689362094967, + 17124.940338243552, + 17140.194710668064, + 17155.452477856852, + 17170.713638299967, + 17185.978190489128, + 17201.246132917724, + 17216.517464080825, + 17231.792182475165, + 17247.070286599141, + 17262.351774952826, + 17277.636646037936, + 17292.924898357855, + 17308.216530417623, + 17323.511540723921, + 17338.809927785089, + 17354.111690111105, + 17369.416826213594, + 17384.725334605821, + 17400.037213802683, + 17415.352462320716, + 17430.67107867809, + 17445.993061394587, + 17461.318408991636, + 17476.647119992274, + 17491.979192921168, + 17507.314626304586, + 17522.653418670423, + 17537.995568548187, + 17553.341074468986, + 17568.689934965536, + 17584.042148572156, + 17599.397713824768, + 17614.75662926089, + 17630.118893419625, + 17645.484504841683, + 17660.853462069354, + 17676.225763646511, + 17691.601408118619, + 17706.980394032718, + 17722.362719937424, + 17737.748384382936, + 17753.137385921014, + 17768.529723104999, + 17783.92539448979, + 17799.324398631856, + 17814.726734089225, + 17830.13239942148, + 17845.541393189767, + 17860.95371395678, + 17876.369360286772, + 17891.788330745527, + 17907.210623900395, + 17922.636238320254, + 17938.065172575527, + 17953.497425238176, + 17968.932994881692, + 17984.371880081104, + 17999.814079412972, + 18015.259591455371, + 18030.708414787914, + 18046.160547991731, + 18061.615989649465, + 18077.074738345284, + 18092.536792664861, + 18108.002151195393, + 18123.470812525571, + 18138.942775245599, + 18154.418037947191, + 18169.896599223546, + 18185.37845766938, + 18200.863611880886, + 18216.352060455767, + 18231.843801993204, + 18247.338835093873, + 18262.837158359936, + 18278.338770395032, + 18293.84366980429, + 18309.351855194309, + 18324.863325173166, + 18340.378078350412, + 18355.896113337069, + 18371.417428745623, + 18386.942023190033, + 18402.469895285718, + 18418.00104364955, + 18433.53546689987, + 18449.073163656474, + 18464.614132540602, + 18480.158372174956, + 18495.705881183676, + 18511.256658192357, + 18526.810701828035, + 18542.368010719183, + 18557.928583495715, + 18573.492418788985, + 18589.059515231773, + 18604.629871458303, + 18620.203486104212, + 18635.78035780658, + 18651.360485203899, + 18666.943866936086, + 18682.53050164448, + 18698.120387971841, + 18713.713524562332, + 18729.30991006154, + 18744.909543116457, + 18760.512422375479, + 18776.118546488418, + 18791.727914106479, + 18807.340523882274, + 18822.95637446981, + 18838.575464524489, + 18854.197792703111, + 18869.823357663863, + 18885.452158066328, + 18901.08419257147, + 18916.719459841639, + 18932.357958540564, + 18947.999687333362, + 18963.644644886521, + 18979.292829867907, + 18994.944240946759, + 19010.598876793687, + 19026.256736080668, + 19041.917817481048, + 19057.582119669532, + 19073.2496413222, + 19088.920381116473, + 19104.594337731145, + 19120.271509846356, + 19135.951896143604, + 19151.635495305738, + 19167.322306016948, + 19183.012326962784, + 19198.705556830122, + 19214.401994307198, + 19230.101638083579, + 19245.804486850167, + 19261.510539299208, + 19277.219794124274, + 19292.932250020265, + 19308.647905683421, + 19324.366759811302, + 19340.088811102793, + 19355.8140582581, + 19371.542499978754, + 19387.2741349676, + 19403.008961928797, + 19418.746979567823, + 19434.488186591469, + 19450.232581707827, + 19465.980163626304, + 19481.730931057613, + 19497.484882713761, + 19513.242017308068, + 19529.002333555141, + 19544.765830170898, + 19560.532505872539, + 19576.302359378566, + 19592.075389408761, + 19607.851594684209, + 19623.630973927269, + 19639.41352586159, + 19655.199249212103, + 19670.988142705017, + 19686.780205067826, + 19702.575435029288, + 19718.373831319448, + 19734.175392669615, + 19749.980117812371, + 19765.788005481569, + 19781.599054412323, + 19797.413263341008, + 19813.230631005274, + 19829.051156144014, + 19844.874837497395, + 19860.701673806827, + 19876.531663814985, + 19892.364806265789, + 19908.201099904403, + 19924.040543477258, + 19939.883135732012, + 19955.728875417579, + 19971.577761284105, + 19987.429792082985, + 20003.284966566847, + 20019.14328348956, + 20035.004741606219, + 20050.869339673161, + 20066.737076447946, + 20082.607950689362, + 20098.481961157428, + 20114.359106613385, + 20130.239385819699, + 20146.122797540058, + 20162.009340539353, + 20177.899013583716, + 20193.791815440476, + 20209.687744878182, + 20225.586800666591, + 20241.488981576669, + 20257.394286380597, + 20273.302713851754, + 20289.214262764715, + 20305.128931895277, + 20321.046720020415, + 20336.967625918318, + 20352.891648368361, + 20368.818786151114, + 20384.749038048347, + 20400.682402843009, + 20416.618879319249, + 20432.558466262391, + 20448.501162458953, + 20464.446966696629, + 20480.395877764302, + 20496.347894452025, + 20512.303015551031, + 20528.261239853735, + 20544.22256615372, + 20560.186993245738, + 20576.15451992572, + 20592.125144990758, + 20608.098867239107, + 20624.075685470198, + 20640.055598484618, + 20656.038605084115, + 20672.024704071595, + 20688.013894251126, + 20704.006174427926, + 20720.001543408373, + 20735.999999999989, + 20752.001543011454, + 20768.006171252597, + 20784.013883534382, + 20800.024678668931, + 20816.038555469506, + 20832.055512750507, + 20848.075549327474, + 20864.098664017085, + 20880.124855637161, + 20896.154123006647, + 20912.186464945626, + 20928.221880275312, + 20944.260367818049, + 20960.301926397311, + 20976.346554837684, + 20992.394251964895, + 21008.445016605787, + 21024.498847588318, + 21040.555743741574, + 21056.615703895754, + 21072.678726882168, + 21088.744811533252, + 21104.813956682538, + 21120.886161164683, + 21136.961423815443, + 21153.039743471683, + 21169.121118971379, + 21185.205549153605, + 21201.293032858535, + 21217.383568927453, + 21233.477156202731, + 21249.573793527841, + 21265.673479747358, + 21281.776213706937, + 21297.881994253334, + 21313.990820234398, + 21330.102690499054, + 21346.21760389733, + 21362.335559280327, + 21378.456555500241, + 21394.580591410333, + 21410.707665864964, + 21426.83777771956, + 21442.970925830628, + 21459.107109055756, + 21475.246326253604, + 21491.388576283895, + 21507.533858007431, + 21523.682170286087, + 21539.833511982797, + 21555.987881961566, + 21572.145279087465, + 21588.305702226615, + 21604.469150246216, + 21620.635622014521, + 21636.805116400832, + 21652.977632275521, + 21669.153168510009, + 21685.331723976764, + 21701.513297549318, + 21717.697888102244, + 21733.885494511167, + 21750.076115652759, + 21766.269750404736, + 21782.466397645861, + 21798.666056255934, + 21814.868725115801, + 21831.074403107345, + 21847.283089113484, + 21863.494782018177, + 21879.709480706417, + 21895.927184064229, + 21912.147890978667, + 21928.371600337818, + 21944.598311030797, + 21960.828021947746, + 21977.060731979829, + 21993.296440019243, + 22009.535144959198, + 22025.77684569393, + 22042.021541118691, + 22058.269230129757, + 22074.519911624411, + 22090.773584500959, + 22107.030247658717, + 22123.289899998013, + 22139.552540420187, + 22155.818167827587, + 22172.086781123569, + 22188.358379212495, + 22204.632960999726, + 22220.910525391639, + 22237.191071295601, + 22253.474597619981, + 22269.761103274148, + 22286.050587168469, + 22302.343048214312, + 22318.638485324027, + 22334.936897410968, + 22351.23828338947, + 22367.542642174871, + 22383.849972683485, + 22400.160273832618, + 22416.473544540564, + 22432.789783726603, + 22449.108990310986, + 22465.431163214958, + 22481.75630136074, + 22498.084403671528, + 22514.415469071497, + 22530.749496485802, + 22547.086484840562, + 22563.426433062879, + 22579.769340080824, + 22596.115204823436, + 22612.464026220721, + 22628.815803203655, + 22645.170534704179, + 22661.5282196552, + 22677.888856990587, + 22694.252445645168, + 22710.618984554734, + 22726.988472656034, + 22743.360908886778, + 22759.736292185622, + 22776.114621492186, + 22792.495895747044, + 22808.880113891719, + 22825.267274868678, + 22841.657377621348, + 22858.050421094096, + 22874.446404232243, + 22890.845325982053, + 22907.247185290722, + 22923.651981106406, + 22940.059712378195, + 22956.470378056114, + 22972.883977091129, + 22989.300508435153, + 23005.719971041017, + 23022.142363862498, + 23038.567685854305, + 23054.995935972078, + 23071.427113172387, + 23087.86121641273, + 23104.298244651531, + 23120.738196848146, + 23137.181071962848, + 23153.626868956846, + 23170.075586792263, + 23186.527224432142, + 23202.981780840448, + 23219.439254982066, + 23235.899645822796, + 23252.362952329357, + 23268.829173469378, + 23285.298308211408, + 23301.770355524899, + 23318.245314380223, + 23334.723183748658, + 23351.203962602387, + 23367.687649914504, + 23384.174244659007, + 23400.663745810798, + 23417.15615234568, + 23433.651463240367, + 23450.149677472462, + 23466.650794020472, + 23483.154811863806, + 23499.661729982763, + 23516.171547358543, + 23532.684262973235, + 23549.199875809823, + 23565.718384852185, + 23582.239789085092, + 23598.764087494197, + 23615.291279066041, + 23631.821362788058, + 23648.354337648565, + 23664.890202636761, + 23681.428956742733, + 23697.970598957443, + 23714.515128272738, + 23731.062543681343, + 23747.612844176863, + 23764.166028753778, + 23780.72209640744, + 23797.281046134085, + 23813.842876930816, + 23830.407587795606, + 23846.975177727301, + 23863.545645725622, + 23880.11899079115, + 23896.695211925336, + 23913.274308130498, + 23929.856278409821, + 23946.441121767348, + 23963.028837207989, + 23979.619423737513, + 23996.212880362549, + 24012.809206090584, + 24029.408399929966, + 24046.010460889898, + 24062.615387980433, + 24079.223180212492, + 24095.833836597827, + 24112.447356149063, + 24129.063737879667, + 24145.682980803951, + 24162.305083937081, + 24178.930046295067, + 24195.557866894767, + 24212.188544753884, + 24228.822078890964, + 24245.458468325389, + 24262.097712077397, + 24278.739809168052, + 24295.384758619261, + 24312.032559453768, + 24328.683210695162, + 24345.336711367858, + 24361.993060497109, + 24378.652257108995, + 24395.314300230442, + 24411.979188889192, + 24428.646922113825, + 24445.317498933746, + 24461.990918379193, + 24478.667179481225, + 24495.346281271726, + 24512.028222783407, + 24528.713003049801, + 24545.400621105266, + 24562.091075984976, + 24578.784366724925, + 24595.480492361927, + 24612.179451933614, + 24628.881244478438, + 24645.585869035654, + 24662.293324645343, + 24679.003610348394, + 24695.716725186514, + 24712.432668202211, + 24729.151438438807, + 24745.873034940436, + 24762.597456752032, + 24779.324702919344, + 24796.054772488926, + 24812.787664508123, + 24829.5233780251, + 24846.261912088819, + 24863.003265749034, + 24879.747438056307, + 24896.494428062004, + 24913.244234818278, + 24929.996857378079, + 24946.752294795166, + 24963.510546124078, + 24980.271610420157, + 24997.035486739525, + 25013.802174139113, + 25030.571671676629, + 25047.343978410572, + 25064.119093400237, + 25080.897015705697, + 25097.677744387816, + 25114.461278508239, + 25131.2476171294, + 25148.036759314517, + 25164.828704127583, + 25181.623450633375, + 25198.42099789745, + 25215.221344986145, + 25232.024490966574, + 25248.830434906627, + 25265.639175874974, + 25282.450712941049, + 25299.265045175071, + 25316.082171648024, + 25332.902091431668, + 25349.724803598532, + 25366.550307221914, + 25383.378601375884, + 25400.209685135269, + 25417.043557575678, + 25433.880217773472, + 25450.719664805783, + 25467.561897750507, + 25484.406915686297, + 25501.254717692573, + 25518.105302849512, + 25534.958670238051, + 25551.814818939893, + 25568.67374803748, + 25585.535456614027, + 25602.399943753502, + 25619.267208540619, + 25636.137250060852, + 25653.010067400432, + 25669.885659646327, + 25686.76402588627, + 25703.645165208734, + 25720.529076702944, + 25737.415759458876, + 25754.305212567244, + 25771.197435119517, + 25788.092426207899, + 25804.990184925344, + 25821.890710365547, + 25838.794001622944, + 25855.700057792714, + 25872.608877970775, + 25889.520461253778, + 25906.434806739118, + 25923.351913524923, + 25940.271780710063, + 25957.194407394138, + 25974.11979267748, + 25991.047935661154, + 26007.978835446964, + 26024.912491137442, + 26041.848901835841, + 26058.788066646157, + 26075.729984673108, + 26092.674655022136, + 26109.622076799409, + 26126.572249111829, + 26143.525171067016, + 26160.480841773315, + 26177.43926033979, + 26194.400425876229, + 26211.364337493149, + 26228.330994301767, + 26245.30039541404, + 26262.272539942627, + 26279.247427000919, + 26296.225055703002, + 26313.205425163702, + 26330.188534498539, + 26347.174382823756, + 26364.162969256304, + 26381.154292913852, + 26398.148352914774, + 26415.145148378149, + 26432.144678423778, + 26449.146942172156, + 26466.151938744493, + 26483.159667262702, + 26500.170126849403, + 26517.183316627921, + 26534.199235722277, + 26551.217883257199, + 26568.239258358124, + 26585.263360151173, + 26602.290187763181, + 26619.319740321676, + 26636.352016954883, + 26653.387016791727, + 26670.424738961825, + 26687.465182595493, + 26704.508346823739, + 26721.554230778267, + 26738.602833591467, + 26755.65415439643, + 26772.708192326929, + 26789.764946517433, + 26806.824416103096, + 26823.886600219761, + 26840.95149800396, + 26858.019108592915, + 26875.089431124517, + 26892.162464737365, + 26909.238208570721, + 26926.316661764544, + 26943.397823459472, + 26960.481692796813, + 26977.568268918571, + 26994.657550967422, + 27011.749538086722, + 27028.844229420498, + 27045.941624113464, + 27063.041721311005, + 27080.144520159181, + 27097.250019804727, + 27114.35821939505, + 27131.469118078236, + 27148.582715003027, + 27165.699009318858, + 27182.818000175819, + 27199.939686724665, + 27217.064068116837, + 27234.191143504428, + 27251.320912040203, + 27268.453372877593, + 27285.588525170693, + 27302.726368074269, + 27319.866900743735, + 27337.010122335181, + 27354.156032005358, + 27371.304628911668, + 27388.455912212183, + 27405.609881065626, + 27422.766534631384, + 27439.925872069507, + 27457.087892540683, + 27474.252595206275, + 27491.419979228293, + 27508.5900437694, + 27525.762787992917, + 27542.93821106281, + 27560.116312143706, + 27577.297090400876, + 27594.480545000242, + 27611.666675108383, + 27628.855479892518, + 27646.046958520514, + 27663.241110160889, + 27680.437933982801, + 27697.637429156068, + 27714.839594851132, + 27732.04443023909, + 27749.251934491687, + 27766.462106781299, + 27783.674946280949, + 27800.890452164302, + 27818.108623605654, + 27835.329459779954, + 27852.55295986278, + 27869.779123030345, + 27887.007948459504, + 27904.239435327745, + 27921.473582813196, + 27938.710390094613, + 27955.949856351392, + 27973.19198076355, + 27990.436762511745, + 28007.684200777272, + 28024.934294742041, + 28042.187043588601, + 28059.442446500128, + 28076.700502660427, + 28093.961211253929, + 28111.224571465693, + 28128.490582481401, + 28145.759243487362, + 28163.030553670509, + 28180.304512218394, + 28197.581118319198, + 28214.860371161725, + 28232.14226993539, + 28249.42681383024, + 28266.71400203693, + 28284.003833746745, + 28301.296308151585, + 28318.591424443959, + 28335.889181817001, + 28353.189579464462, + 28370.492616580705, + 28387.798292360701, + 28405.106606000048, + 28422.417556694945, + 28439.731143642206, + 28457.047366039264, + 28474.366223084147, + 28491.687713975512, + 28509.011837912611, + 28526.338594095305, + 28543.667981724069, + 28560.999999999982, + 28578.334648124732, + 28595.671925300605, + 28613.011830730498, + 28630.354363617909, + 28647.699523166943, + 28665.0473085823, + 28682.397719069289, + 28699.750753833818, + 28717.10641208239, + 28734.464693022121, + 28751.825595860708, + 28769.189119806462, + 28786.55526406828, + 28803.924027855664, + 28821.295410378701, + 28838.669410848088, + 28856.046028475103, + 28873.425262471628, + 28890.80711205013, + 28908.191576423673, + 28925.578654805915, + 28942.968346411097, + 28960.360650454055, + 28977.755566150216, + 28995.153092715591, + 29012.553229366786, + 29029.955975320987, + 29047.361329795975, + 29064.769292010107, + 29082.179861182336, + 29099.593036532187, + 29117.00881727978, + 29134.427202645813, + 29151.848191851568, + 29169.271784118911, + 29186.697978670283, + 29204.126774728706, + 29221.55817151779, + 29238.992168261717, + 29256.42876418525, + 29273.867958513725, + 29291.309750473058, + 29308.754139289747, + 29326.201124190855, + 29343.65070440403, + 29361.102879157483, + 29378.557647680012, + 29396.015009200975, + 29413.474962950309, + 29430.937508158524, + 29448.402644056692, + 29465.870369876469, + 29483.340684850071, + 29500.81358821028, + 29518.289079190454, + 29535.767157024511, + 29553.247820946945, + 29570.731070192807, + 29588.216903997723, + 29605.70532159787, + 29623.19632223, + 29640.689905131429, + 29658.186069540028, + 29675.684814694236, + 29693.186139833047, + 29710.690044196028, + 29728.196527023298, + 29745.705587555527, + 29763.217225033964, + 29780.731438700397, + 29798.248227797183, + 29815.76759156723, + 29833.289529254005, + 29850.81404010153, + 29868.341123354381, + 29885.870778257693, + 29903.403004057145, + 29920.937799998974, + 29938.475165329975, + 29956.015099297485, + 29973.557601149394, + 29991.102670134147, + 30008.650305500738, + 30026.200506498706, + 30043.753272378144, + 30061.308602389683, + 30078.866495784507, + 30096.426951814352, + 30113.989969731494, + 30131.55554878875, + 30149.123688239491, + 30166.694387337629, + 30184.267645337608, + 30201.843461494434, + 30219.42183506364, + 30237.002765301309, + 30254.586251464058, + 30272.172292809046, + 30289.760888593977, + 30307.35203807709, + 30324.94574051716, + 30342.541995173502, + 30360.140801305966, + 30377.742158174944, + 30395.346065041358, + 30412.952521166666, + 30430.561525812864, + 30448.173078242475, + 30465.787177718561, + 30483.403823504719, + 30501.02301486507, + 30518.644751064272, + 30536.269031367516, + 30553.895855040515, + 30571.525221349519, + 30589.157129561307, + 30606.791578943175, + 30624.428568762964, + 30642.06809828903, + 30659.710166790261, + 30677.35477353607, + 30695.001917796391, + 30712.651598841687, + 30730.303815942945, + 30747.958568371676, + 30765.615855399912, + 30783.275676300211, + 30800.938030345646, + 30818.602916809814, + 30836.270334966837, + 30853.940284091354, + 30871.612763458521, + 30889.287772344011, + 30906.965310024025, + 30924.645375775272, + 30942.327968874983, + 30960.013088600903, + 30977.700734231294, + 30995.390905044929, + 31013.083600321101, + 31030.778819339619, + 31048.476561380798, + 31066.17682572547, + 31083.879611654978, + 31101.584918451179, + 31119.29274539644, + 31137.003091773637, + 31154.715956866155, + 31172.431339957893, + 31190.14924033326, + 31207.869657277162, + 31225.592590075023, + 31243.318038012771, + 31261.046000376838, + 31278.776476454172, + 31296.50946553221, + 31314.24496689891, + 31331.98297984272, + 31349.7235036526, + 31367.466537618013, + 31385.212081028923, + 31402.960133175795, + 31420.710693349596, + 31438.463760841791, + 31456.219334944351, + 31473.977414949743, + 31491.738000150934, + 31509.501089841389, + 31527.266683315069, + 31545.034779866437, + 31562.80537879045, + 31580.578479382562, + 31598.35408093872, + 31616.132182755369, + 31633.91278412945, + 31651.695884358396, + 31669.481482740131, + 31687.269578573076, + 31705.060171156143, + 31722.853259788735, + 31740.648843770748, + 31758.446922402567, + 31776.247494985066, + 31794.050560819614, + 31811.85611920806, + 31829.664169452753, + 31847.474710856521, + 31865.287742722685, + 31883.103264355046, + 31900.921275057899, + 31918.741774136019, + 31936.564760894671, + 31954.390234639599, + 31972.21819467704, + 31990.048640313704, + 32007.881570856793, + 32025.716985613984, + 32043.554883893445, + 32061.395265003815, + 32079.238128254223, + 32097.083472954269, + 32114.931298414049, + 32132.781603944117, + 32150.634388855524, + 32168.48965245979, + 32186.347394068915, + 32204.207612995371, + 32222.07030855212, + 32239.935480052583, + 32257.803126810672, + 32275.673248140767, + 32293.545843357719, + 32311.420911776862, + 32329.298452713996, + 32347.178465485395, + 32365.060949407813, + 32382.945903798463, + 32400.83332797504, + 32418.723221255706, + 32436.615582959093, + 32454.510412404306, + 32472.407708910916, + 32490.307471798966, + 32508.209700388961, + 32526.114394001877, + 32544.021551959166, + 32561.931173582732, + 32579.843258194956, + 32597.757805118679, + 32615.674813677211, + 32633.594283194328, + 32651.516212994258, + 32669.440602401712, + 32687.367450741847, + 32705.296757340297, + 32723.228521523146, + 32741.162742616943, + 32759.099419948703, + 32777.038552845901, + 32794.980140636464, + 32812.924182648792, + 32830.87067821173, + 32848.819626654593, + 32866.77102730715, + 32884.724879499619, + 32902.681182562686, + 32920.639935827494, + 32938.601138625643, + 32956.56479028918, + 32974.530890150607, + 32992.499437542894, + 33010.470431799447, + 33028.443872254145, + 33046.419758241311, + 33064.39808909571, + 33082.378864152583, + 33100.36208274759, + 33118.347744216881, + 33136.335847897026, + 33154.326393125062, + 33172.31937923847, + 33190.314805575174, + 33208.312671473555, + 33226.312976272442, + 33244.315719311111, + 33262.320899929284, + 33280.328517467125, + 33298.33857126526, + 33316.351060664747, + 33334.365985007091, + 33352.383343634239, + 33370.403135888591, + 33388.42536111299, + 33406.450018650721, + 33424.477107845501, + 33442.506628041512, + 33460.53857858335, + 33478.572958816083, + 33496.609768085189, + 33514.649005736617, + 33532.690671116739, + 33550.734763572356, + 33568.781282450735, + 33586.830227099563, + 33604.881596866973, + 33622.935391101528, + 33640.991609152239, + 33659.050250368542, + 33677.111314100322, + 33695.174799697881, + 33713.240706511984, + 33731.309033893805, + 33749.37978119497, + 33767.452947767531, + 33785.528532963974, + 33803.606536137209, + 33821.686956640602, + 33839.769793827938, + 33857.855047053425, + 33875.942715671707, + 33894.032799037872, + 33912.125296507431, + 33930.220207436316, + 33948.317531180888, + 33966.417267097961, + 33984.519414544746, + 34002.623972878901, + 34020.730941458511, + 34038.840319642077, + 34056.952106788536, + 34075.066302257255, + 34093.182905408015, + 34111.301915601027, + 34129.42333219693, + 34147.547154556785, + 34165.673382042078, + 34183.80201401472, + 34201.933049837033, + 34220.06648887178, + 34238.202330482141, + 34256.340574031703, + 34274.481218884495, + 34292.624264404949, + 34310.769709957938, + 34328.91755490873, + 34347.067798623029, + 34365.220440466954, + 34383.375479807051, + 34401.532916010263, + 34419.692748443973, + 34437.854976475966, + 34456.01959947445, + 34474.18661680806, + 34492.356027845817, + 34510.527831957188, + 34528.702028512052, + 34546.878616880676, + 34565.05759643377, + 34583.238966542449, + 34601.422726578232, + 34619.608875913065, + 34637.797413919296, + 34655.988339969692, + 34674.181653437423, + 34692.37735369608, + 34710.575440119668, + 34728.775912082579, + 34746.978768959649, + 34765.184010126082, + 34783.391634957537, + 34801.60164283005, + 34819.814033120063, + 34838.028805204456, + 34856.24595846048, + 34874.465492265823, + 34892.687405998557, + 34910.911699037177, + 34929.138370760564, + 34947.367420548027, + 34965.598847779271, + 34983.832651834389, + 35002.068832093908, + 35020.307387938738, + 35038.548318750189, + 35056.79162390998, + 35075.03730280025, + 35093.285354803513, + 35111.535779302685, + 35129.788575681116, + 35148.043743322516, + 35166.301281611013, + 35184.561189931141, + 35202.823467667826, + 35221.088114206388, + 35239.355128932555, + 35257.624511232447, + 35275.896260492584, + 35294.170376099886, + 35312.446857441668, + 35330.725703905628, + 35349.006914879887, + 35367.290489752944, + 35385.576427913686, + 35403.864728751418, + 35422.155391655811, + 35440.448416016967, + 35458.743801225341, + 35477.041546671804, + 35495.341651747622, + 35513.644115844436, + 35531.948938354304, + 35550.256118669655, + 35568.565656183309, + 35586.877550288496, + 35605.191800378816, + 35623.508405848268, + 35641.827366091238, + 35660.148680502505, + 35678.472348477233, + 35696.798369410979, + 35715.126742699678, + 35733.457467739659, + 35751.790543927644, + 35770.125970660738, + 35788.46374733642, + 35806.803873352568, + 35825.146348107453, + 35843.49117099971, + 35861.838341428367, + 35880.187858792851, + 35898.539722492955, + 35916.893931928862, + 35935.250486501129, + 35953.609385610718, + 35971.970628658957, + 35990.334215047558, + 36008.700144178612, + 36027.068415454596, + 36045.439028278372, + 36063.811982053165, + 36082.187276182609, + 36100.564910070694, + 36118.944883121789, + 36137.327194740654, + 36155.711844332429, + 36174.098831302617, + 36192.488155057115, + 36210.87981500219, + 36229.273810544473, + 36247.670141091003, + 36266.068806049167, + 36284.469804826738, + 36302.873136831862, + 36321.278801473069, + 36339.686798159251, + 36358.097126299683, + 36376.509785304013, + 36394.924774582258, + 36413.342093544816, + 36431.761741602444, + 36450.183718166292, + 36468.608022647859, + 36487.034654459028, + 36505.463613012063, + 36523.894897719583, + 36542.328507994578, + 36560.764443250409, + 36579.202702900831, + 36597.643286359926, + 36616.086193042182, + 36634.531422362437, + 36652.978973735895, + 36671.428846578143, + 36689.881040305125, + 36708.335554333149, + 36726.792388078902, + 36745.251540959427, + 36763.713012392138, + 36782.176801794812, + 36800.642908585593, + 36819.111332182983, + 36837.582072005869, + 36856.055127473483, + 36874.530498005421, + 36893.008183021651, + 36911.488181942506, + 36929.970494188674, + 36948.455119181206, + 36966.942056341519, + 36985.431305091392, + 37003.922864852961, + 37022.416735048733, + 37040.912915101559, + 37059.411404434657, + 37077.91220247162, + 37096.415308636388, + 37114.920722353243, + 37133.428443046862, + 37151.938470142253, + 37170.450803064785, + 37188.965441240209, + 37207.482384094597, + 37226.001631054402, + 37244.523181546429, + 37263.047034997842, + 37281.573190836149, + 37300.101648489224, + 37318.632407385296, + 37337.165466952945, + 37355.700826621112, + 37374.238485819085, + 37392.778443976509, + 37411.320700523385, + 37429.865254890057, + 37448.412106507232, + 37466.961254805974, + 37485.512699217681, + 37504.066439174116, + 37522.622474107404, + 37541.180803449992, + 37559.741426634704, + 37578.304343094693, + 37596.869552263488, + 37615.43705357494, + 37634.006846463279, + 37652.578930363044, + 37671.153304709165, + 37689.729968936896, + 37708.308922481847, + 37726.890164779965, + 37745.473695267559, + 37764.059513381275, + 37782.647618558112, + 37801.238010235415, + 37819.830687850859, + 37838.425650842495, + 37857.022898648691, + 37875.622430708172, + 37894.224246460013, + 37912.828345343616, + 37931.434726798747, + 37950.043390265506, + 37968.654335184328, + 37987.267560995999, + 38005.883067141665, + 38024.500853062775, + 38043.120918201159, + 38061.743261998963, + 38080.367883898682, + 38098.994783343158, + 38117.623959775563, + 38136.255412639417, + 38154.889141378575, + 38173.525145437234, + 38192.163424259939, + 38210.803977291551, + 38229.446803977284, + 38248.091903762703, + 38266.739276093685, + 38285.388920416466, + 38304.040836177606, + 38322.695022824002, + 38341.351479802899, + 38360.010206561863, + 38378.671202548816, + 38397.334467211993, + 38415.999999999978, + 38434.667800361683, + 38453.33786774637, + 38472.010201603611, + 38490.684801383337, + 38509.361666535784, + 38528.040796511552, + 38546.722190761553, + 38565.405848737035, + 38584.091769889594, + 38602.779953671132, + 38621.470399533908, + 38640.163106930493, + 38658.858075313794, + 38677.555304137059, + 38696.254792853862, + 38714.956540918094, + 38733.660547783991, + 38752.366812906112, + 38771.075335739348, + 38789.78611573892, + 38808.499152360368, + 38827.214445059573, + 38845.931993292739, + 38864.651796516388, + 38883.373854187383, + 38902.098165762916, + 38920.824730700486, + 38939.553548457938, + 38958.284618493431, + 38977.017940265461, + 38995.753513232834, + 39014.491336854699, + 39033.231410590517, + 39051.973733900079, + 39070.718306243485, + 39089.465127081188, + 39108.214195873945, + 39126.965512082832, + 39145.719075169261, + 39164.474884594965, + 39183.232939821988, + 39201.99324031271, + 39220.755785529815, + 39239.52057493633, + 39258.287607995589, + 39277.056884171245, + 39295.828402927284, + 39314.602163728006, + 39333.378166038019, + 39352.15640932227, + 39370.936893046004, + 39389.719616674811, + 39408.504579674584, + 39427.291781511522, + 39446.081221652174, + 39464.872899563372, + 39483.666814712291, + 39502.462966566411, + 39521.261354593538, + 39540.06197826178, + 39558.864837039568, + 39577.669930395656, + 39596.47725779911, + 39615.286818719302, + 39634.098612625923, + 39652.912638988993, + 39671.728897278823, + 39690.547386966064, + 39709.368107521652, + 39728.191058416858, + 39747.016239123259, + 39765.84364911275, + 39784.673287857528, + 39803.505154830105, + 39822.339249503319, + 39841.175571350293, + 39860.014119844491, + 39878.854894459677, + 39897.697894669909, + 39916.54311994958, + 39935.390569773372, + 39954.240243616303, + 39973.092140953675, + 39991.946261261117, + 40010.802604014549, + 40029.661168690225, + 40048.521954764678, + 40067.384961714779, + 40086.250189017679, + 40105.117636150855, + 40123.98730259209, + 40142.859187819471, + 40161.733291311379, + 40180.609612546526, + 40199.488151003912, + 40218.368906162854, + 40237.25187750296, + 40256.137064504153, + 40275.024466646668, + 40293.914083411029, + 40312.805914278084, + 40331.699958728961, + 40350.596216245103, + 40369.494686308273, + 40388.39536840051, + 40407.298262004173, + 40426.20336660192, + 40445.110681676706, + 40464.020206711793, + 40482.931941190756, + 40501.845884597446, + 40520.762036416032, + 40539.680396130985, + 40558.600963227072, + 40577.523737189367, + 40596.448717503234, + 40615.375903654342, + 40634.305295128659, + 40653.236891412453, + 40672.170691992294, + 40691.106696355047, + 40710.044903987873, + 40728.985314378238, + 40747.927927013901, + 40766.872741382918, + 40785.819756973651, + 40804.768973274746, + 40823.720389775161, + 40842.674005964131, + 40861.629821331211, + 40880.587835366234, + 40899.548047559321, + 40918.510457400931, + 40937.475064381761, + 40956.441867992849, + 40975.410867725499, + 40994.382063071331, + 41013.355453522236, + 41032.331038570417, + 41051.308817708363, + 41070.288790428858, + 41089.270956224987, + 41108.255314590111, + 41127.241865017888, + 41146.23060700229, + 41165.221540037543, + 41184.214663618193, + 41203.209977239079, + 41222.207480395307, + 41241.207172582297, + 41260.209053295752, + 41279.213122031659, + 41298.219378286303, + 41317.227821556255, + 41336.23845133838, + 41355.251267129832, + 41374.266268428037, + 41393.283454730743, + 41412.302825535953, + 41431.324380341983, + 41450.348118647416, + 41469.374039951144, + 41488.402143752326, + 41507.432429550427, + 41526.464896845187, + 41545.499545136627, + 41564.536373925075, + 41583.575382711126, + 41602.616570995662, + 41621.659938279874, + 41640.705484065205, + 41659.753207853406, + 41678.803109146495, + 41697.855187446803, + 41716.909442256911, + 41735.965873079709, + 41755.02447941836, + 41774.085260776315, + 41793.148216657297, + 41812.213346565331, + 41831.280650004708, + 41850.350126480014, + 41869.421775496106, + 41888.495596558132, + 41907.571589171515, + 41926.649752841957, + 41945.730087075463, + 41964.812591378286, + 41983.897265256979, + 42002.984108218378, + 42022.073119769593, + 42041.164299418015, + 42060.257646671307, + 42079.353161037419, + 42098.450842024591, + 42117.550689141324, + 42136.652701896404, + 42155.756879798893, + 42174.863222358137, + 42193.971729083758, + 42213.082399485655, + 42232.195233074002, + 42251.310229359246, + 42270.427387852127, + 42289.546708063644, + 42308.668189505079, + 42327.791831687995, + 42346.917634124227, + 42366.045596325886, + 42385.175717805352, + 42404.307998075295, + 42423.442436648642, + 42442.579033038608, + 42461.717786758672, + 42480.858697322597, + 42500.001764244422, + 42519.146987038446, + 42538.294365219248, + 42557.443898301688, + 42576.595585800882, + 42595.749427232236, + 42614.90542211142, + 42634.063569954378, + 42653.223870277317, + 42672.386322596729, + 42691.55092642938, + 42710.717681292292, + 42729.886586702756, + 42749.057642178363, + 42768.23084723694, + 42787.406201396603, + 42806.58370417574, + 42825.76335509299, + 42844.945153667286, + 42864.129099417805, + 42883.315191864014, + 42902.503430525649, + 42921.693814922692, + 42940.88634457541, + 42960.081019004348, + 42979.277837730297, + 42998.476800274322, + 43017.677906157769, + 43036.881154902228, + 43056.086546029583, + 43075.294079061961, + 43094.503753521763, + 43113.715568931671, + 43132.929524814601, + 43152.145620693766, + 43171.363856092619, + 43190.584230534907, + 43209.806743544621, + 43229.031394646016, + 43248.258183363621, + 43267.487109222224, + 43286.718171746885, + 43305.951370462906, + 43325.186704895881, + 43344.42417457165, + 43363.663779016322, + 43382.905517756262, + 43402.149390318104, + 43421.395396228749, + 43440.643535015348, + 43459.89380620532, + 43479.146209326354, + 43498.400743906379, + 43517.657409473606, + 43536.916205556496, + 43556.177131683784, + 43575.44018738444, + 43594.705372187724, + 43613.972685623135, + 43633.242127220445, + 43652.513696509668, + 43671.787393021099, + 43691.063216285271, + 43710.341165833001, + 43729.621241195346, + 43748.903441903625, + 43768.187767489413, + 43787.474217484552, + 43806.762791421126, + 43826.053488831501, + 43845.346309248278, + 43864.641252204325, + 43883.938317232765, + 43903.237503866971, + 43922.538811640596, + 43941.842240087513, + 43961.147788741881, + 43980.455457138101, + 43999.765244810835, + 44019.077151295001, + 44038.391176125755, + 44057.70731883854, + 44077.02557896902, + 44096.345956053141, + 44115.668449627083, + 44134.993059227287, + 44154.319784390456, + 44173.648624653535, + 44192.979579553728, + 44212.312648628489, + 44231.647831415532, + 44250.985127452805, + 44270.324536278538, + 44289.666057431183, + 44309.009690449464, + 44328.355434872348, + 44347.703290239064, + 44367.053256089079, + 44386.405331962109, + 44405.759517398139, + 44425.115811937387, + 44444.474215120332, + 44463.834726487694, + 44483.197345580462, + 44502.562071939843, + 44521.928905107328, + 44541.297844624634, + 44560.668890033732, + 44580.042040876848, + 44599.417296696454, + 44618.794657035272, + 44638.174121436256, + 44657.555689442641, + 44676.939360597877, + 44696.325134445673, + 44715.713010530002, + 44735.102988395054, + 44754.495067585296, + 44773.88924764542, + 44793.285528120374, + 44812.683908555344, + 44832.084388495779, + 44851.486967487363, + 44870.891645076015, + 44890.298420807922, + 44909.707294229491, + 44929.118264887409, + 44948.531332328566, + 44967.946496100136, + 44987.363755749502, + 45006.783110824319, + 45026.204560872473, + 45045.628105442098, + 45065.053744081561, + 45084.48147633949, + 45103.911301764747, + 45123.343219906426, + 45142.777230313885, + 45162.21333253671, + 45181.651526124733, + 45201.091810628037, + 45220.534185596924, + 45239.978650581965, + 45259.425205133957, + 45278.873848803938, + 45298.324581143192, + 45317.777401703235, + 45337.232310035848, + 45356.68930569302, + 45376.148388226997, + 45395.60955719027, + 45415.072812135557, + 45434.538152615823, + 45454.005578184282, + 45473.475088394356, + 45492.946682799746, + 45512.420360954362, + 45531.896122412363, + 45551.373966728155, + 45570.853893456362, + 45590.33590215187, + 45609.819992369776, + 45629.306163665438, + 45648.794415594442, + 45668.284747712612, + 45687.777159576006, + 45707.27165074092, + 45726.768220763894, + 45746.266869201696, + 45765.767595611323, + 45785.270399550034, + 45804.775280575297, + 45824.282238244828, + 45843.79127211657, + 45863.302381748719, + 45882.815566699683, + 45902.33082652813, + 45921.848160792935, + 45941.367569053225, + 45960.889050868354, + 45980.41260579793, + 45999.938233401757, + 46019.465933239902, + 46038.995704872657, + 46058.527547860547, + 46078.06146176433, + 46097.597446144995, + 46117.135500563774, + 46136.675624582109, + 46156.217817761702, + 46175.762079664462, + 46195.308409852543, + 46214.856807888333, + 46234.407273334444, + 46253.959805753715, + 46273.51440470924, + 46293.071069764315, + 46312.629800482478, + 46332.190596427499, + 46351.753457163381, + 46371.318382254351, + 46390.885371264863, + 46410.45442375962, + 46430.025539303526, + 46449.598717461733, + 46469.17395779962, + 46488.751259882782, + 46508.33062327707, + 46527.912047548532, + 46547.495532263471, + 46567.081076988397, + 46586.668681290059, + 46606.258344735434, + 46625.850066891719, + 46645.443847326351, + 46665.039685606986, + 46684.637581301497, + 46704.237533978005, + 46723.839543204842, + 46743.443608550573, + 46763.049729583989, + 46782.657905874104, + 46802.268136990162, + 46821.880422501628, + 46841.494761978196, + 46861.111154989776, + 46880.729601106526, + 46900.350099898795, + 46919.97265093719, + 46939.597253792526, + 46959.223908035841, + 46978.852613238392, + 46998.483368971691, + 47018.11617480743, + 47037.751030317551, + 47057.387935074221, + 47077.026888649809, + 47096.66789061694, + 47116.310940548428, + 47135.956038017328, + 47155.603182596918, + 47175.252373860698, + 47194.903611382375, + 47214.556894735892, + 47234.212223495422, + 47253.869597235338, + 47273.52901553025, + 47293.19047795498, + 47312.853984084577, + 47332.519533494306, + 47352.187125759658, + 47371.856760456343, + 47391.528437160297, + 47411.202155447652, + 47430.877914894787, + 47450.555715078299, + 47470.235555574982, + 47489.917435961863, + 47509.601355816201, + 47529.287314715453, + 47548.975312237308, + 47568.665347959672, + 47588.357421460656, + 47608.051532318605, + 47627.747680112072, + 47647.445864419846, + 47667.14608482091, + 47686.848340894474, + 47706.552632219973, + 47726.258958377046, + 47745.967318945557, + 47765.677713505589, + 47785.390141637428, + 47805.104602921601, + 47824.821096938824, + 47844.539623270044, + 47864.260181496429, + 47883.982771199349, + 47903.707391960394, + 47923.434043361369, + 47943.162724984308, + 47962.893436411439, + 47982.626177225218, + 48002.36094700831, + 48022.097745343599, + 48041.836571814172, + 48061.57742600335, + 48081.32030749465, + 48101.065215871815, + 48120.81215071879, + 48140.56111161974, + 48160.312098159047, + 48180.065109921306, + 48199.820146491307, + 48219.577207454073, + 48239.336292394844, + 48259.097400899045, + 48278.860532552339, + 48298.625686940592, + 48318.392863649875, + 48338.162062266485, + 48357.933282376915, + 48377.706523567889, + 48397.481785426316, + 48417.259067539344, + 48437.038369494308, + 48456.819690878765, + 48476.603031280487, + 48496.388390287451, + 48516.175767487839, + 48535.965162470042, + 48555.756574822684, + 48575.550004134566, + 48595.345449994718, + 48615.142911992378, + 48634.942389716991, + 48654.743882758201, + 48674.547390705877, + 48694.352913150084, + 48714.160449681112, + 48733.969999889443, + 48753.781563365759, + 48773.595139700978, + 48793.410728486211, + 48813.228329312769, + 48833.047941772187, + 48852.869565456189, + 48872.693199956717, + 48892.518844865925, + 48912.346499776155, + 48932.176164279976, + 48952.007837970152, + 48971.841520439666, + 48991.677211281676, + 49011.514910089587, + 49031.354616456978, + 49051.196329977654, + 49071.04005024561, + 49090.885776855059, + 49110.733509400408, + 49130.583247476279, + 49150.434990677488, + 49170.288738599062, + 49190.144490836232, + 49210.002246984441, + 49229.86200663932, + 49249.723769396718, + 49269.587534852675, + 49289.453302603448, + 49309.32107224549, + 49329.190843375451, + 49349.062615590192, + 49368.936388486785, + 49388.812161662492, + 49408.689934714785, + 49428.569707241324, + 49448.45147883999, + 49468.335249108866, + 49488.22101764621, + 49508.108784050521, + 49527.99854792047, + 49547.890308854934, + 49567.784066453009, + 49587.679820313977, + 49607.57757003732, + 49627.477315222721, + 49647.379055470075, + 49667.28279037946, + 49687.188519551179, + 49707.096242585707, + 49727.005959083741, + 49746.917668646165, + 49766.831370874068, + 49786.747065368734, + 49806.66475173166, + 49826.584429564515, + 49846.506098469203, + 49866.429758047794, + 49886.355407902578, + 49906.283047636032, + 49926.212676850846, + 49946.144295149883, + 49966.077902136225, + 49986.013497413151, + 50005.951080584135, + 50025.890651252834, + 50045.832209023123, + 50065.775753499074, + 50085.721284284933, + 50105.668800985164, + 50125.618303204428, + 50145.569790547575, + 50165.523262619652, + 50185.478719025901, + 50205.436159371769, + 50225.395583262893, + 50245.356990305103, + 50265.320380104429, + 50285.285752267104, + 50305.253106399534, + 50325.222442108337, + 50345.193759000336, + 50365.16705668252, + 50385.142334762102, + 50405.119592846473, + 50425.098830543218, + 50445.080047460127, + 50465.063243205179, + 50485.048417386541, + 50505.035569612577, + 50525.024699491856, + 50545.015806633128, + 50565.008890645338, + 50585.003951137631, + 50605.00098771933, + 50624.999999999971, + 50645.000987589265, + 50665.003950097132, + 50685.008887133677, + 50705.015798309192, + 50725.024683234165, + 50745.035541519283, + 50765.048372775411, + 50785.063176613621, + 50805.079952645159, + 50825.098700481489, + 50845.119419734241, + 50865.142110015244, + 50885.166770936521, + 50905.193402110279, + 50925.222003148934, + 50945.252573665071, + 50965.285113271471, + 50985.319621581119, + 51005.356098207172, + 51025.394542762981, + 51045.434954862096, + 51065.477334118244, + 51085.521680145357, + 51105.567992557546, + 51125.616270969113, + 51145.66651499454, + 51165.718724248516, + 51185.772898345916, + 51205.829036901778, + 51225.887139531362, + 51245.947205850105, + 51266.009235473619, + 51286.073228017718, + 51306.139183098399, + 51326.207100331856, + 51346.276979334456, + 51366.348819722756, + 51386.42262111351, + 51406.498383123653, + 51426.57610537031, + 51446.655787470787, + 51466.737429042587, + 51486.82102970338, + 51506.906589071048, + 51526.994106763632, + 51547.083582399391, + 51567.175015596738, + 51587.268405974297, + 51607.363753150858, + 51627.461056745415, + 51647.56031637713, + 51667.661531665362, + 51687.764702229651, + 51707.869827689727, + 51727.976907665499, + 51748.085941777055, + 51768.196929644677, + 51788.309870888836, + 51808.42476513017, + 51828.541611989524, + 51848.660411087905, + 51868.781162046515, + 51888.90386448674, + 51909.028518030143, + 51929.155122298485, + 51949.283676913685, + 51969.414181497872, + 51989.546635673345, + 52009.681039062583, + 52029.817391288263, + 52049.955691973213, + 52070.095940740481, + 52090.238137213273, + 52110.382281014987, + 52130.5283717692, + 52150.676409099666, + 52170.826392630333, + 52190.97832198532, + 52211.132196788931, + 52231.288016665654, + 52251.445781240145, + 52271.60549013727, + 52291.76714298204, + 52311.930739399664, + 52332.096279015546, + 52352.263761455244, + 52372.433186344519, + 52392.604553309284, + 52412.777861975665, + 52432.953111969946, + 52453.130302918595, + 52473.309434448267, + 52493.490506185793, + 52513.67351775818, + 52533.858468792605, + 52554.045358916446, + 52574.234187757254, + 52594.42495494274, + 52614.617660100812, + 52634.812302859558, + 52655.008882847229, + 52675.20739969227, + 52695.407853023295, + 52715.610242469098, + 52735.814567658657, + 52756.02082822111, + 52776.229023785803, + 52796.439153982225, + 52816.651218440056, + 52836.865216789171, + 52857.081148659599, + 52877.29901368155, + 52897.518811485425, + 52917.740541701773, + 52937.964203961354, + 52958.18979789508, + 52978.417323134046, + 52998.646779309529, + 53018.878166052978, + 53039.111482996006, + 53059.346729770419, + 53079.583906008193, + 53099.823011341483, + 53120.0640454026, + 53140.307007824063, + 53160.551898238533, + 53180.79871627887, + 53201.047461578091, + 53221.2981337694, + 53241.550732486176, + 53261.805257361964, + 53282.061708030487, + 53302.32008412564, + 53322.580385281493, + 53342.842611132299, + 53363.106761312469, + 53383.372835456597, + 53403.640833199453, + 53423.910754175973, + 53444.18259802126, + 53464.456364370613, + 53484.732052859479, + 53505.009663123499, + 53525.289194798468, + 53545.570647520362, + 53565.854020925333, + 53586.139314649699, + 53606.426528329954, + 53626.715661602764, + 53647.006714104959, + 53667.299685473547, + 53687.59457534572, + 53707.891383358816, + 53728.190109150361, + 53748.490752358055, + 53768.793312619753, + 53789.09778957349, + 53809.404182857485, + 53829.712492110106, + 53850.022716969899, + 53870.334857075584, + 53890.648912066055, + 53910.964881580367, + 53931.28276525774, + 53951.602562737586, + 53971.924273659461, + 53992.24789766311, + 54012.57343438844, + 54032.90088347553, + 54053.23024456462, + 54073.561517296133, + 54093.894701310644, + 54114.22979624891, + 54134.566801751855, + 54154.90571746057, + 54175.246543016314, + 54195.589278060506, + 54215.933922234755, + 54236.280475180814, + 54256.628936540626, + 54276.97930595628, + 54297.331583070045, + 54317.685767524359, + 54338.041858961828, + 54358.399857025215, + 54378.759761357462, + 54399.121571601667, + 54419.485287401105, + 54439.850908399218, + 54460.218434239614, + 54480.587864566056, + 54500.95919902248, + 54521.332437252997, + 54541.707578901878, + 54562.084623613555, + 54582.46357103264, + 54602.844420803893, + 54623.227172572246, + 54643.611825982807, + 54663.998380680838, + 54684.386836311773, + 54704.777192521207, + 54725.169448954897, + 54745.563605258772, + 54765.959661078923, + 54786.357616061614, + 54806.757469853255, + 54827.159222100439, + 54847.562872449904, + 54867.968420548583, + 54888.375866043534, + 54908.785208582012, + 54929.196447811417, + 54949.609583379322, + 54970.024614933463, + 54990.441542121727, + 55010.86036459219, + 55031.28108199306, + 55051.703693972733, + 55072.128200179759, + 55092.554600262847, + 55112.982893870874, + 55133.413080652877, + 55153.845160258061, + 55174.279132335789, + 55194.714996535586, + 55215.152752507143, + 55235.592399900306, + 55256.033938365079, + 55276.477367551655, + 55296.92268711036, + 55317.369896691685, + 55337.818995946305, + 55358.269984525024, + 55378.72286207883, + 55399.177628258869, + 55419.634282716441, + 55440.092825103013, + 55460.553255070205, + 55481.015572269804, + 55501.479776353764, + 55521.945866974187, + 55542.413843783339, + 55562.883706433655, + 55583.355454577715, + 55603.82908786826, + 55624.304605958219, + 55644.782008500639, + 55665.261295148754, + 55685.742465555952, + 55706.225519375774, + 55726.710456261928, + 55747.197275868275, + 55767.685977848843, + 55788.176561857814, + 55808.669027549528, + 55829.163374578478, + 55849.659602599328, + 55870.157711266889, + 55890.657700236145, + 55911.159569162221, + 55931.663317700411, + 55952.168945506164, + 55972.676452235086, + 55993.185837542944, + 56013.697101085651, + 56034.210242519301, + 56054.72526150012, + 56075.242157684508, + 56095.760930729011, + 56116.281580290342, + 56136.804106025367, + 56157.328507591104, + 56177.85478464474, + 56198.382936843598, + 56218.912963845185, + 56239.444865307138, + 56259.978640887268, + 56280.514290243525, + 56301.051813034042, + 56321.591208917082, + 56342.13247755108, + 56362.675618594607, + 56383.220631706419, + 56403.767516545398, + 56424.316272770608, + 56444.866900041241, + 56465.419398016667, + 56485.973766356394, + 56506.530004720102, + 56527.088112767611, + 56547.648090158902, + 56568.209936554107, + 56588.773651613519, + 56609.339234997584, + 56629.9066863669, + 56650.47600538221, + 56671.04719170442, + 56691.620244994599, + 56712.195164913959, + 56732.771951123868, + 56753.350603285835, + 56773.931121061541, + 56794.513504112823, + 56815.097752101647, + 56835.683864690152, + 56856.271841540627, + 56876.86168231551, + 56897.453386677393, + 56918.046954289028, + 56938.642384813298, + 56959.239677913261, + 56979.838833252121, + 57000.439850493225, + 57021.04272930009, + 57041.647469336371, + 57062.254070265873, + 57082.862531752558, + 57103.472853460553, + 57124.085035054108, + 57144.699076197649, + 57165.314976555739, + 57185.932735793103, + 57206.552353574611, + 57227.173829565276, + 57247.797163430281, + 57268.42235483494, + 57289.049403444733, + 57309.678308925286, + 57330.30907094237, + 57350.941689161911, + 57371.576163249985, + 57392.212492872815, + 57412.850677696784, + 57433.490717388406, + 57454.132611614368, + 57474.776360041491, + 57495.421962336746, + 57516.069418167266, + 57536.718727200314, + 57557.36988910332, + 57578.022903543861, + 57598.677770189643, + 57619.334488708548, + 57639.993058768589, + 57660.653480037938, + 57681.315752184906, + 57701.979874877965, + 57722.64584778573, + 57743.31367057695, + 57763.983342920546, + 57784.654864485572, + 57805.328234941233, + 57826.003453956881, + 57846.680521202026, + 57867.359436346305, + 57888.040199059527, + 57908.722809011633, + 57929.407265872709, + 57950.093569313001, + 57970.781719002895, + 57991.471714612911, + 58012.16355581375, + 58032.857242276223, + 58053.552773671312, + 58074.25014967013, + 58094.949369943948, + 58115.650434164185, + 58136.353342002389, + 58157.058093130276, + 58177.764687219693, + 58198.47312394264, + 58219.183402971255, + 58239.895523977837, + 58260.609486634821, + 58281.325290614775, + 58302.042935590434, + 58322.762421234678, + 58343.483747220511, + 58364.206913221096, + 58384.931918909751, + 58405.658763959924, + 58426.3874480452, + 58447.117970839339, + 58467.85033201622, + 58488.584531249864, + 58509.320568214462, + 58530.058442584334, + 58550.798154033931, + 58571.539702237875, + 58592.283086870906, + 58613.028307607929, + 58633.775364123983, + 58654.52425609425, + 58675.274983194053, + 58696.027545098877, + 58716.781941484325, + 58737.538172026158, + 58758.296236400274, + 58779.056134282728, + 58799.817865349694, + 58820.581429277503, + 58841.346825742643, + 58862.114054421712, + 58882.883114991484, + 58903.654007128847, + 58924.426730510851, + 58945.201284814684, + 58965.977669717664, + 58986.755884897269, + 59007.535930031117, + 59028.317804796949, + 59049.101508872664, + 59069.887041936301, + 59090.674403666046, + 59111.463593740213, + 59132.254611837263, + 59153.047457635803, + 59173.84213081457, + 59194.638631052461, + 59215.436958028506, + 59236.237111421855, + 59257.039090911829, + 59277.842896177877, + 59298.648526899589, + 59319.455982756685, + 59340.26526342905, + 59361.076368596696, + 59381.889297939757, + 59402.704051138542, + 59423.520627873484, + 59444.339027825139, + 59465.159250674224, + 59485.9812961016, + 59506.805163788253, + 59527.630853415307, + 59548.458364664046, + 59569.287697215863, + 59590.118850752311, + 59610.951824955089, + 59631.786619506012, + 59652.623234087048, + 59673.461668380311, + 59694.301922068029, + 59715.143994832593, + 59735.987886356525, + 59756.833596322482, + 59777.681124413255, + 59798.530470311794, + 59819.381633701159, + 59840.234614264569, + 59861.089411685381, + 59881.94602564707, + 59902.804455833269, + 59923.664701927737, + 59944.526763614384, + 59965.390640577243, + 59986.256332500488, + 60007.123839068438, + 60027.993159965539, + 60048.864294876381, + 60069.737243485688, + 60090.612005478324, + 60111.488580539284, + 60132.366968353708, + 60153.247168606867, + 60174.129180984164, + 60195.013005171153, + 60215.898640853513, + 60236.786087717061, + 60257.675345447751, + 60278.566413731671, + 60299.459292255044, + 60320.353980704247, + 60341.25047876576, + 60362.148786126229, + 60383.048902472423, + 60403.950827491237, + 60424.854560869717, + 60445.76010229504, + 60466.667451454516, + 60487.57660803559, + 60508.487571725847, + 60529.400342212997, + 60550.314919184893, + 60571.231302329521, + 60592.149491335003, + 60613.069485889588, + 60633.991285681674, + 60654.914890399785, + 60675.840299732568, + 60696.767513368832, + 60717.696530997484, + 60738.627352307602, + 60759.55997698837, + 60780.494404729128, + 60801.430635219323, + 60822.368668148556, + 60843.308503206565, + 60864.250140083204, + 60885.193578468468, + 60906.138818052495, + 60927.085858525541, + 60948.034699578006, + 60968.985340900421, + 60989.937782183442, + 61010.892023117864, + 61031.848063394616, + 61052.805902704764, + 61073.765540739492, + 61094.726977190134, + 61115.690211748137, + 61136.655244105103, + 61157.622073952742, + 61178.590700982917, + 61199.561124887616, + 61220.533345358948, + 61241.507362089171, + 61262.483174770663, + 61283.460783095943, + 61304.440186757645, + 61325.421385448557, + 61346.404378861582, + 61367.389166689762, + 61388.375748626262, + 61409.364124364387, + 61430.354293597571, + 61451.346256019373, + 61472.340011323497, + 61493.335559203762, + 61514.332899354122, + 61535.332031468672, + 61556.332955241618, + 61577.335670367313, + 61598.340176540238, + 61619.346473454993, + 61640.354560806329, + 61661.3644382891, + 61682.376105598312, + 61703.389562429089, + 61724.404808476691, + 61745.42184343651, + 61766.440667004063, + 61787.461278874987, + 61808.483678745069, + 61829.507866310203, + 61850.533841266435, + 61871.561603309929, + 61892.591152136971, + 61913.622487443987, + 61934.655608927525, + 61955.690516284267, + 61976.727209211022, + 61997.765687404724, + 62018.805950562448, + 62039.847998381381, + 62060.891830558845, + 62081.93744679229, + 62102.984846779298, + 62124.034030217575, + 62145.084996804966, + 62166.137746239416, + 62187.19227821903, + 62208.248592442025, + 62229.306688606739, + 62250.366566411656, + 62271.428225555377, + 62292.491665736627, + 62313.556886654267, + 62334.623888007271, + 62355.692669494762, + 62376.763230815974, + 62397.835571670272, + 62418.909691757144, + 62439.98559077621, + 62461.063268427228, + 62482.142724410049, + 62503.223958424685, + 62524.306970171267, + 62545.39175935003, + 62566.478325661366, + 62587.566668805768, + 62608.656788483881, + 62629.748684396451, + 62650.842356244357, + 62671.937803728622, + 62693.035026550366, + 62714.134024410858, + 62735.234797011479, + 62756.337344053733, + 62777.441665239276, + 62798.547760269852, + 62819.655628847358, + 62840.765270673801, + 62861.876685451323, + 62882.989872882186, + 62904.104832668774, + 62925.221564513602, + 62946.340068119309, + 62967.460343188657, + 62988.582389424526, + 63009.70620652994, + 63030.831794208025, + 63051.959152162039, + 63073.08828009537, + 63094.219177711529, + 63115.351844714154, + 63136.486280806988, + 63157.622485693922, + 63178.760459078956, + 63199.900200666219, + 63221.041710159967, + 63242.184987264569, + 63263.330031684534, + 63284.476843124474, + 63305.625421289144, + 63326.775765883409, + 63347.927876612259, + 63369.081753180813, + 63390.237395294316, + 63411.39480265812, + 63432.553974977716, + 63453.714911958712, + 63474.877613306839, + 63496.042078727944, + 63517.208307927998, + 63538.376300613119, + 63559.546056489504, + 63580.717575263516, + 63601.890856641607, + 63623.065900330374, + 63644.242706036515, + 63665.421273466869, + 63686.601602328381, + 63707.783692328136, + 63728.967543173334, + 63750.153154571279, + 63771.340526229418, + 63792.529657855317, + 63813.720549156649, + 63834.913199841227, + 63856.107609616978, + 63877.303778191941, + 63898.501705274284, + 63919.7013905723, + 63940.902833794404, + 63962.106034649114, + 63983.310992845094, + 64004.517708091109, + 64025.726180096048, + 64046.936408568938, + 64068.1483932189, + 64089.362133755196, + 64110.577629887193, + 64131.794881324393, + 64153.013887776404, + 64174.234648952966, + 64195.457164563937, + 64216.681434319289, + 64237.907457929112, + 64259.135235103626, + 64280.36476555316, + 64301.596048988169, + 64322.829085119236, + 64344.06387365704, + 64365.300414312398, + 64386.538706796251, + 64407.778750819634, + 64429.020546093721, + 64450.26409232981, + 64471.509389239291, + 64492.756436533709, + 64514.005233924705, + 64535.255781124033, + 64556.50807784358, + 64577.762123795357, + 64599.017918691468, + 64620.275462244172, + 64641.534754165805, + 64662.795794168844, + 64684.058581965895, + 64705.323117269661, + 64726.589399792974, + 64747.857429248776, + 64769.127205350138, + 64790.398727810236, + 64811.671996342375, + 64832.947010659969, + 64854.223770476558, + 64875.502275505794, + 64896.782525461451, + 64918.064520057414, + 64939.348259007682, + 64960.633742026388, + 64981.920968827762, + 65003.209939126165, + 65024.500652636067, + 65045.793109072067, + 65067.087308148861, + 65088.383249581282, + 65109.680933084259, + 65130.980358372864, + 65152.28152516226, + 65173.584433167736, + 65194.889082104703, + 65216.195471688683, + 65237.503601635319, + 65258.813471660353, + 65280.125081479666, + 65301.438430809241, + 65322.753519365178, + 65344.070346863708, + 65365.388913021146, + 65386.709217553958, + 65408.031260178701, + 65429.355040612056, + 65450.680558570821, + 65472.00781377191, + 65493.336805932355, + 65514.66753476928, + 65535.999999999956, + 65557.334201341757, + 65578.670138512171, + 65600.007811228788, + 65621.347219209332, + 65642.688362171626, + 65664.031239833639, + 65685.375851913413, + 65706.722198129137, + 65728.070278199084, + 65749.420091841661, + 65770.771638775404, + 65792.124918718939, + 65813.479931391004, + 65834.836676510458, + 65856.195153796303, + 65877.5553629676, + 65898.917303743554, + 65920.280975843489, + 65941.646378986843, + 65963.013512893158, + 65984.382377282076, + 66005.752971873386, + 66027.125296386963, + 66048.499350542799, + 66069.875134061018, + 66091.252646661844, + 66112.631888065618, + 66134.01285799277, + 66155.395556163887, + 66176.779982299631, + 66198.166136120795, + 66219.554017348273, + 66240.943625703105, + 66262.334960906388, + 66283.728022679396, + 66305.122810743444, + 66326.519324820023, + 66347.917564630698, + 66369.317529897162, + 66390.719220341227, + 66412.122635684791, + 66433.527775649884, + 66454.934639958636, + 66476.343228333324, + 66497.753540496284, + 66519.165576169995, + 66540.57933507704, + 66561.994816940118, + 66583.412021482043, + 66604.830948425733, + 66626.251597494222, + 66647.673968410629, + 66669.098060898235, + 66690.523874680381, + 66711.951409480564, + 66733.380665022371, + 66754.811641029475, + 66776.244337225711, + 66797.678753334985, + 66819.11488908132, + 66840.552744188884, + 66861.992318381905, + 66883.433611384738, + 66904.876622921889, + 66926.321352717903, + 66947.767800497502, + 66969.215965985466, + 66990.665848906734, + 67012.117448986304, + 67033.570765949335, + 67055.025799521056, + 67076.482549426815, + 67097.941015392076, + 67119.401197142433, + 67140.863094403554, + 67162.326706901222, + 67183.792034361351, + 67205.259076509959, + 67226.72783307315, + 67248.198303777172, + 67269.670488348347, + 67291.144386513144, + 67312.619997998088, + 67334.09732252988, + 67355.576359835293, + 67377.057109641188, + 67398.53957167457, + 67420.023745662547, + 67441.50963133233, + 67462.99722841123, + 67484.486536626689, + 67505.977555706224, + 67527.470285377494, + 67548.964725368263, + 67570.460875406367, + 67591.9587352198, + 67613.458304536631, + 67634.95958308503, + 67656.462570593329, + 67677.967266789899, + 67699.473671403248, + 67720.981784162024, + 67742.491604794923, + 67764.003133030797, + 67785.516368598575, + 67807.031311227314, + 67828.547960646174, + 67850.066316584402, + 67871.58637877139, + 67893.108146936589, + 67914.63162080961, + 67936.156800120138, + 67957.683684597971, + 67979.212273973011, + 68000.742567975263, + 68022.274566334876, + 68043.808268782057, + 68065.343675047145, + 68086.880784860579, + 68108.419597952918, + 68129.960114054789, + 68151.502332896969, + 68173.04625421032, + 68194.591877725834, + 68216.139203174564, + 68237.688230287706, + 68259.238958796544, + 68280.791388432481, + 68302.345518927032, + 68323.901350011787, + 68345.458881418483, + 68367.018112878912, + 68388.579044125028, + 68410.141674888844, + 68431.706004902502, + 68453.272033898262, + 68474.839761608455, + 68496.409187765545, + 68517.980312102081, + 68539.553134350732, + 68561.127654244279, + 68582.70387151558, + 68604.281785897634, + 68625.861397123503, + 68647.44270492639, + 68669.025709039604, + 68690.610409196524, + 68712.196805130661, + 68733.784896575627, + 68755.374683265123, + 68776.966164932994, + 68798.559341313128, + 68820.154212139591, + 68841.750777146473, + 68863.349036068044, + 68884.948988638629, + 68906.550634592684, + 68928.153973664739, + 68949.75900558944, + 68971.365730101577, + 68992.974146935987, + 69014.584255827634, + 69036.196056511588, + 69057.809548723017, + 69079.424732197207, + 69101.041606669532, + 69122.660171875468, + 69144.280427550606, + 69165.902373430625, + 69187.526009251334, + 69209.151334748618, + 69230.778349658474, + 69252.40705371699, + 69274.037446660412, + 69295.669528225, + 69317.303298147192, + 69338.938756163494, + 69360.575902010532, + 69382.214735425005, + 69403.855256143754, + 69425.497463903681, + 69447.141358441833, + 69468.78693949533, + 69490.434206801394, + 69512.083160097391, + 69533.733799120717, + 69555.386123608929, + 69577.04013329967, + 69598.695827930685, + 69620.353207239794, + 69642.012270964973, + 69663.67301884426, + 69685.335450615792, + 69706.999566017839, + 69728.665364788743, + 69750.332846666963, + 69772.002011391058, + 69793.672858699691, + 69815.345388331611, + 69837.019600025669, + 69858.695493520849, + 69880.373068556204, + 69902.052324870907, + 69923.733262204216, + 69945.415880295492, + 69967.100178884211, + 69988.786157709939, + 70010.473816512356, + 70032.163155031216, + 70053.854173006403, + 70075.546870177874, + 70097.241246285717, + 70118.937301070109, + 70140.635034271298, + 70162.334445629691, + 70184.035534885741, + 70205.738301780017, + 70227.442746053217, + 70249.1488674461, + 70270.856665699539, + 70292.566140554511, + 70314.277291752107, + 70335.990119033493, + 70357.704622139936, + 70379.420800812819, + 70401.138654793613, + 70422.85818382389, + 70444.579387645339, + 70466.302265999722, + 70488.026818628918, + 70509.753045274876, + 70531.480945679708, + 70553.210519585555, + 70574.941766734701, + 70596.674686869505, + 70618.409279732456, + 70640.145545066101, + 70661.883482613106, + 70683.623092116264, + 70705.364373318414, + 70727.107325962526, + 70748.851949791671, + 70770.598244549008, + 70792.346209977783, + 70814.095845821372, + 70835.847151823225, + 70857.600127726895, + 70879.354773276034, + 70901.111088214413, + 70922.869072285859, + 70944.628725234332, + 70966.390046803877, + 70988.153036738629, + 71009.917694782853, + 71031.684020680885, + 71053.45201417715, + 71075.221675016204, + 71096.993002942661, + 71118.765997701266, + 71140.540659036851, + 71162.316986694335, + 71184.09498041874, + 71205.874639955218, + 71227.655965048951, + 71249.438955445294, + 71271.223610889632, + 71293.009931127483, + 71314.797915904477, + 71336.587564966307, + 71358.378878058764, + 71380.171854927772, + 71401.966495319313, + 71423.762798979486, + 71445.560765654489, + 71467.360395090596, + 71489.161687034211, + 71510.964641231811, + 71532.769257429973, + 71554.575535375348, + 71576.383474814749, + 71598.19307549503, + 71620.004337163133, + 71641.817259566145, + 71663.631842451214, + 71685.4480855656, + 71707.26598865664, + 71729.085551471784, + 71750.906773758586, + 71772.729655264673, + 71794.554195737772, + 71816.380394925713, + 71838.208252576442, + 71860.037768437964, + 71881.868942258385, + 71903.701773785942, + 71925.536262768932, + 71947.372408955751, + 71969.210212094898, + 71991.049671934976, + 72012.890788224686, + 72034.73356071279, + 72056.577989148165, + 72078.424073279821, + 72100.271812856794, + 72122.121207628254, + 72143.97225734347, + 72165.824961751801, + 72187.679320602692, + 72209.53533364569, + 72231.393000630429, + 72253.252321306645, + 72275.113295424177, + 72296.975922732949, + 72318.840202982959, + 72340.706135924338, + 72362.573721307272, + 72384.442958882093, + 72406.313848399179, + 72428.186389609036, + 72450.060582262216, + 72471.936426109431, + 72493.813920901433, + 72515.693066389096, + 72537.573862323392, + 72559.456308455352, + 72581.340404536139, + 72603.226150316987, + 72625.113545549248, + 72647.002589984331, + 72668.893283373764, + 72690.785625469172, + 72712.679616022273, + 72734.575254784853, + 72756.472541508803, + 72778.371475946144, + 72800.272057848939, + 72822.174286969355, + 72844.07816305969, + 72865.983685872285, + 72887.890855159596, + 72909.799670674183, + 72931.710132168693, + 72953.622239395845, + 72975.535992108475, + 72997.451390059519, + 73019.368433001961, + 73041.287120688925, + 73063.207452873612, + 73085.129429309294, + 73107.053049749389, + 73128.978313947344, + 73150.905221656736, + 73172.833772631217, + 73194.763966624567, + 73216.695803390612, + 73238.62928268328, + 73260.564404256627, + 73282.501167864757, + 73304.439573261901, + 73326.379620202337, + 73348.321308440485, + 73370.264637730841, + 73392.209607827957, + 73414.156218486532, + 73436.104469461323, + 73458.054360507173, + 73480.005891379056, + 73501.959061831993, + 73523.913871621116, + 73545.870320501665, + 73567.828408228932, + 73589.78813455833, + 73611.749499245358, + 73633.712502045615, + 73655.677142714747, + 73677.643421008557, + 73699.611336682879, + 73721.580889493693, + 73743.552079197019, + 73765.524905548999, + 73787.499368305856, + 73809.475467223907, + 73831.453202059551, + 73853.432572569291, + 73875.413578509717, + 73897.396219637507, + 73919.380495709411, + 73941.36640648231, + 73963.353951713143, + 73985.343131158952, + 74007.333944576865, + 74029.326391724098, + 74051.320472357969, + 74073.316186235883, + 74095.313533115303, + 74117.312512753837, + 74139.313124909138, + 74161.315369338976, + 74183.319245801191, + 74205.324754053727, + 74227.331893854629, + 74249.340664961986, + 74271.351067134034, + 74293.363100129049, + 74315.376763705441, + 74337.392057621662, + 74359.408981636298, + 74381.427535508003, + 74403.447718995507, + 74425.469531857671, + 74447.492973853383, + 74469.518044741693, + 74491.54474428168, + 74513.573072232539, + 74535.603028353551, + 74557.634612404087, + 74579.667824143602, + 74601.702663331642, + 74623.739129727837, + 74645.777223091936, + 74667.816943183716, + 74689.858289763113, + 74711.901262590094, + 74733.945861424741, + 74755.992086027225, + 74778.039936157802, + 74800.089411576817, + 74822.140512044702, + 74844.193237321961, + 74866.24758716923, + 74888.303561347187, + 74910.36115961663, + 74932.420381738411, + 74954.481227473516, + 74976.543696582972, + 74998.607788827925, + 75020.673503969607, + 75042.740841769322, + 75064.809801988464, + 75086.88038438854, + 75108.952588731103, + 75131.026414777836, + 75153.101862290467, + 75175.178931030852, + 75197.257620760924, + 75219.33793124267, + 75241.419862238225, + 75263.503413509738, + 75285.588584819503, + 75307.675375929874, + 75329.763786603318, + 75351.853816602365, + 75373.945465689612, + 75396.038733627807, + 75418.133620179724, + 75440.230125108254, + 75462.32824817636, + 75484.427989147109, + 75506.529347783653, + 75528.63232384919, + 75550.736917107075, + 75572.843127320695, + 75594.950954253538, + 75617.060397669193, + 75639.171457331307, + 75661.284133003646, + 75683.398424450032, + 75705.514331434402, + 75727.631853720741, + 75749.750991073175, + 75771.871743255862, + 75793.994110033076, + 75816.118091169177, + 75838.243686428585, + 75860.370895575848, + 75882.499718375562, + 75904.630154592422, + 75926.762203991224, + 75948.895866336825, + 75971.031141394182, + 75993.168028928325, + 76015.306528704401, + 76037.4466404876, + 76059.588364043215, + 76081.731699136653, + 76103.876645533353, + 76126.023202998884, + 76148.171371298871, + 76170.321150199044, + 76192.472539465205, + 76214.625538863256, + 76236.780148159174, + 76258.936367119008, + 76281.094195508922, + 76303.253633095141, + 76325.414679643975, + 76347.577334921851, + 76369.741598695226, + 76391.907470730686, + 76414.074950794879, + 76436.244038654564, + 76458.414734076548, + 76480.587036827754, + 76502.760946675175, + 76524.936463385893, + 76547.11358672705, + 76569.292316465915, + 76591.472652369819, + 76613.654594206164, + 76635.838141742468, + 76658.023294746308, + 76680.210052985349, + 76702.398416227341, + 76724.588384240138, + 76746.779956791637, + 76768.973133649866, + 76791.167914582897, + 76813.364299358902, + 76835.562287746157, + 76857.761879512967, + 76879.963074427797, + 76902.165872259109, + 76924.37027277553, + 76946.576275745727, + 76968.783880938441, + 76990.993088122515, + 77013.203897066895, + 77035.416307540567, + 77057.630319312622, + 77079.845932152239, + 77102.063145828695, + 77124.281960111301, + 77146.50237476948, + 77168.724389572759, + 77190.948004290723, + 77213.173218693031, + 77235.400032549442, + 77257.628445629802, + 77279.858457704031, + 77302.090068542122, + 77324.323277914169, + 77346.558085590339, + 77368.794491340886, + 77391.032494936138, + 77413.272096146524, + 77435.51329474253, + 77457.756090494731, + 77480.000483173804, + 77502.246472550498, + 77524.494058395634, + 77546.743240480107, + 77568.994018574944, + 77591.246392451198, + 77613.500361880026, + 77635.755926632657, + 77658.013086480438, + 77680.271841194757, + 77702.532190547092, + 77724.794134309021, + 77747.057672252195, + 77769.322804148323, + 77791.589529769248, + 77813.857848886837, + 77836.127761273063, + 77858.399266699998, + 77880.67236493979, + 77902.947055764627, + 77925.223338946831, + 77947.50121425878, + 77969.780681472927, + 77992.061740361838, + 78014.344390698127, + 78036.628632254491, + 78058.914464803747, + 78081.201888118725, + 78103.490901972415, + 78125.781506137821, + 78148.073700388064, + 78170.367484496339, + 78192.662858235926, + 78214.959821380166, + 78237.258373702498, + 78259.558514976452, + 78281.860244975614, + 78304.163563473659, + 78326.468470244363, + 78348.77496506153, + 78371.083047699125, + 78393.392717931114, + 78415.703975531578, + 78438.016820274701, + 78460.331251934695, + 78482.647270285903, + 78504.964875102727, + 78527.284066159627, + 78549.604843231195, + 78571.927206092048, + 78594.251154516911, + 78616.576688280606, + 78638.903807157985, + 78661.232510924034, + 78683.562799353778, + 78705.894672222363, + 78728.228129304945, + 78750.563170376859, + 78772.899795213423, + 78795.238003590101, + 78817.577795282399, + 78839.919170065928, + 78862.262127716356, + 78884.606668009452, + 78906.952790721043, + 78929.300495627045, + 78951.64978250346, + 78974.000651126378, + 78996.353101271932, + 79018.707132716358, + 79041.062745235977, + 79063.41993860717, + 79085.778712606436, + 79108.139067010285, + 79130.501001595389, + 79152.864516138419, + 79175.22961041618, + 79197.596284205531, + 79219.96453728342, + 79242.33436942687, + 79264.705780412987, + 79287.078770018954, + 79309.453338022009, + 79331.829484199508, + 79354.207208328866, + 79376.586510187582, + 79398.967389553218, + 79421.349846203433, + 79443.733879915948, + 79466.119490468584, + 79488.50667763922, + 79510.895441205823, + 79533.285780946433, + 79555.677696639163, + 79578.071188062226, + 79600.466254993895, + 79622.862897212515, + 79645.261114496549, + 79667.660906624471, + 79690.062273374875, + 79712.465214526455, + 79734.869729857935, + 79757.275819148126, + 79779.683482175955, + 79802.092718720378, + 79824.503528560454, + 79846.915911475327, + 79869.329867244203, + 79891.745395646343, + 79914.162496461155, + 79936.581169468045, + 79959.001414446553, + 79981.423231176261, + 80003.846619436852, + 80026.271579008084, + 80048.698109669771, + 80071.12621120183, + 80093.555883384237, + 80115.987125997053, + 80138.419938820414, + 80160.854321634528, + 80183.290274219689, + 80205.727796356281, + 80228.166887824715, + 80250.607548405547, + 80273.049777879336, + 80295.493576026798, + 80317.938942628651, + 80340.385877465727, + 80362.834380318949, + 80385.28445096928, + 80407.736089197788, + 80430.189294785596, + 80452.644067513917, + 80475.100407164035, + 80497.558313517322, + 80520.017786355209, + 80542.478825459213, + 80564.941430610925, + 80587.405601592007, + 80609.871338184195, + 80632.338640169342, + 80654.8075073293, + 80677.277939446067, + 80699.749936301683, + 80722.223497678278, + 80744.698623358039, + 80767.17531312324, + 80789.653566756242, + 80812.133384039465, + 80834.614764755403, + 80857.097708686648, + 80879.582215615854, + 80902.068285325731, + 80924.555917599093, + 80947.045112218824, + 80969.535868967869, + 80992.028187629272, + 81014.522067986123, + 81037.017509821613, + 81059.514512919006, + 81082.013077061609, + 81104.513202032831, + 81127.014887616184, + 81149.518133595193, + 81172.022939753486, + 81194.529305874807, + 81217.037231742899, + 81239.546717141639, + 81262.057761854958, + 81284.570365666848, + 81307.084528361403, + 81329.600249722775, + 81352.117529535186, + 81374.636367582949, + 81397.156763650448, + 81419.678717522125, + 81442.202228982511, + 81464.727297816222, + 81487.253923807933, + 81509.782106742379, + 81532.311846404409, + 81554.843142578902, + 81577.375995050839, + 81599.910403605274, + 81622.446368027333, + 81644.983888102215, + 81667.522963615178, + 81690.063594351581, + 81712.605780096841, + 81735.149520636449, + 81757.694815755967, + 81780.241665241047, + 81802.79006887741, + 81825.340026450824, + 81847.891537747171, + 81870.444602552379, + 81892.999220652477, + 81915.555391833506, + 81938.113115881672, + 81960.672392583176, + 81983.233221724338, + 82005.795603091537, + 82028.359536471224, + 82050.925021649906, + 82073.492058414209, + 82096.060646550788, + 82118.630785846399, + 82141.202476087841, + 82163.775717062032, + 82186.35050855593, + 82208.926850356569, + 82231.504742251054, + 82254.084184026578, + 82276.665175470393, + 82299.24771636985, + 82321.831806512317, + 82344.417445685307, + 82367.004633676348, + 82389.593370273054, + 82412.183655263143, + 82434.775488434374, + 82457.368869574595, + 82479.963798471697, + 82502.560274913689, + 82525.158298688606, + 82547.757869584602, + 82570.35898738986, + 82592.961651892678, + 82615.565862881398, + 82638.171620144421, + 82660.778923470265, + 82683.387772647475, + 82705.998167464713, + 82728.610107710658, + 82751.223593174116, + 82773.83862364394, + 82796.45519890904, + 82819.073318758441, + 82841.692982981185, + 82864.314191366429, + 82886.936943703375, + 82909.561239781324, + 82932.187079389638, + 82954.814462317736, + 82977.443388355125, + 83000.073857291369, + 83022.70586891612, + 83045.339423019104, + 83067.974519390089, + 83090.611157818959, + 83113.249338095629, + 83135.8890600101, + 83158.530323352461, + 83181.173127912858, + 83203.817473481497, + 83226.463359848669, + 83249.11078680474, + 83271.759754140134, + 83294.410261645375, + 83317.062309111003, + 83339.715896327703, + 83362.371023086147, + 83385.027689177165, + 83407.685894391587, + 83430.345638520361, + 83453.006921354478, + 83475.669742685001, + 83498.334102303095, + 83520.999999999942, + 83543.667435566866, + 83566.336408795192, + 83589.006919476349, + 83611.678967401851, + 83634.352552363242, + 83657.027674152167, + 83679.704332560359, + 83702.382527379552, + 83725.062258401638, + 83747.743525418511, + 83770.42632822218, + 83793.110666604684, + 83815.796540358162, + 83838.483949274829, + 83861.172893146941, + 83883.863371766842, + 83906.555384926964, + 83929.248932419752, + 83951.944014037799, + 83974.640629573696, + 83997.338778820151, + 84020.038461569929, + 84042.739677615857, + 84065.442426750829, + 84088.146708767847, + 84110.852523459922, + 84133.559870620171, + 84156.268750041796, + 84178.979161518029, + 84201.691104842204, + 84224.404579807713, + 84247.119586208006, + 84269.83612383662, + 84292.55419248715, + 84315.273791953281, + 84337.994922028738, + 84360.717582507335, + 84383.441773182945, + 84406.167493849513, + 84428.894744301069, + 84451.623524331691, + 84474.353833735542, + 84497.085672306828, + 84519.819039839858, + 84542.553936128999, + 84565.290360968676, + 84588.028314153402, + 84610.767795477717, + 84633.508804736295, + 84656.251341723822, + 84678.995406235073, + 84701.740998064924, + 84724.488117008252, + 84747.236762860062, + 84769.986935415407, + 84792.73863446941, + 84815.491859817252, + 84838.246611254188, + 84861.002888575575, + 84883.760691576768, + 84906.520020053256, + 84929.28087380057, + 84952.043252614312, + 84974.807156290146, + 84997.572584623806, + 85020.339537411113, + 85043.108014447949, + 85065.878015530237, + 85088.649540453989, + 85111.422589015303, + 85134.197161010321, + 85156.973256235244, + 85179.750874486374, + 85202.530015560071, + 85225.310679252725, + 85248.092865360857, + 85270.876573681016, + 85293.661804009811, + 85316.448556143951, + 85339.236829880188, + 85362.026625015351, + 85384.817941346351, + 85407.610778670132, + 85430.405136783724, + 85453.201015484257, + 85475.998414568865, + 85498.797333834795, + 85521.597773079353, + 85544.399732099904, + 85567.203210693886, + 85590.008208658808, + 85612.814725792239, + 85635.62276189182, + 85658.432316755265, + 85681.243390180331, + 85704.055981964877, + 85726.870091906807, + 85749.685719804082, + 85772.502865454764, + 85795.321528656961, + 85818.141709208852, + 85840.963406908675, + 85863.78662155474, + 85886.611352945445, + 85909.437600879217, + 85932.26536515457, + 85955.094645570091, + 85977.92544192441, + 86000.757754016275, + 86023.591581644432, + 86046.426924607746, + 86069.263782705122, + 86092.102155735556, + 86114.942043498071, + 86137.783445791807, + 86160.626362415918, + 86183.470793169676, + 86206.316737852379, + 86229.164196263402, + 86252.013168202204, + 86274.863653468303, + 86297.715651861261, + 86320.569163180728, + 86343.424187226425, + 86366.280723798132, + 86389.138772695675, + 86411.998333718977, + 86434.859406668009, + 86457.721991342827, + 86480.586087543532, + 86503.451695070296, + 86526.318813723352, + 86549.187443303032, + 86572.057583609683, + 86594.929234443756, + 86617.802395605773, + 86640.677066896271, + 86663.553248115903, + 86686.43093906538, + 86709.310139545443, + 86732.190849356964, + 86755.073068300815, + 86777.956796177954, + 86800.842032789442, + 86823.728777936354, + 86846.617031419853, + 86869.506793041175, + 86892.398062601613, + 86915.290839902518, + 86938.185124745316, + 86961.080916931489, + 86983.978216262592, + 87006.87702254027, + 87029.777335566177, + 87052.67915514209, + 87075.582481069796, + 87098.487313151185, + 87121.39365118822, + 87144.301494982894, + 87167.210844337285, + 87190.121699053532, + 87213.034058933845, + 87235.947923780506, + 87258.863293395829, + 87281.780167582241, + 87304.698546142172, + 87327.618428878181, + 87350.539815592856, + 87373.462706088845, + 87396.387100168897, + 87419.312997635774, + 87442.240398292357, + 87465.16930194154, + 87488.099708386319, + 87511.031617429733, + 87533.965028874911, + 87556.899942525008, + 87579.836358183282, + 87602.774275653021, + 87625.713694737613, + 87648.654615240492, + 87671.597036965148, + 87694.540959715145, + 87717.486383294105, + 87740.433307505737, + 87763.381732153779, + 87786.331657042057, + 87809.283081974456, + 87832.236006754916, + 87855.190431187453, + 87878.146355076155, + 87901.103778225151, + 87924.062700438633, + 87947.023121520891, + 87969.985041276246, + 87992.948459509105, + 88015.913376023906, + 88038.879790625171, + 88061.847703117513, + 88084.817113305573, + 88107.788020994049, + 88130.760425987726, + 88153.734328091465, + 88176.709727110137, + 88199.686622848749, + 88222.665015112303, + 88245.644903705906, + 88268.626288434709, + 88291.609169103947, + 88314.593545518903, + 88337.579417484914, + 88360.566784807408, + 88383.555647291854, + 88406.546004743795, + 88429.537856968818, + 88452.531203772611, + 88475.52604496089, + 88498.522380339447, + 88521.52020971413, + 88544.519532890874, + 88567.520349675644, + 88590.522659874507, + 88613.526463293543, + 88636.531759738922, + 88659.538549016899, + 88682.546830933745, + 88705.556605295846, + 88728.567871909589, + 88751.580630581491, + 88774.594881118086, + 88797.610623325963, + 88820.62785701183, + 88843.646581982393, + 88866.666798044462, + 88889.688505004888, + 88912.711702670611, + 88935.7363908486, + 88958.762569345898, + 88981.790237969632, + 89004.81939652696, + 89027.850044825114, + 89050.882182671412, + 89073.9158098732, + 89096.950926237885, + 89119.987531572973, + 89143.025625686001, + 89166.065208384563, + 89189.106279476357, + 89212.148838769106, + 89235.192886070581, + 89258.238421188667, + 89281.285443931265, + 89304.333954106376, + 89327.383951522017, + 89350.435435986306, + 89373.488407307406, + 89396.542865293537, + 89419.598809753006, + 89442.656240494165, + 89465.715157325409, + 89488.775560055219, + 89511.837448492137, + 89534.900822444746, + 89557.965681721733, + 89581.032026131812, + 89604.099855483742, + 89627.169169586399, + 89650.239968248672, + 89673.312251279538, + 89696.386018488018, + 89719.461269683205, + 89742.53800467425, + 89765.616223270365, + 89788.69592528083, + 89811.777110514988, + 89834.859778782207, + 89857.943929891975, + 89881.029563653807, + 89904.116679877261, + 89927.205278372014, + 89950.29535894774, + 89973.386921414218, + 89996.479965581268, + 90019.574491258769, + 90042.670498256688, + 90065.767986385021, + 90088.866955453836, + 90111.967405273259, + 90135.069335653476, + 90158.172746404758, + 90181.277637337407, + 90204.384008261797, + 90227.49185898836, + 90250.601189327586, + 90273.711999090039, + 90296.824288086325, + 90319.938056127125, + 90343.053303023189, + 90366.170028585286, + 90389.288232624298, + 90412.407914951138, + 90435.529075376777, + 90458.651713712257, + 90481.775829768681, + 90504.901423357209, + 90528.028494289058, + 90551.157042375504, + 90574.287067427911, + 90597.418569257643, + 90620.551547676194, + 90643.686002495073, + 90666.821933525847, + 90689.959340580186, + 90713.098223469773, + 90736.238582006365, + 90759.380416001804, + 90782.523725267951, + 90805.668509616764, + 90828.814768860233, + 90851.962502810435, + 90875.11171127946, + 90898.262394079517, + 90921.414551022855, + 90944.568181921743, + 90967.72328658856, + 90990.879864835719, + 91014.037916475718, + 91037.19744132107, + 91060.358439184391, + 91083.520909878338, + 91106.684853215629, + 91129.850269009039, + 91153.017157071401, + 91176.185517215621, + 91199.355349254649, + 91222.526653001492, + 91245.699428269247, + 91268.873674871036, + 91292.049392620058, + 91315.226581329553, + 91338.405240812834, + 91361.585370883287, + 91384.766971354344, + 91407.950042039476, + 91431.134582752245, + 91454.320593306256, + 91477.508073515171, + 91500.697023192712, + 91523.887442152685, + 91547.07933020893, + 91570.272687175326, + 91593.467512865856, + 91616.663807094534, + 91639.861569675442, + 91663.060800422725, + 91686.261499150554, + 91709.463665673218, + 91732.66729980502, + 91755.872401360321, + 91779.078970153569, + 91802.287005999257, + 91825.49650871192, + 91848.707478106167, + 91871.91991399668, + 91895.133816198169, + 91918.349184525418, + 91941.566018793281, + 91964.784318816659, + 91988.004084410495, + 92011.22531538982, + 92034.448011569708, + 92057.672172765277, + 92080.897798791746, + 92104.124889464365, + 92127.353444598411, + 92150.58346400928, + 92173.814947512379, + 92197.04789492322, + 92220.282306057314, + 92243.518180730272, + 92266.755518757753, + 92289.994319955469, + 92313.234584139194, + 92336.476311124774, + 92359.719500728082, + 92382.964152765067, + 92406.210267051734, + 92429.457843404161, + 92452.706881638471, + 92475.957381570814, + 92499.209343017443, + 92522.462765794655, + 92545.717649718805, + 92568.973994606305, + 92592.231800273614, + 92615.491066537259, + 92638.751793213814, + 92662.01398011994, + 92685.277627072326, + 92708.54273388772, + 92731.809300382942, + 92755.077326374871, + 92778.346811680414, + 92801.617756116568, + 92824.890159500384, + 92848.164021648947, + 92871.439342379424, + 92894.716121509016, + 92917.994358855023, + 92941.274054234746, + 92964.555207465572, + 92987.837818364962, + 93011.121886750407, + 93034.407412439468, + 93057.694395249753, + 93080.982834998955, + 93104.272731504767, + 93127.564084584999, + 93150.856894057491, + 93174.15115974014, + 93197.446881450916, + 93220.744059007804, + 93244.04269222889, + 93267.342780932304, + 93290.644324936235, + 93313.947324058914, + 93337.251778118633, + 93360.557686933767, + 93383.865050322696, + 93407.173868103928, + 93430.484140095941, + 93453.795866117362, + 93477.109045986799, + 93500.423679522952, + 93523.739766544561, + 93547.057306870454, + 93570.376300319491, + 93593.696746710571, + 93617.018645862699, + 93640.341997594893, + 93663.666801726242, + 93686.993058075881, + 93710.320766463032, + 93733.64992670693, + 93756.980538626914, + 93780.312602042337, + 93803.646116772637, + 93826.981082637285, + 93850.317499455836, + 93873.655367047861, + 93896.994685233032, + 93920.335453831038, + 93943.677672661666, + 93967.021341544707, + 93990.366460300051, + 94013.713028747632, + 94037.061046707429, + 94060.410513999494, + 94083.761430443905, + 94107.113795860845, + 94130.467610070496, + 94153.822872893157, + 94177.179584149111, + 94200.537743658759, + 94223.897351242529, + 94247.25840672091, + 94270.620909914433, + 94293.98486064373, + 94317.350258729421, + 94340.71710399224, + 94364.085396252936, + 94387.455135332348, + 94410.82632105134, + 94434.198953230851, + 94457.573031691878, + 94480.948556255447, + 94504.325526742658, + 94527.70394297468, + 94551.083804772716, + 94574.465111958023, + 94597.847864351934, + 94621.232061775823, + 94644.617704051096, + 94668.004790999272, + 94691.393322441872, + 94714.783298200506, + 94738.174718096794, + 94761.567581952477, + 94784.961889589307, + 94808.357640829097, + 94831.754835493703, + 94855.153473405066, + 94878.553554385173, + 94901.955078256055, + 94925.358044839784, + 94948.762453958523, + 94972.168305434476, + 94995.575599089891, + 95018.984334747074, + 95042.394512228391, + 95065.806131356265, + 95089.219191953176, + 95112.633693841635, + 95136.04963684424, + 95159.467020783617, + 95182.885845482466, + 95206.306110763529, + 95229.727816449609, + 95253.150962363579, + 95276.575548328314, + 95300.001574166803, + 95323.429039702052, + 95346.857944757154, + 95370.288289155214, + 95393.720072719429, + 95417.153295273019, + 95440.587956639298, + 95464.024056641589, + 95487.461595103305, + 95510.900571847902, + 95534.340986698866, + 95557.782839479783, + 95581.226130014256, + 95604.670858125959, + 95628.117023638595, + 95651.564626375985, + 95675.013666161918, + 95698.464142820303, + 95721.916056175076, + 95745.369406050231, + 95768.824192269807, + 95792.280414657915, + 95815.738073038709, + 95839.197167236387, + 95862.657697075221, + 95886.11966237954, + 95909.583062973688, + 95933.047898682111, + 95956.514169329268, + 95979.981874739708, + 96003.451014738006, + 96026.921589148798, + 96050.393597796792, + 96073.867040506724, + 96097.341917103375, + 96120.818227411626, + 96144.295971256375, + 96167.775148462577, + 96191.255758855244, + 96214.737802259449, + 96238.221278500292, + 96261.70618740299, + 96285.192528792715, + 96308.680302494788, + 96332.169508334526, + 96355.660146137321, + 96379.152215728609, + 96402.645716933868, + 96426.14064957868, + 96449.637013488609, + 96473.134808489311, + 96496.63403440651, + 96520.134691065963, + 96543.636778293469, + 96567.140295914898, + 96590.645243756153, + 96614.151621643221, + 96637.659429402134, + 96661.168666858954, + 96684.679333839798, + 96708.191430170875, + 96731.70495567839, + 96755.219910188665, + 96778.736293528011, + 96802.254105522836, + 96825.77334599958, + 96849.29401478474, + 96872.816111704873, + 96896.339636586577, + 96919.864589256511, + 96943.390969541389, + 96966.918777267958, + 96990.448012263048, + 97013.978674353522, + 97037.510763366285, + 97061.044279128328, + 97084.579221466673, + 97108.115590208385, + 97131.653385180587, + 97155.19260621049, + 97178.733253125291, + 97202.2753257523, + 97225.81882391886, + 97249.363747452342, + 97272.910096180189, + 97296.457869929916, + 97320.007068529041, + 97343.557691805196, + 97367.109739586012, + 97390.663211699197, + 97414.218107972498, + 97437.774428233737, + 97461.332172310766, + 97484.891340031507, + 97508.451931223899, + 97532.013945715982, + 97555.577383335811, + 97579.142243911512, + 97602.708527271257, + 97626.276233243261, + 97649.845361655811, + 97673.415912337223, + 97696.987885115886, + 97720.561279820206, + 97744.1360962787, + 97767.712334319876, + 97791.289993772341, + 97814.869074464703, + 97838.449576225685, + 97862.031498883996, + 97885.614842268449, + 97909.199606207883, + 97932.785790531183, + 97956.37339506732, + 97979.962419645264, + 98003.552864094076, + 98027.144728242856, + 98050.738011920766, + 98074.332714956996, + 98097.928837180807, + 98121.526378421506, + 98145.125338508456, + 98168.725717271067, + 98192.327514538789, + 98215.930730141132, + 98239.535363907664, + 98263.141415668011, + 98286.748885251814, + 98310.357772488816, + 98333.968077208759, + 98357.579799241488, + 98381.192938416847, + 98404.807494564782, + 98428.42346751524, + 98452.040857098269, + 98475.659663143917, + 98499.27988548232, + 98522.901523943656, + 98546.524578358163, + 98570.149048556093, + 98593.774934367786, + 98617.402235623624, + 98641.030952154048, + 98664.661083789513, + 98688.292630360564, + 98711.925591697771, + 98735.559967631794, + 98759.195757993293, + 98782.832962613014, + 98806.471581321734, + 98830.111613950285, + 98853.753060329575, + 98877.39592029051, + 98901.040193664099, + 98924.68588028138, + 98948.33297997342, + 98971.981492571387, + 98995.63141790645, + 99019.282755809851, + 99042.935506112874, + 99066.589668646877, + 99090.245243243233, + 99113.902229733401, + 99137.560627948857, + 99161.220437721131, + 99184.881658881859, + 99208.544291262631, + 99232.208334695169, + 99255.87378901121, + 99279.540654042547, + 99303.208929621018, + 99326.878615578535, + 99350.549711746993, + 99374.222217958435, + 99397.896134044888, + 99421.571459838422, + 99445.248195171211, + 99468.926339875441, + 99492.605893783344, + 99516.286856727209, + 99539.969228539398, + 99563.653009052287, + 99587.338198098325, + 99611.024795510006, + 99634.712801119866, + 99658.402214760499, + 99682.093036264545, + 99705.785265464699, + 99729.478902193689, + 99753.173946284325, + 99776.870397569437, + 99800.56825588191, + 99824.267521054688, + 99847.968192920773, + 99871.670271313182, + 99895.373756065004, + 99919.078647009388, + 99942.78494397951, + 99966.492646808634, + 99990.20175533001, + 100013.91226937699, + 100037.62418878295, + 100061.33751338134, + 100085.05224300563, + 100108.76837748935, + 100132.4859166661, + 100156.2048603695, + 100179.92520843323, + 100203.64696069101, + 100227.37011697664, + 100251.09467712394, + 100274.82064096678, + 100298.54800833909, + 100322.27677907483, + 100346.00695300807, + 100369.73852997283, + 100393.47150980328, + 100417.20589233354, + 100440.94167739789, + 100464.67886483055, + 100488.41745446586, + 100512.1574461382, + 100535.89883968196, + 100559.64163493161, + 100583.38583172169, + 100607.13142988674, + 100630.87842926137, + 100654.62682968024, + 100678.37663097809, + 100702.12783298964, + 100725.88043554971, + 100749.63443849317, + 100773.38984165489, + 100797.14664486986, + 100820.90484797307, + 100844.66445079957, + 100868.42545318443, + 100892.18785496285, + 100915.95165596998, + 100939.71685604109, + 100963.48345501146, + 100987.25145271645, + 101011.02084899142, + 101034.79164367182, + 101058.56383659317, + 101082.33742759094, + 101106.11241650078, + 101129.88880315828, + 101153.66658739912, + 101177.44576905905, + 101201.22634797383, + 101225.00832397929, + 101248.7916969113, + 101272.57646660579, + 101296.36263289873, + 101320.15019562612, + 101343.93915462404, + 101367.7295097286, + 101391.52126077596, + 101415.31440760233, + 101439.10895004397, + 101462.9048879372, + 101486.70222111834, + 101510.50094942382, + 101534.30107269008, + 101558.10259075361, + 101581.90550345098, + 101605.70981061876, + 101629.5155120936, + 101653.32260771218, + 101677.13109731126, + 101700.9409807276, + 101724.75225779804, + 101748.56492835947, + 101772.37899224881, + 101796.19444930303, + 101820.01129935916, + 101843.82954225427, + 101867.64917782549, + 101891.47020590997, + 101915.29262634492, + 101939.11643896763, + 101962.94164361537, + 101986.76824012553, + 102010.59622833549, + 102034.42560808272, + 102058.25637920471, + 102082.08854153901, + 102105.9220949232, + 102129.75703919494, + 102153.59337419191, + 102177.43109975185, + 102201.27021571253, + 102225.1107219118, + 102248.95261818753, + 102272.79590437764, + 102296.64058032009, + 102320.48664585294, + 102344.33410081422, + 102368.18294504205, + 102392.03317837461, + 102415.88480065008, + 102439.73781170673, + 102463.59221138287, + 102487.44799951684, + 102511.30517594704, + 102535.1637405119, + 102559.02369304992, + 102582.88503339965, + 102606.74776139967, + 102630.61187688859, + 102654.4773797051, + 102678.34426968795, + 102702.21254667587, + 102726.08221050771, + 102749.95326102231, + 102773.8256980586, + 102797.69952145554, + 102821.57473105213, + 102845.45132668741, + 102869.32930820051, + 102893.20867543056, + 102917.08942821674, + 102940.97156639832, + 102964.85508981455, + 102988.73999830478, + 103012.6262917084, + 103036.51396986481, + 103060.40303261351, + 103084.293479794, + 103108.18531124585, + 103132.07852680866, + 103155.97312632212, + 103179.8691096259, + 103203.76647655977, + 103227.66522696352, + 103251.56536067701, + 103275.46687754011, + 103299.36977739276, + 103323.27406007495, + 103347.1797254267, + 103371.0867732881, + 103394.99520349925, + 103418.90501590034, + 103442.81621033157, + 103466.72878663319, + 103490.64274464553, + 103514.55808420894, + 103538.4748051638, + 103562.39290735057, + 103586.31239060973, + 103610.23325478184, + 103634.15549970744, + 103658.07912522719, + 103682.00413118176, + 103705.93051741188, + 103729.85828375829, + 103753.78743006183, + 103777.71795616332, + 103801.64986190372, + 103825.58314712394, + 103849.51781166498, + 103873.4538553679, + 103897.39127807376, + 103921.33007962372, + 103945.27025985894, + 103969.21181862066, + 103993.15475575015, + 104017.0990710887, + 104041.0447644777, + 104064.99183575854, + 104088.94028477269, + 104112.89011136163, + 104136.84131536692, + 104160.79389663014, + 104184.74785499295, + 104208.70319029699, + 104232.65990238401, + 104256.61799109577, + 104280.57745627411, + 104304.53829776087, + 104328.50051539797, + 104352.46410902737, + 104376.42907849104, + 104400.39542363105, + 104424.36314428948, + 104448.33224030846, + 104472.3027115302, + 104496.27455779689, + 104520.24777895081, + 104544.22237483428, + 104568.19834528965, + 104592.17569015936, + 104616.15440928582, + 104640.13450251156, + 104664.1159696791, + 104688.09881063103, + 104712.08302520998, + 104736.06861325864, + 104760.05557461972, + 104784.043909136, + 104808.03361665027, + 104832.0246970054, + 104856.01715004431, + 104880.01097560991, + 104904.00617354522, + 104928.00274369326, + 104952.00068589712, + 104975.99999999993, + 105000.00068584486, + 105024.00274327511, + 105048.00617213396, + 105072.0109722647, + 105096.0171435107, + 105120.02468571534, + 105144.03359872208, + 105168.04388237436, + 105192.05553651576, + 105216.06856098982, + 105240.08295564017, + 105264.09872031047, + 105288.11585484444, + 105312.13435908582, + 105336.1542328784, + 105360.17547606604, + 105384.19808849262, + 105408.22207000206, + 105432.24742043833, + 105456.27413964548, + 105480.30222746753, + 105504.33168374863, + 105528.36250833291, + 105552.39470106458, + 105576.42826178786, + 105600.46319034706, + 105624.49948658649, + 105648.53715035053, + 105672.5761814836, + 105696.61657983017, + 105720.65834523473, + 105744.70147754184, + 105768.7459765961, + 105792.79184224214, + 105816.83907432464, + 105840.88767268835, + 105864.93763717801, + 105888.98896763846, + 105913.04166391456, + 105937.09572585119, + 105961.15115329332, + 105985.20794608595, + 106009.26610407409, + 106033.32562710284, + 106057.38651501729, + 106081.44876766266, + 106105.51238488412, + 106129.57736652695, + 106153.64371243643, + 106177.71142245791, + 106201.78049643678, + 106225.85093421848, + 106249.92273564848, + 106273.99590057228, + 106298.07042883546, + 106322.14632028362, + 106346.22357476239, + 106370.30219211751, + 106394.38217219469, + 106418.46351483969, + 106442.54621989837, + 106466.63028721658, + 106490.71571664025, + 106514.80250801529, + 106538.89066118775, + 106562.98017600364, + 106587.07105230905, + 106611.16328995011, + 106635.25688877302, + 106659.35184862395, + 106683.44816934918, + 106707.54585079502, + 106731.64489280782, + 106755.74529523395, + 106779.84705791986, + 106803.95018071201, + 106828.05466345693, + 106852.16050600118, + 106876.26770819137, + 106900.37626987413, + 106924.48619089619, + 106948.59747110425, + 106972.71011034511, + 106996.82410846559, + 107020.93946531253, + 107045.05618073288, + 107069.17425457356, + 107093.29368668159, + 107117.41447690397, + 107141.53662508781, + 107165.66013108024, + 107189.7849947284, + 107213.91121587952, + 107238.03879438085, + 107262.16773007967, + 107286.29802282334, + 107310.42967245923, + 107334.56267883476, + 107358.69704179741, + 107382.83276119467, + 107406.96983687414, + 107431.10826868335, + 107455.24805646999, + 107479.38920008171, + 107503.53169936626, + 107527.67555417139, + 107551.82076434491, + 107575.96732973469, + 107600.11525018861, + 107624.26452555459, + 107648.41515568066, + 107672.56714041479, + 107696.72047960508, + 107720.87517309963, + 107745.03122074658, + 107769.18862239413, + 107793.34737789053, + 107817.50748708403, + 107841.66894982298, + 107865.83176595572, + 107889.99593533068, + 107914.16145779629, + 107938.32833320105, + 107962.49656139348, + 107986.66614222217, + 108010.83707553572, + 108035.00936118282, + 108059.18299901215, + 108083.35798887245, + 108107.53433061253, + 108131.71202408121, + 108155.89106912735, + 108180.07146559987, + 108204.25321334775, + 108228.43631221994, + 108252.62076206553, + 108276.80656273357, + 108300.99371407321, + 108325.18221593359, + 108349.37206816394, + 108373.56327061349, + 108397.75582313156, + 108421.94972556747, + 108446.1449777706, + 108470.34157959036, + 108494.53953087622, + 108518.73883147769, + 108542.93948124432, + 108567.14148002568, + 108591.34482767139, + 108615.54952403114, + 108639.75556895464, + 108663.96296229165, + 108688.17170389196, + 108712.38179360541, + 108736.59323128188, + 108760.80601677128, + 108785.02014992358, + 108809.23563058881, + 108833.45245861699, + 108857.67063385822, + 108881.89015616261, + 108906.11102538036, + 108930.33324136167, + 108954.55680395682, + 108978.78171301607, + 109003.00796838976, + 109027.23556992831, + 109051.46451748211, + 109075.69481090162, + 109099.92645003737, + 109124.15943473989, + 109148.39376485976, + 109172.62944024763, + 109196.86646075416, + 109221.10482623006, + 109245.34453652608, + 109269.58559149304, + 109293.82799098175, + 109318.07173484311, + 109342.31682292801, + 109366.56325508743, + 109390.81103117237, + 109415.06015103387, + 109439.31061452301, + 109463.56242149093, + 109487.8155717888, + 109512.07006526781, + 109536.3259017792, + 109560.58308117429, + 109584.8416033044, + 109609.1014680209, + 109633.36267517522, + 109657.62522461878, + 109681.88911620311, + 109706.15434977971, + 109730.4209252002, + 109754.68884231619, + 109778.95810097932, + 109803.22870104131, + 109827.50064235389, + 109851.77392476884, + 109876.04854813802, + 109900.32451231324, + 109924.60181714644, + 109948.88046248957, + 109973.1604481946, + 109997.44177411357, + 110021.72444009855, + 110046.00844600165, + 110070.29379167501, + 110094.58047697082, + 110118.86850174134, + 110143.15786583882, + 110167.44856911557, + 110191.74061142397, + 110216.03399261639, + 110240.32871254528, + 110264.62477106311, + 110288.9221680224, + 110313.22090327571, + 110337.52097667565, + 110361.82238807483, + 110386.12513732594, + 110410.42922428172, + 110434.73464879491, + 110459.04141071832, + 110483.34950990479, + 110507.6589462072, + 110531.96971947847, + 110556.28182957157, + 110580.5952763395, + 110604.91005963532, + 110629.22617931209, + 110653.54363522294, + 110677.86242722106, + 110702.18255515963, + 110726.50401889188, + 110750.82681827113, + 110775.1509531507, + 110799.47642338395, + 110823.80322882428, + 110848.13136932514, + 110872.46084474004, + 110896.79165492248, + 110921.12379972603, + 110945.4572790043, + 110969.79209261097, + 110994.12824039967, + 111018.46572222417, + 111042.80453793822, + 111067.14468739564, + 111091.48617045028, + 111115.82898695602, + 111140.1731367668, + 111164.51861973655, + 111188.86543571933, + 111213.21358456917, + 111237.56306614014, + 111261.91388028639, + 111286.26602686207, + 111310.61950572141, + 111334.97431671864, + 111359.33045970804, + 111383.68793454397, + 111408.04674108078, + 111432.40687917286, + 111456.76834867468, + 111481.13114944073, + 111505.49528132551, + 111529.86074418361, + 111554.22753786964, + 111578.59566223821, + 111602.96511714405, + 111627.33590244185, + 111651.7080179864, + 111676.08146363248, + 111700.45623923496, + 111724.8323446487, + 111749.20977972864, + 111773.58854432974, + 111797.96863830699, + 111822.35006151545, + 111846.73281381019, + 111871.11689504632, + 111895.50230507903, + 111919.8890437635, + 111944.27711095495, + 111968.6665065087, + 111993.05723028004, + 112017.44928212435, + 112041.842661897, + 112066.23736945343, + 112090.63340464912, + 112115.03076733962, + 112139.42945738042, + 112163.82947462716, + 112188.23081893545, + 112212.63349016097, + 112237.03748815943, + 112261.44281278658, + 112285.84946389822, + 112310.25744135017, + 112334.66674499828, + 112359.07737469849, + 112383.48933030672, + 112407.90261167898, + 112432.31721867126, + 112456.73315113965, + 112481.15040894024, + 112505.56899192919, + 112529.98889996267, + 112554.41013289688, + 112578.8326905881, + 112603.25657289263, + 112627.68177966679, + 112652.10831076698, + 112676.53616604958, + 112700.96534537108, + 112725.39584858794, + 112749.82767555672, + 112774.26082613398, + 112798.6953001763, + 112823.13109754038, + 112847.56821808286, + 112872.00666166049, + 112896.44642813003, + 112920.88751734827, + 112945.32992917208, + 112969.77366345831, + 112994.21872006389, + 113018.66509884578, + 113043.11279966099, + 113067.56182236652, + 113092.01216681948, + 113116.46383287695, + 113140.9168203961, + 113165.37112923413, + 113189.82675924824, + 113214.28371029573, + 113238.74198223387, + 113263.20157492002, + 113287.66248821157, + 113312.12472196593, + 113336.58827604055, + 113361.05315029295, + 113385.51934458067, + 113409.98685876124, + 113434.45569269233, + 113458.92584623155, + 113483.39731923661, + 113507.87011156522, + 113532.34422307517, + 113556.81965362425, + 113581.2964030703, + 113605.77447127122, + 113630.25385808491, + 113654.73456336933, + 113679.2165869825, + 113703.69992878241, + 113728.18458862718, + 113752.67056637487, + 113777.15786188368, + 113801.64647501177, + 113826.13640561736, + 113850.62765355874, + 113875.12021869418, + 113899.61410088204, + 113924.1092999807, + 113948.60581584855, + 113973.10364834407, + 113997.60279732574, + 114022.1032626521, + 114046.60504418171, + 114071.10814177318, + 114095.61255528514, + 114120.11828457628, + 114144.62532950533, + 114169.13368993104, + 114193.6433657122, + 114218.15435670764, + 114242.66666277625, + 114267.18028377694, + 114291.69521956862, + 114316.21147001031, + 114340.72903496103, + 114365.24791427983, + 114389.7681078258, + 114414.2896154581, + 114438.81243703589, + 114463.33657241837, + 114487.8620214648, + 114512.38878403447, + 114536.91685998671, + 114561.44624918087, + 114585.97695147636, + 114610.5089667326, + 114635.04229480909, + 114659.57693556532, + 114684.11288886084, + 114708.65015455526, + 114733.18873250818, + 114757.72862257928, + 114782.26982462825, + 114806.81233851484, + 114831.35616409882, + 114855.90130123998, + 114880.44774979822, + 114904.99550963337, + 114929.5445806054, + 114954.09496257425, + 114978.64665539992, + 115003.19965894247, + 115027.75397306195, + 115052.30959761847, + 115076.86653247218, + 115101.42477748329, + 115125.984332512, + 115150.54519741859, + 115175.10737206334, + 115199.67085630659, + 115224.23565000873, + 115248.80175303014, + 115273.3691652313, + 115297.93788647266, + 115322.50791661476, + 115347.07925551817, + 115371.65190304347, + 115396.22585905129, + 115420.80112340231, + 115445.37769595724, + 115469.95557657682, + 115494.53476512182, + 115519.11526145306, + 115543.69706543141, + 115568.28017691776, + 115592.86459577303, + 115617.4503218582, + 115642.03735503425, + 115666.62569516223, + 115691.21534210323, + 115715.80629571836, + 115740.39855586876, + 115764.99212241563, + 115789.58699522018, + 115814.18317414368, + 115838.78065904744, + 115863.37944979276, + 115887.97954624105, + 115912.5809482537, + 115937.18365569216, + 115961.78766841792, + 115986.39298629249, + 116010.99960917742, + 116035.60753693432, + 116060.21676942479, + 116084.82730651053, + 116109.43914805322, + 116134.0522939146, + 116158.66674395646, + 116183.2824980406, + 116207.89955602887, + 116232.51791778316, + 116257.13758316539, + 116281.75855203751, + 116306.38082426153, + 116331.00439969949, + 116355.62927821343, + 116380.25545966547, + 116404.88294391775, + 116429.51173083246, + 116454.14182027178, + 116478.77321209799, + 116503.40590617337, + 116528.03990236025, + 116552.67520052097, + 116577.31180051794, + 116601.94970221359, + 116626.5889054704, + 116651.22941015086, + 116675.87121611751, + 116700.51432323294, + 116725.15873135976, + 116749.8044403606, + 116774.45145009817, + 116799.0997604352, + 116823.74937123443, + 116848.40028235866, + 116873.05249367072, + 116897.70600503348, + 116922.36081630984, + 116947.01692736275, + 116971.67433805518, + 116996.33304825013, + 117020.99305781067, + 117045.65436659988, + 117070.31697448085, + 117094.98088131678, + 117119.64608697082, + 117144.31259130624, + 117168.98039418629, + 117193.64949547425, + 117218.31989503348, + 117242.99159272734, + 117267.66458841923, + 117292.33888197262, + 117317.01447325097, + 117341.6913621178, + 117366.36954843666, + 117391.04903207115, + 117415.72981288488, + 117440.41189074152, + 117465.09526550474, + 117489.77993703831, + 117514.46590520597, + 117539.15316987153, + 117563.84173089883, + 117588.53158815173, + 117613.22274149416, + 117637.91519079007, + 117662.60893590341, + 117687.30397669821, + 117712.00031303853, + 117736.69794478847, + 117761.39687181212, + 117786.09709397367, + 117810.7986111373, + 117835.50142316725, + 117860.20552992777, + 117884.91093128319, + 117909.6176270978, + 117934.32561723603, + 117959.03490156225, + 117983.74547994092, + 118008.45735223651, + 118033.17051831353, + 118057.88497803656, + 118082.60073127014, + 118107.31777787894, + 118132.03611772758, + 118156.75575068076, + 118181.47667660323, + 118206.19889535972, + 118230.92240681504, + 118255.64721083404, + 118280.37330728157, + 118305.10069602253, + 118329.82937692189, + 118354.55934984458, + 118379.29061465565, + 118404.02317122012, + 118428.75701940308, + 118453.49215906965, + 118478.22859008498, + 118502.96631231424, + 118527.70532562268, + 118552.44562987552, + 118577.18722493808, + 118601.93011067568, + 118626.67428695368, + 118651.41975363747, + 118676.16651059251, + 118700.91455768423, + 118725.66389477813, + 118750.41452173979, + 118775.16643843475, + 118799.91964472862, + 118824.67414048707, + 118849.42992557574, + 118874.18699986035, + 118898.94536320666, + 118923.70501548045, + 118948.46595654752, + 118973.22818627374, + 118997.99170452499, + 119022.7565111672, + 119047.52260606633, + 119072.28998908834, + 119097.0586600993, + 119121.82861896523, + 119146.59986555226, + 119171.3723997265, + 119196.14622135412, + 119220.92133030134, + 119245.69772643436, + 119270.47540961947, + 119295.25437972297, + 119320.03463661121, + 119344.81618015055, + 119369.5990102074, + 119394.38312664822, + 119419.16852933947, + 119443.95521814766, + 119468.74319293935, + 119493.53245358112, + 119518.32299993958, + 119543.11483188139, + 119567.90794927324, + 119592.70235198183, + 119617.49803987393, + 119642.29501281632, + 119667.09327067583, + 119691.89281331931, + 119716.69364061367, + 119741.49575242582, + 119766.29914862274, + 119791.10382907141, + 119815.90979363887, + 119840.71704219218, + 119865.52557459843, + 119890.33539072477, + 119915.14649043836, + 119939.95887360642, + 119964.77254009615, + 119989.58748977486, + 120014.40372250983, + 120039.22123816841, + 120064.04003661797, + 120088.86011772591, + 120113.6814813597, + 120138.5041273868, + 120163.3280556747, + 120188.15326609099, + 120212.97975850321, + 120237.807532779, + 120262.63658878599, + 120287.46692639188, + 120312.29854546436, + 120337.13144587121, + 120361.9656274802, + 120386.80109015915, + 120411.63783377589, + 120436.47585819835, + 120461.31516329442, + 120486.15574893207, + 120510.99761497928, + 120535.84076130406, + 120560.68518777451, + 120585.53089425867, + 120610.3778806247, + 120635.22614674074, + 120660.07569247499, + 120684.92651769568, + 120709.77862227106, + 120734.63200606944, + 120759.48666895913, + 120784.3426108085, + 120809.19983148595, + 120834.05833085992, + 120858.91810879884, + 120883.77916517125, + 120908.64149984565, + 120933.5051126906, + 120958.37000357473, + 120983.23617236665, + 121008.10361893504, + 121032.97234314861, + 121057.84234487606, + 121082.71362398617, + 121107.58618034775, + 121132.46001382964, + 121157.33512430069, + 121182.21151162982, + 121207.08917568595, + 121231.96811633807, + 121256.84833345517, + 121281.72982690629, + 121306.61259656049, + 121331.49664228689, + 121356.38196395461, + 121381.26856143285, + 121406.15643459078, + 121431.04558329767, + 121455.93600742276, + 121480.82770683538, + 121505.72068140487, + 121530.61493100057, + 121555.51045549192, + 121580.40725474835, + 121605.30532863933, + 121630.20467703436, + 121655.10529980299, + 121680.00719681478, + 121704.91036793934, + 121729.81481304632, + 121754.72053200539, + 121779.62752468624, + 121804.53579095862, + 121829.44533069231, + 121854.3561437571, + 121879.26823002285, + 121904.1815893594, + 121929.09622163669, + 121954.01212672464, + 121978.92930449323, + 122003.84775481246, + 122028.76747755238, + 122053.68847258303, + 122078.61073977455, + 122103.53427899707, + 122128.45909012076, + 122153.38517301581, + 122178.31252755247, + 122203.24115360099, + 122228.17105103172, + 122253.10221971494, + 122278.03465952107, + 122302.96837032049, + 122327.90335198362, + 122352.83960438096, + 122377.777127383, + 122402.71592086025, + 122427.65598468333, + 122452.59731872278, + 122477.53992284928, + 122502.48379693348, + 122527.42894084606, + 122552.37535445779, + 122577.32303763942, + 122602.27199026172, + 122627.22221219557, + 122652.17370331181, + 122677.12646348133, + 122702.08049257506, + 122727.03579046397, + 122751.99235701906, + 122776.95019211136, + 122801.9092956119, + 122826.8696673918, + 122851.83130732219, + 122876.79421527422, + 122901.75839111909, + 122926.72383472799, + 122951.69054597223, + 122976.65852472307, + 123001.62777085182, + 123026.59828422987, + 123051.57006472857, + 123076.54311221937, + 123101.5174265737, + 123126.49300766307, + 123151.46985535898, + 123176.44796953299, + 123201.42735005668, + 123226.40799680166, + 123251.38990963959, + 123276.37308844214, + 123301.35753308103, + 123326.343243428, + 123351.33021935483, + 123376.31846073334, + 123401.30796743535, + 123426.29873933276, + 123451.29077629748, + 123476.28407820144, + 123501.2786449166, + 123526.27447631498, + 123551.27157226863, + 123576.26993264959, + 123601.26955732999, + 123626.27044618195, + 123651.27259907764, + 123676.27601588926, + 123701.28069648903, + 123726.28664074924, + 123751.29384854218, + 123776.30231974016, + 123801.31205421555, + 123826.32305184075, + 123851.33531248817, + 123876.34883603029, + 123901.36362233957, + 123926.37967128855, + 123951.39698274979, + 123976.41555659588, + 124001.43539269941, + 124026.45649093305, + 124051.47885116948, + 124076.50247328142, + 124101.5273571416, + 124126.55350262282, + 124151.58090959788, + 124176.60957793961, + 124201.63950752091, + 124226.67069821467, + 124251.70314989384, + 124276.73686243138, + 124301.7718357003, + 124326.80806957364, + 124351.84556392446, + 124376.88431862585, + 124401.92433355095, + 124426.96560857294, + 124452.00814356498, + 124477.05193840031, + 124502.0969929522, + 124527.14330709392, + 124552.19088069882, + 124577.23971364023, + 124602.28980579154, + 124627.34115702618, + 124652.3937672176, + 124677.44763623926, + 124702.50276396469, + 124727.55915026742, + 124752.61679502104, + 124777.67569809916, + 124802.73585937542, + 124827.79727872348, + 124852.85995601704, + 124877.92389112986, + 124902.98908393568, + 124928.05553430831, + 124953.1232421216, + 124978.19220724938, + 125003.26242956554, + 125028.33390894404, + 125053.40664525882, + 125078.48063838384, + 125103.55588819318, + 125128.63239456083, + 125153.71015736091, + 125178.78917646752, + 125203.86945175481, + 125228.95098309696, + 125254.03377036817, + 125279.1178134427, + 125304.20311219479, + 125329.28966649878, + 125354.37747622898, + 125379.46654125977, + 125404.55686146552, + 125429.6484367207, + 125454.74126689974, + 125479.83535187715, + 125504.93069152744, + 125530.02728572517, + 125555.12513434493, + 125580.22423726133, + 125605.32459434902, + 125630.4262054827, + 125655.52907053704, + 125680.63318938682, + 125705.73856190679, + 125730.84518797178, + 125755.9530674566, + 125781.06220023613, + 125806.17258618528, + 125831.28422517896, + 125856.39711709213, + 125881.51126179981, + 125906.62665917698, + 125931.74330909875, + 125956.86121144016, + 125981.98036607634, + 126007.10077288245, + 126032.22243173365, + 126057.34534250517, + 126082.46950507225, + 126107.59491931014, + 126132.72158509417, + 126157.84950229966, + 126182.97867080198, + 126208.10909047653, + 126233.24076119871, + 126258.37368284403, + 126283.50785528794, + 126308.64327840599, + 126333.77995207369, + 126358.91787616667, + 126384.0570505605, + 126409.19747513086, + 126434.3391497534, + 126459.48207430386, + 126484.62624865794, + 126509.77167269142, + 126534.9183462801, + 126560.06626929982, + 126585.21544162642, + 126610.36586313581, + 126635.51753370393, + 126660.67045320668, + 126685.82462152008, + 126710.98003852014, + 126736.13670408291, + 126761.29461808444, + 126786.45378040087, + 126811.61419090834, + 126836.77584948298, + 126861.93875600102, + 126887.10291033868, + 126912.26831237224, + 126937.43496197795, + 126962.60285903217, + 126987.77200341123, + 127012.94239499152, + 127038.11403364947, + 127063.2869192615, + 127088.46105170409, + 127113.63643085376, + 127138.81305658702, + 127163.99092878048, + 127189.17004731069, + 127214.35041205429, + 127239.53202288797, + 127264.71487968838, + 127289.89898233226, + 127315.08433069635, + 127340.27092465744, + 127365.45876409234, + 127390.64784887788, + 127415.83817889093, + 127441.02975400841, + 127466.22257410725, + 127491.41663906439, + 127516.61194875685, + 127541.80850306165, + 127567.00630185583, + 127592.20534501647, + 127617.4056324207, + 127642.60716394568, + 127667.80993946856, + 127693.01395886653, + 127718.21922201688, + 127743.42572879682, + 127768.63347908368, + 127793.84247275478, + 127819.05270968749, + 127844.26418975917, + 127869.47691284724, + 127894.69087882918, + 127919.90608758242, + 127945.12253898452, + 127970.34023291297, + 127995.55916924537, + 128020.77934785932, + 128046.00076863244, + 128071.22343144237, + 128096.44733616684, + 128121.67248268353, + 128146.89887087021, + 128172.12650060465, + 128197.35537176467, + 128222.5854842281, + 128247.81683787282, + 128273.04943257671, + 128298.28326821771, + 128323.51834467379, + 128348.75466182294, + 128373.99221954317, + 128399.23101771252, + 128424.47105620909, + 128449.71233491098, + 128474.95485369631, + 128500.19861244329, + 128525.44361103009, + 128550.68984933494, + 128575.93732723613, + 128601.18604461191, + 128626.43600134061, + 128651.68719730059, + 128676.93963237021, + 128702.1933064279, + 128727.44821935208, + 128752.70437102125, + 128777.96176131385, + 128803.22039010846, + 128828.48025728362, + 128853.74136271792, + 128879.00370628996, + 128904.26728787841, + 128929.53210736193, + 128954.79816461923, + 128980.06545952905, + 129005.33399197015, + 129030.60376182134, + 129055.87476896142, + 129081.14701326926, + 129106.42049462376, + 129131.6952129038, + 129156.97116798835, + 129182.24835975636, + 129207.52678808685, + 129232.80645285884, + 129258.08735395141, + 129283.36949124365, + 129308.65286461466, + 129333.9374739436, + 129359.22331910966, + 129384.51039999202, + 129409.79871646997, + 129435.08826842274, + 129460.37905572963, + 129485.67107826998, + 129510.96433592314, + 129536.25882856851, + 129561.55455608548, + 129586.85151835352, + 129612.14971525209, + 129637.4491466607, + 129662.74981245887, + 129688.0517125262, + 129713.35484674224, + 129738.65921498663, + 129763.96481713903, + 129789.27165307909, + 129814.57972268655, + 129839.88902584116, + 129865.19956242264, + 129890.51133231082, + 129915.82433538554, + 129941.13857152662, + 129966.45404061397, + 129991.7707425275, + 130017.08867714716, + 130042.4078443529, + 130067.72824402474, + 130093.04987604271, + 130118.37274028687, + 130143.69683663732, + 130169.02216497416, + 130194.34872517755, + 130219.67651712766, + 130245.0055407047, + 130270.33579578891, + 130295.66728226055, + 130320.99999999991, + 130346.33394888733, + 130371.66912880314, + 130397.00553962773, + 130422.34318124152, + 130447.68205352494, + 130473.02215635845, + 130498.36348962256, + 130523.70605319779, + 130549.0498469647, + 130574.39487080388, + 130599.74112459592, + 130625.08860822149, + 130650.43732156123, + 130675.78726449587, + 130701.13843690613, + 130726.49083867275, + 130751.84446967654, + 130777.19932979831, + 130802.5554189189, + 130827.91273691918, + 130853.27128368006, + 130878.63105908247, + 130903.99206300738, + 130929.35429533575, + 130954.71775594862, + 130980.08244472703, + 131005.44836155206, + 131030.81550630482, + 131056.18387886642, + 131081.55347911804, + 131106.92430694087, + 131132.29636221612, + 131157.66964482504, + 131183.0441546489, + 131208.41989156904, + 131233.79685546676, + 131259.17504622342, + 131284.55446372041, + 131309.93510783918, + 131335.31697846117, + 131360.70007546784, + 131386.0843987407, + 131411.46994816128, + 131436.85672361116, + 131462.24472497194, + 131487.63395212521, + 131513.02440495262, + 131538.41608333588, + 131563.80898715663, + 131589.2031162967, + 131614.59847063778, + 131639.9950500617, + 131665.39285445024, + 131690.79188368531, + 131716.19213764873, + 131741.59361622241, + 131766.99631928833, + 131792.40024672839, + 131817.80539842462, + 131843.21177425905, + 131868.61937411371, + 131894.02819787065, + 131919.43824541202, + 131944.84951661993, + 131970.26201137656, + 131995.67572956407, + 132021.09067106468, + 132046.50683576067, + 132071.9242235343, + 132097.34283426782, + 132122.76266784366, + 132148.1837241441, + 132173.60600305157, + 132199.02950444847, + 132224.45422821722, + 132249.88017424036, + 132275.30734240031, + 132300.73573257966, + 132326.16534466096, + 132351.59617852676, + 132377.02823405969, + 132402.46151114244, + 132427.89600965759, + 132453.33172948789, + 132478.76867051609, + 132504.20683262491, + 132529.64621569714, + 132555.08681961559, + 132580.5286442631, + 132605.97168952253, + 132631.41595527678, + 132656.86144140881, + 132682.30814780149, + 132707.75607433787, + 132733.20522090094, + 132758.65558737374, + 132784.10717363929, + 132809.55997958075, + 132835.01400508118, + 132860.46925002377, + 132885.92571429166, + 132911.38339776811, + 132936.84230033628, + 132962.30242187946, + 132987.76376228096, + 133013.22632142407, + 133038.69009919214, + 133064.15509546854, + 133089.62131013666, + 133115.08874307995, + 133140.55739418184, + 133166.02726332581, + 133191.49835039541, + 133216.97065527414, + 133242.44417784561, + 133267.91891799335, + 133293.39487560102, + 133318.87205055228, + 133344.35044273079, + 133369.83005202023, + 133395.31087830439, + 133420.79292146701, + 133446.27618139185, + 133471.76065796276, + 133497.24635106357, + 133522.73326057816, + 133548.22138639039, + 133573.71072838426, + 133599.20128644365, + 133624.69306045261, + 133650.1860502951, + 133675.68025585517, + 133701.1756770169, + 133726.67231366437, + 133752.17016568172, + 133777.66923295305, + 133803.16951536259, + 133828.67101279454, + 133854.17372513309, + 133879.67765226253, + 133905.18279406714, + 133930.68915043125, + 133956.19672123916, + 133981.70550637526, + 134007.21550572399, + 134032.7267191697, + 134058.23914659687, + 134083.75278789, + 134109.26764293358, + 134134.78371161217, + 134160.30099381026, + 134185.8194894125, + 134211.33919830353, + 134236.8601203679, + 134262.38225549037, + 134287.90560355558, + 134313.43016444831, + 134338.95593805326, + 134364.48292425525, + 134390.01112293909, + 134415.54053398955, + 134441.07115729159, + 134466.60299273001, + 134492.1360401898, + 134517.67029955584, + 134543.20577071316, + 134568.74245354676, + 134594.28034794159, + 134619.81945378278, + 134645.35977095537, + 134670.90129934452, + 134696.4440388353, + 134721.98798931291, + 134747.53315066252, + 134773.07952276937, + 134798.62710551871, + 134824.17589879577, + 134849.72590248589, + 134875.27711647438, + 134900.82954064661, + 134926.38317488792, + 134951.93801908373, + 134977.49407311951, + 135003.05133688069, + 135028.60981025276, + 135054.16949312127, + 135079.73038537172, + 135105.29248688967, + 135130.85579756077, + 135156.42031727062, + 135181.98604590484, + 135207.55298334916, + 135233.12112948924, + 135258.69048421088, + 135284.26104739975, + 135309.83281894168, + 135335.4057987225, + 135360.97998662802, + 135386.55538254412, + 135412.13198635669, + 135437.70979795168, + 135463.28881721498, + 135488.86904403262, + 135514.45047829056, + 135540.03311987486, + 135565.61696867159, + 135591.20202456677, + 135616.78828744654, + 135642.37575719706, + 135667.96443370447, + 135693.55431685498, + 135719.14540653475, + 135744.73770263011, + 135770.33120502727, + 135795.92591361253, + 135821.52182827223, + 135847.11894889272, + 135872.7172753604, + 135898.31680756161, + 135923.91754538284, + 135949.51948871053, + 135975.12263743114, + 136000.72699143123, + 136026.33255059729, + 136051.93931481591, + 136077.54728397369, + 136103.15645795723, + 136128.76683665317, + 136154.37841994822, + 136179.99120772901, + 136205.60519988232, + 136231.2203962949, + 136256.83679685349, + 136282.45440144493, + 136308.07320995603, + 136333.69322227367, + 136359.31443828469, + 136384.93685787608, + 136410.56048093468, + 136436.18530734754, + 136461.81133700156, + 136487.43856978384, + 136513.06700558143, + 136538.6966442813, + 136564.32748577066, + 136589.95952993655, + 136615.59277666616, + 136641.22722584667, + 136666.86287736523, + 136692.49973110916, + 136718.13778696564, + 136743.77704482197, + 136769.41750456547, + 136795.05916608346, + 136820.70202926331, + 136846.34609399244, + 136871.99136015819, + 136897.63782764805, + 136923.28549634948, + 136948.93436614997, + 136974.58443693706, + 137000.23570859825, + 137025.88818102115, + 137051.54185409332, + 137077.19672770242, + 137102.85280173609, + 137128.51007608202, + 137154.16855062786, + 137179.82822526142, + 137205.48909987041, + 137231.15117434258, + 137256.8144485658, + 137282.47892242789, + 137308.14459581667, + 137333.81146862009, + 137359.47954072602, + 137385.14881202241, + 137410.81928239719, + 137436.49095173844, + 137462.16381993407, + 137487.83788687221, + 137513.51315244089, + 137539.18961652822, + 137564.86727902229, + 137590.54613981131, + 137616.22619878338, + 137641.90745582676, + 137667.58991082967, + 137693.27356368033, + 137718.95841426702, + 137744.64446247809, + 137770.33170820182, + 137796.02015132661, + 137821.70979174081, + 137847.40062933284, + 137873.09266399115, + 137898.78589560417, + 137924.48032406042, + 137950.17594924837, + 137975.8727710566, + 138001.57078937365, + 138027.27000408815, + 138052.97041508864, + 138078.67202226384, + 138104.3748255024, + 138130.07882469296, + 138155.78401972432, + 138181.49041048516, + 138207.1979968643, + 138232.9067787505, + 138258.61675603263, + 138284.32792859949, + 138310.04029633995, + 138335.75385914298, + 138361.46861689744, + 138387.18456949232, + 138412.90171681659, + 138438.62005875923, + 138464.33959520931, + 138490.06032605586, + 138515.78225118798, + 138541.50537049473, + 138567.2296838653, + 138592.95519118884, + 138618.68189235451, + 138644.40978725153, + 138670.13887576913, + 138695.86915779658, + 138721.60063322316, + 138747.33330193823, + 138773.06716383106, + 138798.80221879104, + 138824.53846670757, + 138850.27590747006, + 138876.01454096794, + 138901.7543670907, + 138927.49538572782, + 138953.2375967688, + 138978.9810001032, + 139004.72559562061, + 139030.47138321059, + 139056.2183627628, + 139081.96653416683, + 139107.71589731239, + 139133.46645208917, + 139159.21819838689, + 139184.97113609532, + 139210.72526510421, + 139236.48058530336, + 139262.23709658257, + 139287.99479883176, + 139313.75369194071, + 139339.51377579942, + 139365.27505029776, + 139391.03751532568, + 139416.80117077316, + 139442.56601653024, + 139468.33205248689, + 139494.09927853322, + 139519.86769455927, + 139545.63730045516, + 139571.408096111, + 139597.18008141697, + 139622.95325626322, + 139648.72762054001, + 139674.5031741375, + 139700.27991694602, + 139726.05784885579, + 139751.83696975713, + 139777.61727954043, + 139803.39877809596, + 139829.18146531415, + 139854.96534108539, + 139880.75040530015, + 139906.53665784886, + 139932.32409862199, + 139958.11272751007, + 139983.90254440365, + 140009.69354919327, + 140035.48574176949, + 140061.27912202294, + 140087.07368984428, + 140112.86944512415, + 140138.66638775321, + 140164.4645176222, + 140190.26383462184, + 140216.06433864293, + 140241.86602957622, + 140267.66890731253, + 140293.47297174268, + 140319.27822275754, + 140345.08466024802, + 140370.89228410498, + 140396.70109421943, + 140422.51109048226, + 140448.32227278448, + 140474.13464101712, + 140499.94819507122, + 140525.76293483781, + 140551.57886020801, + 140577.3959710729, + 140603.21426732364, + 140629.03374885136, + 140654.85441554731, + 140680.67626730262, + 140706.49930400858, + 140732.32352555645, + 140758.1489318375, + 140783.97552274304, + 140809.80329816442, + 140835.63225799298, + 140861.46240212015, + 140887.29373043729, + 140913.12624283586, + 140938.95993920733, + 140964.79481944317, + 140990.63088343487, + 141016.46813107401, + 141042.30656225214, + 141068.14617686081, + 141093.98697479168, + 141119.82895593636, + 141145.6721201865, + 141171.51646743377, + 141197.36199756994, + 141223.20871048668, + 141249.05660607578, + 141274.90568422904, + 141300.75594483822, + 141326.6073877952, + 141352.4600129918, + 141378.31382031992, + 141404.16880967148, + 141430.02498093838, + 141455.8823340126, + 141481.74086878612, + 141507.60058515094, + 141533.46148299909, + 141559.32356222265, + 141585.18682271364, + 141611.05126436421, + 141636.9168870665, + 141662.78369071262, + 141688.65167519479, + 141714.5208404052, + 141740.39118623605, + 141766.26271257963, + 141792.1354193282, + 141818.00930637406, + 141843.88437360956, + 141869.760620927, + 141895.6380482188, + 141921.51665537735, + 141947.39644229505, + 141973.27740886438, + 141999.15955497778, + 142025.04288052776, + 142050.92738540689, + 142076.81306950765, + 142102.69993272264, + 142128.58797494444, + 142154.47719606571, + 142180.36759597904, + 142206.25917457714, + 142232.15193175265, + 142258.04586739838, + 142283.94098140698, + 142309.83727367126, + 142335.73474408401, + 142361.63339253806, + 142387.5332189262, + 142413.43422314132, + 142439.33640507635, + 142465.23976462413, + 142491.14430167765, + 142517.05001612983, + 142542.95690787368, + 142568.86497680223, + 142594.77422280848, + 142620.68464578551, + 142646.5962456264, + 142672.50902222423, + 142698.42297547215, + 142724.33810526333, + 142750.25441149093, + 142776.17189404817, + 142802.09055282827, + 142828.01038772447, + 142853.93139863008, + 142879.85358543837, + 142905.77694804268, + 142931.70148633636, + 142957.62720021277, + 142983.55408956532, + 143009.48215428743, + 143035.41139427255, + 143061.34180941415, + 143087.27339960571, + 143113.20616474075, + 143139.14010471283, + 143165.07521941551, + 143191.01150874238, + 143216.94897258704, + 143242.88761084314, + 143268.82742340435, + 143294.76841016437, + 143320.71057101688, + 143346.65390585564, + 143372.59841457437, + 143398.54409706692, + 143424.49095322701, + 143450.43898294857, + 143476.38818612538, + 143502.33856265133, + 143528.29011242036, + 143554.24283532638, + 143580.19673126334, + 143606.1518001252, + 143632.10804180597, + 143658.06545619969, + 143684.02404320039, + 143709.98380270213, + 143735.944734599, + 143761.90683878519, + 143787.87011515474, + 143813.83456360188, + 143839.8001840208, + 143865.76697630569, + 143891.73494035081, + 143917.7040760504, + 143943.67438329876, + 143969.6458619902, + 143995.61851201905, + 144021.59233327967, + 144047.56732566646, + 144073.54348907378, + 144099.52082339607, + 144125.49932852783, + 144151.4790043635, + 144177.45985079758, + 144203.44186772458, + 144229.42505503909, + 144255.40941263564, + 144281.39494040885, + 144307.38163825331, + 144333.36950606373, + 144359.35854373468, + 144385.34875116093, + 144411.34012823718, + 144437.33267485813, + 144463.32639091855, + 144489.32127631325, + 144515.31733093705, + 144541.31455468474, + 144567.3129474512, + 144593.3125091313, + 144619.31323961995, + 144645.31513881206, + 144671.31820660262, + 144697.32244288657, + 144723.32784755889, + 144749.33442051467, + 144775.34216164888, + 144801.35107085665, + 144827.36114803303, + 144853.37239307314, + 144879.38480587213, + 144905.39838632516, + 144931.41313432742, + 144957.4290497741, + 144983.44613256046, + 145009.46438258173, + 145035.48379973322, + 145061.50438391021, + 145087.52613500805, + 145113.54905292206, + 145139.57313754765, + 145165.59838878017, + 145191.62480651509, + 145217.65239064783, + 145243.68114107384, + 145269.71105768863, + 145295.74214038774, + 145321.77438906668, + 145347.80780362099, + 145373.84238394629, + 145399.87812993818, + 145425.91504149229, + 145451.95311850426, + 145477.9923608698, + 145504.03276848458, + 145530.07434124436, + 145556.11707904484, + 145582.16098178181, + 145608.20604935108, + 145634.25228164849, + 145660.29967856981, + 145686.34824001096, + 145712.39796586783, + 145738.4488560363, + 145764.50091041232, + 145790.55412889185, + 145816.60851137087, + 145842.66405774537, + 145868.72076791141, + 145894.77864176501, + 145920.83767920226, + 145946.89788011924, + 145972.95924441208, + 145999.02177197693, + 146025.08546270995, + 146051.15031650732, + 146077.21633326527, + 146103.28351288004, + 146129.35185524789, + 146155.42136026506, + 146181.49202782792, + 146207.56385783272, + 146233.63685017588, + 146259.71100475377, + 146285.78632146274, + 146311.86280019928, + 146337.94044085976, + 146364.01924334071, + 146390.09920753856, + 146416.18033334985, + 146442.26262067116, + 146468.34606939898, + 146494.43067942993, + 146520.51645066062, + 146546.60338298764, + 146572.69147630769, + 146598.78073051744, + 146624.87114551352, + 146650.96272119274, + 146677.05545745179, + 146703.14935418745, + 146729.2444112965, + 146755.34062867577, + 146781.43800622207, + 146807.53654383228, + 146833.63624140329, + 146859.73709883197, + 146885.83911601527, + 146911.94229285014, + 146938.04662923355, + 146964.15212506248, + 146990.25878023397, + 147016.36659464505, + 147042.47556819281, + 147068.58570077427, + 147094.6969922866, + 147120.80944262692, + 147146.92305169237, + 147173.03781938017, + 147199.15374558745, + 147225.27083021149, + 147251.38907314953, + 147277.50847429881, + 147303.62903355664, + 147329.75075082036, + 147355.87362598727, + 147381.99765895473, + 147408.12284962015, + 147434.24919788091, + 147460.37670363448, + 147486.50536677826, + 147512.63518720976, + 147538.76616482646, + 147564.89829952587, + 147591.03159120557, + 147617.16603976308, + 147643.30164509601, + 147669.43840710199, + 147695.57632567859, + 147721.71540072354, + 147747.85563213445, + 147773.99701980909, + 147800.13956364512, + 147826.28326354033, + 147852.42811939248, + 147878.57413109933, + 147904.72129855872, + 147930.86962166851, + 147957.01910032652, + 147983.16973443062, + 148009.32152387875, + 148035.47446856883, + 148061.62856839882, + 148087.78382326665, + 148113.94023307035, + 148140.09779770792, + 148166.25651707739, + 148192.41639107687, + 148218.57741960438, + 148244.73960255808, + 148270.90293983606, + 148297.0674313365, + 148323.23307695755, + 148349.39987659742, + 148375.56783015432, + 148401.73693752653, + 148427.90719861226, + 148454.07861330983, + 148480.25118151752, + 148506.42490313368, + 148532.59977805667, + 148558.77580618486, + 148584.95298741665, + 148611.13132165043, + 148637.31080878471, + 148663.49144871789, + 148689.6732413485, + 148715.85618657502, + 148742.040284296, + 148768.22553440998, + 148794.41193681557, + 148820.59949141133, + 148846.78819809589, + 148872.97805676793, + 148899.16906732606, + 148925.36122966901, + 148951.55454369547, + 148977.74900930419, + 149003.9446263939, + 149030.1413948634, + 149056.33931461151, + 149082.53838553699, + 149108.73860753875, + 149134.9399805156, + 149161.14250436646, + 149187.34617899026, + 149213.5510042859, + 149239.75698015234, + 149265.96410648854, + 149292.17238319354, + 149318.38181016635, + 149344.59238730598, + 149370.80411451156, + 149397.01699168212, + 149423.23101871679, + 149449.44619551473, + 149475.66252197503, + 149501.87999799693, + 149528.0986234796, + 149554.31839832227, + 149580.53932242419, + 149606.76139568459, + 149632.98461800278, + 149659.20898927809, + 149685.43450940982, + 149711.66117829733, + 149737.88899584001, + 149764.11796193724, + 149790.34807648844, + 149816.57933939309, + 149842.81175055061, + 149869.04530986046, + 149895.28001722222, + 149921.51587253538, + 149947.75287569952, + 149973.99102661415, + 150000.23032517891, + 150026.47077129342, + 150052.71236485732, + 150078.95510577026, + 150105.1989939319, + 150131.444029242, + 150157.69021160025, + 150183.93754090639, + 150210.18601706024, + 150236.43563996154, + 150262.68640951012, + 150288.93832560582, + 150315.19138814852, + 150341.44559703805, + 150367.70095217437, + 150393.95745345735, + 150420.21510078697, + 150446.47389406321, + 150472.73383318601, + 150498.99491805542, + 150525.25714857146, + 150551.52052463419, + 150577.78504614369, + 150604.05071300003, + 150630.31752510337, + 150656.58548235384, + 150682.85458465159, + 150709.1248318968, + 150735.39622398972, + 150761.66876083051, + 150787.9424423195, + 150814.21726835691, + 150840.49323884305, + 150866.77035367821, + 150893.04861276277, + 150919.32801599705, + 150945.60856328148, + 150971.89025451642, + 150998.17308960229, + 151024.45706843957, + 151050.74219092872, + 151077.02845697021, + 151103.31586646455, + 151129.60441931229, + 151155.894115414, + 151182.1849546702, + 151208.47693698155, + 151234.77006224863, + 151261.06433037209, + 151287.35974125259, + 151313.65629479082, + 151339.95399088747, + 151366.25282944329, + 151392.55281035902, + 151418.85393353543, + 151445.1561988733, + 151471.45960627345, + 151497.76415563675, + 151524.06984686397, + 151550.37667985607, + 151576.68465451393, + 151602.99377073845, + 151629.30402843058, + 151655.61542749128, + 151681.92796782157, + 151708.24164932242, + 151734.55647189484, + 151760.87243543993, + 151787.18953985872, + 151813.50778505235, + 151839.82717092187, + 151866.14769736846, + 151892.46936429327, + 151918.79217159748, + 151945.11611918229, + 151971.44120694889, + 151997.76743479856, + 152024.09480263255, + 152050.42331035214, + 152076.75295785864, + 152103.08374505339, + 152129.41567183775, + 152155.74873811303, + 152182.08294378067, + 152208.41828874208, + 152234.75477289871, + 152261.09239615197, + 152287.43115840337, + 152313.77105955439, + 152340.11209950657, + 152366.45427816146, + 152392.79759542056, + 152419.14205118554, + 152445.48764535793, + 152471.8343778394, + 152498.18224853161, + 152524.53125733617, + 152550.88140415482, + 152577.23268888926, + 152603.58511144121, + 152629.93867171241, + 152656.29336960468, + 152682.64920501978, + 152709.00617785956, + 152735.36428802583, + 152761.72353542043, + 152788.08391994529, + 152814.44544150229, + 152840.80809999333, + 152867.17189532038, + 152893.53682738543, + 152919.90289609041, + 152946.27010133737, + 152972.63844302832, + 152999.00792106529, + 153025.37853535041, + 153051.7502857857, + 153078.12317227334, + 153104.4971947154, + 153130.8723530141, + 153157.24864707157, + 153183.62607679001, + 153210.00464207167, + 153236.38434281875, + 153262.76517893354, + 153289.14715031831, + 153315.53025687535, + 153341.91449850702, + 153368.2998751156, + 153394.68638660354, + 153421.07403287315, + 153447.46281382689, + 153473.85272936718, + 153500.24377939643, + 153526.63596381716, + 153553.02928253182, + 153579.42373544298, + 153605.81932245308, + 153632.21604346478, + 153658.61389838057, + 153685.0128871031, + 153711.41300953497, + 153737.81426557881, + 153764.21665513728, + 153790.62017811305, + 153817.02483440886, + 153843.43062392739, + 153869.83754657139, + 153896.24560224367, + 153922.65479084692, + 153949.06511228404, + 153975.4765664578, + 154001.88915327107, + 154028.30287262669, + 154054.71772442761, + 154081.13370857667, + 154107.55082497682, + 154133.96907353101, + 154160.38845414223, + 154186.80896671346, + 154213.23061114774, + 154239.65338734805, + 154266.07729521746, + 154292.50233465908, + 154318.92850557598, + 154345.35580787127, + 154371.7842414481, + 154398.21380620965, + 154424.64450205903, + 154451.07632889951, + 154477.50928663427, + 154503.94337516659, + 154530.37859439969, + 154556.81494423689, + 154583.25242458144, + 154609.69103533673, + 154636.13077640603, + 154662.57164769279, + 154689.01364910032, + 154715.45678053208, + 154741.90104189145, + 154768.34643308193, + 154794.79295400696, + 154821.24060457002, + 154847.68938467462, + 154874.13929422433, + 154900.59033312264, + 154927.04250127316, + 154953.49579857948, + 154979.95022494521, + 155006.40578027396, + 155032.86246446942, + 155059.32027743524, + 155085.77921907514, + 155112.2392892928, + 155138.70048799197, + 155165.16281507642, + 155191.62627044989, + 155218.09085401625, + 155244.55656567923, + 155271.02340534274, + 155297.49137291059, + 155323.96046828668, + 155350.4306913749, + 155376.90204207919, + 155403.37452030348, + 155429.84812595171, + 155456.32285892789, + 155482.79871913602, + 155509.27570648011, + 155535.75382086422, + 155562.23306219239, + 155588.71343036872, + 155615.19492529731, + 155641.67754688227, + 155668.16129502779, + 155694.64616963797, + 155721.13217061706, + 155747.61929786921, + 155774.10755129869, + 155800.59693080973, + 155827.08743630661, + 155853.57906769359, + 155880.07182487496, + 155906.56570775513, + 155933.06071623837, + 155959.55685022907, + 155986.05410963166, + 156012.5524943505, + 156039.05200429002, + 156065.55263935472, + 156092.054399449, + 156118.5572844774, + 156145.06129434443, + 156171.5664289546, + 156198.07268821247, + 156224.5800720226, + 156251.08858028959, + 156277.59821291809, + 156304.10896981266, + 156330.62085087801, + 156357.1338560188, + 156383.64798513969, + 156410.16323814544, + 156436.67961494075, + 156463.1971154304, + 156489.71573951913, + 156516.23548711176, + 156542.75635811311, + 156569.27835242799, + 156595.80146996127, + 156622.32571061782, + 156648.85107430254, + 156675.37756092031, + 156701.90517037612, + 156728.43390257491, + 156754.96375742162, + 156781.49473482129, + 156808.02683467892, + 156834.5600568995, + 156861.09440138817, + 156887.62986804993, + 156914.16645678994, + 156940.70416751326, + 156967.24300012505, + 156993.78295453047, + 157020.32403063469, + 157046.8662283429, + 157073.40954756032, + 157099.9539881922, + 157126.49955014378, + 157153.04623332032, + 157179.59403762716, + 157206.14296296958, + 157232.69300925292, + 157259.24417638258, + 157285.79646426387, + 157312.34987280221, + 157338.90440190304, + 157365.46005147175, + 157392.01682141385, + 157418.57471163478, + 157445.13372204005, + 157471.69385253513, + 157498.25510302564, + 157524.81747341706, + 157551.38096361503, + 157577.9455735251, + 157604.51130305286, + 157631.07815210402, + 157657.64612058419, + 157684.21520839902, + 157710.78541545427, + 157737.35674165559, + 157763.92918690876, + 157790.50275111952, + 157817.07743419363, + 157843.65323603692, + 157870.23015655516, + 157896.80819565422, + 157923.3873532399, + 157949.96762921812, + 157976.54902349479, + 158003.13153597576, + 158029.71516656701, + 158056.29991517449, + 158082.88578170416, + 158109.47276606198, + 158136.06086815402, + 158162.65008788629, + 158189.24042516484, + 158215.83187989573, + 158242.42445198505, + 158269.01814133892, + 158295.61294786347, + 158322.20887146486, + 158348.80591204923, + 158375.4040695228, + 158402.00334379176, + 158428.60373476235, + 158455.2052423408, + 158481.80786643337, + 158508.41160694641, + 158535.01646378616, + 158561.62243685898, + 158588.2295260712, + 158614.8377313292, + 158641.44705253936, + 158668.05748960807, + 158694.66904244179, + 158721.28171094693, + 158747.89549502998, + 158774.5103945974, + 158801.12640955573, + 158827.74353981143, + 158854.36178527112, + 158880.9811458413, + 158907.60162142856, + 158934.22321193956, + 158960.84591728085, + 158987.46973735912, + 159014.09467208097, + 159040.72072135314, + 159067.3478850823, + 159093.97616317519, + 159120.60555553852, + 159147.23606207906, + 159173.8676827036, + 159200.50041731889, + 159227.13426583182, + 159253.76922814918, + 159280.40530417781, + 159307.04249382461, + 159333.68079699649, + 159360.32021360032, + 159386.96074354305, + 159413.60238673165, + 159440.24514307309, + 159466.88901247433, + 159493.53399484244, + 159520.18009008438, + 159546.82729810724, + 159573.47561881805, + 159600.12505212394, + 159626.77559793202, + 159653.42725614941, + 159680.08002668325, + 159706.73390944069, + 159733.38890432892, + 159760.04501125516, + 159786.70223012666, + 159813.36056085059, + 159840.02000333427, + 159866.68055748497, + 159893.34222320997, + 159920.00500041663, + 159946.66888901225, + 159973.33388890422, + 159999.99999999988, + 160026.66722220668, + 160053.33555543202, + 160080.0049995833, + 160106.67555456801, + 160133.3472202936, + 160160.0199966676, + 160186.6938835975, + 160213.36888099083, + 160240.04498875517, + 160266.72220679806, + 160293.40053502709, + 160320.07997334987, + 160346.76052167406, + 160373.44217990729, + 160400.1249479572, + 160426.80882573154, + 160453.49381313793, + 160480.17991008417, + 160506.86711647795, + 160533.55543222709, + 160560.24485723933, + 160586.93539142248, + 160613.62703468435, + 160640.31978693281, + 160667.01364807569, + 160693.70861802087, + 160720.40469667627, + 160747.1018839498, + 160773.80017974938, + 160800.49958398298, + 160827.20009655855, + 160853.90171738411, + 160880.60444636765, + 160907.30828341722, + 160934.01322844089, + 160960.71928134665, + 160987.42644204266, + 161014.13471043704, + 161040.84408643784, + 161067.55456995327, + 161094.26616089148, + 161120.97885916062, + 161147.69266466892, + 161174.40757732463, + 161201.12359703594, + 161227.84072371112, + 161254.55895725847, + 161281.27829758628, + 161307.99874460287, + 161334.72029821656, + 161361.44295833571, + 161388.1667248687, + 161414.89159772391, + 161441.61757680977, + 161468.34466203468, + 161495.07285330712, + 161521.80215053557, + 161548.53255362847, + 161575.26406249436, + 161601.99667704175, + 161628.7303971792, + 161655.46522281526, + 161682.20115385848, + 161708.93819021754, + 161735.67633180099, + 161762.41557851751, + 161789.15593027571, + 161815.89738698432, + 161842.63994855201, + 161869.38361488748, + 161896.1283858995, + 161922.87426149679, + 161949.62124158812, + 161976.36932608229, + 162003.1185148881, + 162029.8688079144, + 162056.62020507001, + 162083.37270626382, + 162110.12631140469, + 162136.88102040152, + 162163.63683316324, + 162190.39374959879, + 162217.15176961714, + 162243.91089312723, + 162270.67112003808, + 162297.43245025873, + 162324.19488369819, + 162350.9584202655, + 162377.72305986975, + 162404.48880242003, + 162431.25564782543, + 162458.02359599507, + 162484.79264683815, + 162511.56280026378, + 162538.33405618116, + 162565.10641449949, + 162591.87987512801, + 162618.65443797593, + 162645.43010295252, + 162672.20686996708, + 162698.98473892888, + 162725.76370974723, + 162752.54378233149, + 162779.32495659095, + 162806.10723243505, + 162832.89060977317, + 162859.67508851466, + 162886.46066856899, + 162913.24734984562, + 162940.03513225398, + 162966.82401570358, + 162993.6140001039, + 163020.40508536444, + 163047.19727139481, + 163073.99055810447, + 163100.78494540305, + 163127.58043320014, + 163154.37702140535, + 163181.17470992831, + 163207.97349867865, + 163234.77338756606, + 163261.57437650024, + 163288.37646539087, + 163315.17965414765, + 163341.98394268038, + 163368.78933089875, + 163395.59581871261, + 163422.40340603172, + 163449.2120927659, + 163476.02187882498, + 163502.83276411882, + 163529.6447485573, + 163556.45783205028, + 163583.2720145077, + 163610.08729583945, + 163636.90367595552, + 163663.72115476584, + 163690.53973218042, + 163717.35940810922, + 163744.18018246227, + 163771.00205514964, + 163797.82502608138, + 163824.64909516752, + 163851.4742623182, + 163878.3005274435, + 163905.12789045356, + 163931.95635125853, + 163958.78590976857, + 163985.61656589387, + 164012.44831954464, + 164039.28117063109, + 164066.11511906344, + 164092.95016475199, + 164119.78630760699, + 164146.62354753874, + 164173.46188445756, + 164200.30131827376, + 164227.14184889771, + 164253.98347623978, + 164280.82620021031, + 164307.67002071979, + 164334.51493767856, + 164361.3609509971, + 164388.20806058586, + 164415.05626635533, + 164441.905568216, + 164468.75596607837, + 164495.607459853, + 164522.4600494504, + 164549.31373478117, + 164576.16851575591, + 164603.02439228518, + 164629.88136427966, + 164656.73943164994, + 164683.59859430668, + 164710.45885216061, + 164737.32020512238, + 164764.1826531027, + 164791.04619601235, + 164817.91083376206, + 164844.77656626256, + 164871.64339342469, + 164898.51131515924, + 164925.38033137703, + 164952.25044198887, + 164979.1216469057, + 165005.9939460383, + 165032.86733929763, + 165059.7418265946, + 165086.61740784015, + 165113.4940829452 +}; + +#else + +#ifdef BIG_IQ_TABLE +#define IQ_TABLE_SIZE 8192 +#else +#define IQ_TABLE_SIZE 1026 +#endif + +ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = +{ + REAL_CONST(0.0), + REAL_CONST(1.0/8.0), + REAL_CONST(2.5198420997897464/8.0), + REAL_CONST(4.3267487109222245/8.0), + REAL_CONST(6.3496042078727974/8.0), + REAL_CONST(8.5498797333834844/8.0), + REAL_CONST(10.902723556992836/8.0), + REAL_CONST(13.390518279406722/8.0), + REAL_CONST(15.999999999999998/8.0), + REAL_CONST(18.720754407467133/8.0), + REAL_CONST(21.544346900318832/8.0), + REAL_CONST(24.463780996262464/8.0), + REAL_CONST(27.47314182127996/8.0), + REAL_CONST(30.567350940369842/8.0), + REAL_CONST(33.741991698453212/8.0), + REAL_CONST(36.993181114957046/8.0), + REAL_CONST(40.317473596635935/8.0), + REAL_CONST(43.711787041189993/8.0), + REAL_CONST(47.173345095760126/8.0), + REAL_CONST(50.699631325716943/8.0), + REAL_CONST(54.288352331898118/8.0), + REAL_CONST(57.937407704003519/8.0), + REAL_CONST(61.6448652744185/8.0), + REAL_CONST(65.408940536585988/8.0), + REAL_CONST(69.227979374755591/8.0), + REAL_CONST(73.100443455321638/8.0), + REAL_CONST(77.024897778591622/8.0), + REAL_CONST(80.999999999999986/8.0), + REAL_CONST(85.024491212518527/8.0), + REAL_CONST(89.097187944889555/8.0), + REAL_CONST(93.216975178615741/8.0), + REAL_CONST(97.382800224133163/8.0), + REAL_CONST(101.59366732596474/8.0), + REAL_CONST(105.84863288986224/8.0), + REAL_CONST(110.14680124343441/8.0), + REAL_CONST(114.4873208566006/8.0), + REAL_CONST(118.86938096020653/8.0), + REAL_CONST(123.29220851090024/8.0), + REAL_CONST(127.75506545836058/8.0), + REAL_CONST(132.25724627755247/8.0), + REAL_CONST(136.79807573413572/8.0), + REAL_CONST(141.37690685569191/8.0), + REAL_CONST(145.99311908523086/8.0), + REAL_CONST(150.6461165966291/8.0), + REAL_CONST(155.33532675434674/8.0), + REAL_CONST(160.06019870205279/8.0), + REAL_CONST(164.82020206673349/8.0), + REAL_CONST(169.61482576651861/8.0), + REAL_CONST(174.44357691188537/8.0), + REAL_CONST(179.30597979112557/8.0), + REAL_CONST(184.20157493201927/8.0), + REAL_CONST(189.12991823257562/8.0), + REAL_CONST(194.09058015449685/8.0), + REAL_CONST(199.08314497371677/8.0), + REAL_CONST(204.1072100829694/8.0), + REAL_CONST(209.16238534187647/8.0), + REAL_CONST(214.24829247050752/8.0), + REAL_CONST(219.36456448277784/8.0), + REAL_CONST(224.51084515641216/8.0), + REAL_CONST(229.6867885365223/8.0), + REAL_CONST(234.89205847013176/8.0), + REAL_CONST(240.12632816923249/8.0), + REAL_CONST(245.38927980018505/8.0), + REAL_CONST(250.68060409747261/8.0), + REAL_CONST(255.99999999999991/8.0), + REAL_CONST(261.34717430828869/8.0), + REAL_CONST(266.72184136106449/8.0), + REAL_CONST(272.12372272986045/8.0), + REAL_CONST(277.55254693037961/8.0), + REAL_CONST(283.0080491494619/8.0), + REAL_CONST(288.48997098659891/8.0), + REAL_CONST(293.99806020902247/8.0), + REAL_CONST(299.53207051947408/8.0), + REAL_CONST(305.0917613358298/8.0), + REAL_CONST(310.67689758182206/8.0), + REAL_CONST(316.28724948815585/8.0), + REAL_CONST(321.92259240337177/8.0), + REAL_CONST(327.58270661385535/8.0), + REAL_CONST(333.26737717243742/8.0), + REAL_CONST(338.97639373507025/8.0), + REAL_CONST(344.70955040510125/8.0), + REAL_CONST(350.46664558470013/8.0), + REAL_CONST(356.24748183302603/8.0), + REAL_CONST(362.05186573075139/8.0), + REAL_CONST(367.87960775058258/8.0), + REAL_CONST(373.73052213344511/8.0), + REAL_CONST(379.60442677002078/8.0), + REAL_CONST(385.50114308734607/8.0), + REAL_CONST(391.42049594019937/8.0), + REAL_CONST(397.36231350702371/8.0), + REAL_CONST(403.32642719014467/8.0), + REAL_CONST(409.31267152006262/8.0), + REAL_CONST(415.32088406360799/8.0), + REAL_CONST(421.35090533576471/8.0), + REAL_CONST(427.40257871497619/8.0), + REAL_CONST(433.4757503617617/8.0), + REAL_CONST(439.5702691404793/8.0), + REAL_CONST(445.68598654408271/8.0), + REAL_CONST(451.82275662172759/8.0), + REAL_CONST(457.98043590909128/8.0), + REAL_CONST(464.15888336127773/8.0), + REAL_CONST(470.35796028818726/8.0), + REAL_CONST(476.5775302922363/8.0), + REAL_CONST(482.81745920832043/8.0), + REAL_CONST(489.07761504591741/8.0), + REAL_CONST(495.35786793323581/8.0), + REAL_CONST(501.65809006331688/8.0), + REAL_CONST(507.97815564200368/8.0), + REAL_CONST(514.31794083769648/8.0), + REAL_CONST(520.67732373281672/8.0), + REAL_CONST(527.05618427690604/8.0), + REAL_CONST(533.45440424129174/8.0), + REAL_CONST(539.87186717525128/8.0), + REAL_CONST(546.30845836361505/8.0), + REAL_CONST(552.76406478574609/8.0), + REAL_CONST(559.23857507584194/8.0), + REAL_CONST(565.73187948450413/8.0), + REAL_CONST(572.24386984152341/8.0), + REAL_CONST(578.77443951983378/8.0), + REAL_CONST(585.32348340058843/8.0), + REAL_CONST(591.89089783931263/8.0), + REAL_CONST(598.47658063309257/8.0), + REAL_CONST(605.08043098876044/8.0), + REAL_CONST(611.70234949203643/8.0), + REAL_CONST(618.3422380775919/8.0), + REAL_CONST(624.99999999999977/8.0), + REAL_CONST(631.67553980553748/8.0), + REAL_CONST(638.36876330481164/8.0), + REAL_CONST(645.07957754617485/8.0), + REAL_CONST(651.80789078990415/8.0), + REAL_CONST(658.55361248311499/8.0), + REAL_CONST(665.31665323538357/8.0), + REAL_CONST(672.09692479505225/8.0), + REAL_CONST(678.8943400261943/8.0), + REAL_CONST(685.70881288621433/8.0), + REAL_CONST(692.540258404062/8.0), + REAL_CONST(699.38859265903977/8.0), + REAL_CONST(706.25373276018058/8.0), + REAL_CONST(713.13559682617972/8.0), + REAL_CONST(720.03410396586037/8.0), + REAL_CONST(726.94917425915435/8.0), + REAL_CONST(733.88072873858209/8.0), + REAL_CONST(740.82868937121543/8.0), + REAL_CONST(747.79297904110535/8.0), + REAL_CONST(754.77352153216191/8.0), + REAL_CONST(761.77024151147043/8.0), + REAL_CONST(768.78306451302956/8.0), + REAL_CONST(775.81191692189896/8.0), + REAL_CONST(782.85672595874246/8.0), + REAL_CONST(789.91741966475445/8.0), + REAL_CONST(796.99392688695798/8.0), + REAL_CONST(804.08617726386274/8.0), + REAL_CONST(811.19410121147098/8.0), + REAL_CONST(818.31762990962227/8.0), + REAL_CONST(825.45669528866563/8.0), + REAL_CONST(832.61123001644864/8.0), + REAL_CONST(839.78116748561604/8.0), + REAL_CONST(846.96644180120552/8.0), + REAL_CONST(854.16698776853514/8.0), + REAL_CONST(861.38274088137143/8.0), + REAL_CONST(868.61363731036977/8.0), + REAL_CONST(875.85961389178203/8.0), + REAL_CONST(883.12060811641959/8.0), + REAL_CONST(890.39655811886757/8.0), + REAL_CONST(897.68740266694181/8.0), + REAL_CONST(904.99308115138172/8.0), + REAL_CONST(912.31353357577188/8.0), + REAL_CONST(919.64870054668756/8.0), + REAL_CONST(926.99852326405619/8.0), + REAL_CONST(934.36294351172899/8.0), + REAL_CONST(941.74190364825859/8.0), + REAL_CONST(949.13534659787422/8.0), + REAL_CONST(956.54321584165211/8.0), + REAL_CONST(963.96545540887348/8.0), + REAL_CONST(971.40200986856541/8.0), + REAL_CONST(978.85282432122176/8.0), + REAL_CONST(986.31784439069588/8.0), + REAL_CONST(993.7970162162635/8.0), + REAL_CONST(1001.29028644485/8.0), + REAL_CONST(1008.797602223418/8.0), + REAL_CONST(1016.3189111915103/8.0), + REAL_CONST(1023.8541614739464/8.0), + REAL_CONST(1031.4033016736653/8.0), + REAL_CONST(1038.9662808647138/8.0), + REAL_CONST(1046.5430485853758/8.0), + REAL_CONST(1054.1335548314366/8.0), + REAL_CONST(1061.7377500495838/8.0), + REAL_CONST(1069.3555851309357/8.0), + REAL_CONST(1076.9870114046978/8.0), + REAL_CONST(1084.6319806319441/8.0), + REAL_CONST(1092.2904449995174/8.0), + REAL_CONST(1099.9623571140482/8.0), + REAL_CONST(1107.6476699960892/8.0), + REAL_CONST(1115.3463370743607/8.0), + REAL_CONST(1123.058312180106/8.0), + REAL_CONST(1130.7835495415541/8.0), + REAL_CONST(1138.5220037784854/8.0), + REAL_CONST(1146.273629896901/8.0), + REAL_CONST(1154.0383832837879/8.0), + REAL_CONST(1161.816219701986/8.0), + REAL_CONST(1169.607095285146/8.0), + REAL_CONST(1177.4109665327808/8.0), + REAL_CONST(1185.2277903054078/8.0), + REAL_CONST(1193.0575238197798/8.0), + REAL_CONST(1200.9001246442001/8.0), + REAL_CONST(1208.7555506939248/8.0), + REAL_CONST(1216.6237602266442/8.0), + REAL_CONST(1224.5047118380478/8.0), + REAL_CONST(1232.3983644574657/8.0), + REAL_CONST(1240.3046773435874/8.0), + REAL_CONST(1248.2236100802568/8.0), + REAL_CONST(1256.1551225723395/8.0), + REAL_CONST(1264.099175041662/8.0), + REAL_CONST(1272.0557280230228/8.0), + REAL_CONST(1280.0247423602691/8.0), + REAL_CONST(1288.0061792024444/8.0), + REAL_CONST(1295.9999999999995/8.0), + REAL_CONST(1304.006166501068/8.0), + REAL_CONST(1312.0246407478062/8.0), + REAL_CONST(1320.0553850727929/8.0), + REAL_CONST(1328.0983620954903/8.0), + REAL_CONST(1336.1535347187651/8.0), + REAL_CONST(1344.2208661254647/8.0), + REAL_CONST(1352.3003197750522/8.0), + REAL_CONST(1360.3918594002962/8.0), + REAL_CONST(1368.4954490040145/8.0), + REAL_CONST(1376.6110528558709/8.0), + REAL_CONST(1384.7386354892244/8.0), + REAL_CONST(1392.8781616980295/8.0), + REAL_CONST(1401.0295965337855/8.0), + REAL_CONST(1409.1929053025353/8.0), + REAL_CONST(1417.3680535619119/8.0), + REAL_CONST(1425.5550071182327/8.0), + REAL_CONST(1433.7537320236374/8.0), + REAL_CONST(1441.9641945732744/8.0), + REAL_CONST(1450.1863613025282/8.0), + REAL_CONST(1458.4201989842913/8.0), + REAL_CONST(1466.6656746262797/8.0), + REAL_CONST(1474.9227554683875/8.0), + REAL_CONST(1483.1914089800841/8.0), + REAL_CONST(1491.4716028578516/8.0), + REAL_CONST(1499.7633050226596/8.0), + REAL_CONST(1508.0664836174794/8.0), + REAL_CONST(1516.3811070048375/8.0), + REAL_CONST(1524.7071437644029/8.0), + REAL_CONST(1533.0445626906128/8.0), + REAL_CONST(1541.3933327903342/8.0), + REAL_CONST(1549.7534232805581/8.0), + REAL_CONST(1558.1248035861302/8.0), + REAL_CONST(1566.507443337515/8.0), + REAL_CONST(1574.9013123685909/8.0), + REAL_CONST(1583.3063807144795/8.0), + REAL_CONST(1591.7226186094069/8.0), + REAL_CONST(1600.1499964845941/8.0), + REAL_CONST(1608.58848496618/8.0), + REAL_CONST(1617.0380548731737/8.0), + REAL_CONST(1625.4986772154357/8.0), + REAL_CONST(1633.9703231916887/8.0), + REAL_CONST(1642.4529641875577/8.0), + REAL_CONST(1650.9465717736346/8.0), + REAL_CONST(1659.4511177035752/8.0), + REAL_CONST(1667.9665739122186/8.0), + REAL_CONST(1676.4929125137353/8.0), + REAL_CONST(1685.030105799801/8.0), + REAL_CONST(1693.5781262377957/8.0), + REAL_CONST(1702.136946469027/8.0), + REAL_CONST(1710.7065393069795/8.0), + REAL_CONST(1719.2868777355877/8.0), + REAL_CONST(1727.8779349075323/8.0), + REAL_CONST(1736.4796841425596/8.0), + REAL_CONST(1745.092098925825/8.0), + REAL_CONST(1753.7151529062583/8.0), + REAL_CONST(1762.3488198949503/8.0), + REAL_CONST(1770.9930738635628/8.0), + REAL_CONST(1779.6478889427597/8.0), + REAL_CONST(1788.3132394206564/8.0), + REAL_CONST(1796.9890997412947/8.0), + REAL_CONST(1805.6754445031333/8.0), + REAL_CONST(1814.3722484575621/8.0), + REAL_CONST(1823.0794865074322/8.0), + REAL_CONST(1831.7971337056094/8.0), + REAL_CONST(1840.5251652535437/8.0), + REAL_CONST(1849.2635564998579/8.0), + REAL_CONST(1858.0122829389563/8.0), + REAL_CONST(1866.7713202096493/8.0), + REAL_CONST(1875.5406440937966/8.0), + REAL_CONST(1884.3202305149687/8.0), + REAL_CONST(1893.110055537124/8.0), + REAL_CONST(1901.9100953633042/8.0), + REAL_CONST(1910.7203263343454/8.0), + REAL_CONST(1919.5407249276057/8.0), + REAL_CONST(1928.3712677557098/8.0), + REAL_CONST(1937.2119315653083/8.0), + REAL_CONST(1946.0626932358525/8.0), + REAL_CONST(1954.923529778386/8.0), + REAL_CONST(1963.79441833435/8.0), + REAL_CONST(1972.6753361744036/8.0), + REAL_CONST(1981.5662606972594/8.0), + REAL_CONST(1990.467169428533/8.0), + REAL_CONST(1999.3780400196069/8.0), + REAL_CONST(2008.2988502465078/8.0), + REAL_CONST(2017.2295780087982/8.0), + REAL_CONST(2026.1702013284819/8.0), + REAL_CONST(2035.1206983489212/8.0), + REAL_CONST(2044.0810473337688/8.0), + REAL_CONST(2053.0512266659125/8.0), + REAL_CONST(2062.0312148464309/8.0), + REAL_CONST(2071.0209904935646/8.0), + REAL_CONST(2080.0205323416958/8.0), + REAL_CONST(2089.0298192403443/8.0), + REAL_CONST(2098.0488301531714/8.0), + REAL_CONST(2107.0775441569995/8.0), + REAL_CONST(2116.115940440839/8.0), + REAL_CONST(2125.1639983049317/8.0), + REAL_CONST(2134.2216971597995/8.0), + REAL_CONST(2143.2890165253098/8.0), + REAL_CONST(2152.3659360297484/8.0), + REAL_CONST(2161.4524354089031/8.0), + REAL_CONST(2170.5484945051617/8.0), + REAL_CONST(2179.6540932666144/8.0), + REAL_CONST(2188.7692117461711/8.0), + REAL_CONST(2197.8938301006888/8.0), + REAL_CONST(2207.0279285901042/8.0), + REAL_CONST(2216.1714875765838/8.0), + REAL_CONST(2225.324487523676/8.0), + REAL_CONST(2234.4869089954782/8.0), + REAL_CONST(2243.6587326558101/8.0), + REAL_CONST(2252.8399392673982/8.0), + REAL_CONST(2262.0305096910702/8.0), + REAL_CONST(2271.2304248849537/8.0), + REAL_CONST(2280.4396659036897/8.0), + REAL_CONST(2289.6582138976523/8.0), + REAL_CONST(2298.8860501121762/8.0), + REAL_CONST(2308.1231558867926/8.0), + REAL_CONST(2317.3695126544767/8.0), + REAL_CONST(2326.6251019409005/8.0), + REAL_CONST(2335.8899053636933/8.0), + REAL_CONST(2345.1639046317132/8.0), + REAL_CONST(2354.4470815443233/8.0), + REAL_CONST(2363.7394179906792/8.0), + REAL_CONST(2373.0408959490205/8.0), + REAL_CONST(2382.3514974859731/8.0), + REAL_CONST(2391.6712047558558/8.0), + REAL_CONST(2400.9999999999991/8.0), + REAL_CONST(2410.3378655460651/8.0), + REAL_CONST(2419.6847838073813/8.0), + REAL_CONST(2429.0407372822747/8.0), + REAL_CONST(2438.4057085534191/8.0), + REAL_CONST(2447.7796802871858/8.0), + REAL_CONST(2457.1626352330004/8.0), + REAL_CONST(2466.5545562227112/8.0), + REAL_CONST(2475.9554261699564/8.0), + REAL_CONST(2485.3652280695474/8.0), + REAL_CONST(2494.7839449968492/8.0), + REAL_CONST(2504.2115601071737/8.0), + REAL_CONST(2513.6480566351788/8.0), + REAL_CONST(2523.0934178942675/8.0), + REAL_CONST(2532.5476272760025/8.0), + REAL_CONST(2542.0106682495189/8.0), + REAL_CONST(2551.482524360948/8.0), + REAL_CONST(2560.9631792328441/8.0), + REAL_CONST(2570.4526165636184/8.0), + REAL_CONST(2579.9508201269791/8.0), + REAL_CONST(2589.4577737713744/8.0), + REAL_CONST(2598.9734614194458/8.0), + REAL_CONST(2608.4978670674823/8.0), + REAL_CONST(2618.0309747848837/8.0), + REAL_CONST(2627.5727687136259/8.0), + REAL_CONST(2637.1232330677353/8.0), + REAL_CONST(2646.6823521327647/8.0), + REAL_CONST(2656.2501102652768/8.0), + REAL_CONST(2665.8264918923328/8.0), + REAL_CONST(2675.4114815109842/8.0), + REAL_CONST(2685.0050636877722/8.0), + REAL_CONST(2694.6072230582295/8.0), + REAL_CONST(2704.2179443263894/8.0), + REAL_CONST(2713.8372122642972/8.0), + REAL_CONST(2723.4650117115279/8.0), + REAL_CONST(2733.1013275747096/8.0), + REAL_CONST(2742.7461448270483/8.0), + REAL_CONST(2752.3994485078601/8.0), + REAL_CONST(2762.0612237221085/8.0), + REAL_CONST(2771.7314556399419/8.0), + REAL_CONST(2781.4101294962406/8.0), + REAL_CONST(2791.0972305901655/8.0), + REAL_CONST(2800.7927442847094/8.0), + REAL_CONST(2810.4966560062589/8.0), + REAL_CONST(2820.2089512441521/8.0), + REAL_CONST(2829.9296155502466/8.0), + REAL_CONST(2839.6586345384894/8.0), + REAL_CONST(2849.3959938844923/8.0), + REAL_CONST(2859.1416793251065/8.0), + REAL_CONST(2868.8956766580086/8.0), + REAL_CONST(2878.6579717412847/8.0), + REAL_CONST(2888.4285504930212/8.0), + REAL_CONST(2898.2073988908974/8.0), + REAL_CONST(2907.9945029717837/8.0), + REAL_CONST(2917.789848831344/8.0), + REAL_CONST(2927.5934226236377/8.0), + REAL_CONST(2937.4052105607311/8.0), + REAL_CONST(2947.2251989123079/8.0), + REAL_CONST(2957.0533740052865/8.0), + REAL_CONST(2966.8897222234368/8.0), + REAL_CONST(2976.734230007005/8.0), + REAL_CONST(2986.5868838523397/8.0), + REAL_CONST(2996.4476703115197/8.0), + REAL_CONST(3006.3165759919889/8.0), + REAL_CONST(3016.1935875561908/8.0), + REAL_CONST(3026.0786917212095/8.0), + REAL_CONST(3035.9718752584108/8.0), + REAL_CONST(3045.8731249930906/8.0), + REAL_CONST(3055.7824278041207/8.0), + REAL_CONST(3065.6997706236039/8.0), + REAL_CONST(3075.625140436528/8.0), + REAL_CONST(3085.5585242804245/8.0), + REAL_CONST(3095.4999092450298/8.0), + REAL_CONST(3105.4492824719491/8.0), + REAL_CONST(3115.4066311543256/8.0), + REAL_CONST(3125.3719425365089/8.0), + REAL_CONST(3135.3452039137287/8.0), + REAL_CONST(3145.3264026317715/8.0), + REAL_CONST(3155.3155260866592/8.0), + REAL_CONST(3165.3125617243295/8.0), + REAL_CONST(3175.3174970403229/8.0), + REAL_CONST(3185.3303195794679/8.0), + REAL_CONST(3195.35101693557/8.0), + REAL_CONST(3205.3795767511078/8.0), + REAL_CONST(3215.4159867169251/8.0), + REAL_CONST(3225.460234571929/8.0), + REAL_CONST(3235.5123081027928/8.0), + REAL_CONST(3245.5721951436558/8.0), + REAL_CONST(3255.63988357583/8.0), + REAL_CONST(3265.7153613275095/8.0), + REAL_CONST(3275.7986163734795/8.0), + REAL_CONST(3285.8896367348289/8.0), + REAL_CONST(3295.9884104786665/8.0), + REAL_CONST(3306.0949257178395/8.0), + REAL_CONST(3316.2091706106517/8.0), + REAL_CONST(3326.331133360588/8.0), + REAL_CONST(3336.4608022160378/8.0), + REAL_CONST(3346.5981654700231/8.0), + REAL_CONST(3356.7432114599264/8.0), + REAL_CONST(3366.8959285672249/8.0), + REAL_CONST(3377.0563052172211/8.0), + REAL_CONST(3387.2243298787821/8.0), + REAL_CONST(3397.3999910640764/8.0), + REAL_CONST(3407.5832773283128/8.0), + REAL_CONST(3417.7741772694862/8.0), + REAL_CONST(3427.9726795281199/8.0), + REAL_CONST(3438.1787727870123/8.0), + REAL_CONST(3448.3924457709873/8.0), + REAL_CONST(3458.6136872466445/8.0), + REAL_CONST(3468.8424860221107/8.0), + REAL_CONST(3479.0788309467976/8.0), + REAL_CONST(3489.3227109111554/8.0), + REAL_CONST(3499.5741148464344/8.0), + REAL_CONST(3509.8330317244445/8.0), + REAL_CONST(3520.0994505573185/8.0), + REAL_CONST(3530.3733603972751/8.0), + REAL_CONST(3540.6547503363886/8.0), + REAL_CONST(3550.9436095063534/8.0), + REAL_CONST(3561.239927078258/8.0), + REAL_CONST(3571.5436922623535/8.0), + REAL_CONST(3581.8548943078308/8.0), + REAL_CONST(3592.1735225025936/8.0), + REAL_CONST(3602.4995661730372/8.0), + REAL_CONST(3612.8330146838275/8.0), + REAL_CONST(3623.1738574376814/8.0), + REAL_CONST(3633.5220838751502/8.0), + REAL_CONST(3643.8776834744031/8.0), + REAL_CONST(3654.2406457510142/8.0), + REAL_CONST(3664.6109602577494/8.0), + REAL_CONST(3674.9886165843564/8.0), + REAL_CONST(3685.3736043573545/8.0), + REAL_CONST(3695.7659132398294/8.0), + REAL_CONST(3706.1655329312248/8.0), + REAL_CONST(3716.5724531671399/8.0), + REAL_CONST(3726.9866637191262/8.0), + REAL_CONST(3737.4081543944876/8.0), + REAL_CONST(3747.8369150360782/8.0), + REAL_CONST(3758.2729355221072/8.0), + REAL_CONST(3768.7162057659411/8.0), + REAL_CONST(3779.1667157159077/8.0), + REAL_CONST(3789.6244553551055/8.0), + REAL_CONST(3800.0894147012082/8.0), + REAL_CONST(3810.5615838062768/8.0), + REAL_CONST(3821.0409527565694/8.0), + REAL_CONST(3831.5275116723533/8.0), + REAL_CONST(3842.0212507077194/8.0), + REAL_CONST(3852.522160050396/8.0), + REAL_CONST(3863.0302299215673/8.0), + REAL_CONST(3873.5454505756893/8.0), + REAL_CONST(3884.0678123003108/8.0), + REAL_CONST(3894.5973054158922/8.0), + REAL_CONST(3905.1339202756285/8.0), + REAL_CONST(3915.6776472652732/8.0), + REAL_CONST(3926.2284768029604/8.0), + REAL_CONST(3936.7863993390338/8.0), + REAL_CONST(3947.3514053558706/8.0), + REAL_CONST(3957.9234853677135/8.0), + REAL_CONST(3968.5026299204969/8.0), + REAL_CONST(3979.0888295916798/8.0), + REAL_CONST(3989.6820749900776/8.0), + REAL_CONST(4000.2823567556948/8.0), + REAL_CONST(4010.8896655595613/8.0), + REAL_CONST(4021.5039921035655/8.0), + REAL_CONST(4032.1253271202945/8.0), + REAL_CONST(4042.7536613728694/8.0), + REAL_CONST(4053.3889856547858/8.0), + REAL_CONST(4064.0312907897551/8.0), + REAL_CONST(4074.6805676315448/8.0), + REAL_CONST(4085.3368070638221/8.0), + REAL_CONST(4095.9999999999982/8.0), + REAL_CONST(4106.6701373830711/8.0), + REAL_CONST(4117.347210185475/8.0), + REAL_CONST(4128.0312094089259/8.0), + REAL_CONST(4138.722126084268/8.0), + REAL_CONST(4149.4199512713267/8.0), + REAL_CONST(4160.1246760587583/8.0), + REAL_CONST(4170.8362915638982/8.0), + REAL_CONST(4181.5547889326181/8.0), + REAL_CONST(4192.2801593391769/8.0), + REAL_CONST(4203.0123939860741/8.0), + REAL_CONST(4213.7514841039101/8.0), + REAL_CONST(4224.4974209512384/8.0), + REAL_CONST(4235.2501958144258/8.0), + REAL_CONST(4246.0098000075095/8.0), + REAL_CONST(4256.7762248720574/8.0), + REAL_CONST(4267.549461777031/8.0), + REAL_CONST(4278.3295021186423/8.0), + REAL_CONST(4289.1163373202198/8.0), + REAL_CONST(4299.9099588320714/8.0), + REAL_CONST(4310.7103581313495/8.0), + REAL_CONST(4321.5175267219138/8.0), + REAL_CONST(4332.3314561342004/8.0), + REAL_CONST(4343.152137925088/8.0), + REAL_CONST(4353.9795636777671/8.0), + REAL_CONST(4364.8137250016052/8.0), + REAL_CONST(4375.6546135320223/8.0), + REAL_CONST(4386.5022209303588/8.0), + REAL_CONST(4397.3565388837469/8.0), + REAL_CONST(4408.2175591049827/8.0), + REAL_CONST(4419.0852733324018/8.0), + REAL_CONST(4429.9596733297531/8.0), + REAL_CONST(4440.8407508860728/8.0), + REAL_CONST(4451.7284978155603/8.0), + REAL_CONST(4462.6229059574571/8.0), + REAL_CONST(4473.5239671759227/8.0), + REAL_CONST(4484.4316733599126/8.0), + REAL_CONST(4495.3460164230582/8.0), + REAL_CONST(4506.2669883035496/8.0), + REAL_CONST(4517.1945809640119/8.0), + REAL_CONST(4528.1287863913894/8.0), + REAL_CONST(4539.069596596828/8.0), + REAL_CONST(4550.0170036155587/8.0), + REAL_CONST(4560.9709995067806/8.0), + REAL_CONST(4571.931576353546/8.0), + REAL_CONST(4582.898726262647/8.0), + REAL_CONST(4593.8724413645004/8.0), + REAL_CONST(4604.8527138130348/8.0), + REAL_CONST(4615.8395357855816/8.0), + REAL_CONST(4626.8328994827571/8.0), + REAL_CONST(4637.8327971283588/8.0), + REAL_CONST(4648.8392209692511/8.0), + REAL_CONST(4659.8521632752563/8.0), + REAL_CONST(4670.8716163390473/8.0), + REAL_CONST(4681.8975724760394/8.0), + REAL_CONST(4692.9300240242837/8.0), + REAL_CONST(4703.9689633443595/8.0), + REAL_CONST(4715.0143828192668/8.0), + REAL_CONST(4726.0662748543255/8.0), + REAL_CONST(4737.1246318770682/8.0), + REAL_CONST(4748.1894463371373/8.0), + REAL_CONST(4759.2607107061804/8.0), + REAL_CONST(4770.3384174777493/8.0), + REAL_CONST(4781.4225591671993/8.0), + REAL_CONST(4792.5131283115852/8.0), + REAL_CONST(4803.6101174695614/8.0), + REAL_CONST(4814.7135192212854/8.0), + REAL_CONST(4825.8233261683154/8.0), + REAL_CONST(4836.9395309335096/8.0), + REAL_CONST(4848.0621261609349/8.0), + REAL_CONST(4859.1911045157631/8.0), + REAL_CONST(4870.3264586841779/8.0), + REAL_CONST(4881.4681813732768/8.0), + REAL_CONST(4892.6162653109768/8.0), + REAL_CONST(4903.7707032459193/8.0), + REAL_CONST(4914.931487947375/8.0), + REAL_CONST(4926.0986122051509/8.0), + REAL_CONST(4937.2720688294967/8.0), + REAL_CONST(4948.4518506510112/8.0), + REAL_CONST(4959.637950520555/8.0), + REAL_CONST(4970.8303613091521/8.0), + REAL_CONST(4982.0290759079044/8.0), + REAL_CONST(4993.2340872278974/8.0), + REAL_CONST(5004.4453882001153/8.0), + REAL_CONST(5015.6629717753467/8.0), + REAL_CONST(5026.8868309241007/8.0), + REAL_CONST(5038.1169586365131/8.0), + REAL_CONST(5049.353347922266/8.0), + REAL_CONST(5060.5959918104927/8.0), + REAL_CONST(5071.8448833496996/8.0), + REAL_CONST(5083.1000156076734/8.0), + REAL_CONST(5094.3613816713996/8.0), + REAL_CONST(5105.6289746469747/8.0), + REAL_CONST(5116.9027876595246/8.0), + REAL_CONST(5128.18281385312/8.0), + REAL_CONST(5139.4690463906918/8.0), + REAL_CONST(5150.7614784539473/8.0), + REAL_CONST(5162.0601032432933/8.0), + REAL_CONST(5173.3649139777472/8.0), + REAL_CONST(5184.6759038948594/8.0), + REAL_CONST(5195.9930662506322/8.0), + REAL_CONST(5207.3163943194386/8.0), + REAL_CONST(5218.6458813939435/8.0), + REAL_CONST(5229.9815207850224/8.0), + REAL_CONST(5241.3233058216847/8.0), + REAL_CONST(5252.6712298509919/8.0), + REAL_CONST(5264.025286237983/8.0), + REAL_CONST(5275.3854683655954/8.0), + REAL_CONST(5286.7517696345885/8.0), + REAL_CONST(5298.1241834634639/8.0), + REAL_CONST(5309.5027032883945/8.0), + REAL_CONST(5320.887322563146/8.0), + REAL_CONST(5332.2780347589978/8.0), + REAL_CONST(5343.6748333646756/8.0), + REAL_CONST(5355.0777118862716/8.0), + REAL_CONST(5366.4866638471722/8.0), + REAL_CONST(5377.901682787985/8.0), + REAL_CONST(5389.3227622664635/8.0), + REAL_CONST(5400.749895857437/8.0), + REAL_CONST(5412.1830771527357/8.0), + REAL_CONST(5423.622299761123/8.0), + REAL_CONST(5435.067557308219/8.0), + REAL_CONST(5446.5188434364318/8.0), + REAL_CONST(5457.9761518048872/8.0), + REAL_CONST(5469.4394760893592/8.0), + REAL_CONST(5480.9088099821975/8.0), + REAL_CONST(5492.3841471922606/8.0), + REAL_CONST(5503.8654814448455/8.0), + REAL_CONST(5515.3528064816201/8.0), + REAL_CONST(5526.846116060552/8.0), + REAL_CONST(5538.3454039558474/8.0), + REAL_CONST(5549.8506639578736/8.0), + REAL_CONST(5561.3618898731029/8.0), + REAL_CONST(5572.8790755240361/8.0), + REAL_CONST(5584.4022147491451/8.0), + REAL_CONST(5595.9313014027975/8.0), + REAL_CONST(5607.4663293552012/8.0), + REAL_CONST(5619.0072924923297/8.0), + REAL_CONST(5630.5541847158656/8.0), + REAL_CONST(5642.1069999431284/8.0), + REAL_CONST(5653.665732107017/8.0), + REAL_CONST(5665.230375155943/8.0), + REAL_CONST(5676.8009230537655/8.0), + REAL_CONST(5688.3773697797333/8.0), + REAL_CONST(5699.9597093284156/8.0), + REAL_CONST(5711.5479357096474/8.0), + REAL_CONST(5723.1420429484588/8.0), + REAL_CONST(5734.7420250850209/8.0), + REAL_CONST(5746.347876174581/8.0), + REAL_CONST(5757.9595902874016/8.0), + REAL_CONST(5769.5771615087006/8.0), + REAL_CONST(5781.2005839385911/8.0), + REAL_CONST(5792.8298516920213/8.0), + REAL_CONST(5804.4649588987149/8.0), + REAL_CONST(5816.1058997031105/8.0), + REAL_CONST(5827.7526682643065/8.0), + REAL_CONST(5839.4052587559972/8.0), + REAL_CONST(5851.0636653664196/8.0), + REAL_CONST(5862.7278822982908/8.0), + REAL_CONST(5874.3979037687541/8.0), + REAL_CONST(5886.0737240093204/8.0), + REAL_CONST(5897.7553372658094/8.0), + REAL_CONST(5909.4427377982956/8.0), + REAL_CONST(5921.1359198810505/8.0), + REAL_CONST(5932.8348778024874/8.0), + REAL_CONST(5944.5396058651031/8.0), + REAL_CONST(5956.2500983854261/8.0), + REAL_CONST(5967.9663496939575/8.0), + REAL_CONST(5979.6883541351208/8.0), + REAL_CONST(5991.4161060672022/8.0), + REAL_CONST(6003.1495998623004/8.0), + REAL_CONST(6014.8888299062692/8.0), + REAL_CONST(6026.6337905986684/8.0), + REAL_CONST(6038.3844763527022/8.0), + REAL_CONST(6050.1408815951781/8.0), + REAL_CONST(6061.9030007664414/8.0), + REAL_CONST(6073.6708283203316/8.0), + REAL_CONST(6085.4443587241267/8.0), + REAL_CONST(6097.2235864584891/8.0), + REAL_CONST(6109.0085060174197/8.0), + REAL_CONST(6120.7991119081998/8.0), + REAL_CONST(6132.595398651345/8.0), + REAL_CONST(6144.3973607805519/8.0), + REAL_CONST(6156.2049928426459/8.0), + REAL_CONST(6168.0182893975361/8.0), + REAL_CONST(6179.8372450181578/8.0), + REAL_CONST(6191.6618542904307/8.0), + REAL_CONST(6203.4921118132024/8.0), + REAL_CONST(6215.3280121982016/8.0), + REAL_CONST(6227.1695500699925/8.0), + REAL_CONST(6239.0167200659189/8.0), + REAL_CONST(6250.8695168360628/8.0), + REAL_CONST(6262.7279350431891/8.0), + REAL_CONST(6274.5919693627056/8.0), + REAL_CONST(6286.4616144826068/8.0), + REAL_CONST(6298.3368651034316/8.0), + REAL_CONST(6310.2177159382172/8.0), + REAL_CONST(6322.1041617124456/8.0), + REAL_CONST(6333.9961971640032/8.0), + REAL_CONST(6345.8938170431311/8.0), + REAL_CONST(6357.7970161123785/8.0), + REAL_CONST(6369.7057891465583/8.0), + REAL_CONST(6381.6201309327007/8.0), + REAL_CONST(6393.5400362700075/8.0), + REAL_CONST(6405.4654999698032/8.0), + REAL_CONST(6417.3965168554978/8.0), + REAL_CONST(6429.3330817625329/8.0), + REAL_CONST(6441.2751895383453/8.0), + REAL_CONST(6453.2228350423138/8.0), + REAL_CONST(6465.176013145724/8.0), + REAL_CONST(6477.134718731716/8.0), + REAL_CONST(6489.0989466952469/8.0), + REAL_CONST(6501.0686919430445/8.0), + REAL_CONST(6513.0439493935628/8.0), + REAL_CONST(6525.0247139769417/8.0), + REAL_CONST(6537.010980634961/8.0), + REAL_CONST(6549.002744321001/8.0), + REAL_CONST(6560.9999999999973/8.0), + REAL_CONST(6573.0027426483985/8.0), + REAL_CONST(6585.0109672541284/8.0), + REAL_CONST(6597.0246688165371/8.0), + REAL_CONST(6609.0438423463656/8.0), + REAL_CONST(6621.0684828657004/8.0), + REAL_CONST(6633.0985854079354/8.0), + REAL_CONST(6645.134145017727/8.0), + REAL_CONST(6657.1751567509573/8.0), + REAL_CONST(6669.2216156746908/8.0), + REAL_CONST(6681.2735168671343/8.0), + REAL_CONST(6693.3308554176001/8.0), + REAL_CONST(6705.3936264264594/8.0), + REAL_CONST(6717.461825005108/8.0), + REAL_CONST(6729.535446275926/8.0), + REAL_CONST(6741.6144853722335/8.0), + REAL_CONST(6753.6989374382601/8.0), + REAL_CONST(6765.7887976290967/8.0), + REAL_CONST(6777.8840611106634/8.0), + REAL_CONST(6789.9847230596661/8.0), + REAL_CONST(6802.0907786635626/8.0), + REAL_CONST(6814.2022231205201/8.0), + REAL_CONST(6826.3190516393797/8.0), + REAL_CONST(6838.4412594396181/8.0), + REAL_CONST(6850.5688417513074/8.0), + REAL_CONST(6862.701793815083/8.0), + REAL_CONST(6874.840110882099/8.0), + REAL_CONST(6886.9837882139991/8.0), + REAL_CONST(6899.1328210828724/8.0), + REAL_CONST(6911.2872047712199/8.0), + REAL_CONST(6923.4469345719199/8.0), + REAL_CONST(6935.6120057881863/8.0), + REAL_CONST(6947.7824137335365/8.0), + REAL_CONST(6959.9581537317536/8.0), + REAL_CONST(6972.1392211168532/8.0), + REAL_CONST(6984.3256112330409/8.0), + REAL_CONST(6996.5173194346862/8.0), + REAL_CONST(7008.7143410862773/8.0), + REAL_CONST(7020.9166715623942/8.0), + REAL_CONST(7033.1243062476678/8.0), + REAL_CONST(7045.3372405367481/8.0), + REAL_CONST(7057.5554698342685/8.0), + REAL_CONST(7069.7789895548103/8.0), + REAL_CONST(7082.0077951228714/8.0), + REAL_CONST(7094.2418819728273/8.0), + REAL_CONST(7106.4812455489018/8.0), + REAL_CONST(7118.7258813051285/8.0), + REAL_CONST(7130.9757847053224/8.0), + REAL_CONST(7143.2309512230404/8.0), + REAL_CONST(7155.4913763415516/8.0), + REAL_CONST(7167.7570555538041/8.0), + REAL_CONST(7180.0279843623894/8.0), + REAL_CONST(7192.3041582795131/8.0), + REAL_CONST(7204.5855728269571/8.0), + REAL_CONST(7216.8722235360519/8.0), + REAL_CONST(7229.1641059476406/8.0), + REAL_CONST(7241.4612156120484/8.0), + REAL_CONST(7253.7635480890503/8.0), + REAL_CONST(7266.0710989478375/8.0), + REAL_CONST(7278.3838637669869/8.0), + REAL_CONST(7290.7018381344296/8.0), + REAL_CONST(7303.0250176474174/8.0), + REAL_CONST(7315.3533979124932/8.0), + REAL_CONST(7327.6869745454596/8.0), + REAL_CONST(7340.0257431713462/8.0), + REAL_CONST(7352.3696994243801/8.0), + REAL_CONST(7364.7188389479543/8.0), + REAL_CONST(7377.0731573945968/8.0), + REAL_CONST(7389.4326504259407/8.0), + REAL_CONST(7401.7973137126937/8.0), + REAL_CONST(7414.1671429346061/8.0), + REAL_CONST(7426.5421337804428/8.0), + REAL_CONST(7438.922281947951/8.0), + REAL_CONST(7451.3075831438346/8.0), + REAL_CONST(7463.6980330837177/8.0), + REAL_CONST(7476.0936274921214/8.0), + REAL_CONST(7488.4943621024304/8.0), + REAL_CONST(7500.9002326568652/8.0), + REAL_CONST(7513.3112349064522/8.0), + REAL_CONST(7525.7273646109943/8.0), + REAL_CONST(7538.1486175390446/8.0), + REAL_CONST(7550.5749894678729/8.0), + REAL_CONST(7563.0064761834419/8.0), + REAL_CONST(7575.4430734803736/8.0), + REAL_CONST(7587.8847771619248/8.0), + REAL_CONST(7600.3315830399597/8.0), + REAL_CONST(7612.7834869349153/8.0), + REAL_CONST(7625.24048467578/8.0), + REAL_CONST(7637.7025721000637/8.0), + REAL_CONST(7650.1697450537677/8.0), + REAL_CONST(7662.6419993913596/8.0), + REAL_CONST(7675.1193309757446/8.0), + REAL_CONST(7687.6017356782404/8.0), + REAL_CONST(7700.0892093785433/8.0), + REAL_CONST(7712.5817479647112/8.0), + REAL_CONST(7725.079347333125/8.0), + REAL_CONST(7737.5820033884729/8.0), + REAL_CONST(7750.0897120437139/8.0), + REAL_CONST(7762.6024692200581/8.0), + REAL_CONST(7775.1202708469355/8.0), + REAL_CONST(7787.6431128619733/8.0), + REAL_CONST(7800.1709912109645/8.0), + REAL_CONST(7812.7039018478481/8.0), + REAL_CONST(7825.2418407346768/8.0), + REAL_CONST(7837.7848038415968/8.0), + REAL_CONST(7850.3327871468155/8.0), + REAL_CONST(7862.8857866365806/8.0), + REAL_CONST(7875.4437983051539/8.0), + REAL_CONST(7888.006818154784/8.0), + REAL_CONST(7900.5748421956796/8.0), + REAL_CONST(7913.1478664459901/8.0), + REAL_CONST(7925.725886931772/8.0), + REAL_CONST(7938.3088996869719/8.0), + REAL_CONST(7950.8969007533951/8.0), + REAL_CONST(7963.4898861806851/8.0), + REAL_CONST(7976.0878520262959/8.0), + REAL_CONST(7988.6907943554688/8.0), + REAL_CONST(8001.2987092412086/8.0), + REAL_CONST(8013.911592764257/8.0), + REAL_CONST(8026.5294410130691/8.0), + REAL_CONST(8039.1522500837891/8.0), + REAL_CONST(8051.7800160802271/8.0), + REAL_CONST(8064.412735113835/8.0), + REAL_CONST(8077.0504033036796/8.0), + REAL_CONST(8089.6930167764222/8.0), + REAL_CONST(8102.3405716662946/8.0), + REAL_CONST(8114.9930641150731/8.0), + REAL_CONST(8127.6504902720571/8.0), + REAL_CONST(8140.3128462940449/8.0), + REAL_CONST(8152.9801283453098/8.0), + REAL_CONST(8165.6523325975786/8.0), + REAL_CONST(8178.3294552300049/8.0), + REAL_CONST(8191.0114924291529/8.0), + REAL_CONST(8203.6984403889655/8.0), + REAL_CONST(8216.3902953107463/8.0), + REAL_CONST(8229.0870534031419/8.0), + REAL_CONST(8241.7887108821069/8.0), + REAL_CONST(8254.4952639708936/8.0), + REAL_CONST(8267.2067089000211/8.0), + REAL_CONST(8279.9230419072574/8.0), + REAL_CONST(8292.6442592375952/8.0), + REAL_CONST(8305.3703571432306/8.0), + REAL_CONST(8318.101331883543/8.0), + REAL_CONST(8330.8371797250657/8.0), + REAL_CONST(8343.577896941475/8.0), + REAL_CONST(8356.3234798135582/8.0), + REAL_CONST(8369.0739246291978/8.0), + REAL_CONST(8381.8292276833508/8.0), + REAL_CONST(8394.5893852780209/8.0), + REAL_CONST(8407.3543937222421/8.0), + REAL_CONST(8420.1242493320569/8.0), + REAL_CONST(8432.8989484304948/8.0), + REAL_CONST(8445.6784873475499/8.0), + REAL_CONST(8458.4628624201578/8.0), + REAL_CONST(8471.2520699921806/8.0), + REAL_CONST(8484.0461064143838/8.0), + REAL_CONST(8496.8449680444082/8.0), + REAL_CONST(8509.6486512467636/8.0), + REAL_CONST(8522.4571523927953/8.0), + REAL_CONST(8535.270467860666/8.0), + REAL_CONST(8548.0885940353437/8.0), + REAL_CONST(8560.9115273085663/8.0), + REAL_CONST(8573.7392640788403/8.0), + REAL_CONST(8586.5718007514006/8.0), + REAL_CONST(8599.4091337382069/8.0), + REAL_CONST(8612.2512594579148/8.0), + REAL_CONST(8625.0981743358552/8.0), + REAL_CONST(8637.9498748040205/8.0), + REAL_CONST(8650.8063573010386/8.0), + REAL_CONST(8663.6676182721567/8.0), + REAL_CONST(8676.533654169225/8.0), + REAL_CONST(8689.4044614506638/8.0), + REAL_CONST(8702.2800365814601/8.0), + REAL_CONST(8715.1603760331418/8.0), + REAL_CONST(8728.0454762837508/8.0), + REAL_CONST(8740.9353338178389/8.0), + REAL_CONST(8753.8299451264356/8.0), + REAL_CONST(8766.7293067070332/8.0), + REAL_CONST(8779.6334150635721/8.0), + REAL_CONST(8792.5422667064158/8.0), + REAL_CONST(8805.4558581523324/8.0), + REAL_CONST(8818.3741859244819/8.0), + REAL_CONST(8831.2972465523908/8.0), + REAL_CONST(8844.2250365719356/8.0), + REAL_CONST(8857.1575525253265/8.0), + REAL_CONST(8870.0947909610859/8.0), + REAL_CONST(8883.0367484340295/8.0), + REAL_CONST(8895.9834215052524/8.0), + REAL_CONST(8908.934806742107/8.0), + REAL_CONST(8921.8909007181846/8.0), + REAL_CONST(8934.8517000132997/8.0), + REAL_CONST(8947.817201213471/8.0), + REAL_CONST(8960.7874009109/8.0), + REAL_CONST(8973.7622957039603/8.0), + REAL_CONST(8986.7418821971733/8.0), + REAL_CONST(8999.7261570011924/8.0), + REAL_CONST(9012.7151167327884/8.0), + REAL_CONST(9025.7087580148236/8.0), + REAL_CONST(9038.7070774762469/8.0), + REAL_CONST(9051.7100717520643/8.0), + REAL_CONST(9064.7177374833282/8.0), + REAL_CONST(9077.7300713171153/8.0), + REAL_CONST(9090.7470699065179/8.0), + REAL_CONST(9103.7687299106146/8.0), + REAL_CONST(9116.7950479944648/8.0), + REAL_CONST(9129.8260208290812/8.0), + REAL_CONST(9142.8616450914233/8.0), + REAL_CONST(9155.9019174643727/8.0), + REAL_CONST(9168.9468346367157/8.0), + REAL_CONST(9181.9963933031358/8.0), + REAL_CONST(9195.0505901641845/8.0), + REAL_CONST(9208.1094219262741/8.0), + REAL_CONST(9221.1728853016557/8.0), + REAL_CONST(9234.240977008405/8.0), + REAL_CONST(9247.3136937704076/8.0), + REAL_CONST(9260.3910323173386/8.0), + REAL_CONST(9273.472989384647/8.0), + REAL_CONST(9286.5595617135423/8.0), + REAL_CONST(9299.6507460509747/8.0), + REAL_CONST(9312.7465391496207/8.0), + REAL_CONST(9325.8469377678684/8.0), + REAL_CONST(9338.9519386698012/8.0), + REAL_CONST(9352.0615386251757/8.0), + REAL_CONST(9365.1757344094131/8.0), + REAL_CONST(9378.2945228035842/8.0), + REAL_CONST(9391.4179005943843/8.0), + REAL_CONST(9404.5458645741273/8.0), + REAL_CONST(9417.6784115407263/8.0), + REAL_CONST(9430.8155382976747/8.0), + REAL_CONST(9443.9572416540359/8.0), + REAL_CONST(9457.1035184244265/8.0), + REAL_CONST(9470.2543654290002/8.0), + REAL_CONST(9483.4097794934296/8.0), + REAL_CONST(9496.5697574488931/8.0), + REAL_CONST(9509.7342961320664/8.0), + REAL_CONST(9522.9033923850911/8.0), + REAL_CONST(9536.0770430555804/8.0), + REAL_CONST(9549.2552449965824/8.0), + REAL_CONST(9562.4379950665825/8.0), + REAL_CONST(9575.6252901294793/8.0), + REAL_CONST(9588.8171270545736/8.0), + REAL_CONST(9602.0135027165488/8.0), + REAL_CONST(9615.2144139954635/8.0), + REAL_CONST(9628.4198577767274/8.0), + REAL_CONST(9641.629830951093/8.0), + REAL_CONST(9654.844330414644/8.0), + REAL_CONST(9668.0633530687719/8.0), + REAL_CONST(9681.286895820167/8.0), + REAL_CONST(9694.5149555808002/8.0), + REAL_CONST(9707.7475292679192/8.0), + REAL_CONST(9720.9846138040157/8.0), + REAL_CONST(9734.2262061168276/8.0), + REAL_CONST(9747.4723031393187/8.0), + REAL_CONST(9760.7229018096641/8.0), + REAL_CONST(9773.9779990712323/8.0), + REAL_CONST(9787.2375918725811/8.0), + REAL_CONST(9800.5016771674327/8.0), + REAL_CONST(9813.7702519146696/8.0), + REAL_CONST(9827.0433130783094/8.0), + REAL_CONST(9840.3208576275028/8.0), + REAL_CONST(9853.602882536512/8.0), + REAL_CONST(9866.8893847846994/8.0), + REAL_CONST(9880.1803613565116/8.0), + REAL_CONST(9893.4758092414686/8.0), + REAL_CONST(9906.7757254341523/8.0), + REAL_CONST(9920.0801069341851/8.0), + REAL_CONST(9933.3889507462245/8.0), + REAL_CONST(9946.7022538799429/8.0), + REAL_CONST(9960.0200133500221/8.0), + REAL_CONST(9973.3422261761298/8.0), + REAL_CONST(9986.6688893829159/8.0), + REAL_CONST(9999.9999999999945/8.0), + REAL_CONST(10013.335555061929/8.0), + REAL_CONST(10026.675551608221/8.0), + REAL_CONST(10040.019986683301/8.0), + REAL_CONST(10053.368857336509/8.0), + REAL_CONST(10066.722160622081/8.0), + REAL_CONST(10080.079893599144/8.0), + REAL_CONST(10093.442053331697/8.0), + REAL_CONST(10106.808636888598/8.0), + REAL_CONST(10120.179641343551/8.0), + REAL_CONST(10133.555063775095/8.0), + REAL_CONST(10146.934901266595/8.0), + REAL_CONST(10160.31915090622/8.0), + REAL_CONST(10173.707809786936/8.0), + REAL_CONST(10187.100875006496/8.0), + REAL_CONST(10200.498343667417/8.0), + REAL_CONST(10213.900212876984/8.0), + REAL_CONST(10227.306479747222/8.0), + REAL_CONST(10240.717141394889/8.0), + REAL_CONST(10254.132194941467/8.0), + REAL_CONST(10267.551637513146/8.0), + REAL_CONST(10280.975466240814/8.0), + REAL_CONST(10294.40367826004/8.0), + REAL_CONST(10307.836270711066/8.0), + REAL_CONST(10321.273240738796/8.0), + REAL_CONST(10334.71458549278/8.0) +#ifdef BIG_IQ_TABLE + ,REAL_CONST(10348.160302127204/8.0), + REAL_CONST(10361.610387800878/8.0), + REAL_CONST(10375.064839677221/8.0), + REAL_CONST(10388.523654924258/8.0), + REAL_CONST(10401.986830714593/8.0), + REAL_CONST(10415.454364225412/8.0), + REAL_CONST(10428.926252638465/8.0), + REAL_CONST(10442.402493140049/8.0), + REAL_CONST(10455.883082921007/8.0), + REAL_CONST(10469.368019176709/8.0), + REAL_CONST(10482.85729910704/8.0), + REAL_CONST(10496.350919916393/8.0), + REAL_CONST(10509.848878813653/8.0), + REAL_CONST(10523.351173012188/8.0), + REAL_CONST(10536.857799729838/8.0), + REAL_CONST(10550.3687561889/8.0), + REAL_CONST(10563.884039616123/8.0), + REAL_CONST(10577.403647242685/8.0), + REAL_CONST(10590.927576304197/8.0), + REAL_CONST(10604.455824040679/8.0), + REAL_CONST(10617.988387696556/8.0), + REAL_CONST(10631.525264520642/8.0), + REAL_CONST(10645.066451766135/8.0), + REAL_CONST(10658.611946690598/8.0), + REAL_CONST(10672.161746555956/8.0), + REAL_CONST(10685.715848628475/8.0), + REAL_CONST(10699.274250178762/8.0), + REAL_CONST(10712.836948481747/8.0), + REAL_CONST(10726.403940816675/8.0), + REAL_CONST(10739.975224467091/8.0), + REAL_CONST(10753.550796720834/8.0), + REAL_CONST(10767.130654870027/8.0), + REAL_CONST(10780.714796211059/8.0), + REAL_CONST(10794.303218044579/8.0), + REAL_CONST(10807.895917675487/8.0), + REAL_CONST(10821.492892412922/8.0), + REAL_CONST(10835.094139570248/8.0), + REAL_CONST(10848.699656465047/8.0), + REAL_CONST(10862.309440419107/8.0), + REAL_CONST(10875.923488758415/8.0), + REAL_CONST(10889.541798813138/8.0), + REAL_CONST(10903.16436791762/8.0), + REAL_CONST(10916.791193410372/8.0), + REAL_CONST(10930.422272634056/8.0), + REAL_CONST(10944.05760293548/8.0), + REAL_CONST(10957.697181665582/8.0), + REAL_CONST(10971.341006179427/8.0), + REAL_CONST(10984.98907383619/8.0), + REAL_CONST(10998.641381999149/8.0), + REAL_CONST(11012.297928035676/8.0), + REAL_CONST(11025.958709317223/8.0), + REAL_CONST(11039.623723219316/8.0), + REAL_CONST(11053.292967121541/8.0), + REAL_CONST(11066.966438407539/8.0), + REAL_CONST(11080.64413446499/8.0), + REAL_CONST(11094.326052685608/8.0), + REAL_CONST(11108.012190465128/8.0), + REAL_CONST(11121.702545203296/8.0), + REAL_CONST(11135.397114303863/8.0), + REAL_CONST(11149.095895174571/8.0), + REAL_CONST(11162.798885227143/8.0), + REAL_CONST(11176.506081877278/8.0), + REAL_CONST(11190.217482544635/8.0), + REAL_CONST(11203.933084652828/8.0), + REAL_CONST(11217.652885629415/8.0), + REAL_CONST(11231.376882905886/8.0), + REAL_CONST(11245.105073917659/8.0), + REAL_CONST(11258.837456104062/8.0), + REAL_CONST(11272.574026908333/8.0), + REAL_CONST(11286.314783777601/8.0), + REAL_CONST(11300.059724162888/8.0), + REAL_CONST(11313.808845519083/8.0), + REAL_CONST(11327.562145304952/8.0), + REAL_CONST(11341.319620983111/8.0), + REAL_CONST(11355.081270020033/8.0), + REAL_CONST(11368.847089886023/8.0), + REAL_CONST(11382.617078055218/8.0), + REAL_CONST(11396.391232005579/8.0), + REAL_CONST(11410.169549218874/8.0), + REAL_CONST(11423.952027180676/8.0), + REAL_CONST(11437.738663380349/8.0), + REAL_CONST(11451.529455311042/8.0), + REAL_CONST(11465.324400469679/8.0), + REAL_CONST(11479.123496356951/8.0), + REAL_CONST(11492.926740477304/8.0), + REAL_CONST(11506.734130338931/8.0), + REAL_CONST(11520.545663453764/8.0), + REAL_CONST(11534.361337337466/8.0), + REAL_CONST(11548.181149509423/8.0), + REAL_CONST(11562.005097492724/8.0), + REAL_CONST(11575.83317881417/8.0), + REAL_CONST(11589.665391004253/8.0), + REAL_CONST(11603.501731597149/8.0), + REAL_CONST(11617.342198130715/8.0), + REAL_CONST(11631.186788146468/8.0), + REAL_CONST(11645.035499189589/8.0), + REAL_CONST(11658.888328808911/8.0), + REAL_CONST(11672.745274556904/8.0), + REAL_CONST(11686.606333989675/8.0), + REAL_CONST(11700.471504666955/8.0), + REAL_CONST(11714.340784152086/8.0), + REAL_CONST(11728.214170012021/8.0), + REAL_CONST(11742.091659817312/8.0), + REAL_CONST(11755.973251142101/8.0), + REAL_CONST(11769.858941564111/8.0), + REAL_CONST(11783.748728664636/8.0), + REAL_CONST(11797.642610028539/8.0), + REAL_CONST(11811.540583244237/8.0), + REAL_CONST(11825.442645903697/8.0), + REAL_CONST(11839.34879560242/8.0), + REAL_CONST(11853.259029939445/8.0), + REAL_CONST(11867.173346517333/8.0), + REAL_CONST(11881.091742942155/8.0), + REAL_CONST(11895.014216823492/8.0), + REAL_CONST(11908.940765774427/8.0), + REAL_CONST(11922.871387411526/8.0), + REAL_CONST(11936.806079354839/8.0), + REAL_CONST(11950.744839227897/8.0), + REAL_CONST(11964.687664657684/8.0), + REAL_CONST(11978.634553274653/8.0), + REAL_CONST(11992.585502712702/8.0), + REAL_CONST(12006.540510609168/8.0), + REAL_CONST(12020.499574604828/8.0), + REAL_CONST(12034.462692343877/8.0), + REAL_CONST(12048.429861473938/8.0), + REAL_CONST(12062.401079646032/8.0), + REAL_CONST(12076.376344514589/8.0), + REAL_CONST(12090.355653737433/8.0), + REAL_CONST(12104.339004975769/8.0), + REAL_CONST(12118.326395894188/8.0), + REAL_CONST(12132.317824160644/8.0), + REAL_CONST(12146.313287446457/8.0), + REAL_CONST(12160.312783426305/8.0), + REAL_CONST(12174.316309778205/8.0), + REAL_CONST(12188.323864183525/8.0), + REAL_CONST(12202.335444326955/8.0), + REAL_CONST(12216.351047896511/8.0), + REAL_CONST(12230.370672583531/8.0), + REAL_CONST(12244.394316082657/8.0), + REAL_CONST(12258.421976091831/8.0), + REAL_CONST(12272.453650312296/8.0), + REAL_CONST(12286.489336448574/8.0), + REAL_CONST(12300.529032208471/8.0), + REAL_CONST(12314.572735303058/8.0), + REAL_CONST(12328.620443446678/8.0), + REAL_CONST(12342.672154356922/8.0), + REAL_CONST(12356.727865754638/8.0), + REAL_CONST(12370.787575363909/8.0), + REAL_CONST(12384.851280912055/8.0), + REAL_CONST(12398.918980129623/8.0), + REAL_CONST(12412.990670750381/8.0), + REAL_CONST(12427.066350511306/8.0), + REAL_CONST(12441.146017152583/8.0), + REAL_CONST(12455.229668417589/8.0), + REAL_CONST(12469.317302052901/8.0), + REAL_CONST(12483.40891580827/8.0), + REAL_CONST(12497.50450743663/8.0), + REAL_CONST(12511.604074694078/8.0), + REAL_CONST(12525.707615339878/8.0), + REAL_CONST(12539.815127136444/8.0), + REAL_CONST(12553.926607849342/8.0), + REAL_CONST(12568.042055247275/8.0), + REAL_CONST(12582.161467102082/8.0), + REAL_CONST(12596.284841188726/8.0), + REAL_CONST(12610.41217528529/8.0), + REAL_CONST(12624.543467172971/8.0), + REAL_CONST(12638.678714636069/8.0), + REAL_CONST(12652.817915461985/8.0), + REAL_CONST(12666.961067441209/8.0), + REAL_CONST(12681.108168367316/8.0), + REAL_CONST(12695.259216036962/8.0), + REAL_CONST(12709.414208249869/8.0), + REAL_CONST(12723.573142808827/8.0), + REAL_CONST(12737.736017519681/8.0), + REAL_CONST(12751.902830191326/8.0), + REAL_CONST(12766.073578635704/8.0), + REAL_CONST(12780.248260667788/8.0), + REAL_CONST(12794.426874105588/8.0), + REAL_CONST(12808.609416770132/8.0), + REAL_CONST(12822.795886485468/8.0), + REAL_CONST(12836.986281078653/8.0), + REAL_CONST(12851.180598379744/8.0), + REAL_CONST(12865.378836221802/8.0), + REAL_CONST(12879.580992440871/8.0), + REAL_CONST(12893.787064875984/8.0), + REAL_CONST(12907.997051369144/8.0), + REAL_CONST(12922.210949765335/8.0), + REAL_CONST(12936.428757912496/8.0), + REAL_CONST(12950.650473661524/8.0), + REAL_CONST(12964.876094866273/8.0), + REAL_CONST(12979.105619383534/8.0), + REAL_CONST(12993.339045073039/8.0), + REAL_CONST(13007.576369797454/8.0), + REAL_CONST(13021.817591422368/8.0), + REAL_CONST(13036.062707816285/8.0), + REAL_CONST(13050.311716850629/8.0), + REAL_CONST(13064.564616399723/8.0), + REAL_CONST(13078.821404340792/8.0), + REAL_CONST(13093.082078553954/8.0), + REAL_CONST(13107.346636922217/8.0), + REAL_CONST(13121.615077331464/8.0), + REAL_CONST(13135.887397670458/8.0), + REAL_CONST(13150.163595830827/8.0), + REAL_CONST(13164.44366970706/8.0), + REAL_CONST(13178.727617196502/8.0), + REAL_CONST(13193.015436199352/8.0), + REAL_CONST(13207.307124618648/8.0), + REAL_CONST(13221.602680360265/8.0), + REAL_CONST(13235.902101332911/8.0), + REAL_CONST(13250.205385448118/8.0), + REAL_CONST(13264.512530620239/8.0), + REAL_CONST(13278.823534766434/8.0), + REAL_CONST(13293.138395806676/8.0), + REAL_CONST(13307.457111663734/8.0), + REAL_CONST(13321.779680263176/8.0), + REAL_CONST(13336.106099533356/8.0), + REAL_CONST(13350.436367405409/8.0), + REAL_CONST(13364.77048181325/8.0), + REAL_CONST(13379.108440693562/8.0), + REAL_CONST(13393.450241985796/8.0), + REAL_CONST(13407.795883632158/8.0), + REAL_CONST(13422.145363577607/8.0), + REAL_CONST(13436.498679769853/8.0), + REAL_CONST(13450.855830159346/8.0), + REAL_CONST(13465.216812699266/8.0), + REAL_CONST(13479.581625345529/8.0), + REAL_CONST(13493.950266056772/8.0), + REAL_CONST(13508.32273279435/8.0), + REAL_CONST(13522.699023522329/8.0), + REAL_CONST(13537.079136207483/8.0), + REAL_CONST(13551.463068819286/8.0), + REAL_CONST(13565.850819329906/8.0), + REAL_CONST(13580.2423857142/8.0), + REAL_CONST(13594.63776594971/8.0), + REAL_CONST(13609.036958016657/8.0), + REAL_CONST(13623.439959897927/8.0), + REAL_CONST(13637.846769579081/8.0), + REAL_CONST(13652.257385048335/8.0), + REAL_CONST(13666.67180429656/8.0), + REAL_CONST(13681.090025317284/8.0), + REAL_CONST(13695.512046106669/8.0), + REAL_CONST(13709.937864663521/8.0), + REAL_CONST(13724.367478989278/8.0), + REAL_CONST(13738.800887088004/8.0), + REAL_CONST(13753.238086966385/8.0), + REAL_CONST(13767.679076633727/8.0), + REAL_CONST(13782.123854101939/8.0), + REAL_CONST(13796.572417385545/8.0), + REAL_CONST(13811.024764501659/8.0), + REAL_CONST(13825.480893469998/8.0), + REAL_CONST(13839.94080231286/8.0), + REAL_CONST(13854.404489055134/8.0), + REAL_CONST(13868.871951724283/8.0), + REAL_CONST(13883.34318835034/8.0), + REAL_CONST(13897.818196965914/8.0), + REAL_CONST(13912.296975606168/8.0), + REAL_CONST(13926.779522308825/8.0), + REAL_CONST(13941.26583511416/8.0), + REAL_CONST(13955.755912064991/8.0), + REAL_CONST(13970.249751206682/8.0), + REAL_CONST(13984.747350587126/8.0), + REAL_CONST(13999.248708256751/8.0), + REAL_CONST(14013.753822268511/8.0), + REAL_CONST(14028.262690677873/8.0), + REAL_CONST(14042.775311542828/8.0), + REAL_CONST(14057.291682923867/8.0), + REAL_CONST(14071.811802883994/8.0), + REAL_CONST(14086.335669488704/8.0), + REAL_CONST(14100.863280805994/8.0), + REAL_CONST(14115.394634906341/8.0), + REAL_CONST(14129.92972986271/8.0), + REAL_CONST(14144.468563750548/8.0), + REAL_CONST(14159.01113464777/8.0), + REAL_CONST(14173.55744063476/8.0), + REAL_CONST(14188.107479794369/8.0), + REAL_CONST(14202.661250211901/8.0), + REAL_CONST(14217.218749975118/8.0), + REAL_CONST(14231.779977174227/8.0), + REAL_CONST(14246.344929901879/8.0), + REAL_CONST(14260.913606253163/8.0), + REAL_CONST(14275.486004325601/8.0), + REAL_CONST(14290.062122219146/8.0), + REAL_CONST(14304.641958036171/8.0), + REAL_CONST(14319.225509881464/8.0), + REAL_CONST(14333.812775862236/8.0), + REAL_CONST(14348.403754088098/8.0), + REAL_CONST(14362.998442671067/8.0), + REAL_CONST(14377.59683972556/8.0), + REAL_CONST(14392.198943368388/8.0), + REAL_CONST(14406.804751718748/8.0), + REAL_CONST(14421.414262898223/8.0), + REAL_CONST(14436.027475030774/8.0), + REAL_CONST(14450.64438624274/8.0), + REAL_CONST(14465.264994662828/8.0), + REAL_CONST(14479.889298422106/8.0), + REAL_CONST(14494.517295654005/8.0), + REAL_CONST(14509.148984494313/8.0), + REAL_CONST(14523.784363081166/8.0), + REAL_CONST(14538.423429555049/8.0), + REAL_CONST(14553.066182058781/8.0), + REAL_CONST(14567.712618737527/8.0), + REAL_CONST(14582.362737738777/8.0), + REAL_CONST(14597.016537212348/8.0), + REAL_CONST(14611.674015310382/8.0), + REAL_CONST(14626.33517018734/8.0), + REAL_CONST(14640.999999999993/8.0), + REAL_CONST(14655.668502907418/8.0), + REAL_CONST(14670.340677071003/8.0), + REAL_CONST(14685.016520654426/8.0), + REAL_CONST(14699.696031823671/8.0), + REAL_CONST(14714.379208746999/8.0), + REAL_CONST(14729.066049594967/8.0), + REAL_CONST(14743.756552540408/8.0), + REAL_CONST(14758.45071575843/8.0), + REAL_CONST(14773.148537426418/8.0), + REAL_CONST(14787.850015724018/8.0), + REAL_CONST(14802.555148833142/8.0), + REAL_CONST(14817.263934937961/8.0), + REAL_CONST(14831.976372224897/8.0), + REAL_CONST(14846.692458882624/8.0), + REAL_CONST(14861.41219310206/8.0), + REAL_CONST(14876.135573076363/8.0), + REAL_CONST(14890.862597000923/8.0), + REAL_CONST(14905.593263073371/8.0), + REAL_CONST(14920.327569493558/8.0), + REAL_CONST(14935.065514463557/8.0), + REAL_CONST(14949.807096187662/8.0), + REAL_CONST(14964.552312872382/8.0), + REAL_CONST(14979.301162726431/8.0), + REAL_CONST(14994.053643960735/8.0), + REAL_CONST(15008.809754788414/8.0), + REAL_CONST(15023.569493424788/8.0), + REAL_CONST(15038.332858087369/8.0), + REAL_CONST(15053.099846995858/8.0), + REAL_CONST(15067.870458372134/8.0), + REAL_CONST(15082.644690440264/8.0), + REAL_CONST(15097.422541426484/8.0), + REAL_CONST(15112.204009559202/8.0), + REAL_CONST(15126.989093068994/8.0), + REAL_CONST(15141.777790188597/8.0), + REAL_CONST(15156.570099152905/8.0), + REAL_CONST(15171.366018198967/8.0), + REAL_CONST(15186.165545565986/8.0), + REAL_CONST(15200.968679495301/8.0), + REAL_CONST(15215.775418230402/8.0), + REAL_CONST(15230.585760016909/8.0), + REAL_CONST(15245.399703102579/8.0), + REAL_CONST(15260.217245737298/8.0), + REAL_CONST(15275.038386173073/8.0), + REAL_CONST(15289.863122664035/8.0), + REAL_CONST(15304.691453466432/8.0), + REAL_CONST(15319.523376838621/8.0), + REAL_CONST(15334.358891041069/8.0), + REAL_CONST(15349.197994336346/8.0), + REAL_CONST(15364.040684989128/8.0), + REAL_CONST(15378.886961266177/8.0), + REAL_CONST(15393.736821436356/8.0), + REAL_CONST(15408.590263770609/8.0), + REAL_CONST(15423.447286541972/8.0), + REAL_CONST(15438.307888025554/8.0), + REAL_CONST(15453.172066498542/8.0), + REAL_CONST(15468.039820240196/8.0), + REAL_CONST(15482.91114753184/8.0), + REAL_CONST(15497.786046656869/8.0), + REAL_CONST(15512.664515900733/8.0), + REAL_CONST(15527.546553550939/8.0), + REAL_CONST(15542.432157897045/8.0), + REAL_CONST(15557.32132723066/8.0), + REAL_CONST(15572.214059845435/8.0), + REAL_CONST(15587.110354037064/8.0), + REAL_CONST(15602.010208103273/8.0), + REAL_CONST(15616.913620343823/8.0), + REAL_CONST(15631.820589060506/8.0), + REAL_CONST(15646.731112557136/8.0), + REAL_CONST(15661.645189139546/8.0), + REAL_CONST(15676.562817115593/8.0), + REAL_CONST(15691.483994795139/8.0), + REAL_CONST(15706.408720490062/8.0), + REAL_CONST(15721.336992514242/8.0), + REAL_CONST(15736.268809183561/8.0), + REAL_CONST(15751.204168815901/8.0), + REAL_CONST(15766.143069731135/8.0), + REAL_CONST(15781.085510251132/8.0), + REAL_CONST(15796.03148869974/8.0), + REAL_CONST(15810.981003402798/8.0), + REAL_CONST(15825.934052688119/8.0), + REAL_CONST(15840.890634885489/8.0), + REAL_CONST(15855.850748326673/8.0), + REAL_CONST(15870.814391345401/8.0), + REAL_CONST(15885.781562277361/8.0), + REAL_CONST(15900.752259460214/8.0), + REAL_CONST(15915.726481233565/8.0), + REAL_CONST(15930.704225938984/8.0), + REAL_CONST(15945.685491919978/8.0), + REAL_CONST(15960.670277522009/8.0), + REAL_CONST(15975.658581092481/8.0), + REAL_CONST(15990.65040098073/8.0), + REAL_CONST(16005.645735538035/8.0), + REAL_CONST(16020.644583117599/8.0), + REAL_CONST(16035.646942074556/8.0), + REAL_CONST(16050.652810765967/8.0), + REAL_CONST(16065.662187550806/8.0), + REAL_CONST(16080.675070789974/8.0), + REAL_CONST(16095.691458846273/8.0), + REAL_CONST(16110.711350084424/8.0), + REAL_CONST(16125.734742871053/8.0), + REAL_CONST(16140.761635574685/8.0), + REAL_CONST(16155.792026565747/8.0), + REAL_CONST(16170.825914216561/8.0), + REAL_CONST(16185.863296901338/8.0), + REAL_CONST(16200.904172996183/8.0), + REAL_CONST(16215.948540879079/8.0), + REAL_CONST(16230.996398929899/8.0), + REAL_CONST(16246.047745530386/8.0), + REAL_CONST(16261.102579064163/8.0), + REAL_CONST(16276.160897916721/8.0), + REAL_CONST(16291.22270047542/8.0), + REAL_CONST(16306.287985129484/8.0), + REAL_CONST(16321.356750269995/8.0), + REAL_CONST(16336.428994289896/8.0), + REAL_CONST(16351.504715583982/8.0), + REAL_CONST(16366.5839125489/8.0), + REAL_CONST(16381.666583583141/8.0), + REAL_CONST(16396.752727087041/8.0), + REAL_CONST(16411.842341462776/8.0), + REAL_CONST(16426.935425114363/8.0), + REAL_CONST(16442.031976447644/8.0), + REAL_CONST(16457.131993870298/8.0), + REAL_CONST(16472.235475791829/8.0), + REAL_CONST(16487.342420623561/8.0), + REAL_CONST(16502.452826778641/8.0), + REAL_CONST(16517.566692672033/8.0), + REAL_CONST(16532.684016720516/8.0), + REAL_CONST(16547.804797342676/8.0), + REAL_CONST(16562.929032958902/8.0), + REAL_CONST(16578.056721991394/8.0), + REAL_CONST(16593.18786286415/8.0), + REAL_CONST(16608.322454002962/8.0), + REAL_CONST(16623.460493835417/8.0), + REAL_CONST(16638.601980790896/8.0), + REAL_CONST(16653.746913300558/8.0), + REAL_CONST(16668.895289797354/8.0), + REAL_CONST(16684.047108716015/8.0), + REAL_CONST(16699.202368493046/8.0), + REAL_CONST(16714.361067566726/8.0), + REAL_CONST(16729.523204377107/8.0), + REAL_CONST(16744.688777366009/8.0), + REAL_CONST(16759.857784977012/8.0), + REAL_CONST(16775.030225655464/8.0), + REAL_CONST(16790.206097848466/8.0), + REAL_CONST(16805.385400004874/8.0), + REAL_CONST(16820.568130575302/8.0), + REAL_CONST(16835.754288012104/8.0), + REAL_CONST(16850.943870769381/8.0), + REAL_CONST(16866.136877302983/8.0), + REAL_CONST(16881.333306070494/8.0), + REAL_CONST(16896.53315553123/8.0), + REAL_CONST(16911.736424146249/8.0), + REAL_CONST(16926.943110378332/8.0), + REAL_CONST(16942.153212691992/8.0), + REAL_CONST(16957.366729553454/8.0), + REAL_CONST(16972.583659430682/8.0), + REAL_CONST(16987.804000793338/8.0), + REAL_CONST(17003.027752112816/8.0), + REAL_CONST(17018.254911862205/8.0), + REAL_CONST(17033.485478516312/8.0), + REAL_CONST(17048.719450551645/8.0), + REAL_CONST(17063.956826446421/8.0), + REAL_CONST(17079.197604680547/8.0), + REAL_CONST(17094.44178373563/8.0), + REAL_CONST(17109.689362094967/8.0), + REAL_CONST(17124.940338243552/8.0), + REAL_CONST(17140.194710668064/8.0), + REAL_CONST(17155.452477856852/8.0), + REAL_CONST(17170.713638299967/8.0), + REAL_CONST(17185.978190489128/8.0), + REAL_CONST(17201.246132917724/8.0), + REAL_CONST(17216.517464080825/8.0), + REAL_CONST(17231.792182475165/8.0), + REAL_CONST(17247.070286599141/8.0), + REAL_CONST(17262.351774952826/8.0), + REAL_CONST(17277.636646037936/8.0), + REAL_CONST(17292.924898357855/8.0), + REAL_CONST(17308.216530417623/8.0), + REAL_CONST(17323.511540723921/8.0), + REAL_CONST(17338.809927785089/8.0), + REAL_CONST(17354.111690111105/8.0), + REAL_CONST(17369.416826213594/8.0), + REAL_CONST(17384.725334605821/8.0), + REAL_CONST(17400.037213802683/8.0), + REAL_CONST(17415.352462320716/8.0), + REAL_CONST(17430.67107867809/8.0), + REAL_CONST(17445.993061394587/8.0), + REAL_CONST(17461.318408991636/8.0), + REAL_CONST(17476.647119992274/8.0), + REAL_CONST(17491.979192921168/8.0), + REAL_CONST(17507.314626304586/8.0), + REAL_CONST(17522.653418670423/8.0), + REAL_CONST(17537.995568548187/8.0), + REAL_CONST(17553.341074468986/8.0), + REAL_CONST(17568.689934965536/8.0), + REAL_CONST(17584.042148572156/8.0), + REAL_CONST(17599.397713824768/8.0), + REAL_CONST(17614.75662926089/8.0), + REAL_CONST(17630.118893419625/8.0), + REAL_CONST(17645.484504841683/8.0), + REAL_CONST(17660.853462069354/8.0), + REAL_CONST(17676.225763646511/8.0), + REAL_CONST(17691.601408118619/8.0), + REAL_CONST(17706.980394032718/8.0), + REAL_CONST(17722.362719937424/8.0), + REAL_CONST(17737.748384382936/8.0), + REAL_CONST(17753.137385921014/8.0), + REAL_CONST(17768.529723104999/8.0), + REAL_CONST(17783.92539448979/8.0), + REAL_CONST(17799.324398631856/8.0), + REAL_CONST(17814.726734089225/8.0), + REAL_CONST(17830.13239942148/8.0), + REAL_CONST(17845.541393189767/8.0), + REAL_CONST(17860.95371395678/8.0), + REAL_CONST(17876.369360286772/8.0), + REAL_CONST(17891.788330745527/8.0), + REAL_CONST(17907.210623900395/8.0), + REAL_CONST(17922.636238320254/8.0), + REAL_CONST(17938.065172575527/8.0), + REAL_CONST(17953.497425238176/8.0), + REAL_CONST(17968.932994881692/8.0), + REAL_CONST(17984.371880081104/8.0), + REAL_CONST(17999.814079412972/8.0), + REAL_CONST(18015.259591455371/8.0), + REAL_CONST(18030.708414787914/8.0), + REAL_CONST(18046.160547991731/8.0), + REAL_CONST(18061.615989649465/8.0), + REAL_CONST(18077.074738345284/8.0), + REAL_CONST(18092.536792664861/8.0), + REAL_CONST(18108.002151195393/8.0), + REAL_CONST(18123.470812525571/8.0), + REAL_CONST(18138.942775245599/8.0), + REAL_CONST(18154.418037947191/8.0), + REAL_CONST(18169.896599223546/8.0), + REAL_CONST(18185.37845766938/8.0), + REAL_CONST(18200.863611880886/8.0), + REAL_CONST(18216.352060455767/8.0), + REAL_CONST(18231.843801993204/8.0), + REAL_CONST(18247.338835093873/8.0), + REAL_CONST(18262.837158359936/8.0), + REAL_CONST(18278.338770395032/8.0), + REAL_CONST(18293.84366980429/8.0), + REAL_CONST(18309.351855194309/8.0), + REAL_CONST(18324.863325173166/8.0), + REAL_CONST(18340.378078350412/8.0), + REAL_CONST(18355.896113337069/8.0), + REAL_CONST(18371.417428745623/8.0), + REAL_CONST(18386.942023190033/8.0), + REAL_CONST(18402.469895285718/8.0), + REAL_CONST(18418.00104364955/8.0), + REAL_CONST(18433.53546689987/8.0), + REAL_CONST(18449.073163656474/8.0), + REAL_CONST(18464.614132540602/8.0), + REAL_CONST(18480.158372174956/8.0), + REAL_CONST(18495.705881183676/8.0), + REAL_CONST(18511.256658192357/8.0), + REAL_CONST(18526.810701828035/8.0), + REAL_CONST(18542.368010719183/8.0), + REAL_CONST(18557.928583495715/8.0), + REAL_CONST(18573.492418788985/8.0), + REAL_CONST(18589.059515231773/8.0), + REAL_CONST(18604.629871458303/8.0), + REAL_CONST(18620.203486104212/8.0), + REAL_CONST(18635.78035780658/8.0), + REAL_CONST(18651.360485203899/8.0), + REAL_CONST(18666.943866936086/8.0), + REAL_CONST(18682.53050164448/8.0), + REAL_CONST(18698.120387971841/8.0), + REAL_CONST(18713.713524562332/8.0), + REAL_CONST(18729.30991006154/8.0), + REAL_CONST(18744.909543116457/8.0), + REAL_CONST(18760.512422375479/8.0), + REAL_CONST(18776.118546488418/8.0), + REAL_CONST(18791.727914106479/8.0), + REAL_CONST(18807.340523882274/8.0), + REAL_CONST(18822.95637446981/8.0), + REAL_CONST(18838.575464524489/8.0), + REAL_CONST(18854.197792703111/8.0), + REAL_CONST(18869.823357663863/8.0), + REAL_CONST(18885.452158066328/8.0), + REAL_CONST(18901.08419257147/8.0), + REAL_CONST(18916.719459841639/8.0), + REAL_CONST(18932.357958540564/8.0), + REAL_CONST(18947.999687333362/8.0), + REAL_CONST(18963.644644886521/8.0), + REAL_CONST(18979.292829867907/8.0), + REAL_CONST(18994.944240946759/8.0), + REAL_CONST(19010.598876793687/8.0), + REAL_CONST(19026.256736080668/8.0), + REAL_CONST(19041.917817481048/8.0), + REAL_CONST(19057.582119669532/8.0), + REAL_CONST(19073.2496413222/8.0), + REAL_CONST(19088.920381116473/8.0), + REAL_CONST(19104.594337731145/8.0), + REAL_CONST(19120.271509846356/8.0), + REAL_CONST(19135.951896143604/8.0), + REAL_CONST(19151.635495305738/8.0), + REAL_CONST(19167.322306016948/8.0), + REAL_CONST(19183.012326962784/8.0), + REAL_CONST(19198.705556830122/8.0), + REAL_CONST(19214.401994307198/8.0), + REAL_CONST(19230.101638083579/8.0), + REAL_CONST(19245.804486850167/8.0), + REAL_CONST(19261.510539299208/8.0), + REAL_CONST(19277.219794124274/8.0), + REAL_CONST(19292.932250020265/8.0), + REAL_CONST(19308.647905683421/8.0), + REAL_CONST(19324.366759811302/8.0), + REAL_CONST(19340.088811102793/8.0), + REAL_CONST(19355.8140582581/8.0), + REAL_CONST(19371.542499978754/8.0), + REAL_CONST(19387.2741349676/8.0), + REAL_CONST(19403.008961928797/8.0), + REAL_CONST(19418.746979567823/8.0), + REAL_CONST(19434.488186591469/8.0), + REAL_CONST(19450.232581707827/8.0), + REAL_CONST(19465.980163626304/8.0), + REAL_CONST(19481.730931057613/8.0), + REAL_CONST(19497.484882713761/8.0), + REAL_CONST(19513.242017308068/8.0), + REAL_CONST(19529.002333555141/8.0), + REAL_CONST(19544.765830170898/8.0), + REAL_CONST(19560.532505872539/8.0), + REAL_CONST(19576.302359378566/8.0), + REAL_CONST(19592.075389408761/8.0), + REAL_CONST(19607.851594684209/8.0), + REAL_CONST(19623.630973927269/8.0), + REAL_CONST(19639.41352586159/8.0), + REAL_CONST(19655.199249212103/8.0), + REAL_CONST(19670.988142705017/8.0), + REAL_CONST(19686.780205067826/8.0), + REAL_CONST(19702.575435029288/8.0), + REAL_CONST(19718.373831319448/8.0), + REAL_CONST(19734.175392669615/8.0), + REAL_CONST(19749.980117812371/8.0), + REAL_CONST(19765.788005481569/8.0), + REAL_CONST(19781.599054412323/8.0), + REAL_CONST(19797.413263341008/8.0), + REAL_CONST(19813.230631005274/8.0), + REAL_CONST(19829.051156144014/8.0), + REAL_CONST(19844.874837497395/8.0), + REAL_CONST(19860.701673806827/8.0), + REAL_CONST(19876.531663814985/8.0), + REAL_CONST(19892.364806265789/8.0), + REAL_CONST(19908.201099904403/8.0), + REAL_CONST(19924.040543477258/8.0), + REAL_CONST(19939.883135732012/8.0), + REAL_CONST(19955.728875417579/8.0), + REAL_CONST(19971.577761284105/8.0), + REAL_CONST(19987.429792082985/8.0), + REAL_CONST(20003.284966566847/8.0), + REAL_CONST(20019.14328348956/8.0), + REAL_CONST(20035.004741606219/8.0), + REAL_CONST(20050.869339673161/8.0), + REAL_CONST(20066.737076447946/8.0), + REAL_CONST(20082.607950689362/8.0), + REAL_CONST(20098.481961157428/8.0), + REAL_CONST(20114.359106613385/8.0), + REAL_CONST(20130.239385819699/8.0), + REAL_CONST(20146.122797540058/8.0), + REAL_CONST(20162.009340539353/8.0), + REAL_CONST(20177.899013583716/8.0), + REAL_CONST(20193.791815440476/8.0), + REAL_CONST(20209.687744878182/8.0), + REAL_CONST(20225.586800666591/8.0), + REAL_CONST(20241.488981576669/8.0), + REAL_CONST(20257.394286380597/8.0), + REAL_CONST(20273.302713851754/8.0), + REAL_CONST(20289.214262764715/8.0), + REAL_CONST(20305.128931895277/8.0), + REAL_CONST(20321.046720020415/8.0), + REAL_CONST(20336.967625918318/8.0), + REAL_CONST(20352.891648368361/8.0), + REAL_CONST(20368.818786151114/8.0), + REAL_CONST(20384.749038048347/8.0), + REAL_CONST(20400.682402843009/8.0), + REAL_CONST(20416.618879319249/8.0), + REAL_CONST(20432.558466262391/8.0), + REAL_CONST(20448.501162458953/8.0), + REAL_CONST(20464.446966696629/8.0), + REAL_CONST(20480.395877764302/8.0), + REAL_CONST(20496.347894452025/8.0), + REAL_CONST(20512.303015551031/8.0), + REAL_CONST(20528.261239853735/8.0), + REAL_CONST(20544.22256615372/8.0), + REAL_CONST(20560.186993245738/8.0), + REAL_CONST(20576.15451992572/8.0), + REAL_CONST(20592.125144990758/8.0), + REAL_CONST(20608.098867239107/8.0), + REAL_CONST(20624.075685470198/8.0), + REAL_CONST(20640.055598484618/8.0), + REAL_CONST(20656.038605084115/8.0), + REAL_CONST(20672.024704071595/8.0), + REAL_CONST(20688.013894251126/8.0), + REAL_CONST(20704.006174427926/8.0), + REAL_CONST(20720.001543408373/8.0), + REAL_CONST(20735.999999999989/8.0), + REAL_CONST(20752.001543011454/8.0), + REAL_CONST(20768.006171252597/8.0), + REAL_CONST(20784.013883534382/8.0), + REAL_CONST(20800.024678668931/8.0), + REAL_CONST(20816.038555469506/8.0), + REAL_CONST(20832.055512750507/8.0), + REAL_CONST(20848.075549327474/8.0), + REAL_CONST(20864.098664017085/8.0), + REAL_CONST(20880.124855637161/8.0), + REAL_CONST(20896.154123006647/8.0), + REAL_CONST(20912.186464945626/8.0), + REAL_CONST(20928.221880275312/8.0), + REAL_CONST(20944.260367818049/8.0), + REAL_CONST(20960.301926397311/8.0), + REAL_CONST(20976.346554837684/8.0), + REAL_CONST(20992.394251964895/8.0), + REAL_CONST(21008.445016605787/8.0), + REAL_CONST(21024.498847588318/8.0), + REAL_CONST(21040.555743741574/8.0), + REAL_CONST(21056.615703895754/8.0), + REAL_CONST(21072.678726882168/8.0), + REAL_CONST(21088.744811533252/8.0), + REAL_CONST(21104.813956682538/8.0), + REAL_CONST(21120.886161164683/8.0), + REAL_CONST(21136.961423815443/8.0), + REAL_CONST(21153.039743471683/8.0), + REAL_CONST(21169.121118971379/8.0), + REAL_CONST(21185.205549153605/8.0), + REAL_CONST(21201.293032858535/8.0), + REAL_CONST(21217.383568927453/8.0), + REAL_CONST(21233.477156202731/8.0), + REAL_CONST(21249.573793527841/8.0), + REAL_CONST(21265.673479747358/8.0), + REAL_CONST(21281.776213706937/8.0), + REAL_CONST(21297.881994253334/8.0), + REAL_CONST(21313.990820234398/8.0), + REAL_CONST(21330.102690499054/8.0), + REAL_CONST(21346.21760389733/8.0), + REAL_CONST(21362.335559280327/8.0), + REAL_CONST(21378.456555500241/8.0), + REAL_CONST(21394.580591410333/8.0), + REAL_CONST(21410.707665864964/8.0), + REAL_CONST(21426.83777771956/8.0), + REAL_CONST(21442.970925830628/8.0), + REAL_CONST(21459.107109055756/8.0), + REAL_CONST(21475.246326253604/8.0), + REAL_CONST(21491.388576283895/8.0), + REAL_CONST(21507.533858007431/8.0), + REAL_CONST(21523.682170286087/8.0), + REAL_CONST(21539.833511982797/8.0), + REAL_CONST(21555.987881961566/8.0), + REAL_CONST(21572.145279087465/8.0), + REAL_CONST(21588.305702226615/8.0), + REAL_CONST(21604.469150246216/8.0), + REAL_CONST(21620.635622014521/8.0), + REAL_CONST(21636.805116400832/8.0), + REAL_CONST(21652.977632275521/8.0), + REAL_CONST(21669.153168510009/8.0), + REAL_CONST(21685.331723976764/8.0), + REAL_CONST(21701.513297549318/8.0), + REAL_CONST(21717.697888102244/8.0), + REAL_CONST(21733.885494511167/8.0), + REAL_CONST(21750.076115652759/8.0), + REAL_CONST(21766.269750404736/8.0), + REAL_CONST(21782.466397645861/8.0), + REAL_CONST(21798.666056255934/8.0), + REAL_CONST(21814.868725115801/8.0), + REAL_CONST(21831.074403107345/8.0), + REAL_CONST(21847.283089113484/8.0), + REAL_CONST(21863.494782018177/8.0), + REAL_CONST(21879.709480706417/8.0), + REAL_CONST(21895.927184064229/8.0), + REAL_CONST(21912.147890978667/8.0), + REAL_CONST(21928.371600337818/8.0), + REAL_CONST(21944.598311030797/8.0), + REAL_CONST(21960.828021947746/8.0), + REAL_CONST(21977.060731979829/8.0), + REAL_CONST(21993.296440019243/8.0), + REAL_CONST(22009.535144959198/8.0), + REAL_CONST(22025.77684569393/8.0), + REAL_CONST(22042.021541118691/8.0), + REAL_CONST(22058.269230129757/8.0), + REAL_CONST(22074.519911624411/8.0), + REAL_CONST(22090.773584500959/8.0), + REAL_CONST(22107.030247658717/8.0), + REAL_CONST(22123.289899998013/8.0), + REAL_CONST(22139.552540420187/8.0), + REAL_CONST(22155.818167827587/8.0), + REAL_CONST(22172.086781123569/8.0), + REAL_CONST(22188.358379212495/8.0), + REAL_CONST(22204.632960999726/8.0), + REAL_CONST(22220.910525391639/8.0), + REAL_CONST(22237.191071295601/8.0), + REAL_CONST(22253.474597619981/8.0), + REAL_CONST(22269.761103274148/8.0), + REAL_CONST(22286.050587168469/8.0), + REAL_CONST(22302.343048214312/8.0), + REAL_CONST(22318.638485324027/8.0), + REAL_CONST(22334.936897410968/8.0), + REAL_CONST(22351.23828338947/8.0), + REAL_CONST(22367.542642174871/8.0), + REAL_CONST(22383.849972683485/8.0), + REAL_CONST(22400.160273832618/8.0), + REAL_CONST(22416.473544540564/8.0), + REAL_CONST(22432.789783726603/8.0), + REAL_CONST(22449.108990310986/8.0), + REAL_CONST(22465.431163214958/8.0), + REAL_CONST(22481.75630136074/8.0), + REAL_CONST(22498.084403671528/8.0), + REAL_CONST(22514.415469071497/8.0), + REAL_CONST(22530.749496485802/8.0), + REAL_CONST(22547.086484840562/8.0), + REAL_CONST(22563.426433062879/8.0), + REAL_CONST(22579.769340080824/8.0), + REAL_CONST(22596.115204823436/8.0), + REAL_CONST(22612.464026220721/8.0), + REAL_CONST(22628.815803203655/8.0), + REAL_CONST(22645.170534704179/8.0), + REAL_CONST(22661.5282196552/8.0), + REAL_CONST(22677.888856990587/8.0), + REAL_CONST(22694.252445645168/8.0), + REAL_CONST(22710.618984554734/8.0), + REAL_CONST(22726.988472656034/8.0), + REAL_CONST(22743.360908886778/8.0), + REAL_CONST(22759.736292185622/8.0), + REAL_CONST(22776.114621492186/8.0), + REAL_CONST(22792.495895747044/8.0), + REAL_CONST(22808.880113891719/8.0), + REAL_CONST(22825.267274868678/8.0), + REAL_CONST(22841.657377621348/8.0), + REAL_CONST(22858.050421094096/8.0), + REAL_CONST(22874.446404232243/8.0), + REAL_CONST(22890.845325982053/8.0), + REAL_CONST(22907.247185290722/8.0), + REAL_CONST(22923.651981106406/8.0), + REAL_CONST(22940.059712378195/8.0), + REAL_CONST(22956.470378056114/8.0), + REAL_CONST(22972.883977091129/8.0), + REAL_CONST(22989.300508435153/8.0), + REAL_CONST(23005.719971041017/8.0), + REAL_CONST(23022.142363862498/8.0), + REAL_CONST(23038.567685854305/8.0), + REAL_CONST(23054.995935972078/8.0), + REAL_CONST(23071.427113172387/8.0), + REAL_CONST(23087.86121641273/8.0), + REAL_CONST(23104.298244651531/8.0), + REAL_CONST(23120.738196848146/8.0), + REAL_CONST(23137.181071962848/8.0), + REAL_CONST(23153.626868956846/8.0), + REAL_CONST(23170.075586792263/8.0), + REAL_CONST(23186.527224432142/8.0), + REAL_CONST(23202.981780840448/8.0), + REAL_CONST(23219.439254982066/8.0), + REAL_CONST(23235.899645822796/8.0), + REAL_CONST(23252.362952329357/8.0), + REAL_CONST(23268.829173469378/8.0), + REAL_CONST(23285.298308211408/8.0), + REAL_CONST(23301.770355524899/8.0), + REAL_CONST(23318.245314380223/8.0), + REAL_CONST(23334.723183748658/8.0), + REAL_CONST(23351.203962602387/8.0), + REAL_CONST(23367.687649914504/8.0), + REAL_CONST(23384.174244659007/8.0), + REAL_CONST(23400.663745810798/8.0), + REAL_CONST(23417.15615234568/8.0), + REAL_CONST(23433.651463240367/8.0), + REAL_CONST(23450.149677472462/8.0), + REAL_CONST(23466.650794020472/8.0), + REAL_CONST(23483.154811863806/8.0), + REAL_CONST(23499.661729982763/8.0), + REAL_CONST(23516.171547358543/8.0), + REAL_CONST(23532.684262973235/8.0), + REAL_CONST(23549.199875809823/8.0), + REAL_CONST(23565.718384852185/8.0), + REAL_CONST(23582.239789085092/8.0), + REAL_CONST(23598.764087494197/8.0), + REAL_CONST(23615.291279066041/8.0), + REAL_CONST(23631.821362788058/8.0), + REAL_CONST(23648.354337648565/8.0), + REAL_CONST(23664.890202636761/8.0), + REAL_CONST(23681.428956742733/8.0), + REAL_CONST(23697.970598957443/8.0), + REAL_CONST(23714.515128272738/8.0), + REAL_CONST(23731.062543681343/8.0), + REAL_CONST(23747.612844176863/8.0), + REAL_CONST(23764.166028753778/8.0), + REAL_CONST(23780.72209640744/8.0), + REAL_CONST(23797.281046134085/8.0), + REAL_CONST(23813.842876930816/8.0), + REAL_CONST(23830.407587795606/8.0), + REAL_CONST(23846.975177727301/8.0), + REAL_CONST(23863.545645725622/8.0), + REAL_CONST(23880.11899079115/8.0), + REAL_CONST(23896.695211925336/8.0), + REAL_CONST(23913.274308130498/8.0), + REAL_CONST(23929.856278409821/8.0), + REAL_CONST(23946.441121767348/8.0), + REAL_CONST(23963.028837207989/8.0), + REAL_CONST(23979.619423737513/8.0), + REAL_CONST(23996.212880362549/8.0), + REAL_CONST(24012.809206090584/8.0), + REAL_CONST(24029.408399929966/8.0), + REAL_CONST(24046.010460889898/8.0), + REAL_CONST(24062.615387980433/8.0), + REAL_CONST(24079.223180212492/8.0), + REAL_CONST(24095.833836597827/8.0), + REAL_CONST(24112.447356149063/8.0), + REAL_CONST(24129.063737879667/8.0), + REAL_CONST(24145.682980803951/8.0), + REAL_CONST(24162.305083937081/8.0), + REAL_CONST(24178.930046295067/8.0), + REAL_CONST(24195.557866894767/8.0), + REAL_CONST(24212.188544753884/8.0), + REAL_CONST(24228.822078890964/8.0), + REAL_CONST(24245.458468325389/8.0), + REAL_CONST(24262.097712077397/8.0), + REAL_CONST(24278.739809168052/8.0), + REAL_CONST(24295.384758619261/8.0), + REAL_CONST(24312.032559453768/8.0), + REAL_CONST(24328.683210695162/8.0), + REAL_CONST(24345.336711367858/8.0), + REAL_CONST(24361.993060497109/8.0), + REAL_CONST(24378.652257108995/8.0), + REAL_CONST(24395.314300230442/8.0), + REAL_CONST(24411.979188889192/8.0), + REAL_CONST(24428.646922113825/8.0), + REAL_CONST(24445.317498933746/8.0), + REAL_CONST(24461.990918379193/8.0), + REAL_CONST(24478.667179481225/8.0), + REAL_CONST(24495.346281271726/8.0), + REAL_CONST(24512.028222783407/8.0), + REAL_CONST(24528.713003049801/8.0), + REAL_CONST(24545.400621105266/8.0), + REAL_CONST(24562.091075984976/8.0), + REAL_CONST(24578.784366724925/8.0), + REAL_CONST(24595.480492361927/8.0), + REAL_CONST(24612.179451933614/8.0), + REAL_CONST(24628.881244478438/8.0), + REAL_CONST(24645.585869035654/8.0), + REAL_CONST(24662.293324645343/8.0), + REAL_CONST(24679.003610348394/8.0), + REAL_CONST(24695.716725186514/8.0), + REAL_CONST(24712.432668202211/8.0), + REAL_CONST(24729.151438438807/8.0), + REAL_CONST(24745.873034940436/8.0), + REAL_CONST(24762.597456752032/8.0), + REAL_CONST(24779.324702919344/8.0), + REAL_CONST(24796.054772488926/8.0), + REAL_CONST(24812.787664508123/8.0), + REAL_CONST(24829.5233780251/8.0), + REAL_CONST(24846.261912088819/8.0), + REAL_CONST(24863.003265749034/8.0), + REAL_CONST(24879.747438056307/8.0), + REAL_CONST(24896.494428062004/8.0), + REAL_CONST(24913.244234818278/8.0), + REAL_CONST(24929.996857378079/8.0), + REAL_CONST(24946.752294795166/8.0), + REAL_CONST(24963.510546124078/8.0), + REAL_CONST(24980.271610420157/8.0), + REAL_CONST(24997.035486739525/8.0), + REAL_CONST(25013.802174139113/8.0), + REAL_CONST(25030.571671676629/8.0), + REAL_CONST(25047.343978410572/8.0), + REAL_CONST(25064.119093400237/8.0), + REAL_CONST(25080.897015705697/8.0), + REAL_CONST(25097.677744387816/8.0), + REAL_CONST(25114.461278508239/8.0), + REAL_CONST(25131.2476171294/8.0), + REAL_CONST(25148.036759314517/8.0), + REAL_CONST(25164.828704127583/8.0), + REAL_CONST(25181.623450633375/8.0), + REAL_CONST(25198.42099789745/8.0), + REAL_CONST(25215.221344986145/8.0), + REAL_CONST(25232.024490966574/8.0), + REAL_CONST(25248.830434906627/8.0), + REAL_CONST(25265.639175874974/8.0), + REAL_CONST(25282.450712941049/8.0), + REAL_CONST(25299.265045175071/8.0), + REAL_CONST(25316.082171648024/8.0), + REAL_CONST(25332.902091431668/8.0), + REAL_CONST(25349.724803598532/8.0), + REAL_CONST(25366.550307221914/8.0), + REAL_CONST(25383.378601375884/8.0), + REAL_CONST(25400.209685135269/8.0), + REAL_CONST(25417.043557575678/8.0), + REAL_CONST(25433.880217773472/8.0), + REAL_CONST(25450.719664805783/8.0), + REAL_CONST(25467.561897750507/8.0), + REAL_CONST(25484.406915686297/8.0), + REAL_CONST(25501.254717692573/8.0), + REAL_CONST(25518.105302849512/8.0), + REAL_CONST(25534.958670238051/8.0), + REAL_CONST(25551.814818939893/8.0), + REAL_CONST(25568.67374803748/8.0), + REAL_CONST(25585.535456614027/8.0), + REAL_CONST(25602.399943753502/8.0), + REAL_CONST(25619.267208540619/8.0), + REAL_CONST(25636.137250060852/8.0), + REAL_CONST(25653.010067400432/8.0), + REAL_CONST(25669.885659646327/8.0), + REAL_CONST(25686.76402588627/8.0), + REAL_CONST(25703.645165208734/8.0), + REAL_CONST(25720.529076702944/8.0), + REAL_CONST(25737.415759458876/8.0), + REAL_CONST(25754.305212567244/8.0), + REAL_CONST(25771.197435119517/8.0), + REAL_CONST(25788.092426207899/8.0), + REAL_CONST(25804.990184925344/8.0), + REAL_CONST(25821.890710365547/8.0), + REAL_CONST(25838.794001622944/8.0), + REAL_CONST(25855.700057792714/8.0), + REAL_CONST(25872.608877970775/8.0), + REAL_CONST(25889.520461253778/8.0), + REAL_CONST(25906.434806739118/8.0), + REAL_CONST(25923.351913524923/8.0), + REAL_CONST(25940.271780710063/8.0), + REAL_CONST(25957.194407394138/8.0), + REAL_CONST(25974.11979267748/8.0), + REAL_CONST(25991.047935661154/8.0), + REAL_CONST(26007.978835446964/8.0), + REAL_CONST(26024.912491137442/8.0), + REAL_CONST(26041.848901835841/8.0), + REAL_CONST(26058.788066646157/8.0), + REAL_CONST(26075.729984673108/8.0), + REAL_CONST(26092.674655022136/8.0), + REAL_CONST(26109.622076799409/8.0), + REAL_CONST(26126.572249111829/8.0), + REAL_CONST(26143.525171067016/8.0), + REAL_CONST(26160.480841773315/8.0), + REAL_CONST(26177.43926033979/8.0), + REAL_CONST(26194.400425876229/8.0), + REAL_CONST(26211.364337493149/8.0), + REAL_CONST(26228.330994301767/8.0), + REAL_CONST(26245.30039541404/8.0), + REAL_CONST(26262.272539942627/8.0), + REAL_CONST(26279.247427000919/8.0), + REAL_CONST(26296.225055703002/8.0), + REAL_CONST(26313.205425163702/8.0), + REAL_CONST(26330.188534498539/8.0), + REAL_CONST(26347.174382823756/8.0), + REAL_CONST(26364.162969256304/8.0), + REAL_CONST(26381.154292913852/8.0), + REAL_CONST(26398.148352914774/8.0), + REAL_CONST(26415.145148378149/8.0), + REAL_CONST(26432.144678423778/8.0), + REAL_CONST(26449.146942172156/8.0), + REAL_CONST(26466.151938744493/8.0), + REAL_CONST(26483.159667262702/8.0), + REAL_CONST(26500.170126849403/8.0), + REAL_CONST(26517.183316627921/8.0), + REAL_CONST(26534.199235722277/8.0), + REAL_CONST(26551.217883257199/8.0), + REAL_CONST(26568.239258358124/8.0), + REAL_CONST(26585.263360151173/8.0), + REAL_CONST(26602.290187763181/8.0), + REAL_CONST(26619.319740321676/8.0), + REAL_CONST(26636.352016954883/8.0), + REAL_CONST(26653.387016791727/8.0), + REAL_CONST(26670.424738961825/8.0), + REAL_CONST(26687.465182595493/8.0), + REAL_CONST(26704.508346823739/8.0), + REAL_CONST(26721.554230778267/8.0), + REAL_CONST(26738.602833591467/8.0), + REAL_CONST(26755.65415439643/8.0), + REAL_CONST(26772.708192326929/8.0), + REAL_CONST(26789.764946517433/8.0), + REAL_CONST(26806.824416103096/8.0), + REAL_CONST(26823.886600219761/8.0), + REAL_CONST(26840.95149800396/8.0), + REAL_CONST(26858.019108592915/8.0), + REAL_CONST(26875.089431124517/8.0), + REAL_CONST(26892.162464737365/8.0), + REAL_CONST(26909.238208570721/8.0), + REAL_CONST(26926.316661764544/8.0), + REAL_CONST(26943.397823459472/8.0), + REAL_CONST(26960.481692796813/8.0), + REAL_CONST(26977.568268918571/8.0), + REAL_CONST(26994.657550967422/8.0), + REAL_CONST(27011.749538086722/8.0), + REAL_CONST(27028.844229420498/8.0), + REAL_CONST(27045.941624113464/8.0), + REAL_CONST(27063.041721311005/8.0), + REAL_CONST(27080.144520159181/8.0), + REAL_CONST(27097.250019804727/8.0), + REAL_CONST(27114.35821939505/8.0), + REAL_CONST(27131.469118078236/8.0), + REAL_CONST(27148.582715003027/8.0), + REAL_CONST(27165.699009318858/8.0), + REAL_CONST(27182.818000175819/8.0), + REAL_CONST(27199.939686724665/8.0), + REAL_CONST(27217.064068116837/8.0), + REAL_CONST(27234.191143504428/8.0), + REAL_CONST(27251.320912040203/8.0), + REAL_CONST(27268.453372877593/8.0), + REAL_CONST(27285.588525170693/8.0), + REAL_CONST(27302.726368074269/8.0), + REAL_CONST(27319.866900743735/8.0), + REAL_CONST(27337.010122335181/8.0), + REAL_CONST(27354.156032005358/8.0), + REAL_CONST(27371.304628911668/8.0), + REAL_CONST(27388.455912212183/8.0), + REAL_CONST(27405.609881065626/8.0), + REAL_CONST(27422.766534631384/8.0), + REAL_CONST(27439.925872069507/8.0), + REAL_CONST(27457.087892540683/8.0), + REAL_CONST(27474.252595206275/8.0), + REAL_CONST(27491.419979228293/8.0), + REAL_CONST(27508.5900437694/8.0), + REAL_CONST(27525.762787992917/8.0), + REAL_CONST(27542.93821106281/8.0), + REAL_CONST(27560.116312143706/8.0), + REAL_CONST(27577.297090400876/8.0), + REAL_CONST(27594.480545000242/8.0), + REAL_CONST(27611.666675108383/8.0), + REAL_CONST(27628.855479892518/8.0), + REAL_CONST(27646.046958520514/8.0), + REAL_CONST(27663.241110160889/8.0), + REAL_CONST(27680.437933982801/8.0), + REAL_CONST(27697.637429156068/8.0), + REAL_CONST(27714.839594851132/8.0), + REAL_CONST(27732.04443023909/8.0), + REAL_CONST(27749.251934491687/8.0), + REAL_CONST(27766.462106781299/8.0), + REAL_CONST(27783.674946280949/8.0), + REAL_CONST(27800.890452164302/8.0), + REAL_CONST(27818.108623605654/8.0), + REAL_CONST(27835.329459779954/8.0), + REAL_CONST(27852.55295986278/8.0), + REAL_CONST(27869.779123030345/8.0), + REAL_CONST(27887.007948459504/8.0), + REAL_CONST(27904.239435327745/8.0), + REAL_CONST(27921.473582813196/8.0), + REAL_CONST(27938.710390094613/8.0), + REAL_CONST(27955.949856351392/8.0), + REAL_CONST(27973.19198076355/8.0), + REAL_CONST(27990.436762511745/8.0), + REAL_CONST(28007.684200777272/8.0), + REAL_CONST(28024.934294742041/8.0), + REAL_CONST(28042.187043588601/8.0), + REAL_CONST(28059.442446500128/8.0), + REAL_CONST(28076.700502660427/8.0), + REAL_CONST(28093.961211253929/8.0), + REAL_CONST(28111.224571465693/8.0), + REAL_CONST(28128.490582481401/8.0), + REAL_CONST(28145.759243487362/8.0), + REAL_CONST(28163.030553670509/8.0), + REAL_CONST(28180.304512218394/8.0), + REAL_CONST(28197.581118319198/8.0), + REAL_CONST(28214.860371161725/8.0), + REAL_CONST(28232.14226993539/8.0), + REAL_CONST(28249.42681383024/8.0), + REAL_CONST(28266.71400203693/8.0), + REAL_CONST(28284.003833746745/8.0), + REAL_CONST(28301.296308151585/8.0), + REAL_CONST(28318.591424443959/8.0), + REAL_CONST(28335.889181817001/8.0), + REAL_CONST(28353.189579464462/8.0), + REAL_CONST(28370.492616580705/8.0), + REAL_CONST(28387.798292360701/8.0), + REAL_CONST(28405.106606000048/8.0), + REAL_CONST(28422.417556694945/8.0), + REAL_CONST(28439.731143642206/8.0), + REAL_CONST(28457.047366039264/8.0), + REAL_CONST(28474.366223084147/8.0), + REAL_CONST(28491.687713975512/8.0), + REAL_CONST(28509.011837912611/8.0), + REAL_CONST(28526.338594095305/8.0), + REAL_CONST(28543.667981724069/8.0), + REAL_CONST(28560.999999999982/8.0), + REAL_CONST(28578.334648124732/8.0), + REAL_CONST(28595.671925300605/8.0), + REAL_CONST(28613.011830730498/8.0), + REAL_CONST(28630.354363617909/8.0), + REAL_CONST(28647.699523166943/8.0), + REAL_CONST(28665.0473085823/8.0), + REAL_CONST(28682.397719069289/8.0), + REAL_CONST(28699.750753833818/8.0), + REAL_CONST(28717.10641208239/8.0), + REAL_CONST(28734.464693022121/8.0), + REAL_CONST(28751.825595860708/8.0), + REAL_CONST(28769.189119806462/8.0), + REAL_CONST(28786.55526406828/8.0), + REAL_CONST(28803.924027855664/8.0), + REAL_CONST(28821.295410378701/8.0), + REAL_CONST(28838.669410848088/8.0), + REAL_CONST(28856.046028475103/8.0), + REAL_CONST(28873.425262471628/8.0), + REAL_CONST(28890.80711205013/8.0), + REAL_CONST(28908.191576423673/8.0), + REAL_CONST(28925.578654805915/8.0), + REAL_CONST(28942.968346411097/8.0), + REAL_CONST(28960.360650454055/8.0), + REAL_CONST(28977.755566150216/8.0), + REAL_CONST(28995.153092715591/8.0), + REAL_CONST(29012.553229366786/8.0), + REAL_CONST(29029.955975320987/8.0), + REAL_CONST(29047.361329795975/8.0), + REAL_CONST(29064.769292010107/8.0), + REAL_CONST(29082.179861182336/8.0), + REAL_CONST(29099.593036532187/8.0), + REAL_CONST(29117.00881727978/8.0), + REAL_CONST(29134.427202645813/8.0), + REAL_CONST(29151.848191851568/8.0), + REAL_CONST(29169.271784118911/8.0), + REAL_CONST(29186.697978670283/8.0), + REAL_CONST(29204.126774728706/8.0), + REAL_CONST(29221.55817151779/8.0), + REAL_CONST(29238.992168261717/8.0), + REAL_CONST(29256.42876418525/8.0), + REAL_CONST(29273.867958513725/8.0), + REAL_CONST(29291.309750473058/8.0), + REAL_CONST(29308.754139289747/8.0), + REAL_CONST(29326.201124190855/8.0), + REAL_CONST(29343.65070440403/8.0), + REAL_CONST(29361.102879157483/8.0), + REAL_CONST(29378.557647680012/8.0), + REAL_CONST(29396.015009200975/8.0), + REAL_CONST(29413.474962950309/8.0), + REAL_CONST(29430.937508158524/8.0), + REAL_CONST(29448.402644056692/8.0), + REAL_CONST(29465.870369876469/8.0), + REAL_CONST(29483.340684850071/8.0), + REAL_CONST(29500.81358821028/8.0), + REAL_CONST(29518.289079190454/8.0), + REAL_CONST(29535.767157024511/8.0), + REAL_CONST(29553.247820946945/8.0), + REAL_CONST(29570.731070192807/8.0), + REAL_CONST(29588.216903997723/8.0), + REAL_CONST(29605.70532159787/8.0), + REAL_CONST(29623.19632223/8.0), + REAL_CONST(29640.689905131429/8.0), + REAL_CONST(29658.186069540028/8.0), + REAL_CONST(29675.684814694236/8.0), + REAL_CONST(29693.186139833047/8.0), + REAL_CONST(29710.690044196028/8.0), + REAL_CONST(29728.196527023298/8.0), + REAL_CONST(29745.705587555527/8.0), + REAL_CONST(29763.217225033964/8.0), + REAL_CONST(29780.731438700397/8.0), + REAL_CONST(29798.248227797183/8.0), + REAL_CONST(29815.76759156723/8.0), + REAL_CONST(29833.289529254005/8.0), + REAL_CONST(29850.81404010153/8.0), + REAL_CONST(29868.341123354381/8.0), + REAL_CONST(29885.870778257693/8.0), + REAL_CONST(29903.403004057145/8.0), + REAL_CONST(29920.937799998974/8.0), + REAL_CONST(29938.475165329975/8.0), + REAL_CONST(29956.015099297485/8.0), + REAL_CONST(29973.557601149394/8.0), + REAL_CONST(29991.102670134147/8.0), + REAL_CONST(30008.650305500738/8.0), + REAL_CONST(30026.200506498706/8.0), + REAL_CONST(30043.753272378144/8.0), + REAL_CONST(30061.308602389683/8.0), + REAL_CONST(30078.866495784507/8.0), + REAL_CONST(30096.426951814352/8.0), + REAL_CONST(30113.989969731494/8.0), + REAL_CONST(30131.55554878875/8.0), + REAL_CONST(30149.123688239491/8.0), + REAL_CONST(30166.694387337629/8.0), + REAL_CONST(30184.267645337608/8.0), + REAL_CONST(30201.843461494434/8.0), + REAL_CONST(30219.42183506364/8.0), + REAL_CONST(30237.002765301309/8.0), + REAL_CONST(30254.586251464058/8.0), + REAL_CONST(30272.172292809046/8.0), + REAL_CONST(30289.760888593977/8.0), + REAL_CONST(30307.35203807709/8.0), + REAL_CONST(30324.94574051716/8.0), + REAL_CONST(30342.541995173502/8.0), + REAL_CONST(30360.140801305966/8.0), + REAL_CONST(30377.742158174944/8.0), + REAL_CONST(30395.346065041358/8.0), + REAL_CONST(30412.952521166666/8.0), + REAL_CONST(30430.561525812864/8.0), + REAL_CONST(30448.173078242475/8.0), + REAL_CONST(30465.787177718561/8.0), + REAL_CONST(30483.403823504719/8.0), + REAL_CONST(30501.02301486507/8.0), + REAL_CONST(30518.644751064272/8.0), + REAL_CONST(30536.269031367516/8.0), + REAL_CONST(30553.895855040515/8.0), + REAL_CONST(30571.525221349519/8.0), + REAL_CONST(30589.157129561307/8.0), + REAL_CONST(30606.791578943175/8.0), + REAL_CONST(30624.428568762964/8.0), + REAL_CONST(30642.06809828903/8.0), + REAL_CONST(30659.710166790261/8.0), + REAL_CONST(30677.35477353607/8.0), + REAL_CONST(30695.001917796391/8.0), + REAL_CONST(30712.651598841687/8.0), + REAL_CONST(30730.303815942945/8.0), + REAL_CONST(30747.958568371676/8.0), + REAL_CONST(30765.615855399912/8.0), + REAL_CONST(30783.275676300211/8.0), + REAL_CONST(30800.938030345646/8.0), + REAL_CONST(30818.602916809814/8.0), + REAL_CONST(30836.270334966837/8.0), + REAL_CONST(30853.940284091354/8.0), + REAL_CONST(30871.612763458521/8.0), + REAL_CONST(30889.287772344011/8.0), + REAL_CONST(30906.965310024025/8.0), + REAL_CONST(30924.645375775272/8.0), + REAL_CONST(30942.327968874983/8.0), + REAL_CONST(30960.013088600903/8.0), + REAL_CONST(30977.700734231294/8.0), + REAL_CONST(30995.390905044929/8.0), + REAL_CONST(31013.083600321101/8.0), + REAL_CONST(31030.778819339619/8.0), + REAL_CONST(31048.476561380798/8.0), + REAL_CONST(31066.17682572547/8.0), + REAL_CONST(31083.879611654978/8.0), + REAL_CONST(31101.584918451179/8.0), + REAL_CONST(31119.29274539644/8.0), + REAL_CONST(31137.003091773637/8.0), + REAL_CONST(31154.715956866155/8.0), + REAL_CONST(31172.431339957893/8.0), + REAL_CONST(31190.14924033326/8.0), + REAL_CONST(31207.869657277162/8.0), + REAL_CONST(31225.592590075023/8.0), + REAL_CONST(31243.318038012771/8.0), + REAL_CONST(31261.046000376838/8.0), + REAL_CONST(31278.776476454172/8.0), + REAL_CONST(31296.50946553221/8.0), + REAL_CONST(31314.24496689891/8.0), + REAL_CONST(31331.98297984272/8.0), + REAL_CONST(31349.7235036526/8.0), + REAL_CONST(31367.466537618013/8.0), + REAL_CONST(31385.212081028923/8.0), + REAL_CONST(31402.960133175795/8.0), + REAL_CONST(31420.710693349596/8.0), + REAL_CONST(31438.463760841791/8.0), + REAL_CONST(31456.219334944351/8.0), + REAL_CONST(31473.977414949743/8.0), + REAL_CONST(31491.738000150934/8.0), + REAL_CONST(31509.501089841389/8.0), + REAL_CONST(31527.266683315069/8.0), + REAL_CONST(31545.034779866437/8.0), + REAL_CONST(31562.80537879045/8.0), + REAL_CONST(31580.578479382562/8.0), + REAL_CONST(31598.35408093872/8.0), + REAL_CONST(31616.132182755369/8.0), + REAL_CONST(31633.91278412945/8.0), + REAL_CONST(31651.695884358396/8.0), + REAL_CONST(31669.481482740131/8.0), + REAL_CONST(31687.269578573076/8.0), + REAL_CONST(31705.060171156143/8.0), + REAL_CONST(31722.853259788735/8.0), + REAL_CONST(31740.648843770748/8.0), + REAL_CONST(31758.446922402567/8.0), + REAL_CONST(31776.247494985066/8.0), + REAL_CONST(31794.050560819614/8.0), + REAL_CONST(31811.85611920806/8.0), + REAL_CONST(31829.664169452753/8.0), + REAL_CONST(31847.474710856521/8.0), + REAL_CONST(31865.287742722685/8.0), + REAL_CONST(31883.103264355046/8.0), + REAL_CONST(31900.921275057899/8.0), + REAL_CONST(31918.741774136019/8.0), + REAL_CONST(31936.564760894671/8.0), + REAL_CONST(31954.390234639599/8.0), + REAL_CONST(31972.21819467704/8.0), + REAL_CONST(31990.048640313704/8.0), + REAL_CONST(32007.881570856793/8.0), + REAL_CONST(32025.716985613984/8.0), + REAL_CONST(32043.554883893445/8.0), + REAL_CONST(32061.395265003815/8.0), + REAL_CONST(32079.238128254223/8.0), + REAL_CONST(32097.083472954269/8.0), + REAL_CONST(32114.931298414049/8.0), + REAL_CONST(32132.781603944117/8.0), + REAL_CONST(32150.634388855524/8.0), + REAL_CONST(32168.48965245979/8.0), + REAL_CONST(32186.347394068915/8.0), + REAL_CONST(32204.207612995371/8.0), + REAL_CONST(32222.07030855212/8.0), + REAL_CONST(32239.935480052583/8.0), + REAL_CONST(32257.803126810672/8.0), + REAL_CONST(32275.673248140767/8.0), + REAL_CONST(32293.545843357719/8.0), + REAL_CONST(32311.420911776862/8.0), + REAL_CONST(32329.298452713996/8.0), + REAL_CONST(32347.178465485395/8.0), + REAL_CONST(32365.060949407813/8.0), + REAL_CONST(32382.945903798463/8.0), + REAL_CONST(32400.83332797504/8.0), + REAL_CONST(32418.723221255706/8.0), + REAL_CONST(32436.615582959093/8.0), + REAL_CONST(32454.510412404306/8.0), + REAL_CONST(32472.407708910916/8.0), + REAL_CONST(32490.307471798966/8.0), + REAL_CONST(32508.209700388961/8.0), + REAL_CONST(32526.114394001877/8.0), + REAL_CONST(32544.021551959166/8.0), + REAL_CONST(32561.931173582732/8.0), + REAL_CONST(32579.843258194956/8.0), + REAL_CONST(32597.757805118679/8.0), + REAL_CONST(32615.674813677211/8.0), + REAL_CONST(32633.594283194328/8.0), + REAL_CONST(32651.516212994258/8.0), + REAL_CONST(32669.440602401712/8.0), + REAL_CONST(32687.367450741847/8.0), + REAL_CONST(32705.296757340297/8.0), + REAL_CONST(32723.228521523146/8.0), + REAL_CONST(32741.162742616943/8.0), + REAL_CONST(32759.099419948703/8.0), + REAL_CONST(32777.038552845901/8.0), + REAL_CONST(32794.980140636464/8.0), + REAL_CONST(32812.924182648792/8.0), + REAL_CONST(32830.87067821173/8.0), + REAL_CONST(32848.819626654593/8.0), + REAL_CONST(32866.77102730715/8.0), + REAL_CONST(32884.724879499619/8.0), + REAL_CONST(32902.681182562686/8.0), + REAL_CONST(32920.639935827494/8.0), + REAL_CONST(32938.601138625643/8.0), + REAL_CONST(32956.56479028918/8.0), + REAL_CONST(32974.530890150607/8.0), + REAL_CONST(32992.499437542894/8.0), + REAL_CONST(33010.470431799447/8.0), + REAL_CONST(33028.443872254145/8.0), + REAL_CONST(33046.419758241311/8.0), + REAL_CONST(33064.39808909571/8.0), + REAL_CONST(33082.378864152583/8.0), + REAL_CONST(33100.36208274759/8.0), + REAL_CONST(33118.347744216881/8.0), + REAL_CONST(33136.335847897026/8.0), + REAL_CONST(33154.326393125062/8.0), + REAL_CONST(33172.31937923847/8.0), + REAL_CONST(33190.314805575174/8.0), + REAL_CONST(33208.312671473555/8.0), + REAL_CONST(33226.312976272442/8.0), + REAL_CONST(33244.315719311111/8.0), + REAL_CONST(33262.320899929284/8.0), + REAL_CONST(33280.328517467125/8.0), + REAL_CONST(33298.33857126526/8.0), + REAL_CONST(33316.351060664747/8.0), + REAL_CONST(33334.365985007091/8.0), + REAL_CONST(33352.383343634239/8.0), + REAL_CONST(33370.403135888591/8.0), + REAL_CONST(33388.42536111299/8.0), + REAL_CONST(33406.450018650721/8.0), + REAL_CONST(33424.477107845501/8.0), + REAL_CONST(33442.506628041512/8.0), + REAL_CONST(33460.53857858335/8.0), + REAL_CONST(33478.572958816083/8.0), + REAL_CONST(33496.609768085189/8.0), + REAL_CONST(33514.649005736617/8.0), + REAL_CONST(33532.690671116739/8.0), + REAL_CONST(33550.734763572356/8.0), + REAL_CONST(33568.781282450735/8.0), + REAL_CONST(33586.830227099563/8.0), + REAL_CONST(33604.881596866973/8.0), + REAL_CONST(33622.935391101528/8.0), + REAL_CONST(33640.991609152239/8.0), + REAL_CONST(33659.050250368542/8.0), + REAL_CONST(33677.111314100322/8.0), + REAL_CONST(33695.174799697881/8.0), + REAL_CONST(33713.240706511984/8.0), + REAL_CONST(33731.309033893805/8.0), + REAL_CONST(33749.37978119497/8.0), + REAL_CONST(33767.452947767531/8.0), + REAL_CONST(33785.528532963974/8.0), + REAL_CONST(33803.606536137209/8.0), + REAL_CONST(33821.686956640602/8.0), + REAL_CONST(33839.769793827938/8.0), + REAL_CONST(33857.855047053425/8.0), + REAL_CONST(33875.942715671707/8.0), + REAL_CONST(33894.032799037872/8.0), + REAL_CONST(33912.125296507431/8.0), + REAL_CONST(33930.220207436316/8.0), + REAL_CONST(33948.317531180888/8.0), + REAL_CONST(33966.417267097961/8.0), + REAL_CONST(33984.519414544746/8.0), + REAL_CONST(34002.623972878901/8.0), + REAL_CONST(34020.730941458511/8.0), + REAL_CONST(34038.840319642077/8.0), + REAL_CONST(34056.952106788536/8.0), + REAL_CONST(34075.066302257255/8.0), + REAL_CONST(34093.182905408015/8.0), + REAL_CONST(34111.301915601027/8.0), + REAL_CONST(34129.42333219693/8.0), + REAL_CONST(34147.547154556785/8.0), + REAL_CONST(34165.673382042078/8.0), + REAL_CONST(34183.80201401472/8.0), + REAL_CONST(34201.933049837033/8.0), + REAL_CONST(34220.06648887178/8.0), + REAL_CONST(34238.202330482141/8.0), + REAL_CONST(34256.340574031703/8.0), + REAL_CONST(34274.481218884495/8.0), + REAL_CONST(34292.624264404949/8.0), + REAL_CONST(34310.769709957938/8.0), + REAL_CONST(34328.91755490873/8.0), + REAL_CONST(34347.067798623029/8.0), + REAL_CONST(34365.220440466954/8.0), + REAL_CONST(34383.375479807051/8.0), + REAL_CONST(34401.532916010263/8.0), + REAL_CONST(34419.692748443973/8.0), + REAL_CONST(34437.854976475966/8.0), + REAL_CONST(34456.01959947445/8.0), + REAL_CONST(34474.18661680806/8.0), + REAL_CONST(34492.356027845817/8.0), + REAL_CONST(34510.527831957188/8.0), + REAL_CONST(34528.702028512052/8.0), + REAL_CONST(34546.878616880676/8.0), + REAL_CONST(34565.05759643377/8.0), + REAL_CONST(34583.238966542449/8.0), + REAL_CONST(34601.422726578232/8.0), + REAL_CONST(34619.608875913065/8.0), + REAL_CONST(34637.797413919296/8.0), + REAL_CONST(34655.988339969692/8.0), + REAL_CONST(34674.181653437423/8.0), + REAL_CONST(34692.37735369608/8.0), + REAL_CONST(34710.575440119668/8.0), + REAL_CONST(34728.775912082579/8.0), + REAL_CONST(34746.978768959649/8.0), + REAL_CONST(34765.184010126082/8.0), + REAL_CONST(34783.391634957537/8.0), + REAL_CONST(34801.60164283005/8.0), + REAL_CONST(34819.814033120063/8.0), + REAL_CONST(34838.028805204456/8.0), + REAL_CONST(34856.24595846048/8.0), + REAL_CONST(34874.465492265823/8.0), + REAL_CONST(34892.687405998557/8.0), + REAL_CONST(34910.911699037177/8.0), + REAL_CONST(34929.138370760564/8.0), + REAL_CONST(34947.367420548027/8.0), + REAL_CONST(34965.598847779271/8.0), + REAL_CONST(34983.832651834389/8.0), + REAL_CONST(35002.068832093908/8.0), + REAL_CONST(35020.307387938738/8.0), + REAL_CONST(35038.548318750189/8.0), + REAL_CONST(35056.79162390998/8.0), + REAL_CONST(35075.03730280025/8.0), + REAL_CONST(35093.285354803513/8.0), + REAL_CONST(35111.535779302685/8.0), + REAL_CONST(35129.788575681116/8.0), + REAL_CONST(35148.043743322516/8.0), + REAL_CONST(35166.301281611013/8.0), + REAL_CONST(35184.561189931141/8.0), + REAL_CONST(35202.823467667826/8.0), + REAL_CONST(35221.088114206388/8.0), + REAL_CONST(35239.355128932555/8.0), + REAL_CONST(35257.624511232447/8.0), + REAL_CONST(35275.896260492584/8.0), + REAL_CONST(35294.170376099886/8.0), + REAL_CONST(35312.446857441668/8.0), + REAL_CONST(35330.725703905628/8.0), + REAL_CONST(35349.006914879887/8.0), + REAL_CONST(35367.290489752944/8.0), + REAL_CONST(35385.576427913686/8.0), + REAL_CONST(35403.864728751418/8.0), + REAL_CONST(35422.155391655811/8.0), + REAL_CONST(35440.448416016967/8.0), + REAL_CONST(35458.743801225341/8.0), + REAL_CONST(35477.041546671804/8.0), + REAL_CONST(35495.341651747622/8.0), + REAL_CONST(35513.644115844436/8.0), + REAL_CONST(35531.948938354304/8.0), + REAL_CONST(35550.256118669655/8.0), + REAL_CONST(35568.565656183309/8.0), + REAL_CONST(35586.877550288496/8.0), + REAL_CONST(35605.191800378816/8.0), + REAL_CONST(35623.508405848268/8.0), + REAL_CONST(35641.827366091238/8.0), + REAL_CONST(35660.148680502505/8.0), + REAL_CONST(35678.472348477233/8.0), + REAL_CONST(35696.798369410979/8.0), + REAL_CONST(35715.126742699678/8.0), + REAL_CONST(35733.457467739659/8.0), + REAL_CONST(35751.790543927644/8.0), + REAL_CONST(35770.125970660738/8.0), + REAL_CONST(35788.46374733642/8.0), + REAL_CONST(35806.803873352568/8.0), + REAL_CONST(35825.146348107453/8.0), + REAL_CONST(35843.49117099971/8.0), + REAL_CONST(35861.838341428367/8.0), + REAL_CONST(35880.187858792851/8.0), + REAL_CONST(35898.539722492955/8.0), + REAL_CONST(35916.893931928862/8.0), + REAL_CONST(35935.250486501129/8.0), + REAL_CONST(35953.609385610718/8.0), + REAL_CONST(35971.970628658957/8.0), + REAL_CONST(35990.334215047558/8.0), + REAL_CONST(36008.700144178612/8.0), + REAL_CONST(36027.068415454596/8.0), + REAL_CONST(36045.439028278372/8.0), + REAL_CONST(36063.811982053165/8.0), + REAL_CONST(36082.187276182609/8.0), + REAL_CONST(36100.564910070694/8.0), + REAL_CONST(36118.944883121789/8.0), + REAL_CONST(36137.327194740654/8.0), + REAL_CONST(36155.711844332429/8.0), + REAL_CONST(36174.098831302617/8.0), + REAL_CONST(36192.488155057115/8.0), + REAL_CONST(36210.87981500219/8.0), + REAL_CONST(36229.273810544473/8.0), + REAL_CONST(36247.670141091003/8.0), + REAL_CONST(36266.068806049167/8.0), + REAL_CONST(36284.469804826738/8.0), + REAL_CONST(36302.873136831862/8.0), + REAL_CONST(36321.278801473069/8.0), + REAL_CONST(36339.686798159251/8.0), + REAL_CONST(36358.097126299683/8.0), + REAL_CONST(36376.509785304013/8.0), + REAL_CONST(36394.924774582258/8.0), + REAL_CONST(36413.342093544816/8.0), + REAL_CONST(36431.761741602444/8.0), + REAL_CONST(36450.183718166292/8.0), + REAL_CONST(36468.608022647859/8.0), + REAL_CONST(36487.034654459028/8.0), + REAL_CONST(36505.463613012063/8.0), + REAL_CONST(36523.894897719583/8.0), + REAL_CONST(36542.328507994578/8.0), + REAL_CONST(36560.764443250409/8.0), + REAL_CONST(36579.202702900831/8.0), + REAL_CONST(36597.643286359926/8.0), + REAL_CONST(36616.086193042182/8.0), + REAL_CONST(36634.531422362437/8.0), + REAL_CONST(36652.978973735895/8.0), + REAL_CONST(36671.428846578143/8.0), + REAL_CONST(36689.881040305125/8.0), + REAL_CONST(36708.335554333149/8.0), + REAL_CONST(36726.792388078902/8.0), + REAL_CONST(36745.251540959427/8.0), + REAL_CONST(36763.713012392138/8.0), + REAL_CONST(36782.176801794812/8.0), + REAL_CONST(36800.642908585593/8.0), + REAL_CONST(36819.111332182983/8.0), + REAL_CONST(36837.582072005869/8.0), + REAL_CONST(36856.055127473483/8.0), + REAL_CONST(36874.530498005421/8.0), + REAL_CONST(36893.008183021651/8.0), + REAL_CONST(36911.488181942506/8.0), + REAL_CONST(36929.970494188674/8.0), + REAL_CONST(36948.455119181206/8.0), + REAL_CONST(36966.942056341519/8.0), + REAL_CONST(36985.431305091392/8.0), + REAL_CONST(37003.922864852961/8.0), + REAL_CONST(37022.416735048733/8.0), + REAL_CONST(37040.912915101559/8.0), + REAL_CONST(37059.411404434657/8.0), + REAL_CONST(37077.91220247162/8.0), + REAL_CONST(37096.415308636388/8.0), + REAL_CONST(37114.920722353243/8.0), + REAL_CONST(37133.428443046862/8.0), + REAL_CONST(37151.938470142253/8.0), + REAL_CONST(37170.450803064785/8.0), + REAL_CONST(37188.965441240209/8.0), + REAL_CONST(37207.482384094597/8.0), + REAL_CONST(37226.001631054402/8.0), + REAL_CONST(37244.523181546429/8.0), + REAL_CONST(37263.047034997842/8.0), + REAL_CONST(37281.573190836149/8.0), + REAL_CONST(37300.101648489224/8.0), + REAL_CONST(37318.632407385296/8.0), + REAL_CONST(37337.165466952945/8.0), + REAL_CONST(37355.700826621112/8.0), + REAL_CONST(37374.238485819085/8.0), + REAL_CONST(37392.778443976509/8.0), + REAL_CONST(37411.320700523385/8.0), + REAL_CONST(37429.865254890057/8.0), + REAL_CONST(37448.412106507232/8.0), + REAL_CONST(37466.961254805974/8.0), + REAL_CONST(37485.512699217681/8.0), + REAL_CONST(37504.066439174116/8.0), + REAL_CONST(37522.622474107404/8.0), + REAL_CONST(37541.180803449992/8.0), + REAL_CONST(37559.741426634704/8.0), + REAL_CONST(37578.304343094693/8.0), + REAL_CONST(37596.869552263488/8.0), + REAL_CONST(37615.43705357494/8.0), + REAL_CONST(37634.006846463279/8.0), + REAL_CONST(37652.578930363044/8.0), + REAL_CONST(37671.153304709165/8.0), + REAL_CONST(37689.729968936896/8.0), + REAL_CONST(37708.308922481847/8.0), + REAL_CONST(37726.890164779965/8.0), + REAL_CONST(37745.473695267559/8.0), + REAL_CONST(37764.059513381275/8.0), + REAL_CONST(37782.647618558112/8.0), + REAL_CONST(37801.238010235415/8.0), + REAL_CONST(37819.830687850859/8.0), + REAL_CONST(37838.425650842495/8.0), + REAL_CONST(37857.022898648691/8.0), + REAL_CONST(37875.622430708172/8.0), + REAL_CONST(37894.224246460013/8.0), + REAL_CONST(37912.828345343616/8.0), + REAL_CONST(37931.434726798747/8.0), + REAL_CONST(37950.043390265506/8.0), + REAL_CONST(37968.654335184328/8.0), + REAL_CONST(37987.267560995999/8.0), + REAL_CONST(38005.883067141665/8.0), + REAL_CONST(38024.500853062775/8.0), + REAL_CONST(38043.120918201159/8.0), + REAL_CONST(38061.743261998963/8.0), + REAL_CONST(38080.367883898682/8.0), + REAL_CONST(38098.994783343158/8.0), + REAL_CONST(38117.623959775563/8.0), + REAL_CONST(38136.255412639417/8.0), + REAL_CONST(38154.889141378575/8.0), + REAL_CONST(38173.525145437234/8.0), + REAL_CONST(38192.163424259939/8.0), + REAL_CONST(38210.803977291551/8.0), + REAL_CONST(38229.446803977284/8.0), + REAL_CONST(38248.091903762703/8.0), + REAL_CONST(38266.739276093685/8.0), + REAL_CONST(38285.388920416466/8.0), + REAL_CONST(38304.040836177606/8.0), + REAL_CONST(38322.695022824002/8.0), + REAL_CONST(38341.351479802899/8.0), + REAL_CONST(38360.010206561863/8.0), + REAL_CONST(38378.671202548816/8.0), + REAL_CONST(38397.334467211993/8.0), + REAL_CONST(38415.999999999978/8.0), + REAL_CONST(38434.667800361683/8.0), + REAL_CONST(38453.33786774637/8.0), + REAL_CONST(38472.010201603611/8.0), + REAL_CONST(38490.684801383337/8.0), + REAL_CONST(38509.361666535784/8.0), + REAL_CONST(38528.040796511552/8.0), + REAL_CONST(38546.722190761553/8.0), + REAL_CONST(38565.405848737035/8.0), + REAL_CONST(38584.091769889594/8.0), + REAL_CONST(38602.779953671132/8.0), + REAL_CONST(38621.470399533908/8.0), + REAL_CONST(38640.163106930493/8.0), + REAL_CONST(38658.858075313794/8.0), + REAL_CONST(38677.555304137059/8.0), + REAL_CONST(38696.254792853862/8.0), + REAL_CONST(38714.956540918094/8.0), + REAL_CONST(38733.660547783991/8.0), + REAL_CONST(38752.366812906112/8.0), + REAL_CONST(38771.075335739348/8.0), + REAL_CONST(38789.78611573892/8.0), + REAL_CONST(38808.499152360368/8.0), + REAL_CONST(38827.214445059573/8.0), + REAL_CONST(38845.931993292739/8.0), + REAL_CONST(38864.651796516388/8.0), + REAL_CONST(38883.373854187383/8.0), + REAL_CONST(38902.098165762916/8.0), + REAL_CONST(38920.824730700486/8.0), + REAL_CONST(38939.553548457938/8.0), + REAL_CONST(38958.284618493431/8.0), + REAL_CONST(38977.017940265461/8.0), + REAL_CONST(38995.753513232834/8.0), + REAL_CONST(39014.491336854699/8.0), + REAL_CONST(39033.231410590517/8.0), + REAL_CONST(39051.973733900079/8.0), + REAL_CONST(39070.718306243485/8.0), + REAL_CONST(39089.465127081188/8.0), + REAL_CONST(39108.214195873945/8.0), + REAL_CONST(39126.965512082832/8.0), + REAL_CONST(39145.719075169261/8.0), + REAL_CONST(39164.474884594965/8.0), + REAL_CONST(39183.232939821988/8.0), + REAL_CONST(39201.99324031271/8.0), + REAL_CONST(39220.755785529815/8.0), + REAL_CONST(39239.52057493633/8.0), + REAL_CONST(39258.287607995589/8.0), + REAL_CONST(39277.056884171245/8.0), + REAL_CONST(39295.828402927284/8.0), + REAL_CONST(39314.602163728006/8.0), + REAL_CONST(39333.378166038019/8.0), + REAL_CONST(39352.15640932227/8.0), + REAL_CONST(39370.936893046004/8.0), + REAL_CONST(39389.719616674811/8.0), + REAL_CONST(39408.504579674584/8.0), + REAL_CONST(39427.291781511522/8.0), + REAL_CONST(39446.081221652174/8.0), + REAL_CONST(39464.872899563372/8.0), + REAL_CONST(39483.666814712291/8.0), + REAL_CONST(39502.462966566411/8.0), + REAL_CONST(39521.261354593538/8.0), + REAL_CONST(39540.06197826178/8.0), + REAL_CONST(39558.864837039568/8.0), + REAL_CONST(39577.669930395656/8.0), + REAL_CONST(39596.47725779911/8.0), + REAL_CONST(39615.286818719302/8.0), + REAL_CONST(39634.098612625923/8.0), + REAL_CONST(39652.912638988993/8.0), + REAL_CONST(39671.728897278823/8.0), + REAL_CONST(39690.547386966064/8.0), + REAL_CONST(39709.368107521652/8.0), + REAL_CONST(39728.191058416858/8.0), + REAL_CONST(39747.016239123259/8.0), + REAL_CONST(39765.84364911275/8.0), + REAL_CONST(39784.673287857528/8.0), + REAL_CONST(39803.505154830105/8.0), + REAL_CONST(39822.339249503319/8.0), + REAL_CONST(39841.175571350293/8.0), + REAL_CONST(39860.014119844491/8.0), + REAL_CONST(39878.854894459677/8.0), + REAL_CONST(39897.697894669909/8.0), + REAL_CONST(39916.54311994958/8.0), + REAL_CONST(39935.390569773372/8.0), + REAL_CONST(39954.240243616303/8.0), + REAL_CONST(39973.092140953675/8.0), + REAL_CONST(39991.946261261117/8.0), + REAL_CONST(40010.802604014549/8.0), + REAL_CONST(40029.661168690225/8.0), + REAL_CONST(40048.521954764678/8.0), + REAL_CONST(40067.384961714779/8.0), + REAL_CONST(40086.250189017679/8.0), + REAL_CONST(40105.117636150855/8.0), + REAL_CONST(40123.98730259209/8.0), + REAL_CONST(40142.859187819471/8.0), + REAL_CONST(40161.733291311379/8.0), + REAL_CONST(40180.609612546526/8.0), + REAL_CONST(40199.488151003912/8.0), + REAL_CONST(40218.368906162854/8.0), + REAL_CONST(40237.25187750296/8.0), + REAL_CONST(40256.137064504153/8.0), + REAL_CONST(40275.024466646668/8.0), + REAL_CONST(40293.914083411029/8.0), + REAL_CONST(40312.805914278084/8.0), + REAL_CONST(40331.699958728961/8.0), + REAL_CONST(40350.596216245103/8.0), + REAL_CONST(40369.494686308273/8.0), + REAL_CONST(40388.39536840051/8.0), + REAL_CONST(40407.298262004173/8.0), + REAL_CONST(40426.20336660192/8.0), + REAL_CONST(40445.110681676706/8.0), + REAL_CONST(40464.020206711793/8.0), + REAL_CONST(40482.931941190756/8.0), + REAL_CONST(40501.845884597446/8.0), + REAL_CONST(40520.762036416032/8.0), + REAL_CONST(40539.680396130985/8.0), + REAL_CONST(40558.600963227072/8.0), + REAL_CONST(40577.523737189367/8.0), + REAL_CONST(40596.448717503234/8.0), + REAL_CONST(40615.375903654342/8.0), + REAL_CONST(40634.305295128659/8.0), + REAL_CONST(40653.236891412453/8.0), + REAL_CONST(40672.170691992294/8.0), + REAL_CONST(40691.106696355047/8.0), + REAL_CONST(40710.044903987873/8.0), + REAL_CONST(40728.985314378238/8.0), + REAL_CONST(40747.927927013901/8.0), + REAL_CONST(40766.872741382918/8.0), + REAL_CONST(40785.819756973651/8.0), + REAL_CONST(40804.768973274746/8.0), + REAL_CONST(40823.720389775161/8.0), + REAL_CONST(40842.674005964131/8.0), + REAL_CONST(40861.629821331211/8.0), + REAL_CONST(40880.587835366234/8.0), + REAL_CONST(40899.548047559321/8.0), + REAL_CONST(40918.510457400931/8.0), + REAL_CONST(40937.475064381761/8.0), + REAL_CONST(40956.441867992849/8.0), + REAL_CONST(40975.410867725499/8.0), + REAL_CONST(40994.382063071331/8.0), + REAL_CONST(41013.355453522236/8.0), + REAL_CONST(41032.331038570417/8.0), + REAL_CONST(41051.308817708363/8.0), + REAL_CONST(41070.288790428858/8.0), + REAL_CONST(41089.270956224987/8.0), + REAL_CONST(41108.255314590111/8.0), + REAL_CONST(41127.241865017888/8.0), + REAL_CONST(41146.23060700229/8.0), + REAL_CONST(41165.221540037543/8.0), + REAL_CONST(41184.214663618193/8.0), + REAL_CONST(41203.209977239079/8.0), + REAL_CONST(41222.207480395307/8.0), + REAL_CONST(41241.207172582297/8.0), + REAL_CONST(41260.209053295752/8.0), + REAL_CONST(41279.213122031659/8.0), + REAL_CONST(41298.219378286303/8.0), + REAL_CONST(41317.227821556255/8.0), + REAL_CONST(41336.23845133838/8.0), + REAL_CONST(41355.251267129832/8.0), + REAL_CONST(41374.266268428037/8.0), + REAL_CONST(41393.283454730743/8.0), + REAL_CONST(41412.302825535953/8.0), + REAL_CONST(41431.324380341983/8.0), + REAL_CONST(41450.348118647416/8.0), + REAL_CONST(41469.374039951144/8.0), + REAL_CONST(41488.402143752326/8.0), + REAL_CONST(41507.432429550427/8.0), + REAL_CONST(41526.464896845187/8.0), + REAL_CONST(41545.499545136627/8.0), + REAL_CONST(41564.536373925075/8.0), + REAL_CONST(41583.575382711126/8.0), + REAL_CONST(41602.616570995662/8.0), + REAL_CONST(41621.659938279874/8.0), + REAL_CONST(41640.705484065205/8.0), + REAL_CONST(41659.753207853406/8.0), + REAL_CONST(41678.803109146495/8.0), + REAL_CONST(41697.855187446803/8.0), + REAL_CONST(41716.909442256911/8.0), + REAL_CONST(41735.965873079709/8.0), + REAL_CONST(41755.02447941836/8.0), + REAL_CONST(41774.085260776315/8.0), + REAL_CONST(41793.148216657297/8.0), + REAL_CONST(41812.213346565331/8.0), + REAL_CONST(41831.280650004708/8.0), + REAL_CONST(41850.350126480014/8.0), + REAL_CONST(41869.421775496106/8.0), + REAL_CONST(41888.495596558132/8.0), + REAL_CONST(41907.571589171515/8.0), + REAL_CONST(41926.649752841957/8.0), + REAL_CONST(41945.730087075463/8.0), + REAL_CONST(41964.812591378286/8.0), + REAL_CONST(41983.897265256979/8.0), + REAL_CONST(42002.984108218378/8.0), + REAL_CONST(42022.073119769593/8.0), + REAL_CONST(42041.164299418015/8.0), + REAL_CONST(42060.257646671307/8.0), + REAL_CONST(42079.353161037419/8.0), + REAL_CONST(42098.450842024591/8.0), + REAL_CONST(42117.550689141324/8.0), + REAL_CONST(42136.652701896404/8.0), + REAL_CONST(42155.756879798893/8.0), + REAL_CONST(42174.863222358137/8.0), + REAL_CONST(42193.971729083758/8.0), + REAL_CONST(42213.082399485655/8.0), + REAL_CONST(42232.195233074002/8.0), + REAL_CONST(42251.310229359246/8.0), + REAL_CONST(42270.427387852127/8.0), + REAL_CONST(42289.546708063644/8.0), + REAL_CONST(42308.668189505079/8.0), + REAL_CONST(42327.791831687995/8.0), + REAL_CONST(42346.917634124227/8.0), + REAL_CONST(42366.045596325886/8.0), + REAL_CONST(42385.175717805352/8.0), + REAL_CONST(42404.307998075295/8.0), + REAL_CONST(42423.442436648642/8.0), + REAL_CONST(42442.579033038608/8.0), + REAL_CONST(42461.717786758672/8.0), + REAL_CONST(42480.858697322597/8.0), + REAL_CONST(42500.001764244422/8.0), + REAL_CONST(42519.146987038446/8.0), + REAL_CONST(42538.294365219248/8.0), + REAL_CONST(42557.443898301688/8.0), + REAL_CONST(42576.595585800882/8.0), + REAL_CONST(42595.749427232236/8.0), + REAL_CONST(42614.90542211142/8.0), + REAL_CONST(42634.063569954378/8.0), + REAL_CONST(42653.223870277317/8.0), + REAL_CONST(42672.386322596729/8.0), + REAL_CONST(42691.55092642938/8.0), + REAL_CONST(42710.717681292292/8.0), + REAL_CONST(42729.886586702756/8.0), + REAL_CONST(42749.057642178363/8.0), + REAL_CONST(42768.23084723694/8.0), + REAL_CONST(42787.406201396603/8.0), + REAL_CONST(42806.58370417574/8.0), + REAL_CONST(42825.76335509299/8.0), + REAL_CONST(42844.945153667286/8.0), + REAL_CONST(42864.129099417805/8.0), + REAL_CONST(42883.315191864014/8.0), + REAL_CONST(42902.503430525649/8.0), + REAL_CONST(42921.693814922692/8.0), + REAL_CONST(42940.88634457541/8.0), + REAL_CONST(42960.081019004348/8.0), + REAL_CONST(42979.277837730297/8.0), + REAL_CONST(42998.476800274322/8.0), + REAL_CONST(43017.677906157769/8.0), + REAL_CONST(43036.881154902228/8.0), + REAL_CONST(43056.086546029583/8.0), + REAL_CONST(43075.294079061961/8.0), + REAL_CONST(43094.503753521763/8.0), + REAL_CONST(43113.715568931671/8.0), + REAL_CONST(43132.929524814601/8.0), + REAL_CONST(43152.145620693766/8.0), + REAL_CONST(43171.363856092619/8.0), + REAL_CONST(43190.584230534907/8.0), + REAL_CONST(43209.806743544621/8.0), + REAL_CONST(43229.031394646016/8.0), + REAL_CONST(43248.258183363621/8.0), + REAL_CONST(43267.487109222224/8.0), + REAL_CONST(43286.718171746885/8.0), + REAL_CONST(43305.951370462906/8.0), + REAL_CONST(43325.186704895881/8.0), + REAL_CONST(43344.42417457165/8.0), + REAL_CONST(43363.663779016322/8.0), + REAL_CONST(43382.905517756262/8.0), + REAL_CONST(43402.149390318104/8.0), + REAL_CONST(43421.395396228749/8.0), + REAL_CONST(43440.643535015348/8.0), + REAL_CONST(43459.89380620532/8.0), + REAL_CONST(43479.146209326354/8.0), + REAL_CONST(43498.400743906379/8.0), + REAL_CONST(43517.657409473606/8.0), + REAL_CONST(43536.916205556496/8.0), + REAL_CONST(43556.177131683784/8.0), + REAL_CONST(43575.44018738444/8.0), + REAL_CONST(43594.705372187724/8.0), + REAL_CONST(43613.972685623135/8.0), + REAL_CONST(43633.242127220445/8.0), + REAL_CONST(43652.513696509668/8.0), + REAL_CONST(43671.787393021099/8.0), + REAL_CONST(43691.063216285271/8.0), + REAL_CONST(43710.341165833001/8.0), + REAL_CONST(43729.621241195346/8.0), + REAL_CONST(43748.903441903625/8.0), + REAL_CONST(43768.187767489413/8.0), + REAL_CONST(43787.474217484552/8.0), + REAL_CONST(43806.762791421126/8.0), + REAL_CONST(43826.053488831501/8.0), + REAL_CONST(43845.346309248278/8.0), + REAL_CONST(43864.641252204325/8.0), + REAL_CONST(43883.938317232765/8.0), + REAL_CONST(43903.237503866971/8.0), + REAL_CONST(43922.538811640596/8.0), + REAL_CONST(43941.842240087513/8.0), + REAL_CONST(43961.147788741881/8.0), + REAL_CONST(43980.455457138101/8.0), + REAL_CONST(43999.765244810835/8.0), + REAL_CONST(44019.077151295001/8.0), + REAL_CONST(44038.391176125755/8.0), + REAL_CONST(44057.70731883854/8.0), + REAL_CONST(44077.02557896902/8.0), + REAL_CONST(44096.345956053141/8.0), + REAL_CONST(44115.668449627083/8.0), + REAL_CONST(44134.993059227287/8.0), + REAL_CONST(44154.319784390456/8.0), + REAL_CONST(44173.648624653535/8.0), + REAL_CONST(44192.979579553728/8.0), + REAL_CONST(44212.312648628489/8.0), + REAL_CONST(44231.647831415532/8.0), + REAL_CONST(44250.985127452805/8.0), + REAL_CONST(44270.324536278538/8.0), + REAL_CONST(44289.666057431183/8.0), + REAL_CONST(44309.009690449464/8.0), + REAL_CONST(44328.355434872348/8.0), + REAL_CONST(44347.703290239064/8.0), + REAL_CONST(44367.053256089079/8.0), + REAL_CONST(44386.405331962109/8.0), + REAL_CONST(44405.759517398139/8.0), + REAL_CONST(44425.115811937387/8.0), + REAL_CONST(44444.474215120332/8.0), + REAL_CONST(44463.834726487694/8.0), + REAL_CONST(44483.197345580462/8.0), + REAL_CONST(44502.562071939843/8.0), + REAL_CONST(44521.928905107328/8.0), + REAL_CONST(44541.297844624634/8.0), + REAL_CONST(44560.668890033732/8.0), + REAL_CONST(44580.042040876848/8.0), + REAL_CONST(44599.417296696454/8.0), + REAL_CONST(44618.794657035272/8.0), + REAL_CONST(44638.174121436256/8.0), + REAL_CONST(44657.555689442641/8.0), + REAL_CONST(44676.939360597877/8.0), + REAL_CONST(44696.325134445673/8.0), + REAL_CONST(44715.713010530002/8.0), + REAL_CONST(44735.102988395054/8.0), + REAL_CONST(44754.495067585296/8.0), + REAL_CONST(44773.88924764542/8.0), + REAL_CONST(44793.285528120374/8.0), + REAL_CONST(44812.683908555344/8.0), + REAL_CONST(44832.084388495779/8.0), + REAL_CONST(44851.486967487363/8.0), + REAL_CONST(44870.891645076015/8.0), + REAL_CONST(44890.298420807922/8.0), + REAL_CONST(44909.707294229491/8.0), + REAL_CONST(44929.118264887409/8.0), + REAL_CONST(44948.531332328566/8.0), + REAL_CONST(44967.946496100136/8.0), + REAL_CONST(44987.363755749502/8.0), + REAL_CONST(45006.783110824319/8.0), + REAL_CONST(45026.204560872473/8.0), + REAL_CONST(45045.628105442098/8.0), + REAL_CONST(45065.053744081561/8.0), + REAL_CONST(45084.48147633949/8.0), + REAL_CONST(45103.911301764747/8.0), + REAL_CONST(45123.343219906426/8.0), + REAL_CONST(45142.777230313885/8.0), + REAL_CONST(45162.21333253671/8.0), + REAL_CONST(45181.651526124733/8.0), + REAL_CONST(45201.091810628037/8.0), + REAL_CONST(45220.534185596924/8.0), + REAL_CONST(45239.978650581965/8.0), + REAL_CONST(45259.425205133957/8.0), + REAL_CONST(45278.873848803938/8.0), + REAL_CONST(45298.324581143192/8.0), + REAL_CONST(45317.777401703235/8.0), + REAL_CONST(45337.232310035848/8.0), + REAL_CONST(45356.68930569302/8.0), + REAL_CONST(45376.148388226997/8.0), + REAL_CONST(45395.60955719027/8.0), + REAL_CONST(45415.072812135557/8.0), + REAL_CONST(45434.538152615823/8.0), + REAL_CONST(45454.005578184282/8.0), + REAL_CONST(45473.475088394356/8.0), + REAL_CONST(45492.946682799746/8.0), + REAL_CONST(45512.420360954362/8.0), + REAL_CONST(45531.896122412363/8.0), + REAL_CONST(45551.373966728155/8.0), + REAL_CONST(45570.853893456362/8.0), + REAL_CONST(45590.33590215187/8.0), + REAL_CONST(45609.819992369776/8.0), + REAL_CONST(45629.306163665438/8.0), + REAL_CONST(45648.794415594442/8.0), + REAL_CONST(45668.284747712612/8.0), + REAL_CONST(45687.777159576006/8.0), + REAL_CONST(45707.27165074092/8.0), + REAL_CONST(45726.768220763894/8.0), + REAL_CONST(45746.266869201696/8.0), + REAL_CONST(45765.767595611323/8.0), + REAL_CONST(45785.270399550034/8.0), + REAL_CONST(45804.775280575297/8.0), + REAL_CONST(45824.282238244828/8.0), + REAL_CONST(45843.79127211657/8.0), + REAL_CONST(45863.302381748719/8.0), + REAL_CONST(45882.815566699683/8.0), + REAL_CONST(45902.33082652813/8.0), + REAL_CONST(45921.848160792935/8.0), + REAL_CONST(45941.367569053225/8.0), + REAL_CONST(45960.889050868354/8.0), + REAL_CONST(45980.41260579793/8.0), + REAL_CONST(45999.938233401757/8.0), + REAL_CONST(46019.465933239902/8.0), + REAL_CONST(46038.995704872657/8.0), + REAL_CONST(46058.527547860547/8.0), + REAL_CONST(46078.06146176433/8.0), + REAL_CONST(46097.597446144995/8.0), + REAL_CONST(46117.135500563774/8.0), + REAL_CONST(46136.675624582109/8.0), + REAL_CONST(46156.217817761702/8.0), + REAL_CONST(46175.762079664462/8.0), + REAL_CONST(46195.308409852543/8.0), + REAL_CONST(46214.856807888333/8.0), + REAL_CONST(46234.407273334444/8.0), + REAL_CONST(46253.959805753715/8.0), + REAL_CONST(46273.51440470924/8.0), + REAL_CONST(46293.071069764315/8.0), + REAL_CONST(46312.629800482478/8.0), + REAL_CONST(46332.190596427499/8.0), + REAL_CONST(46351.753457163381/8.0), + REAL_CONST(46371.318382254351/8.0), + REAL_CONST(46390.885371264863/8.0), + REAL_CONST(46410.45442375962/8.0), + REAL_CONST(46430.025539303526/8.0), + REAL_CONST(46449.598717461733/8.0), + REAL_CONST(46469.17395779962/8.0), + REAL_CONST(46488.751259882782/8.0), + REAL_CONST(46508.33062327707/8.0), + REAL_CONST(46527.912047548532/8.0), + REAL_CONST(46547.495532263471/8.0), + REAL_CONST(46567.081076988397/8.0), + REAL_CONST(46586.668681290059/8.0), + REAL_CONST(46606.258344735434/8.0), + REAL_CONST(46625.850066891719/8.0), + REAL_CONST(46645.443847326351/8.0), + REAL_CONST(46665.039685606986/8.0), + REAL_CONST(46684.637581301497/8.0), + REAL_CONST(46704.237533978005/8.0), + REAL_CONST(46723.839543204842/8.0), + REAL_CONST(46743.443608550573/8.0), + REAL_CONST(46763.049729583989/8.0), + REAL_CONST(46782.657905874104/8.0), + REAL_CONST(46802.268136990162/8.0), + REAL_CONST(46821.880422501628/8.0), + REAL_CONST(46841.494761978196/8.0), + REAL_CONST(46861.111154989776/8.0), + REAL_CONST(46880.729601106526/8.0), + REAL_CONST(46900.350099898795/8.0), + REAL_CONST(46919.97265093719/8.0), + REAL_CONST(46939.597253792526/8.0), + REAL_CONST(46959.223908035841/8.0), + REAL_CONST(46978.852613238392/8.0), + REAL_CONST(46998.483368971691/8.0), + REAL_CONST(47018.11617480743/8.0), + REAL_CONST(47037.751030317551/8.0), + REAL_CONST(47057.387935074221/8.0), + REAL_CONST(47077.026888649809/8.0), + REAL_CONST(47096.66789061694/8.0), + REAL_CONST(47116.310940548428/8.0), + REAL_CONST(47135.956038017328/8.0), + REAL_CONST(47155.603182596918/8.0), + REAL_CONST(47175.252373860698/8.0), + REAL_CONST(47194.903611382375/8.0), + REAL_CONST(47214.556894735892/8.0), + REAL_CONST(47234.212223495422/8.0), + REAL_CONST(47253.869597235338/8.0), + REAL_CONST(47273.52901553025/8.0), + REAL_CONST(47293.19047795498/8.0), + REAL_CONST(47312.853984084577/8.0), + REAL_CONST(47332.519533494306/8.0), + REAL_CONST(47352.187125759658/8.0), + REAL_CONST(47371.856760456343/8.0), + REAL_CONST(47391.528437160297/8.0), + REAL_CONST(47411.202155447652/8.0), + REAL_CONST(47430.877914894787/8.0), + REAL_CONST(47450.555715078299/8.0), + REAL_CONST(47470.235555574982/8.0), + REAL_CONST(47489.917435961863/8.0), + REAL_CONST(47509.601355816201/8.0), + REAL_CONST(47529.287314715453/8.0), + REAL_CONST(47548.975312237308/8.0), + REAL_CONST(47568.665347959672/8.0), + REAL_CONST(47588.357421460656/8.0), + REAL_CONST(47608.051532318605/8.0), + REAL_CONST(47627.747680112072/8.0), + REAL_CONST(47647.445864419846/8.0), + REAL_CONST(47667.14608482091/8.0), + REAL_CONST(47686.848340894474/8.0), + REAL_CONST(47706.552632219973/8.0), + REAL_CONST(47726.258958377046/8.0), + REAL_CONST(47745.967318945557/8.0), + REAL_CONST(47765.677713505589/8.0), + REAL_CONST(47785.390141637428/8.0), + REAL_CONST(47805.104602921601/8.0), + REAL_CONST(47824.821096938824/8.0), + REAL_CONST(47844.539623270044/8.0), + REAL_CONST(47864.260181496429/8.0), + REAL_CONST(47883.982771199349/8.0), + REAL_CONST(47903.707391960394/8.0), + REAL_CONST(47923.434043361369/8.0), + REAL_CONST(47943.162724984308/8.0), + REAL_CONST(47962.893436411439/8.0), + REAL_CONST(47982.626177225218/8.0), + REAL_CONST(48002.36094700831/8.0), + REAL_CONST(48022.097745343599/8.0), + REAL_CONST(48041.836571814172/8.0), + REAL_CONST(48061.57742600335/8.0), + REAL_CONST(48081.32030749465/8.0), + REAL_CONST(48101.065215871815/8.0), + REAL_CONST(48120.81215071879/8.0), + REAL_CONST(48140.56111161974/8.0), + REAL_CONST(48160.312098159047/8.0), + REAL_CONST(48180.065109921306/8.0), + REAL_CONST(48199.820146491307/8.0), + REAL_CONST(48219.577207454073/8.0), + REAL_CONST(48239.336292394844/8.0), + REAL_CONST(48259.097400899045/8.0), + REAL_CONST(48278.860532552339/8.0), + REAL_CONST(48298.625686940592/8.0), + REAL_CONST(48318.392863649875/8.0), + REAL_CONST(48338.162062266485/8.0), + REAL_CONST(48357.933282376915/8.0), + REAL_CONST(48377.706523567889/8.0), + REAL_CONST(48397.481785426316/8.0), + REAL_CONST(48417.259067539344/8.0), + REAL_CONST(48437.038369494308/8.0), + REAL_CONST(48456.819690878765/8.0), + REAL_CONST(48476.603031280487/8.0), + REAL_CONST(48496.388390287451/8.0), + REAL_CONST(48516.175767487839/8.0), + REAL_CONST(48535.965162470042/8.0), + REAL_CONST(48555.756574822684/8.0), + REAL_CONST(48575.550004134566/8.0), + REAL_CONST(48595.345449994718/8.0), + REAL_CONST(48615.142911992378/8.0), + REAL_CONST(48634.942389716991/8.0), + REAL_CONST(48654.743882758201/8.0), + REAL_CONST(48674.547390705877/8.0), + REAL_CONST(48694.352913150084/8.0), + REAL_CONST(48714.160449681112/8.0), + REAL_CONST(48733.969999889443/8.0), + REAL_CONST(48753.781563365759/8.0), + REAL_CONST(48773.595139700978/8.0), + REAL_CONST(48793.410728486211/8.0), + REAL_CONST(48813.228329312769/8.0), + REAL_CONST(48833.047941772187/8.0), + REAL_CONST(48852.869565456189/8.0), + REAL_CONST(48872.693199956717/8.0), + REAL_CONST(48892.518844865925/8.0), + REAL_CONST(48912.346499776155/8.0), + REAL_CONST(48932.176164279976/8.0), + REAL_CONST(48952.007837970152/8.0), + REAL_CONST(48971.841520439666/8.0), + REAL_CONST(48991.677211281676/8.0), + REAL_CONST(49011.514910089587/8.0), + REAL_CONST(49031.354616456978/8.0), + REAL_CONST(49051.196329977654/8.0), + REAL_CONST(49071.04005024561/8.0), + REAL_CONST(49090.885776855059/8.0), + REAL_CONST(49110.733509400408/8.0), + REAL_CONST(49130.583247476279/8.0), + REAL_CONST(49150.434990677488/8.0), + REAL_CONST(49170.288738599062/8.0), + REAL_CONST(49190.144490836232/8.0), + REAL_CONST(49210.002246984441/8.0), + REAL_CONST(49229.86200663932/8.0), + REAL_CONST(49249.723769396718/8.0), + REAL_CONST(49269.587534852675/8.0), + REAL_CONST(49289.453302603448/8.0), + REAL_CONST(49309.32107224549/8.0), + REAL_CONST(49329.190843375451/8.0), + REAL_CONST(49349.062615590192/8.0), + REAL_CONST(49368.936388486785/8.0), + REAL_CONST(49388.812161662492/8.0), + REAL_CONST(49408.689934714785/8.0), + REAL_CONST(49428.569707241324/8.0), + REAL_CONST(49448.45147883999/8.0), + REAL_CONST(49468.335249108866/8.0), + REAL_CONST(49488.22101764621/8.0), + REAL_CONST(49508.108784050521/8.0), + REAL_CONST(49527.99854792047/8.0), + REAL_CONST(49547.890308854934/8.0), + REAL_CONST(49567.784066453009/8.0), + REAL_CONST(49587.679820313977/8.0), + REAL_CONST(49607.57757003732/8.0), + REAL_CONST(49627.477315222721/8.0), + REAL_CONST(49647.379055470075/8.0), + REAL_CONST(49667.28279037946/8.0), + REAL_CONST(49687.188519551179/8.0), + REAL_CONST(49707.096242585707/8.0), + REAL_CONST(49727.005959083741/8.0), + REAL_CONST(49746.917668646165/8.0), + REAL_CONST(49766.831370874068/8.0), + REAL_CONST(49786.747065368734/8.0), + REAL_CONST(49806.66475173166/8.0), + REAL_CONST(49826.584429564515/8.0), + REAL_CONST(49846.506098469203/8.0), + REAL_CONST(49866.429758047794/8.0), + REAL_CONST(49886.355407902578/8.0), + REAL_CONST(49906.283047636032/8.0), + REAL_CONST(49926.212676850846/8.0), + REAL_CONST(49946.144295149883/8.0), + REAL_CONST(49966.077902136225/8.0), + REAL_CONST(49986.013497413151/8.0), + REAL_CONST(50005.951080584135/8.0), + REAL_CONST(50025.890651252834/8.0), + REAL_CONST(50045.832209023123/8.0), + REAL_CONST(50065.775753499074/8.0), + REAL_CONST(50085.721284284933/8.0), + REAL_CONST(50105.668800985164/8.0), + REAL_CONST(50125.618303204428/8.0), + REAL_CONST(50145.569790547575/8.0), + REAL_CONST(50165.523262619652/8.0), + REAL_CONST(50185.478719025901/8.0), + REAL_CONST(50205.436159371769/8.0), + REAL_CONST(50225.395583262893/8.0), + REAL_CONST(50245.356990305103/8.0), + REAL_CONST(50265.320380104429/8.0), + REAL_CONST(50285.285752267104/8.0), + REAL_CONST(50305.253106399534/8.0), + REAL_CONST(50325.222442108337/8.0), + REAL_CONST(50345.193759000336/8.0), + REAL_CONST(50365.16705668252/8.0), + REAL_CONST(50385.142334762102/8.0), + REAL_CONST(50405.119592846473/8.0), + REAL_CONST(50425.098830543218/8.0), + REAL_CONST(50445.080047460127/8.0), + REAL_CONST(50465.063243205179/8.0), + REAL_CONST(50485.048417386541/8.0), + REAL_CONST(50505.035569612577/8.0), + REAL_CONST(50525.024699491856/8.0), + REAL_CONST(50545.015806633128/8.0), + REAL_CONST(50565.008890645338/8.0), + REAL_CONST(50585.003951137631/8.0), + REAL_CONST(50605.00098771933/8.0), + REAL_CONST(50624.999999999971/8.0), + REAL_CONST(50645.000987589265/8.0), + REAL_CONST(50665.003950097132/8.0), + REAL_CONST(50685.008887133677/8.0), + REAL_CONST(50705.015798309192/8.0), + REAL_CONST(50725.024683234165/8.0), + REAL_CONST(50745.035541519283/8.0), + REAL_CONST(50765.048372775411/8.0), + REAL_CONST(50785.063176613621/8.0), + REAL_CONST(50805.079952645159/8.0), + REAL_CONST(50825.098700481489/8.0), + REAL_CONST(50845.119419734241/8.0), + REAL_CONST(50865.142110015244/8.0), + REAL_CONST(50885.166770936521/8.0), + REAL_CONST(50905.193402110279/8.0), + REAL_CONST(50925.222003148934/8.0), + REAL_CONST(50945.252573665071/8.0), + REAL_CONST(50965.285113271471/8.0), + REAL_CONST(50985.319621581119/8.0), + REAL_CONST(51005.356098207172/8.0), + REAL_CONST(51025.394542762981/8.0), + REAL_CONST(51045.434954862096/8.0), + REAL_CONST(51065.477334118244/8.0), + REAL_CONST(51085.521680145357/8.0), + REAL_CONST(51105.567992557546/8.0), + REAL_CONST(51125.616270969113/8.0), + REAL_CONST(51145.66651499454/8.0), + REAL_CONST(51165.718724248516/8.0), + REAL_CONST(51185.772898345916/8.0), + REAL_CONST(51205.829036901778/8.0), + REAL_CONST(51225.887139531362/8.0), + REAL_CONST(51245.947205850105/8.0), + REAL_CONST(51266.009235473619/8.0), + REAL_CONST(51286.073228017718/8.0), + REAL_CONST(51306.139183098399/8.0), + REAL_CONST(51326.207100331856/8.0), + REAL_CONST(51346.276979334456/8.0), + REAL_CONST(51366.348819722756/8.0), + REAL_CONST(51386.42262111351/8.0), + REAL_CONST(51406.498383123653/8.0), + REAL_CONST(51426.57610537031/8.0), + REAL_CONST(51446.655787470787/8.0), + REAL_CONST(51466.737429042587/8.0), + REAL_CONST(51486.82102970338/8.0), + REAL_CONST(51506.906589071048/8.0), + REAL_CONST(51526.994106763632/8.0), + REAL_CONST(51547.083582399391/8.0), + REAL_CONST(51567.175015596738/8.0), + REAL_CONST(51587.268405974297/8.0), + REAL_CONST(51607.363753150858/8.0), + REAL_CONST(51627.461056745415/8.0), + REAL_CONST(51647.56031637713/8.0), + REAL_CONST(51667.661531665362/8.0), + REAL_CONST(51687.764702229651/8.0), + REAL_CONST(51707.869827689727/8.0), + REAL_CONST(51727.976907665499/8.0), + REAL_CONST(51748.085941777055/8.0), + REAL_CONST(51768.196929644677/8.0), + REAL_CONST(51788.309870888836/8.0), + REAL_CONST(51808.42476513017/8.0), + REAL_CONST(51828.541611989524/8.0), + REAL_CONST(51848.660411087905/8.0), + REAL_CONST(51868.781162046515/8.0), + REAL_CONST(51888.90386448674/8.0), + REAL_CONST(51909.028518030143/8.0), + REAL_CONST(51929.155122298485/8.0), + REAL_CONST(51949.283676913685/8.0), + REAL_CONST(51969.414181497872/8.0), + REAL_CONST(51989.546635673345/8.0), + REAL_CONST(52009.681039062583/8.0), + REAL_CONST(52029.817391288263/8.0), + REAL_CONST(52049.955691973213/8.0), + REAL_CONST(52070.095940740481/8.0), + REAL_CONST(52090.238137213273/8.0), + REAL_CONST(52110.382281014987/8.0), + REAL_CONST(52130.5283717692/8.0), + REAL_CONST(52150.676409099666/8.0), + REAL_CONST(52170.826392630333/8.0), + REAL_CONST(52190.97832198532/8.0), + REAL_CONST(52211.132196788931/8.0), + REAL_CONST(52231.288016665654/8.0), + REAL_CONST(52251.445781240145/8.0), + REAL_CONST(52271.60549013727/8.0), + REAL_CONST(52291.76714298204/8.0), + REAL_CONST(52311.930739399664/8.0), + REAL_CONST(52332.096279015546/8.0), + REAL_CONST(52352.263761455244/8.0), + REAL_CONST(52372.433186344519/8.0), + REAL_CONST(52392.604553309284/8.0), + REAL_CONST(52412.777861975665/8.0), + REAL_CONST(52432.953111969946/8.0), + REAL_CONST(52453.130302918595/8.0), + REAL_CONST(52473.309434448267/8.0), + REAL_CONST(52493.490506185793/8.0), + REAL_CONST(52513.67351775818/8.0), + REAL_CONST(52533.858468792605/8.0), + REAL_CONST(52554.045358916446/8.0), + REAL_CONST(52574.234187757254/8.0), + REAL_CONST(52594.42495494274/8.0), + REAL_CONST(52614.617660100812/8.0), + REAL_CONST(52634.812302859558/8.0), + REAL_CONST(52655.008882847229/8.0), + REAL_CONST(52675.20739969227/8.0), + REAL_CONST(52695.407853023295/8.0), + REAL_CONST(52715.610242469098/8.0), + REAL_CONST(52735.814567658657/8.0), + REAL_CONST(52756.02082822111/8.0), + REAL_CONST(52776.229023785803/8.0), + REAL_CONST(52796.439153982225/8.0), + REAL_CONST(52816.651218440056/8.0), + REAL_CONST(52836.865216789171/8.0), + REAL_CONST(52857.081148659599/8.0), + REAL_CONST(52877.29901368155/8.0), + REAL_CONST(52897.518811485425/8.0), + REAL_CONST(52917.740541701773/8.0), + REAL_CONST(52937.964203961354/8.0), + REAL_CONST(52958.18979789508/8.0), + REAL_CONST(52978.417323134046/8.0), + REAL_CONST(52998.646779309529/8.0), + REAL_CONST(53018.878166052978/8.0), + REAL_CONST(53039.111482996006/8.0), + REAL_CONST(53059.346729770419/8.0), + REAL_CONST(53079.583906008193/8.0), + REAL_CONST(53099.823011341483/8.0), + REAL_CONST(53120.0640454026/8.0), + REAL_CONST(53140.307007824063/8.0), + REAL_CONST(53160.551898238533/8.0), + REAL_CONST(53180.79871627887/8.0), + REAL_CONST(53201.047461578091/8.0), + REAL_CONST(53221.2981337694/8.0), + REAL_CONST(53241.550732486176/8.0), + REAL_CONST(53261.805257361964/8.0), + REAL_CONST(53282.061708030487/8.0), + REAL_CONST(53302.32008412564/8.0), + REAL_CONST(53322.580385281493/8.0), + REAL_CONST(53342.842611132299/8.0), + REAL_CONST(53363.106761312469/8.0), + REAL_CONST(53383.372835456597/8.0), + REAL_CONST(53403.640833199453/8.0), + REAL_CONST(53423.910754175973/8.0), + REAL_CONST(53444.18259802126/8.0), + REAL_CONST(53464.456364370613/8.0), + REAL_CONST(53484.732052859479/8.0), + REAL_CONST(53505.009663123499/8.0), + REAL_CONST(53525.289194798468/8.0), + REAL_CONST(53545.570647520362/8.0), + REAL_CONST(53565.854020925333/8.0), + REAL_CONST(53586.139314649699/8.0), + REAL_CONST(53606.426528329954/8.0), + REAL_CONST(53626.715661602764/8.0), + REAL_CONST(53647.006714104959/8.0), + REAL_CONST(53667.299685473547/8.0), + REAL_CONST(53687.59457534572/8.0), + REAL_CONST(53707.891383358816/8.0), + REAL_CONST(53728.190109150361/8.0), + REAL_CONST(53748.490752358055/8.0), + REAL_CONST(53768.793312619753/8.0), + REAL_CONST(53789.09778957349/8.0), + REAL_CONST(53809.404182857485/8.0), + REAL_CONST(53829.712492110106/8.0), + REAL_CONST(53850.022716969899/8.0), + REAL_CONST(53870.334857075584/8.0), + REAL_CONST(53890.648912066055/8.0), + REAL_CONST(53910.964881580367/8.0), + REAL_CONST(53931.28276525774/8.0), + REAL_CONST(53951.602562737586/8.0), + REAL_CONST(53971.924273659461/8.0), + REAL_CONST(53992.24789766311/8.0), + REAL_CONST(54012.57343438844/8.0), + REAL_CONST(54032.90088347553/8.0), + REAL_CONST(54053.23024456462/8.0), + REAL_CONST(54073.561517296133/8.0), + REAL_CONST(54093.894701310644/8.0), + REAL_CONST(54114.22979624891/8.0), + REAL_CONST(54134.566801751855/8.0), + REAL_CONST(54154.90571746057/8.0), + REAL_CONST(54175.246543016314/8.0), + REAL_CONST(54195.589278060506/8.0), + REAL_CONST(54215.933922234755/8.0), + REAL_CONST(54236.280475180814/8.0), + REAL_CONST(54256.628936540626/8.0), + REAL_CONST(54276.97930595628/8.0), + REAL_CONST(54297.331583070045/8.0), + REAL_CONST(54317.685767524359/8.0), + REAL_CONST(54338.041858961828/8.0), + REAL_CONST(54358.399857025215/8.0), + REAL_CONST(54378.759761357462/8.0), + REAL_CONST(54399.121571601667/8.0), + REAL_CONST(54419.485287401105/8.0), + REAL_CONST(54439.850908399218/8.0), + REAL_CONST(54460.218434239614/8.0), + REAL_CONST(54480.587864566056/8.0), + REAL_CONST(54500.95919902248/8.0), + REAL_CONST(54521.332437252997/8.0), + REAL_CONST(54541.707578901878/8.0), + REAL_CONST(54562.084623613555/8.0), + REAL_CONST(54582.46357103264/8.0), + REAL_CONST(54602.844420803893/8.0), + REAL_CONST(54623.227172572246/8.0), + REAL_CONST(54643.611825982807/8.0), + REAL_CONST(54663.998380680838/8.0), + REAL_CONST(54684.386836311773/8.0), + REAL_CONST(54704.777192521207/8.0), + REAL_CONST(54725.169448954897/8.0), + REAL_CONST(54745.563605258772/8.0), + REAL_CONST(54765.959661078923/8.0), + REAL_CONST(54786.357616061614/8.0), + REAL_CONST(54806.757469853255/8.0), + REAL_CONST(54827.159222100439/8.0), + REAL_CONST(54847.562872449904/8.0), + REAL_CONST(54867.968420548583/8.0), + REAL_CONST(54888.375866043534/8.0), + REAL_CONST(54908.785208582012/8.0), + REAL_CONST(54929.196447811417/8.0), + REAL_CONST(54949.609583379322/8.0), + REAL_CONST(54970.024614933463/8.0), + REAL_CONST(54990.441542121727/8.0), + REAL_CONST(55010.86036459219/8.0), + REAL_CONST(55031.28108199306/8.0), + REAL_CONST(55051.703693972733/8.0), + REAL_CONST(55072.128200179759/8.0), + REAL_CONST(55092.554600262847/8.0), + REAL_CONST(55112.982893870874/8.0), + REAL_CONST(55133.413080652877/8.0), + REAL_CONST(55153.845160258061/8.0), + REAL_CONST(55174.279132335789/8.0), + REAL_CONST(55194.714996535586/8.0), + REAL_CONST(55215.152752507143/8.0), + REAL_CONST(55235.592399900306/8.0), + REAL_CONST(55256.033938365079/8.0), + REAL_CONST(55276.477367551655/8.0), + REAL_CONST(55296.92268711036/8.0), + REAL_CONST(55317.369896691685/8.0), + REAL_CONST(55337.818995946305/8.0), + REAL_CONST(55358.269984525024/8.0), + REAL_CONST(55378.72286207883/8.0), + REAL_CONST(55399.177628258869/8.0), + REAL_CONST(55419.634282716441/8.0), + REAL_CONST(55440.092825103013/8.0), + REAL_CONST(55460.553255070205/8.0), + REAL_CONST(55481.015572269804/8.0), + REAL_CONST(55501.479776353764/8.0), + REAL_CONST(55521.945866974187/8.0), + REAL_CONST(55542.413843783339/8.0), + REAL_CONST(55562.883706433655/8.0), + REAL_CONST(55583.355454577715/8.0), + REAL_CONST(55603.82908786826/8.0), + REAL_CONST(55624.304605958219/8.0), + REAL_CONST(55644.782008500639/8.0), + REAL_CONST(55665.261295148754/8.0), + REAL_CONST(55685.742465555952/8.0), + REAL_CONST(55706.225519375774/8.0), + REAL_CONST(55726.710456261928/8.0), + REAL_CONST(55747.197275868275/8.0), + REAL_CONST(55767.685977848843/8.0), + REAL_CONST(55788.176561857814/8.0), + REAL_CONST(55808.669027549528/8.0), + REAL_CONST(55829.163374578478/8.0), + REAL_CONST(55849.659602599328/8.0), + REAL_CONST(55870.157711266889/8.0), + REAL_CONST(55890.657700236145/8.0), + REAL_CONST(55911.159569162221/8.0), + REAL_CONST(55931.663317700411/8.0), + REAL_CONST(55952.168945506164/8.0), + REAL_CONST(55972.676452235086/8.0), + REAL_CONST(55993.185837542944/8.0), + REAL_CONST(56013.697101085651/8.0), + REAL_CONST(56034.210242519301/8.0), + REAL_CONST(56054.72526150012/8.0), + REAL_CONST(56075.242157684508/8.0), + REAL_CONST(56095.760930729011/8.0), + REAL_CONST(56116.281580290342/8.0), + REAL_CONST(56136.804106025367/8.0), + REAL_CONST(56157.328507591104/8.0), + REAL_CONST(56177.85478464474/8.0), + REAL_CONST(56198.382936843598/8.0), + REAL_CONST(56218.912963845185/8.0), + REAL_CONST(56239.444865307138/8.0), + REAL_CONST(56259.978640887268/8.0), + REAL_CONST(56280.514290243525/8.0), + REAL_CONST(56301.051813034042/8.0), + REAL_CONST(56321.591208917082/8.0), + REAL_CONST(56342.13247755108/8.0), + REAL_CONST(56362.675618594607/8.0), + REAL_CONST(56383.220631706419/8.0), + REAL_CONST(56403.767516545398/8.0), + REAL_CONST(56424.316272770608/8.0), + REAL_CONST(56444.866900041241/8.0), + REAL_CONST(56465.419398016667/8.0), + REAL_CONST(56485.973766356394/8.0), + REAL_CONST(56506.530004720102/8.0), + REAL_CONST(56527.088112767611/8.0), + REAL_CONST(56547.648090158902/8.0), + REAL_CONST(56568.209936554107/8.0), + REAL_CONST(56588.773651613519/8.0), + REAL_CONST(56609.339234997584/8.0), + REAL_CONST(56629.9066863669/8.0), + REAL_CONST(56650.47600538221/8.0), + REAL_CONST(56671.04719170442/8.0), + REAL_CONST(56691.620244994599/8.0), + REAL_CONST(56712.195164913959/8.0), + REAL_CONST(56732.771951123868/8.0), + REAL_CONST(56753.350603285835/8.0), + REAL_CONST(56773.931121061541/8.0), + REAL_CONST(56794.513504112823/8.0), + REAL_CONST(56815.097752101647/8.0), + REAL_CONST(56835.683864690152/8.0), + REAL_CONST(56856.271841540627/8.0), + REAL_CONST(56876.86168231551/8.0), + REAL_CONST(56897.453386677393/8.0), + REAL_CONST(56918.046954289028/8.0), + REAL_CONST(56938.642384813298/8.0), + REAL_CONST(56959.239677913261/8.0), + REAL_CONST(56979.838833252121/8.0), + REAL_CONST(57000.439850493225/8.0), + REAL_CONST(57021.04272930009/8.0), + REAL_CONST(57041.647469336371/8.0), + REAL_CONST(57062.254070265873/8.0), + REAL_CONST(57082.862531752558/8.0), + REAL_CONST(57103.472853460553/8.0), + REAL_CONST(57124.085035054108/8.0), + REAL_CONST(57144.699076197649/8.0), + REAL_CONST(57165.314976555739/8.0), + REAL_CONST(57185.932735793103/8.0), + REAL_CONST(57206.552353574611/8.0), + REAL_CONST(57227.173829565276/8.0), + REAL_CONST(57247.797163430281/8.0), + REAL_CONST(57268.42235483494/8.0), + REAL_CONST(57289.049403444733/8.0), + REAL_CONST(57309.678308925286/8.0), + REAL_CONST(57330.30907094237/8.0), + REAL_CONST(57350.941689161911/8.0), + REAL_CONST(57371.576163249985/8.0), + REAL_CONST(57392.212492872815/8.0), + REAL_CONST(57412.850677696784/8.0), + REAL_CONST(57433.490717388406/8.0), + REAL_CONST(57454.132611614368/8.0), + REAL_CONST(57474.776360041491/8.0), + REAL_CONST(57495.421962336746/8.0), + REAL_CONST(57516.069418167266/8.0), + REAL_CONST(57536.718727200314/8.0), + REAL_CONST(57557.36988910332/8.0), + REAL_CONST(57578.022903543861/8.0), + REAL_CONST(57598.677770189643/8.0), + REAL_CONST(57619.334488708548/8.0), + REAL_CONST(57639.993058768589/8.0), + REAL_CONST(57660.653480037938/8.0), + REAL_CONST(57681.315752184906/8.0), + REAL_CONST(57701.979874877965/8.0), + REAL_CONST(57722.64584778573/8.0), + REAL_CONST(57743.31367057695/8.0), + REAL_CONST(57763.983342920546/8.0), + REAL_CONST(57784.654864485572/8.0), + REAL_CONST(57805.328234941233/8.0), + REAL_CONST(57826.003453956881/8.0), + REAL_CONST(57846.680521202026/8.0), + REAL_CONST(57867.359436346305/8.0), + REAL_CONST(57888.040199059527/8.0), + REAL_CONST(57908.722809011633/8.0), + REAL_CONST(57929.407265872709/8.0), + REAL_CONST(57950.093569313001/8.0), + REAL_CONST(57970.781719002895/8.0), + REAL_CONST(57991.471714612911/8.0), + REAL_CONST(58012.16355581375/8.0), + REAL_CONST(58032.857242276223/8.0), + REAL_CONST(58053.552773671312/8.0), + REAL_CONST(58074.25014967013/8.0), + REAL_CONST(58094.949369943948/8.0), + REAL_CONST(58115.650434164185/8.0), + REAL_CONST(58136.353342002389/8.0), + REAL_CONST(58157.058093130276/8.0), + REAL_CONST(58177.764687219693/8.0), + REAL_CONST(58198.47312394264/8.0), + REAL_CONST(58219.183402971255/8.0), + REAL_CONST(58239.895523977837/8.0), + REAL_CONST(58260.609486634821/8.0), + REAL_CONST(58281.325290614775/8.0), + REAL_CONST(58302.042935590434/8.0), + REAL_CONST(58322.762421234678/8.0), + REAL_CONST(58343.483747220511/8.0), + REAL_CONST(58364.206913221096/8.0), + REAL_CONST(58384.931918909751/8.0), + REAL_CONST(58405.658763959924/8.0), + REAL_CONST(58426.3874480452/8.0), + REAL_CONST(58447.117970839339/8.0), + REAL_CONST(58467.85033201622/8.0), + REAL_CONST(58488.584531249864/8.0), + REAL_CONST(58509.320568214462/8.0), + REAL_CONST(58530.058442584334/8.0), + REAL_CONST(58550.798154033931/8.0), + REAL_CONST(58571.539702237875/8.0), + REAL_CONST(58592.283086870906/8.0), + REAL_CONST(58613.028307607929/8.0), + REAL_CONST(58633.775364123983/8.0), + REAL_CONST(58654.52425609425/8.0), + REAL_CONST(58675.274983194053/8.0), + REAL_CONST(58696.027545098877/8.0), + REAL_CONST(58716.781941484325/8.0), + REAL_CONST(58737.538172026158/8.0), + REAL_CONST(58758.296236400274/8.0), + REAL_CONST(58779.056134282728/8.0), + REAL_CONST(58799.817865349694/8.0), + REAL_CONST(58820.581429277503/8.0), + REAL_CONST(58841.346825742643/8.0), + REAL_CONST(58862.114054421712/8.0), + REAL_CONST(58882.883114991484/8.0), + REAL_CONST(58903.654007128847/8.0), + REAL_CONST(58924.426730510851/8.0), + REAL_CONST(58945.201284814684/8.0), + REAL_CONST(58965.977669717664/8.0), + REAL_CONST(58986.755884897269/8.0), + REAL_CONST(59007.535930031117/8.0), + REAL_CONST(59028.317804796949/8.0), + REAL_CONST(59049.101508872664/8.0), + REAL_CONST(59069.887041936301/8.0), + REAL_CONST(59090.674403666046/8.0), + REAL_CONST(59111.463593740213/8.0), + REAL_CONST(59132.254611837263/8.0), + REAL_CONST(59153.047457635803/8.0), + REAL_CONST(59173.84213081457/8.0), + REAL_CONST(59194.638631052461/8.0), + REAL_CONST(59215.436958028506/8.0), + REAL_CONST(59236.237111421855/8.0), + REAL_CONST(59257.039090911829/8.0), + REAL_CONST(59277.842896177877/8.0), + REAL_CONST(59298.648526899589/8.0), + REAL_CONST(59319.455982756685/8.0), + REAL_CONST(59340.26526342905/8.0), + REAL_CONST(59361.076368596696/8.0), + REAL_CONST(59381.889297939757/8.0), + REAL_CONST(59402.704051138542/8.0), + REAL_CONST(59423.520627873484/8.0), + REAL_CONST(59444.339027825139/8.0), + REAL_CONST(59465.159250674224/8.0), + REAL_CONST(59485.9812961016/8.0), + REAL_CONST(59506.805163788253/8.0), + REAL_CONST(59527.630853415307/8.0), + REAL_CONST(59548.458364664046/8.0), + REAL_CONST(59569.287697215863/8.0), + REAL_CONST(59590.118850752311/8.0), + REAL_CONST(59610.951824955089/8.0), + REAL_CONST(59631.786619506012/8.0), + REAL_CONST(59652.623234087048/8.0), + REAL_CONST(59673.461668380311/8.0), + REAL_CONST(59694.301922068029/8.0), + REAL_CONST(59715.143994832593/8.0), + REAL_CONST(59735.987886356525/8.0), + REAL_CONST(59756.833596322482/8.0), + REAL_CONST(59777.681124413255/8.0), + REAL_CONST(59798.530470311794/8.0), + REAL_CONST(59819.381633701159/8.0), + REAL_CONST(59840.234614264569/8.0), + REAL_CONST(59861.089411685381/8.0), + REAL_CONST(59881.94602564707/8.0), + REAL_CONST(59902.804455833269/8.0), + REAL_CONST(59923.664701927737/8.0), + REAL_CONST(59944.526763614384/8.0), + REAL_CONST(59965.390640577243/8.0), + REAL_CONST(59986.256332500488/8.0), + REAL_CONST(60007.123839068438/8.0), + REAL_CONST(60027.993159965539/8.0), + REAL_CONST(60048.864294876381/8.0), + REAL_CONST(60069.737243485688/8.0), + REAL_CONST(60090.612005478324/8.0), + REAL_CONST(60111.488580539284/8.0), + REAL_CONST(60132.366968353708/8.0), + REAL_CONST(60153.247168606867/8.0), + REAL_CONST(60174.129180984164/8.0), + REAL_CONST(60195.013005171153/8.0), + REAL_CONST(60215.898640853513/8.0), + REAL_CONST(60236.786087717061/8.0), + REAL_CONST(60257.675345447751/8.0), + REAL_CONST(60278.566413731671/8.0), + REAL_CONST(60299.459292255044/8.0), + REAL_CONST(60320.353980704247/8.0), + REAL_CONST(60341.25047876576/8.0), + REAL_CONST(60362.148786126229/8.0), + REAL_CONST(60383.048902472423/8.0), + REAL_CONST(60403.950827491237/8.0), + REAL_CONST(60424.854560869717/8.0), + REAL_CONST(60445.76010229504/8.0), + REAL_CONST(60466.667451454516/8.0), + REAL_CONST(60487.57660803559/8.0), + REAL_CONST(60508.487571725847/8.0), + REAL_CONST(60529.400342212997/8.0), + REAL_CONST(60550.314919184893/8.0), + REAL_CONST(60571.231302329521/8.0), + REAL_CONST(60592.149491335003/8.0), + REAL_CONST(60613.069485889588/8.0), + REAL_CONST(60633.991285681674/8.0), + REAL_CONST(60654.914890399785/8.0), + REAL_CONST(60675.840299732568/8.0), + REAL_CONST(60696.767513368832/8.0), + REAL_CONST(60717.696530997484/8.0), + REAL_CONST(60738.627352307602/8.0), + REAL_CONST(60759.55997698837/8.0), + REAL_CONST(60780.494404729128/8.0), + REAL_CONST(60801.430635219323/8.0), + REAL_CONST(60822.368668148556/8.0), + REAL_CONST(60843.308503206565/8.0), + REAL_CONST(60864.250140083204/8.0), + REAL_CONST(60885.193578468468/8.0), + REAL_CONST(60906.138818052495/8.0), + REAL_CONST(60927.085858525541/8.0), + REAL_CONST(60948.034699578006/8.0), + REAL_CONST(60968.985340900421/8.0), + REAL_CONST(60989.937782183442/8.0), + REAL_CONST(61010.892023117864/8.0), + REAL_CONST(61031.848063394616/8.0), + REAL_CONST(61052.805902704764/8.0), + REAL_CONST(61073.765540739492/8.0), + REAL_CONST(61094.726977190134/8.0), + REAL_CONST(61115.690211748137/8.0), + REAL_CONST(61136.655244105103/8.0), + REAL_CONST(61157.622073952742/8.0), + REAL_CONST(61178.590700982917/8.0), + REAL_CONST(61199.561124887616/8.0), + REAL_CONST(61220.533345358948/8.0), + REAL_CONST(61241.507362089171/8.0), + REAL_CONST(61262.483174770663/8.0), + REAL_CONST(61283.460783095943/8.0), + REAL_CONST(61304.440186757645/8.0), + REAL_CONST(61325.421385448557/8.0), + REAL_CONST(61346.404378861582/8.0), + REAL_CONST(61367.389166689762/8.0), + REAL_CONST(61388.375748626262/8.0), + REAL_CONST(61409.364124364387/8.0), + REAL_CONST(61430.354293597571/8.0), + REAL_CONST(61451.346256019373/8.0), + REAL_CONST(61472.340011323497/8.0), + REAL_CONST(61493.335559203762/8.0), + REAL_CONST(61514.332899354122/8.0), + REAL_CONST(61535.332031468672/8.0), + REAL_CONST(61556.332955241618/8.0), + REAL_CONST(61577.335670367313/8.0), + REAL_CONST(61598.340176540238/8.0), + REAL_CONST(61619.346473454993/8.0), + REAL_CONST(61640.354560806329/8.0), + REAL_CONST(61661.3644382891/8.0), + REAL_CONST(61682.376105598312/8.0), + REAL_CONST(61703.389562429089/8.0), + REAL_CONST(61724.404808476691/8.0), + REAL_CONST(61745.42184343651/8.0), + REAL_CONST(61766.440667004063/8.0), + REAL_CONST(61787.461278874987/8.0), + REAL_CONST(61808.483678745069/8.0), + REAL_CONST(61829.507866310203/8.0), + REAL_CONST(61850.533841266435/8.0), + REAL_CONST(61871.561603309929/8.0), + REAL_CONST(61892.591152136971/8.0), + REAL_CONST(61913.622487443987/8.0), + REAL_CONST(61934.655608927525/8.0), + REAL_CONST(61955.690516284267/8.0), + REAL_CONST(61976.727209211022/8.0), + REAL_CONST(61997.765687404724/8.0), + REAL_CONST(62018.805950562448/8.0), + REAL_CONST(62039.847998381381/8.0), + REAL_CONST(62060.891830558845/8.0), + REAL_CONST(62081.93744679229/8.0), + REAL_CONST(62102.984846779298/8.0), + REAL_CONST(62124.034030217575/8.0), + REAL_CONST(62145.084996804966/8.0), + REAL_CONST(62166.137746239416/8.0), + REAL_CONST(62187.19227821903/8.0), + REAL_CONST(62208.248592442025/8.0), + REAL_CONST(62229.306688606739/8.0), + REAL_CONST(62250.366566411656/8.0), + REAL_CONST(62271.428225555377/8.0), + REAL_CONST(62292.491665736627/8.0), + REAL_CONST(62313.556886654267/8.0), + REAL_CONST(62334.623888007271/8.0), + REAL_CONST(62355.692669494762/8.0), + REAL_CONST(62376.763230815974/8.0), + REAL_CONST(62397.835571670272/8.0), + REAL_CONST(62418.909691757144/8.0), + REAL_CONST(62439.98559077621/8.0), + REAL_CONST(62461.063268427228/8.0), + REAL_CONST(62482.142724410049/8.0), + REAL_CONST(62503.223958424685/8.0), + REAL_CONST(62524.306970171267/8.0), + REAL_CONST(62545.39175935003/8.0), + REAL_CONST(62566.478325661366/8.0), + REAL_CONST(62587.566668805768/8.0), + REAL_CONST(62608.656788483881/8.0), + REAL_CONST(62629.748684396451/8.0), + REAL_CONST(62650.842356244357/8.0), + REAL_CONST(62671.937803728622/8.0), + REAL_CONST(62693.035026550366/8.0), + REAL_CONST(62714.134024410858/8.0), + REAL_CONST(62735.234797011479/8.0), + REAL_CONST(62756.337344053733/8.0), + REAL_CONST(62777.441665239276/8.0), + REAL_CONST(62798.547760269852/8.0), + REAL_CONST(62819.655628847358/8.0), + REAL_CONST(62840.765270673801/8.0), + REAL_CONST(62861.876685451323/8.0), + REAL_CONST(62882.989872882186/8.0), + REAL_CONST(62904.104832668774/8.0), + REAL_CONST(62925.221564513602/8.0), + REAL_CONST(62946.340068119309/8.0), + REAL_CONST(62967.460343188657/8.0), + REAL_CONST(62988.582389424526/8.0), + REAL_CONST(63009.70620652994/8.0), + REAL_CONST(63030.831794208025/8.0), + REAL_CONST(63051.959152162039/8.0), + REAL_CONST(63073.08828009537/8.0), + REAL_CONST(63094.219177711529/8.0), + REAL_CONST(63115.351844714154/8.0), + REAL_CONST(63136.486280806988/8.0), + REAL_CONST(63157.622485693922/8.0), + REAL_CONST(63178.760459078956/8.0), + REAL_CONST(63199.900200666219/8.0), + REAL_CONST(63221.041710159967/8.0), + REAL_CONST(63242.184987264569/8.0), + REAL_CONST(63263.330031684534/8.0), + REAL_CONST(63284.476843124474/8.0), + REAL_CONST(63305.625421289144/8.0), + REAL_CONST(63326.775765883409/8.0), + REAL_CONST(63347.927876612259/8.0), + REAL_CONST(63369.081753180813/8.0), + REAL_CONST(63390.237395294316/8.0), + REAL_CONST(63411.39480265812/8.0), + REAL_CONST(63432.553974977716/8.0), + REAL_CONST(63453.714911958712/8.0), + REAL_CONST(63474.877613306839/8.0), + REAL_CONST(63496.042078727944/8.0), + REAL_CONST(63517.208307927998/8.0), + REAL_CONST(63538.376300613119/8.0), + REAL_CONST(63559.546056489504/8.0), + REAL_CONST(63580.717575263516/8.0), + REAL_CONST(63601.890856641607/8.0), + REAL_CONST(63623.065900330374/8.0), + REAL_CONST(63644.242706036515/8.0), + REAL_CONST(63665.421273466869/8.0), + REAL_CONST(63686.601602328381/8.0), + REAL_CONST(63707.783692328136/8.0), + REAL_CONST(63728.967543173334/8.0), + REAL_CONST(63750.153154571279/8.0), + REAL_CONST(63771.340526229418/8.0), + REAL_CONST(63792.529657855317/8.0), + REAL_CONST(63813.720549156649/8.0), + REAL_CONST(63834.913199841227/8.0), + REAL_CONST(63856.107609616978/8.0), + REAL_CONST(63877.303778191941/8.0), + REAL_CONST(63898.501705274284/8.0), + REAL_CONST(63919.7013905723/8.0), + REAL_CONST(63940.902833794404/8.0), + REAL_CONST(63962.106034649114/8.0), + REAL_CONST(63983.310992845094/8.0), + REAL_CONST(64004.517708091109/8.0), + REAL_CONST(64025.726180096048/8.0), + REAL_CONST(64046.936408568938/8.0), + REAL_CONST(64068.1483932189/8.0), + REAL_CONST(64089.362133755196/8.0), + REAL_CONST(64110.577629887193/8.0), + REAL_CONST(64131.794881324393/8.0), + REAL_CONST(64153.013887776404/8.0), + REAL_CONST(64174.234648952966/8.0), + REAL_CONST(64195.457164563937/8.0), + REAL_CONST(64216.681434319289/8.0), + REAL_CONST(64237.907457929112/8.0), + REAL_CONST(64259.135235103626/8.0), + REAL_CONST(64280.36476555316/8.0), + REAL_CONST(64301.596048988169/8.0), + REAL_CONST(64322.829085119236/8.0), + REAL_CONST(64344.06387365704/8.0), + REAL_CONST(64365.300414312398/8.0), + REAL_CONST(64386.538706796251/8.0), + REAL_CONST(64407.778750819634/8.0), + REAL_CONST(64429.020546093721/8.0), + REAL_CONST(64450.26409232981/8.0), + REAL_CONST(64471.509389239291/8.0), + REAL_CONST(64492.756436533709/8.0), + REAL_CONST(64514.005233924705/8.0), + REAL_CONST(64535.255781124033/8.0), + REAL_CONST(64556.50807784358/8.0), + REAL_CONST(64577.762123795357/8.0), + REAL_CONST(64599.017918691468/8.0), + REAL_CONST(64620.275462244172/8.0), + REAL_CONST(64641.534754165805/8.0), + REAL_CONST(64662.795794168844/8.0), + REAL_CONST(64684.058581965895/8.0), + REAL_CONST(64705.323117269661/8.0), + REAL_CONST(64726.589399792974/8.0), + REAL_CONST(64747.857429248776/8.0), + REAL_CONST(64769.127205350138/8.0), + REAL_CONST(64790.398727810236/8.0), + REAL_CONST(64811.671996342375/8.0), + REAL_CONST(64832.947010659969/8.0), + REAL_CONST(64854.223770476558/8.0), + REAL_CONST(64875.502275505794/8.0), + REAL_CONST(64896.782525461451/8.0), + REAL_CONST(64918.064520057414/8.0), + REAL_CONST(64939.348259007682/8.0), + REAL_CONST(64960.633742026388/8.0), + REAL_CONST(64981.920968827762/8.0), + REAL_CONST(65003.209939126165/8.0), + REAL_CONST(65024.500652636067/8.0), + REAL_CONST(65045.793109072067/8.0), + REAL_CONST(65067.087308148861/8.0), + REAL_CONST(65088.383249581282/8.0), + REAL_CONST(65109.680933084259/8.0), + REAL_CONST(65130.980358372864/8.0), + REAL_CONST(65152.28152516226/8.0), + REAL_CONST(65173.584433167736/8.0), + REAL_CONST(65194.889082104703/8.0), + REAL_CONST(65216.195471688683/8.0), + REAL_CONST(65237.503601635319/8.0), + REAL_CONST(65258.813471660353/8.0), + REAL_CONST(65280.125081479666/8.0), + REAL_CONST(65301.438430809241/8.0), + REAL_CONST(65322.753519365178/8.0), + REAL_CONST(65344.070346863708/8.0), + REAL_CONST(65365.388913021146/8.0), + REAL_CONST(65386.709217553958/8.0), + REAL_CONST(65408.031260178701/8.0), + REAL_CONST(65429.355040612056/8.0), + REAL_CONST(65450.680558570821/8.0), + REAL_CONST(65472.00781377191/8.0), + REAL_CONST(65493.336805932355/8.0), + REAL_CONST(65514.66753476928/8.0), + REAL_CONST(65535.999999999956/8.0), + REAL_CONST(65557.334201341757/8.0), + REAL_CONST(65578.670138512171/8.0), + REAL_CONST(65600.007811228788/8.0), + REAL_CONST(65621.347219209332/8.0), + REAL_CONST(65642.688362171626/8.0), + REAL_CONST(65664.031239833639/8.0), + REAL_CONST(65685.375851913413/8.0), + REAL_CONST(65706.722198129137/8.0), + REAL_CONST(65728.070278199084/8.0), + REAL_CONST(65749.420091841661/8.0), + REAL_CONST(65770.771638775404/8.0), + REAL_CONST(65792.124918718939/8.0), + REAL_CONST(65813.479931391004/8.0), + REAL_CONST(65834.836676510458/8.0), + REAL_CONST(65856.195153796303/8.0), + REAL_CONST(65877.5553629676/8.0), + REAL_CONST(65898.917303743554/8.0), + REAL_CONST(65920.280975843489/8.0), + REAL_CONST(65941.646378986843/8.0), + REAL_CONST(65963.013512893158/8.0), + REAL_CONST(65984.382377282076/8.0), + REAL_CONST(66005.752971873386/8.0), + REAL_CONST(66027.125296386963/8.0), + REAL_CONST(66048.499350542799/8.0), + REAL_CONST(66069.875134061018/8.0), + REAL_CONST(66091.252646661844/8.0), + REAL_CONST(66112.631888065618/8.0), + REAL_CONST(66134.01285799277/8.0), + REAL_CONST(66155.395556163887/8.0), + REAL_CONST(66176.779982299631/8.0), + REAL_CONST(66198.166136120795/8.0), + REAL_CONST(66219.554017348273/8.0), + REAL_CONST(66240.943625703105/8.0), + REAL_CONST(66262.334960906388/8.0), + REAL_CONST(66283.728022679396/8.0), + REAL_CONST(66305.122810743444/8.0), + REAL_CONST(66326.519324820023/8.0), + REAL_CONST(66347.917564630698/8.0), + REAL_CONST(66369.317529897162/8.0), + REAL_CONST(66390.719220341227/8.0), + REAL_CONST(66412.122635684791/8.0), + REAL_CONST(66433.527775649884/8.0), + REAL_CONST(66454.934639958636/8.0), + REAL_CONST(66476.343228333324/8.0), + REAL_CONST(66497.753540496284/8.0), + REAL_CONST(66519.165576169995/8.0), + REAL_CONST(66540.57933507704/8.0), + REAL_CONST(66561.994816940118/8.0), + REAL_CONST(66583.412021482043/8.0), + REAL_CONST(66604.830948425733/8.0), + REAL_CONST(66626.251597494222/8.0), + REAL_CONST(66647.673968410629/8.0), + REAL_CONST(66669.098060898235/8.0), + REAL_CONST(66690.523874680381/8.0), + REAL_CONST(66711.951409480564/8.0), + REAL_CONST(66733.380665022371/8.0), + REAL_CONST(66754.811641029475/8.0), + REAL_CONST(66776.244337225711/8.0), + REAL_CONST(66797.678753334985/8.0), + REAL_CONST(66819.11488908132/8.0), + REAL_CONST(66840.552744188884/8.0), + REAL_CONST(66861.992318381905/8.0), + REAL_CONST(66883.433611384738/8.0), + REAL_CONST(66904.876622921889/8.0), + REAL_CONST(66926.321352717903/8.0), + REAL_CONST(66947.767800497502/8.0), + REAL_CONST(66969.215965985466/8.0), + REAL_CONST(66990.665848906734/8.0), + REAL_CONST(67012.117448986304/8.0), + REAL_CONST(67033.570765949335/8.0), + REAL_CONST(67055.025799521056/8.0), + REAL_CONST(67076.482549426815/8.0), + REAL_CONST(67097.941015392076/8.0), + REAL_CONST(67119.401197142433/8.0), + REAL_CONST(67140.863094403554/8.0), + REAL_CONST(67162.326706901222/8.0), + REAL_CONST(67183.792034361351/8.0), + REAL_CONST(67205.259076509959/8.0), + REAL_CONST(67226.72783307315/8.0), + REAL_CONST(67248.198303777172/8.0), + REAL_CONST(67269.670488348347/8.0), + REAL_CONST(67291.144386513144/8.0), + REAL_CONST(67312.619997998088/8.0), + REAL_CONST(67334.09732252988/8.0), + REAL_CONST(67355.576359835293/8.0), + REAL_CONST(67377.057109641188/8.0), + REAL_CONST(67398.53957167457/8.0), + REAL_CONST(67420.023745662547/8.0), + REAL_CONST(67441.50963133233/8.0), + REAL_CONST(67462.99722841123/8.0), + REAL_CONST(67484.486536626689/8.0), + REAL_CONST(67505.977555706224/8.0), + REAL_CONST(67527.470285377494/8.0), + REAL_CONST(67548.964725368263/8.0), + REAL_CONST(67570.460875406367/8.0), + REAL_CONST(67591.9587352198/8.0), + REAL_CONST(67613.458304536631/8.0), + REAL_CONST(67634.95958308503/8.0), + REAL_CONST(67656.462570593329/8.0), + REAL_CONST(67677.967266789899/8.0), + REAL_CONST(67699.473671403248/8.0), + REAL_CONST(67720.981784162024/8.0), + REAL_CONST(67742.491604794923/8.0), + REAL_CONST(67764.003133030797/8.0), + REAL_CONST(67785.516368598575/8.0), + REAL_CONST(67807.031311227314/8.0), + REAL_CONST(67828.547960646174/8.0), + REAL_CONST(67850.066316584402/8.0), + REAL_CONST(67871.58637877139/8.0), + REAL_CONST(67893.108146936589/8.0), + REAL_CONST(67914.63162080961/8.0), + REAL_CONST(67936.156800120138/8.0), + REAL_CONST(67957.683684597971/8.0), + REAL_CONST(67979.212273973011/8.0), + REAL_CONST(68000.742567975263/8.0), + REAL_CONST(68022.274566334876/8.0), + REAL_CONST(68043.808268782057/8.0), + REAL_CONST(68065.343675047145/8.0), + REAL_CONST(68086.880784860579/8.0), + REAL_CONST(68108.419597952918/8.0), + REAL_CONST(68129.960114054789/8.0), + REAL_CONST(68151.502332896969/8.0), + REAL_CONST(68173.04625421032/8.0), + REAL_CONST(68194.591877725834/8.0), + REAL_CONST(68216.139203174564/8.0), + REAL_CONST(68237.688230287706/8.0), + REAL_CONST(68259.238958796544/8.0), + REAL_CONST(68280.791388432481/8.0), + REAL_CONST(68302.345518927032/8.0), + REAL_CONST(68323.901350011787/8.0), + REAL_CONST(68345.458881418483/8.0), + REAL_CONST(68367.018112878912/8.0), + REAL_CONST(68388.579044125028/8.0), + REAL_CONST(68410.141674888844/8.0), + REAL_CONST(68431.706004902502/8.0), + REAL_CONST(68453.272033898262/8.0), + REAL_CONST(68474.839761608455/8.0), + REAL_CONST(68496.409187765545/8.0), + REAL_CONST(68517.980312102081/8.0), + REAL_CONST(68539.553134350732/8.0), + REAL_CONST(68561.127654244279/8.0), + REAL_CONST(68582.70387151558/8.0), + REAL_CONST(68604.281785897634/8.0), + REAL_CONST(68625.861397123503/8.0), + REAL_CONST(68647.44270492639/8.0), + REAL_CONST(68669.025709039604/8.0), + REAL_CONST(68690.610409196524/8.0), + REAL_CONST(68712.196805130661/8.0), + REAL_CONST(68733.784896575627/8.0), + REAL_CONST(68755.374683265123/8.0), + REAL_CONST(68776.966164932994/8.0), + REAL_CONST(68798.559341313128/8.0), + REAL_CONST(68820.154212139591/8.0), + REAL_CONST(68841.750777146473/8.0), + REAL_CONST(68863.349036068044/8.0), + REAL_CONST(68884.948988638629/8.0), + REAL_CONST(68906.550634592684/8.0), + REAL_CONST(68928.153973664739/8.0), + REAL_CONST(68949.75900558944/8.0), + REAL_CONST(68971.365730101577/8.0), + REAL_CONST(68992.974146935987/8.0), + REAL_CONST(69014.584255827634/8.0), + REAL_CONST(69036.196056511588/8.0), + REAL_CONST(69057.809548723017/8.0), + REAL_CONST(69079.424732197207/8.0), + REAL_CONST(69101.041606669532/8.0), + REAL_CONST(69122.660171875468/8.0), + REAL_CONST(69144.280427550606/8.0), + REAL_CONST(69165.902373430625/8.0), + REAL_CONST(69187.526009251334/8.0), + REAL_CONST(69209.151334748618/8.0), + REAL_CONST(69230.778349658474/8.0), + REAL_CONST(69252.40705371699/8.0), + REAL_CONST(69274.037446660412/8.0), + REAL_CONST(69295.669528225/8.0), + REAL_CONST(69317.303298147192/8.0), + REAL_CONST(69338.938756163494/8.0), + REAL_CONST(69360.575902010532/8.0), + REAL_CONST(69382.214735425005/8.0), + REAL_CONST(69403.855256143754/8.0), + REAL_CONST(69425.497463903681/8.0), + REAL_CONST(69447.141358441833/8.0), + REAL_CONST(69468.78693949533/8.0), + REAL_CONST(69490.434206801394/8.0), + REAL_CONST(69512.083160097391/8.0), + REAL_CONST(69533.733799120717/8.0), + REAL_CONST(69555.386123608929/8.0), + REAL_CONST(69577.04013329967/8.0), + REAL_CONST(69598.695827930685/8.0), + REAL_CONST(69620.353207239794/8.0), + REAL_CONST(69642.012270964973/8.0), + REAL_CONST(69663.67301884426/8.0), + REAL_CONST(69685.335450615792/8.0), + REAL_CONST(69706.999566017839/8.0), + REAL_CONST(69728.665364788743/8.0), + REAL_CONST(69750.332846666963/8.0), + REAL_CONST(69772.002011391058/8.0), + REAL_CONST(69793.672858699691/8.0), + REAL_CONST(69815.345388331611/8.0), + REAL_CONST(69837.019600025669/8.0), + REAL_CONST(69858.695493520849/8.0), + REAL_CONST(69880.373068556204/8.0), + REAL_CONST(69902.052324870907/8.0), + REAL_CONST(69923.733262204216/8.0), + REAL_CONST(69945.415880295492/8.0), + REAL_CONST(69967.100178884211/8.0), + REAL_CONST(69988.786157709939/8.0), + REAL_CONST(70010.473816512356/8.0), + REAL_CONST(70032.163155031216/8.0), + REAL_CONST(70053.854173006403/8.0), + REAL_CONST(70075.546870177874/8.0), + REAL_CONST(70097.241246285717/8.0), + REAL_CONST(70118.937301070109/8.0), + REAL_CONST(70140.635034271298/8.0), + REAL_CONST(70162.334445629691/8.0), + REAL_CONST(70184.035534885741/8.0), + REAL_CONST(70205.738301780017/8.0), + REAL_CONST(70227.442746053217/8.0), + REAL_CONST(70249.1488674461/8.0), + REAL_CONST(70270.856665699539/8.0), + REAL_CONST(70292.566140554511/8.0), + REAL_CONST(70314.277291752107/8.0), + REAL_CONST(70335.990119033493/8.0), + REAL_CONST(70357.704622139936/8.0), + REAL_CONST(70379.420800812819/8.0), + REAL_CONST(70401.138654793613/8.0), + REAL_CONST(70422.85818382389/8.0), + REAL_CONST(70444.579387645339/8.0), + REAL_CONST(70466.302265999722/8.0), + REAL_CONST(70488.026818628918/8.0), + REAL_CONST(70509.753045274876/8.0), + REAL_CONST(70531.480945679708/8.0), + REAL_CONST(70553.210519585555/8.0), + REAL_CONST(70574.941766734701/8.0), + REAL_CONST(70596.674686869505/8.0), + REAL_CONST(70618.409279732456/8.0), + REAL_CONST(70640.145545066101/8.0), + REAL_CONST(70661.883482613106/8.0), + REAL_CONST(70683.623092116264/8.0), + REAL_CONST(70705.364373318414/8.0), + REAL_CONST(70727.107325962526/8.0), + REAL_CONST(70748.851949791671/8.0), + REAL_CONST(70770.598244549008/8.0), + REAL_CONST(70792.346209977783/8.0), + REAL_CONST(70814.095845821372/8.0), + REAL_CONST(70835.847151823225/8.0), + REAL_CONST(70857.600127726895/8.0), + REAL_CONST(70879.354773276034/8.0), + REAL_CONST(70901.111088214413/8.0), + REAL_CONST(70922.869072285859/8.0), + REAL_CONST(70944.628725234332/8.0), + REAL_CONST(70966.390046803877/8.0), + REAL_CONST(70988.153036738629/8.0), + REAL_CONST(71009.917694782853/8.0), + REAL_CONST(71031.684020680885/8.0), + REAL_CONST(71053.45201417715/8.0), + REAL_CONST(71075.221675016204/8.0), + REAL_CONST(71096.993002942661/8.0), + REAL_CONST(71118.765997701266/8.0), + REAL_CONST(71140.540659036851/8.0), + REAL_CONST(71162.316986694335/8.0), + REAL_CONST(71184.09498041874/8.0), + REAL_CONST(71205.874639955218/8.0), + REAL_CONST(71227.655965048951/8.0), + REAL_CONST(71249.438955445294/8.0), + REAL_CONST(71271.223610889632/8.0), + REAL_CONST(71293.009931127483/8.0), + REAL_CONST(71314.797915904477/8.0), + REAL_CONST(71336.587564966307/8.0), + REAL_CONST(71358.378878058764/8.0), + REAL_CONST(71380.171854927772/8.0), + REAL_CONST(71401.966495319313/8.0), + REAL_CONST(71423.762798979486/8.0), + REAL_CONST(71445.560765654489/8.0), + REAL_CONST(71467.360395090596/8.0), + REAL_CONST(71489.161687034211/8.0), + REAL_CONST(71510.964641231811/8.0), + REAL_CONST(71532.769257429973/8.0), + REAL_CONST(71554.575535375348/8.0), + REAL_CONST(71576.383474814749/8.0), + REAL_CONST(71598.19307549503/8.0), + REAL_CONST(71620.004337163133/8.0), + REAL_CONST(71641.817259566145/8.0), + REAL_CONST(71663.631842451214/8.0), + REAL_CONST(71685.4480855656/8.0), + REAL_CONST(71707.26598865664/8.0), + REAL_CONST(71729.085551471784/8.0), + REAL_CONST(71750.906773758586/8.0), + REAL_CONST(71772.729655264673/8.0), + REAL_CONST(71794.554195737772/8.0), + REAL_CONST(71816.380394925713/8.0), + REAL_CONST(71838.208252576442/8.0), + REAL_CONST(71860.037768437964/8.0), + REAL_CONST(71881.868942258385/8.0), + REAL_CONST(71903.701773785942/8.0), + REAL_CONST(71925.536262768932/8.0), + REAL_CONST(71947.372408955751/8.0), + REAL_CONST(71969.210212094898/8.0), + REAL_CONST(71991.049671934976/8.0), + REAL_CONST(72012.890788224686/8.0), + REAL_CONST(72034.73356071279/8.0), + REAL_CONST(72056.577989148165/8.0), + REAL_CONST(72078.424073279821/8.0), + REAL_CONST(72100.271812856794/8.0), + REAL_CONST(72122.121207628254/8.0), + REAL_CONST(72143.97225734347/8.0), + REAL_CONST(72165.824961751801/8.0), + REAL_CONST(72187.679320602692/8.0), + REAL_CONST(72209.53533364569/8.0), + REAL_CONST(72231.393000630429/8.0), + REAL_CONST(72253.252321306645/8.0), + REAL_CONST(72275.113295424177/8.0), + REAL_CONST(72296.975922732949/8.0), + REAL_CONST(72318.840202982959/8.0), + REAL_CONST(72340.706135924338/8.0), + REAL_CONST(72362.573721307272/8.0), + REAL_CONST(72384.442958882093/8.0), + REAL_CONST(72406.313848399179/8.0), + REAL_CONST(72428.186389609036/8.0), + REAL_CONST(72450.060582262216/8.0), + REAL_CONST(72471.936426109431/8.0), + REAL_CONST(72493.813920901433/8.0), + REAL_CONST(72515.693066389096/8.0), + REAL_CONST(72537.573862323392/8.0), + REAL_CONST(72559.456308455352/8.0), + REAL_CONST(72581.340404536139/8.0), + REAL_CONST(72603.226150316987/8.0), + REAL_CONST(72625.113545549248/8.0), + REAL_CONST(72647.002589984331/8.0), + REAL_CONST(72668.893283373764/8.0), + REAL_CONST(72690.785625469172/8.0), + REAL_CONST(72712.679616022273/8.0), + REAL_CONST(72734.575254784853/8.0), + REAL_CONST(72756.472541508803/8.0), + REAL_CONST(72778.371475946144/8.0), + REAL_CONST(72800.272057848939/8.0), + REAL_CONST(72822.174286969355/8.0), + REAL_CONST(72844.07816305969/8.0), + REAL_CONST(72865.983685872285/8.0), + REAL_CONST(72887.890855159596/8.0), + REAL_CONST(72909.799670674183/8.0), + REAL_CONST(72931.710132168693/8.0), + REAL_CONST(72953.622239395845/8.0), + REAL_CONST(72975.535992108475/8.0), + REAL_CONST(72997.451390059519/8.0), + REAL_CONST(73019.368433001961/8.0), + REAL_CONST(73041.287120688925/8.0), + REAL_CONST(73063.207452873612/8.0), + REAL_CONST(73085.129429309294/8.0), + REAL_CONST(73107.053049749389/8.0), + REAL_CONST(73128.978313947344/8.0), + REAL_CONST(73150.905221656736/8.0), + REAL_CONST(73172.833772631217/8.0), + REAL_CONST(73194.763966624567/8.0), + REAL_CONST(73216.695803390612/8.0), + REAL_CONST(73238.62928268328/8.0), + REAL_CONST(73260.564404256627/8.0), + REAL_CONST(73282.501167864757/8.0), + REAL_CONST(73304.439573261901/8.0), + REAL_CONST(73326.379620202337/8.0), + REAL_CONST(73348.321308440485/8.0), + REAL_CONST(73370.264637730841/8.0), + REAL_CONST(73392.209607827957/8.0), + REAL_CONST(73414.156218486532/8.0), + REAL_CONST(73436.104469461323/8.0), + REAL_CONST(73458.054360507173/8.0), + REAL_CONST(73480.005891379056/8.0), + REAL_CONST(73501.959061831993/8.0), + REAL_CONST(73523.913871621116/8.0), + REAL_CONST(73545.870320501665/8.0), + REAL_CONST(73567.828408228932/8.0), + REAL_CONST(73589.78813455833/8.0), + REAL_CONST(73611.749499245358/8.0), + REAL_CONST(73633.712502045615/8.0), + REAL_CONST(73655.677142714747/8.0), + REAL_CONST(73677.643421008557/8.0), + REAL_CONST(73699.611336682879/8.0), + REAL_CONST(73721.580889493693/8.0), + REAL_CONST(73743.552079197019/8.0), + REAL_CONST(73765.524905548999/8.0), + REAL_CONST(73787.499368305856/8.0), + REAL_CONST(73809.475467223907/8.0), + REAL_CONST(73831.453202059551/8.0), + REAL_CONST(73853.432572569291/8.0), + REAL_CONST(73875.413578509717/8.0), + REAL_CONST(73897.396219637507/8.0), + REAL_CONST(73919.380495709411/8.0), + REAL_CONST(73941.36640648231/8.0), + REAL_CONST(73963.353951713143/8.0), + REAL_CONST(73985.343131158952/8.0), + REAL_CONST(74007.333944576865/8.0), + REAL_CONST(74029.326391724098/8.0), + REAL_CONST(74051.320472357969/8.0), + REAL_CONST(74073.316186235883/8.0), + REAL_CONST(74095.313533115303/8.0), + REAL_CONST(74117.312512753837/8.0), + REAL_CONST(74139.313124909138/8.0), + REAL_CONST(74161.315369338976/8.0), + REAL_CONST(74183.319245801191/8.0), + REAL_CONST(74205.324754053727/8.0), + REAL_CONST(74227.331893854629/8.0), + REAL_CONST(74249.340664961986/8.0), + REAL_CONST(74271.351067134034/8.0), + REAL_CONST(74293.363100129049/8.0), + REAL_CONST(74315.376763705441/8.0), + REAL_CONST(74337.392057621662/8.0), + REAL_CONST(74359.408981636298/8.0), + REAL_CONST(74381.427535508003/8.0), + REAL_CONST(74403.447718995507/8.0), + REAL_CONST(74425.469531857671/8.0), + REAL_CONST(74447.492973853383/8.0), + REAL_CONST(74469.518044741693/8.0), + REAL_CONST(74491.54474428168/8.0), + REAL_CONST(74513.573072232539/8.0), + REAL_CONST(74535.603028353551/8.0), + REAL_CONST(74557.634612404087/8.0), + REAL_CONST(74579.667824143602/8.0), + REAL_CONST(74601.702663331642/8.0), + REAL_CONST(74623.739129727837/8.0), + REAL_CONST(74645.777223091936/8.0), + REAL_CONST(74667.816943183716/8.0), + REAL_CONST(74689.858289763113/8.0), + REAL_CONST(74711.901262590094/8.0), + REAL_CONST(74733.945861424741/8.0), + REAL_CONST(74755.992086027225/8.0), + REAL_CONST(74778.039936157802/8.0), + REAL_CONST(74800.089411576817/8.0), + REAL_CONST(74822.140512044702/8.0), + REAL_CONST(74844.193237321961/8.0), + REAL_CONST(74866.24758716923/8.0), + REAL_CONST(74888.303561347187/8.0), + REAL_CONST(74910.36115961663/8.0), + REAL_CONST(74932.420381738411/8.0), + REAL_CONST(74954.481227473516/8.0), + REAL_CONST(74976.543696582972/8.0), + REAL_CONST(74998.607788827925/8.0), + REAL_CONST(75020.673503969607/8.0), + REAL_CONST(75042.740841769322/8.0), + REAL_CONST(75064.809801988464/8.0), + REAL_CONST(75086.88038438854/8.0), + REAL_CONST(75108.952588731103/8.0), + REAL_CONST(75131.026414777836/8.0), + REAL_CONST(75153.101862290467/8.0), + REAL_CONST(75175.178931030852/8.0), + REAL_CONST(75197.257620760924/8.0), + REAL_CONST(75219.33793124267/8.0), + REAL_CONST(75241.419862238225/8.0), + REAL_CONST(75263.503413509738/8.0), + REAL_CONST(75285.588584819503/8.0), + REAL_CONST(75307.675375929874/8.0), + REAL_CONST(75329.763786603318/8.0), + REAL_CONST(75351.853816602365/8.0), + REAL_CONST(75373.945465689612/8.0), + REAL_CONST(75396.038733627807/8.0), + REAL_CONST(75418.133620179724/8.0), + REAL_CONST(75440.230125108254/8.0), + REAL_CONST(75462.32824817636/8.0), + REAL_CONST(75484.427989147109/8.0), + REAL_CONST(75506.529347783653/8.0), + REAL_CONST(75528.63232384919/8.0), + REAL_CONST(75550.736917107075/8.0), + REAL_CONST(75572.843127320695/8.0), + REAL_CONST(75594.950954253538/8.0), + REAL_CONST(75617.060397669193/8.0), + REAL_CONST(75639.171457331307/8.0), + REAL_CONST(75661.284133003646/8.0), + REAL_CONST(75683.398424450032/8.0), + REAL_CONST(75705.514331434402/8.0), + REAL_CONST(75727.631853720741/8.0), + REAL_CONST(75749.750991073175/8.0), + REAL_CONST(75771.871743255862/8.0), + REAL_CONST(75793.994110033076/8.0), + REAL_CONST(75816.118091169177/8.0), + REAL_CONST(75838.243686428585/8.0), + REAL_CONST(75860.370895575848/8.0), + REAL_CONST(75882.499718375562/8.0), + REAL_CONST(75904.630154592422/8.0), + REAL_CONST(75926.762203991224/8.0), + REAL_CONST(75948.895866336825/8.0), + REAL_CONST(75971.031141394182/8.0), + REAL_CONST(75993.168028928325/8.0), + REAL_CONST(76015.306528704401/8.0), + REAL_CONST(76037.4466404876/8.0), + REAL_CONST(76059.588364043215/8.0), + REAL_CONST(76081.731699136653/8.0), + REAL_CONST(76103.876645533353/8.0), + REAL_CONST(76126.023202998884/8.0), + REAL_CONST(76148.171371298871/8.0), + REAL_CONST(76170.321150199044/8.0), + REAL_CONST(76192.472539465205/8.0), + REAL_CONST(76214.625538863256/8.0), + REAL_CONST(76236.780148159174/8.0), + REAL_CONST(76258.936367119008/8.0), + REAL_CONST(76281.094195508922/8.0), + REAL_CONST(76303.253633095141/8.0), + REAL_CONST(76325.414679643975/8.0), + REAL_CONST(76347.577334921851/8.0), + REAL_CONST(76369.741598695226/8.0), + REAL_CONST(76391.907470730686/8.0), + REAL_CONST(76414.074950794879/8.0), + REAL_CONST(76436.244038654564/8.0), + REAL_CONST(76458.414734076548/8.0), + REAL_CONST(76480.587036827754/8.0), + REAL_CONST(76502.760946675175/8.0), + REAL_CONST(76524.936463385893/8.0), + REAL_CONST(76547.11358672705/8.0), + REAL_CONST(76569.292316465915/8.0), + REAL_CONST(76591.472652369819/8.0), + REAL_CONST(76613.654594206164/8.0), + REAL_CONST(76635.838141742468/8.0), + REAL_CONST(76658.023294746308/8.0), + REAL_CONST(76680.210052985349/8.0), + REAL_CONST(76702.398416227341/8.0), + REAL_CONST(76724.588384240138/8.0), + REAL_CONST(76746.779956791637/8.0), + REAL_CONST(76768.973133649866/8.0), + REAL_CONST(76791.167914582897/8.0), + REAL_CONST(76813.364299358902/8.0), + REAL_CONST(76835.562287746157/8.0), + REAL_CONST(76857.761879512967/8.0), + REAL_CONST(76879.963074427797/8.0), + REAL_CONST(76902.165872259109/8.0), + REAL_CONST(76924.37027277553/8.0), + REAL_CONST(76946.576275745727/8.0), + REAL_CONST(76968.783880938441/8.0), + REAL_CONST(76990.993088122515/8.0), + REAL_CONST(77013.203897066895/8.0), + REAL_CONST(77035.416307540567/8.0), + REAL_CONST(77057.630319312622/8.0), + REAL_CONST(77079.845932152239/8.0), + REAL_CONST(77102.063145828695/8.0), + REAL_CONST(77124.281960111301/8.0), + REAL_CONST(77146.50237476948/8.0), + REAL_CONST(77168.724389572759/8.0), + REAL_CONST(77190.948004290723/8.0), + REAL_CONST(77213.173218693031/8.0), + REAL_CONST(77235.400032549442/8.0), + REAL_CONST(77257.628445629802/8.0), + REAL_CONST(77279.858457704031/8.0), + REAL_CONST(77302.090068542122/8.0), + REAL_CONST(77324.323277914169/8.0), + REAL_CONST(77346.558085590339/8.0), + REAL_CONST(77368.794491340886/8.0), + REAL_CONST(77391.032494936138/8.0), + REAL_CONST(77413.272096146524/8.0), + REAL_CONST(77435.51329474253/8.0), + REAL_CONST(77457.756090494731/8.0), + REAL_CONST(77480.000483173804/8.0), + REAL_CONST(77502.246472550498/8.0), + REAL_CONST(77524.494058395634/8.0), + REAL_CONST(77546.743240480107/8.0), + REAL_CONST(77568.994018574944/8.0), + REAL_CONST(77591.246392451198/8.0), + REAL_CONST(77613.500361880026/8.0), + REAL_CONST(77635.755926632657/8.0), + REAL_CONST(77658.013086480438/8.0), + REAL_CONST(77680.271841194757/8.0), + REAL_CONST(77702.532190547092/8.0), + REAL_CONST(77724.794134309021/8.0), + REAL_CONST(77747.057672252195/8.0), + REAL_CONST(77769.322804148323/8.0), + REAL_CONST(77791.589529769248/8.0), + REAL_CONST(77813.857848886837/8.0), + REAL_CONST(77836.127761273063/8.0), + REAL_CONST(77858.399266699998/8.0), + REAL_CONST(77880.67236493979/8.0), + REAL_CONST(77902.947055764627/8.0), + REAL_CONST(77925.223338946831/8.0), + REAL_CONST(77947.50121425878/8.0), + REAL_CONST(77969.780681472927/8.0), + REAL_CONST(77992.061740361838/8.0), + REAL_CONST(78014.344390698127/8.0), + REAL_CONST(78036.628632254491/8.0), + REAL_CONST(78058.914464803747/8.0), + REAL_CONST(78081.201888118725/8.0), + REAL_CONST(78103.490901972415/8.0), + REAL_CONST(78125.781506137821/8.0), + REAL_CONST(78148.073700388064/8.0), + REAL_CONST(78170.367484496339/8.0), + REAL_CONST(78192.662858235926/8.0), + REAL_CONST(78214.959821380166/8.0), + REAL_CONST(78237.258373702498/8.0), + REAL_CONST(78259.558514976452/8.0), + REAL_CONST(78281.860244975614/8.0), + REAL_CONST(78304.163563473659/8.0), + REAL_CONST(78326.468470244363/8.0), + REAL_CONST(78348.77496506153/8.0), + REAL_CONST(78371.083047699125/8.0), + REAL_CONST(78393.392717931114/8.0), + REAL_CONST(78415.703975531578/8.0), + REAL_CONST(78438.016820274701/8.0), + REAL_CONST(78460.331251934695/8.0), + REAL_CONST(78482.647270285903/8.0), + REAL_CONST(78504.964875102727/8.0), + REAL_CONST(78527.284066159627/8.0), + REAL_CONST(78549.604843231195/8.0), + REAL_CONST(78571.927206092048/8.0), + REAL_CONST(78594.251154516911/8.0), + REAL_CONST(78616.576688280606/8.0), + REAL_CONST(78638.903807157985/8.0), + REAL_CONST(78661.232510924034/8.0), + REAL_CONST(78683.562799353778/8.0), + REAL_CONST(78705.894672222363/8.0), + REAL_CONST(78728.228129304945/8.0), + REAL_CONST(78750.563170376859/8.0), + REAL_CONST(78772.899795213423/8.0), + REAL_CONST(78795.238003590101/8.0), + REAL_CONST(78817.577795282399/8.0), + REAL_CONST(78839.919170065928/8.0), + REAL_CONST(78862.262127716356/8.0), + REAL_CONST(78884.606668009452/8.0), + REAL_CONST(78906.952790721043/8.0), + REAL_CONST(78929.300495627045/8.0), + REAL_CONST(78951.64978250346/8.0), + REAL_CONST(78974.000651126378/8.0), + REAL_CONST(78996.353101271932/8.0), + REAL_CONST(79018.707132716358/8.0), + REAL_CONST(79041.062745235977/8.0), + REAL_CONST(79063.41993860717/8.0), + REAL_CONST(79085.778712606436/8.0), + REAL_CONST(79108.139067010285/8.0), + REAL_CONST(79130.501001595389/8.0), + REAL_CONST(79152.864516138419/8.0), + REAL_CONST(79175.22961041618/8.0), + REAL_CONST(79197.596284205531/8.0), + REAL_CONST(79219.96453728342/8.0), + REAL_CONST(79242.33436942687/8.0), + REAL_CONST(79264.705780412987/8.0), + REAL_CONST(79287.078770018954/8.0), + REAL_CONST(79309.453338022009/8.0), + REAL_CONST(79331.829484199508/8.0), + REAL_CONST(79354.207208328866/8.0), + REAL_CONST(79376.586510187582/8.0), + REAL_CONST(79398.967389553218/8.0), + REAL_CONST(79421.349846203433/8.0), + REAL_CONST(79443.733879915948/8.0), + REAL_CONST(79466.119490468584/8.0), + REAL_CONST(79488.50667763922/8.0), + REAL_CONST(79510.895441205823/8.0), + REAL_CONST(79533.285780946433/8.0), + REAL_CONST(79555.677696639163/8.0), + REAL_CONST(79578.071188062226/8.0), + REAL_CONST(79600.466254993895/8.0), + REAL_CONST(79622.862897212515/8.0), + REAL_CONST(79645.261114496549/8.0), + REAL_CONST(79667.660906624471/8.0), + REAL_CONST(79690.062273374875/8.0), + REAL_CONST(79712.465214526455/8.0), + REAL_CONST(79734.869729857935/8.0), + REAL_CONST(79757.275819148126/8.0), + REAL_CONST(79779.683482175955/8.0), + REAL_CONST(79802.092718720378/8.0), + REAL_CONST(79824.503528560454/8.0), + REAL_CONST(79846.915911475327/8.0), + REAL_CONST(79869.329867244203/8.0), + REAL_CONST(79891.745395646343/8.0), + REAL_CONST(79914.162496461155/8.0), + REAL_CONST(79936.581169468045/8.0), + REAL_CONST(79959.001414446553/8.0), + REAL_CONST(79981.423231176261/8.0), + REAL_CONST(80003.846619436852/8.0), + REAL_CONST(80026.271579008084/8.0), + REAL_CONST(80048.698109669771/8.0), + REAL_CONST(80071.12621120183/8.0), + REAL_CONST(80093.555883384237/8.0), + REAL_CONST(80115.987125997053/8.0), + REAL_CONST(80138.419938820414/8.0), + REAL_CONST(80160.854321634528/8.0), + REAL_CONST(80183.290274219689/8.0), + REAL_CONST(80205.727796356281/8.0), + REAL_CONST(80228.166887824715/8.0), + REAL_CONST(80250.607548405547/8.0), + REAL_CONST(80273.049777879336/8.0), + REAL_CONST(80295.493576026798/8.0), + REAL_CONST(80317.938942628651/8.0), + REAL_CONST(80340.385877465727/8.0), + REAL_CONST(80362.834380318949/8.0), + REAL_CONST(80385.28445096928/8.0), + REAL_CONST(80407.736089197788/8.0), + REAL_CONST(80430.189294785596/8.0), + REAL_CONST(80452.644067513917/8.0), + REAL_CONST(80475.100407164035/8.0), + REAL_CONST(80497.558313517322/8.0), + REAL_CONST(80520.017786355209/8.0), + REAL_CONST(80542.478825459213/8.0), + REAL_CONST(80564.941430610925/8.0), + REAL_CONST(80587.405601592007/8.0), + REAL_CONST(80609.871338184195/8.0), + REAL_CONST(80632.338640169342/8.0), + REAL_CONST(80654.8075073293/8.0), + REAL_CONST(80677.277939446067/8.0), + REAL_CONST(80699.749936301683/8.0), + REAL_CONST(80722.223497678278/8.0), + REAL_CONST(80744.698623358039/8.0), + REAL_CONST(80767.17531312324/8.0), + REAL_CONST(80789.653566756242/8.0), + REAL_CONST(80812.133384039465/8.0), + REAL_CONST(80834.614764755403/8.0), + REAL_CONST(80857.097708686648/8.0), + REAL_CONST(80879.582215615854/8.0), + REAL_CONST(80902.068285325731/8.0), + REAL_CONST(80924.555917599093/8.0), + REAL_CONST(80947.045112218824/8.0), + REAL_CONST(80969.535868967869/8.0), + REAL_CONST(80992.028187629272/8.0), + REAL_CONST(81014.522067986123/8.0), + REAL_CONST(81037.017509821613/8.0), + REAL_CONST(81059.514512919006/8.0), + REAL_CONST(81082.013077061609/8.0), + REAL_CONST(81104.513202032831/8.0), + REAL_CONST(81127.014887616184/8.0), + REAL_CONST(81149.518133595193/8.0), + REAL_CONST(81172.022939753486/8.0), + REAL_CONST(81194.529305874807/8.0), + REAL_CONST(81217.037231742899/8.0), + REAL_CONST(81239.546717141639/8.0), + REAL_CONST(81262.057761854958/8.0), + REAL_CONST(81284.570365666848/8.0), + REAL_CONST(81307.084528361403/8.0), + REAL_CONST(81329.600249722775/8.0), + REAL_CONST(81352.117529535186/8.0), + REAL_CONST(81374.636367582949/8.0), + REAL_CONST(81397.156763650448/8.0), + REAL_CONST(81419.678717522125/8.0), + REAL_CONST(81442.202228982511/8.0), + REAL_CONST(81464.727297816222/8.0), + REAL_CONST(81487.253923807933/8.0), + REAL_CONST(81509.782106742379/8.0), + REAL_CONST(81532.311846404409/8.0), + REAL_CONST(81554.843142578902/8.0), + REAL_CONST(81577.375995050839/8.0), + REAL_CONST(81599.910403605274/8.0), + REAL_CONST(81622.446368027333/8.0), + REAL_CONST(81644.983888102215/8.0), + REAL_CONST(81667.522963615178/8.0), + REAL_CONST(81690.063594351581/8.0), + REAL_CONST(81712.605780096841/8.0), + REAL_CONST(81735.149520636449/8.0), + REAL_CONST(81757.694815755967/8.0), + REAL_CONST(81780.241665241047/8.0), + REAL_CONST(81802.79006887741/8.0), + REAL_CONST(81825.340026450824/8.0), + REAL_CONST(81847.891537747171/8.0), + REAL_CONST(81870.444602552379/8.0), + REAL_CONST(81892.999220652477/8.0), + REAL_CONST(81915.555391833506/8.0), + REAL_CONST(81938.113115881672/8.0), + REAL_CONST(81960.672392583176/8.0), + REAL_CONST(81983.233221724338/8.0), + REAL_CONST(82005.795603091537/8.0), + REAL_CONST(82028.359536471224/8.0), + REAL_CONST(82050.925021649906/8.0), + REAL_CONST(82073.492058414209/8.0), + REAL_CONST(82096.060646550788/8.0), + REAL_CONST(82118.630785846399/8.0), + REAL_CONST(82141.202476087841/8.0), + REAL_CONST(82163.775717062032/8.0), + REAL_CONST(82186.35050855593/8.0), + REAL_CONST(82208.926850356569/8.0), + REAL_CONST(82231.504742251054/8.0), + REAL_CONST(82254.084184026578/8.0), + REAL_CONST(82276.665175470393/8.0), + REAL_CONST(82299.24771636985/8.0), + REAL_CONST(82321.831806512317/8.0), + REAL_CONST(82344.417445685307/8.0), + REAL_CONST(82367.004633676348/8.0), + REAL_CONST(82389.593370273054/8.0), + REAL_CONST(82412.183655263143/8.0), + REAL_CONST(82434.775488434374/8.0), + REAL_CONST(82457.368869574595/8.0), + REAL_CONST(82479.963798471697/8.0), + REAL_CONST(82502.560274913689/8.0), + REAL_CONST(82525.158298688606/8.0), + REAL_CONST(82547.757869584602/8.0), + REAL_CONST(82570.35898738986/8.0), + REAL_CONST(82592.961651892678/8.0), + REAL_CONST(82615.565862881398/8.0), + REAL_CONST(82638.171620144421/8.0), + REAL_CONST(82660.778923470265/8.0), + REAL_CONST(82683.387772647475/8.0), + REAL_CONST(82705.998167464713/8.0), + REAL_CONST(82728.610107710658/8.0), + REAL_CONST(82751.223593174116/8.0), + REAL_CONST(82773.83862364394/8.0), + REAL_CONST(82796.45519890904/8.0), + REAL_CONST(82819.073318758441/8.0), + REAL_CONST(82841.692982981185/8.0), + REAL_CONST(82864.314191366429/8.0), + REAL_CONST(82886.936943703375/8.0), + REAL_CONST(82909.561239781324/8.0), + REAL_CONST(82932.187079389638/8.0), + REAL_CONST(82954.814462317736/8.0), + REAL_CONST(82977.443388355125/8.0), + REAL_CONST(83000.073857291369/8.0), + REAL_CONST(83022.70586891612/8.0), + REAL_CONST(83045.339423019104/8.0), + REAL_CONST(83067.974519390089/8.0), + REAL_CONST(83090.611157818959/8.0), + REAL_CONST(83113.249338095629/8.0), + REAL_CONST(83135.8890600101/8.0), + REAL_CONST(83158.530323352461/8.0), + REAL_CONST(83181.173127912858/8.0), + REAL_CONST(83203.817473481497/8.0), + REAL_CONST(83226.463359848669/8.0), + REAL_CONST(83249.11078680474/8.0), + REAL_CONST(83271.759754140134/8.0), + REAL_CONST(83294.410261645375/8.0), + REAL_CONST(83317.062309111003/8.0), + REAL_CONST(83339.715896327703/8.0), + REAL_CONST(83362.371023086147/8.0), + REAL_CONST(83385.027689177165/8.0), + REAL_CONST(83407.685894391587/8.0), + REAL_CONST(83430.345638520361/8.0), + REAL_CONST(83453.006921354478/8.0), + REAL_CONST(83475.669742685001/8.0), + REAL_CONST(83498.334102303095/8.0), + REAL_CONST(83520.999999999942/8.0), + REAL_CONST(83543.667435566866/8.0), + REAL_CONST(83566.336408795192/8.0), + REAL_CONST(83589.006919476349/8.0), + REAL_CONST(83611.678967401851/8.0), + REAL_CONST(83634.352552363242/8.0), + REAL_CONST(83657.027674152167/8.0), + REAL_CONST(83679.704332560359/8.0), + REAL_CONST(83702.382527379552/8.0), + REAL_CONST(83725.062258401638/8.0), + REAL_CONST(83747.743525418511/8.0), + REAL_CONST(83770.42632822218/8.0), + REAL_CONST(83793.110666604684/8.0), + REAL_CONST(83815.796540358162/8.0), + REAL_CONST(83838.483949274829/8.0), + REAL_CONST(83861.172893146941/8.0), + REAL_CONST(83883.863371766842/8.0), + REAL_CONST(83906.555384926964/8.0), + REAL_CONST(83929.248932419752/8.0), + REAL_CONST(83951.944014037799/8.0), + REAL_CONST(83974.640629573696/8.0), + REAL_CONST(83997.338778820151/8.0), + REAL_CONST(84020.038461569929/8.0), + REAL_CONST(84042.739677615857/8.0), + REAL_CONST(84065.442426750829/8.0), + REAL_CONST(84088.146708767847/8.0), + REAL_CONST(84110.852523459922/8.0), + REAL_CONST(84133.559870620171/8.0), + REAL_CONST(84156.268750041796/8.0), + REAL_CONST(84178.979161518029/8.0), + REAL_CONST(84201.691104842204/8.0), + REAL_CONST(84224.404579807713/8.0), + REAL_CONST(84247.119586208006/8.0), + REAL_CONST(84269.83612383662/8.0), + REAL_CONST(84292.55419248715/8.0), + REAL_CONST(84315.273791953281/8.0), + REAL_CONST(84337.994922028738/8.0), + REAL_CONST(84360.717582507335/8.0), + REAL_CONST(84383.441773182945/8.0), + REAL_CONST(84406.167493849513/8.0), + REAL_CONST(84428.894744301069/8.0), + REAL_CONST(84451.623524331691/8.0), + REAL_CONST(84474.353833735542/8.0), + REAL_CONST(84497.085672306828/8.0), + REAL_CONST(84519.819039839858/8.0), + REAL_CONST(84542.553936128999/8.0), + REAL_CONST(84565.290360968676/8.0), + REAL_CONST(84588.028314153402/8.0), + REAL_CONST(84610.767795477717/8.0), + REAL_CONST(84633.508804736295/8.0), + REAL_CONST(84656.251341723822/8.0), + REAL_CONST(84678.995406235073/8.0), + REAL_CONST(84701.740998064924/8.0), + REAL_CONST(84724.488117008252/8.0), + REAL_CONST(84747.236762860062/8.0), + REAL_CONST(84769.986935415407/8.0), + REAL_CONST(84792.73863446941/8.0), + REAL_CONST(84815.491859817252/8.0), + REAL_CONST(84838.246611254188/8.0), + REAL_CONST(84861.002888575575/8.0), + REAL_CONST(84883.760691576768/8.0), + REAL_CONST(84906.520020053256/8.0), + REAL_CONST(84929.28087380057/8.0), + REAL_CONST(84952.043252614312/8.0), + REAL_CONST(84974.807156290146/8.0), + REAL_CONST(84997.572584623806/8.0), + REAL_CONST(85020.339537411113/8.0), + REAL_CONST(85043.108014447949/8.0), + REAL_CONST(85065.878015530237/8.0), + REAL_CONST(85088.649540453989/8.0), + REAL_CONST(85111.422589015303/8.0), + REAL_CONST(85134.197161010321/8.0), + REAL_CONST(85156.973256235244/8.0), + REAL_CONST(85179.750874486374/8.0), + REAL_CONST(85202.530015560071/8.0), + REAL_CONST(85225.310679252725/8.0), + REAL_CONST(85248.092865360857/8.0), + REAL_CONST(85270.876573681016/8.0), + REAL_CONST(85293.661804009811/8.0), + REAL_CONST(85316.448556143951/8.0), + REAL_CONST(85339.236829880188/8.0), + REAL_CONST(85362.026625015351/8.0), + REAL_CONST(85384.817941346351/8.0), + REAL_CONST(85407.610778670132/8.0), + REAL_CONST(85430.405136783724/8.0), + REAL_CONST(85453.201015484257/8.0), + REAL_CONST(85475.998414568865/8.0), + REAL_CONST(85498.797333834795/8.0), + REAL_CONST(85521.597773079353/8.0), + REAL_CONST(85544.399732099904/8.0), + REAL_CONST(85567.203210693886/8.0), + REAL_CONST(85590.008208658808/8.0), + REAL_CONST(85612.814725792239/8.0), + REAL_CONST(85635.62276189182/8.0), + REAL_CONST(85658.432316755265/8.0), + REAL_CONST(85681.243390180331/8.0), + REAL_CONST(85704.055981964877/8.0), + REAL_CONST(85726.870091906807/8.0), + REAL_CONST(85749.685719804082/8.0), + REAL_CONST(85772.502865454764/8.0), + REAL_CONST(85795.321528656961/8.0), + REAL_CONST(85818.141709208852/8.0), + REAL_CONST(85840.963406908675/8.0), + REAL_CONST(85863.78662155474/8.0), + REAL_CONST(85886.611352945445/8.0), + REAL_CONST(85909.437600879217/8.0), + REAL_CONST(85932.26536515457/8.0), + REAL_CONST(85955.094645570091/8.0), + REAL_CONST(85977.92544192441/8.0), + REAL_CONST(86000.757754016275/8.0), + REAL_CONST(86023.591581644432/8.0), + REAL_CONST(86046.426924607746/8.0), + REAL_CONST(86069.263782705122/8.0), + REAL_CONST(86092.102155735556/8.0), + REAL_CONST(86114.942043498071/8.0), + REAL_CONST(86137.783445791807/8.0), + REAL_CONST(86160.626362415918/8.0), + REAL_CONST(86183.470793169676/8.0), + REAL_CONST(86206.316737852379/8.0), + REAL_CONST(86229.164196263402/8.0), + REAL_CONST(86252.013168202204/8.0), + REAL_CONST(86274.863653468303/8.0), + REAL_CONST(86297.715651861261/8.0), + REAL_CONST(86320.569163180728/8.0), + REAL_CONST(86343.424187226425/8.0), + REAL_CONST(86366.280723798132/8.0), + REAL_CONST(86389.138772695675/8.0), + REAL_CONST(86411.998333718977/8.0), + REAL_CONST(86434.859406668009/8.0), + REAL_CONST(86457.721991342827/8.0), + REAL_CONST(86480.586087543532/8.0), + REAL_CONST(86503.451695070296/8.0), + REAL_CONST(86526.318813723352/8.0), + REAL_CONST(86549.187443303032/8.0), + REAL_CONST(86572.057583609683/8.0), + REAL_CONST(86594.929234443756/8.0), + REAL_CONST(86617.802395605773/8.0), + REAL_CONST(86640.677066896271/8.0), + REAL_CONST(86663.553248115903/8.0), + REAL_CONST(86686.43093906538/8.0), + REAL_CONST(86709.310139545443/8.0), + REAL_CONST(86732.190849356964/8.0), + REAL_CONST(86755.073068300815/8.0), + REAL_CONST(86777.956796177954/8.0), + REAL_CONST(86800.842032789442/8.0), + REAL_CONST(86823.728777936354/8.0), + REAL_CONST(86846.617031419853/8.0), + REAL_CONST(86869.506793041175/8.0), + REAL_CONST(86892.398062601613/8.0), + REAL_CONST(86915.290839902518/8.0), + REAL_CONST(86938.185124745316/8.0), + REAL_CONST(86961.080916931489/8.0), + REAL_CONST(86983.978216262592/8.0), + REAL_CONST(87006.87702254027/8.0), + REAL_CONST(87029.777335566177/8.0), + REAL_CONST(87052.67915514209/8.0), + REAL_CONST(87075.582481069796/8.0), + REAL_CONST(87098.487313151185/8.0), + REAL_CONST(87121.39365118822/8.0), + REAL_CONST(87144.301494982894/8.0), + REAL_CONST(87167.210844337285/8.0), + REAL_CONST(87190.121699053532/8.0), + REAL_CONST(87213.034058933845/8.0), + REAL_CONST(87235.947923780506/8.0), + REAL_CONST(87258.863293395829/8.0), + REAL_CONST(87281.780167582241/8.0), + REAL_CONST(87304.698546142172/8.0), + REAL_CONST(87327.618428878181/8.0), + REAL_CONST(87350.539815592856/8.0), + REAL_CONST(87373.462706088845/8.0), + REAL_CONST(87396.387100168897/8.0), + REAL_CONST(87419.312997635774/8.0), + REAL_CONST(87442.240398292357/8.0), + REAL_CONST(87465.16930194154/8.0), + REAL_CONST(87488.099708386319/8.0), + REAL_CONST(87511.031617429733/8.0), + REAL_CONST(87533.965028874911/8.0), + REAL_CONST(87556.899942525008/8.0), + REAL_CONST(87579.836358183282/8.0), + REAL_CONST(87602.774275653021/8.0), + REAL_CONST(87625.713694737613/8.0), + REAL_CONST(87648.654615240492/8.0), + REAL_CONST(87671.597036965148/8.0), + REAL_CONST(87694.540959715145/8.0), + REAL_CONST(87717.486383294105/8.0), + REAL_CONST(87740.433307505737/8.0), + REAL_CONST(87763.381732153779/8.0), + REAL_CONST(87786.331657042057/8.0), + REAL_CONST(87809.283081974456/8.0), + REAL_CONST(87832.236006754916/8.0), + REAL_CONST(87855.190431187453/8.0), + REAL_CONST(87878.146355076155/8.0), + REAL_CONST(87901.103778225151/8.0), + REAL_CONST(87924.062700438633/8.0), + REAL_CONST(87947.023121520891/8.0), + REAL_CONST(87969.985041276246/8.0), + REAL_CONST(87992.948459509105/8.0), + REAL_CONST(88015.913376023906/8.0), + REAL_CONST(88038.879790625171/8.0), + REAL_CONST(88061.847703117513/8.0), + REAL_CONST(88084.817113305573/8.0), + REAL_CONST(88107.788020994049/8.0), + REAL_CONST(88130.760425987726/8.0), + REAL_CONST(88153.734328091465/8.0), + REAL_CONST(88176.709727110137/8.0), + REAL_CONST(88199.686622848749/8.0), + REAL_CONST(88222.665015112303/8.0), + REAL_CONST(88245.644903705906/8.0), + REAL_CONST(88268.626288434709/8.0), + REAL_CONST(88291.609169103947/8.0), + REAL_CONST(88314.593545518903/8.0), + REAL_CONST(88337.579417484914/8.0), + REAL_CONST(88360.566784807408/8.0), + REAL_CONST(88383.555647291854/8.0), + REAL_CONST(88406.546004743795/8.0), + REAL_CONST(88429.537856968818/8.0), + REAL_CONST(88452.531203772611/8.0), + REAL_CONST(88475.52604496089/8.0), + REAL_CONST(88498.522380339447/8.0), + REAL_CONST(88521.52020971413/8.0), + REAL_CONST(88544.519532890874/8.0), + REAL_CONST(88567.520349675644/8.0), + REAL_CONST(88590.522659874507/8.0), + REAL_CONST(88613.526463293543/8.0), + REAL_CONST(88636.531759738922/8.0), + REAL_CONST(88659.538549016899/8.0), + REAL_CONST(88682.546830933745/8.0), + REAL_CONST(88705.556605295846/8.0), + REAL_CONST(88728.567871909589/8.0), + REAL_CONST(88751.580630581491/8.0), + REAL_CONST(88774.594881118086/8.0), + REAL_CONST(88797.610623325963/8.0), + REAL_CONST(88820.62785701183/8.0), + REAL_CONST(88843.646581982393/8.0), + REAL_CONST(88866.666798044462/8.0), + REAL_CONST(88889.688505004888/8.0), + REAL_CONST(88912.711702670611/8.0), + REAL_CONST(88935.7363908486/8.0), + REAL_CONST(88958.762569345898/8.0), + REAL_CONST(88981.790237969632/8.0), + REAL_CONST(89004.81939652696/8.0), + REAL_CONST(89027.850044825114/8.0), + REAL_CONST(89050.882182671412/8.0), + REAL_CONST(89073.9158098732/8.0), + REAL_CONST(89096.950926237885/8.0), + REAL_CONST(89119.987531572973/8.0), + REAL_CONST(89143.025625686001/8.0), + REAL_CONST(89166.065208384563/8.0), + REAL_CONST(89189.106279476357/8.0), + REAL_CONST(89212.148838769106/8.0), + REAL_CONST(89235.192886070581/8.0), + REAL_CONST(89258.238421188667/8.0), + REAL_CONST(89281.285443931265/8.0), + REAL_CONST(89304.333954106376/8.0), + REAL_CONST(89327.383951522017/8.0), + REAL_CONST(89350.435435986306/8.0), + REAL_CONST(89373.488407307406/8.0), + REAL_CONST(89396.542865293537/8.0), + REAL_CONST(89419.598809753006/8.0), + REAL_CONST(89442.656240494165/8.0), + REAL_CONST(89465.715157325409/8.0), + REAL_CONST(89488.775560055219/8.0), + REAL_CONST(89511.837448492137/8.0), + REAL_CONST(89534.900822444746/8.0), + REAL_CONST(89557.965681721733/8.0), + REAL_CONST(89581.032026131812/8.0), + REAL_CONST(89604.099855483742/8.0), + REAL_CONST(89627.169169586399/8.0), + REAL_CONST(89650.239968248672/8.0), + REAL_CONST(89673.312251279538/8.0), + REAL_CONST(89696.386018488018/8.0), + REAL_CONST(89719.461269683205/8.0), + REAL_CONST(89742.53800467425/8.0), + REAL_CONST(89765.616223270365/8.0), + REAL_CONST(89788.69592528083/8.0), + REAL_CONST(89811.777110514988/8.0), + REAL_CONST(89834.859778782207/8.0), + REAL_CONST(89857.943929891975/8.0), + REAL_CONST(89881.029563653807/8.0), + REAL_CONST(89904.116679877261/8.0), + REAL_CONST(89927.205278372014/8.0), + REAL_CONST(89950.29535894774/8.0), + REAL_CONST(89973.386921414218/8.0), + REAL_CONST(89996.479965581268/8.0), + REAL_CONST(90019.574491258769/8.0), + REAL_CONST(90042.670498256688/8.0), + REAL_CONST(90065.767986385021/8.0), + REAL_CONST(90088.866955453836/8.0), + REAL_CONST(90111.967405273259/8.0), + REAL_CONST(90135.069335653476/8.0), + REAL_CONST(90158.172746404758/8.0), + REAL_CONST(90181.277637337407/8.0), + REAL_CONST(90204.384008261797/8.0), + REAL_CONST(90227.49185898836/8.0), + REAL_CONST(90250.601189327586/8.0), + REAL_CONST(90273.711999090039/8.0), + REAL_CONST(90296.824288086325/8.0), + REAL_CONST(90319.938056127125/8.0), + REAL_CONST(90343.053303023189/8.0), + REAL_CONST(90366.170028585286/8.0), + REAL_CONST(90389.288232624298/8.0), + REAL_CONST(90412.407914951138/8.0), + REAL_CONST(90435.529075376777/8.0), + REAL_CONST(90458.651713712257/8.0), + REAL_CONST(90481.775829768681/8.0), + REAL_CONST(90504.901423357209/8.0), + REAL_CONST(90528.028494289058/8.0), + REAL_CONST(90551.157042375504/8.0), + REAL_CONST(90574.287067427911/8.0), + REAL_CONST(90597.418569257643/8.0), + REAL_CONST(90620.551547676194/8.0), + REAL_CONST(90643.686002495073/8.0), + REAL_CONST(90666.821933525847/8.0), + REAL_CONST(90689.959340580186/8.0), + REAL_CONST(90713.098223469773/8.0), + REAL_CONST(90736.238582006365/8.0), + REAL_CONST(90759.380416001804/8.0), + REAL_CONST(90782.523725267951/8.0), + REAL_CONST(90805.668509616764/8.0), + REAL_CONST(90828.814768860233/8.0), + REAL_CONST(90851.962502810435/8.0), + REAL_CONST(90875.11171127946/8.0), + REAL_CONST(90898.262394079517/8.0), + REAL_CONST(90921.414551022855/8.0), + REAL_CONST(90944.568181921743/8.0), + REAL_CONST(90967.72328658856/8.0), + REAL_CONST(90990.879864835719/8.0), + REAL_CONST(91014.037916475718/8.0), + REAL_CONST(91037.19744132107/8.0), + REAL_CONST(91060.358439184391/8.0), + REAL_CONST(91083.520909878338/8.0), + REAL_CONST(91106.684853215629/8.0), + REAL_CONST(91129.850269009039/8.0), + REAL_CONST(91153.017157071401/8.0), + REAL_CONST(91176.185517215621/8.0), + REAL_CONST(91199.355349254649/8.0), + REAL_CONST(91222.526653001492/8.0), + REAL_CONST(91245.699428269247/8.0), + REAL_CONST(91268.873674871036/8.0), + REAL_CONST(91292.049392620058/8.0), + REAL_CONST(91315.226581329553/8.0), + REAL_CONST(91338.405240812834/8.0), + REAL_CONST(91361.585370883287/8.0), + REAL_CONST(91384.766971354344/8.0), + REAL_CONST(91407.950042039476/8.0), + REAL_CONST(91431.134582752245/8.0), + REAL_CONST(91454.320593306256/8.0), + REAL_CONST(91477.508073515171/8.0), + REAL_CONST(91500.697023192712/8.0), + REAL_CONST(91523.887442152685/8.0), + REAL_CONST(91547.07933020893/8.0), + REAL_CONST(91570.272687175326/8.0), + REAL_CONST(91593.467512865856/8.0), + REAL_CONST(91616.663807094534/8.0), + REAL_CONST(91639.861569675442/8.0), + REAL_CONST(91663.060800422725/8.0), + REAL_CONST(91686.261499150554/8.0), + REAL_CONST(91709.463665673218/8.0), + REAL_CONST(91732.66729980502/8.0), + REAL_CONST(91755.872401360321/8.0), + REAL_CONST(91779.078970153569/8.0), + REAL_CONST(91802.287005999257/8.0), + REAL_CONST(91825.49650871192/8.0), + REAL_CONST(91848.707478106167/8.0), + REAL_CONST(91871.91991399668/8.0), + REAL_CONST(91895.133816198169/8.0), + REAL_CONST(91918.349184525418/8.0), + REAL_CONST(91941.566018793281/8.0), + REAL_CONST(91964.784318816659/8.0), + REAL_CONST(91988.004084410495/8.0), + REAL_CONST(92011.22531538982/8.0), + REAL_CONST(92034.448011569708/8.0), + REAL_CONST(92057.672172765277/8.0), + REAL_CONST(92080.897798791746/8.0), + REAL_CONST(92104.124889464365/8.0), + REAL_CONST(92127.353444598411/8.0), + REAL_CONST(92150.58346400928/8.0), + REAL_CONST(92173.814947512379/8.0), + REAL_CONST(92197.04789492322/8.0), + REAL_CONST(92220.282306057314/8.0), + REAL_CONST(92243.518180730272/8.0), + REAL_CONST(92266.755518757753/8.0), + REAL_CONST(92289.994319955469/8.0), + REAL_CONST(92313.234584139194/8.0), + REAL_CONST(92336.476311124774/8.0), + REAL_CONST(92359.719500728082/8.0), + REAL_CONST(92382.964152765067/8.0), + REAL_CONST(92406.210267051734/8.0), + REAL_CONST(92429.457843404161/8.0), + REAL_CONST(92452.706881638471/8.0), + REAL_CONST(92475.957381570814/8.0), + REAL_CONST(92499.209343017443/8.0), + REAL_CONST(92522.462765794655/8.0), + REAL_CONST(92545.717649718805/8.0), + REAL_CONST(92568.973994606305/8.0), + REAL_CONST(92592.231800273614/8.0), + REAL_CONST(92615.491066537259/8.0), + REAL_CONST(92638.751793213814/8.0), + REAL_CONST(92662.01398011994/8.0), + REAL_CONST(92685.277627072326/8.0), + REAL_CONST(92708.54273388772/8.0), + REAL_CONST(92731.809300382942/8.0), + REAL_CONST(92755.077326374871/8.0), + REAL_CONST(92778.346811680414/8.0), + REAL_CONST(92801.617756116568/8.0), + REAL_CONST(92824.890159500384/8.0), + REAL_CONST(92848.164021648947/8.0), + REAL_CONST(92871.439342379424/8.0), + REAL_CONST(92894.716121509016/8.0), + REAL_CONST(92917.994358855023/8.0), + REAL_CONST(92941.274054234746/8.0), + REAL_CONST(92964.555207465572/8.0), + REAL_CONST(92987.837818364962/8.0), + REAL_CONST(93011.121886750407/8.0), + REAL_CONST(93034.407412439468/8.0), + REAL_CONST(93057.694395249753/8.0), + REAL_CONST(93080.982834998955/8.0), + REAL_CONST(93104.272731504767/8.0), + REAL_CONST(93127.564084584999/8.0), + REAL_CONST(93150.856894057491/8.0), + REAL_CONST(93174.15115974014/8.0), + REAL_CONST(93197.446881450916/8.0), + REAL_CONST(93220.744059007804/8.0), + REAL_CONST(93244.04269222889/8.0), + REAL_CONST(93267.342780932304/8.0), + REAL_CONST(93290.644324936235/8.0), + REAL_CONST(93313.947324058914/8.0), + REAL_CONST(93337.251778118633/8.0), + REAL_CONST(93360.557686933767/8.0), + REAL_CONST(93383.865050322696/8.0), + REAL_CONST(93407.173868103928/8.0), + REAL_CONST(93430.484140095941/8.0), + REAL_CONST(93453.795866117362/8.0), + REAL_CONST(93477.109045986799/8.0), + REAL_CONST(93500.423679522952/8.0), + REAL_CONST(93523.739766544561/8.0), + REAL_CONST(93547.057306870454/8.0), + REAL_CONST(93570.376300319491/8.0), + REAL_CONST(93593.696746710571/8.0), + REAL_CONST(93617.018645862699/8.0), + REAL_CONST(93640.341997594893/8.0), + REAL_CONST(93663.666801726242/8.0), + REAL_CONST(93686.993058075881/8.0), + REAL_CONST(93710.320766463032/8.0), + REAL_CONST(93733.64992670693/8.0), + REAL_CONST(93756.980538626914/8.0), + REAL_CONST(93780.312602042337/8.0), + REAL_CONST(93803.646116772637/8.0), + REAL_CONST(93826.981082637285/8.0), + REAL_CONST(93850.317499455836/8.0), + REAL_CONST(93873.655367047861/8.0), + REAL_CONST(93896.994685233032/8.0), + REAL_CONST(93920.335453831038/8.0), + REAL_CONST(93943.677672661666/8.0), + REAL_CONST(93967.021341544707/8.0), + REAL_CONST(93990.366460300051/8.0), + REAL_CONST(94013.713028747632/8.0), + REAL_CONST(94037.061046707429/8.0), + REAL_CONST(94060.410513999494/8.0), + REAL_CONST(94083.761430443905/8.0), + REAL_CONST(94107.113795860845/8.0), + REAL_CONST(94130.467610070496/8.0), + REAL_CONST(94153.822872893157/8.0), + REAL_CONST(94177.179584149111/8.0), + REAL_CONST(94200.537743658759/8.0), + REAL_CONST(94223.897351242529/8.0), + REAL_CONST(94247.25840672091/8.0), + REAL_CONST(94270.620909914433/8.0), + REAL_CONST(94293.98486064373/8.0), + REAL_CONST(94317.350258729421/8.0), + REAL_CONST(94340.71710399224/8.0), + REAL_CONST(94364.085396252936/8.0), + REAL_CONST(94387.455135332348/8.0), + REAL_CONST(94410.82632105134/8.0), + REAL_CONST(94434.198953230851/8.0), + REAL_CONST(94457.573031691878/8.0), + REAL_CONST(94480.948556255447/8.0), + REAL_CONST(94504.325526742658/8.0), + REAL_CONST(94527.70394297468/8.0), + REAL_CONST(94551.083804772716/8.0), + REAL_CONST(94574.465111958023/8.0), + REAL_CONST(94597.847864351934/8.0), + REAL_CONST(94621.232061775823/8.0), + REAL_CONST(94644.617704051096/8.0), + REAL_CONST(94668.004790999272/8.0), + REAL_CONST(94691.393322441872/8.0), + REAL_CONST(94714.783298200506/8.0), + REAL_CONST(94738.174718096794/8.0), + REAL_CONST(94761.567581952477/8.0), + REAL_CONST(94784.961889589307/8.0), + REAL_CONST(94808.357640829097/8.0), + REAL_CONST(94831.754835493703/8.0), + REAL_CONST(94855.153473405066/8.0), + REAL_CONST(94878.553554385173/8.0), + REAL_CONST(94901.955078256055/8.0), + REAL_CONST(94925.358044839784/8.0), + REAL_CONST(94948.762453958523/8.0), + REAL_CONST(94972.168305434476/8.0), + REAL_CONST(94995.575599089891/8.0), + REAL_CONST(95018.984334747074/8.0), + REAL_CONST(95042.394512228391/8.0), + REAL_CONST(95065.806131356265/8.0), + REAL_CONST(95089.219191953176/8.0), + REAL_CONST(95112.633693841635/8.0), + REAL_CONST(95136.04963684424/8.0), + REAL_CONST(95159.467020783617/8.0), + REAL_CONST(95182.885845482466/8.0), + REAL_CONST(95206.306110763529/8.0), + REAL_CONST(95229.727816449609/8.0), + REAL_CONST(95253.150962363579/8.0), + REAL_CONST(95276.575548328314/8.0), + REAL_CONST(95300.001574166803/8.0), + REAL_CONST(95323.429039702052/8.0), + REAL_CONST(95346.857944757154/8.0), + REAL_CONST(95370.288289155214/8.0), + REAL_CONST(95393.720072719429/8.0), + REAL_CONST(95417.153295273019/8.0), + REAL_CONST(95440.587956639298/8.0), + REAL_CONST(95464.024056641589/8.0), + REAL_CONST(95487.461595103305/8.0), + REAL_CONST(95510.900571847902/8.0), + REAL_CONST(95534.340986698866/8.0), + REAL_CONST(95557.782839479783/8.0), + REAL_CONST(95581.226130014256/8.0), + REAL_CONST(95604.670858125959/8.0), + REAL_CONST(95628.117023638595/8.0), + REAL_CONST(95651.564626375985/8.0), + REAL_CONST(95675.013666161918/8.0), + REAL_CONST(95698.464142820303/8.0), + REAL_CONST(95721.916056175076/8.0), + REAL_CONST(95745.369406050231/8.0), + REAL_CONST(95768.824192269807/8.0), + REAL_CONST(95792.280414657915/8.0), + REAL_CONST(95815.738073038709/8.0), + REAL_CONST(95839.197167236387/8.0), + REAL_CONST(95862.657697075221/8.0), + REAL_CONST(95886.11966237954/8.0), + REAL_CONST(95909.583062973688/8.0), + REAL_CONST(95933.047898682111/8.0), + REAL_CONST(95956.514169329268/8.0), + REAL_CONST(95979.981874739708/8.0), + REAL_CONST(96003.451014738006/8.0), + REAL_CONST(96026.921589148798/8.0), + REAL_CONST(96050.393597796792/8.0), + REAL_CONST(96073.867040506724/8.0), + REAL_CONST(96097.341917103375/8.0), + REAL_CONST(96120.818227411626/8.0), + REAL_CONST(96144.295971256375/8.0), + REAL_CONST(96167.775148462577/8.0), + REAL_CONST(96191.255758855244/8.0), + REAL_CONST(96214.737802259449/8.0), + REAL_CONST(96238.221278500292/8.0), + REAL_CONST(96261.70618740299/8.0), + REAL_CONST(96285.192528792715/8.0), + REAL_CONST(96308.680302494788/8.0), + REAL_CONST(96332.169508334526/8.0), + REAL_CONST(96355.660146137321/8.0), + REAL_CONST(96379.152215728609/8.0), + REAL_CONST(96402.645716933868/8.0), + REAL_CONST(96426.14064957868/8.0), + REAL_CONST(96449.637013488609/8.0), + REAL_CONST(96473.134808489311/8.0), + REAL_CONST(96496.63403440651/8.0), + REAL_CONST(96520.134691065963/8.0), + REAL_CONST(96543.636778293469/8.0), + REAL_CONST(96567.140295914898/8.0), + REAL_CONST(96590.645243756153/8.0), + REAL_CONST(96614.151621643221/8.0), + REAL_CONST(96637.659429402134/8.0), + REAL_CONST(96661.168666858954/8.0), + REAL_CONST(96684.679333839798/8.0), + REAL_CONST(96708.191430170875/8.0), + REAL_CONST(96731.70495567839/8.0), + REAL_CONST(96755.219910188665/8.0), + REAL_CONST(96778.736293528011/8.0), + REAL_CONST(96802.254105522836/8.0), + REAL_CONST(96825.77334599958/8.0), + REAL_CONST(96849.29401478474/8.0), + REAL_CONST(96872.816111704873/8.0), + REAL_CONST(96896.339636586577/8.0), + REAL_CONST(96919.864589256511/8.0), + REAL_CONST(96943.390969541389/8.0), + REAL_CONST(96966.918777267958/8.0), + REAL_CONST(96990.448012263048/8.0), + REAL_CONST(97013.978674353522/8.0), + REAL_CONST(97037.510763366285/8.0), + REAL_CONST(97061.044279128328/8.0), + REAL_CONST(97084.579221466673/8.0), + REAL_CONST(97108.115590208385/8.0), + REAL_CONST(97131.653385180587/8.0), + REAL_CONST(97155.19260621049/8.0), + REAL_CONST(97178.733253125291/8.0), + REAL_CONST(97202.2753257523/8.0), + REAL_CONST(97225.81882391886/8.0), + REAL_CONST(97249.363747452342/8.0), + REAL_CONST(97272.910096180189/8.0), + REAL_CONST(97296.457869929916/8.0), + REAL_CONST(97320.007068529041/8.0), + REAL_CONST(97343.557691805196/8.0), + REAL_CONST(97367.109739586012/8.0), + REAL_CONST(97390.663211699197/8.0), + REAL_CONST(97414.218107972498/8.0), + REAL_CONST(97437.774428233737/8.0), + REAL_CONST(97461.332172310766/8.0), + REAL_CONST(97484.891340031507/8.0), + REAL_CONST(97508.451931223899/8.0), + REAL_CONST(97532.013945715982/8.0), + REAL_CONST(97555.577383335811/8.0), + REAL_CONST(97579.142243911512/8.0), + REAL_CONST(97602.708527271257/8.0), + REAL_CONST(97626.276233243261/8.0), + REAL_CONST(97649.845361655811/8.0), + REAL_CONST(97673.415912337223/8.0), + REAL_CONST(97696.987885115886/8.0), + REAL_CONST(97720.561279820206/8.0), + REAL_CONST(97744.1360962787/8.0), + REAL_CONST(97767.712334319876/8.0), + REAL_CONST(97791.289993772341/8.0), + REAL_CONST(97814.869074464703/8.0), + REAL_CONST(97838.449576225685/8.0), + REAL_CONST(97862.031498883996/8.0), + REAL_CONST(97885.614842268449/8.0), + REAL_CONST(97909.199606207883/8.0), + REAL_CONST(97932.785790531183/8.0), + REAL_CONST(97956.37339506732/8.0), + REAL_CONST(97979.962419645264/8.0), + REAL_CONST(98003.552864094076/8.0), + REAL_CONST(98027.144728242856/8.0), + REAL_CONST(98050.738011920766/8.0), + REAL_CONST(98074.332714956996/8.0), + REAL_CONST(98097.928837180807/8.0), + REAL_CONST(98121.526378421506/8.0), + REAL_CONST(98145.125338508456/8.0), + REAL_CONST(98168.725717271067/8.0), + REAL_CONST(98192.327514538789/8.0), + REAL_CONST(98215.930730141132/8.0), + REAL_CONST(98239.535363907664/8.0), + REAL_CONST(98263.141415668011/8.0), + REAL_CONST(98286.748885251814/8.0), + REAL_CONST(98310.357772488816/8.0), + REAL_CONST(98333.968077208759/8.0), + REAL_CONST(98357.579799241488/8.0), + REAL_CONST(98381.192938416847/8.0), + REAL_CONST(98404.807494564782/8.0), + REAL_CONST(98428.42346751524/8.0), + REAL_CONST(98452.040857098269/8.0), + REAL_CONST(98475.659663143917/8.0), + REAL_CONST(98499.27988548232/8.0), + REAL_CONST(98522.901523943656/8.0), + REAL_CONST(98546.524578358163/8.0), + REAL_CONST(98570.149048556093/8.0), + REAL_CONST(98593.774934367786/8.0), + REAL_CONST(98617.402235623624/8.0), + REAL_CONST(98641.030952154048/8.0), + REAL_CONST(98664.661083789513/8.0), + REAL_CONST(98688.292630360564/8.0), + REAL_CONST(98711.925591697771/8.0), + REAL_CONST(98735.559967631794/8.0), + REAL_CONST(98759.195757993293/8.0), + REAL_CONST(98782.832962613014/8.0), + REAL_CONST(98806.471581321734/8.0), + REAL_CONST(98830.111613950285/8.0), + REAL_CONST(98853.753060329575/8.0), + REAL_CONST(98877.39592029051/8.0), + REAL_CONST(98901.040193664099/8.0), + REAL_CONST(98924.68588028138/8.0), + REAL_CONST(98948.33297997342/8.0), + REAL_CONST(98971.981492571387/8.0), + REAL_CONST(98995.63141790645/8.0), + REAL_CONST(99019.282755809851/8.0), + REAL_CONST(99042.935506112874/8.0), + REAL_CONST(99066.589668646877/8.0), + REAL_CONST(99090.245243243233/8.0), + REAL_CONST(99113.902229733401/8.0), + REAL_CONST(99137.560627948857/8.0), + REAL_CONST(99161.220437721131/8.0), + REAL_CONST(99184.881658881859/8.0), + REAL_CONST(99208.544291262631/8.0), + REAL_CONST(99232.208334695169/8.0), + REAL_CONST(99255.87378901121/8.0), + REAL_CONST(99279.540654042547/8.0), + REAL_CONST(99303.208929621018/8.0), + REAL_CONST(99326.878615578535/8.0), + REAL_CONST(99350.549711746993/8.0), + REAL_CONST(99374.222217958435/8.0), + REAL_CONST(99397.896134044888/8.0), + REAL_CONST(99421.571459838422/8.0), + REAL_CONST(99445.248195171211/8.0), + REAL_CONST(99468.926339875441/8.0), + REAL_CONST(99492.605893783344/8.0), + REAL_CONST(99516.286856727209/8.0), + REAL_CONST(99539.969228539398/8.0), + REAL_CONST(99563.653009052287/8.0), + REAL_CONST(99587.338198098325/8.0), + REAL_CONST(99611.024795510006/8.0), + REAL_CONST(99634.712801119866/8.0), + REAL_CONST(99658.402214760499/8.0), + REAL_CONST(99682.093036264545/8.0), + REAL_CONST(99705.785265464699/8.0), + REAL_CONST(99729.478902193689/8.0), + REAL_CONST(99753.173946284325/8.0), + REAL_CONST(99776.870397569437/8.0), + REAL_CONST(99800.56825588191/8.0), + REAL_CONST(99824.267521054688/8.0), + REAL_CONST(99847.968192920773/8.0), + REAL_CONST(99871.670271313182/8.0), + REAL_CONST(99895.373756065004/8.0), + REAL_CONST(99919.078647009388/8.0), + REAL_CONST(99942.78494397951/8.0), + REAL_CONST(99966.492646808634/8.0), + REAL_CONST(99990.20175533001/8.0), + REAL_CONST(100013.91226937699/8.0), + REAL_CONST(100037.62418878295/8.0), + REAL_CONST(100061.33751338134/8.0), + REAL_CONST(100085.05224300563/8.0), + REAL_CONST(100108.76837748935/8.0), + REAL_CONST(100132.4859166661/8.0), + REAL_CONST(100156.2048603695/8.0), + REAL_CONST(100179.92520843323/8.0), + REAL_CONST(100203.64696069101/8.0), + REAL_CONST(100227.37011697664/8.0), + REAL_CONST(100251.09467712394/8.0), + REAL_CONST(100274.82064096678/8.0), + REAL_CONST(100298.54800833909/8.0), + REAL_CONST(100322.27677907483/8.0), + REAL_CONST(100346.00695300807/8.0), + REAL_CONST(100369.73852997283/8.0), + REAL_CONST(100393.47150980328/8.0), + REAL_CONST(100417.20589233354/8.0), + REAL_CONST(100440.94167739789/8.0), + REAL_CONST(100464.67886483055/8.0), + REAL_CONST(100488.41745446586/8.0), + REAL_CONST(100512.1574461382/8.0), + REAL_CONST(100535.89883968196/8.0), + REAL_CONST(100559.64163493161/8.0), + REAL_CONST(100583.38583172169/8.0), + REAL_CONST(100607.13142988674/8.0), + REAL_CONST(100630.87842926137/8.0), + REAL_CONST(100654.62682968024/8.0), + REAL_CONST(100678.37663097809/8.0), + REAL_CONST(100702.12783298964/8.0), + REAL_CONST(100725.88043554971/8.0), + REAL_CONST(100749.63443849317/8.0), + REAL_CONST(100773.38984165489/8.0), + REAL_CONST(100797.14664486986/8.0), + REAL_CONST(100820.90484797307/8.0), + REAL_CONST(100844.66445079957/8.0), + REAL_CONST(100868.42545318443/8.0), + REAL_CONST(100892.18785496285/8.0), + REAL_CONST(100915.95165596998/8.0), + REAL_CONST(100939.71685604109/8.0), + REAL_CONST(100963.48345501146/8.0), + REAL_CONST(100987.25145271645/8.0), + REAL_CONST(101011.02084899142/8.0), + REAL_CONST(101034.79164367182/8.0), + REAL_CONST(101058.56383659317/8.0), + REAL_CONST(101082.33742759094/8.0), + REAL_CONST(101106.11241650078/8.0), + REAL_CONST(101129.88880315828/8.0), + REAL_CONST(101153.66658739912/8.0), + REAL_CONST(101177.44576905905/8.0), + REAL_CONST(101201.22634797383/8.0), + REAL_CONST(101225.00832397929/8.0), + REAL_CONST(101248.7916969113/8.0), + REAL_CONST(101272.57646660579/8.0), + REAL_CONST(101296.36263289873/8.0), + REAL_CONST(101320.15019562612/8.0), + REAL_CONST(101343.93915462404/8.0), + REAL_CONST(101367.7295097286/8.0), + REAL_CONST(101391.52126077596/8.0), + REAL_CONST(101415.31440760233/8.0), + REAL_CONST(101439.10895004397/8.0), + REAL_CONST(101462.9048879372/8.0), + REAL_CONST(101486.70222111834/8.0), + REAL_CONST(101510.50094942382/8.0), + REAL_CONST(101534.30107269008/8.0), + REAL_CONST(101558.10259075361/8.0), + REAL_CONST(101581.90550345098/8.0), + REAL_CONST(101605.70981061876/8.0), + REAL_CONST(101629.5155120936/8.0), + REAL_CONST(101653.32260771218/8.0), + REAL_CONST(101677.13109731126/8.0), + REAL_CONST(101700.9409807276/8.0), + REAL_CONST(101724.75225779804/8.0), + REAL_CONST(101748.56492835947/8.0), + REAL_CONST(101772.37899224881/8.0), + REAL_CONST(101796.19444930303/8.0), + REAL_CONST(101820.01129935916/8.0), + REAL_CONST(101843.82954225427/8.0), + REAL_CONST(101867.64917782549/8.0), + REAL_CONST(101891.47020590997/8.0), + REAL_CONST(101915.29262634492/8.0), + REAL_CONST(101939.11643896763/8.0), + REAL_CONST(101962.94164361537/8.0), + REAL_CONST(101986.76824012553/8.0), + REAL_CONST(102010.59622833549/8.0), + REAL_CONST(102034.42560808272/8.0), + REAL_CONST(102058.25637920471/8.0), + REAL_CONST(102082.08854153901/8.0), + REAL_CONST(102105.9220949232/8.0), + REAL_CONST(102129.75703919494/8.0), + REAL_CONST(102153.59337419191/8.0), + REAL_CONST(102177.43109975185/8.0), + REAL_CONST(102201.27021571253/8.0), + REAL_CONST(102225.1107219118/8.0), + REAL_CONST(102248.95261818753/8.0), + REAL_CONST(102272.79590437764/8.0), + REAL_CONST(102296.64058032009/8.0), + REAL_CONST(102320.48664585294/8.0), + REAL_CONST(102344.33410081422/8.0), + REAL_CONST(102368.18294504205/8.0), + REAL_CONST(102392.03317837461/8.0), + REAL_CONST(102415.88480065008/8.0), + REAL_CONST(102439.73781170673/8.0), + REAL_CONST(102463.59221138287/8.0), + REAL_CONST(102487.44799951684/8.0), + REAL_CONST(102511.30517594704/8.0), + REAL_CONST(102535.1637405119/8.0), + REAL_CONST(102559.02369304992/8.0), + REAL_CONST(102582.88503339965/8.0), + REAL_CONST(102606.74776139967/8.0), + REAL_CONST(102630.61187688859/8.0), + REAL_CONST(102654.4773797051/8.0), + REAL_CONST(102678.34426968795/8.0), + REAL_CONST(102702.21254667587/8.0), + REAL_CONST(102726.08221050771/8.0), + REAL_CONST(102749.95326102231/8.0), + REAL_CONST(102773.8256980586/8.0), + REAL_CONST(102797.69952145554/8.0), + REAL_CONST(102821.57473105213/8.0), + REAL_CONST(102845.45132668741/8.0), + REAL_CONST(102869.32930820051/8.0), + REAL_CONST(102893.20867543056/8.0), + REAL_CONST(102917.08942821674/8.0), + REAL_CONST(102940.97156639832/8.0), + REAL_CONST(102964.85508981455/8.0), + REAL_CONST(102988.73999830478/8.0), + REAL_CONST(103012.6262917084/8.0), + REAL_CONST(103036.51396986481/8.0), + REAL_CONST(103060.40303261351/8.0), + REAL_CONST(103084.293479794/8.0), + REAL_CONST(103108.18531124585/8.0), + REAL_CONST(103132.07852680866/8.0), + REAL_CONST(103155.97312632212/8.0), + REAL_CONST(103179.8691096259/8.0), + REAL_CONST(103203.76647655977/8.0), + REAL_CONST(103227.66522696352/8.0), + REAL_CONST(103251.56536067701/8.0), + REAL_CONST(103275.46687754011/8.0), + REAL_CONST(103299.36977739276/8.0), + REAL_CONST(103323.27406007495/8.0), + REAL_CONST(103347.1797254267/8.0), + REAL_CONST(103371.0867732881/8.0), + REAL_CONST(103394.99520349925/8.0), + REAL_CONST(103418.90501590034/8.0), + REAL_CONST(103442.81621033157/8.0), + REAL_CONST(103466.72878663319/8.0), + REAL_CONST(103490.64274464553/8.0), + REAL_CONST(103514.55808420894/8.0), + REAL_CONST(103538.4748051638/8.0), + REAL_CONST(103562.39290735057/8.0), + REAL_CONST(103586.31239060973/8.0), + REAL_CONST(103610.23325478184/8.0), + REAL_CONST(103634.15549970744/8.0), + REAL_CONST(103658.07912522719/8.0), + REAL_CONST(103682.00413118176/8.0), + REAL_CONST(103705.93051741188/8.0), + REAL_CONST(103729.85828375829/8.0), + REAL_CONST(103753.78743006183/8.0), + REAL_CONST(103777.71795616332/8.0), + REAL_CONST(103801.64986190372/8.0), + REAL_CONST(103825.58314712394/8.0), + REAL_CONST(103849.51781166498/8.0), + REAL_CONST(103873.4538553679/8.0), + REAL_CONST(103897.39127807376/8.0), + REAL_CONST(103921.33007962372/8.0), + REAL_CONST(103945.27025985894/8.0), + REAL_CONST(103969.21181862066/8.0), + REAL_CONST(103993.15475575015/8.0), + REAL_CONST(104017.0990710887/8.0), + REAL_CONST(104041.0447644777/8.0), + REAL_CONST(104064.99183575854/8.0), + REAL_CONST(104088.94028477269/8.0), + REAL_CONST(104112.89011136163/8.0), + REAL_CONST(104136.84131536692/8.0), + REAL_CONST(104160.79389663014/8.0), + REAL_CONST(104184.74785499295/8.0), + REAL_CONST(104208.70319029699/8.0), + REAL_CONST(104232.65990238401/8.0), + REAL_CONST(104256.61799109577/8.0), + REAL_CONST(104280.57745627411/8.0), + REAL_CONST(104304.53829776087/8.0), + REAL_CONST(104328.50051539797/8.0), + REAL_CONST(104352.46410902737/8.0), + REAL_CONST(104376.42907849104/8.0), + REAL_CONST(104400.39542363105/8.0), + REAL_CONST(104424.36314428948/8.0), + REAL_CONST(104448.33224030846/8.0), + REAL_CONST(104472.3027115302/8.0), + REAL_CONST(104496.27455779689/8.0), + REAL_CONST(104520.24777895081/8.0), + REAL_CONST(104544.22237483428/8.0), + REAL_CONST(104568.19834528965/8.0), + REAL_CONST(104592.17569015936/8.0), + REAL_CONST(104616.15440928582/8.0), + REAL_CONST(104640.13450251156/8.0), + REAL_CONST(104664.1159696791/8.0), + REAL_CONST(104688.09881063103/8.0), + REAL_CONST(104712.08302520998/8.0), + REAL_CONST(104736.06861325864/8.0), + REAL_CONST(104760.05557461972/8.0), + REAL_CONST(104784.043909136/8.0), + REAL_CONST(104808.03361665027/8.0), + REAL_CONST(104832.0246970054/8.0), + REAL_CONST(104856.01715004431/8.0), + REAL_CONST(104880.01097560991/8.0), + REAL_CONST(104904.00617354522/8.0), + REAL_CONST(104928.00274369326/8.0), + REAL_CONST(104952.00068589712/8.0), + REAL_CONST(104975.99999999993/8.0), + REAL_CONST(105000.00068584486/8.0), + REAL_CONST(105024.00274327511/8.0), + REAL_CONST(105048.00617213396/8.0), + REAL_CONST(105072.0109722647/8.0), + REAL_CONST(105096.0171435107/8.0), + REAL_CONST(105120.02468571534/8.0), + REAL_CONST(105144.03359872208/8.0), + REAL_CONST(105168.04388237436/8.0), + REAL_CONST(105192.05553651576/8.0), + REAL_CONST(105216.06856098982/8.0), + REAL_CONST(105240.08295564017/8.0), + REAL_CONST(105264.09872031047/8.0), + REAL_CONST(105288.11585484444/8.0), + REAL_CONST(105312.13435908582/8.0), + REAL_CONST(105336.1542328784/8.0), + REAL_CONST(105360.17547606604/8.0), + REAL_CONST(105384.19808849262/8.0), + REAL_CONST(105408.22207000206/8.0), + REAL_CONST(105432.24742043833/8.0), + REAL_CONST(105456.27413964548/8.0), + REAL_CONST(105480.30222746753/8.0), + REAL_CONST(105504.33168374863/8.0), + REAL_CONST(105528.36250833291/8.0), + REAL_CONST(105552.39470106458/8.0), + REAL_CONST(105576.42826178786/8.0), + REAL_CONST(105600.46319034706/8.0), + REAL_CONST(105624.49948658649/8.0), + REAL_CONST(105648.53715035053/8.0), + REAL_CONST(105672.5761814836/8.0), + REAL_CONST(105696.61657983017/8.0), + REAL_CONST(105720.65834523473/8.0), + REAL_CONST(105744.70147754184/8.0), + REAL_CONST(105768.7459765961/8.0), + REAL_CONST(105792.79184224214/8.0), + REAL_CONST(105816.83907432464/8.0), + REAL_CONST(105840.88767268835/8.0), + REAL_CONST(105864.93763717801/8.0), + REAL_CONST(105888.98896763846/8.0), + REAL_CONST(105913.04166391456/8.0), + REAL_CONST(105937.09572585119/8.0), + REAL_CONST(105961.15115329332/8.0), + REAL_CONST(105985.20794608595/8.0), + REAL_CONST(106009.26610407409/8.0), + REAL_CONST(106033.32562710284/8.0), + REAL_CONST(106057.38651501729/8.0), + REAL_CONST(106081.44876766266/8.0), + REAL_CONST(106105.51238488412/8.0), + REAL_CONST(106129.57736652695/8.0), + REAL_CONST(106153.64371243643/8.0), + REAL_CONST(106177.71142245791/8.0), + REAL_CONST(106201.78049643678/8.0), + REAL_CONST(106225.85093421848/8.0), + REAL_CONST(106249.92273564848/8.0), + REAL_CONST(106273.99590057228/8.0), + REAL_CONST(106298.07042883546/8.0), + REAL_CONST(106322.14632028362/8.0), + REAL_CONST(106346.22357476239/8.0), + REAL_CONST(106370.30219211751/8.0), + REAL_CONST(106394.38217219469/8.0), + REAL_CONST(106418.46351483969/8.0), + REAL_CONST(106442.54621989837/8.0), + REAL_CONST(106466.63028721658/8.0), + REAL_CONST(106490.71571664025/8.0), + REAL_CONST(106514.80250801529/8.0), + REAL_CONST(106538.89066118775/8.0), + REAL_CONST(106562.98017600364/8.0), + REAL_CONST(106587.07105230905/8.0), + REAL_CONST(106611.16328995011/8.0), + REAL_CONST(106635.25688877302/8.0), + REAL_CONST(106659.35184862395/8.0), + REAL_CONST(106683.44816934918/8.0), + REAL_CONST(106707.54585079502/8.0), + REAL_CONST(106731.64489280782/8.0), + REAL_CONST(106755.74529523395/8.0), + REAL_CONST(106779.84705791986/8.0), + REAL_CONST(106803.95018071201/8.0), + REAL_CONST(106828.05466345693/8.0), + REAL_CONST(106852.16050600118/8.0), + REAL_CONST(106876.26770819137/8.0), + REAL_CONST(106900.37626987413/8.0), + REAL_CONST(106924.48619089619/8.0), + REAL_CONST(106948.59747110425/8.0), + REAL_CONST(106972.71011034511/8.0), + REAL_CONST(106996.82410846559/8.0), + REAL_CONST(107020.93946531253/8.0), + REAL_CONST(107045.05618073288/8.0), + REAL_CONST(107069.17425457356/8.0), + REAL_CONST(107093.29368668159/8.0), + REAL_CONST(107117.41447690397/8.0), + REAL_CONST(107141.53662508781/8.0), + REAL_CONST(107165.66013108024/8.0), + REAL_CONST(107189.7849947284/8.0), + REAL_CONST(107213.91121587952/8.0), + REAL_CONST(107238.03879438085/8.0), + REAL_CONST(107262.16773007967/8.0), + REAL_CONST(107286.29802282334/8.0), + REAL_CONST(107310.42967245923/8.0), + REAL_CONST(107334.56267883476/8.0), + REAL_CONST(107358.69704179741/8.0), + REAL_CONST(107382.83276119467/8.0), + REAL_CONST(107406.96983687414/8.0), + REAL_CONST(107431.10826868335/8.0), + REAL_CONST(107455.24805646999/8.0), + REAL_CONST(107479.38920008171/8.0), + REAL_CONST(107503.53169936626/8.0), + REAL_CONST(107527.67555417139/8.0), + REAL_CONST(107551.82076434491/8.0), + REAL_CONST(107575.96732973469/8.0), + REAL_CONST(107600.11525018861/8.0), + REAL_CONST(107624.26452555459/8.0), + REAL_CONST(107648.41515568066/8.0), + REAL_CONST(107672.56714041479/8.0), + REAL_CONST(107696.72047960508/8.0), + REAL_CONST(107720.87517309963/8.0), + REAL_CONST(107745.03122074658/8.0), + REAL_CONST(107769.18862239413/8.0), + REAL_CONST(107793.34737789053/8.0), + REAL_CONST(107817.50748708403/8.0), + REAL_CONST(107841.66894982298/8.0), + REAL_CONST(107865.83176595572/8.0), + REAL_CONST(107889.99593533068/8.0), + REAL_CONST(107914.16145779629/8.0), + REAL_CONST(107938.32833320105/8.0), + REAL_CONST(107962.49656139348/8.0), + REAL_CONST(107986.66614222217/8.0), + REAL_CONST(108010.83707553572/8.0), + REAL_CONST(108035.00936118282/8.0), + REAL_CONST(108059.18299901215/8.0), + REAL_CONST(108083.35798887245/8.0), + REAL_CONST(108107.53433061253/8.0), + REAL_CONST(108131.71202408121/8.0), + REAL_CONST(108155.89106912735/8.0), + REAL_CONST(108180.07146559987/8.0), + REAL_CONST(108204.25321334775/8.0), + REAL_CONST(108228.43631221994/8.0), + REAL_CONST(108252.62076206553/8.0), + REAL_CONST(108276.80656273357/8.0), + REAL_CONST(108300.99371407321/8.0), + REAL_CONST(108325.18221593359/8.0), + REAL_CONST(108349.37206816394/8.0), + REAL_CONST(108373.56327061349/8.0), + REAL_CONST(108397.75582313156/8.0), + REAL_CONST(108421.94972556747/8.0), + REAL_CONST(108446.1449777706/8.0), + REAL_CONST(108470.34157959036/8.0), + REAL_CONST(108494.53953087622/8.0), + REAL_CONST(108518.73883147769/8.0), + REAL_CONST(108542.93948124432/8.0), + REAL_CONST(108567.14148002568/8.0), + REAL_CONST(108591.34482767139/8.0), + REAL_CONST(108615.54952403114/8.0), + REAL_CONST(108639.75556895464/8.0), + REAL_CONST(108663.96296229165/8.0), + REAL_CONST(108688.17170389196/8.0), + REAL_CONST(108712.38179360541/8.0), + REAL_CONST(108736.59323128188/8.0), + REAL_CONST(108760.80601677128/8.0), + REAL_CONST(108785.02014992358/8.0), + REAL_CONST(108809.23563058881/8.0), + REAL_CONST(108833.45245861699/8.0), + REAL_CONST(108857.67063385822/8.0), + REAL_CONST(108881.89015616261/8.0), + REAL_CONST(108906.11102538036/8.0), + REAL_CONST(108930.33324136167/8.0), + REAL_CONST(108954.55680395682/8.0), + REAL_CONST(108978.78171301607/8.0), + REAL_CONST(109003.00796838976/8.0), + REAL_CONST(109027.23556992831/8.0), + REAL_CONST(109051.46451748211/8.0), + REAL_CONST(109075.69481090162/8.0), + REAL_CONST(109099.92645003737/8.0), + REAL_CONST(109124.15943473989/8.0), + REAL_CONST(109148.39376485976/8.0), + REAL_CONST(109172.62944024763/8.0), + REAL_CONST(109196.86646075416/8.0), + REAL_CONST(109221.10482623006/8.0), + REAL_CONST(109245.34453652608/8.0), + REAL_CONST(109269.58559149304/8.0), + REAL_CONST(109293.82799098175/8.0), + REAL_CONST(109318.07173484311/8.0), + REAL_CONST(109342.31682292801/8.0), + REAL_CONST(109366.56325508743/8.0), + REAL_CONST(109390.81103117237/8.0), + REAL_CONST(109415.06015103387/8.0), + REAL_CONST(109439.31061452301/8.0), + REAL_CONST(109463.56242149093/8.0), + REAL_CONST(109487.8155717888/8.0), + REAL_CONST(109512.07006526781/8.0), + REAL_CONST(109536.3259017792/8.0), + REAL_CONST(109560.58308117429/8.0), + REAL_CONST(109584.8416033044/8.0), + REAL_CONST(109609.1014680209/8.0), + REAL_CONST(109633.36267517522/8.0), + REAL_CONST(109657.62522461878/8.0), + REAL_CONST(109681.88911620311/8.0), + REAL_CONST(109706.15434977971/8.0), + REAL_CONST(109730.4209252002/8.0), + REAL_CONST(109754.68884231619/8.0), + REAL_CONST(109778.95810097932/8.0), + REAL_CONST(109803.22870104131/8.0), + REAL_CONST(109827.50064235389/8.0), + REAL_CONST(109851.77392476884/8.0), + REAL_CONST(109876.04854813802/8.0), + REAL_CONST(109900.32451231324/8.0), + REAL_CONST(109924.60181714644/8.0), + REAL_CONST(109948.88046248957/8.0), + REAL_CONST(109973.1604481946/8.0), + REAL_CONST(109997.44177411357/8.0), + REAL_CONST(110021.72444009855/8.0), + REAL_CONST(110046.00844600165/8.0), + REAL_CONST(110070.29379167501/8.0), + REAL_CONST(110094.58047697082/8.0), + REAL_CONST(110118.86850174134/8.0), + REAL_CONST(110143.15786583882/8.0), + REAL_CONST(110167.44856911557/8.0), + REAL_CONST(110191.74061142397/8.0), + REAL_CONST(110216.03399261639/8.0), + REAL_CONST(110240.32871254528/8.0), + REAL_CONST(110264.62477106311/8.0), + REAL_CONST(110288.9221680224/8.0), + REAL_CONST(110313.22090327571/8.0), + REAL_CONST(110337.52097667565/8.0), + REAL_CONST(110361.82238807483/8.0), + REAL_CONST(110386.12513732594/8.0), + REAL_CONST(110410.42922428172/8.0), + REAL_CONST(110434.73464879491/8.0), + REAL_CONST(110459.04141071832/8.0), + REAL_CONST(110483.34950990479/8.0), + REAL_CONST(110507.6589462072/8.0), + REAL_CONST(110531.96971947847/8.0), + REAL_CONST(110556.28182957157/8.0), + REAL_CONST(110580.5952763395/8.0), + REAL_CONST(110604.91005963532/8.0), + REAL_CONST(110629.22617931209/8.0), + REAL_CONST(110653.54363522294/8.0), + REAL_CONST(110677.86242722106/8.0), + REAL_CONST(110702.18255515963/8.0), + REAL_CONST(110726.50401889188/8.0), + REAL_CONST(110750.82681827113/8.0), + REAL_CONST(110775.1509531507/8.0), + REAL_CONST(110799.47642338395/8.0), + REAL_CONST(110823.80322882428/8.0), + REAL_CONST(110848.13136932514/8.0), + REAL_CONST(110872.46084474004/8.0), + REAL_CONST(110896.79165492248/8.0), + REAL_CONST(110921.12379972603/8.0), + REAL_CONST(110945.4572790043/8.0), + REAL_CONST(110969.79209261097/8.0), + REAL_CONST(110994.12824039967/8.0), + REAL_CONST(111018.46572222417/8.0), + REAL_CONST(111042.80453793822/8.0), + REAL_CONST(111067.14468739564/8.0), + REAL_CONST(111091.48617045028/8.0), + REAL_CONST(111115.82898695602/8.0), + REAL_CONST(111140.1731367668/8.0), + REAL_CONST(111164.51861973655/8.0), + REAL_CONST(111188.86543571933/8.0), + REAL_CONST(111213.21358456917/8.0), + REAL_CONST(111237.56306614014/8.0), + REAL_CONST(111261.91388028639/8.0), + REAL_CONST(111286.26602686207/8.0), + REAL_CONST(111310.61950572141/8.0), + REAL_CONST(111334.97431671864/8.0), + REAL_CONST(111359.33045970804/8.0), + REAL_CONST(111383.68793454397/8.0), + REAL_CONST(111408.04674108078/8.0), + REAL_CONST(111432.40687917286/8.0), + REAL_CONST(111456.76834867468/8.0), + REAL_CONST(111481.13114944073/8.0), + REAL_CONST(111505.49528132551/8.0), + REAL_CONST(111529.86074418361/8.0), + REAL_CONST(111554.22753786964/8.0), + REAL_CONST(111578.59566223821/8.0), + REAL_CONST(111602.96511714405/8.0), + REAL_CONST(111627.33590244185/8.0), + REAL_CONST(111651.7080179864/8.0), + REAL_CONST(111676.08146363248/8.0), + REAL_CONST(111700.45623923496/8.0), + REAL_CONST(111724.8323446487/8.0), + REAL_CONST(111749.20977972864/8.0), + REAL_CONST(111773.58854432974/8.0), + REAL_CONST(111797.96863830699/8.0), + REAL_CONST(111822.35006151545/8.0), + REAL_CONST(111846.73281381019/8.0), + REAL_CONST(111871.11689504632/8.0), + REAL_CONST(111895.50230507903/8.0), + REAL_CONST(111919.8890437635/8.0), + REAL_CONST(111944.27711095495/8.0), + REAL_CONST(111968.6665065087/8.0), + REAL_CONST(111993.05723028004/8.0), + REAL_CONST(112017.44928212435/8.0), + REAL_CONST(112041.842661897/8.0), + REAL_CONST(112066.23736945343/8.0), + REAL_CONST(112090.63340464912/8.0), + REAL_CONST(112115.03076733962/8.0), + REAL_CONST(112139.42945738042/8.0), + REAL_CONST(112163.82947462716/8.0), + REAL_CONST(112188.23081893545/8.0), + REAL_CONST(112212.63349016097/8.0), + REAL_CONST(112237.03748815943/8.0), + REAL_CONST(112261.44281278658/8.0), + REAL_CONST(112285.84946389822/8.0), + REAL_CONST(112310.25744135017/8.0), + REAL_CONST(112334.66674499828/8.0), + REAL_CONST(112359.07737469849/8.0), + REAL_CONST(112383.48933030672/8.0), + REAL_CONST(112407.90261167898/8.0), + REAL_CONST(112432.31721867126/8.0), + REAL_CONST(112456.73315113965/8.0), + REAL_CONST(112481.15040894024/8.0), + REAL_CONST(112505.56899192919/8.0), + REAL_CONST(112529.98889996267/8.0), + REAL_CONST(112554.41013289688/8.0), + REAL_CONST(112578.8326905881/8.0), + REAL_CONST(112603.25657289263/8.0), + REAL_CONST(112627.68177966679/8.0), + REAL_CONST(112652.10831076698/8.0), + REAL_CONST(112676.53616604958/8.0), + REAL_CONST(112700.96534537108/8.0), + REAL_CONST(112725.39584858794/8.0), + REAL_CONST(112749.82767555672/8.0), + REAL_CONST(112774.26082613398/8.0), + REAL_CONST(112798.6953001763/8.0), + REAL_CONST(112823.13109754038/8.0), + REAL_CONST(112847.56821808286/8.0), + REAL_CONST(112872.00666166049/8.0), + REAL_CONST(112896.44642813003/8.0), + REAL_CONST(112920.88751734827/8.0), + REAL_CONST(112945.32992917208/8.0), + REAL_CONST(112969.77366345831/8.0), + REAL_CONST(112994.21872006389/8.0), + REAL_CONST(113018.66509884578/8.0), + REAL_CONST(113043.11279966099/8.0), + REAL_CONST(113067.56182236652/8.0), + REAL_CONST(113092.01216681948/8.0), + REAL_CONST(113116.46383287695/8.0), + REAL_CONST(113140.9168203961/8.0), + REAL_CONST(113165.37112923413/8.0), + REAL_CONST(113189.82675924824/8.0), + REAL_CONST(113214.28371029573/8.0), + REAL_CONST(113238.74198223387/8.0), + REAL_CONST(113263.20157492002/8.0), + REAL_CONST(113287.66248821157/8.0), + REAL_CONST(113312.12472196593/8.0), + REAL_CONST(113336.58827604055/8.0), + REAL_CONST(113361.05315029295/8.0), + REAL_CONST(113385.51934458067/8.0), + REAL_CONST(113409.98685876124/8.0), + REAL_CONST(113434.45569269233/8.0), + REAL_CONST(113458.92584623155/8.0), + REAL_CONST(113483.39731923661/8.0), + REAL_CONST(113507.87011156522/8.0), + REAL_CONST(113532.34422307517/8.0), + REAL_CONST(113556.81965362425/8.0), + REAL_CONST(113581.2964030703/8.0), + REAL_CONST(113605.77447127122/8.0), + REAL_CONST(113630.25385808491/8.0), + REAL_CONST(113654.73456336933/8.0), + REAL_CONST(113679.2165869825/8.0), + REAL_CONST(113703.69992878241/8.0), + REAL_CONST(113728.18458862718/8.0), + REAL_CONST(113752.67056637487/8.0), + REAL_CONST(113777.15786188368/8.0), + REAL_CONST(113801.64647501177/8.0), + REAL_CONST(113826.13640561736/8.0), + REAL_CONST(113850.62765355874/8.0), + REAL_CONST(113875.12021869418/8.0), + REAL_CONST(113899.61410088204/8.0), + REAL_CONST(113924.1092999807/8.0), + REAL_CONST(113948.60581584855/8.0), + REAL_CONST(113973.10364834407/8.0), + REAL_CONST(113997.60279732574/8.0), + REAL_CONST(114022.1032626521/8.0), + REAL_CONST(114046.60504418171/8.0), + REAL_CONST(114071.10814177318/8.0), + REAL_CONST(114095.61255528514/8.0), + REAL_CONST(114120.11828457628/8.0), + REAL_CONST(114144.62532950533/8.0), + REAL_CONST(114169.13368993104/8.0), + REAL_CONST(114193.6433657122/8.0), + REAL_CONST(114218.15435670764/8.0), + REAL_CONST(114242.66666277625/8.0), + REAL_CONST(114267.18028377694/8.0), + REAL_CONST(114291.69521956862/8.0), + REAL_CONST(114316.21147001031/8.0), + REAL_CONST(114340.72903496103/8.0), + REAL_CONST(114365.24791427983/8.0), + REAL_CONST(114389.7681078258/8.0), + REAL_CONST(114414.2896154581/8.0), + REAL_CONST(114438.81243703589/8.0), + REAL_CONST(114463.33657241837/8.0), + REAL_CONST(114487.8620214648/8.0), + REAL_CONST(114512.38878403447/8.0), + REAL_CONST(114536.91685998671/8.0), + REAL_CONST(114561.44624918087/8.0), + REAL_CONST(114585.97695147636/8.0), + REAL_CONST(114610.5089667326/8.0), + REAL_CONST(114635.04229480909/8.0), + REAL_CONST(114659.57693556532/8.0), + REAL_CONST(114684.11288886084/8.0), + REAL_CONST(114708.65015455526/8.0), + REAL_CONST(114733.18873250818/8.0), + REAL_CONST(114757.72862257928/8.0), + REAL_CONST(114782.26982462825/8.0), + REAL_CONST(114806.81233851484/8.0), + REAL_CONST(114831.35616409882/8.0), + REAL_CONST(114855.90130123998/8.0), + REAL_CONST(114880.44774979822/8.0), + REAL_CONST(114904.99550963337/8.0), + REAL_CONST(114929.5445806054/8.0), + REAL_CONST(114954.09496257425/8.0), + REAL_CONST(114978.64665539992/8.0), + REAL_CONST(115003.19965894247/8.0), + REAL_CONST(115027.75397306195/8.0), + REAL_CONST(115052.30959761847/8.0), + REAL_CONST(115076.86653247218/8.0), + REAL_CONST(115101.42477748329/8.0), + REAL_CONST(115125.984332512/8.0), + REAL_CONST(115150.54519741859/8.0), + REAL_CONST(115175.10737206334/8.0), + REAL_CONST(115199.67085630659/8.0), + REAL_CONST(115224.23565000873/8.0), + REAL_CONST(115248.80175303014/8.0), + REAL_CONST(115273.3691652313/8.0), + REAL_CONST(115297.93788647266/8.0), + REAL_CONST(115322.50791661476/8.0), + REAL_CONST(115347.07925551817/8.0), + REAL_CONST(115371.65190304347/8.0), + REAL_CONST(115396.22585905129/8.0), + REAL_CONST(115420.80112340231/8.0), + REAL_CONST(115445.37769595724/8.0), + REAL_CONST(115469.95557657682/8.0), + REAL_CONST(115494.53476512182/8.0), + REAL_CONST(115519.11526145306/8.0), + REAL_CONST(115543.69706543141/8.0), + REAL_CONST(115568.28017691776/8.0), + REAL_CONST(115592.86459577303/8.0), + REAL_CONST(115617.4503218582/8.0), + REAL_CONST(115642.03735503425/8.0), + REAL_CONST(115666.62569516223/8.0), + REAL_CONST(115691.21534210323/8.0), + REAL_CONST(115715.80629571836/8.0), + REAL_CONST(115740.39855586876/8.0), + REAL_CONST(115764.99212241563/8.0), + REAL_CONST(115789.58699522018/8.0), + REAL_CONST(115814.18317414368/8.0), + REAL_CONST(115838.78065904744/8.0), + REAL_CONST(115863.37944979276/8.0), + REAL_CONST(115887.97954624105/8.0), + REAL_CONST(115912.5809482537/8.0), + REAL_CONST(115937.18365569216/8.0), + REAL_CONST(115961.78766841792/8.0), + REAL_CONST(115986.39298629249/8.0), + REAL_CONST(116010.99960917742/8.0), + REAL_CONST(116035.60753693432/8.0), + REAL_CONST(116060.21676942479/8.0), + REAL_CONST(116084.82730651053/8.0), + REAL_CONST(116109.43914805322/8.0), + REAL_CONST(116134.0522939146/8.0), + REAL_CONST(116158.66674395646/8.0), + REAL_CONST(116183.2824980406/8.0), + REAL_CONST(116207.89955602887/8.0), + REAL_CONST(116232.51791778316/8.0), + REAL_CONST(116257.13758316539/8.0), + REAL_CONST(116281.75855203751/8.0), + REAL_CONST(116306.38082426153/8.0), + REAL_CONST(116331.00439969949/8.0), + REAL_CONST(116355.62927821343/8.0), + REAL_CONST(116380.25545966547/8.0), + REAL_CONST(116404.88294391775/8.0), + REAL_CONST(116429.51173083246/8.0), + REAL_CONST(116454.14182027178/8.0), + REAL_CONST(116478.77321209799/8.0), + REAL_CONST(116503.40590617337/8.0), + REAL_CONST(116528.03990236025/8.0), + REAL_CONST(116552.67520052097/8.0), + REAL_CONST(116577.31180051794/8.0), + REAL_CONST(116601.94970221359/8.0), + REAL_CONST(116626.5889054704/8.0), + REAL_CONST(116651.22941015086/8.0), + REAL_CONST(116675.87121611751/8.0), + REAL_CONST(116700.51432323294/8.0), + REAL_CONST(116725.15873135976/8.0), + REAL_CONST(116749.8044403606/8.0), + REAL_CONST(116774.45145009817/8.0), + REAL_CONST(116799.0997604352/8.0), + REAL_CONST(116823.74937123443/8.0), + REAL_CONST(116848.40028235866/8.0), + REAL_CONST(116873.05249367072/8.0), + REAL_CONST(116897.70600503348/8.0), + REAL_CONST(116922.36081630984/8.0), + REAL_CONST(116947.01692736275/8.0), + REAL_CONST(116971.67433805518/8.0), + REAL_CONST(116996.33304825013/8.0), + REAL_CONST(117020.99305781067/8.0), + REAL_CONST(117045.65436659988/8.0), + REAL_CONST(117070.31697448085/8.0), + REAL_CONST(117094.98088131678/8.0), + REAL_CONST(117119.64608697082/8.0), + REAL_CONST(117144.31259130624/8.0), + REAL_CONST(117168.98039418629/8.0), + REAL_CONST(117193.64949547425/8.0), + REAL_CONST(117218.31989503348/8.0), + REAL_CONST(117242.99159272734/8.0), + REAL_CONST(117267.66458841923/8.0), + REAL_CONST(117292.33888197262/8.0), + REAL_CONST(117317.01447325097/8.0), + REAL_CONST(117341.6913621178/8.0), + REAL_CONST(117366.36954843666/8.0), + REAL_CONST(117391.04903207115/8.0), + REAL_CONST(117415.72981288488/8.0), + REAL_CONST(117440.41189074152/8.0), + REAL_CONST(117465.09526550474/8.0), + REAL_CONST(117489.77993703831/8.0), + REAL_CONST(117514.46590520597/8.0), + REAL_CONST(117539.15316987153/8.0), + REAL_CONST(117563.84173089883/8.0), + REAL_CONST(117588.53158815173/8.0), + REAL_CONST(117613.22274149416/8.0), + REAL_CONST(117637.91519079007/8.0), + REAL_CONST(117662.60893590341/8.0), + REAL_CONST(117687.30397669821/8.0), + REAL_CONST(117712.00031303853/8.0), + REAL_CONST(117736.69794478847/8.0), + REAL_CONST(117761.39687181212/8.0), + REAL_CONST(117786.09709397367/8.0), + REAL_CONST(117810.7986111373/8.0), + REAL_CONST(117835.50142316725/8.0), + REAL_CONST(117860.20552992777/8.0), + REAL_CONST(117884.91093128319/8.0), + REAL_CONST(117909.6176270978/8.0), + REAL_CONST(117934.32561723603/8.0), + REAL_CONST(117959.03490156225/8.0), + REAL_CONST(117983.74547994092/8.0), + REAL_CONST(118008.45735223651/8.0), + REAL_CONST(118033.17051831353/8.0), + REAL_CONST(118057.88497803656/8.0), + REAL_CONST(118082.60073127014/8.0), + REAL_CONST(118107.31777787894/8.0), + REAL_CONST(118132.03611772758/8.0), + REAL_CONST(118156.75575068076/8.0), + REAL_CONST(118181.47667660323/8.0), + REAL_CONST(118206.19889535972/8.0), + REAL_CONST(118230.92240681504/8.0), + REAL_CONST(118255.64721083404/8.0), + REAL_CONST(118280.37330728157/8.0), + REAL_CONST(118305.10069602253/8.0), + REAL_CONST(118329.82937692189/8.0), + REAL_CONST(118354.55934984458/8.0), + REAL_CONST(118379.29061465565/8.0), + REAL_CONST(118404.02317122012/8.0), + REAL_CONST(118428.75701940308/8.0), + REAL_CONST(118453.49215906965/8.0), + REAL_CONST(118478.22859008498/8.0), + REAL_CONST(118502.96631231424/8.0), + REAL_CONST(118527.70532562268/8.0), + REAL_CONST(118552.44562987552/8.0), + REAL_CONST(118577.18722493808/8.0), + REAL_CONST(118601.93011067568/8.0), + REAL_CONST(118626.67428695368/8.0), + REAL_CONST(118651.41975363747/8.0), + REAL_CONST(118676.16651059251/8.0), + REAL_CONST(118700.91455768423/8.0), + REAL_CONST(118725.66389477813/8.0), + REAL_CONST(118750.41452173979/8.0), + REAL_CONST(118775.16643843475/8.0), + REAL_CONST(118799.91964472862/8.0), + REAL_CONST(118824.67414048707/8.0), + REAL_CONST(118849.42992557574/8.0), + REAL_CONST(118874.18699986035/8.0), + REAL_CONST(118898.94536320666/8.0), + REAL_CONST(118923.70501548045/8.0), + REAL_CONST(118948.46595654752/8.0), + REAL_CONST(118973.22818627374/8.0), + REAL_CONST(118997.99170452499/8.0), + REAL_CONST(119022.7565111672/8.0), + REAL_CONST(119047.52260606633/8.0), + REAL_CONST(119072.28998908834/8.0), + REAL_CONST(119097.0586600993/8.0), + REAL_CONST(119121.82861896523/8.0), + REAL_CONST(119146.59986555226/8.0), + REAL_CONST(119171.3723997265/8.0), + REAL_CONST(119196.14622135412/8.0), + REAL_CONST(119220.92133030134/8.0), + REAL_CONST(119245.69772643436/8.0), + REAL_CONST(119270.47540961947/8.0), + REAL_CONST(119295.25437972297/8.0), + REAL_CONST(119320.03463661121/8.0), + REAL_CONST(119344.81618015055/8.0), + REAL_CONST(119369.5990102074/8.0), + REAL_CONST(119394.38312664822/8.0), + REAL_CONST(119419.16852933947/8.0), + REAL_CONST(119443.95521814766/8.0), + REAL_CONST(119468.74319293935/8.0), + REAL_CONST(119493.53245358112/8.0), + REAL_CONST(119518.32299993958/8.0), + REAL_CONST(119543.11483188139/8.0), + REAL_CONST(119567.90794927324/8.0), + REAL_CONST(119592.70235198183/8.0), + REAL_CONST(119617.49803987393/8.0), + REAL_CONST(119642.29501281632/8.0), + REAL_CONST(119667.09327067583/8.0), + REAL_CONST(119691.89281331931/8.0), + REAL_CONST(119716.69364061367/8.0), + REAL_CONST(119741.49575242582/8.0), + REAL_CONST(119766.29914862274/8.0), + REAL_CONST(119791.10382907141/8.0), + REAL_CONST(119815.90979363887/8.0), + REAL_CONST(119840.71704219218/8.0), + REAL_CONST(119865.52557459843/8.0), + REAL_CONST(119890.33539072477/8.0), + REAL_CONST(119915.14649043836/8.0), + REAL_CONST(119939.95887360642/8.0), + REAL_CONST(119964.77254009615/8.0), + REAL_CONST(119989.58748977486/8.0), + REAL_CONST(120014.40372250983/8.0), + REAL_CONST(120039.22123816841/8.0), + REAL_CONST(120064.04003661797/8.0), + REAL_CONST(120088.86011772591/8.0), + REAL_CONST(120113.6814813597/8.0), + REAL_CONST(120138.5041273868/8.0), + REAL_CONST(120163.3280556747/8.0), + REAL_CONST(120188.15326609099/8.0), + REAL_CONST(120212.97975850321/8.0), + REAL_CONST(120237.807532779/8.0), + REAL_CONST(120262.63658878599/8.0), + REAL_CONST(120287.46692639188/8.0), + REAL_CONST(120312.29854546436/8.0), + REAL_CONST(120337.13144587121/8.0), + REAL_CONST(120361.9656274802/8.0), + REAL_CONST(120386.80109015915/8.0), + REAL_CONST(120411.63783377589/8.0), + REAL_CONST(120436.47585819835/8.0), + REAL_CONST(120461.31516329442/8.0), + REAL_CONST(120486.15574893207/8.0), + REAL_CONST(120510.99761497928/8.0), + REAL_CONST(120535.84076130406/8.0), + REAL_CONST(120560.68518777451/8.0), + REAL_CONST(120585.53089425867/8.0), + REAL_CONST(120610.3778806247/8.0), + REAL_CONST(120635.22614674074/8.0), + REAL_CONST(120660.07569247499/8.0), + REAL_CONST(120684.92651769568/8.0), + REAL_CONST(120709.77862227106/8.0), + REAL_CONST(120734.63200606944/8.0), + REAL_CONST(120759.48666895913/8.0), + REAL_CONST(120784.3426108085/8.0), + REAL_CONST(120809.19983148595/8.0), + REAL_CONST(120834.05833085992/8.0), + REAL_CONST(120858.91810879884/8.0), + REAL_CONST(120883.77916517125/8.0), + REAL_CONST(120908.64149984565/8.0), + REAL_CONST(120933.5051126906/8.0), + REAL_CONST(120958.37000357473/8.0), + REAL_CONST(120983.23617236665/8.0), + REAL_CONST(121008.10361893504/8.0), + REAL_CONST(121032.97234314861/8.0), + REAL_CONST(121057.84234487606/8.0), + REAL_CONST(121082.71362398617/8.0), + REAL_CONST(121107.58618034775/8.0), + REAL_CONST(121132.46001382964/8.0), + REAL_CONST(121157.33512430069/8.0), + REAL_CONST(121182.21151162982/8.0), + REAL_CONST(121207.08917568595/8.0), + REAL_CONST(121231.96811633807/8.0), + REAL_CONST(121256.84833345517/8.0), + REAL_CONST(121281.72982690629/8.0), + REAL_CONST(121306.61259656049/8.0), + REAL_CONST(121331.49664228689/8.0), + REAL_CONST(121356.38196395461/8.0), + REAL_CONST(121381.26856143285/8.0), + REAL_CONST(121406.15643459078/8.0), + REAL_CONST(121431.04558329767/8.0), + REAL_CONST(121455.93600742276/8.0), + REAL_CONST(121480.82770683538/8.0), + REAL_CONST(121505.72068140487/8.0), + REAL_CONST(121530.61493100057/8.0), + REAL_CONST(121555.51045549192/8.0), + REAL_CONST(121580.40725474835/8.0), + REAL_CONST(121605.30532863933/8.0), + REAL_CONST(121630.20467703436/8.0), + REAL_CONST(121655.10529980299/8.0), + REAL_CONST(121680.00719681478/8.0), + REAL_CONST(121704.91036793934/8.0), + REAL_CONST(121729.81481304632/8.0), + REAL_CONST(121754.72053200539/8.0), + REAL_CONST(121779.62752468624/8.0), + REAL_CONST(121804.53579095862/8.0), + REAL_CONST(121829.44533069231/8.0), + REAL_CONST(121854.3561437571/8.0), + REAL_CONST(121879.26823002285/8.0), + REAL_CONST(121904.1815893594/8.0), + REAL_CONST(121929.09622163669/8.0), + REAL_CONST(121954.01212672464/8.0), + REAL_CONST(121978.92930449323/8.0), + REAL_CONST(122003.84775481246/8.0), + REAL_CONST(122028.76747755238/8.0), + REAL_CONST(122053.68847258303/8.0), + REAL_CONST(122078.61073977455/8.0), + REAL_CONST(122103.53427899707/8.0), + REAL_CONST(122128.45909012076/8.0), + REAL_CONST(122153.38517301581/8.0), + REAL_CONST(122178.31252755247/8.0), + REAL_CONST(122203.24115360099/8.0), + REAL_CONST(122228.17105103172/8.0), + REAL_CONST(122253.10221971494/8.0), + REAL_CONST(122278.03465952107/8.0), + REAL_CONST(122302.96837032049/8.0), + REAL_CONST(122327.90335198362/8.0), + REAL_CONST(122352.83960438096/8.0), + REAL_CONST(122377.777127383/8.0), + REAL_CONST(122402.71592086025/8.0), + REAL_CONST(122427.65598468333/8.0), + REAL_CONST(122452.59731872278/8.0), + REAL_CONST(122477.53992284928/8.0), + REAL_CONST(122502.48379693348/8.0), + REAL_CONST(122527.42894084606/8.0), + REAL_CONST(122552.37535445779/8.0), + REAL_CONST(122577.32303763942/8.0), + REAL_CONST(122602.27199026172/8.0), + REAL_CONST(122627.22221219557/8.0), + REAL_CONST(122652.17370331181/8.0), + REAL_CONST(122677.12646348133/8.0), + REAL_CONST(122702.08049257506/8.0), + REAL_CONST(122727.03579046397/8.0), + REAL_CONST(122751.99235701906/8.0), + REAL_CONST(122776.95019211136/8.0), + REAL_CONST(122801.9092956119/8.0), + REAL_CONST(122826.8696673918/8.0), + REAL_CONST(122851.83130732219/8.0), + REAL_CONST(122876.79421527422/8.0), + REAL_CONST(122901.75839111909/8.0), + REAL_CONST(122926.72383472799/8.0), + REAL_CONST(122951.69054597223/8.0), + REAL_CONST(122976.65852472307/8.0), + REAL_CONST(123001.62777085182/8.0), + REAL_CONST(123026.59828422987/8.0), + REAL_CONST(123051.57006472857/8.0), + REAL_CONST(123076.54311221937/8.0), + REAL_CONST(123101.5174265737/8.0), + REAL_CONST(123126.49300766307/8.0), + REAL_CONST(123151.46985535898/8.0), + REAL_CONST(123176.44796953299/8.0), + REAL_CONST(123201.42735005668/8.0), + REAL_CONST(123226.40799680166/8.0), + REAL_CONST(123251.38990963959/8.0), + REAL_CONST(123276.37308844214/8.0), + REAL_CONST(123301.35753308103/8.0), + REAL_CONST(123326.343243428/8.0), + REAL_CONST(123351.33021935483/8.0), + REAL_CONST(123376.31846073334/8.0), + REAL_CONST(123401.30796743535/8.0), + REAL_CONST(123426.29873933276/8.0), + REAL_CONST(123451.29077629748/8.0), + REAL_CONST(123476.28407820144/8.0), + REAL_CONST(123501.2786449166/8.0), + REAL_CONST(123526.27447631498/8.0), + REAL_CONST(123551.27157226863/8.0), + REAL_CONST(123576.26993264959/8.0), + REAL_CONST(123601.26955732999/8.0), + REAL_CONST(123626.27044618195/8.0), + REAL_CONST(123651.27259907764/8.0), + REAL_CONST(123676.27601588926/8.0), + REAL_CONST(123701.28069648903/8.0), + REAL_CONST(123726.28664074924/8.0), + REAL_CONST(123751.29384854218/8.0), + REAL_CONST(123776.30231974016/8.0), + REAL_CONST(123801.31205421555/8.0), + REAL_CONST(123826.32305184075/8.0), + REAL_CONST(123851.33531248817/8.0), + REAL_CONST(123876.34883603029/8.0), + REAL_CONST(123901.36362233957/8.0), + REAL_CONST(123926.37967128855/8.0), + REAL_CONST(123951.39698274979/8.0), + REAL_CONST(123976.41555659588/8.0), + REAL_CONST(124001.43539269941/8.0), + REAL_CONST(124026.45649093305/8.0), + REAL_CONST(124051.47885116948/8.0), + REAL_CONST(124076.50247328142/8.0), + REAL_CONST(124101.5273571416/8.0), + REAL_CONST(124126.55350262282/8.0), + REAL_CONST(124151.58090959788/8.0), + REAL_CONST(124176.60957793961/8.0), + REAL_CONST(124201.63950752091/8.0), + REAL_CONST(124226.67069821467/8.0), + REAL_CONST(124251.70314989384/8.0), + REAL_CONST(124276.73686243138/8.0), + REAL_CONST(124301.7718357003/8.0), + REAL_CONST(124326.80806957364/8.0), + REAL_CONST(124351.84556392446/8.0), + REAL_CONST(124376.88431862585/8.0), + REAL_CONST(124401.92433355095/8.0), + REAL_CONST(124426.96560857294/8.0), + REAL_CONST(124452.00814356498/8.0), + REAL_CONST(124477.05193840031/8.0), + REAL_CONST(124502.0969929522/8.0), + REAL_CONST(124527.14330709392/8.0), + REAL_CONST(124552.19088069882/8.0), + REAL_CONST(124577.23971364023/8.0), + REAL_CONST(124602.28980579154/8.0), + REAL_CONST(124627.34115702618/8.0), + REAL_CONST(124652.3937672176/8.0), + REAL_CONST(124677.44763623926/8.0), + REAL_CONST(124702.50276396469/8.0), + REAL_CONST(124727.55915026742/8.0), + REAL_CONST(124752.61679502104/8.0), + REAL_CONST(124777.67569809916/8.0), + REAL_CONST(124802.73585937542/8.0), + REAL_CONST(124827.79727872348/8.0), + REAL_CONST(124852.85995601704/8.0), + REAL_CONST(124877.92389112986/8.0), + REAL_CONST(124902.98908393568/8.0), + REAL_CONST(124928.05553430831/8.0), + REAL_CONST(124953.1232421216/8.0), + REAL_CONST(124978.19220724938/8.0), + REAL_CONST(125003.26242956554/8.0), + REAL_CONST(125028.33390894404/8.0), + REAL_CONST(125053.40664525882/8.0), + REAL_CONST(125078.48063838384/8.0), + REAL_CONST(125103.55588819318/8.0), + REAL_CONST(125128.63239456083/8.0), + REAL_CONST(125153.71015736091/8.0), + REAL_CONST(125178.78917646752/8.0), + REAL_CONST(125203.86945175481/8.0), + REAL_CONST(125228.95098309696/8.0), + REAL_CONST(125254.03377036817/8.0), + REAL_CONST(125279.1178134427/8.0), + REAL_CONST(125304.20311219479/8.0), + REAL_CONST(125329.28966649878/8.0), + REAL_CONST(125354.37747622898/8.0), + REAL_CONST(125379.46654125977/8.0), + REAL_CONST(125404.55686146552/8.0), + REAL_CONST(125429.6484367207/8.0), + REAL_CONST(125454.74126689974/8.0), + REAL_CONST(125479.83535187715/8.0), + REAL_CONST(125504.93069152744/8.0), + REAL_CONST(125530.02728572517/8.0), + REAL_CONST(125555.12513434493/8.0), + REAL_CONST(125580.22423726133/8.0), + REAL_CONST(125605.32459434902/8.0), + REAL_CONST(125630.4262054827/8.0), + REAL_CONST(125655.52907053704/8.0), + REAL_CONST(125680.63318938682/8.0), + REAL_CONST(125705.73856190679/8.0), + REAL_CONST(125730.84518797178/8.0), + REAL_CONST(125755.9530674566/8.0), + REAL_CONST(125781.06220023613/8.0), + REAL_CONST(125806.17258618528/8.0), + REAL_CONST(125831.28422517896/8.0), + REAL_CONST(125856.39711709213/8.0), + REAL_CONST(125881.51126179981/8.0), + REAL_CONST(125906.62665917698/8.0), + REAL_CONST(125931.74330909875/8.0), + REAL_CONST(125956.86121144016/8.0), + REAL_CONST(125981.98036607634/8.0), + REAL_CONST(126007.10077288245/8.0), + REAL_CONST(126032.22243173365/8.0), + REAL_CONST(126057.34534250517/8.0), + REAL_CONST(126082.46950507225/8.0), + REAL_CONST(126107.59491931014/8.0), + REAL_CONST(126132.72158509417/8.0), + REAL_CONST(126157.84950229966/8.0), + REAL_CONST(126182.97867080198/8.0), + REAL_CONST(126208.10909047653/8.0), + REAL_CONST(126233.24076119871/8.0), + REAL_CONST(126258.37368284403/8.0), + REAL_CONST(126283.50785528794/8.0), + REAL_CONST(126308.64327840599/8.0), + REAL_CONST(126333.77995207369/8.0), + REAL_CONST(126358.91787616667/8.0), + REAL_CONST(126384.0570505605/8.0), + REAL_CONST(126409.19747513086/8.0), + REAL_CONST(126434.3391497534/8.0), + REAL_CONST(126459.48207430386/8.0), + REAL_CONST(126484.62624865794/8.0), + REAL_CONST(126509.77167269142/8.0), + REAL_CONST(126534.9183462801/8.0), + REAL_CONST(126560.06626929982/8.0), + REAL_CONST(126585.21544162642/8.0), + REAL_CONST(126610.36586313581/8.0), + REAL_CONST(126635.51753370393/8.0), + REAL_CONST(126660.67045320668/8.0), + REAL_CONST(126685.82462152008/8.0), + REAL_CONST(126710.98003852014/8.0), + REAL_CONST(126736.13670408291/8.0), + REAL_CONST(126761.29461808444/8.0), + REAL_CONST(126786.45378040087/8.0), + REAL_CONST(126811.61419090834/8.0), + REAL_CONST(126836.77584948298/8.0), + REAL_CONST(126861.93875600102/8.0), + REAL_CONST(126887.10291033868/8.0), + REAL_CONST(126912.26831237224/8.0), + REAL_CONST(126937.43496197795/8.0), + REAL_CONST(126962.60285903217/8.0), + REAL_CONST(126987.77200341123/8.0), + REAL_CONST(127012.94239499152/8.0), + REAL_CONST(127038.11403364947/8.0), + REAL_CONST(127063.2869192615/8.0), + REAL_CONST(127088.46105170409/8.0), + REAL_CONST(127113.63643085376/8.0), + REAL_CONST(127138.81305658702/8.0), + REAL_CONST(127163.99092878048/8.0), + REAL_CONST(127189.17004731069/8.0), + REAL_CONST(127214.35041205429/8.0), + REAL_CONST(127239.53202288797/8.0), + REAL_CONST(127264.71487968838/8.0), + REAL_CONST(127289.89898233226/8.0), + REAL_CONST(127315.08433069635/8.0), + REAL_CONST(127340.27092465744/8.0), + REAL_CONST(127365.45876409234/8.0), + REAL_CONST(127390.64784887788/8.0), + REAL_CONST(127415.83817889093/8.0), + REAL_CONST(127441.02975400841/8.0), + REAL_CONST(127466.22257410725/8.0), + REAL_CONST(127491.41663906439/8.0), + REAL_CONST(127516.61194875685/8.0), + REAL_CONST(127541.80850306165/8.0), + REAL_CONST(127567.00630185583/8.0), + REAL_CONST(127592.20534501647/8.0), + REAL_CONST(127617.4056324207/8.0), + REAL_CONST(127642.60716394568/8.0), + REAL_CONST(127667.80993946856/8.0), + REAL_CONST(127693.01395886653/8.0), + REAL_CONST(127718.21922201688/8.0), + REAL_CONST(127743.42572879682/8.0), + REAL_CONST(127768.63347908368/8.0), + REAL_CONST(127793.84247275478/8.0), + REAL_CONST(127819.05270968749/8.0), + REAL_CONST(127844.26418975917/8.0), + REAL_CONST(127869.47691284724/8.0), + REAL_CONST(127894.69087882918/8.0), + REAL_CONST(127919.90608758242/8.0), + REAL_CONST(127945.12253898452/8.0), + REAL_CONST(127970.34023291297/8.0), + REAL_CONST(127995.55916924537/8.0), + REAL_CONST(128020.77934785932/8.0), + REAL_CONST(128046.00076863244/8.0), + REAL_CONST(128071.22343144237/8.0), + REAL_CONST(128096.44733616684/8.0), + REAL_CONST(128121.67248268353/8.0), + REAL_CONST(128146.89887087021/8.0), + REAL_CONST(128172.12650060465/8.0), + REAL_CONST(128197.35537176467/8.0), + REAL_CONST(128222.5854842281/8.0), + REAL_CONST(128247.81683787282/8.0), + REAL_CONST(128273.04943257671/8.0), + REAL_CONST(128298.28326821771/8.0), + REAL_CONST(128323.51834467379/8.0), + REAL_CONST(128348.75466182294/8.0), + REAL_CONST(128373.99221954317/8.0), + REAL_CONST(128399.23101771252/8.0), + REAL_CONST(128424.47105620909/8.0), + REAL_CONST(128449.71233491098/8.0), + REAL_CONST(128474.95485369631/8.0), + REAL_CONST(128500.19861244329/8.0), + REAL_CONST(128525.44361103009/8.0), + REAL_CONST(128550.68984933494/8.0), + REAL_CONST(128575.93732723613/8.0), + REAL_CONST(128601.18604461191/8.0), + REAL_CONST(128626.43600134061/8.0), + REAL_CONST(128651.68719730059/8.0), + REAL_CONST(128676.93963237021/8.0), + REAL_CONST(128702.1933064279/8.0), + REAL_CONST(128727.44821935208/8.0), + REAL_CONST(128752.70437102125/8.0), + REAL_CONST(128777.96176131385/8.0), + REAL_CONST(128803.22039010846/8.0), + REAL_CONST(128828.48025728362/8.0), + REAL_CONST(128853.74136271792/8.0), + REAL_CONST(128879.00370628996/8.0), + REAL_CONST(128904.26728787841/8.0), + REAL_CONST(128929.53210736193/8.0), + REAL_CONST(128954.79816461923/8.0), + REAL_CONST(128980.06545952905/8.0), + REAL_CONST(129005.33399197015/8.0), + REAL_CONST(129030.60376182134/8.0), + REAL_CONST(129055.87476896142/8.0), + REAL_CONST(129081.14701326926/8.0), + REAL_CONST(129106.42049462376/8.0), + REAL_CONST(129131.6952129038/8.0), + REAL_CONST(129156.97116798835/8.0), + REAL_CONST(129182.24835975636/8.0), + REAL_CONST(129207.52678808685/8.0), + REAL_CONST(129232.80645285884/8.0), + REAL_CONST(129258.08735395141/8.0), + REAL_CONST(129283.36949124365/8.0), + REAL_CONST(129308.65286461466/8.0), + REAL_CONST(129333.9374739436/8.0), + REAL_CONST(129359.22331910966/8.0), + REAL_CONST(129384.51039999202/8.0), + REAL_CONST(129409.79871646997/8.0), + REAL_CONST(129435.08826842274/8.0), + REAL_CONST(129460.37905572963/8.0), + REAL_CONST(129485.67107826998/8.0), + REAL_CONST(129510.96433592314/8.0), + REAL_CONST(129536.25882856851/8.0), + REAL_CONST(129561.55455608548/8.0), + REAL_CONST(129586.85151835352/8.0), + REAL_CONST(129612.14971525209/8.0), + REAL_CONST(129637.4491466607/8.0), + REAL_CONST(129662.74981245887/8.0), + REAL_CONST(129688.0517125262/8.0), + REAL_CONST(129713.35484674224/8.0), + REAL_CONST(129738.65921498663/8.0), + REAL_CONST(129763.96481713903/8.0), + REAL_CONST(129789.27165307909/8.0), + REAL_CONST(129814.57972268655/8.0), + REAL_CONST(129839.88902584116/8.0), + REAL_CONST(129865.19956242264/8.0), + REAL_CONST(129890.51133231082/8.0), + REAL_CONST(129915.82433538554/8.0), + REAL_CONST(129941.13857152662/8.0), + REAL_CONST(129966.45404061397/8.0), + REAL_CONST(129991.7707425275/8.0), + REAL_CONST(130017.08867714716/8.0), + REAL_CONST(130042.4078443529/8.0), + REAL_CONST(130067.72824402474/8.0), + REAL_CONST(130093.04987604271/8.0), + REAL_CONST(130118.37274028687/8.0), + REAL_CONST(130143.69683663732/8.0), + REAL_CONST(130169.02216497416/8.0), + REAL_CONST(130194.34872517755/8.0), + REAL_CONST(130219.67651712766/8.0), + REAL_CONST(130245.0055407047/8.0), + REAL_CONST(130270.33579578891/8.0), + REAL_CONST(130295.66728226055/8.0), + REAL_CONST(130320.99999999991/8.0), + REAL_CONST(130346.33394888733/8.0), + REAL_CONST(130371.66912880314/8.0), + REAL_CONST(130397.00553962773/8.0), + REAL_CONST(130422.34318124152/8.0), + REAL_CONST(130447.68205352494/8.0), + REAL_CONST(130473.02215635845/8.0), + REAL_CONST(130498.36348962256/8.0), + REAL_CONST(130523.70605319779/8.0), + REAL_CONST(130549.0498469647/8.0), + REAL_CONST(130574.39487080388/8.0), + REAL_CONST(130599.74112459592/8.0), + REAL_CONST(130625.08860822149/8.0), + REAL_CONST(130650.43732156123/8.0), + REAL_CONST(130675.78726449587/8.0), + REAL_CONST(130701.13843690613/8.0), + REAL_CONST(130726.49083867275/8.0), + REAL_CONST(130751.84446967654/8.0), + REAL_CONST(130777.19932979831/8.0), + REAL_CONST(130802.5554189189/8.0), + REAL_CONST(130827.91273691918/8.0), + REAL_CONST(130853.27128368006/8.0), + REAL_CONST(130878.63105908247/8.0), + REAL_CONST(130903.99206300738/8.0), + REAL_CONST(130929.35429533575/8.0), + REAL_CONST(130954.71775594862/8.0), + REAL_CONST(130980.08244472703/8.0), + REAL_CONST(131005.44836155206/8.0), + REAL_CONST(131030.81550630482/8.0), + REAL_CONST(131056.18387886642/8.0), + REAL_CONST(131081.55347911804/8.0), + REAL_CONST(131106.92430694087/8.0), + REAL_CONST(131132.29636221612/8.0), + REAL_CONST(131157.66964482504/8.0), + REAL_CONST(131183.0441546489/8.0), + REAL_CONST(131208.41989156904/8.0), + REAL_CONST(131233.79685546676/8.0), + REAL_CONST(131259.17504622342/8.0), + REAL_CONST(131284.55446372041/8.0), + REAL_CONST(131309.93510783918/8.0), + REAL_CONST(131335.31697846117/8.0), + REAL_CONST(131360.70007546784/8.0), + REAL_CONST(131386.0843987407/8.0), + REAL_CONST(131411.46994816128/8.0), + REAL_CONST(131436.85672361116/8.0), + REAL_CONST(131462.24472497194/8.0), + REAL_CONST(131487.63395212521/8.0), + REAL_CONST(131513.02440495262/8.0), + REAL_CONST(131538.41608333588/8.0), + REAL_CONST(131563.80898715663/8.0), + REAL_CONST(131589.2031162967/8.0), + REAL_CONST(131614.59847063778/8.0), + REAL_CONST(131639.9950500617/8.0), + REAL_CONST(131665.39285445024/8.0), + REAL_CONST(131690.79188368531/8.0), + REAL_CONST(131716.19213764873/8.0), + REAL_CONST(131741.59361622241/8.0), + REAL_CONST(131766.99631928833/8.0), + REAL_CONST(131792.40024672839/8.0), + REAL_CONST(131817.80539842462/8.0), + REAL_CONST(131843.21177425905/8.0), + REAL_CONST(131868.61937411371/8.0), + REAL_CONST(131894.02819787065/8.0), + REAL_CONST(131919.43824541202/8.0), + REAL_CONST(131944.84951661993/8.0), + REAL_CONST(131970.26201137656/8.0), + REAL_CONST(131995.67572956407/8.0), + REAL_CONST(132021.09067106468/8.0), + REAL_CONST(132046.50683576067/8.0), + REAL_CONST(132071.9242235343/8.0), + REAL_CONST(132097.34283426782/8.0), + REAL_CONST(132122.76266784366/8.0), + REAL_CONST(132148.1837241441/8.0), + REAL_CONST(132173.60600305157/8.0), + REAL_CONST(132199.02950444847/8.0), + REAL_CONST(132224.45422821722/8.0), + REAL_CONST(132249.88017424036/8.0), + REAL_CONST(132275.30734240031/8.0), + REAL_CONST(132300.73573257966/8.0), + REAL_CONST(132326.16534466096/8.0), + REAL_CONST(132351.59617852676/8.0), + REAL_CONST(132377.02823405969/8.0), + REAL_CONST(132402.46151114244/8.0), + REAL_CONST(132427.89600965759/8.0), + REAL_CONST(132453.33172948789/8.0), + REAL_CONST(132478.76867051609/8.0), + REAL_CONST(132504.20683262491/8.0), + REAL_CONST(132529.64621569714/8.0), + REAL_CONST(132555.08681961559/8.0), + REAL_CONST(132580.5286442631/8.0), + REAL_CONST(132605.97168952253/8.0), + REAL_CONST(132631.41595527678/8.0), + REAL_CONST(132656.86144140881/8.0), + REAL_CONST(132682.30814780149/8.0), + REAL_CONST(132707.75607433787/8.0), + REAL_CONST(132733.20522090094/8.0), + REAL_CONST(132758.65558737374/8.0), + REAL_CONST(132784.10717363929/8.0), + REAL_CONST(132809.55997958075/8.0), + REAL_CONST(132835.01400508118/8.0), + REAL_CONST(132860.46925002377/8.0), + REAL_CONST(132885.92571429166/8.0), + REAL_CONST(132911.38339776811/8.0), + REAL_CONST(132936.84230033628/8.0), + REAL_CONST(132962.30242187946/8.0), + REAL_CONST(132987.76376228096/8.0), + REAL_CONST(133013.22632142407/8.0), + REAL_CONST(133038.69009919214/8.0), + REAL_CONST(133064.15509546854/8.0), + REAL_CONST(133089.62131013666/8.0), + REAL_CONST(133115.08874307995/8.0), + REAL_CONST(133140.55739418184/8.0), + REAL_CONST(133166.02726332581/8.0), + REAL_CONST(133191.49835039541/8.0), + REAL_CONST(133216.97065527414/8.0), + REAL_CONST(133242.44417784561/8.0), + REAL_CONST(133267.91891799335/8.0), + REAL_CONST(133293.39487560102/8.0), + REAL_CONST(133318.87205055228/8.0), + REAL_CONST(133344.35044273079/8.0), + REAL_CONST(133369.83005202023/8.0), + REAL_CONST(133395.31087830439/8.0), + REAL_CONST(133420.79292146701/8.0), + REAL_CONST(133446.27618139185/8.0), + REAL_CONST(133471.76065796276/8.0), + REAL_CONST(133497.24635106357/8.0), + REAL_CONST(133522.73326057816/8.0), + REAL_CONST(133548.22138639039/8.0), + REAL_CONST(133573.71072838426/8.0), + REAL_CONST(133599.20128644365/8.0), + REAL_CONST(133624.69306045261/8.0), + REAL_CONST(133650.1860502951/8.0), + REAL_CONST(133675.68025585517/8.0), + REAL_CONST(133701.1756770169/8.0), + REAL_CONST(133726.67231366437/8.0), + REAL_CONST(133752.17016568172/8.0), + REAL_CONST(133777.66923295305/8.0), + REAL_CONST(133803.16951536259/8.0), + REAL_CONST(133828.67101279454/8.0), + REAL_CONST(133854.17372513309/8.0), + REAL_CONST(133879.67765226253/8.0), + REAL_CONST(133905.18279406714/8.0), + REAL_CONST(133930.68915043125/8.0), + REAL_CONST(133956.19672123916/8.0), + REAL_CONST(133981.70550637526/8.0), + REAL_CONST(134007.21550572399/8.0), + REAL_CONST(134032.7267191697/8.0), + REAL_CONST(134058.23914659687/8.0), + REAL_CONST(134083.75278789/8.0), + REAL_CONST(134109.26764293358/8.0), + REAL_CONST(134134.78371161217/8.0), + REAL_CONST(134160.30099381026/8.0), + REAL_CONST(134185.8194894125/8.0), + REAL_CONST(134211.33919830353/8.0), + REAL_CONST(134236.8601203679/8.0), + REAL_CONST(134262.38225549037/8.0), + REAL_CONST(134287.90560355558/8.0), + REAL_CONST(134313.43016444831/8.0), + REAL_CONST(134338.95593805326/8.0), + REAL_CONST(134364.48292425525/8.0), + REAL_CONST(134390.01112293909/8.0), + REAL_CONST(134415.54053398955/8.0), + REAL_CONST(134441.07115729159/8.0), + REAL_CONST(134466.60299273001/8.0), + REAL_CONST(134492.1360401898/8.0), + REAL_CONST(134517.67029955584/8.0), + REAL_CONST(134543.20577071316/8.0), + REAL_CONST(134568.74245354676/8.0), + REAL_CONST(134594.28034794159/8.0), + REAL_CONST(134619.81945378278/8.0), + REAL_CONST(134645.35977095537/8.0), + REAL_CONST(134670.90129934452/8.0), + REAL_CONST(134696.4440388353/8.0), + REAL_CONST(134721.98798931291/8.0), + REAL_CONST(134747.53315066252/8.0), + REAL_CONST(134773.07952276937/8.0), + REAL_CONST(134798.62710551871/8.0), + REAL_CONST(134824.17589879577/8.0), + REAL_CONST(134849.72590248589/8.0), + REAL_CONST(134875.27711647438/8.0), + REAL_CONST(134900.82954064661/8.0), + REAL_CONST(134926.38317488792/8.0), + REAL_CONST(134951.93801908373/8.0), + REAL_CONST(134977.49407311951/8.0), + REAL_CONST(135003.05133688069/8.0), + REAL_CONST(135028.60981025276/8.0), + REAL_CONST(135054.16949312127/8.0), + REAL_CONST(135079.73038537172/8.0), + REAL_CONST(135105.29248688967/8.0), + REAL_CONST(135130.85579756077/8.0), + REAL_CONST(135156.42031727062/8.0), + REAL_CONST(135181.98604590484/8.0), + REAL_CONST(135207.55298334916/8.0), + REAL_CONST(135233.12112948924/8.0), + REAL_CONST(135258.69048421088/8.0), + REAL_CONST(135284.26104739975/8.0), + REAL_CONST(135309.83281894168/8.0), + REAL_CONST(135335.4057987225/8.0), + REAL_CONST(135360.97998662802/8.0), + REAL_CONST(135386.55538254412/8.0), + REAL_CONST(135412.13198635669/8.0), + REAL_CONST(135437.70979795168/8.0), + REAL_CONST(135463.28881721498/8.0), + REAL_CONST(135488.86904403262/8.0), + REAL_CONST(135514.45047829056/8.0), + REAL_CONST(135540.03311987486/8.0), + REAL_CONST(135565.61696867159/8.0), + REAL_CONST(135591.20202456677/8.0), + REAL_CONST(135616.78828744654/8.0), + REAL_CONST(135642.37575719706/8.0), + REAL_CONST(135667.96443370447/8.0), + REAL_CONST(135693.55431685498/8.0), + REAL_CONST(135719.14540653475/8.0), + REAL_CONST(135744.73770263011/8.0), + REAL_CONST(135770.33120502727/8.0), + REAL_CONST(135795.92591361253/8.0), + REAL_CONST(135821.52182827223/8.0), + REAL_CONST(135847.11894889272/8.0), + REAL_CONST(135872.7172753604/8.0), + REAL_CONST(135898.31680756161/8.0), + REAL_CONST(135923.91754538284/8.0), + REAL_CONST(135949.51948871053/8.0), + REAL_CONST(135975.12263743114/8.0), + REAL_CONST(136000.72699143123/8.0), + REAL_CONST(136026.33255059729/8.0), + REAL_CONST(136051.93931481591/8.0), + REAL_CONST(136077.54728397369/8.0), + REAL_CONST(136103.15645795723/8.0), + REAL_CONST(136128.76683665317/8.0), + REAL_CONST(136154.37841994822/8.0), + REAL_CONST(136179.99120772901/8.0), + REAL_CONST(136205.60519988232/8.0), + REAL_CONST(136231.2203962949/8.0), + REAL_CONST(136256.83679685349/8.0), + REAL_CONST(136282.45440144493/8.0), + REAL_CONST(136308.07320995603/8.0), + REAL_CONST(136333.69322227367/8.0), + REAL_CONST(136359.31443828469/8.0), + REAL_CONST(136384.93685787608/8.0), + REAL_CONST(136410.56048093468/8.0), + REAL_CONST(136436.18530734754/8.0), + REAL_CONST(136461.81133700156/8.0), + REAL_CONST(136487.43856978384/8.0), + REAL_CONST(136513.06700558143/8.0), + REAL_CONST(136538.6966442813/8.0), + REAL_CONST(136564.32748577066/8.0), + REAL_CONST(136589.95952993655/8.0), + REAL_CONST(136615.59277666616/8.0), + REAL_CONST(136641.22722584667/8.0), + REAL_CONST(136666.86287736523/8.0), + REAL_CONST(136692.49973110916/8.0), + REAL_CONST(136718.13778696564/8.0), + REAL_CONST(136743.77704482197/8.0), + REAL_CONST(136769.41750456547/8.0), + REAL_CONST(136795.05916608346/8.0), + REAL_CONST(136820.70202926331/8.0), + REAL_CONST(136846.34609399244/8.0), + REAL_CONST(136871.99136015819/8.0), + REAL_CONST(136897.63782764805/8.0), + REAL_CONST(136923.28549634948/8.0), + REAL_CONST(136948.93436614997/8.0), + REAL_CONST(136974.58443693706/8.0), + REAL_CONST(137000.23570859825/8.0), + REAL_CONST(137025.88818102115/8.0), + REAL_CONST(137051.54185409332/8.0), + REAL_CONST(137077.19672770242/8.0), + REAL_CONST(137102.85280173609/8.0), + REAL_CONST(137128.51007608202/8.0), + REAL_CONST(137154.16855062786/8.0), + REAL_CONST(137179.82822526142/8.0), + REAL_CONST(137205.48909987041/8.0), + REAL_CONST(137231.15117434258/8.0), + REAL_CONST(137256.8144485658/8.0), + REAL_CONST(137282.47892242789/8.0), + REAL_CONST(137308.14459581667/8.0), + REAL_CONST(137333.81146862009/8.0), + REAL_CONST(137359.47954072602/8.0), + REAL_CONST(137385.14881202241/8.0), + REAL_CONST(137410.81928239719/8.0), + REAL_CONST(137436.49095173844/8.0), + REAL_CONST(137462.16381993407/8.0), + REAL_CONST(137487.83788687221/8.0), + REAL_CONST(137513.51315244089/8.0), + REAL_CONST(137539.18961652822/8.0), + REAL_CONST(137564.86727902229/8.0), + REAL_CONST(137590.54613981131/8.0), + REAL_CONST(137616.22619878338/8.0), + REAL_CONST(137641.90745582676/8.0), + REAL_CONST(137667.58991082967/8.0), + REAL_CONST(137693.27356368033/8.0), + REAL_CONST(137718.95841426702/8.0), + REAL_CONST(137744.64446247809/8.0), + REAL_CONST(137770.33170820182/8.0), + REAL_CONST(137796.02015132661/8.0), + REAL_CONST(137821.70979174081/8.0), + REAL_CONST(137847.40062933284/8.0), + REAL_CONST(137873.09266399115/8.0), + REAL_CONST(137898.78589560417/8.0), + REAL_CONST(137924.48032406042/8.0), + REAL_CONST(137950.17594924837/8.0), + REAL_CONST(137975.8727710566/8.0), + REAL_CONST(138001.57078937365/8.0), + REAL_CONST(138027.27000408815/8.0), + REAL_CONST(138052.97041508864/8.0), + REAL_CONST(138078.67202226384/8.0), + REAL_CONST(138104.3748255024/8.0), + REAL_CONST(138130.07882469296/8.0), + REAL_CONST(138155.78401972432/8.0), + REAL_CONST(138181.49041048516/8.0), + REAL_CONST(138207.1979968643/8.0), + REAL_CONST(138232.9067787505/8.0), + REAL_CONST(138258.61675603263/8.0), + REAL_CONST(138284.32792859949/8.0), + REAL_CONST(138310.04029633995/8.0), + REAL_CONST(138335.75385914298/8.0), + REAL_CONST(138361.46861689744/8.0), + REAL_CONST(138387.18456949232/8.0), + REAL_CONST(138412.90171681659/8.0), + REAL_CONST(138438.62005875923/8.0), + REAL_CONST(138464.33959520931/8.0), + REAL_CONST(138490.06032605586/8.0), + REAL_CONST(138515.78225118798/8.0), + REAL_CONST(138541.50537049473/8.0), + REAL_CONST(138567.2296838653/8.0), + REAL_CONST(138592.95519118884/8.0), + REAL_CONST(138618.68189235451/8.0), + REAL_CONST(138644.40978725153/8.0), + REAL_CONST(138670.13887576913/8.0), + REAL_CONST(138695.86915779658/8.0), + REAL_CONST(138721.60063322316/8.0), + REAL_CONST(138747.33330193823/8.0), + REAL_CONST(138773.06716383106/8.0), + REAL_CONST(138798.80221879104/8.0), + REAL_CONST(138824.53846670757/8.0), + REAL_CONST(138850.27590747006/8.0), + REAL_CONST(138876.01454096794/8.0), + REAL_CONST(138901.7543670907/8.0), + REAL_CONST(138927.49538572782/8.0), + REAL_CONST(138953.2375967688/8.0), + REAL_CONST(138978.9810001032/8.0), + REAL_CONST(139004.72559562061/8.0), + REAL_CONST(139030.47138321059/8.0), + REAL_CONST(139056.2183627628/8.0), + REAL_CONST(139081.96653416683/8.0), + REAL_CONST(139107.71589731239/8.0), + REAL_CONST(139133.46645208917/8.0), + REAL_CONST(139159.21819838689/8.0), + REAL_CONST(139184.97113609532/8.0), + REAL_CONST(139210.72526510421/8.0), + REAL_CONST(139236.48058530336/8.0), + REAL_CONST(139262.23709658257/8.0), + REAL_CONST(139287.99479883176/8.0), + REAL_CONST(139313.75369194071/8.0), + REAL_CONST(139339.51377579942/8.0), + REAL_CONST(139365.27505029776/8.0), + REAL_CONST(139391.03751532568/8.0), + REAL_CONST(139416.80117077316/8.0), + REAL_CONST(139442.56601653024/8.0), + REAL_CONST(139468.33205248689/8.0), + REAL_CONST(139494.09927853322/8.0), + REAL_CONST(139519.86769455927/8.0), + REAL_CONST(139545.63730045516/8.0), + REAL_CONST(139571.408096111/8.0), + REAL_CONST(139597.18008141697/8.0), + REAL_CONST(139622.95325626322/8.0), + REAL_CONST(139648.72762054001/8.0), + REAL_CONST(139674.5031741375/8.0), + REAL_CONST(139700.27991694602/8.0), + REAL_CONST(139726.05784885579/8.0), + REAL_CONST(139751.83696975713/8.0), + REAL_CONST(139777.61727954043/8.0), + REAL_CONST(139803.39877809596/8.0), + REAL_CONST(139829.18146531415/8.0), + REAL_CONST(139854.96534108539/8.0), + REAL_CONST(139880.75040530015/8.0), + REAL_CONST(139906.53665784886/8.0), + REAL_CONST(139932.32409862199/8.0), + REAL_CONST(139958.11272751007/8.0), + REAL_CONST(139983.90254440365/8.0), + REAL_CONST(140009.69354919327/8.0), + REAL_CONST(140035.48574176949/8.0), + REAL_CONST(140061.27912202294/8.0), + REAL_CONST(140087.07368984428/8.0), + REAL_CONST(140112.86944512415/8.0), + REAL_CONST(140138.66638775321/8.0), + REAL_CONST(140164.4645176222/8.0), + REAL_CONST(140190.26383462184/8.0), + REAL_CONST(140216.06433864293/8.0), + REAL_CONST(140241.86602957622/8.0), + REAL_CONST(140267.66890731253/8.0), + REAL_CONST(140293.47297174268/8.0), + REAL_CONST(140319.27822275754/8.0), + REAL_CONST(140345.08466024802/8.0), + REAL_CONST(140370.89228410498/8.0), + REAL_CONST(140396.70109421943/8.0), + REAL_CONST(140422.51109048226/8.0), + REAL_CONST(140448.32227278448/8.0), + REAL_CONST(140474.13464101712/8.0), + REAL_CONST(140499.94819507122/8.0), + REAL_CONST(140525.76293483781/8.0), + REAL_CONST(140551.57886020801/8.0), + REAL_CONST(140577.3959710729/8.0), + REAL_CONST(140603.21426732364/8.0), + REAL_CONST(140629.03374885136/8.0), + REAL_CONST(140654.85441554731/8.0), + REAL_CONST(140680.67626730262/8.0), + REAL_CONST(140706.49930400858/8.0), + REAL_CONST(140732.32352555645/8.0), + REAL_CONST(140758.1489318375/8.0), + REAL_CONST(140783.97552274304/8.0), + REAL_CONST(140809.80329816442/8.0), + REAL_CONST(140835.63225799298/8.0), + REAL_CONST(140861.46240212015/8.0), + REAL_CONST(140887.29373043729/8.0), + REAL_CONST(140913.12624283586/8.0), + REAL_CONST(140938.95993920733/8.0), + REAL_CONST(140964.79481944317/8.0), + REAL_CONST(140990.63088343487/8.0), + REAL_CONST(141016.46813107401/8.0), + REAL_CONST(141042.30656225214/8.0), + REAL_CONST(141068.14617686081/8.0), + REAL_CONST(141093.98697479168/8.0), + REAL_CONST(141119.82895593636/8.0), + REAL_CONST(141145.6721201865/8.0), + REAL_CONST(141171.51646743377/8.0), + REAL_CONST(141197.36199756994/8.0), + REAL_CONST(141223.20871048668/8.0), + REAL_CONST(141249.05660607578/8.0), + REAL_CONST(141274.90568422904/8.0), + REAL_CONST(141300.75594483822/8.0), + REAL_CONST(141326.6073877952/8.0), + REAL_CONST(141352.4600129918/8.0), + REAL_CONST(141378.31382031992/8.0), + REAL_CONST(141404.16880967148/8.0), + REAL_CONST(141430.02498093838/8.0), + REAL_CONST(141455.8823340126/8.0), + REAL_CONST(141481.74086878612/8.0), + REAL_CONST(141507.60058515094/8.0), + REAL_CONST(141533.46148299909/8.0), + REAL_CONST(141559.32356222265/8.0), + REAL_CONST(141585.18682271364/8.0), + REAL_CONST(141611.05126436421/8.0), + REAL_CONST(141636.9168870665/8.0), + REAL_CONST(141662.78369071262/8.0), + REAL_CONST(141688.65167519479/8.0), + REAL_CONST(141714.5208404052/8.0), + REAL_CONST(141740.39118623605/8.0), + REAL_CONST(141766.26271257963/8.0), + REAL_CONST(141792.1354193282/8.0), + REAL_CONST(141818.00930637406/8.0), + REAL_CONST(141843.88437360956/8.0), + REAL_CONST(141869.760620927/8.0), + REAL_CONST(141895.6380482188/8.0), + REAL_CONST(141921.51665537735/8.0), + REAL_CONST(141947.39644229505/8.0), + REAL_CONST(141973.27740886438/8.0), + REAL_CONST(141999.15955497778/8.0), + REAL_CONST(142025.04288052776/8.0), + REAL_CONST(142050.92738540689/8.0), + REAL_CONST(142076.81306950765/8.0), + REAL_CONST(142102.69993272264/8.0), + REAL_CONST(142128.58797494444/8.0), + REAL_CONST(142154.47719606571/8.0), + REAL_CONST(142180.36759597904/8.0), + REAL_CONST(142206.25917457714/8.0), + REAL_CONST(142232.15193175265/8.0), + REAL_CONST(142258.04586739838/8.0), + REAL_CONST(142283.94098140698/8.0), + REAL_CONST(142309.83727367126/8.0), + REAL_CONST(142335.73474408401/8.0), + REAL_CONST(142361.63339253806/8.0), + REAL_CONST(142387.5332189262/8.0), + REAL_CONST(142413.43422314132/8.0), + REAL_CONST(142439.33640507635/8.0), + REAL_CONST(142465.23976462413/8.0), + REAL_CONST(142491.14430167765/8.0), + REAL_CONST(142517.05001612983/8.0), + REAL_CONST(142542.95690787368/8.0), + REAL_CONST(142568.86497680223/8.0), + REAL_CONST(142594.77422280848/8.0), + REAL_CONST(142620.68464578551/8.0), + REAL_CONST(142646.5962456264/8.0), + REAL_CONST(142672.50902222423/8.0), + REAL_CONST(142698.42297547215/8.0), + REAL_CONST(142724.33810526333/8.0), + REAL_CONST(142750.25441149093/8.0), + REAL_CONST(142776.17189404817/8.0), + REAL_CONST(142802.09055282827/8.0), + REAL_CONST(142828.01038772447/8.0), + REAL_CONST(142853.93139863008/8.0), + REAL_CONST(142879.85358543837/8.0), + REAL_CONST(142905.77694804268/8.0), + REAL_CONST(142931.70148633636/8.0), + REAL_CONST(142957.62720021277/8.0), + REAL_CONST(142983.55408956532/8.0), + REAL_CONST(143009.48215428743/8.0), + REAL_CONST(143035.41139427255/8.0), + REAL_CONST(143061.34180941415/8.0), + REAL_CONST(143087.27339960571/8.0), + REAL_CONST(143113.20616474075/8.0), + REAL_CONST(143139.14010471283/8.0), + REAL_CONST(143165.07521941551/8.0), + REAL_CONST(143191.01150874238/8.0), + REAL_CONST(143216.94897258704/8.0), + REAL_CONST(143242.88761084314/8.0), + REAL_CONST(143268.82742340435/8.0), + REAL_CONST(143294.76841016437/8.0), + REAL_CONST(143320.71057101688/8.0), + REAL_CONST(143346.65390585564/8.0), + REAL_CONST(143372.59841457437/8.0), + REAL_CONST(143398.54409706692/8.0), + REAL_CONST(143424.49095322701/8.0), + REAL_CONST(143450.43898294857/8.0), + REAL_CONST(143476.38818612538/8.0), + REAL_CONST(143502.33856265133/8.0), + REAL_CONST(143528.29011242036/8.0), + REAL_CONST(143554.24283532638/8.0), + REAL_CONST(143580.19673126334/8.0), + REAL_CONST(143606.1518001252/8.0), + REAL_CONST(143632.10804180597/8.0), + REAL_CONST(143658.06545619969/8.0), + REAL_CONST(143684.02404320039/8.0), + REAL_CONST(143709.98380270213/8.0), + REAL_CONST(143735.944734599/8.0), + REAL_CONST(143761.90683878519/8.0), + REAL_CONST(143787.87011515474/8.0), + REAL_CONST(143813.83456360188/8.0), + REAL_CONST(143839.8001840208/8.0), + REAL_CONST(143865.76697630569/8.0), + REAL_CONST(143891.73494035081/8.0), + REAL_CONST(143917.7040760504/8.0), + REAL_CONST(143943.67438329876/8.0), + REAL_CONST(143969.6458619902/8.0), + REAL_CONST(143995.61851201905/8.0), + REAL_CONST(144021.59233327967/8.0), + REAL_CONST(144047.56732566646/8.0), + REAL_CONST(144073.54348907378/8.0), + REAL_CONST(144099.52082339607/8.0), + REAL_CONST(144125.49932852783/8.0), + REAL_CONST(144151.4790043635/8.0), + REAL_CONST(144177.45985079758/8.0), + REAL_CONST(144203.44186772458/8.0), + REAL_CONST(144229.42505503909/8.0), + REAL_CONST(144255.40941263564/8.0), + REAL_CONST(144281.39494040885/8.0), + REAL_CONST(144307.38163825331/8.0), + REAL_CONST(144333.36950606373/8.0), + REAL_CONST(144359.35854373468/8.0), + REAL_CONST(144385.34875116093/8.0), + REAL_CONST(144411.34012823718/8.0), + REAL_CONST(144437.33267485813/8.0), + REAL_CONST(144463.32639091855/8.0), + REAL_CONST(144489.32127631325/8.0), + REAL_CONST(144515.31733093705/8.0), + REAL_CONST(144541.31455468474/8.0), + REAL_CONST(144567.3129474512/8.0), + REAL_CONST(144593.3125091313/8.0), + REAL_CONST(144619.31323961995/8.0), + REAL_CONST(144645.31513881206/8.0), + REAL_CONST(144671.31820660262/8.0), + REAL_CONST(144697.32244288657/8.0), + REAL_CONST(144723.32784755889/8.0), + REAL_CONST(144749.33442051467/8.0), + REAL_CONST(144775.34216164888/8.0), + REAL_CONST(144801.35107085665/8.0), + REAL_CONST(144827.36114803303/8.0), + REAL_CONST(144853.37239307314/8.0), + REAL_CONST(144879.38480587213/8.0), + REAL_CONST(144905.39838632516/8.0), + REAL_CONST(144931.41313432742/8.0), + REAL_CONST(144957.4290497741/8.0), + REAL_CONST(144983.44613256046/8.0), + REAL_CONST(145009.46438258173/8.0), + REAL_CONST(145035.48379973322/8.0), + REAL_CONST(145061.50438391021/8.0), + REAL_CONST(145087.52613500805/8.0), + REAL_CONST(145113.54905292206/8.0), + REAL_CONST(145139.57313754765/8.0), + REAL_CONST(145165.59838878017/8.0), + REAL_CONST(145191.62480651509/8.0), + REAL_CONST(145217.65239064783/8.0), + REAL_CONST(145243.68114107384/8.0), + REAL_CONST(145269.71105768863/8.0), + REAL_CONST(145295.74214038774/8.0), + REAL_CONST(145321.77438906668/8.0), + REAL_CONST(145347.80780362099/8.0), + REAL_CONST(145373.84238394629/8.0), + REAL_CONST(145399.87812993818/8.0), + REAL_CONST(145425.91504149229/8.0), + REAL_CONST(145451.95311850426/8.0), + REAL_CONST(145477.9923608698/8.0), + REAL_CONST(145504.03276848458/8.0), + REAL_CONST(145530.07434124436/8.0), + REAL_CONST(145556.11707904484/8.0), + REAL_CONST(145582.16098178181/8.0), + REAL_CONST(145608.20604935108/8.0), + REAL_CONST(145634.25228164849/8.0), + REAL_CONST(145660.29967856981/8.0), + REAL_CONST(145686.34824001096/8.0), + REAL_CONST(145712.39796586783/8.0), + REAL_CONST(145738.4488560363/8.0), + REAL_CONST(145764.50091041232/8.0), + REAL_CONST(145790.55412889185/8.0), + REAL_CONST(145816.60851137087/8.0), + REAL_CONST(145842.66405774537/8.0), + REAL_CONST(145868.72076791141/8.0), + REAL_CONST(145894.77864176501/8.0), + REAL_CONST(145920.83767920226/8.0), + REAL_CONST(145946.89788011924/8.0), + REAL_CONST(145972.95924441208/8.0), + REAL_CONST(145999.02177197693/8.0), + REAL_CONST(146025.08546270995/8.0), + REAL_CONST(146051.15031650732/8.0), + REAL_CONST(146077.21633326527/8.0), + REAL_CONST(146103.28351288004/8.0), + REAL_CONST(146129.35185524789/8.0), + REAL_CONST(146155.42136026506/8.0), + REAL_CONST(146181.49202782792/8.0), + REAL_CONST(146207.56385783272/8.0), + REAL_CONST(146233.63685017588/8.0), + REAL_CONST(146259.71100475377/8.0), + REAL_CONST(146285.78632146274/8.0), + REAL_CONST(146311.86280019928/8.0), + REAL_CONST(146337.94044085976/8.0), + REAL_CONST(146364.01924334071/8.0), + REAL_CONST(146390.09920753856/8.0), + REAL_CONST(146416.18033334985/8.0), + REAL_CONST(146442.26262067116/8.0), + REAL_CONST(146468.34606939898/8.0), + REAL_CONST(146494.43067942993/8.0), + REAL_CONST(146520.51645066062/8.0), + REAL_CONST(146546.60338298764/8.0), + REAL_CONST(146572.69147630769/8.0), + REAL_CONST(146598.78073051744/8.0), + REAL_CONST(146624.87114551352/8.0), + REAL_CONST(146650.96272119274/8.0), + REAL_CONST(146677.05545745179/8.0), + REAL_CONST(146703.14935418745/8.0), + REAL_CONST(146729.2444112965/8.0), + REAL_CONST(146755.34062867577/8.0), + REAL_CONST(146781.43800622207/8.0), + REAL_CONST(146807.53654383228/8.0), + REAL_CONST(146833.63624140329/8.0), + REAL_CONST(146859.73709883197/8.0), + REAL_CONST(146885.83911601527/8.0), + REAL_CONST(146911.94229285014/8.0), + REAL_CONST(146938.04662923355/8.0), + REAL_CONST(146964.15212506248/8.0), + REAL_CONST(146990.25878023397/8.0), + REAL_CONST(147016.36659464505/8.0), + REAL_CONST(147042.47556819281/8.0), + REAL_CONST(147068.58570077427/8.0), + REAL_CONST(147094.6969922866/8.0), + REAL_CONST(147120.80944262692/8.0), + REAL_CONST(147146.92305169237/8.0), + REAL_CONST(147173.03781938017/8.0), + REAL_CONST(147199.15374558745/8.0), + REAL_CONST(147225.27083021149/8.0), + REAL_CONST(147251.38907314953/8.0), + REAL_CONST(147277.50847429881/8.0), + REAL_CONST(147303.62903355664/8.0), + REAL_CONST(147329.75075082036/8.0), + REAL_CONST(147355.87362598727/8.0), + REAL_CONST(147381.99765895473/8.0), + REAL_CONST(147408.12284962015/8.0), + REAL_CONST(147434.24919788091/8.0), + REAL_CONST(147460.37670363448/8.0), + REAL_CONST(147486.50536677826/8.0), + REAL_CONST(147512.63518720976/8.0), + REAL_CONST(147538.76616482646/8.0), + REAL_CONST(147564.89829952587/8.0), + REAL_CONST(147591.03159120557/8.0), + REAL_CONST(147617.16603976308/8.0), + REAL_CONST(147643.30164509601/8.0), + REAL_CONST(147669.43840710199/8.0), + REAL_CONST(147695.57632567859/8.0), + REAL_CONST(147721.71540072354/8.0), + REAL_CONST(147747.85563213445/8.0), + REAL_CONST(147773.99701980909/8.0), + REAL_CONST(147800.13956364512/8.0), + REAL_CONST(147826.28326354033/8.0), + REAL_CONST(147852.42811939248/8.0), + REAL_CONST(147878.57413109933/8.0), + REAL_CONST(147904.72129855872/8.0), + REAL_CONST(147930.86962166851/8.0), + REAL_CONST(147957.01910032652/8.0), + REAL_CONST(147983.16973443062/8.0), + REAL_CONST(148009.32152387875/8.0), + REAL_CONST(148035.47446856883/8.0), + REAL_CONST(148061.62856839882/8.0), + REAL_CONST(148087.78382326665/8.0), + REAL_CONST(148113.94023307035/8.0), + REAL_CONST(148140.09779770792/8.0), + REAL_CONST(148166.25651707739/8.0), + REAL_CONST(148192.41639107687/8.0), + REAL_CONST(148218.57741960438/8.0), + REAL_CONST(148244.73960255808/8.0), + REAL_CONST(148270.90293983606/8.0), + REAL_CONST(148297.0674313365/8.0), + REAL_CONST(148323.23307695755/8.0), + REAL_CONST(148349.39987659742/8.0), + REAL_CONST(148375.56783015432/8.0), + REAL_CONST(148401.73693752653/8.0), + REAL_CONST(148427.90719861226/8.0), + REAL_CONST(148454.07861330983/8.0), + REAL_CONST(148480.25118151752/8.0), + REAL_CONST(148506.42490313368/8.0), + REAL_CONST(148532.59977805667/8.0), + REAL_CONST(148558.77580618486/8.0), + REAL_CONST(148584.95298741665/8.0), + REAL_CONST(148611.13132165043/8.0), + REAL_CONST(148637.31080878471/8.0), + REAL_CONST(148663.49144871789/8.0), + REAL_CONST(148689.6732413485/8.0), + REAL_CONST(148715.85618657502/8.0), + REAL_CONST(148742.040284296/8.0), + REAL_CONST(148768.22553440998/8.0), + REAL_CONST(148794.41193681557/8.0), + REAL_CONST(148820.59949141133/8.0), + REAL_CONST(148846.78819809589/8.0), + REAL_CONST(148872.97805676793/8.0), + REAL_CONST(148899.16906732606/8.0), + REAL_CONST(148925.36122966901/8.0), + REAL_CONST(148951.55454369547/8.0), + REAL_CONST(148977.74900930419/8.0), + REAL_CONST(149003.9446263939/8.0), + REAL_CONST(149030.1413948634/8.0), + REAL_CONST(149056.33931461151/8.0), + REAL_CONST(149082.53838553699/8.0), + REAL_CONST(149108.73860753875/8.0), + REAL_CONST(149134.9399805156/8.0), + REAL_CONST(149161.14250436646/8.0), + REAL_CONST(149187.34617899026/8.0), + REAL_CONST(149213.5510042859/8.0), + REAL_CONST(149239.75698015234/8.0), + REAL_CONST(149265.96410648854/8.0), + REAL_CONST(149292.17238319354/8.0), + REAL_CONST(149318.38181016635/8.0), + REAL_CONST(149344.59238730598/8.0), + REAL_CONST(149370.80411451156/8.0), + REAL_CONST(149397.01699168212/8.0), + REAL_CONST(149423.23101871679/8.0), + REAL_CONST(149449.44619551473/8.0), + REAL_CONST(149475.66252197503/8.0), + REAL_CONST(149501.87999799693/8.0), + REAL_CONST(149528.0986234796/8.0), + REAL_CONST(149554.31839832227/8.0), + REAL_CONST(149580.53932242419/8.0), + REAL_CONST(149606.76139568459/8.0), + REAL_CONST(149632.98461800278/8.0), + REAL_CONST(149659.20898927809/8.0), + REAL_CONST(149685.43450940982/8.0), + REAL_CONST(149711.66117829733/8.0), + REAL_CONST(149737.88899584001/8.0), + REAL_CONST(149764.11796193724/8.0), + REAL_CONST(149790.34807648844/8.0), + REAL_CONST(149816.57933939309/8.0), + REAL_CONST(149842.81175055061/8.0), + REAL_CONST(149869.04530986046/8.0), + REAL_CONST(149895.28001722222/8.0), + REAL_CONST(149921.51587253538/8.0), + REAL_CONST(149947.75287569952/8.0), + REAL_CONST(149973.99102661415/8.0), + REAL_CONST(150000.23032517891/8.0), + REAL_CONST(150026.47077129342/8.0), + REAL_CONST(150052.71236485732/8.0), + REAL_CONST(150078.95510577026/8.0), + REAL_CONST(150105.1989939319/8.0), + REAL_CONST(150131.444029242/8.0), + REAL_CONST(150157.69021160025/8.0), + REAL_CONST(150183.93754090639/8.0), + REAL_CONST(150210.18601706024/8.0), + REAL_CONST(150236.43563996154/8.0), + REAL_CONST(150262.68640951012/8.0), + REAL_CONST(150288.93832560582/8.0), + REAL_CONST(150315.19138814852/8.0), + REAL_CONST(150341.44559703805/8.0), + REAL_CONST(150367.70095217437/8.0), + REAL_CONST(150393.95745345735/8.0), + REAL_CONST(150420.21510078697/8.0), + REAL_CONST(150446.47389406321/8.0), + REAL_CONST(150472.73383318601/8.0), + REAL_CONST(150498.99491805542/8.0), + REAL_CONST(150525.25714857146/8.0), + REAL_CONST(150551.52052463419/8.0), + REAL_CONST(150577.78504614369/8.0), + REAL_CONST(150604.05071300003/8.0), + REAL_CONST(150630.31752510337/8.0), + REAL_CONST(150656.58548235384/8.0), + REAL_CONST(150682.85458465159/8.0), + REAL_CONST(150709.1248318968/8.0), + REAL_CONST(150735.39622398972/8.0), + REAL_CONST(150761.66876083051/8.0), + REAL_CONST(150787.9424423195/8.0), + REAL_CONST(150814.21726835691/8.0), + REAL_CONST(150840.49323884305/8.0), + REAL_CONST(150866.77035367821/8.0), + REAL_CONST(150893.04861276277/8.0), + REAL_CONST(150919.32801599705/8.0), + REAL_CONST(150945.60856328148/8.0), + REAL_CONST(150971.89025451642/8.0), + REAL_CONST(150998.17308960229/8.0), + REAL_CONST(151024.45706843957/8.0), + REAL_CONST(151050.74219092872/8.0), + REAL_CONST(151077.02845697021/8.0), + REAL_CONST(151103.31586646455/8.0), + REAL_CONST(151129.60441931229/8.0), + REAL_CONST(151155.894115414/8.0), + REAL_CONST(151182.1849546702/8.0), + REAL_CONST(151208.47693698155/8.0), + REAL_CONST(151234.77006224863/8.0), + REAL_CONST(151261.06433037209/8.0), + REAL_CONST(151287.35974125259/8.0), + REAL_CONST(151313.65629479082/8.0), + REAL_CONST(151339.95399088747/8.0), + REAL_CONST(151366.25282944329/8.0), + REAL_CONST(151392.55281035902/8.0), + REAL_CONST(151418.85393353543/8.0), + REAL_CONST(151445.1561988733/8.0), + REAL_CONST(151471.45960627345/8.0), + REAL_CONST(151497.76415563675/8.0), + REAL_CONST(151524.06984686397/8.0), + REAL_CONST(151550.37667985607/8.0), + REAL_CONST(151576.68465451393/8.0), + REAL_CONST(151602.99377073845/8.0), + REAL_CONST(151629.30402843058/8.0), + REAL_CONST(151655.61542749128/8.0), + REAL_CONST(151681.92796782157/8.0), + REAL_CONST(151708.24164932242/8.0), + REAL_CONST(151734.55647189484/8.0), + REAL_CONST(151760.87243543993/8.0), + REAL_CONST(151787.18953985872/8.0), + REAL_CONST(151813.50778505235/8.0), + REAL_CONST(151839.82717092187/8.0), + REAL_CONST(151866.14769736846/8.0), + REAL_CONST(151892.46936429327/8.0), + REAL_CONST(151918.79217159748/8.0), + REAL_CONST(151945.11611918229/8.0), + REAL_CONST(151971.44120694889/8.0), + REAL_CONST(151997.76743479856/8.0), + REAL_CONST(152024.09480263255/8.0), + REAL_CONST(152050.42331035214/8.0), + REAL_CONST(152076.75295785864/8.0), + REAL_CONST(152103.08374505339/8.0), + REAL_CONST(152129.41567183775/8.0), + REAL_CONST(152155.74873811303/8.0), + REAL_CONST(152182.08294378067/8.0), + REAL_CONST(152208.41828874208/8.0), + REAL_CONST(152234.75477289871/8.0), + REAL_CONST(152261.09239615197/8.0), + REAL_CONST(152287.43115840337/8.0), + REAL_CONST(152313.77105955439/8.0), + REAL_CONST(152340.11209950657/8.0), + REAL_CONST(152366.45427816146/8.0), + REAL_CONST(152392.79759542056/8.0), + REAL_CONST(152419.14205118554/8.0), + REAL_CONST(152445.48764535793/8.0), + REAL_CONST(152471.8343778394/8.0), + REAL_CONST(152498.18224853161/8.0), + REAL_CONST(152524.53125733617/8.0), + REAL_CONST(152550.88140415482/8.0), + REAL_CONST(152577.23268888926/8.0), + REAL_CONST(152603.58511144121/8.0), + REAL_CONST(152629.93867171241/8.0), + REAL_CONST(152656.29336960468/8.0), + REAL_CONST(152682.64920501978/8.0), + REAL_CONST(152709.00617785956/8.0), + REAL_CONST(152735.36428802583/8.0), + REAL_CONST(152761.72353542043/8.0), + REAL_CONST(152788.08391994529/8.0), + REAL_CONST(152814.44544150229/8.0), + REAL_CONST(152840.80809999333/8.0), + REAL_CONST(152867.17189532038/8.0), + REAL_CONST(152893.53682738543/8.0), + REAL_CONST(152919.90289609041/8.0), + REAL_CONST(152946.27010133737/8.0), + REAL_CONST(152972.63844302832/8.0), + REAL_CONST(152999.00792106529/8.0), + REAL_CONST(153025.37853535041/8.0), + REAL_CONST(153051.7502857857/8.0), + REAL_CONST(153078.12317227334/8.0), + REAL_CONST(153104.4971947154/8.0), + REAL_CONST(153130.8723530141/8.0), + REAL_CONST(153157.24864707157/8.0), + REAL_CONST(153183.62607679001/8.0), + REAL_CONST(153210.00464207167/8.0), + REAL_CONST(153236.38434281875/8.0), + REAL_CONST(153262.76517893354/8.0), + REAL_CONST(153289.14715031831/8.0), + REAL_CONST(153315.53025687535/8.0), + REAL_CONST(153341.91449850702/8.0), + REAL_CONST(153368.2998751156/8.0), + REAL_CONST(153394.68638660354/8.0), + REAL_CONST(153421.07403287315/8.0), + REAL_CONST(153447.46281382689/8.0), + REAL_CONST(153473.85272936718/8.0), + REAL_CONST(153500.24377939643/8.0), + REAL_CONST(153526.63596381716/8.0), + REAL_CONST(153553.02928253182/8.0), + REAL_CONST(153579.42373544298/8.0), + REAL_CONST(153605.81932245308/8.0), + REAL_CONST(153632.21604346478/8.0), + REAL_CONST(153658.61389838057/8.0), + REAL_CONST(153685.0128871031/8.0), + REAL_CONST(153711.41300953497/8.0), + REAL_CONST(153737.81426557881/8.0), + REAL_CONST(153764.21665513728/8.0), + REAL_CONST(153790.62017811305/8.0), + REAL_CONST(153817.02483440886/8.0), + REAL_CONST(153843.43062392739/8.0), + REAL_CONST(153869.83754657139/8.0), + REAL_CONST(153896.24560224367/8.0), + REAL_CONST(153922.65479084692/8.0), + REAL_CONST(153949.06511228404/8.0), + REAL_CONST(153975.4765664578/8.0), + REAL_CONST(154001.88915327107/8.0), + REAL_CONST(154028.30287262669/8.0), + REAL_CONST(154054.71772442761/8.0), + REAL_CONST(154081.13370857667/8.0), + REAL_CONST(154107.55082497682/8.0), + REAL_CONST(154133.96907353101/8.0), + REAL_CONST(154160.38845414223/8.0), + REAL_CONST(154186.80896671346/8.0), + REAL_CONST(154213.23061114774/8.0), + REAL_CONST(154239.65338734805/8.0), + REAL_CONST(154266.07729521746/8.0), + REAL_CONST(154292.50233465908/8.0), + REAL_CONST(154318.92850557598/8.0), + REAL_CONST(154345.35580787127/8.0), + REAL_CONST(154371.7842414481/8.0), + REAL_CONST(154398.21380620965/8.0), + REAL_CONST(154424.64450205903/8.0), + REAL_CONST(154451.07632889951/8.0), + REAL_CONST(154477.50928663427/8.0), + REAL_CONST(154503.94337516659/8.0), + REAL_CONST(154530.37859439969/8.0), + REAL_CONST(154556.81494423689/8.0), + REAL_CONST(154583.25242458144/8.0), + REAL_CONST(154609.69103533673/8.0), + REAL_CONST(154636.13077640603/8.0), + REAL_CONST(154662.57164769279/8.0), + REAL_CONST(154689.01364910032/8.0), + REAL_CONST(154715.45678053208/8.0), + REAL_CONST(154741.90104189145/8.0), + REAL_CONST(154768.34643308193/8.0), + REAL_CONST(154794.79295400696/8.0), + REAL_CONST(154821.24060457002/8.0), + REAL_CONST(154847.68938467462/8.0), + REAL_CONST(154874.13929422433/8.0), + REAL_CONST(154900.59033312264/8.0), + REAL_CONST(154927.04250127316/8.0), + REAL_CONST(154953.49579857948/8.0), + REAL_CONST(154979.95022494521/8.0), + REAL_CONST(155006.40578027396/8.0), + REAL_CONST(155032.86246446942/8.0), + REAL_CONST(155059.32027743524/8.0), + REAL_CONST(155085.77921907514/8.0), + REAL_CONST(155112.2392892928/8.0), + REAL_CONST(155138.70048799197/8.0), + REAL_CONST(155165.16281507642/8.0), + REAL_CONST(155191.62627044989/8.0), + REAL_CONST(155218.09085401625/8.0), + REAL_CONST(155244.55656567923/8.0), + REAL_CONST(155271.02340534274/8.0), + REAL_CONST(155297.49137291059/8.0), + REAL_CONST(155323.96046828668/8.0), + REAL_CONST(155350.4306913749/8.0), + REAL_CONST(155376.90204207919/8.0), + REAL_CONST(155403.37452030348/8.0), + REAL_CONST(155429.84812595171/8.0), + REAL_CONST(155456.32285892789/8.0), + REAL_CONST(155482.79871913602/8.0), + REAL_CONST(155509.27570648011/8.0), + REAL_CONST(155535.75382086422/8.0), + REAL_CONST(155562.23306219239/8.0), + REAL_CONST(155588.71343036872/8.0), + REAL_CONST(155615.19492529731/8.0), + REAL_CONST(155641.67754688227/8.0), + REAL_CONST(155668.16129502779/8.0), + REAL_CONST(155694.64616963797/8.0), + REAL_CONST(155721.13217061706/8.0), + REAL_CONST(155747.61929786921/8.0), + REAL_CONST(155774.10755129869/8.0), + REAL_CONST(155800.59693080973/8.0), + REAL_CONST(155827.08743630661/8.0), + REAL_CONST(155853.57906769359/8.0), + REAL_CONST(155880.07182487496/8.0), + REAL_CONST(155906.56570775513/8.0), + REAL_CONST(155933.06071623837/8.0), + REAL_CONST(155959.55685022907/8.0), + REAL_CONST(155986.05410963166/8.0), + REAL_CONST(156012.5524943505/8.0), + REAL_CONST(156039.05200429002/8.0), + REAL_CONST(156065.55263935472/8.0), + REAL_CONST(156092.054399449/8.0), + REAL_CONST(156118.5572844774/8.0), + REAL_CONST(156145.06129434443/8.0), + REAL_CONST(156171.5664289546/8.0), + REAL_CONST(156198.07268821247/8.0), + REAL_CONST(156224.5800720226/8.0), + REAL_CONST(156251.08858028959/8.0), + REAL_CONST(156277.59821291809/8.0), + REAL_CONST(156304.10896981266/8.0), + REAL_CONST(156330.62085087801/8.0), + REAL_CONST(156357.1338560188/8.0), + REAL_CONST(156383.64798513969/8.0), + REAL_CONST(156410.16323814544/8.0), + REAL_CONST(156436.67961494075/8.0), + REAL_CONST(156463.1971154304/8.0), + REAL_CONST(156489.71573951913/8.0), + REAL_CONST(156516.23548711176/8.0), + REAL_CONST(156542.75635811311/8.0), + REAL_CONST(156569.27835242799/8.0), + REAL_CONST(156595.80146996127/8.0), + REAL_CONST(156622.32571061782/8.0), + REAL_CONST(156648.85107430254/8.0), + REAL_CONST(156675.37756092031/8.0), + REAL_CONST(156701.90517037612/8.0), + REAL_CONST(156728.43390257491/8.0), + REAL_CONST(156754.96375742162/8.0), + REAL_CONST(156781.49473482129/8.0), + REAL_CONST(156808.02683467892/8.0), + REAL_CONST(156834.5600568995/8.0), + REAL_CONST(156861.09440138817/8.0), + REAL_CONST(156887.62986804993/8.0), + REAL_CONST(156914.16645678994/8.0), + REAL_CONST(156940.70416751326/8.0), + REAL_CONST(156967.24300012505/8.0), + REAL_CONST(156993.78295453047/8.0), + REAL_CONST(157020.32403063469/8.0), + REAL_CONST(157046.8662283429/8.0), + REAL_CONST(157073.40954756032/8.0), + REAL_CONST(157099.9539881922/8.0), + REAL_CONST(157126.49955014378/8.0), + REAL_CONST(157153.04623332032/8.0), + REAL_CONST(157179.59403762716/8.0), + REAL_CONST(157206.14296296958/8.0), + REAL_CONST(157232.69300925292/8.0), + REAL_CONST(157259.24417638258/8.0), + REAL_CONST(157285.79646426387/8.0), + REAL_CONST(157312.34987280221/8.0), + REAL_CONST(157338.90440190304/8.0), + REAL_CONST(157365.46005147175/8.0), + REAL_CONST(157392.01682141385/8.0), + REAL_CONST(157418.57471163478/8.0), + REAL_CONST(157445.13372204005/8.0), + REAL_CONST(157471.69385253513/8.0), + REAL_CONST(157498.25510302564/8.0), + REAL_CONST(157524.81747341706/8.0), + REAL_CONST(157551.38096361503/8.0), + REAL_CONST(157577.9455735251/8.0), + REAL_CONST(157604.51130305286/8.0), + REAL_CONST(157631.07815210402/8.0), + REAL_CONST(157657.64612058419/8.0), + REAL_CONST(157684.21520839902/8.0), + REAL_CONST(157710.78541545427/8.0), + REAL_CONST(157737.35674165559/8.0), + REAL_CONST(157763.92918690876/8.0), + REAL_CONST(157790.50275111952/8.0), + REAL_CONST(157817.07743419363/8.0), + REAL_CONST(157843.65323603692/8.0), + REAL_CONST(157870.23015655516/8.0), + REAL_CONST(157896.80819565422/8.0), + REAL_CONST(157923.3873532399/8.0), + REAL_CONST(157949.96762921812/8.0), + REAL_CONST(157976.54902349479/8.0), + REAL_CONST(158003.13153597576/8.0), + REAL_CONST(158029.71516656701/8.0), + REAL_CONST(158056.29991517449/8.0), + REAL_CONST(158082.88578170416/8.0), + REAL_CONST(158109.47276606198/8.0), + REAL_CONST(158136.06086815402/8.0), + REAL_CONST(158162.65008788629/8.0), + REAL_CONST(158189.24042516484/8.0), + REAL_CONST(158215.83187989573/8.0), + REAL_CONST(158242.42445198505/8.0), + REAL_CONST(158269.01814133892/8.0), + REAL_CONST(158295.61294786347/8.0), + REAL_CONST(158322.20887146486/8.0), + REAL_CONST(158348.80591204923/8.0), + REAL_CONST(158375.4040695228/8.0), + REAL_CONST(158402.00334379176/8.0), + REAL_CONST(158428.60373476235/8.0), + REAL_CONST(158455.2052423408/8.0), + REAL_CONST(158481.80786643337/8.0), + REAL_CONST(158508.41160694641/8.0), + REAL_CONST(158535.01646378616/8.0), + REAL_CONST(158561.62243685898/8.0), + REAL_CONST(158588.2295260712/8.0), + REAL_CONST(158614.8377313292/8.0), + REAL_CONST(158641.44705253936/8.0), + REAL_CONST(158668.05748960807/8.0), + REAL_CONST(158694.66904244179/8.0), + REAL_CONST(158721.28171094693/8.0), + REAL_CONST(158747.89549502998/8.0), + REAL_CONST(158774.5103945974/8.0), + REAL_CONST(158801.12640955573/8.0), + REAL_CONST(158827.74353981143/8.0), + REAL_CONST(158854.36178527112/8.0), + REAL_CONST(158880.9811458413/8.0), + REAL_CONST(158907.60162142856/8.0), + REAL_CONST(158934.22321193956/8.0), + REAL_CONST(158960.84591728085/8.0), + REAL_CONST(158987.46973735912/8.0), + REAL_CONST(159014.09467208097/8.0), + REAL_CONST(159040.72072135314/8.0), + REAL_CONST(159067.3478850823/8.0), + REAL_CONST(159093.97616317519/8.0), + REAL_CONST(159120.60555553852/8.0), + REAL_CONST(159147.23606207906/8.0), + REAL_CONST(159173.8676827036/8.0), + REAL_CONST(159200.50041731889/8.0), + REAL_CONST(159227.13426583182/8.0), + REAL_CONST(159253.76922814918/8.0), + REAL_CONST(159280.40530417781/8.0), + REAL_CONST(159307.04249382461/8.0), + REAL_CONST(159333.68079699649/8.0), + REAL_CONST(159360.32021360032/8.0), + REAL_CONST(159386.96074354305/8.0), + REAL_CONST(159413.60238673165/8.0), + REAL_CONST(159440.24514307309/8.0), + REAL_CONST(159466.88901247433/8.0), + REAL_CONST(159493.53399484244/8.0), + REAL_CONST(159520.18009008438/8.0), + REAL_CONST(159546.82729810724/8.0), + REAL_CONST(159573.47561881805/8.0), + REAL_CONST(159600.12505212394/8.0), + REAL_CONST(159626.77559793202/8.0), + REAL_CONST(159653.42725614941/8.0), + REAL_CONST(159680.08002668325/8.0), + REAL_CONST(159706.73390944069/8.0), + REAL_CONST(159733.38890432892/8.0), + REAL_CONST(159760.04501125516/8.0), + REAL_CONST(159786.70223012666/8.0), + REAL_CONST(159813.36056085059/8.0), + REAL_CONST(159840.02000333427/8.0), + REAL_CONST(159866.68055748497/8.0), + REAL_CONST(159893.34222320997/8.0), + REAL_CONST(159920.00500041663/8.0), + REAL_CONST(159946.66888901225/8.0), + REAL_CONST(159973.33388890422/8.0), + REAL_CONST(159999.99999999988/8.0), + REAL_CONST(160026.66722220668/8.0), + REAL_CONST(160053.33555543202/8.0), + REAL_CONST(160080.0049995833/8.0), + REAL_CONST(160106.67555456801/8.0), + REAL_CONST(160133.3472202936/8.0), + REAL_CONST(160160.0199966676/8.0), + REAL_CONST(160186.6938835975/8.0), + REAL_CONST(160213.36888099083/8.0), + REAL_CONST(160240.04498875517/8.0), + REAL_CONST(160266.72220679806/8.0), + REAL_CONST(160293.40053502709/8.0), + REAL_CONST(160320.07997334987/8.0), + REAL_CONST(160346.76052167406/8.0), + REAL_CONST(160373.44217990729/8.0), + REAL_CONST(160400.1249479572/8.0), + REAL_CONST(160426.80882573154/8.0), + REAL_CONST(160453.49381313793/8.0), + REAL_CONST(160480.17991008417/8.0), + REAL_CONST(160506.86711647795/8.0), + REAL_CONST(160533.55543222709/8.0), + REAL_CONST(160560.24485723933/8.0), + REAL_CONST(160586.93539142248/8.0), + REAL_CONST(160613.62703468435/8.0), + REAL_CONST(160640.31978693281/8.0), + REAL_CONST(160667.01364807569/8.0), + REAL_CONST(160693.70861802087/8.0), + REAL_CONST(160720.40469667627/8.0), + REAL_CONST(160747.1018839498/8.0), + REAL_CONST(160773.80017974938/8.0), + REAL_CONST(160800.49958398298/8.0), + REAL_CONST(160827.20009655855/8.0), + REAL_CONST(160853.90171738411/8.0), + REAL_CONST(160880.60444636765/8.0), + REAL_CONST(160907.30828341722/8.0), + REAL_CONST(160934.01322844089/8.0), + REAL_CONST(160960.71928134665/8.0), + REAL_CONST(160987.42644204266/8.0), + REAL_CONST(161014.13471043704/8.0), + REAL_CONST(161040.84408643784/8.0), + REAL_CONST(161067.55456995327/8.0), + REAL_CONST(161094.26616089148/8.0), + REAL_CONST(161120.97885916062/8.0), + REAL_CONST(161147.69266466892/8.0), + REAL_CONST(161174.40757732463/8.0), + REAL_CONST(161201.12359703594/8.0), + REAL_CONST(161227.84072371112/8.0), + REAL_CONST(161254.55895725847/8.0), + REAL_CONST(161281.27829758628/8.0), + REAL_CONST(161307.99874460287/8.0), + REAL_CONST(161334.72029821656/8.0), + REAL_CONST(161361.44295833571/8.0), + REAL_CONST(161388.1667248687/8.0), + REAL_CONST(161414.89159772391/8.0), + REAL_CONST(161441.61757680977/8.0), + REAL_CONST(161468.34466203468/8.0), + REAL_CONST(161495.07285330712/8.0), + REAL_CONST(161521.80215053557/8.0), + REAL_CONST(161548.53255362847/8.0), + REAL_CONST(161575.26406249436/8.0), + REAL_CONST(161601.99667704175/8.0), + REAL_CONST(161628.7303971792/8.0), + REAL_CONST(161655.46522281526/8.0), + REAL_CONST(161682.20115385848/8.0), + REAL_CONST(161708.93819021754/8.0), + REAL_CONST(161735.67633180099/8.0), + REAL_CONST(161762.41557851751/8.0), + REAL_CONST(161789.15593027571/8.0), + REAL_CONST(161815.89738698432/8.0), + REAL_CONST(161842.63994855201/8.0), + REAL_CONST(161869.38361488748/8.0), + REAL_CONST(161896.1283858995/8.0), + REAL_CONST(161922.87426149679/8.0), + REAL_CONST(161949.62124158812/8.0), + REAL_CONST(161976.36932608229/8.0), + REAL_CONST(162003.1185148881/8.0), + REAL_CONST(162029.8688079144/8.0), + REAL_CONST(162056.62020507001/8.0), + REAL_CONST(162083.37270626382/8.0), + REAL_CONST(162110.12631140469/8.0), + REAL_CONST(162136.88102040152/8.0), + REAL_CONST(162163.63683316324/8.0), + REAL_CONST(162190.39374959879/8.0), + REAL_CONST(162217.15176961714/8.0), + REAL_CONST(162243.91089312723/8.0), + REAL_CONST(162270.67112003808/8.0), + REAL_CONST(162297.43245025873/8.0), + REAL_CONST(162324.19488369819/8.0), + REAL_CONST(162350.9584202655/8.0), + REAL_CONST(162377.72305986975/8.0), + REAL_CONST(162404.48880242003/8.0), + REAL_CONST(162431.25564782543/8.0), + REAL_CONST(162458.02359599507/8.0), + REAL_CONST(162484.79264683815/8.0), + REAL_CONST(162511.56280026378/8.0), + REAL_CONST(162538.33405618116/8.0), + REAL_CONST(162565.10641449949/8.0), + REAL_CONST(162591.87987512801/8.0), + REAL_CONST(162618.65443797593/8.0), + REAL_CONST(162645.43010295252/8.0), + REAL_CONST(162672.20686996708/8.0), + REAL_CONST(162698.98473892888/8.0), + REAL_CONST(162725.76370974723/8.0), + REAL_CONST(162752.54378233149/8.0), + REAL_CONST(162779.32495659095/8.0), + REAL_CONST(162806.10723243505/8.0), + REAL_CONST(162832.89060977317/8.0), + REAL_CONST(162859.67508851466/8.0), + REAL_CONST(162886.46066856899/8.0), + REAL_CONST(162913.24734984562/8.0), + REAL_CONST(162940.03513225398/8.0), + REAL_CONST(162966.82401570358/8.0), + REAL_CONST(162993.6140001039/8.0), + REAL_CONST(163020.40508536444/8.0), + REAL_CONST(163047.19727139481/8.0), + REAL_CONST(163073.99055810447/8.0), + REAL_CONST(163100.78494540305/8.0), + REAL_CONST(163127.58043320014/8.0), + REAL_CONST(163154.37702140535/8.0), + REAL_CONST(163181.17470992831/8.0), + REAL_CONST(163207.97349867865/8.0), + REAL_CONST(163234.77338756606/8.0), + REAL_CONST(163261.57437650024/8.0), + REAL_CONST(163288.37646539087/8.0), + REAL_CONST(163315.17965414765/8.0), + REAL_CONST(163341.98394268038/8.0), + REAL_CONST(163368.78933089875/8.0), + REAL_CONST(163395.59581871261/8.0), + REAL_CONST(163422.40340603172/8.0), + REAL_CONST(163449.2120927659/8.0), + REAL_CONST(163476.02187882498/8.0), + REAL_CONST(163502.83276411882/8.0), + REAL_CONST(163529.6447485573/8.0), + REAL_CONST(163556.45783205028/8.0), + REAL_CONST(163583.2720145077/8.0), + REAL_CONST(163610.08729583945/8.0), + REAL_CONST(163636.90367595552/8.0), + REAL_CONST(163663.72115476584/8.0), + REAL_CONST(163690.53973218042/8.0), + REAL_CONST(163717.35940810922/8.0), + REAL_CONST(163744.18018246227/8.0), + REAL_CONST(163771.00205514964/8.0), + REAL_CONST(163797.82502608138/8.0), + REAL_CONST(163824.64909516752/8.0), + REAL_CONST(163851.4742623182/8.0), + REAL_CONST(163878.3005274435/8.0), + REAL_CONST(163905.12789045356/8.0), + REAL_CONST(163931.95635125853/8.0), + REAL_CONST(163958.78590976857/8.0), + REAL_CONST(163985.61656589387/8.0), + REAL_CONST(164012.44831954464/8.0), + REAL_CONST(164039.28117063109/8.0), + REAL_CONST(164066.11511906344/8.0), + REAL_CONST(164092.95016475199/8.0), + REAL_CONST(164119.78630760699/8.0), + REAL_CONST(164146.62354753874/8.0), + REAL_CONST(164173.46188445756/8.0), + REAL_CONST(164200.30131827376/8.0), + REAL_CONST(164227.14184889771/8.0), + REAL_CONST(164253.98347623978/8.0), + REAL_CONST(164280.82620021031/8.0), + REAL_CONST(164307.67002071979/8.0), + REAL_CONST(164334.51493767856/8.0), + REAL_CONST(164361.3609509971/8.0), + REAL_CONST(164388.20806058586/8.0), + REAL_CONST(164415.05626635533/8.0), + REAL_CONST(164441.905568216/8.0), + REAL_CONST(164468.75596607837/8.0), + REAL_CONST(164495.607459853/8.0), + REAL_CONST(164522.4600494504/8.0), + REAL_CONST(164549.31373478117/8.0), + REAL_CONST(164576.16851575591/8.0), + REAL_CONST(164603.02439228518/8.0), + REAL_CONST(164629.88136427966/8.0), + REAL_CONST(164656.73943164994/8.0), + REAL_CONST(164683.59859430668/8.0), + REAL_CONST(164710.45885216061/8.0), + REAL_CONST(164737.32020512238/8.0), + REAL_CONST(164764.1826531027/8.0), + REAL_CONST(164791.04619601235/8.0), + REAL_CONST(164817.91083376206/8.0), + REAL_CONST(164844.77656626256/8.0), + REAL_CONST(164871.64339342469/8.0), + REAL_CONST(164898.51131515924/8.0), + REAL_CONST(164925.38033137703/8.0), + REAL_CONST(164952.25044198887/8.0), + REAL_CONST(164979.1216469057/8.0), + REAL_CONST(165005.9939460383/8.0), + REAL_CONST(165032.86733929763/8.0), + REAL_CONST(165059.7418265946/8.0), + REAL_CONST(165086.61740784015/8.0), + REAL_CONST(165113.4940829452/8.0) +#endif +}; + +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/is.c b/src/contrib/aacdecoder/libfaad/is.c old mode 100644 new mode 100755 index 5a4976d3f..5236db077 --- a/src/contrib/aacdecoder/libfaad/is.c +++ b/src/contrib/aacdecoder/libfaad/is.c @@ -1,104 +1,109 @@ -/* -** 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: is.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "is.h" - -#ifdef FIXED_POINT -static real_t pow05_table[] = { - COEF_CONST(1.68179283050743), /* 0.5^(-3/4) */ - COEF_CONST(1.41421356237310), /* 0.5^(-2/4) */ - COEF_CONST(1.18920711500272), /* 0.5^(-1/4) */ - COEF_CONST(1.0), /* 0.5^( 0/4) */ - COEF_CONST(0.84089641525371), /* 0.5^(+1/4) */ - COEF_CONST(0.70710678118655), /* 0.5^(+2/4) */ - COEF_CONST(0.59460355750136) /* 0.5^(+3/4) */ -}; -#endif - -void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len) -{ - uint8_t g, sfb, b; - uint16_t i; -#ifndef FIXED_POINT - real_t scale; -#else - int32_t exp, frac; -#endif - - uint16_t nshort = frame_len/8; - uint8_t group = 0; - - for (g = 0; g < icsr->num_window_groups; g++) - { - /* Do intensity stereo decoding */ - for (b = 0; b < icsr->window_group_length[g]; b++) - { - for (sfb = 0; sfb < icsr->max_sfb; sfb++) - { - if (is_intensity(icsr, g, sfb)) - { - /* For scalefactor bands coded in intensity stereo the - corresponding predictors in the right channel are - switched to "off". - */ - ics->pred.prediction_used[sfb] = 0; - icsr->pred.prediction_used[sfb] = 0; - -#ifndef FIXED_POINT - scale = (real_t)pow(0.5, (0.25*icsr->scale_factors[g][sfb])); -#else - exp = icsr->scale_factors[g][sfb] >> 2; - frac = icsr->scale_factors[g][sfb] & 3; -#endif - - /* Scale from left to right channel, - do not touch left channel */ - for (i = icsr->swb_offset[sfb]; i < icsr->swb_offset[sfb+1]; i++) - { -#ifndef FIXED_POINT - r_spec[(group*nshort)+i] = MUL_R(l_spec[(group*nshort)+i], scale); -#else - if (exp < 0) - r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] << -exp; - else - r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] >> exp; - r_spec[(group*nshort)+i] = MUL_C(r_spec[(group*nshort)+i], pow05_table[frac + 3]); -#endif - if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) - r_spec[(group*nshort)+i] = -r_spec[(group*nshort)+i]; - } - } - } - group++; - } - } -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: is.c,v 1.28 2007/11/01 12:33:31 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include "syntax.h" +#include "is.h" + +#ifdef FIXED_POINT +static real_t pow05_table[] = { + COEF_CONST(1.68179283050743), /* 0.5^(-3/4) */ + COEF_CONST(1.41421356237310), /* 0.5^(-2/4) */ + COEF_CONST(1.18920711500272), /* 0.5^(-1/4) */ + COEF_CONST(1.0), /* 0.5^( 0/4) */ + COEF_CONST(0.84089641525371), /* 0.5^(+1/4) */ + COEF_CONST(0.70710678118655), /* 0.5^(+2/4) */ + COEF_CONST(0.59460355750136) /* 0.5^(+3/4) */ +}; +#endif + +void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, + uint16_t frame_len) +{ + uint8_t g, sfb, b; + uint16_t i; +#ifndef FIXED_POINT + real_t scale; +#else + int32_t exp, frac; +#endif + + uint16_t nshort = frame_len/8; + uint8_t group = 0; + + for (g = 0; g < icsr->num_window_groups; g++) + { + /* Do intensity stereo decoding */ + for (b = 0; b < icsr->window_group_length[g]; b++) + { + for (sfb = 0; sfb < icsr->max_sfb; sfb++) + { + if (is_intensity(icsr, g, sfb)) + { +#ifdef MAIN_DEC + /* For scalefactor bands coded in intensity stereo the + corresponding predictors in the right channel are + switched to "off". + */ + ics->pred.prediction_used[sfb] = 0; + icsr->pred.prediction_used[sfb] = 0; +#endif + +#ifndef FIXED_POINT + scale = (real_t)pow(0.5, (0.25*icsr->scale_factors[g][sfb])); +#else + exp = icsr->scale_factors[g][sfb] >> 2; + frac = icsr->scale_factors[g][sfb] & 3; +#endif + + /* Scale from left to right channel, + do not touch left channel */ + for (i = icsr->swb_offset[sfb]; i < min(icsr->swb_offset[sfb+1], ics->swb_offset_max); i++) + { +#ifndef FIXED_POINT + r_spec[(group*nshort)+i] = MUL_R(l_spec[(group*nshort)+i], scale); +#else + if (exp < 0) + r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] << -exp; + else + r_spec[(group*nshort)+i] = l_spec[(group*nshort)+i] >> exp; + r_spec[(group*nshort)+i] = MUL_C(r_spec[(group*nshort)+i], pow05_table[frac + 3]); +#endif + if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) + r_spec[(group*nshort)+i] = -r_spec[(group*nshort)+i]; + } + } + } + group++; + } + } +} diff --git a/src/contrib/aacdecoder/libfaad/is.h b/src/contrib/aacdecoder/libfaad/is.h old mode 100644 new mode 100755 index 832d62e01..3e3b750ab --- a/src/contrib/aacdecoder/libfaad/is.h +++ b/src/contrib/aacdecoder/libfaad/is.h @@ -1,64 +1,67 @@ -/* -** 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: is.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __IS_H__ -#define __IS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "syntax.h" - -void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len); - -static INLINE int8_t is_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) -{ - switch (ics->sfb_cb[group][sfb]) - { - case INTENSITY_HCB: - return 1; - case INTENSITY_HCB2: - return -1; - default: - return 0; - } -} - -static INLINE int8_t invert_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) -{ - if (ics->ms_mask_present == 1) - return (1-2*ics->ms_used[group][sfb]); - return 1; -} - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: is.h,v 1.20 2007/11/01 12:33:31 menno Exp $ +**/ + +#ifndef __IS_H__ +#define __IS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "syntax.h" + +void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, + uint16_t frame_len); + +static INLINE int8_t is_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) +{ + switch (ics->sfb_cb[group][sfb]) + { + case INTENSITY_HCB: + return 1; + case INTENSITY_HCB2: + return -1; + default: + return 0; + } +} + +static INLINE int8_t invert_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) +{ + if (ics->ms_mask_present == 1) + return (1-2*ics->ms_used[group][sfb]); + return 1; +} + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/kbd_win.h b/src/contrib/aacdecoder/libfaad/kbd_win.h old mode 100644 new mode 100755 index 84a008da6..de404c7ea --- a/src/contrib/aacdecoder/libfaad/kbd_win.h +++ b/src/contrib/aacdecoder/libfaad/kbd_win.h @@ -1,2294 +1,2297 @@ -/* -** 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: kbd_win.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __KBD_WIN_H__ -#define __KBD_WIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t kbd_long_1024[] = -{ - FRAC_CONST(0.00029256153896361), - FRAC_CONST(0.00042998567353047), - FRAC_CONST(0.00054674074589540), - FRAC_CONST(0.00065482304299792), - FRAC_CONST(0.00075870195068747), - FRAC_CONST(0.00086059331713336), - FRAC_CONST(0.00096177541439010), - FRAC_CONST(0.0010630609410878), - FRAC_CONST(0.0011650036308132), - FRAC_CONST(0.0012680012194148), - FRAC_CONST(0.0013723517232956), - FRAC_CONST(0.0014782864109136), - FRAC_CONST(0.0015859901976719), - FRAC_CONST(0.0016956148252373), - FRAC_CONST(0.0018072876903517), - FRAC_CONST(0.0019211179405514), - FRAC_CONST(0.0020372007924215), - FRAC_CONST(0.0021556206591754), - FRAC_CONST(0.0022764534599614), - FRAC_CONST(0.0023997683540995), - FRAC_CONST(0.0025256290631156), - FRAC_CONST(0.0026540948920831), - FRAC_CONST(0.0027852215281403), - FRAC_CONST(0.0029190616715331), - FRAC_CONST(0.0030556655443223), - FRAC_CONST(0.0031950812943391), - FRAC_CONST(0.0033373553240392), - FRAC_CONST(0.0034825325586930), - FRAC_CONST(0.0036306566699199), - FRAC_CONST(0.0037817702604646), - FRAC_CONST(0.0039359150179719), - FRAC_CONST(0.0040931318437260), - FRAC_CONST(0.0042534609610026), - FRAC_CONST(0.0044169420066964), - FRAC_CONST(0.0045836141091341), - FRAC_CONST(0.0047535159544086), - FRAC_CONST(0.0049266858431214), - FRAC_CONST(0.0051031617390698), - FRAC_CONST(0.0052829813111335), - FRAC_CONST(0.0054661819693975), - FRAC_CONST(0.0056528008963682), - FRAC_CONST(0.0058428750739943), - FRAC_CONST(0.0060364413070882), - FRAC_CONST(0.0062335362436492), - FRAC_CONST(0.0064341963925079), - FRAC_CONST(0.0066384581386503), - FRAC_CONST(0.0068463577565218), - FRAC_CONST(0.0070579314215715), - FRAC_CONST(0.0072732152202559), - FRAC_CONST(0.0074922451586909), - FRAC_CONST(0.0077150571701162), - FRAC_CONST(0.0079416871213115), - FRAC_CONST(0.0081721708180857), - FRAC_CONST(0.0084065440099458), - FRAC_CONST(0.0086448423940363), - FRAC_CONST(0.0088871016184291), - FRAC_CONST(0.0091333572848345), - FRAC_CONST(0.0093836449507939), - FRAC_CONST(0.0096380001314086), - FRAC_CONST(0.0098964583006517), - FRAC_CONST(0.010159054892306), - FRAC_CONST(0.010425825300561), - FRAC_CONST(0.010696804880310), - FRAC_CONST(0.010972028947167), - FRAC_CONST(0.011251532777236), - FRAC_CONST(0.011535351606646), - FRAC_CONST(0.011823520630897), - FRAC_CONST(0.012116075003993), - FRAC_CONST(0.012413049837429), - FRAC_CONST(0.012714480198999), - FRAC_CONST(0.013020401111478), - FRAC_CONST(0.013330847551161), - FRAC_CONST(0.013645854446288), - FRAC_CONST(0.013965456675352), - FRAC_CONST(0.014289689065314), - FRAC_CONST(0.014618586389712), - FRAC_CONST(0.014952183366697), - FRAC_CONST(0.015290514656976), - FRAC_CONST(0.015633614861688), - FRAC_CONST(0.015981518520214), - FRAC_CONST(0.016334260107915), - FRAC_CONST(0.016691874033817), - FRAC_CONST(0.017054394638241), - FRAC_CONST(0.017421856190380), - FRAC_CONST(0.017794292885832), - FRAC_CONST(0.018171738844085), - FRAC_CONST(0.018554228105962), - FRAC_CONST(0.018941794631032), - FRAC_CONST(0.019334472294980), - FRAC_CONST(0.019732294886947), - FRAC_CONST(0.020135296106839), - FRAC_CONST(0.020543509562604), - FRAC_CONST(0.020956968767488), - FRAC_CONST(0.021375707137257), - FRAC_CONST(0.021799757987407), - FRAC_CONST(0.022229154530343), - FRAC_CONST(0.022663929872540), - FRAC_CONST(0.023104117011689), - FRAC_CONST(0.023549748833816), - FRAC_CONST(0.024000858110398), - FRAC_CONST(0.024457477495451), - FRAC_CONST(0.024919639522613), - FRAC_CONST(0.025387376602207), - FRAC_CONST(0.025860721018295), - FRAC_CONST(0.026339704925726), - FRAC_CONST(0.026824360347160), - FRAC_CONST(0.027314719170100), - FRAC_CONST(0.027810813143900), - FRAC_CONST(0.028312673876775), - FRAC_CONST(0.028820332832801), - FRAC_CONST(0.029333821328905), - FRAC_CONST(0.029853170531859), - FRAC_CONST(0.030378411455255), - FRAC_CONST(0.030909574956490), - FRAC_CONST(0.031446691733739), - FRAC_CONST(0.031989792322926), - FRAC_CONST(0.032538907094693), - FRAC_CONST(0.033094066251369), - FRAC_CONST(0.033655299823935), - FRAC_CONST(0.034222637668991), - FRAC_CONST(0.034796109465717), - FRAC_CONST(0.035375744712844), - FRAC_CONST(0.035961572725616), - FRAC_CONST(0.036553622632758), - FRAC_CONST(0.037151923373446), - FRAC_CONST(0.037756503694277), - FRAC_CONST(0.038367392146243), - FRAC_CONST(0.038984617081711), - FRAC_CONST(0.039608206651398), - FRAC_CONST(0.040238188801359), - FRAC_CONST(0.040874591269976), - FRAC_CONST(0.041517441584950), - FRAC_CONST(0.042166767060301), - FRAC_CONST(0.042822594793376), - FRAC_CONST(0.043484951661852), - FRAC_CONST(0.044153864320760), - FRAC_CONST(0.044829359199509), - FRAC_CONST(0.045511462498913), - FRAC_CONST(0.046200200188234), - FRAC_CONST(0.046895598002228), - FRAC_CONST(0.047597681438201), - FRAC_CONST(0.048306475753074), - FRAC_CONST(0.049022005960455), - FRAC_CONST(0.049744296827725), - FRAC_CONST(0.050473372873129), - FRAC_CONST(0.051209258362879), - FRAC_CONST(0.051951977308273), - FRAC_CONST(0.052701553462813), - FRAC_CONST(0.053458010319350), - FRAC_CONST(0.054221371107223), - FRAC_CONST(0.054991658789428), - FRAC_CONST(0.055768896059787), - FRAC_CONST(0.056553105340134), - FRAC_CONST(0.057344308777513), - FRAC_CONST(0.058142528241393), - FRAC_CONST(0.058947785320893), - FRAC_CONST(0.059760101322019), - FRAC_CONST(0.060579497264926), - FRAC_CONST(0.061405993881180), - FRAC_CONST(0.062239611611049), - FRAC_CONST(0.063080370600799), - FRAC_CONST(0.063928290700012), - FRAC_CONST(0.064783391458919), - FRAC_CONST(0.065645692125747), - FRAC_CONST(0.066515211644086), - FRAC_CONST(0.067391968650269), - FRAC_CONST(0.068275981470777), - FRAC_CONST(0.069167268119652), - FRAC_CONST(0.070065846295935), - FRAC_CONST(0.070971733381121), - FRAC_CONST(0.071884946436630), - FRAC_CONST(0.072805502201299), - FRAC_CONST(0.073733417088896), - FRAC_CONST(0.074668707185649), - FRAC_CONST(0.075611388247794), - FRAC_CONST(0.076561475699152), - FRAC_CONST(0.077518984628715), - FRAC_CONST(0.078483929788261), - FRAC_CONST(0.079456325589986), - FRAC_CONST(0.080436186104162), - FRAC_CONST(0.081423525056808), - FRAC_CONST(0.082418355827392), - FRAC_CONST(0.083420691446553), - FRAC_CONST(0.084430544593841), - FRAC_CONST(0.085447927595483), - FRAC_CONST(0.086472852422178), - FRAC_CONST(0.087505330686900), - FRAC_CONST(0.088545373642744), - FRAC_CONST(0.089592992180780), - FRAC_CONST(0.090648196827937), - FRAC_CONST(0.091710997744919), - FRAC_CONST(0.092781404724131), - FRAC_CONST(0.093859427187640), - FRAC_CONST(0.094945074185163), - FRAC_CONST(0.096038354392069), - FRAC_CONST(0.097139276107423), - FRAC_CONST(0.098247847252041), - FRAC_CONST(0.099364075366580), - FRAC_CONST(0.10048796760965), - FRAC_CONST(0.10161953075597), - FRAC_CONST(0.10275877119451), - FRAC_CONST(0.10390569492671), - FRAC_CONST(0.10506030756469), - FRAC_CONST(0.10622261432949), - FRAC_CONST(0.10739262004941), - FRAC_CONST(0.10857032915821), - FRAC_CONST(0.10975574569357), - FRAC_CONST(0.11094887329534), - FRAC_CONST(0.11214971520402), - FRAC_CONST(0.11335827425914), - FRAC_CONST(0.11457455289772), - FRAC_CONST(0.11579855315274), - FRAC_CONST(0.11703027665170), - FRAC_CONST(0.11826972461510), - FRAC_CONST(0.11951689785504), - FRAC_CONST(0.12077179677383), - FRAC_CONST(0.12203442136263), - FRAC_CONST(0.12330477120008), - FRAC_CONST(0.12458284545102), - FRAC_CONST(0.12586864286523), - FRAC_CONST(0.12716216177615), - FRAC_CONST(0.12846340009971), - FRAC_CONST(0.12977235533312), - FRAC_CONST(0.13108902455375), - FRAC_CONST(0.13241340441801), - FRAC_CONST(0.13374549116025), - FRAC_CONST(0.13508528059173), - FRAC_CONST(0.13643276809961), - FRAC_CONST(0.13778794864595), - FRAC_CONST(0.13915081676677), - FRAC_CONST(0.14052136657114), - FRAC_CONST(0.14189959174027), - FRAC_CONST(0.14328548552671), - FRAC_CONST(0.14467904075349), - FRAC_CONST(0.14608024981336), - FRAC_CONST(0.14748910466804), - FRAC_CONST(0.14890559684750), - FRAC_CONST(0.15032971744929), - FRAC_CONST(0.15176145713790), - FRAC_CONST(0.15320080614414), - FRAC_CONST(0.15464775426459), - FRAC_CONST(0.15610229086100), - FRAC_CONST(0.15756440485987), - FRAC_CONST(0.15903408475193), - FRAC_CONST(0.16051131859170), - FRAC_CONST(0.16199609399712), - FRAC_CONST(0.16348839814917), - FRAC_CONST(0.16498821779156), - FRAC_CONST(0.16649553923042), - FRAC_CONST(0.16801034833404), - FRAC_CONST(0.16953263053270), - FRAC_CONST(0.17106237081842), - FRAC_CONST(0.17259955374484), - FRAC_CONST(0.17414416342714), - FRAC_CONST(0.17569618354193), - FRAC_CONST(0.17725559732720), - FRAC_CONST(0.17882238758238), - FRAC_CONST(0.18039653666830), - FRAC_CONST(0.18197802650733), - FRAC_CONST(0.18356683858343), - FRAC_CONST(0.18516295394233), - FRAC_CONST(0.18676635319174), - FRAC_CONST(0.18837701650148), - FRAC_CONST(0.18999492360384), - FRAC_CONST(0.19162005379380), - FRAC_CONST(0.19325238592940), - FRAC_CONST(0.19489189843209), - FRAC_CONST(0.19653856928714), - FRAC_CONST(0.19819237604409), - FRAC_CONST(0.19985329581721), - FRAC_CONST(0.20152130528605), - FRAC_CONST(0.20319638069594), - FRAC_CONST(0.20487849785865), - FRAC_CONST(0.20656763215298), - FRAC_CONST(0.20826375852540), - FRAC_CONST(0.20996685149083), - FRAC_CONST(0.21167688513330), - FRAC_CONST(0.21339383310678), - FRAC_CONST(0.21511766863598), - FRAC_CONST(0.21684836451719), - FRAC_CONST(0.21858589311922), - FRAC_CONST(0.22033022638425), - FRAC_CONST(0.22208133582887), - FRAC_CONST(0.22383919254503), - FRAC_CONST(0.22560376720111), - FRAC_CONST(0.22737503004300), - FRAC_CONST(0.22915295089517), - FRAC_CONST(0.23093749916189), - FRAC_CONST(0.23272864382838), - FRAC_CONST(0.23452635346201), - FRAC_CONST(0.23633059621364), - FRAC_CONST(0.23814133981883), - FRAC_CONST(0.23995855159925), - FRAC_CONST(0.24178219846403), - FRAC_CONST(0.24361224691114), - FRAC_CONST(0.24544866302890), - FRAC_CONST(0.24729141249740), - FRAC_CONST(0.24914046059007), - FRAC_CONST(0.25099577217522), - FRAC_CONST(0.25285731171763), - FRAC_CONST(0.25472504328019), - FRAC_CONST(0.25659893052556), - FRAC_CONST(0.25847893671788), - FRAC_CONST(0.26036502472451), - FRAC_CONST(0.26225715701781), - FRAC_CONST(0.26415529567692), - FRAC_CONST(0.26605940238966), - FRAC_CONST(0.26796943845439), - FRAC_CONST(0.26988536478190), - FRAC_CONST(0.27180714189742), - FRAC_CONST(0.27373472994256), - FRAC_CONST(0.27566808867736), - FRAC_CONST(0.27760717748238), - FRAC_CONST(0.27955195536071), - FRAC_CONST(0.28150238094021), - FRAC_CONST(0.28345841247557), - FRAC_CONST(0.28542000785059), - FRAC_CONST(0.28738712458038), - FRAC_CONST(0.28935971981364), - FRAC_CONST(0.29133775033492), - FRAC_CONST(0.29332117256704), - FRAC_CONST(0.29530994257338), - FRAC_CONST(0.29730401606034), - FRAC_CONST(0.29930334837974), - FRAC_CONST(0.30130789453132), - FRAC_CONST(0.30331760916521), - FRAC_CONST(0.30533244658452), - FRAC_CONST(0.30735236074785), - FRAC_CONST(0.30937730527195), - FRAC_CONST(0.31140723343430), - FRAC_CONST(0.31344209817583), - FRAC_CONST(0.31548185210356), - FRAC_CONST(0.31752644749341), - FRAC_CONST(0.31957583629288), - FRAC_CONST(0.32162997012390), - FRAC_CONST(0.32368880028565), - FRAC_CONST(0.32575227775738), - FRAC_CONST(0.32782035320134), - FRAC_CONST(0.32989297696566), - FRAC_CONST(0.33197009908736), - FRAC_CONST(0.33405166929523), - FRAC_CONST(0.33613763701295), - FRAC_CONST(0.33822795136203), - FRAC_CONST(0.34032256116495), - FRAC_CONST(0.34242141494820), - FRAC_CONST(0.34452446094547), - FRAC_CONST(0.34663164710072), - FRAC_CONST(0.34874292107143), - FRAC_CONST(0.35085823023181), - FRAC_CONST(0.35297752167598), - FRAC_CONST(0.35510074222129), - FRAC_CONST(0.35722783841160), - FRAC_CONST(0.35935875652060), - FRAC_CONST(0.36149344255514), - FRAC_CONST(0.36363184225864), - FRAC_CONST(0.36577390111444), - FRAC_CONST(0.36791956434930), - FRAC_CONST(0.37006877693676), - FRAC_CONST(0.37222148360070), - FRAC_CONST(0.37437762881878), - FRAC_CONST(0.37653715682603), - FRAC_CONST(0.37870001161834), - FRAC_CONST(0.38086613695607), - FRAC_CONST(0.38303547636766), - FRAC_CONST(0.38520797315322), - FRAC_CONST(0.38738357038821), - FRAC_CONST(0.38956221092708), - FRAC_CONST(0.39174383740701), - FRAC_CONST(0.39392839225157), - FRAC_CONST(0.39611581767449), - FRAC_CONST(0.39830605568342), - FRAC_CONST(0.40049904808370), - FRAC_CONST(0.40269473648218), - FRAC_CONST(0.40489306229101), - FRAC_CONST(0.40709396673153), - FRAC_CONST(0.40929739083810), - FRAC_CONST(0.41150327546197), - FRAC_CONST(0.41371156127524), - FRAC_CONST(0.41592218877472), - FRAC_CONST(0.41813509828594), - FRAC_CONST(0.42035022996702), - FRAC_CONST(0.42256752381274), - FRAC_CONST(0.42478691965848), - FRAC_CONST(0.42700835718423), - FRAC_CONST(0.42923177591866), - FRAC_CONST(0.43145711524314), - FRAC_CONST(0.43368431439580), - FRAC_CONST(0.43591331247564), - FRAC_CONST(0.43814404844658), - FRAC_CONST(0.44037646114161), - FRAC_CONST(0.44261048926688), - FRAC_CONST(0.44484607140589), - FRAC_CONST(0.44708314602359), - FRAC_CONST(0.44932165147057), - FRAC_CONST(0.45156152598727), - FRAC_CONST(0.45380270770813), - FRAC_CONST(0.45604513466581), - FRAC_CONST(0.45828874479543), - FRAC_CONST(0.46053347593880), - FRAC_CONST(0.46277926584861), - FRAC_CONST(0.46502605219277), - FRAC_CONST(0.46727377255861), - FRAC_CONST(0.46952236445718), - FRAC_CONST(0.47177176532752), - FRAC_CONST(0.47402191254100), - FRAC_CONST(0.47627274340557), - FRAC_CONST(0.47852419517009), - FRAC_CONST(0.48077620502869), - FRAC_CONST(0.48302871012505), - FRAC_CONST(0.48528164755674), - FRAC_CONST(0.48753495437962), - FRAC_CONST(0.48978856761212), - FRAC_CONST(0.49204242423966), - FRAC_CONST(0.49429646121898), - FRAC_CONST(0.49655061548250), - FRAC_CONST(0.49880482394273), - FRAC_CONST(0.50105902349665), - FRAC_CONST(0.50331315103004), - FRAC_CONST(0.50556714342194), - FRAC_CONST(0.50782093754901), - FRAC_CONST(0.51007447028990), - FRAC_CONST(0.51232767852971), - FRAC_CONST(0.51458049916433), - FRAC_CONST(0.51683286910489), - FRAC_CONST(0.51908472528213), - FRAC_CONST(0.52133600465083), - FRAC_CONST(0.52358664419420), - FRAC_CONST(0.52583658092832), - FRAC_CONST(0.52808575190648), - FRAC_CONST(0.53033409422367), - FRAC_CONST(0.53258154502092), - FRAC_CONST(0.53482804148974), - FRAC_CONST(0.53707352087652), - FRAC_CONST(0.53931792048690), - FRAC_CONST(0.54156117769021), - FRAC_CONST(0.54380322992385), - FRAC_CONST(0.54604401469766), - FRAC_CONST(0.54828346959835), - FRAC_CONST(0.55052153229384), - FRAC_CONST(0.55275814053768), - FRAC_CONST(0.55499323217338), - FRAC_CONST(0.55722674513883), - FRAC_CONST(0.55945861747062), - FRAC_CONST(0.56168878730842), - FRAC_CONST(0.56391719289930), - FRAC_CONST(0.56614377260214), - FRAC_CONST(0.56836846489188), - FRAC_CONST(0.57059120836390), - FRAC_CONST(0.57281194173835), - FRAC_CONST(0.57503060386439), - FRAC_CONST(0.57724713372458), - FRAC_CONST(0.57946147043912), - FRAC_CONST(0.58167355327012), - FRAC_CONST(0.58388332162591), - FRAC_CONST(0.58609071506528), - FRAC_CONST(0.58829567330173), - FRAC_CONST(0.59049813620770), - FRAC_CONST(0.59269804381879), - FRAC_CONST(0.59489533633802), - FRAC_CONST(0.59708995413996), - FRAC_CONST(0.59928183777495), - FRAC_CONST(0.60147092797329), - FRAC_CONST(0.60365716564937), - FRAC_CONST(0.60584049190582), - FRAC_CONST(0.60802084803764), - FRAC_CONST(0.61019817553632), - FRAC_CONST(0.61237241609393), - FRAC_CONST(0.61454351160718), - FRAC_CONST(0.61671140418155), - FRAC_CONST(0.61887603613527), - FRAC_CONST(0.62103735000336), - FRAC_CONST(0.62319528854167), - FRAC_CONST(0.62534979473088), - FRAC_CONST(0.62750081178042), - FRAC_CONST(0.62964828313250), - FRAC_CONST(0.63179215246597), - FRAC_CONST(0.63393236370030), - FRAC_CONST(0.63606886099946), - FRAC_CONST(0.63820158877577), - FRAC_CONST(0.64033049169379), - FRAC_CONST(0.64245551467413), - FRAC_CONST(0.64457660289729), - FRAC_CONST(0.64669370180740), - FRAC_CONST(0.64880675711607), - FRAC_CONST(0.65091571480603), - FRAC_CONST(0.65302052113494), - FRAC_CONST(0.65512112263906), - FRAC_CONST(0.65721746613689), - FRAC_CONST(0.65930949873289), - FRAC_CONST(0.66139716782102), - FRAC_CONST(0.66348042108842), - FRAC_CONST(0.66555920651892), - FRAC_CONST(0.66763347239664), - FRAC_CONST(0.66970316730947), - FRAC_CONST(0.67176824015260), - FRAC_CONST(0.67382864013196), - FRAC_CONST(0.67588431676768), - FRAC_CONST(0.67793521989751), - FRAC_CONST(0.67998129968017), - FRAC_CONST(0.68202250659876), - FRAC_CONST(0.68405879146403), - FRAC_CONST(0.68609010541774), - FRAC_CONST(0.68811639993588), - FRAC_CONST(0.69013762683195), - FRAC_CONST(0.69215373826012), - FRAC_CONST(0.69416468671849), - FRAC_CONST(0.69617042505214), - FRAC_CONST(0.69817090645634), - FRAC_CONST(0.70016608447958), - FRAC_CONST(0.70215591302664), - FRAC_CONST(0.70414034636163), - FRAC_CONST(0.70611933911096), - FRAC_CONST(0.70809284626630), - FRAC_CONST(0.71006082318751), - FRAC_CONST(0.71202322560554), - FRAC_CONST(0.71398000962530), - FRAC_CONST(0.71593113172842), - FRAC_CONST(0.71787654877613), - FRAC_CONST(0.71981621801195), - FRAC_CONST(0.72175009706445), - FRAC_CONST(0.72367814394990), - FRAC_CONST(0.72560031707496), - FRAC_CONST(0.72751657523927), - FRAC_CONST(0.72942687763803), - FRAC_CONST(0.73133118386457), - FRAC_CONST(0.73322945391280), - FRAC_CONST(0.73512164817975), - FRAC_CONST(0.73700772746796), - FRAC_CONST(0.73888765298787), - FRAC_CONST(0.74076138636020), - FRAC_CONST(0.74262888961827), - FRAC_CONST(0.74449012521027), - FRAC_CONST(0.74634505600152), - FRAC_CONST(0.74819364527663), - FRAC_CONST(0.75003585674175), - FRAC_CONST(0.75187165452661), - FRAC_CONST(0.75370100318668), - FRAC_CONST(0.75552386770515), - FRAC_CONST(0.75734021349500), - FRAC_CONST(0.75915000640095), - FRAC_CONST(0.76095321270137), - FRAC_CONST(0.76274979911019), - FRAC_CONST(0.76453973277875), - FRAC_CONST(0.76632298129757), - FRAC_CONST(0.76809951269819), - FRAC_CONST(0.76986929545481), - FRAC_CONST(0.77163229848604), - FRAC_CONST(0.77338849115651), - FRAC_CONST(0.77513784327849), - FRAC_CONST(0.77688032511340), - FRAC_CONST(0.77861590737340), - FRAC_CONST(0.78034456122283), - FRAC_CONST(0.78206625827961), - FRAC_CONST(0.78378097061667), - FRAC_CONST(0.78548867076330), - FRAC_CONST(0.78718933170643), - FRAC_CONST(0.78888292689189), - FRAC_CONST(0.79056943022564), - FRAC_CONST(0.79224881607494), - FRAC_CONST(0.79392105926949), - FRAC_CONST(0.79558613510249), - FRAC_CONST(0.79724401933170), - FRAC_CONST(0.79889468818046), - FRAC_CONST(0.80053811833858), - FRAC_CONST(0.80217428696334), - FRAC_CONST(0.80380317168028), - FRAC_CONST(0.80542475058405), - FRAC_CONST(0.80703900223920), - FRAC_CONST(0.80864590568089), - FRAC_CONST(0.81024544041560), - FRAC_CONST(0.81183758642175), - FRAC_CONST(0.81342232415032), - FRAC_CONST(0.81499963452540), - FRAC_CONST(0.81656949894467), - FRAC_CONST(0.81813189927991), - FRAC_CONST(0.81968681787738), - FRAC_CONST(0.82123423755821), - FRAC_CONST(0.82277414161874), - FRAC_CONST(0.82430651383076), - FRAC_CONST(0.82583133844180), - FRAC_CONST(0.82734860017528), - FRAC_CONST(0.82885828423070), - FRAC_CONST(0.83036037628369), - FRAC_CONST(0.83185486248609), - FRAC_CONST(0.83334172946597), - FRAC_CONST(0.83482096432759), - FRAC_CONST(0.83629255465130), - FRAC_CONST(0.83775648849344), - FRAC_CONST(0.83921275438615), - FRAC_CONST(0.84066134133716), - FRAC_CONST(0.84210223882952), - FRAC_CONST(0.84353543682130), - FRAC_CONST(0.84496092574524), - FRAC_CONST(0.84637869650833), - FRAC_CONST(0.84778874049138), - FRAC_CONST(0.84919104954855), - FRAC_CONST(0.85058561600677), - FRAC_CONST(0.85197243266520), - FRAC_CONST(0.85335149279457), - FRAC_CONST(0.85472279013653), - FRAC_CONST(0.85608631890295), - FRAC_CONST(0.85744207377513), - FRAC_CONST(0.85879004990298), - FRAC_CONST(0.86013024290422), - FRAC_CONST(0.86146264886346), - FRAC_CONST(0.86278726433124), - FRAC_CONST(0.86410408632306), - FRAC_CONST(0.86541311231838), - FRAC_CONST(0.86671434025950), - FRAC_CONST(0.86800776855046), - FRAC_CONST(0.86929339605590), - FRAC_CONST(0.87057122209981), - FRAC_CONST(0.87184124646433), - FRAC_CONST(0.87310346938840), - FRAC_CONST(0.87435789156650), - FRAC_CONST(0.87560451414719), - FRAC_CONST(0.87684333873173), - FRAC_CONST(0.87807436737261), - FRAC_CONST(0.87929760257204), - FRAC_CONST(0.88051304728038), - FRAC_CONST(0.88172070489456), - FRAC_CONST(0.88292057925645), - FRAC_CONST(0.88411267465117), - FRAC_CONST(0.88529699580537), - FRAC_CONST(0.88647354788545), - FRAC_CONST(0.88764233649580), - FRAC_CONST(0.88880336767692), - FRAC_CONST(0.88995664790351), - FRAC_CONST(0.89110218408260), - FRAC_CONST(0.89223998355154), - FRAC_CONST(0.89337005407600), - FRAC_CONST(0.89449240384793), - FRAC_CONST(0.89560704148345), - FRAC_CONST(0.89671397602074), - FRAC_CONST(0.89781321691786), - FRAC_CONST(0.89890477405053), - FRAC_CONST(0.89998865770993), - FRAC_CONST(0.90106487860034), - FRAC_CONST(0.90213344783689), - FRAC_CONST(0.90319437694315), - FRAC_CONST(0.90424767784873), - FRAC_CONST(0.90529336288690), - FRAC_CONST(0.90633144479201), - FRAC_CONST(0.90736193669708), - FRAC_CONST(0.90838485213119), - FRAC_CONST(0.90940020501694), - FRAC_CONST(0.91040800966776), - FRAC_CONST(0.91140828078533), - FRAC_CONST(0.91240103345685), - FRAC_CONST(0.91338628315231), - FRAC_CONST(0.91436404572173), - FRAC_CONST(0.91533433739238), - FRAC_CONST(0.91629717476594), - FRAC_CONST(0.91725257481564), - FRAC_CONST(0.91820055488334), - FRAC_CONST(0.91914113267664), - FRAC_CONST(0.92007432626589), - FRAC_CONST(0.92100015408120), - FRAC_CONST(0.92191863490944), - FRAC_CONST(0.92282978789113), - FRAC_CONST(0.92373363251740), - FRAC_CONST(0.92463018862687), - FRAC_CONST(0.92551947640245), - FRAC_CONST(0.92640151636824), - FRAC_CONST(0.92727632938624), - FRAC_CONST(0.92814393665320), - FRAC_CONST(0.92900435969727), - FRAC_CONST(0.92985762037477), - FRAC_CONST(0.93070374086684), - FRAC_CONST(0.93154274367610), - FRAC_CONST(0.93237465162328), - FRAC_CONST(0.93319948784382), - FRAC_CONST(0.93401727578443), - FRAC_CONST(0.93482803919967), - FRAC_CONST(0.93563180214841), - FRAC_CONST(0.93642858899043), - FRAC_CONST(0.93721842438279), - FRAC_CONST(0.93800133327637), - FRAC_CONST(0.93877734091223), - FRAC_CONST(0.93954647281807), - FRAC_CONST(0.94030875480458), - FRAC_CONST(0.94106421296182), - FRAC_CONST(0.94181287365556), - FRAC_CONST(0.94255476352362), - FRAC_CONST(0.94328990947213), - FRAC_CONST(0.94401833867184), - FRAC_CONST(0.94474007855439), - FRAC_CONST(0.94545515680855), - FRAC_CONST(0.94616360137644), - FRAC_CONST(0.94686544044975), - FRAC_CONST(0.94756070246592), - FRAC_CONST(0.94824941610434), - FRAC_CONST(0.94893161028248), - FRAC_CONST(0.94960731415209), - FRAC_CONST(0.95027655709525), - FRAC_CONST(0.95093936872056), - FRAC_CONST(0.95159577885924), - FRAC_CONST(0.95224581756115), - FRAC_CONST(0.95288951509097), - FRAC_CONST(0.95352690192417), - FRAC_CONST(0.95415800874314), - FRAC_CONST(0.95478286643320), - FRAC_CONST(0.95540150607863), - FRAC_CONST(0.95601395895871), - FRAC_CONST(0.95662025654373), - FRAC_CONST(0.95722043049100), - FRAC_CONST(0.95781451264084), - FRAC_CONST(0.95840253501260), - FRAC_CONST(0.95898452980058), - FRAC_CONST(0.95956052937008), - FRAC_CONST(0.96013056625336), - FRAC_CONST(0.96069467314557), - FRAC_CONST(0.96125288290073), - FRAC_CONST(0.96180522852773), - FRAC_CONST(0.96235174318622), - FRAC_CONST(0.96289246018262), - FRAC_CONST(0.96342741296604), - FRAC_CONST(0.96395663512424), - FRAC_CONST(0.96448016037959), - FRAC_CONST(0.96499802258499), - FRAC_CONST(0.96551025571985), - FRAC_CONST(0.96601689388602), - FRAC_CONST(0.96651797130376), - FRAC_CONST(0.96701352230768), - FRAC_CONST(0.96750358134269), - FRAC_CONST(0.96798818295998), - FRAC_CONST(0.96846736181297), - FRAC_CONST(0.96894115265327), - FRAC_CONST(0.96940959032667), - FRAC_CONST(0.96987270976912), - FRAC_CONST(0.97033054600270), - FRAC_CONST(0.97078313413161), - FRAC_CONST(0.97123050933818), - FRAC_CONST(0.97167270687887), - FRAC_CONST(0.97210976208030), - FRAC_CONST(0.97254171033525), - FRAC_CONST(0.97296858709871), - FRAC_CONST(0.97339042788392), - FRAC_CONST(0.97380726825843), - FRAC_CONST(0.97421914384017), - FRAC_CONST(0.97462609029350), - FRAC_CONST(0.97502814332534), - FRAC_CONST(0.97542533868127), - FRAC_CONST(0.97581771214160), - FRAC_CONST(0.97620529951759), - FRAC_CONST(0.97658813664749), - FRAC_CONST(0.97696625939282), - FRAC_CONST(0.97733970363445), - FRAC_CONST(0.97770850526884), - FRAC_CONST(0.97807270020427), - FRAC_CONST(0.97843232435704), - FRAC_CONST(0.97878741364771), - FRAC_CONST(0.97913800399743), - FRAC_CONST(0.97948413132414), - FRAC_CONST(0.97982583153895), - FRAC_CONST(0.98016314054243), - FRAC_CONST(0.98049609422096), - FRAC_CONST(0.98082472844313), - FRAC_CONST(0.98114907905608), - FRAC_CONST(0.98146918188197), - FRAC_CONST(0.98178507271438), - FRAC_CONST(0.98209678731477), - FRAC_CONST(0.98240436140902), - FRAC_CONST(0.98270783068385), - FRAC_CONST(0.98300723078342), - FRAC_CONST(0.98330259730589), - FRAC_CONST(0.98359396579995), - FRAC_CONST(0.98388137176152), - FRAC_CONST(0.98416485063031), - FRAC_CONST(0.98444443778651), - FRAC_CONST(0.98472016854752), - FRAC_CONST(0.98499207816463), - FRAC_CONST(0.98526020181980), - FRAC_CONST(0.98552457462240), - FRAC_CONST(0.98578523160609), - FRAC_CONST(0.98604220772560), - FRAC_CONST(0.98629553785362), - FRAC_CONST(0.98654525677772), - FRAC_CONST(0.98679139919726), - FRAC_CONST(0.98703399972035), - FRAC_CONST(0.98727309286089), - FRAC_CONST(0.98750871303556), - FRAC_CONST(0.98774089456089), - FRAC_CONST(0.98796967165036), - FRAC_CONST(0.98819507841154), - FRAC_CONST(0.98841714884323), - FRAC_CONST(0.98863591683269), - FRAC_CONST(0.98885141615285), - FRAC_CONST(0.98906368045957), - FRAC_CONST(0.98927274328896), - FRAC_CONST(0.98947863805473), - FRAC_CONST(0.98968139804554), - FRAC_CONST(0.98988105642241), - FRAC_CONST(0.99007764621618), - FRAC_CONST(0.99027120032501), - FRAC_CONST(0.99046175151186), - FRAC_CONST(0.99064933240208), - FRAC_CONST(0.99083397548099), - FRAC_CONST(0.99101571309153), - FRAC_CONST(0.99119457743191), - FRAC_CONST(0.99137060055337), - FRAC_CONST(0.99154381435784), - FRAC_CONST(0.99171425059582), - FRAC_CONST(0.99188194086414), - FRAC_CONST(0.99204691660388), - FRAC_CONST(0.99220920909823), - FRAC_CONST(0.99236884947045), - FRAC_CONST(0.99252586868186), - FRAC_CONST(0.99268029752989), - FRAC_CONST(0.99283216664606), - FRAC_CONST(0.99298150649419), - FRAC_CONST(0.99312834736847), - FRAC_CONST(0.99327271939167), - FRAC_CONST(0.99341465251338), - FRAC_CONST(0.99355417650825), - FRAC_CONST(0.99369132097430), - FRAC_CONST(0.99382611533130), - FRAC_CONST(0.99395858881910), - FRAC_CONST(0.99408877049612), - FRAC_CONST(0.99421668923778), - FRAC_CONST(0.99434237373503), - FRAC_CONST(0.99446585249289), - FRAC_CONST(0.99458715382906), - FRAC_CONST(0.99470630587254), - FRAC_CONST(0.99482333656229), - FRAC_CONST(0.99493827364600), - FRAC_CONST(0.99505114467878), - FRAC_CONST(0.99516197702200), - FRAC_CONST(0.99527079784214), - FRAC_CONST(0.99537763410962), - FRAC_CONST(0.99548251259777), - FRAC_CONST(0.99558545988178), - FRAC_CONST(0.99568650233767), - FRAC_CONST(0.99578566614138), - FRAC_CONST(0.99588297726783), - FRAC_CONST(0.99597846149005), - FRAC_CONST(0.99607214437834), - FRAC_CONST(0.99616405129947), - FRAC_CONST(0.99625420741595), - FRAC_CONST(0.99634263768527), - FRAC_CONST(0.99642936685928), - FRAC_CONST(0.99651441948352), - FRAC_CONST(0.99659781989663), - FRAC_CONST(0.99667959222978), - FRAC_CONST(0.99675976040620), - FRAC_CONST(0.99683834814063), - FRAC_CONST(0.99691537893895), - FRAC_CONST(0.99699087609774), - FRAC_CONST(0.99706486270391), - FRAC_CONST(0.99713736163442), - FRAC_CONST(0.99720839555593), - FRAC_CONST(0.99727798692461), - FRAC_CONST(0.99734615798589), - FRAC_CONST(0.99741293077431), - FRAC_CONST(0.99747832711337), - FRAC_CONST(0.99754236861541), - FRAC_CONST(0.99760507668158), - FRAC_CONST(0.99766647250181), - FRAC_CONST(0.99772657705478), - FRAC_CONST(0.99778541110799), - FRAC_CONST(0.99784299521785), - FRAC_CONST(0.99789934972976), - FRAC_CONST(0.99795449477828), - FRAC_CONST(0.99800845028730), - FRAC_CONST(0.99806123597027), - FRAC_CONST(0.99811287133042), - FRAC_CONST(0.99816337566108), - FRAC_CONST(0.99821276804596), - FRAC_CONST(0.99826106735952), - FRAC_CONST(0.99830829226732), - FRAC_CONST(0.99835446122649), - FRAC_CONST(0.99839959248609), - FRAC_CONST(0.99844370408765), - FRAC_CONST(0.99848681386566), - FRAC_CONST(0.99852893944805), - FRAC_CONST(0.99857009825685), - FRAC_CONST(0.99861030750869), - FRAC_CONST(0.99864958421549), - FRAC_CONST(0.99868794518504), - FRAC_CONST(0.99872540702178), - FRAC_CONST(0.99876198612738), - FRAC_CONST(0.99879769870160), - FRAC_CONST(0.99883256074295), - FRAC_CONST(0.99886658804953), - FRAC_CONST(0.99889979621983), - FRAC_CONST(0.99893220065356), - FRAC_CONST(0.99896381655254), - FRAC_CONST(0.99899465892154), - FRAC_CONST(0.99902474256924), - FRAC_CONST(0.99905408210916), - FRAC_CONST(0.99908269196056), - FRAC_CONST(0.99911058634952), - FRAC_CONST(0.99913777930986), - FRAC_CONST(0.99916428468421), - FRAC_CONST(0.99919011612505), - FRAC_CONST(0.99921528709576), - FRAC_CONST(0.99923981087174), - FRAC_CONST(0.99926370054150), - FRAC_CONST(0.99928696900779), - FRAC_CONST(0.99930962898876), - FRAC_CONST(0.99933169301910), - FRAC_CONST(0.99935317345126), - FRAC_CONST(0.99937408245662), - FRAC_CONST(0.99939443202674), - FRAC_CONST(0.99941423397457), - FRAC_CONST(0.99943349993572), - FRAC_CONST(0.99945224136972), - FRAC_CONST(0.99947046956130), - FRAC_CONST(0.99948819562171), - FRAC_CONST(0.99950543049000), - FRAC_CONST(0.99952218493439), - FRAC_CONST(0.99953846955355), - FRAC_CONST(0.99955429477803), - FRAC_CONST(0.99956967087154), - FRAC_CONST(0.99958460793242), - FRAC_CONST(0.99959911589494), - FRAC_CONST(0.99961320453077), - FRAC_CONST(0.99962688345035), - FRAC_CONST(0.99964016210433), - FRAC_CONST(0.99965304978499), - FRAC_CONST(0.99966555562769), - FRAC_CONST(0.99967768861231), - FRAC_CONST(0.99968945756473), - FRAC_CONST(0.99970087115825), - FRAC_CONST(0.99971193791510), - FRAC_CONST(0.99972266620792), - FRAC_CONST(0.99973306426121), - FRAC_CONST(0.99974314015288), - FRAC_CONST(0.99975290181568), - FRAC_CONST(0.99976235703876), - FRAC_CONST(0.99977151346914), - FRAC_CONST(0.99978037861326), - FRAC_CONST(0.99978895983845), - FRAC_CONST(0.99979726437448), - FRAC_CONST(0.99980529931507), - FRAC_CONST(0.99981307161943), - FRAC_CONST(0.99982058811377), - FRAC_CONST(0.99982785549283), - FRAC_CONST(0.99983488032144), - FRAC_CONST(0.99984166903600), - FRAC_CONST(0.99984822794606), - FRAC_CONST(0.99985456323584), - FRAC_CONST(0.99986068096572), - FRAC_CONST(0.99986658707386), - FRAC_CONST(0.99987228737764), - FRAC_CONST(0.99987778757524), - FRAC_CONST(0.99988309324717), - FRAC_CONST(0.99988820985777), - FRAC_CONST(0.99989314275675), - FRAC_CONST(0.99989789718072), - FRAC_CONST(0.99990247825468), - FRAC_CONST(0.99990689099357), - FRAC_CONST(0.99991114030376), - FRAC_CONST(0.99991523098456), - FRAC_CONST(0.99991916772971), - FRAC_CONST(0.99992295512891), - FRAC_CONST(0.99992659766930), - FRAC_CONST(0.99993009973692), - FRAC_CONST(0.99993346561824), - FRAC_CONST(0.99993669950161), - FRAC_CONST(0.99993980547870), - FRAC_CONST(0.99994278754604), - FRAC_CONST(0.99994564960642), - FRAC_CONST(0.99994839547033), - FRAC_CONST(0.99995102885747), - FRAC_CONST(0.99995355339809), - FRAC_CONST(0.99995597263451), - FRAC_CONST(0.99995829002249), - FRAC_CONST(0.99996050893264), - FRAC_CONST(0.99996263265183), - FRAC_CONST(0.99996466438460), - FRAC_CONST(0.99996660725452), - FRAC_CONST(0.99996846430558), - FRAC_CONST(0.99997023850356), - FRAC_CONST(0.99997193273736), - FRAC_CONST(0.99997354982037), - FRAC_CONST(0.99997509249183), - FRAC_CONST(0.99997656341810), - FRAC_CONST(0.99997796519400), - FRAC_CONST(0.99997930034415), - FRAC_CONST(0.99998057132421), - FRAC_CONST(0.99998178052220), - FRAC_CONST(0.99998293025975), - FRAC_CONST(0.99998402279338), - FRAC_CONST(0.99998506031574), - FRAC_CONST(0.99998604495686), - FRAC_CONST(0.99998697878536), - FRAC_CONST(0.99998786380966), - FRAC_CONST(0.99998870197921), - FRAC_CONST(0.99998949518567), - FRAC_CONST(0.99999024526408), - FRAC_CONST(0.99999095399401), - FRAC_CONST(0.99999162310077), - FRAC_CONST(0.99999225425649), - FRAC_CONST(0.99999284908128), - FRAC_CONST(0.99999340914435), - FRAC_CONST(0.99999393596510), - FRAC_CONST(0.99999443101421), - FRAC_CONST(0.99999489571473), - FRAC_CONST(0.99999533144314), - FRAC_CONST(0.99999573953040), - FRAC_CONST(0.99999612126300), - FRAC_CONST(0.99999647788395), - FRAC_CONST(0.99999681059383), - FRAC_CONST(0.99999712055178), - FRAC_CONST(0.99999740887647), - FRAC_CONST(0.99999767664709), - FRAC_CONST(0.99999792490431), - FRAC_CONST(0.99999815465123), - FRAC_CONST(0.99999836685427), - FRAC_CONST(0.99999856244415), - FRAC_CONST(0.99999874231676), - FRAC_CONST(0.99999890733405), - FRAC_CONST(0.99999905832493), - FRAC_CONST(0.99999919608613), - FRAC_CONST(0.99999932138304), - FRAC_CONST(0.99999943495056), - FRAC_CONST(0.99999953749392), - FRAC_CONST(0.99999962968950), - FRAC_CONST(0.99999971218563), - FRAC_CONST(0.99999978560337), - FRAC_CONST(0.99999985053727), - FRAC_CONST(0.99999990755616), - FRAC_CONST(0.99999995720387) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t kbd_long_960[] = { - FRAC_CONST(0.0003021562530949), - FRAC_CONST(0.0004452267024786), - FRAC_CONST(0.0005674947527496), - FRAC_CONST(0.0006812465553466), - FRAC_CONST(0.0007910496776387), - FRAC_CONST(0.0008991655033895), - FRAC_CONST(0.0010068978259384), - FRAC_CONST(0.0011150758515751), - FRAC_CONST(0.0012242653193642), - FRAC_CONST(0.0013348735658205), - FRAC_CONST(0.0014472068670273), - FRAC_CONST(0.0015615039850448), - FRAC_CONST(0.0016779568885263), - FRAC_CONST(0.0017967241232412), - FRAC_CONST(0.0019179397560955), - FRAC_CONST(0.0020417195415393), - FRAC_CONST(0.0021681652836642), - FRAC_CONST(0.0022973679910599), - FRAC_CONST(0.0024294102029937), - FRAC_CONST(0.0025643677339078), - FRAC_CONST(0.0027023110014772), - FRAC_CONST(0.0028433060512612), - FRAC_CONST(0.0029874153568025), - FRAC_CONST(0.0031346984511728), - FRAC_CONST(0.0032852124303662), - FRAC_CONST(0.0034390123581190), - FRAC_CONST(0.0035961515940931), - FRAC_CONST(0.0037566820618961), - FRAC_CONST(0.0039206544694386), - FRAC_CONST(0.0040881184912194), - FRAC_CONST(0.0042591229199617), - FRAC_CONST(0.0044337157933972), - FRAC_CONST(0.0046119445007641), - FRAC_CONST(0.0047938558726415), - FRAC_CONST(0.0049794962570131), - FRAC_CONST(0.0051689115838900), - FRAC_CONST(0.0053621474203763), - FRAC_CONST(0.0055592490177131), - FRAC_CONST(0.0057602613515573), - FRAC_CONST(0.0059652291565289), - FRAC_CONST(0.0061741969558843), - FRAC_CONST(0.0063872090870253), - FRAC_CONST(0.0066043097234387), - FRAC_CONST(0.0068255428935640), - FRAC_CONST(0.0070509524970088), - FRAC_CONST(0.0072805823184660), - FRAC_CONST(0.0075144760396340), - FRAC_CONST(0.0077526772493942), - FRAC_CONST(0.0079952294524673), - FRAC_CONST(0.0082421760767325), - FRAC_CONST(0.0084935604793733), - FRAC_CONST(0.0087494259519870), - FRAC_CONST(0.0090098157247792), - FRAC_CONST(0.0092747729699467), - FRAC_CONST(0.0095443408043399), - FRAC_CONST(0.0098185622914832), - FRAC_CONST(0.0100974804430226), - FRAC_CONST(0.0103811382196612), - FRAC_CONST(0.0106695785316351), - FRAC_CONST(0.0109628442387771), - FRAC_CONST(0.0112609781502091), - FRAC_CONST(0.0115640230236993), - FRAC_CONST(0.0118720215647169), - FRAC_CONST(0.0121850164252137), - FRAC_CONST(0.0125030502021561), - FRAC_CONST(0.0128261654358321), - FRAC_CONST(0.0131544046079532), - FRAC_CONST(0.0134878101395681), - FRAC_CONST(0.0138264243888068), - FRAC_CONST(0.0141702896484671), - FRAC_CONST(0.0145194481434592), - FRAC_CONST(0.0148739420281182), - FRAC_CONST(0.0152338133833959), - FRAC_CONST(0.0155991042139432), - FRAC_CONST(0.0159698564450882), - FRAC_CONST(0.0163461119197227), - FRAC_CONST(0.0167279123950996), - FRAC_CONST(0.0171152995395520), - FRAC_CONST(0.0175083149291368), - FRAC_CONST(0.0179070000442104), - FRAC_CONST(0.0183113962659409), - FRAC_CONST(0.0187215448727609), - FRAC_CONST(0.0191374870367659), - FRAC_CONST(0.0195592638200623), - FRAC_CONST(0.0199869161710679), - FRAC_CONST(0.0204204849207691), - FRAC_CONST(0.0208600107789370), - FRAC_CONST(0.0213055343303066), - FRAC_CONST(0.0217570960307201), - FRAC_CONST(0.0222147362032386), - FRAC_CONST(0.0226784950342228), - FRAC_CONST(0.0231484125693867), - FRAC_CONST(0.0236245287098244), - FRAC_CONST(0.0241068832080138), - FRAC_CONST(0.0245955156637973), - FRAC_CONST(0.0250904655203431), - FRAC_CONST(0.0255917720600868), - FRAC_CONST(0.0260994744006559), - FRAC_CONST(0.0266136114907790), - FRAC_CONST(0.0271342221061795), - FRAC_CONST(0.0276613448454576), - FRAC_CONST(0.0281950181259587), - FRAC_CONST(0.0287352801796329), - FRAC_CONST(0.0292821690488833), - FRAC_CONST(0.0298357225824074), - FRAC_CONST(0.0303959784310299), - FRAC_CONST(0.0309629740435296), - FRAC_CONST(0.0315367466624615), - FRAC_CONST(0.0321173333199732), - FRAC_CONST(0.0327047708336193), - FRAC_CONST(0.0332990958021720), - FRAC_CONST(0.0339003446014307), - FRAC_CONST(0.0345085533800302), - FRAC_CONST(0.0351237580552491), - FRAC_CONST(0.0357459943088193), - FRAC_CONST(0.0363752975827358), - FRAC_CONST(0.0370117030750704), - FRAC_CONST(0.0376552457357870), - FRAC_CONST(0.0383059602625614), - FRAC_CONST(0.0389638810966056), - FRAC_CONST(0.0396290424184964), - FRAC_CONST(0.0403014781440112), - FRAC_CONST(0.0409812219199691), - FRAC_CONST(0.0416683071200799), - FRAC_CONST(0.0423627668408009), - FRAC_CONST(0.0430646338972016), - FRAC_CONST(0.0437739408188385), - FRAC_CONST(0.0444907198456388), - FRAC_CONST(0.0452150029237951), - FRAC_CONST(0.0459468217016708), - FRAC_CONST(0.0466862075257170), - FRAC_CONST(0.0474331914364021), - FRAC_CONST(0.0481878041641539), - FRAC_CONST(0.0489500761253148), - FRAC_CONST(0.0497200374181119), - FRAC_CONST(0.0504977178186404), - FRAC_CONST(0.0512831467768636), - FRAC_CONST(0.0520763534126273), - FRAC_CONST(0.0528773665116913), - FRAC_CONST(0.0536862145217772), - FRAC_CONST(0.0545029255486345), - FRAC_CONST(0.0553275273521232), - FRAC_CONST(0.0561600473423164), - FRAC_CONST(0.0570005125756209), - FRAC_CONST(0.0578489497509179), - FRAC_CONST(0.0587053852057233), - FRAC_CONST(0.0595698449123695), - FRAC_CONST(0.0604423544742077), - FRAC_CONST(0.0613229391218317), - FRAC_CONST(0.0622116237093247), - FRAC_CONST(0.0631084327105284), - FRAC_CONST(0.0640133902153352), - FRAC_CONST(0.0649265199260043), - FRAC_CONST(0.0658478451535027), - FRAC_CONST(0.0667773888138695), - FRAC_CONST(0.0677151734246072), - FRAC_CONST(0.0686612211010977), - FRAC_CONST(0.0696155535530446), - FRAC_CONST(0.0705781920809429), - FRAC_CONST(0.0715491575725758), - FRAC_CONST(0.0725284704995383), - FRAC_CONST(0.0735161509137906), - FRAC_CONST(0.0745122184442388), - FRAC_CONST(0.0755166922933461), - FRAC_CONST(0.0765295912337720), - FRAC_CONST(0.0775509336050437), - FRAC_CONST(0.0785807373102561), - FRAC_CONST(0.0796190198128044), - FRAC_CONST(0.0806657981331473), - FRAC_CONST(0.0817210888456026), - FRAC_CONST(0.0827849080751753), - FRAC_CONST(0.0838572714944183), - FRAC_CONST(0.0849381943203265), - FRAC_CONST(0.0860276913112652), - FRAC_CONST(0.0871257767639319), - FRAC_CONST(0.0882324645103534), - FRAC_CONST(0.0893477679149177), - FRAC_CONST(0.0904716998714418), - FRAC_CONST(0.0916042728002747), - FRAC_CONST(0.0927454986454381), - FRAC_CONST(0.0938953888718020), - FRAC_CONST(0.0950539544622996), - FRAC_CONST(0.0962212059151784), - FRAC_CONST(0.0973971532412897), - FRAC_CONST(0.0985818059614169), - FRAC_CONST(0.0997751731036425), - FRAC_CONST(0.1009772632007537), - FRAC_CONST(0.1021880842876888), - FRAC_CONST(0.1034076438990227), - FRAC_CONST(0.1046359490664932), - FRAC_CONST(0.1058730063165681), - FRAC_CONST(0.1071188216680533), - FRAC_CONST(0.1083734006297428), - FRAC_CONST(0.1096367481981100), - FRAC_CONST(0.1109088688550422), - FRAC_CONST(0.1121897665656167), - FRAC_CONST(0.1134794447759207), - FRAC_CONST(0.1147779064109143), - FRAC_CONST(0.1160851538723372), - FRAC_CONST(0.1174011890366591), - FRAC_CONST(0.1187260132530751), - FRAC_CONST(0.1200596273415457), - FRAC_CONST(0.1214020315908810), - FRAC_CONST(0.1227532257568719), - FRAC_CONST(0.1241132090604651), - FRAC_CONST(0.1254819801859856), - FRAC_CONST(0.1268595372794049), - FRAC_CONST(0.1282458779466558), - FRAC_CONST(0.1296409992519942), - FRAC_CONST(0.1310448977164081), - FRAC_CONST(0.1324575693160745), - FRAC_CONST(0.1338790094808633), - FRAC_CONST(0.1353092130928902), - FRAC_CONST(0.1367481744851168), - FRAC_CONST(0.1381958874400010), - FRAC_CONST(0.1396523451881945), - FRAC_CONST(0.1411175404072910), - FRAC_CONST(0.1425914652206223), - FRAC_CONST(0.1440741111961058), - FRAC_CONST(0.1455654693451402), - FRAC_CONST(0.1470655301215526), - FRAC_CONST(0.1485742834205956), - FRAC_CONST(0.1500917185779945), - FRAC_CONST(0.1516178243690463), - FRAC_CONST(0.1531525890077689), - FRAC_CONST(0.1546960001461024), - FRAC_CONST(0.1562480448731608), - FRAC_CONST(0.1578087097145364), - FRAC_CONST(0.1593779806316558), - FRAC_CONST(0.1609558430211876), - FRAC_CONST(0.1625422817145027), - FRAC_CONST(0.1641372809771871), - FRAC_CONST(0.1657408245086070), - FRAC_CONST(0.1673528954415270), - FRAC_CONST(0.1689734763417811), - FRAC_CONST(0.1706025492079969), - FRAC_CONST(0.1722400954713725), - FRAC_CONST(0.1738860959955082), - FRAC_CONST(0.1755405310762898), - FRAC_CONST(0.1772033804418275), - FRAC_CONST(0.1788746232524467), - FRAC_CONST(0.1805542381007349), - FRAC_CONST(0.1822422030116404), - FRAC_CONST(0.1839384954426268), - FRAC_CONST(0.1856430922838810), - FRAC_CONST(0.1873559698585756), - FRAC_CONST(0.1890771039231862), - FRAC_CONST(0.1908064696678625), - FRAC_CONST(0.1925440417168546), - FRAC_CONST(0.1942897941289937), - FRAC_CONST(0.1960437003982277), - FRAC_CONST(0.1978057334542116), - FRAC_CONST(0.1995758656629525), - FRAC_CONST(0.2013540688275098), - FRAC_CONST(0.2031403141887507), - FRAC_CONST(0.2049345724261595), - FRAC_CONST(0.2067368136587033), - FRAC_CONST(0.2085470074457521), - FRAC_CONST(0.2103651227880538), - FRAC_CONST(0.2121911281287646), - FRAC_CONST(0.2140249913545346), - FRAC_CONST(0.2158666797966480), - FRAC_CONST(0.2177161602322188), - FRAC_CONST(0.2195733988854414), - FRAC_CONST(0.2214383614288963), - FRAC_CONST(0.2233110129849106), - FRAC_CONST(0.2251913181269740), - FRAC_CONST(0.2270792408812093), - FRAC_CONST(0.2289747447278976), - FRAC_CONST(0.2308777926030592), - FRAC_CONST(0.2327883469000885), - FRAC_CONST(0.2347063694714437), - FRAC_CONST(0.2366318216303919), - FRAC_CONST(0.2385646641528076), - FRAC_CONST(0.2405048572790267), - FRAC_CONST(0.2424523607157545), - FRAC_CONST(0.2444071336380283), - FRAC_CONST(0.2463691346912334), - FRAC_CONST(0.2483383219931741), - FRAC_CONST(0.2503146531361985), - FRAC_CONST(0.2522980851893767), - FRAC_CONST(0.2542885747007335), - FRAC_CONST(0.2562860776995335), - FRAC_CONST(0.2582905496986215), - FRAC_CONST(0.2603019456968142), - FRAC_CONST(0.2623202201813464), - FRAC_CONST(0.2643453271303700), - FRAC_CONST(0.2663772200155053), - FRAC_CONST(0.2684158518044454), - FRAC_CONST(0.2704611749636135), - FRAC_CONST(0.2725131414608710), - FRAC_CONST(0.2745717027682799), - FRAC_CONST(0.2766368098649151), - FRAC_CONST(0.2787084132397296), - FRAC_CONST(0.2807864628944707), - FRAC_CONST(0.2828709083466482), - FRAC_CONST(0.2849616986325523), - FRAC_CONST(0.2870587823103237), - FRAC_CONST(0.2891621074630737), - FRAC_CONST(0.2912716217020546), - FRAC_CONST(0.2933872721698803), - FRAC_CONST(0.2955090055437973), - FRAC_CONST(0.2976367680390041), - FRAC_CONST(0.2997705054120213), - FRAC_CONST(0.3019101629641097), - FRAC_CONST(0.3040556855447379), - FRAC_CONST(0.3062070175550981), - FRAC_CONST(0.3083641029516701), - FRAC_CONST(0.3105268852498334), - FRAC_CONST(0.3126953075275265), - FRAC_CONST(0.3148693124289546), - FRAC_CONST(0.3170488421683428), - FRAC_CONST(0.3192338385337370), - FRAC_CONST(0.3214242428908514), - FRAC_CONST(0.3236199961869606), - FRAC_CONST(0.3258210389548392), - FRAC_CONST(0.3280273113167459), - FRAC_CONST(0.3302387529884521), - FRAC_CONST(0.3324553032833160), - FRAC_CONST(0.3346769011164010), - FRAC_CONST(0.3369034850086373), - FRAC_CONST(0.3391349930910280), - FRAC_CONST(0.3413713631088974), - FRAC_CONST(0.3436125324261830), - FRAC_CONST(0.3458584380297697), - FRAC_CONST(0.3481090165338656), - FRAC_CONST(0.3503642041844199), - FRAC_CONST(0.3526239368635820), - FRAC_CONST(0.3548881500942010), - FRAC_CONST(0.3571567790443668), - FRAC_CONST(0.3594297585319891), - FRAC_CONST(0.3617070230294185), - FRAC_CONST(0.3639885066681048), - FRAC_CONST(0.3662741432432950), - FRAC_CONST(0.3685638662187693), - FRAC_CONST(0.3708576087316147), - FRAC_CONST(0.3731553035970366), - FRAC_CONST(0.3754568833132069), - FRAC_CONST(0.3777622800661488), - FRAC_CONST(0.3800714257346570), - FRAC_CONST(0.3823842518952546), - FRAC_CONST(0.3847006898271841), - FRAC_CONST(0.3870206705174334), - FRAC_CONST(0.3893441246657958), - FRAC_CONST(0.3916709826899639), - FRAC_CONST(0.3940011747306560), - FRAC_CONST(0.3963346306567764), - FRAC_CONST(0.3986712800706062), - FRAC_CONST(0.4010110523130271), - FRAC_CONST(0.4033538764687756), - FRAC_CONST(0.4056996813717284), - FRAC_CONST(0.4080483956102172), - FRAC_CONST(0.4103999475323736), - FRAC_CONST(0.4127542652515031), - FRAC_CONST(0.4151112766514873), - FRAC_CONST(0.4174709093922143), - FRAC_CONST(0.4198330909150365), - FRAC_CONST(0.4221977484482556), - FRAC_CONST(0.4245648090126334), - FRAC_CONST(0.4269341994269293), - FRAC_CONST(0.4293058463134616), - FRAC_CONST(0.4316796761036958), - FRAC_CONST(0.4340556150438547), - FRAC_CONST(0.4364335892005536), - FRAC_CONST(0.4388135244664580), - FRAC_CONST(0.4411953465659639), - FRAC_CONST(0.4435789810609000), - FRAC_CONST(0.4459643533562509), - FRAC_CONST(0.4483513887059016), - FRAC_CONST(0.4507400122184019), - FRAC_CONST(0.4531301488627497), - FRAC_CONST(0.4555217234741947), - FRAC_CONST(0.4579146607600593), - FRAC_CONST(0.4603088853055777), - FRAC_CONST(0.4627043215797521), - FRAC_CONST(0.4651008939412254), - FRAC_CONST(0.4674985266441709), - FRAC_CONST(0.4698971438441951), - FRAC_CONST(0.4722966696042580), - FRAC_CONST(0.4746970279006055), - FRAC_CONST(0.4770981426287164), - FRAC_CONST(0.4794999376092619), - FRAC_CONST(0.4819023365940778), - FRAC_CONST(0.4843052632721476), - FRAC_CONST(0.4867086412755978), - FRAC_CONST(0.4891123941857028), - FRAC_CONST(0.4915164455388997), - FRAC_CONST(0.4939207188328126), - FRAC_CONST(0.4963251375322855), - FRAC_CONST(0.4987296250754225), - FRAC_CONST(0.5011341048796359), - FRAC_CONST(0.5035385003477012), - FRAC_CONST(0.5059427348738168), - FRAC_CONST(0.5083467318496706), - FRAC_CONST(0.5107504146705106), - FRAC_CONST(0.5131537067412193), - FRAC_CONST(0.5155565314823923), - FRAC_CONST(0.5179588123364193), - FRAC_CONST(0.5203604727735667), - FRAC_CONST(0.5227614362980630), - FRAC_CONST(0.5251616264541841), - FRAC_CONST(0.5275609668323384), - FRAC_CONST(0.5299593810751532), - FRAC_CONST(0.5323567928835578), - FRAC_CONST(0.5347531260228663), - FRAC_CONST(0.5371483043288580), - FRAC_CONST(0.5395422517138538), - FRAC_CONST(0.5419348921727899), - FRAC_CONST(0.5443261497892862), - FRAC_CONST(0.5467159487417104), - FRAC_CONST(0.5491042133092364), - FRAC_CONST(0.5514908678778958), - FRAC_CONST(0.5538758369466227), - FRAC_CONST(0.5562590451332913), - FRAC_CONST(0.5586404171807443), - FRAC_CONST(0.5610198779628133), - FRAC_CONST(0.5633973524903286), - FRAC_CONST(0.5657727659171199), - FRAC_CONST(0.5681460435460047), - FRAC_CONST(0.5705171108347663), - FRAC_CONST(0.5728858934021188), - FRAC_CONST(0.5752523170336598), - FRAC_CONST(0.5776163076878088), - FRAC_CONST(0.5799777915017323), - FRAC_CONST(0.5823366947972535), - FRAC_CONST(0.5846929440867458), - FRAC_CONST(0.5870464660790119), - FRAC_CONST(0.5893971876851449), - FRAC_CONST(0.5917450360243719), - FRAC_CONST(0.5940899384298793), - FRAC_CONST(0.5964318224546208), - FRAC_CONST(0.5987706158771039), - FRAC_CONST(0.6011062467071583), - FRAC_CONST(0.6034386431916822), - FRAC_CONST(0.6057677338203681), - FRAC_CONST(0.6080934473314057), - FRAC_CONST(0.6104157127171639), - FRAC_CONST(0.6127344592298474), - FRAC_CONST(0.6150496163871310), - FRAC_CONST(0.6173611139777690), - FRAC_CONST(0.6196688820671789), - FRAC_CONST(0.6219728510029997), - FRAC_CONST(0.6242729514206247), - FRAC_CONST(0.6265691142487051), - FRAC_CONST(0.6288612707146283), - FRAC_CONST(0.6311493523499663), - FRAC_CONST(0.6334332909958958), - FRAC_CONST(0.6357130188085891), - FRAC_CONST(0.6379884682645743), - FRAC_CONST(0.6402595721660647), - FRAC_CONST(0.6425262636462578), - FRAC_CONST(0.6447884761746012), - FRAC_CONST(0.6470461435620266), - FRAC_CONST(0.6492991999661505), - FRAC_CONST(0.6515475798964411), - FRAC_CONST(0.6537912182193508), - FRAC_CONST(0.6560300501634142), - FRAC_CONST(0.6582640113243098), - FRAC_CONST(0.6604930376698862), - FRAC_CONST(0.6627170655451516), - FRAC_CONST(0.6649360316772256), - FRAC_CONST(0.6671498731802533), - FRAC_CONST(0.6693585275602818), - FRAC_CONST(0.6715619327200959), - FRAC_CONST(0.6737600269640164), - FRAC_CONST(0.6759527490026566), - FRAC_CONST(0.6781400379576392), - FRAC_CONST(0.6803218333662715), - FRAC_CONST(0.6824980751861787), - FRAC_CONST(0.6846687037998949), - FRAC_CONST(0.6868336600194123), - FRAC_CONST(0.6889928850906855), - FRAC_CONST(0.6911463206980928), - FRAC_CONST(0.6932939089688525), - FRAC_CONST(0.6954355924773949), - FRAC_CONST(0.6975713142496884), - FRAC_CONST(0.6997010177675195), - FRAC_CONST(0.7018246469727265), - FRAC_CONST(0.7039421462713862), - FRAC_CONST(0.7060534605379528), - FRAC_CONST(0.7081585351193496), - FRAC_CONST(0.7102573158390105), - FRAC_CONST(0.7123497490008750), - FRAC_CONST(0.7144357813933307), - FRAC_CONST(0.7165153602931092), - FRAC_CONST(0.7185884334691287), - FRAC_CONST(0.7206549491862871), - FRAC_CONST(0.7227148562092042), - FRAC_CONST(0.7247681038059106), - FRAC_CONST(0.7268146417514855), - FRAC_CONST(0.7288544203316418), - FRAC_CONST(0.7308873903462577), - FRAC_CONST(0.7329135031128549), - FRAC_CONST(0.7349327104700221), - FRAC_CONST(0.7369449647807855), - FRAC_CONST(0.7389502189359237), - FRAC_CONST(0.7409484263572271), - FRAC_CONST(0.7429395410007016), - FRAC_CONST(0.7449235173597176), - FRAC_CONST(0.7469003104681008), - FRAC_CONST(0.7488698759031670), - FRAC_CONST(0.7508321697887005), - FRAC_CONST(0.7527871487978728), - FRAC_CONST(0.7547347701561059), - FRAC_CONST(0.7566749916438754), - FRAC_CONST(0.7586077715994560), - FRAC_CONST(0.7605330689216074), - FRAC_CONST(0.7624508430722016), - FRAC_CONST(0.7643610540787891), - FRAC_CONST(0.7662636625371070), - FRAC_CONST(0.7681586296135255), - FRAC_CONST(0.7700459170474343), - FRAC_CONST(0.7719254871535672), - FRAC_CONST(0.7737973028242671), - FRAC_CONST(0.7756613275316875), - FRAC_CONST(0.7775175253299340), - FRAC_CONST(0.7793658608571425), - FRAC_CONST(0.7812062993374951), - FRAC_CONST(0.7830388065831744), - FRAC_CONST(0.7848633489962533), - FRAC_CONST(0.7866798935705233), - FRAC_CONST(0.7884884078932579), - FRAC_CONST(0.7902888601469138), - FRAC_CONST(0.7920812191107668), - FRAC_CONST(0.7938654541624850), - FRAC_CONST(0.7956415352796368), - FRAC_CONST(0.7974094330411343), - FRAC_CONST(0.7991691186286133), - FRAC_CONST(0.8009205638277465), - FRAC_CONST(0.8026637410294932), - FRAC_CONST(0.8043986232312831), - FRAC_CONST(0.8061251840381346), - FRAC_CONST(0.8078433976637077), - FRAC_CONST(0.8095532389312917), - FRAC_CONST(0.8112546832747255), - FRAC_CONST(0.8129477067392539), - FRAC_CONST(0.8146322859823164), - FRAC_CONST(0.8163083982742698), - FRAC_CONST(0.8179760214990457), - FRAC_CONST(0.8196351341547393), - FRAC_CONST(0.8212857153541345), - FRAC_CONST(0.8229277448251595), - FRAC_CONST(0.8245612029112778), - FRAC_CONST(0.8261860705718113), - FRAC_CONST(0.8278023293821971), - FRAC_CONST(0.8294099615341773), - FRAC_CONST(0.8310089498359212), - FRAC_CONST(0.8325992777120815), - FRAC_CONST(0.8341809292037831), - FRAC_CONST(0.8357538889685445), - FRAC_CONST(0.8373181422801330), - FRAC_CONST(0.8388736750283521), - FRAC_CONST(0.8404204737187619), - FRAC_CONST(0.8419585254723335), - FRAC_CONST(0.8434878180250348), - FRAC_CONST(0.8450083397273509), - FRAC_CONST(0.8465200795437368), - FRAC_CONST(0.8480230270520029), - FRAC_CONST(0.8495171724426350), - FRAC_CONST(0.8510025065180464), - FRAC_CONST(0.8524790206917633), - FRAC_CONST(0.8539467069875448), - FRAC_CONST(0.8554055580384357), - FRAC_CONST(0.8568555670857525), - FRAC_CONST(0.8582967279780043), - FRAC_CONST(0.8597290351697464), - FRAC_CONST(0.8611524837203691), - FRAC_CONST(0.8625670692928198), - FRAC_CONST(0.8639727881522599), - FRAC_CONST(0.8653696371646555), - FRAC_CONST(0.8667576137953045), - FRAC_CONST(0.8681367161072958), - FRAC_CONST(0.8695069427599065), - FRAC_CONST(0.8708682930069319), - FRAC_CONST(0.8722207666949527), - FRAC_CONST(0.8735643642615368), - FRAC_CONST(0.8748990867333771), - FRAC_CONST(0.8762249357243662), - FRAC_CONST(0.8775419134336067), - FRAC_CONST(0.8788500226433579), - FRAC_CONST(0.8801492667169208), - FRAC_CONST(0.8814396495964587), - FRAC_CONST(0.8827211758007560), - FRAC_CONST(0.8839938504229149), - FRAC_CONST(0.8852576791279895), - FRAC_CONST(0.8865126681505587), - FRAC_CONST(0.8877588242922386), - FRAC_CONST(0.8889961549191320), - FRAC_CONST(0.8902246679592184), - FRAC_CONST(0.8914443718996848), - FRAC_CONST(0.8926552757841945), - FRAC_CONST(0.8938573892100969), - FRAC_CONST(0.8950507223255798), - FRAC_CONST(0.8962352858267605), - FRAC_CONST(0.8974110909547198), - FRAC_CONST(0.8985781494924783), - FRAC_CONST(0.8997364737619142), - FRAC_CONST(0.9008860766206249), - FRAC_CONST(0.9020269714587307), - FRAC_CONST(0.9031591721956235), - FRAC_CONST(0.9042826932766591), - FRAC_CONST(0.9053975496697941), - FRAC_CONST(0.9065037568621681), - FRAC_CONST(0.9076013308566311), - FRAC_CONST(0.9086902881682180), - FRAC_CONST(0.9097706458205682), - FRAC_CONST(0.9108424213422940), - FRAC_CONST(0.9119056327632955), - FRAC_CONST(0.9129602986110235), - FRAC_CONST(0.9140064379066919), - FRAC_CONST(0.9150440701614393), - FRAC_CONST(0.9160732153724396), - FRAC_CONST(0.9170938940189634), - FRAC_CONST(0.9181061270583908), - FRAC_CONST(0.9191099359221748), - FRAC_CONST(0.9201053425117579), - FRAC_CONST(0.9210923691944400), - FRAC_CONST(0.9220710387992010), - FRAC_CONST(0.9230413746124764), - FRAC_CONST(0.9240034003738882), - FRAC_CONST(0.9249571402719298), - FRAC_CONST(0.9259026189396085), - FRAC_CONST(0.9268398614500427), - FRAC_CONST(0.9277688933120170), - FRAC_CONST(0.9286897404654957), - FRAC_CONST(0.9296024292770939), - FRAC_CONST(0.9305069865355076), - FRAC_CONST(0.9314034394469048), - FRAC_CONST(0.9322918156302762), - FRAC_CONST(0.9331721431127471), - FRAC_CONST(0.9340444503248519), - FRAC_CONST(0.9349087660957711), - FRAC_CONST(0.9357651196485313), - FRAC_CONST(0.9366135405951697), - FRAC_CONST(0.9374540589318637), - FRAC_CONST(0.9382867050340261), - FRAC_CONST(0.9391115096513655), - FRAC_CONST(0.9399285039029165), - FRAC_CONST(0.9407377192720349), - FRAC_CONST(0.9415391876013639), - FRAC_CONST(0.9423329410877687), - FRAC_CONST(0.9431190122772415), - FRAC_CONST(0.9438974340597782), - FRAC_CONST(0.9446682396642262), - FRAC_CONST(0.9454314626531054), - FRAC_CONST(0.9461871369174033), - FRAC_CONST(0.9469352966713429), - FRAC_CONST(0.9476759764471278), - FRAC_CONST(0.9484092110896616), - FRAC_CONST(0.9491350357512457), - FRAC_CONST(0.9498534858862532), - FRAC_CONST(0.9505645972457831), - FRAC_CONST(0.9512684058722927), - FRAC_CONST(0.9519649480942105), - FRAC_CONST(0.9526542605205314), - FRAC_CONST(0.9533363800353921), - FRAC_CONST(0.9540113437926313), - FRAC_CONST(0.9546791892103320), - FRAC_CONST(0.9553399539653500), - FRAC_CONST(0.9559936759878265), - FRAC_CONST(0.9566403934556893), - FRAC_CONST(0.9572801447891388), - FRAC_CONST(0.9579129686451244), - FRAC_CONST(0.9585389039118085), - FRAC_CONST(0.9591579897030224), - FRAC_CONST(0.9597702653527108), - FRAC_CONST(0.9603757704093711), - FRAC_CONST(0.9609745446304828), - FRAC_CONST(0.9615666279769324), - FRAC_CONST(0.9621520606074324), - FRAC_CONST(0.9627308828729358), - FRAC_CONST(0.9633031353110477), - FRAC_CONST(0.9638688586404335), - FRAC_CONST(0.9644280937552258), - FRAC_CONST(0.9649808817194311), - FRAC_CONST(0.9655272637613366), - FRAC_CONST(0.9660672812679171), - FRAC_CONST(0.9666009757792454), - FRAC_CONST(0.9671283889829055), - FRAC_CONST(0.9676495627084089), - FRAC_CONST(0.9681645389216160), - FRAC_CONST(0.9686733597191652), - FRAC_CONST(0.9691760673229058), - FRAC_CONST(0.9696727040743406), - FRAC_CONST(0.9701633124290767), - FRAC_CONST(0.9706479349512860), - FRAC_CONST(0.9711266143081750), - FRAC_CONST(0.9715993932644684), - FRAC_CONST(0.9720663146769026), - FRAC_CONST(0.9725274214887337), - FRAC_CONST(0.9729827567242596), - FRAC_CONST(0.9734323634833574), - FRAC_CONST(0.9738762849360358), - FRAC_CONST(0.9743145643170059), - FRAC_CONST(0.9747472449202687), - FRAC_CONST(0.9751743700937215), - FRAC_CONST(0.9755959832337850), - FRAC_CONST(0.9760121277800496), - FRAC_CONST(0.9764228472099433), - FRAC_CONST(0.9768281850334235), - FRAC_CONST(0.9772281847876897), - FRAC_CONST(0.9776228900319223), - FRAC_CONST(0.9780123443420448), - FRAC_CONST(0.9783965913055132), - FRAC_CONST(0.9787756745161313), - FRAC_CONST(0.9791496375688939), - FRAC_CONST(0.9795185240548578), - FRAC_CONST(0.9798823775560431), - FRAC_CONST(0.9802412416403639), - FRAC_CONST(0.9805951598565897), - FRAC_CONST(0.9809441757293399), - FRAC_CONST(0.9812883327541090), - FRAC_CONST(0.9816276743923267), - FRAC_CONST(0.9819622440664515), - FRAC_CONST(0.9822920851550995), - FRAC_CONST(0.9826172409882086), - FRAC_CONST(0.9829377548422400), - FRAC_CONST(0.9832536699354163), - FRAC_CONST(0.9835650294229984), - FRAC_CONST(0.9838718763926001), - FRAC_CONST(0.9841742538595437), - FRAC_CONST(0.9844722047622547), - FRAC_CONST(0.9847657719576983), - FRAC_CONST(0.9850549982168574), - FRAC_CONST(0.9853399262202529), - FRAC_CONST(0.9856205985535073), - FRAC_CONST(0.9858970577029519), - FRAC_CONST(0.9861693460512790), - FRAC_CONST(0.9864375058732389), - FRAC_CONST(0.9867015793313820), - FRAC_CONST(0.9869616084718489), - FRAC_CONST(0.9872176352202061), - FRAC_CONST(0.9874697013773301), - FRAC_CONST(0.9877178486153397), - FRAC_CONST(0.9879621184735767), - FRAC_CONST(0.9882025523546365), - FRAC_CONST(0.9884391915204485), - FRAC_CONST(0.9886720770884069), - FRAC_CONST(0.9889012500275530), - FRAC_CONST(0.9891267511548089), - FRAC_CONST(0.9893486211312621), - FRAC_CONST(0.9895669004585049), - FRAC_CONST(0.9897816294750255), - FRAC_CONST(0.9899928483526520), - FRAC_CONST(0.9902005970930525), - FRAC_CONST(0.9904049155242876), - FRAC_CONST(0.9906058432974180), - FRAC_CONST(0.9908034198831690), - FRAC_CONST(0.9909976845686489), - FRAC_CONST(0.9911886764541239), - FRAC_CONST(0.9913764344498495), - FRAC_CONST(0.9915609972729590), - FRAC_CONST(0.9917424034444086), - FRAC_CONST(0.9919206912859797), - FRAC_CONST(0.9920958989173397), - FRAC_CONST(0.9922680642531603), - FRAC_CONST(0.9924372250002933), - FRAC_CONST(0.9926034186550070), - FRAC_CONST(0.9927666825002789), - FRAC_CONST(0.9929270536031491), - FRAC_CONST(0.9930845688121325), - FRAC_CONST(0.9932392647546895), - FRAC_CONST(0.9933911778347579), - FRAC_CONST(0.9935403442303433), - FRAC_CONST(0.9936867998911693), - FRAC_CONST(0.9938305805363887), - FRAC_CONST(0.9939717216523539), - FRAC_CONST(0.9941102584904481), - FRAC_CONST(0.9942462260649764), - FRAC_CONST(0.9943796591511174), - FRAC_CONST(0.9945105922829353), - FRAC_CONST(0.9946390597514524), - FRAC_CONST(0.9947650956027824), - FRAC_CONST(0.9948887336363228), - FRAC_CONST(0.9950100074030103), - FRAC_CONST(0.9951289502036336), - FRAC_CONST(0.9952455950872091), - FRAC_CONST(0.9953599748494155), - FRAC_CONST(0.9954721220310890), - FRAC_CONST(0.9955820689167787), - FRAC_CONST(0.9956898475333619), - FRAC_CONST(0.9957954896487196), - FRAC_CONST(0.9958990267704713), - FRAC_CONST(0.9960004901447701), - FRAC_CONST(0.9960999107551559), - FRAC_CONST(0.9961973193214694), - FRAC_CONST(0.9962927462988245), - FRAC_CONST(0.9963862218766388), - FRAC_CONST(0.9964777759777242), - FRAC_CONST(0.9965674382574342), - FRAC_CONST(0.9966552381028704), - FRAC_CONST(0.9967412046321465), - FRAC_CONST(0.9968253666937095), - FRAC_CONST(0.9969077528657186), - FRAC_CONST(0.9969883914554805), - FRAC_CONST(0.9970673104989413), - FRAC_CONST(0.9971445377602348), - FRAC_CONST(0.9972201007312871), - FRAC_CONST(0.9972940266314749), - FRAC_CONST(0.9973663424073412), - FRAC_CONST(0.9974370747323638), - FRAC_CONST(0.9975062500067785), - FRAC_CONST(0.9975738943574574), - FRAC_CONST(0.9976400336378379), - FRAC_CONST(0.9977046934279079), - FRAC_CONST(0.9977678990342401), - FRAC_CONST(0.9978296754900812), - FRAC_CONST(0.9978900475554902), - FRAC_CONST(0.9979490397175296), - FRAC_CONST(0.9980066761905056), - FRAC_CONST(0.9980629809162593), - FRAC_CONST(0.9981179775645063), - FRAC_CONST(0.9981716895332257), - FRAC_CONST(0.9982241399490979), - FRAC_CONST(0.9982753516679893), - FRAC_CONST(0.9983253472754841), - FRAC_CONST(0.9983741490874634), - FRAC_CONST(0.9984217791507299), - FRAC_CONST(0.9984682592436778), - FRAC_CONST(0.9985136108770075), - FRAC_CONST(0.9985578552944850), - FRAC_CONST(0.9986010134737439), - FRAC_CONST(0.9986431061271304), - FRAC_CONST(0.9986841537025921), - FRAC_CONST(0.9987241763846056), - FRAC_CONST(0.9987631940951476), - FRAC_CONST(0.9988012264947044), - FRAC_CONST(0.9988382929833222), - FRAC_CONST(0.9988744127016956), - FRAC_CONST(0.9989096045322947), - FRAC_CONST(0.9989438871005292), - FRAC_CONST(0.9989772787759494), - FRAC_CONST(0.9990097976734847), - FRAC_CONST(0.9990414616547146), - FRAC_CONST(0.9990722883291779), - FRAC_CONST(0.9991022950557125), - FRAC_CONST(0.9991314989438310), - FRAC_CONST(0.9991599168551279), - FRAC_CONST(0.9991875654047181), - FRAC_CONST(0.9992144609627068), - FRAC_CONST(0.9992406196556911), - FRAC_CONST(0.9992660573682882), - FRAC_CONST(0.9992907897446957), - FRAC_CONST(0.9993148321902777), - FRAC_CONST(0.9993381998731797), - FRAC_CONST(0.9993609077259696), - FRAC_CONST(0.9993829704473038), - FRAC_CONST(0.9994044025036201), - FRAC_CONST(0.9994252181308537), - FRAC_CONST(0.9994454313361775), - FRAC_CONST(0.9994650558997651), - FRAC_CONST(0.9994841053765757), - FRAC_CONST(0.9995025930981609), - FRAC_CONST(0.9995205321744921), - FRAC_CONST(0.9995379354958073), - FRAC_CONST(0.9995548157344778), - FRAC_CONST(0.9995711853468930), - FRAC_CONST(0.9995870565753632), - FRAC_CONST(0.9996024414500382), - FRAC_CONST(0.9996173517908444), - FRAC_CONST(0.9996317992094352), - FRAC_CONST(0.9996457951111574), - FRAC_CONST(0.9996593506970310), - FRAC_CONST(0.9996724769657434), - FRAC_CONST(0.9996851847156547), - FRAC_CONST(0.9996974845468164), - FRAC_CONST(0.9997093868630000), - FRAC_CONST(0.9997209018737374), - FRAC_CONST(0.9997320395963699), - FRAC_CONST(0.9997428098581069), - FRAC_CONST(0.9997532222980933), - FRAC_CONST(0.9997632863694836), - FRAC_CONST(0.9997730113415246), - FRAC_CONST(0.9997824063016426), - FRAC_CONST(0.9997914801575380), - FRAC_CONST(0.9998002416392840), - FRAC_CONST(0.9998086993014300), - FRAC_CONST(0.9998168615251084), - FRAC_CONST(0.9998247365201450), - FRAC_CONST(0.9998323323271717), - FRAC_CONST(0.9998396568197407), - FRAC_CONST(0.9998467177064404), - FRAC_CONST(0.9998535225330116), - FRAC_CONST(0.9998600786844637), - FRAC_CONST(0.9998663933871905), - FRAC_CONST(0.9998724737110845), - FRAC_CONST(0.9998783265716498), - FRAC_CONST(0.9998839587321121), - FRAC_CONST(0.9998893768055266), - FRAC_CONST(0.9998945872568815), - FRAC_CONST(0.9998995964051983), - FRAC_CONST(0.9999044104256269), - FRAC_CONST(0.9999090353515359), - FRAC_CONST(0.9999134770765971), - FRAC_CONST(0.9999177413568642), - FRAC_CONST(0.9999218338128448), - FRAC_CONST(0.9999257599315647), - FRAC_CONST(0.9999295250686255), - FRAC_CONST(0.9999331344502529), - FRAC_CONST(0.9999365931753376), - FRAC_CONST(0.9999399062174669), - FRAC_CONST(0.9999430784269460), - FRAC_CONST(0.9999461145328103), - FRAC_CONST(0.9999490191448277), - FRAC_CONST(0.9999517967554878), - FRAC_CONST(0.9999544517419835), - FRAC_CONST(0.9999569883681778), - FRAC_CONST(0.9999594107865607), - FRAC_CONST(0.9999617230401926), - FRAC_CONST(0.9999639290646355), - FRAC_CONST(0.9999660326898712), - FRAC_CONST(0.9999680376422052), - FRAC_CONST(0.9999699475461585), - FRAC_CONST(0.9999717659263435), - FRAC_CONST(0.9999734962093266), - FRAC_CONST(0.9999751417254756), - FRAC_CONST(0.9999767057107922), - FRAC_CONST(0.9999781913087290), - FRAC_CONST(0.9999796015719915), - FRAC_CONST(0.9999809394643231), - FRAC_CONST(0.9999822078622751), - FRAC_CONST(0.9999834095569596), - FRAC_CONST(0.9999845472557860), - FRAC_CONST(0.9999856235841805), - FRAC_CONST(0.9999866410872889), - FRAC_CONST(0.9999876022316609), - FRAC_CONST(0.9999885094069193), - FRAC_CONST(0.9999893649274085), - FRAC_CONST(0.9999901710338274), - FRAC_CONST(0.9999909298948430), - FRAC_CONST(0.9999916436086862), - FRAC_CONST(0.9999923142047299), - FRAC_CONST(0.9999929436450469), - FRAC_CONST(0.9999935338259505), - FRAC_CONST(0.9999940865795161), - FRAC_CONST(0.9999946036750835), - FRAC_CONST(0.9999950868207405), - FRAC_CONST(0.9999955376647868), - FRAC_CONST(0.9999959577971798), - FRAC_CONST(0.9999963487509599), - FRAC_CONST(0.9999967120036571), - FRAC_CONST(0.9999970489786785), - FRAC_CONST(0.9999973610466748), - FRAC_CONST(0.9999976495268890), - FRAC_CONST(0.9999979156884846), - FRAC_CONST(0.9999981607518545), - FRAC_CONST(0.9999983858899099), - FRAC_CONST(0.9999985922293493), - FRAC_CONST(0.9999987808519092), - FRAC_CONST(0.9999989527955938), - FRAC_CONST(0.9999991090558848), - FRAC_CONST(0.9999992505869332), - FRAC_CONST(0.9999993783027293), - FRAC_CONST(0.9999994930782556), - FRAC_CONST(0.9999995957506171), - FRAC_CONST(0.9999996871201549), - FRAC_CONST(0.9999997679515386), - FRAC_CONST(0.9999998389748399), - FRAC_CONST(0.9999999008865869), - FRAC_CONST(0.9999999543507984) -}; -#endif - -ALIGN static const real_t kbd_short_128[] = -{ - FRAC_CONST(4.3795702929468881e-005), - FRAC_CONST(0.00011867384265436617), - FRAC_CONST(0.0002307165763996192), - FRAC_CONST(0.00038947282760568383), - FRAC_CONST(0.00060581272288302553), - FRAC_CONST(0.00089199695169487453), - FRAC_CONST(0.0012617254423430522), - FRAC_CONST(0.0017301724373162003), - FRAC_CONST(0.0023140071937421476), - FRAC_CONST(0.0030313989666022221), - FRAC_CONST(0.0039020049735530842), - FRAC_CONST(0.0049469401815512024), - FRAC_CONST(0.0061887279335368318), - FRAC_CONST(0.0076512306364647726), - FRAC_CONST(0.0093595599562652423), - FRAC_CONST(0.011339966208377799), - FRAC_CONST(0.013619706891715299), - FRAC_CONST(0.016226894586323766), - FRAC_CONST(0.019190324717288168), - FRAC_CONST(0.022539283975960878), - FRAC_CONST(0.026303340480472455), - FRAC_CONST(0.030512117046644357), - FRAC_CONST(0.03519504922365594), - FRAC_CONST(0.040381130021856941), - FRAC_CONST(0.046098643518702249), - FRAC_CONST(0.052374889768730587), - FRAC_CONST(0.059235903660769147), - FRAC_CONST(0.066706170556282418), - FRAC_CONST(0.074808341703430481), - FRAC_CONST(0.083562952548726227), - FRAC_CONST(0.092988147159339674), - FRAC_CONST(0.1030994120216919), - FRAC_CONST(0.11390932249409955), - FRAC_CONST(0.12542730516149531), - FRAC_CONST(0.13765941926783826), - FRAC_CONST(0.15060816028651081), - FRAC_CONST(0.16427228853114245), - FRAC_CONST(0.17864668550988483), - FRAC_CONST(0.19372224048676889), - FRAC_CONST(0.20948576943658073), - FRAC_CONST(0.22591996826744942), - FRAC_CONST(0.24300340184133981), - FRAC_CONST(0.26071052995068139), - FRAC_CONST(0.27901177101369551), - FRAC_CONST(0.29787360383626599), - FRAC_CONST(0.3172587073594233), - FRAC_CONST(0.33712613787396362), - FRAC_CONST(0.35743154274286698), - FRAC_CONST(0.37812740923363009), - FRAC_CONST(0.39916334663203618), - FRAC_CONST(0.42048639939189658), - FRAC_CONST(0.4420413886774246), - FRAC_CONST(0.4637712792815169), - FRAC_CONST(0.4856175685594023), - FRAC_CONST(0.50752069370766872), - FRAC_CONST(0.52942045344797806), - FRAC_CONST(0.55125643994680196), - FRAC_CONST(0.57296847662071559), - FRAC_CONST(0.59449705734411495), - FRAC_CONST(0.61578378249506627), - FRAC_CONST(0.63677178724712891), - FRAC_CONST(0.65740615754163356), - FRAC_CONST(0.67763432925662526), - FRAC_CONST(0.69740646622548552), - FRAC_CONST(0.71667581294953808), - FRAC_CONST(0.73539901809352737), - FRAC_CONST(0.75353642514900732), - FRAC_CONST(0.77105232699609816), - FRAC_CONST(0.78791518148597028), - FRAC_CONST(0.80409778560147072), - FRAC_CONST(0.81957740622770781), - FRAC_CONST(0.83433586607383625), - FRAC_CONST(0.84835958382689225), - FRAC_CONST(0.86163956818294229), - FRAC_CONST(0.87417136598406997), - FRAC_CONST(0.88595496528524853), - FRAC_CONST(0.89699465477567619), - FRAC_CONST(0.90729884157670959), - FRAC_CONST(0.91687983002436779), - FRAC_CONST(0.92575356460899649), - FRAC_CONST(0.93393934077779084), - FRAC_CONST(0.94145948779657318), - FRAC_CONST(0.94833902830402828), - FRAC_CONST(0.95460531956280026), - FRAC_CONST(0.96028768170574896), - FRAC_CONST(0.96541701848104766), - FRAC_CONST(0.97002543610646474), - FRAC_CONST(0.97414586584250062), - FRAC_CONST(0.97781169577969584), - FRAC_CONST(0.98105641710392333), - FRAC_CONST(0.98391328975491177), - FRAC_CONST(0.98641503193166202), - FRAC_CONST(0.98859353733226141), - FRAC_CONST(0.99047962335771556), - FRAC_CONST(0.9921028127769449), - FRAC_CONST(0.99349115056397752), - FRAC_CONST(0.99467105680259038), - FRAC_CONST(0.9956672157341897), - FRAC_CONST(0.99650250022834352), - FRAC_CONST(0.99719793020823266), - FRAC_CONST(0.99777266288955657), - FRAC_CONST(0.99824401211201486), - FRAC_CONST(0.99862749357391212), - FRAC_CONST(0.99893689243401962), - FRAC_CONST(0.99918434952623147), - FRAC_CONST(0.99938046234161726), - FRAC_CONST(0.99953439696357238), - FRAC_CONST(0.99965400728430465), - FRAC_CONST(0.99974595807027455), - FRAC_CONST(0.99981584876278362), - FRAC_CONST(0.99986833527824281), - FRAC_CONST(0.99990724749057802), - FRAC_CONST(0.99993570051598468), - FRAC_CONST(0.99995619835942084), - FRAC_CONST(0.99997072890647543), - FRAC_CONST(0.9999808496399144), - FRAC_CONST(0.99998776381655818), - FRAC_CONST(0.99999238714961569), - FRAC_CONST(0.99999540529959718), - FRAC_CONST(0.99999732268176988), - FRAC_CONST(0.99999850325054862), - FRAC_CONST(0.99999920402413744), - FRAC_CONST(0.9999996021706401), - FRAC_CONST(0.99999981649545566), - FRAC_CONST(0.99999992415545547), - FRAC_CONST(0.99999997338493041), - FRAC_CONST(0.99999999295825959), - FRAC_CONST(0.99999999904096815) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t kbd_short_120[] = -{ - FRAC_CONST(0.0000452320086910), - FRAC_CONST(0.0001274564692111), - FRAC_CONST(0.0002529398385345), - FRAC_CONST(0.0004335140496648), - FRAC_CONST(0.0006827100966952), - FRAC_CONST(0.0010158708222246), - FRAC_CONST(0.0014502162869659), - FRAC_CONST(0.0020048865156264), - FRAC_CONST(0.0027009618393178), - FRAC_CONST(0.0035614590925043), - FRAC_CONST(0.0046113018122711), - FRAC_CONST(0.0058772627936484), - FRAC_CONST(0.0073878776584103), - FRAC_CONST(0.0091733284512589), - FRAC_CONST(0.0112652966728373), - FRAC_CONST(0.0136967855861945), - FRAC_CONST(0.0165019120857793), - FRAC_CONST(0.0197156688892217), - FRAC_CONST(0.0233736582950619), - FRAC_CONST(0.0275117992367496), - FRAC_CONST(0.0321660098468534), - FRAC_CONST(0.0373718682174417), - FRAC_CONST(0.0431642544948834), - FRAC_CONST(0.0495769778717676), - FRAC_CONST(0.0566423924273392), - FRAC_CONST(0.0643910061132260), - FRAC_CONST(0.0728510874761729), - FRAC_CONST(0.0820482749475221), - FRAC_CONST(0.0920051937045235), - FRAC_CONST(0.1027410852163450), - FRAC_CONST(0.1142714546239370), - FRAC_CONST(0.1266077410648368), - FRAC_CONST(0.1397570159398145), - FRAC_CONST(0.1537217139274270), - FRAC_CONST(0.1684994012857075), - FRAC_CONST(0.1840825856392944), - FRAC_CONST(0.2004585710384133), - FRAC_CONST(0.2176093615976121), - FRAC_CONST(0.2355116164824983), - FRAC_CONST(0.2541366584185075), - FRAC_CONST(0.2734505372545160), - FRAC_CONST(0.2934141494343369), - FRAC_CONST(0.3139834135200387), - FRAC_CONST(0.3351095011824163), - FRAC_CONST(0.3567391223361566), - FRAC_CONST(0.3788148623608774), - FRAC_CONST(0.4012755686250732), - FRAC_CONST(0.4240567828288110), - FRAC_CONST(0.4470912150133537), - FRAC_CONST(0.4703092544619664), - FRAC_CONST(0.4936395121456694), - FRAC_CONST(0.5170093888596962), - FRAC_CONST(0.5403456627591340), - FRAC_CONST(0.5635750896430154), - FRAC_CONST(0.5866250090612892), - FRAC_CONST(0.6094239491338723), - FRAC_CONST(0.6319022228794100), - FRAC_CONST(0.6539925088563087), - FRAC_CONST(0.6756304090216887), - FRAC_CONST(0.6967549769155277), - FRAC_CONST(0.7173092095766250), - FRAC_CONST(0.7372404969921184), - FRAC_CONST(0.7565010233699827), - FRAC_CONST(0.7750481150999984), - FRAC_CONST(0.7928445309277697), - FRAC_CONST(0.8098586906021583), - FRAC_CONST(0.8260648390616000), - FRAC_CONST(0.8414431440907889), - FRAC_CONST(0.8559797262966709), - FRAC_CONST(0.8696666212110165), - FRAC_CONST(0.8825016743142358), - FRAC_CONST(0.8944883707784486), - FRAC_CONST(0.9056356027326216), - FRAC_CONST(0.9159573778427816), - FRAC_CONST(0.9254724739583072), - FRAC_CONST(0.9342040454819434), - FRAC_CONST(0.9421791879559176), - FRAC_CONST(0.9494284680976784), - FRAC_CONST(0.9559854271440150), - FRAC_CONST(0.9618860658493898), - FRAC_CONST(0.9671683198119525), - FRAC_CONST(0.9718715339497299), - FRAC_CONST(0.9760359449042233), - FRAC_CONST(0.9797021798981759), - FRAC_CONST(0.9829107801140203), - FRAC_CONST(0.9857017559923277), - FRAC_CONST(0.9881141809867999), - FRAC_CONST(0.9901858292742826), - FRAC_CONST(0.9919528617340944), - FRAC_CONST(0.9934495632180476), - FRAC_CONST(0.9947081327749199), - FRAC_CONST(0.9957585271195989), - FRAC_CONST(0.9966283562984427), - FRAC_CONST(0.9973428292485683), - FRAC_CONST(0.9979247458259197), - FRAC_CONST(0.9983945309245774), - FRAC_CONST(0.9987703055583410), - FRAC_CONST(0.9990679892449266), - FRAC_CONST(0.9993014277313617), - FRAC_CONST(0.9994825400228521), - FRAC_CONST(0.9996214788122335), - FRAC_CONST(0.9997267987294857), - FRAC_CONST(0.9998056273097539), - FRAC_CONST(0.9998638341781910), - FRAC_CONST(0.9999061946325793), - FRAC_CONST(0.9999365445321382), - FRAC_CONST(0.9999579241373735), - FRAC_CONST(0.9999727092594598), - FRAC_CONST(0.9999827287418790), - FRAC_CONST(0.9999893678912771), - FRAC_CONST(0.9999936579844555), - FRAC_CONST(0.9999963523959187), - FRAC_CONST(0.9999979902130101), - FRAC_CONST(0.9999989484358076), - FRAC_CONST(0.9999994840031031), - FRAC_CONST(0.9999997669534347), - FRAC_CONST(0.9999999060327799), - FRAC_CONST(0.9999999680107184), - FRAC_CONST(0.9999999918774242), - FRAC_CONST(0.9999999989770326) -}; -#endif - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: kbd_win.h,v 1.21 2007/11/01 12:33:31 menno Exp $ +**/ + +#ifndef __KBD_WIN_H__ +#define __KBD_WIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + +ALIGN static const real_t kbd_long_1024[] = +{ + FRAC_CONST(0.00029256153896361), + FRAC_CONST(0.00042998567353047), + FRAC_CONST(0.00054674074589540), + FRAC_CONST(0.00065482304299792), + FRAC_CONST(0.00075870195068747), + FRAC_CONST(0.00086059331713336), + FRAC_CONST(0.00096177541439010), + FRAC_CONST(0.0010630609410878), + FRAC_CONST(0.0011650036308132), + FRAC_CONST(0.0012680012194148), + FRAC_CONST(0.0013723517232956), + FRAC_CONST(0.0014782864109136), + FRAC_CONST(0.0015859901976719), + FRAC_CONST(0.0016956148252373), + FRAC_CONST(0.0018072876903517), + FRAC_CONST(0.0019211179405514), + FRAC_CONST(0.0020372007924215), + FRAC_CONST(0.0021556206591754), + FRAC_CONST(0.0022764534599614), + FRAC_CONST(0.0023997683540995), + FRAC_CONST(0.0025256290631156), + FRAC_CONST(0.0026540948920831), + FRAC_CONST(0.0027852215281403), + FRAC_CONST(0.0029190616715331), + FRAC_CONST(0.0030556655443223), + FRAC_CONST(0.0031950812943391), + FRAC_CONST(0.0033373553240392), + FRAC_CONST(0.0034825325586930), + FRAC_CONST(0.0036306566699199), + FRAC_CONST(0.0037817702604646), + FRAC_CONST(0.0039359150179719), + FRAC_CONST(0.0040931318437260), + FRAC_CONST(0.0042534609610026), + FRAC_CONST(0.0044169420066964), + FRAC_CONST(0.0045836141091341), + FRAC_CONST(0.0047535159544086), + FRAC_CONST(0.0049266858431214), + FRAC_CONST(0.0051031617390698), + FRAC_CONST(0.0052829813111335), + FRAC_CONST(0.0054661819693975), + FRAC_CONST(0.0056528008963682), + FRAC_CONST(0.0058428750739943), + FRAC_CONST(0.0060364413070882), + FRAC_CONST(0.0062335362436492), + FRAC_CONST(0.0064341963925079), + FRAC_CONST(0.0066384581386503), + FRAC_CONST(0.0068463577565218), + FRAC_CONST(0.0070579314215715), + FRAC_CONST(0.0072732152202559), + FRAC_CONST(0.0074922451586909), + FRAC_CONST(0.0077150571701162), + FRAC_CONST(0.0079416871213115), + FRAC_CONST(0.0081721708180857), + FRAC_CONST(0.0084065440099458), + FRAC_CONST(0.0086448423940363), + FRAC_CONST(0.0088871016184291), + FRAC_CONST(0.0091333572848345), + FRAC_CONST(0.0093836449507939), + FRAC_CONST(0.0096380001314086), + FRAC_CONST(0.0098964583006517), + FRAC_CONST(0.010159054892306), + FRAC_CONST(0.010425825300561), + FRAC_CONST(0.010696804880310), + FRAC_CONST(0.010972028947167), + FRAC_CONST(0.011251532777236), + FRAC_CONST(0.011535351606646), + FRAC_CONST(0.011823520630897), + FRAC_CONST(0.012116075003993), + FRAC_CONST(0.012413049837429), + FRAC_CONST(0.012714480198999), + FRAC_CONST(0.013020401111478), + FRAC_CONST(0.013330847551161), + FRAC_CONST(0.013645854446288), + FRAC_CONST(0.013965456675352), + FRAC_CONST(0.014289689065314), + FRAC_CONST(0.014618586389712), + FRAC_CONST(0.014952183366697), + FRAC_CONST(0.015290514656976), + FRAC_CONST(0.015633614861688), + FRAC_CONST(0.015981518520214), + FRAC_CONST(0.016334260107915), + FRAC_CONST(0.016691874033817), + FRAC_CONST(0.017054394638241), + FRAC_CONST(0.017421856190380), + FRAC_CONST(0.017794292885832), + FRAC_CONST(0.018171738844085), + FRAC_CONST(0.018554228105962), + FRAC_CONST(0.018941794631032), + FRAC_CONST(0.019334472294980), + FRAC_CONST(0.019732294886947), + FRAC_CONST(0.020135296106839), + FRAC_CONST(0.020543509562604), + FRAC_CONST(0.020956968767488), + FRAC_CONST(0.021375707137257), + FRAC_CONST(0.021799757987407), + FRAC_CONST(0.022229154530343), + FRAC_CONST(0.022663929872540), + FRAC_CONST(0.023104117011689), + FRAC_CONST(0.023549748833816), + FRAC_CONST(0.024000858110398), + FRAC_CONST(0.024457477495451), + FRAC_CONST(0.024919639522613), + FRAC_CONST(0.025387376602207), + FRAC_CONST(0.025860721018295), + FRAC_CONST(0.026339704925726), + FRAC_CONST(0.026824360347160), + FRAC_CONST(0.027314719170100), + FRAC_CONST(0.027810813143900), + FRAC_CONST(0.028312673876775), + FRAC_CONST(0.028820332832801), + FRAC_CONST(0.029333821328905), + FRAC_CONST(0.029853170531859), + FRAC_CONST(0.030378411455255), + FRAC_CONST(0.030909574956490), + FRAC_CONST(0.031446691733739), + FRAC_CONST(0.031989792322926), + FRAC_CONST(0.032538907094693), + FRAC_CONST(0.033094066251369), + FRAC_CONST(0.033655299823935), + FRAC_CONST(0.034222637668991), + FRAC_CONST(0.034796109465717), + FRAC_CONST(0.035375744712844), + FRAC_CONST(0.035961572725616), + FRAC_CONST(0.036553622632758), + FRAC_CONST(0.037151923373446), + FRAC_CONST(0.037756503694277), + FRAC_CONST(0.038367392146243), + FRAC_CONST(0.038984617081711), + FRAC_CONST(0.039608206651398), + FRAC_CONST(0.040238188801359), + FRAC_CONST(0.040874591269976), + FRAC_CONST(0.041517441584950), + FRAC_CONST(0.042166767060301), + FRAC_CONST(0.042822594793376), + FRAC_CONST(0.043484951661852), + FRAC_CONST(0.044153864320760), + FRAC_CONST(0.044829359199509), + FRAC_CONST(0.045511462498913), + FRAC_CONST(0.046200200188234), + FRAC_CONST(0.046895598002228), + FRAC_CONST(0.047597681438201), + FRAC_CONST(0.048306475753074), + FRAC_CONST(0.049022005960455), + FRAC_CONST(0.049744296827725), + FRAC_CONST(0.050473372873129), + FRAC_CONST(0.051209258362879), + FRAC_CONST(0.051951977308273), + FRAC_CONST(0.052701553462813), + FRAC_CONST(0.053458010319350), + FRAC_CONST(0.054221371107223), + FRAC_CONST(0.054991658789428), + FRAC_CONST(0.055768896059787), + FRAC_CONST(0.056553105340134), + FRAC_CONST(0.057344308777513), + FRAC_CONST(0.058142528241393), + FRAC_CONST(0.058947785320893), + FRAC_CONST(0.059760101322019), + FRAC_CONST(0.060579497264926), + FRAC_CONST(0.061405993881180), + FRAC_CONST(0.062239611611049), + FRAC_CONST(0.063080370600799), + FRAC_CONST(0.063928290700012), + FRAC_CONST(0.064783391458919), + FRAC_CONST(0.065645692125747), + FRAC_CONST(0.066515211644086), + FRAC_CONST(0.067391968650269), + FRAC_CONST(0.068275981470777), + FRAC_CONST(0.069167268119652), + FRAC_CONST(0.070065846295935), + FRAC_CONST(0.070971733381121), + FRAC_CONST(0.071884946436630), + FRAC_CONST(0.072805502201299), + FRAC_CONST(0.073733417088896), + FRAC_CONST(0.074668707185649), + FRAC_CONST(0.075611388247794), + FRAC_CONST(0.076561475699152), + FRAC_CONST(0.077518984628715), + FRAC_CONST(0.078483929788261), + FRAC_CONST(0.079456325589986), + FRAC_CONST(0.080436186104162), + FRAC_CONST(0.081423525056808), + FRAC_CONST(0.082418355827392), + FRAC_CONST(0.083420691446553), + FRAC_CONST(0.084430544593841), + FRAC_CONST(0.085447927595483), + FRAC_CONST(0.086472852422178), + FRAC_CONST(0.087505330686900), + FRAC_CONST(0.088545373642744), + FRAC_CONST(0.089592992180780), + FRAC_CONST(0.090648196827937), + FRAC_CONST(0.091710997744919), + FRAC_CONST(0.092781404724131), + FRAC_CONST(0.093859427187640), + FRAC_CONST(0.094945074185163), + FRAC_CONST(0.096038354392069), + FRAC_CONST(0.097139276107423), + FRAC_CONST(0.098247847252041), + FRAC_CONST(0.099364075366580), + FRAC_CONST(0.10048796760965), + FRAC_CONST(0.10161953075597), + FRAC_CONST(0.10275877119451), + FRAC_CONST(0.10390569492671), + FRAC_CONST(0.10506030756469), + FRAC_CONST(0.10622261432949), + FRAC_CONST(0.10739262004941), + FRAC_CONST(0.10857032915821), + FRAC_CONST(0.10975574569357), + FRAC_CONST(0.11094887329534), + FRAC_CONST(0.11214971520402), + FRAC_CONST(0.11335827425914), + FRAC_CONST(0.11457455289772), + FRAC_CONST(0.11579855315274), + FRAC_CONST(0.11703027665170), + FRAC_CONST(0.11826972461510), + FRAC_CONST(0.11951689785504), + FRAC_CONST(0.12077179677383), + FRAC_CONST(0.12203442136263), + FRAC_CONST(0.12330477120008), + FRAC_CONST(0.12458284545102), + FRAC_CONST(0.12586864286523), + FRAC_CONST(0.12716216177615), + FRAC_CONST(0.12846340009971), + FRAC_CONST(0.12977235533312), + FRAC_CONST(0.13108902455375), + FRAC_CONST(0.13241340441801), + FRAC_CONST(0.13374549116025), + FRAC_CONST(0.13508528059173), + FRAC_CONST(0.13643276809961), + FRAC_CONST(0.13778794864595), + FRAC_CONST(0.13915081676677), + FRAC_CONST(0.14052136657114), + FRAC_CONST(0.14189959174027), + FRAC_CONST(0.14328548552671), + FRAC_CONST(0.14467904075349), + FRAC_CONST(0.14608024981336), + FRAC_CONST(0.14748910466804), + FRAC_CONST(0.14890559684750), + FRAC_CONST(0.15032971744929), + FRAC_CONST(0.15176145713790), + FRAC_CONST(0.15320080614414), + FRAC_CONST(0.15464775426459), + FRAC_CONST(0.15610229086100), + FRAC_CONST(0.15756440485987), + FRAC_CONST(0.15903408475193), + FRAC_CONST(0.16051131859170), + FRAC_CONST(0.16199609399712), + FRAC_CONST(0.16348839814917), + FRAC_CONST(0.16498821779156), + FRAC_CONST(0.16649553923042), + FRAC_CONST(0.16801034833404), + FRAC_CONST(0.16953263053270), + FRAC_CONST(0.17106237081842), + FRAC_CONST(0.17259955374484), + FRAC_CONST(0.17414416342714), + FRAC_CONST(0.17569618354193), + FRAC_CONST(0.17725559732720), + FRAC_CONST(0.17882238758238), + FRAC_CONST(0.18039653666830), + FRAC_CONST(0.18197802650733), + FRAC_CONST(0.18356683858343), + FRAC_CONST(0.18516295394233), + FRAC_CONST(0.18676635319174), + FRAC_CONST(0.18837701650148), + FRAC_CONST(0.18999492360384), + FRAC_CONST(0.19162005379380), + FRAC_CONST(0.19325238592940), + FRAC_CONST(0.19489189843209), + FRAC_CONST(0.19653856928714), + FRAC_CONST(0.19819237604409), + FRAC_CONST(0.19985329581721), + FRAC_CONST(0.20152130528605), + FRAC_CONST(0.20319638069594), + FRAC_CONST(0.20487849785865), + FRAC_CONST(0.20656763215298), + FRAC_CONST(0.20826375852540), + FRAC_CONST(0.20996685149083), + FRAC_CONST(0.21167688513330), + FRAC_CONST(0.21339383310678), + FRAC_CONST(0.21511766863598), + FRAC_CONST(0.21684836451719), + FRAC_CONST(0.21858589311922), + FRAC_CONST(0.22033022638425), + FRAC_CONST(0.22208133582887), + FRAC_CONST(0.22383919254503), + FRAC_CONST(0.22560376720111), + FRAC_CONST(0.22737503004300), + FRAC_CONST(0.22915295089517), + FRAC_CONST(0.23093749916189), + FRAC_CONST(0.23272864382838), + FRAC_CONST(0.23452635346201), + FRAC_CONST(0.23633059621364), + FRAC_CONST(0.23814133981883), + FRAC_CONST(0.23995855159925), + FRAC_CONST(0.24178219846403), + FRAC_CONST(0.24361224691114), + FRAC_CONST(0.24544866302890), + FRAC_CONST(0.24729141249740), + FRAC_CONST(0.24914046059007), + FRAC_CONST(0.25099577217522), + FRAC_CONST(0.25285731171763), + FRAC_CONST(0.25472504328019), + FRAC_CONST(0.25659893052556), + FRAC_CONST(0.25847893671788), + FRAC_CONST(0.26036502472451), + FRAC_CONST(0.26225715701781), + FRAC_CONST(0.26415529567692), + FRAC_CONST(0.26605940238966), + FRAC_CONST(0.26796943845439), + FRAC_CONST(0.26988536478190), + FRAC_CONST(0.27180714189742), + FRAC_CONST(0.27373472994256), + FRAC_CONST(0.27566808867736), + FRAC_CONST(0.27760717748238), + FRAC_CONST(0.27955195536071), + FRAC_CONST(0.28150238094021), + FRAC_CONST(0.28345841247557), + FRAC_CONST(0.28542000785059), + FRAC_CONST(0.28738712458038), + FRAC_CONST(0.28935971981364), + FRAC_CONST(0.29133775033492), + FRAC_CONST(0.29332117256704), + FRAC_CONST(0.29530994257338), + FRAC_CONST(0.29730401606034), + FRAC_CONST(0.29930334837974), + FRAC_CONST(0.30130789453132), + FRAC_CONST(0.30331760916521), + FRAC_CONST(0.30533244658452), + FRAC_CONST(0.30735236074785), + FRAC_CONST(0.30937730527195), + FRAC_CONST(0.31140723343430), + FRAC_CONST(0.31344209817583), + FRAC_CONST(0.31548185210356), + FRAC_CONST(0.31752644749341), + FRAC_CONST(0.31957583629288), + FRAC_CONST(0.32162997012390), + FRAC_CONST(0.32368880028565), + FRAC_CONST(0.32575227775738), + FRAC_CONST(0.32782035320134), + FRAC_CONST(0.32989297696566), + FRAC_CONST(0.33197009908736), + FRAC_CONST(0.33405166929523), + FRAC_CONST(0.33613763701295), + FRAC_CONST(0.33822795136203), + FRAC_CONST(0.34032256116495), + FRAC_CONST(0.34242141494820), + FRAC_CONST(0.34452446094547), + FRAC_CONST(0.34663164710072), + FRAC_CONST(0.34874292107143), + FRAC_CONST(0.35085823023181), + FRAC_CONST(0.35297752167598), + FRAC_CONST(0.35510074222129), + FRAC_CONST(0.35722783841160), + FRAC_CONST(0.35935875652060), + FRAC_CONST(0.36149344255514), + FRAC_CONST(0.36363184225864), + FRAC_CONST(0.36577390111444), + FRAC_CONST(0.36791956434930), + FRAC_CONST(0.37006877693676), + FRAC_CONST(0.37222148360070), + FRAC_CONST(0.37437762881878), + FRAC_CONST(0.37653715682603), + FRAC_CONST(0.37870001161834), + FRAC_CONST(0.38086613695607), + FRAC_CONST(0.38303547636766), + FRAC_CONST(0.38520797315322), + FRAC_CONST(0.38738357038821), + FRAC_CONST(0.38956221092708), + FRAC_CONST(0.39174383740701), + FRAC_CONST(0.39392839225157), + FRAC_CONST(0.39611581767449), + FRAC_CONST(0.39830605568342), + FRAC_CONST(0.40049904808370), + FRAC_CONST(0.40269473648218), + FRAC_CONST(0.40489306229101), + FRAC_CONST(0.40709396673153), + FRAC_CONST(0.40929739083810), + FRAC_CONST(0.41150327546197), + FRAC_CONST(0.41371156127524), + FRAC_CONST(0.41592218877472), + FRAC_CONST(0.41813509828594), + FRAC_CONST(0.42035022996702), + FRAC_CONST(0.42256752381274), + FRAC_CONST(0.42478691965848), + FRAC_CONST(0.42700835718423), + FRAC_CONST(0.42923177591866), + FRAC_CONST(0.43145711524314), + FRAC_CONST(0.43368431439580), + FRAC_CONST(0.43591331247564), + FRAC_CONST(0.43814404844658), + FRAC_CONST(0.44037646114161), + FRAC_CONST(0.44261048926688), + FRAC_CONST(0.44484607140589), + FRAC_CONST(0.44708314602359), + FRAC_CONST(0.44932165147057), + FRAC_CONST(0.45156152598727), + FRAC_CONST(0.45380270770813), + FRAC_CONST(0.45604513466581), + FRAC_CONST(0.45828874479543), + FRAC_CONST(0.46053347593880), + FRAC_CONST(0.46277926584861), + FRAC_CONST(0.46502605219277), + FRAC_CONST(0.46727377255861), + FRAC_CONST(0.46952236445718), + FRAC_CONST(0.47177176532752), + FRAC_CONST(0.47402191254100), + FRAC_CONST(0.47627274340557), + FRAC_CONST(0.47852419517009), + FRAC_CONST(0.48077620502869), + FRAC_CONST(0.48302871012505), + FRAC_CONST(0.48528164755674), + FRAC_CONST(0.48753495437962), + FRAC_CONST(0.48978856761212), + FRAC_CONST(0.49204242423966), + FRAC_CONST(0.49429646121898), + FRAC_CONST(0.49655061548250), + FRAC_CONST(0.49880482394273), + FRAC_CONST(0.50105902349665), + FRAC_CONST(0.50331315103004), + FRAC_CONST(0.50556714342194), + FRAC_CONST(0.50782093754901), + FRAC_CONST(0.51007447028990), + FRAC_CONST(0.51232767852971), + FRAC_CONST(0.51458049916433), + FRAC_CONST(0.51683286910489), + FRAC_CONST(0.51908472528213), + FRAC_CONST(0.52133600465083), + FRAC_CONST(0.52358664419420), + FRAC_CONST(0.52583658092832), + FRAC_CONST(0.52808575190648), + FRAC_CONST(0.53033409422367), + FRAC_CONST(0.53258154502092), + FRAC_CONST(0.53482804148974), + FRAC_CONST(0.53707352087652), + FRAC_CONST(0.53931792048690), + FRAC_CONST(0.54156117769021), + FRAC_CONST(0.54380322992385), + FRAC_CONST(0.54604401469766), + FRAC_CONST(0.54828346959835), + FRAC_CONST(0.55052153229384), + FRAC_CONST(0.55275814053768), + FRAC_CONST(0.55499323217338), + FRAC_CONST(0.55722674513883), + FRAC_CONST(0.55945861747062), + FRAC_CONST(0.56168878730842), + FRAC_CONST(0.56391719289930), + FRAC_CONST(0.56614377260214), + FRAC_CONST(0.56836846489188), + FRAC_CONST(0.57059120836390), + FRAC_CONST(0.57281194173835), + FRAC_CONST(0.57503060386439), + FRAC_CONST(0.57724713372458), + FRAC_CONST(0.57946147043912), + FRAC_CONST(0.58167355327012), + FRAC_CONST(0.58388332162591), + FRAC_CONST(0.58609071506528), + FRAC_CONST(0.58829567330173), + FRAC_CONST(0.59049813620770), + FRAC_CONST(0.59269804381879), + FRAC_CONST(0.59489533633802), + FRAC_CONST(0.59708995413996), + FRAC_CONST(0.59928183777495), + FRAC_CONST(0.60147092797329), + FRAC_CONST(0.60365716564937), + FRAC_CONST(0.60584049190582), + FRAC_CONST(0.60802084803764), + FRAC_CONST(0.61019817553632), + FRAC_CONST(0.61237241609393), + FRAC_CONST(0.61454351160718), + FRAC_CONST(0.61671140418155), + FRAC_CONST(0.61887603613527), + FRAC_CONST(0.62103735000336), + FRAC_CONST(0.62319528854167), + FRAC_CONST(0.62534979473088), + FRAC_CONST(0.62750081178042), + FRAC_CONST(0.62964828313250), + FRAC_CONST(0.63179215246597), + FRAC_CONST(0.63393236370030), + FRAC_CONST(0.63606886099946), + FRAC_CONST(0.63820158877577), + FRAC_CONST(0.64033049169379), + FRAC_CONST(0.64245551467413), + FRAC_CONST(0.64457660289729), + FRAC_CONST(0.64669370180740), + FRAC_CONST(0.64880675711607), + FRAC_CONST(0.65091571480603), + FRAC_CONST(0.65302052113494), + FRAC_CONST(0.65512112263906), + FRAC_CONST(0.65721746613689), + FRAC_CONST(0.65930949873289), + FRAC_CONST(0.66139716782102), + FRAC_CONST(0.66348042108842), + FRAC_CONST(0.66555920651892), + FRAC_CONST(0.66763347239664), + FRAC_CONST(0.66970316730947), + FRAC_CONST(0.67176824015260), + FRAC_CONST(0.67382864013196), + FRAC_CONST(0.67588431676768), + FRAC_CONST(0.67793521989751), + FRAC_CONST(0.67998129968017), + FRAC_CONST(0.68202250659876), + FRAC_CONST(0.68405879146403), + FRAC_CONST(0.68609010541774), + FRAC_CONST(0.68811639993588), + FRAC_CONST(0.69013762683195), + FRAC_CONST(0.69215373826012), + FRAC_CONST(0.69416468671849), + FRAC_CONST(0.69617042505214), + FRAC_CONST(0.69817090645634), + FRAC_CONST(0.70016608447958), + FRAC_CONST(0.70215591302664), + FRAC_CONST(0.70414034636163), + FRAC_CONST(0.70611933911096), + FRAC_CONST(0.70809284626630), + FRAC_CONST(0.71006082318751), + FRAC_CONST(0.71202322560554), + FRAC_CONST(0.71398000962530), + FRAC_CONST(0.71593113172842), + FRAC_CONST(0.71787654877613), + FRAC_CONST(0.71981621801195), + FRAC_CONST(0.72175009706445), + FRAC_CONST(0.72367814394990), + FRAC_CONST(0.72560031707496), + FRAC_CONST(0.72751657523927), + FRAC_CONST(0.72942687763803), + FRAC_CONST(0.73133118386457), + FRAC_CONST(0.73322945391280), + FRAC_CONST(0.73512164817975), + FRAC_CONST(0.73700772746796), + FRAC_CONST(0.73888765298787), + FRAC_CONST(0.74076138636020), + FRAC_CONST(0.74262888961827), + FRAC_CONST(0.74449012521027), + FRAC_CONST(0.74634505600152), + FRAC_CONST(0.74819364527663), + FRAC_CONST(0.75003585674175), + FRAC_CONST(0.75187165452661), + FRAC_CONST(0.75370100318668), + FRAC_CONST(0.75552386770515), + FRAC_CONST(0.75734021349500), + FRAC_CONST(0.75915000640095), + FRAC_CONST(0.76095321270137), + FRAC_CONST(0.76274979911019), + FRAC_CONST(0.76453973277875), + FRAC_CONST(0.76632298129757), + FRAC_CONST(0.76809951269819), + FRAC_CONST(0.76986929545481), + FRAC_CONST(0.77163229848604), + FRAC_CONST(0.77338849115651), + FRAC_CONST(0.77513784327849), + FRAC_CONST(0.77688032511340), + FRAC_CONST(0.77861590737340), + FRAC_CONST(0.78034456122283), + FRAC_CONST(0.78206625827961), + FRAC_CONST(0.78378097061667), + FRAC_CONST(0.78548867076330), + FRAC_CONST(0.78718933170643), + FRAC_CONST(0.78888292689189), + FRAC_CONST(0.79056943022564), + FRAC_CONST(0.79224881607494), + FRAC_CONST(0.79392105926949), + FRAC_CONST(0.79558613510249), + FRAC_CONST(0.79724401933170), + FRAC_CONST(0.79889468818046), + FRAC_CONST(0.80053811833858), + FRAC_CONST(0.80217428696334), + FRAC_CONST(0.80380317168028), + FRAC_CONST(0.80542475058405), + FRAC_CONST(0.80703900223920), + FRAC_CONST(0.80864590568089), + FRAC_CONST(0.81024544041560), + FRAC_CONST(0.81183758642175), + FRAC_CONST(0.81342232415032), + FRAC_CONST(0.81499963452540), + FRAC_CONST(0.81656949894467), + FRAC_CONST(0.81813189927991), + FRAC_CONST(0.81968681787738), + FRAC_CONST(0.82123423755821), + FRAC_CONST(0.82277414161874), + FRAC_CONST(0.82430651383076), + FRAC_CONST(0.82583133844180), + FRAC_CONST(0.82734860017528), + FRAC_CONST(0.82885828423070), + FRAC_CONST(0.83036037628369), + FRAC_CONST(0.83185486248609), + FRAC_CONST(0.83334172946597), + FRAC_CONST(0.83482096432759), + FRAC_CONST(0.83629255465130), + FRAC_CONST(0.83775648849344), + FRAC_CONST(0.83921275438615), + FRAC_CONST(0.84066134133716), + FRAC_CONST(0.84210223882952), + FRAC_CONST(0.84353543682130), + FRAC_CONST(0.84496092574524), + FRAC_CONST(0.84637869650833), + FRAC_CONST(0.84778874049138), + FRAC_CONST(0.84919104954855), + FRAC_CONST(0.85058561600677), + FRAC_CONST(0.85197243266520), + FRAC_CONST(0.85335149279457), + FRAC_CONST(0.85472279013653), + FRAC_CONST(0.85608631890295), + FRAC_CONST(0.85744207377513), + FRAC_CONST(0.85879004990298), + FRAC_CONST(0.86013024290422), + FRAC_CONST(0.86146264886346), + FRAC_CONST(0.86278726433124), + FRAC_CONST(0.86410408632306), + FRAC_CONST(0.86541311231838), + FRAC_CONST(0.86671434025950), + FRAC_CONST(0.86800776855046), + FRAC_CONST(0.86929339605590), + FRAC_CONST(0.87057122209981), + FRAC_CONST(0.87184124646433), + FRAC_CONST(0.87310346938840), + FRAC_CONST(0.87435789156650), + FRAC_CONST(0.87560451414719), + FRAC_CONST(0.87684333873173), + FRAC_CONST(0.87807436737261), + FRAC_CONST(0.87929760257204), + FRAC_CONST(0.88051304728038), + FRAC_CONST(0.88172070489456), + FRAC_CONST(0.88292057925645), + FRAC_CONST(0.88411267465117), + FRAC_CONST(0.88529699580537), + FRAC_CONST(0.88647354788545), + FRAC_CONST(0.88764233649580), + FRAC_CONST(0.88880336767692), + FRAC_CONST(0.88995664790351), + FRAC_CONST(0.89110218408260), + FRAC_CONST(0.89223998355154), + FRAC_CONST(0.89337005407600), + FRAC_CONST(0.89449240384793), + FRAC_CONST(0.89560704148345), + FRAC_CONST(0.89671397602074), + FRAC_CONST(0.89781321691786), + FRAC_CONST(0.89890477405053), + FRAC_CONST(0.89998865770993), + FRAC_CONST(0.90106487860034), + FRAC_CONST(0.90213344783689), + FRAC_CONST(0.90319437694315), + FRAC_CONST(0.90424767784873), + FRAC_CONST(0.90529336288690), + FRAC_CONST(0.90633144479201), + FRAC_CONST(0.90736193669708), + FRAC_CONST(0.90838485213119), + FRAC_CONST(0.90940020501694), + FRAC_CONST(0.91040800966776), + FRAC_CONST(0.91140828078533), + FRAC_CONST(0.91240103345685), + FRAC_CONST(0.91338628315231), + FRAC_CONST(0.91436404572173), + FRAC_CONST(0.91533433739238), + FRAC_CONST(0.91629717476594), + FRAC_CONST(0.91725257481564), + FRAC_CONST(0.91820055488334), + FRAC_CONST(0.91914113267664), + FRAC_CONST(0.92007432626589), + FRAC_CONST(0.92100015408120), + FRAC_CONST(0.92191863490944), + FRAC_CONST(0.92282978789113), + FRAC_CONST(0.92373363251740), + FRAC_CONST(0.92463018862687), + FRAC_CONST(0.92551947640245), + FRAC_CONST(0.92640151636824), + FRAC_CONST(0.92727632938624), + FRAC_CONST(0.92814393665320), + FRAC_CONST(0.92900435969727), + FRAC_CONST(0.92985762037477), + FRAC_CONST(0.93070374086684), + FRAC_CONST(0.93154274367610), + FRAC_CONST(0.93237465162328), + FRAC_CONST(0.93319948784382), + FRAC_CONST(0.93401727578443), + FRAC_CONST(0.93482803919967), + FRAC_CONST(0.93563180214841), + FRAC_CONST(0.93642858899043), + FRAC_CONST(0.93721842438279), + FRAC_CONST(0.93800133327637), + FRAC_CONST(0.93877734091223), + FRAC_CONST(0.93954647281807), + FRAC_CONST(0.94030875480458), + FRAC_CONST(0.94106421296182), + FRAC_CONST(0.94181287365556), + FRAC_CONST(0.94255476352362), + FRAC_CONST(0.94328990947213), + FRAC_CONST(0.94401833867184), + FRAC_CONST(0.94474007855439), + FRAC_CONST(0.94545515680855), + FRAC_CONST(0.94616360137644), + FRAC_CONST(0.94686544044975), + FRAC_CONST(0.94756070246592), + FRAC_CONST(0.94824941610434), + FRAC_CONST(0.94893161028248), + FRAC_CONST(0.94960731415209), + FRAC_CONST(0.95027655709525), + FRAC_CONST(0.95093936872056), + FRAC_CONST(0.95159577885924), + FRAC_CONST(0.95224581756115), + FRAC_CONST(0.95288951509097), + FRAC_CONST(0.95352690192417), + FRAC_CONST(0.95415800874314), + FRAC_CONST(0.95478286643320), + FRAC_CONST(0.95540150607863), + FRAC_CONST(0.95601395895871), + FRAC_CONST(0.95662025654373), + FRAC_CONST(0.95722043049100), + FRAC_CONST(0.95781451264084), + FRAC_CONST(0.95840253501260), + FRAC_CONST(0.95898452980058), + FRAC_CONST(0.95956052937008), + FRAC_CONST(0.96013056625336), + FRAC_CONST(0.96069467314557), + FRAC_CONST(0.96125288290073), + FRAC_CONST(0.96180522852773), + FRAC_CONST(0.96235174318622), + FRAC_CONST(0.96289246018262), + FRAC_CONST(0.96342741296604), + FRAC_CONST(0.96395663512424), + FRAC_CONST(0.96448016037959), + FRAC_CONST(0.96499802258499), + FRAC_CONST(0.96551025571985), + FRAC_CONST(0.96601689388602), + FRAC_CONST(0.96651797130376), + FRAC_CONST(0.96701352230768), + FRAC_CONST(0.96750358134269), + FRAC_CONST(0.96798818295998), + FRAC_CONST(0.96846736181297), + FRAC_CONST(0.96894115265327), + FRAC_CONST(0.96940959032667), + FRAC_CONST(0.96987270976912), + FRAC_CONST(0.97033054600270), + FRAC_CONST(0.97078313413161), + FRAC_CONST(0.97123050933818), + FRAC_CONST(0.97167270687887), + FRAC_CONST(0.97210976208030), + FRAC_CONST(0.97254171033525), + FRAC_CONST(0.97296858709871), + FRAC_CONST(0.97339042788392), + FRAC_CONST(0.97380726825843), + FRAC_CONST(0.97421914384017), + FRAC_CONST(0.97462609029350), + FRAC_CONST(0.97502814332534), + FRAC_CONST(0.97542533868127), + FRAC_CONST(0.97581771214160), + FRAC_CONST(0.97620529951759), + FRAC_CONST(0.97658813664749), + FRAC_CONST(0.97696625939282), + FRAC_CONST(0.97733970363445), + FRAC_CONST(0.97770850526884), + FRAC_CONST(0.97807270020427), + FRAC_CONST(0.97843232435704), + FRAC_CONST(0.97878741364771), + FRAC_CONST(0.97913800399743), + FRAC_CONST(0.97948413132414), + FRAC_CONST(0.97982583153895), + FRAC_CONST(0.98016314054243), + FRAC_CONST(0.98049609422096), + FRAC_CONST(0.98082472844313), + FRAC_CONST(0.98114907905608), + FRAC_CONST(0.98146918188197), + FRAC_CONST(0.98178507271438), + FRAC_CONST(0.98209678731477), + FRAC_CONST(0.98240436140902), + FRAC_CONST(0.98270783068385), + FRAC_CONST(0.98300723078342), + FRAC_CONST(0.98330259730589), + FRAC_CONST(0.98359396579995), + FRAC_CONST(0.98388137176152), + FRAC_CONST(0.98416485063031), + FRAC_CONST(0.98444443778651), + FRAC_CONST(0.98472016854752), + FRAC_CONST(0.98499207816463), + FRAC_CONST(0.98526020181980), + FRAC_CONST(0.98552457462240), + FRAC_CONST(0.98578523160609), + FRAC_CONST(0.98604220772560), + FRAC_CONST(0.98629553785362), + FRAC_CONST(0.98654525677772), + FRAC_CONST(0.98679139919726), + FRAC_CONST(0.98703399972035), + FRAC_CONST(0.98727309286089), + FRAC_CONST(0.98750871303556), + FRAC_CONST(0.98774089456089), + FRAC_CONST(0.98796967165036), + FRAC_CONST(0.98819507841154), + FRAC_CONST(0.98841714884323), + FRAC_CONST(0.98863591683269), + FRAC_CONST(0.98885141615285), + FRAC_CONST(0.98906368045957), + FRAC_CONST(0.98927274328896), + FRAC_CONST(0.98947863805473), + FRAC_CONST(0.98968139804554), + FRAC_CONST(0.98988105642241), + FRAC_CONST(0.99007764621618), + FRAC_CONST(0.99027120032501), + FRAC_CONST(0.99046175151186), + FRAC_CONST(0.99064933240208), + FRAC_CONST(0.99083397548099), + FRAC_CONST(0.99101571309153), + FRAC_CONST(0.99119457743191), + FRAC_CONST(0.99137060055337), + FRAC_CONST(0.99154381435784), + FRAC_CONST(0.99171425059582), + FRAC_CONST(0.99188194086414), + FRAC_CONST(0.99204691660388), + FRAC_CONST(0.99220920909823), + FRAC_CONST(0.99236884947045), + FRAC_CONST(0.99252586868186), + FRAC_CONST(0.99268029752989), + FRAC_CONST(0.99283216664606), + FRAC_CONST(0.99298150649419), + FRAC_CONST(0.99312834736847), + FRAC_CONST(0.99327271939167), + FRAC_CONST(0.99341465251338), + FRAC_CONST(0.99355417650825), + FRAC_CONST(0.99369132097430), + FRAC_CONST(0.99382611533130), + FRAC_CONST(0.99395858881910), + FRAC_CONST(0.99408877049612), + FRAC_CONST(0.99421668923778), + FRAC_CONST(0.99434237373503), + FRAC_CONST(0.99446585249289), + FRAC_CONST(0.99458715382906), + FRAC_CONST(0.99470630587254), + FRAC_CONST(0.99482333656229), + FRAC_CONST(0.99493827364600), + FRAC_CONST(0.99505114467878), + FRAC_CONST(0.99516197702200), + FRAC_CONST(0.99527079784214), + FRAC_CONST(0.99537763410962), + FRAC_CONST(0.99548251259777), + FRAC_CONST(0.99558545988178), + FRAC_CONST(0.99568650233767), + FRAC_CONST(0.99578566614138), + FRAC_CONST(0.99588297726783), + FRAC_CONST(0.99597846149005), + FRAC_CONST(0.99607214437834), + FRAC_CONST(0.99616405129947), + FRAC_CONST(0.99625420741595), + FRAC_CONST(0.99634263768527), + FRAC_CONST(0.99642936685928), + FRAC_CONST(0.99651441948352), + FRAC_CONST(0.99659781989663), + FRAC_CONST(0.99667959222978), + FRAC_CONST(0.99675976040620), + FRAC_CONST(0.99683834814063), + FRAC_CONST(0.99691537893895), + FRAC_CONST(0.99699087609774), + FRAC_CONST(0.99706486270391), + FRAC_CONST(0.99713736163442), + FRAC_CONST(0.99720839555593), + FRAC_CONST(0.99727798692461), + FRAC_CONST(0.99734615798589), + FRAC_CONST(0.99741293077431), + FRAC_CONST(0.99747832711337), + FRAC_CONST(0.99754236861541), + FRAC_CONST(0.99760507668158), + FRAC_CONST(0.99766647250181), + FRAC_CONST(0.99772657705478), + FRAC_CONST(0.99778541110799), + FRAC_CONST(0.99784299521785), + FRAC_CONST(0.99789934972976), + FRAC_CONST(0.99795449477828), + FRAC_CONST(0.99800845028730), + FRAC_CONST(0.99806123597027), + FRAC_CONST(0.99811287133042), + FRAC_CONST(0.99816337566108), + FRAC_CONST(0.99821276804596), + FRAC_CONST(0.99826106735952), + FRAC_CONST(0.99830829226732), + FRAC_CONST(0.99835446122649), + FRAC_CONST(0.99839959248609), + FRAC_CONST(0.99844370408765), + FRAC_CONST(0.99848681386566), + FRAC_CONST(0.99852893944805), + FRAC_CONST(0.99857009825685), + FRAC_CONST(0.99861030750869), + FRAC_CONST(0.99864958421549), + FRAC_CONST(0.99868794518504), + FRAC_CONST(0.99872540702178), + FRAC_CONST(0.99876198612738), + FRAC_CONST(0.99879769870160), + FRAC_CONST(0.99883256074295), + FRAC_CONST(0.99886658804953), + FRAC_CONST(0.99889979621983), + FRAC_CONST(0.99893220065356), + FRAC_CONST(0.99896381655254), + FRAC_CONST(0.99899465892154), + FRAC_CONST(0.99902474256924), + FRAC_CONST(0.99905408210916), + FRAC_CONST(0.99908269196056), + FRAC_CONST(0.99911058634952), + FRAC_CONST(0.99913777930986), + FRAC_CONST(0.99916428468421), + FRAC_CONST(0.99919011612505), + FRAC_CONST(0.99921528709576), + FRAC_CONST(0.99923981087174), + FRAC_CONST(0.99926370054150), + FRAC_CONST(0.99928696900779), + FRAC_CONST(0.99930962898876), + FRAC_CONST(0.99933169301910), + FRAC_CONST(0.99935317345126), + FRAC_CONST(0.99937408245662), + FRAC_CONST(0.99939443202674), + FRAC_CONST(0.99941423397457), + FRAC_CONST(0.99943349993572), + FRAC_CONST(0.99945224136972), + FRAC_CONST(0.99947046956130), + FRAC_CONST(0.99948819562171), + FRAC_CONST(0.99950543049000), + FRAC_CONST(0.99952218493439), + FRAC_CONST(0.99953846955355), + FRAC_CONST(0.99955429477803), + FRAC_CONST(0.99956967087154), + FRAC_CONST(0.99958460793242), + FRAC_CONST(0.99959911589494), + FRAC_CONST(0.99961320453077), + FRAC_CONST(0.99962688345035), + FRAC_CONST(0.99964016210433), + FRAC_CONST(0.99965304978499), + FRAC_CONST(0.99966555562769), + FRAC_CONST(0.99967768861231), + FRAC_CONST(0.99968945756473), + FRAC_CONST(0.99970087115825), + FRAC_CONST(0.99971193791510), + FRAC_CONST(0.99972266620792), + FRAC_CONST(0.99973306426121), + FRAC_CONST(0.99974314015288), + FRAC_CONST(0.99975290181568), + FRAC_CONST(0.99976235703876), + FRAC_CONST(0.99977151346914), + FRAC_CONST(0.99978037861326), + FRAC_CONST(0.99978895983845), + FRAC_CONST(0.99979726437448), + FRAC_CONST(0.99980529931507), + FRAC_CONST(0.99981307161943), + FRAC_CONST(0.99982058811377), + FRAC_CONST(0.99982785549283), + FRAC_CONST(0.99983488032144), + FRAC_CONST(0.99984166903600), + FRAC_CONST(0.99984822794606), + FRAC_CONST(0.99985456323584), + FRAC_CONST(0.99986068096572), + FRAC_CONST(0.99986658707386), + FRAC_CONST(0.99987228737764), + FRAC_CONST(0.99987778757524), + FRAC_CONST(0.99988309324717), + FRAC_CONST(0.99988820985777), + FRAC_CONST(0.99989314275675), + FRAC_CONST(0.99989789718072), + FRAC_CONST(0.99990247825468), + FRAC_CONST(0.99990689099357), + FRAC_CONST(0.99991114030376), + FRAC_CONST(0.99991523098456), + FRAC_CONST(0.99991916772971), + FRAC_CONST(0.99992295512891), + FRAC_CONST(0.99992659766930), + FRAC_CONST(0.99993009973692), + FRAC_CONST(0.99993346561824), + FRAC_CONST(0.99993669950161), + FRAC_CONST(0.99993980547870), + FRAC_CONST(0.99994278754604), + FRAC_CONST(0.99994564960642), + FRAC_CONST(0.99994839547033), + FRAC_CONST(0.99995102885747), + FRAC_CONST(0.99995355339809), + FRAC_CONST(0.99995597263451), + FRAC_CONST(0.99995829002249), + FRAC_CONST(0.99996050893264), + FRAC_CONST(0.99996263265183), + FRAC_CONST(0.99996466438460), + FRAC_CONST(0.99996660725452), + FRAC_CONST(0.99996846430558), + FRAC_CONST(0.99997023850356), + FRAC_CONST(0.99997193273736), + FRAC_CONST(0.99997354982037), + FRAC_CONST(0.99997509249183), + FRAC_CONST(0.99997656341810), + FRAC_CONST(0.99997796519400), + FRAC_CONST(0.99997930034415), + FRAC_CONST(0.99998057132421), + FRAC_CONST(0.99998178052220), + FRAC_CONST(0.99998293025975), + FRAC_CONST(0.99998402279338), + FRAC_CONST(0.99998506031574), + FRAC_CONST(0.99998604495686), + FRAC_CONST(0.99998697878536), + FRAC_CONST(0.99998786380966), + FRAC_CONST(0.99998870197921), + FRAC_CONST(0.99998949518567), + FRAC_CONST(0.99999024526408), + FRAC_CONST(0.99999095399401), + FRAC_CONST(0.99999162310077), + FRAC_CONST(0.99999225425649), + FRAC_CONST(0.99999284908128), + FRAC_CONST(0.99999340914435), + FRAC_CONST(0.99999393596510), + FRAC_CONST(0.99999443101421), + FRAC_CONST(0.99999489571473), + FRAC_CONST(0.99999533144314), + FRAC_CONST(0.99999573953040), + FRAC_CONST(0.99999612126300), + FRAC_CONST(0.99999647788395), + FRAC_CONST(0.99999681059383), + FRAC_CONST(0.99999712055178), + FRAC_CONST(0.99999740887647), + FRAC_CONST(0.99999767664709), + FRAC_CONST(0.99999792490431), + FRAC_CONST(0.99999815465123), + FRAC_CONST(0.99999836685427), + FRAC_CONST(0.99999856244415), + FRAC_CONST(0.99999874231676), + FRAC_CONST(0.99999890733405), + FRAC_CONST(0.99999905832493), + FRAC_CONST(0.99999919608613), + FRAC_CONST(0.99999932138304), + FRAC_CONST(0.99999943495056), + FRAC_CONST(0.99999953749392), + FRAC_CONST(0.99999962968950), + FRAC_CONST(0.99999971218563), + FRAC_CONST(0.99999978560337), + FRAC_CONST(0.99999985053727), + FRAC_CONST(0.99999990755616), + FRAC_CONST(0.99999995720387) +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const real_t kbd_long_960[] = { + FRAC_CONST(0.0003021562530949), + FRAC_CONST(0.0004452267024786), + FRAC_CONST(0.0005674947527496), + FRAC_CONST(0.0006812465553466), + FRAC_CONST(0.0007910496776387), + FRAC_CONST(0.0008991655033895), + FRAC_CONST(0.0010068978259384), + FRAC_CONST(0.0011150758515751), + FRAC_CONST(0.0012242653193642), + FRAC_CONST(0.0013348735658205), + FRAC_CONST(0.0014472068670273), + FRAC_CONST(0.0015615039850448), + FRAC_CONST(0.0016779568885263), + FRAC_CONST(0.0017967241232412), + FRAC_CONST(0.0019179397560955), + FRAC_CONST(0.0020417195415393), + FRAC_CONST(0.0021681652836642), + FRAC_CONST(0.0022973679910599), + FRAC_CONST(0.0024294102029937), + FRAC_CONST(0.0025643677339078), + FRAC_CONST(0.0027023110014772), + FRAC_CONST(0.0028433060512612), + FRAC_CONST(0.0029874153568025), + FRAC_CONST(0.0031346984511728), + FRAC_CONST(0.0032852124303662), + FRAC_CONST(0.0034390123581190), + FRAC_CONST(0.0035961515940931), + FRAC_CONST(0.0037566820618961), + FRAC_CONST(0.0039206544694386), + FRAC_CONST(0.0040881184912194), + FRAC_CONST(0.0042591229199617), + FRAC_CONST(0.0044337157933972), + FRAC_CONST(0.0046119445007641), + FRAC_CONST(0.0047938558726415), + FRAC_CONST(0.0049794962570131), + FRAC_CONST(0.0051689115838900), + FRAC_CONST(0.0053621474203763), + FRAC_CONST(0.0055592490177131), + FRAC_CONST(0.0057602613515573), + FRAC_CONST(0.0059652291565289), + FRAC_CONST(0.0061741969558843), + FRAC_CONST(0.0063872090870253), + FRAC_CONST(0.0066043097234387), + FRAC_CONST(0.0068255428935640), + FRAC_CONST(0.0070509524970088), + FRAC_CONST(0.0072805823184660), + FRAC_CONST(0.0075144760396340), + FRAC_CONST(0.0077526772493942), + FRAC_CONST(0.0079952294524673), + FRAC_CONST(0.0082421760767325), + FRAC_CONST(0.0084935604793733), + FRAC_CONST(0.0087494259519870), + FRAC_CONST(0.0090098157247792), + FRAC_CONST(0.0092747729699467), + FRAC_CONST(0.0095443408043399), + FRAC_CONST(0.0098185622914832), + FRAC_CONST(0.0100974804430226), + FRAC_CONST(0.0103811382196612), + FRAC_CONST(0.0106695785316351), + FRAC_CONST(0.0109628442387771), + FRAC_CONST(0.0112609781502091), + FRAC_CONST(0.0115640230236993), + FRAC_CONST(0.0118720215647169), + FRAC_CONST(0.0121850164252137), + FRAC_CONST(0.0125030502021561), + FRAC_CONST(0.0128261654358321), + FRAC_CONST(0.0131544046079532), + FRAC_CONST(0.0134878101395681), + FRAC_CONST(0.0138264243888068), + FRAC_CONST(0.0141702896484671), + FRAC_CONST(0.0145194481434592), + FRAC_CONST(0.0148739420281182), + FRAC_CONST(0.0152338133833959), + FRAC_CONST(0.0155991042139432), + FRAC_CONST(0.0159698564450882), + FRAC_CONST(0.0163461119197227), + FRAC_CONST(0.0167279123950996), + FRAC_CONST(0.0171152995395520), + FRAC_CONST(0.0175083149291368), + FRAC_CONST(0.0179070000442104), + FRAC_CONST(0.0183113962659409), + FRAC_CONST(0.0187215448727609), + FRAC_CONST(0.0191374870367659), + FRAC_CONST(0.0195592638200623), + FRAC_CONST(0.0199869161710679), + FRAC_CONST(0.0204204849207691), + FRAC_CONST(0.0208600107789370), + FRAC_CONST(0.0213055343303066), + FRAC_CONST(0.0217570960307201), + FRAC_CONST(0.0222147362032386), + FRAC_CONST(0.0226784950342228), + FRAC_CONST(0.0231484125693867), + FRAC_CONST(0.0236245287098244), + FRAC_CONST(0.0241068832080138), + FRAC_CONST(0.0245955156637973), + FRAC_CONST(0.0250904655203431), + FRAC_CONST(0.0255917720600868), + FRAC_CONST(0.0260994744006559), + FRAC_CONST(0.0266136114907790), + FRAC_CONST(0.0271342221061795), + FRAC_CONST(0.0276613448454576), + FRAC_CONST(0.0281950181259587), + FRAC_CONST(0.0287352801796329), + FRAC_CONST(0.0292821690488833), + FRAC_CONST(0.0298357225824074), + FRAC_CONST(0.0303959784310299), + FRAC_CONST(0.0309629740435296), + FRAC_CONST(0.0315367466624615), + FRAC_CONST(0.0321173333199732), + FRAC_CONST(0.0327047708336193), + FRAC_CONST(0.0332990958021720), + FRAC_CONST(0.0339003446014307), + FRAC_CONST(0.0345085533800302), + FRAC_CONST(0.0351237580552491), + FRAC_CONST(0.0357459943088193), + FRAC_CONST(0.0363752975827358), + FRAC_CONST(0.0370117030750704), + FRAC_CONST(0.0376552457357870), + FRAC_CONST(0.0383059602625614), + FRAC_CONST(0.0389638810966056), + FRAC_CONST(0.0396290424184964), + FRAC_CONST(0.0403014781440112), + FRAC_CONST(0.0409812219199691), + FRAC_CONST(0.0416683071200799), + FRAC_CONST(0.0423627668408009), + FRAC_CONST(0.0430646338972016), + FRAC_CONST(0.0437739408188385), + FRAC_CONST(0.0444907198456388), + FRAC_CONST(0.0452150029237951), + FRAC_CONST(0.0459468217016708), + FRAC_CONST(0.0466862075257170), + FRAC_CONST(0.0474331914364021), + FRAC_CONST(0.0481878041641539), + FRAC_CONST(0.0489500761253148), + FRAC_CONST(0.0497200374181119), + FRAC_CONST(0.0504977178186404), + FRAC_CONST(0.0512831467768636), + FRAC_CONST(0.0520763534126273), + FRAC_CONST(0.0528773665116913), + FRAC_CONST(0.0536862145217772), + FRAC_CONST(0.0545029255486345), + FRAC_CONST(0.0553275273521232), + FRAC_CONST(0.0561600473423164), + FRAC_CONST(0.0570005125756209), + FRAC_CONST(0.0578489497509179), + FRAC_CONST(0.0587053852057233), + FRAC_CONST(0.0595698449123695), + FRAC_CONST(0.0604423544742077), + FRAC_CONST(0.0613229391218317), + FRAC_CONST(0.0622116237093247), + FRAC_CONST(0.0631084327105284), + FRAC_CONST(0.0640133902153352), + FRAC_CONST(0.0649265199260043), + FRAC_CONST(0.0658478451535027), + FRAC_CONST(0.0667773888138695), + FRAC_CONST(0.0677151734246072), + FRAC_CONST(0.0686612211010977), + FRAC_CONST(0.0696155535530446), + FRAC_CONST(0.0705781920809429), + FRAC_CONST(0.0715491575725758), + FRAC_CONST(0.0725284704995383), + FRAC_CONST(0.0735161509137906), + FRAC_CONST(0.0745122184442388), + FRAC_CONST(0.0755166922933461), + FRAC_CONST(0.0765295912337720), + FRAC_CONST(0.0775509336050437), + FRAC_CONST(0.0785807373102561), + FRAC_CONST(0.0796190198128044), + FRAC_CONST(0.0806657981331473), + FRAC_CONST(0.0817210888456026), + FRAC_CONST(0.0827849080751753), + FRAC_CONST(0.0838572714944183), + FRAC_CONST(0.0849381943203265), + FRAC_CONST(0.0860276913112652), + FRAC_CONST(0.0871257767639319), + FRAC_CONST(0.0882324645103534), + FRAC_CONST(0.0893477679149177), + FRAC_CONST(0.0904716998714418), + FRAC_CONST(0.0916042728002747), + FRAC_CONST(0.0927454986454381), + FRAC_CONST(0.0938953888718020), + FRAC_CONST(0.0950539544622996), + FRAC_CONST(0.0962212059151784), + FRAC_CONST(0.0973971532412897), + FRAC_CONST(0.0985818059614169), + FRAC_CONST(0.0997751731036425), + FRAC_CONST(0.1009772632007537), + FRAC_CONST(0.1021880842876888), + FRAC_CONST(0.1034076438990227), + FRAC_CONST(0.1046359490664932), + FRAC_CONST(0.1058730063165681), + FRAC_CONST(0.1071188216680533), + FRAC_CONST(0.1083734006297428), + FRAC_CONST(0.1096367481981100), + FRAC_CONST(0.1109088688550422), + FRAC_CONST(0.1121897665656167), + FRAC_CONST(0.1134794447759207), + FRAC_CONST(0.1147779064109143), + FRAC_CONST(0.1160851538723372), + FRAC_CONST(0.1174011890366591), + FRAC_CONST(0.1187260132530751), + FRAC_CONST(0.1200596273415457), + FRAC_CONST(0.1214020315908810), + FRAC_CONST(0.1227532257568719), + FRAC_CONST(0.1241132090604651), + FRAC_CONST(0.1254819801859856), + FRAC_CONST(0.1268595372794049), + FRAC_CONST(0.1282458779466558), + FRAC_CONST(0.1296409992519942), + FRAC_CONST(0.1310448977164081), + FRAC_CONST(0.1324575693160745), + FRAC_CONST(0.1338790094808633), + FRAC_CONST(0.1353092130928902), + FRAC_CONST(0.1367481744851168), + FRAC_CONST(0.1381958874400010), + FRAC_CONST(0.1396523451881945), + FRAC_CONST(0.1411175404072910), + FRAC_CONST(0.1425914652206223), + FRAC_CONST(0.1440741111961058), + FRAC_CONST(0.1455654693451402), + FRAC_CONST(0.1470655301215526), + FRAC_CONST(0.1485742834205956), + FRAC_CONST(0.1500917185779945), + FRAC_CONST(0.1516178243690463), + FRAC_CONST(0.1531525890077689), + FRAC_CONST(0.1546960001461024), + FRAC_CONST(0.1562480448731608), + FRAC_CONST(0.1578087097145364), + FRAC_CONST(0.1593779806316558), + FRAC_CONST(0.1609558430211876), + FRAC_CONST(0.1625422817145027), + FRAC_CONST(0.1641372809771871), + FRAC_CONST(0.1657408245086070), + FRAC_CONST(0.1673528954415270), + FRAC_CONST(0.1689734763417811), + FRAC_CONST(0.1706025492079969), + FRAC_CONST(0.1722400954713725), + FRAC_CONST(0.1738860959955082), + FRAC_CONST(0.1755405310762898), + FRAC_CONST(0.1772033804418275), + FRAC_CONST(0.1788746232524467), + FRAC_CONST(0.1805542381007349), + FRAC_CONST(0.1822422030116404), + FRAC_CONST(0.1839384954426268), + FRAC_CONST(0.1856430922838810), + FRAC_CONST(0.1873559698585756), + FRAC_CONST(0.1890771039231862), + FRAC_CONST(0.1908064696678625), + FRAC_CONST(0.1925440417168546), + FRAC_CONST(0.1942897941289937), + FRAC_CONST(0.1960437003982277), + FRAC_CONST(0.1978057334542116), + FRAC_CONST(0.1995758656629525), + FRAC_CONST(0.2013540688275098), + FRAC_CONST(0.2031403141887507), + FRAC_CONST(0.2049345724261595), + FRAC_CONST(0.2067368136587033), + FRAC_CONST(0.2085470074457521), + FRAC_CONST(0.2103651227880538), + FRAC_CONST(0.2121911281287646), + FRAC_CONST(0.2140249913545346), + FRAC_CONST(0.2158666797966480), + FRAC_CONST(0.2177161602322188), + FRAC_CONST(0.2195733988854414), + FRAC_CONST(0.2214383614288963), + FRAC_CONST(0.2233110129849106), + FRAC_CONST(0.2251913181269740), + FRAC_CONST(0.2270792408812093), + FRAC_CONST(0.2289747447278976), + FRAC_CONST(0.2308777926030592), + FRAC_CONST(0.2327883469000885), + FRAC_CONST(0.2347063694714437), + FRAC_CONST(0.2366318216303919), + FRAC_CONST(0.2385646641528076), + FRAC_CONST(0.2405048572790267), + FRAC_CONST(0.2424523607157545), + FRAC_CONST(0.2444071336380283), + FRAC_CONST(0.2463691346912334), + FRAC_CONST(0.2483383219931741), + FRAC_CONST(0.2503146531361985), + FRAC_CONST(0.2522980851893767), + FRAC_CONST(0.2542885747007335), + FRAC_CONST(0.2562860776995335), + FRAC_CONST(0.2582905496986215), + FRAC_CONST(0.2603019456968142), + FRAC_CONST(0.2623202201813464), + FRAC_CONST(0.2643453271303700), + FRAC_CONST(0.2663772200155053), + FRAC_CONST(0.2684158518044454), + FRAC_CONST(0.2704611749636135), + FRAC_CONST(0.2725131414608710), + FRAC_CONST(0.2745717027682799), + FRAC_CONST(0.2766368098649151), + FRAC_CONST(0.2787084132397296), + FRAC_CONST(0.2807864628944707), + FRAC_CONST(0.2828709083466482), + FRAC_CONST(0.2849616986325523), + FRAC_CONST(0.2870587823103237), + FRAC_CONST(0.2891621074630737), + FRAC_CONST(0.2912716217020546), + FRAC_CONST(0.2933872721698803), + FRAC_CONST(0.2955090055437973), + FRAC_CONST(0.2976367680390041), + FRAC_CONST(0.2997705054120213), + FRAC_CONST(0.3019101629641097), + FRAC_CONST(0.3040556855447379), + FRAC_CONST(0.3062070175550981), + FRAC_CONST(0.3083641029516701), + FRAC_CONST(0.3105268852498334), + FRAC_CONST(0.3126953075275265), + FRAC_CONST(0.3148693124289546), + FRAC_CONST(0.3170488421683428), + FRAC_CONST(0.3192338385337370), + FRAC_CONST(0.3214242428908514), + FRAC_CONST(0.3236199961869606), + FRAC_CONST(0.3258210389548392), + FRAC_CONST(0.3280273113167459), + FRAC_CONST(0.3302387529884521), + FRAC_CONST(0.3324553032833160), + FRAC_CONST(0.3346769011164010), + FRAC_CONST(0.3369034850086373), + FRAC_CONST(0.3391349930910280), + FRAC_CONST(0.3413713631088974), + FRAC_CONST(0.3436125324261830), + FRAC_CONST(0.3458584380297697), + FRAC_CONST(0.3481090165338656), + FRAC_CONST(0.3503642041844199), + FRAC_CONST(0.3526239368635820), + FRAC_CONST(0.3548881500942010), + FRAC_CONST(0.3571567790443668), + FRAC_CONST(0.3594297585319891), + FRAC_CONST(0.3617070230294185), + FRAC_CONST(0.3639885066681048), + FRAC_CONST(0.3662741432432950), + FRAC_CONST(0.3685638662187693), + FRAC_CONST(0.3708576087316147), + FRAC_CONST(0.3731553035970366), + FRAC_CONST(0.3754568833132069), + FRAC_CONST(0.3777622800661488), + FRAC_CONST(0.3800714257346570), + FRAC_CONST(0.3823842518952546), + FRAC_CONST(0.3847006898271841), + FRAC_CONST(0.3870206705174334), + FRAC_CONST(0.3893441246657958), + FRAC_CONST(0.3916709826899639), + FRAC_CONST(0.3940011747306560), + FRAC_CONST(0.3963346306567764), + FRAC_CONST(0.3986712800706062), + FRAC_CONST(0.4010110523130271), + FRAC_CONST(0.4033538764687756), + FRAC_CONST(0.4056996813717284), + FRAC_CONST(0.4080483956102172), + FRAC_CONST(0.4103999475323736), + FRAC_CONST(0.4127542652515031), + FRAC_CONST(0.4151112766514873), + FRAC_CONST(0.4174709093922143), + FRAC_CONST(0.4198330909150365), + FRAC_CONST(0.4221977484482556), + FRAC_CONST(0.4245648090126334), + FRAC_CONST(0.4269341994269293), + FRAC_CONST(0.4293058463134616), + FRAC_CONST(0.4316796761036958), + FRAC_CONST(0.4340556150438547), + FRAC_CONST(0.4364335892005536), + FRAC_CONST(0.4388135244664580), + FRAC_CONST(0.4411953465659639), + FRAC_CONST(0.4435789810609000), + FRAC_CONST(0.4459643533562509), + FRAC_CONST(0.4483513887059016), + FRAC_CONST(0.4507400122184019), + FRAC_CONST(0.4531301488627497), + FRAC_CONST(0.4555217234741947), + FRAC_CONST(0.4579146607600593), + FRAC_CONST(0.4603088853055777), + FRAC_CONST(0.4627043215797521), + FRAC_CONST(0.4651008939412254), + FRAC_CONST(0.4674985266441709), + FRAC_CONST(0.4698971438441951), + FRAC_CONST(0.4722966696042580), + FRAC_CONST(0.4746970279006055), + FRAC_CONST(0.4770981426287164), + FRAC_CONST(0.4794999376092619), + FRAC_CONST(0.4819023365940778), + FRAC_CONST(0.4843052632721476), + FRAC_CONST(0.4867086412755978), + FRAC_CONST(0.4891123941857028), + FRAC_CONST(0.4915164455388997), + FRAC_CONST(0.4939207188328126), + FRAC_CONST(0.4963251375322855), + FRAC_CONST(0.4987296250754225), + FRAC_CONST(0.5011341048796359), + FRAC_CONST(0.5035385003477012), + FRAC_CONST(0.5059427348738168), + FRAC_CONST(0.5083467318496706), + FRAC_CONST(0.5107504146705106), + FRAC_CONST(0.5131537067412193), + FRAC_CONST(0.5155565314823923), + FRAC_CONST(0.5179588123364193), + FRAC_CONST(0.5203604727735667), + FRAC_CONST(0.5227614362980630), + FRAC_CONST(0.5251616264541841), + FRAC_CONST(0.5275609668323384), + FRAC_CONST(0.5299593810751532), + FRAC_CONST(0.5323567928835578), + FRAC_CONST(0.5347531260228663), + FRAC_CONST(0.5371483043288580), + FRAC_CONST(0.5395422517138538), + FRAC_CONST(0.5419348921727899), + FRAC_CONST(0.5443261497892862), + FRAC_CONST(0.5467159487417104), + FRAC_CONST(0.5491042133092364), + FRAC_CONST(0.5514908678778958), + FRAC_CONST(0.5538758369466227), + FRAC_CONST(0.5562590451332913), + FRAC_CONST(0.5586404171807443), + FRAC_CONST(0.5610198779628133), + FRAC_CONST(0.5633973524903286), + FRAC_CONST(0.5657727659171199), + FRAC_CONST(0.5681460435460047), + FRAC_CONST(0.5705171108347663), + FRAC_CONST(0.5728858934021188), + FRAC_CONST(0.5752523170336598), + FRAC_CONST(0.5776163076878088), + FRAC_CONST(0.5799777915017323), + FRAC_CONST(0.5823366947972535), + FRAC_CONST(0.5846929440867458), + FRAC_CONST(0.5870464660790119), + FRAC_CONST(0.5893971876851449), + FRAC_CONST(0.5917450360243719), + FRAC_CONST(0.5940899384298793), + FRAC_CONST(0.5964318224546208), + FRAC_CONST(0.5987706158771039), + FRAC_CONST(0.6011062467071583), + FRAC_CONST(0.6034386431916822), + FRAC_CONST(0.6057677338203681), + FRAC_CONST(0.6080934473314057), + FRAC_CONST(0.6104157127171639), + FRAC_CONST(0.6127344592298474), + FRAC_CONST(0.6150496163871310), + FRAC_CONST(0.6173611139777690), + FRAC_CONST(0.6196688820671789), + FRAC_CONST(0.6219728510029997), + FRAC_CONST(0.6242729514206247), + FRAC_CONST(0.6265691142487051), + FRAC_CONST(0.6288612707146283), + FRAC_CONST(0.6311493523499663), + FRAC_CONST(0.6334332909958958), + FRAC_CONST(0.6357130188085891), + FRAC_CONST(0.6379884682645743), + FRAC_CONST(0.6402595721660647), + FRAC_CONST(0.6425262636462578), + FRAC_CONST(0.6447884761746012), + FRAC_CONST(0.6470461435620266), + FRAC_CONST(0.6492991999661505), + FRAC_CONST(0.6515475798964411), + FRAC_CONST(0.6537912182193508), + FRAC_CONST(0.6560300501634142), + FRAC_CONST(0.6582640113243098), + FRAC_CONST(0.6604930376698862), + FRAC_CONST(0.6627170655451516), + FRAC_CONST(0.6649360316772256), + FRAC_CONST(0.6671498731802533), + FRAC_CONST(0.6693585275602818), + FRAC_CONST(0.6715619327200959), + FRAC_CONST(0.6737600269640164), + FRAC_CONST(0.6759527490026566), + FRAC_CONST(0.6781400379576392), + FRAC_CONST(0.6803218333662715), + FRAC_CONST(0.6824980751861787), + FRAC_CONST(0.6846687037998949), + FRAC_CONST(0.6868336600194123), + FRAC_CONST(0.6889928850906855), + FRAC_CONST(0.6911463206980928), + FRAC_CONST(0.6932939089688525), + FRAC_CONST(0.6954355924773949), + FRAC_CONST(0.6975713142496884), + FRAC_CONST(0.6997010177675195), + FRAC_CONST(0.7018246469727265), + FRAC_CONST(0.7039421462713862), + FRAC_CONST(0.7060534605379528), + FRAC_CONST(0.7081585351193496), + FRAC_CONST(0.7102573158390105), + FRAC_CONST(0.7123497490008750), + FRAC_CONST(0.7144357813933307), + FRAC_CONST(0.7165153602931092), + FRAC_CONST(0.7185884334691287), + FRAC_CONST(0.7206549491862871), + FRAC_CONST(0.7227148562092042), + FRAC_CONST(0.7247681038059106), + FRAC_CONST(0.7268146417514855), + FRAC_CONST(0.7288544203316418), + FRAC_CONST(0.7308873903462577), + FRAC_CONST(0.7329135031128549), + FRAC_CONST(0.7349327104700221), + FRAC_CONST(0.7369449647807855), + FRAC_CONST(0.7389502189359237), + FRAC_CONST(0.7409484263572271), + FRAC_CONST(0.7429395410007016), + FRAC_CONST(0.7449235173597176), + FRAC_CONST(0.7469003104681008), + FRAC_CONST(0.7488698759031670), + FRAC_CONST(0.7508321697887005), + FRAC_CONST(0.7527871487978728), + FRAC_CONST(0.7547347701561059), + FRAC_CONST(0.7566749916438754), + FRAC_CONST(0.7586077715994560), + FRAC_CONST(0.7605330689216074), + FRAC_CONST(0.7624508430722016), + FRAC_CONST(0.7643610540787891), + FRAC_CONST(0.7662636625371070), + FRAC_CONST(0.7681586296135255), + FRAC_CONST(0.7700459170474343), + FRAC_CONST(0.7719254871535672), + FRAC_CONST(0.7737973028242671), + FRAC_CONST(0.7756613275316875), + FRAC_CONST(0.7775175253299340), + FRAC_CONST(0.7793658608571425), + FRAC_CONST(0.7812062993374951), + FRAC_CONST(0.7830388065831744), + FRAC_CONST(0.7848633489962533), + FRAC_CONST(0.7866798935705233), + FRAC_CONST(0.7884884078932579), + FRAC_CONST(0.7902888601469138), + FRAC_CONST(0.7920812191107668), + FRAC_CONST(0.7938654541624850), + FRAC_CONST(0.7956415352796368), + FRAC_CONST(0.7974094330411343), + FRAC_CONST(0.7991691186286133), + FRAC_CONST(0.8009205638277465), + FRAC_CONST(0.8026637410294932), + FRAC_CONST(0.8043986232312831), + FRAC_CONST(0.8061251840381346), + FRAC_CONST(0.8078433976637077), + FRAC_CONST(0.8095532389312917), + FRAC_CONST(0.8112546832747255), + FRAC_CONST(0.8129477067392539), + FRAC_CONST(0.8146322859823164), + FRAC_CONST(0.8163083982742698), + FRAC_CONST(0.8179760214990457), + FRAC_CONST(0.8196351341547393), + FRAC_CONST(0.8212857153541345), + FRAC_CONST(0.8229277448251595), + FRAC_CONST(0.8245612029112778), + FRAC_CONST(0.8261860705718113), + FRAC_CONST(0.8278023293821971), + FRAC_CONST(0.8294099615341773), + FRAC_CONST(0.8310089498359212), + FRAC_CONST(0.8325992777120815), + FRAC_CONST(0.8341809292037831), + FRAC_CONST(0.8357538889685445), + FRAC_CONST(0.8373181422801330), + FRAC_CONST(0.8388736750283521), + FRAC_CONST(0.8404204737187619), + FRAC_CONST(0.8419585254723335), + FRAC_CONST(0.8434878180250348), + FRAC_CONST(0.8450083397273509), + FRAC_CONST(0.8465200795437368), + FRAC_CONST(0.8480230270520029), + FRAC_CONST(0.8495171724426350), + FRAC_CONST(0.8510025065180464), + FRAC_CONST(0.8524790206917633), + FRAC_CONST(0.8539467069875448), + FRAC_CONST(0.8554055580384357), + FRAC_CONST(0.8568555670857525), + FRAC_CONST(0.8582967279780043), + FRAC_CONST(0.8597290351697464), + FRAC_CONST(0.8611524837203691), + FRAC_CONST(0.8625670692928198), + FRAC_CONST(0.8639727881522599), + FRAC_CONST(0.8653696371646555), + FRAC_CONST(0.8667576137953045), + FRAC_CONST(0.8681367161072958), + FRAC_CONST(0.8695069427599065), + FRAC_CONST(0.8708682930069319), + FRAC_CONST(0.8722207666949527), + FRAC_CONST(0.8735643642615368), + FRAC_CONST(0.8748990867333771), + FRAC_CONST(0.8762249357243662), + FRAC_CONST(0.8775419134336067), + FRAC_CONST(0.8788500226433579), + FRAC_CONST(0.8801492667169208), + FRAC_CONST(0.8814396495964587), + FRAC_CONST(0.8827211758007560), + FRAC_CONST(0.8839938504229149), + FRAC_CONST(0.8852576791279895), + FRAC_CONST(0.8865126681505587), + FRAC_CONST(0.8877588242922386), + FRAC_CONST(0.8889961549191320), + FRAC_CONST(0.8902246679592184), + FRAC_CONST(0.8914443718996848), + FRAC_CONST(0.8926552757841945), + FRAC_CONST(0.8938573892100969), + FRAC_CONST(0.8950507223255798), + FRAC_CONST(0.8962352858267605), + FRAC_CONST(0.8974110909547198), + FRAC_CONST(0.8985781494924783), + FRAC_CONST(0.8997364737619142), + FRAC_CONST(0.9008860766206249), + FRAC_CONST(0.9020269714587307), + FRAC_CONST(0.9031591721956235), + FRAC_CONST(0.9042826932766591), + FRAC_CONST(0.9053975496697941), + FRAC_CONST(0.9065037568621681), + FRAC_CONST(0.9076013308566311), + FRAC_CONST(0.9086902881682180), + FRAC_CONST(0.9097706458205682), + FRAC_CONST(0.9108424213422940), + FRAC_CONST(0.9119056327632955), + FRAC_CONST(0.9129602986110235), + FRAC_CONST(0.9140064379066919), + FRAC_CONST(0.9150440701614393), + FRAC_CONST(0.9160732153724396), + FRAC_CONST(0.9170938940189634), + FRAC_CONST(0.9181061270583908), + FRAC_CONST(0.9191099359221748), + FRAC_CONST(0.9201053425117579), + FRAC_CONST(0.9210923691944400), + FRAC_CONST(0.9220710387992010), + FRAC_CONST(0.9230413746124764), + FRAC_CONST(0.9240034003738882), + FRAC_CONST(0.9249571402719298), + FRAC_CONST(0.9259026189396085), + FRAC_CONST(0.9268398614500427), + FRAC_CONST(0.9277688933120170), + FRAC_CONST(0.9286897404654957), + FRAC_CONST(0.9296024292770939), + FRAC_CONST(0.9305069865355076), + FRAC_CONST(0.9314034394469048), + FRAC_CONST(0.9322918156302762), + FRAC_CONST(0.9331721431127471), + FRAC_CONST(0.9340444503248519), + FRAC_CONST(0.9349087660957711), + FRAC_CONST(0.9357651196485313), + FRAC_CONST(0.9366135405951697), + FRAC_CONST(0.9374540589318637), + FRAC_CONST(0.9382867050340261), + FRAC_CONST(0.9391115096513655), + FRAC_CONST(0.9399285039029165), + FRAC_CONST(0.9407377192720349), + FRAC_CONST(0.9415391876013639), + FRAC_CONST(0.9423329410877687), + FRAC_CONST(0.9431190122772415), + FRAC_CONST(0.9438974340597782), + FRAC_CONST(0.9446682396642262), + FRAC_CONST(0.9454314626531054), + FRAC_CONST(0.9461871369174033), + FRAC_CONST(0.9469352966713429), + FRAC_CONST(0.9476759764471278), + FRAC_CONST(0.9484092110896616), + FRAC_CONST(0.9491350357512457), + FRAC_CONST(0.9498534858862532), + FRAC_CONST(0.9505645972457831), + FRAC_CONST(0.9512684058722927), + FRAC_CONST(0.9519649480942105), + FRAC_CONST(0.9526542605205314), + FRAC_CONST(0.9533363800353921), + FRAC_CONST(0.9540113437926313), + FRAC_CONST(0.9546791892103320), + FRAC_CONST(0.9553399539653500), + FRAC_CONST(0.9559936759878265), + FRAC_CONST(0.9566403934556893), + FRAC_CONST(0.9572801447891388), + FRAC_CONST(0.9579129686451244), + FRAC_CONST(0.9585389039118085), + FRAC_CONST(0.9591579897030224), + FRAC_CONST(0.9597702653527108), + FRAC_CONST(0.9603757704093711), + FRAC_CONST(0.9609745446304828), + FRAC_CONST(0.9615666279769324), + FRAC_CONST(0.9621520606074324), + FRAC_CONST(0.9627308828729358), + FRAC_CONST(0.9633031353110477), + FRAC_CONST(0.9638688586404335), + FRAC_CONST(0.9644280937552258), + FRAC_CONST(0.9649808817194311), + FRAC_CONST(0.9655272637613366), + FRAC_CONST(0.9660672812679171), + FRAC_CONST(0.9666009757792454), + FRAC_CONST(0.9671283889829055), + FRAC_CONST(0.9676495627084089), + FRAC_CONST(0.9681645389216160), + FRAC_CONST(0.9686733597191652), + FRAC_CONST(0.9691760673229058), + FRAC_CONST(0.9696727040743406), + FRAC_CONST(0.9701633124290767), + FRAC_CONST(0.9706479349512860), + FRAC_CONST(0.9711266143081750), + FRAC_CONST(0.9715993932644684), + FRAC_CONST(0.9720663146769026), + FRAC_CONST(0.9725274214887337), + FRAC_CONST(0.9729827567242596), + FRAC_CONST(0.9734323634833574), + FRAC_CONST(0.9738762849360358), + FRAC_CONST(0.9743145643170059), + FRAC_CONST(0.9747472449202687), + FRAC_CONST(0.9751743700937215), + FRAC_CONST(0.9755959832337850), + FRAC_CONST(0.9760121277800496), + FRAC_CONST(0.9764228472099433), + FRAC_CONST(0.9768281850334235), + FRAC_CONST(0.9772281847876897), + FRAC_CONST(0.9776228900319223), + FRAC_CONST(0.9780123443420448), + FRAC_CONST(0.9783965913055132), + FRAC_CONST(0.9787756745161313), + FRAC_CONST(0.9791496375688939), + FRAC_CONST(0.9795185240548578), + FRAC_CONST(0.9798823775560431), + FRAC_CONST(0.9802412416403639), + FRAC_CONST(0.9805951598565897), + FRAC_CONST(0.9809441757293399), + FRAC_CONST(0.9812883327541090), + FRAC_CONST(0.9816276743923267), + FRAC_CONST(0.9819622440664515), + FRAC_CONST(0.9822920851550995), + FRAC_CONST(0.9826172409882086), + FRAC_CONST(0.9829377548422400), + FRAC_CONST(0.9832536699354163), + FRAC_CONST(0.9835650294229984), + FRAC_CONST(0.9838718763926001), + FRAC_CONST(0.9841742538595437), + FRAC_CONST(0.9844722047622547), + FRAC_CONST(0.9847657719576983), + FRAC_CONST(0.9850549982168574), + FRAC_CONST(0.9853399262202529), + FRAC_CONST(0.9856205985535073), + FRAC_CONST(0.9858970577029519), + FRAC_CONST(0.9861693460512790), + FRAC_CONST(0.9864375058732389), + FRAC_CONST(0.9867015793313820), + FRAC_CONST(0.9869616084718489), + FRAC_CONST(0.9872176352202061), + FRAC_CONST(0.9874697013773301), + FRAC_CONST(0.9877178486153397), + FRAC_CONST(0.9879621184735767), + FRAC_CONST(0.9882025523546365), + FRAC_CONST(0.9884391915204485), + FRAC_CONST(0.9886720770884069), + FRAC_CONST(0.9889012500275530), + FRAC_CONST(0.9891267511548089), + FRAC_CONST(0.9893486211312621), + FRAC_CONST(0.9895669004585049), + FRAC_CONST(0.9897816294750255), + FRAC_CONST(0.9899928483526520), + FRAC_CONST(0.9902005970930525), + FRAC_CONST(0.9904049155242876), + FRAC_CONST(0.9906058432974180), + FRAC_CONST(0.9908034198831690), + FRAC_CONST(0.9909976845686489), + FRAC_CONST(0.9911886764541239), + FRAC_CONST(0.9913764344498495), + FRAC_CONST(0.9915609972729590), + FRAC_CONST(0.9917424034444086), + FRAC_CONST(0.9919206912859797), + FRAC_CONST(0.9920958989173397), + FRAC_CONST(0.9922680642531603), + FRAC_CONST(0.9924372250002933), + FRAC_CONST(0.9926034186550070), + FRAC_CONST(0.9927666825002789), + FRAC_CONST(0.9929270536031491), + FRAC_CONST(0.9930845688121325), + FRAC_CONST(0.9932392647546895), + FRAC_CONST(0.9933911778347579), + FRAC_CONST(0.9935403442303433), + FRAC_CONST(0.9936867998911693), + FRAC_CONST(0.9938305805363887), + FRAC_CONST(0.9939717216523539), + FRAC_CONST(0.9941102584904481), + FRAC_CONST(0.9942462260649764), + FRAC_CONST(0.9943796591511174), + FRAC_CONST(0.9945105922829353), + FRAC_CONST(0.9946390597514524), + FRAC_CONST(0.9947650956027824), + FRAC_CONST(0.9948887336363228), + FRAC_CONST(0.9950100074030103), + FRAC_CONST(0.9951289502036336), + FRAC_CONST(0.9952455950872091), + FRAC_CONST(0.9953599748494155), + FRAC_CONST(0.9954721220310890), + FRAC_CONST(0.9955820689167787), + FRAC_CONST(0.9956898475333619), + FRAC_CONST(0.9957954896487196), + FRAC_CONST(0.9958990267704713), + FRAC_CONST(0.9960004901447701), + FRAC_CONST(0.9960999107551559), + FRAC_CONST(0.9961973193214694), + FRAC_CONST(0.9962927462988245), + FRAC_CONST(0.9963862218766388), + FRAC_CONST(0.9964777759777242), + FRAC_CONST(0.9965674382574342), + FRAC_CONST(0.9966552381028704), + FRAC_CONST(0.9967412046321465), + FRAC_CONST(0.9968253666937095), + FRAC_CONST(0.9969077528657186), + FRAC_CONST(0.9969883914554805), + FRAC_CONST(0.9970673104989413), + FRAC_CONST(0.9971445377602348), + FRAC_CONST(0.9972201007312871), + FRAC_CONST(0.9972940266314749), + FRAC_CONST(0.9973663424073412), + FRAC_CONST(0.9974370747323638), + FRAC_CONST(0.9975062500067785), + FRAC_CONST(0.9975738943574574), + FRAC_CONST(0.9976400336378379), + FRAC_CONST(0.9977046934279079), + FRAC_CONST(0.9977678990342401), + FRAC_CONST(0.9978296754900812), + FRAC_CONST(0.9978900475554902), + FRAC_CONST(0.9979490397175296), + FRAC_CONST(0.9980066761905056), + FRAC_CONST(0.9980629809162593), + FRAC_CONST(0.9981179775645063), + FRAC_CONST(0.9981716895332257), + FRAC_CONST(0.9982241399490979), + FRAC_CONST(0.9982753516679893), + FRAC_CONST(0.9983253472754841), + FRAC_CONST(0.9983741490874634), + FRAC_CONST(0.9984217791507299), + FRAC_CONST(0.9984682592436778), + FRAC_CONST(0.9985136108770075), + FRAC_CONST(0.9985578552944850), + FRAC_CONST(0.9986010134737439), + FRAC_CONST(0.9986431061271304), + FRAC_CONST(0.9986841537025921), + FRAC_CONST(0.9987241763846056), + FRAC_CONST(0.9987631940951476), + FRAC_CONST(0.9988012264947044), + FRAC_CONST(0.9988382929833222), + FRAC_CONST(0.9988744127016956), + FRAC_CONST(0.9989096045322947), + FRAC_CONST(0.9989438871005292), + FRAC_CONST(0.9989772787759494), + FRAC_CONST(0.9990097976734847), + FRAC_CONST(0.9990414616547146), + FRAC_CONST(0.9990722883291779), + FRAC_CONST(0.9991022950557125), + FRAC_CONST(0.9991314989438310), + FRAC_CONST(0.9991599168551279), + FRAC_CONST(0.9991875654047181), + FRAC_CONST(0.9992144609627068), + FRAC_CONST(0.9992406196556911), + FRAC_CONST(0.9992660573682882), + FRAC_CONST(0.9992907897446957), + FRAC_CONST(0.9993148321902777), + FRAC_CONST(0.9993381998731797), + FRAC_CONST(0.9993609077259696), + FRAC_CONST(0.9993829704473038), + FRAC_CONST(0.9994044025036201), + FRAC_CONST(0.9994252181308537), + FRAC_CONST(0.9994454313361775), + FRAC_CONST(0.9994650558997651), + FRAC_CONST(0.9994841053765757), + FRAC_CONST(0.9995025930981609), + FRAC_CONST(0.9995205321744921), + FRAC_CONST(0.9995379354958073), + FRAC_CONST(0.9995548157344778), + FRAC_CONST(0.9995711853468930), + FRAC_CONST(0.9995870565753632), + FRAC_CONST(0.9996024414500382), + FRAC_CONST(0.9996173517908444), + FRAC_CONST(0.9996317992094352), + FRAC_CONST(0.9996457951111574), + FRAC_CONST(0.9996593506970310), + FRAC_CONST(0.9996724769657434), + FRAC_CONST(0.9996851847156547), + FRAC_CONST(0.9996974845468164), + FRAC_CONST(0.9997093868630000), + FRAC_CONST(0.9997209018737374), + FRAC_CONST(0.9997320395963699), + FRAC_CONST(0.9997428098581069), + FRAC_CONST(0.9997532222980933), + FRAC_CONST(0.9997632863694836), + FRAC_CONST(0.9997730113415246), + FRAC_CONST(0.9997824063016426), + FRAC_CONST(0.9997914801575380), + FRAC_CONST(0.9998002416392840), + FRAC_CONST(0.9998086993014300), + FRAC_CONST(0.9998168615251084), + FRAC_CONST(0.9998247365201450), + FRAC_CONST(0.9998323323271717), + FRAC_CONST(0.9998396568197407), + FRAC_CONST(0.9998467177064404), + FRAC_CONST(0.9998535225330116), + FRAC_CONST(0.9998600786844637), + FRAC_CONST(0.9998663933871905), + FRAC_CONST(0.9998724737110845), + FRAC_CONST(0.9998783265716498), + FRAC_CONST(0.9998839587321121), + FRAC_CONST(0.9998893768055266), + FRAC_CONST(0.9998945872568815), + FRAC_CONST(0.9998995964051983), + FRAC_CONST(0.9999044104256269), + FRAC_CONST(0.9999090353515359), + FRAC_CONST(0.9999134770765971), + FRAC_CONST(0.9999177413568642), + FRAC_CONST(0.9999218338128448), + FRAC_CONST(0.9999257599315647), + FRAC_CONST(0.9999295250686255), + FRAC_CONST(0.9999331344502529), + FRAC_CONST(0.9999365931753376), + FRAC_CONST(0.9999399062174669), + FRAC_CONST(0.9999430784269460), + FRAC_CONST(0.9999461145328103), + FRAC_CONST(0.9999490191448277), + FRAC_CONST(0.9999517967554878), + FRAC_CONST(0.9999544517419835), + FRAC_CONST(0.9999569883681778), + FRAC_CONST(0.9999594107865607), + FRAC_CONST(0.9999617230401926), + FRAC_CONST(0.9999639290646355), + FRAC_CONST(0.9999660326898712), + FRAC_CONST(0.9999680376422052), + FRAC_CONST(0.9999699475461585), + FRAC_CONST(0.9999717659263435), + FRAC_CONST(0.9999734962093266), + FRAC_CONST(0.9999751417254756), + FRAC_CONST(0.9999767057107922), + FRAC_CONST(0.9999781913087290), + FRAC_CONST(0.9999796015719915), + FRAC_CONST(0.9999809394643231), + FRAC_CONST(0.9999822078622751), + FRAC_CONST(0.9999834095569596), + FRAC_CONST(0.9999845472557860), + FRAC_CONST(0.9999856235841805), + FRAC_CONST(0.9999866410872889), + FRAC_CONST(0.9999876022316609), + FRAC_CONST(0.9999885094069193), + FRAC_CONST(0.9999893649274085), + FRAC_CONST(0.9999901710338274), + FRAC_CONST(0.9999909298948430), + FRAC_CONST(0.9999916436086862), + FRAC_CONST(0.9999923142047299), + FRAC_CONST(0.9999929436450469), + FRAC_CONST(0.9999935338259505), + FRAC_CONST(0.9999940865795161), + FRAC_CONST(0.9999946036750835), + FRAC_CONST(0.9999950868207405), + FRAC_CONST(0.9999955376647868), + FRAC_CONST(0.9999959577971798), + FRAC_CONST(0.9999963487509599), + FRAC_CONST(0.9999967120036571), + FRAC_CONST(0.9999970489786785), + FRAC_CONST(0.9999973610466748), + FRAC_CONST(0.9999976495268890), + FRAC_CONST(0.9999979156884846), + FRAC_CONST(0.9999981607518545), + FRAC_CONST(0.9999983858899099), + FRAC_CONST(0.9999985922293493), + FRAC_CONST(0.9999987808519092), + FRAC_CONST(0.9999989527955938), + FRAC_CONST(0.9999991090558848), + FRAC_CONST(0.9999992505869332), + FRAC_CONST(0.9999993783027293), + FRAC_CONST(0.9999994930782556), + FRAC_CONST(0.9999995957506171), + FRAC_CONST(0.9999996871201549), + FRAC_CONST(0.9999997679515386), + FRAC_CONST(0.9999998389748399), + FRAC_CONST(0.9999999008865869), + FRAC_CONST(0.9999999543507984) +}; +#endif + +ALIGN static const real_t kbd_short_128[] = +{ + FRAC_CONST(4.3795702929468881e-005), + FRAC_CONST(0.00011867384265436617), + FRAC_CONST(0.0002307165763996192), + FRAC_CONST(0.00038947282760568383), + FRAC_CONST(0.00060581272288302553), + FRAC_CONST(0.00089199695169487453), + FRAC_CONST(0.0012617254423430522), + FRAC_CONST(0.0017301724373162003), + FRAC_CONST(0.0023140071937421476), + FRAC_CONST(0.0030313989666022221), + FRAC_CONST(0.0039020049735530842), + FRAC_CONST(0.0049469401815512024), + FRAC_CONST(0.0061887279335368318), + FRAC_CONST(0.0076512306364647726), + FRAC_CONST(0.0093595599562652423), + FRAC_CONST(0.011339966208377799), + FRAC_CONST(0.013619706891715299), + FRAC_CONST(0.016226894586323766), + FRAC_CONST(0.019190324717288168), + FRAC_CONST(0.022539283975960878), + FRAC_CONST(0.026303340480472455), + FRAC_CONST(0.030512117046644357), + FRAC_CONST(0.03519504922365594), + FRAC_CONST(0.040381130021856941), + FRAC_CONST(0.046098643518702249), + FRAC_CONST(0.052374889768730587), + FRAC_CONST(0.059235903660769147), + FRAC_CONST(0.066706170556282418), + FRAC_CONST(0.074808341703430481), + FRAC_CONST(0.083562952548726227), + FRAC_CONST(0.092988147159339674), + FRAC_CONST(0.1030994120216919), + FRAC_CONST(0.11390932249409955), + FRAC_CONST(0.12542730516149531), + FRAC_CONST(0.13765941926783826), + FRAC_CONST(0.15060816028651081), + FRAC_CONST(0.16427228853114245), + FRAC_CONST(0.17864668550988483), + FRAC_CONST(0.19372224048676889), + FRAC_CONST(0.20948576943658073), + FRAC_CONST(0.22591996826744942), + FRAC_CONST(0.24300340184133981), + FRAC_CONST(0.26071052995068139), + FRAC_CONST(0.27901177101369551), + FRAC_CONST(0.29787360383626599), + FRAC_CONST(0.3172587073594233), + FRAC_CONST(0.33712613787396362), + FRAC_CONST(0.35743154274286698), + FRAC_CONST(0.37812740923363009), + FRAC_CONST(0.39916334663203618), + FRAC_CONST(0.42048639939189658), + FRAC_CONST(0.4420413886774246), + FRAC_CONST(0.4637712792815169), + FRAC_CONST(0.4856175685594023), + FRAC_CONST(0.50752069370766872), + FRAC_CONST(0.52942045344797806), + FRAC_CONST(0.55125643994680196), + FRAC_CONST(0.57296847662071559), + FRAC_CONST(0.59449705734411495), + FRAC_CONST(0.61578378249506627), + FRAC_CONST(0.63677178724712891), + FRAC_CONST(0.65740615754163356), + FRAC_CONST(0.67763432925662526), + FRAC_CONST(0.69740646622548552), + FRAC_CONST(0.71667581294953808), + FRAC_CONST(0.73539901809352737), + FRAC_CONST(0.75353642514900732), + FRAC_CONST(0.77105232699609816), + FRAC_CONST(0.78791518148597028), + FRAC_CONST(0.80409778560147072), + FRAC_CONST(0.81957740622770781), + FRAC_CONST(0.83433586607383625), + FRAC_CONST(0.84835958382689225), + FRAC_CONST(0.86163956818294229), + FRAC_CONST(0.87417136598406997), + FRAC_CONST(0.88595496528524853), + FRAC_CONST(0.89699465477567619), + FRAC_CONST(0.90729884157670959), + FRAC_CONST(0.91687983002436779), + FRAC_CONST(0.92575356460899649), + FRAC_CONST(0.93393934077779084), + FRAC_CONST(0.94145948779657318), + FRAC_CONST(0.94833902830402828), + FRAC_CONST(0.95460531956280026), + FRAC_CONST(0.96028768170574896), + FRAC_CONST(0.96541701848104766), + FRAC_CONST(0.97002543610646474), + FRAC_CONST(0.97414586584250062), + FRAC_CONST(0.97781169577969584), + FRAC_CONST(0.98105641710392333), + FRAC_CONST(0.98391328975491177), + FRAC_CONST(0.98641503193166202), + FRAC_CONST(0.98859353733226141), + FRAC_CONST(0.99047962335771556), + FRAC_CONST(0.9921028127769449), + FRAC_CONST(0.99349115056397752), + FRAC_CONST(0.99467105680259038), + FRAC_CONST(0.9956672157341897), + FRAC_CONST(0.99650250022834352), + FRAC_CONST(0.99719793020823266), + FRAC_CONST(0.99777266288955657), + FRAC_CONST(0.99824401211201486), + FRAC_CONST(0.99862749357391212), + FRAC_CONST(0.99893689243401962), + FRAC_CONST(0.99918434952623147), + FRAC_CONST(0.99938046234161726), + FRAC_CONST(0.99953439696357238), + FRAC_CONST(0.99965400728430465), + FRAC_CONST(0.99974595807027455), + FRAC_CONST(0.99981584876278362), + FRAC_CONST(0.99986833527824281), + FRAC_CONST(0.99990724749057802), + FRAC_CONST(0.99993570051598468), + FRAC_CONST(0.99995619835942084), + FRAC_CONST(0.99997072890647543), + FRAC_CONST(0.9999808496399144), + FRAC_CONST(0.99998776381655818), + FRAC_CONST(0.99999238714961569), + FRAC_CONST(0.99999540529959718), + FRAC_CONST(0.99999732268176988), + FRAC_CONST(0.99999850325054862), + FRAC_CONST(0.99999920402413744), + FRAC_CONST(0.9999996021706401), + FRAC_CONST(0.99999981649545566), + FRAC_CONST(0.99999992415545547), + FRAC_CONST(0.99999997338493041), + FRAC_CONST(0.99999999295825959), + FRAC_CONST(0.99999999904096815) +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const real_t kbd_short_120[] = +{ + FRAC_CONST(0.0000452320086910), + FRAC_CONST(0.0001274564692111), + FRAC_CONST(0.0002529398385345), + FRAC_CONST(0.0004335140496648), + FRAC_CONST(0.0006827100966952), + FRAC_CONST(0.0010158708222246), + FRAC_CONST(0.0014502162869659), + FRAC_CONST(0.0020048865156264), + FRAC_CONST(0.0027009618393178), + FRAC_CONST(0.0035614590925043), + FRAC_CONST(0.0046113018122711), + FRAC_CONST(0.0058772627936484), + FRAC_CONST(0.0073878776584103), + FRAC_CONST(0.0091733284512589), + FRAC_CONST(0.0112652966728373), + FRAC_CONST(0.0136967855861945), + FRAC_CONST(0.0165019120857793), + FRAC_CONST(0.0197156688892217), + FRAC_CONST(0.0233736582950619), + FRAC_CONST(0.0275117992367496), + FRAC_CONST(0.0321660098468534), + FRAC_CONST(0.0373718682174417), + FRAC_CONST(0.0431642544948834), + FRAC_CONST(0.0495769778717676), + FRAC_CONST(0.0566423924273392), + FRAC_CONST(0.0643910061132260), + FRAC_CONST(0.0728510874761729), + FRAC_CONST(0.0820482749475221), + FRAC_CONST(0.0920051937045235), + FRAC_CONST(0.1027410852163450), + FRAC_CONST(0.1142714546239370), + FRAC_CONST(0.1266077410648368), + FRAC_CONST(0.1397570159398145), + FRAC_CONST(0.1537217139274270), + FRAC_CONST(0.1684994012857075), + FRAC_CONST(0.1840825856392944), + FRAC_CONST(0.2004585710384133), + FRAC_CONST(0.2176093615976121), + FRAC_CONST(0.2355116164824983), + FRAC_CONST(0.2541366584185075), + FRAC_CONST(0.2734505372545160), + FRAC_CONST(0.2934141494343369), + FRAC_CONST(0.3139834135200387), + FRAC_CONST(0.3351095011824163), + FRAC_CONST(0.3567391223361566), + FRAC_CONST(0.3788148623608774), + FRAC_CONST(0.4012755686250732), + FRAC_CONST(0.4240567828288110), + FRAC_CONST(0.4470912150133537), + FRAC_CONST(0.4703092544619664), + FRAC_CONST(0.4936395121456694), + FRAC_CONST(0.5170093888596962), + FRAC_CONST(0.5403456627591340), + FRAC_CONST(0.5635750896430154), + FRAC_CONST(0.5866250090612892), + FRAC_CONST(0.6094239491338723), + FRAC_CONST(0.6319022228794100), + FRAC_CONST(0.6539925088563087), + FRAC_CONST(0.6756304090216887), + FRAC_CONST(0.6967549769155277), + FRAC_CONST(0.7173092095766250), + FRAC_CONST(0.7372404969921184), + FRAC_CONST(0.7565010233699827), + FRAC_CONST(0.7750481150999984), + FRAC_CONST(0.7928445309277697), + FRAC_CONST(0.8098586906021583), + FRAC_CONST(0.8260648390616000), + FRAC_CONST(0.8414431440907889), + FRAC_CONST(0.8559797262966709), + FRAC_CONST(0.8696666212110165), + FRAC_CONST(0.8825016743142358), + FRAC_CONST(0.8944883707784486), + FRAC_CONST(0.9056356027326216), + FRAC_CONST(0.9159573778427816), + FRAC_CONST(0.9254724739583072), + FRAC_CONST(0.9342040454819434), + FRAC_CONST(0.9421791879559176), + FRAC_CONST(0.9494284680976784), + FRAC_CONST(0.9559854271440150), + FRAC_CONST(0.9618860658493898), + FRAC_CONST(0.9671683198119525), + FRAC_CONST(0.9718715339497299), + FRAC_CONST(0.9760359449042233), + FRAC_CONST(0.9797021798981759), + FRAC_CONST(0.9829107801140203), + FRAC_CONST(0.9857017559923277), + FRAC_CONST(0.9881141809867999), + FRAC_CONST(0.9901858292742826), + FRAC_CONST(0.9919528617340944), + FRAC_CONST(0.9934495632180476), + FRAC_CONST(0.9947081327749199), + FRAC_CONST(0.9957585271195989), + FRAC_CONST(0.9966283562984427), + FRAC_CONST(0.9973428292485683), + FRAC_CONST(0.9979247458259197), + FRAC_CONST(0.9983945309245774), + FRAC_CONST(0.9987703055583410), + FRAC_CONST(0.9990679892449266), + FRAC_CONST(0.9993014277313617), + FRAC_CONST(0.9994825400228521), + FRAC_CONST(0.9996214788122335), + FRAC_CONST(0.9997267987294857), + FRAC_CONST(0.9998056273097539), + FRAC_CONST(0.9998638341781910), + FRAC_CONST(0.9999061946325793), + FRAC_CONST(0.9999365445321382), + FRAC_CONST(0.9999579241373735), + FRAC_CONST(0.9999727092594598), + FRAC_CONST(0.9999827287418790), + FRAC_CONST(0.9999893678912771), + FRAC_CONST(0.9999936579844555), + FRAC_CONST(0.9999963523959187), + FRAC_CONST(0.9999979902130101), + FRAC_CONST(0.9999989484358076), + FRAC_CONST(0.9999994840031031), + FRAC_CONST(0.9999997669534347), + FRAC_CONST(0.9999999060327799), + FRAC_CONST(0.9999999680107184), + FRAC_CONST(0.9999999918774242), + FRAC_CONST(0.9999999989770326) +}; +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/lt_predict.c b/src/contrib/aacdecoder/libfaad/lt_predict.c old mode 100644 new mode 100755 index 68c1bd768..2be18ae9f --- a/src/contrib/aacdecoder/libfaad/lt_predict.c +++ b/src/contrib/aacdecoder/libfaad/lt_predict.c @@ -1,215 +1,215 @@ -/* -** 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: lt_predict.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - - -#include "common.h" -#include "structs.h" - -#ifdef LTP_DEC - -#include -#include "syntax.h" -#include "lt_predict.h" -#include "filtbank.h" -#include "tns.h" - - -/* static function declarations */ -static int16_t real_to_int16(real_t sig_in); - - -/* check if the object type is an object type that can have LTP */ -uint8_t is_ltp_ot(uint8_t object_type) -{ -#ifdef LTP_DEC - if ((object_type == LTP) -#ifdef ERROR_RESILIENCE - || (object_type == ER_LTP) -#endif -#ifdef LD_DEC - || (object_type == LD) -#endif -#ifdef SCALABLE_DEC - || (object_type == 6) /* TODO */ -#endif - ) - { - return 1; - } -#endif - - return 0; -} - -ALIGN static const real_t codebook[8] = -{ - REAL_CONST(0.570829), - REAL_CONST(0.696616), - REAL_CONST(0.813004), - REAL_CONST(0.911304), - REAL_CONST(0.984900), - REAL_CONST(1.067894), - REAL_CONST(1.194601), - REAL_CONST(1.369533) -}; - -void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, - int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape, - uint8_t win_shape_prev, uint8_t sr_index, - uint8_t object_type, uint16_t frame_len) -{ - uint8_t sfb; - uint16_t bin, i, num_samples; - ALIGN real_t x_est[2048]; - ALIGN real_t X_est[2048]; - - if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) - { - if (ltp->data_present) - { - num_samples = frame_len << 1; - - for(i = 0; i < num_samples; i++) - { - /* The extra lookback M (N/2 for LD, 0 for LTP) is handled - in the buffer updating */ - -#if 0 - x_est[i] = MUL_R_C(lt_pred_stat[num_samples + i - ltp->lag], - codebook[ltp->coef]); -#else - /* lt_pred_stat is a 16 bit int, multiplied with the fixed point real - this gives a real for x_est - */ - x_est[i] = (real_t)lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef]; -#endif - } - - filter_bank_ltp(fb, ics->window_sequence, win_shape, win_shape_prev, - x_est, X_est, object_type, frame_len); - - tns_encode_frame(ics, &(ics->tns), sr_index, object_type, X_est, - frame_len); - - for (sfb = 0; sfb < ltp->last_band; sfb++) - { - if (ltp->long_used[sfb]) - { - uint16_t low = ics->swb_offset[sfb]; - uint16_t high = ics->swb_offset[sfb+1]; - - for (bin = low; bin < high; bin++) - { - spec[bin] += X_est[bin]; - } - } - } - } - } -} - -#ifdef FIXED_POINT -static INLINE int16_t real_to_int16(real_t sig_in) -{ - if (sig_in >= 0) - { - sig_in += (1 << (REAL_BITS-1)); - if (sig_in >= REAL_CONST(32768)) - return 32767; - } else { - sig_in += -(1 << (REAL_BITS-1)); - if (sig_in <= REAL_CONST(-32768)) - return -32768; - } - - return (sig_in >> REAL_BITS); -} -#else -static INLINE int16_t real_to_int16(real_t sig_in) -{ - if (sig_in >= 0) - { -#ifndef HAS_LRINTF - sig_in += 0.5f; -#endif - if (sig_in >= 32768.0f) - return 32767; - } else { -#ifndef HAS_LRINTF - sig_in += -0.5f; -#endif - if (sig_in <= -32768.0f) - return -32768; - } - - return lrintf(sig_in); -} -#endif - -void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, - uint16_t frame_len, uint8_t object_type) -{ - uint16_t i; - - /* - * The reference point for index i and the content of the buffer - * lt_pred_stat are arranged so that lt_pred_stat(0 ... N/2 - 1) contains the - * last aliased half window from the IMDCT, and lt_pred_stat(N/2 ... N-1) - * is always all zeros. The rest of lt_pred_stat (i<0) contains the previous - * fully reconstructed time domain samples, i.e., output of the decoder. - * - * These values are shifted up by N*2 to avoid (i<0) - * - * For the LD object type an extra 512 samples lookback is accomodated here. - */ -#ifdef LD_DEC - if (object_type == LD) - { - for (i = 0; i < frame_len; i++) - { - lt_pred_stat[i] /* extra 512 */ = lt_pred_stat[i + frame_len]; - lt_pred_stat[frame_len + i] = lt_pred_stat[i + (frame_len * 2)]; - lt_pred_stat[(frame_len * 2) + i] = real_to_int16(time[i]); - lt_pred_stat[(frame_len * 3) + i] = real_to_int16(overlap[i]); - } - } else { -#endif - for (i = 0; i < frame_len; i++) - { - lt_pred_stat[i] = lt_pred_stat[i + frame_len]; - lt_pred_stat[frame_len + i] = real_to_int16(time[i]); - lt_pred_stat[(frame_len * 2) + i] = real_to_int16(overlap[i]); -#if 0 /* set to zero once upon initialisation */ - lt_pred_stat[(frame_len * 3) + i] = 0; -#endif - } -#ifdef LD_DEC - } -#endif -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: lt_predict.c,v 1.27 2007/11/01 12:33:31 menno Exp $ +**/ + + +#include "common.h" +#include "structs.h" + +#ifdef LTP_DEC + +#include +#include "syntax.h" +#include "lt_predict.h" +#include "filtbank.h" +#include "tns.h" + + +/* static function declarations */ +static int16_t real_to_int16(real_t sig_in); + + +/* check if the object type is an object type that can have LTP */ +uint8_t is_ltp_ot(uint8_t object_type) +{ +#ifdef LTP_DEC + if ((object_type == LTP) +#ifdef ERROR_RESILIENCE + || (object_type == ER_LTP) +#endif +#ifdef LD_DEC + || (object_type == LD) +#endif + ) + { + return 1; + } +#endif + + return 0; +} + +ALIGN static const real_t codebook[8] = +{ + REAL_CONST(0.570829), + REAL_CONST(0.696616), + REAL_CONST(0.813004), + REAL_CONST(0.911304), + REAL_CONST(0.984900), + REAL_CONST(1.067894), + REAL_CONST(1.194601), + REAL_CONST(1.369533) +}; + +void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, + int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape, + uint8_t win_shape_prev, uint8_t sr_index, + uint8_t object_type, uint16_t frame_len) +{ + uint8_t sfb; + uint16_t bin, i, num_samples; + ALIGN real_t x_est[2048]; + ALIGN real_t X_est[2048]; + + if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) + { + if (ltp->data_present) + { + num_samples = frame_len << 1; + + for(i = 0; i < num_samples; i++) + { + /* The extra lookback M (N/2 for LD, 0 for LTP) is handled + in the buffer updating */ + +#if 0 + x_est[i] = MUL_R_C(lt_pred_stat[num_samples + i - ltp->lag], + codebook[ltp->coef]); +#else + /* lt_pred_stat is a 16 bit int, multiplied with the fixed point real + this gives a real for x_est + */ + x_est[i] = (real_t)lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef]; +#endif + } + + filter_bank_ltp(fb, ics->window_sequence, win_shape, win_shape_prev, + x_est, X_est, object_type, frame_len); + + tns_encode_frame(ics, &(ics->tns), sr_index, object_type, X_est, + frame_len); + + for (sfb = 0; sfb < ltp->last_band; sfb++) + { + if (ltp->long_used[sfb]) + { + uint16_t low = ics->swb_offset[sfb]; + uint16_t high = min(ics->swb_offset[sfb+1], ics->swb_offset_max); + + for (bin = low; bin < high; bin++) + { + spec[bin] += X_est[bin]; + } + } + } + } + } +} + +#ifdef FIXED_POINT +static INLINE int16_t real_to_int16(real_t sig_in) +{ + if (sig_in >= 0) + { + sig_in += (1 << (REAL_BITS-1)); + if (sig_in >= REAL_CONST(32768)) + return 32767; + } else { + sig_in += -(1 << (REAL_BITS-1)); + if (sig_in <= REAL_CONST(-32768)) + return -32768; + } + + return (sig_in >> REAL_BITS); +} +#else +static INLINE int16_t real_to_int16(real_t sig_in) +{ + if (sig_in >= 0) + { +#ifndef HAS_LRINTF + sig_in += 0.5f; +#endif + if (sig_in >= 32768.0f) + return 32767; + } else { +#ifndef HAS_LRINTF + sig_in += -0.5f; +#endif + if (sig_in <= -32768.0f) + return -32768; + } + + return lrintf(sig_in); +} +#endif + +void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, + uint16_t frame_len, uint8_t object_type) +{ + uint16_t i; + + /* + * The reference point for index i and the content of the buffer + * lt_pred_stat are arranged so that lt_pred_stat(0 ... N/2 - 1) contains the + * last aliased half window from the IMDCT, and lt_pred_stat(N/2 ... N-1) + * is always all zeros. The rest of lt_pred_stat (i<0) contains the previous + * fully reconstructed time domain samples, i.e., output of the decoder. + * + * These values are shifted up by N*2 to avoid (i<0) + * + * For the LD object type an extra 512 samples lookback is accomodated here. + */ +#ifdef LD_DEC + if (object_type == LD) + { + for (i = 0; i < frame_len; i++) + { + lt_pred_stat[i] /* extra 512 */ = lt_pred_stat[i + frame_len]; + lt_pred_stat[frame_len + i] = lt_pred_stat[i + (frame_len * 2)]; + lt_pred_stat[(frame_len * 2) + i] = real_to_int16(time[i]); + lt_pred_stat[(frame_len * 3) + i] = real_to_int16(overlap[i]); + } + } else { +#endif + for (i = 0; i < frame_len; i++) + { + lt_pred_stat[i] = lt_pred_stat[i + frame_len]; + lt_pred_stat[frame_len + i] = real_to_int16(time[i]); + lt_pred_stat[(frame_len * 2) + i] = real_to_int16(overlap[i]); +#if 0 /* set to zero once upon initialisation */ + lt_pred_stat[(frame_len * 3) + i] = 0; +#endif + } +#ifdef LD_DEC + } +#endif +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/lt_predict.h b/src/contrib/aacdecoder/libfaad/lt_predict.h old mode 100644 new mode 100755 index 58401a25e..117f83424 --- a/src/contrib/aacdecoder/libfaad/lt_predict.h +++ b/src/contrib/aacdecoder/libfaad/lt_predict.h @@ -1,63 +1,66 @@ -/* -** 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: lt_predict.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifdef LTP_DEC - -#ifndef __LT_PREDICT_H__ -#define __LT_PREDICT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "filtbank.h" - -uint8_t is_ltp_ot(uint8_t object_type); - -void lt_prediction(ic_stream *ics, - ltp_info *ltp, - real_t *spec, - int16_t *lt_pred_stat, - fb_info *fb, - uint8_t win_shape, - uint8_t win_shape_prev, - uint8_t sr_index, - uint8_t object_type, - uint16_t frame_len); - -void lt_update_state(int16_t *lt_pred_stat, - real_t *time, - real_t *overlap, - uint16_t frame_len, - uint8_t object_type); - -#ifdef __cplusplus -} -#endif -#endif - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: lt_predict.h,v 1.20 2007/11/01 12:33:31 menno Exp $ +**/ + +#ifdef LTP_DEC + +#ifndef __LT_PREDICT_H__ +#define __LT_PREDICT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "filtbank.h" + +uint8_t is_ltp_ot(uint8_t object_type); + +void lt_prediction(ic_stream *ics, + ltp_info *ltp, + real_t *spec, + int16_t *lt_pred_stat, + fb_info *fb, + uint8_t win_shape, + uint8_t win_shape_prev, + uint8_t sr_index, + uint8_t object_type, + uint16_t frame_len); + +void lt_update_state(int16_t *lt_pred_stat, + real_t *time, + real_t *overlap, + uint16_t frame_len, + uint8_t object_type); + +#ifdef __cplusplus +} +#endif +#endif + +#endif diff --git a/src/contrib/aacdecoder/libfaad/mdct.c b/src/contrib/aacdecoder/libfaad/mdct.c old mode 100644 new mode 100755 index adcc6134a..247691e40 --- a/src/contrib/aacdecoder/libfaad/mdct.c +++ b/src/contrib/aacdecoder/libfaad/mdct.c @@ -1,518 +1,301 @@ -/* -** 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: mdct.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* - * Fast (I)MDCT Implementation using (I)FFT ((Inverse) Fast Fourier Transform) - * and consists of three steps: pre-(I)FFT complex multiplication, complex - * (I)FFT, post-(I)FFT complex multiplication, - * - * As described in: - * P. Duhamel, Y. Mahieux, and J.P. Petit, "A Fast Algorithm for the - * Implementation of Filter Banks Based on 'Time Domain Aliasing - * Cancellation’," IEEE Proc. on ICASSP‘91, 1991, pp. 2209-2212. - * - * - * As of April 6th 2002 completely rewritten. - * This (I)MDCT can now be used for any data size n, where n is divisible by 8. - * - */ - -#include "common.h" -#include "structs.h" - -#include -#ifdef _WIN32_WCE -#define assert(x) -#else -#include -#endif - -#include "cfft.h" -#include "mdct.h" - -/* const_tab[]: - 0: sqrt(2 / N) - 1: cos(2 * PI / N) - 2: sin(2 * PI / N) - 3: cos(2 * PI * (1/8) / N) - 4: sin(2 * PI * (1/8) / N) - */ -#ifdef FIXED_POINT -real_t const_tab[][5] = -{ - { /* 2048 */ - COEF_CONST(1), - FRAC_CONST(0.99999529380957619), - FRAC_CONST(0.0030679567629659761), - FRAC_CONST(0.99999992646571789), - FRAC_CONST(0.00038349518757139556) - }, { /* 1920 */ - COEF_CONST(/* sqrt(1024/960) */ 1.0327955589886444), - FRAC_CONST(0.99999464540169647), - FRAC_CONST(0.0032724865065266251), - FRAC_CONST(0.99999991633432805), - FRAC_CONST(0.00040906153202803459) - }, { /* 1024 */ - COEF_CONST(1), - FRAC_CONST(0.99998117528260111), - FRAC_CONST(0.0061358846491544753), - FRAC_CONST(0.99999970586288223), - FRAC_CONST(0.00076699031874270449) - }, { /* 960 */ - COEF_CONST(/* sqrt(512/480) */ 1.0327955589886444), - FRAC_CONST(0.99997858166412923), - FRAC_CONST(0.0065449379673518581), - FRAC_CONST(0.99999966533732598), - FRAC_CONST(0.00081812299560725323) - }, { /* 256 */ - COEF_CONST(1), - FRAC_CONST(0.99969881869620425), - FRAC_CONST(0.024541228522912288), - FRAC_CONST(0.99999529380957619), - FRAC_CONST(0.0030679567629659761) - }, { /* 240 */ - COEF_CONST(/* sqrt(256/240) */ 1.0327955589886444), - FRAC_CONST(0.99965732497555726), - FRAC_CONST(0.026176948307873149), - FRAC_CONST(0.99999464540169647), - FRAC_CONST(0.0032724865065266251) - } -#ifdef SSR_DEC - ,{ /* 512 */ - COEF_CONST(1), - FRAC_CONST(0.9999247018391445), - FRAC_CONST(0.012271538285719925), - FRAC_CONST(0.99999882345170188), - FRAC_CONST(0.0015339801862847655) - }, { /* 64 */ - COEF_CONST(1), - FRAC_CONST(0.99518472667219693), - FRAC_CONST(0.098017140329560604), - FRAC_CONST(0.9999247018391445), - FRAC_CONST(0.012271538285719925) - } -#endif -}; -#endif - -#ifdef FIXED_POINT -static uint8_t map_N_to_idx(uint16_t N) -{ - /* gives an index into const_tab above */ - /* for normal AAC deocding (eg. no scalable profile) only */ - /* index 0 and 4 will be used */ - switch(N) - { - case 2048: return 0; - case 1920: return 1; - case 1024: return 2; - case 960: return 3; - case 256: return 4; - case 240: return 5; -#ifdef SSR_DEC - case 512: return 6; - case 64: return 7; -#endif - } - return 0; -} -#endif - -mdct_info *faad_mdct_init(uint16_t N) -{ - uint16_t k; -#ifdef FIXED_POINT - uint16_t N_idx; - real_t cangle, sangle, c, s, cold; -#endif - real_t scale; - - mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info)); - - assert(N % 8 == 0); - - mdct->N = N; - mdct->sincos = (complex_t*)faad_malloc(N/4*sizeof(complex_t)); - -#ifdef FIXED_POINT - N_idx = map_N_to_idx(N); - - scale = const_tab[N_idx][0]; - cangle = const_tab[N_idx][1]; - sangle = const_tab[N_idx][2]; - c = const_tab[N_idx][3]; - s = const_tab[N_idx][4]; -#else - scale = (real_t)sqrt(2.0 / (real_t)N); -#endif - - /* (co)sine table build using recurrence relations */ - /* this can also be done using static table lookup or */ - /* some form of interpolation */ - for (k = 0; k < N/4; k++) - { -#ifdef FIXED_POINT - RE(mdct->sincos[k]) = c; //MUL_C_C(c,scale); - IM(mdct->sincos[k]) = s; //MUL_C_C(s,scale); - - cold = c; - c = MUL_F(c,cangle) - MUL_F(s,sangle); - s = MUL_F(s,cangle) + MUL_F(cold,sangle); -#else - /* no recurrence, just sines */ - RE(mdct->sincos[k]) = scale*(real_t)(cos(2.0*M_PI*(k+1./8.) / (real_t)N)); - IM(mdct->sincos[k]) = scale*(real_t)(sin(2.0*M_PI*(k+1./8.) / (real_t)N)); -#endif - } - - /* initialise fft */ - mdct->cfft = cffti(N/4); - -#ifdef PROFILE - mdct->cycles = 0; - mdct->fft_cycles = 0; -#endif - - return mdct; -} - -void faad_mdct_end(mdct_info *mdct) -{ - if (mdct != NULL) - { -#ifdef PROFILE - printf("MDCT[%.4d]: %I64d cycles\n", mdct->N, mdct->cycles); - printf("CFFT[%.4d]: %I64d cycles\n", mdct->N/4, mdct->fft_cycles); -#endif - - cfftu(mdct->cfft); - - if (mdct->sincos) faad_free(mdct->sincos); - - faad_free(mdct); - } -} - -void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out) -{ - uint16_t k; - - complex_t x; - ALIGN complex_t Z1[512]; - complex_t *sincos = mdct->sincos; - - uint16_t N = mdct->N; - uint16_t N2 = N >> 1; - uint16_t N4 = N >> 2; - uint16_t N8 = N >> 3; - -#ifdef PROFILE - int64_t count1, count2 = faad_get_ts(); -#endif - - /* pre-IFFT complex multiplication */ - for (k = 0; k < N4; k++) - { - ComplexMult(&IM(Z1[k]), &RE(Z1[k]), - X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); - } - -#ifdef PROFILE - count1 = faad_get_ts(); -#endif - - /* complex IFFT, any non-scaling FFT can be used here */ - cfftb(mdct->cfft, Z1); - -#ifdef PROFILE - count1 = faad_get_ts() - count1; -#endif - - /* post-IFFT complex multiplication */ - for (k = 0; k < N4; k++) - { - RE(x) = RE(Z1[k]); - IM(x) = IM(Z1[k]); - ComplexMult(&IM(Z1[k]), &RE(Z1[k]), - IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); - } - - /* reordering */ - for (k = 0; k < N8; k+=2) - { - X_out[ 2*k] = IM(Z1[N8 + k]); - X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); - - X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); - X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); - - X_out[N4 + 2*k] = RE(Z1[ k]); - X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); - - X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); - X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); - - X_out[N2 + 2*k] = RE(Z1[N8 + k]); - X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); - - X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); - X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); - - X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); - X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); - - X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); - X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); - } - -#ifdef PROFILE - count2 = faad_get_ts() - count2; - mdct->fft_cycles += count1; - mdct->cycles += (count2 - count1); -#endif -} - -#ifdef USE_SSE -void faad_imdct_sse(mdct_info *mdct, real_t *X_in, real_t *X_out) -{ - uint16_t k; - - ALIGN complex_t Z1[512]; - complex_t *sincos = mdct->sincos; - - uint16_t N = mdct->N; - uint16_t N2 = N >> 1; - uint16_t N4 = N >> 2; - uint16_t N8 = N >> 3; - -#ifdef PROFILE - int64_t count1, count2 = faad_get_ts(); -#endif - - /* pre-IFFT complex multiplication */ - for (k = 0; k < N4; k+=4) - { - __m128 m12, m13, m14, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11; - __m128 n12, n13, n14, n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11; - n12 = _mm_load_ps(&X_in[N2 - 2*k - 8]); - m12 = _mm_load_ps(&X_in[N2 - 2*k - 4]); - m13 = _mm_load_ps(&X_in[2*k]); - n13 = _mm_load_ps(&X_in[2*k + 4]); - m1 = _mm_load_ps(&RE(sincos[k])); - n1 = _mm_load_ps(&RE(sincos[k+2])); - - m0 = _mm_shuffle_ps(m12, m13, _MM_SHUFFLE(2,0,1,3)); - m2 = _mm_shuffle_ps(m1, m1, _MM_SHUFFLE(2,3,0,1)); - m14 = _mm_shuffle_ps(m0, m0, _MM_SHUFFLE(3,1,2,0)); - n0 = _mm_shuffle_ps(n12, n13, _MM_SHUFFLE(2,0,1,3)); - n2 = _mm_shuffle_ps(n1, n1, _MM_SHUFFLE(2,3,0,1)); - n14 = _mm_shuffle_ps(n0, n0, _MM_SHUFFLE(3,1,2,0)); - - m3 = _mm_mul_ps(m14, m1); - n3 = _mm_mul_ps(n14, n1); - m4 = _mm_mul_ps(m14, m2); - n4 = _mm_mul_ps(n14, n2); - - m5 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(2,0,2,0)); - n5 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(2,0,2,0)); - m6 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(3,1,3,1)); - n6 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(3,1,3,1)); - - m7 = _mm_add_ps(m5, m6); - n7 = _mm_add_ps(n5, n6); - m8 = _mm_sub_ps(m5, m6); - n8 = _mm_sub_ps(n5, n6); - - m9 = _mm_shuffle_ps(m7, m7, _MM_SHUFFLE(3,2,3,2)); - n9 = _mm_shuffle_ps(n7, n7, _MM_SHUFFLE(3,2,3,2)); - m10 = _mm_shuffle_ps(m8, m8, _MM_SHUFFLE(1,0,1,0)); - n10 = _mm_shuffle_ps(n8, n8, _MM_SHUFFLE(1,0,1,0)); - - m11 = _mm_unpacklo_ps(m10, m9); - n11 = _mm_unpacklo_ps(n10, n9); - - _mm_store_ps(&RE(Z1[k]), m11); - _mm_store_ps(&RE(Z1[k+2]), n11); - } - -#ifdef PROFILE - count1 = faad_get_ts(); -#endif - - /* complex IFFT, any non-scaling FFT can be used here */ - cfftb_sse(mdct->cfft, Z1); - -#ifdef PROFILE - count1 = faad_get_ts() - count1; -#endif - - /* post-IFFT complex multiplication */ - for (k = 0; k < N4; k+=4) - { - __m128 m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11; - __m128 n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11; - m0 = _mm_load_ps(&RE(Z1[k])); - n0 = _mm_load_ps(&RE(Z1[k+2])); - m1 = _mm_load_ps(&RE(sincos[k])); - n1 = _mm_load_ps(&RE(sincos[k+2])); - - m2 = _mm_shuffle_ps(m1, m1, _MM_SHUFFLE(2,3,0,1)); - n2 = _mm_shuffle_ps(n1, n1, _MM_SHUFFLE(2,3,0,1)); - - m3 = _mm_mul_ps(m0, m1); - n3 = _mm_mul_ps(n0, n1); - m4 = _mm_mul_ps(m0, m2); - n4 = _mm_mul_ps(n0, n2); - - m5 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(2,0,2,0)); - n5 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(2,0,2,0)); - m6 = _mm_shuffle_ps(m3, m4, _MM_SHUFFLE(3,1,3,1)); - n6 = _mm_shuffle_ps(n3, n4, _MM_SHUFFLE(3,1,3,1)); - - m7 = _mm_add_ps(m5, m6); - n7 = _mm_add_ps(n5, n6); - m8 = _mm_sub_ps(m5, m6); - n8 = _mm_sub_ps(n5, n6); - - m9 = _mm_shuffle_ps(m7, m7, _MM_SHUFFLE(3,2,3,2)); - n9 = _mm_shuffle_ps(n7, n7, _MM_SHUFFLE(3,2,3,2)); - m10 = _mm_shuffle_ps(m8, m8, _MM_SHUFFLE(1,0,1,0)); - n10 = _mm_shuffle_ps(n8, n8, _MM_SHUFFLE(1,0,1,0)); - - m11 = _mm_unpacklo_ps(m10, m9); - n11 = _mm_unpacklo_ps(n10, n9); - - _mm_store_ps(&RE(Z1[k]), m11); - _mm_store_ps(&RE(Z1[k+2]), n11); - } - - /* reordering */ - for (k = 0; k < N8; k+=2) - { - __m128 m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m13; - __m128 n4, n5, n6, n7, n8, n9; - __m128 neg1 = _mm_set_ps(-1.0, 1.0, -1.0, 1.0); - __m128 neg2 = _mm_set_ps(-1.0, -1.0, -1.0, -1.0); - - m0 = _mm_load_ps(&RE(Z1[k])); - m1 = _mm_load_ps(&RE(Z1[N8 - 2 - k])); - m2 = _mm_load_ps(&RE(Z1[N8 + k])); - m3 = _mm_load_ps(&RE(Z1[N4 - 2 - k])); - - m10 = _mm_mul_ps(m0, neg1); - m11 = _mm_mul_ps(m1, neg2); - m13 = _mm_mul_ps(m3, neg1); - - m5 = _mm_shuffle_ps(m2, m2, _MM_SHUFFLE(3,1,2,0)); - n4 = _mm_shuffle_ps(m10, m10, _MM_SHUFFLE(3,1,2,0)); - m4 = _mm_shuffle_ps(m11, m11, _MM_SHUFFLE(3,1,2,0)); - n5 = _mm_shuffle_ps(m13, m13, _MM_SHUFFLE(3,1,2,0)); - - m6 = _mm_shuffle_ps(m4, m5, _MM_SHUFFLE(3,2,1,0)); - n6 = _mm_shuffle_ps(n4, n5, _MM_SHUFFLE(3,2,1,0)); - m7 = _mm_shuffle_ps(m5, m4, _MM_SHUFFLE(3,2,1,0)); - n7 = _mm_shuffle_ps(n5, n4, _MM_SHUFFLE(3,2,1,0)); - - m8 = _mm_shuffle_ps(m6, m6, _MM_SHUFFLE(0,3,1,2)); - n8 = _mm_shuffle_ps(n6, n6, _MM_SHUFFLE(2,1,3,0)); - m9 = _mm_shuffle_ps(m7, m7, _MM_SHUFFLE(2,1,3,0)); - n9 = _mm_shuffle_ps(n7, n7, _MM_SHUFFLE(0,3,1,2)); - - _mm_store_ps(&X_out[2*k], m8); - _mm_store_ps(&X_out[N4 + 2*k], n8); - _mm_store_ps(&X_out[N2 + 2*k], m9); - _mm_store_ps(&X_out[N2 + N4 + 2*k], n9); - } - -#ifdef PROFILE - count2 = faad_get_ts() - count2; - mdct->fft_cycles += count1; - mdct->cycles += (count2 - count1); -#endif -} -#endif - -#ifdef LTP_DEC -void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out) -{ - uint16_t k; - - complex_t x; - ALIGN complex_t Z1[512]; - complex_t *sincos = mdct->sincos; - - uint16_t N = mdct->N; - uint16_t N2 = N >> 1; - uint16_t N4 = N >> 2; - uint16_t N8 = N >> 3; - -#ifndef FIXED_POINT - real_t scale = REAL_CONST(N); -#else - real_t scale = REAL_CONST(4.0/N); -#endif - - /* pre-FFT complex multiplication */ - for (k = 0; k < N8; k++) - { - uint16_t n = k << 1; - RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; - IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; - - ComplexMult(&RE(Z1[k]), &IM(Z1[k]), - RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); - - RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); - IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); - - RE(x) = X_in[N2 - 1 - n] - X_in[ n]; - IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; - - ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), - RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); - - RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); - IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); - } - - /* complex FFT, any non-scaling FFT can be used here */ - cfftf(mdct->cfft, Z1); - - /* post-FFT complex multiplication */ - for (k = 0; k < N4; k++) - { - uint16_t n = k << 1; - ComplexMult(&RE(x), &IM(x), - RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); - - X_out[ n] = -RE(x); - X_out[N2 - 1 - n] = IM(x); - X_out[N2 + n] = -IM(x); - X_out[N - 1 - n] = RE(x); - } -} -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mdct.c,v 1.47 2007/11/01 12:33:31 menno Exp $ +**/ + +/* + * Fast (I)MDCT Implementation using (I)FFT ((Inverse) Fast Fourier Transform) + * and consists of three steps: pre-(I)FFT complex multiplication, complex + * (I)FFT, post-(I)FFT complex multiplication, + * + * As described in: + * P. Duhamel, Y. Mahieux, and J.P. Petit, "A Fast Algorithm for the + * Implementation of Filter Banks Based on 'Time Domain Aliasing + * Cancellation’," IEEE Proc. on ICASSP‘91, 1991, pp. 2209-2212. + * + * + * As of April 6th 2002 completely rewritten. + * This (I)MDCT can now be used for any data size n, where n is divisible by 8. + * + */ + +#include "common.h" +#include "structs.h" + +#include +#ifdef _WIN32_WCE +#define assert(x) +#else +#include +#endif + +#include "cfft.h" +#include "mdct.h" +#include "mdct_tab.h" + + +mdct_info *faad_mdct_init(uint16_t N) +{ + mdct_info *mdct = (mdct_info*)faad_malloc(sizeof(mdct_info)); + + assert(N % 8 == 0); + + mdct->N = N; + + /* NOTE: For "small framelengths" in FIXED_POINT the coefficients need to be + * scaled by sqrt("(nearest power of 2) > N" / N) */ + + /* RE(mdct->sincos[k]) = scale*(real_t)(cos(2.0*M_PI*(k+1./8.) / (real_t)N)); + * IM(mdct->sincos[k]) = scale*(real_t)(sin(2.0*M_PI*(k+1./8.) / (real_t)N)); */ + /* scale is 1 for fixed point, sqrt(N) for floating point */ + switch (N) + { + case 2048: mdct->sincos = (complex_t*)mdct_tab_2048; break; + case 256: mdct->sincos = (complex_t*)mdct_tab_256; break; +#ifdef LD_DEC + case 1024: mdct->sincos = (complex_t*)mdct_tab_1024; break; +#endif +#ifdef ALLOW_SMALL_FRAMELENGTH + case 1920: mdct->sincos = (complex_t*)mdct_tab_1920; break; + case 240: mdct->sincos = (complex_t*)mdct_tab_240; break; +#ifdef LD_DEC + case 960: mdct->sincos = (complex_t*)mdct_tab_960; break; +#endif +#endif +#ifdef SSR_DEC + case 512: mdct->sincos = (complex_t*)mdct_tab_512; break; + case 64: mdct->sincos = (complex_t*)mdct_tab_64; break; +#endif + } + + /* initialise fft */ + mdct->cfft = cffti(N/4); + +#ifdef PROFILE + mdct->cycles = 0; + mdct->fft_cycles = 0; +#endif + + return mdct; +} + +void faad_mdct_end(mdct_info *mdct) +{ + if (mdct != NULL) + { +#ifdef PROFILE + printf("MDCT[%.4d]: %I64d cycles\n", mdct->N, mdct->cycles); + printf("CFFT[%.4d]: %I64d cycles\n", mdct->N/4, mdct->fft_cycles); +#endif + + cfftu(mdct->cfft); + + faad_free(mdct); + } +} + +void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out) +{ + uint16_t k; + + complex_t x; +#ifdef ALLOW_SMALL_FRAMELENGTH +#ifdef FIXED_POINT + real_t scale, b_scale = 0; +#endif +#endif + ALIGN complex_t Z1[512]; + complex_t *sincos = mdct->sincos; + + uint16_t N = mdct->N; + uint16_t N2 = N >> 1; + uint16_t N4 = N >> 2; + uint16_t N8 = N >> 3; + +#ifdef PROFILE + int64_t count1, count2 = faad_get_ts(); +#endif + +#ifdef ALLOW_SMALL_FRAMELENGTH +#ifdef FIXED_POINT + /* detect non-power of 2 */ + if (N & (N-1)) + { + /* adjust scale for non-power of 2 MDCT */ + /* 2048/1920 */ + b_scale = 1; + scale = COEF_CONST(1.0666666666666667); + } +#endif +#endif + + /* pre-IFFT complex multiplication */ + for (k = 0; k < N4; k++) + { + ComplexMult(&IM(Z1[k]), &RE(Z1[k]), + X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); + } + +#ifdef PROFILE + count1 = faad_get_ts(); +#endif + + /* complex IFFT, any non-scaling FFT can be used here */ + cfftb(mdct->cfft, Z1); + +#ifdef PROFILE + count1 = faad_get_ts() - count1; +#endif + + /* post-IFFT complex multiplication */ + for (k = 0; k < N4; k++) + { + RE(x) = RE(Z1[k]); + IM(x) = IM(Z1[k]); + ComplexMult(&IM(Z1[k]), &RE(Z1[k]), + IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); + +#ifdef ALLOW_SMALL_FRAMELENGTH +#ifdef FIXED_POINT + /* non-power of 2 MDCT scaling */ + if (b_scale) + { + RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); + IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); + } +#endif +#endif + } + + /* reordering */ + for (k = 0; k < N8; k+=2) + { + X_out[ 2*k] = IM(Z1[N8 + k]); + X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); + + X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); + X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); + + X_out[N4 + 2*k] = RE(Z1[ k]); + X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); + + X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); + X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); + + X_out[N2 + 2*k] = RE(Z1[N8 + k]); + X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); + + X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); + X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); + + X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); + X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); + + X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); + X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); + } + +#ifdef PROFILE + count2 = faad_get_ts() - count2; + mdct->fft_cycles += count1; + mdct->cycles += (count2 - count1); +#endif +} + +#ifdef LTP_DEC +void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out) +{ + uint16_t k; + + complex_t x; + ALIGN complex_t Z1[512]; + complex_t *sincos = mdct->sincos; + + uint16_t N = mdct->N; + uint16_t N2 = N >> 1; + uint16_t N4 = N >> 2; + uint16_t N8 = N >> 3; + +#ifndef FIXED_POINT + real_t scale = REAL_CONST(N); +#else + real_t scale = REAL_CONST(4.0/N); +#endif + +#ifdef ALLOW_SMALL_FRAMELENGTH +#ifdef FIXED_POINT + /* detect non-power of 2 */ + if (N & (N-1)) + { + /* adjust scale for non-power of 2 MDCT */ + /* *= sqrt(2048/1920) */ + scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); + } +#endif +#endif + + /* pre-FFT complex multiplication */ + for (k = 0; k < N8; k++) + { + uint16_t n = k << 1; + RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; + IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; + + ComplexMult(&RE(Z1[k]), &IM(Z1[k]), + RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); + + RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); + IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); + + RE(x) = X_in[N2 - 1 - n] - X_in[ n]; + IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; + + ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), + RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); + + RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); + IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); + } + + /* complex FFT, any non-scaling FFT can be used here */ + cfftf(mdct->cfft, Z1); + + /* post-FFT complex multiplication */ + for (k = 0; k < N4; k++) + { + uint16_t n = k << 1; + ComplexMult(&RE(x), &IM(x), + RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); + + X_out[ n] = -RE(x); + X_out[N2 - 1 - n] = IM(x); + X_out[N2 + n] = -IM(x); + X_out[N - 1 - n] = RE(x); + } +} +#endif diff --git a/src/contrib/aacdecoder/libfaad/mdct.h b/src/contrib/aacdecoder/libfaad/mdct.h old mode 100644 new mode 100755 index 179bf5f68..736180ead --- a/src/contrib/aacdecoder/libfaad/mdct.h +++ b/src/contrib/aacdecoder/libfaad/mdct.h @@ -1,48 +1,48 @@ -/* -** 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: mdct.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __MDCT_H__ -#define __MDCT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -mdct_info *faad_mdct_init(uint16_t N); -void faad_mdct_end(mdct_info *mdct); -void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out); -#ifdef USE_SSE -void faad_imdct_sse(mdct_info *mdct, real_t *X_in, real_t *X_out); -#endif -void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out); - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mdct.h,v 1.30 2007/11/01 12:33:31 menno Exp $ +**/ + +#ifndef __MDCT_H__ +#define __MDCT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +mdct_info *faad_mdct_init(uint16_t N); +void faad_mdct_end(mdct_info *mdct); +void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out); +void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/mdct_tab.h b/src/contrib/aacdecoder/libfaad/mdct_tab.h new file mode 100755 index 000000000..eea285b67 --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/mdct_tab.h @@ -0,0 +1,3655 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mdct_tab.h,v 1.7 2007/11/01 12:33:32 menno Exp $ +**/ + +#ifndef __MDCT_TAB_H__ +#define __MDCT_TAB_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef FIXED_POINT + +/* 256 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_2048[] = +{ + { FRAC_CONST(0.999999926465718), FRAC_CONST(0.000383495187571) }, + { FRAC_CONST(0.999994043728986), FRAC_CONST(0.003451449920136) }, + { FRAC_CONST(0.999978748667469), FRAC_CONST(0.006519372166339) }, + { FRAC_CONST(0.999954041425130), FRAC_CONST(0.009587233049729) }, + { FRAC_CONST(0.999919922234523), FRAC_CONST(0.012655003694430) }, + { FRAC_CONST(0.999876391416790), FRAC_CONST(0.015722655225417) }, + { FRAC_CONST(0.999823449381662), FRAC_CONST(0.018790158768785) }, + { FRAC_CONST(0.999761096627447), FRAC_CONST(0.021857485452022) }, + { FRAC_CONST(0.999689333741034), FRAC_CONST(0.024924606404281) }, + { FRAC_CONST(0.999608161397882), FRAC_CONST(0.027991492756653) }, + { FRAC_CONST(0.999517580362017), FRAC_CONST(0.031058115642435) }, + { FRAC_CONST(0.999417591486022), FRAC_CONST(0.034124446197403) }, + { FRAC_CONST(0.999308195711029), FRAC_CONST(0.037190455560088) }, + { FRAC_CONST(0.999189394066715), FRAC_CONST(0.040256114872041) }, + { FRAC_CONST(0.999061187671285), FRAC_CONST(0.043321395278110) }, + { FRAC_CONST(0.998923577731466), FRAC_CONST(0.046386267926707) }, + { FRAC_CONST(0.998776565542496), FRAC_CONST(0.049450703970085) }, + { FRAC_CONST(0.998620152488109), FRAC_CONST(0.052514674564603) }, + { FRAC_CONST(0.998454340040525), FRAC_CONST(0.055578150871005) }, + { FRAC_CONST(0.998279129760433), FRAC_CONST(0.058641104054683) }, + { FRAC_CONST(0.998094523296980), FRAC_CONST(0.061703505285957) }, + { FRAC_CONST(0.997900522387752), FRAC_CONST(0.064765325740340) }, + { FRAC_CONST(0.997697128858759), FRAC_CONST(0.067826536598811) }, + { FRAC_CONST(0.997484344624418), FRAC_CONST(0.070887109048088) }, + { FRAC_CONST(0.997262171687536), FRAC_CONST(0.073947014280897) }, + { FRAC_CONST(0.997030612139289), FRAC_CONST(0.077006223496246) }, + { FRAC_CONST(0.996789668159205), FRAC_CONST(0.080064707899691) }, + { FRAC_CONST(0.996539342015138), FRAC_CONST(0.083122438703613) }, + { FRAC_CONST(0.996279636063255), FRAC_CONST(0.086179387127485) }, + { FRAC_CONST(0.996010552748006), FRAC_CONST(0.089235524398144) }, + { FRAC_CONST(0.995732094602106), FRAC_CONST(0.092290821750062) }, + { FRAC_CONST(0.995444264246510), FRAC_CONST(0.095345250425618) }, + { FRAC_CONST(0.995147064390386), FRAC_CONST(0.098398781675364) }, + { FRAC_CONST(0.994840497831093), FRAC_CONST(0.101451386758302) }, + { FRAC_CONST(0.994524567454152), FRAC_CONST(0.104503036942151) }, + { FRAC_CONST(0.994199276233219), FRAC_CONST(0.107553703503616) }, + { FRAC_CONST(0.993864627230060), FRAC_CONST(0.110603357728662) }, + { FRAC_CONST(0.993520623594518), FRAC_CONST(0.113651970912782) }, + { FRAC_CONST(0.993167268564487), FRAC_CONST(0.116699514361268) }, + { FRAC_CONST(0.992804565465879), FRAC_CONST(0.119745959389480) }, + { FRAC_CONST(0.992432517712594), FRAC_CONST(0.122791277323117) }, + { FRAC_CONST(0.992051128806486), FRAC_CONST(0.125835439498487) }, + { FRAC_CONST(0.991660402337333), FRAC_CONST(0.128878417262777) }, + { FRAC_CONST(0.991260341982802), FRAC_CONST(0.131920181974320) }, + { FRAC_CONST(0.990850951508414), FRAC_CONST(0.134960705002869) }, + { FRAC_CONST(0.990432234767506), FRAC_CONST(0.137999957729863) }, + { FRAC_CONST(0.990004195701201), FRAC_CONST(0.141037911548698) }, + { FRAC_CONST(0.989566838338365), FRAC_CONST(0.144074537864995) }, + { FRAC_CONST(0.989120166795573), FRAC_CONST(0.147109808096872) }, + { FRAC_CONST(0.988664185277066), FRAC_CONST(0.150143693675208) }, + { FRAC_CONST(0.988198898074718), FRAC_CONST(0.153176166043918) }, + { FRAC_CONST(0.987724309567987), FRAC_CONST(0.156207196660216) }, + { FRAC_CONST(0.987240424223882), FRAC_CONST(0.159236756994888) }, + { FRAC_CONST(0.986747246596917), FRAC_CONST(0.162264818532558) }, + { FRAC_CONST(0.986244781329065), FRAC_CONST(0.165291352771958) }, + { FRAC_CONST(0.985733033149723), FRAC_CONST(0.168316331226195) }, + { FRAC_CONST(0.985212006875659), FRAC_CONST(0.171339725423019) }, + { FRAC_CONST(0.984681707410971), FRAC_CONST(0.174361506905094) }, + { FRAC_CONST(0.984142139747039), FRAC_CONST(0.177381647230260) }, + { FRAC_CONST(0.983593308962479), FRAC_CONST(0.180400117971807) }, + { FRAC_CONST(0.983035220223096), FRAC_CONST(0.183416890718739) }, + { FRAC_CONST(0.982467878781833), FRAC_CONST(0.186431937076042) }, + { FRAC_CONST(0.981891289978725), FRAC_CONST(0.189445228664950) }, + { FRAC_CONST(0.981305459240845), FRAC_CONST(0.192456737123217) }, + { FRAC_CONST(0.980710392082254), FRAC_CONST(0.195466434105377) }, + { FRAC_CONST(0.980106094103952), FRAC_CONST(0.198474291283016) }, + { FRAC_CONST(0.979492570993821), FRAC_CONST(0.201480280345038) }, + { FRAC_CONST(0.978869828526574), FRAC_CONST(0.204484372997927) }, + { FRAC_CONST(0.978237872563701), FRAC_CONST(0.207486540966021) }, + { FRAC_CONST(0.977596709053412), FRAC_CONST(0.210486755991770) }, + { FRAC_CONST(0.976946344030582), FRAC_CONST(0.213484989836008) }, + { FRAC_CONST(0.976286783616694), FRAC_CONST(0.216481214278217) }, + { FRAC_CONST(0.975618034019782), FRAC_CONST(0.219475401116790) }, + { FRAC_CONST(0.974940101534372), FRAC_CONST(0.222467522169302) }, + { FRAC_CONST(0.974252992541423), FRAC_CONST(0.225457549272769) }, + { FRAC_CONST(0.973556713508266), FRAC_CONST(0.228445454283916) }, + { FRAC_CONST(0.972851270988544), FRAC_CONST(0.231431209079446) }, + { FRAC_CONST(0.972136671622152), FRAC_CONST(0.234414785556295) }, + { FRAC_CONST(0.971412922135171), FRAC_CONST(0.237396155631907) }, + { FRAC_CONST(0.970680029339806), FRAC_CONST(0.240375291244489) }, + { FRAC_CONST(0.969938000134324), FRAC_CONST(0.243352164353285) }, + { FRAC_CONST(0.969186841502986), FRAC_CONST(0.246326746938829) }, + { FRAC_CONST(0.968426560515983), FRAC_CONST(0.249299011003218) }, + { FRAC_CONST(0.967657164329370), FRAC_CONST(0.252268928570371) }, + { FRAC_CONST(0.966878660184996), FRAC_CONST(0.255236471686292) }, + { FRAC_CONST(0.966091055410439), FRAC_CONST(0.258201612419335) }, + { FRAC_CONST(0.965294357418935), FRAC_CONST(0.261164322860466) }, + { FRAC_CONST(0.964488573709308), FRAC_CONST(0.264124575123528) }, + { FRAC_CONST(0.963673711865903), FRAC_CONST(0.267082341345496) }, + { FRAC_CONST(0.962849779558509), FRAC_CONST(0.270037593686751) }, + { FRAC_CONST(0.962016784542291), FRAC_CONST(0.272990304331330) }, + { FRAC_CONST(0.961174734657714), FRAC_CONST(0.275940445487197) }, + { FRAC_CONST(0.960323637830474), FRAC_CONST(0.278887989386500) }, + { FRAC_CONST(0.959463502071418), FRAC_CONST(0.281832908285833) }, + { FRAC_CONST(0.958594335476470), FRAC_CONST(0.284775174466498) }, + { FRAC_CONST(0.957716146226559), FRAC_CONST(0.287714760234765) }, + { FRAC_CONST(0.956828942587535), FRAC_CONST(0.290651637922133) }, + { FRAC_CONST(0.955932732910098), FRAC_CONST(0.293585779885591) }, + { FRAC_CONST(0.955027525629714), FRAC_CONST(0.296517158507877) }, + { FRAC_CONST(0.954113329266539), FRAC_CONST(0.299445746197740) }, + { FRAC_CONST(0.953190152425337), FRAC_CONST(0.302371515390196) }, + { FRAC_CONST(0.952258003795400), FRAC_CONST(0.305294438546792) }, + { FRAC_CONST(0.951316892150466), FRAC_CONST(0.308214488155861) }, + { FRAC_CONST(0.950366826348636), FRAC_CONST(0.311131636732785) }, + { FRAC_CONST(0.949407815332292), FRAC_CONST(0.314045856820251) }, + { FRAC_CONST(0.948439868128010), FRAC_CONST(0.316957120988508) }, + { FRAC_CONST(0.947462993846478), FRAC_CONST(0.319865401835631) }, + { FRAC_CONST(0.946477201682409), FRAC_CONST(0.322770671987771) }, + { FRAC_CONST(0.945482500914454), FRAC_CONST(0.325672904099420) }, + { FRAC_CONST(0.944478900905116), FRAC_CONST(0.328572070853664) }, + { FRAC_CONST(0.943466411100659), FRAC_CONST(0.331468144962441) }, + { FRAC_CONST(0.942445041031025), FRAC_CONST(0.334361099166799) }, + { FRAC_CONST(0.941414800309736), FRAC_CONST(0.337250906237151) }, + { FRAC_CONST(0.940375698633812), FRAC_CONST(0.340137538973532) }, + { FRAC_CONST(0.939327745783671), FRAC_CONST(0.343020970205856) }, + { FRAC_CONST(0.938270951623047), FRAC_CONST(0.345901172794169) }, + { FRAC_CONST(0.937205326098888), FRAC_CONST(0.348778119628908) }, + { FRAC_CONST(0.936130879241267), FRAC_CONST(0.351651783631155) }, + { FRAC_CONST(0.935047621163287), FRAC_CONST(0.354522137752887) }, + { FRAC_CONST(0.933955562060987), FRAC_CONST(0.357389154977241) }, + { FRAC_CONST(0.932854712213241), FRAC_CONST(0.360252808318757) }, + { FRAC_CONST(0.931745081981669), FRAC_CONST(0.363113070823639) }, + { FRAC_CONST(0.930626681810532), FRAC_CONST(0.365969915570009) }, + { FRAC_CONST(0.929499522226639), FRAC_CONST(0.368823315668154) }, + { FRAC_CONST(0.928363613839244), FRAC_CONST(0.371673244260787) }, + { FRAC_CONST(0.927218967339952), FRAC_CONST(0.374519674523293) }, + { FRAC_CONST(0.926065593502609), FRAC_CONST(0.377362579663988) }, + { FRAC_CONST(0.924903503183211), FRAC_CONST(0.380201932924366) }, + { FRAC_CONST(0.923732707319793), FRAC_CONST(0.383037707579352) }, + { FRAC_CONST(0.922553216932333), FRAC_CONST(0.385869876937555) }, + { FRAC_CONST(0.921365043122642), FRAC_CONST(0.388698414341519) }, + { FRAC_CONST(0.920168197074266), FRAC_CONST(0.391523293167972) }, + { FRAC_CONST(0.918962690052376), FRAC_CONST(0.394344486828080) }, + { FRAC_CONST(0.917748533403661), FRAC_CONST(0.397161968767692) }, + { FRAC_CONST(0.916525738556228), FRAC_CONST(0.399975712467595) }, + { FRAC_CONST(0.915294317019487), FRAC_CONST(0.402785691443764) }, + { FRAC_CONST(0.914054280384047), FRAC_CONST(0.405591879247604) }, + { FRAC_CONST(0.912805640321604), FRAC_CONST(0.408394249466208) }, + { FRAC_CONST(0.911548408584834), FRAC_CONST(0.411192775722600) }, + { FRAC_CONST(0.910282597007282), FRAC_CONST(0.413987431675985) }, + { FRAC_CONST(0.909008217503247), FRAC_CONST(0.416778191021998) }, + { FRAC_CONST(0.907725282067676), FRAC_CONST(0.419565027492947) }, + { FRAC_CONST(0.906433802776045), FRAC_CONST(0.422347914858067) }, + { FRAC_CONST(0.905133791784250), FRAC_CONST(0.425126826923762) }, + { FRAC_CONST(0.903825261328488), FRAC_CONST(0.427901737533854) }, + { FRAC_CONST(0.902508223725146), FRAC_CONST(0.430672620569827) }, + { FRAC_CONST(0.901182691370685), FRAC_CONST(0.433439449951074) }, + { FRAC_CONST(0.899848676741519), FRAC_CONST(0.436202199635144) }, + { FRAC_CONST(0.898506192393902), FRAC_CONST(0.438960843617984) }, + { FRAC_CONST(0.897155250963809), FRAC_CONST(0.441715355934187) }, + { FRAC_CONST(0.895795865166814), FRAC_CONST(0.444465710657234) }, + { FRAC_CONST(0.894428047797974), FRAC_CONST(0.447211881899738) }, + { FRAC_CONST(0.893051811731707), FRAC_CONST(0.449953843813691) }, + { FRAC_CONST(0.891667169921672), FRAC_CONST(0.452691570590701) }, + { FRAC_CONST(0.890274135400645), FRAC_CONST(0.455425036462242) }, + { FRAC_CONST(0.888872721280396), FRAC_CONST(0.458154215699893) }, + { FRAC_CONST(0.887462940751569), FRAC_CONST(0.460879082615579) }, + { FRAC_CONST(0.886044807083556), FRAC_CONST(0.463599611561814) }, + { FRAC_CONST(0.884618333624370), FRAC_CONST(0.466315776931944) }, + { FRAC_CONST(0.883183533800523), FRAC_CONST(0.469027553160387) }, + { FRAC_CONST(0.881740421116898), FRAC_CONST(0.471734914722871) }, + { FRAC_CONST(0.880289009156621), FRAC_CONST(0.474437836136679) }, + { FRAC_CONST(0.878829311580933), FRAC_CONST(0.477136291960885) }, + { FRAC_CONST(0.877361342129065), FRAC_CONST(0.479830256796594) }, + { FRAC_CONST(0.875885114618104), FRAC_CONST(0.482519705287184) }, + { FRAC_CONST(0.874400642942865), FRAC_CONST(0.485204612118542) }, + { FRAC_CONST(0.872907941075761), FRAC_CONST(0.487884952019301) }, + { FRAC_CONST(0.871407023066671), FRAC_CONST(0.490560699761082) }, + { FRAC_CONST(0.869897903042806), FRAC_CONST(0.493231830158728) }, + { FRAC_CONST(0.868380595208580), FRAC_CONST(0.495898318070542) }, + { FRAC_CONST(0.866855113845470), FRAC_CONST(0.498560138398525) }, + { FRAC_CONST(0.865321473311890), FRAC_CONST(0.501217266088610) }, + { FRAC_CONST(0.863779688043047), FRAC_CONST(0.503869676130899) }, + { FRAC_CONST(0.862229772550811), FRAC_CONST(0.506517343559899) }, + { FRAC_CONST(0.860671741423578), FRAC_CONST(0.509160243454755) }, + { FRAC_CONST(0.859105609326130), FRAC_CONST(0.511798350939487) }, + { FRAC_CONST(0.857531390999499), FRAC_CONST(0.514431641183223) }, + { FRAC_CONST(0.855949101260827), FRAC_CONST(0.517060089400432) }, + { FRAC_CONST(0.854358755003227), FRAC_CONST(0.519683670851158) }, + { FRAC_CONST(0.852760367195645), FRAC_CONST(0.522302360841255) }, + { FRAC_CONST(0.851153952882715), FRAC_CONST(0.524916134722613) }, + { FRAC_CONST(0.849539527184621), FRAC_CONST(0.527524967893398) }, + { FRAC_CONST(0.847917105296951), FRAC_CONST(0.530128835798279) }, + { FRAC_CONST(0.846286702490560), FRAC_CONST(0.532727713928659) }, + { FRAC_CONST(0.844648334111418), FRAC_CONST(0.535321577822907) }, + { FRAC_CONST(0.843002015580473), FRAC_CONST(0.537910403066589) }, + { FRAC_CONST(0.841347762393502), FRAC_CONST(0.540494165292695) }, + { FRAC_CONST(0.839685590120966), FRAC_CONST(0.543072840181872) }, + { FRAC_CONST(0.838015514407864), FRAC_CONST(0.545646403462649) }, + { FRAC_CONST(0.836337550973584), FRAC_CONST(0.548214830911668) }, + { FRAC_CONST(0.834651715611756), FRAC_CONST(0.550778098353912) }, + { FRAC_CONST(0.832958024190107), FRAC_CONST(0.553336181662932) }, + { FRAC_CONST(0.831256492650303), FRAC_CONST(0.555889056761074) }, + { FRAC_CONST(0.829547137007809), FRAC_CONST(0.558436699619704) }, + { FRAC_CONST(0.827829973351730), FRAC_CONST(0.560979086259438) }, + { FRAC_CONST(0.826105017844665), FRAC_CONST(0.563516192750365) }, + { FRAC_CONST(0.824372286722551), FRAC_CONST(0.566047995212271) }, + { FRAC_CONST(0.822631796294515), FRAC_CONST(0.568574469814869) }, + { FRAC_CONST(0.820883562942715), FRAC_CONST(0.571095592778017) }, + { FRAC_CONST(0.819127603122188), FRAC_CONST(0.573611340371945) }, + { FRAC_CONST(0.817363933360698), FRAC_CONST(0.576121688917478) }, + { FRAC_CONST(0.815592570258577), FRAC_CONST(0.578626614786261) }, + { FRAC_CONST(0.813813530488567), FRAC_CONST(0.581126094400978) }, + { FRAC_CONST(0.812026830795670), FRAC_CONST(0.583620104235573) }, + { FRAC_CONST(0.810232487996982), FRAC_CONST(0.586108620815476) }, + { FRAC_CONST(0.808430518981543), FRAC_CONST(0.588591620717823) }, + { FRAC_CONST(0.806620940710170), FRAC_CONST(0.591069080571671) }, + { FRAC_CONST(0.804803770215303), FRAC_CONST(0.593540977058226) }, + { FRAC_CONST(0.802979024600843), FRAC_CONST(0.596007286911057) }, + { FRAC_CONST(0.801146721041991), FRAC_CONST(0.598467986916314) }, + { FRAC_CONST(0.799306876785086), FRAC_CONST(0.600923053912954) }, + { FRAC_CONST(0.797459509147442), FRAC_CONST(0.603372464792950) }, + { FRAC_CONST(0.795604635517188), FRAC_CONST(0.605816196501515) }, + { FRAC_CONST(0.793742273353100), FRAC_CONST(0.608254226037314) }, + { FRAC_CONST(0.791872440184440), FRAC_CONST(0.610686530452686) }, + { FRAC_CONST(0.789995153610791), FRAC_CONST(0.613113086853855) }, + { FRAC_CONST(0.788110431301888), FRAC_CONST(0.615533872401147) }, + { FRAC_CONST(0.786218290997456), FRAC_CONST(0.617948864309208) }, + { FRAC_CONST(0.784318750507039), FRAC_CONST(0.620358039847214) }, + { FRAC_CONST(0.782411827709837), FRAC_CONST(0.622761376339086) }, + { FRAC_CONST(0.780497540554532), FRAC_CONST(0.625158851163708) }, + { FRAC_CONST(0.778575907059125), FRAC_CONST(0.627550441755132) }, + { FRAC_CONST(0.776646945310762), FRAC_CONST(0.629936125602796) }, + { FRAC_CONST(0.774710673465566), FRAC_CONST(0.632315880251738) }, + { FRAC_CONST(0.772767109748464), FRAC_CONST(0.634689683302798) }, + { FRAC_CONST(0.770816272453019), FRAC_CONST(0.637057512412839) }, + { FRAC_CONST(0.768858179941253), FRAC_CONST(0.639419345294951) }, + { FRAC_CONST(0.766892850643481), FRAC_CONST(0.641775159718664) }, + { FRAC_CONST(0.764920303058128), FRAC_CONST(0.644124933510155) }, + { FRAC_CONST(0.762940555751566), FRAC_CONST(0.646468644552458) }, + { FRAC_CONST(0.760953627357928), FRAC_CONST(0.648806270785673) }, + { FRAC_CONST(0.758959536578942), FRAC_CONST(0.651137790207170) }, + { FRAC_CONST(0.756958302183750), FRAC_CONST(0.653463180871802) }, + { FRAC_CONST(0.754949943008733), FRAC_CONST(0.655782420892106) }, + { FRAC_CONST(0.752934477957330), FRAC_CONST(0.658095488438511) }, + { FRAC_CONST(0.750911925999868), FRAC_CONST(0.660402361739545) }, + { FRAC_CONST(0.748882306173375), FRAC_CONST(0.662703019082037) }, + { FRAC_CONST(0.746845637581407), FRAC_CONST(0.664997438811325) }, + { FRAC_CONST(0.744801939393863), FRAC_CONST(0.667285599331456) }, + { FRAC_CONST(0.742751230846809), FRAC_CONST(0.669567479105392) }, + { FRAC_CONST(0.740693531242296), FRAC_CONST(0.671843056655212) }, + { FRAC_CONST(0.738628859948175), FRAC_CONST(0.674112310562312) }, + { FRAC_CONST(0.736557236397919), FRAC_CONST(0.676375219467612) }, + { FRAC_CONST(0.734478680090438), FRAC_CONST(0.678631762071749) }, + { FRAC_CONST(0.732393210589896), FRAC_CONST(0.680881917135287) }, + { FRAC_CONST(0.730300847525525), FRAC_CONST(0.683125663478909) }, + { FRAC_CONST(0.728201610591445), FRAC_CONST(0.685362979983619) }, + { FRAC_CONST(0.726095519546471), FRAC_CONST(0.687593845590942) }, + { FRAC_CONST(0.723982594213936), FRAC_CONST(0.689818239303122) }, + { FRAC_CONST(0.721862854481496), FRAC_CONST(0.692036140183319) }, + { FRAC_CONST(0.719736320300951), FRAC_CONST(0.694247527355803) }, + { FRAC_CONST(0.717603011688049), FRAC_CONST(0.696452380006158) }, + { FRAC_CONST(0.715462948722304), FRAC_CONST(0.698650677381469) }, + { FRAC_CONST(0.713316151546803), FRAC_CONST(0.700842398790526) }, + { FRAC_CONST(0.711162640368018), FRAC_CONST(0.703027523604011) }, + { FRAC_CONST(0.709002435455618), FRAC_CONST(0.705206031254698) }, + { FRAC_CONST(0.706835557142274), FRAC_CONST(0.707377901237642) }, + { FRAC_CONST(0.704662025823469), FRAC_CONST(0.709543113110377) }, + { FRAC_CONST(0.702481861957308), FRAC_CONST(0.711701646493103) }, + { FRAC_CONST(0.700295086064324), FRAC_CONST(0.713853481068882) }, + { FRAC_CONST(0.698101718727284), FRAC_CONST(0.715998596583829) }, + { FRAC_CONST(0.695901780590997), FRAC_CONST(0.718136972847297) }, + { FRAC_CONST(0.693695292362118), FRAC_CONST(0.720268589732077) }, + { FRAC_CONST(0.691482274808956), FRAC_CONST(0.722393427174578) }, + { FRAC_CONST(0.689262748761273), FRAC_CONST(0.724511465175020) }, + { FRAC_CONST(0.687036735110096), FRAC_CONST(0.726622683797623) }, + { FRAC_CONST(0.684804254807511), FRAC_CONST(0.728727063170794) }, + { FRAC_CONST(0.682565328866473), FRAC_CONST(0.730824583487312) }, + { FRAC_CONST(0.680319978360607), FRAC_CONST(0.732915225004518) }, + { FRAC_CONST(0.678068224424007), FRAC_CONST(0.734998968044497) }, + { FRAC_CONST(0.675810088251037), FRAC_CONST(0.737075792994266) }, + { FRAC_CONST(0.673545591096136), FRAC_CONST(0.739145680305957) }, + { FRAC_CONST(0.671274754273613), FRAC_CONST(0.741208610497004) }, + { FRAC_CONST(0.668997599157450), FRAC_CONST(0.743264564150321) }, + { FRAC_CONST(0.666714147181098), FRAC_CONST(0.745313521914490) }, + { FRAC_CONST(0.664424419837275), FRAC_CONST(0.747355464503940) }, + { FRAC_CONST(0.662128438677769), FRAC_CONST(0.749390372699130) }, + { FRAC_CONST(0.659826225313227), FRAC_CONST(0.751418227346727) }, + { FRAC_CONST(0.657517801412960), FRAC_CONST(0.753439009359794) }, + { FRAC_CONST(0.655203188704732), FRAC_CONST(0.755452699717958) }, + { FRAC_CONST(0.652882408974559), FRAC_CONST(0.757459279467601) }, + { FRAC_CONST(0.650555484066504), FRAC_CONST(0.759458729722028) }, + { FRAC_CONST(0.648222435882470), FRAC_CONST(0.761451031661654) }, + { FRAC_CONST(0.645883286381996), FRAC_CONST(0.763436166534172) }, + { FRAC_CONST(0.643538057582048), FRAC_CONST(0.765414115654738) }, + { FRAC_CONST(0.641186771556811), FRAC_CONST(0.767384860406142) }, + { FRAC_CONST(0.638829450437486), FRAC_CONST(0.769348382238982) }, + { FRAC_CONST(0.636466116412077), FRAC_CONST(0.771304662671845) }, + { FRAC_CONST(0.634096791725184), FRAC_CONST(0.773253683291473) }, + { FRAC_CONST(0.631721498677792), FRAC_CONST(0.775195425752941) }, + { FRAC_CONST(0.629340259627066), FRAC_CONST(0.777129871779832) }, + { FRAC_CONST(0.626953096986133), FRAC_CONST(0.779057003164401) }, + { FRAC_CONST(0.624560033223877), FRAC_CONST(0.780976801767754) }, + { FRAC_CONST(0.622161090864727), FRAC_CONST(0.782889249520015) }, + { FRAC_CONST(0.619756292488441), FRAC_CONST(0.784794328420499) }, + { FRAC_CONST(0.617345660729897), FRAC_CONST(0.786692020537877) }, + { FRAC_CONST(0.614929218278880), FRAC_CONST(0.788582308010347) }, + { FRAC_CONST(0.612506987879866), FRAC_CONST(0.790465173045805) }, + { FRAC_CONST(0.610078992331810), FRAC_CONST(0.792340597922007) }, + { FRAC_CONST(0.607645254487931), FRAC_CONST(0.794208564986741) }, + { FRAC_CONST(0.605205797255497), FRAC_CONST(0.796069056657988) }, + { FRAC_CONST(0.602760643595607), FRAC_CONST(0.797922055424093) }, + { FRAC_CONST(0.600309816522980), FRAC_CONST(0.799767543843926) }, + { FRAC_CONST(0.597853339105734), FRAC_CONST(0.801605504547046) }, + { FRAC_CONST(0.595391234465169), FRAC_CONST(0.803435920233868) }, + { FRAC_CONST(0.592923525775551), FRAC_CONST(0.805258773675822) }, + { FRAC_CONST(0.590450236263896), FRAC_CONST(0.807074047715518) }, + { FRAC_CONST(0.587971389209745), FRAC_CONST(0.808881725266904) }, + { FRAC_CONST(0.585487007944951), FRAC_CONST(0.810681789315431) }, + { FRAC_CONST(0.582997115853458), FRAC_CONST(0.812474222918210) }, + { FRAC_CONST(0.580501736371077), FRAC_CONST(0.814259009204175) }, + { FRAC_CONST(0.578000892985270), FRAC_CONST(0.816036131374237) }, + { FRAC_CONST(0.575494609234928), FRAC_CONST(0.817805572701444) }, + { FRAC_CONST(0.572982908710149), FRAC_CONST(0.819567316531142) }, + { FRAC_CONST(0.570465815052013), FRAC_CONST(0.821321346281127) }, + { FRAC_CONST(0.567943351952366), FRAC_CONST(0.823067645441802) }, + { FRAC_CONST(0.565415543153590), FRAC_CONST(0.824806197576334) }, + { FRAC_CONST(0.562882412448385), FRAC_CONST(0.826536986320810) }, + { FRAC_CONST(0.560343983679541), FRAC_CONST(0.828259995384386) }, + { FRAC_CONST(0.557800280739717), FRAC_CONST(0.829975208549444) }, + { FRAC_CONST(0.555251327571214), FRAC_CONST(0.831682609671745) }, + { FRAC_CONST(0.552697148165750), FRAC_CONST(0.833382182680580) }, + { FRAC_CONST(0.550137766564234), FRAC_CONST(0.835073911578919) }, + { FRAC_CONST(0.547573206856540), FRAC_CONST(0.836757780443567) }, + { FRAC_CONST(0.545003493181281), FRAC_CONST(0.838433773425308) }, + { FRAC_CONST(0.542428649725581), FRAC_CONST(0.840101874749058) }, + { FRAC_CONST(0.539848700724848), FRAC_CONST(0.841762068714012) }, + { FRAC_CONST(0.537263670462543), FRAC_CONST(0.843414339693793) }, + { FRAC_CONST(0.534673583269956), FRAC_CONST(0.845058672136595) }, + { FRAC_CONST(0.532078463525974), FRAC_CONST(0.846695050565337) }, + { FRAC_CONST(0.529478335656852), FRAC_CONST(0.848323459577802) }, + { FRAC_CONST(0.526873224135985), FRAC_CONST(0.849943883846782) }, + { FRAC_CONST(0.524263153483673), FRAC_CONST(0.851556308120229) }, + { FRAC_CONST(0.521648148266897), FRAC_CONST(0.853160717221390) }, + { FRAC_CONST(0.519028233099081), FRAC_CONST(0.854757096048957) }, + { FRAC_CONST(0.516403432639864), FRAC_CONST(0.856345429577204) }, + { FRAC_CONST(0.513773771594868), FRAC_CONST(0.857925702856130) }, + { FRAC_CONST(0.511139274715464), FRAC_CONST(0.859497901011602) }, + { FRAC_CONST(0.508499966798541), FRAC_CONST(0.861062009245491) }, + { FRAC_CONST(0.505855872686269), FRAC_CONST(0.862618012835817) }, + { FRAC_CONST(0.503207017265869), FRAC_CONST(0.864165897136879) }, + { FRAC_CONST(0.500553425469378), FRAC_CONST(0.865705647579402) }, + { FRAC_CONST(0.497895122273411), FRAC_CONST(0.867237249670668) }, + { FRAC_CONST(0.495232132698931), FRAC_CONST(0.868760688994655) }, + { FRAC_CONST(0.492564481811011), FRAC_CONST(0.870275951212172) }, + { FRAC_CONST(0.489892194718595), FRAC_CONST(0.871783022060993) }, + { FRAC_CONST(0.487215296574269), FRAC_CONST(0.873281887355994) }, + { FRAC_CONST(0.484533812574016), FRAC_CONST(0.874772532989284) }, + { FRAC_CONST(0.481847767956986), FRAC_CONST(0.876254944930338) }, + { FRAC_CONST(0.479157188005253), FRAC_CONST(0.877729109226132) }, + { FRAC_CONST(0.476462098043581), FRAC_CONST(0.879195012001267) }, + { FRAC_CONST(0.473762523439183), FRAC_CONST(0.880652639458111) }, + { FRAC_CONST(0.471058489601483), FRAC_CONST(0.882101977876918) }, + { FRAC_CONST(0.468350021981877), FRAC_CONST(0.883543013615962) }, + { FRAC_CONST(0.465637146073494), FRAC_CONST(0.884975733111667) }, + { FRAC_CONST(0.462919887410955), FRAC_CONST(0.886400122878730) }, + { FRAC_CONST(0.460198271570134), FRAC_CONST(0.887816169510255) }, + { FRAC_CONST(0.457472324167916), FRAC_CONST(0.889223859677868) }, + { FRAC_CONST(0.454742070861955), FRAC_CONST(0.890623180131856) }, + { FRAC_CONST(0.452007537350437), FRAC_CONST(0.892014117701280) }, + { FRAC_CONST(0.449268749371830), FRAC_CONST(0.893396659294108) }, + { FRAC_CONST(0.446525732704651), FRAC_CONST(0.894770791897330) }, + { FRAC_CONST(0.443778513167218), FRAC_CONST(0.896136502577087) }, + { FRAC_CONST(0.441027116617407), FRAC_CONST(0.897493778478790) }, + { FRAC_CONST(0.438271568952410), FRAC_CONST(0.898842606827242) }, + { FRAC_CONST(0.435511896108492), FRAC_CONST(0.900182974926757) }, + { FRAC_CONST(0.432748124060744), FRAC_CONST(0.901514870161279) }, + { FRAC_CONST(0.429980278822841), FRAC_CONST(0.902838279994503) }, + { FRAC_CONST(0.427208386446796), FRAC_CONST(0.904153191969992) }, + { FRAC_CONST(0.424432473022717), FRAC_CONST(0.905459593711293) }, + { FRAC_CONST(0.421652564678558), FRAC_CONST(0.906757472922057) }, + { FRAC_CONST(0.418868687579875), FRAC_CONST(0.908046817386148) }, + { FRAC_CONST(0.416080867929579), FRAC_CONST(0.909327614967767) }, + { FRAC_CONST(0.413289131967691), FRAC_CONST(0.910599853611559) }, + { FRAC_CONST(0.410493505971093), FRAC_CONST(0.911863521342729) }, + { FRAC_CONST(0.407694016253280), FRAC_CONST(0.913118606267154) }, + { FRAC_CONST(0.404890689164118), FRAC_CONST(0.914365096571498) }, + { FRAC_CONST(0.402083551089587), FRAC_CONST(0.915602980523320) }, + { FRAC_CONST(0.399272628451541), FRAC_CONST(0.916832246471184) }, + { FRAC_CONST(0.396457947707454), FRAC_CONST(0.918052882844770) }, + { FRAC_CONST(0.393639535350173), FRAC_CONST(0.919264878154985) }, + { FRAC_CONST(0.390817417907669), FRAC_CONST(0.920468220994067) }, + { FRAC_CONST(0.387991621942785), FRAC_CONST(0.921662900035695) }, + { FRAC_CONST(0.385162174052990), FRAC_CONST(0.922848904035094) }, + { FRAC_CONST(0.382329100870125), FRAC_CONST(0.924026221829144) }, + { FRAC_CONST(0.379492429060153), FRAC_CONST(0.925194842336480) }, + { FRAC_CONST(0.376652185322910), FRAC_CONST(0.926354754557603) }, + { FRAC_CONST(0.373808396391851), FRAC_CONST(0.927505947574975) }, + { FRAC_CONST(0.370961089033802), FRAC_CONST(0.928648410553131) }, + { FRAC_CONST(0.368110290048703), FRAC_CONST(0.929782132738772) }, + { FRAC_CONST(0.365256026269360), FRAC_CONST(0.930907103460875) }, + { FRAC_CONST(0.362398324561191), FRAC_CONST(0.932023312130786) }, + { FRAC_CONST(0.359537211821973), FRAC_CONST(0.933130748242325) }, + { FRAC_CONST(0.356672714981588), FRAC_CONST(0.934229401371881) }, + { FRAC_CONST(0.353804861001772), FRAC_CONST(0.935319261178512) }, + { FRAC_CONST(0.350933676875858), FRAC_CONST(0.936400317404042) }, + { FRAC_CONST(0.348059189628526), FRAC_CONST(0.937472559873159) }, + { FRAC_CONST(0.345181426315543), FRAC_CONST(0.938535978493509) }, + { FRAC_CONST(0.342300414023514), FRAC_CONST(0.939590563255789) }, + { FRAC_CONST(0.339416179869623), FRAC_CONST(0.940636304233848) }, + { FRAC_CONST(0.336528751001382), FRAC_CONST(0.941673191584771) }, + { FRAC_CONST(0.333638154596371), FRAC_CONST(0.942701215548982) }, + { FRAC_CONST(0.330744417861983), FRAC_CONST(0.943720366450326) }, + { FRAC_CONST(0.327847568035171), FRAC_CONST(0.944730634696168) }, + { FRAC_CONST(0.324947632382188), FRAC_CONST(0.945732010777477) }, + { FRAC_CONST(0.322044638198335), FRAC_CONST(0.946724485268921) }, + { FRAC_CONST(0.319138612807696), FRAC_CONST(0.947708048828952) }, + { FRAC_CONST(0.316229583562890), FRAC_CONST(0.948682692199895) }, + { FRAC_CONST(0.313317577844809), FRAC_CONST(0.949648406208035) }, + { FRAC_CONST(0.310402623062359), FRAC_CONST(0.950605181763705) }, + { FRAC_CONST(0.307484746652204), FRAC_CONST(0.951553009861369) }, + { FRAC_CONST(0.304563976078509), FRAC_CONST(0.952491881579706) }, + { FRAC_CONST(0.301640338832679), FRAC_CONST(0.953421788081700) }, + { FRAC_CONST(0.298713862433100), FRAC_CONST(0.954342720614716) }, + { FRAC_CONST(0.295784574424884), FRAC_CONST(0.955254670510587) }, + { FRAC_CONST(0.292852502379605), FRAC_CONST(0.956157629185692) }, + { FRAC_CONST(0.289917673895041), FRAC_CONST(0.957051588141041) }, + { FRAC_CONST(0.286980116594916), FRAC_CONST(0.957936538962351) }, + { FRAC_CONST(0.284039858128637), FRAC_CONST(0.958812473320129) }, + { FRAC_CONST(0.281096926171038), FRAC_CONST(0.959679382969747) }, + { FRAC_CONST(0.278151348422115), FRAC_CONST(0.960537259751520) }, + { FRAC_CONST(0.275203152606767), FRAC_CONST(0.961386095590786) }, + { FRAC_CONST(0.272252366474537), FRAC_CONST(0.962225882497979) }, + { FRAC_CONST(0.269299017799346), FRAC_CONST(0.963056612568704) }, + { FRAC_CONST(0.266343134379238), FRAC_CONST(0.963878277983814) }, + { FRAC_CONST(0.263384744036113), FRAC_CONST(0.964690871009481) }, + { FRAC_CONST(0.260423874615468), FRAC_CONST(0.965494383997270) }, + { FRAC_CONST(0.257460553986133), FRAC_CONST(0.966288809384210) }, + { FRAC_CONST(0.254494810040011), FRAC_CONST(0.967074139692867) }, + { FRAC_CONST(0.251526670691813), FRAC_CONST(0.967850367531414) }, + { FRAC_CONST(0.248556163878797), FRAC_CONST(0.968617485593698) }, + { FRAC_CONST(0.245583317560504), FRAC_CONST(0.969375486659311) }, + { FRAC_CONST(0.242608159718497), FRAC_CONST(0.970124363593660) }, + { FRAC_CONST(0.239630718356094), FRAC_CONST(0.970864109348029) }, + { FRAC_CONST(0.236651021498106), FRAC_CONST(0.971594716959650) }, + { FRAC_CONST(0.233669097190577), FRAC_CONST(0.972316179551765) }, + { FRAC_CONST(0.230684973500512), FRAC_CONST(0.973028490333694) }, + { FRAC_CONST(0.227698678515621), FRAC_CONST(0.973731642600896) }, + { FRAC_CONST(0.224710240344050), FRAC_CONST(0.974425629735035) }, + { FRAC_CONST(0.221719687114115), FRAC_CONST(0.975110445204039) }, + { FRAC_CONST(0.218727046974045), FRAC_CONST(0.975786082562164) }, + { FRAC_CONST(0.215732348091706), FRAC_CONST(0.976452535450054) }, + { FRAC_CONST(0.212735618654346), FRAC_CONST(0.977109797594801) }, + { FRAC_CONST(0.209736886868323), FRAC_CONST(0.977757862810003) }, + { FRAC_CONST(0.206736180958844), FRAC_CONST(0.978396724995823) }, + { FRAC_CONST(0.203733529169694), FRAC_CONST(0.979026378139048) }, + { FRAC_CONST(0.200728959762976), FRAC_CONST(0.979646816313141) }, + { FRAC_CONST(0.197722501018842), FRAC_CONST(0.980258033678304) }, + { FRAC_CONST(0.194714181235226), FRAC_CONST(0.980860024481524) }, + { FRAC_CONST(0.191704028727580), FRAC_CONST(0.981452783056636) }, + { FRAC_CONST(0.188692071828605), FRAC_CONST(0.982036303824369) }, + { FRAC_CONST(0.185678338887988), FRAC_CONST(0.982610581292405) }, + { FRAC_CONST(0.182662858272129), FRAC_CONST(0.983175610055424) }, + { FRAC_CONST(0.179645658363882), FRAC_CONST(0.983731384795162) }, + { FRAC_CONST(0.176626767562281), FRAC_CONST(0.984277900280454) }, + { FRAC_CONST(0.173606214282275), FRAC_CONST(0.984815151367289) }, + { FRAC_CONST(0.170584026954464), FRAC_CONST(0.985343132998855) }, + { FRAC_CONST(0.167560234024824), FRAC_CONST(0.985861840205587) }, + { FRAC_CONST(0.164534863954446), FRAC_CONST(0.986371268105216) }, + { FRAC_CONST(0.161507945219266), FRAC_CONST(0.986871411902812) }, + { FRAC_CONST(0.158479506309796), FRAC_CONST(0.987362266890832) }, + { FRAC_CONST(0.155449575730856), FRAC_CONST(0.987843828449162) }, + { FRAC_CONST(0.152418182001307), FRAC_CONST(0.988316092045160) }, + { FRAC_CONST(0.149385353653780), FRAC_CONST(0.988779053233702) }, + { FRAC_CONST(0.146351119234411), FRAC_CONST(0.989232707657220) }, + { FRAC_CONST(0.143315507302572), FRAC_CONST(0.989677051045747) }, + { FRAC_CONST(0.140278546430595), FRAC_CONST(0.990112079216954) }, + { FRAC_CONST(0.137240265203516), FRAC_CONST(0.990537788076189) }, + { FRAC_CONST(0.134200692218792), FRAC_CONST(0.990954173616519) }, + { FRAC_CONST(0.131159856086043), FRAC_CONST(0.991361231918763) }, + { FRAC_CONST(0.128117785426777), FRAC_CONST(0.991758959151536) }, + { FRAC_CONST(0.125074508874121), FRAC_CONST(0.992147351571276) }, + { FRAC_CONST(0.122030055072553), FRAC_CONST(0.992526405522286) }, + { FRAC_CONST(0.118984452677633), FRAC_CONST(0.992896117436766) }, + { FRAC_CONST(0.115937730355728), FRAC_CONST(0.993256483834846) }, + { FRAC_CONST(0.112889916783750), FRAC_CONST(0.993607501324622) }, + { FRAC_CONST(0.109841040648883), FRAC_CONST(0.993949166602181) }, + { FRAC_CONST(0.106791130648307), FRAC_CONST(0.994281476451642) }, + { FRAC_CONST(0.103740215488939), FRAC_CONST(0.994604427745176) }, + { FRAC_CONST(0.100688323887154), FRAC_CONST(0.994918017443043) }, + { FRAC_CONST(0.097635484568517), FRAC_CONST(0.995222242593618) }, + { FRAC_CONST(0.094581726267515), FRAC_CONST(0.995517100333418) }, + { FRAC_CONST(0.091527077727285), FRAC_CONST(0.995802587887129) }, + { FRAC_CONST(0.088471567699341), FRAC_CONST(0.996078702567634) }, + { FRAC_CONST(0.085415224943307), FRAC_CONST(0.996345441776036) }, + { FRAC_CONST(0.082358078226647), FRAC_CONST(0.996602803001684) }, + { FRAC_CONST(0.079300156324388), FRAC_CONST(0.996850783822197) }, + { FRAC_CONST(0.076241488018856), FRAC_CONST(0.997089381903483) }, + { FRAC_CONST(0.073182102099403), FRAC_CONST(0.997318594999769) }, + { FRAC_CONST(0.070122027362134), FRAC_CONST(0.997538420953611) }, + { FRAC_CONST(0.067061292609637), FRAC_CONST(0.997748857695926) }, + { FRAC_CONST(0.063999926650714), FRAC_CONST(0.997949903246001) }, + { FRAC_CONST(0.060937958300107), FRAC_CONST(0.998141555711521) }, + { FRAC_CONST(0.057875416378229), FRAC_CONST(0.998323813288578) }, + { FRAC_CONST(0.054812329710890), FRAC_CONST(0.998496674261695) }, + { FRAC_CONST(0.051748727129028), FRAC_CONST(0.998660137003838) }, + { FRAC_CONST(0.048684637468439), FRAC_CONST(0.998814199976435) }, + { FRAC_CONST(0.045620089569500), FRAC_CONST(0.998958861729386) }, + { FRAC_CONST(0.042555112276904), FRAC_CONST(0.999094120901079) }, + { FRAC_CONST(0.039489734439384), FRAC_CONST(0.999219976218404) }, + { FRAC_CONST(0.036423984909444), FRAC_CONST(0.999336426496761) }, + { FRAC_CONST(0.033357892543086), FRAC_CONST(0.999443470640078) }, + { FRAC_CONST(0.030291486199539), FRAC_CONST(0.999541107640813) }, + { FRAC_CONST(0.027224794740988), FRAC_CONST(0.999629336579970) }, + { FRAC_CONST(0.024157847032300), FRAC_CONST(0.999708156627105) }, + { FRAC_CONST(0.021090671940755), FRAC_CONST(0.999777567040333) }, + { FRAC_CONST(0.018023298335774), FRAC_CONST(0.999837567166337) }, + { FRAC_CONST(0.014955755088644), FRAC_CONST(0.999888156440373) }, + { FRAC_CONST(0.011888071072252), FRAC_CONST(0.999929334386276) }, + { FRAC_CONST(0.008820275160808), FRAC_CONST(0.999961100616463) }, + { FRAC_CONST(0.005752396229574), FRAC_CONST(0.999983454831938) }, + { FRAC_CONST(0.002684463154596), FRAC_CONST(0.999996396822294) } +}; + +/* 64 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_256[] = +{ + { FRAC_CONST(0.999995293809576), FRAC_CONST(0.003067956762966) }, + { FRAC_CONST(0.999618822495179), FRAC_CONST(0.027608145778966) }, + { FRAC_CONST(0.998640218180265), FRAC_CONST(0.052131704680283) }, + { FRAC_CONST(0.997060070339483), FRAC_CONST(0.076623861392031) }, + { FRAC_CONST(0.994879330794806), FRAC_CONST(0.101069862754828) }, + { FRAC_CONST(0.992099313142192), FRAC_CONST(0.125454983411546) }, + { FRAC_CONST(0.988721691960324), FRAC_CONST(0.149764534677322) }, + { FRAC_CONST(0.984748501801904), FRAC_CONST(0.173983873387464) }, + { FRAC_CONST(0.980182135968117), FRAC_CONST(0.198098410717954) }, + { FRAC_CONST(0.975025345066994), FRAC_CONST(0.222093620973204) }, + { FRAC_CONST(0.969281235356549), FRAC_CONST(0.245955050335795) }, + { FRAC_CONST(0.962953266873684), FRAC_CONST(0.269668325572915) }, + { FRAC_CONST(0.956045251349996), FRAC_CONST(0.293219162694259) }, + { FRAC_CONST(0.948561349915730), FRAC_CONST(0.316593375556166) }, + { FRAC_CONST(0.940506070593268), FRAC_CONST(0.339776884406827) }, + { FRAC_CONST(0.931884265581668), FRAC_CONST(0.362755724367397) }, + { FRAC_CONST(0.922701128333879), FRAC_CONST(0.385516053843919) }, + { FRAC_CONST(0.912962190428398), FRAC_CONST(0.408044162864979) }, + { FRAC_CONST(0.902673318237259), FRAC_CONST(0.430326481340083) }, + { FRAC_CONST(0.891840709392343), FRAC_CONST(0.452349587233771) }, + { FRAC_CONST(0.880470889052161), FRAC_CONST(0.474100214650550) }, + { FRAC_CONST(0.868570705971341), FRAC_CONST(0.495565261825773) }, + { FRAC_CONST(0.856147328375194), FRAC_CONST(0.516731799017650) }, + { FRAC_CONST(0.843208239641845), FRAC_CONST(0.537587076295645) }, + { FRAC_CONST(0.829761233794523), FRAC_CONST(0.558118531220556) }, + { FRAC_CONST(0.815814410806734), FRAC_CONST(0.578313796411656) }, + { FRAC_CONST(0.801376171723140), FRAC_CONST(0.598160706996342) }, + { FRAC_CONST(0.786455213599086), FRAC_CONST(0.617647307937804) }, + { FRAC_CONST(0.771060524261814), FRAC_CONST(0.636761861236284) }, + { FRAC_CONST(0.755201376896537), FRAC_CONST(0.655492852999615) }, + { FRAC_CONST(0.738887324460615), FRAC_CONST(0.673829000378756) }, + { FRAC_CONST(0.722128193929215), FRAC_CONST(0.691759258364158) }, + { FRAC_CONST(0.704934080375905), FRAC_CONST(0.709272826438866) }, + { FRAC_CONST(0.687315340891759), FRAC_CONST(0.726359155084346) }, + { FRAC_CONST(0.669282588346636), FRAC_CONST(0.743007952135122) }, + { FRAC_CONST(0.650846684996381), FRAC_CONST(0.759209188978388) }, + { FRAC_CONST(0.632018735939809), FRAC_CONST(0.774953106594874) }, + { FRAC_CONST(0.612810082429410), FRAC_CONST(0.790230221437310) }, + { FRAC_CONST(0.593232295039800), FRAC_CONST(0.805031331142964) }, + { FRAC_CONST(0.573297166698042), FRAC_CONST(0.819347520076797) }, + { FRAC_CONST(0.553016705580028), FRAC_CONST(0.833170164701913) }, + { FRAC_CONST(0.532403127877198), FRAC_CONST(0.846490938774052) }, + { FRAC_CONST(0.511468850437971), FRAC_CONST(0.859301818357008) }, + { FRAC_CONST(0.490226483288291), FRAC_CONST(0.871595086655951) }, + { FRAC_CONST(0.468688822035828), FRAC_CONST(0.883363338665732) }, + { FRAC_CONST(0.446868840162374), FRAC_CONST(0.894599485631383) }, + { FRAC_CONST(0.424779681209109), FRAC_CONST(0.905296759318119) }, + { FRAC_CONST(0.402434650859419), FRAC_CONST(0.915448716088268) }, + { FRAC_CONST(0.379847208924051), FRAC_CONST(0.925049240782678) }, + { FRAC_CONST(0.357030961233430), FRAC_CONST(0.934092550404259) }, + { FRAC_CONST(0.333999651442009), FRAC_CONST(0.942573197601447) }, + { FRAC_CONST(0.310767152749611), FRAC_CONST(0.950486073949482) }, + { FRAC_CONST(0.287347459544730), FRAC_CONST(0.957826413027533) }, + { FRAC_CONST(0.263754678974832), FRAC_CONST(0.964589793289813) }, + { FRAC_CONST(0.240003022448742), FRAC_CONST(0.970772140728950) }, + { FRAC_CONST(0.216106797076220), FRAC_CONST(0.976369731330021) }, + { FRAC_CONST(0.192080397049892), FRAC_CONST(0.981379193313755) }, + { FRAC_CONST(0.167938294974731), FRAC_CONST(0.985797509167567) }, + { FRAC_CONST(0.143695033150295), FRAC_CONST(0.989622017463201) }, + { FRAC_CONST(0.119365214810991), FRAC_CONST(0.992850414459865) }, + { FRAC_CONST(0.094963495329639), FRAC_CONST(0.995480755491927) }, + { FRAC_CONST(0.070504573389614), FRAC_CONST(0.997511456140303) }, + { FRAC_CONST(0.046003182130915), FRAC_CONST(0.998941293186857) }, + { FRAC_CONST(0.021474080275470), FRAC_CONST(0.999769405351215) } +}; + +#ifdef LD_DEC +/* 256 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_1024[] = +{ + { FRAC_CONST(0.999999705862882), FRAC_CONST(0.000766990318743) }, + { FRAC_CONST(0.999976174986898), FRAC_CONST(0.006902858724730) }, + { FRAC_CONST(0.999914995573113), FRAC_CONST(0.013038467241987) }, + { FRAC_CONST(0.999816169924900), FRAC_CONST(0.019173584868323) }, + { FRAC_CONST(0.999679701762988), FRAC_CONST(0.025307980620025) }, + { FRAC_CONST(0.999505596225325), FRAC_CONST(0.031441423540560) }, + { FRAC_CONST(0.999293859866888), FRAC_CONST(0.037573682709270) }, + { FRAC_CONST(0.999044500659429), FRAC_CONST(0.043704527250063) }, + { FRAC_CONST(0.998757527991183), FRAC_CONST(0.049833726340107) }, + { FRAC_CONST(0.998432952666508), FRAC_CONST(0.055961049218521) }, + { FRAC_CONST(0.998070786905482), FRAC_CONST(0.062086265195060) }, + { FRAC_CONST(0.997671044343441), FRAC_CONST(0.068209143658806) }, + { FRAC_CONST(0.997233740030466), FRAC_CONST(0.074329454086846) }, + { FRAC_CONST(0.996758890430818), FRAC_CONST(0.080446966052950) }, + { FRAC_CONST(0.996246513422316), FRAC_CONST(0.086561449236251) }, + { FRAC_CONST(0.995696628295664), FRAC_CONST(0.092672673429913) }, + { FRAC_CONST(0.995109255753726), FRAC_CONST(0.098780408549800) }, + { FRAC_CONST(0.994484417910748), FRAC_CONST(0.104884424643135) }, + { FRAC_CONST(0.993822138291520), FRAC_CONST(0.110984491897163) }, + { FRAC_CONST(0.993122441830496), FRAC_CONST(0.117080380647801) }, + { FRAC_CONST(0.992385354870852), FRAC_CONST(0.123171861388280) }, + { FRAC_CONST(0.991610905163495), FRAC_CONST(0.129258704777796) }, + { FRAC_CONST(0.990799121866020), FRAC_CONST(0.135340681650134) }, + { FRAC_CONST(0.989950035541609), FRAC_CONST(0.141417563022303) }, + { FRAC_CONST(0.989063678157882), FRAC_CONST(0.147489120103154) }, + { FRAC_CONST(0.988140083085693), FRAC_CONST(0.153555124301993) }, + { FRAC_CONST(0.987179285097874), FRAC_CONST(0.159615347237193) }, + { FRAC_CONST(0.986181320367928), FRAC_CONST(0.165669560744784) }, + { FRAC_CONST(0.985146226468662), FRAC_CONST(0.171717536887050) }, + { FRAC_CONST(0.984074042370776), FRAC_CONST(0.177759047961107) }, + { FRAC_CONST(0.982964808441396), FRAC_CONST(0.183793866507478) }, + { FRAC_CONST(0.981818566442553), FRAC_CONST(0.189821765318656) }, + { FRAC_CONST(0.980635359529608), FRAC_CONST(0.195842517447658) }, + { FRAC_CONST(0.979415232249635), FRAC_CONST(0.201855896216568) }, + { FRAC_CONST(0.978158230539735), FRAC_CONST(0.207861675225075) }, + { FRAC_CONST(0.976864401725313), FRAC_CONST(0.213859628358994) }, + { FRAC_CONST(0.975533794518291), FRAC_CONST(0.219849529798779) }, + { FRAC_CONST(0.974166459015280), FRAC_CONST(0.225831154028026) }, + { FRAC_CONST(0.972762446695689), FRAC_CONST(0.231804275841965) }, + { FRAC_CONST(0.971321810419786), FRAC_CONST(0.237768670355934) }, + { FRAC_CONST(0.969844604426715), FRAC_CONST(0.243724113013852) }, + { FRAC_CONST(0.968330884332445), FRAC_CONST(0.249670379596669) }, + { FRAC_CONST(0.966780707127683), FRAC_CONST(0.255607246230807) }, + { FRAC_CONST(0.965194131175725), FRAC_CONST(0.261534489396596) }, + { FRAC_CONST(0.963571216210257), FRAC_CONST(0.267451885936678) }, + { FRAC_CONST(0.961912023333112), FRAC_CONST(0.273359213064419) }, + { FRAC_CONST(0.960216615011963), FRAC_CONST(0.279256248372291) }, + { FRAC_CONST(0.958485055077976), FRAC_CONST(0.285142769840249) }, + { FRAC_CONST(0.956717408723403), FRAC_CONST(0.291018555844085) }, + { FRAC_CONST(0.954913742499131), FRAC_CONST(0.296883385163778) }, + { FRAC_CONST(0.953074124312172), FRAC_CONST(0.302737036991819) }, + { FRAC_CONST(0.951198623423113), FRAC_CONST(0.308579290941525) }, + { FRAC_CONST(0.949287310443502), FRAC_CONST(0.314409927055337) }, + { FRAC_CONST(0.947340257333192), FRAC_CONST(0.320228725813100) }, + { FRAC_CONST(0.945357537397632), FRAC_CONST(0.326035468140330) }, + { FRAC_CONST(0.943339225285108), FRAC_CONST(0.331829935416461) }, + { FRAC_CONST(0.941285396983929), FRAC_CONST(0.337611909483075) }, + { FRAC_CONST(0.939196129819570), FRAC_CONST(0.343381172652115) }, + { FRAC_CONST(0.937071502451759), FRAC_CONST(0.349137507714085) }, + { FRAC_CONST(0.934911594871516), FRAC_CONST(0.354880697946223) }, + { FRAC_CONST(0.932716488398140), FRAC_CONST(0.360610527120662) }, + { FRAC_CONST(0.930486265676150), FRAC_CONST(0.366326779512574) }, + { FRAC_CONST(0.928221010672169), FRAC_CONST(0.372029239908285) }, + { FRAC_CONST(0.925920808671770), FRAC_CONST(0.377717693613386) }, + { FRAC_CONST(0.923585746276257), FRAC_CONST(0.383391926460809) }, + { FRAC_CONST(0.921215911399409), FRAC_CONST(0.389051724818894) }, + { FRAC_CONST(0.918811393264170), FRAC_CONST(0.394696875599434) }, + { FRAC_CONST(0.916372282399289), FRAC_CONST(0.400327166265690) }, + { FRAC_CONST(0.913898670635912), FRAC_CONST(0.405942384840403) }, + { FRAC_CONST(0.911390651104122), FRAC_CONST(0.411542319913765) }, + { FRAC_CONST(0.908848318229439), FRAC_CONST(0.417126760651388) }, + { FRAC_CONST(0.906271767729258), FRAC_CONST(0.422695496802233) }, + { FRAC_CONST(0.903661096609248), FRAC_CONST(0.428248318706532) }, + { FRAC_CONST(0.901016403159702), FRAC_CONST(0.433785017303679) }, + { FRAC_CONST(0.898337786951834), FRAC_CONST(0.439305384140100) }, + { FRAC_CONST(0.895625348834030), FRAC_CONST(0.444809211377105) }, + { FRAC_CONST(0.892879190928052), FRAC_CONST(0.450296291798709) }, + { FRAC_CONST(0.890099416625192), FRAC_CONST(0.455766418819435) }, + { FRAC_CONST(0.887286130582383), FRAC_CONST(0.461219386492092) }, + { FRAC_CONST(0.884439438718254), FRAC_CONST(0.466654989515531) }, + { FRAC_CONST(0.881559448209144), FRAC_CONST(0.472073023242369) }, + { FRAC_CONST(0.878646267485068), FRAC_CONST(0.477473283686698) }, + { FRAC_CONST(0.875700006225635), FRAC_CONST(0.482855567531766) }, + { FRAC_CONST(0.872720775355914), FRAC_CONST(0.488219672137627) }, + { FRAC_CONST(0.869708687042266), FRAC_CONST(0.493565395548775) }, + { FRAC_CONST(0.866663854688111), FRAC_CONST(0.498892536501745) }, + { FRAC_CONST(0.863586392929668), FRAC_CONST(0.504200894432690) }, + { FRAC_CONST(0.860476417631632), FRAC_CONST(0.509490269484936) }, + { FRAC_CONST(0.857334045882816), FRAC_CONST(0.514760462516501) }, + { FRAC_CONST(0.854159395991739), FRAC_CONST(0.520011275107596) }, + { FRAC_CONST(0.850952587482176), FRAC_CONST(0.525242509568095) }, + { FRAC_CONST(0.847713741088654), FRAC_CONST(0.530453968944976) }, + { FRAC_CONST(0.844442978751911), FRAC_CONST(0.535645457029741) }, + { FRAC_CONST(0.841140423614298), FRAC_CONST(0.540816778365797) }, + { FRAC_CONST(0.837806200015151), FRAC_CONST(0.545967738255818) }, + { FRAC_CONST(0.834440433486103), FRAC_CONST(0.551098142769075) }, + { FRAC_CONST(0.831043250746362), FRAC_CONST(0.556207798748740) }, + { FRAC_CONST(0.827614779697938), FRAC_CONST(0.561296513819151) }, + { FRAC_CONST(0.824155149420829), FRAC_CONST(0.566364096393064) }, + { FRAC_CONST(0.820664490168157), FRAC_CONST(0.571410355678857) }, + { FRAC_CONST(0.817142933361273), FRAC_CONST(0.576435101687722) }, + { FRAC_CONST(0.813590611584799), FRAC_CONST(0.581438145240810) }, + { FRAC_CONST(0.810007658581641), FRAC_CONST(0.586419297976361) }, + { FRAC_CONST(0.806394209247956), FRAC_CONST(0.591378372356788) }, + { FRAC_CONST(0.802750399628069), FRAC_CONST(0.596315181675744) }, + { FRAC_CONST(0.799076366909352), FRAC_CONST(0.601229540065149) }, + { FRAC_CONST(0.795372249417061), FRAC_CONST(0.606121262502186) }, + { FRAC_CONST(0.791638186609126), FRAC_CONST(0.610990164816272) }, + { FRAC_CONST(0.787874319070900), FRAC_CONST(0.615836063695985) }, + { FRAC_CONST(0.784080788509870), FRAC_CONST(0.620658776695972) }, + { FRAC_CONST(0.780257737750317), FRAC_CONST(0.625458122243814) }, + { FRAC_CONST(0.776405310727940), FRAC_CONST(0.630233919646864) }, + { FRAC_CONST(0.772523652484441), FRAC_CONST(0.634985989099049) }, + { FRAC_CONST(0.768612909162058), FRAC_CONST(0.639714151687640) }, + { FRAC_CONST(0.764673227998067), FRAC_CONST(0.644418229399988) }, + { FRAC_CONST(0.760704757319237), FRAC_CONST(0.649098045130226) }, + { FRAC_CONST(0.756707646536246), FRAC_CONST(0.653753422685936) }, + { FRAC_CONST(0.752682046138055), FRAC_CONST(0.658384186794785) }, + { FRAC_CONST(0.748628107686245), FRAC_CONST(0.662990163111121) }, + { FRAC_CONST(0.744545983809307), FRAC_CONST(0.667571178222540) }, + { FRAC_CONST(0.740435828196898), FRAC_CONST(0.672127059656412) }, + { FRAC_CONST(0.736297795594053), FRAC_CONST(0.676657635886375) }, + { FRAC_CONST(0.732132041795361), FRAC_CONST(0.681162736338795) }, + { FRAC_CONST(0.727938723639099), FRAC_CONST(0.685642191399187) }, + { FRAC_CONST(0.723717999001324), FRAC_CONST(0.690095832418600) }, + { FRAC_CONST(0.719470026789933), FRAC_CONST(0.694523491719966) }, + { FRAC_CONST(0.715194966938680), FRAC_CONST(0.698925002604414) }, + { FRAC_CONST(0.710892980401152), FRAC_CONST(0.703300199357549) }, + { FRAC_CONST(0.706564229144710), FRAC_CONST(0.707648917255684) }, + { FRAC_CONST(0.702208876144392), FRAC_CONST(0.711970992572050) }, + { FRAC_CONST(0.697827085376777), FRAC_CONST(0.716266262582953) }, + { FRAC_CONST(0.693419021813812), FRAC_CONST(0.720534565573905) }, + { FRAC_CONST(0.688984851416597), FRAC_CONST(0.724775740845711) }, + { FRAC_CONST(0.684524741129142), FRAC_CONST(0.728989628720519) }, + { FRAC_CONST(0.680038858872079), FRAC_CONST(0.733176070547833) }, + { FRAC_CONST(0.675527373536339), FRAC_CONST(0.737334908710483) }, + { FRAC_CONST(0.670990454976794), FRAC_CONST(0.741465986630563) }, + { FRAC_CONST(0.666428274005865), FRAC_CONST(0.745569148775325) }, + { FRAC_CONST(0.661841002387087), FRAC_CONST(0.749644240663033) }, + { FRAC_CONST(0.657228812828643), FRAC_CONST(0.753691108868781) }, + { FRAC_CONST(0.652591878976863), FRAC_CONST(0.757709601030268) }, + { FRAC_CONST(0.647930375409685), FRAC_CONST(0.761699565853535) }, + { FRAC_CONST(0.643244477630086), FRAC_CONST(0.765660853118662) }, + { FRAC_CONST(0.638534362059467), FRAC_CONST(0.769593313685423) }, + { FRAC_CONST(0.633800206031017), FRAC_CONST(0.773496799498899) }, + { FRAC_CONST(0.629042187783036), FRAC_CONST(0.777371163595056) }, + { FRAC_CONST(0.624260486452221), FRAC_CONST(0.781216260106276) }, + { FRAC_CONST(0.619455282066924), FRAC_CONST(0.785031944266848) }, + { FRAC_CONST(0.614626755540375), FRAC_CONST(0.788818072418420) }, + { FRAC_CONST(0.609775088663868), FRAC_CONST(0.792574502015408) }, + { FRAC_CONST(0.604900464099920), FRAC_CONST(0.796301091630359) }, + { FRAC_CONST(0.600003065375389), FRAC_CONST(0.799997700959282) }, + { FRAC_CONST(0.595083076874570), FRAC_CONST(0.803664190826924) }, + { FRAC_CONST(0.590140683832249), FRAC_CONST(0.807300423192014) }, + { FRAC_CONST(0.585176072326730), FRAC_CONST(0.810906261152460) }, + { FRAC_CONST(0.580189429272832), FRAC_CONST(0.814481568950499) }, + { FRAC_CONST(0.575180942414845), FRAC_CONST(0.818026211977813) }, + { FRAC_CONST(0.570150800319470), FRAC_CONST(0.821540056780598) }, + { FRAC_CONST(0.565099192368714), FRAC_CONST(0.825022971064580) }, + { FRAC_CONST(0.560026308752760), FRAC_CONST(0.828474823700007) }, + { FRAC_CONST(0.554932340462810), FRAC_CONST(0.831895484726578) }, + { FRAC_CONST(0.549817479283891), FRAC_CONST(0.835284825358337) }, + { FRAC_CONST(0.544681917787635), FRAC_CONST(0.838642717988527) }, + { FRAC_CONST(0.539525849325029), FRAC_CONST(0.841969036194388) }, + { FRAC_CONST(0.534349468019138), FRAC_CONST(0.845263654741918) }, + { FRAC_CONST(0.529152968757791), FRAC_CONST(0.848526449590593) }, + { FRAC_CONST(0.523936547186249), FRAC_CONST(0.851757297898029) }, + { FRAC_CONST(0.518700399699835), FRAC_CONST(0.854956078024615) }, + { FRAC_CONST(0.513444723436544), FRAC_CONST(0.858122669538086) }, + { FRAC_CONST(0.508169716269615), FRAC_CONST(0.861256953218062) }, + { FRAC_CONST(0.502875576800087), FRAC_CONST(0.864358811060534) }, + { FRAC_CONST(0.497562504349319), FRAC_CONST(0.867428126282307) }, + { FRAC_CONST(0.492230698951486), FRAC_CONST(0.870464783325398) }, + { FRAC_CONST(0.486880361346047), FRAC_CONST(0.873468667861385) }, + { FRAC_CONST(0.481511692970190), FRAC_CONST(0.876439666795714) }, + { FRAC_CONST(0.476124895951244), FRAC_CONST(0.879377668271953) }, + { FRAC_CONST(0.470720173099072), FRAC_CONST(0.882282561676009) }, + { FRAC_CONST(0.465297727898435), FRAC_CONST(0.885154237640285) }, + { FRAC_CONST(0.459857764501330), FRAC_CONST(0.887992588047806) }, + { FRAC_CONST(0.454400487719304), FRAC_CONST(0.890797506036281) }, + { FRAC_CONST(0.448926103015743), FRAC_CONST(0.893568886002136) }, + { FRAC_CONST(0.443434816498138), FRAC_CONST(0.896306623604480) }, + { FRAC_CONST(0.437926834910323), FRAC_CONST(0.899010615769039) }, + { FRAC_CONST(0.432402365624690), FRAC_CONST(0.901680760692038) }, + { FRAC_CONST(0.426861616634386), FRAC_CONST(0.904316957844028) }, + { FRAC_CONST(0.421304796545480), FRAC_CONST(0.906919107973678) }, + { FRAC_CONST(0.415732114569105), FRAC_CONST(0.909487113111505) }, + { FRAC_CONST(0.410143780513590), FRAC_CONST(0.912020876573568) }, + { FRAC_CONST(0.404540004776553), FRAC_CONST(0.914520302965104) }, + { FRAC_CONST(0.398920998336983), FRAC_CONST(0.916985298184123) }, + { FRAC_CONST(0.393286972747297), FRAC_CONST(0.919415769424947) }, + { FRAC_CONST(0.387638140125373), FRAC_CONST(0.921811625181708) }, + { FRAC_CONST(0.381974713146567), FRAC_CONST(0.924172775251791) }, + { FRAC_CONST(0.376296905035705), FRAC_CONST(0.926499130739231) }, + { FRAC_CONST(0.370604929559052), FRAC_CONST(0.928790604058057) }, + { FRAC_CONST(0.364899001016267), FRAC_CONST(0.931047108935595) }, + { FRAC_CONST(0.359179334232337), FRAC_CONST(0.933268560415712) }, + { FRAC_CONST(0.353446144549481), FRAC_CONST(0.935454874862015) }, + { FRAC_CONST(0.347699647819051), FRAC_CONST(0.937605969961000) }, + { FRAC_CONST(0.341940060393402), FRAC_CONST(0.939721764725153) }, + { FRAC_CONST(0.336167599117745), FRAC_CONST(0.941802179495998) }, + { FRAC_CONST(0.330382481321983), FRAC_CONST(0.943847135947093) }, + { FRAC_CONST(0.324584924812532), FRAC_CONST(0.945856557086984) }, + { FRAC_CONST(0.318775147864118), FRAC_CONST(0.947830367262101) }, + { FRAC_CONST(0.312953369211560), FRAC_CONST(0.949768492159607) }, + { FRAC_CONST(0.307119808041533), FRAC_CONST(0.951670858810194) }, + { FRAC_CONST(0.301274683984318), FRAC_CONST(0.953537395590833) }, + { FRAC_CONST(0.295418217105532), FRAC_CONST(0.955368032227470) }, + { FRAC_CONST(0.289550627897843), FRAC_CONST(0.957162699797670) }, + { FRAC_CONST(0.283672137272669), FRAC_CONST(0.958921330733213) }, + { FRAC_CONST(0.277782966551858), FRAC_CONST(0.960643858822638) }, + { FRAC_CONST(0.271883337459360), FRAC_CONST(0.962330219213737) }, + { FRAC_CONST(0.265973472112876), FRAC_CONST(0.963980348415994) }, + { FRAC_CONST(0.260053593015495), FRAC_CONST(0.965594184302977) }, + { FRAC_CONST(0.254123923047321), FRAC_CONST(0.967171666114677) }, + { FRAC_CONST(0.248184685457075), FRAC_CONST(0.968712734459795) }, + { FRAC_CONST(0.242236103853696), FRAC_CONST(0.970217331317979) }, + { FRAC_CONST(0.236278402197920), FRAC_CONST(0.971685400042009) }, + { FRAC_CONST(0.230311804793846), FRAC_CONST(0.973116885359925) }, + { FRAC_CONST(0.224336536280494), FRAC_CONST(0.974511733377116) }, + { FRAC_CONST(0.218352821623346), FRAC_CONST(0.975869891578341) }, + { FRAC_CONST(0.212360886105879), FRAC_CONST(0.977191308829712) }, + { FRAC_CONST(0.206360955321076), FRAC_CONST(0.978475935380617) }, + { FRAC_CONST(0.200353255162940), FRAC_CONST(0.979723722865591) }, + { FRAC_CONST(0.194338011817989), FRAC_CONST(0.980934624306142) }, + { FRAC_CONST(0.188315451756732), FRAC_CONST(0.982108594112514) }, + { FRAC_CONST(0.182285801725153), FRAC_CONST(0.983245588085407) }, + { FRAC_CONST(0.176249288736168), FRAC_CONST(0.984345563417642) }, + { FRAC_CONST(0.170206140061078), FRAC_CONST(0.985408478695768) }, + { FRAC_CONST(0.164156583221016), FRAC_CONST(0.986434293901627) }, + { FRAC_CONST(0.158100845978377), FRAC_CONST(0.987422970413855) }, + { FRAC_CONST(0.152039156328246), FRAC_CONST(0.988374471009341) }, + { FRAC_CONST(0.145971742489812), FRAC_CONST(0.989288759864625) }, + { FRAC_CONST(0.139898832897777), FRAC_CONST(0.990165802557248) }, + { FRAC_CONST(0.133820656193755), FRAC_CONST(0.991005566067049) }, + { FRAC_CONST(0.127737441217662), FRAC_CONST(0.991808018777406) }, + { FRAC_CONST(0.121649416999106), FRAC_CONST(0.992573130476429) }, + { FRAC_CONST(0.115556812748755), FRAC_CONST(0.993300872358093) }, + { FRAC_CONST(0.109459857849718), FRAC_CONST(0.993991217023329) }, + { FRAC_CONST(0.103358781848900), FRAC_CONST(0.994644138481051) }, + { FRAC_CONST(0.097253814448363), FRAC_CONST(0.995259612149133) }, + { FRAC_CONST(0.091145185496681), FRAC_CONST(0.995837614855342) }, + { FRAC_CONST(0.085033124980280), FRAC_CONST(0.996378124838200) }, + { FRAC_CONST(0.078917863014785), FRAC_CONST(0.996881121747814) }, + { FRAC_CONST(0.072799629836352), FRAC_CONST(0.997346586646633) }, + { FRAC_CONST(0.066678655793002), FRAC_CONST(0.997774502010168) }, + { FRAC_CONST(0.060555171335948), FRAC_CONST(0.998164851727646) }, + { FRAC_CONST(0.054429407010919), FRAC_CONST(0.998517621102622) }, + { FRAC_CONST(0.048301593449480), FRAC_CONST(0.998832796853528) }, + { FRAC_CONST(0.042171961360348), FRAC_CONST(0.999110367114175) }, + { FRAC_CONST(0.036040741520706), FRAC_CONST(0.999350321434199) }, + { FRAC_CONST(0.029908164767517), FRAC_CONST(0.999552650779457) }, + { FRAC_CONST(0.023774461988828), FRAC_CONST(0.999717347532362) }, + { FRAC_CONST(0.017639864115082), FRAC_CONST(0.999844405492175) }, + { FRAC_CONST(0.011504602110423), FRAC_CONST(0.999933819875236) }, + { FRAC_CONST(0.005368906963996), FRAC_CONST(0.999985587315143) } +}; +#endif // LD_DEC + +#ifdef ALLOW_SMALL_FRAMELENGTH +/* 480 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_1920[] = +{ + { FRAC_CONST(0.999999916334328), FRAC_CONST(0.000409061532028) }, + { FRAC_CONST(0.999993223088129), FRAC_CONST(0.003681545574400) }, + { FRAC_CONST(0.999975820717897), FRAC_CONST(0.006953990190376) }, + { FRAC_CONST(0.999947709409999), FRAC_CONST(0.010226360334704) }, + { FRAC_CONST(0.999908889465485), FRAC_CONST(0.013498620962929) }, + { FRAC_CONST(0.999859361300084), FRAC_CONST(0.016770737031768) }, + { FRAC_CONST(0.999799125444203), FRAC_CONST(0.020042673499487) }, + { FRAC_CONST(0.999728182542920), FRAC_CONST(0.023314395326274) }, + { FRAC_CONST(0.999646533355977), FRAC_CONST(0.026585867474619) }, + { FRAC_CONST(0.999554178757770), FRAC_CONST(0.029857054909681) }, + { FRAC_CONST(0.999451119737344), FRAC_CONST(0.033127922599673) }, + { FRAC_CONST(0.999337357398377), FRAC_CONST(0.036398435516228) }, + { FRAC_CONST(0.999212892959173), FRAC_CONST(0.039668558634781) }, + { FRAC_CONST(0.999077727752645), FRAC_CONST(0.042938256934941) }, + { FRAC_CONST(0.998931863226306), FRAC_CONST(0.046207495400865) }, + { FRAC_CONST(0.998775300942246), FRAC_CONST(0.049476239021636) }, + { FRAC_CONST(0.998608042577122), FRAC_CONST(0.052744452791636) }, + { FRAC_CONST(0.998430089922136), FRAC_CONST(0.056012101710921) }, + { FRAC_CONST(0.998241444883019), FRAC_CONST(0.059279150785597) }, + { FRAC_CONST(0.998042109480008), FRAC_CONST(0.062545565028192) }, + { FRAC_CONST(0.997832085847824), FRAC_CONST(0.065811309458034) }, + { FRAC_CONST(0.997611376235651), FRAC_CONST(0.069076349101624) }, + { FRAC_CONST(0.997379983007114), FRAC_CONST(0.072340648993011) }, + { FRAC_CONST(0.997137908640245), FRAC_CONST(0.075604174174166) }, + { FRAC_CONST(0.996885155727469), FRAC_CONST(0.078866889695354) }, + { FRAC_CONST(0.996621726975566), FRAC_CONST(0.082128760615515) }, + { FRAC_CONST(0.996347625205645), FRAC_CONST(0.085389752002632) }, + { FRAC_CONST(0.996062853353117), FRAC_CONST(0.088649828934106) }, + { FRAC_CONST(0.995767414467660), FRAC_CONST(0.091908956497133) }, + { FRAC_CONST(0.995461311713186), FRAC_CONST(0.095167099789075) }, + { FRAC_CONST(0.995144548367810), FRAC_CONST(0.098424223917834) }, + { FRAC_CONST(0.994817127823813), FRAC_CONST(0.101680294002229) }, + { FRAC_CONST(0.994479053587606), FRAC_CONST(0.104935275172364) }, + { FRAC_CONST(0.994130329279692), FRAC_CONST(0.108189132570007) }, + { FRAC_CONST(0.993770958634630), FRAC_CONST(0.111441831348957) }, + { FRAC_CONST(0.993400945500988), FRAC_CONST(0.114693336675426) }, + { FRAC_CONST(0.993020293841312), FRAC_CONST(0.117943613728403) }, + { FRAC_CONST(0.992629007732074), FRAC_CONST(0.121192627700032) }, + { FRAC_CONST(0.992227091363634), FRAC_CONST(0.124440343795983) }, + { FRAC_CONST(0.991814549040194), FRAC_CONST(0.127686727235827) }, + { FRAC_CONST(0.991391385179751), FRAC_CONST(0.130931743253405) }, + { FRAC_CONST(0.990957604314048), FRAC_CONST(0.134175357097202) }, + { FRAC_CONST(0.990513211088533), FRAC_CONST(0.137417534030720) }, + { FRAC_CONST(0.990058210262297), FRAC_CONST(0.140658239332849) }, + { FRAC_CONST(0.989592606708036), FRAC_CONST(0.143897438298239) }, + { FRAC_CONST(0.989116405411988), FRAC_CONST(0.147135096237670) }, + { FRAC_CONST(0.988629611473887), FRAC_CONST(0.150371178478428) }, + { FRAC_CONST(0.988132230106905), FRAC_CONST(0.153605650364672) }, + { FRAC_CONST(0.987624266637598), FRAC_CONST(0.156838477257806) }, + { FRAC_CONST(0.987105726505845), FRAC_CONST(0.160069624536852) }, + { FRAC_CONST(0.986576615264794), FRAC_CONST(0.163299057598817) }, + { FRAC_CONST(0.986036938580803), FRAC_CONST(0.166526741859069) }, + { FRAC_CONST(0.985486702233375), FRAC_CONST(0.169752642751702) }, + { FRAC_CONST(0.984925912115099), FRAC_CONST(0.172976725729910) }, + { FRAC_CONST(0.984354574231587), FRAC_CONST(0.176198956266353) }, + { FRAC_CONST(0.983772694701407), FRAC_CONST(0.179419299853531) }, + { FRAC_CONST(0.983180279756024), FRAC_CONST(0.182637722004152) }, + { FRAC_CONST(0.982577335739725), FRAC_CONST(0.185854188251500) }, + { FRAC_CONST(0.981963869109555), FRAC_CONST(0.189068664149806) }, + { FRAC_CONST(0.981339886435250), FRAC_CONST(0.192281115274616) }, + { FRAC_CONST(0.980705394399163), FRAC_CONST(0.195491507223158) }, + { FRAC_CONST(0.980060399796194), FRAC_CONST(0.198699805614714) }, + { FRAC_CONST(0.979404909533716), FRAC_CONST(0.201905976090986) }, + { FRAC_CONST(0.978738930631504), FRAC_CONST(0.205109984316464) }, + { FRAC_CONST(0.978062470221657), FRAC_CONST(0.208311795978794) }, + { FRAC_CONST(0.977375535548522), FRAC_CONST(0.211511376789145) }, + { FRAC_CONST(0.976678133968618), FRAC_CONST(0.214708692482577) }, + { FRAC_CONST(0.975970272950556), FRAC_CONST(0.217903708818409) }, + { FRAC_CONST(0.975251960074958), FRAC_CONST(0.221096391580581) }, + { FRAC_CONST(0.974523203034377), FRAC_CONST(0.224286706578026) }, + { FRAC_CONST(0.973784009633218), FRAC_CONST(0.227474619645035) }, + { FRAC_CONST(0.973034387787646), FRAC_CONST(0.230660096641619) }, + { FRAC_CONST(0.972274345525510), FRAC_CONST(0.233843103453878) }, + { FRAC_CONST(0.971503890986252), FRAC_CONST(0.237023605994367) }, + { FRAC_CONST(0.970723032420820), FRAC_CONST(0.240201570202459) }, + { FRAC_CONST(0.969931778191584), FRAC_CONST(0.243376962044711) }, + { FRAC_CONST(0.969130136772239), FRAC_CONST(0.246549747515226) }, + { FRAC_CONST(0.968318116747721), FRAC_CONST(0.249719892636022) }, + { FRAC_CONST(0.967495726814114), FRAC_CONST(0.252887363457390) }, + { FRAC_CONST(0.966662975778551), FRAC_CONST(0.256052126058264) }, + { FRAC_CONST(0.965819872559127), FRAC_CONST(0.259214146546579) }, + { FRAC_CONST(0.964966426184802), FRAC_CONST(0.262373391059634) }, + { FRAC_CONST(0.964102645795299), FRAC_CONST(0.265529825764461) }, + { FRAC_CONST(0.963228540641012), FRAC_CONST(0.268683416858178) }, + { FRAC_CONST(0.962344120082907), FRAC_CONST(0.271834130568359) }, + { FRAC_CONST(0.961449393592416), FRAC_CONST(0.274981933153391) }, + { FRAC_CONST(0.960544370751341), FRAC_CONST(0.278126790902837) }, + { FRAC_CONST(0.959629061251750), FRAC_CONST(0.281268670137799) }, + { FRAC_CONST(0.958703474895872), FRAC_CONST(0.284407537211272) }, + { FRAC_CONST(0.957767621595993), FRAC_CONST(0.287543358508512) }, + { FRAC_CONST(0.956821511374351), FRAC_CONST(0.290676100447394) }, + { FRAC_CONST(0.955865154363025), FRAC_CONST(0.293805729478766) }, + { FRAC_CONST(0.954898560803832), FRAC_CONST(0.296932212086818) }, + { FRAC_CONST(0.953921741048211), FRAC_CONST(0.300055514789431) }, + { FRAC_CONST(0.952934705557117), FRAC_CONST(0.303175604138543) }, + { FRAC_CONST(0.951937464900908), FRAC_CONST(0.306292446720504) }, + { FRAC_CONST(0.950930029759229), FRAC_CONST(0.309406009156434) }, + { FRAC_CONST(0.949912410920903), FRAC_CONST(0.312516258102580) }, + { FRAC_CONST(0.948884619283808), FRAC_CONST(0.315623160250676) }, + { FRAC_CONST(0.947846665854767), FRAC_CONST(0.318726682328294) }, + { FRAC_CONST(0.946798561749429), FRAC_CONST(0.321826791099207) }, + { FRAC_CONST(0.945740318192145), FRAC_CONST(0.324923453363742) }, + { FRAC_CONST(0.944671946515855), FRAC_CONST(0.328016635959131) }, + { FRAC_CONST(0.943593458161960), FRAC_CONST(0.331106305759876) }, + { FRAC_CONST(0.942504864680205), FRAC_CONST(0.334192429678095) }, + { FRAC_CONST(0.941406177728551), FRAC_CONST(0.337274974663880) }, + { FRAC_CONST(0.940297409073052), FRAC_CONST(0.340353907705650) }, + { FRAC_CONST(0.939178570587730), FRAC_CONST(0.343429195830507) }, + { FRAC_CONST(0.938049674254446), FRAC_CONST(0.346500806104585) }, + { FRAC_CONST(0.936910732162774), FRAC_CONST(0.349568705633406) }, + { FRAC_CONST(0.935761756509868), FRAC_CONST(0.352632861562230) }, + { FRAC_CONST(0.934602759600334), FRAC_CONST(0.355693241076410) }, + { FRAC_CONST(0.933433753846097), FRAC_CONST(0.358749811401739) }, + { FRAC_CONST(0.932254751766271), FRAC_CONST(0.361802539804806) }, + { FRAC_CONST(0.931065765987021), FRAC_CONST(0.364851393593340) }, + { FRAC_CONST(0.929866809241428), FRAC_CONST(0.367896340116568) }, + { FRAC_CONST(0.928657894369357), FRAC_CONST(0.370937346765559) }, + { FRAC_CONST(0.927439034317314), FRAC_CONST(0.373974380973575) }, + { FRAC_CONST(0.926210242138311), FRAC_CONST(0.377007410216418) }, + { FRAC_CONST(0.924971530991726), FRAC_CONST(0.380036402012783) }, + { FRAC_CONST(0.923722914143160), FRAC_CONST(0.383061323924602) }, + { FRAC_CONST(0.922464404964295), FRAC_CONST(0.386082143557389) }, + { FRAC_CONST(0.921196016932755), FRAC_CONST(0.389098828560595) }, + { FRAC_CONST(0.919917763631956), FRAC_CONST(0.392111346627946) }, + { FRAC_CONST(0.918629658750963), FRAC_CONST(0.395119665497795) }, + { FRAC_CONST(0.917331716084346), FRAC_CONST(0.398123752953462) }, + { FRAC_CONST(0.916023949532027), FRAC_CONST(0.401123576823585) }, + { FRAC_CONST(0.914706373099136), FRAC_CONST(0.404119104982459) }, + { FRAC_CONST(0.913379000895858), FRAC_CONST(0.407110305350386) }, + { FRAC_CONST(0.912041847137282), FRAC_CONST(0.410097145894012) }, + { FRAC_CONST(0.910694926143251), FRAC_CONST(0.413079594626675) }, + { FRAC_CONST(0.909338252338207), FRAC_CONST(0.416057619608744) }, + { FRAC_CONST(0.907971840251037), FRAC_CONST(0.419031188947965) }, + { FRAC_CONST(0.906595704514915), FRAC_CONST(0.422000270799800) }, + { FRAC_CONST(0.905209859867151), FRAC_CONST(0.424964833367766) }, + { FRAC_CONST(0.903814321149027), FRAC_CONST(0.427924844903780) }, + { FRAC_CONST(0.902409103305641), FRAC_CONST(0.430880273708497) }, + { FRAC_CONST(0.900994221385748), FRAC_CONST(0.433831088131649) }, + { FRAC_CONST(0.899569690541596), FRAC_CONST(0.436777256572384) }, + { FRAC_CONST(0.898135526028766), FRAC_CONST(0.439718747479604) }, + { FRAC_CONST(0.896691743206008), FRAC_CONST(0.442655529352306) }, + { FRAC_CONST(0.895238357535076), FRAC_CONST(0.445587570739915) }, + { FRAC_CONST(0.893775384580563), FRAC_CONST(0.448514840242624) }, + { FRAC_CONST(0.892302840009734), FRAC_CONST(0.451437306511726) }, + { FRAC_CONST(0.890820739592359), FRAC_CONST(0.454354938249958) }, + { FRAC_CONST(0.889329099200541), FRAC_CONST(0.457267704211826) }, + { FRAC_CONST(0.887827934808551), FRAC_CONST(0.460175573203949) }, + { FRAC_CONST(0.886317262492655), FRAC_CONST(0.463078514085383) }, + { FRAC_CONST(0.884797098430938), FRAC_CONST(0.465976495767966) }, + { FRAC_CONST(0.883267458903136), FRAC_CONST(0.468869487216642) }, + { FRAC_CONST(0.881728360290461), FRAC_CONST(0.471757457449795) }, + { FRAC_CONST(0.880179819075421), FRAC_CONST(0.474640375539586) }, + { FRAC_CONST(0.878621851841649), FRAC_CONST(0.477518210612278) }, + { FRAC_CONST(0.877054475273722), FRAC_CONST(0.480390931848569) }, + { FRAC_CONST(0.875477706156984), FRAC_CONST(0.483258508483922) }, + { FRAC_CONST(0.873891561377366), FRAC_CONST(0.486120909808896) }, + { FRAC_CONST(0.872296057921204), FRAC_CONST(0.488978105169472) }, + { FRAC_CONST(0.870691212875058), FRAC_CONST(0.491830063967383) }, + { FRAC_CONST(0.869077043425529), FRAC_CONST(0.494676755660442) }, + { FRAC_CONST(0.867453566859076), FRAC_CONST(0.497518149762867) }, + { FRAC_CONST(0.865820800561827), FRAC_CONST(0.500354215845611) }, + { FRAC_CONST(0.864178762019399), FRAC_CONST(0.503184923536685) }, + { FRAC_CONST(0.862527468816704), FRAC_CONST(0.506010242521482) }, + { FRAC_CONST(0.860866938637767), FRAC_CONST(0.508830142543107) }, + { FRAC_CONST(0.859197189265532), FRAC_CONST(0.511644593402696) }, + { FRAC_CONST(0.857518238581672), FRAC_CONST(0.514453564959741) }, + { FRAC_CONST(0.855830104566401), FRAC_CONST(0.517257027132414) }, + { FRAC_CONST(0.854132805298278), FRAC_CONST(0.520054949897887) }, + { FRAC_CONST(0.852426358954015), FRAC_CONST(0.522847303292655) }, + { FRAC_CONST(0.850710783808280), FRAC_CONST(0.525634057412856) }, + { FRAC_CONST(0.848986098233506), FRAC_CONST(0.528415182414593) }, + { FRAC_CONST(0.847252320699689), FRAC_CONST(0.531190648514252) }, + { FRAC_CONST(0.845509469774194), FRAC_CONST(0.533960425988819) }, + { FRAC_CONST(0.843757564121554), FRAC_CONST(0.536724485176205) }, + { FRAC_CONST(0.841996622503271), FRAC_CONST(0.539482796475555) }, + { FRAC_CONST(0.840226663777615), FRAC_CONST(0.542235330347571) }, + { FRAC_CONST(0.838447706899422), FRAC_CONST(0.544982057314827) }, + { FRAC_CONST(0.836659770919891), FRAC_CONST(0.547722947962084) }, + { FRAC_CONST(0.834862874986380), FRAC_CONST(0.550457972936605) }, + { FRAC_CONST(0.833057038342201), FRAC_CONST(0.553187102948470) }, + { FRAC_CONST(0.831242280326413), FRAC_CONST(0.555910308770889) }, + { FRAC_CONST(0.829418620373617), FRAC_CONST(0.558627561240515) }, + { FRAC_CONST(0.827586078013746), FRAC_CONST(0.561338831257758) }, + { FRAC_CONST(0.825744672871856), FRAC_CONST(0.564044089787093) }, + { FRAC_CONST(0.823894424667918), FRAC_CONST(0.566743307857377) }, + { FRAC_CONST(0.822035353216601), FRAC_CONST(0.569436456562150) }, + { FRAC_CONST(0.820167478427070), FRAC_CONST(0.572123507059955) }, + { FRAC_CONST(0.818290820302761), FRAC_CONST(0.574804430574639) }, + { FRAC_CONST(0.816405398941175), FRAC_CONST(0.577479198395666) }, + { FRAC_CONST(0.814511234533661), FRAC_CONST(0.580147781878420) }, + { FRAC_CONST(0.812608347365198), FRAC_CONST(0.582810152444517) }, + { FRAC_CONST(0.810696757814178), FRAC_CONST(0.585466281582107) }, + { FRAC_CONST(0.808776486352191), FRAC_CONST(0.588116140846181) }, + { FRAC_CONST(0.806847553543799), FRAC_CONST(0.590759701858874) }, + { FRAC_CONST(0.804909980046325), FRAC_CONST(0.593396936309773) }, + { FRAC_CONST(0.802963786609623), FRAC_CONST(0.596027815956215) }, + { FRAC_CONST(0.801008994075862), FRAC_CONST(0.598652312623592) }, + { FRAC_CONST(0.799045623379300), FRAC_CONST(0.601270398205654) }, + { FRAC_CONST(0.797073695546059), FRAC_CONST(0.603882044664808) }, + { FRAC_CONST(0.795093231693901), FRAC_CONST(0.606487224032418) }, + { FRAC_CONST(0.793104253032005), FRAC_CONST(0.609085908409106) }, + { FRAC_CONST(0.791106780860733), FRAC_CONST(0.611678069965050) }, + { FRAC_CONST(0.789100836571407), FRAC_CONST(0.614263680940283) }, + { FRAC_CONST(0.787086441646080), FRAC_CONST(0.616842713644988) }, + { FRAC_CONST(0.785063617657302), FRAC_CONST(0.619415140459796) }, + { FRAC_CONST(0.783032386267894), FRAC_CONST(0.621980933836084) }, + { FRAC_CONST(0.780992769230711), FRAC_CONST(0.624540066296266) }, + { FRAC_CONST(0.778944788388414), FRAC_CONST(0.627092510434089) }, + { FRAC_CONST(0.776888465673232), FRAC_CONST(0.629638238914927) }, + { FRAC_CONST(0.774823823106730), FRAC_CONST(0.632177224476073) }, + { FRAC_CONST(0.772750882799570), FRAC_CONST(0.634709439927031) }, + { FRAC_CONST(0.770669666951277), FRAC_CONST(0.637234858149809) }, + { FRAC_CONST(0.768580197850002), FRAC_CONST(0.639753452099206) }, + { FRAC_CONST(0.766482497872280), FRAC_CONST(0.642265194803105) }, + { FRAC_CONST(0.764376589482793), FRAC_CONST(0.644770059362758) }, + { FRAC_CONST(0.762262495234126), FRAC_CONST(0.647268018953079) }, + { FRAC_CONST(0.760140237766532), FRAC_CONST(0.649759046822928) }, + { FRAC_CONST(0.758009839807683), FRAC_CONST(0.652243116295397) }, + { FRAC_CONST(0.755871324172429), FRAC_CONST(0.654720200768098) }, + { FRAC_CONST(0.753724713762555), FRAC_CONST(0.657190273713446) }, + { FRAC_CONST(0.751570031566534), FRAC_CONST(0.659653308678945) }, + { FRAC_CONST(0.749407300659280), FRAC_CONST(0.662109279287469) }, + { FRAC_CONST(0.747236544201905), FRAC_CONST(0.664558159237545) }, + { FRAC_CONST(0.745057785441466), FRAC_CONST(0.666999922303638) }, + { FRAC_CONST(0.742871047710719), FRAC_CONST(0.669434542336425) }, + { FRAC_CONST(0.740676354427868), FRAC_CONST(0.671861993263083) }, + { FRAC_CONST(0.738473729096316), FRAC_CONST(0.674282249087562) }, + { FRAC_CONST(0.736263195304409), FRAC_CONST(0.676695283890867) }, + { FRAC_CONST(0.734044776725190), FRAC_CONST(0.679101071831334) }, + { FRAC_CONST(0.731818497116138), FRAC_CONST(0.681499587144906) }, + { FRAC_CONST(0.729584380318920), FRAC_CONST(0.683890804145412) }, + { FRAC_CONST(0.727342450259131), FRAC_CONST(0.686274697224838) }, + { FRAC_CONST(0.725092730946042), FRAC_CONST(0.688651240853606) }, + { FRAC_CONST(0.722835246472338), FRAC_CONST(0.691020409580841) }, + { FRAC_CONST(0.720570021013866), FRAC_CONST(0.693382178034651) }, + { FRAC_CONST(0.718297078829369), FRAC_CONST(0.695736520922392) }, + { FRAC_CONST(0.716016444260233), FRAC_CONST(0.698083413030944) }, + { FRAC_CONST(0.713728141730222), FRAC_CONST(0.700422829226978) }, + { FRAC_CONST(0.711432195745216), FRAC_CONST(0.702754744457225) }, + { FRAC_CONST(0.709128630892954), FRAC_CONST(0.705079133748748) }, + { FRAC_CONST(0.706817471842764), FRAC_CONST(0.707395972209203) }, + { FRAC_CONST(0.704498743345302), FRAC_CONST(0.709705235027113) }, + { FRAC_CONST(0.702172470232289), FRAC_CONST(0.712006897472128) }, + { FRAC_CONST(0.699838677416240), FRAC_CONST(0.714300934895292) }, + { FRAC_CONST(0.697497389890200), FRAC_CONST(0.716587322729308) }, + { FRAC_CONST(0.695148632727480), FRAC_CONST(0.718866036488799) }, + { FRAC_CONST(0.692792431081381), FRAC_CONST(0.721137051770570) }, + { FRAC_CONST(0.690428810184929), FRAC_CONST(0.723400344253874) }, + { FRAC_CONST(0.688057795350606), FRAC_CONST(0.725655889700665) }, + { FRAC_CONST(0.685679411970075), FRAC_CONST(0.727903663955865) }, + { FRAC_CONST(0.683293685513912), FRAC_CONST(0.730143642947616) }, + { FRAC_CONST(0.680900641531330), FRAC_CONST(0.732375802687543) }, + { FRAC_CONST(0.678500305649909), FRAC_CONST(0.734600119271009) }, + { FRAC_CONST(0.676092703575316), FRAC_CONST(0.736816568877370) }, + { FRAC_CONST(0.673677861091036), FRAC_CONST(0.739025127770231) }, + { FRAC_CONST(0.671255804058092), FRAC_CONST(0.741225772297702) }, + { FRAC_CONST(0.668826558414768), FRAC_CONST(0.743418478892647) }, + { FRAC_CONST(0.666390150176334), FRAC_CONST(0.745603224072940) }, + { FRAC_CONST(0.663946605434765), FRAC_CONST(0.747779984441716) }, + { FRAC_CONST(0.661495950358462), FRAC_CONST(0.749948736687619) }, + { FRAC_CONST(0.659038211191971), FRAC_CONST(0.752109457585056) }, + { FRAC_CONST(0.656573414255705), FRAC_CONST(0.754262123994441) }, + { FRAC_CONST(0.654101585945659), FRAC_CONST(0.756406712862448) }, + { FRAC_CONST(0.651622752733128), FRAC_CONST(0.758543201222251) }, + { FRAC_CONST(0.649136941164425), FRAC_CONST(0.760671566193777) }, + { FRAC_CONST(0.646644177860593), FRAC_CONST(0.762791784983948) }, + { FRAC_CONST(0.644144489517126), FRAC_CONST(0.764903834886923) }, + { FRAC_CONST(0.641637902903677), FRAC_CONST(0.767007693284345) }, + { FRAC_CONST(0.639124444863776), FRAC_CONST(0.769103337645580) }, + { FRAC_CONST(0.636604142314538), FRAC_CONST(0.771190745527961) }, + { FRAC_CONST(0.634077022246379), FRAC_CONST(0.773269894577026) }, + { FRAC_CONST(0.631543111722725), FRAC_CONST(0.775340762526760) }, + { FRAC_CONST(0.629002437879721), FRAC_CONST(0.777403327199831) }, + { FRAC_CONST(0.626455027925944), FRAC_CONST(0.779457566507828) }, + { FRAC_CONST(0.623900909142107), FRAC_CONST(0.781503458451498) }, + { FRAC_CONST(0.621340108880771), FRAC_CONST(0.783540981120982) }, + { FRAC_CONST(0.618772654566049), FRAC_CONST(0.785570112696050) }, + { FRAC_CONST(0.616198573693314), FRAC_CONST(0.787590831446332) }, + { FRAC_CONST(0.613617893828905), FRAC_CONST(0.789603115731555) }, + { FRAC_CONST(0.611030642609828), FRAC_CONST(0.791606944001769) }, + { FRAC_CONST(0.608436847743468), FRAC_CONST(0.793602294797585) }, + { FRAC_CONST(0.605836537007281), FRAC_CONST(0.795589146750397) }, + { FRAC_CONST(0.603229738248508), FRAC_CONST(0.797567478582619) }, + { FRAC_CONST(0.600616479383869), FRAC_CONST(0.799537269107905) }, + { FRAC_CONST(0.597996788399267), FRAC_CONST(0.801498497231381) }, + { FRAC_CONST(0.595370693349487), FRAC_CONST(0.803451141949871) }, + { FRAC_CONST(0.592738222357898), FRAC_CONST(0.805395182352117) }, + { FRAC_CONST(0.590099403616149), FRAC_CONST(0.807330597619008) }, + { FRAC_CONST(0.587454265383869), FRAC_CONST(0.809257367023803) }, + { FRAC_CONST(0.584802835988364), FRAC_CONST(0.811175469932349) }, + { FRAC_CONST(0.582145143824311), FRAC_CONST(0.813084885803304) }, + { FRAC_CONST(0.579481217353460), FRAC_CONST(0.814985594188359) }, + { FRAC_CONST(0.576811085104321), FRAC_CONST(0.816877574732454) }, + { FRAC_CONST(0.574134775671867), FRAC_CONST(0.818760807173997) }, + { FRAC_CONST(0.571452317717222), FRAC_CONST(0.820635271345081) }, + { FRAC_CONST(0.568763739967354), FRAC_CONST(0.822500947171703) }, + { FRAC_CONST(0.566069071214772), FRAC_CONST(0.824357814673971) }, + { FRAC_CONST(0.563368340317214), FRAC_CONST(0.826205853966327) }, + { FRAC_CONST(0.560661576197336), FRAC_CONST(0.828045045257756) }, + { FRAC_CONST(0.557948807842409), FRAC_CONST(0.829875368851995) }, + { FRAC_CONST(0.555230064304002), FRAC_CONST(0.831696805147750) }, + { FRAC_CONST(0.552505374697674), FRAC_CONST(0.833509334638900) }, + { FRAC_CONST(0.549774768202663), FRAC_CONST(0.835312937914713) }, + { FRAC_CONST(0.547038274061568), FRAC_CONST(0.837107595660044) }, + { FRAC_CONST(0.544295921580046), FRAC_CONST(0.838893288655553) }, + { FRAC_CONST(0.541547740126486), FRAC_CONST(0.840669997777901) }, + { FRAC_CONST(0.538793759131706), FRAC_CONST(0.842437703999961) }, + { FRAC_CONST(0.536034008088628), FRAC_CONST(0.844196388391019) }, + { FRAC_CONST(0.533268516551970), FRAC_CONST(0.845946032116980) }, + { FRAC_CONST(0.530497314137923), FRAC_CONST(0.847686616440563) }, + { FRAC_CONST(0.527720430523840), FRAC_CONST(0.849418122721510) }, + { FRAC_CONST(0.524937895447912), FRAC_CONST(0.851140532416778) }, + { FRAC_CONST(0.522149738708856), FRAC_CONST(0.852853827080745) }, + { FRAC_CONST(0.519355990165590), FRAC_CONST(0.854557988365401) }, + { FRAC_CONST(0.516556679736915), FRAC_CONST(0.856252998020546) }, + { FRAC_CONST(0.513751837401199), FRAC_CONST(0.857938837893991) }, + { FRAC_CONST(0.510941493196049), FRAC_CONST(0.859615489931744) }, + { FRAC_CONST(0.508125677217994), FRAC_CONST(0.861282936178208) }, + { FRAC_CONST(0.505304419622159), FRAC_CONST(0.862941158776375) }, + { FRAC_CONST(0.502477750621949), FRAC_CONST(0.864590139968012) }, + { FRAC_CONST(0.499645700488717), FRAC_CONST(0.866229862093855) }, + { FRAC_CONST(0.496808299551444), FRAC_CONST(0.867860307593799) }, + { FRAC_CONST(0.493965578196415), FRAC_CONST(0.869481459007080) }, + { FRAC_CONST(0.491117566866892), FRAC_CONST(0.871093298972471) }, + { FRAC_CONST(0.488264296062789), FRAC_CONST(0.872695810228461) }, + { FRAC_CONST(0.485405796340343), FRAC_CONST(0.874288975613440) }, + { FRAC_CONST(0.482542098311789), FRAC_CONST(0.875872778065888) }, + { FRAC_CONST(0.479673232645033), FRAC_CONST(0.877447200624553) }, + { FRAC_CONST(0.476799230063322), FRAC_CONST(0.879012226428633) }, + { FRAC_CONST(0.473920121344914), FRAC_CONST(0.880567838717962) }, + { FRAC_CONST(0.471035937322751), FRAC_CONST(0.882114020833179) }, + { FRAC_CONST(0.468146708884125), FRAC_CONST(0.883650756215917) }, + { FRAC_CONST(0.465252466970353), FRAC_CONST(0.885178028408975) }, + { FRAC_CONST(0.462353242576441), FRAC_CONST(0.886695821056495) }, + { FRAC_CONST(0.459449066750752), FRAC_CONST(0.888204117904136) }, + { FRAC_CONST(0.456539970594675), FRAC_CONST(0.889702902799251) }, + { FRAC_CONST(0.453625985262295), FRAC_CONST(0.891192159691058) }, + { FRAC_CONST(0.450707141960053), FRAC_CONST(0.892671872630812) }, + { FRAC_CONST(0.447783471946415), FRAC_CONST(0.894142025771977) }, + { FRAC_CONST(0.444855006531538), FRAC_CONST(0.895602603370393) }, + { FRAC_CONST(0.441921777076935), FRAC_CONST(0.897053589784447) }, + { FRAC_CONST(0.438983814995137), FRAC_CONST(0.898494969475242) }, + { FRAC_CONST(0.436041151749356), FRAC_CONST(0.899926727006758) }, + { FRAC_CONST(0.433093818853152), FRAC_CONST(0.901348847046022) }, + { FRAC_CONST(0.430141847870093), FRAC_CONST(0.902761314363272) }, + { FRAC_CONST(0.427185270413416), FRAC_CONST(0.904164113832116) }, + { FRAC_CONST(0.424224118145690), FRAC_CONST(0.905557230429701) }, + { FRAC_CONST(0.421258422778478), FRAC_CONST(0.906940649236866) }, + { FRAC_CONST(0.418288216071994), FRAC_CONST(0.908314355438308) }, + { FRAC_CONST(0.415313529834766), FRAC_CONST(0.909678334322736) }, + { FRAC_CONST(0.412334395923293), FRAC_CONST(0.911032571283032) }, + { FRAC_CONST(0.409350846241706), FRAC_CONST(0.912377051816407) }, + { FRAC_CONST(0.406362912741425), FRAC_CONST(0.913711761524555) }, + { FRAC_CONST(0.403370627420818), FRAC_CONST(0.915036686113806) }, + { FRAC_CONST(0.400374022324857), FRAC_CONST(0.916351811395282) }, + { FRAC_CONST(0.397373129544774), FRAC_CONST(0.917657123285050) }, + { FRAC_CONST(0.394367981217720), FRAC_CONST(0.918952607804266) }, + { FRAC_CONST(0.391358609526420), FRAC_CONST(0.920238251079332) }, + { FRAC_CONST(0.388345046698826), FRAC_CONST(0.921514039342042) }, + { FRAC_CONST(0.385327325007776), FRAC_CONST(0.922779958929729) }, + { FRAC_CONST(0.382305476770645), FRAC_CONST(0.924035996285410) }, + { FRAC_CONST(0.379279534348999), FRAC_CONST(0.925282137957935) }, + { FRAC_CONST(0.376249530148250), FRAC_CONST(0.926518370602127) }, + { FRAC_CONST(0.373215496617310), FRAC_CONST(0.927744680978929) }, + { FRAC_CONST(0.370177466248239), FRAC_CONST(0.928961055955541) }, + { FRAC_CONST(0.367135471575903), FRAC_CONST(0.930167482505564) }, + { FRAC_CONST(0.364089545177621), FRAC_CONST(0.931363947709140) }, + { FRAC_CONST(0.361039719672816), FRAC_CONST(0.932550438753087) }, + { FRAC_CONST(0.357986027722671), FRAC_CONST(0.933726942931039) }, + { FRAC_CONST(0.354928502029772), FRAC_CONST(0.934893447643582) }, + { FRAC_CONST(0.351867175337763), FRAC_CONST(0.936049940398387) }, + { FRAC_CONST(0.348802080430994), FRAC_CONST(0.937196408810347) }, + { FRAC_CONST(0.345733250134169), FRAC_CONST(0.938332840601705) }, + { FRAC_CONST(0.342660717311994), FRAC_CONST(0.939459223602190) }, + { FRAC_CONST(0.339584514868829), FRAC_CONST(0.940575545749145) }, + { FRAC_CONST(0.336504675748328), FRAC_CONST(0.941681795087657) }, + { FRAC_CONST(0.333421232933097), FRAC_CONST(0.942777959770684) }, + { FRAC_CONST(0.330334219444328), FRAC_CONST(0.943864028059183) }, + { FRAC_CONST(0.327243668341457), FRAC_CONST(0.944939988322235) }, + { FRAC_CONST(0.324149612721804), FRAC_CONST(0.946005829037171) }, + { FRAC_CONST(0.321052085720218), FRAC_CONST(0.947061538789691) }, + { FRAC_CONST(0.317951120508725), FRAC_CONST(0.948107106273994) }, + { FRAC_CONST(0.314846750296171), FRAC_CONST(0.949142520292891) }, + { FRAC_CONST(0.311739008327867), FRAC_CONST(0.950167769757930) }, + { FRAC_CONST(0.308627927885232), FRAC_CONST(0.951182843689513) }, + { FRAC_CONST(0.305513542285440), FRAC_CONST(0.952187731217013) }, + { FRAC_CONST(0.302395884881056), FRAC_CONST(0.953182421578893) }, + { FRAC_CONST(0.299274989059689), FRAC_CONST(0.954166904122818) }, + { FRAC_CONST(0.296150888243624), FRAC_CONST(0.955141168305771) }, + { FRAC_CONST(0.293023615889471), FRAC_CONST(0.956105203694164) }, + { FRAC_CONST(0.289893205487806), FRAC_CONST(0.957058999963955) }, + { FRAC_CONST(0.286759690562807), FRAC_CONST(0.958002546900750) }, + { FRAC_CONST(0.283623104671904), FRAC_CONST(0.958935834399920) }, + { FRAC_CONST(0.280483481405410), FRAC_CONST(0.959858852466706) }, + { FRAC_CONST(0.277340854386169), FRAC_CONST(0.960771591216325) }, + { FRAC_CONST(0.274195257269191), FRAC_CONST(0.961674040874080) }, + { FRAC_CONST(0.271046723741295), FRAC_CONST(0.962566191775459) }, + { FRAC_CONST(0.267895287520743), FRAC_CONST(0.963448034366243) }, + { FRAC_CONST(0.264740982356888), FRAC_CONST(0.964319559202607) }, + { FRAC_CONST(0.261583842029803), FRAC_CONST(0.965180756951218) }, + { FRAC_CONST(0.258423900349924), FRAC_CONST(0.966031618389343) }, + { FRAC_CONST(0.255261191157689), FRAC_CONST(0.966872134404937) }, + { FRAC_CONST(0.252095748323171), FRAC_CONST(0.967702295996750) }, + { FRAC_CONST(0.248927605745720), FRAC_CONST(0.968522094274417) }, + { FRAC_CONST(0.245756797353599), FRAC_CONST(0.969331520458559) }, + { FRAC_CONST(0.242583357103617), FRAC_CONST(0.970130565880871) }, + { FRAC_CONST(0.239407318980770), FRAC_CONST(0.970919221984218) }, + { FRAC_CONST(0.236228716997876), FRAC_CONST(0.971697480322728) }, + { FRAC_CONST(0.233047585195206), FRAC_CONST(0.972465332561878) }, + { FRAC_CONST(0.229863957640129), FRAC_CONST(0.973222770478587) }, + { FRAC_CONST(0.226677868426735), FRAC_CONST(0.973969785961306) }, + { FRAC_CONST(0.223489351675482), FRAC_CONST(0.974706371010097) }, + { FRAC_CONST(0.220298441532823), FRAC_CONST(0.975432517736727) }, + { FRAC_CONST(0.217105172170841), FRAC_CONST(0.976148218364747) }, + { FRAC_CONST(0.213909577786886), FRAC_CONST(0.976853465229579) }, + { FRAC_CONST(0.210711692603206), FRAC_CONST(0.977548250778596) }, + { FRAC_CONST(0.207511550866582), FRAC_CONST(0.978232567571202) }, + { FRAC_CONST(0.204309186847962), FRAC_CONST(0.978906408278914) }, + { FRAC_CONST(0.201104634842092), FRAC_CONST(0.979569765685441) }, + { FRAC_CONST(0.197897929167148), FRAC_CONST(0.980222632686756) }, + { FRAC_CONST(0.194689104164373), FRAC_CONST(0.980865002291179) }, + { FRAC_CONST(0.191478194197704), FRAC_CONST(0.981496867619447) }, + { FRAC_CONST(0.188265233653407), FRAC_CONST(0.982118221904791) }, + { FRAC_CONST(0.185050256939710), FRAC_CONST(0.982729058493005) }, + { FRAC_CONST(0.181833298486427), FRAC_CONST(0.983329370842520) }, + { FRAC_CONST(0.178614392744603), FRAC_CONST(0.983919152524473) }, + { FRAC_CONST(0.175393574186129), FRAC_CONST(0.984498397222776) }, + { FRAC_CONST(0.172170877303385), FRAC_CONST(0.985067098734184) }, + { FRAC_CONST(0.168946336608867), FRAC_CONST(0.985625250968360) }, + { FRAC_CONST(0.165719986634814), FRAC_CONST(0.986172847947943) }, + { FRAC_CONST(0.162491861932842), FRAC_CONST(0.986709883808609) }, + { FRAC_CONST(0.159261997073573), FRAC_CONST(0.987236352799134) }, + { FRAC_CONST(0.156030426646266), FRAC_CONST(0.987752249281460) }, + { FRAC_CONST(0.152797185258443), FRAC_CONST(0.988257567730749) }, + { FRAC_CONST(0.149562307535523), FRAC_CONST(0.988752302735447) }, + { FRAC_CONST(0.146325828120446), FRAC_CONST(0.989236448997339) }, + { FRAC_CONST(0.143087781673307), FRAC_CONST(0.989710001331608) }, + { FRAC_CONST(0.139848202870981), FRAC_CONST(0.990172954666889) }, + { FRAC_CONST(0.136607126406757), FRAC_CONST(0.990625304045323) }, + { FRAC_CONST(0.133364586989957), FRAC_CONST(0.991067044622612) }, + { FRAC_CONST(0.130120619345575), FRAC_CONST(0.991498171668069) }, + { FRAC_CONST(0.126875258213898), FRAC_CONST(0.991918680564670) }, + { FRAC_CONST(0.123628538350136), FRAC_CONST(0.992328566809103) }, + { FRAC_CONST(0.120380494524051), FRAC_CONST(0.992727826011815) }, + { FRAC_CONST(0.117131161519582), FRAC_CONST(0.993116453897061) }, + { FRAC_CONST(0.113880574134475), FRAC_CONST(0.993494446302948) }, + { FRAC_CONST(0.110628767179910), FRAC_CONST(0.993861799181482) }, + { FRAC_CONST(0.107375775480128), FRAC_CONST(0.994218508598608) }, + { FRAC_CONST(0.104121633872055), FRAC_CONST(0.994564570734255) }, + { FRAC_CONST(0.100866377204933), FRAC_CONST(0.994899981882376) }, + { FRAC_CONST(0.097610040339947), FRAC_CONST(0.995224738450986) }, + { FRAC_CONST(0.094352658149849), FRAC_CONST(0.995538836962204) }, + { FRAC_CONST(0.091094265518583), FRAC_CONST(0.995842274052287) }, + { FRAC_CONST(0.087834897340919), FRAC_CONST(0.996135046471667) }, + { FRAC_CONST(0.084574588522070), FRAC_CONST(0.996417151084987) }, + { FRAC_CONST(0.081313373977324), FRAC_CONST(0.996688584871134) }, + { FRAC_CONST(0.078051288631670), FRAC_CONST(0.996949344923269) }, + { FRAC_CONST(0.074788367419420), FRAC_CONST(0.997199428448862) }, + { FRAC_CONST(0.071524645283840), FRAC_CONST(0.997438832769720) }, + { FRAC_CONST(0.068260157176771), FRAC_CONST(0.997667555322013) }, + { FRAC_CONST(0.064994938058259), FRAC_CONST(0.997885593656308) }, + { FRAC_CONST(0.061729022896176), FRAC_CONST(0.998092945437590) }, + { FRAC_CONST(0.058462446665851), FRAC_CONST(0.998289608445286) }, + { FRAC_CONST(0.055195244349690), FRAC_CONST(0.998475580573295) }, + { FRAC_CONST(0.051927450936806), FRAC_CONST(0.998650859830004) }, + { FRAC_CONST(0.048659101422640), FRAC_CONST(0.998815444338313) }, + { FRAC_CONST(0.045390230808591), FRAC_CONST(0.998969332335654) }, + { FRAC_CONST(0.042120874101635), FRAC_CONST(0.999112522174011) }, + { FRAC_CONST(0.038851066313958), FRAC_CONST(0.999245012319936) }, + { FRAC_CONST(0.035580842462574), FRAC_CONST(0.999366801354564) }, + { FRAC_CONST(0.032310237568951), FRAC_CONST(0.999477887973635) }, + { FRAC_CONST(0.029039286658643), FRAC_CONST(0.999578270987499) }, + { FRAC_CONST(0.025768024760904), FRAC_CONST(0.999667949321134) }, + { FRAC_CONST(0.022496486908322), FRAC_CONST(0.999746922014158) }, + { FRAC_CONST(0.019224708136438), FRAC_CONST(0.999815188220837) }, + { FRAC_CONST(0.015952723483375), FRAC_CONST(0.999872747210095) }, + { FRAC_CONST(0.012680567989461), FRAC_CONST(0.999919598365521) }, + { FRAC_CONST(0.009408276696850), FRAC_CONST(0.999955741185376) }, + { FRAC_CONST(0.006135884649155), FRAC_CONST(0.999981175282601) }, + { FRAC_CONST(0.002863426891064), FRAC_CONST(0.999995900384816) } +}; + +#ifdef LD_DEC +/* 240 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_960[] = +{ + { FRAC_CONST(0.999999665337326), FRAC_CONST(0.000818122995607) }, + { FRAC_CONST(0.999972892444367), FRAC_CONST(0.007363041249780) }, + { FRAC_CONST(0.999903284040864), FRAC_CONST(0.013907644095771) }, + { FRAC_CONST(0.999790843108610), FRAC_CONST(0.020451651184577) }, + { FRAC_CONST(0.999635574464198), FRAC_CONST(0.026994782192715) }, + { FRAC_CONST(0.999437484758823), FRAC_CONST(0.033536756834230) }, + { FRAC_CONST(0.999196582477986), FRAC_CONST(0.040077294872701) }, + { FRAC_CONST(0.998912877941140), FRAC_CONST(0.046616116133247) }, + { FRAC_CONST(0.998586383301244), FRAC_CONST(0.053152940514528) }, + { FRAC_CONST(0.998217112544241), FRAC_CONST(0.059687488000744) }, + { FRAC_CONST(0.997805081488460), FRAC_CONST(0.066219478673630) }, + { FRAC_CONST(0.997350307783942), FRAC_CONST(0.072748632724445) }, + { FRAC_CONST(0.996852810911678), FRAC_CONST(0.079274670465961) }, + { FRAC_CONST(0.996312612182778), FRAC_CONST(0.085797312344440) }, + { FRAC_CONST(0.995729734737558), FRAC_CONST(0.092316278951614) }, + { FRAC_CONST(0.995104203544548), FRAC_CONST(0.098831291036650) }, + { FRAC_CONST(0.994436045399422), FRAC_CONST(0.105342069518114) }, + { FRAC_CONST(0.993725288923851), FRAC_CONST(0.111848335495926) }, + { FRAC_CONST(0.992971964564277), FRAC_CONST(0.118349810263305) }, + { FRAC_CONST(0.992176104590608), FRAC_CONST(0.124846215318711) }, + { FRAC_CONST(0.991337743094838), FRAC_CONST(0.131337272377774) }, + { FRAC_CONST(0.990456915989581), FRAC_CONST(0.137822703385212) }, + { FRAC_CONST(0.989533661006540), FRAC_CONST(0.144302230526747) }, + { FRAC_CONST(0.988568017694885), FRAC_CONST(0.150775576241001) }, + { FRAC_CONST(0.987560027419562), FRAC_CONST(0.157242463231389) }, + { FRAC_CONST(0.986509733359519), FRAC_CONST(0.163702614477995) }, + { FRAC_CONST(0.985417180505858), FRAC_CONST(0.170155753249442) }, + { FRAC_CONST(0.984282415659907), FRAC_CONST(0.176601603114742) }, + { FRAC_CONST(0.983105487431216), FRAC_CONST(0.183039887955141) }, + { FRAC_CONST(0.981886446235473), FRAC_CONST(0.189470331975943) }, + { FRAC_CONST(0.980625344292344), FRAC_CONST(0.195892659718330) }, + { FRAC_CONST(0.979322235623241), FRAC_CONST(0.202306596071156) }, + { FRAC_CONST(0.977977176049000), FRAC_CONST(0.208711866282735) }, + { FRAC_CONST(0.976590223187499), FRAC_CONST(0.215108195972610) }, + { FRAC_CONST(0.975161436451181), FRAC_CONST(0.221495311143304) }, + { FRAC_CONST(0.973690877044515), FRAC_CONST(0.227872938192063) }, + { FRAC_CONST(0.972178607961371), FRAC_CONST(0.234240803922570) }, + { FRAC_CONST(0.970624693982323), FRAC_CONST(0.240598635556650) }, + { FRAC_CONST(0.969029201671875), FRAC_CONST(0.246946160745958) }, + { FRAC_CONST(0.967392199375607), FRAC_CONST(0.253283107583640) }, + { FRAC_CONST(0.965713757217249), FRAC_CONST(0.259609204615985) }, + { FRAC_CONST(0.963993947095677), FRAC_CONST(0.265924180854051) }, + { FRAC_CONST(0.962232842681832), FRAC_CONST(0.272227765785273) }, + { FRAC_CONST(0.960430519415566), FRAC_CONST(0.278519689385053) }, + { FRAC_CONST(0.958587054502409), FRAC_CONST(0.284799682128326) }, + { FRAC_CONST(0.956702526910263), FRAC_CONST(0.291067475001103) }, + { FRAC_CONST(0.954777017366017), FRAC_CONST(0.297322799511998) }, + { FRAC_CONST(0.952810608352092), FRAC_CONST(0.303565387703730) }, + { FRAC_CONST(0.950803384102905), FRAC_CONST(0.309794972164597) }, + { FRAC_CONST(0.948755430601263), FRAC_CONST(0.316011286039934) }, + { FRAC_CONST(0.946666835574676), FRAC_CONST(0.322214063043544) }, + { FRAC_CONST(0.944537688491606), FRAC_CONST(0.328403037469105) }, + { FRAC_CONST(0.942368080557626), FRAC_CONST(0.334577944201551) }, + { FRAC_CONST(0.940158104711519), FRAC_CONST(0.340738518728429) }, + { FRAC_CONST(0.937907855621296), FRAC_CONST(0.346884497151231) }, + { FRAC_CONST(0.935617429680138), FRAC_CONST(0.353015616196696) }, + { FRAC_CONST(0.933286925002268), FRAC_CONST(0.359131613228090) }, + { FRAC_CONST(0.930916441418752), FRAC_CONST(0.365232226256457) }, + { FRAC_CONST(0.928506080473216), FRAC_CONST(0.371317193951838) }, + { FRAC_CONST(0.926055945417500), FRAC_CONST(0.377386255654469) }, + { FRAC_CONST(0.923566141207236), FRAC_CONST(0.383439151385947) }, + { FRAC_CONST(0.921036774497350), FRAC_CONST(0.389475621860365) }, + { FRAC_CONST(0.918467953637492), FRAC_CONST(0.395495408495417) }, + { FRAC_CONST(0.915859788667400), FRAC_CONST(0.401498253423481) }, + { FRAC_CONST(0.913212391312179), FRAC_CONST(0.407483899502658) }, + { FRAC_CONST(0.910525874977521), FRAC_CONST(0.413452090327791) }, + { FRAC_CONST(0.907800354744844), FRAC_CONST(0.419402570241451) }, + { FRAC_CONST(0.905035947366364), FRAC_CONST(0.425335084344881) }, + { FRAC_CONST(0.902232771260093), FRAC_CONST(0.431249378508924) }, + { FRAC_CONST(0.899390946504764), FRAC_CONST(0.437145199384900) }, + { FRAC_CONST(0.896510594834693), FRAC_CONST(0.443022294415467) }, + { FRAC_CONST(0.893591839634558), FRAC_CONST(0.448880411845433) }, + { FRAC_CONST(0.890634805934118), FRAC_CONST(0.454719300732547) }, + { FRAC_CONST(0.887639620402854), FRAC_CONST(0.460538710958240) }, + { FRAC_CONST(0.884606411344546), FRAC_CONST(0.466338393238348) }, + { FRAC_CONST(0.881535308691775), FRAC_CONST(0.472118099133784) }, + { FRAC_CONST(0.878426444000357), FRAC_CONST(0.477877581061184) }, + { FRAC_CONST(0.875279950443708), FRAC_CONST(0.483616592303511) }, + { FRAC_CONST(0.872095962807140), FRAC_CONST(0.489334887020625) }, + { FRAC_CONST(0.868874617482085), FRAC_CONST(0.495032220259813) }, + { FRAC_CONST(0.865616052460258), FRAC_CONST(0.500708347966279) }, + { FRAC_CONST(0.862320407327736), FRAC_CONST(0.506363026993605) }, + { FRAC_CONST(0.858987823258990), FRAC_CONST(0.511996015114162) }, + { FRAC_CONST(0.855618443010829), FRAC_CONST(0.517607071029487) }, + { FRAC_CONST(0.852212410916289), FRAC_CONST(0.523195954380619) }, + { FRAC_CONST(0.848769872878448), FRAC_CONST(0.528762425758396) }, + { FRAC_CONST(0.845290976364179), FRAC_CONST(0.534306246713712) }, + { FRAC_CONST(0.841775870397828), FRAC_CONST(0.539827179767727) }, + { FRAC_CONST(0.838224705554838), FRAC_CONST(0.545324988422046) }, + { FRAC_CONST(0.834637633955290), FRAC_CONST(0.550799437168844) }, + { FRAC_CONST(0.831014809257393), FRAC_CONST(0.556250291500956) }, + { FRAC_CONST(0.827356386650900), FRAC_CONST(0.561677317921925) }, + { FRAC_CONST(0.823662522850458), FRAC_CONST(0.567080283956001) }, + { FRAC_CONST(0.819933376088899), FRAC_CONST(0.572458958158102) }, + { FRAC_CONST(0.816169106110459), FRAC_CONST(0.577813110123727) }, + { FRAC_CONST(0.812369874163934), FRAC_CONST(0.583142510498826) }, + { FRAC_CONST(0.808535842995778), FRAC_CONST(0.588446930989624) }, + { FRAC_CONST(0.804667176843123), FRAC_CONST(0.593726144372402) }, + { FRAC_CONST(0.800764041426753), FRAC_CONST(0.598979924503229) }, + { FRAC_CONST(0.796826603943998), FRAC_CONST(0.604208046327650) }, + { FRAC_CONST(0.792855033061574), FRAC_CONST(0.609410285890327) }, + { FRAC_CONST(0.788849498908361), FRAC_CONST(0.614586420344631) }, + { FRAC_CONST(0.784810173068109), FRAC_CONST(0.619736227962191) }, + { FRAC_CONST(0.780737228572094), FRAC_CONST(0.624859488142386) }, + { FRAC_CONST(0.776630839891703), FRAC_CONST(0.629955981421804) }, + { FRAC_CONST(0.772491182930959), FRAC_CONST(0.635025489483633) }, + { FRAC_CONST(0.768318435018988), FRAC_CONST(0.640067795167023) }, + { FRAC_CONST(0.764112774902423), FRAC_CONST(0.645082682476378) }, + { FRAC_CONST(0.759874382737746), FRAC_CONST(0.650069936590618) }, + { FRAC_CONST(0.755603440083571), FRAC_CONST(0.655029343872374) }, + { FRAC_CONST(0.751300129892866), FRAC_CONST(0.659960691877147) }, + { FRAC_CONST(0.746964636505118), FRAC_CONST(0.664863769362399) }, + { FRAC_CONST(0.742597145638433), FRAC_CONST(0.669738366296610) }, + { FRAC_CONST(0.738197844381584), FRAC_CONST(0.674584273868271) }, + { FRAC_CONST(0.733766921185995), FRAC_CONST(0.679401284494831) }, + { FRAC_CONST(0.729304565857668), FRAC_CONST(0.684189191831585) }, + { FRAC_CONST(0.724810969549055), FRAC_CONST(0.688947790780520) }, + { FRAC_CONST(0.720286324750863), FRAC_CONST(0.693676877499095) }, + { FRAC_CONST(0.715730825283819), FRAC_CONST(0.698376249408973) }, + { FRAC_CONST(0.711144666290356), FRAC_CONST(0.703045705204703) }, + { FRAC_CONST(0.706528044226263), FRAC_CONST(0.707685044862340) }, + { FRAC_CONST(0.701881156852263), FRAC_CONST(0.712294069648014) }, + { FRAC_CONST(0.697204203225545), FRAC_CONST(0.716872582126442) }, + { FRAC_CONST(0.692497383691237), FRAC_CONST(0.721420386169390) }, + { FRAC_CONST(0.687760899873822), FRAC_CONST(0.725937286964068) }, + { FRAC_CONST(0.682994954668502), FRAC_CONST(0.730423091021479) }, + { FRAC_CONST(0.678199752232508), FRAC_CONST(0.734877606184707) }, + { FRAC_CONST(0.673375497976352), FRAC_CONST(0.739300641637149) }, + { FRAC_CONST(0.668522398555031), FRAC_CONST(0.743692007910687) }, + { FRAC_CONST(0.663640661859171), FRAC_CONST(0.748051516893805) }, + { FRAC_CONST(0.658730497006124), FRAC_CONST(0.752378981839648) }, + { FRAC_CONST(0.653792114331011), FRAC_CONST(0.756674217374021) }, + { FRAC_CONST(0.648825725377709), FRAC_CONST(0.760937039503328) }, + { FRAC_CONST(0.643831542889792), FRAC_CONST(0.765167265622459) }, + { FRAC_CONST(0.638809780801414), FRAC_CONST(0.769364714522605) }, + { FRAC_CONST(0.633760654228152), FRAC_CONST(0.773529206399025) }, + { FRAC_CONST(0.628684379457781), FRAC_CONST(0.777660562858748) }, + { FRAC_CONST(0.623581173941019), FRAC_CONST(0.781758606928213) }, + { FRAC_CONST(0.618451256282204), FRAC_CONST(0.785823163060853) }, + { FRAC_CONST(0.613294846229936), FRAC_CONST(0.789854057144609) }, + { FRAC_CONST(0.608112164667659), FRAC_CONST(0.793851116509396) }, + { FRAC_CONST(0.602903433604202), FRAC_CONST(0.797814169934493) }, + { FRAC_CONST(0.597668876164268), FRAC_CONST(0.801743047655882) }, + { FRAC_CONST(0.592408716578875), FRAC_CONST(0.805637581373517) }, + { FRAC_CONST(0.587123180175754), FRAC_CONST(0.809497604258536) }, + { FRAC_CONST(0.581812493369691), FRAC_CONST(0.813322950960406) }, + { FRAC_CONST(0.576476883652835), FRAC_CONST(0.817113457614006) }, + { FRAC_CONST(0.571116579584947), FRAC_CONST(0.820868961846646) }, + { FRAC_CONST(0.565731810783613), FRAC_CONST(0.824589302785025) }, + { FRAC_CONST(0.560322807914407), FRAC_CONST(0.828274321062119) }, + { FRAC_CONST(0.554889802681009), FRAC_CONST(0.831923858824010) }, + { FRAC_CONST(0.549433027815281), FRAC_CONST(0.835537759736646) }, + { FRAC_CONST(0.543952717067296), FRAC_CONST(0.839115868992540) }, + { FRAC_CONST(0.538449105195327), FRAC_CONST(0.842658033317402) }, + { FRAC_CONST(0.532922427955790), FRAC_CONST(0.846164100976699) }, + { FRAC_CONST(0.527372922093142), FRAC_CONST(0.849633921782164) }, + { FRAC_CONST(0.521800825329746), FRAC_CONST(0.853067347098221) }, + { FRAC_CONST(0.516206376355680), FRAC_CONST(0.856464229848356) }, + { FRAC_CONST(0.510589814818519), FRAC_CONST(0.859824424521420) }, + { FRAC_CONST(0.504951381313066), FRAC_CONST(0.863147787177854) }, + { FRAC_CONST(0.499291317371047), FRAC_CONST(0.866434175455865) }, + { FRAC_CONST(0.493609865450762), FRAC_CONST(0.869683448577516) }, + { FRAC_CONST(0.487907268926702), FRAC_CONST(0.872895467354761) }, + { FRAC_CONST(0.482183772079123), FRAC_CONST(0.876070094195407) }, + { FRAC_CONST(0.476439620083580), FRAC_CONST(0.879207193109004) }, + { FRAC_CONST(0.470675059000427), FRAC_CONST(0.882306629712678) }, + { FRAC_CONST(0.464890335764274), FRAC_CONST(0.885368271236879) }, + { FRAC_CONST(0.459085698173413), FRAC_CONST(0.888391986531075) }, + { FRAC_CONST(0.453261394879198), FRAC_CONST(0.891377646069366) }, + { FRAC_CONST(0.447417675375397), FRAC_CONST(0.894325121956035) }, + { FRAC_CONST(0.441554789987504), FRAC_CONST(0.897234287931024) }, + { FRAC_CONST(0.435672989862017), FRAC_CONST(0.900105019375345) }, + { FRAC_CONST(0.429772526955677), FRAC_CONST(0.902937193316419) }, + { FRAC_CONST(0.423853654024676), FRAC_CONST(0.905730688433339) }, + { FRAC_CONST(0.417916624613831), FRAC_CONST(0.908485385062073) }, + { FRAC_CONST(0.411961693045722), FRAC_CONST(0.911201165200584) }, + { FRAC_CONST(0.405989114409798), FRAC_CONST(0.913877912513892) }, + { FRAC_CONST(0.399999144551449), FRAC_CONST(0.916515512339049) }, + { FRAC_CONST(0.393992040061048), FRAC_CONST(0.919113851690058) }, + { FRAC_CONST(0.387968058262959), FRAC_CONST(0.921672819262709) }, + { FRAC_CONST(0.381927457204511), FRAC_CONST(0.924192305439348) }, + { FRAC_CONST(0.375870495644949), FRAC_CONST(0.926672202293573) }, + { FRAC_CONST(0.369797433044349), FRAC_CONST(0.929112403594856) }, + { FRAC_CONST(0.363708529552499), FRAC_CONST(0.931512804813095) }, + { FRAC_CONST(0.357604045997758), FRAC_CONST(0.933873303123091) }, + { FRAC_CONST(0.351484243875885), FRAC_CONST(0.936193797408954) }, + { FRAC_CONST(0.345349385338836), FRAC_CONST(0.938474188268430) }, + { FRAC_CONST(0.339199733183530), FRAC_CONST(0.940714378017165) }, + { FRAC_CONST(0.333035550840599), FRAC_CONST(0.942914270692887) }, + { FRAC_CONST(0.326857102363098), FRAC_CONST(0.945073772059514) }, + { FRAC_CONST(0.320664652415198), FRAC_CONST(0.947192789611197) }, + { FRAC_CONST(0.314458466260842), FRAC_CONST(0.949271232576274) }, + { FRAC_CONST(0.308238809752391), FRAC_CONST(0.951309011921168) }, + { FRAC_CONST(0.302005949319228), FRAC_CONST(0.953306040354194) }, + { FRAC_CONST(0.295760151956351), FRAC_CONST(0.955262232329299) }, + { FRAC_CONST(0.289501685212929), FRAC_CONST(0.957177504049732) }, + { FRAC_CONST(0.283230817180850), FRAC_CONST(0.959051773471624) }, + { FRAC_CONST(0.276947816483228), FRAC_CONST(0.960884960307514) }, + { FRAC_CONST(0.270652952262902), FRAC_CONST(0.962676986029777) }, + { FRAC_CONST(0.264346494170904), FRAC_CONST(0.964427773873996) }, + { FRAC_CONST(0.258028712354909), FRAC_CONST(0.966137248842248) }, + { FRAC_CONST(0.251699877447663), FRAC_CONST(0.967805337706313) }, + { FRAC_CONST(0.245360260555389), FRAC_CONST(0.969431969010818) }, + { FRAC_CONST(0.239010133246176), FRAC_CONST(0.971017073076290) }, + { FRAC_CONST(0.232649767538342), FRAC_CONST(0.972560582002147) }, + { FRAC_CONST(0.226279435888785), FRAC_CONST(0.974062429669605) }, + { FRAC_CONST(0.219899411181310), FRAC_CONST(0.975522551744506) }, + { FRAC_CONST(0.213509966714943), FRAC_CONST(0.976940885680082) }, + { FRAC_CONST(0.207111376192219), FRAC_CONST(0.978317370719628) }, + { FRAC_CONST(0.200703913707458), FRAC_CONST(0.979651947899104) }, + { FRAC_CONST(0.194287853735029), FRAC_CONST(0.980944560049668) }, + { FRAC_CONST(0.187863471117585), FRAC_CONST(0.982195151800116) }, + { FRAC_CONST(0.181431041054297), FRAC_CONST(0.983403669579260) }, + { FRAC_CONST(0.174990839089060), FRAC_CONST(0.984570061618221) }, + { FRAC_CONST(0.168543141098691), FRAC_CONST(0.985694277952645) }, + { FRAC_CONST(0.162088223281113), FRAC_CONST(0.986776270424848) }, + { FRAC_CONST(0.155626362143520), FRAC_CONST(0.987815992685872) }, + { FRAC_CONST(0.149157834490539), FRAC_CONST(0.988813400197476) }, + { FRAC_CONST(0.142682917412363), FRAC_CONST(0.989768450234042) }, + { FRAC_CONST(0.136201888272891), FRAC_CONST(0.990681101884405) }, + { FRAC_CONST(0.129715024697841), FRAC_CONST(0.991551316053606) }, + { FRAC_CONST(0.123222604562857), FRAC_CONST(0.992379055464567) }, + { FRAC_CONST(0.116724905981611), FRAC_CONST(0.993164284659685) }, + { FRAC_CONST(0.110222207293883), FRAC_CONST(0.993906970002356) }, + { FRAC_CONST(0.103714787053643), FRAC_CONST(0.994607079678411) }, + { FRAC_CONST(0.097202924017115), FRAC_CONST(0.995264583697482) }, + { FRAC_CONST(0.090686897130838), FRAC_CONST(0.995879453894286) }, + { FRAC_CONST(0.084166985519718), FRAC_CONST(0.996451663929828) }, + { FRAC_CONST(0.077643468475068), FRAC_CONST(0.996981189292537) }, + { FRAC_CONST(0.071116625442645), FRAC_CONST(0.997468007299307) }, + { FRAC_CONST(0.064586736010684), FRAC_CONST(0.997912097096476) }, + { FRAC_CONST(0.058054079897912), FRAC_CONST(0.998313439660714) }, + { FRAC_CONST(0.051518936941578), FRAC_CONST(0.998672017799843) }, + { FRAC_CONST(0.044981587085452), FRAC_CONST(0.998987816153567) }, + { FRAC_CONST(0.038442310367847), FRAC_CONST(0.999260821194138) }, + { FRAC_CONST(0.031901386909611), FRAC_CONST(0.999491021226926) }, + { FRAC_CONST(0.025359096902136), FRAC_CONST(0.999678406390929) }, + { FRAC_CONST(0.018815720595351), FRAC_CONST(0.999822968659191) }, + { FRAC_CONST(0.012271538285720), FRAC_CONST(0.999924701839145) }, + { FRAC_CONST(0.005726830304231), FRAC_CONST(0.999983601572879) } +}; +#endif // LD_DEC + +/* 60 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_240[] = +{ + { FRAC_CONST(0.999994645401696), FRAC_CONST(0.003272486506527) }, + { FRAC_CONST(0.999566308502021), FRAC_CONST(0.029448173247963) }, + { FRAC_CONST(0.998452918783950), FRAC_CONST(0.055603677682425) }, + { FRAC_CONST(0.996655239309180), FRAC_CONST(0.081721074133668) }, + { FRAC_CONST(0.994174502117428), FRAC_CONST(0.107782463042759) }, + { FRAC_CONST(0.991012407382049), FRAC_CONST(0.133769983235535) }, + { FRAC_CONST(0.987171122244825), FRAC_CONST(0.159665824163761) }, + { FRAC_CONST(0.982653279330712), FRAC_CONST(0.185452238111591) }, + { FRAC_CONST(0.977461974943572), FRAC_CONST(0.211111552358965) }, + { FRAC_CONST(0.971600766944121), FRAC_CONST(0.236626181293610) }, + { FRAC_CONST(0.965073672311547), FRAC_CONST(0.261978638463337) }, + { FRAC_CONST(0.957885164390477), FRAC_CONST(0.287151548560387) }, + { FRAC_CONST(0.950040169825165), FRAC_CONST(0.312127659329594) }, + { FRAC_CONST(0.941544065183021), FRAC_CONST(0.336889853392220) }, + { FRAC_CONST(0.932402673269775), FRAC_CONST(0.361421159977355) }, + { FRAC_CONST(0.922622259138823), FRAC_CONST(0.385704766552831) }, + { FRAC_CONST(0.912209525797468), FRAC_CONST(0.409724030347695) }, + { FRAC_CONST(0.901171609613013), FRAC_CONST(0.433462489758331) }, + { FRAC_CONST(0.889516075421856), FRAC_CONST(0.456903875630421) }, + { FRAC_CONST(0.877250911344924), FRAC_CONST(0.480032122409011) }, + { FRAC_CONST(0.864384523313017), FRAC_CONST(0.502831379149042) }, + { FRAC_CONST(0.850925729305802), FRAC_CONST(0.525286020378792) }, + { FRAC_CONST(0.836883753308409), FRAC_CONST(0.547380656808797) }, + { FRAC_CONST(0.822268218989775), FRAC_CONST(0.569100145878898) }, + { FRAC_CONST(0.807089143107059), FRAC_CONST(0.590429602136201) }, + { FRAC_CONST(0.791356928640660), FRAC_CONST(0.611354407436816) }, + { FRAC_CONST(0.775082357664531), FRAC_CONST(0.631860220964409) }, + { FRAC_CONST(0.758276583956687), FRAC_CONST(0.651932989058674) }, + { FRAC_CONST(0.740951125354959), FRAC_CONST(0.671558954847018) }, + { FRAC_CONST(0.723117855863248), FRAC_CONST(0.690724667672829) }, + { FRAC_CONST(0.704788997513670), FRAC_CONST(0.709416992313883) }, + { FRAC_CONST(0.685977111990193), FRAC_CONST(0.727623117984575) }, + { FRAC_CONST(0.666695092019479), FRAC_CONST(0.745330567115786) }, + { FRAC_CONST(0.646956152534857), FRAC_CONST(0.762527203906388) }, + { FRAC_CONST(0.626773821619469), FRAC_CONST(0.779201242640517) }, + { FRAC_CONST(0.606161931234795), FRAC_CONST(0.795341255764910) }, + { FRAC_CONST(0.585134607740916), FRAC_CONST(0.810936181720784) }, + { FRAC_CONST(0.563706262215017), FRAC_CONST(0.825975332524873) }, + { FRAC_CONST(0.541891580574752), FRAC_CONST(0.840448401094438) }, + { FRAC_CONST(0.519705513513249), FRAC_CONST(0.854345468311227) }, + { FRAC_CONST(0.497163266252654), FRAC_CONST(0.867657009819544) }, + { FRAC_CONST(0.474280288123229), FRAC_CONST(0.880373902553765) }, + { FRAC_CONST(0.451072261975153), FRAC_CONST(0.892487430990834) }, + { FRAC_CONST(0.427555093430282), FRAC_CONST(0.903989293123443) }, + { FRAC_CONST(0.403744899981227), FRAC_CONST(0.914871606149819) }, + { FRAC_CONST(0.379657999945233), FRAC_CONST(0.925126911876195) }, + { FRAC_CONST(0.355310901280416), FRAC_CONST(0.934748181828292) }, + { FRAC_CONST(0.330720290272038), FRAC_CONST(0.943728822068278) }, + { FRAC_CONST(0.305903020096554), FRAC_CONST(0.952062677713924) }, + { FRAC_CONST(0.280876099271292), FRAC_CONST(0.959744037156857) }, + { FRAC_CONST(0.255656679997665), FRAC_CONST(0.966767635977008) }, + { FRAC_CONST(0.230262046405902), FRAC_CONST(0.973128660550580) }, + { FRAC_CONST(0.204709602709380), FRAC_CONST(0.978822751349072) }, + { FRAC_CONST(0.179016861276633), FRAC_CONST(0.983846005927077) }, + { FRAC_CONST(0.153201430629259), FRAC_CONST(0.988194981596825) }, + { FRAC_CONST(0.127281003373913), FRAC_CONST(0.991866697787626) }, + { FRAC_CONST(0.101273344076683), FRAC_CONST(0.994858638088611) }, + { FRAC_CONST(0.075196277088140), FRAC_CONST(0.997168751973348) }, + { FRAC_CONST(0.049067674327418), FRAC_CONST(0.998795456205172) }, + { FRAC_CONST(0.022905443033697), FRAC_CONST(0.999737635922260) } +}; +#endif // ALLOW_SMALL_FRAMELENGTH + +#ifdef SSR_DEC +/* 128 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_512[] = +{ + { FRAC_CONST(0.999998823451702), FRAC_CONST(0.001533980186285) }, + { FRAC_CONST(0.999904701082853), FRAC_CONST(0.013805388528060) }, + { FRAC_CONST(0.999659996743959), FRAC_CONST(0.026074717829104) }, + { FRAC_CONST(0.999264747286594), FRAC_CONST(0.038340120373553) }, + { FRAC_CONST(0.998719012233873), FRAC_CONST(0.050599749036899) }, + { FRAC_CONST(0.998022873771486), FRAC_CONST(0.062851757564161) }, + { FRAC_CONST(0.997176436735326), FRAC_CONST(0.075094300847921) }, + { FRAC_CONST(0.996179828595697), FRAC_CONST(0.087325535206192) }, + { FRAC_CONST(0.995033199438119), FRAC_CONST(0.099543618660069) }, + { FRAC_CONST(0.993736721940725), FRAC_CONST(0.111746711211127) }, + { FRAC_CONST(0.992290591348257), FRAC_CONST(0.123932975118512) }, + { FRAC_CONST(0.990695025442665), FRAC_CONST(0.136100575175706) }, + { FRAC_CONST(0.988950264510303), FRAC_CONST(0.148247678986896) }, + { FRAC_CONST(0.987056571305751), FRAC_CONST(0.160372457242928) }, + { FRAC_CONST(0.985014231012240), FRAC_CONST(0.172473083996796) }, + { FRAC_CONST(0.982823551198705), FRAC_CONST(0.184547736938620) }, + { FRAC_CONST(0.980484861773469), FRAC_CONST(0.196594597670080) }, + { FRAC_CONST(0.977998514934557), FRAC_CONST(0.208611851978263) }, + { FRAC_CONST(0.975364885116657), FRAC_CONST(0.220597690108874) }, + { FRAC_CONST(0.972584368934732), FRAC_CONST(0.232550307038775) }, + { FRAC_CONST(0.969657385124292), FRAC_CONST(0.244467902747824) }, + { FRAC_CONST(0.966584374478333), FRAC_CONST(0.256348682489943) }, + { FRAC_CONST(0.963365799780954), FRAC_CONST(0.268190857063403) }, + { FRAC_CONST(0.960002145737666), FRAC_CONST(0.279992643080273) }, + { FRAC_CONST(0.956493918902395), FRAC_CONST(0.291752263234989) }, + { FRAC_CONST(0.952841647601199), FRAC_CONST(0.303467946572011) }, + { FRAC_CONST(0.949045881852701), FRAC_CONST(0.315137928752522) }, + { FRAC_CONST(0.945107193285261), FRAC_CONST(0.326760452320132) }, + { FRAC_CONST(0.941026175050889), FRAC_CONST(0.338333766965541) }, + { FRAC_CONST(0.936803441735922), FRAC_CONST(0.349856129790135) }, + { FRAC_CONST(0.932439629268462), FRAC_CONST(0.361325805568454) }, + { FRAC_CONST(0.927935394822618), FRAC_CONST(0.372741067009516) }, + { FRAC_CONST(0.923291416719528), FRAC_CONST(0.384100195016935) }, + { FRAC_CONST(0.918508394325212), FRAC_CONST(0.395401478947816) }, + { FRAC_CONST(0.913587047945251), FRAC_CONST(0.406643216870369) }, + { FRAC_CONST(0.908528118716306), FRAC_CONST(0.417823715820212) }, + { FRAC_CONST(0.903332368494512), FRAC_CONST(0.428941292055329) }, + { FRAC_CONST(0.898000579740740), FRAC_CONST(0.439994271309633) }, + { FRAC_CONST(0.892533555402765), FRAC_CONST(0.450980989045104) }, + { FRAC_CONST(0.886932118794342), FRAC_CONST(0.461899790702463) }, + { FRAC_CONST(0.881197113471222), FRAC_CONST(0.472749031950343) }, + { FRAC_CONST(0.875329403104111), FRAC_CONST(0.483527078932919) }, + { FRAC_CONST(0.869329871348607), FRAC_CONST(0.494232308515960) }, + { FRAC_CONST(0.863199421712124), FRAC_CONST(0.504863108531268) }, + { FRAC_CONST(0.856938977417829), FRAC_CONST(0.515417878019463) }, + { FRAC_CONST(0.850549481265603), FRAC_CONST(0.525895027471085) }, + { FRAC_CONST(0.844031895490066), FRAC_CONST(0.536292979065963) }, + { FRAC_CONST(0.837387201615662), FRAC_CONST(0.546610166910835) }, + { FRAC_CONST(0.830616400308846), FRAC_CONST(0.556845037275160) }, + { FRAC_CONST(0.823720511227391), FRAC_CONST(0.566996048825109) }, + { FRAC_CONST(0.816700572866828), FRAC_CONST(0.577061672855679) }, + { FRAC_CONST(0.809557642404051), FRAC_CONST(0.587040393520918) }, + { FRAC_CONST(0.802292795538116), FRAC_CONST(0.596930708062197) }, + { FRAC_CONST(0.794907126328237), FRAC_CONST(0.606731127034524) }, + { FRAC_CONST(0.787401747029031), FRAC_CONST(0.616440174530854) }, + { FRAC_CONST(0.779777787923015), FRAC_CONST(0.626056388404344) }, + { FRAC_CONST(0.772036397150385), FRAC_CONST(0.635578320488556) }, + { FRAC_CONST(0.764178740536117), FRAC_CONST(0.645004536815544) }, + { FRAC_CONST(0.756206001414395), FRAC_CONST(0.654333617831800) }, + { FRAC_CONST(0.748119380450404), FRAC_CONST(0.663564158612040) }, + { FRAC_CONST(0.739920095459516), FRAC_CONST(0.672694769070773) }, + { FRAC_CONST(0.731609381223893), FRAC_CONST(0.681724074171650) }, + { FRAC_CONST(0.723188489306527), FRAC_CONST(0.690650714134535) }, + { FRAC_CONST(0.714658687862769), FRAC_CONST(0.699473344640284) }, + { FRAC_CONST(0.706021261449340), FRAC_CONST(0.708190637033195) }, + { FRAC_CONST(0.697277510830887), FRAC_CONST(0.716801278521100) }, + { FRAC_CONST(0.688428752784091), FRAC_CONST(0.725303972373061) }, + { FRAC_CONST(0.679476319899365), FRAC_CONST(0.733697438114660) }, + { FRAC_CONST(0.670421560380173), FRAC_CONST(0.741980411720831) }, + { FRAC_CONST(0.661265837839992), FRAC_CONST(0.750151645806215) }, + { FRAC_CONST(0.652010531096960), FRAC_CONST(0.758209909813015) }, + { FRAC_CONST(0.642657033966227), FRAC_CONST(0.766153990196313) }, + { FRAC_CONST(0.633206755050057), FRAC_CONST(0.773982690606823) }, + { FRAC_CONST(0.623661117525695), FRAC_CONST(0.781694832071059) }, + { FRAC_CONST(0.614021558931038), FRAC_CONST(0.789289253168886) }, + { FRAC_CONST(0.604289530948156), FRAC_CONST(0.796764810208419) }, + { FRAC_CONST(0.594466499184665), FRAC_CONST(0.804120377398266) }, + { FRAC_CONST(0.584553942953015), FRAC_CONST(0.811354847017064) }, + { FRAC_CONST(0.574553355047716), FRAC_CONST(0.818467129580299) }, + { FRAC_CONST(0.564466241520520), FRAC_CONST(0.825456154004377) }, + { FRAC_CONST(0.554294121453620), FRAC_CONST(0.832320867767930) }, + { FRAC_CONST(0.544038526730884), FRAC_CONST(0.839060237070313) }, + { FRAC_CONST(0.533701001807153), FRAC_CONST(0.845673246987299) }, + { FRAC_CONST(0.523283103475656), FRAC_CONST(0.852158901623920) }, + { FRAC_CONST(0.512786400633563), FRAC_CONST(0.858516224264443) }, + { FRAC_CONST(0.502212474045711), FRAC_CONST(0.864744257519462) }, + { FRAC_CONST(0.491562916106550), FRAC_CONST(0.870842063470079) }, + { FRAC_CONST(0.480839330600334), FRAC_CONST(0.876808723809146) }, + { FRAC_CONST(0.470043332459596), FRAC_CONST(0.882643339979563) }, + { FRAC_CONST(0.459176547521944), FRAC_CONST(0.888345033309596) }, + { FRAC_CONST(0.448240612285220), FRAC_CONST(0.893912945145203) }, + { FRAC_CONST(0.437237173661044), FRAC_CONST(0.899346236979341) }, + { FRAC_CONST(0.426167888726800), FRAC_CONST(0.904644090578246) }, + { FRAC_CONST(0.415034424476082), FRAC_CONST(0.909805708104652) }, + { FRAC_CONST(0.403838457567654), FRAC_CONST(0.914830312237946) }, + { FRAC_CONST(0.392581674072952), FRAC_CONST(0.919717146291227) }, + { FRAC_CONST(0.381265769222162), FRAC_CONST(0.924465474325263) }, + { FRAC_CONST(0.369892447148934), FRAC_CONST(0.929074581259316) }, + { FRAC_CONST(0.358463420633737), FRAC_CONST(0.933543772978836) }, + { FRAC_CONST(0.346980410845924), FRAC_CONST(0.937872376439990) }, + { FRAC_CONST(0.335445147084532), FRAC_CONST(0.942059739771017) }, + { FRAC_CONST(0.323859366517853), FRAC_CONST(0.946105232370403) }, + { FRAC_CONST(0.312224813921825), FRAC_CONST(0.950008245001843) }, + { FRAC_CONST(0.300543241417273), FRAC_CONST(0.953768189885990) }, + { FRAC_CONST(0.288816408206049), FRAC_CONST(0.957384500788976) }, + { FRAC_CONST(0.277046080306100), FRAC_CONST(0.960856633107680) }, + { FRAC_CONST(0.265234030285512), FRAC_CONST(0.964184063951746) }, + { FRAC_CONST(0.253382036995570), FRAC_CONST(0.967366292222329) }, + { FRAC_CONST(0.241491885302869), FRAC_CONST(0.970402838687556) }, + { FRAC_CONST(0.229565365820519), FRAC_CONST(0.973293246054698) }, + { FRAC_CONST(0.217604274638484), FRAC_CONST(0.976037079039039) }, + { FRAC_CONST(0.205610413053099), FRAC_CONST(0.978633924429423) }, + { FRAC_CONST(0.193585587295804), FRAC_CONST(0.981083391150487) }, + { FRAC_CONST(0.181531608261125), FRAC_CONST(0.983385110321551) }, + { FRAC_CONST(0.169450291233968), FRAC_CONST(0.985538735312176) }, + { FRAC_CONST(0.157343455616238), FRAC_CONST(0.987543941794359) }, + { FRAC_CONST(0.145212924652848), FRAC_CONST(0.989400427791380) }, + { FRAC_CONST(0.133060525157139), FRAC_CONST(0.991107913723277) }, + { FRAC_CONST(0.120888087235777), FRAC_CONST(0.992666142448948) }, + { FRAC_CONST(0.108697444013139), FRAC_CONST(0.994074879304879) }, + { FRAC_CONST(0.096490431355253), FRAC_CONST(0.995333912140482) }, + { FRAC_CONST(0.084268887593324), FRAC_CONST(0.996443051350043) }, + { FRAC_CONST(0.072034653246889), FRAC_CONST(0.997402129901275) }, + { FRAC_CONST(0.059789570746640), FRAC_CONST(0.998211003360478) }, + { FRAC_CONST(0.047535484156959), FRAC_CONST(0.998869549914284) }, + { FRAC_CONST(0.035274238898214), FRAC_CONST(0.999377670388003) }, + { FRAC_CONST(0.023007681468839), FRAC_CONST(0.999735288260562) }, + { FRAC_CONST(0.010737659167265), FRAC_CONST(0.999942349676024) } +}; + +/* 16 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_64[] = +{ + { FRAC_CONST(0.999924701839145), FRAC_CONST(0.012271538285720) }, + { FRAC_CONST(0.993906970002356), FRAC_CONST(0.110222207293883) }, + { FRAC_CONST(0.978317370719628), FRAC_CONST(0.207111376192219) }, + { FRAC_CONST(0.953306040354194), FRAC_CONST(0.302005949319228) }, + { FRAC_CONST(0.919113851690058), FRAC_CONST(0.393992040061048) }, + { FRAC_CONST(0.876070094195407), FRAC_CONST(0.482183772079123) }, + { FRAC_CONST(0.824589302785025), FRAC_CONST(0.565731810783613) }, + { FRAC_CONST(0.765167265622459), FRAC_CONST(0.643831542889791) }, + { FRAC_CONST(0.698376249408973), FRAC_CONST(0.715730825283819) }, + { FRAC_CONST(0.624859488142386), FRAC_CONST(0.780737228572094) }, + { FRAC_CONST(0.545324988422046), FRAC_CONST(0.838224705554838) }, + { FRAC_CONST(0.460538710958240), FRAC_CONST(0.887639620402854) }, + { FRAC_CONST(0.371317193951838), FRAC_CONST(0.928506080473215) }, + { FRAC_CONST(0.278519689385053), FRAC_CONST(0.960430519415566) }, + { FRAC_CONST(0.183039887955141), FRAC_CONST(0.983105487431216) }, + { FRAC_CONST(0.085797312344440), FRAC_CONST(0.996312612182778) } +}; +#endif // SSR_DEC + +#else // FIXED_POINT + +/* 256 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_2048[] = +{ + { FRAC_CONST(0.031249997702054), FRAC_CONST(0.000011984224612) }, + { FRAC_CONST(0.031249813866531), FRAC_CONST(0.000107857810004) }, + { FRAC_CONST(0.031249335895858), FRAC_CONST(0.000203730380198) }, + { FRAC_CONST(0.031248563794535), FRAC_CONST(0.000299601032804) }, + { FRAC_CONST(0.031247497569829), FRAC_CONST(0.000395468865451) }, + { FRAC_CONST(0.031246137231775), FRAC_CONST(0.000491332975794) }, + { FRAC_CONST(0.031244482793177), FRAC_CONST(0.000587192461525) }, + { FRAC_CONST(0.031242534269608), FRAC_CONST(0.000683046420376) }, + { FRAC_CONST(0.031240291679407), FRAC_CONST(0.000778893950134) }, + { FRAC_CONST(0.031237755043684), FRAC_CONST(0.000874734148645) }, + { FRAC_CONST(0.031234924386313), FRAC_CONST(0.000970566113826) }, + { FRAC_CONST(0.031231799733938), FRAC_CONST(0.001066388943669) }, + { FRAC_CONST(0.031228381115970), FRAC_CONST(0.001162201736253) }, + { FRAC_CONST(0.031224668564585), FRAC_CONST(0.001258003589751) }, + { FRAC_CONST(0.031220662114728), FRAC_CONST(0.001353793602441) }, + { FRAC_CONST(0.031216361804108), FRAC_CONST(0.001449570872710) }, + { FRAC_CONST(0.031211767673203), FRAC_CONST(0.001545334499065) }, + { FRAC_CONST(0.031206879765253), FRAC_CONST(0.001641083580144) }, + { FRAC_CONST(0.031201698126266), FRAC_CONST(0.001736817214719) }, + { FRAC_CONST(0.031196222805014), FRAC_CONST(0.001832534501709) }, + { FRAC_CONST(0.031190453853031), FRAC_CONST(0.001928234540186) }, + { FRAC_CONST(0.031184391324617), FRAC_CONST(0.002023916429386) }, + { FRAC_CONST(0.031178035276836), FRAC_CONST(0.002119579268713) }, + { FRAC_CONST(0.031171385769513), FRAC_CONST(0.002215222157753) }, + { FRAC_CONST(0.031164442865236), FRAC_CONST(0.002310844196278) }, + { FRAC_CONST(0.031157206629353), FRAC_CONST(0.002406444484258) }, + { FRAC_CONST(0.031149677129975), FRAC_CONST(0.002502022121865) }, + { FRAC_CONST(0.031141854437973), FRAC_CONST(0.002597576209488) }, + { FRAC_CONST(0.031133738626977), FRAC_CONST(0.002693105847734) }, + { FRAC_CONST(0.031125329773375), FRAC_CONST(0.002788610137442) }, + { FRAC_CONST(0.031116627956316), FRAC_CONST(0.002884088179689) }, + { FRAC_CONST(0.031107633257703), FRAC_CONST(0.002979539075801) }, + { FRAC_CONST(0.031098345762200), FRAC_CONST(0.003074961927355) }, + { FRAC_CONST(0.031088765557222), FRAC_CONST(0.003170355836197) }, + { FRAC_CONST(0.031078892732942), FRAC_CONST(0.003265719904442) }, + { FRAC_CONST(0.031068727382288), FRAC_CONST(0.003361053234488) }, + { FRAC_CONST(0.031058269600939), FRAC_CONST(0.003456354929021) }, + { FRAC_CONST(0.031047519487329), FRAC_CONST(0.003551624091024) }, + { FRAC_CONST(0.031036477142640), FRAC_CONST(0.003646859823790) }, + { FRAC_CONST(0.031025142670809), FRAC_CONST(0.003742061230921) }, + { FRAC_CONST(0.031013516178519), FRAC_CONST(0.003837227416347) }, + { FRAC_CONST(0.031001597775203), FRAC_CONST(0.003932357484328) }, + { FRAC_CONST(0.030989387573042), FRAC_CONST(0.004027450539462) }, + { FRAC_CONST(0.030976885686963), FRAC_CONST(0.004122505686697) }, + { FRAC_CONST(0.030964092234638), FRAC_CONST(0.004217522031340) }, + { FRAC_CONST(0.030951007336485), FRAC_CONST(0.004312498679058) }, + { FRAC_CONST(0.030937631115663), FRAC_CONST(0.004407434735897) }, + { FRAC_CONST(0.030923963698074), FRAC_CONST(0.004502329308281) }, + { FRAC_CONST(0.030910005212362), FRAC_CONST(0.004597181503027) }, + { FRAC_CONST(0.030895755789908), FRAC_CONST(0.004691990427350) }, + { FRAC_CONST(0.030881215564835), FRAC_CONST(0.004786755188872) }, + { FRAC_CONST(0.030866384674000), FRAC_CONST(0.004881474895632) }, + { FRAC_CONST(0.030851263256996), FRAC_CONST(0.004976148656090) }, + { FRAC_CONST(0.030835851456154), FRAC_CONST(0.005070775579142) }, + { FRAC_CONST(0.030820149416533), FRAC_CONST(0.005165354774124) }, + { FRAC_CONST(0.030804157285929), FRAC_CONST(0.005259885350819) }, + { FRAC_CONST(0.030787875214864), FRAC_CONST(0.005354366419469) }, + { FRAC_CONST(0.030771303356593), FRAC_CONST(0.005448797090784) }, + { FRAC_CONST(0.030754441867095), FRAC_CONST(0.005543176475946) }, + { FRAC_CONST(0.030737290905077), FRAC_CONST(0.005637503686619) }, + { FRAC_CONST(0.030719850631972), FRAC_CONST(0.005731777834961) }, + { FRAC_CONST(0.030702121211932), FRAC_CONST(0.005825998033626) }, + { FRAC_CONST(0.030684102811835), FRAC_CONST(0.005920163395780) }, + { FRAC_CONST(0.030665795601276), FRAC_CONST(0.006014273035101) }, + { FRAC_CONST(0.030647199752570), FRAC_CONST(0.006108326065793) }, + { FRAC_CONST(0.030628315440748), FRAC_CONST(0.006202321602594) }, + { FRAC_CONST(0.030609142843557), FRAC_CONST(0.006296258760782) }, + { FRAC_CONST(0.030589682141455), FRAC_CONST(0.006390136656185) }, + { FRAC_CONST(0.030569933517616), FRAC_CONST(0.006483954405188) }, + { FRAC_CONST(0.030549897157919), FRAC_CONST(0.006577711124743) }, + { FRAC_CONST(0.030529573250956), FRAC_CONST(0.006671405932375) }, + { FRAC_CONST(0.030508961988022), FRAC_CONST(0.006765037946194) }, + { FRAC_CONST(0.030488063563118), FRAC_CONST(0.006858606284900) }, + { FRAC_CONST(0.030466878172949), FRAC_CONST(0.006952110067791) }, + { FRAC_CONST(0.030445406016919), FRAC_CONST(0.007045548414774) }, + { FRAC_CONST(0.030423647297133), FRAC_CONST(0.007138920446372) }, + { FRAC_CONST(0.030401602218392), FRAC_CONST(0.007232225283733) }, + { FRAC_CONST(0.030379270988192), FRAC_CONST(0.007325462048634) }, + { FRAC_CONST(0.030356653816724), FRAC_CONST(0.007418629863497) }, + { FRAC_CONST(0.030333750916869), FRAC_CONST(0.007511727851390) }, + { FRAC_CONST(0.030310562504198), FRAC_CONST(0.007604755136040) }, + { FRAC_CONST(0.030287088796968), FRAC_CONST(0.007697710841838) }, + { FRAC_CONST(0.030263330016124), FRAC_CONST(0.007790594093851) }, + { FRAC_CONST(0.030239286385293), FRAC_CONST(0.007883404017824) }, + { FRAC_CONST(0.030214958130781), FRAC_CONST(0.007976139740197) }, + { FRAC_CONST(0.030190345481576), FRAC_CONST(0.008068800388104) }, + { FRAC_CONST(0.030165448669342), FRAC_CONST(0.008161385089390) }, + { FRAC_CONST(0.030140267928416), FRAC_CONST(0.008253892972610) }, + { FRAC_CONST(0.030114803495809), FRAC_CONST(0.008346323167047) }, + { FRAC_CONST(0.030089055611203), FRAC_CONST(0.008438674802711) }, + { FRAC_CONST(0.030063024516947), FRAC_CONST(0.008530947010354) }, + { FRAC_CONST(0.030036710458054), FRAC_CONST(0.008623138921475) }, + { FRAC_CONST(0.030010113682202), FRAC_CONST(0.008715249668328) }, + { FRAC_CONST(0.029983234439732), FRAC_CONST(0.008807278383932) }, + { FRAC_CONST(0.029956072983640), FRAC_CONST(0.008899224202078) }, + { FRAC_CONST(0.029928629569580), FRAC_CONST(0.008991086257336) }, + { FRAC_CONST(0.029900904455860), FRAC_CONST(0.009082863685067) }, + { FRAC_CONST(0.029872897903441), FRAC_CONST(0.009174555621425) }, + { FRAC_CONST(0.029844610175929), FRAC_CONST(0.009266161203371) }, + { FRAC_CONST(0.029816041539579), FRAC_CONST(0.009357679568679) }, + { FRAC_CONST(0.029787192263292), FRAC_CONST(0.009449109855944) }, + { FRAC_CONST(0.029758062618606), FRAC_CONST(0.009540451204587) }, + { FRAC_CONST(0.029728652879702), FRAC_CONST(0.009631702754871) }, + { FRAC_CONST(0.029698963323395), FRAC_CONST(0.009722863647900) }, + { FRAC_CONST(0.029668994229134), FRAC_CONST(0.009813933025633) }, + { FRAC_CONST(0.029638745879000), FRAC_CONST(0.009904910030891) }, + { FRAC_CONST(0.029608218557702), FRAC_CONST(0.009995793807363) }, + { FRAC_CONST(0.029577412552575), FRAC_CONST(0.010086583499618) }, + { FRAC_CONST(0.029546328153577), FRAC_CONST(0.010177278253107) }, + { FRAC_CONST(0.029514965653285), FRAC_CONST(0.010267877214177) }, + { FRAC_CONST(0.029483325346896), FRAC_CONST(0.010358379530076) }, + { FRAC_CONST(0.029451407532220), FRAC_CONST(0.010448784348962) }, + { FRAC_CONST(0.029419212509679), FRAC_CONST(0.010539090819911) }, + { FRAC_CONST(0.029386740582307), FRAC_CONST(0.010629298092923) }, + { FRAC_CONST(0.029353992055740), FRAC_CONST(0.010719405318933) }, + { FRAC_CONST(0.029320967238220), FRAC_CONST(0.010809411649818) }, + { FRAC_CONST(0.029287666440590), FRAC_CONST(0.010899316238403) }, + { FRAC_CONST(0.029254089976290), FRAC_CONST(0.010989118238474) }, + { FRAC_CONST(0.029220238161353), FRAC_CONST(0.011078816804778) }, + { FRAC_CONST(0.029186111314406), FRAC_CONST(0.011168411093039) }, + { FRAC_CONST(0.029151709756664), FRAC_CONST(0.011257900259961) }, + { FRAC_CONST(0.029117033811927), FRAC_CONST(0.011347283463239) }, + { FRAC_CONST(0.029082083806579), FRAC_CONST(0.011436559861563) }, + { FRAC_CONST(0.029046860069582), FRAC_CONST(0.011525728614630) }, + { FRAC_CONST(0.029011362932476), FRAC_CONST(0.011614788883150) }, + { FRAC_CONST(0.028975592729373), FRAC_CONST(0.011703739828853) }, + { FRAC_CONST(0.028939549796957), FRAC_CONST(0.011792580614500) }, + { FRAC_CONST(0.028903234474475), FRAC_CONST(0.011881310403886) }, + { FRAC_CONST(0.028866647103744), FRAC_CONST(0.011969928361855) }, + { FRAC_CONST(0.028829788029135), FRAC_CONST(0.012058433654299) }, + { FRAC_CONST(0.028792657597583), FRAC_CONST(0.012146825448172) }, + { FRAC_CONST(0.028755256158571), FRAC_CONST(0.012235102911499) }, + { FRAC_CONST(0.028717584064137), FRAC_CONST(0.012323265213377) }, + { FRAC_CONST(0.028679641668864), FRAC_CONST(0.012411311523990) }, + { FRAC_CONST(0.028641429329882), FRAC_CONST(0.012499241014612) }, + { FRAC_CONST(0.028602947406859), FRAC_CONST(0.012587052857618) }, + { FRAC_CONST(0.028564196262001), FRAC_CONST(0.012674746226488) }, + { FRAC_CONST(0.028525176260050), FRAC_CONST(0.012762320295819) }, + { FRAC_CONST(0.028485887768276), FRAC_CONST(0.012849774241331) }, + { FRAC_CONST(0.028446331156478), FRAC_CONST(0.012937107239875) }, + { FRAC_CONST(0.028406506796976), FRAC_CONST(0.013024318469437) }, + { FRAC_CONST(0.028366415064615), FRAC_CONST(0.013111407109155) }, + { FRAC_CONST(0.028326056336751), FRAC_CONST(0.013198372339315) }, + { FRAC_CONST(0.028285430993258), FRAC_CONST(0.013285213341368) }, + { FRAC_CONST(0.028244539416515), FRAC_CONST(0.013371929297933) }, + { FRAC_CONST(0.028203381991411), FRAC_CONST(0.013458519392807) }, + { FRAC_CONST(0.028161959105334), FRAC_CONST(0.013544982810971) }, + { FRAC_CONST(0.028120271148172), FRAC_CONST(0.013631318738598) }, + { FRAC_CONST(0.028078318512309), FRAC_CONST(0.013717526363062) }, + { FRAC_CONST(0.028036101592619), FRAC_CONST(0.013803604872943) }, + { FRAC_CONST(0.027993620786463), FRAC_CONST(0.013889553458039) }, + { FRAC_CONST(0.027950876493687), FRAC_CONST(0.013975371309367) }, + { FRAC_CONST(0.027907869116616), FRAC_CONST(0.014061057619178) }, + { FRAC_CONST(0.027864599060052), FRAC_CONST(0.014146611580959) }, + { FRAC_CONST(0.027821066731270), FRAC_CONST(0.014232032389445) }, + { FRAC_CONST(0.027777272540012), FRAC_CONST(0.014317319240622) }, + { FRAC_CONST(0.027733216898487), FRAC_CONST(0.014402471331737) }, + { FRAC_CONST(0.027688900221361), FRAC_CONST(0.014487487861307) }, + { FRAC_CONST(0.027644322925762), FRAC_CONST(0.014572368029123) }, + { FRAC_CONST(0.027599485431266), FRAC_CONST(0.014657111036262) }, + { FRAC_CONST(0.027554388159903), FRAC_CONST(0.014741716085090) }, + { FRAC_CONST(0.027509031536144), FRAC_CONST(0.014826182379271) }, + { FRAC_CONST(0.027463415986904), FRAC_CONST(0.014910509123778) }, + { FRAC_CONST(0.027417541941533), FRAC_CONST(0.014994695524894) }, + { FRAC_CONST(0.027371409831816), FRAC_CONST(0.015078740790225) }, + { FRAC_CONST(0.027325020091965), FRAC_CONST(0.015162644128704) }, + { FRAC_CONST(0.027278373158618), FRAC_CONST(0.015246404750603) }, + { FRAC_CONST(0.027231469470833), FRAC_CONST(0.015330021867534) }, + { FRAC_CONST(0.027184309470088), FRAC_CONST(0.015413494692460) }, + { FRAC_CONST(0.027136893600268), FRAC_CONST(0.015496822439704) }, + { FRAC_CONST(0.027089222307671), FRAC_CONST(0.015580004324954) }, + { FRAC_CONST(0.027041296040997), FRAC_CONST(0.015663039565269) }, + { FRAC_CONST(0.026993115251345), FRAC_CONST(0.015745927379091) }, + { FRAC_CONST(0.026944680392213), FRAC_CONST(0.015828666986247) }, + { FRAC_CONST(0.026895991919487), FRAC_CONST(0.015911257607961) }, + { FRAC_CONST(0.026847050291442), FRAC_CONST(0.015993698466859) }, + { FRAC_CONST(0.026797855968734), FRAC_CONST(0.016075988786976) }, + { FRAC_CONST(0.026748409414401), FRAC_CONST(0.016158127793763) }, + { FRAC_CONST(0.026698711093851), FRAC_CONST(0.016240114714099) }, + { FRAC_CONST(0.026648761474864), FRAC_CONST(0.016321948776289) }, + { FRAC_CONST(0.026598561027585), FRAC_CONST(0.016403629210082) }, + { FRAC_CONST(0.026548110224519), FRAC_CONST(0.016485155246669) }, + { FRAC_CONST(0.026497409540530), FRAC_CONST(0.016566526118696) }, + { FRAC_CONST(0.026446459452830), FRAC_CONST(0.016647741060271) }, + { FRAC_CONST(0.026395260440982), FRAC_CONST(0.016728799306966) }, + { FRAC_CONST(0.026343812986890), FRAC_CONST(0.016809700095831) }, + { FRAC_CONST(0.026292117574797), FRAC_CONST(0.016890442665397) }, + { FRAC_CONST(0.026240174691280), FRAC_CONST(0.016971026255683) }, + { FRAC_CONST(0.026187984825246), FRAC_CONST(0.017051450108208) }, + { FRAC_CONST(0.026135548467924), FRAC_CONST(0.017131713465990) }, + { FRAC_CONST(0.026082866112867), FRAC_CONST(0.017211815573560) }, + { FRAC_CONST(0.026029938255941), FRAC_CONST(0.017291755676967) }, + { FRAC_CONST(0.025976765395322), FRAC_CONST(0.017371533023784) }, + { FRAC_CONST(0.025923348031494), FRAC_CONST(0.017451146863116) }, + { FRAC_CONST(0.025869686667242), FRAC_CONST(0.017530596445607) }, + { FRAC_CONST(0.025815781807646), FRAC_CONST(0.017609881023449) }, + { FRAC_CONST(0.025761633960080), FRAC_CONST(0.017688999850383) }, + { FRAC_CONST(0.025707243634204), FRAC_CONST(0.017767952181715) }, + { FRAC_CONST(0.025652611341960), FRAC_CONST(0.017846737274313) }, + { FRAC_CONST(0.025597737597568), FRAC_CONST(0.017925354386623) }, + { FRAC_CONST(0.025542622917522), FRAC_CONST(0.018003802778671) }, + { FRAC_CONST(0.025487267820581), FRAC_CONST(0.018082081712071) }, + { FRAC_CONST(0.025431672827768), FRAC_CONST(0.018160190450031) }, + { FRAC_CONST(0.025375838462365), FRAC_CONST(0.018238128257362) }, + { FRAC_CONST(0.025319765249906), FRAC_CONST(0.018315894400484) }, + { FRAC_CONST(0.025263453718173), FRAC_CONST(0.018393488147432) }, + { FRAC_CONST(0.025206904397193), FRAC_CONST(0.018470908767865) }, + { FRAC_CONST(0.025150117819228), FRAC_CONST(0.018548155533070) }, + { FRAC_CONST(0.025093094518776), FRAC_CONST(0.018625227715971) }, + { FRAC_CONST(0.025035835032562), FRAC_CONST(0.018702124591135) }, + { FRAC_CONST(0.024978339899534), FRAC_CONST(0.018778845434780) }, + { FRAC_CONST(0.024920609660858), FRAC_CONST(0.018855389524780) }, + { FRAC_CONST(0.024862644859912), FRAC_CONST(0.018931756140672) }, + { FRAC_CONST(0.024804446042284), FRAC_CONST(0.019007944563666) }, + { FRAC_CONST(0.024746013755764), FRAC_CONST(0.019083954076646) }, + { FRAC_CONST(0.024687348550337), FRAC_CONST(0.019159783964183) }, + { FRAC_CONST(0.024628450978184), FRAC_CONST(0.019235433512536) }, + { FRAC_CONST(0.024569321593670), FRAC_CONST(0.019310902009663) }, + { FRAC_CONST(0.024509960953345), FRAC_CONST(0.019386188745225) }, + { FRAC_CONST(0.024450369615932), FRAC_CONST(0.019461293010596) }, + { FRAC_CONST(0.024390548142329), FRAC_CONST(0.019536214098866) }, + { FRAC_CONST(0.024330497095598), FRAC_CONST(0.019610951304848) }, + { FRAC_CONST(0.024270217040961), FRAC_CONST(0.019685503925087) }, + { FRAC_CONST(0.024209708545799), FRAC_CONST(0.019759871257867) }, + { FRAC_CONST(0.024148972179639), FRAC_CONST(0.019834052603212) }, + { FRAC_CONST(0.024088008514157), FRAC_CONST(0.019908047262901) }, + { FRAC_CONST(0.024026818123164), FRAC_CONST(0.019981854540467) }, + { FRAC_CONST(0.023965401582609), FRAC_CONST(0.020055473741208) }, + { FRAC_CONST(0.023903759470567), FRAC_CONST(0.020128904172192) }, + { FRAC_CONST(0.023841892367236), FRAC_CONST(0.020202145142264) }, + { FRAC_CONST(0.023779800854935), FRAC_CONST(0.020275195962052) }, + { FRAC_CONST(0.023717485518092), FRAC_CONST(0.020348055943974) }, + { FRAC_CONST(0.023654946943242), FRAC_CONST(0.020420724402244) }, + { FRAC_CONST(0.023592185719023), FRAC_CONST(0.020493200652878) }, + { FRAC_CONST(0.023529202436167), FRAC_CONST(0.020565484013703) }, + { FRAC_CONST(0.023465997687496), FRAC_CONST(0.020637573804361) }, + { FRAC_CONST(0.023402572067918), FRAC_CONST(0.020709469346314) }, + { FRAC_CONST(0.023338926174419), FRAC_CONST(0.020781169962854) }, + { FRAC_CONST(0.023275060606058), FRAC_CONST(0.020852674979108) }, + { FRAC_CONST(0.023210975963963), FRAC_CONST(0.020923983722044) }, + { FRAC_CONST(0.023146672851322), FRAC_CONST(0.020995095520475) }, + { FRAC_CONST(0.023082151873380), FRAC_CONST(0.021066009705072) }, + { FRAC_CONST(0.023017413637435), FRAC_CONST(0.021136725608363) }, + { FRAC_CONST(0.022952458752826), FRAC_CONST(0.021207242564742) }, + { FRAC_CONST(0.022887287830934), FRAC_CONST(0.021277559910478) }, + { FRAC_CONST(0.022821901485173), FRAC_CONST(0.021347676983716) }, + { FRAC_CONST(0.022756300330983), FRAC_CONST(0.021417593124488) }, + { FRAC_CONST(0.022690484985827), FRAC_CONST(0.021487307674717) }, + { FRAC_CONST(0.022624456069185), FRAC_CONST(0.021556819978223) }, + { FRAC_CONST(0.022558214202547), FRAC_CONST(0.021626129380729) }, + { FRAC_CONST(0.022491760009405), FRAC_CONST(0.021695235229869) }, + { FRAC_CONST(0.022425094115252), FRAC_CONST(0.021764136875192) }, + { FRAC_CONST(0.022358217147572), FRAC_CONST(0.021832833668171) }, + { FRAC_CONST(0.022291129735838), FRAC_CONST(0.021901324962204) }, + { FRAC_CONST(0.022223832511501), FRAC_CONST(0.021969610112625) }, + { FRAC_CONST(0.022156326107988), FRAC_CONST(0.022037688476709) }, + { FRAC_CONST(0.022088611160696), FRAC_CONST(0.022105559413676) }, + { FRAC_CONST(0.022020688306983), FRAC_CONST(0.022173222284699) }, + { FRAC_CONST(0.021952558186166), FRAC_CONST(0.022240676452909) }, + { FRAC_CONST(0.021884221439510), FRAC_CONST(0.022307921283403) }, + { FRAC_CONST(0.021815678710228), FRAC_CONST(0.022374956143245) }, + { FRAC_CONST(0.021746930643469), FRAC_CONST(0.022441780401478) }, + { FRAC_CONST(0.021677977886316), FRAC_CONST(0.022508393429127) }, + { FRAC_CONST(0.021608821087780), FRAC_CONST(0.022574794599206) }, + { FRAC_CONST(0.021539460898790), FRAC_CONST(0.022640983286719) }, + { FRAC_CONST(0.021469897972190), FRAC_CONST(0.022706958868676) }, + { FRAC_CONST(0.021400132962735), FRAC_CONST(0.022772720724087) }, + { FRAC_CONST(0.021330166527077), FRAC_CONST(0.022838268233979) }, + { FRAC_CONST(0.021259999323769), FRAC_CONST(0.022903600781391) }, + { FRAC_CONST(0.021189632013250), FRAC_CONST(0.022968717751391) }, + { FRAC_CONST(0.021119065257845), FRAC_CONST(0.023033618531071) }, + { FRAC_CONST(0.021048299721754), FRAC_CONST(0.023098302509561) }, + { FRAC_CONST(0.020977336071050), FRAC_CONST(0.023162769078031) }, + { FRAC_CONST(0.020906174973670), FRAC_CONST(0.023227017629698) }, + { FRAC_CONST(0.020834817099409), FRAC_CONST(0.023291047559828) }, + { FRAC_CONST(0.020763263119915), FRAC_CONST(0.023354858265748) }, + { FRAC_CONST(0.020691513708680), FRAC_CONST(0.023418449146848) }, + { FRAC_CONST(0.020619569541038), FRAC_CONST(0.023481819604585) }, + { FRAC_CONST(0.020547431294155), FRAC_CONST(0.023544969042494) }, + { FRAC_CONST(0.020475099647023), FRAC_CONST(0.023607896866186) }, + { FRAC_CONST(0.020402575280455), FRAC_CONST(0.023670602483363) }, + { FRAC_CONST(0.020329858877078), FRAC_CONST(0.023733085303813) }, + { FRAC_CONST(0.020256951121327), FRAC_CONST(0.023795344739427) }, + { FRAC_CONST(0.020183852699437), FRAC_CONST(0.023857380204193) }, + { FRAC_CONST(0.020110564299439), FRAC_CONST(0.023919191114211) }, + { FRAC_CONST(0.020037086611150), FRAC_CONST(0.023980776887692) }, + { FRAC_CONST(0.019963420326171), FRAC_CONST(0.024042136944968) }, + { FRAC_CONST(0.019889566137877), FRAC_CONST(0.024103270708495) }, + { FRAC_CONST(0.019815524741412), FRAC_CONST(0.024164177602859) }, + { FRAC_CONST(0.019741296833681), FRAC_CONST(0.024224857054779) }, + { FRAC_CONST(0.019666883113346), FRAC_CONST(0.024285308493120) }, + { FRAC_CONST(0.019592284280817), FRAC_CONST(0.024345531348888) }, + { FRAC_CONST(0.019517501038246), FRAC_CONST(0.024405525055242) }, + { FRAC_CONST(0.019442534089523), FRAC_CONST(0.024465289047500) }, + { FRAC_CONST(0.019367384140264), FRAC_CONST(0.024524822763141) }, + { FRAC_CONST(0.019292051897809), FRAC_CONST(0.024584125641809) }, + { FRAC_CONST(0.019216538071215), FRAC_CONST(0.024643197125323) }, + { FRAC_CONST(0.019140843371246), FRAC_CONST(0.024702036657681) }, + { FRAC_CONST(0.019064968510369), FRAC_CONST(0.024760643685063) }, + { FRAC_CONST(0.018988914202748), FRAC_CONST(0.024819017655836) }, + { FRAC_CONST(0.018912681164234), FRAC_CONST(0.024877158020562) }, + { FRAC_CONST(0.018836270112363), FRAC_CONST(0.024935064232003) }, + { FRAC_CONST(0.018759681766343), FRAC_CONST(0.024992735745123) }, + { FRAC_CONST(0.018682916847054), FRAC_CONST(0.025050172017095) }, + { FRAC_CONST(0.018605976077037), FRAC_CONST(0.025107372507308) }, + { FRAC_CONST(0.018528860180486), FRAC_CONST(0.025164336677369) }, + { FRAC_CONST(0.018451569883247), FRAC_CONST(0.025221063991110) }, + { FRAC_CONST(0.018374105912805), FRAC_CONST(0.025277553914591) }, + { FRAC_CONST(0.018296468998280), FRAC_CONST(0.025333805916107) }, + { FRAC_CONST(0.018218659870421), FRAC_CONST(0.025389819466194) }, + { FRAC_CONST(0.018140679261596), FRAC_CONST(0.025445594037630) }, + { FRAC_CONST(0.018062527905790), FRAC_CONST(0.025501129105445) }, + { FRAC_CONST(0.017984206538592), FRAC_CONST(0.025556424146920) }, + { FRAC_CONST(0.017905715897192), FRAC_CONST(0.025611478641598) }, + { FRAC_CONST(0.017827056720375), FRAC_CONST(0.025666292071285) }, + { FRAC_CONST(0.017748229748511), FRAC_CONST(0.025720863920056) }, + { FRAC_CONST(0.017669235723550), FRAC_CONST(0.025775193674260) }, + { FRAC_CONST(0.017590075389012), FRAC_CONST(0.025829280822525) }, + { FRAC_CONST(0.017510749489986), FRAC_CONST(0.025883124855762) }, + { FRAC_CONST(0.017431258773116), FRAC_CONST(0.025936725267170) }, + { FRAC_CONST(0.017351603986600), FRAC_CONST(0.025990081552242) }, + { FRAC_CONST(0.017271785880180), FRAC_CONST(0.026043193208768) }, + { FRAC_CONST(0.017191805205132), FRAC_CONST(0.026096059736841) }, + { FRAC_CONST(0.017111662714267), FRAC_CONST(0.026148680638861) }, + { FRAC_CONST(0.017031359161915), FRAC_CONST(0.026201055419541) }, + { FRAC_CONST(0.016950895303924), FRAC_CONST(0.026253183585908) }, + { FRAC_CONST(0.016870271897651), FRAC_CONST(0.026305064647313) }, + { FRAC_CONST(0.016789489701954), FRAC_CONST(0.026356698115431) }, + { FRAC_CONST(0.016708549477186), FRAC_CONST(0.026408083504269) }, + { FRAC_CONST(0.016627451985187), FRAC_CONST(0.026459220330167) }, + { FRAC_CONST(0.016546197989277), FRAC_CONST(0.026510108111806) }, + { FRAC_CONST(0.016464788254250), FRAC_CONST(0.026560746370212) }, + { FRAC_CONST(0.016383223546365), FRAC_CONST(0.026611134628757) }, + { FRAC_CONST(0.016301504633341), FRAC_CONST(0.026661272413168) }, + { FRAC_CONST(0.016219632284346), FRAC_CONST(0.026711159251530) }, + { FRAC_CONST(0.016137607269996), FRAC_CONST(0.026760794674288) }, + { FRAC_CONST(0.016055430362340), FRAC_CONST(0.026810178214254) }, + { FRAC_CONST(0.015973102334858), FRAC_CONST(0.026859309406613) }, + { FRAC_CONST(0.015890623962454), FRAC_CONST(0.026908187788922) }, + { FRAC_CONST(0.015807996021446), FRAC_CONST(0.026956812901119) }, + { FRAC_CONST(0.015725219289558), FRAC_CONST(0.027005184285527) }, + { FRAC_CONST(0.015642294545918), FRAC_CONST(0.027053301486856) }, + { FRAC_CONST(0.015559222571044), FRAC_CONST(0.027101164052208) }, + { FRAC_CONST(0.015476004146842), FRAC_CONST(0.027148771531083) }, + { FRAC_CONST(0.015392640056594), FRAC_CONST(0.027196123475380) }, + { FRAC_CONST(0.015309131084956), FRAC_CONST(0.027243219439406) }, + { FRAC_CONST(0.015225478017946), FRAC_CONST(0.027290058979875) }, + { FRAC_CONST(0.015141681642938), FRAC_CONST(0.027336641655915) }, + { FRAC_CONST(0.015057742748656), FRAC_CONST(0.027382967029073) }, + { FRAC_CONST(0.014973662125164), FRAC_CONST(0.027429034663317) }, + { FRAC_CONST(0.014889440563862), FRAC_CONST(0.027474844125040) }, + { FRAC_CONST(0.014805078857474), FRAC_CONST(0.027520394983066) }, + { FRAC_CONST(0.014720577800046), FRAC_CONST(0.027565686808654) }, + { FRAC_CONST(0.014635938186934), FRAC_CONST(0.027610719175499) }, + { FRAC_CONST(0.014551160814797), FRAC_CONST(0.027655491659740) }, + { FRAC_CONST(0.014466246481592), FRAC_CONST(0.027700003839960) }, + { FRAC_CONST(0.014381195986567), FRAC_CONST(0.027744255297195) }, + { FRAC_CONST(0.014296010130247), FRAC_CONST(0.027788245614933) }, + { FRAC_CONST(0.014210689714436), FRAC_CONST(0.027831974379120) }, + { FRAC_CONST(0.014125235542201), FRAC_CONST(0.027875441178165) }, + { FRAC_CONST(0.014039648417870), FRAC_CONST(0.027918645602941) }, + { FRAC_CONST(0.013953929147020), FRAC_CONST(0.027961587246792) }, + { FRAC_CONST(0.013868078536476), FRAC_CONST(0.028004265705534) }, + { FRAC_CONST(0.013782097394294), FRAC_CONST(0.028046680577462) }, + { FRAC_CONST(0.013695986529763), FRAC_CONST(0.028088831463351) }, + { FRAC_CONST(0.013609746753390), FRAC_CONST(0.028130717966461) }, + { FRAC_CONST(0.013523378876898), FRAC_CONST(0.028172339692540) }, + { FRAC_CONST(0.013436883713214), FRAC_CONST(0.028213696249828) }, + { FRAC_CONST(0.013350262076462), FRAC_CONST(0.028254787249062) }, + { FRAC_CONST(0.013263514781960), FRAC_CONST(0.028295612303478) }, + { FRAC_CONST(0.013176642646205), FRAC_CONST(0.028336171028814) }, + { FRAC_CONST(0.013089646486871), FRAC_CONST(0.028376463043317) }, + { FRAC_CONST(0.013002527122799), FRAC_CONST(0.028416487967743) }, + { FRAC_CONST(0.012915285373990), FRAC_CONST(0.028456245425361) }, + { FRAC_CONST(0.012827922061597), FRAC_CONST(0.028495735041960) }, + { FRAC_CONST(0.012740438007915), FRAC_CONST(0.028534956445849) }, + { FRAC_CONST(0.012652834036379), FRAC_CONST(0.028573909267859) }, + { FRAC_CONST(0.012565110971550), FRAC_CONST(0.028612593141354) }, + { FRAC_CONST(0.012477269639111), FRAC_CONST(0.028651007702224) }, + { FRAC_CONST(0.012389310865858), FRAC_CONST(0.028689152588899) }, + { FRAC_CONST(0.012301235479693), FRAC_CONST(0.028727027442343) }, + { FRAC_CONST(0.012213044309615), FRAC_CONST(0.028764631906065) }, + { FRAC_CONST(0.012124738185712), FRAC_CONST(0.028801965626115) }, + { FRAC_CONST(0.012036317939156), FRAC_CONST(0.028839028251097) }, + { FRAC_CONST(0.011947784402191), FRAC_CONST(0.028875819432161) }, + { FRAC_CONST(0.011859138408130), FRAC_CONST(0.028912338823015) }, + { FRAC_CONST(0.011770380791341), FRAC_CONST(0.028948586079925) }, + { FRAC_CONST(0.011681512387245), FRAC_CONST(0.028984560861718) }, + { FRAC_CONST(0.011592534032306), FRAC_CONST(0.029020262829785) }, + { FRAC_CONST(0.011503446564022), FRAC_CONST(0.029055691648087) }, + { FRAC_CONST(0.011414250820918), FRAC_CONST(0.029090846983152) }, + { FRAC_CONST(0.011324947642537), FRAC_CONST(0.029125728504087) }, + { FRAC_CONST(0.011235537869437), FRAC_CONST(0.029160335882573) }, + { FRAC_CONST(0.011146022343175), FRAC_CONST(0.029194668792871) }, + { FRAC_CONST(0.011056401906305), FRAC_CONST(0.029228726911828) }, + { FRAC_CONST(0.010966677402371), FRAC_CONST(0.029262509918876) }, + { FRAC_CONST(0.010876849675891), FRAC_CONST(0.029296017496036) }, + { FRAC_CONST(0.010786919572361), FRAC_CONST(0.029329249327922) }, + { FRAC_CONST(0.010696887938235), FRAC_CONST(0.029362205101743) }, + { FRAC_CONST(0.010606755620926), FRAC_CONST(0.029394884507308) }, + { FRAC_CONST(0.010516523468793), FRAC_CONST(0.029427287237024) }, + { FRAC_CONST(0.010426192331137), FRAC_CONST(0.029459412985906) }, + { FRAC_CONST(0.010335763058187), FRAC_CONST(0.029491261451573) }, + { FRAC_CONST(0.010245236501099), FRAC_CONST(0.029522832334255) }, + { FRAC_CONST(0.010154613511943), FRAC_CONST(0.029554125336796) }, + { FRAC_CONST(0.010063894943698), FRAC_CONST(0.029585140164654) }, + { FRAC_CONST(0.009973081650240), FRAC_CONST(0.029615876525905) }, + { FRAC_CONST(0.009882174486340), FRAC_CONST(0.029646334131247) }, + { FRAC_CONST(0.009791174307650), FRAC_CONST(0.029676512694001) }, + { FRAC_CONST(0.009700081970699), FRAC_CONST(0.029706411930116) }, + { FRAC_CONST(0.009608898332881), FRAC_CONST(0.029736031558168) }, + { FRAC_CONST(0.009517624252453), FRAC_CONST(0.029765371299366) }, + { FRAC_CONST(0.009426260588521), FRAC_CONST(0.029794430877553) }, + { FRAC_CONST(0.009334808201034), FRAC_CONST(0.029823210019210) }, + { FRAC_CONST(0.009243267950778), FRAC_CONST(0.029851708453456) }, + { FRAC_CONST(0.009151640699363), FRAC_CONST(0.029879925912053) }, + { FRAC_CONST(0.009059927309220), FRAC_CONST(0.029907862129408) }, + { FRAC_CONST(0.008968128643591), FRAC_CONST(0.029935516842573) }, + { FRAC_CONST(0.008876245566520), FRAC_CONST(0.029962889791254) }, + { FRAC_CONST(0.008784278942845), FRAC_CONST(0.029989980717805) }, + { FRAC_CONST(0.008692229638191), FRAC_CONST(0.030016789367235) }, + { FRAC_CONST(0.008600098518961), FRAC_CONST(0.030043315487212) }, + { FRAC_CONST(0.008507886452329), FRAC_CONST(0.030069558828062) }, + { FRAC_CONST(0.008415594306230), FRAC_CONST(0.030095519142772) }, + { FRAC_CONST(0.008323222949351), FRAC_CONST(0.030121196186994) }, + { FRAC_CONST(0.008230773251129), FRAC_CONST(0.030146589719046) }, + { FRAC_CONST(0.008138246081733), FRAC_CONST(0.030171699499915) }, + { FRAC_CONST(0.008045642312067), FRAC_CONST(0.030196525293257) }, + { FRAC_CONST(0.007952962813750), FRAC_CONST(0.030221066865402) }, + { FRAC_CONST(0.007860208459119), FRAC_CONST(0.030245323985357) }, + { FRAC_CONST(0.007767380121212), FRAC_CONST(0.030269296424803) }, + { FRAC_CONST(0.007674478673766), FRAC_CONST(0.030292983958103) }, + { FRAC_CONST(0.007581504991203), FRAC_CONST(0.030316386362302) }, + { FRAC_CONST(0.007488459948628), FRAC_CONST(0.030339503417126) }, + { FRAC_CONST(0.007395344421816), FRAC_CONST(0.030362334904989) }, + { FRAC_CONST(0.007302159287206), FRAC_CONST(0.030384880610993) }, + { FRAC_CONST(0.007208905421891), FRAC_CONST(0.030407140322928) }, + { FRAC_CONST(0.007115583703613), FRAC_CONST(0.030429113831278) }, + { FRAC_CONST(0.007022195010752), FRAC_CONST(0.030450800929220) }, + { FRAC_CONST(0.006928740222316), FRAC_CONST(0.030472201412626) }, + { FRAC_CONST(0.006835220217939), FRAC_CONST(0.030493315080068) }, + { FRAC_CONST(0.006741635877866), FRAC_CONST(0.030514141732814) }, + { FRAC_CONST(0.006647988082948), FRAC_CONST(0.030534681174838) }, + { FRAC_CONST(0.006554277714635), FRAC_CONST(0.030554933212813) }, + { FRAC_CONST(0.006460505654964), FRAC_CONST(0.030574897656119) }, + { FRAC_CONST(0.006366672786553), FRAC_CONST(0.030594574316845) }, + { FRAC_CONST(0.006272779992593), FRAC_CONST(0.030613963009786) }, + { FRAC_CONST(0.006178828156839), FRAC_CONST(0.030633063552447) }, + { FRAC_CONST(0.006084818163601), FRAC_CONST(0.030651875765048) }, + { FRAC_CONST(0.005990750897737), FRAC_CONST(0.030670399470520) }, + { FRAC_CONST(0.005896627244644), FRAC_CONST(0.030688634494512) }, + { FRAC_CONST(0.005802448090250), FRAC_CONST(0.030706580665388) }, + { FRAC_CONST(0.005708214321004), FRAC_CONST(0.030724237814232) }, + { FRAC_CONST(0.005613926823871), FRAC_CONST(0.030741605774849) }, + { FRAC_CONST(0.005519586486321), FRAC_CONST(0.030758684383764) }, + { FRAC_CONST(0.005425194196321), FRAC_CONST(0.030775473480228) }, + { FRAC_CONST(0.005330750842327), FRAC_CONST(0.030791972906214) }, + { FRAC_CONST(0.005236257313276), FRAC_CONST(0.030808182506425) }, + { FRAC_CONST(0.005141714498576), FRAC_CONST(0.030824102128288) }, + { FRAC_CONST(0.005047123288102), FRAC_CONST(0.030839731621963) }, + { FRAC_CONST(0.004952484572181), FRAC_CONST(0.030855070840339) }, + { FRAC_CONST(0.004857799241589), FRAC_CONST(0.030870119639036) }, + { FRAC_CONST(0.004763068187541), FRAC_CONST(0.030884877876411) }, + { FRAC_CONST(0.004668292301681), FRAC_CONST(0.030899345413553) }, + { FRAC_CONST(0.004573472476075), FRAC_CONST(0.030913522114288) }, + { FRAC_CONST(0.004478609603205), FRAC_CONST(0.030927407845180) }, + { FRAC_CONST(0.004383704575956), FRAC_CONST(0.030941002475530) }, + { FRAC_CONST(0.004288758287610), FRAC_CONST(0.030954305877381) }, + { FRAC_CONST(0.004193771631837), FRAC_CONST(0.030967317925516) }, + { FRAC_CONST(0.004098745502689), FRAC_CONST(0.030980038497461) }, + { FRAC_CONST(0.004003680794587), FRAC_CONST(0.030992467473486) }, + { FRAC_CONST(0.003908578402316), FRAC_CONST(0.031004604736602) }, + { FRAC_CONST(0.003813439221017), FRAC_CONST(0.031016450172571) }, + { FRAC_CONST(0.003718264146176), FRAC_CONST(0.031028003669899) }, + { FRAC_CONST(0.003623054073616), FRAC_CONST(0.031039265119839) }, + { FRAC_CONST(0.003527809899492), FRAC_CONST(0.031050234416394) }, + { FRAC_CONST(0.003432532520278), FRAC_CONST(0.031060911456318) }, + { FRAC_CONST(0.003337222832760), FRAC_CONST(0.031071296139114) }, + { FRAC_CONST(0.003241881734029), FRAC_CONST(0.031081388367037) }, + { FRAC_CONST(0.003146510121474), FRAC_CONST(0.031091188045095) }, + { FRAC_CONST(0.003051108892766), FRAC_CONST(0.031100695081051) }, + { FRAC_CONST(0.002955678945860), FRAC_CONST(0.031109909385419) }, + { FRAC_CONST(0.002860221178978), FRAC_CONST(0.031118830871473) }, + { FRAC_CONST(0.002764736490604), FRAC_CONST(0.031127459455239) }, + { FRAC_CONST(0.002669225779478), FRAC_CONST(0.031135795055501) }, + { FRAC_CONST(0.002573689944583), FRAC_CONST(0.031143837593803) }, + { FRAC_CONST(0.002478129885137), FRAC_CONST(0.031151586994444) }, + { FRAC_CONST(0.002382546500589), FRAC_CONST(0.031159043184484) }, + { FRAC_CONST(0.002286940690606), FRAC_CONST(0.031166206093743) }, + { FRAC_CONST(0.002191313355067), FRAC_CONST(0.031173075654800) }, + { FRAC_CONST(0.002095665394051), FRAC_CONST(0.031179651802998) }, + { FRAC_CONST(0.001999997707835), FRAC_CONST(0.031185934476438) }, + { FRAC_CONST(0.001904311196878), FRAC_CONST(0.031191923615985) }, + { FRAC_CONST(0.001808606761820), FRAC_CONST(0.031197619165268) }, + { FRAC_CONST(0.001712885303465), FRAC_CONST(0.031203021070678) }, + { FRAC_CONST(0.001617147722782), FRAC_CONST(0.031208129281370) }, + { FRAC_CONST(0.001521394920889), FRAC_CONST(0.031212943749264) }, + { FRAC_CONST(0.001425627799047), FRAC_CONST(0.031217464429043) }, + { FRAC_CONST(0.001329847258653), FRAC_CONST(0.031221691278159) }, + { FRAC_CONST(0.001234054201231), FRAC_CONST(0.031225624256825) }, + { FRAC_CONST(0.001138249528420), FRAC_CONST(0.031229263328024) }, + { FRAC_CONST(0.001042434141971), FRAC_CONST(0.031232608457502) }, + { FRAC_CONST(0.000946608943736), FRAC_CONST(0.031235659613775) }, + { FRAC_CONST(0.000850774835656), FRAC_CONST(0.031238416768124) }, + { FRAC_CONST(0.000754932719759), FRAC_CONST(0.031240879894597) }, + { FRAC_CONST(0.000659083498149), FRAC_CONST(0.031243048970010) }, + { FRAC_CONST(0.000563228072993), FRAC_CONST(0.031244923973948) }, + { FRAC_CONST(0.000467367346520), FRAC_CONST(0.031246504888762) }, + { FRAC_CONST(0.000371502221008), FRAC_CONST(0.031247791699571) }, + { FRAC_CONST(0.000275633598775), FRAC_CONST(0.031248784394264) }, + { FRAC_CONST(0.000179762382174), FRAC_CONST(0.031249482963498) }, + { FRAC_CONST(0.000083889473581), FRAC_CONST(0.031249887400697) } +}; + +/* 64 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_256[] = +{ + { FRAC_CONST(0.088387931675923), FRAC_CONST(0.000271171628935) }, + { FRAC_CONST(0.088354655998507), FRAC_CONST(0.002440238387037) }, + { FRAC_CONST(0.088268158780110), FRAC_CONST(0.004607835236780) }, + { FRAC_CONST(0.088128492123423), FRAC_CONST(0.006772656498875) }, + { FRAC_CONST(0.087935740158418), FRAC_CONST(0.008933398165942) }, + { FRAC_CONST(0.087690018991670), FRAC_CONST(0.011088758687994) }, + { FRAC_CONST(0.087391476636423), FRAC_CONST(0.013237439756448) }, + { FRAC_CONST(0.087040292923427), FRAC_CONST(0.015378147086172) }, + { FRAC_CONST(0.086636679392621), FRAC_CONST(0.017509591195118) }, + { FRAC_CONST(0.086180879165703), FRAC_CONST(0.019630488181053) }, + { FRAC_CONST(0.085673166799686), FRAC_CONST(0.021739560494940) }, + { FRAC_CONST(0.085113848121515), FRAC_CONST(0.023835537710479) }, + { FRAC_CONST(0.084503260043847), FRAC_CONST(0.025917157289369) }, + { FRAC_CONST(0.083841770362110), FRAC_CONST(0.027983165341813) }, + { FRAC_CONST(0.083129777532952), FRAC_CONST(0.030032317381813) }, + { FRAC_CONST(0.082367710434230), FRAC_CONST(0.032063379076803) }, + { FRAC_CONST(0.081556028106671), FRAC_CONST(0.034075126991164) }, + { FRAC_CONST(0.080695219477356), FRAC_CONST(0.036066349323177) }, + { FRAC_CONST(0.079785803065216), FRAC_CONST(0.038035846634965) }, + { FRAC_CONST(0.078828326668693), FRAC_CONST(0.039982432574992) }, + { FRAC_CONST(0.077823367035766), FRAC_CONST(0.041904934592675) }, + { FRAC_CONST(0.076771529516540), FRAC_CONST(0.043802194644686) }, + { FRAC_CONST(0.075673447698606), FRAC_CONST(0.045673069892513) }, + { FRAC_CONST(0.074529783025390), FRAC_CONST(0.047516433390863) }, + { FRAC_CONST(0.073341224397728), FRAC_CONST(0.049331174766491) }, + { FRAC_CONST(0.072108487758894), FRAC_CONST(0.051116200887052) }, + { FRAC_CONST(0.070832315663343), FRAC_CONST(0.052870436519557) }, + { FRAC_CONST(0.069513476829429), FRAC_CONST(0.054592824978055) }, + { FRAC_CONST(0.068152765676348), FRAC_CONST(0.056282328760143) }, + { FRAC_CONST(0.066751001845620), FRAC_CONST(0.057937930171918) }, + { FRAC_CONST(0.065309029707361), FRAC_CONST(0.059558631940996) }, + { FRAC_CONST(0.063827717851668), FRAC_CONST(0.061143457817234) }, + { FRAC_CONST(0.062307958565413), FRAC_CONST(0.062691453160784) }, + { FRAC_CONST(0.060750667294763), FRAC_CONST(0.064201685517134) }, + { FRAC_CONST(0.059156782093749), FRAC_CONST(0.065673245178784) }, + { FRAC_CONST(0.057527263059216), FRAC_CONST(0.067105245733220) }, + { FRAC_CONST(0.055863091752499), FRAC_CONST(0.068496824596852) }, + { FRAC_CONST(0.054165270608165), FRAC_CONST(0.069847143534609) }, + { FRAC_CONST(0.052434822330188), FRAC_CONST(0.071155389164853) }, + { FRAC_CONST(0.050672789275903), FRAC_CONST(0.072420773449336) }, + { FRAC_CONST(0.048880232828135), FRAC_CONST(0.073642534167879) }, + { FRAC_CONST(0.047058232755862), FRAC_CONST(0.074819935377512) }, + { FRAC_CONST(0.045207886563797), FRAC_CONST(0.075952267855771) }, + { FRAC_CONST(0.043330308831298), FRAC_CONST(0.077038849527912) }, + { FRAC_CONST(0.041426630540984), FRAC_CONST(0.078079025877766) }, + { FRAC_CONST(0.039497998397473), FRAC_CONST(0.079072170341994) }, + { FRAC_CONST(0.037545574136653), FRAC_CONST(0.080017684687506) }, + { FRAC_CONST(0.035570533825892), FRAC_CONST(0.080914999371817) }, + { FRAC_CONST(0.033574067155622), FRAC_CONST(0.081763573886112) }, + { FRAC_CONST(0.031557376722714), FRAC_CONST(0.082562897080836) }, + { FRAC_CONST(0.029521677306074), FRAC_CONST(0.083312487473584) }, + { FRAC_CONST(0.027468195134911), FRAC_CONST(0.084011893539132) }, + { FRAC_CONST(0.025398167150101), FRAC_CONST(0.084660693981419) }, + { FRAC_CONST(0.023312840259098), FRAC_CONST(0.085258497987320) }, + { FRAC_CONST(0.021213470584847), FRAC_CONST(0.085804945462053) }, + { FRAC_CONST(0.019101322709138), FRAC_CONST(0.086299707246093) }, + { FRAC_CONST(0.016977668910873), FRAC_CONST(0.086742485313442) }, + { FRAC_CONST(0.014843788399692), FRAC_CONST(0.087133012951149) }, + { FRAC_CONST(0.012700966545425), FRAC_CONST(0.087471054919968) }, + { FRAC_CONST(0.010550494103830), FRAC_CONST(0.087756407596056) }, + { FRAC_CONST(0.008393666439096), FRAC_CONST(0.087988899093631) }, + { FRAC_CONST(0.006231782743558), FRAC_CONST(0.088168389368510) }, + { FRAC_CONST(0.004066145255116), FRAC_CONST(0.088294770302461) }, + { FRAC_CONST(0.001898058472816), FRAC_CONST(0.088367965768336) } +}; + +#ifdef LD_DEC +/* 128 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_1024[] = +{ + { FRAC_CONST(0.044194160825012), FRAC_CONST(0.000033896503468) }, + { FRAC_CONST(0.044193120897389), FRAC_CONST(0.000305066138364) }, + { FRAC_CONST(0.044190417123742), FRAC_CONST(0.000576224287693) }, + { FRAC_CONST(0.044186049605866), FRAC_CONST(0.000847360742503) }, + { FRAC_CONST(0.044180018508197), FRAC_CONST(0.001118465294660) }, + { FRAC_CONST(0.044172324057802), FRAC_CONST(0.001389527737231) }, + { FRAC_CONST(0.044162966544372), FRAC_CONST(0.001660537864867) }, + { FRAC_CONST(0.044151946320213), FRAC_CONST(0.001931485474192) }, + { FRAC_CONST(0.044139263800230), FRAC_CONST(0.002202360364180) }, + { FRAC_CONST(0.044124919461912), FRAC_CONST(0.002473152336546) }, + { FRAC_CONST(0.044108913845316), FRAC_CONST(0.002743851196123) }, + { FRAC_CONST(0.044091247553044), FRAC_CONST(0.003014446751254) }, + { FRAC_CONST(0.044071921250223), FRAC_CONST(0.003284928814169) }, + { FRAC_CONST(0.044050935664476), FRAC_CONST(0.003555287201370) }, + { FRAC_CONST(0.044028291585898), FRAC_CONST(0.003825511734018) }, + { FRAC_CONST(0.044003989867028), FRAC_CONST(0.004095592238311) }, + { FRAC_CONST(0.043978031422810), FRAC_CONST(0.004365518545871) }, + { FRAC_CONST(0.043950417230565), FRAC_CONST(0.004635280494126) }, + { FRAC_CONST(0.043921148329953), FRAC_CONST(0.004904867926689) }, + { FRAC_CONST(0.043890225822930), FRAC_CONST(0.005174270693748) }, + { FRAC_CONST(0.043857650873712), FRAC_CONST(0.005443478652439) }, + { FRAC_CONST(0.043823424708727), FRAC_CONST(0.005712481667236) }, + { FRAC_CONST(0.043787548616571), FRAC_CONST(0.005981269610326) }, + { FRAC_CONST(0.043750023947958), FRAC_CONST(0.006249832361997) }, + { FRAC_CONST(0.043710852115672), FRAC_CONST(0.006518159811011) }, + { FRAC_CONST(0.043670034594508), FRAC_CONST(0.006786241854993) }, + { FRAC_CONST(0.043627572921225), FRAC_CONST(0.007054068400804) }, + { FRAC_CONST(0.043583468694479), FRAC_CONST(0.007321629364927) }, + { FRAC_CONST(0.043537723574771), FRAC_CONST(0.007588914673843) }, + { FRAC_CONST(0.043490339284377), FRAC_CONST(0.007855914264410) }, + { FRAC_CONST(0.043441317607290), FRAC_CONST(0.008122618084246) }, + { FRAC_CONST(0.043390660389149), FRAC_CONST(0.008389016092101) }, + { FRAC_CONST(0.043338369537168), FRAC_CONST(0.008655098258243) }, + { FRAC_CONST(0.043284447020070), FRAC_CONST(0.008920854564826) }, + { FRAC_CONST(0.043228894868005), FRAC_CONST(0.009186275006278) }, + { FRAC_CONST(0.043171715172482), FRAC_CONST(0.009451349589667) }, + { FRAC_CONST(0.043112910086283), FRAC_CONST(0.009716068335087) }, + { FRAC_CONST(0.043052481823387), FRAC_CONST(0.009980421276025) }, + { FRAC_CONST(0.042990432658884), FRAC_CONST(0.010244398459743) }, + { FRAC_CONST(0.042926764928889), FRAC_CONST(0.010507989947649) }, + { FRAC_CONST(0.042861481030457), FRAC_CONST(0.010771185815673) }, + { FRAC_CONST(0.042794583421490), FRAC_CONST(0.011033976154639) }, + { FRAC_CONST(0.042726074620644), FRAC_CONST(0.011296351070639) }, + { FRAC_CONST(0.042655957207238), FRAC_CONST(0.011558300685406) }, + { FRAC_CONST(0.042584233821153), FRAC_CONST(0.011819815136685) }, + { FRAC_CONST(0.042510907162732), FRAC_CONST(0.012080884578604) }, + { FRAC_CONST(0.042435979992684), FRAC_CONST(0.012341499182048) }, + { FRAC_CONST(0.042359455131975), FRAC_CONST(0.012601649135022) }, + { FRAC_CONST(0.042281335461721), FRAC_CONST(0.012861324643029) }, + { FRAC_CONST(0.042201623923085), FRAC_CONST(0.013120515929433) }, + { FRAC_CONST(0.042120323517160), FRAC_CONST(0.013379213235827) }, + { FRAC_CONST(0.042037437304862), FRAC_CONST(0.013637406822406) }, + { FRAC_CONST(0.041952968406809), FRAC_CONST(0.013895086968325) }, + { FRAC_CONST(0.041866920003207), FRAC_CONST(0.014152243972073) }, + { FRAC_CONST(0.041779295333730), FRAC_CONST(0.014408868151835) }, + { FRAC_CONST(0.041690097697398), FRAC_CONST(0.014664949845855) }, + { FRAC_CONST(0.041599330452450), FRAC_CONST(0.014920479412801) }, + { FRAC_CONST(0.041506997016224), FRAC_CONST(0.015175447232131) }, + { FRAC_CONST(0.041413100865019), FRAC_CONST(0.015429843704450) }, + { FRAC_CONST(0.041317645533974), FRAC_CONST(0.015683659251874) }, + { FRAC_CONST(0.041220634616927), FRAC_CONST(0.015936884318392) }, + { FRAC_CONST(0.041122071766285), FRAC_CONST(0.016189509370223) }, + { FRAC_CONST(0.041021960692883), FRAC_CONST(0.016441524896177) }, + { FRAC_CONST(0.040920305165846), FRAC_CONST(0.016692921408010) }, + { FRAC_CONST(0.040817109012449), FRAC_CONST(0.016943689440788) }, + { FRAC_CONST(0.040712376117967), FRAC_CONST(0.017193819553235) }, + { FRAC_CONST(0.040606110425535), FRAC_CONST(0.017443302328094) }, + { FRAC_CONST(0.040498315935996), FRAC_CONST(0.017692128372479) }, + { FRAC_CONST(0.040388996707752), FRAC_CONST(0.017940288318230) }, + { FRAC_CONST(0.040278156856609), FRAC_CONST(0.018187772822267) }, + { FRAC_CONST(0.040165800555627), FRAC_CONST(0.018434572566936) }, + { FRAC_CONST(0.040051932034955), FRAC_CONST(0.018680678260367) }, + { FRAC_CONST(0.039936555581679), FRAC_CONST(0.018926080636820) }, + { FRAC_CONST(0.039819675539659), FRAC_CONST(0.019170770457035) }, + { FRAC_CONST(0.039701296309360), FRAC_CONST(0.019414738508577) }, + { FRAC_CONST(0.039581422347694), FRAC_CONST(0.019657975606187) }, + { FRAC_CONST(0.039460058167849), FRAC_CONST(0.019900472592126) }, + { FRAC_CONST(0.039337208339116), FRAC_CONST(0.020142220336521) }, + { FRAC_CONST(0.039212877486723), FRAC_CONST(0.020383209737704) }, + { FRAC_CONST(0.039087070291656), FRAC_CONST(0.020623431722561) }, + { FRAC_CONST(0.038959791490485), FRAC_CONST(0.020862877246870) }, + { FRAC_CONST(0.038831045875184), FRAC_CONST(0.021101537295642) }, + { FRAC_CONST(0.038700838292953), FRAC_CONST(0.021339402883462) }, + { FRAC_CONST(0.038569173646034), FRAC_CONST(0.021576465054824) }, + { FRAC_CONST(0.038436056891527), FRAC_CONST(0.021812714884472) }, + { FRAC_CONST(0.038301493041202), FRAC_CONST(0.022048143477734) }, + { FRAC_CONST(0.038165487161312), FRAC_CONST(0.022282741970855) }, + { FRAC_CONST(0.038028044372402), FRAC_CONST(0.022516501531335) }, + { FRAC_CONST(0.037889169849115), FRAC_CONST(0.022749413358259) }, + { FRAC_CONST(0.037748868819998), FRAC_CONST(0.022981468682628) }, + { FRAC_CONST(0.037607146567305), FRAC_CONST(0.023212658767690) }, + { FRAC_CONST(0.037464008426800), FRAC_CONST(0.023442974909269) }, + { FRAC_CONST(0.037319459787553), FRAC_CONST(0.023672408436094) }, + { FRAC_CONST(0.037173506091737), FRAC_CONST(0.023900950710120) }, + { FRAC_CONST(0.037026152834428), FRAC_CONST(0.024128593126861) }, + { FRAC_CONST(0.036877405563392), FRAC_CONST(0.024355327115708) }, + { FRAC_CONST(0.036727269878879), FRAC_CONST(0.024581144140255) }, + { FRAC_CONST(0.036575751433414), FRAC_CONST(0.024806035698618) }, + { FRAC_CONST(0.036422855931580), FRAC_CONST(0.025029993323758) }, + { FRAC_CONST(0.036268589129807), FRAC_CONST(0.025253008583796) }, + { FRAC_CONST(0.036112956836151), FRAC_CONST(0.025475073082334) }, + { FRAC_CONST(0.035955964910083), FRAC_CONST(0.025696178458769) }, + { FRAC_CONST(0.035797619262257), FRAC_CONST(0.025916316388609) }, + { FRAC_CONST(0.035637925854300), FRAC_CONST(0.026135478583784) }, + { FRAC_CONST(0.035476890698576), FRAC_CONST(0.026353656792963) }, + { FRAC_CONST(0.035314519857970), FRAC_CONST(0.026570842801858) }, + { FRAC_CONST(0.035150819445650), FRAC_CONST(0.026787028433540) }, + { FRAC_CONST(0.034985795624846), FRAC_CONST(0.027002205548742) }, + { FRAC_CONST(0.034819454608610), FRAC_CONST(0.027216366046166) }, + { FRAC_CONST(0.034651802659589), FRAC_CONST(0.027429501862792) }, + { FRAC_CONST(0.034482846089783), FRAC_CONST(0.027641604974175) }, + { FRAC_CONST(0.034312591260311), FRAC_CONST(0.027852667394755) }, + { FRAC_CONST(0.034141044581172), FRAC_CONST(0.028062681178149) }, + { FRAC_CONST(0.033968212511001), FRAC_CONST(0.028271638417458) }, + { FRAC_CONST(0.033794101556828), FRAC_CONST(0.028479531245560) }, + { FRAC_CONST(0.033618718273831), FRAC_CONST(0.028686351835407) }, + { FRAC_CONST(0.033442069265093), FRAC_CONST(0.028892092400321) }, + { FRAC_CONST(0.033264161181349), FRAC_CONST(0.029096745194286) }, + { FRAC_CONST(0.033085000720737), FRAC_CONST(0.029300302512241) }, + { FRAC_CONST(0.032904594628548), FRAC_CONST(0.029502756690366) }, + { FRAC_CONST(0.032722949696969), FRAC_CONST(0.029704100106376) }, + { FRAC_CONST(0.032540072764829), FRAC_CONST(0.029904325179807) }, + { FRAC_CONST(0.032355970717341), FRAC_CONST(0.030103424372297) }, + { FRAC_CONST(0.032170650485843), FRAC_CONST(0.030301390187873) }, + { FRAC_CONST(0.031984119047537), FRAC_CONST(0.030498215173235) }, + { FRAC_CONST(0.031796383425227), FRAC_CONST(0.030693891918034) }, + { FRAC_CONST(0.031607450687052), FRAC_CONST(0.030888413055150) }, + { FRAC_CONST(0.031417327946223), FRAC_CONST(0.031081771260973) }, + { FRAC_CONST(0.031226022360754), FRAC_CONST(0.031273959255676) }, + { FRAC_CONST(0.031033541133193), FRAC_CONST(0.031464969803488) }, + { FRAC_CONST(0.030839891510348), FRAC_CONST(0.031654795712972) }, + { FRAC_CONST(0.030645080783018), FRAC_CONST(0.031843429837288) }, + { FRAC_CONST(0.030449116285718), FRAC_CONST(0.032030865074469) }, + { FRAC_CONST(0.030252005396399), FRAC_CONST(0.032217094367684) }, + { FRAC_CONST(0.030053755536176), FRAC_CONST(0.032402110705505) }, + { FRAC_CONST(0.029854374169043), FRAC_CONST(0.032585907122172) }, + { FRAC_CONST(0.029653868801596), FRAC_CONST(0.032768476697853) }, + { FRAC_CONST(0.029452246982750), FRAC_CONST(0.032949812558907) }, + { FRAC_CONST(0.029249516303451), FRAC_CONST(0.033129907878142) }, + { FRAC_CONST(0.029045684396395), FRAC_CONST(0.033308755875070) }, + { FRAC_CONST(0.028840758935738), FRAC_CONST(0.033486349816166) }, + { FRAC_CONST(0.028634747636808), FRAC_CONST(0.033662683015118) }, + { FRAC_CONST(0.028427658255815), FRAC_CONST(0.033837748833080) }, + { FRAC_CONST(0.028219498589555), FRAC_CONST(0.034011540678924) }, + { FRAC_CONST(0.028010276475123), FRAC_CONST(0.034184052009485) }, + { FRAC_CONST(0.027799999789613), FRAC_CONST(0.034355276329809) }, + { FRAC_CONST(0.027588676449824), FRAC_CONST(0.034525207193396) }, + { FRAC_CONST(0.027376314411959), FRAC_CONST(0.034693838202447) }, + { FRAC_CONST(0.027162921671330), FRAC_CONST(0.034861163008098) }, + { FRAC_CONST(0.026948506262053), FRAC_CONST(0.035027175310665) }, + { FRAC_CONST(0.026733076256746), FRAC_CONST(0.035191868859880) }, + { FRAC_CONST(0.026516639766228), FRAC_CONST(0.035355237455122) }, + { FRAC_CONST(0.026299204939210), FRAC_CONST(0.035517274945657) }, + { FRAC_CONST(0.026080779961991), FRAC_CONST(0.035677975230865) }, + { FRAC_CONST(0.025861373058146), FRAC_CONST(0.035837332260471) }, + { FRAC_CONST(0.025640992488223), FRAC_CONST(0.035995340034772) }, + { FRAC_CONST(0.025419646549425), FRAC_CONST(0.036151992604866) }, + { FRAC_CONST(0.025197343575302), FRAC_CONST(0.036307284072871) }, + { FRAC_CONST(0.024974091935435), FRAC_CONST(0.036461208592152) }, + { FRAC_CONST(0.024749900035122), FRAC_CONST(0.036613760367538) }, + { FRAC_CONST(0.024524776315061), FRAC_CONST(0.036764933655540) }, + { FRAC_CONST(0.024298729251033), FRAC_CONST(0.036914722764569) }, + { FRAC_CONST(0.024071767353583), FRAC_CONST(0.037063122055150) }, + { FRAC_CONST(0.023843899167697), FRAC_CONST(0.037210125940135) }, + { FRAC_CONST(0.023615133272485), FRAC_CONST(0.037355728884908) }, + { FRAC_CONST(0.023385478280852), FRAC_CONST(0.037499925407603) }, + { FRAC_CONST(0.023154942839179), FRAC_CONST(0.037642710079302) }, + { FRAC_CONST(0.022923535626995), FRAC_CONST(0.037784077524241) }, + { FRAC_CONST(0.022691265356652), FRAC_CONST(0.037924022420018) }, + { FRAC_CONST(0.022458140772993), FRAC_CONST(0.038062539497785) }, + { FRAC_CONST(0.022224170653027), FRAC_CONST(0.038199623542453) }, + { FRAC_CONST(0.021989363805598), FRAC_CONST(0.038335269392885) }, + { FRAC_CONST(0.021753729071049), FRAC_CONST(0.038469471942092) }, + { FRAC_CONST(0.021517275320897), FRAC_CONST(0.038602226137423) }, + { FRAC_CONST(0.021280011457490), FRAC_CONST(0.038733526980758) }, + { FRAC_CONST(0.021041946413679), FRAC_CONST(0.038863369528695) }, + { FRAC_CONST(0.020803089152479), FRAC_CONST(0.038991748892734) }, + { FRAC_CONST(0.020563448666730), FRAC_CONST(0.039118660239466) }, + { FRAC_CONST(0.020323033978761), FRAC_CONST(0.039244098790750) }, + { FRAC_CONST(0.020081854140050), FRAC_CONST(0.039368059823895) }, + { FRAC_CONST(0.019839918230880), FRAC_CONST(0.039490538671839) }, + { FRAC_CONST(0.019597235360003), FRAC_CONST(0.039611530723322) }, + { FRAC_CONST(0.019353814664291), FRAC_CONST(0.039731031423061) }, + { FRAC_CONST(0.019109665308395), FRAC_CONST(0.039849036271924) }, + { FRAC_CONST(0.018864796484402), FRAC_CONST(0.039965540827094) }, + { FRAC_CONST(0.018619217411483), FRAC_CONST(0.040080540702240) }, + { FRAC_CONST(0.018372937335552), FRAC_CONST(0.040194031567683) }, + { FRAC_CONST(0.018125965528915), FRAC_CONST(0.040306009150554) }, + { FRAC_CONST(0.017878311289921), FRAC_CONST(0.040416469234963) }, + { FRAC_CONST(0.017629983942612), FRAC_CONST(0.040525407662148) }, + { FRAC_CONST(0.017380992836371), FRAC_CONST(0.040632820330639) }, + { FRAC_CONST(0.017131347345575), FRAC_CONST(0.040738703196411) }, + { FRAC_CONST(0.016881056869233), FRAC_CONST(0.040843052273033) }, + { FRAC_CONST(0.016630130830641), FRAC_CONST(0.040945863631822) }, + { FRAC_CONST(0.016378578677023), FRAC_CONST(0.041047133401988) }, + { FRAC_CONST(0.016126409879175), FRAC_CONST(0.041146857770781) }, + { FRAC_CONST(0.015873633931110), FRAC_CONST(0.041245032983635) }, + { FRAC_CONST(0.015620260349699), FRAC_CONST(0.041341655344309) }, + { FRAC_CONST(0.015366298674314), FRAC_CONST(0.041436721215026) }, + { FRAC_CONST(0.015111758466470), FRAC_CONST(0.041530227016609) }, + { FRAC_CONST(0.014856649309460), FRAC_CONST(0.041622169228618) }, + { FRAC_CONST(0.014600980808001), FRAC_CONST(0.041712544389481) }, + { FRAC_CONST(0.014344762587867), FRAC_CONST(0.041801349096623) }, + { FRAC_CONST(0.014088004295529), FRAC_CONST(0.041888580006598) }, + { FRAC_CONST(0.013830715597792), FRAC_CONST(0.041974233835211) }, + { FRAC_CONST(0.013572906181430), FRAC_CONST(0.042058307357645) }, + { FRAC_CONST(0.013314585752822), FRAC_CONST(0.042140797408577) }, + { FRAC_CONST(0.013055764037585), FRAC_CONST(0.042221700882306) }, + { FRAC_CONST(0.012796450780212), FRAC_CONST(0.042301014732860) }, + { FRAC_CONST(0.012536655743699), FRAC_CONST(0.042378735974118) }, + { FRAC_CONST(0.012276388709183), FRAC_CONST(0.042454861679919) }, + { FRAC_CONST(0.012015659475571), FRAC_CONST(0.042529388984173) }, + { FRAC_CONST(0.011754477859172), FRAC_CONST(0.042602315080970) }, + { FRAC_CONST(0.011492853693324), FRAC_CONST(0.042673637224683) }, + { FRAC_CONST(0.011230796828031), FRAC_CONST(0.042743352730074) }, + { FRAC_CONST(0.010968317129584), FRAC_CONST(0.042811458972393) }, + { FRAC_CONST(0.010705424480197), FRAC_CONST(0.042877953387479) }, + { FRAC_CONST(0.010442128777629), FRAC_CONST(0.042942833471854) }, + { FRAC_CONST(0.010178439934815), FRAC_CONST(0.043006096782821) }, + { FRAC_CONST(0.009914367879490), FRAC_CONST(0.043067740938551) }, + { FRAC_CONST(0.009649922553818), FRAC_CONST(0.043127763618177) }, + { FRAC_CONST(0.009385113914016), FRAC_CONST(0.043186162561878) }, + { FRAC_CONST(0.009119951929979), FRAC_CONST(0.043242935570968) }, + { FRAC_CONST(0.008854446584907), FRAC_CONST(0.043298080507974) }, + { FRAC_CONST(0.008588607874926), FRAC_CONST(0.043351595296722) }, + { FRAC_CONST(0.008322445808712), FRAC_CONST(0.043403477922409) }, + { FRAC_CONST(0.008055970407118), FRAC_CONST(0.043453726431684) }, + { FRAC_CONST(0.007789191702791), FRAC_CONST(0.043502338932719) }, + { FRAC_CONST(0.007522119739798), FRAC_CONST(0.043549313595281) }, + { FRAC_CONST(0.007254764573250), FRAC_CONST(0.043594648650800) }, + { FRAC_CONST(0.006987136268915), FRAC_CONST(0.043638342392438) }, + { FRAC_CONST(0.006719244902849), FRAC_CONST(0.043680393175148) }, + { FRAC_CONST(0.006451100561010), FRAC_CONST(0.043720799415744) }, + { FRAC_CONST(0.006182713338881), FRAC_CONST(0.043759559592953) }, + { FRAC_CONST(0.005914093341090), FRAC_CONST(0.043796672247476) }, + { FRAC_CONST(0.005645250681027), FRAC_CONST(0.043832135982044) }, + { FRAC_CONST(0.005376195480466), FRAC_CONST(0.043865949461465) }, + { FRAC_CONST(0.005106937869184), FRAC_CONST(0.043898111412683) }, + { FRAC_CONST(0.004837487984578), FRAC_CONST(0.043928620624817) }, + { FRAC_CONST(0.004567855971284), FRAC_CONST(0.043957475949213) }, + { FRAC_CONST(0.004298051980793), FRAC_CONST(0.043984676299484) }, + { FRAC_CONST(0.004028086171076), FRAC_CONST(0.044010220651553) }, + { FRAC_CONST(0.003757968706190), FRAC_CONST(0.044034108043689) }, + { FRAC_CONST(0.003487709755907), FRAC_CONST(0.044056337576546) }, + { FRAC_CONST(0.003217319495322), FRAC_CONST(0.044076908413193) }, + { FRAC_CONST(0.002946808104477), FRAC_CONST(0.044095819779151) }, + { FRAC_CONST(0.002676185767973), FRAC_CONST(0.044113070962418) }, + { FRAC_CONST(0.002405462674586), FRAC_CONST(0.044128661313495) }, + { FRAC_CONST(0.002134649016890), FRAC_CONST(0.044142590245416) }, + { FRAC_CONST(0.001863754990865), FRAC_CONST(0.044154857233763) }, + { FRAC_CONST(0.001592790795518), FRAC_CONST(0.044165461816692) }, + { FRAC_CONST(0.001321766632497), FRAC_CONST(0.044174403594946) }, + { FRAC_CONST(0.001050692705710), FRAC_CONST(0.044181682231873) }, + { FRAC_CONST(0.000779579220936), FRAC_CONST(0.044187297453434) }, + { FRAC_CONST(0.000508436385446), FRAC_CONST(0.044191249048222) }, + { FRAC_CONST(0.000237274407613), FRAC_CONST(0.044193536867459) } +}; +#endif // LD_DEC + +#ifdef ALLOW_SMALL_FRAMELENGTH +/* 480 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_1920[] = +{ + { FRAC_CONST(0.032274858518097), FRAC_CONST(0.000013202404176) }, + { FRAC_CONST(0.032274642494505), FRAC_CONST(0.000118821372483) }, + { FRAC_CONST(0.032274080835421), FRAC_CONST(0.000224439068308) }, + { FRAC_CONST(0.032273173546860), FRAC_CONST(0.000330054360572) }, + { FRAC_CONST(0.032271920638538), FRAC_CONST(0.000435666118218) }, + { FRAC_CONST(0.032270322123873), FRAC_CONST(0.000541273210231) }, + { FRAC_CONST(0.032268378019984), FRAC_CONST(0.000646874505642) }, + { FRAC_CONST(0.032266088347691), FRAC_CONST(0.000752468873546) }, + { FRAC_CONST(0.032263453131514), FRAC_CONST(0.000858055183114) }, + { FRAC_CONST(0.032260472399674), FRAC_CONST(0.000963632303600) }, + { FRAC_CONST(0.032257146184092), FRAC_CONST(0.001069199104358) }, + { FRAC_CONST(0.032253474520390), FRAC_CONST(0.001174754454853) }, + { FRAC_CONST(0.032249457447888), FRAC_CONST(0.001280297224671) }, + { FRAC_CONST(0.032245095009606), FRAC_CONST(0.001385826283535) }, + { FRAC_CONST(0.032240387252262), FRAC_CONST(0.001491340501313) }, + { FRAC_CONST(0.032235334226272), FRAC_CONST(0.001596838748031) }, + { FRAC_CONST(0.032229935985750), FRAC_CONST(0.001702319893890) }, + { FRAC_CONST(0.032224192588507), FRAC_CONST(0.001807782809271) }, + { FRAC_CONST(0.032218104096050), FRAC_CONST(0.001913226364749) }, + { FRAC_CONST(0.032211670573582), FRAC_CONST(0.002018649431111) }, + { FRAC_CONST(0.032204892090000), FRAC_CONST(0.002124050879359) }, + { FRAC_CONST(0.032197768717898), FRAC_CONST(0.002229429580728) }, + { FRAC_CONST(0.032190300533560), FRAC_CONST(0.002334784406698) }, + { FRAC_CONST(0.032182487616965), FRAC_CONST(0.002440114229003) }, + { FRAC_CONST(0.032174330051782), FRAC_CONST(0.002545417919644) }, + { FRAC_CONST(0.032165827925374), FRAC_CONST(0.002650694350905) }, + { FRAC_CONST(0.032156981328790), FRAC_CONST(0.002755942395358) }, + { FRAC_CONST(0.032147790356771), FRAC_CONST(0.002861160925883) }, + { FRAC_CONST(0.032138255107744), FRAC_CONST(0.002966348815672) }, + { FRAC_CONST(0.032128375683825), FRAC_CONST(0.003071504938250) }, + { FRAC_CONST(0.032118152190814), FRAC_CONST(0.003176628167476) }, + { FRAC_CONST(0.032107584738196), FRAC_CONST(0.003281717377568) }, + { FRAC_CONST(0.032096673439141), FRAC_CONST(0.003386771443102) }, + { FRAC_CONST(0.032085418410500), FRAC_CONST(0.003491789239036) }, + { FRAC_CONST(0.032073819772804), FRAC_CONST(0.003596769640711) }, + { FRAC_CONST(0.032061877650267), FRAC_CONST(0.003701711523874) }, + { FRAC_CONST(0.032049592170778), FRAC_CONST(0.003806613764680) }, + { FRAC_CONST(0.032036963465906), FRAC_CONST(0.003911475239711) }, + { FRAC_CONST(0.032023991670893), FRAC_CONST(0.004016294825985) }, + { FRAC_CONST(0.032010676924657), FRAC_CONST(0.004121071400967) }, + { FRAC_CONST(0.031997019369789), FRAC_CONST(0.004225803842586) }, + { FRAC_CONST(0.031983019152549), FRAC_CONST(0.004330491029241) }, + { FRAC_CONST(0.031968676422869), FRAC_CONST(0.004435131839816) }, + { FRAC_CONST(0.031953991334348), FRAC_CONST(0.004539725153692) }, + { FRAC_CONST(0.031938964044252), FRAC_CONST(0.004644269850758) }, + { FRAC_CONST(0.031923594713510), FRAC_CONST(0.004748764811426) }, + { FRAC_CONST(0.031907883506716), FRAC_CONST(0.004853208916638) }, + { FRAC_CONST(0.031891830592124), FRAC_CONST(0.004957601047881) }, + { FRAC_CONST(0.031875436141648), FRAC_CONST(0.005061940087200) }, + { FRAC_CONST(0.031858700330859), FRAC_CONST(0.005166224917208) }, + { FRAC_CONST(0.031841623338985), FRAC_CONST(0.005270454421097) }, + { FRAC_CONST(0.031824205348907), FRAC_CONST(0.005374627482653) }, + { FRAC_CONST(0.031806446547156), FRAC_CONST(0.005478742986267) }, + { FRAC_CONST(0.031788347123916), FRAC_CONST(0.005582799816945) }, + { FRAC_CONST(0.031769907273017), FRAC_CONST(0.005686796860323) }, + { FRAC_CONST(0.031751127191935), FRAC_CONST(0.005790733002674) }, + { FRAC_CONST(0.031732007081789), FRAC_CONST(0.005894607130928) }, + { FRAC_CONST(0.031712547147340), FRAC_CONST(0.005998418132675) }, + { FRAC_CONST(0.031692747596989), FRAC_CONST(0.006102164896182) }, + { FRAC_CONST(0.031672608642773), FRAC_CONST(0.006205846310406) }, + { FRAC_CONST(0.031652130500364), FRAC_CONST(0.006309461265002) }, + { FRAC_CONST(0.031631313389067), FRAC_CONST(0.006413008650337) }, + { FRAC_CONST(0.031610157531816), FRAC_CONST(0.006516487357501) }, + { FRAC_CONST(0.031588663155172), FRAC_CONST(0.006619896278321) }, + { FRAC_CONST(0.031566830489325), FRAC_CONST(0.006723234305370) }, + { FRAC_CONST(0.031544659768083), FRAC_CONST(0.006826500331981) }, + { FRAC_CONST(0.031522151228878), FRAC_CONST(0.006929693252258) }, + { FRAC_CONST(0.031499305112758), FRAC_CONST(0.007032811961088) }, + { FRAC_CONST(0.031476121664387), FRAC_CONST(0.007135855354151) }, + { FRAC_CONST(0.031452601132040), FRAC_CONST(0.007238822327937) }, + { FRAC_CONST(0.031428743767604), FRAC_CONST(0.007341711779751) }, + { FRAC_CONST(0.031404549826572), FRAC_CONST(0.007444522607730) }, + { FRAC_CONST(0.031380019568042), FRAC_CONST(0.007547253710853) }, + { FRAC_CONST(0.031355153254712), FRAC_CONST(0.007649903988952) }, + { FRAC_CONST(0.031329951152882), FRAC_CONST(0.007752472342725) }, + { FRAC_CONST(0.031304413532445), FRAC_CONST(0.007854957673748) }, + { FRAC_CONST(0.031278540666888), FRAC_CONST(0.007957358884484) }, + { FRAC_CONST(0.031252332833290), FRAC_CONST(0.008059674878300) }, + { FRAC_CONST(0.031225790312316), FRAC_CONST(0.008161904559473) }, + { FRAC_CONST(0.031198913388214), FRAC_CONST(0.008264046833205) }, + { FRAC_CONST(0.031171702348814), FRAC_CONST(0.008366100605636) }, + { FRAC_CONST(0.031144157485525), FRAC_CONST(0.008468064783849) }, + { FRAC_CONST(0.031116279093331), FRAC_CONST(0.008569938275893) }, + { FRAC_CONST(0.031088067470786), FRAC_CONST(0.008671719990782) }, + { FRAC_CONST(0.031059522920014), FRAC_CONST(0.008773408838517) }, + { FRAC_CONST(0.031030645746705), FRAC_CONST(0.008875003730092) }, + { FRAC_CONST(0.031001436260110), FRAC_CONST(0.008976503577507) }, + { FRAC_CONST(0.030971894773039), FRAC_CONST(0.009077907293780) }, + { FRAC_CONST(0.030942021601857), FRAC_CONST(0.009179213792959) }, + { FRAC_CONST(0.030911817066483), FRAC_CONST(0.009280421990133) }, + { FRAC_CONST(0.030881281490382), FRAC_CONST(0.009381530801444) }, + { FRAC_CONST(0.030850415200566), FRAC_CONST(0.009482539144097) }, + { FRAC_CONST(0.030819218527589), FRAC_CONST(0.009583445936373) }, + { FRAC_CONST(0.030787691805541), FRAC_CONST(0.009684250097643) }, + { FRAC_CONST(0.030755835372048), FRAC_CONST(0.009784950548375) }, + { FRAC_CONST(0.030723649568268), FRAC_CONST(0.009885546210147) }, + { FRAC_CONST(0.030691134738883), FRAC_CONST(0.009986036005661) }, + { FRAC_CONST(0.030658291232103), FRAC_CONST(0.010086418858753) }, + { FRAC_CONST(0.030625119399655), FRAC_CONST(0.010186693694402) }, + { FRAC_CONST(0.030591619596781), FRAC_CONST(0.010286859438745) }, + { FRAC_CONST(0.030557792182239), FRAC_CONST(0.010386915019088) }, + { FRAC_CONST(0.030523637518292), FRAC_CONST(0.010486859363916) }, + { FRAC_CONST(0.030489155970710), FRAC_CONST(0.010586691402906) }, + { FRAC_CONST(0.030454347908763), FRAC_CONST(0.010686410066936) }, + { FRAC_CONST(0.030419213705216), FRAC_CONST(0.010786014288099) }, + { FRAC_CONST(0.030383753736329), FRAC_CONST(0.010885502999714) }, + { FRAC_CONST(0.030347968381849), FRAC_CONST(0.010984875136338) }, + { FRAC_CONST(0.030311858025010), FRAC_CONST(0.011084129633775) }, + { FRAC_CONST(0.030275423052523), FRAC_CONST(0.011183265429088) }, + { FRAC_CONST(0.030238663854579), FRAC_CONST(0.011282281460612) }, + { FRAC_CONST(0.030201580824838), FRAC_CONST(0.011381176667967) }, + { FRAC_CONST(0.030164174360430), FRAC_CONST(0.011479949992062) }, + { FRAC_CONST(0.030126444861948), FRAC_CONST(0.011578600375117) }, + { FRAC_CONST(0.030088392733446), FRAC_CONST(0.011677126760663) }, + { FRAC_CONST(0.030050018382430), FRAC_CONST(0.011775528093563) }, + { FRAC_CONST(0.030011322219859), FRAC_CONST(0.011873803320018) }, + { FRAC_CONST(0.029972304660138), FRAC_CONST(0.011971951387578) }, + { FRAC_CONST(0.029932966121114), FRAC_CONST(0.012069971245157) }, + { FRAC_CONST(0.029893307024070), FRAC_CONST(0.012167861843041) }, + { FRAC_CONST(0.029853327793724), FRAC_CONST(0.012265622132901) }, + { FRAC_CONST(0.029813028858222), FRAC_CONST(0.012363251067801) }, + { FRAC_CONST(0.029772410649132), FRAC_CONST(0.012460747602215) }, + { FRAC_CONST(0.029731473601443), FRAC_CONST(0.012558110692033) }, + { FRAC_CONST(0.029690218153558), FRAC_CONST(0.012655339294575) }, + { FRAC_CONST(0.029648644747289), FRAC_CONST(0.012752432368600) }, + { FRAC_CONST(0.029606753827855), FRAC_CONST(0.012849388874320) }, + { FRAC_CONST(0.029564545843872), FRAC_CONST(0.012946207773407) }, + { FRAC_CONST(0.029522021247356), FRAC_CONST(0.013042888029011) }, + { FRAC_CONST(0.029479180493710), FRAC_CONST(0.013139428605762) }, + { FRAC_CONST(0.029436024041725), FRAC_CONST(0.013235828469789) }, + { FRAC_CONST(0.029392552353570), FRAC_CONST(0.013332086588727) }, + { FRAC_CONST(0.029348765894794), FRAC_CONST(0.013428201931728) }, + { FRAC_CONST(0.029304665134313), FRAC_CONST(0.013524173469475) }, + { FRAC_CONST(0.029260250544412), FRAC_CONST(0.013620000174189) }, + { FRAC_CONST(0.029215522600735), FRAC_CONST(0.013715681019643) }, + { FRAC_CONST(0.029170481782283), FRAC_CONST(0.013811214981173) }, + { FRAC_CONST(0.029125128571406), FRAC_CONST(0.013906601035686) }, + { FRAC_CONST(0.029079463453801), FRAC_CONST(0.014001838161674) }, + { FRAC_CONST(0.029033486918505), FRAC_CONST(0.014096925339225) }, + { FRAC_CONST(0.028987199457889), FRAC_CONST(0.014191861550031) }, + { FRAC_CONST(0.028940601567655), FRAC_CONST(0.014286645777401) }, + { FRAC_CONST(0.028893693746829), FRAC_CONST(0.014381277006273) }, + { FRAC_CONST(0.028846476497755), FRAC_CONST(0.014475754223221) }, + { FRAC_CONST(0.028798950326094), FRAC_CONST(0.014570076416472) }, + { FRAC_CONST(0.028751115740811), FRAC_CONST(0.014664242575910) }, + { FRAC_CONST(0.028702973254178), FRAC_CONST(0.014758251693091) }, + { FRAC_CONST(0.028654523381760), FRAC_CONST(0.014852102761253) }, + { FRAC_CONST(0.028605766642418), FRAC_CONST(0.014945794775326) }, + { FRAC_CONST(0.028556703558297), FRAC_CONST(0.015039326731945) }, + { FRAC_CONST(0.028507334654823), FRAC_CONST(0.015132697629457) }, + { FRAC_CONST(0.028457660460698), FRAC_CONST(0.015225906467935) }, + { FRAC_CONST(0.028407681507891), FRAC_CONST(0.015318952249187) }, + { FRAC_CONST(0.028357398331639), FRAC_CONST(0.015411833976768) }, + { FRAC_CONST(0.028306811470432), FRAC_CONST(0.015504550655988) }, + { FRAC_CONST(0.028255921466016), FRAC_CONST(0.015597101293927) }, + { FRAC_CONST(0.028204728863381), FRAC_CONST(0.015689484899442) }, + { FRAC_CONST(0.028153234210760), FRAC_CONST(0.015781700483179) }, + { FRAC_CONST(0.028101438059619), FRAC_CONST(0.015873747057582) }, + { FRAC_CONST(0.028049340964652), FRAC_CONST(0.015965623636907) }, + { FRAC_CONST(0.027996943483779), FRAC_CONST(0.016057329237229) }, + { FRAC_CONST(0.027944246178133), FRAC_CONST(0.016148862876456) }, + { FRAC_CONST(0.027891249612061), FRAC_CONST(0.016240223574335) }, + { FRAC_CONST(0.027837954353113), FRAC_CONST(0.016331410352467) }, + { FRAC_CONST(0.027784360972039), FRAC_CONST(0.016422422234315) }, + { FRAC_CONST(0.027730470042780), FRAC_CONST(0.016513258245214) }, + { FRAC_CONST(0.027676282142466), FRAC_CONST(0.016603917412384) }, + { FRAC_CONST(0.027621797851405), FRAC_CONST(0.016694398764938) }, + { FRAC_CONST(0.027567017753080), FRAC_CONST(0.016784701333894) }, + { FRAC_CONST(0.027511942434143), FRAC_CONST(0.016874824152183) }, + { FRAC_CONST(0.027456572484404), FRAC_CONST(0.016964766254662) }, + { FRAC_CONST(0.027400908496833), FRAC_CONST(0.017054526678124) }, + { FRAC_CONST(0.027344951067546), FRAC_CONST(0.017144104461307) }, + { FRAC_CONST(0.027288700795801), FRAC_CONST(0.017233498644904) }, + { FRAC_CONST(0.027232158283994), FRAC_CONST(0.017322708271577) }, + { FRAC_CONST(0.027175324137651), FRAC_CONST(0.017411732385960) }, + { FRAC_CONST(0.027118198965418), FRAC_CONST(0.017500570034678) }, + { FRAC_CONST(0.027060783379060), FRAC_CONST(0.017589220266351) }, + { FRAC_CONST(0.027003077993454), FRAC_CONST(0.017677682131607) }, + { FRAC_CONST(0.026945083426576), FRAC_CONST(0.017765954683088) }, + { FRAC_CONST(0.026886800299502), FRAC_CONST(0.017854036975468) }, + { FRAC_CONST(0.026828229236397), FRAC_CONST(0.017941928065456) }, + { FRAC_CONST(0.026769370864511), FRAC_CONST(0.018029627011808) }, + { FRAC_CONST(0.026710225814170), FRAC_CONST(0.018117132875340) }, + { FRAC_CONST(0.026650794718768), FRAC_CONST(0.018204444718934) }, + { FRAC_CONST(0.026591078214767), FRAC_CONST(0.018291561607551) }, + { FRAC_CONST(0.026531076941680), FRAC_CONST(0.018378482608238) }, + { FRAC_CONST(0.026470791542075), FRAC_CONST(0.018465206790142) }, + { FRAC_CONST(0.026410222661558), FRAC_CONST(0.018551733224515) }, + { FRAC_CONST(0.026349370948775), FRAC_CONST(0.018638060984730) }, + { FRAC_CONST(0.026288237055398), FRAC_CONST(0.018724189146286) }, + { FRAC_CONST(0.026226821636121), FRAC_CONST(0.018810116786819) }, + { FRAC_CONST(0.026165125348656), FRAC_CONST(0.018895842986112) }, + { FRAC_CONST(0.026103148853718), FRAC_CONST(0.018981366826109) }, + { FRAC_CONST(0.026040892815028), FRAC_CONST(0.019066687390916) }, + { FRAC_CONST(0.025978357899296), FRAC_CONST(0.019151803766819) }, + { FRAC_CONST(0.025915544776223), FRAC_CONST(0.019236715042290) }, + { FRAC_CONST(0.025852454118485), FRAC_CONST(0.019321420307998) }, + { FRAC_CONST(0.025789086601733), FRAC_CONST(0.019405918656817) }, + { FRAC_CONST(0.025725442904582), FRAC_CONST(0.019490209183837) }, + { FRAC_CONST(0.025661523708606), FRAC_CONST(0.019574290986376) }, + { FRAC_CONST(0.025597329698327), FRAC_CONST(0.019658163163984) }, + { FRAC_CONST(0.025532861561211), FRAC_CONST(0.019741824818458) }, + { FRAC_CONST(0.025468119987662), FRAC_CONST(0.019825275053848) }, + { FRAC_CONST(0.025403105671008), FRAC_CONST(0.019908512976470) }, + { FRAC_CONST(0.025337819307501), FRAC_CONST(0.019991537694913) }, + { FRAC_CONST(0.025272261596305), FRAC_CONST(0.020074348320047) }, + { FRAC_CONST(0.025206433239491), FRAC_CONST(0.020156943965039) }, + { FRAC_CONST(0.025140334942028), FRAC_CONST(0.020239323745355) }, + { FRAC_CONST(0.025073967411776), FRAC_CONST(0.020321486778774) }, + { FRAC_CONST(0.025007331359476), FRAC_CONST(0.020403432185395) }, + { FRAC_CONST(0.024940427498748), FRAC_CONST(0.020485159087650) }, + { FRAC_CONST(0.024873256546079), FRAC_CONST(0.020566666610309) }, + { FRAC_CONST(0.024805819220816), FRAC_CONST(0.020647953880491) }, + { FRAC_CONST(0.024738116245157), FRAC_CONST(0.020729020027676) }, + { FRAC_CONST(0.024670148344147), FRAC_CONST(0.020809864183709) }, + { FRAC_CONST(0.024601916245669), FRAC_CONST(0.020890485482816) }, + { FRAC_CONST(0.024533420680433), FRAC_CONST(0.020970883061607) }, + { FRAC_CONST(0.024464662381971), FRAC_CONST(0.021051056059087) }, + { FRAC_CONST(0.024395642086630), FRAC_CONST(0.021131003616670) }, + { FRAC_CONST(0.024326360533561), FRAC_CONST(0.021210724878181) }, + { FRAC_CONST(0.024256818464715), FRAC_CONST(0.021290218989868) }, + { FRAC_CONST(0.024187016624830), FRAC_CONST(0.021369485100415) }, + { FRAC_CONST(0.024116955761430), FRAC_CONST(0.021448522360944) }, + { FRAC_CONST(0.024046636624808), FRAC_CONST(0.021527329925030) }, + { FRAC_CONST(0.023976059968027), FRAC_CONST(0.021605906948708) }, + { FRAC_CONST(0.023905226546906), FRAC_CONST(0.021684252590480) }, + { FRAC_CONST(0.023834137120014), FRAC_CONST(0.021762366011328) }, + { FRAC_CONST(0.023762792448662), FRAC_CONST(0.021840246374720) }, + { FRAC_CONST(0.023691193296893), FRAC_CONST(0.021917892846620) }, + { FRAC_CONST(0.023619340431478), FRAC_CONST(0.021995304595495) }, + { FRAC_CONST(0.023547234621902), FRAC_CONST(0.022072480792330) }, + { FRAC_CONST(0.023474876640361), FRAC_CONST(0.022149420610628) }, + { FRAC_CONST(0.023402267261751), FRAC_CONST(0.022226123226426) }, + { FRAC_CONST(0.023329407263659), FRAC_CONST(0.022302587818300) }, + { FRAC_CONST(0.023256297426359), FRAC_CONST(0.022378813567377) }, + { FRAC_CONST(0.023182938532797), FRAC_CONST(0.022454799657339) }, + { FRAC_CONST(0.023109331368588), FRAC_CONST(0.022530545274437) }, + { FRAC_CONST(0.023035476722006), FRAC_CONST(0.022606049607496) }, + { FRAC_CONST(0.022961375383975), FRAC_CONST(0.022681311847926) }, + { FRAC_CONST(0.022887028148061), FRAC_CONST(0.022756331189727) }, + { FRAC_CONST(0.022812435810462), FRAC_CONST(0.022831106829504) }, + { FRAC_CONST(0.022737599170003), FRAC_CONST(0.022905637966469) }, + { FRAC_CONST(0.022662519028125), FRAC_CONST(0.022979923802453) }, + { FRAC_CONST(0.022587196188874), FRAC_CONST(0.023053963541915) }, + { FRAC_CONST(0.022511631458899), FRAC_CONST(0.023127756391950) }, + { FRAC_CONST(0.022435825647437), FRAC_CONST(0.023201301562294) }, + { FRAC_CONST(0.022359779566306), FRAC_CONST(0.023274598265338) }, + { FRAC_CONST(0.022283494029900), FRAC_CONST(0.023347645716133) }, + { FRAC_CONST(0.022206969855176), FRAC_CONST(0.023420443132400) }, + { FRAC_CONST(0.022130207861645), FRAC_CONST(0.023492989734537) }, + { FRAC_CONST(0.022053208871367), FRAC_CONST(0.023565284745628) }, + { FRAC_CONST(0.021975973708940), FRAC_CONST(0.023637327391451) }, + { FRAC_CONST(0.021898503201489), FRAC_CONST(0.023709116900488) }, + { FRAC_CONST(0.021820798178663), FRAC_CONST(0.023780652503931) }, + { FRAC_CONST(0.021742859472618), FRAC_CONST(0.023851933435691) }, + { FRAC_CONST(0.021664687918017), FRAC_CONST(0.023922958932406) }, + { FRAC_CONST(0.021586284352013), FRAC_CONST(0.023993728233451) }, + { FRAC_CONST(0.021507649614247), FRAC_CONST(0.024064240580942) }, + { FRAC_CONST(0.021428784546832), FRAC_CONST(0.024134495219750) }, + { FRAC_CONST(0.021349689994350), FRAC_CONST(0.024204491397504) }, + { FRAC_CONST(0.021270366803840), FRAC_CONST(0.024274228364600) }, + { FRAC_CONST(0.021190815824791), FRAC_CONST(0.024343705374213) }, + { FRAC_CONST(0.021111037909128), FRAC_CONST(0.024412921682298) }, + { FRAC_CONST(0.021031033911210), FRAC_CONST(0.024481876547605) }, + { FRAC_CONST(0.020950804687815), FRAC_CONST(0.024550569231683) }, + { FRAC_CONST(0.020870351098134), FRAC_CONST(0.024618998998889) }, + { FRAC_CONST(0.020789674003759), FRAC_CONST(0.024687165116394) }, + { FRAC_CONST(0.020708774268678), FRAC_CONST(0.024755066854194) }, + { FRAC_CONST(0.020627652759262), FRAC_CONST(0.024822703485116) }, + { FRAC_CONST(0.020546310344257), FRAC_CONST(0.024890074284826) }, + { FRAC_CONST(0.020464747894775), FRAC_CONST(0.024957178531837) }, + { FRAC_CONST(0.020382966284284), FRAC_CONST(0.025024015507516) }, + { FRAC_CONST(0.020300966388600), FRAC_CONST(0.025090584496093) }, + { FRAC_CONST(0.020218749085876), FRAC_CONST(0.025156884784668) }, + { FRAC_CONST(0.020136315256592), FRAC_CONST(0.025222915663218) }, + { FRAC_CONST(0.020053665783549), FRAC_CONST(0.025288676424605) }, + { FRAC_CONST(0.019970801551857), FRAC_CONST(0.025354166364584) }, + { FRAC_CONST(0.019887723448925), FRAC_CONST(0.025419384781811) }, + { FRAC_CONST(0.019804432364452), FRAC_CONST(0.025484330977848) }, + { FRAC_CONST(0.019720929190419), FRAC_CONST(0.025549004257175) }, + { FRAC_CONST(0.019637214821078), FRAC_CONST(0.025613403927192) }, + { FRAC_CONST(0.019553290152943), FRAC_CONST(0.025677529298230) }, + { FRAC_CONST(0.019469156084779), FRAC_CONST(0.025741379683559) }, + { FRAC_CONST(0.019384813517595), FRAC_CONST(0.025804954399392) }, + { FRAC_CONST(0.019300263354632), FRAC_CONST(0.025868252764895) }, + { FRAC_CONST(0.019215506501354), FRAC_CONST(0.025931274102193) }, + { FRAC_CONST(0.019130543865439), FRAC_CONST(0.025994017736379) }, + { FRAC_CONST(0.019045376356769), FRAC_CONST(0.026056482995518) }, + { FRAC_CONST(0.018960004887419), FRAC_CONST(0.026118669210657) }, + { FRAC_CONST(0.018874430371648), FRAC_CONST(0.026180575715833) }, + { FRAC_CONST(0.018788653725892), FRAC_CONST(0.026242201848076) }, + { FRAC_CONST(0.018702675868750), FRAC_CONST(0.026303546947421) }, + { FRAC_CONST(0.018616497720974), FRAC_CONST(0.026364610356909) }, + { FRAC_CONST(0.018530120205464), FRAC_CONST(0.026425391422602) }, + { FRAC_CONST(0.018443544247254), FRAC_CONST(0.026485889493583) }, + { FRAC_CONST(0.018356770773502), FRAC_CONST(0.026546103921965) }, + { FRAC_CONST(0.018269800713483), FRAC_CONST(0.026606034062902) }, + { FRAC_CONST(0.018182634998576), FRAC_CONST(0.026665679274589) }, + { FRAC_CONST(0.018095274562256), FRAC_CONST(0.026725038918274) }, + { FRAC_CONST(0.018007720340083), FRAC_CONST(0.026784112358263) }, + { FRAC_CONST(0.017919973269692), FRAC_CONST(0.026842898961926) }, + { FRAC_CONST(0.017832034290785), FRAC_CONST(0.026901398099707) }, + { FRAC_CONST(0.017743904345116), FRAC_CONST(0.026959609145127) }, + { FRAC_CONST(0.017655584376488), FRAC_CONST(0.027017531474792) }, + { FRAC_CONST(0.017567075330734), FRAC_CONST(0.027075164468401) }, + { FRAC_CONST(0.017478378155718), FRAC_CONST(0.027132507508750) }, + { FRAC_CONST(0.017389493801313), FRAC_CONST(0.027189559981742) }, + { FRAC_CONST(0.017300423219401), FRAC_CONST(0.027246321276391) }, + { FRAC_CONST(0.017211167363854), FRAC_CONST(0.027302790784828) }, + { FRAC_CONST(0.017121727190533), FRAC_CONST(0.027358967902310) }, + { FRAC_CONST(0.017032103657269), FRAC_CONST(0.027414852027226) }, + { FRAC_CONST(0.016942297723858), FRAC_CONST(0.027470442561102) }, + { FRAC_CONST(0.016852310352050), FRAC_CONST(0.027525738908608) }, + { FRAC_CONST(0.016762142505537), FRAC_CONST(0.027580740477564) }, + { FRAC_CONST(0.016671795149944), FRAC_CONST(0.027635446678948) }, + { FRAC_CONST(0.016581269252819), FRAC_CONST(0.027689856926900) }, + { FRAC_CONST(0.016490565783622), FRAC_CONST(0.027743970638730) }, + { FRAC_CONST(0.016399685713714), FRAC_CONST(0.027797787234924) }, + { FRAC_CONST(0.016308630016347), FRAC_CONST(0.027851306139149) }, + { FRAC_CONST(0.016217399666655), FRAC_CONST(0.027904526778260) }, + { FRAC_CONST(0.016125995641641), FRAC_CONST(0.027957448582309) }, + { FRAC_CONST(0.016034418920170), FRAC_CONST(0.028010070984544) }, + { FRAC_CONST(0.015942670482954), FRAC_CONST(0.028062393421421) }, + { FRAC_CONST(0.015850751312545), FRAC_CONST(0.028114415332610) }, + { FRAC_CONST(0.015758662393324), FRAC_CONST(0.028166136160998) }, + { FRAC_CONST(0.015666404711489), FRAC_CONST(0.028217555352697) }, + { FRAC_CONST(0.015573979255046), FRAC_CONST(0.028268672357047) }, + { FRAC_CONST(0.015481387013797), FRAC_CONST(0.028319486626627) }, + { FRAC_CONST(0.015388628979331), FRAC_CONST(0.028369997617257) }, + { FRAC_CONST(0.015295706145012), FRAC_CONST(0.028420204788004) }, + { FRAC_CONST(0.015202619505968), FRAC_CONST(0.028470107601191) }, + { FRAC_CONST(0.015109370059084), FRAC_CONST(0.028519705522399) }, + { FRAC_CONST(0.015015958802984), FRAC_CONST(0.028568998020472) }, + { FRAC_CONST(0.014922386738030), FRAC_CONST(0.028617984567529) }, + { FRAC_CONST(0.014828654866302), FRAC_CONST(0.028666664638963) }, + { FRAC_CONST(0.014734764191593), FRAC_CONST(0.028715037713449) }, + { FRAC_CONST(0.014640715719398), FRAC_CONST(0.028763103272951) }, + { FRAC_CONST(0.014546510456900), FRAC_CONST(0.028810860802724) }, + { FRAC_CONST(0.014452149412962), FRAC_CONST(0.028858309791325) }, + { FRAC_CONST(0.014357633598114), FRAC_CONST(0.028905449730613) }, + { FRAC_CONST(0.014262964024545), FRAC_CONST(0.028952280115756) }, + { FRAC_CONST(0.014168141706090), FRAC_CONST(0.028998800445240) }, + { FRAC_CONST(0.014073167658220), FRAC_CONST(0.029045010220868) }, + { FRAC_CONST(0.013978042898030), FRAC_CONST(0.029090908947771) }, + { FRAC_CONST(0.013882768444231), FRAC_CONST(0.029136496134411) }, + { FRAC_CONST(0.013787345317136), FRAC_CONST(0.029181771292585) }, + { FRAC_CONST(0.013691774538648), FRAC_CONST(0.029226733937433) }, + { FRAC_CONST(0.013596057132255), FRAC_CONST(0.029271383587441) }, + { FRAC_CONST(0.013500194123014), FRAC_CONST(0.029315719764447) }, + { FRAC_CONST(0.013404186537539), FRAC_CONST(0.029359741993647) }, + { FRAC_CONST(0.013308035403995), FRAC_CONST(0.029403449803598) }, + { FRAC_CONST(0.013211741752084), FRAC_CONST(0.029446842726223) }, + { FRAC_CONST(0.013115306613032), FRAC_CONST(0.029489920296820) }, + { FRAC_CONST(0.013018731019584), FRAC_CONST(0.029532682054063) }, + { FRAC_CONST(0.012922016005985), FRAC_CONST(0.029575127540008) }, + { FRAC_CONST(0.012825162607977), FRAC_CONST(0.029617256300097) }, + { FRAC_CONST(0.012728171862781), FRAC_CONST(0.029659067883165) }, + { FRAC_CONST(0.012631044809089), FRAC_CONST(0.029700561841444) }, + { FRAC_CONST(0.012533782487056), FRAC_CONST(0.029741737730567) }, + { FRAC_CONST(0.012436385938281), FRAC_CONST(0.029782595109573) }, + { FRAC_CONST(0.012338856205805), FRAC_CONST(0.029823133540913) }, + { FRAC_CONST(0.012241194334091), FRAC_CONST(0.029863352590452) }, + { FRAC_CONST(0.012143401369021), FRAC_CONST(0.029903251827477) }, + { FRAC_CONST(0.012045478357878), FRAC_CONST(0.029942830824699) }, + { FRAC_CONST(0.011947426349339), FRAC_CONST(0.029982089158259) }, + { FRAC_CONST(0.011849246393462), FRAC_CONST(0.030021026407731) }, + { FRAC_CONST(0.011750939541676), FRAC_CONST(0.030059642156129) }, + { FRAC_CONST(0.011652506846768), FRAC_CONST(0.030097935989909) }, + { FRAC_CONST(0.011553949362874), FRAC_CONST(0.030135907498976) }, + { FRAC_CONST(0.011455268145464), FRAC_CONST(0.030173556276684) }, + { FRAC_CONST(0.011356464251335), FRAC_CONST(0.030210881919845) }, + { FRAC_CONST(0.011257538738598), FRAC_CONST(0.030247884028732) }, + { FRAC_CONST(0.011158492666665), FRAC_CONST(0.030284562207083) }, + { FRAC_CONST(0.011059327096240), FRAC_CONST(0.030320916062102) }, + { FRAC_CONST(0.010960043089307), FRAC_CONST(0.030356945204470) }, + { FRAC_CONST(0.010860641709118), FRAC_CONST(0.030392649248343) }, + { FRAC_CONST(0.010761124020182), FRAC_CONST(0.030428027811361) }, + { FRAC_CONST(0.010661491088253), FRAC_CONST(0.030463080514646) }, + { FRAC_CONST(0.010561743980319), FRAC_CONST(0.030497806982812) }, + { FRAC_CONST(0.010461883764593), FRAC_CONST(0.030532206843968) }, + { FRAC_CONST(0.010361911510496), FRAC_CONST(0.030566279729717) }, + { FRAC_CONST(0.010261828288652), FRAC_CONST(0.030600025275167) }, + { FRAC_CONST(0.010161635170872), FRAC_CONST(0.030633443118931) }, + { FRAC_CONST(0.010061333230142), FRAC_CONST(0.030666532903129) }, + { FRAC_CONST(0.009960923540617), FRAC_CONST(0.030699294273397) }, + { FRAC_CONST(0.009860407177603), FRAC_CONST(0.030731726878888) }, + { FRAC_CONST(0.009759785217550), FRAC_CONST(0.030763830372273) }, + { FRAC_CONST(0.009659058738038), FRAC_CONST(0.030795604409750) }, + { FRAC_CONST(0.009558228817767), FRAC_CONST(0.030827048651045) }, + { FRAC_CONST(0.009457296536545), FRAC_CONST(0.030858162759415) }, + { FRAC_CONST(0.009356262975275), FRAC_CONST(0.030888946401653) }, + { FRAC_CONST(0.009255129215945), FRAC_CONST(0.030919399248091) }, + { FRAC_CONST(0.009153896341616), FRAC_CONST(0.030949520972603) }, + { FRAC_CONST(0.009052565436412), FRAC_CONST(0.030979311252611) }, + { FRAC_CONST(0.008951137585505), FRAC_CONST(0.031008769769084) }, + { FRAC_CONST(0.008849613875105), FRAC_CONST(0.031037896206544) }, + { FRAC_CONST(0.008747995392451), FRAC_CONST(0.031066690253072) }, + { FRAC_CONST(0.008646283225794), FRAC_CONST(0.031095151600306) }, + { FRAC_CONST(0.008544478464390), FRAC_CONST(0.031123279943448) }, + { FRAC_CONST(0.008442582198486), FRAC_CONST(0.031151074981266) }, + { FRAC_CONST(0.008340595519310), FRAC_CONST(0.031178536416098) }, + { FRAC_CONST(0.008238519519057), FRAC_CONST(0.031205663953853) }, + { FRAC_CONST(0.008136355290878), FRAC_CONST(0.031232457304017) }, + { FRAC_CONST(0.008034103928871), FRAC_CONST(0.031258916179656) }, + { FRAC_CONST(0.007931766528065), FRAC_CONST(0.031285040297416) }, + { FRAC_CONST(0.007829344184412), FRAC_CONST(0.031310829377528) }, + { FRAC_CONST(0.007726837994772), FRAC_CONST(0.031336283143813) }, + { FRAC_CONST(0.007624249056906), FRAC_CONST(0.031361401323680) }, + { FRAC_CONST(0.007521578469457), FRAC_CONST(0.031386183648135) }, + { FRAC_CONST(0.007418827331946), FRAC_CONST(0.031410629851778) }, + { FRAC_CONST(0.007315996744755), FRAC_CONST(0.031434739672811) }, + { FRAC_CONST(0.007213087809115), FRAC_CONST(0.031458512853036) }, + { FRAC_CONST(0.007110101627101), FRAC_CONST(0.031481949137863) }, + { FRAC_CONST(0.007007039301610), FRAC_CONST(0.031505048276306) }, + { FRAC_CONST(0.006903901936357), FRAC_CONST(0.031527810020993) }, + { FRAC_CONST(0.006800690635862), FRAC_CONST(0.031550234128164) }, + { FRAC_CONST(0.006697406505433), FRAC_CONST(0.031572320357675) }, + { FRAC_CONST(0.006594050651161), FRAC_CONST(0.031594068473000) }, + { FRAC_CONST(0.006490624179905), FRAC_CONST(0.031615478241233) }, + { FRAC_CONST(0.006387128199278), FRAC_CONST(0.031636549433095) }, + { FRAC_CONST(0.006283563817639), FRAC_CONST(0.031657281822929) }, + { FRAC_CONST(0.006179932144080), FRAC_CONST(0.031677675188707) }, + { FRAC_CONST(0.006076234288412), FRAC_CONST(0.031697729312034) }, + { FRAC_CONST(0.005972471361157), FRAC_CONST(0.031717443978146) }, + { FRAC_CONST(0.005868644473532), FRAC_CONST(0.031736818975914) }, + { FRAC_CONST(0.005764754737440), FRAC_CONST(0.031755854097848) }, + { FRAC_CONST(0.005660803265456), FRAC_CONST(0.031774549140098) }, + { FRAC_CONST(0.005556791170816), FRAC_CONST(0.031792903902453) }, + { FRAC_CONST(0.005452719567407), FRAC_CONST(0.031810918188350) }, + { FRAC_CONST(0.005348589569753), FRAC_CONST(0.031828591804869) }, + { FRAC_CONST(0.005244402293001), FRAC_CONST(0.031845924562742) }, + { FRAC_CONST(0.005140158852914), FRAC_CONST(0.031862916276347) }, + { FRAC_CONST(0.005035860365855), FRAC_CONST(0.031879566763717) }, + { FRAC_CONST(0.004931507948778), FRAC_CONST(0.031895875846539) }, + { FRAC_CONST(0.004827102719212), FRAC_CONST(0.031911843350155) }, + { FRAC_CONST(0.004722645795254), FRAC_CONST(0.031927469103567) }, + { FRAC_CONST(0.004618138295554), FRAC_CONST(0.031942752939435) }, + { FRAC_CONST(0.004513581339303), FRAC_CONST(0.031957694694082) }, + { FRAC_CONST(0.004408976046222), FRAC_CONST(0.031972294207493) }, + { FRAC_CONST(0.004304323536549), FRAC_CONST(0.031986551323320) }, + { FRAC_CONST(0.004199624931030), FRAC_CONST(0.032000465888879) }, + { FRAC_CONST(0.004094881350902), FRAC_CONST(0.032014037755158) }, + { FRAC_CONST(0.003990093917884), FRAC_CONST(0.032027266776813) }, + { FRAC_CONST(0.003885263754166), FRAC_CONST(0.032040152812170) }, + { FRAC_CONST(0.003780391982394), FRAC_CONST(0.032052695723232) }, + { FRAC_CONST(0.003675479725661), FRAC_CONST(0.032064895375674) }, + { FRAC_CONST(0.003570528107494), FRAC_CONST(0.032076751638847) }, + { FRAC_CONST(0.003465538251839), FRAC_CONST(0.032088264385780) }, + { FRAC_CONST(0.003360511283053), FRAC_CONST(0.032099433493181) }, + { FRAC_CONST(0.003255448325892), FRAC_CONST(0.032110258841438) }, + { FRAC_CONST(0.003150350505494), FRAC_CONST(0.032120740314619) }, + { FRAC_CONST(0.003045218947373), FRAC_CONST(0.032130877800478) }, + { FRAC_CONST(0.002940054777404), FRAC_CONST(0.032140671190449) }, + { FRAC_CONST(0.002834859121810), FRAC_CONST(0.032150120379653) }, + { FRAC_CONST(0.002729633107153), FRAC_CONST(0.032159225266897) }, + { FRAC_CONST(0.002624377860318), FRAC_CONST(0.032167985754674) }, + { FRAC_CONST(0.002519094508504), FRAC_CONST(0.032176401749168) }, + { FRAC_CONST(0.002413784179212), FRAC_CONST(0.032184473160250) }, + { FRAC_CONST(0.002308448000231), FRAC_CONST(0.032192199901481) }, + { FRAC_CONST(0.002203087099626), FRAC_CONST(0.032199581890114) }, + { FRAC_CONST(0.002097702605728), FRAC_CONST(0.032206619047093) }, + { FRAC_CONST(0.001992295647121), FRAC_CONST(0.032213311297057) }, + { FRAC_CONST(0.001886867352628), FRAC_CONST(0.032219658568338) }, + { FRAC_CONST(0.001781418851302), FRAC_CONST(0.032225660792960) }, + { FRAC_CONST(0.001675951272410), FRAC_CONST(0.032231317906644) }, + { FRAC_CONST(0.001570465745428), FRAC_CONST(0.032236629848809) }, + { FRAC_CONST(0.001464963400018), FRAC_CONST(0.032241596562566) }, + { FRAC_CONST(0.001359445366028), FRAC_CONST(0.032246217994727) }, + { FRAC_CONST(0.001253912773470), FRAC_CONST(0.032250494095799) }, + { FRAC_CONST(0.001148366752513), FRAC_CONST(0.032254424819990) }, + { FRAC_CONST(0.001042808433471), FRAC_CONST(0.032258010125204) }, + { FRAC_CONST(0.000937238946789), FRAC_CONST(0.032261249973045) }, + { FRAC_CONST(0.000831659423030), FRAC_CONST(0.032264144328817) }, + { FRAC_CONST(0.000726070992868), FRAC_CONST(0.032266693161525) }, + { FRAC_CONST(0.000620474787068), FRAC_CONST(0.032268896443871) }, + { FRAC_CONST(0.000514871936481), FRAC_CONST(0.032270754152261) }, + { FRAC_CONST(0.000409263572030), FRAC_CONST(0.032272266266801) }, + { FRAC_CONST(0.000303650824695), FRAC_CONST(0.032273432771295) }, + { FRAC_CONST(0.000198034825504), FRAC_CONST(0.032274253653254) }, + { FRAC_CONST(0.000092416705518), FRAC_CONST(0.032274728903884) } +}; + +#ifdef LD_DEC +/* 240 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_960[] = +{ + { FRAC_CONST(0.045643531183573), FRAC_CONST(0.000037342034959) }, + { FRAC_CONST(0.045642309173789), FRAC_CONST(0.000336075315362) }, + { FRAC_CONST(0.045639131999390), FRAC_CONST(0.000634794199417) }, + { FRAC_CONST(0.045633999796474), FRAC_CONST(0.000933485891002) }, + { FRAC_CONST(0.045626912784890), FRAC_CONST(0.001232137595157) }, + { FRAC_CONST(0.045617871268219), FRAC_CONST(0.001530736518639) }, + { FRAC_CONST(0.045606875633772), FRAC_CONST(0.001829269870464) }, + { FRAC_CONST(0.045593926352564), FRAC_CONST(0.002127724862455) }, + { FRAC_CONST(0.045579023979299), FRAC_CONST(0.002426088709795) }, + { FRAC_CONST(0.045562169152346), FRAC_CONST(0.002724348631569) }, + { FRAC_CONST(0.045543362593709), FRAC_CONST(0.003022491851315) }, + { FRAC_CONST(0.045522605108999), FRAC_CONST(0.003320505597570) }, + { FRAC_CONST(0.045499897587396), FRAC_CONST(0.003618377104416) }, + { FRAC_CONST(0.045475241001617), FRAC_CONST(0.003916093612031) }, + { FRAC_CONST(0.045448636407866), FRAC_CONST(0.004213642367228) }, + { FRAC_CONST(0.045420084945797), FRAC_CONST(0.004511010624011) }, + { FRAC_CONST(0.045389587838458), FRAC_CONST(0.004808185644112) }, + { FRAC_CONST(0.045357146392244), FRAC_CONST(0.005105154697544) }, + { FRAC_CONST(0.045322761996840), FRAC_CONST(0.005401905063139) }, + { FRAC_CONST(0.045286436125157), FRAC_CONST(0.005698424029100) }, + { FRAC_CONST(0.045248170333275), FRAC_CONST(0.005994698893542) }, + { FRAC_CONST(0.045207966260374), FRAC_CONST(0.006290716965035) }, + { FRAC_CONST(0.045165825628663), FRAC_CONST(0.006586465563151) }, + { FRAC_CONST(0.045121750243305), FRAC_CONST(0.006881932019003) }, + { FRAC_CONST(0.045075741992343), FRAC_CONST(0.007177103675792) }, + { FRAC_CONST(0.045027802846618), FRAC_CONST(0.007471967889347) }, + { FRAC_CONST(0.044977934859683), FRAC_CONST(0.007766512028667) }, + { FRAC_CONST(0.044926140167717), FRAC_CONST(0.008060723476460) }, + { FRAC_CONST(0.044872420989432), FRAC_CONST(0.008354589629687) }, + { FRAC_CONST(0.044816779625979), FRAC_CONST(0.008648097900101) }, + { FRAC_CONST(0.044759218460849), FRAC_CONST(0.008941235714784) }, + { FRAC_CONST(0.044699739959770), FRAC_CONST(0.009233990516688) }, + { FRAC_CONST(0.044638346670603), FRAC_CONST(0.009526349765171) }, + { FRAC_CONST(0.044575041223233), FRAC_CONST(0.009818300936537) }, + { FRAC_CONST(0.044509826329454), FRAC_CONST(0.010109831524568) }, + { FRAC_CONST(0.044442704782856), FRAC_CONST(0.010400929041064) }, + { FRAC_CONST(0.044373679458701), FRAC_CONST(0.010691581016378) }, + { FRAC_CONST(0.044302753313806), FRAC_CONST(0.010981774999945) }, + { FRAC_CONST(0.044229929386409), FRAC_CONST(0.011271498560822) }, + { FRAC_CONST(0.044155210796046), FRAC_CONST(0.011560739288214) }, + { FRAC_CONST(0.044078600743413), FRAC_CONST(0.011849484792012) }, + { FRAC_CONST(0.044000102510229), FRAC_CONST(0.012137722703321) }, + { FRAC_CONST(0.043919719459097), FRAC_CONST(0.012425440674986) }, + { FRAC_CONST(0.043837455033359), FRAC_CONST(0.012712626382127) }, + { FRAC_CONST(0.043753312756950), FRAC_CONST(0.012999267522665) }, + { FRAC_CONST(0.043667296234245), FRAC_CONST(0.013285351817848) }, + { FRAC_CONST(0.043579409149906), FRAC_CONST(0.013570867012776) }, + { FRAC_CONST(0.043489655268722), FRAC_CONST(0.013855800876928) }, + { FRAC_CONST(0.043398038435451), FRAC_CONST(0.014140141204686) }, + { FRAC_CONST(0.043304562574653), FRAC_CONST(0.014423875815857) }, + { FRAC_CONST(0.043209231690524), FRAC_CONST(0.014706992556195) }, + { FRAC_CONST(0.043112049866720), FRAC_CONST(0.014989479297920) }, + { FRAC_CONST(0.043013021266188), FRAC_CONST(0.015271323940241) }, + { FRAC_CONST(0.042912150130984), FRAC_CONST(0.015552514409871) }, + { FRAC_CONST(0.042809440782090), FRAC_CONST(0.015833038661547) }, + { FRAC_CONST(0.042704897619235), FRAC_CONST(0.016112884678543) }, + { FRAC_CONST(0.042598525120698), FRAC_CONST(0.016392040473187) }, + { FRAC_CONST(0.042490327843124), FRAC_CONST(0.016670494087374) }, + { FRAC_CONST(0.042380310421324), FRAC_CONST(0.016948233593079) }, + { FRAC_CONST(0.042268477568078), FRAC_CONST(0.017225247092864) }, + { FRAC_CONST(0.042154834073934), FRAC_CONST(0.017501522720393) }, + { FRAC_CONST(0.042039384807000), FRAC_CONST(0.017777048640940) }, + { FRAC_CONST(0.041922134712739), FRAC_CONST(0.018051813051888) }, + { FRAC_CONST(0.041803088813754), FRAC_CONST(0.018325804183247) }, + { FRAC_CONST(0.041682252209576), FRAC_CONST(0.018599010298148) }, + { FRAC_CONST(0.041559630076443), FRAC_CONST(0.018871419693350) }, + { FRAC_CONST(0.041435227667079), FRAC_CONST(0.019143020699741) }, + { FRAC_CONST(0.041309050310468), FRAC_CONST(0.019413801682838) }, + { FRAC_CONST(0.041181103411629), FRAC_CONST(0.019683751043285) }, + { FRAC_CONST(0.041051392451382), FRAC_CONST(0.019952857217350) }, + { FRAC_CONST(0.040919922986111), FRAC_CONST(0.020221108677421) }, + { FRAC_CONST(0.040786700647532), FRAC_CONST(0.020488493932496) }, + { FRAC_CONST(0.040651731142446), FRAC_CONST(0.020755001528683) }, + { FRAC_CONST(0.040515020252497), FRAC_CONST(0.021020620049682) }, + { FRAC_CONST(0.040376573833925), FRAC_CONST(0.021285338117280) }, + { FRAC_CONST(0.040236397817314), FRAC_CONST(0.021549144391836) }, + { FRAC_CONST(0.040094498207337), FRAC_CONST(0.021812027572768) }, + { FRAC_CONST(0.039950881082502), FRAC_CONST(0.022073976399034) }, + { FRAC_CONST(0.039805552594888), FRAC_CONST(0.022334979649620) }, + { FRAC_CONST(0.039658518969884), FRAC_CONST(0.022595026144014) }, + { FRAC_CONST(0.039509786505922), FRAC_CONST(0.022854104742690) }, + { FRAC_CONST(0.039359361574204), FRAC_CONST(0.023112204347583) }, + { FRAC_CONST(0.039207250618434), FRAC_CONST(0.023369313902565) }, + { FRAC_CONST(0.039053460154540), FRAC_CONST(0.023625422393919) }, + { FRAC_CONST(0.038897996770393), FRAC_CONST(0.023880518850809) }, + { FRAC_CONST(0.038740867125527), FRAC_CONST(0.024134592345752) }, + { FRAC_CONST(0.038582077950852), FRAC_CONST(0.024387631995085) }, + { FRAC_CONST(0.038421636048370), FRAC_CONST(0.024639626959432) }, + { FRAC_CONST(0.038259548290876), FRAC_CONST(0.024890566444167) }, + { FRAC_CONST(0.038095821621671), FRAC_CONST(0.025140439699877) }, + { FRAC_CONST(0.037930463054261), FRAC_CONST(0.025389236022825) }, + { FRAC_CONST(0.037763479672055), FRAC_CONST(0.025636944755403) }, + { FRAC_CONST(0.037594878628068), FRAC_CONST(0.025883555286595) }, + { FRAC_CONST(0.037424667144605), FRAC_CONST(0.026129057052425) }, + { FRAC_CONST(0.037252852512960), FRAC_CONST(0.026373439536415) }, + { FRAC_CONST(0.037079442093102), FRAC_CONST(0.026616692270033) }, + { FRAC_CONST(0.036904443313354), FRAC_CONST(0.026858804833142) }, + { FRAC_CONST(0.036727863670081), FRAC_CONST(0.027099766854444) }, + { FRAC_CONST(0.036549710727369), FRAC_CONST(0.027339568011930) }, + { FRAC_CONST(0.036369992116697), FRAC_CONST(0.027578198033315) }, + { FRAC_CONST(0.036188715536611), FRAC_CONST(0.027815646696484) }, + { FRAC_CONST(0.036005888752396), FRAC_CONST(0.028051903829926) }, + { FRAC_CONST(0.035821519595745), FRAC_CONST(0.028286959313171) }, + { FRAC_CONST(0.035635615964417), FRAC_CONST(0.028520803077226) }, + { FRAC_CONST(0.035448185821906), FRAC_CONST(0.028753425105002) }, + { FRAC_CONST(0.035259237197095), FRAC_CONST(0.028984815431745) }, + { FRAC_CONST(0.035068778183914), FRAC_CONST(0.029214964145465) }, + { FRAC_CONST(0.034876816940994), FRAC_CONST(0.029443861387355) }, + { FRAC_CONST(0.034683361691315), FRAC_CONST(0.029671497352220) }, + { FRAC_CONST(0.034488420721856), FRAC_CONST(0.029897862288892) }, + { FRAC_CONST(0.034292002383240), FRAC_CONST(0.030122946500652) }, + { FRAC_CONST(0.034094115089375), FRAC_CONST(0.030346740345641) }, + { FRAC_CONST(0.033894767317093), FRAC_CONST(0.030569234237276) }, + { FRAC_CONST(0.033693967605790), FRAC_CONST(0.030790418644658) }, + { FRAC_CONST(0.033491724557057), FRAC_CONST(0.031010284092984) }, + { FRAC_CONST(0.033288046834313), FRAC_CONST(0.031228821163949) }, + { FRAC_CONST(0.033082943162434), FRAC_CONST(0.031446020496153) }, + { FRAC_CONST(0.032876422327378), FRAC_CONST(0.031661872785500) }, + { FRAC_CONST(0.032668493175811), FRAC_CONST(0.031876368785596) }, + { FRAC_CONST(0.032459164614726), FRAC_CONST(0.032089499308145) }, + { FRAC_CONST(0.032248445611061), FRAC_CONST(0.032301255223347) }, + { FRAC_CONST(0.032036345191317), FRAC_CONST(0.032511627460281) }, + { FRAC_CONST(0.031822872441171), FRAC_CONST(0.032720607007302) }, + { FRAC_CONST(0.031608036505083), FRAC_CONST(0.032928184912422) }, + { FRAC_CONST(0.031391846585912), FRAC_CONST(0.033134352283693) }, + { FRAC_CONST(0.031174311944513), FRAC_CONST(0.033339100289593) }, + { FRAC_CONST(0.030955441899347), FRAC_CONST(0.033542420159397) }, + { FRAC_CONST(0.030735245826077), FRAC_CONST(0.033744303183559) }, + { FRAC_CONST(0.030513733157171), FRAC_CONST(0.033944740714083) }, + { FRAC_CONST(0.030290913381494), FRAC_CONST(0.034143724164891) }, + { FRAC_CONST(0.030066796043904), FRAC_CONST(0.034341245012195) }, + { FRAC_CONST(0.029841390744841), FRAC_CONST(0.034537294794860) }, + { FRAC_CONST(0.029614707139919), FRAC_CONST(0.034731865114764) }, + { FRAC_CONST(0.029386754939508), FRAC_CONST(0.034924947637164) }, + { FRAC_CONST(0.029157543908322), FRAC_CONST(0.035116534091046) }, + { FRAC_CONST(0.028927083864999), FRAC_CONST(0.035306616269485) }, + { FRAC_CONST(0.028695384681680), FRAC_CONST(0.035495186029992) }, + { FRAC_CONST(0.028462456283587), FRAC_CONST(0.035682235294866) }, + { FRAC_CONST(0.028228308648598), FRAC_CONST(0.035867756051541) }, + { FRAC_CONST(0.027992951806817), FRAC_CONST(0.036051740352923) }, + { FRAC_CONST(0.027756395840148), FRAC_CONST(0.036234180317738) }, + { FRAC_CONST(0.027518650881862), FRAC_CONST(0.036415068130865) }, + { FRAC_CONST(0.027279727116161), FRAC_CONST(0.036594396043672) }, + { FRAC_CONST(0.027039634777745), FRAC_CONST(0.036772156374348) }, + { FRAC_CONST(0.026798384151369), FRAC_CONST(0.036948341508233) }, + { FRAC_CONST(0.026555985571409), FRAC_CONST(0.037122943898140) }, + { FRAC_CONST(0.026312449421412), FRAC_CONST(0.037295956064686) }, + { FRAC_CONST(0.026067786133656), FRAC_CONST(0.037467370596605) }, + { FRAC_CONST(0.025822006188702), FRAC_CONST(0.037637180151068) }, + { FRAC_CONST(0.025575120114946), FRAC_CONST(0.037805377454000) }, + { FRAC_CONST(0.025327138488165), FRAC_CONST(0.037971955300388) }, + { FRAC_CONST(0.025078071931066), FRAC_CONST(0.038136906554591) }, + { FRAC_CONST(0.024827931112832), FRAC_CONST(0.038300224150647) }, + { FRAC_CONST(0.024576726748663), FRAC_CONST(0.038461901092573) }, + { FRAC_CONST(0.024324469599317), FRAC_CONST(0.038621930454668) }, + { FRAC_CONST(0.024071170470652), FRAC_CONST(0.038780305381806) }, + { FRAC_CONST(0.023816840213160), FRAC_CONST(0.038937019089732) }, + { FRAC_CONST(0.023561489721501), FRAC_CONST(0.039092064865353) }, + { FRAC_CONST(0.023305129934041), FRAC_CONST(0.039245436067023) }, + { FRAC_CONST(0.023047771832380), FRAC_CONST(0.039397126124832) }, + { FRAC_CONST(0.022789426440883), FRAC_CONST(0.039547128540881) }, + { FRAC_CONST(0.022530104826206), FRAC_CONST(0.039695436889566) }, + { FRAC_CONST(0.022269818096825), FRAC_CONST(0.039842044817851) }, + { FRAC_CONST(0.022008577402555), FRAC_CONST(0.039986946045542) }, + { FRAC_CONST(0.021746393934081), FRAC_CONST(0.040130134365550) }, + { FRAC_CONST(0.021483278922467), FRAC_CONST(0.040271603644166) }, + { FRAC_CONST(0.021219243638687), FRAC_CONST(0.040411347821316) }, + { FRAC_CONST(0.020954299393132), FRAC_CONST(0.040549360910825) }, + { FRAC_CONST(0.020688457535133), FRAC_CONST(0.040685637000671) }, + { FRAC_CONST(0.020421729452469), FRAC_CONST(0.040820170253240) }, + { FRAC_CONST(0.020154126570884), FRAC_CONST(0.040952954905576) }, + { FRAC_CONST(0.019885660353596), FRAC_CONST(0.041083985269625) }, + { FRAC_CONST(0.019616342300802), FRAC_CONST(0.041213255732484) }, + { FRAC_CONST(0.019346183949192), FRAC_CONST(0.041340760756635) }, + { FRAC_CONST(0.019075196871451), FRAC_CONST(0.041466494880189) }, + { FRAC_CONST(0.018803392675763), FRAC_CONST(0.041590452717113) }, + { FRAC_CONST(0.018530783005316), FRAC_CONST(0.041712628957466) }, + { FRAC_CONST(0.018257379537800), FRAC_CONST(0.041833018367625) }, + { FRAC_CONST(0.017983193984910), FRAC_CONST(0.041951615790509) }, + { FRAC_CONST(0.017708238091842), FRAC_CONST(0.042068416145797) }, + { FRAC_CONST(0.017432523636792), FRAC_CONST(0.042183414430153) }, + { FRAC_CONST(0.017156062430449), FRAC_CONST(0.042296605717432) }, + { FRAC_CONST(0.016878866315491), FRAC_CONST(0.042407985158896) }, + { FRAC_CONST(0.016600947166078), FRAC_CONST(0.042517547983420) }, + { FRAC_CONST(0.016322316887341), FRAC_CONST(0.042625289497698) }, + { FRAC_CONST(0.016042987414872), FRAC_CONST(0.042731205086442) }, + { FRAC_CONST(0.015762970714219), FRAC_CONST(0.042835290212581) }, + { FRAC_CONST(0.015482278780363), FRAC_CONST(0.042937540417454) }, + { FRAC_CONST(0.015200923637213), FRAC_CONST(0.043037951321002) }, + { FRAC_CONST(0.014918917337087), FRAC_CONST(0.043136518621958) }, + { FRAC_CONST(0.014636271960196), FRAC_CONST(0.043233238098025) }, + { FRAC_CONST(0.014352999614128), FRAC_CONST(0.043328105606063) }, + { FRAC_CONST(0.014069112433327), FRAC_CONST(0.043421117082265) }, + { FRAC_CONST(0.013784622578575), FRAC_CONST(0.043512268542327) }, + { FRAC_CONST(0.013499542236471), FRAC_CONST(0.043601556081625) }, + { FRAC_CONST(0.013213883618907), FRAC_CONST(0.043688975875378) }, + { FRAC_CONST(0.012927658962548), FRAC_CONST(0.043774524178812) }, + { FRAC_CONST(0.012640880528305), FRAC_CONST(0.043858197327323) }, + { FRAC_CONST(0.012353560600813), FRAC_CONST(0.043939991736633) }, + { FRAC_CONST(0.012065711487901), FRAC_CONST(0.044019903902940) }, + { FRAC_CONST(0.011777345520066), FRAC_CONST(0.044097930403073) }, + { FRAC_CONST(0.011488475049948), FRAC_CONST(0.044174067894638) }, + { FRAC_CONST(0.011199112451794), FRAC_CONST(0.044248313116156) }, + { FRAC_CONST(0.010909270120937), FRAC_CONST(0.044320662887211) }, + { FRAC_CONST(0.010618960473257), FRAC_CONST(0.044391114108577) }, + { FRAC_CONST(0.010328195944653), FRAC_CONST(0.044459663762361) }, + { FRAC_CONST(0.010036988990509), FRAC_CONST(0.044526308912122) }, + { FRAC_CONST(0.009745352085163), FRAC_CONST(0.044591046703005) }, + { FRAC_CONST(0.009453297721368), FRAC_CONST(0.044653874361857) }, + { FRAC_CONST(0.009160838409762), FRAC_CONST(0.044714789197351) }, + { FRAC_CONST(0.008867986678328), FRAC_CONST(0.044773788600099) }, + { FRAC_CONST(0.008574755071860), FRAC_CONST(0.044830870042761) }, + { FRAC_CONST(0.008281156151424), FRAC_CONST(0.044886031080160) }, + { FRAC_CONST(0.007987202493820), FRAC_CONST(0.044939269349379) }, + { FRAC_CONST(0.007692906691044), FRAC_CONST(0.044990582569869) }, + { FRAC_CONST(0.007398281349750), FRAC_CONST(0.045039968543542) }, + { FRAC_CONST(0.007103339090706), FRAC_CONST(0.045087425154868) }, + { FRAC_CONST(0.006808092548258), FRAC_CONST(0.045132950370962) }, + { FRAC_CONST(0.006512554369783), FRAC_CONST(0.045176542241676) }, + { FRAC_CONST(0.006216737215155), FRAC_CONST(0.045218198899680) }, + { FRAC_CONST(0.005920653756196), FRAC_CONST(0.045257918560541) }, + { FRAC_CONST(0.005624316676135), FRAC_CONST(0.045295699522801) }, + { FRAC_CONST(0.005327738669067), FRAC_CONST(0.045331540168049) }, + { FRAC_CONST(0.005030932439406), FRAC_CONST(0.045365438960992) }, + { FRAC_CONST(0.004733910701344), FRAC_CONST(0.045397394449517) }, + { FRAC_CONST(0.004436686178303), FRAC_CONST(0.045427405264758) }, + { FRAC_CONST(0.004139271602393), FRAC_CONST(0.045455470121152) }, + { FRAC_CONST(0.003841679713863), FRAC_CONST(0.045481587816494) }, + { FRAC_CONST(0.003543923260561), FRAC_CONST(0.045505757231988) }, + { FRAC_CONST(0.003246014997382), FRAC_CONST(0.045527977332297) }, + { FRAC_CONST(0.002947967685724), FRAC_CONST(0.045548247165585) }, + { FRAC_CONST(0.002649794092941), FRAC_CONST(0.045566565863562) }, + { FRAC_CONST(0.002351506991799), FRAC_CONST(0.045582932641515) }, + { FRAC_CONST(0.002053119159924), FRAC_CONST(0.045597346798344) }, + { FRAC_CONST(0.001754643379257), FRAC_CONST(0.045609807716597) }, + { FRAC_CONST(0.001456092435508), FRAC_CONST(0.045620314862489) }, + { FRAC_CONST(0.001157479117605), FRAC_CONST(0.045628867785927) }, + { FRAC_CONST(0.000858816217149), FRAC_CONST(0.045635466120535) }, + { FRAC_CONST(0.000560116527865), FRAC_CONST(0.045640109583661) }, + { FRAC_CONST(0.000261392845053), FRAC_CONST(0.045642797976394) } +}; +#endif // LD_DEC + +/* 60 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_240[] = +{ + { FRAC_CONST(0.091286604111815), FRAC_CONST(0.000298735779793) }, + { FRAC_CONST(0.091247502481454), FRAC_CONST(0.002688238127538) }, + { FRAC_CONST(0.091145864370807), FRAC_CONST(0.005075898091152) }, + { FRAC_CONST(0.090981759437558), FRAC_CONST(0.007460079287760) }, + { FRAC_CONST(0.090755300151030), FRAC_CONST(0.009839147718664) }, + { FRAC_CONST(0.090466641715108), FRAC_CONST(0.012211472889198) }, + { FRAC_CONST(0.090115981961863), FRAC_CONST(0.014575428926191) }, + { FRAC_CONST(0.089703561215976), FRAC_CONST(0.016929395692256) }, + { FRAC_CONST(0.089229662130024), FRAC_CONST(0.019271759896156) }, + { FRAC_CONST(0.088694609490769), FRAC_CONST(0.021600916198470) }, + { FRAC_CONST(0.088098769996564), FRAC_CONST(0.023915268311810) }, + { FRAC_CONST(0.087442552006035), FRAC_CONST(0.026213230094844) }, + { FRAC_CONST(0.086726405258214), FRAC_CONST(0.028493226639351) }, + { FRAC_CONST(0.085950820564309), FRAC_CONST(0.030753695349588) }, + { FRAC_CONST(0.085116329471329), FRAC_CONST(0.032993087013213) }, + { FRAC_CONST(0.084223503897785), FRAC_CONST(0.035209866863042) }, + { FRAC_CONST(0.083272955741727), FRAC_CONST(0.037402515628894) }, + { FRAC_CONST(0.082265336461381), FRAC_CONST(0.039569530578832) }, + { FRAC_CONST(0.081201336628670), FRAC_CONST(0.041709426549053) }, + { FRAC_CONST(0.080081685455930), FRAC_CONST(0.043820736961749) }, + { FRAC_CONST(0.078907150296148), FRAC_CONST(0.045902014830227) }, + { FRAC_CONST(0.077678536117054), FRAC_CONST(0.047951833750597) }, + { FRAC_CONST(0.076396684949434), FRAC_CONST(0.049968788879362) }, + { FRAC_CONST(0.075062475310050), FRAC_CONST(0.051951497896226) }, + { FRAC_CONST(0.073676821599542), FRAC_CONST(0.053898601951466) }, + { FRAC_CONST(0.072240673475749), FRAC_CONST(0.055808766597225) }, + { FRAC_CONST(0.070755015202858), FRAC_CONST(0.057680682702068) }, + { FRAC_CONST(0.069220864976840), FRAC_CONST(0.059513067348201) }, + { FRAC_CONST(0.067639274227625), FRAC_CONST(0.061304664710718) }, + { FRAC_CONST(0.066011326898512), FRAC_CONST(0.063054246918278) }, + { FRAC_CONST(0.064338138703282), FRAC_CONST(0.064760614894630) }, + { FRAC_CONST(0.062620856361546), FRAC_CONST(0.066422599180399) }, + { FRAC_CONST(0.060860656812842), FRAC_CONST(0.068039060734572) }, + { FRAC_CONST(0.059058746410016), FRAC_CONST(0.069608891715145) }, + { FRAC_CONST(0.057216360092450), FRAC_CONST(0.071131016238378) }, + { FRAC_CONST(0.055334760539699), FRAC_CONST(0.072604391116154) }, + { FRAC_CONST(0.053415237306106), FRAC_CONST(0.074028006570930) }, + { FRAC_CONST(0.051459105937014), FRAC_CONST(0.075400886927784) }, + { FRAC_CONST(0.049467707067153), FRAC_CONST(0.076722091283096) }, + { FRAC_CONST(0.047442405501835), FRAC_CONST(0.077990714149396) }, + { FRAC_CONST(0.045384589281588), FRAC_CONST(0.079205886075941) }, + { FRAC_CONST(0.043295668730857), FRAC_CONST(0.080366774244592) }, + { FRAC_CONST(0.041177075491445), FRAC_CONST(0.081472583040586) }, + { FRAC_CONST(0.039030261541332), FRAC_CONST(0.082522554597810) }, + { FRAC_CONST(0.036856698199564), FRAC_CONST(0.083515969318206) }, + { FRAC_CONST(0.034657875117883), FRAC_CONST(0.084452146364948) }, + { FRAC_CONST(0.032435299259796), FRAC_CONST(0.085330444129049) }, + { FRAC_CONST(0.030190493867775), FRAC_CONST(0.086150260669096) }, + { FRAC_CONST(0.027924997419306), FRAC_CONST(0.086911034123781) }, + { FRAC_CONST(0.025640362572491), FRAC_CONST(0.087612243096981) }, + { FRAC_CONST(0.023338155101933), FRAC_CONST(0.088253407015092) }, + { FRAC_CONST(0.021019952825636), FRAC_CONST(0.088834086456390) }, + { FRAC_CONST(0.018687344523641), FRAC_CONST(0.089353883452193) }, + { FRAC_CONST(0.016341928849164), FRAC_CONST(0.089812441759604) }, + { FRAC_CONST(0.013985313232951), FRAC_CONST(0.090209447105664) }, + { FRAC_CONST(0.011619112781631), FRAC_CONST(0.090544627402740) }, + { FRAC_CONST(0.009244949170797), FRAC_CONST(0.090817752935000) }, + { FRAC_CONST(0.006864449533597), FRAC_CONST(0.091028636515846) }, + { FRAC_CONST(0.004479245345574), FRAC_CONST(0.091177133616206) }, + { FRAC_CONST(0.002090971306534), FRAC_CONST(0.091263142463585) } +}; +#endif // ALLOW_SMALL_FRAMELENGTH + +#ifdef SSR_DEC +/* 128 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_512[] = +{ + { FRAC_CONST(0.062499926465731), FRAC_CONST(0.000095873761643) }, + { FRAC_CONST(0.062494043817678), FRAC_CONST(0.000862836783004) }, + { FRAC_CONST(0.062478749796497), FRAC_CONST(0.001629669864319) }, + { FRAC_CONST(0.062454046705412), FRAC_CONST(0.002396257523347) }, + { FRAC_CONST(0.062419938264617), FRAC_CONST(0.003162484314806) }, + { FRAC_CONST(0.062376429610718), FRAC_CONST(0.003928234847760) }, + { FRAC_CONST(0.062323527295958), FRAC_CONST(0.004693393802995) }, + { FRAC_CONST(0.062261239287231), FRAC_CONST(0.005457845950387) }, + { FRAC_CONST(0.062189574964882), FRAC_CONST(0.006221476166254) }, + { FRAC_CONST(0.062108545121295), FRAC_CONST(0.006984169450695) }, + { FRAC_CONST(0.062018161959266), FRAC_CONST(0.007745810944907) }, + { FRAC_CONST(0.061918439090167), FRAC_CONST(0.008506285948482) }, + { FRAC_CONST(0.061809391531894), FRAC_CONST(0.009265479936681) }, + { FRAC_CONST(0.061691035706609), FRAC_CONST(0.010023278577683) }, + { FRAC_CONST(0.061563389438265), FRAC_CONST(0.010779567749800) }, + { FRAC_CONST(0.061426471949919), FRAC_CONST(0.011534233558664) }, + { FRAC_CONST(0.061280303860842), FRAC_CONST(0.012287162354380) }, + { FRAC_CONST(0.061124907183410), FRAC_CONST(0.013038240748641) }, + { FRAC_CONST(0.060960305319791), FRAC_CONST(0.013787355631805) }, + { FRAC_CONST(0.060786523058421), FRAC_CONST(0.014534394189923) }, + { FRAC_CONST(0.060603586570268), FRAC_CONST(0.015279243921739) }, + { FRAC_CONST(0.060411523404896), FRAC_CONST(0.016021792655621) }, + { FRAC_CONST(0.060210362486310), FRAC_CONST(0.016761928566463) }, + { FRAC_CONST(0.060000134108604), FRAC_CONST(0.017499540192517) }, + { FRAC_CONST(0.059780869931400), FRAC_CONST(0.018234516452187) }, + { FRAC_CONST(0.059552602975075), FRAC_CONST(0.018966746660751) }, + { FRAC_CONST(0.059315367615794), FRAC_CONST(0.019696120547033) }, + { FRAC_CONST(0.059069199580329), FRAC_CONST(0.020422528270008) }, + { FRAC_CONST(0.058814135940681), FRAC_CONST(0.021145860435346) }, + { FRAC_CONST(0.058550215108495), FRAC_CONST(0.021866008111883) }, + { FRAC_CONST(0.058277476829279), FRAC_CONST(0.022582862848028) }, + { FRAC_CONST(0.057995962176414), FRAC_CONST(0.023296316688095) }, + { FRAC_CONST(0.057705713544970), FRAC_CONST(0.024006262188558) }, + { FRAC_CONST(0.057406774645326), FRAC_CONST(0.024712592434239) }, + { FRAC_CONST(0.057099190496578), FRAC_CONST(0.025415201054398) }, + { FRAC_CONST(0.056783007419769), FRAC_CONST(0.026113982238763) }, + { FRAC_CONST(0.056458273030907), FRAC_CONST(0.026808830753458) }, + { FRAC_CONST(0.056125036233796), FRAC_CONST(0.027499641956852) }, + { FRAC_CONST(0.055783347212673), FRAC_CONST(0.028186311815319) }, + { FRAC_CONST(0.055433257424646), FRAC_CONST(0.028868736918904) }, + { FRAC_CONST(0.055074819591951), FRAC_CONST(0.029546814496896) }, + { FRAC_CONST(0.054708087694007), FRAC_CONST(0.030220442433307) }, + { FRAC_CONST(0.054333116959288), FRAC_CONST(0.030889519282247) }, + { FRAC_CONST(0.053949963857008), FRAC_CONST(0.031553944283204) }, + { FRAC_CONST(0.053558686088614), FRAC_CONST(0.032213617376216) }, + { FRAC_CONST(0.053159342579100), FRAC_CONST(0.032868439216943) }, + { FRAC_CONST(0.052751993468129), FRAC_CONST(0.033518311191623) }, + { FRAC_CONST(0.052336700100979), FRAC_CONST(0.034163135431927) }, + { FRAC_CONST(0.051913525019303), FRAC_CONST(0.034802814829698) }, + { FRAC_CONST(0.051482531951712), FRAC_CONST(0.035437253051569) }, + { FRAC_CONST(0.051043785804177), FRAC_CONST(0.036066354553480) }, + { FRAC_CONST(0.050597352650253), FRAC_CONST(0.036690024595057) }, + { FRAC_CONST(0.050143299721132), FRAC_CONST(0.037308169253887) }, + { FRAC_CONST(0.049681695395515), FRAC_CONST(0.037920695439658) }, + { FRAC_CONST(0.049212609189314), FRAC_CONST(0.038527510908178) }, + { FRAC_CONST(0.048736111745188), FRAC_CONST(0.039128524275271) }, + { FRAC_CONST(0.048252274821899), FRAC_CONST(0.039723645030535) }, + { FRAC_CONST(0.047761171283507), FRAC_CONST(0.040312783550971) }, + { FRAC_CONST(0.047262875088400), FRAC_CONST(0.040895851114488) }, + { FRAC_CONST(0.046757461278150), FRAC_CONST(0.041472759913252) }, + { FRAC_CONST(0.046245005966220), FRAC_CONST(0.042043423066923) }, + { FRAC_CONST(0.045725586326493), FRAC_CONST(0.042607754635728) }, + { FRAC_CONST(0.045199280581658), FRAC_CONST(0.043165669633408) }, + { FRAC_CONST(0.044666167991423), FRAC_CONST(0.043717084040018) }, + { FRAC_CONST(0.044126328840584), FRAC_CONST(0.044261914814575) }, + { FRAC_CONST(0.043579844426930), FRAC_CONST(0.044800079907569) }, + { FRAC_CONST(0.043026797049006), FRAC_CONST(0.045331498273316) }, + { FRAC_CONST(0.042467269993710), FRAC_CONST(0.045856089882166) }, + { FRAC_CONST(0.041901347523761), FRAC_CONST(0.046373775732552) }, + { FRAC_CONST(0.041329114865000), FRAC_CONST(0.046884477862888) }, + { FRAC_CONST(0.040750658193560), FRAC_CONST(0.047388119363313) }, + { FRAC_CONST(0.040166064622889), FRAC_CONST(0.047884624387270) }, + { FRAC_CONST(0.039575422190629), FRAC_CONST(0.048373918162926) }, + { FRAC_CONST(0.038978819845356), FRAC_CONST(0.048855927004441) }, + { FRAC_CONST(0.038376347433190), FRAC_CONST(0.049330578323055) }, + { FRAC_CONST(0.037768095684260), FRAC_CONST(0.049797800638026) }, + { FRAC_CONST(0.037154156199042), FRAC_CONST(0.050257523587392) }, + { FRAC_CONST(0.036534621434563), FRAC_CONST(0.050709677938566) }, + { FRAC_CONST(0.035909584690482), FRAC_CONST(0.051154195598769) }, + { FRAC_CONST(0.035279140095032), FRAC_CONST(0.051591009625274) }, + { FRAC_CONST(0.034643382590851), FRAC_CONST(0.052020054235496) }, + { FRAC_CONST(0.034002407920680), FRAC_CONST(0.052441264816895) }, + { FRAC_CONST(0.033356312612947), FRAC_CONST(0.052854577936706) }, + { FRAC_CONST(0.032705193967229), FRAC_CONST(0.053259931351495) }, + { FRAC_CONST(0.032049150039598), FRAC_CONST(0.053657264016528) }, + { FRAC_CONST(0.031388279627857), FRAC_CONST(0.054046516094966) }, + { FRAC_CONST(0.030722682256659), FRAC_CONST(0.054427628966880) }, + { FRAC_CONST(0.030052458162521), FRAC_CONST(0.054800545238072) }, + { FRAC_CONST(0.029377708278725), FRAC_CONST(0.055165208748723) }, + { FRAC_CONST(0.028698534220122), FRAC_CONST(0.055521564581850) }, + { FRAC_CONST(0.028015038267826), FRAC_CONST(0.055869559071575) }, + { FRAC_CONST(0.027327323353815), FRAC_CONST(0.056209139811209) }, + { FRAC_CONST(0.026635493045425), FRAC_CONST(0.056540255661140) }, + { FRAC_CONST(0.025939651529755), FRAC_CONST(0.056862856756541) }, + { FRAC_CONST(0.025239903597978), FRAC_CONST(0.057176894514872) }, + { FRAC_CONST(0.024536354629559), FRAC_CONST(0.057482321643202) }, + { FRAC_CONST(0.023829110576385), FRAC_CONST(0.057779092145329) }, + { FRAC_CONST(0.023118277946808), FRAC_CONST(0.058067161328707) }, + { FRAC_CONST(0.022403963789609), FRAC_CONST(0.058346485811177) }, + { FRAC_CONST(0.021686275677870), FRAC_CONST(0.058617023527499) }, + { FRAC_CONST(0.020965321692783), FRAC_CONST(0.058878733735689) }, + { FRAC_CONST(0.020241210407366), FRAC_CONST(0.059131577023150) }, + { FRAC_CONST(0.019514050870114), FRAC_CONST(0.059375515312615) }, + { FRAC_CONST(0.018783952588580), FRAC_CONST(0.059610511867874) }, + { FRAC_CONST(0.018051025512878), FRAC_CONST(0.059836531299311) }, + { FRAC_CONST(0.017315380019131), FRAC_CONST(0.060053539569230) }, + { FRAC_CONST(0.016577126892844), FRAC_CONST(0.060261503996984) }, + { FRAC_CONST(0.015836377312223), FRAC_CONST(0.060460393263896) }, + { FRAC_CONST(0.015093242831429), FRAC_CONST(0.060650177417972) }, + { FRAC_CONST(0.014347835363782), FRAC_CONST(0.060830827878419) }, + { FRAC_CONST(0.013600267164905), FRAC_CONST(0.061002317439940) }, + { FRAC_CONST(0.012850650815819), FRAC_CONST(0.061164620276839) }, + { FRAC_CONST(0.012099099205988), FRAC_CONST(0.061317711946905) }, + { FRAC_CONST(0.011345725516320), FRAC_CONST(0.061461569395097) }, + { FRAC_CONST(0.010590643202123), FRAC_CONST(0.061596170957011) }, + { FRAC_CONST(0.009833965976015), FRAC_CONST(0.061721496362147) }, + { FRAC_CONST(0.009075807790803), FRAC_CONST(0.061837526736961) }, + { FRAC_CONST(0.008316282822321), FRAC_CONST(0.061944244607705) }, + { FRAC_CONST(0.007555505452236), FRAC_CONST(0.062041633903059) }, + { FRAC_CONST(0.006793590250821), FRAC_CONST(0.062129679956555) }, + { FRAC_CONST(0.006030651959703), FRAC_CONST(0.062208369508780) }, + { FRAC_CONST(0.005266805474583), FRAC_CONST(0.062277690709378) }, + { FRAC_CONST(0.004502165827931), FRAC_CONST(0.062337633118830) }, + { FRAC_CONST(0.003736848171665), FRAC_CONST(0.062388187710030) }, + { FRAC_CONST(0.002970967759810), FRAC_CONST(0.062429346869643) }, + { FRAC_CONST(0.002204639931138), FRAC_CONST(0.062461104399250) }, + { FRAC_CONST(0.001437980091802), FRAC_CONST(0.062483455516285) }, + { FRAC_CONST(0.000671103697954), FRAC_CONST(0.062496396854751) } +}; + +/* 16 (N/4) complex twiddle factors */ +ALIGN static const complex_t mdct_tab_64[] = +{ + { FRAC_CONST(0.176763384336599), FRAC_CONST(0.002169321984356) }, + { FRAC_CONST(0.175699589589310), FRAC_CONST(0.019484717553714) }, + { FRAC_CONST(0.172943711747111), FRAC_CONST(0.036612464641599) }, + { FRAC_CONST(0.168522291420137), FRAC_CONST(0.053387613680577) }, + { FRAC_CONST(0.162477909303132), FRAC_CONST(0.069648610815172) }, + { FRAC_CONST(0.154868776100077), FRAC_CONST(0.085238853753814) }, + { FRAC_CONST(0.145768171923295), FRAC_CONST(0.100008199934509) }, + { FRAC_CONST(0.135263740565902), FRAC_CONST(0.113814412479792) }, + { FRAC_CONST(0.123456645444178), FRAC_CONST(0.126524530015608) }, + { FRAC_CONST(0.110460595338559), FRAC_CONST(0.138016147162030) }, + { FRAC_CONST(0.096400749315926), FRAC_CONST(0.148178593363981) }, + { FRAC_CONST(0.081412511379371), FRAC_CONST(0.156913998709178) }, + { FRAC_CONST(0.065640226453626), FRAC_CONST(0.164138236468888) }, + { FRAC_CONST(0.049235790264535), FRAC_CONST(0.169781733284316) }, + { FRAC_CONST(0.032357186500177), FRAC_CONST(0.173790139196080) }, + { FRAC_CONST(0.015166965341583), FRAC_CONST(0.176124851064031) } +}; +#endif // SSR_DEC + +#endif // FIXED_POINT + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/mp4.c b/src/contrib/aacdecoder/libfaad/mp4.c old mode 100644 new mode 100755 index 4bbdc2134..72b2af6ce --- a/src/contrib/aacdecoder/libfaad/mp4.c +++ b/src/contrib/aacdecoder/libfaad/mp4.c @@ -1,275 +1,309 @@ -/* -** 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: mp4.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include - -#include "bits.h" -#include "mp4.h" -#include "syntax.h" - -/* defines if an object type can be decoded by this library or not */ -static uint8_t ObjectTypesTable[32] = { - 0, /* 0 NULL */ -#ifdef MAIN_DEC - 1, /* 1 AAC Main */ -#else - 0, /* 1 AAC Main */ -#endif - 1, /* 2 AAC LC */ -#ifdef SSR_DEC - 1, /* 3 AAC SSR */ -#else - 0, /* 3 AAC SSR */ -#endif -#ifdef LTP_DEC - 1, /* 4 AAC LTP */ -#else - 0, /* 4 AAC LTP */ -#endif -#ifdef SBR_DEC - 1, /* 5 SBR */ -#else - 0, /* 5 SBR */ -#endif -#ifdef SCALABLE_DEC - 1, /* 6 AAC Scalable */ -#else - 0, /* 6 AAC Scalable */ -#endif - 0, /* 7 TwinVQ */ - 0, /* 8 CELP */ - 0, /* 9 HVXC */ - 0, /* 10 Reserved */ - 0, /* 11 Reserved */ - 0, /* 12 TTSI */ - 0, /* 13 Main synthetic */ - 0, /* 14 Wavetable synthesis */ - 0, /* 15 General MIDI */ - 0, /* 16 Algorithmic Synthesis and Audio FX */ - - /* MPEG-4 Version 2 */ -#ifdef ERROR_RESILIENCE - 1, /* 17 ER AAC LC */ - 0, /* 18 (Reserved) */ -#ifdef LTP_DEC - 1, /* 19 ER AAC LTP */ -#else - 0, /* 19 ER AAC LTP */ -#endif -#ifdef SCALABLE_DEC - 1, /* 20 ER AAC scalable */ -#else - 0, /* 20 ER AAC scalable */ -#endif - 0, /* 21 ER TwinVQ */ - 0, /* 22 ER BSAC */ -#ifdef LD_DEC - 1, /* 23 ER AAC LD */ -#else - 0, /* 23 ER AAC LD */ -#endif - 0, /* 24 ER CELP */ - 0, /* 25 ER HVXC */ - 0, /* 26 ER HILN */ - 0, /* 27 ER Parametric */ -#else /* No ER defined */ - 0, /* 17 ER AAC LC */ - 0, /* 18 (Reserved) */ - 0, /* 19 ER AAC LTP */ - 0, /* 20 ER AAC scalable */ - 0, /* 21 ER TwinVQ */ - 0, /* 22 ER BSAC */ - 0, /* 23 ER AAC LD */ - 0, /* 24 ER CELP */ - 0, /* 25 ER HVXC */ - 0, /* 26 ER HILN */ - 0, /* 27 ER Parametric */ -#endif - 0, /* 28 (Reserved) */ - 0, /* 29 (Reserved) */ - 0, /* 30 (Reserved) */ - 0 /* 31 (Reserved) */ -}; - -/* Table 1.6.1 */ -int8_t FAADAPI AudioSpecificConfig(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC) -{ - return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL); -} - -int8_t FAADAPI AudioSpecificConfig2(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC, - program_config *pce) -{ - bitfile ld; - int8_t result = 0; -#ifdef SBR_DEC - int8_t bits_to_decode = 0; -#endif - - if (pBuffer == NULL) - return -7; - if (mp4ASC == NULL) - return -8; - - memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); - - faad_initbits(&ld, pBuffer, buffer_size); - faad_byte_align(&ld); - - mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 - DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); - - mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); - - mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); - - mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); - - if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) - { - faad_endbits(&ld); - return -1; - } - - if (mp4ASC->samplingFrequency == 0) - { - faad_endbits(&ld); - return -2; - } - - if (mp4ASC->channelsConfiguration > 7) - { - faad_endbits(&ld); - return -3; - } - -#ifdef SBR_DEC - mp4ASC->sbr_present_flag = -1; - if (mp4ASC->objectTypeIndex == 5) - { - mp4ASC->sbr_present_flag = 1; - mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - if (mp4ASC->samplingFrequencyIndex == 15) - { - mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24 - DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - } else { - mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); - } - mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 - DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); - } -#endif - - /* get GASpecificConfig */ - if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || - mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || - mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) - { - result = GASpecificConfig(&ld, mp4ASC, pce); - -#ifdef ERROR_RESILIENCE - } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ - result = GASpecificConfig(&ld, mp4ASC, pce); - mp4ASC->epConfig = (uint8_t)faad_getbits(&ld, 2 - DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); - - if (mp4ASC->epConfig != 0) - result = -5; -#endif - - } else { - result = -4; - } - -#ifdef SSR_DEC - /* shorter frames not allowed for SSR */ - if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) - return -6; -#endif - - -#ifdef SBR_DEC - bits_to_decode = (int8_t)(buffer_size*8 - faad_get_processed_bits(&ld)); - - if ((mp4ASC->objectTypeIndex != 5) && (bits_to_decode >= 16)) - { - int16_t syncExtensionType = (int16_t)faad_getbits(&ld, 11 - DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); - - if (syncExtensionType == 0x2b7) - { - mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(&ld, 5 - DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); - - if (mp4ASC->objectTypeIndex == 5) - { - mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(&ld - DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); - - if (mp4ASC->sbr_present_flag) - { - mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(&ld, 4 - DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - if (mp4ASC->samplingFrequencyIndex == 15) - { - mp4ASC->samplingFrequency = (uint32_t)faad_getbits(&ld, 24 - DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); - } else { - mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); - } - } - } - } - } - - /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ - /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ - if (mp4ASC->sbr_present_flag == -1) - { - if (mp4ASC->samplingFrequency <= 24000) - { - mp4ASC->samplingFrequency *= 2; - mp4ASC->forceUpSampling = 1; - } - } -#endif - - faad_endbits(&ld); - - return result; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4.c,v 1.40 2009/02/06 03:39:58 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include + +#include "bits.h" +#include "mp4.h" +#include "syntax.h" + +/* defines if an object type can be decoded by this library or not */ +static uint8_t ObjectTypesTable[32] = { + 0, /* 0 NULL */ +#ifdef MAIN_DEC + 1, /* 1 AAC Main */ +#else + 0, /* 1 AAC Main */ +#endif + 1, /* 2 AAC LC */ +#ifdef SSR_DEC + 1, /* 3 AAC SSR */ +#else + 0, /* 3 AAC SSR */ +#endif +#ifdef LTP_DEC + 1, /* 4 AAC LTP */ +#else + 0, /* 4 AAC LTP */ +#endif +#ifdef SBR_DEC + 1, /* 5 SBR */ +#else + 0, /* 5 SBR */ +#endif + 0, /* 6 AAC Scalable */ + 0, /* 7 TwinVQ */ + 0, /* 8 CELP */ + 0, /* 9 HVXC */ + 0, /* 10 Reserved */ + 0, /* 11 Reserved */ + 0, /* 12 TTSI */ + 0, /* 13 Main synthetic */ + 0, /* 14 Wavetable synthesis */ + 0, /* 15 General MIDI */ + 0, /* 16 Algorithmic Synthesis and Audio FX */ + + /* MPEG-4 Version 2 */ +#ifdef ERROR_RESILIENCE + 1, /* 17 ER AAC LC */ + 0, /* 18 (Reserved) */ +#ifdef LTP_DEC + 1, /* 19 ER AAC LTP */ +#else + 0, /* 19 ER AAC LTP */ +#endif + 0, /* 20 ER AAC scalable */ + 0, /* 21 ER TwinVQ */ + 0, /* 22 ER BSAC */ +#ifdef LD_DEC + 1, /* 23 ER AAC LD */ +#else + 0, /* 23 ER AAC LD */ +#endif + 0, /* 24 ER CELP */ + 0, /* 25 ER HVXC */ + 0, /* 26 ER HILN */ + 0, /* 27 ER Parametric */ +#else /* No ER defined */ + 0, /* 17 ER AAC LC */ + 0, /* 18 (Reserved) */ + 0, /* 19 ER AAC LTP */ + 0, /* 20 ER AAC scalable */ + 0, /* 21 ER TwinVQ */ + 0, /* 22 ER BSAC */ + 0, /* 23 ER AAC LD */ + 0, /* 24 ER CELP */ + 0, /* 25 ER HVXC */ + 0, /* 26 ER HILN */ + 0, /* 27 ER Parametric */ +#endif + 0, /* 28 (Reserved) */ + 0, /* 29 (Reserved) */ + 0, /* 30 (Reserved) */ + 0 /* 31 (Reserved) */ +}; + +/* Table 1.6.1 */ +char NEAACDECAPI NeAACDecAudioSpecificConfig(unsigned char *pBuffer, + unsigned long buffer_size, + mp4AudioSpecificConfig *mp4ASC) +{ + return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL, 0); +} + +int8_t AudioSpecificConfigFromBitfile(bitfile *ld, + mp4AudioSpecificConfig *mp4ASC, + program_config *pce, uint32_t buffer_size, uint8_t short_form) +{ + int8_t result = 0; + uint32_t startpos = faad_get_processed_bits(ld); +#ifdef SBR_DEC + int8_t bits_to_decode = 0; +#endif + + if (mp4ASC == NULL) + return -8; + + memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); + + mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); + + mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); + if(mp4ASC->samplingFrequencyIndex==0x0f) + faad_getbits(ld, 24); + + mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); + + mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); + + if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) + { + return -1; + } + + if (mp4ASC->samplingFrequency == 0) + { + return -2; + } + + if (mp4ASC->channelsConfiguration > 7) + { + return -3; + } + +#if (defined(PS_DEC) || defined(DRM_PS)) + /* check if we have a mono file */ + if (mp4ASC->channelsConfiguration == 1) + { + /* upMatrix to 2 channels for implicit signalling of PS */ + mp4ASC->channelsConfiguration = 2; + } +#endif + +#ifdef SBR_DEC + mp4ASC->sbr_present_flag = -1; + if (mp4ASC->objectTypeIndex == 5) + { + uint8_t tmp; + + mp4ASC->sbr_present_flag = 1; + tmp = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); + /* check for downsampled SBR */ + if (tmp == mp4ASC->samplingFrequencyIndex) + mp4ASC->downSampledSBR = 1; + mp4ASC->samplingFrequencyIndex = tmp; + if (mp4ASC->samplingFrequencyIndex == 15) + { + mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 + DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); + } else { + mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); + } + mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); + } +#endif + + /* get GASpecificConfig */ + if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || + mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || + mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) + { + result = GASpecificConfig(ld, mp4ASC, pce); + +#ifdef ERROR_RESILIENCE + } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ + result = GASpecificConfig(ld, mp4ASC, pce); + mp4ASC->epConfig = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); + + if (mp4ASC->epConfig != 0) + result = -5; +#endif + + } else { + result = -4; + } + +#ifdef SSR_DEC + /* shorter frames not allowed for SSR */ + if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) + return -6; +#endif + + +#ifdef SBR_DEC + if(short_form) + bits_to_decode = 0; + else + bits_to_decode = (int8_t)(buffer_size*8 - (startpos-faad_get_processed_bits(ld))); + + if ((mp4ASC->objectTypeIndex != 5) && (bits_to_decode >= 16)) + { + int16_t syncExtensionType = (int16_t)faad_getbits(ld, 11 + DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); + + if (syncExtensionType == 0x2b7) + { + uint8_t tmp_OTi = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); + + if (tmp_OTi == 5) + { + mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); + + if (mp4ASC->sbr_present_flag) + { + uint8_t tmp; + + /* Don't set OT to SBR until checked that it is actually there */ + mp4ASC->objectTypeIndex = tmp_OTi; + + tmp = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); + + /* check for downsampled SBR */ + if (tmp == mp4ASC->samplingFrequencyIndex) + mp4ASC->downSampledSBR = 1; + mp4ASC->samplingFrequencyIndex = tmp; + + if (mp4ASC->samplingFrequencyIndex == 15) + { + mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 + DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); + } else { + mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); + } + } + } + } + } + + /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ + /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ + if (mp4ASC->sbr_present_flag == -1) + { + if (mp4ASC->samplingFrequency <= 24000) + { + mp4ASC->samplingFrequency *= 2; + mp4ASC->forceUpSampling = 1; + } else /* > 24000*/ { + mp4ASC->downSampledSBR = 1; + } + } +#endif + + faad_endbits(ld); + + return result; +} + +int8_t AudioSpecificConfig2(uint8_t *pBuffer, + uint32_t buffer_size, + mp4AudioSpecificConfig *mp4ASC, + program_config *pce, + uint8_t short_form) +{ + uint8_t ret = 0; + bitfile ld; + faad_initbits(&ld, pBuffer, buffer_size); + faad_byte_align(&ld); + ret = AudioSpecificConfigFromBitfile(&ld, mp4ASC, pce, buffer_size, short_form); + faad_endbits(&ld); + return ret; +} diff --git a/src/contrib/aacdecoder/libfaad/mp4.h b/src/contrib/aacdecoder/libfaad/mp4.h old mode 100644 new mode 100755 index 9ead48a0a..5a94be480 --- a/src/contrib/aacdecoder/libfaad/mp4.h +++ b/src/contrib/aacdecoder/libfaad/mp4.h @@ -1,49 +1,52 @@ -/* -** 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: mp4.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __MP4_H__ -#define __MP4_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "decoder.h" - -int8_t FAADAPI AudioSpecificConfig(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC); - -int8_t FAADAPI AudioSpecificConfig2(uint8_t *pBuffer, - uint32_t buffer_size, - mp4AudioSpecificConfig *mp4ASC, - program_config *pce); - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4.h,v 1.28 2009/02/05 00:51:03 menno Exp $ +**/ + +#ifndef __MP4_H__ +#define __MP4_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "neaacdec.h" + +int8_t AudioSpecificConfig2(uint8_t *pBuffer, + uint32_t buffer_size, + mp4AudioSpecificConfig *mp4ASC, + program_config *pce, uint8_t short_form); + +int8_t AudioSpecificConfigFromBitfile(bitfile *ld, + mp4AudioSpecificConfig *mp4ASC, + program_config *pce, uint32_t bsize, uint8_t short_form); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ms.c b/src/contrib/aacdecoder/libfaad/ms.c old mode 100644 new mode 100755 index bfbf1a078..97c8fb198 --- a/src/contrib/aacdecoder/libfaad/ms.c +++ b/src/contrib/aacdecoder/libfaad/ms.c @@ -1,74 +1,77 @@ -/* -** 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: ms.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "ms.h" -#include "is.h" -#include "pns.h" - -void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len) -{ - uint8_t g, b, sfb; - uint8_t group = 0; - uint16_t nshort = frame_len/8; - - uint16_t i, k; - real_t tmp; - - if (ics->ms_mask_present >= 1) - { - for (g = 0; g < ics->num_window_groups; g++) - { - for (b = 0; b < ics->window_group_length[g]; b++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - /* If intensity stereo coding or noise substitution is on - for a particular scalefactor band, no M/S stereo decoding - is carried out. - */ - if ((ics->ms_used[g][sfb] || ics->ms_mask_present == 2) && - !is_intensity(icsr, g, sfb) && !is_noise(ics, g, sfb)) - { - for (i = ics->swb_offset[sfb]; i < ics->swb_offset[sfb+1]; i++) - { - k = (group*nshort) + i; - tmp = l_spec[k] - r_spec[k]; - l_spec[k] = l_spec[k] + r_spec[k]; - r_spec[k] = tmp; - } - } - } - group++; - } - } - } -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ms.c,v 1.21 2007/11/01 12:33:32 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include "syntax.h" +#include "ms.h" +#include "is.h" +#include "pns.h" + +void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, + uint16_t frame_len) +{ + uint8_t g, b, sfb; + uint8_t group = 0; + uint16_t nshort = frame_len/8; + + uint16_t i, k; + real_t tmp; + + if (ics->ms_mask_present >= 1) + { + for (g = 0; g < ics->num_window_groups; g++) + { + for (b = 0; b < ics->window_group_length[g]; b++) + { + for (sfb = 0; sfb < ics->max_sfb; sfb++) + { + /* If intensity stereo coding or noise substitution is on + for a particular scalefactor band, no M/S stereo decoding + is carried out. + */ + if ((ics->ms_used[g][sfb] || ics->ms_mask_present == 2) && + !is_intensity(icsr, g, sfb) && !is_noise(ics, g, sfb)) + { + for (i = ics->swb_offset[sfb]; i < min(ics->swb_offset[sfb+1], ics->swb_offset_max); i++) + { + k = (group*nshort) + i; + tmp = l_spec[k] - r_spec[k]; + l_spec[k] = l_spec[k] + r_spec[k]; + r_spec[k] = tmp; + } + } + } + group++; + } + } + } +} diff --git a/src/contrib/aacdecoder/libfaad/ms.h b/src/contrib/aacdecoder/libfaad/ms.h old mode 100644 new mode 100755 index 16d1c22e1..30cfadaf6 --- a/src/contrib/aacdecoder/libfaad/ms.h +++ b/src/contrib/aacdecoder/libfaad/ms.h @@ -1,41 +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: ms.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __MS_H__ -#define __MS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, - uint16_t frame_len); - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ms.h,v 1.19 2007/11/01 12:33:32 menno Exp $ +**/ + +#ifndef __MS_H__ +#define __MS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, + uint16_t frame_len); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/neaacdec.h b/src/contrib/aacdecoder/libfaad/neaacdec.h new file mode 100755 index 000000000..a45f1d09e --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/neaacdec.h @@ -0,0 +1,258 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: neaacdec.h,v 1.13 2009/01/26 23:51:15 menno Exp $ +**/ + +#ifndef __NEAACDEC_H__ +#define __NEAACDEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + +#if 1 +/* MACROS FOR BACKWARDS COMPATIBILITY */ +/* structs */ +#define faacDecHandle NeAACDecHandle +#define faacDecConfiguration NeAACDecConfiguration +#define faacDecConfigurationPtr NeAACDecConfigurationPtr +#define faacDecFrameInfo NeAACDecFrameInfo +/* functions */ +#define faacDecGetErrorMessage NeAACDecGetErrorMessage +#define faacDecSetConfiguration NeAACDecSetConfiguration +#define faacDecGetCurrentConfiguration NeAACDecGetCurrentConfiguration +#define faacDecInit NeAACDecInit +#define faacDecInit2 NeAACDecInit2 +#define faacDecInitDRM NeAACDecInitDRM +#define faacDecPostSeekReset NeAACDecPostSeekReset +#define faacDecOpen NeAACDecOpen +#define faacDecClose NeAACDecClose +#define faacDecDecode NeAACDecDecode +#define AudioSpecificConfig NeAACDecAudioSpecificConfig +#endif + + +#ifdef _WIN32 + #pragma pack(push, 8) + #ifndef NEAACDECAPI + #define NEAACDECAPI __cdecl + #endif +#else + #ifndef NEAACDECAPI + #define NEAACDECAPI + #endif +#endif + +#define FAAD2_VERSION "2.7" + +/* object types for AAC */ +#define MAIN 1 +#define LC 2 +#define SSR 3 +#define LTP 4 +#define HE_AAC 5 +#define ER_LC 17 +#define ER_LTP 19 +#define LD 23 +#define DRM_ER_LC 27 /* special object type for DRM */ + +/* header types */ +#define RAW 0 +#define ADIF 1 +#define ADTS 2 +#define LATM 3 + +/* SBR signalling */ +#define NO_SBR 0 +#define SBR_UPSAMPLED 1 +#define SBR_DOWNSAMPLED 2 +#define NO_SBR_UPSAMPLED 3 + +/* library output formats */ +#define FAAD_FMT_16BIT 1 +#define FAAD_FMT_24BIT 2 +#define FAAD_FMT_32BIT 3 +#define FAAD_FMT_FLOAT 4 +#define FAAD_FMT_FIXED FAAD_FMT_FLOAT +#define FAAD_FMT_DOUBLE 5 + +/* Capabilities */ +#define LC_DEC_CAP (1<<0) /* Can decode LC */ +#define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */ +#define LTP_DEC_CAP (1<<2) /* Can decode LTP */ +#define LD_DEC_CAP (1<<3) /* Can decode LD */ +#define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ +#define FIXED_POINT_CAP (1<<5) /* Fixed point */ + +/* Channel definitions */ +#define FRONT_CHANNEL_CENTER (1) +#define FRONT_CHANNEL_LEFT (2) +#define FRONT_CHANNEL_RIGHT (3) +#define SIDE_CHANNEL_LEFT (4) +#define SIDE_CHANNEL_RIGHT (5) +#define BACK_CHANNEL_LEFT (6) +#define BACK_CHANNEL_RIGHT (7) +#define BACK_CHANNEL_CENTER (8) +#define LFE_CHANNEL (9) +#define UNKNOWN_CHANNEL (0) + +/* DRM channel definitions */ +#define DRMCH_MONO 1 +#define DRMCH_STEREO 2 +#define DRMCH_SBR_MONO 3 +#define DRMCH_SBR_STEREO 4 +#define DRMCH_SBR_PS_STEREO 5 + + +/* A decode call can eat up to FAAD_MIN_STREAMSIZE bytes per decoded channel, + so at least so much bytes per channel should be available in this stream */ +#define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ + + +typedef void *NeAACDecHandle; + +typedef struct mp4AudioSpecificConfig +{ + /* Audio Specific Info */ + unsigned char objectTypeIndex; + unsigned char samplingFrequencyIndex; + unsigned long samplingFrequency; + unsigned char channelsConfiguration; + + /* GA Specific Info */ + unsigned char frameLengthFlag; + unsigned char dependsOnCoreCoder; + unsigned short coreCoderDelay; + unsigned char extensionFlag; + unsigned char aacSectionDataResilienceFlag; + unsigned char aacScalefactorDataResilienceFlag; + unsigned char aacSpectralDataResilienceFlag; + unsigned char epConfig; + + char sbr_present_flag; + char forceUpSampling; + char downSampledSBR; +} mp4AudioSpecificConfig; + +typedef struct NeAACDecConfiguration +{ + unsigned char defObjectType; + unsigned long defSampleRate; + unsigned char outputFormat; + unsigned char downMatrix; + unsigned char useOldADTSFormat; + unsigned char dontUpSampleImplicitSBR; +} NeAACDecConfiguration, *NeAACDecConfigurationPtr; + +typedef struct NeAACDecFrameInfo +{ + unsigned long bytesconsumed; + unsigned long samples; + unsigned char channels; + unsigned char error; + unsigned long samplerate; + + /* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */ + unsigned char sbr; + + /* MPEG-4 ObjectType */ + unsigned char object_type; + + /* AAC header type; MP4 will be signalled as RAW also */ + unsigned char header_type; + + /* multichannel configuration */ + unsigned char num_front_channels; + unsigned char num_side_channels; + unsigned char num_back_channels; + unsigned char num_lfe_channels; + unsigned char channel_position[64]; + + /* PS: 0: off, 1: on */ + unsigned char ps; +} NeAACDecFrameInfo; + +char* NEAACDECAPI NeAACDecGetErrorMessage(unsigned char errcode); + +unsigned long NEAACDECAPI NeAACDecGetCapabilities(void); + +NeAACDecHandle NEAACDECAPI NeAACDecOpen(void); + +NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); + +unsigned char NEAACDECAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, + NeAACDecConfigurationPtr config); + +/* Init the library based on info from the AAC file (ADTS/ADIF) */ +long NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, + unsigned char *buffer, + unsigned long buffer_size, + unsigned long *samplerate, + unsigned char *channels); + +/* Init the library using a DecoderSpecificInfo */ +char NEAACDECAPI NeAACDecInit2(NeAACDecHandle hDecoder, + unsigned char *pBuffer, + unsigned long SizeOfDecoderSpecificInfo, + unsigned long *samplerate, + unsigned char *channels); + +/* Init the library for DRM */ +char NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, unsigned long samplerate, + unsigned char channels); + +void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, long frame); + +void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder); + +void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size); + +void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, + NeAACDecFrameInfo *hInfo, + unsigned char *buffer, + unsigned long buffer_size, + void **sample_buffer, + unsigned long sample_buffer_size); + +char NEAACDECAPI NeAACDecAudioSpecificConfig(unsigned char *pBuffer, + unsigned long buffer_size, + mp4AudioSpecificConfig *mp4ASC); + +#ifdef _WIN32 + #pragma pack(pop) +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/src/contrib/aacdecoder/libfaad/output.c b/src/contrib/aacdecoder/libfaad/output.c old mode 100644 new mode 100755 index 6309a584c..424562705 --- a/src/contrib/aacdecoder/libfaad/output.c +++ b/src/contrib/aacdecoder/libfaad/output.c @@ -1,479 +1,559 @@ -/* -** 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: output.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "output.h" -#include "decoder.h" - -#ifndef FIXED_POINT - - -#define FLOAT_SCALE (1.0f/(1<<15)) - -#define DM_MUL REAL_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) -#define RSQRT2 REAL_CONST(0.7071067811865475244) // 1/sqrt(2) - - -static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, - uint8_t down_matrix, uint8_t *internal_channel) -{ - if (!down_matrix) - return input[internal_channel[channel]][sample]; - - if (channel == 0) - { - return DM_MUL * (input[internal_channel[1]][sample] + - input[internal_channel[0]][sample] * RSQRT2 + - input[internal_channel[3]][sample] * RSQRT2); - } else { - return DM_MUL * (input[internal_channel[2]][sample] + - input[internal_channel[0]][sample] * RSQRT2 + - input[internal_channel[4]][sample] * RSQRT2); - } -} - -#ifndef HAS_LRINTF -#define CLIP(sample, max, min) \ -if (sample >= 0.0f) \ -{ \ - sample += 0.5f; \ - if (sample >= max) \ - sample = max; \ -} else { \ - sample += -0.5f; \ - if (sample <= min) \ - sample = min; \ -} -#else -#define CLIP(sample, max, min) \ -if (sample >= 0.0f) \ -{ \ - if (sample >= max) \ - sample = max; \ -} else { \ - if (sample <= min) \ - sample = min; \ -} -#endif - -#define CONV(a,b) ((a<<1)|(b&0x1)) - -static void to_PCM_16bit(faacDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - int16_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - - CLIP(inp, 32767.0f, -32768.0f); - - (*sample_buffer)[i] = (int16_t)lrintf(inp); - } - break; - case CONV(2,0): - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - - CLIP(inp0, 32767.0f, -32768.0f); - CLIP(inp1, 32767.0f, -32768.0f); - - (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp1); - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - - CLIP(inp, 32767.0f, -32768.0f); - - (*sample_buffer)[(i*channels)+ch] = (int16_t)lrintf(inp); - } - } - break; - } -} - -static void to_PCM_24bit(faacDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - int32_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - - inp *= 256.0f; - CLIP(inp, 8388607.0f, -8388608.0f); - - (*sample_buffer)[i] = (int32_t)lrintf(inp); - } - break; - case CONV(2,0): - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - - inp0 *= 256.0f; - inp1 *= 256.0f; - CLIP(inp0, 8388607.0f, -8388608.0f); - CLIP(inp1, 8388607.0f, -8388608.0f); - - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - - inp *= 256.0f; - CLIP(inp, 8388607.0f, -8388608.0f); - - (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); - } - } - break; - } -} - -static void to_PCM_32bit(faacDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - int32_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - - inp *= 65536.0f; - CLIP(inp, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[i] = (int32_t)lrintf(inp); - } - break; - case CONV(2,0): - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - - inp0 *= 65536.0f; - inp1 *= 65536.0f; - CLIP(inp0, 2147483647.0f, -2147483648.0f); - CLIP(inp1, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - - inp *= 65536.0f; - CLIP(inp, 2147483647.0f, -2147483648.0f); - - (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); - } - } - break; - } -} - -static void to_PCM_float(faacDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - float32_t **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - (*sample_buffer)[i] = inp*FLOAT_SCALE; - } - break; - case CONV(2,0): - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; - (*sample_buffer)[(i*2)+1] = inp1*FLOAT_SCALE; - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - (*sample_buffer)[(i*channels)+ch] = inp*FLOAT_SCALE; - } - } - break; - } -} - -static void to_PCM_double(faacDecHandle hDecoder, real_t **input, - uint8_t channels, uint16_t frame_len, - double **sample_buffer) -{ - uint8_t ch, ch1; - uint16_t i; - - switch (CONV(channels,hDecoder->downMatrix)) - { - case CONV(1,0): - case CONV(1,1): - for(i = 0; i < frame_len; i++) - { - real_t inp = input[hDecoder->internal_channel[0]][i]; - (*sample_buffer)[i] = (double)inp*FLOAT_SCALE; - } - break; - case CONV(2,0): - ch = hDecoder->internal_channel[0]; - ch1 = hDecoder->internal_channel[1]; - for(i = 0; i < frame_len; i++) - { - real_t inp0 = input[ch ][i]; - real_t inp1 = input[ch1][i]; - (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; - (*sample_buffer)[(i*2)+1] = (double)inp1*FLOAT_SCALE; - } - break; - default: - for (ch = 0; ch < channels; ch++) - { - for(i = 0; i < frame_len; i++) - { - real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - (*sample_buffer)[(i*channels)+ch] = (double)inp*FLOAT_SCALE; - } - } - break; - } -} - -void *output_to_PCM(faacDecHandle hDecoder, - real_t **input, void *sample_buffer, uint8_t channels, - uint16_t frame_len, uint8_t format) -{ - int16_t *short_sample_buffer = (int16_t*)sample_buffer; - int32_t *int_sample_buffer = (int32_t*)sample_buffer; - float32_t *float_sample_buffer = (float32_t*)sample_buffer; - double *double_sample_buffer = (double*)sample_buffer; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - /* Copy output to a standard PCM buffer */ - switch (format) - { - case FAAD_FMT_16BIT: - to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); - break; - case FAAD_FMT_24BIT: - to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); - break; - case FAAD_FMT_32BIT: - to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); - break; - case FAAD_FMT_FLOAT: - to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); - break; - case FAAD_FMT_DOUBLE: - to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); - break; - } - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->output_cycles += count; -#endif - - return sample_buffer; -} - -#else - -#define DM_MUL FRAC_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) -#define RSQRT2 FRAC_CONST(0.7071067811865475244) // 1/sqrt(2) - -static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, - uint8_t down_matrix, uint8_t *internal_channel) -{ - if (!down_matrix) - return input[internal_channel[channel]][sample]; - - if (channel == 0) - { - real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); - real_t L_S = MUL_F(input[internal_channel[3]][sample], RSQRT2); - real_t cum = input[internal_channel[1]][sample] + C + L_S; - return MUL_F(cum, DM_MUL); - } else { - real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); - real_t R_S = MUL_F(input[internal_channel[4]][sample], RSQRT2); - real_t cum = input[internal_channel[2]][sample] + C + R_S; - return MUL_F(cum, DM_MUL); - } -} - -void* output_to_PCM(faacDecHandle hDecoder, - real_t **input, void *sample_buffer, uint8_t channels, - uint16_t frame_len, uint8_t format) -{ - uint8_t ch; - uint16_t i; - int16_t *short_sample_buffer = (int16_t*)sample_buffer; - int32_t *int_sample_buffer = (int32_t*)sample_buffer; - - /* Copy output to a standard PCM buffer */ - for (ch = 0; ch < channels; ch++) - { - switch (format) - { - case FAAD_FMT_16BIT: - for(i = 0; i < frame_len; i++) - { - //int32_t tmp = input[ch][i]; - int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - if (tmp >= 0) - { - tmp += (1 << (REAL_BITS-1)); - if (tmp >= REAL_CONST(32767)) - { - tmp = REAL_CONST(32767); - } - } else { - tmp += -(1 << (REAL_BITS-1)); - if (tmp <= REAL_CONST(-32768)) - { - tmp = REAL_CONST(-32768); - } - } - tmp >>= REAL_BITS; - short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; - } - break; - case FAAD_FMT_24BIT: - for(i = 0; i < frame_len; i++) - { - //int32_t tmp = input[ch][i]; - int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - if (tmp >= 0) - { - tmp += (1 << (REAL_BITS-9)); - tmp >>= (REAL_BITS-8); - if (tmp >= 8388607) - { - tmp = 8388607; - } - } else { - tmp += -(1 << (REAL_BITS-9)); - tmp >>= (REAL_BITS-8); - if (tmp <= -8388608) - { - tmp = -8388608; - } - } - int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; - } - break; - case FAAD_FMT_32BIT: - for(i = 0; i < frame_len; i++) - { - //int32_t tmp = input[ch][i]; - int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); - if (tmp >= 0) - { - tmp += (1 << (16-REAL_BITS-1)); - tmp <<= (16-REAL_BITS); - } else { - tmp += -(1 << (16-REAL_BITS-1)); - tmp <<= (16-REAL_BITS); - } - int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; - } - break; - } - } - - return sample_buffer; -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: output.c,v 1.47 2009/01/26 23:51:15 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include "output.h" + +#ifndef FIXED_POINT + + +#define FLOAT_SCALE (1.0f/(1<<15)) + +#define DM_MUL REAL_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) +#define RSQRT2 REAL_CONST(0.7071067811865475244) // 1/sqrt(2) + + +static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, + uint8_t down_matrix, uint8_t *internal_channel) +{ + if (!down_matrix) + return input[internal_channel[channel]][sample]; + + if (channel == 0) + { + return DM_MUL * (input[internal_channel[1]][sample] + + input[internal_channel[0]][sample] * RSQRT2 + + input[internal_channel[3]][sample] * RSQRT2); + } else { + return DM_MUL * (input[internal_channel[2]][sample] + + input[internal_channel[0]][sample] * RSQRT2 + + input[internal_channel[4]][sample] * RSQRT2); + } +} + +#ifndef HAS_LRINTF +#define CLIP(sample, max, min) \ +if (sample >= 0.0f) \ +{ \ + sample += 0.5f; \ + if (sample >= max) \ + sample = max; \ +} else { \ + sample += -0.5f; \ + if (sample <= min) \ + sample = min; \ +} +#else +#define CLIP(sample, max, min) \ +if (sample >= 0.0f) \ +{ \ + if (sample >= max) \ + sample = max; \ +} else { \ + if (sample <= min) \ + sample = min; \ +} +#endif + +#define CONV(a,b) ((a<<1)|(b&0x1)) + +static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, + uint8_t channels, uint16_t frame_len, + int16_t **sample_buffer) +{ + uint8_t ch, ch1; + uint16_t i; + + switch (CONV(channels,hDecoder->downMatrix)) + { + case CONV(1,0): + case CONV(1,1): + for(i = 0; i < frame_len; i++) + { + real_t inp = input[hDecoder->internal_channel[0]][i]; + + CLIP(inp, 32767.0f, -32768.0f); + + (*sample_buffer)[i] = (int16_t)lrintf(inp); + } + break; + case CONV(2,0): + if (hDecoder->upMatrix) + { + ch = hDecoder->internal_channel[0]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch][i]; + + CLIP(inp0, 32767.0f, -32768.0f); + + (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp0); + } + } else { + ch = hDecoder->internal_channel[0]; + ch1 = hDecoder->internal_channel[1]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch ][i]; + real_t inp1 = input[ch1][i]; + + CLIP(inp0, 32767.0f, -32768.0f); + CLIP(inp1, 32767.0f, -32768.0f); + + (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp1); + } + } + break; + default: + for (ch = 0; ch < channels; ch++) + { + for(i = 0; i < frame_len; i++) + { + real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); + + CLIP(inp, 32767.0f, -32768.0f); + + (*sample_buffer)[(i*channels)+ch] = (int16_t)lrintf(inp); + } + } + break; + } +} + +static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, + uint8_t channels, uint16_t frame_len, + int32_t **sample_buffer) +{ + uint8_t ch, ch1; + uint16_t i; + + switch (CONV(channels,hDecoder->downMatrix)) + { + case CONV(1,0): + case CONV(1,1): + for(i = 0; i < frame_len; i++) + { + real_t inp = input[hDecoder->internal_channel[0]][i]; + + inp *= 256.0f; + CLIP(inp, 8388607.0f, -8388608.0f); + + (*sample_buffer)[i] = (int32_t)lrintf(inp); + } + break; + case CONV(2,0): + if (hDecoder->upMatrix) + { + ch = hDecoder->internal_channel[0]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch][i]; + + inp0 *= 256.0f; + CLIP(inp0, 8388607.0f, -8388608.0f); + + (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); + } + } else { + ch = hDecoder->internal_channel[0]; + ch1 = hDecoder->internal_channel[1]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch ][i]; + real_t inp1 = input[ch1][i]; + + inp0 *= 256.0f; + inp1 *= 256.0f; + CLIP(inp0, 8388607.0f, -8388608.0f); + CLIP(inp1, 8388607.0f, -8388608.0f); + + (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); + } + } + break; + default: + for (ch = 0; ch < channels; ch++) + { + for(i = 0; i < frame_len; i++) + { + real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); + + inp *= 256.0f; + CLIP(inp, 8388607.0f, -8388608.0f); + + (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); + } + } + break; + } +} + +static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, + uint8_t channels, uint16_t frame_len, + int32_t **sample_buffer) +{ + uint8_t ch, ch1; + uint16_t i; + + switch (CONV(channels,hDecoder->downMatrix)) + { + case CONV(1,0): + case CONV(1,1): + for(i = 0; i < frame_len; i++) + { + real_t inp = input[hDecoder->internal_channel[0]][i]; + + inp *= 65536.0f; + CLIP(inp, 2147483647.0f, -2147483648.0f); + + (*sample_buffer)[i] = (int32_t)lrintf(inp); + } + break; + case CONV(2,0): + if (hDecoder->upMatrix) + { + ch = hDecoder->internal_channel[0]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch][i]; + + inp0 *= 65536.0f; + CLIP(inp0, 2147483647.0f, -2147483648.0f); + + (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); + } + } else { + ch = hDecoder->internal_channel[0]; + ch1 = hDecoder->internal_channel[1]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch ][i]; + real_t inp1 = input[ch1][i]; + + inp0 *= 65536.0f; + inp1 *= 65536.0f; + CLIP(inp0, 2147483647.0f, -2147483648.0f); + CLIP(inp1, 2147483647.0f, -2147483648.0f); + + (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); + } + } + break; + default: + for (ch = 0; ch < channels; ch++) + { + for(i = 0; i < frame_len; i++) + { + real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); + + inp *= 65536.0f; + CLIP(inp, 2147483647.0f, -2147483648.0f); + + (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); + } + } + break; + } +} + +static void to_PCM_float(NeAACDecStruct *hDecoder, real_t **input, + uint8_t channels, uint16_t frame_len, + float32_t **sample_buffer) +{ + uint8_t ch, ch1; + uint16_t i; + + switch (CONV(channels,hDecoder->downMatrix)) + { + case CONV(1,0): + case CONV(1,1): + for(i = 0; i < frame_len; i++) + { + real_t inp = input[hDecoder->internal_channel[0]][i]; + (*sample_buffer)[i] = inp*FLOAT_SCALE; + } + break; + case CONV(2,0): + if (hDecoder->upMatrix) + { + ch = hDecoder->internal_channel[0]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch][i]; + (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; + (*sample_buffer)[(i*2)+1] = inp0*FLOAT_SCALE; + } + } else { + ch = hDecoder->internal_channel[0]; + ch1 = hDecoder->internal_channel[1]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch ][i]; + real_t inp1 = input[ch1][i]; + (*sample_buffer)[(i*2)+0] = inp0*FLOAT_SCALE; + (*sample_buffer)[(i*2)+1] = inp1*FLOAT_SCALE; + } + } + break; + default: + for (ch = 0; ch < channels; ch++) + { + for(i = 0; i < frame_len; i++) + { + real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); + (*sample_buffer)[(i*channels)+ch] = inp*FLOAT_SCALE; + } + } + break; + } +} + +static void to_PCM_double(NeAACDecStruct *hDecoder, real_t **input, + uint8_t channels, uint16_t frame_len, + double **sample_buffer) +{ + uint8_t ch, ch1; + uint16_t i; + + switch (CONV(channels,hDecoder->downMatrix)) + { + case CONV(1,0): + case CONV(1,1): + for(i = 0; i < frame_len; i++) + { + real_t inp = input[hDecoder->internal_channel[0]][i]; + (*sample_buffer)[i] = (double)inp*FLOAT_SCALE; + } + break; + case CONV(2,0): + if (hDecoder->upMatrix) + { + ch = hDecoder->internal_channel[0]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch][i]; + (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; + (*sample_buffer)[(i*2)+1] = (double)inp0*FLOAT_SCALE; + } + } else { + ch = hDecoder->internal_channel[0]; + ch1 = hDecoder->internal_channel[1]; + for(i = 0; i < frame_len; i++) + { + real_t inp0 = input[ch ][i]; + real_t inp1 = input[ch1][i]; + (*sample_buffer)[(i*2)+0] = (double)inp0*FLOAT_SCALE; + (*sample_buffer)[(i*2)+1] = (double)inp1*FLOAT_SCALE; + } + } + break; + default: + for (ch = 0; ch < channels; ch++) + { + for(i = 0; i < frame_len; i++) + { + real_t inp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->internal_channel); + (*sample_buffer)[(i*channels)+ch] = (double)inp*FLOAT_SCALE; + } + } + break; + } +} + +void *output_to_PCM(NeAACDecStruct *hDecoder, + real_t **input, void *sample_buffer, uint8_t channels, + uint16_t frame_len, uint8_t format) +{ + int16_t *short_sample_buffer = (int16_t*)sample_buffer; + int32_t *int_sample_buffer = (int32_t*)sample_buffer; + float32_t *float_sample_buffer = (float32_t*)sample_buffer; + double *double_sample_buffer = (double*)sample_buffer; + +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + + /* Copy output to a standard PCM buffer */ + switch (format) + { + case FAAD_FMT_16BIT: + to_PCM_16bit(hDecoder, input, channels, frame_len, &short_sample_buffer); + break; + case FAAD_FMT_24BIT: + to_PCM_24bit(hDecoder, input, channels, frame_len, &int_sample_buffer); + break; + case FAAD_FMT_32BIT: + to_PCM_32bit(hDecoder, input, channels, frame_len, &int_sample_buffer); + break; + case FAAD_FMT_FLOAT: + to_PCM_float(hDecoder, input, channels, frame_len, &float_sample_buffer); + break; + case FAAD_FMT_DOUBLE: + to_PCM_double(hDecoder, input, channels, frame_len, &double_sample_buffer); + break; + } + +#ifdef PROFILE + count = faad_get_ts() - count; + hDecoder->output_cycles += count; +#endif + + return sample_buffer; +} + +#else + +#define DM_MUL FRAC_CONST(0.3203772410170407) // 1/(1+sqrt(2) + 1/sqrt(2)) +#define RSQRT2 FRAC_CONST(0.7071067811865475244) // 1/sqrt(2) + +static INLINE real_t get_sample(real_t **input, uint8_t channel, uint16_t sample, + uint8_t down_matrix, uint8_t up_matrix, + uint8_t *internal_channel) +{ + if (up_matrix == 1) + return input[internal_channel[0]][sample]; + + if (!down_matrix) + return input[internal_channel[channel]][sample]; + + if (channel == 0) + { + real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); + real_t L_S = MUL_F(input[internal_channel[3]][sample], RSQRT2); + real_t cum = input[internal_channel[1]][sample] + C + L_S; + return MUL_F(cum, DM_MUL); + } else { + real_t C = MUL_F(input[internal_channel[0]][sample], RSQRT2); + real_t R_S = MUL_F(input[internal_channel[4]][sample], RSQRT2); + real_t cum = input[internal_channel[2]][sample] + C + R_S; + return MUL_F(cum, DM_MUL); + } +} + +void* output_to_PCM(NeAACDecStruct *hDecoder, + real_t **input, void *sample_buffer, uint8_t channels, + uint16_t frame_len, uint8_t format) +{ + uint8_t ch; + uint16_t i; + int16_t *short_sample_buffer = (int16_t*)sample_buffer; + int32_t *int_sample_buffer = (int32_t*)sample_buffer; + + /* Copy output to a standard PCM buffer */ + for (ch = 0; ch < channels; ch++) + { + switch (format) + { + case FAAD_FMT_16BIT: + for(i = 0; i < frame_len; i++) + { + int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, + hDecoder->internal_channel); + if (tmp >= 0) + { + tmp += (1 << (REAL_BITS-1)); + if (tmp >= REAL_CONST(32767)) + { + tmp = REAL_CONST(32767); + } + } else { + tmp += -(1 << (REAL_BITS-1)); + if (tmp <= REAL_CONST(-32768)) + { + tmp = REAL_CONST(-32768); + } + } + tmp >>= REAL_BITS; + short_sample_buffer[(i*channels)+ch] = (int16_t)tmp; + } + break; + case FAAD_FMT_24BIT: + for(i = 0; i < frame_len; i++) + { + int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, + hDecoder->internal_channel); + if (tmp >= 0) + { + tmp += (1 << (REAL_BITS-9)); + tmp >>= (REAL_BITS-8); + if (tmp >= 8388607) + { + tmp = 8388607; + } + } else { + tmp += -(1 << (REAL_BITS-9)); + tmp >>= (REAL_BITS-8); + if (tmp <= -8388608) + { + tmp = -8388608; + } + } + int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; + } + break; + case FAAD_FMT_32BIT: + for(i = 0; i < frame_len; i++) + { + int32_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, + hDecoder->internal_channel); + if (tmp >= 0) + { + tmp += (1 << (16-REAL_BITS-1)); + tmp <<= (16-REAL_BITS); + } else { + tmp += -(1 << (16-REAL_BITS-1)); + tmp <<= (16-REAL_BITS); + } + int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; + } + break; + case FAAD_FMT_FIXED: + for(i = 0; i < frame_len; i++) + { + real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, + hDecoder->internal_channel); + int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; + } + break; + } + } + + return sample_buffer; +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/output.h b/src/contrib/aacdecoder/libfaad/output.h old mode 100644 new mode 100755 index b029cd20f..9ab5c9e83 --- a/src/contrib/aacdecoder/libfaad/output.h +++ b/src/contrib/aacdecoder/libfaad/output.h @@ -1,45 +1,48 @@ -/* -** 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: output.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __OUTPUT_H__ -#define __OUTPUT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void* output_to_PCM(faacDecHandle hDecoder, - real_t **input, - void *samplebuffer, - uint8_t channels, - uint16_t frame_len, - uint8_t format); - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: output.h,v 1.26 2009/01/26 23:51:15 menno Exp $ +**/ + +#ifndef __OUTPUT_H__ +#define __OUTPUT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void* output_to_PCM(NeAACDecStruct *hDecoder, + real_t **input, + void *samplebuffer, + uint8_t channels, + uint16_t frame_len, + uint8_t format); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/pns.c b/src/contrib/aacdecoder/libfaad/pns.c old mode 100644 new mode 100755 index 5509f1445..248fd05ef --- a/src/contrib/aacdecoder/libfaad/pns.c +++ b/src/contrib/aacdecoder/libfaad/pns.c @@ -1,260 +1,271 @@ -/* -** 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: pns.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "pns.h" - - -/* static function declarations */ -static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, - uint8_t sub); - - -#ifdef FIXED_POINT - -#define DIV(A, B) (((int64_t)A << REAL_BITS)/B) - -#define step(shift) \ - if ((0x40000000l >> shift) + root <= value) \ - { \ - value -= (0x40000000l >> shift) + root; \ - root = (root >> 1) | (0x40000000l >> shift); \ - } else { \ - root = root >> 1; \ - } - -/* fixed point square root approximation */ -/* !!!! ONLY WORKS FOR EVEN %REAL_BITS% !!!! */ -real_t fp_sqrt(real_t value) -{ - real_t root = 0; - - step( 0); step( 2); step( 4); step( 6); - step( 8); step(10); step(12); step(14); - step(16); step(18); step(20); step(22); - step(24); step(26); step(28); step(30); - - if (root < value) - ++root; - - root <<= (REAL_BITS/2); - - return root; -} - -static real_t pow2_table[] = -{ - COEF_CONST(0.59460355750136), - COEF_CONST(0.70710678118655), - COEF_CONST(0.84089641525371), - COEF_CONST(1.0), - COEF_CONST(1.18920711500272), - COEF_CONST(1.41421356237310), - COEF_CONST(1.68179283050743) -}; -#endif - -/* The function gen_rand_vector(addr, size) generates a vector of length - with signed random values of average energy MEAN_NRG per random - value. A suitable random number generator can be realized using one - multiplication/accumulation per random value. -*/ -static INLINE void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, - uint8_t sub) -{ -#ifndef FIXED_POINT - uint16_t i; - real_t energy = 0.0; - - real_t scale = (real_t)1.0/(real_t)size; - - for (i = 0; i < size; i++) - { - real_t tmp = scale*(real_t)(int32_t)random_int(); - spec[i] = tmp; - energy += tmp*tmp; - } - - scale = (real_t)1.0/(real_t)sqrt(energy); - scale *= (real_t)pow(2.0, 0.25 * scale_factor); - for (i = 0; i < size; i++) - { - spec[i] *= scale; - } -#else - uint16_t i; - real_t energy = 0, scale; - int32_t exp, frac; - - for (i = 0; i < size; i++) - { - /* this can be replaced by a 16 bit random generator!!!! */ - real_t tmp = (int32_t)random_int(); - if (tmp < 0) - tmp = -(tmp & ((1<<(REAL_BITS-1))-1)); - else - tmp = (tmp & ((1<<(REAL_BITS-1))-1)); - - energy += MUL_R(tmp,tmp); - - spec[i] = tmp; - } - - energy = fp_sqrt(energy); - if (energy > 0) - { - scale = DIV(REAL_CONST(1),energy); - - exp = scale_factor / 4; - frac = scale_factor % 4; - - /* IMDCT pre-scaling */ - exp -= sub; - - if (exp < 0) - scale >>= -exp; - else - scale <<= exp; - - if (frac) - scale = MUL_C(scale, pow2_table[frac + 3]); - - for (i = 0; i < size; i++) - { - spec[i] = MUL_R(spec[i], scale); - } - } -#endif -} - -void pns_decode(ic_stream *ics_left, ic_stream *ics_right, - real_t *spec_left, real_t *spec_right, uint16_t frame_len, - uint8_t channel_pair, uint8_t object_type) -{ - uint8_t g, sfb, b; - uint16_t size, offs; - - uint8_t group = 0; - uint16_t nshort = frame_len >> 3; - - uint8_t sub = 0; - -#ifdef FIXED_POINT - /* IMDCT scaling */ - if (object_type == LD) - { - sub = 9 /*9*/; - } else { - if (ics_left->window_sequence == EIGHT_SHORT_SEQUENCE) - sub = 7 /*7*/; - else - sub = 10 /*10*/; - } -#endif - - for (g = 0; g < ics_left->num_window_groups; g++) - { - /* Do perceptual noise substitution decoding */ - for (b = 0; b < ics_left->window_group_length[g]; b++) - { - for (sfb = 0; sfb < ics_left->max_sfb; sfb++) - { - if (is_noise(ics_left, g, sfb)) - { - /* Simultaneous use of LTP and PNS is not prevented in the - syntax. If both LTP, and PNS are enabled on the same - scalefactor band, PNS takes precedence, and no prediction - is applied to this band. - */ - ics_left->ltp.long_used[sfb] = 0; - ics_left->ltp2.long_used[sfb] = 0; - - /* For scalefactor bands coded using PNS the corresponding - predictors are switched to "off". - */ - ics_left->pred.prediction_used[sfb] = 0; - - offs = ics_left->swb_offset[sfb]; - size = ics_left->swb_offset[sfb+1] - offs; - - /* Generate random vector */ - gen_rand_vector(&spec_left[(group*nshort)+offs], - ics_left->scale_factors[g][sfb], size, sub); - } - -/* From the spec: - If the same scalefactor band and group is coded by perceptual noise - substitution in both channels of a channel pair, the correlation of - the noise signal can be controlled by means of the ms_used field: While - the default noise generation process works independently for each channel - (separate generation of random vectors), the same random vector is used - for both channels if ms_used[] is set for a particular scalefactor band - and group. In this case, no M/S stereo coding is carried out (because M/S - stereo coding and noise substitution coding are mutually exclusive). - If the same scalefactor band and group is coded by perceptual noise - substitution in only one channel of a channel pair the setting of ms_used[] - is not evaluated. -*/ - if (channel_pair) - { - if (is_noise(ics_right, g, sfb)) - { - if (((ics_left->ms_mask_present == 1) && - (ics_left->ms_used[g][sfb])) || - (ics_left->ms_mask_present == 2)) - { - uint16_t c; - - offs = ics_right->swb_offset[sfb]; - size = ics_right->swb_offset[sfb+1] - offs; - - for (c = 0; c < size; c++) - { - spec_right[(group*nshort) + offs + c] = - spec_left[(group*nshort) + offs + c]; - } - } else /*if (ics_left->ms_mask_present == 0)*/ { - ics_right->ltp.long_used[sfb] = 0; - ics_right->ltp2.long_used[sfb] = 0; - ics_right->pred.prediction_used[sfb] = 0; - - offs = ics_right->swb_offset[sfb]; - size = ics_right->swb_offset[sfb+1] - offs; - - /* Generate random vector */ - gen_rand_vector(&spec_right[(group*nshort)+offs], - ics_right->scale_factors[g][sfb], size, sub); - } - } - } - } /* sfb */ - group++; - } /* b */ - } /* g */ -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: pns.c,v 1.38 2007/11/01 12:33:32 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include "pns.h" + + +/* static function declarations */ +static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, + uint8_t sub, + /* RNG states */ uint32_t *__r1, uint32_t *__r2); + + +#ifdef FIXED_POINT + +#define DIV(A, B) (((int64_t)A << REAL_BITS)/B) + +#define step(shift) \ + if ((0x40000000l >> shift) + root <= value) \ + { \ + value -= (0x40000000l >> shift) + root; \ + root = (root >> 1) | (0x40000000l >> shift); \ + } else { \ + root = root >> 1; \ + } + +/* fixed point square root approximation */ +/* !!!! ONLY WORKS FOR EVEN %REAL_BITS% !!!! */ +real_t fp_sqrt(real_t value) +{ + real_t root = 0; + + step( 0); step( 2); step( 4); step( 6); + step( 8); step(10); step(12); step(14); + step(16); step(18); step(20); step(22); + step(24); step(26); step(28); step(30); + + if (root < value) + ++root; + + root <<= (REAL_BITS/2); + + return root; +} + +static real_t const pow2_table[] = +{ + COEF_CONST(1.0), + COEF_CONST(1.18920711500272), + COEF_CONST(1.41421356237310), + COEF_CONST(1.68179283050743) +}; +#endif + +/* The function gen_rand_vector(addr, size) generates a vector of length + with signed random values of average energy MEAN_NRG per random + value. A suitable random number generator can be realized using one + multiplication/accumulation per random value. +*/ +static INLINE void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, + uint8_t sub, + /* RNG states */ uint32_t *__r1, uint32_t *__r2) +{ +#ifndef FIXED_POINT + uint16_t i; + real_t energy = 0.0; + + real_t scale = (real_t)1.0/(real_t)size; + + for (i = 0; i < size; i++) + { + real_t tmp = scale*(real_t)(int32_t)ne_rng(__r1, __r2); + spec[i] = tmp; + energy += tmp*tmp; + } + + scale = (real_t)1.0/(real_t)sqrt(energy); + scale *= (real_t)pow(2.0, 0.25 * scale_factor); + for (i = 0; i < size; i++) + { + spec[i] *= scale; + } +#else + uint16_t i; + real_t energy = 0, scale; + int32_t exp, frac; + + for (i = 0; i < size; i++) + { + /* this can be replaced by a 16 bit random generator!!!! */ + real_t tmp = (int32_t)ne_rng(__r1, __r2); + if (tmp < 0) + tmp = -(tmp & ((1<<(REAL_BITS-1))-1)); + else + tmp = (tmp & ((1<<(REAL_BITS-1))-1)); + + energy += MUL_R(tmp,tmp); + + spec[i] = tmp; + } + + energy = fp_sqrt(energy); + if (energy > 0) + { + scale = DIV(REAL_CONST(1),energy); + + exp = scale_factor >> 2; + frac = scale_factor & 3; + + /* IMDCT pre-scaling */ + exp -= sub; + + if (exp < 0) + scale >>= -exp; + else + scale <<= exp; + + if (frac) + scale = MUL_C(scale, pow2_table[frac]); + + for (i = 0; i < size; i++) + { + spec[i] = MUL_R(spec[i], scale); + } + } +#endif +} + +void pns_decode(ic_stream *ics_left, ic_stream *ics_right, + real_t *spec_left, real_t *spec_right, uint16_t frame_len, + uint8_t channel_pair, uint8_t object_type, + /* RNG states */ uint32_t *__r1, uint32_t *__r2) +{ + uint8_t g, sfb, b; + uint16_t size, offs; + + uint8_t group = 0; + uint16_t nshort = frame_len >> 3; + + uint8_t sub = 0; + +#ifdef FIXED_POINT + /* IMDCT scaling */ + if (object_type == LD) + { + sub = 9 /*9*/; + } else { + if (ics_left->window_sequence == EIGHT_SHORT_SEQUENCE) + sub = 7 /*7*/; + else + sub = 10 /*10*/; + } +#endif + + for (g = 0; g < ics_left->num_window_groups; g++) + { + /* Do perceptual noise substitution decoding */ + for (b = 0; b < ics_left->window_group_length[g]; b++) + { + for (sfb = 0; sfb < ics_left->max_sfb; sfb++) + { + if (is_noise(ics_left, g, sfb)) + { +#ifdef LTP_DEC + /* Simultaneous use of LTP and PNS is not prevented in the + syntax. If both LTP, and PNS are enabled on the same + scalefactor band, PNS takes precedence, and no prediction + is applied to this band. + */ + ics_left->ltp.long_used[sfb] = 0; + ics_left->ltp2.long_used[sfb] = 0; +#endif + +#ifdef MAIN_DEC + /* For scalefactor bands coded using PNS the corresponding + predictors are switched to "off". + */ + ics_left->pred.prediction_used[sfb] = 0; +#endif + + offs = ics_left->swb_offset[sfb]; + size = min(ics_left->swb_offset[sfb+1], ics_left->swb_offset_max) - offs; + + /* Generate random vector */ + gen_rand_vector(&spec_left[(group*nshort)+offs], + ics_left->scale_factors[g][sfb], size, sub, __r1, __r2); + } + +/* From the spec: + If the same scalefactor band and group is coded by perceptual noise + substitution in both channels of a channel pair, the correlation of + the noise signal can be controlled by means of the ms_used field: While + the default noise generation process works independently for each channel + (separate generation of random vectors), the same random vector is used + for both channels if ms_used[] is set for a particular scalefactor band + and group. In this case, no M/S stereo coding is carried out (because M/S + stereo coding and noise substitution coding are mutually exclusive). + If the same scalefactor band and group is coded by perceptual noise + substitution in only one channel of a channel pair the setting of ms_used[] + is not evaluated. +*/ + if (channel_pair) + { + if (is_noise(ics_right, g, sfb)) + { + if (((ics_left->ms_mask_present == 1) && + (ics_left->ms_used[g][sfb])) || + (ics_left->ms_mask_present == 2)) + { + uint16_t c; + + offs = ics_right->swb_offset[sfb]; + size = min(ics_right->swb_offset[sfb+1], ics_right->swb_offset_max) - offs; + + for (c = 0; c < size; c++) + { + spec_right[(group*nshort) + offs + c] = + spec_left[(group*nshort) + offs + c]; + } + } else /*if (ics_left->ms_mask_present == 0)*/ { +#ifdef LTP_DEC + ics_right->ltp.long_used[sfb] = 0; + ics_right->ltp2.long_used[sfb] = 0; +#endif +#ifdef MAIN_DEC + ics_right->pred.prediction_used[sfb] = 0; +#endif + + offs = ics_right->swb_offset[sfb]; + size = min(ics_right->swb_offset[sfb+1], ics_right->swb_offset_max) - offs; + + /* Generate random vector */ + gen_rand_vector(&spec_right[(group*nshort)+offs], + ics_right->scale_factors[g][sfb], size, sub, __r1, __r2); + } + } + } + } /* sfb */ + group++; + } /* b */ + } /* g */ +} diff --git a/src/contrib/aacdecoder/libfaad/pns.h b/src/contrib/aacdecoder/libfaad/pns.h old mode 100644 new mode 100755 index c35bd14bf..38ced252d --- a/src/contrib/aacdecoder/libfaad/pns.h +++ b/src/contrib/aacdecoder/libfaad/pns.h @@ -1,55 +1,57 @@ -/* -** 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: pns.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __PNS_H__ -#define __PNS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "common.h" - -#include "syntax.h" - -#define NOISE_OFFSET 90 - -void pns_decode(ic_stream *ics_left, ic_stream *ics_right, - real_t *spec_left, real_t *spec_right, uint16_t frame_len, - uint8_t channel_pair, uint8_t object_type); - -static INLINE uint8_t is_noise(ic_stream *ics, uint8_t group, uint8_t sfb) -{ - if (ics->sfb_cb[group][sfb] == NOISE_HCB) - return 1; - return 0; -} - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: pns.h,v 1.27 2007/11/01 12:33:33 menno Exp $ +**/ + +#ifndef __PNS_H__ +#define __PNS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "syntax.h" + +#define NOISE_OFFSET 90 + +void pns_decode(ic_stream *ics_left, ic_stream *ics_right, + real_t *spec_left, real_t *spec_right, uint16_t frame_len, + uint8_t channel_pair, uint8_t object_type, + /* RNG states */ uint32_t *__r1, uint32_t *__r2); + +static INLINE uint8_t is_noise(ic_stream *ics, uint8_t group, uint8_t sfb) +{ + if (ics->sfb_cb[group][sfb] == NOISE_HCB) + return 1; + return 0; +} + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ps_dec.c b/src/contrib/aacdecoder/libfaad/ps_dec.c new file mode 100755 index 000000000..6d9c7be90 --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/ps_dec.c @@ -0,0 +1,2013 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ps_dec.c,v 1.16 2009/01/26 22:32:31 menno Exp $ +**/ + +#include "common.h" + +#ifdef PS_DEC + +#include +#include "ps_dec.h" +#include "ps_tables.h" + +/* constants */ +#define NEGATE_IPD_MASK (0x1000) +#define DECAY_SLOPE FRAC_CONST(0.05) +#define COEF_SQRT2 COEF_CONST(1.4142135623731) + +/* tables */ +/* filters are mirrored in coef 6, second half left out */ +static const real_t p8_13_20[7] = +{ + FRAC_CONST(0.00746082949812), + FRAC_CONST(0.02270420949825), + FRAC_CONST(0.04546865930473), + FRAC_CONST(0.07266113929591), + FRAC_CONST(0.09885108575264), + FRAC_CONST(0.11793710567217), + FRAC_CONST(0.125) +}; + +static const real_t p2_13_20[7] = +{ + FRAC_CONST(0.0), + FRAC_CONST(0.01899487526049), + FRAC_CONST(0.0), + FRAC_CONST(-0.07293139167538), + FRAC_CONST(0.0), + FRAC_CONST(0.30596630545168), + FRAC_CONST(0.5) +}; + +static const real_t p12_13_34[7] = +{ + FRAC_CONST(0.04081179924692), + FRAC_CONST(0.03812810994926), + FRAC_CONST(0.05144908135699), + FRAC_CONST(0.06399831151592), + FRAC_CONST(0.07428313801106), + FRAC_CONST(0.08100347892914), + FRAC_CONST(0.08333333333333) +}; + +static const real_t p8_13_34[7] = +{ + FRAC_CONST(0.01565675600122), + FRAC_CONST(0.03752716391991), + FRAC_CONST(0.05417891378782), + FRAC_CONST(0.08417044116767), + FRAC_CONST(0.10307344158036), + FRAC_CONST(0.12222452249753), + FRAC_CONST(0.125) +}; + +static const real_t p4_13_34[7] = +{ + FRAC_CONST(-0.05908211155639), + FRAC_CONST(-0.04871498374946), + FRAC_CONST(0.0), + FRAC_CONST(0.07778723915851), + FRAC_CONST(0.16486303567403), + FRAC_CONST(0.23279856662996), + FRAC_CONST(0.25) +}; + +#ifdef PARAM_32KHZ +static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = { + { 1, 2, 3 } /* d_24kHz */, + { 3, 4, 5 } /* d_48kHz */ +}; +#else +static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = { + 3, 4, 5 /* d_48kHz */ +}; +#endif +static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */ + FRAC_CONST(0.65143905753106), + FRAC_CONST(0.56471812200776), + FRAC_CONST(0.48954165955695) +}; + +static const uint8_t group_border20[10+12 + 1] = +{ + 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */ + 9, 8, /* 2 subqmf subbands */ + 10, 11, /* 2 subqmf subbands */ + 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 +}; + +static const uint8_t group_border34[32+18 + 1] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */ + 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */ + 20, 21, 22, 23, /* 4 subqmf subbands */ + 24, 25, 26, 27, /* 4 subqmf subbands */ + 28, 29, 30, 31, /* 4 subqmf subbands */ + 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27 +}; + +static const uint16_t map_group2bk20[10+12] = +{ + (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 +}; + +static const uint16_t map_group2bk34[32+18] = +{ + 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), + 10, 10, 4, 5, 6, 7, 8, 9, + 10, 11, 12, 9, + 14, 11, 12, 13, + 14, 15, 16, 13, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 +}; + +/* type definitions */ +typedef struct +{ + uint8_t frame_len; + uint8_t resolution20[3]; + uint8_t resolution34[5]; + + qmf_t *work; + qmf_t **buffer; + qmf_t **temp; +} hyb_info; + +/* static function declarations */ +static void ps_data_decode(ps_info *ps); +static hyb_info *hybrid_init(uint8_t numTimeSlotsRate); +static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, + qmf_t *buffer, qmf_t **X_hybrid); +static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); +static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, + qmf_t *buffer, qmf_t **X_hybrid); +static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], + uint8_t use34, uint8_t numTimeSlotsRate); +static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], + uint8_t use34, uint8_t numTimeSlotsRate); +static int8_t delta_clip(int8_t i, int8_t min, int8_t max); +static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, + uint8_t dt_flag, uint8_t nr_par, uint8_t stride, + int8_t min_index, int8_t max_index); +static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, + uint8_t dt_flag, uint8_t nr_par, uint8_t stride, + int8_t and_modulo); +static void map20indexto34(int8_t *index, uint8_t bins); +#ifdef PS_LOW_POWER +static void map34indexto20(int8_t *index, uint8_t bins); +#endif +static void ps_data_decode(ps_info *ps); +static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], + qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); +static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], + qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); + +/* */ + + +static hyb_info *hybrid_init(uint8_t numTimeSlotsRate) +{ + uint8_t i; + + hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info)); + + hyb->resolution34[0] = 12; + hyb->resolution34[1] = 8; + hyb->resolution34[2] = 4; + hyb->resolution34[3] = 4; + hyb->resolution34[4] = 4; + + hyb->resolution20[0] = 8; + hyb->resolution20[1] = 2; + hyb->resolution20[2] = 2; + + hyb->frame_len = numTimeSlotsRate; + + hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t)); + memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t)); + + hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*)); + for (i = 0; i < 5; i++) + { + hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t)); + memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t)); + } + + hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*)); + for (i = 0; i < hyb->frame_len; i++) + { + hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t)); + } + + return hyb; +} + +static void hybrid_free(hyb_info *hyb) +{ + uint8_t i; + + if (!hyb) return; + + if (hyb->work) + faad_free(hyb->work); + + for (i = 0; i < 5; i++) + { + if (hyb->buffer[i]) + faad_free(hyb->buffer[i]); + } + if (hyb->buffer) + faad_free(hyb->buffer); + + for (i = 0; i < hyb->frame_len; i++) + { + if (hyb->temp[i]) + faad_free(hyb->temp[i]); + } + if (hyb->temp) + faad_free(hyb->temp); + + faad_free(hyb); +} + +/* real filter, size 2 */ +static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, + qmf_t *buffer, qmf_t **X_hybrid) +{ + uint8_t i; + + for (i = 0; i < frame_len; i++) + { + real_t r0 = MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))); + real_t r1 = MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))); + real_t r2 = MUL_F(filter[2],(QMF_RE(buffer[2+i]) + QMF_RE(buffer[10+i]))); + real_t r3 = MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); + real_t r4 = MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); + real_t r5 = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); + real_t r6 = MUL_F(filter[6],QMF_RE(buffer[6+i])); + real_t i0 = MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))); + real_t i1 = MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))); + real_t i2 = MUL_F(filter[2],(QMF_IM(buffer[2+i]) + QMF_IM(buffer[10+i]))); + real_t i3 = MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); + real_t i4 = MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); + real_t i5 = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); + real_t i6 = MUL_F(filter[6],QMF_IM(buffer[6+i])); + + /* q = 0 */ + QMF_RE(X_hybrid[i][0]) = r0 + r1 + r2 + r3 + r4 + r5 + r6; + QMF_IM(X_hybrid[i][0]) = i0 + i1 + i2 + i3 + i4 + i5 + i6; + + /* q = 1 */ + QMF_RE(X_hybrid[i][1]) = r0 - r1 + r2 - r3 + r4 - r5 + r6; + QMF_IM(X_hybrid[i][1]) = i0 - i1 + i2 - i3 + i4 - i5 + i6; + } +} + +/* complex filter, size 4 */ +static void channel_filter4(hyb_info *hyb, uint8_t frame_len, const real_t *filter, + qmf_t *buffer, qmf_t **X_hybrid) +{ + uint8_t i; + real_t input_re1[2], input_re2[2], input_im1[2], input_im2[2]; + + for (i = 0; i < frame_len; i++) + { + input_re1[0] = -MUL_F(filter[2], (QMF_RE(buffer[i+2]) + QMF_RE(buffer[i+10]))) + + MUL_F(filter[6], QMF_RE(buffer[i+6])); + input_re1[1] = MUL_F(FRAC_CONST(-0.70710678118655), + (MUL_F(filter[1], (QMF_RE(buffer[i+1]) + QMF_RE(buffer[i+11]))) + + MUL_F(filter[3], (QMF_RE(buffer[i+3]) + QMF_RE(buffer[i+9]))) - + MUL_F(filter[5], (QMF_RE(buffer[i+5]) + QMF_RE(buffer[i+7]))))); + + input_im1[0] = MUL_F(filter[0], (QMF_IM(buffer[i+0]) - QMF_IM(buffer[i+12]))) - + MUL_F(filter[4], (QMF_IM(buffer[i+4]) - QMF_IM(buffer[i+8]))); + input_im1[1] = MUL_F(FRAC_CONST(0.70710678118655), + (MUL_F(filter[1], (QMF_IM(buffer[i+1]) - QMF_IM(buffer[i+11]))) - + MUL_F(filter[3], (QMF_IM(buffer[i+3]) - QMF_IM(buffer[i+9]))) - + MUL_F(filter[5], (QMF_IM(buffer[i+5]) - QMF_IM(buffer[i+7]))))); + + input_re2[0] = MUL_F(filter[0], (QMF_RE(buffer[i+0]) - QMF_RE(buffer[i+12]))) - + MUL_F(filter[4], (QMF_RE(buffer[i+4]) - QMF_RE(buffer[i+8]))); + input_re2[1] = MUL_F(FRAC_CONST(0.70710678118655), + (MUL_F(filter[1], (QMF_RE(buffer[i+1]) - QMF_RE(buffer[i+11]))) - + MUL_F(filter[3], (QMF_RE(buffer[i+3]) - QMF_RE(buffer[i+9]))) - + MUL_F(filter[5], (QMF_RE(buffer[i+5]) - QMF_RE(buffer[i+7]))))); + + input_im2[0] = -MUL_F(filter[2], (QMF_IM(buffer[i+2]) + QMF_IM(buffer[i+10]))) + + MUL_F(filter[6], QMF_IM(buffer[i+6])); + input_im2[1] = MUL_F(FRAC_CONST(-0.70710678118655), + (MUL_F(filter[1], (QMF_IM(buffer[i+1]) + QMF_IM(buffer[i+11]))) + + MUL_F(filter[3], (QMF_IM(buffer[i+3]) + QMF_IM(buffer[i+9]))) - + MUL_F(filter[5], (QMF_IM(buffer[i+5]) + QMF_IM(buffer[i+7]))))); + + /* q == 0 */ + QMF_RE(X_hybrid[i][0]) = input_re1[0] + input_re1[1] + input_im1[0] + input_im1[1]; + QMF_IM(X_hybrid[i][0]) = -input_re2[0] - input_re2[1] + input_im2[0] + input_im2[1]; + + /* q == 1 */ + QMF_RE(X_hybrid[i][1]) = input_re1[0] - input_re1[1] - input_im1[0] + input_im1[1]; + QMF_IM(X_hybrid[i][1]) = input_re2[0] - input_re2[1] + input_im2[0] - input_im2[1]; + + /* q == 2 */ + QMF_RE(X_hybrid[i][2]) = input_re1[0] - input_re1[1] + input_im1[0] - input_im1[1]; + QMF_IM(X_hybrid[i][2]) = -input_re2[0] + input_re2[1] + input_im2[0] - input_im2[1]; + + /* q == 3 */ + QMF_RE(X_hybrid[i][3]) = input_re1[0] + input_re1[1] - input_im1[0] - input_im1[1]; + QMF_IM(X_hybrid[i][3]) = input_re2[0] + input_re2[1] + input_im2[0] + input_im2[1]; + } +} + +static void INLINE DCT3_4_unscaled(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8; + + f0 = MUL_F(x[2], FRAC_CONST(0.7071067811865476)); + f1 = x[0] - f0; + f2 = x[0] + f0; + f3 = x[1] + x[3]; + f4 = MUL_C(x[1], COEF_CONST(1.3065629648763766)); + f5 = MUL_F(f3, FRAC_CONST(-0.9238795325112866)); + f6 = MUL_F(x[3], FRAC_CONST(-0.5411961001461967)); + f7 = f4 + f5; + f8 = f6 - f5; + y[3] = f2 - f8; + y[0] = f2 + f8; + y[2] = f1 - f7; + y[1] = f1 + f7; +} + +/* complex filter, size 8 */ +static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, + qmf_t *buffer, qmf_t **X_hybrid) +{ + uint8_t i, n; + real_t input_re1[4], input_re2[4], input_im1[4], input_im2[4]; + real_t x[4]; + + for (i = 0; i < frame_len; i++) + { + input_re1[0] = MUL_F(filter[6],QMF_RE(buffer[6+i])); + input_re1[1] = MUL_F(filter[5],(QMF_RE(buffer[5+i]) + QMF_RE(buffer[7+i]))); + input_re1[2] = -MUL_F(filter[0],(QMF_RE(buffer[0+i]) + QMF_RE(buffer[12+i]))) + MUL_F(filter[4],(QMF_RE(buffer[4+i]) + QMF_RE(buffer[8+i]))); + input_re1[3] = -MUL_F(filter[1],(QMF_RE(buffer[1+i]) + QMF_RE(buffer[11+i]))) + MUL_F(filter[3],(QMF_RE(buffer[3+i]) + QMF_RE(buffer[9+i]))); + + input_im1[0] = MUL_F(filter[5],(QMF_IM(buffer[7+i]) - QMF_IM(buffer[5+i]))); + input_im1[1] = MUL_F(filter[0],(QMF_IM(buffer[12+i]) - QMF_IM(buffer[0+i]))) + MUL_F(filter[4],(QMF_IM(buffer[8+i]) - QMF_IM(buffer[4+i]))); + input_im1[2] = MUL_F(filter[1],(QMF_IM(buffer[11+i]) - QMF_IM(buffer[1+i]))) + MUL_F(filter[3],(QMF_IM(buffer[9+i]) - QMF_IM(buffer[3+i]))); + input_im1[3] = MUL_F(filter[2],(QMF_IM(buffer[10+i]) - QMF_IM(buffer[2+i]))); + + for (n = 0; n < 4; n++) + { + x[n] = input_re1[n] - input_im1[3-n]; + } + DCT3_4_unscaled(x, x); + QMF_RE(X_hybrid[i][7]) = x[0]; + QMF_RE(X_hybrid[i][5]) = x[2]; + QMF_RE(X_hybrid[i][3]) = x[3]; + QMF_RE(X_hybrid[i][1]) = x[1]; + + for (n = 0; n < 4; n++) + { + x[n] = input_re1[n] + input_im1[3-n]; + } + DCT3_4_unscaled(x, x); + QMF_RE(X_hybrid[i][6]) = x[1]; + QMF_RE(X_hybrid[i][4]) = x[3]; + QMF_RE(X_hybrid[i][2]) = x[2]; + QMF_RE(X_hybrid[i][0]) = x[0]; + + input_im2[0] = MUL_F(filter[6],QMF_IM(buffer[6+i])); + input_im2[1] = MUL_F(filter[5],(QMF_IM(buffer[5+i]) + QMF_IM(buffer[7+i]))); + input_im2[2] = -MUL_F(filter[0],(QMF_IM(buffer[0+i]) + QMF_IM(buffer[12+i]))) + MUL_F(filter[4],(QMF_IM(buffer[4+i]) + QMF_IM(buffer[8+i]))); + input_im2[3] = -MUL_F(filter[1],(QMF_IM(buffer[1+i]) + QMF_IM(buffer[11+i]))) + MUL_F(filter[3],(QMF_IM(buffer[3+i]) + QMF_IM(buffer[9+i]))); + + input_re2[0] = MUL_F(filter[5],(QMF_RE(buffer[7+i]) - QMF_RE(buffer[5+i]))); + input_re2[1] = MUL_F(filter[0],(QMF_RE(buffer[12+i]) - QMF_RE(buffer[0+i]))) + MUL_F(filter[4],(QMF_RE(buffer[8+i]) - QMF_RE(buffer[4+i]))); + input_re2[2] = MUL_F(filter[1],(QMF_RE(buffer[11+i]) - QMF_RE(buffer[1+i]))) + MUL_F(filter[3],(QMF_RE(buffer[9+i]) - QMF_RE(buffer[3+i]))); + input_re2[3] = MUL_F(filter[2],(QMF_RE(buffer[10+i]) - QMF_RE(buffer[2+i]))); + + for (n = 0; n < 4; n++) + { + x[n] = input_im2[n] + input_re2[3-n]; + } + DCT3_4_unscaled(x, x); + QMF_IM(X_hybrid[i][7]) = x[0]; + QMF_IM(X_hybrid[i][5]) = x[2]; + QMF_IM(X_hybrid[i][3]) = x[3]; + QMF_IM(X_hybrid[i][1]) = x[1]; + + for (n = 0; n < 4; n++) + { + x[n] = input_im2[n] - input_re2[3-n]; + } + DCT3_4_unscaled(x, x); + QMF_IM(X_hybrid[i][6]) = x[1]; + QMF_IM(X_hybrid[i][4]) = x[3]; + QMF_IM(X_hybrid[i][2]) = x[2]; + QMF_IM(X_hybrid[i][0]) = x[0]; + } +} + +static void INLINE DCT3_6_unscaled(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7; + + f0 = MUL_F(x[3], FRAC_CONST(0.70710678118655)); + f1 = x[0] + f0; + f2 = x[0] - f0; + f3 = MUL_F((x[1] - x[5]), FRAC_CONST(0.70710678118655)); + f4 = MUL_F(x[2], FRAC_CONST(0.86602540378444)) + MUL_F(x[4], FRAC_CONST(0.5)); + f5 = f4 - x[4]; + f6 = MUL_F(x[1], FRAC_CONST(0.96592582628907)) + MUL_F(x[5], FRAC_CONST(0.25881904510252)); + f7 = f6 - f3; + y[0] = f1 + f6 + f4; + y[1] = f2 + f3 - x[4]; + y[2] = f7 + f2 - f5; + y[3] = f1 - f7 - f5; + y[4] = f1 - f3 - x[4]; + y[5] = f2 - f6 + f4; +} + +/* complex filter, size 12 */ +static void channel_filter12(hyb_info *hyb, uint8_t frame_len, const real_t *filter, + qmf_t *buffer, qmf_t **X_hybrid) +{ + uint8_t i, n; + real_t input_re1[6], input_re2[6], input_im1[6], input_im2[6]; + real_t out_re1[6], out_re2[6], out_im1[6], out_im2[6]; + + for (i = 0; i < frame_len; i++) + { + for (n = 0; n < 6; n++) + { + if (n == 0) + { + input_re1[0] = MUL_F(QMF_RE(buffer[6+i]), filter[6]); + input_re2[0] = MUL_F(QMF_IM(buffer[6+i]), filter[6]); + } else { + input_re1[6-n] = MUL_F((QMF_RE(buffer[n+i]) + QMF_RE(buffer[12-n+i])), filter[n]); + input_re2[6-n] = MUL_F((QMF_IM(buffer[n+i]) + QMF_IM(buffer[12-n+i])), filter[n]); + } + input_im2[n] = MUL_F((QMF_RE(buffer[n+i]) - QMF_RE(buffer[12-n+i])), filter[n]); + input_im1[n] = MUL_F((QMF_IM(buffer[n+i]) - QMF_IM(buffer[12-n+i])), filter[n]); + } + + DCT3_6_unscaled(out_re1, input_re1); + DCT3_6_unscaled(out_re2, input_re2); + + DCT3_6_unscaled(out_im1, input_im1); + DCT3_6_unscaled(out_im2, input_im2); + + for (n = 0; n < 6; n += 2) + { + QMF_RE(X_hybrid[i][n]) = out_re1[n] - out_im1[n]; + QMF_IM(X_hybrid[i][n]) = out_re2[n] + out_im2[n]; + QMF_RE(X_hybrid[i][n+1]) = out_re1[n+1] + out_im1[n+1]; + QMF_IM(X_hybrid[i][n+1]) = out_re2[n+1] - out_im2[n+1]; + + QMF_RE(X_hybrid[i][10-n]) = out_re1[n+1] - out_im1[n+1]; + QMF_IM(X_hybrid[i][10-n]) = out_re2[n+1] + out_im2[n+1]; + QMF_RE(X_hybrid[i][11-n]) = out_re1[n] + out_im1[n]; + QMF_IM(X_hybrid[i][11-n]) = out_re2[n] - out_im2[n]; + } + } +} + +/* Hybrid analysis: further split up QMF subbands + * to improve frequency resolution + */ +static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], + uint8_t use34, uint8_t numTimeSlotsRate) +{ + uint8_t k, n, band; + uint8_t offset = 0; + uint8_t qmf_bands = (use34) ? 5 : 3; + uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; + + for (band = 0; band < qmf_bands; band++) + { + /* build working buffer */ + memcpy(hyb->work, hyb->buffer[band], 12 * sizeof(qmf_t)); + + /* add new samples */ + for (n = 0; n < hyb->frame_len; n++) + { + QMF_RE(hyb->work[12 + n]) = QMF_RE(X[n + 6 /*delay*/][band]); + QMF_IM(hyb->work[12 + n]) = QMF_IM(X[n + 6 /*delay*/][band]); + } + + /* store samples */ + memcpy(hyb->buffer[band], hyb->work + hyb->frame_len, 12 * sizeof(qmf_t)); + + + switch(resolution[band]) + { + case 2: + /* Type B real filter, Q[p] = 2 */ + channel_filter2(hyb, hyb->frame_len, p2_13_20, hyb->work, hyb->temp); + break; + case 4: + /* Type A complex filter, Q[p] = 4 */ + channel_filter4(hyb, hyb->frame_len, p4_13_34, hyb->work, hyb->temp); + break; + case 8: + /* Type A complex filter, Q[p] = 8 */ + channel_filter8(hyb, hyb->frame_len, (use34) ? p8_13_34 : p8_13_20, + hyb->work, hyb->temp); + break; + case 12: + /* Type A complex filter, Q[p] = 12 */ + channel_filter12(hyb, hyb->frame_len, p12_13_34, hyb->work, hyb->temp); + break; + } + + for (n = 0; n < hyb->frame_len; n++) + { + for (k = 0; k < resolution[band]; k++) + { + QMF_RE(X_hybrid[n][offset + k]) = QMF_RE(hyb->temp[n][k]); + QMF_IM(X_hybrid[n][offset + k]) = QMF_IM(hyb->temp[n][k]); + } + } + offset += resolution[band]; + } + + /* group hybrid channels */ + if (!use34) + { + for (n = 0; n < numTimeSlotsRate; n++) + { + QMF_RE(X_hybrid[n][3]) += QMF_RE(X_hybrid[n][4]); + QMF_IM(X_hybrid[n][3]) += QMF_IM(X_hybrid[n][4]); + QMF_RE(X_hybrid[n][4]) = 0; + QMF_IM(X_hybrid[n][4]) = 0; + + QMF_RE(X_hybrid[n][2]) += QMF_RE(X_hybrid[n][5]); + QMF_IM(X_hybrid[n][2]) += QMF_IM(X_hybrid[n][5]); + QMF_RE(X_hybrid[n][5]) = 0; + QMF_IM(X_hybrid[n][5]) = 0; + } + } +} + +static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], + uint8_t use34, uint8_t numTimeSlotsRate) +{ + uint8_t k, n, band; + uint8_t offset = 0; + uint8_t qmf_bands = (use34) ? 5 : 3; + uint8_t *resolution = (use34) ? hyb->resolution34 : hyb->resolution20; + + for(band = 0; band < qmf_bands; band++) + { + for (n = 0; n < hyb->frame_len; n++) + { + QMF_RE(X[n][band]) = 0; + QMF_IM(X[n][band]) = 0; + + for (k = 0; k < resolution[band]; k++) + { + QMF_RE(X[n][band]) += QMF_RE(X_hybrid[n][offset + k]); + QMF_IM(X[n][band]) += QMF_IM(X_hybrid[n][offset + k]); + } + } + offset += resolution[band]; + } +} + +/* limits the value i to the range [min,max] */ +static int8_t delta_clip(int8_t i, int8_t min, int8_t max) +{ + if (i < min) + return min; + else if (i > max) + return max; + else + return i; +} + +//int iid = 0; + +/* delta decode array */ +static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, + uint8_t dt_flag, uint8_t nr_par, uint8_t stride, + int8_t min_index, int8_t max_index) +{ + int8_t i; + + if (enable == 1) + { + if (dt_flag == 0) + { + /* delta coded in frequency direction */ + index[0] = 0 + index[0]; + index[0] = delta_clip(index[0], min_index, max_index); + + for (i = 1; i < nr_par; i++) + { + index[i] = index[i-1] + index[i]; + index[i] = delta_clip(index[i], min_index, max_index); + } + } else { + /* delta coded in time direction */ + for (i = 0; i < nr_par; i++) + { + //int8_t tmp2; + //int8_t tmp = index[i]; + + //printf("%d %d\n", index_prev[i*stride], index[i]); + //printf("%d\n", index[i]); + + index[i] = index_prev[i*stride] + index[i]; + //tmp2 = index[i]; + index[i] = delta_clip(index[i], min_index, max_index); + + //if (iid) + //{ + // if (index[i] == 7) + // { + // printf("%d %d %d\n", index_prev[i*stride], tmp, tmp2); + // } + //} + } + } + } else { + /* set indices to zero */ + for (i = 0; i < nr_par; i++) + { + index[i] = 0; + } + } + + /* coarse */ + if (stride == 2) + { + for (i = (nr_par<<1)-1; i > 0; i--) + { + index[i] = index[i>>1]; + } + } +} + +/* delta modulo decode array */ +/* in: log2 value of the modulo value to allow using AND instead of MOD */ +static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, + uint8_t dt_flag, uint8_t nr_par, uint8_t stride, + int8_t and_modulo) +{ + int8_t i; + + if (enable == 1) + { + if (dt_flag == 0) + { + /* delta coded in frequency direction */ + index[0] = 0 + index[0]; + index[0] &= and_modulo; + + for (i = 1; i < nr_par; i++) + { + index[i] = index[i-1] + index[i]; + index[i] &= and_modulo; + } + } else { + /* delta coded in time direction */ + for (i = 0; i < nr_par; i++) + { + index[i] = index_prev[i*stride] + index[i]; + index[i] &= and_modulo; + } + } + } else { + /* set indices to zero */ + for (i = 0; i < nr_par; i++) + { + index[i] = 0; + } + } + + /* coarse */ + if (stride == 2) + { + index[0] = 0; + for (i = (nr_par<<1)-1; i > 0; i--) + { + index[i] = index[i>>1]; + } + } +} + +#ifdef PS_LOW_POWER +static void map34indexto20(int8_t *index, uint8_t bins) +{ + index[0] = (2*index[0]+index[1])/3; + index[1] = (index[1]+2*index[2])/3; + index[2] = (2*index[3]+index[4])/3; + index[3] = (index[4]+2*index[5])/3; + index[4] = (index[6]+index[7])/2; + index[5] = (index[8]+index[9])/2; + index[6] = index[10]; + index[7] = index[11]; + index[8] = (index[12]+index[13])/2; + index[9] = (index[14]+index[15])/2; + index[10] = index[16]; + + if (bins == 34) + { + index[11] = index[17]; + index[12] = index[18]; + index[13] = index[19]; + index[14] = (index[20]+index[21])/2; + index[15] = (index[22]+index[23])/2; + index[16] = (index[24]+index[25])/2; + index[17] = (index[26]+index[27])/2; + index[18] = (index[28]+index[29]+index[30]+index[31])/4; + index[19] = (index[32]+index[33])/2; + } +} +#endif + +static void map20indexto34(int8_t *index, uint8_t bins) +{ + index[0] = index[0]; + index[1] = (index[0] + index[1])/2; + index[2] = index[1]; + index[3] = index[2]; + index[4] = (index[2] + index[3])/2; + index[5] = index[3]; + index[6] = index[4]; + index[7] = index[4]; + index[8] = index[5]; + index[9] = index[5]; + index[10] = index[6]; + index[11] = index[7]; + index[12] = index[8]; + index[13] = index[8]; + index[14] = index[9]; + index[15] = index[9]; + index[16] = index[10]; + + if (bins == 34) + { + index[17] = index[11]; + index[18] = index[12]; + index[19] = index[13]; + index[20] = index[14]; + index[21] = index[14]; + index[22] = index[15]; + index[23] = index[15]; + index[24] = index[16]; + index[25] = index[16]; + index[26] = index[17]; + index[27] = index[17]; + index[28] = index[18]; + index[29] = index[18]; + index[30] = index[18]; + index[31] = index[18]; + index[32] = index[19]; + index[33] = index[19]; + } +} + +/* parse the bitstream data decoded in ps_data() */ +static void ps_data_decode(ps_info *ps) +{ + uint8_t env, bin; + + /* ps data not available, use data from previous frame */ + if (ps->ps_data_available == 0) + { + ps->num_env = 0; + } + + for (env = 0; env < ps->num_env; env++) + { + int8_t *iid_index_prev; + int8_t *icc_index_prev; + int8_t *ipd_index_prev; + int8_t *opd_index_prev; + + int8_t num_iid_steps = (ps->iid_mode < 3) ? 7 : 15 /*fine quant*/; + + if (env == 0) + { + /* take last envelope from previous frame */ + iid_index_prev = ps->iid_index_prev; + icc_index_prev = ps->icc_index_prev; + ipd_index_prev = ps->ipd_index_prev; + opd_index_prev = ps->opd_index_prev; + } else { + /* take index values from previous envelope */ + iid_index_prev = ps->iid_index[env - 1]; + icc_index_prev = ps->icc_index[env - 1]; + ipd_index_prev = ps->ipd_index[env - 1]; + opd_index_prev = ps->opd_index[env - 1]; + } + +// iid = 1; + /* delta decode iid parameters */ + delta_decode(ps->enable_iid, ps->iid_index[env], iid_index_prev, + ps->iid_dt[env], ps->nr_iid_par, + (ps->iid_mode == 0 || ps->iid_mode == 3) ? 2 : 1, + -num_iid_steps, num_iid_steps); +// iid = 0; + + /* delta decode icc parameters */ + delta_decode(ps->enable_icc, ps->icc_index[env], icc_index_prev, + ps->icc_dt[env], ps->nr_icc_par, + (ps->icc_mode == 0 || ps->icc_mode == 3) ? 2 : 1, + 0, 7); + + /* delta modulo decode ipd parameters */ + delta_modulo_decode(ps->enable_ipdopd, ps->ipd_index[env], ipd_index_prev, + ps->ipd_dt[env], ps->nr_ipdopd_par, 1, 7); + + /* delta modulo decode opd parameters */ + delta_modulo_decode(ps->enable_ipdopd, ps->opd_index[env], opd_index_prev, + ps->opd_dt[env], ps->nr_ipdopd_par, 1, 7); + } + + /* handle error case */ + if (ps->num_env == 0) + { + /* force to 1 */ + ps->num_env = 1; + + if (ps->enable_iid) + { + for (bin = 0; bin < 34; bin++) + ps->iid_index[0][bin] = ps->iid_index_prev[bin]; + } else { + for (bin = 0; bin < 34; bin++) + ps->iid_index[0][bin] = 0; + } + + if (ps->enable_icc) + { + for (bin = 0; bin < 34; bin++) + ps->icc_index[0][bin] = ps->icc_index_prev[bin]; + } else { + for (bin = 0; bin < 34; bin++) + ps->icc_index[0][bin] = 0; + } + + if (ps->enable_ipdopd) + { + for (bin = 0; bin < 17; bin++) + { + ps->ipd_index[0][bin] = ps->ipd_index_prev[bin]; + ps->opd_index[0][bin] = ps->opd_index_prev[bin]; + } + } else { + for (bin = 0; bin < 17; bin++) + { + ps->ipd_index[0][bin] = 0; + ps->opd_index[0][bin] = 0; + } + } + } + + /* update previous indices */ + for (bin = 0; bin < 34; bin++) + ps->iid_index_prev[bin] = ps->iid_index[ps->num_env-1][bin]; + for (bin = 0; bin < 34; bin++) + ps->icc_index_prev[bin] = ps->icc_index[ps->num_env-1][bin]; + for (bin = 0; bin < 17; bin++) + { + ps->ipd_index_prev[bin] = ps->ipd_index[ps->num_env-1][bin]; + ps->opd_index_prev[bin] = ps->opd_index[ps->num_env-1][bin]; + } + + ps->ps_data_available = 0; + + if (ps->frame_class == 0) + { + ps->border_position[0] = 0; + for (env = 1; env < ps->num_env; env++) + { + ps->border_position[env] = (env * ps->numTimeSlotsRate) / ps->num_env; + } + ps->border_position[ps->num_env] = ps->numTimeSlotsRate; + } else { + ps->border_position[0] = 0; + + if (ps->border_position[ps->num_env] < ps->numTimeSlotsRate) + { + for (bin = 0; bin < 34; bin++) + { + ps->iid_index[ps->num_env][bin] = ps->iid_index[ps->num_env-1][bin]; + ps->icc_index[ps->num_env][bin] = ps->icc_index[ps->num_env-1][bin]; + } + for (bin = 0; bin < 17; bin++) + { + ps->ipd_index[ps->num_env][bin] = ps->ipd_index[ps->num_env-1][bin]; + ps->opd_index[ps->num_env][bin] = ps->opd_index[ps->num_env-1][bin]; + } + ps->num_env++; + ps->border_position[ps->num_env] = ps->numTimeSlotsRate; + } + + for (env = 1; env < ps->num_env; env++) + { + int8_t thr = ps->numTimeSlotsRate - (ps->num_env - env); + + if (ps->border_position[env] > thr) + { + ps->border_position[env] = thr; + } else { + thr = ps->border_position[env-1]+1; + if (ps->border_position[env] < thr) + { + ps->border_position[env] = thr; + } + } + } + } + + /* make sure that the indices of all parameters can be mapped + * to the same hybrid synthesis filterbank + */ +#ifdef PS_LOW_POWER + for (env = 0; env < ps->num_env; env++) + { + if (ps->iid_mode == 2 || ps->iid_mode == 5) + map34indexto20(ps->iid_index[env], 34); + if (ps->icc_mode == 2 || ps->icc_mode == 5) + map34indexto20(ps->icc_index[env], 34); + + /* disable ipd/opd */ + for (bin = 0; bin < 17; bin++) + { + ps->aaIpdIndex[env][bin] = 0; + ps->aaOpdIndex[env][bin] = 0; + } + } +#else + if (ps->use34hybrid_bands) + { + for (env = 0; env < ps->num_env; env++) + { + if (ps->iid_mode != 2 && ps->iid_mode != 5) + map20indexto34(ps->iid_index[env], 34); + if (ps->icc_mode != 2 && ps->icc_mode != 5) + map20indexto34(ps->icc_index[env], 34); + if (ps->ipd_mode != 2 && ps->ipd_mode != 5) + { + map20indexto34(ps->ipd_index[env], 17); + map20indexto34(ps->opd_index[env], 17); + } + } + } +#endif + +#if 0 + for (env = 0; env < ps->num_env; env++) + { + printf("iid[env:%d]:", env); + for (bin = 0; bin < 34; bin++) + { + printf(" %d", ps->iid_index[env][bin]); + } + printf("\n"); + } + for (env = 0; env < ps->num_env; env++) + { + printf("icc[env:%d]:", env); + for (bin = 0; bin < 34; bin++) + { + printf(" %d", ps->icc_index[env][bin]); + } + printf("\n"); + } + for (env = 0; env < ps->num_env; env++) + { + printf("ipd[env:%d]:", env); + for (bin = 0; bin < 17; bin++) + { + printf(" %d", ps->ipd_index[env][bin]); + } + printf("\n"); + } + for (env = 0; env < ps->num_env; env++) + { + printf("opd[env:%d]:", env); + for (bin = 0; bin < 17; bin++) + { + printf(" %d", ps->opd_index[env][bin]); + } + printf("\n"); + } + printf("\n"); +#endif +} + +/* decorrelate the mono signal using an allpass filter */ +static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], + qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) +{ + uint8_t gr, n, m, bk; + uint8_t temp_delay; + uint8_t sb, maxsb; + const complex_t *Phi_Fract_SubQmf; + uint8_t temp_delay_ser[NO_ALLPASS_LINKS]; + real_t P_SmoothPeakDecayDiffNrg, nrg; + real_t P[32][34]; + real_t G_TransientRatio[32][34] = {{0}}; + complex_t inputLeft; + + + /* chose hybrid filterbank: 20 or 34 band case */ + if (ps->use34hybrid_bands) + { + Phi_Fract_SubQmf = Phi_Fract_SubQmf34; + } else{ + Phi_Fract_SubQmf = Phi_Fract_SubQmf20; + } + + /* clear the energy values */ + for (n = 0; n < 32; n++) + { + for (bk = 0; bk < 34; bk++) + { + P[n][bk] = 0; + } + } + + /* calculate the energy in each parameter band b(k) */ + for (gr = 0; gr < ps->num_groups; gr++) + { + /* select the parameter index b(k) to which this group belongs */ + bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; + + /* select the upper subband border for this group */ + maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr]+1 : ps->group_border[gr+1]; + + for (sb = ps->group_border[gr]; sb < maxsb; sb++) + { + for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) + { +#ifdef FIXED_POINT + uint32_t in_re, in_im; +#endif + + /* input from hybrid subbands or QMF subbands */ + if (gr < ps->num_hybrid_groups) + { + RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); + IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); + } else { + RE(inputLeft) = QMF_RE(X_left[n][sb]); + IM(inputLeft) = QMF_IM(X_left[n][sb]); + } + + /* accumulate energy */ +#ifdef FIXED_POINT + /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF + * meaning that P will be scaled by 2^(-10) compared to floating point version + */ + in_re = ((abs(RE(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); + in_im = ((abs(IM(inputLeft))+(1<<(REAL_BITS-1)))>>REAL_BITS); + P[n][bk] += in_re*in_re + in_im*in_im; +#else + P[n][bk] += MUL_R(RE(inputLeft),RE(inputLeft)) + MUL_R(IM(inputLeft),IM(inputLeft)); +#endif + } + } + } + +#if 0 + for (n = 0; n < 32; n++) + { + for (bk = 0; bk < 34; bk++) + { +#ifdef FIXED_POINT + printf("%d %d: %d\n", n, bk, P[n][bk] /*/(float)REAL_PRECISION*/); +#else + printf("%d %d: %f\n", n, bk, P[n][bk]/1024.0); +#endif + } + } +#endif + + /* calculate transient reduction ratio for each parameter band b(k) */ + for (bk = 0; bk < ps->nr_par_bands; bk++) + { + for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) + { + const real_t gamma = COEF_CONST(1.5); + + ps->P_PeakDecayNrg[bk] = MUL_F(ps->P_PeakDecayNrg[bk], ps->alpha_decay); + if (ps->P_PeakDecayNrg[bk] < P[n][bk]) + ps->P_PeakDecayNrg[bk] = P[n][bk]; + + /* apply smoothing filter to peak decay energy */ + P_SmoothPeakDecayDiffNrg = ps->P_SmoothPeakDecayDiffNrg_prev[bk]; + P_SmoothPeakDecayDiffNrg += MUL_F((ps->P_PeakDecayNrg[bk] - P[n][bk] - ps->P_SmoothPeakDecayDiffNrg_prev[bk]), ps->alpha_smooth); + ps->P_SmoothPeakDecayDiffNrg_prev[bk] = P_SmoothPeakDecayDiffNrg; + + /* apply smoothing filter to energy */ + nrg = ps->P_prev[bk]; + nrg += MUL_F((P[n][bk] - ps->P_prev[bk]), ps->alpha_smooth); + ps->P_prev[bk] = nrg; + + /* calculate transient ratio */ + if (MUL_C(P_SmoothPeakDecayDiffNrg, gamma) <= nrg) + { + G_TransientRatio[n][bk] = REAL_CONST(1.0); + } else { + G_TransientRatio[n][bk] = DIV_R(nrg, (MUL_C(P_SmoothPeakDecayDiffNrg, gamma))); + } + } + } + +#if 0 + for (n = 0; n < 32; n++) + { + for (bk = 0; bk < 34; bk++) + { +#ifdef FIXED_POINT + printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]/(float)REAL_PRECISION); +#else + printf("%d %d: %f\n", n, bk, G_TransientRatio[n][bk]); +#endif + } + } +#endif + + /* apply stereo decorrelation filter to the signal */ + for (gr = 0; gr < ps->num_groups; gr++) + { + if (gr < ps->num_hybrid_groups) + maxsb = ps->group_border[gr] + 1; + else + maxsb = ps->group_border[gr + 1]; + + /* QMF channel */ + for (sb = ps->group_border[gr]; sb < maxsb; sb++) + { + real_t g_DecaySlope; + real_t g_DecaySlope_filt[NO_ALLPASS_LINKS]; + + /* g_DecaySlope: [0..1] */ + if (gr < ps->num_hybrid_groups || sb <= ps->decay_cutoff) + { + g_DecaySlope = FRAC_CONST(1.0); + } else { + int8_t decay = ps->decay_cutoff - sb; + if (decay <= -20 /* -1/DECAY_SLOPE */) + { + g_DecaySlope = 0; + } else { + /* decay(int)*decay_slope(frac) = g_DecaySlope(frac) */ + g_DecaySlope = FRAC_CONST(1.0) + DECAY_SLOPE * decay; + } + } + + /* calculate g_DecaySlope_filt for every m multiplied by filter_a[m] */ + for (m = 0; m < NO_ALLPASS_LINKS; m++) + { + g_DecaySlope_filt[m] = MUL_F(g_DecaySlope, filter_a[m]); + } + + + /* set delay indices */ + temp_delay = ps->saved_delay; + for (n = 0; n < NO_ALLPASS_LINKS; n++) + temp_delay_ser[n] = ps->delay_buf_index_ser[n]; + + for (n = ps->border_position[0]; n < ps->border_position[ps->num_env]; n++) + { + complex_t tmp, tmp0, R0; + + if (gr < ps->num_hybrid_groups) + { + /* hybrid filterbank input */ + RE(inputLeft) = QMF_RE(X_hybrid_left[n][sb]); + IM(inputLeft) = QMF_IM(X_hybrid_left[n][sb]); + } else { + /* QMF filterbank input */ + RE(inputLeft) = QMF_RE(X_left[n][sb]); + IM(inputLeft) = QMF_IM(X_left[n][sb]); + } + + if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) + { + /* delay */ + + /* never hybrid subbands here, always QMF subbands */ + RE(tmp) = RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); + IM(tmp) = IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]); + RE(R0) = RE(tmp); + IM(R0) = IM(tmp); + RE(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = RE(inputLeft); + IM(ps->delay_Qmf[ps->delay_buf_index_delay[sb]][sb]) = IM(inputLeft); + } else { + /* allpass filter */ + uint8_t m; + complex_t Phi_Fract; + + /* fetch parameters */ + if (gr < ps->num_hybrid_groups) + { + /* select data from the hybrid subbands */ + RE(tmp0) = RE(ps->delay_SubQmf[temp_delay][sb]); + IM(tmp0) = IM(ps->delay_SubQmf[temp_delay][sb]); + + RE(ps->delay_SubQmf[temp_delay][sb]) = RE(inputLeft); + IM(ps->delay_SubQmf[temp_delay][sb]) = IM(inputLeft); + + RE(Phi_Fract) = RE(Phi_Fract_SubQmf[sb]); + IM(Phi_Fract) = IM(Phi_Fract_SubQmf[sb]); + } else { + /* select data from the QMF subbands */ + RE(tmp0) = RE(ps->delay_Qmf[temp_delay][sb]); + IM(tmp0) = IM(ps->delay_Qmf[temp_delay][sb]); + + RE(ps->delay_Qmf[temp_delay][sb]) = RE(inputLeft); + IM(ps->delay_Qmf[temp_delay][sb]) = IM(inputLeft); + + RE(Phi_Fract) = RE(Phi_Fract_Qmf[sb]); + IM(Phi_Fract) = IM(Phi_Fract_Qmf[sb]); + } + + /* z^(-2) * Phi_Fract[k] */ + ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); + + RE(R0) = RE(tmp); + IM(R0) = IM(tmp); + for (m = 0; m < NO_ALLPASS_LINKS; m++) + { + complex_t Q_Fract_allpass, tmp2; + + /* fetch parameters */ + if (gr < ps->num_hybrid_groups) + { + /* select data from the hybrid subbands */ + RE(tmp0) = RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); + IM(tmp0) = IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]); + + if (ps->use34hybrid_bands) + { + RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf34[sb][m]); + IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf34[sb][m]); + } else { + RE(Q_Fract_allpass) = RE(Q_Fract_allpass_SubQmf20[sb][m]); + IM(Q_Fract_allpass) = IM(Q_Fract_allpass_SubQmf20[sb][m]); + } + } else { + /* select data from the QMF subbands */ + RE(tmp0) = RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); + IM(tmp0) = IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]); + + RE(Q_Fract_allpass) = RE(Q_Fract_allpass_Qmf[sb][m]); + IM(Q_Fract_allpass) = IM(Q_Fract_allpass_Qmf[sb][m]); + } + + /* delay by a fraction */ + /* z^(-d(m)) * Q_Fract_allpass[k,m] */ + ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Q_Fract_allpass), IM(Q_Fract_allpass)); + + /* -a(m) * g_DecaySlope[k] */ + RE(tmp) += -MUL_F(g_DecaySlope_filt[m], RE(R0)); + IM(tmp) += -MUL_F(g_DecaySlope_filt[m], IM(R0)); + + /* -a(m) * g_DecaySlope[k] * Q_Fract_allpass[k,m] * z^(-d(m)) */ + RE(tmp2) = RE(R0) + MUL_F(g_DecaySlope_filt[m], RE(tmp)); + IM(tmp2) = IM(R0) + MUL_F(g_DecaySlope_filt[m], IM(tmp)); + + /* store sample */ + if (gr < ps->num_hybrid_groups) + { + RE(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); + IM(ps->delay_SubQmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); + } else { + RE(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = RE(tmp2); + IM(ps->delay_Qmf_ser[m][temp_delay_ser[m]][sb]) = IM(tmp2); + } + + /* store for next iteration (or as output value if last iteration) */ + RE(R0) = RE(tmp); + IM(R0) = IM(tmp); + } + } + + /* select b(k) for reading the transient ratio */ + bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; + + /* duck if a past transient is found */ + RE(R0) = MUL_R(G_TransientRatio[n][bk], RE(R0)); + IM(R0) = MUL_R(G_TransientRatio[n][bk], IM(R0)); + + if (gr < ps->num_hybrid_groups) + { + /* hybrid */ + QMF_RE(X_hybrid_right[n][sb]) = RE(R0); + QMF_IM(X_hybrid_right[n][sb]) = IM(R0); + } else { + /* QMF */ + QMF_RE(X_right[n][sb]) = RE(R0); + QMF_IM(X_right[n][sb]) = IM(R0); + } + + /* Update delay buffer index */ + if (++temp_delay >= 2) + { + temp_delay = 0; + } + + /* update delay indices */ + if (sb > ps->nr_allpass_bands && gr >= ps->num_hybrid_groups) + { + /* delay_D depends on the samplerate, it can hold the values 14 and 1 */ + if (++ps->delay_buf_index_delay[sb] >= ps->delay_D[sb]) + { + ps->delay_buf_index_delay[sb] = 0; + } + } + + for (m = 0; m < NO_ALLPASS_LINKS; m++) + { + if (++temp_delay_ser[m] >= ps->num_sample_delay_ser[m]) + { + temp_delay_ser[m] = 0; + } + } + } + } + } + + /* update delay indices */ + ps->saved_delay = temp_delay; + for (m = 0; m < NO_ALLPASS_LINKS; m++) + ps->delay_buf_index_ser[m] = temp_delay_ser[m]; +} + +#ifdef FIXED_POINT +#define step(shift) \ + if ((0x40000000l >> shift) + root <= value) \ + { \ + value -= (0x40000000l >> shift) + root; \ + root = (root >> 1) | (0x40000000l >> shift); \ + } else { \ + root = root >> 1; \ + } + +/* fixed point square root approximation */ +static real_t ps_sqrt(real_t value) +{ + real_t root = 0; + + step( 0); step( 2); step( 4); step( 6); + step( 8); step(10); step(12); step(14); + step(16); step(18); step(20); step(22); + step(24); step(26); step(28); step(30); + + if (root < value) + ++root; + + root <<= (REAL_BITS/2); + + return root; +} +#else +#define ps_sqrt(A) sqrt(A) +#endif + +static const real_t ipdopd_cos_tab[] = { + FRAC_CONST(1.000000000000000), + FRAC_CONST(0.707106781186548), + FRAC_CONST(0.000000000000000), + FRAC_CONST(-0.707106781186547), + FRAC_CONST(-1.000000000000000), + FRAC_CONST(-0.707106781186548), + FRAC_CONST(-0.000000000000000), + FRAC_CONST(0.707106781186547), + FRAC_CONST(1.000000000000000) +}; + +static const real_t ipdopd_sin_tab[] = { + FRAC_CONST(0.000000000000000), + FRAC_CONST(0.707106781186547), + FRAC_CONST(1.000000000000000), + FRAC_CONST(0.707106781186548), + FRAC_CONST(0.000000000000000), + FRAC_CONST(-0.707106781186547), + FRAC_CONST(-1.000000000000000), + FRAC_CONST(-0.707106781186548), + FRAC_CONST(-0.000000000000000) +}; + +static real_t magnitude_c(complex_t c) +{ +#ifdef FIXED_POINT +#define ps_abs(A) (((A) > 0) ? (A) : (-(A))) +#define ALPHA FRAC_CONST(0.948059448969) +#define BETA FRAC_CONST(0.392699081699) + + real_t abs_inphase = ps_abs(RE(c)); + real_t abs_quadrature = ps_abs(IM(c)); + + if (abs_inphase > abs_quadrature) { + return MUL_F(abs_inphase, ALPHA) + MUL_F(abs_quadrature, BETA); + } else { + return MUL_F(abs_quadrature, ALPHA) + MUL_F(abs_inphase, BETA); + } +#else + return sqrt(RE(c)*RE(c) + IM(c)*IM(c)); +#endif +} + +static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], + qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]) +{ + uint8_t n; + uint8_t gr; + uint8_t bk = 0; + uint8_t sb, maxsb; + uint8_t env; + uint8_t nr_ipdopd_par; + complex_t h11, h12, h21, h22; + complex_t H11, H12, H21, H22; + complex_t deltaH11, deltaH12, deltaH21, deltaH22; + complex_t tempLeft; + complex_t tempRight; + complex_t phaseLeft; + complex_t phaseRight; + real_t L; + const real_t *sf_iid; + uint8_t no_iid_steps; + + if (ps->iid_mode >= 3) + { + no_iid_steps = 15; + sf_iid = sf_iid_fine; + } else { + no_iid_steps = 7; + sf_iid = sf_iid_normal; + } + + if (ps->ipd_mode == 0 || ps->ipd_mode == 3) + { + nr_ipdopd_par = 11; /* resolution */ + } else { + nr_ipdopd_par = ps->nr_ipdopd_par; + } + + for (gr = 0; gr < ps->num_groups; gr++) + { + bk = (~NEGATE_IPD_MASK) & ps->map_group2bk[gr]; + + /* use one channel per group in the subqmf domain */ + maxsb = (gr < ps->num_hybrid_groups) ? ps->group_border[gr] + 1 : ps->group_border[gr + 1]; + + for (env = 0; env < ps->num_env; env++) + { + if (ps->icc_mode < 3) + { + /* type 'A' mixing as described in 8.6.4.6.2.1 */ + real_t c_1, c_2; + real_t cosa, sina; + real_t cosb, sinb; + real_t ab1, ab2; + real_t ab3, ab4; + + /* + c_1 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps + iid_index] / 10.0))); + c_2 = sqrt(2.0 / (1.0 + pow(10.0, quant_iid[no_iid_steps - iid_index] / 10.0))); + alpha = 0.5 * acos(quant_rho[icc_index]); + beta = alpha * ( c_1 - c_2 ) / sqrt(2.0); + */ + + //printf("%d\n", ps->iid_index[env][bk]); + + /* calculate the scalefactors c_1 and c_2 from the intensity differences */ + c_1 = sf_iid[no_iid_steps + ps->iid_index[env][bk]]; + c_2 = sf_iid[no_iid_steps - ps->iid_index[env][bk]]; + + /* calculate alpha and beta using the ICC parameters */ + cosa = cos_alphas[ps->icc_index[env][bk]]; + sina = sin_alphas[ps->icc_index[env][bk]]; + + if (ps->iid_mode >= 3) + { + if (ps->iid_index[env][bk] < 0) + { + cosb = cos_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + sinb = -sin_betas_fine[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + } else { + cosb = cos_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + sinb = sin_betas_fine[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + } + } else { + if (ps->iid_index[env][bk] < 0) + { + cosb = cos_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + sinb = -sin_betas_normal[-ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + } else { + cosb = cos_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + sinb = sin_betas_normal[ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + } + } + + ab1 = MUL_C(cosb, cosa); + ab2 = MUL_C(sinb, sina); + ab3 = MUL_C(sinb, cosa); + ab4 = MUL_C(cosb, sina); + + /* h_xy: COEF */ + RE(h11) = MUL_C(c_2, (ab1 - ab2)); + RE(h12) = MUL_C(c_1, (ab1 + ab2)); + RE(h21) = MUL_C(c_2, (ab3 + ab4)); + RE(h22) = MUL_C(c_1, (ab3 - ab4)); + } else { + /* type 'B' mixing as described in 8.6.4.6.2.2 */ + real_t sina, cosa; + real_t cosg, sing; + + /* + real_t c, rho, mu, alpha, gamma; + uint8_t i; + + i = ps->iid_index[env][bk]; + c = (real_t)pow(10.0, ((i)?(((i>0)?1:-1)*quant_iid[((i>0)?i:-i)-1]):0.)/20.0); + rho = quant_rho[ps->icc_index[env][bk]]; + + if (rho == 0.0f && c == 1.) + { + alpha = (real_t)M_PI/4.0f; + rho = 0.05f; + } else { + if (rho <= 0.05f) + { + rho = 0.05f; + } + alpha = 0.5f*(real_t)atan( (2.0f*c*rho) / (c*c-1.0f) ); + + if (alpha < 0.) + { + alpha += (real_t)M_PI/2.0f; + } + if (rho < 0.) + { + alpha += (real_t)M_PI; + } + } + mu = c+1.0f/c; + mu = 1+(4.0f*rho*rho-4.0f)/(mu*mu); + gamma = (real_t)atan(sqrt((1.0f-sqrt(mu))/(1.0f+sqrt(mu)))); + */ + + if (ps->iid_mode >= 3) + { + uint8_t abs_iid = abs(ps->iid_index[env][bk]); + + cosa = sincos_alphas_B_fine[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + sina = sincos_alphas_B_fine[30 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; + cosg = cos_gammas_fine[abs_iid][ps->icc_index[env][bk]]; + sing = sin_gammas_fine[abs_iid][ps->icc_index[env][bk]]; + } else { + uint8_t abs_iid = abs(ps->iid_index[env][bk]); + + cosa = sincos_alphas_B_normal[no_iid_steps + ps->iid_index[env][bk]][ps->icc_index[env][bk]]; + sina = sincos_alphas_B_normal[14 - (no_iid_steps + ps->iid_index[env][bk])][ps->icc_index[env][bk]]; + cosg = cos_gammas_normal[abs_iid][ps->icc_index[env][bk]]; + sing = sin_gammas_normal[abs_iid][ps->icc_index[env][bk]]; + } + + RE(h11) = MUL_C(COEF_SQRT2, MUL_C(cosa, cosg)); + RE(h12) = MUL_C(COEF_SQRT2, MUL_C(sina, cosg)); + RE(h21) = MUL_C(COEF_SQRT2, MUL_C(-cosa, sing)); + RE(h22) = MUL_C(COEF_SQRT2, MUL_C(sina, sing)); + } + + /* calculate phase rotation parameters H_xy */ + /* note that the imaginary part of these parameters are only calculated when + IPD and OPD are enabled + */ + if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) + { + int8_t i; + real_t xy, pq, xypq; + + /* ringbuffer index */ + i = ps->phase_hist; + + /* previous value */ +#ifdef FIXED_POINT + /* divide by 4, shift right 2 bits */ + RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 2; + IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 2; + RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 2; + IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 2; +#else + RE(tempLeft) = MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); + IM(tempLeft) = MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.25)); + RE(tempRight) = MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); + IM(tempRight) = MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.25)); +#endif + + /* save current value */ + RE(ps->ipd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->ipd_index[env][bk])]; + IM(ps->ipd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->ipd_index[env][bk])]; + RE(ps->opd_prev[bk][i]) = ipdopd_cos_tab[abs(ps->opd_index[env][bk])]; + IM(ps->opd_prev[bk][i]) = ipdopd_sin_tab[abs(ps->opd_index[env][bk])]; + + /* add current value */ + RE(tempLeft) += RE(ps->ipd_prev[bk][i]); + IM(tempLeft) += IM(ps->ipd_prev[bk][i]); + RE(tempRight) += RE(ps->opd_prev[bk][i]); + IM(tempRight) += IM(ps->opd_prev[bk][i]); + + /* ringbuffer index */ + if (i == 0) + { + i = 2; + } + i--; + + /* get value before previous */ +#ifdef FIXED_POINT + /* dividing by 2, shift right 1 bit */ + RE(tempLeft) += (RE(ps->ipd_prev[bk][i]) >> 1); + IM(tempLeft) += (IM(ps->ipd_prev[bk][i]) >> 1); + RE(tempRight) += (RE(ps->opd_prev[bk][i]) >> 1); + IM(tempRight) += (IM(ps->opd_prev[bk][i]) >> 1); +#else + RE(tempLeft) += MUL_F(RE(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); + IM(tempLeft) += MUL_F(IM(ps->ipd_prev[bk][i]), FRAC_CONST(0.5)); + RE(tempRight) += MUL_F(RE(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); + IM(tempRight) += MUL_F(IM(ps->opd_prev[bk][i]), FRAC_CONST(0.5)); +#endif + +#if 0 /* original code */ + ipd = (float)atan2(IM(tempLeft), RE(tempLeft)); + opd = (float)atan2(IM(tempRight), RE(tempRight)); + + /* phase rotation */ + RE(phaseLeft) = (float)cos(opd); + IM(phaseLeft) = (float)sin(opd); + opd -= ipd; + RE(phaseRight) = (float)cos(opd); + IM(phaseRight) = (float)sin(opd); +#else + + // x = IM(tempLeft) + // y = RE(tempLeft) + // p = IM(tempRight) + // q = RE(tempRight) + // cos(atan2(x,y)) = y/sqrt((x*x) + (y*y)) + // sin(atan2(x,y)) = x/sqrt((x*x) + (y*y)) + // cos(atan2(x,y)-atan2(p,q)) = (y*q + x*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); + // sin(atan2(x,y)-atan2(p,q)) = (x*q - y*p) / ( sqrt((x*x) + (y*y)) * sqrt((p*p) + (q*q)) ); + + xy = magnitude_c(tempRight); + pq = magnitude_c(tempLeft); + + if (xy != 0) + { + RE(phaseLeft) = DIV_R(RE(tempRight), xy); + IM(phaseLeft) = DIV_R(IM(tempRight), xy); + } else { + RE(phaseLeft) = 0; + IM(phaseLeft) = 0; + } + + xypq = MUL_R(xy, pq); + + if (xypq != 0) + { + real_t tmp1 = MUL_R(RE(tempRight), RE(tempLeft)) + MUL_R(IM(tempRight), IM(tempLeft)); + real_t tmp2 = MUL_R(IM(tempRight), RE(tempLeft)) - MUL_R(RE(tempRight), IM(tempLeft)); + + RE(phaseRight) = DIV_R(tmp1, xypq); + IM(phaseRight) = DIV_R(tmp2, xypq); + } else { + RE(phaseRight) = 0; + IM(phaseRight) = 0; + } + +#endif + + /* MUL_F(COEF, REAL) = COEF */ + IM(h11) = MUL_R(RE(h11), IM(phaseLeft)); + IM(h12) = MUL_R(RE(h12), IM(phaseRight)); + IM(h21) = MUL_R(RE(h21), IM(phaseLeft)); + IM(h22) = MUL_R(RE(h22), IM(phaseRight)); + + RE(h11) = MUL_R(RE(h11), RE(phaseLeft)); + RE(h12) = MUL_R(RE(h12), RE(phaseRight)); + RE(h21) = MUL_R(RE(h21), RE(phaseLeft)); + RE(h22) = MUL_R(RE(h22), RE(phaseRight)); + } + + /* length of the envelope n_e+1 - n_e (in time samples) */ + /* 0 < L <= 32: integer */ + L = (real_t)(ps->border_position[env + 1] - ps->border_position[env]); + + /* obtain final H_xy by means of linear interpolation */ + RE(deltaH11) = (RE(h11) - RE(ps->h11_prev[gr])) / L; + RE(deltaH12) = (RE(h12) - RE(ps->h12_prev[gr])) / L; + RE(deltaH21) = (RE(h21) - RE(ps->h21_prev[gr])) / L; + RE(deltaH22) = (RE(h22) - RE(ps->h22_prev[gr])) / L; + + RE(H11) = RE(ps->h11_prev[gr]); + RE(H12) = RE(ps->h12_prev[gr]); + RE(H21) = RE(ps->h21_prev[gr]); + RE(H22) = RE(ps->h22_prev[gr]); + + RE(ps->h11_prev[gr]) = RE(h11); + RE(ps->h12_prev[gr]) = RE(h12); + RE(ps->h21_prev[gr]) = RE(h21); + RE(ps->h22_prev[gr]) = RE(h22); + + /* only calculate imaginary part when needed */ + if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) + { + /* obtain final H_xy by means of linear interpolation */ + IM(deltaH11) = (IM(h11) - IM(ps->h11_prev[gr])) / L; + IM(deltaH12) = (IM(h12) - IM(ps->h12_prev[gr])) / L; + IM(deltaH21) = (IM(h21) - IM(ps->h21_prev[gr])) / L; + IM(deltaH22) = (IM(h22) - IM(ps->h22_prev[gr])) / L; + + IM(H11) = IM(ps->h11_prev[gr]); + IM(H12) = IM(ps->h12_prev[gr]); + IM(H21) = IM(ps->h21_prev[gr]); + IM(H22) = IM(ps->h22_prev[gr]); + + if ((NEGATE_IPD_MASK & ps->map_group2bk[gr]) != 0) + { + IM(deltaH11) = -IM(deltaH11); + IM(deltaH12) = -IM(deltaH12); + IM(deltaH21) = -IM(deltaH21); + IM(deltaH22) = -IM(deltaH22); + + IM(H11) = -IM(H11); + IM(H12) = -IM(H12); + IM(H21) = -IM(H21); + IM(H22) = -IM(H22); + } + + IM(ps->h11_prev[gr]) = IM(h11); + IM(ps->h12_prev[gr]) = IM(h12); + IM(ps->h21_prev[gr]) = IM(h21); + IM(ps->h22_prev[gr]) = IM(h22); + } + + /* apply H_xy to the current envelope band of the decorrelated subband */ + for (n = ps->border_position[env]; n < ps->border_position[env + 1]; n++) + { + /* addition finalises the interpolation over every n */ + RE(H11) += RE(deltaH11); + RE(H12) += RE(deltaH12); + RE(H21) += RE(deltaH21); + RE(H22) += RE(deltaH22); + if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) + { + IM(H11) += IM(deltaH11); + IM(H12) += IM(deltaH12); + IM(H21) += IM(deltaH21); + IM(H22) += IM(deltaH22); + } + + /* channel is an alias to the subband */ + for (sb = ps->group_border[gr]; sb < maxsb; sb++) + { + complex_t inLeft, inRight; + + /* load decorrelated samples */ + if (gr < ps->num_hybrid_groups) + { + RE(inLeft) = RE(X_hybrid_left[n][sb]); + IM(inLeft) = IM(X_hybrid_left[n][sb]); + RE(inRight) = RE(X_hybrid_right[n][sb]); + IM(inRight) = IM(X_hybrid_right[n][sb]); + } else { + RE(inLeft) = RE(X_left[n][sb]); + IM(inLeft) = IM(X_left[n][sb]); + RE(inRight) = RE(X_right[n][sb]); + IM(inRight) = IM(X_right[n][sb]); + } + + /* apply mixing */ + RE(tempLeft) = MUL_C(RE(H11), RE(inLeft)) + MUL_C(RE(H21), RE(inRight)); + IM(tempLeft) = MUL_C(RE(H11), IM(inLeft)) + MUL_C(RE(H21), IM(inRight)); + RE(tempRight) = MUL_C(RE(H12), RE(inLeft)) + MUL_C(RE(H22), RE(inRight)); + IM(tempRight) = MUL_C(RE(H12), IM(inLeft)) + MUL_C(RE(H22), IM(inRight)); + + /* only perform imaginary operations when needed */ + if ((ps->enable_ipdopd) && (bk < nr_ipdopd_par)) + { + /* apply rotation */ + RE(tempLeft) -= MUL_C(IM(H11), IM(inLeft)) + MUL_C(IM(H21), IM(inRight)); + IM(tempLeft) += MUL_C(IM(H11), RE(inLeft)) + MUL_C(IM(H21), RE(inRight)); + RE(tempRight) -= MUL_C(IM(H12), IM(inLeft)) + MUL_C(IM(H22), IM(inRight)); + IM(tempRight) += MUL_C(IM(H12), RE(inLeft)) + MUL_C(IM(H22), RE(inRight)); + } + + /* store final samples */ + if (gr < ps->num_hybrid_groups) + { + RE(X_hybrid_left[n][sb]) = RE(tempLeft); + IM(X_hybrid_left[n][sb]) = IM(tempLeft); + RE(X_hybrid_right[n][sb]) = RE(tempRight); + IM(X_hybrid_right[n][sb]) = IM(tempRight); + } else { + RE(X_left[n][sb]) = RE(tempLeft); + IM(X_left[n][sb]) = IM(tempLeft); + RE(X_right[n][sb]) = RE(tempRight); + IM(X_right[n][sb]) = IM(tempRight); + } + } + } + + /* shift phase smoother's circular buffer index */ + ps->phase_hist++; + if (ps->phase_hist == 2) + { + ps->phase_hist = 0; + } + } + } +} + +void ps_free(ps_info *ps) +{ + /* free hybrid filterbank structures */ + hybrid_free(ps->hyb); + + faad_free(ps); +} + +ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate) +{ + uint8_t i; + uint8_t short_delay_band; + + ps_info *ps = (ps_info*)faad_malloc(sizeof(ps_info)); + memset(ps, 0, sizeof(ps_info)); + + ps->hyb = hybrid_init(numTimeSlotsRate); + ps->numTimeSlotsRate = numTimeSlotsRate; + + ps->ps_data_available = 0; + + /* delay stuff*/ + ps->saved_delay = 0; + + for (i = 0; i < 64; i++) + { + ps->delay_buf_index_delay[i] = 0; + } + + for (i = 0; i < NO_ALLPASS_LINKS; i++) + { + ps->delay_buf_index_ser[i] = 0; +#ifdef PARAM_32KHZ + if (sr_index <= 5) /* >= 32 kHz*/ + { + ps->num_sample_delay_ser[i] = delay_length_d[1][i]; + } else { + ps->num_sample_delay_ser[i] = delay_length_d[0][i]; + } +#else + /* THESE ARE CONSTANTS NOW */ + ps->num_sample_delay_ser[i] = delay_length_d[i]; +#endif + } + +#ifdef PARAM_32KHZ + if (sr_index <= 5) /* >= 32 kHz*/ + { + short_delay_band = 35; + ps->nr_allpass_bands = 22; + ps->alpha_decay = FRAC_CONST(0.76592833836465); + ps->alpha_smooth = FRAC_CONST(0.25); + } else { + short_delay_band = 64; + ps->nr_allpass_bands = 45; + ps->alpha_decay = FRAC_CONST(0.58664621951003); + ps->alpha_smooth = FRAC_CONST(0.6); + } +#else + /* THESE ARE CONSTANTS NOW */ + short_delay_band = 35; + ps->nr_allpass_bands = 22; + ps->alpha_decay = FRAC_CONST(0.76592833836465); + ps->alpha_smooth = FRAC_CONST(0.25); +#endif + + /* THESE ARE CONSTANT NOW IF PS IS INDEPENDANT OF SAMPLERATE */ + for (i = 0; i < short_delay_band; i++) + { + ps->delay_D[i] = 14; + } + for (i = short_delay_band; i < 64; i++) + { + ps->delay_D[i] = 1; + } + + /* mixing and phase */ + for (i = 0; i < 50; i++) + { + RE(ps->h11_prev[i]) = 1; + IM(ps->h12_prev[i]) = 1; + RE(ps->h11_prev[i]) = 1; + IM(ps->h12_prev[i]) = 1; + } + + ps->phase_hist = 0; + + for (i = 0; i < 20; i++) + { + RE(ps->ipd_prev[i][0]) = 0; + IM(ps->ipd_prev[i][0]) = 0; + RE(ps->ipd_prev[i][1]) = 0; + IM(ps->ipd_prev[i][1]) = 0; + RE(ps->opd_prev[i][0]) = 0; + IM(ps->opd_prev[i][0]) = 0; + RE(ps->opd_prev[i][1]) = 0; + IM(ps->opd_prev[i][1]) = 0; + } + + return ps; +} + +/* main Parametric Stereo decoding function */ +uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) +{ + qmf_t X_hybrid_left[32][32] = {{0}}; + qmf_t X_hybrid_right[32][32] = {{0}}; + + /* delta decoding of the bitstream data */ + ps_data_decode(ps); + + /* set up some parameters depending on filterbank type */ + if (ps->use34hybrid_bands) + { + ps->group_border = (uint8_t*)group_border34; + ps->map_group2bk = (uint16_t*)map_group2bk34; + ps->num_groups = 32+18; + ps->num_hybrid_groups = 32; + ps->nr_par_bands = 34; + ps->decay_cutoff = 5; + } else { + ps->group_border = (uint8_t*)group_border20; + ps->map_group2bk = (uint16_t*)map_group2bk20; + ps->num_groups = 10+12; + ps->num_hybrid_groups = 10; + ps->nr_par_bands = 20; + ps->decay_cutoff = 3; + } + + /* Perform further analysis on the lowest subbands to get a higher + * frequency resolution + */ + hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left, + ps->use34hybrid_bands, ps->numTimeSlotsRate); + + /* decorrelate mono signal */ + ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); + + /* apply mixing and phase parameters */ + ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); + + /* hybrid synthesis, to rebuild the SBR QMF matrices */ + hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left, + ps->use34hybrid_bands, ps->numTimeSlotsRate); + + hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right, + ps->use34hybrid_bands, ps->numTimeSlotsRate); + + return 0; +} + +#endif + diff --git a/src/contrib/aacdecoder/libfaad/ps_dec.h b/src/contrib/aacdecoder/libfaad/ps_dec.h new file mode 100755 index 000000000..090244693 --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/ps_dec.h @@ -0,0 +1,152 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ps_dec.h,v 1.13 2009/01/26 22:32:31 menno Exp $ +**/ + +#ifndef __PS_DEC_H__ +#define __PS_DEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "bits.h" + +#define EXTENSION_ID_PS 2 + +#define MAX_PS_ENVELOPES 5 +#define NO_ALLPASS_LINKS 3 + +typedef struct +{ + /* bitstream parameters */ + uint8_t enable_iid; + uint8_t enable_icc; + uint8_t enable_ext; + + uint8_t iid_mode; + uint8_t icc_mode; + uint8_t nr_iid_par; + uint8_t nr_ipdopd_par; + uint8_t nr_icc_par; + + uint8_t frame_class; + uint8_t num_env; + + uint8_t border_position[MAX_PS_ENVELOPES+1]; + + uint8_t iid_dt[MAX_PS_ENVELOPES]; + uint8_t icc_dt[MAX_PS_ENVELOPES]; + + uint8_t enable_ipdopd; + uint8_t ipd_mode; + uint8_t ipd_dt[MAX_PS_ENVELOPES]; + uint8_t opd_dt[MAX_PS_ENVELOPES]; + + /* indices */ + int8_t iid_index_prev[34]; + int8_t icc_index_prev[34]; + int8_t ipd_index_prev[17]; + int8_t opd_index_prev[17]; + int8_t iid_index[MAX_PS_ENVELOPES][34]; + int8_t icc_index[MAX_PS_ENVELOPES][34]; + int8_t ipd_index[MAX_PS_ENVELOPES][17]; + int8_t opd_index[MAX_PS_ENVELOPES][17]; + + int8_t ipd_index_1[17]; + int8_t opd_index_1[17]; + int8_t ipd_index_2[17]; + int8_t opd_index_2[17]; + + /* ps data was correctly read */ + uint8_t ps_data_available; + + /* a header has been read */ + uint8_t header_read; + + /* hybrid filterbank parameters */ + void *hyb; + uint8_t use34hybrid_bands; + uint8_t numTimeSlotsRate; + + /**/ + uint8_t num_groups; + uint8_t num_hybrid_groups; + uint8_t nr_par_bands; + uint8_t nr_allpass_bands; + uint8_t decay_cutoff; + + uint8_t *group_border; + uint16_t *map_group2bk; + + /* filter delay handling */ + uint8_t saved_delay; + uint8_t delay_buf_index_ser[NO_ALLPASS_LINKS]; + uint8_t num_sample_delay_ser[NO_ALLPASS_LINKS]; + uint8_t delay_D[64]; + uint8_t delay_buf_index_delay[64]; + + complex_t delay_Qmf[14][64]; /* 14 samples delay max, 64 QMF channels */ + complex_t delay_SubQmf[2][32]; /* 2 samples delay max (SubQmf is always allpass filtered) */ + complex_t delay_Qmf_ser[NO_ALLPASS_LINKS][5][64]; /* 5 samples delay max (table 8.34), 64 QMF channels */ + complex_t delay_SubQmf_ser[NO_ALLPASS_LINKS][5][32]; /* 5 samples delay max (table 8.34) */ + + /* transients */ + real_t alpha_decay; + real_t alpha_smooth; + + real_t P_PeakDecayNrg[34]; + real_t P_prev[34]; + real_t P_SmoothPeakDecayDiffNrg_prev[34]; + + /* mixing and phase */ + complex_t h11_prev[50]; + complex_t h12_prev[50]; + complex_t h21_prev[50]; + complex_t h22_prev[50]; + uint8_t phase_hist; + complex_t ipd_prev[20][2]; + complex_t opd_prev[20][2]; + +} ps_info; + +/* ps_syntax.c */ +uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header); + +/* ps_dec.c */ +ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate); +void ps_free(ps_info *ps); + +uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/ps_syntax.c b/src/contrib/aacdecoder/libfaad/ps_syntax.c new file mode 100755 index 000000000..50253d459 --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/ps_syntax.c @@ -0,0 +1,551 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ps_syntax.c,v 1.11 2007/11/01 12:33:33 menno Exp $ +**/ + +#include "common.h" + +#ifdef PS_DEC + +#include "bits.h" +#include "ps_dec.h" + +/* type definitaions */ +typedef const int8_t (*ps_huff_tab)[2]; + +/* static data tables */ +static const uint8_t nr_iid_par_tab[] = { + 10, 20, 34, 10, 20, 34, 0, 0 +}; +static const uint8_t nr_ipdopd_par_tab[] = { + 5, 11, 17, 5, 11, 17, 0, 0 +}; +static const uint8_t nr_icc_par_tab[] = { + 10, 20, 34, 10, 20, 34, 0, 0 +}; +static const uint8_t num_env_tab[][4] = { + { 0, 1, 2, 4 }, + { 1, 2, 3, 4 } +}; + +/* binary lookup huffman tables */ +static const int8_t f_huff_iid_def[][2] = { + { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 1x */ + { /*1*/ -30, /*-1*/ -32 }, /* index 2: 3 bits: 10x */ + { 4, 5 }, /* index 3: 3 bits: 11x */ + { /*2*/ -29, /*-2*/ -33 }, /* index 4: 4 bits: 110x */ + { 6, 7 }, /* index 5: 4 bits: 111x */ + { /*3*/ -28, /*-3*/ -34 }, /* index 6: 5 bits: 1110x */ + { 8, 9 }, /* index 7: 5 bits: 1111x */ + { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 11110x */ + { /*5*/ -26, 10 }, /* index 9: 6 bits: 11111x */ + { /*-5*/ -36, 11 }, /* index 10: 7 bits: 111111x */ + { /*6*/ -25, 12 }, /* index 11: 8 bits: 1111111x */ + { /*-6*/ -37, 13 }, /* index 12: 9 bits: 11111111x */ + { /*-7*/ -38, 14 }, /* index 13: 10 bits: 111111111x */ + { /*7*/ -24, 15 }, /* index 14: 11 bits: 1111111111x */ + { 16, 17 }, /* index 15: 12 bits: 11111111111x */ + { /*8*/ -23, /*-8*/ -39 }, /* index 16: 13 bits: 111111111110x */ + { 18, 19 }, /* index 17: 13 bits: 111111111111x */ + { /*9*/ -22, /*10*/ -21 }, /* index 18: 14 bits: 1111111111110x */ + { 20, 21 }, /* index 19: 14 bits: 1111111111111x */ + { /*-9*/ -40, /*11*/ -20 }, /* index 20: 15 bits: 11111111111110x */ + { 22, 23 }, /* index 21: 15 bits: 11111111111111x */ + { /*-10*/ -41, 24 }, /* index 22: 16 bits: 111111111111110x */ + { 25, 26 }, /* index 23: 16 bits: 111111111111111x */ + { /*-11*/ -42, /*-14*/ -45 }, /* index 24: 17 bits: 1111111111111101x */ + { /*-13*/ -44, /*-12*/ -43 }, /* index 25: 17 bits: 1111111111111110x */ + { /*12*/ -19, 27 }, /* index 26: 17 bits: 1111111111111111x */ + { /*13*/ -18, /*14*/ -17 } /* index 27: 18 bits: 11111111111111111x */ +}; + +static const int8_t t_huff_iid_def[][2] = { + { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ + { /*-1*/ -32, 2 }, /* index 1: 2 bits: 1x */ + { /*1*/ -30, 3 }, /* index 2: 3 bits: 11x */ + { /*-2*/ -33, 4 }, /* index 3: 4 bits: 111x */ + { /*2*/ -29, 5 }, /* index 4: 5 bits: 1111x */ + { /*-3*/ -34, 6 }, /* index 5: 6 bits: 11111x */ + { /*3*/ -28, 7 }, /* index 6: 7 bits: 111111x */ + { /*-4*/ -35, 8 }, /* index 7: 8 bits: 1111111x */ + { /*4*/ -27, 9 }, /* index 8: 9 bits: 11111111x */ + { /*-5*/ -36, 10 }, /* index 9: 10 bits: 111111111x */ + { /*5*/ -26, 11 }, /* index 10: 11 bits: 1111111111x */ + { /*-6*/ -37, 12 }, /* index 11: 12 bits: 11111111111x */ + { /*6*/ -25, 13 }, /* index 12: 13 bits: 111111111111x */ + { /*7*/ -24, 14 }, /* index 13: 14 bits: 1111111111111x */ + { /*-7*/ -38, 15 }, /* index 14: 15 bits: 11111111111111x */ + { 16, 17 }, /* index 15: 16 bits: 111111111111111x */ + { /*8*/ -23, /*-8*/ -39 }, /* index 16: 17 bits: 1111111111111110x */ + { 18, 19 }, /* index 17: 17 bits: 1111111111111111x */ + { 20, 21 }, /* index 18: 18 bits: 11111111111111110x */ + { 22, 23 }, /* index 19: 18 bits: 11111111111111111x */ + { /*9*/ -22, /*-14*/ -45 }, /* index 20: 19 bits: 111111111111111100x */ + { /*-13*/ -44, /*-12*/ -43 }, /* index 21: 19 bits: 111111111111111101x */ + { 24, 25 }, /* index 22: 19 bits: 111111111111111110x */ + { 26, 27 }, /* index 23: 19 bits: 111111111111111111x */ + { /*-11*/ -42, /*-10*/ -41 }, /* index 24: 20 bits: 1111111111111111100x */ + { /*-9*/ -40, /*10*/ -21 }, /* index 25: 20 bits: 1111111111111111101x */ + { /*11*/ -20, /*12*/ -19 }, /* index 26: 20 bits: 1111111111111111110x */ + { /*13*/ -18, /*14*/ -17 } /* index 27: 20 bits: 1111111111111111111x */ +}; + +static const int8_t f_huff_iid_fine[][2] = { + { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 0x */ + { 4, /*-1*/ -32 }, /* index 2: 3 bits: 00x */ + { /*1*/ -30, 5 }, /* index 3: 3 bits: 01x */ + { /*-2*/ -33, /*2*/ -29 }, /* index 4: 4 bits: 000x */ + { 6, 7 }, /* index 5: 4 bits: 011x */ + { /*-3*/ -34, /*3*/ -28 }, /* index 6: 5 bits: 0110x */ + { 8, 9 }, /* index 7: 5 bits: 0111x */ + { /*-4*/ -35, /*4*/ -27 }, /* index 8: 6 bits: 01110x */ + { 10, 11 }, /* index 9: 6 bits: 01111x */ + { /*-5*/ -36, /*5*/ -26 }, /* index 10: 7 bits: 011110x */ + { 12, 13 }, /* index 11: 7 bits: 011111x */ + { /*-6*/ -37, /*6*/ -25 }, /* index 12: 8 bits: 0111110x */ + { 14, 15 }, /* index 13: 8 bits: 0111111x */ + { /*7*/ -24, 16 }, /* index 14: 9 bits: 01111110x */ + { 17, 18 }, /* index 15: 9 bits: 01111111x */ + { 19, /*-8*/ -39 }, /* index 16: 10 bits: 011111101x */ + { /*8*/ -23, 20 }, /* index 17: 10 bits: 011111110x */ + { 21, /*-7*/ -38 }, /* index 18: 10 bits: 011111111x */ + { /*10*/ -21, 22 }, /* index 19: 11 bits: 0111111010x */ + { 23, /*-9*/ -40 }, /* index 20: 11 bits: 0111111101x */ + { /*9*/ -22, 24 }, /* index 21: 11 bits: 0111111110x */ + { /*-11*/ -42, /*11*/ -20 }, /* index 22: 12 bits: 01111110101x */ + { 25, 26 }, /* index 23: 12 bits: 01111111010x */ + { 27, /*-10*/ -41 }, /* index 24: 12 bits: 01111111101x */ + { 28, /*-12*/ -43 }, /* index 25: 13 bits: 011111110100x */ + { /*12*/ -19, 29 }, /* index 26: 13 bits: 011111110101x */ + { 30, 31 }, /* index 27: 13 bits: 011111111010x */ + { 32, /*-14*/ -45 }, /* index 28: 14 bits: 0111111101000x */ + { /*14*/ -17, 33 }, /* index 29: 14 bits: 0111111101011x */ + { 34, /*-13*/ -44 }, /* index 30: 14 bits: 0111111110100x */ + { /*13*/ -18, 35 }, /* index 31: 14 bits: 0111111110101x */ + { 36, 37 }, /* index 32: 15 bits: 01111111010000x */ + { 38, /*-15*/ -46 }, /* index 33: 15 bits: 01111111010111x */ + { /*15*/ -16, 39 }, /* index 34: 15 bits: 01111111101000x */ + { 40, 41 }, /* index 35: 15 bits: 01111111101011x */ + { 42, 43 }, /* index 36: 16 bits: 011111110100000x */ + { /*-17*/ -48, /*17*/ -14 }, /* index 37: 16 bits: 011111110100001x */ + { 44, 45 }, /* index 38: 16 bits: 011111110101110x */ + { 46, 47 }, /* index 39: 16 bits: 011111111010001x */ + { 48, 49 }, /* index 40: 16 bits: 011111111010110x */ + { /*-16*/ -47, /*16*/ -15 }, /* index 41: 16 bits: 011111111010111x */ + { /*-21*/ -52, /*21*/ -10 }, /* index 42: 17 bits: 0111111101000000x */ + { /*-19*/ -50, /*19*/ -12 }, /* index 43: 17 bits: 0111111101000001x */ + { /*-18*/ -49, /*18*/ -13 }, /* index 44: 17 bits: 0111111101011100x */ + { 50, 51 }, /* index 45: 17 bits: 0111111101011101x */ + { 52, 53 }, /* index 46: 17 bits: 0111111110100010x */ + { 54, 55 }, /* index 47: 17 bits: 0111111110100011x */ + { 56, 57 }, /* index 48: 17 bits: 0111111110101100x */ + { 58, 59 }, /* index 49: 17 bits: 0111111110101101x */ + { /*-26*/ -57, /*-25*/ -56 }, /* index 50: 18 bits: 01111111010111010x */ + { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 18 bits: 01111111010111011x */ + { /*-22*/ -53, /*22*/ -9 }, /* index 52: 18 bits: 01111111101000100x */ + { /*-24*/ -55, /*-23*/ -54 }, /* index 53: 18 bits: 01111111101000101x */ + { /*25*/ -6, /*26*/ -5 }, /* index 54: 18 bits: 01111111101000110x */ + { /*23*/ -8, /*24*/ -7 }, /* index 55: 18 bits: 01111111101000111x */ + { /*29*/ -2, /*30*/ -1 }, /* index 56: 18 bits: 01111111101011000x */ + { /*27*/ -4, /*28*/ -3 }, /* index 57: 18 bits: 01111111101011001x */ + { /*-30*/ -61, /*-29*/ -60 }, /* index 58: 18 bits: 01111111101011010x */ + { /*-20*/ -51, /*20*/ -11 } /* index 59: 18 bits: 01111111101011011x */ +}; + +static const int8_t t_huff_iid_fine[][2] = { + { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ + { /*1*/ -30, 2 }, /* index 1: 2 bits: 0x */ + { 3, /*-1*/ -32 }, /* index 2: 3 bits: 01x */ + { 4, 5 }, /* index 3: 4 bits: 010x */ + { 6, 7 }, /* index 4: 5 bits: 0100x */ + { /*-2*/ -33, /*2*/ -29 }, /* index 5: 5 bits: 0101x */ + { 8, /*-3*/ -34 }, /* index 6: 6 bits: 01000x */ + { /*3*/ -28, 9 }, /* index 7: 6 bits: 01001x */ + { /*-4*/ -35, /*4*/ -27 }, /* index 8: 7 bits: 010000x */ + { 10, 11 }, /* index 9: 7 bits: 010011x */ + { /*5*/ -26, 12 }, /* index 10: 8 bits: 0100110x */ + { 13, 14 }, /* index 11: 8 bits: 0100111x */ + { /*-6*/ -37, /*6*/ -25 }, /* index 12: 9 bits: 01001101x */ + { 15, 16 }, /* index 13: 9 bits: 01001110x */ + { 17, /*-5*/ -36 }, /* index 14: 9 bits: 01001111x */ + { 18, /*-7*/ -38 }, /* index 15: 10 bits: 010011100x */ + { /*7*/ -24, 19 }, /* index 16: 10 bits: 010011101x */ + { 20, 21 }, /* index 17: 10 bits: 010011110x */ + { /*9*/ -22, 22 }, /* index 18: 11 bits: 0100111000x */ + { 23, 24 }, /* index 19: 11 bits: 0100111011x */ + { /*-8*/ -39, /*8*/ -23 }, /* index 20: 11 bits: 0100111100x */ + { 25, 26 }, /* index 21: 11 bits: 0100111101x */ + { /*11*/ -20, 27 }, /* index 22: 12 bits: 01001110001x */ + { 28, 29 }, /* index 23: 12 bits: 01001110110x */ + { /*-10*/ -41, /*10*/ -21 }, /* index 24: 12 bits: 01001110111x */ + { 30, 31 }, /* index 25: 12 bits: 01001111010x */ + { 32, /*-9*/ -40 }, /* index 26: 12 bits: 01001111011x */ + { 33, /*-13*/ -44 }, /* index 27: 13 bits: 010011100011x */ + { /*13*/ -18, 34 }, /* index 28: 13 bits: 010011101100x */ + { 35, 36 }, /* index 29: 13 bits: 010011101101x */ + { 37, /*-12*/ -43 }, /* index 30: 13 bits: 010011110100x */ + { /*12*/ -19, 38 }, /* index 31: 13 bits: 010011110101x */ + { 39, /*-11*/ -42 }, /* index 32: 13 bits: 010011110110x */ + { 40, 41 }, /* index 33: 14 bits: 0100111000110x */ + { 42, 43 }, /* index 34: 14 bits: 0100111011001x */ + { 44, 45 }, /* index 35: 14 bits: 0100111011010x */ + { 46, /*-15*/ -46 }, /* index 36: 14 bits: 0100111011011x */ + { /*15*/ -16, 47 }, /* index 37: 14 bits: 0100111101000x */ + { /*-14*/ -45, /*14*/ -17 }, /* index 38: 14 bits: 0100111101011x */ + { 48, 49 }, /* index 39: 14 bits: 0100111101100x */ + { /*-21*/ -52, /*-20*/ -51 }, /* index 40: 15 bits: 01001110001100x */ + { /*18*/ -13, /*19*/ -12 }, /* index 41: 15 bits: 01001110001101x */ + { /*-19*/ -50, /*-18*/ -49 }, /* index 42: 15 bits: 01001110110010x */ + { 50, 51 }, /* index 43: 15 bits: 01001110110011x */ + { 52, 53 }, /* index 44: 15 bits: 01001110110100x */ + { 54, 55 }, /* index 45: 15 bits: 01001110110101x */ + { 56, /*-17*/ -48 }, /* index 46: 15 bits: 01001110110110x */ + { /*17*/ -14, 57 }, /* index 47: 15 bits: 01001111010001x */ + { 58, /*-16*/ -47 }, /* index 48: 15 bits: 01001111011000x */ + { /*16*/ -15, 59 }, /* index 49: 15 bits: 01001111011001x */ + { /*-26*/ -57, /*26*/ -5 }, /* index 50: 16 bits: 010011101100110x */ + { /*-28*/ -59, /*-27*/ -58 }, /* index 51: 16 bits: 010011101100111x */ + { /*29*/ -2, /*30*/ -1 }, /* index 52: 16 bits: 010011101101000x */ + { /*27*/ -4, /*28*/ -3 }, /* index 53: 16 bits: 010011101101001x */ + { /*-30*/ -61, /*-29*/ -60 }, /* index 54: 16 bits: 010011101101010x */ + { /*-25*/ -56, /*25*/ -6 }, /* index 55: 16 bits: 010011101101011x */ + { /*-24*/ -55, /*24*/ -7 }, /* index 56: 16 bits: 010011101101100x */ + { /*-23*/ -54, /*23*/ -8 }, /* index 57: 16 bits: 010011110100011x */ + { /*-22*/ -53, /*22*/ -9 }, /* index 58: 16 bits: 010011110110000x */ + { /*20*/ -11, /*21*/ -10 } /* index 59: 16 bits: 010011110110011x */ +}; + +static const int8_t f_huff_icc[][2] = { + { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ + { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ + { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ + { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ + { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ + { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ + { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ + { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ + { /*5*/ -26, 9 }, /* index 8: 9 bits: 11111111x */ + { /*-4*/ -35, 10 }, /* index 9: 10 bits: 111111111x */ + { /*6*/ -25, 11 }, /* index 10: 11 bits: 1111111111x */ + { /*-5*/ -36, 12 }, /* index 11: 12 bits: 11111111111x */ + { /*7*/ -24, 13 }, /* index 12: 13 bits: 111111111111x */ + { /*-6*/ -37, /*-7*/ -38 } /* index 13: 14 bits: 1111111111111x */ +}; + +static const int8_t t_huff_icc[][2] = { + { /*0*/ -31, 1 }, /* index 0: 1 bits: x */ + { /*1*/ -30, 2 }, /* index 1: 2 bits: 1x */ + { /*-1*/ -32, 3 }, /* index 2: 3 bits: 11x */ + { /*2*/ -29, 4 }, /* index 3: 4 bits: 111x */ + { /*-2*/ -33, 5 }, /* index 4: 5 bits: 1111x */ + { /*3*/ -28, 6 }, /* index 5: 6 bits: 11111x */ + { /*-3*/ -34, 7 }, /* index 6: 7 bits: 111111x */ + { /*4*/ -27, 8 }, /* index 7: 8 bits: 1111111x */ + { /*-4*/ -35, 9 }, /* index 8: 9 bits: 11111111x */ + { /*5*/ -26, 10 }, /* index 9: 10 bits: 111111111x */ + { /*-5*/ -36, 11 }, /* index 10: 11 bits: 1111111111x */ + { /*6*/ -25, 12 }, /* index 11: 12 bits: 11111111111x */ + { /*-6*/ -37, 13 }, /* index 12: 13 bits: 111111111111x */ + { /*-7*/ -38, /*7*/ -24 } /* index 13: 14 bits: 1111111111111x */ +}; + +static const int8_t f_huff_ipd[][2] = { + { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 0x */ + { /*1*/ -30, 4 }, /* index 2: 3 bits: 00x */ + { 5, 6 }, /* index 3: 3 bits: 01x */ + { /*4*/ -27, /*5*/ -26 }, /* index 4: 4 bits: 001x */ + { /*3*/ -28, /*6*/ -25 }, /* index 5: 4 bits: 010x */ + { /*2*/ -29, /*7*/ -24 } /* index 6: 4 bits: 011x */ +}; + +static const int8_t t_huff_ipd[][2] = { + { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 0x */ + { 4, 5 }, /* index 2: 3 bits: 00x */ + { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ + { /*5*/ -26, 6 }, /* index 4: 4 bits: 000x */ + { /*2*/ -29, /*6*/ -25 }, /* index 5: 4 bits: 001x */ + { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0001x */ +}; + +static const int8_t f_huff_opd[][2] = { + { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 0x */ + { /*7*/ -24, /*1*/ -30 }, /* index 2: 3 bits: 00x */ + { 4, 5 }, /* index 3: 3 bits: 01x */ + { /*3*/ -28, /*6*/ -25 }, /* index 4: 4 bits: 010x */ + { /*2*/ -29, 6 }, /* index 5: 4 bits: 011x */ + { /*5*/ -26, /*4*/ -27 } /* index 6: 5 bits: 0111x */ +}; + +static const int8_t t_huff_opd[][2] = { + { 1, /*0*/ -31 }, /* index 0: 1 bits: x */ + { 2, 3 }, /* index 1: 2 bits: 0x */ + { 4, 5 }, /* index 2: 3 bits: 00x */ + { /*1*/ -30, /*7*/ -24 }, /* index 3: 3 bits: 01x */ + { /*5*/ -26, /*2*/ -29 }, /* index 4: 4 bits: 000x */ + { /*6*/ -25, 6 }, /* index 5: 4 bits: 001x */ + { /*4*/ -27, /*3*/ -28 } /* index 6: 5 bits: 0011x */ +}; + +/* static function declarations */ +static uint16_t ps_extension(ps_info *ps, bitfile *ld, + const uint8_t ps_extension_id, + const uint16_t num_bits_left); +static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, + ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par); +static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff); + + +uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header) +{ + uint8_t tmp, n; + uint16_t bits = (uint16_t)faad_get_processed_bits(ld); + + *header = 0; + + /* check for new PS header */ + if (faad_get1bit(ld + DEBUGVAR(1,1000,"ps_data(): enable_ps_header"))) + { + *header = 1; + + ps->header_read = 1; + + ps->use34hybrid_bands = 0; + + /* Inter-channel Intensity Difference (IID) parameters enabled */ + ps->enable_iid = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1001,"ps_data(): enable_iid")); + + if (ps->enable_iid) + { + ps->iid_mode = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,1002,"ps_data(): iid_mode")); + + ps->nr_iid_par = nr_iid_par_tab[ps->iid_mode]; + ps->nr_ipdopd_par = nr_ipdopd_par_tab[ps->iid_mode]; + + if (ps->iid_mode == 2 || ps->iid_mode == 5) + ps->use34hybrid_bands = 1; + + /* IPD freq res equal to IID freq res */ + ps->ipd_mode = ps->iid_mode; + } + + /* Inter-channel Coherence (ICC) parameters enabled */ + ps->enable_icc = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1003,"ps_data(): enable_icc")); + + if (ps->enable_icc) + { + ps->icc_mode = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,1004,"ps_data(): icc_mode")); + + ps->nr_icc_par = nr_icc_par_tab[ps->icc_mode]; + + if (ps->icc_mode == 2 || ps->icc_mode == 5) + ps->use34hybrid_bands = 1; + } + + /* PS extension layer enabled */ + ps->enable_ext = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1005,"ps_data(): enable_ext")); + } + + /* we are here, but no header has been read yet */ + if (ps->header_read == 0) + { + ps->ps_data_available = 0; + return 1; + } + + ps->frame_class = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1006,"ps_data(): frame_class")); + tmp = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,1007,"ps_data(): num_env_idx")); + + ps->num_env = num_env_tab[ps->frame_class][tmp]; + + if (ps->frame_class) + { + for (n = 1; n < ps->num_env+1; n++) + { + ps->border_position[n] = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,1008,"ps_data(): border_position")) + 1; + } + } + + if (ps->enable_iid) + { + for (n = 0; n < ps->num_env; n++) + { + ps->iid_dt[n] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1009,"ps_data(): iid_dt")); + + /* iid_data */ + if (ps->iid_mode < 3) + { + huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_def, + f_huff_iid_def, ps->iid_index[n]); + } else { + huff_data(ld, ps->iid_dt[n], ps->nr_iid_par, t_huff_iid_fine, + f_huff_iid_fine, ps->iid_index[n]); + } + } + } + + if (ps->enable_icc) + { + for (n = 0; n < ps->num_env; n++) + { + ps->icc_dt[n] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1010,"ps_data(): icc_dt")); + + /* icc_data */ + huff_data(ld, ps->icc_dt[n], ps->nr_icc_par, t_huff_icc, + f_huff_icc, ps->icc_index[n]); + } + } + + if (ps->enable_ext) + { + uint16_t num_bits_left; + uint16_t cnt = (uint16_t)faad_getbits(ld, 4 + DEBUGVAR(1,1011,"ps_data(): ps_extension_size")); + if (cnt == 15) + { + cnt += (uint16_t)faad_getbits(ld, 8 + DEBUGVAR(1,1012,"ps_data(): esc_count")); + } + + num_bits_left = 8 * cnt; + while (num_bits_left > 7) + { + uint8_t ps_extension_id = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,1013,"ps_data(): ps_extension_size")); + + num_bits_left -= 2; + num_bits_left -= ps_extension(ps, ld, ps_extension_id, num_bits_left); + } + + faad_getbits(ld, num_bits_left + DEBUGVAR(1,1014,"ps_data(): fill_bits")); + } + + bits = (uint16_t)faad_get_processed_bits(ld) - bits; + + ps->ps_data_available = 1; + + return bits; +} + +static uint16_t ps_extension(ps_info *ps, bitfile *ld, + const uint8_t ps_extension_id, + const uint16_t num_bits_left) +{ + uint8_t n; + uint16_t bits = (uint16_t)faad_get_processed_bits(ld); + + if (ps_extension_id == 0) + { + ps->enable_ipdopd = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1015,"ps_extension(): enable_ipdopd")); + + if (ps->enable_ipdopd) + { + for (n = 0; n < ps->num_env; n++) + { + ps->ipd_dt[n] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1016,"ps_extension(): ipd_dt")); + + /* ipd_data */ + huff_data(ld, ps->ipd_dt[n], ps->nr_ipdopd_par, t_huff_ipd, + f_huff_ipd, ps->ipd_index[n]); + + ps->opd_dt[n] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,1017,"ps_extension(): opd_dt")); + + /* opd_data */ + huff_data(ld, ps->opd_dt[n], ps->nr_ipdopd_par, t_huff_opd, + f_huff_opd, ps->opd_index[n]); + } + } + faad_get1bit(ld + DEBUGVAR(1,1018,"ps_extension(): reserved_ps")); + } + + /* return number of bits read */ + bits = (uint16_t)faad_get_processed_bits(ld) - bits; + + return bits; +} + +/* read huffman data coded in either the frequency or the time direction */ +static void huff_data(bitfile *ld, const uint8_t dt, const uint8_t nr_par, + ps_huff_tab t_huff, ps_huff_tab f_huff, int8_t *par) +{ + uint8_t n; + + if (dt) + { + /* coded in time direction */ + for (n = 0; n < nr_par; n++) + { + par[n] = ps_huff_dec(ld, t_huff); + } + } else { + /* coded in frequency direction */ + par[0] = ps_huff_dec(ld, f_huff); + + for (n = 1; n < nr_par; n++) + { + par[n] = ps_huff_dec(ld, f_huff); + } + } +} + +/* binary search huffman decoding */ +static INLINE int8_t ps_huff_dec(bitfile *ld, ps_huff_tab t_huff) +{ + uint8_t bit; + int16_t index = 0; + + while (index >= 0) + { + bit = (uint8_t)faad_get1bit(ld); + index = t_huff[index][bit]; + } + + return index + 31; +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/ps_tables.h b/src/contrib/aacdecoder/libfaad/ps_tables.h new file mode 100755 index 000000000..f3370be9d --- /dev/null +++ b/src/contrib/aacdecoder/libfaad/ps_tables.h @@ -0,0 +1,550 @@ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ps_tables.h,v 1.8 2007/11/01 12:33:33 menno Exp $ +**/ + +#ifndef __PS_TABLES_H__ +#define __PS_TABLES_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + +#if 0 +#if 0 +float f_center_20[12] = { + 0.5/4, 1.5/4, 2.5/4, 3.5/4, + 4.5/4*0, 5.5/4*0, -1.5/4, -0.5/4, + 3.5/2, 2.5/2, 4.5/2, 5.5/2 +}; +#else +float f_center_20[12] = { + 0.5/8, 1.5/8, 2.5/8, 3.5/8, + 4.5/8*0, 5.5/8*0, -1.5/8, -0.5/8, + 3.5/4, 2.5/4, 4.5/4, 5.5/4 +}; +#endif + +float f_center_34[32] = { + 1/12, 3/12, 5/12, 7/12, + 9/12, 11/12, 13/12, 15/12, + 17/12, -5/12, -3/12, -1/12, + 17/8, 19/8, 5/8, 7/8, + 9/8, 11/8, 13/8, 15/8, + 9/4, 11/4, 13/4, 7/4, + 17/4, 11/4, 13/4, 15/4, + 17/4, 19/4, 21/4, 15/4 +}; + +static const real_t frac_delay_q[] = { + FRAC_CONST(0.43), + FRAC_CONST(0.75), + FRAC_CONST(0.347) +}; +#endif + +/* RE(ps->Phi_Fract_Qmf[j]) = (float)cos(M_PI*(j+0.5)*(0.39)); */ +/* IM(ps->Phi_Fract_Qmf[j]) = (float)sin(M_PI*(j+0.5)*(0.39)); */ +static const complex_t Phi_Fract_Qmf[] = { + { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, + { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, + { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, + { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, + { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, + { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, + { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, + { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, + { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, + { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, + { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, + { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, + { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, + { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, + { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, + { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, + { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, + { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, + { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, + { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, + { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, + { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, + { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, + { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, + { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, + { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, + { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, + { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, + { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, + { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, + { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, + { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, + { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, + { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, + { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, + { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, + { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, + { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, + { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, + { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, + { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, + { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, + { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, + { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, + { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, + { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, + { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, + { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, + { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, + { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, + { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, + { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, + { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, + { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, + { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, + { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, + { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, + { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, + { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, + { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, + { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, + { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, + { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, + { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } +}; + +/* RE(Phi_Fract_SubQmf20[j]) = (float)cos(M_PI*f_center_20[j]*0.39); */ +/* IM(Phi_Fract_SubQmf20[j]) = (float)sin(M_PI*f_center_20[j]*0.39); */ +static const complex_t Phi_Fract_SubQmf20[] = { + { FRAC_CONST(0.9882950187), FRAC_CONST(0.1525546312) }, + { FRAC_CONST(0.8962930441), FRAC_CONST(0.4434623122) }, + { FRAC_CONST(0.7208535671), FRAC_CONST(0.6930873394) }, + { FRAC_CONST(0.4783087075), FRAC_CONST(0.8781917691) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(0.8962930441), FRAC_CONST(-0.4434623122) }, + { FRAC_CONST(0.9882950187), FRAC_CONST(-0.1525546312) }, + { FRAC_CONST(-0.5424415469), FRAC_CONST(0.8400935531) }, + { FRAC_CONST(0.0392598175), FRAC_CONST(0.9992290139) }, + { FRAC_CONST(-0.9268565774), FRAC_CONST(0.3754155636) }, + { FRAC_CONST(-0.9741733670), FRAC_CONST(-0.2258012742) } +}; + +/* RE(Phi_Fract_SubQmf34[j]) = (float)cos(M_PI*f_center_34[j]*0.39); */ +/* IM(Phi_Fract_SubQmf34[j]) = (float)sin(M_PI*f_center_34[j]*0.39); */ +static const complex_t Phi_Fract_SubQmf34[] = { + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, + { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, + { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, + { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, + { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, + { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, + { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, + { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, + { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, + { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, + { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, + { FRAC_CONST(0.9876883626), FRAC_CONST(-0.1564344615) }, + { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) } +}; + +/* RE(Q_Fract_allpass_Qmf[j][i]) = (float)cos(M_PI*(j+0.5)*(frac_delay_q[i])); */ +/* IM(Q_Fract_allpass_Qmf[j][i]) = (float)sin(M_PI*(j+0.5)*(frac_delay_q[i])); */ +static const complex_t Q_Fract_allpass_Qmf[][3] = { + { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, + { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, + { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, + { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, + { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, + { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, + { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, + { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, + { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, + { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, + { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, + { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, + { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, + { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, + { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, + { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, + { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, + { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, + { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, + { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, + { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, + { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, + { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, + { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, + { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, + { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, + { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, + { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, + { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, + { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, + { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, + { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, + { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, + { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, + { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, + { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, + { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, + { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, + { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, + { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, + { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, + { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, + { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, + { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, + { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, + { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, + { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, + { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, + { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, + { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, + { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, + { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, + { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, + { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, + { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, + { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, + { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, + { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, + { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, + { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, + { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, + { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, + { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, + { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } +}; + +/* RE(Q_Fract_allpass_SubQmf20[j][i]) = (float)cos(M_PI*f_center_20[j]*frac_delay_q[i]); */ +/* IM(Q_Fract_allpass_SubQmf20[j][i]) = (float)sin(M_PI*f_center_20[j]*frac_delay_q[i]); */ +static const complex_t Q_Fract_allpass_SubQmf20[][3] = { + { { FRAC_CONST(0.9857769012), FRAC_CONST(0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(0.1358452588) } }, + { { FRAC_CONST(0.8744080663), FRAC_CONST(0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(0.3975082636) } }, + { { FRAC_CONST(0.6642524004), FRAC_CONST(0.7475083470) }, { FRAC_CONST(0.0980171412), FRAC_CONST(0.9951847196) }, { FRAC_CONST(0.7767338753), FRAC_CONST(0.6298289299) } }, + { { FRAC_CONST(0.3790524006), FRAC_CONST(0.9253752232) }, { FRAC_CONST(-0.4713967443), FRAC_CONST(0.8819212914) }, { FRAC_CONST(0.5785340071), FRAC_CONST(0.8156582713) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(0.8744080663), FRAC_CONST(-0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(-0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(-0.3975082636) } }, + { { FRAC_CONST(0.9857769012), FRAC_CONST(-0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(-0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(-0.1358452588) } }, + { { FRAC_CONST(-0.7126385570), FRAC_CONST(0.7015314102) }, { FRAC_CONST(-0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.3305967748), FRAC_CONST(0.9437720776) } }, + { { FRAC_CONST(-0.1175374240), FRAC_CONST(0.9930684566) }, { FRAC_CONST(-0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(0.2066311091), FRAC_CONST(0.9784189463) } }, + { { FRAC_CONST(-0.9947921634), FRAC_CONST(0.1019244045) }, { FRAC_CONST(0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.7720130086), FRAC_CONST(0.6356067061) } }, + { { FRAC_CONST(-0.8400934935), FRAC_CONST(-0.5424416065) }, { FRAC_CONST(0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(-0.9896889329), FRAC_CONST(0.1432335079) } } +}; + +/* RE(Q_Fract_allpass_SubQmf34[j][i]) = (float)cos(M_PI*f_center_34[j]*frac_delay_q[i]); */ +/* IM(Q_Fract_allpass_SubQmf34[j][i]) = (float)sin(M_PI*f_center_34[j]*frac_delay_q[i]); */ +static const complex_t Q_Fract_allpass_SubQmf34[][3] = { + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, + { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, + { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, + { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, + { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, + { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, + { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, + { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, + { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, + { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, + { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, + { { FRAC_CONST(0.8910064697), FRAC_CONST(0.4539906085) }, { FRAC_CONST(0.7071067691), FRAC_CONST(-0.7071067691) }, { FRAC_CONST(0.6730125546), FRAC_CONST(-0.7396310568) } }, + { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } } +}; + +#if 0 +static float quant_rho[8] = +{ + FRAC_CONST(1.0), FRAC_CONST(0.937), FRAC_CONST(0.84118), FRAC_CONST(0.60092), + FRAC_CONST(0.36764), FRAC_CONST(0.0), FRAC_CONST(-0.589), FRAC_CONST(-1.0) +}; + +static const uint8_t quant_iid_normal[7] = +{ + 2, 4, 7, 10, 14, 18, 25 +}; + +static const uint8_t quant_iid_fine[15] = +{ + 2, 4, 6, 8, 10, 13, 16, 19, 22, 25, 30, 35, 40, 45, 50 +}; +#endif + +static const real_t cos_alphas[] = { + COEF_CONST(1.0000000000), COEF_CONST(0.9841239700), COEF_CONST(0.9594738210), + COEF_CONST(0.8946843079), COEF_CONST(0.8269340931), COEF_CONST(0.7071067812), + COEF_CONST(0.4533210856), COEF_CONST(0.0000000000) +}; + +static const real_t sin_alphas[] = { + COEF_CONST(0.0000000000), COEF_CONST(0.1774824264), COEF_CONST(0.2817977763), + COEF_CONST(0.4466989918), COEF_CONST(0.5622988580), COEF_CONST(0.7071067812), + COEF_CONST(0.8913472911), COEF_CONST(1.0000000000) +}; + +static const real_t cos_betas_normal[][8] = { + { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9959398908), COEF_CONST(0.9896038018), COEF_CONST(0.9727589768), COEF_CONST(0.9548355329), COEF_CONST(0.9223070404), COEF_CONST(0.8494349490), COEF_CONST(0.7013005535) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9902068095), COEF_CONST(0.9749613872), COEF_CONST(0.9346538534), COEF_CONST(0.8921231300), COEF_CONST(0.8158851259), COEF_CONST(0.6495964302), COEF_CONST(0.3313370772) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9880510933), COEF_CONST(0.9694670261), COEF_CONST(0.9204347876), COEF_CONST(0.8688622825), COEF_CONST(0.7768516704), COEF_CONST(0.5782161800), COEF_CONST(0.2069970356) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) } +}; + +static const real_t sin_betas_normal[][8] = { + { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0900207420), COEF_CONST(-0.1438204281), COEF_CONST(-0.2318188366), COEF_CONST(-0.2971348264), COEF_CONST(-0.3864579191), COEF_CONST(-0.5276933461), COEF_CONST(-0.7128657193) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1396082894), COEF_CONST(-0.2223742196), COEF_CONST(-0.3555589603), COEF_CONST(-0.4517923427), COEF_CONST(-0.5782140273), COEF_CONST(-0.7602792104), COEF_CONST(-0.9435124489) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1541266914), COEF_CONST(-0.2452217065), COEF_CONST(-0.3908961522), COEF_CONST(-0.4950538699), COEF_CONST(-0.6296836366), COEF_CONST(-0.8158836002), COEF_CONST(-0.9783415698) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) } +}; + +static const real_t cos_betas_fine[][8] = { + { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9968361371), COEF_CONST(0.9918968104), COEF_CONST(0.9787540479), COEF_CONST(0.9647515190), COEF_CONST(0.9392903010), COEF_CONST(0.8820167114), COEF_CONST(0.7645325390) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9950262915), COEF_CONST(0.9872675041), COEF_CONST(0.9666584578), COEF_CONST(0.9447588606), COEF_CONST(0.9050918405), COEF_CONST(0.8165997379), COEF_CONST(0.6383824796) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9908827998), COEF_CONST(0.9766855904), COEF_CONST(0.9391249214), COEF_CONST(0.8994531782), COEF_CONST(0.8282352693), COEF_CONST(0.6723983174), COEF_CONST(0.3719473225) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9890240165), COEF_CONST(0.9719459866), COEF_CONST(0.9268448110), COEF_CONST(0.8793388536), COEF_CONST(0.7944023271), COEF_CONST(0.6101812098), COEF_CONST(0.2621501145) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9876350461), COEF_CONST(0.9684073447), COEF_CONST(0.9176973944), COEF_CONST(0.8643930070), COEF_CONST(0.7693796058), COEF_CONST(0.5646720713), COEF_CONST(0.1838899556) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9866247085), COEF_CONST(0.9658349704), COEF_CONST(0.9110590761), COEF_CONST(0.8535668048), COEF_CONST(0.7513165426), COEF_CONST(0.5320914819), COEF_CONST(0.1289530943) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9851245614), COEF_CONST(0.9620180268), COEF_CONST(0.9012265590), COEF_CONST(0.8375623272), COEF_CONST(0.7247108045), COEF_CONST(0.4845204297), COEF_CONST(0.0504115003) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9846869856), COEF_CONST(0.9609052357), COEF_CONST(0.8983639533), COEF_CONST(0.8329098386), COEF_CONST(0.7169983441), COEF_CONST(0.4708245354), COEF_CONST(0.0281732509) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9844406325), COEF_CONST(0.9602788522), COEF_CONST(0.8967533934), COEF_CONST(0.8302936455), COEF_CONST(0.7126658102), COEF_CONST(0.4631492839), COEF_CONST(0.0157851140) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9843020502), COEF_CONST(0.9599265269), COEF_CONST(0.8958477331), COEF_CONST(0.8288229094), COEF_CONST(0.7102315840), COEF_CONST(0.4588429315), COEF_CONST(0.0088578059) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9842241136), COEF_CONST(0.9597283916), COEF_CONST(0.8953385094), COEF_CONST(0.8279961409), COEF_CONST(0.7088635748), COEF_CONST(0.4564246834), COEF_CONST(0.0049751355) } +}; + +static const real_t sin_betas_fine[][8] = { + { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0794840594), COEF_CONST(-0.1270461238), COEF_CONST(-0.2050378347), COEF_CONST(-0.2631625097), COEF_CONST(-0.3431234916), COEF_CONST(-0.4712181245), COEF_CONST(-0.6445851354) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.0996126459), COEF_CONST(-0.1590687758), COEF_CONST(-0.2560691819), COEF_CONST(-0.3277662204), COEF_CONST(-0.4252161335), COEF_CONST(-0.5772043556), COEF_CONST(-0.7697193058) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1347266752), COEF_CONST(-0.2146747714), COEF_CONST(-0.3435758752), COEF_CONST(-0.4370171396), COEF_CONST(-0.5603805303), COEF_CONST(-0.7401895046), COEF_CONST(-0.9282538388) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1477548470), COEF_CONST(-0.2352041647), COEF_CONST(-0.3754446647), COEF_CONST(-0.4761965776), COEF_CONST(-0.6073919186), COEF_CONST(-0.7922618830), COEF_CONST(-0.9650271071) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1567705832), COEF_CONST(-0.2493736450), COEF_CONST(-0.3972801182), COEF_CONST(-0.5028167951), COEF_CONST(-0.6387918458), COEF_CONST(-0.8253153651), COEF_CONST(-0.9829468369) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1630082348), COEF_CONST(-0.2591578860), COEF_CONST(-0.4122758299), COEF_CONST(-0.5209834064), COEF_CONST(-0.6599420072), COEF_CONST(-0.8466868694), COEF_CONST(-0.9916506943) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1718417832), COEF_CONST(-0.2729859267), COEF_CONST(-0.4333482310), COEF_CONST(-0.5463417868), COEF_CONST(-0.6890531546), COEF_CONST(-0.8747799456), COEF_CONST(-0.9987285320) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1743316967), COEF_CONST(-0.2768774604), COEF_CONST(-0.4392518725), COEF_CONST(-0.5534087104), COEF_CONST(-0.6970748701), COEF_CONST(-0.8822268738), COEF_CONST(-0.9996030552) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1757175038), COEF_CONST(-0.2790421580), COEF_CONST(-0.4425306221), COEF_CONST(-0.5573261722), COEF_CONST(-0.7015037013), COEF_CONST(-0.8862802834), COEF_CONST(-0.9998754073) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1764921355), COEF_CONST(-0.2802517850), COEF_CONST(-0.4443611583), COEF_CONST(-0.5595110229), COEF_CONST(-0.7039681080), COEF_CONST(-0.8885173967), COEF_CONST(-0.9999607689) }, + { COEF_CONST(0.0000000000), COEF_CONST(-0.1769262394), COEF_CONST(-0.2809295540), COEF_CONST(-0.4453862969), COEF_CONST(-0.5607337966), COEF_CONST(-0.7053456119), COEF_CONST(-0.8897620516), COEF_CONST(-0.9999876239) } +}; + +static const real_t sincos_alphas_B_normal[][8] = { + { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, + { COEF_CONST(0.1249065138), COEF_CONST(0.1173697697), COEF_CONST(0.1057888284), COEF_CONST(0.0761985131), COEF_CONST(0.0468732723), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103) }, + { COEF_CONST(0.1956693050), COEF_CONST(0.1846090179), COEF_CONST(0.1673645109), COEF_CONST(0.1220621836), COEF_CONST(0.0757362479), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630) }, + { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, + { COEF_CONST(0.4078449476), COEF_CONST(0.3929852420), COEF_CONST(0.3680589270), COEF_CONST(0.2911029124), COEF_CONST(0.1934512363), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716) }, + { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, + { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, + { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, + { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, + { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, + { COEF_CONST(0.9130511848), COEF_CONST(0.9195447612), COEF_CONST(0.9298024282), COEF_CONST(0.9566917233), COEF_CONST(0.9811098801), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928) }, + { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, + { COEF_CONST(0.9806699215), COEF_CONST(0.9828120260), COEF_CONST(0.9858950861), COEF_CONST(0.9925224431), COEF_CONST(0.9971278825), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406) }, + { COEF_CONST(0.9921685024), COEF_CONST(0.9930882705), COEF_CONST(0.9943886135), COEF_CONST(0.9970926648), COEF_CONST(0.9989008403), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479) }, + { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) } +}; + +static const real_t sincos_alphas_B_fine[][8] = { + { COEF_CONST(0.0031622158), COEF_CONST(0.0029630181), COEF_CONST(0.0026599892), COEF_CONST(0.0019002704), COEF_CONST(0.0011626042), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278) }, + { COEF_CONST(0.0056232673), COEF_CONST(0.0052689825), COEF_CONST(0.0047302825), COEF_CONST(0.0033791756), COEF_CONST(0.0020674015), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710) }, + { COEF_CONST(0.0099994225), COEF_CONST(0.0093696693), COEF_CONST(0.0084117414), COEF_CONST(0.0060093796), COEF_CONST(0.0036766009), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392) }, + { COEF_CONST(0.0177799194), COEF_CONST(0.0166607102), COEF_CONST(0.0149581377), COEF_CONST(0.0106875809), COEF_CONST(0.0065392545), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767) }, + { COEF_CONST(0.0316069684), COEF_CONST(0.0296211579), COEF_CONST(0.0265987295), COEF_CONST(0.0190113813), COEF_CONST(0.0116349973), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974) }, + { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, + { COEF_CONST(0.0791834041), COEF_CONST(0.0742798103), COEF_CONST(0.0667907269), COEF_CONST(0.0478705292), COEF_CONST(0.0293500747), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755) }, + { COEF_CONST(0.1115021177), COEF_CONST(0.1047141985), COEF_CONST(0.0943053154), COEF_CONST(0.0678120561), COEF_CONST(0.0416669150), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213) }, + { COEF_CONST(0.1565355066), COEF_CONST(0.1473258371), COEF_CONST(0.1330924027), COEF_CONST(0.0963282233), COEF_CONST(0.0594509113), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946) }, + { COEF_CONST(0.2184643682), COEF_CONST(0.2064579524), COEF_CONST(0.1876265439), COEF_CONST(0.1375744167), COEF_CONST(0.0856896681), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338) }, + { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, + { COEF_CONST(0.3698741335), COEF_CONST(0.3547727297), COEF_CONST(0.3298252076), COEF_CONST(0.2556265829), COEF_CONST(0.1665990017), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541) }, + { COEF_CONST(0.4480623975), COEF_CONST(0.4339410024), COEF_CONST(0.4098613774), COEF_CONST(0.3322709108), COEF_CONST(0.2266784729), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131) }, + { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, + { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, + { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, + { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, + { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, + { COEF_CONST(0.8940022267), COEF_CONST(0.9009412572), COEF_CONST(0.9121477564), COEF_CONST(0.9431839770), COEF_CONST(0.9739696219), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480) }, + { COEF_CONST(0.9290818561), COEF_CONST(0.9349525662), COEF_CONST(0.9440420138), COEF_CONST(0.9667755833), COEF_CONST(0.9860247275), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664) }, + { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, + { COEF_CONST(0.9758449068), COEF_CONST(0.9784554646), COEF_CONST(0.9822404252), COEF_CONST(0.9904914275), COEF_CONST(0.9963218730), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926) }, + { COEF_CONST(0.9876723320), COEF_CONST(0.9890880155), COEF_CONST(0.9911036356), COEF_CONST(0.9953496173), COEF_CONST(0.9982312259), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685) }, + { COEF_CONST(0.9937641889), COEF_CONST(0.9945023501), COEF_CONST(0.9955433130), COEF_CONST(0.9976981117), COEF_CONST(0.9991315558), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610) }, + { COEF_CONST(0.9968600642), COEF_CONST(0.9972374385), COEF_CONST(0.9977670024), COEF_CONST(0.9988535464), COEF_CONST(0.9995691924), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129) }, + { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) }, + { COEF_CONST(0.9995003746), COEF_CONST(0.9995611974), COEF_CONST(0.9996461891), COEF_CONST(0.9998192657), COEF_CONST(0.9999323103), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475) }, + { COEF_CONST(0.9998419236), COEF_CONST(0.9998611991), COEF_CONST(0.9998881193), COEF_CONST(0.9999428861), COEF_CONST(0.9999786185), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045) }, + { COEF_CONST(0.9999500038), COEF_CONST(0.9999561034), COEF_CONST(0.9999646206), COEF_CONST(0.9999819429), COEF_CONST(0.9999932409), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750) }, + { COEF_CONST(0.9999841890), COEF_CONST(0.9999861183), COEF_CONST(0.9999888121), COEF_CONST(0.9999942902), COEF_CONST(0.9999978628), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605) }, + { COEF_CONST(0.9999950000), COEF_CONST(0.9999956102), COEF_CONST(0.9999964621), COEF_CONST(0.9999981945), COEF_CONST(0.9999993242), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875) } +}; + +static const real_t cos_gammas_normal[][8] = { + { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9913533967), COEF_CONST(0.9786000177), COEF_CONST(0.9496063381), COEF_CONST(0.9277157252), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9977406278), COEF_CONST(0.9945423840), COEF_CONST(0.9878736667), COEF_CONST(0.9833980494), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9990607067), COEF_CONST(0.9977417734), COEF_CONST(0.9950323970), COEF_CONST(0.9932453273), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) } +}; + +static const real_t cos_gammas_fine[][8] = { + { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9899597309), COEF_CONST(0.9750098690), COEF_CONST(0.9402333855), COEF_CONST(0.9129698759), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9926607607), COEF_CONST(0.9819295710), COEF_CONST(0.9580160104), COEF_CONST(0.9404993670), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9972074644), COEF_CONST(0.9932414270), COEF_CONST(0.9849197629), COEF_CONST(0.9792926592), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9985361982), COEF_CONST(0.9964742028), COEF_CONST(0.9922136306), COEF_CONST(0.9893845420), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9992494366), COEF_CONST(0.9981967170), COEF_CONST(0.9960386625), COEF_CONST(0.9946185834), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9996194722), COEF_CONST(0.9990869422), COEF_CONST(0.9979996269), COEF_CONST(0.9972873651), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9999390971), COEF_CONST(0.9998540271), COEF_CONST(0.9996809352), COEF_CONST(0.9995679735), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9999807170), COEF_CONST(0.9999537862), COEF_CONST(0.9998990191), COEF_CONST(0.9998632947), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9999938979), COEF_CONST(0.9999853814), COEF_CONST(0.9999680568), COEF_CONST(0.9999567596), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9999980703), COEF_CONST(0.9999953731), COEF_CONST(0.9999898968), COEF_CONST(0.9999863277), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265) }, + { COEF_CONST(1.0000000000), COEF_CONST(0.9999993891), COEF_CONST(0.9999985397), COEF_CONST(0.9999968037), COEF_CONST(0.9999956786), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155) } +}; + +static const real_t sin_gammas_normal[][8] = { + { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1312190642), COEF_CONST(0.2057717310), COEF_CONST(0.3134450552), COEF_CONST(0.3732874674), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0671836269), COEF_CONST(0.1043333428), COEF_CONST(0.1552598422), COEF_CONST(0.1814615013), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0433324862), COEF_CONST(0.0671666110), COEF_CONST(0.0995516398), COEF_CONST(0.1160332699), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) } +}; + +static const real_t sin_gammas_fine[][8] = { + { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1413496768), COEF_CONST(0.2221615526), COEF_CONST(0.3405307340), COEF_CONST(0.4080269669), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1209322714), COEF_CONST(0.1892467110), COEF_CONST(0.2867147079), COEF_CONST(0.3397954394), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0746811420), COEF_CONST(0.1160666523), COEF_CONST(0.1730117353), COEF_CONST(0.2024497161), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0540875291), COEF_CONST(0.0838997203), COEF_CONST(0.1245476266), COEF_CONST(0.1453211203), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0387371058), COEF_CONST(0.0600276114), COEF_CONST(0.0889212171), COEF_CONST(0.1036044086), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0275846110), COEF_CONST(0.0427233177), COEF_CONST(0.0632198125), COEF_CONST(0.0736064637), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0110363955), COEF_CONST(0.0170857974), COEF_CONST(0.0252592108), COEF_CONST(0.0293916021), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0062101284), COEF_CONST(0.0096138203), COEF_CONST(0.0142109649), COEF_CONST(0.0165345659), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0034934509), COEF_CONST(0.0054071189), COEF_CONST(0.0079928316), COEF_CONST(0.0092994041), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0019645397), COEF_CONST(0.0030419905), COEF_CONST(0.0044951511), COEF_CONST(0.0052291853), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498) }, + { COEF_CONST(0.0000000000), COEF_CONST(0.0011053943), COEF_CONST(0.0017089869), COEF_CONST(0.0025283670), COEF_CONST(0.0029398552), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685) } +}; + +static const real_t sf_iid_normal[] = { + COEF_CONST(1.4119827747), COEF_CONST(1.4031381607), COEF_CONST(1.3868767023), + COEF_CONST(1.3483997583), COEF_CONST(1.2912493944), COEF_CONST(1.1960374117), + COEF_CONST(1.1073724031), COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), + COEF_CONST(0.7546485662), COEF_CONST(0.5767799020), COEF_CONST(0.4264014363), + COEF_CONST(0.2767182887), COEF_CONST(0.1766446233), COEF_CONST(0.0794016272) +}; + +static const real_t sf_iid_fine[] = { + COEF_CONST(1.4142065048), COEF_CONST(1.4141912460), COEF_CONST(1.4141428471), + COEF_CONST(1.4139900208), COEF_CONST(1.4135069847), COEF_CONST(1.4119827747), + COEF_CONST(1.4097729921), COEF_CONST(1.4053947926), COEF_CONST(1.3967796564), + COEF_CONST(1.3800530434), COEF_CONST(1.3483997583), COEF_CONST(1.3139201403), + COEF_CONST(1.2643101215), COEF_CONST(1.1960374117), COEF_CONST(1.1073724031), + COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), COEF_CONST(0.7546485662), + COEF_CONST(0.6336560845), COEF_CONST(0.5230810642), COEF_CONST(0.4264014363), + COEF_CONST(0.3089554012), COEF_CONST(0.2213746458), COEF_CONST(0.1576878875), + COEF_CONST(0.1119822487), COEF_CONST(0.0794016272), COEF_CONST(0.0446990170), + COEF_CONST(0.0251446925), COEF_CONST(0.0141414283), COEF_CONST(0.0079525812), + COEF_CONST(0.0044721137) +}; + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/pulse.c b/src/contrib/aacdecoder/libfaad/pulse.c old mode 100644 new mode 100755 index 55593eeb7..3dd973abf --- a/src/contrib/aacdecoder/libfaad/pulse.c +++ b/src/contrib/aacdecoder/libfaad/pulse.c @@ -1,55 +1,58 @@ -/* -** 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: pulse.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "pulse.h" - -uint8_t pulse_decode(ic_stream *ics, int16_t *spec_data, uint16_t framelen) -{ - uint8_t i; - uint16_t k; - pulse_info *pul = &(ics->pul); - - k = ics->swb_offset[pul->pulse_start_sfb]; - - for(i = 0; i <= pul->number_pulse; i++) { - k += pul->pulse_offset[i]; - - if (k >= framelen) - return 15; /* should not be possible */ - - if (spec_data[k] > 0) - spec_data[k] += pul->pulse_amp[i]; - else - spec_data[k] -= pul->pulse_amp[i]; - } - - return 0; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: pulse.c,v 1.21 2007/11/01 12:33:34 menno Exp $ +**/ +#include "common.h" +#include "structs.h" + +#include "syntax.h" +#include "pulse.h" + +uint8_t pulse_decode(ic_stream *ics, int16_t *spec_data, uint16_t framelen) +{ + uint8_t i; + uint16_t k; + pulse_info *pul = &(ics->pul); + + k = min(ics->swb_offset[pul->pulse_start_sfb], ics->swb_offset_max); + + for (i = 0; i <= pul->number_pulse; i++) + { + k += pul->pulse_offset[i]; + + if (k >= framelen) + return 15; /* should not be possible */ + + if (spec_data[k] > 0) + spec_data[k] += pul->pulse_amp[i]; + else + spec_data[k] -= pul->pulse_amp[i]; + } + + return 0; +} diff --git a/src/contrib/aacdecoder/libfaad/pulse.h b/src/contrib/aacdecoder/libfaad/pulse.h old mode 100644 new mode 100755 index e67f0af6c..f7676cd89 --- a/src/contrib/aacdecoder/libfaad/pulse.h +++ b/src/contrib/aacdecoder/libfaad/pulse.h @@ -1,40 +1,43 @@ -/* -** 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: pulse.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __PULSE_H__ -#define __PULSE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -uint8_t pulse_decode(ic_stream *ics, int16_t *spec_coef, uint16_t framelen); - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: pulse.h,v 1.20 2007/11/01 12:33:34 menno Exp $ +**/ + +#ifndef __PULSE_H__ +#define __PULSE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +uint8_t pulse_decode(ic_stream *ics, int16_t *spec_coef, uint16_t framelen); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/rvlc.c b/src/contrib/aacdecoder/libfaad/rvlc.c old mode 100644 new mode 100755 index ee797a2f0..73619c6d1 --- a/src/contrib/aacdecoder/libfaad/rvlc.c +++ b/src/contrib/aacdecoder/libfaad/rvlc.c @@ -1,530 +1,533 @@ -/* -** 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: rvlc.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* RVLC scalefactor decoding - * - * RVLC works like this: - * 1. Only symmetric huffman codewords are used - * 2. Total length of the scalefactor data is stored in the bitsream - * 3. Scalefactors are DPCM coded - * 4. Next to the starting value for DPCM the ending value is also stored - * - * With all this it is possible to read the scalefactor data from 2 sides. - * If there is a bit error in the scalefactor data it is possible to start - * decoding from the other end of the data, to find all but 1 scalefactor. - */ - -#include "common.h" -#include "structs.h" - -#include - -#include "syntax.h" -#include "bits.h" -#include "rvlc.h" - - -#ifdef ERROR_RESILIENCE - -//#define PRINT_RVLC - -/* static function declarations */ -static uint8_t rvlc_decode_sf_forward(ic_stream *ics, - bitfile *ld_sf, - bitfile *ld_esc, - uint8_t *is_used); -#if 0 -static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, - bitfile *ld_sf, - bitfile *ld_esc, - uint8_t is_used); -#endif -static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, - int8_t direction); -static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction); - - -uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld) -{ - uint8_t bits = 9; - - ics->sf_concealment = faad_get1bit(ld - DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment")); - ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain")); - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - bits = 11; - - /* the number of bits used for the huffman codewords */ - ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits - DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf")); - - if (ics->noise_used) - { - ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9 - DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg")); - - ics->length_of_rvlc_sf -= 9; - } - - ics->sf_escapes_present = faad_get1bit(ld - DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present")); - - if (ics->sf_escapes_present) - { - ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes")); - } - - if (ics->noise_used) - { - ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9 - DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position")); - } - - return 0; -} - -uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld) -{ - uint8_t result; - uint8_t intensity_used = 0; - uint8_t *rvlc_sf_buffer = NULL; - uint8_t *rvlc_esc_buffer = NULL; - bitfile ld_rvlc_sf, ld_rvlc_esc; -// bitfile ld_rvlc_sf_rev, ld_rvlc_esc_rev; - - if (ics->length_of_rvlc_sf > 0) - { - /* We read length_of_rvlc_sf bits here to put it in a - seperate bitfile. - */ - rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf - DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf")); - - faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf)); -// faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer, -// ics->length_of_rvlc_sf); - } - - if (ics->sf_escapes_present) - { - /* We read length_of_rvlc_escapes bits here to put it in a - seperate bitfile. - */ - rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes - DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes")); - - faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes)); -// faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer, -// ics->length_of_rvlc_escapes); - } - - /* decode the rvlc scale factors and escapes */ - result = rvlc_decode_sf_forward(ics, &ld_rvlc_sf, - &ld_rvlc_esc, &intensity_used); -// result = rvlc_decode_sf_reverse(ics, &ld_rvlc_sf_rev, -// &ld_rvlc_esc_rev, intensity_used); - - - if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer); - if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer); - - if (ics->length_of_rvlc_sf > 0) - faad_endbits(&ld_rvlc_sf); - if (ics->sf_escapes_present) - faad_endbits(&ld_rvlc_esc); - - return result; -} - -static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, - uint8_t *intensity_used) -{ - int8_t g, sfb; - int8_t t = 0; - int8_t error = 0; - int8_t noise_pcm_flag = 1; - - int16_t scale_factor = ics->global_gain; - int16_t is_position = 0; - int16_t noise_energy = ics->global_gain - 90 - 256; - -#ifdef PRINT_RVLC - printf("\nglobal_gain: %d\n", ics->global_gain); -#endif - - for (g = 0; g < ics->num_window_groups; g++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - if (error) - { - ics->scale_factors[g][sfb] = 0; - } else { - switch (ics->sfb_cb[g][sfb]) - { - case ZERO_HCB: /* zero book */ - ics->scale_factors[g][sfb] = 0; - break; - case INTENSITY_HCB: /* intensity books */ - case INTENSITY_HCB2: - - *intensity_used = 1; - - /* decode intensity position */ - t = rvlc_huffman_sf(ld_sf, ld_esc, +1); - - is_position += t; - ics->scale_factors[g][sfb] = is_position; - - break; - case NOISE_HCB: /* noise books */ - - /* decode noise energy */ - if (noise_pcm_flag) - { - int16_t n = ics->dpcm_noise_nrg; - noise_pcm_flag = 0; - noise_energy += n; - } else { - t = rvlc_huffman_sf(ld_sf, ld_esc, +1); - noise_energy += t; - } - - ics->scale_factors[g][sfb] = noise_energy; - - break; - default: /* spectral books */ - - /* decode scale factor */ - t = rvlc_huffman_sf(ld_sf, ld_esc, +1); - - scale_factor += t; - if (scale_factor < 0) - return 4; - - ics->scale_factors[g][sfb] = scale_factor; - - break; - } -#ifdef PRINT_RVLC - printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], - ics->scale_factors[g][sfb]); -#endif - if (t == 99) - { - error = 1; - } - } - } - } -#ifdef PRINT_RVLC - printf("\n\n"); -#endif - - return 0; -} - -#if 0 // not used right now, doesn't work correctly yet -static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, - uint8_t intensity_used) -{ - int8_t g, sfb; - int8_t t = 0; - int8_t error = 0; - int8_t noise_pcm_flag = 1, is_pcm_flag = 1, sf_pcm_flag = 1; - - int16_t scale_factor = ics->rev_global_gain; - int16_t is_position = 0; - int16_t noise_energy = ics->rev_global_gain; - -#ifdef PRINT_RVLC - printf("\nrev_global_gain: %d\n", ics->rev_global_gain); -#endif - - if (intensity_used) - { - is_position = rvlc_huffman_sf(ld_sf, ld_esc, -1); -#ifdef PRINT_RVLC - printf("is_position: %d\n", is_position); -#endif - } - - for (g = ics->num_window_groups-1; g >= 0; g--) - { - for (sfb = ics->max_sfb-1; sfb >= 0; sfb--) - { - if (error) - { - ics->scale_factors[g][sfb] = 0; - } else { - switch (ics->sfb_cb[g][sfb]) - { - case ZERO_HCB: /* zero book */ - ics->scale_factors[g][sfb] = 0; - break; - case INTENSITY_HCB: /* intensity books */ - case INTENSITY_HCB2: - - if (is_pcm_flag) - { - is_pcm_flag = 0; - ics->scale_factors[g][sfb] = is_position; - } else { - t = rvlc_huffman_sf(ld_sf, ld_esc, -1); - is_position -= t; - - ics->scale_factors[g][sfb] = (uint8_t)is_position; - } - break; - case NOISE_HCB: /* noise books */ - - /* decode noise energy */ - if (noise_pcm_flag) - { - noise_pcm_flag = 0; - noise_energy = ics->dpcm_noise_last_position; - } else { - t = rvlc_huffman_sf(ld_sf, ld_esc, -1); - noise_energy -= t; - } - - ics->scale_factors[g][sfb] = (uint8_t)noise_energy; - break; - default: /* spectral books */ - - if (sf_pcm_flag || (sfb == 0)) - { - sf_pcm_flag = 0; - if (sfb == 0) - scale_factor = ics->global_gain; - } else { - /* decode scale factor */ - t = rvlc_huffman_sf(ld_sf, ld_esc, -1); - scale_factor -= t; - } - - if (scale_factor < 0) - return 4; - - ics->scale_factors[g][sfb] = (uint8_t)scale_factor; - break; - } -#ifdef PRINT_RVLC - printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], - ics->scale_factors[g][sfb]); -#endif - if (t == 99) - { - error = 1; - } - } - } - } - -#ifdef PRINT_RVLC - printf("\n\n"); -#endif - - return 0; -} -#endif - -/* index == 99 means not allowed codeword */ -static rvlc_huff_table book_rvlc[] = { - /*index length codeword */ - { 0, 1, 0 }, /* 0 */ - { -1, 3, 5 }, /* 101 */ - { 1, 3, 7 }, /* 111 */ - { -2, 4, 9 }, /* 1001 */ - { -3, 5, 17 }, /* 10001 */ - { 2, 5, 27 }, /* 11011 */ - { -4, 6, 33 }, /* 100001 */ - { 99, 6, 50 }, /* 110010 */ - { 3, 6, 51 }, /* 110011 */ - { 99, 6, 52 }, /* 110100 */ - { -7, 7, 65 }, /* 1000001 */ - { 99, 7, 96 }, /* 1100000 */ - { 99, 7, 98 }, /* 1100010 */ - { 7, 7, 99 }, /* 1100011 */ - { 4, 7, 107 }, /* 1101011 */ - { -5, 8, 129 }, /* 10000001 */ - { 99, 8, 194 }, /* 11000010 */ - { 5, 8, 195 }, /* 11000011 */ - { 99, 8, 212 }, /* 11010100 */ - { 99, 9, 256 }, /* 100000000 */ - { -6, 9, 257 }, /* 100000001 */ - { 99, 9, 426 }, /* 110101010 */ - { 6, 9, 427 }, /* 110101011 */ - { 99, 10, 0 } /* Shouldn't come this far */ -}; - -static rvlc_huff_table book_escape[] = { - /*index length codeword */ - { 1, 2, 0 }, - { 0, 2, 2 }, - { 3, 3, 2 }, - { 2, 3, 6 }, - { 4, 4, 14 }, - { 7, 5, 13 }, - { 6, 5, 15 }, - { 5, 5, 31 }, - { 11, 6, 24 }, - { 10, 6, 25 }, - { 9, 6, 29 }, - { 8, 6, 61 }, - { 13, 7, 56 }, - { 12, 7, 120 }, - { 15, 8, 114 }, - { 14, 8, 242 }, - { 17, 9, 230 }, - { 16, 9, 486 }, - { 19, 10, 463 }, - { 18, 10, 974 }, - { 22, 11, 925 }, - { 20, 11, 1950 }, - { 21, 11, 1951 }, - { 23, 12, 1848 }, - { 25, 13, 3698 }, - { 24, 14, 7399 }, - { 26, 15, 14797 }, - { 49, 19, 236736 }, - { 50, 19, 236737 }, - { 51, 19, 236738 }, - { 52, 19, 236739 }, - { 53, 19, 236740 }, - { 27, 20, 473482 }, - { 28, 20, 473483 }, - { 29, 20, 473484 }, - { 30, 20, 473485 }, - { 31, 20, 473486 }, - { 32, 20, 473487 }, - { 33, 20, 473488 }, - { 34, 20, 473489 }, - { 35, 20, 473490 }, - { 36, 20, 473491 }, - { 37, 20, 473492 }, - { 38, 20, 473493 }, - { 39, 20, 473494 }, - { 40, 20, 473495 }, - { 41, 20, 473496 }, - { 42, 20, 473497 }, - { 43, 20, 473498 }, - { 44, 20, 473499 }, - { 45, 20, 473500 }, - { 46, 20, 473501 }, - { 47, 20, 473502 }, - { 48, 20, 473503 }, - { 99, 21, 0 } /* Shouldn't come this far */ -}; - -static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, - int8_t direction) -{ - uint8_t i, j; - int8_t index; - uint32_t cw; - rvlc_huff_table *h = book_rvlc; - - i = h->len; - if (direction > 0) - cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,"")); - else - cw = faad_getbits_rev(ld_sf, i DEBUGVAR(1,0,"")); - - while ((cw != h->cw) - && (i < 10)) - { - h++; - j = h->len-i; - i += j; - cw <<= j; - if (direction > 0) - cw |= faad_getbits(ld_sf, j DEBUGVAR(1,0,"")); - else - cw |= faad_getbits_rev(ld_sf, j DEBUGVAR(1,0,"")); - } - - index = h->index; - - if (index == +ESC_VAL) - { - int8_t esc = rvlc_huffman_esc(ld_esc, direction); - if (esc == 99) - return 99; - index += esc; -#ifdef PRINT_RVLC - printf("esc: %d - ", esc); -#endif - } - if (index == -ESC_VAL) - { - int8_t esc = rvlc_huffman_esc(ld_esc, direction); - if (esc == 99) - return 99; - index -= esc; -#ifdef PRINT_RVLC - printf("esc: %d - ", esc); -#endif - } - - return index; -} - -static int8_t rvlc_huffman_esc(bitfile *ld, - int8_t direction) -{ - uint8_t i, j; - uint32_t cw; - rvlc_huff_table *h = book_escape; - - i = h->len; - if (direction > 0) - cw = faad_getbits(ld, i DEBUGVAR(1,0,"")); - else - cw = faad_getbits_rev(ld, i DEBUGVAR(1,0,"")); - - while ((cw != h->cw) - && (i < 21)) - { - h++; - j = h->len-i; - i += j; - cw <<= j; - if (direction > 0) - cw |= faad_getbits(ld, j DEBUGVAR(1,0,"")); - else - cw |= faad_getbits_rev(ld, j DEBUGVAR(1,0,"")); - } - - return h->index; -} - -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: rvlc.c,v 1.21 2007/11/01 12:33:34 menno Exp $ +**/ + +/* RVLC scalefactor decoding + * + * RVLC works like this: + * 1. Only symmetric huffman codewords are used + * 2. Total length of the scalefactor data is stored in the bitsream + * 3. Scalefactors are DPCM coded + * 4. Next to the starting value for DPCM the ending value is also stored + * + * With all this it is possible to read the scalefactor data from 2 sides. + * If there is a bit error in the scalefactor data it is possible to start + * decoding from the other end of the data, to find all but 1 scalefactor. + */ + +#include "common.h" +#include "structs.h" + +#include + +#include "syntax.h" +#include "bits.h" +#include "rvlc.h" + + +#ifdef ERROR_RESILIENCE + +//#define PRINT_RVLC + +/* static function declarations */ +static uint8_t rvlc_decode_sf_forward(ic_stream *ics, + bitfile *ld_sf, + bitfile *ld_esc, + uint8_t *is_used); +#if 0 +static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, + bitfile *ld_sf, + bitfile *ld_esc, + uint8_t is_used); +#endif +static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, + int8_t direction); +static int8_t rvlc_huffman_esc(bitfile *ld_esc, int8_t direction); + + +uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld) +{ + uint8_t bits = 9; + + ics->sf_concealment = faad_get1bit(ld + DEBUGVAR(1,149,"rvlc_scale_factor_data(): sf_concealment")); + ics->rev_global_gain = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,150,"rvlc_scale_factor_data(): rev_global_gain")); + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + bits = 11; + + /* the number of bits used for the huffman codewords */ + ics->length_of_rvlc_sf = (uint16_t)faad_getbits(ld, bits + DEBUGVAR(1,151,"rvlc_scale_factor_data(): length_of_rvlc_sf")); + + if (ics->noise_used) + { + ics->dpcm_noise_nrg = (uint16_t)faad_getbits(ld, 9 + DEBUGVAR(1,152,"rvlc_scale_factor_data(): dpcm_noise_nrg")); + + ics->length_of_rvlc_sf -= 9; + } + + ics->sf_escapes_present = faad_get1bit(ld + DEBUGVAR(1,153,"rvlc_scale_factor_data(): sf_escapes_present")); + + if (ics->sf_escapes_present) + { + ics->length_of_rvlc_escapes = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,154,"rvlc_scale_factor_data(): length_of_rvlc_escapes")); + } + + if (ics->noise_used) + { + ics->dpcm_noise_last_position = (uint16_t)faad_getbits(ld, 9 + DEBUGVAR(1,155,"rvlc_scale_factor_data(): dpcm_noise_last_position")); + } + + return 0; +} + +uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld) +{ + uint8_t result; + uint8_t intensity_used = 0; + uint8_t *rvlc_sf_buffer = NULL; + uint8_t *rvlc_esc_buffer = NULL; + bitfile ld_rvlc_sf, ld_rvlc_esc; +// bitfile ld_rvlc_sf_rev, ld_rvlc_esc_rev; + + if (ics->length_of_rvlc_sf > 0) + { + /* We read length_of_rvlc_sf bits here to put it in a + seperate bitfile. + */ + rvlc_sf_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_sf + DEBUGVAR(1,156,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_sf")); + + faad_initbits(&ld_rvlc_sf, (void*)rvlc_sf_buffer, bit2byte(ics->length_of_rvlc_sf)); +// faad_initbits_rev(&ld_rvlc_sf_rev, (void*)rvlc_sf_buffer, +// ics->length_of_rvlc_sf); + } + + if (ics->sf_escapes_present) + { + /* We read length_of_rvlc_escapes bits here to put it in a + seperate bitfile. + */ + rvlc_esc_buffer = faad_getbitbuffer(ld, ics->length_of_rvlc_escapes + DEBUGVAR(1,157,"rvlc_decode_scale_factors(): bitbuffer: length_of_rvlc_escapes")); + + faad_initbits(&ld_rvlc_esc, (void*)rvlc_esc_buffer, bit2byte(ics->length_of_rvlc_escapes)); +// faad_initbits_rev(&ld_rvlc_esc_rev, (void*)rvlc_esc_buffer, +// ics->length_of_rvlc_escapes); + } + + /* decode the rvlc scale factors and escapes */ + result = rvlc_decode_sf_forward(ics, &ld_rvlc_sf, + &ld_rvlc_esc, &intensity_used); +// result = rvlc_decode_sf_reverse(ics, &ld_rvlc_sf_rev, +// &ld_rvlc_esc_rev, intensity_used); + + + if (rvlc_esc_buffer) faad_free(rvlc_esc_buffer); + if (rvlc_sf_buffer) faad_free(rvlc_sf_buffer); + + if (ics->length_of_rvlc_sf > 0) + faad_endbits(&ld_rvlc_sf); + if (ics->sf_escapes_present) + faad_endbits(&ld_rvlc_esc); + + return result; +} + +static uint8_t rvlc_decode_sf_forward(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, + uint8_t *intensity_used) +{ + int8_t g, sfb; + int8_t t = 0; + int8_t error = 0; + int8_t noise_pcm_flag = 1; + + int16_t scale_factor = ics->global_gain; + int16_t is_position = 0; + int16_t noise_energy = ics->global_gain - 90 - 256; + +#ifdef PRINT_RVLC + printf("\nglobal_gain: %d\n", ics->global_gain); +#endif + + for (g = 0; g < ics->num_window_groups; g++) + { + for (sfb = 0; sfb < ics->max_sfb; sfb++) + { + if (error) + { + ics->scale_factors[g][sfb] = 0; + } else { + switch (ics->sfb_cb[g][sfb]) + { + case ZERO_HCB: /* zero book */ + ics->scale_factors[g][sfb] = 0; + break; + case INTENSITY_HCB: /* intensity books */ + case INTENSITY_HCB2: + + *intensity_used = 1; + + /* decode intensity position */ + t = rvlc_huffman_sf(ld_sf, ld_esc, +1); + + is_position += t; + ics->scale_factors[g][sfb] = is_position; + + break; + case NOISE_HCB: /* noise books */ + + /* decode noise energy */ + if (noise_pcm_flag) + { + int16_t n = ics->dpcm_noise_nrg; + noise_pcm_flag = 0; + noise_energy += n; + } else { + t = rvlc_huffman_sf(ld_sf, ld_esc, +1); + noise_energy += t; + } + + ics->scale_factors[g][sfb] = noise_energy; + + break; + default: /* spectral books */ + + /* decode scale factor */ + t = rvlc_huffman_sf(ld_sf, ld_esc, +1); + + scale_factor += t; + if (scale_factor < 0) + return 4; + + ics->scale_factors[g][sfb] = scale_factor; + + break; + } +#ifdef PRINT_RVLC + printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], + ics->scale_factors[g][sfb]); +#endif + if (t == 99) + { + error = 1; + } + } + } + } +#ifdef PRINT_RVLC + printf("\n\n"); +#endif + + return 0; +} + +#if 0 // not used right now, doesn't work correctly yet +static uint8_t rvlc_decode_sf_reverse(ic_stream *ics, bitfile *ld_sf, bitfile *ld_esc, + uint8_t intensity_used) +{ + int8_t g, sfb; + int8_t t = 0; + int8_t error = 0; + int8_t noise_pcm_flag = 1, is_pcm_flag = 1, sf_pcm_flag = 1; + + int16_t scale_factor = ics->rev_global_gain; + int16_t is_position = 0; + int16_t noise_energy = ics->rev_global_gain; + +#ifdef PRINT_RVLC + printf("\nrev_global_gain: %d\n", ics->rev_global_gain); +#endif + + if (intensity_used) + { + is_position = rvlc_huffman_sf(ld_sf, ld_esc, -1); +#ifdef PRINT_RVLC + printf("is_position: %d\n", is_position); +#endif + } + + for (g = ics->num_window_groups-1; g >= 0; g--) + { + for (sfb = ics->max_sfb-1; sfb >= 0; sfb--) + { + if (error) + { + ics->scale_factors[g][sfb] = 0; + } else { + switch (ics->sfb_cb[g][sfb]) + { + case ZERO_HCB: /* zero book */ + ics->scale_factors[g][sfb] = 0; + break; + case INTENSITY_HCB: /* intensity books */ + case INTENSITY_HCB2: + + if (is_pcm_flag) + { + is_pcm_flag = 0; + ics->scale_factors[g][sfb] = is_position; + } else { + t = rvlc_huffman_sf(ld_sf, ld_esc, -1); + is_position -= t; + + ics->scale_factors[g][sfb] = (uint8_t)is_position; + } + break; + case NOISE_HCB: /* noise books */ + + /* decode noise energy */ + if (noise_pcm_flag) + { + noise_pcm_flag = 0; + noise_energy = ics->dpcm_noise_last_position; + } else { + t = rvlc_huffman_sf(ld_sf, ld_esc, -1); + noise_energy -= t; + } + + ics->scale_factors[g][sfb] = (uint8_t)noise_energy; + break; + default: /* spectral books */ + + if (sf_pcm_flag || (sfb == 0)) + { + sf_pcm_flag = 0; + if (sfb == 0) + scale_factor = ics->global_gain; + } else { + /* decode scale factor */ + t = rvlc_huffman_sf(ld_sf, ld_esc, -1); + scale_factor -= t; + } + + if (scale_factor < 0) + return 4; + + ics->scale_factors[g][sfb] = (uint8_t)scale_factor; + break; + } +#ifdef PRINT_RVLC + printf("%3d:%4d%4d\n", sfb, ics->sfb_cb[g][sfb], + ics->scale_factors[g][sfb]); +#endif + if (t == 99) + { + error = 1; + } + } + } + } + +#ifdef PRINT_RVLC + printf("\n\n"); +#endif + + return 0; +} +#endif + +/* index == 99 means not allowed codeword */ +static rvlc_huff_table book_rvlc[] = { + /*index length codeword */ + { 0, 1, 0 }, /* 0 */ + { -1, 3, 5 }, /* 101 */ + { 1, 3, 7 }, /* 111 */ + { -2, 4, 9 }, /* 1001 */ + { -3, 5, 17 }, /* 10001 */ + { 2, 5, 27 }, /* 11011 */ + { -4, 6, 33 }, /* 100001 */ + { 99, 6, 50 }, /* 110010 */ + { 3, 6, 51 }, /* 110011 */ + { 99, 6, 52 }, /* 110100 */ + { -7, 7, 65 }, /* 1000001 */ + { 99, 7, 96 }, /* 1100000 */ + { 99, 7, 98 }, /* 1100010 */ + { 7, 7, 99 }, /* 1100011 */ + { 4, 7, 107 }, /* 1101011 */ + { -5, 8, 129 }, /* 10000001 */ + { 99, 8, 194 }, /* 11000010 */ + { 5, 8, 195 }, /* 11000011 */ + { 99, 8, 212 }, /* 11010100 */ + { 99, 9, 256 }, /* 100000000 */ + { -6, 9, 257 }, /* 100000001 */ + { 99, 9, 426 }, /* 110101010 */ + { 6, 9, 427 }, /* 110101011 */ + { 99, 10, 0 } /* Shouldn't come this far */ +}; + +static rvlc_huff_table book_escape[] = { + /*index length codeword */ + { 1, 2, 0 }, + { 0, 2, 2 }, + { 3, 3, 2 }, + { 2, 3, 6 }, + { 4, 4, 14 }, + { 7, 5, 13 }, + { 6, 5, 15 }, + { 5, 5, 31 }, + { 11, 6, 24 }, + { 10, 6, 25 }, + { 9, 6, 29 }, + { 8, 6, 61 }, + { 13, 7, 56 }, + { 12, 7, 120 }, + { 15, 8, 114 }, + { 14, 8, 242 }, + { 17, 9, 230 }, + { 16, 9, 486 }, + { 19, 10, 463 }, + { 18, 10, 974 }, + { 22, 11, 925 }, + { 20, 11, 1950 }, + { 21, 11, 1951 }, + { 23, 12, 1848 }, + { 25, 13, 3698 }, + { 24, 14, 7399 }, + { 26, 15, 14797 }, + { 49, 19, 236736 }, + { 50, 19, 236737 }, + { 51, 19, 236738 }, + { 52, 19, 236739 }, + { 53, 19, 236740 }, + { 27, 20, 473482 }, + { 28, 20, 473483 }, + { 29, 20, 473484 }, + { 30, 20, 473485 }, + { 31, 20, 473486 }, + { 32, 20, 473487 }, + { 33, 20, 473488 }, + { 34, 20, 473489 }, + { 35, 20, 473490 }, + { 36, 20, 473491 }, + { 37, 20, 473492 }, + { 38, 20, 473493 }, + { 39, 20, 473494 }, + { 40, 20, 473495 }, + { 41, 20, 473496 }, + { 42, 20, 473497 }, + { 43, 20, 473498 }, + { 44, 20, 473499 }, + { 45, 20, 473500 }, + { 46, 20, 473501 }, + { 47, 20, 473502 }, + { 48, 20, 473503 }, + { 99, 21, 0 } /* Shouldn't come this far */ +}; + +static int8_t rvlc_huffman_sf(bitfile *ld_sf, bitfile *ld_esc, + int8_t direction) +{ + uint8_t i, j; + int8_t index; + uint32_t cw; + rvlc_huff_table *h = book_rvlc; + + i = h->len; + if (direction > 0) + cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,"")); + else + cw = faad_getbits_rev(ld_sf, i DEBUGVAR(1,0,"")); + + while ((cw != h->cw) + && (i < 10)) + { + h++; + j = h->len-i; + i += j; + cw <<= j; + if (direction > 0) + cw |= faad_getbits(ld_sf, j DEBUGVAR(1,0,"")); + else + cw |= faad_getbits_rev(ld_sf, j DEBUGVAR(1,0,"")); + } + + index = h->index; + + if (index == +ESC_VAL) + { + int8_t esc = rvlc_huffman_esc(ld_esc, direction); + if (esc == 99) + return 99; + index += esc; +#ifdef PRINT_RVLC + printf("esc: %d - ", esc); +#endif + } + if (index == -ESC_VAL) + { + int8_t esc = rvlc_huffman_esc(ld_esc, direction); + if (esc == 99) + return 99; + index -= esc; +#ifdef PRINT_RVLC + printf("esc: %d - ", esc); +#endif + } + + return index; +} + +static int8_t rvlc_huffman_esc(bitfile *ld, + int8_t direction) +{ + uint8_t i, j; + uint32_t cw; + rvlc_huff_table *h = book_escape; + + i = h->len; + if (direction > 0) + cw = faad_getbits(ld, i DEBUGVAR(1,0,"")); + else + cw = faad_getbits_rev(ld, i DEBUGVAR(1,0,"")); + + while ((cw != h->cw) + && (i < 21)) + { + h++; + j = h->len-i; + i += j; + cw <<= j; + if (direction > 0) + cw |= faad_getbits(ld, j DEBUGVAR(1,0,"")); + else + cw |= faad_getbits_rev(ld, j DEBUGVAR(1,0,"")); + } + + return h->index; +} + +#endif + diff --git a/src/contrib/aacdecoder/libfaad/rvlc.h b/src/contrib/aacdecoder/libfaad/rvlc.h old mode 100644 new mode 100755 index 457580b51..56f630fa4 --- a/src/contrib/aacdecoder/libfaad/rvlc.h +++ b/src/contrib/aacdecoder/libfaad/rvlc.h @@ -1,53 +1,56 @@ -/* -** 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: rvlc.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __RVLC_SCF_H__ -#define __RVLC_SCF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct -{ - int8_t index; - uint8_t len; - uint32_t cw; -} rvlc_huff_table; - - -#define ESC_VAL 7 - - -uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld); -uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld); - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: rvlc.h,v 1.17 2007/11/01 12:33:34 menno Exp $ +**/ + +#ifndef __RVLC_SCF_H__ +#define __RVLC_SCF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + int8_t index; + uint8_t len; + uint32_t cw; +} rvlc_huff_table; + + +#define ESC_VAL 7 + + +uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld); +uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_dct.c b/src/contrib/aacdecoder/libfaad/sbr_dct.c old mode 100644 new mode 100755 index cdf0ac7f4..16e7128ea --- a/src/contrib/aacdecoder/libfaad/sbr_dct.c +++ b/src/contrib/aacdecoder/libfaad/sbr_dct.c @@ -1,2811 +1,2279 @@ -/* -** 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: sbr_dct.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" - -#ifdef SBR_DEC - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - - -#include "sbr_dct.h" - -#ifdef SBR_LOW_POWER - -void DCT3_32_unscaled(real_t *y, real_t *x) -{ - real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; - real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; - real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; - real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; - real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; - real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; - real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; - real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; - real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; - real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; - real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; - real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; - real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; - real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; - real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; - real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; - real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; - real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; - real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; - real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; - real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; - real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; - real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; - real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; - real_t f271, f272; - - f0 = MUL_C(COEF_CONST(0.7071067811865476), x[16]); - f1 = x[0] - f0; - f2 = x[0] + f0; - f3 = x[8] + x[24]; - f4 = MUL_C(COEF_CONST(1.3065629648763766), x[8]); - f5 = MUL_C(COEF_CONST((-0.9238795325112866)), f3); - f6 = MUL_C(COEF_CONST((-0.5411961001461967)), x[24]); - f7 = f4 + f5; - f8 = f6 - f5; - f9 = f2 - f8; - f10 = f2 + f8; - f11 = f1 - f7; - f12 = f1 + f7; - f13 = x[4] + x[28]; - f14 = MUL_C(COEF_CONST(1.1758756024193588), x[4]); - f15 = MUL_C(COEF_CONST((-0.9807852804032304)), f13); - f16 = MUL_C(COEF_CONST((-0.7856949583871021)), x[28]); - f17 = f14 + f15; - f18 = f16 - f15; - f19 = x[12] + x[20]; - f20 = MUL_C(COEF_CONST(1.3870398453221473), x[12]); - f21 = MUL_C(COEF_CONST((-0.8314696123025455)), f19); - f22 = MUL_C(COEF_CONST((-0.2758993792829436)), x[20]); - f23 = f20 + f21; - f24 = f22 - f21; - f25 = f18 - f24; - f26 = f18 + f24; - f27 = MUL_C(COEF_CONST(0.7071067811865476), f25); - f28 = f17 - f23; - f29 = f17 + f23; - f30 = MUL_C(COEF_CONST(0.7071067811865476), f29); - f31 = f27 - f30; - f32 = f27 + f30; - f33 = f10 - f26; - f34 = f10 + f26; - f35 = f12 - f32; - f36 = f12 + f32; - f37 = f11 - f31; - f38 = f11 + f31; - f39 = f9 - f28; - f40 = f9 + f28; - f41 = x[2] + x[30]; - f42 = MUL_C(COEF_CONST(1.0932018670017569), x[2]); - f43 = MUL_C(COEF_CONST((-0.9951847266721969)), f41); - f44 = MUL_C(COEF_CONST((-0.8971675863426368)), x[30]); - f45 = f42 + f43; - f46 = f44 - f43; - f47 = x[6] + x[26]; - f48 = MUL_C(COEF_CONST(1.2472250129866711), x[6]); - f49 = MUL_C(COEF_CONST((-0.9569403357322089)), f47); - f50 = MUL_C(COEF_CONST((-0.6666556584777469)), x[26]); - f51 = f48 + f49; - f52 = f50 - f49; - f53 = x[10] + x[22]; - f54 = MUL_C(COEF_CONST(1.3533180011743526), x[10]); - f55 = MUL_C(COEF_CONST((-0.8819212643483551)), f53); - f56 = MUL_C(COEF_CONST((-0.4105245275223575)), x[22]); - f57 = f54 + f55; - f58 = f56 - f55; - f59 = x[14] + x[18]; - f60 = MUL_C(COEF_CONST(1.4074037375263826), x[14]); - f61 = MUL_C(COEF_CONST((-0.7730104533627369)), f59); - f62 = MUL_C(COEF_CONST((-0.1386171691990913)), x[18]); - f63 = f60 + f61; - f64 = f62 - f61; - f65 = f46 - f64; - f66 = f46 + f64; - f67 = f52 - f58; - f68 = f52 + f58; - f69 = f66 - f68; - f70 = f66 + f68; - f71 = MUL_C(COEF_CONST(0.7071067811865476), f69); - f72 = f65 + f67; - f73 = MUL_C(COEF_CONST(1.3065629648763766), f65); - f74 = MUL_C(COEF_CONST((-0.9238795325112866)), f72); - f75 = MUL_C(COEF_CONST((-0.5411961001461967)), f67); - f76 = f73 + f74; - f77 = f75 - f74; - f78 = f45 - f63; - f79 = f45 + f63; - f80 = f51 - f57; - f81 = f51 + f57; - f82 = f79 + f81; - f83 = MUL_C(COEF_CONST(1.3065629648763770), f79); - f84 = MUL_C(COEF_CONST((-0.3826834323650904)), f82); - f85 = MUL_C(COEF_CONST(0.5411961001461961), f81); - f86 = f83 + f84; - f87 = f85 - f84; - f88 = f78 - f80; - f89 = f78 + f80; - f90 = MUL_C(COEF_CONST(0.7071067811865476), f89); - f91 = f77 - f87; - f92 = f77 + f87; - f93 = f71 - f90; - f94 = f71 + f90; - f95 = f76 - f86; - f96 = f76 + f86; - f97 = f34 - f70; - f98 = f34 + f70; - f99 = f36 - f92; - f100 = f36 + f92; - f101 = f38 - f91; - f102 = f38 + f91; - f103 = f40 - f94; - f104 = f40 + f94; - f105 = f39 - f93; - f106 = f39 + f93; - f107 = f37 - f96; - f108 = f37 + f96; - f109 = f35 - f95; - f110 = f35 + f95; - f111 = f33 - f88; - f112 = f33 + f88; - f113 = x[1] + x[31]; - f114 = MUL_C(COEF_CONST(1.0478631305325901), x[1]); - f115 = MUL_C(COEF_CONST((-0.9987954562051724)), f113); - f116 = MUL_C(COEF_CONST((-0.9497277818777548)), x[31]); - f117 = f114 + f115; - f118 = f116 - f115; - f119 = x[5] + x[27]; - f120 = MUL_C(COEF_CONST(1.2130114330978077), x[5]); - f121 = MUL_C(COEF_CONST((-0.9700312531945440)), f119); - f122 = MUL_C(COEF_CONST((-0.7270510732912803)), x[27]); - f123 = f120 + f121; - f124 = f122 - f121; - f125 = x[9] + x[23]; - f126 = MUL_C(COEF_CONST(1.3315443865537255), x[9]); - f127 = MUL_C(COEF_CONST((-0.9039892931234433)), f125); - f128 = MUL_C(COEF_CONST((-0.4764341996931612)), x[23]); - f129 = f126 + f127; - f130 = f128 - f127; - f131 = x[13] + x[19]; - f132 = MUL_C(COEF_CONST(1.3989068359730781), x[13]); - f133 = MUL_C(COEF_CONST((-0.8032075314806453)), f131); - f134 = MUL_C(COEF_CONST((-0.2075082269882124)), x[19]); - f135 = f132 + f133; - f136 = f134 - f133; - f137 = x[17] + x[15]; - f138 = MUL_C(COEF_CONST(1.4125100802019777), x[17]); - f139 = MUL_C(COEF_CONST((-0.6715589548470187)), f137); - f140 = MUL_C(COEF_CONST(0.0693921705079402), x[15]); - f141 = f138 + f139; - f142 = f140 - f139; - f143 = x[21] + x[11]; - f144 = MUL_C(COEF_CONST(1.3718313541934939), x[21]); - f145 = MUL_C(COEF_CONST((-0.5141027441932219)), f143); - f146 = MUL_C(COEF_CONST(0.3436258658070501), x[11]); - f147 = f144 + f145; - f148 = f146 - f145; - f149 = x[25] + x[7]; - f150 = MUL_C(COEF_CONST(1.2784339185752409), x[25]); - f151 = MUL_C(COEF_CONST((-0.3368898533922200)), f149); - f152 = MUL_C(COEF_CONST(0.6046542117908008), x[7]); - f153 = f150 + f151; - f154 = f152 - f151; - f155 = x[29] + x[3]; - f156 = MUL_C(COEF_CONST(1.1359069844201433), x[29]); - f157 = MUL_C(COEF_CONST((-0.1467304744553624)), f155); - f158 = MUL_C(COEF_CONST(0.8424460355094185), x[3]); - f159 = f156 + f157; - f160 = f158 - f157; - f161 = f118 - f142; - f162 = f118 + f142; - f163 = f117 - f141; - f164 = f117 + f141; - f165 = f124 - f148; - f166 = f124 + f148; - f167 = f123 - f147; - f168 = f123 + f147; - f169 = f130 - f154; - f170 = f130 + f154; - f171 = f129 - f153; - f172 = f129 + f153; - f173 = f136 - f160; - f174 = f136 + f160; - f175 = f135 - f159; - f176 = f135 + f159; - f177 = f161 + f163; - f178 = MUL_C(COEF_CONST(1.1758756024193588), f161); - f179 = MUL_C(COEF_CONST((-0.9807852804032304)), f177); - f180 = MUL_C(COEF_CONST((-0.7856949583871021)), f163); - f181 = f178 + f179; - f182 = f180 - f179; - f183 = f165 + f167; - f184 = MUL_C(COEF_CONST(1.3870398453221475), f165); - f185 = MUL_C(COEF_CONST((-0.5555702330196022)), f183); - f186 = MUL_C(COEF_CONST(0.2758993792829431), f167); - f187 = f184 + f185; - f188 = f186 - f185; - f189 = f169 + f171; - f190 = MUL_C(COEF_CONST(0.7856949583871022), f169); - f191 = MUL_C(COEF_CONST(0.1950903220161283), f189); - f192 = MUL_C(COEF_CONST(1.1758756024193586), f171); - f193 = f190 + f191; - f194 = f192 - f191; - f195 = f173 + f175; - f196 = MUL_C(COEF_CONST((-0.2758993792829430)), f173); - f197 = MUL_C(COEF_CONST(0.8314696123025452), f195); - f198 = MUL_C(COEF_CONST(1.3870398453221475), f175); - f199 = f196 + f197; - f200 = f198 - f197; - f201 = f162 - f170; - f202 = f162 + f170; - f203 = f164 - f172; - f204 = f164 + f172; - f205 = f166 - f174; - f206 = f166 + f174; - f207 = f168 - f176; - f208 = f168 + f176; - f209 = f182 - f194; - f210 = f182 + f194; - f211 = f181 - f193; - f212 = f181 + f193; - f213 = f188 - f200; - f214 = f188 + f200; - f215 = f187 - f199; - f216 = f187 + f199; - f217 = f201 + f203; - f218 = MUL_C(COEF_CONST(1.3065629648763766), f201); - f219 = MUL_C(COEF_CONST((-0.9238795325112866)), f217); - f220 = MUL_C(COEF_CONST((-0.5411961001461967)), f203); - f221 = f218 + f219; - f222 = f220 - f219; - f223 = f205 + f207; - f224 = MUL_C(COEF_CONST(0.5411961001461969), f205); - f225 = MUL_C(COEF_CONST(0.3826834323650898), f223); - f226 = MUL_C(COEF_CONST(1.3065629648763766), f207); - f227 = f224 + f225; - f228 = f226 - f225; - f229 = f209 + f211; - f230 = MUL_C(COEF_CONST(1.3065629648763766), f209); - f231 = MUL_C(COEF_CONST((-0.9238795325112866)), f229); - f232 = MUL_C(COEF_CONST((-0.5411961001461967)), f211); - f233 = f230 + f231; - f234 = f232 - f231; - f235 = f213 + f215; - f236 = MUL_C(COEF_CONST(0.5411961001461969), f213); - f237 = MUL_C(COEF_CONST(0.3826834323650898), f235); - f238 = MUL_C(COEF_CONST(1.3065629648763766), f215); - f239 = f236 + f237; - f240 = f238 - f237; - f241 = f202 - f206; - f242 = f202 + f206; - f243 = f204 - f208; - f244 = f204 + f208; - f245 = f222 - f228; - f246 = f222 + f228; - f247 = f221 - f227; - f248 = f221 + f227; - f249 = f210 - f214; - f250 = f210 + f214; - f251 = f212 - f216; - f252 = f212 + f216; - f253 = f234 - f240; - f254 = f234 + f240; - f255 = f233 - f239; - f256 = f233 + f239; - f257 = f241 - f243; - f258 = f241 + f243; - f259 = MUL_C(COEF_CONST(0.7071067811865474), f257); - f260 = MUL_C(COEF_CONST(0.7071067811865474), f258); - f261 = f245 - f247; - f262 = f245 + f247; - f263 = MUL_C(COEF_CONST(0.7071067811865474), f261); - f264 = MUL_C(COEF_CONST(0.7071067811865474), f262); - f265 = f249 - f251; - f266 = f249 + f251; - f267 = MUL_C(COEF_CONST(0.7071067811865474), f265); - f268 = MUL_C(COEF_CONST(0.7071067811865474), f266); - f269 = f253 - f255; - f270 = f253 + f255; - f271 = MUL_C(COEF_CONST(0.7071067811865474), f269); - f272 = MUL_C(COEF_CONST(0.7071067811865474), f270); - y[31] = f98 - f242; - y[0] = f98 + f242; - y[30] = f100 - f250; - y[1] = f100 + f250; - y[29] = f102 - f254; - y[2] = f102 + f254; - y[28] = f104 - f246; - y[3] = f104 + f246; - y[27] = f106 - f264; - y[4] = f106 + f264; - y[26] = f108 - f272; - y[5] = f108 + f272; - y[25] = f110 - f268; - y[6] = f110 + f268; - y[24] = f112 - f260; - y[7] = f112 + f260; - y[23] = f111 - f259; - y[8] = f111 + f259; - y[22] = f109 - f267; - y[9] = f109 + f267; - y[21] = f107 - f271; - y[10] = f107 + f271; - y[20] = f105 - f263; - y[11] = f105 + f263; - y[19] = f103 - f248; - y[12] = f103 + f248; - y[18] = f101 - f256; - y[13] = f101 + f256; - y[17] = f99 - f252; - y[14] = f99 + f252; - y[16] = f97 - f244; - y[15] = f97 + f244; -} - -void DCT2_64_unscaled(real_t *y, real_t *x) -{ - int16_t i0; - real_t f2, f3, f4, f5, f6, f7, f8, f9, f10; - real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; - real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; - real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; - real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; - real_t f61, f62, f65, f66, f67, f68, f71, f72, f73, f74; - real_t f75, f76, f77, f78, f79, f80, f81, f82, f83, f85; - real_t f87, f88, f91, f92, f93, f94, f95, f96, f97, f98; - real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108; - real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118; - real_t f119, f120, f121, f122, f123, f124, f125, f126, f129, f130; - real_t f131, f132, f135, f136, f137, f138, f141, f142, f143, f144; - real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156; - real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166; - real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176; - real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186; - real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196; - real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206; - real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216; - real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226; - real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236; - real_t f237, f238, f239, f240, f241, f242, f243, f244, f245, f246; - real_t f247, f248, f249, f250, f251, f252, f253, f254, f255, f256; - real_t f257, f258, f259, f260, f261, f262, f265, f266, f267, f268; - real_t f271, f272, f273, f274, f277, f278, f279, f280, f283, f284; - real_t f285, f286, f289, f290, f291, f292, f295, f296, f297, f298; - real_t f301, f302, f303, f304, f307, f308, f309, f310, f311, f312; - real_t f313, f314, f315, f316, f317, f318, f319, f320, f321, f322; - real_t f323, f324, f325, f326, f327, f328, f329, f330, f331, f332; - real_t f333, f334, f335, f336, f337, f338, f339, f340, f341, f342; - real_t f343, f344, f345, f346, f347, f348, f349, f350, f351, f352; - real_t f353, f354, f355, f356, f357, f358, f359, f360, f361, f362; - real_t f363, f364, f365, f366, f367, f368, f369, f370, f371, f372; - real_t f373, f374, f375, f376, f377, f378, f379, f380, f381, f382; - real_t f383, f384, f385, f386, f387, f388, f389, f390, f391, f392; - real_t f393, f394, f395, f396, f397, f398, f399, f400, f401, f402; - real_t f403, f404, f405, f406, f407, f408, f409, f410, f411, f412; - real_t f413, f414, f415, f416, f417, f418, f419, f420, f421, f422; - real_t f423, f424, f425, f426, f427, f428, f429, f430, f431, f433; - real_t f434, f435, f436, f437, f438, f439, f440, f441, f442, f443; - real_t f444, f445, f446, f447, f448, f449, f450, f451, f452, f453; - real_t f454, f455, f456, f457, f458, f459, f460, f461, f462, f463; - real_t f464, f465, f466, f467, f468, f469, f470, f471, f472, f473; - real_t f474, f475, f476, f477, f478, f479, f480, f481, f482, f483; - real_t f484, f485, f486, f487, f488, f489, f490, f491, f492, f493; - real_t f494, f495, f496, f497, f498, f499, f500, f501, f502, f503; - real_t f504, f505, f506, f507, f508, f509, f510, f511, f512, f513; - real_t f514, f515, f516, f517, f518, f519, f520, f521, f522, f523; - real_t f524, f525, f526, f527, f528, f529, f530, f531, f532, f533; - real_t f534, f535, f536, f537, f538, f539, f540, f541, f542, f543; - real_t f544, f546, f547, f548, f549, f550, f551, f552, f553, f554; - real_t f555, f556, f557, f558, f559, f560, f561, f562, f563, f564; - real_t f565, f566, f567, f568, f569, f570, f571, f572, f573, f574; - real_t f575, f576, f577, f578, f579, f580, f581, f582, f583, f584; - real_t f585, f586, f587, f588, f589, f590, f591, f592, f593, f594; - real_t f595, f596, f597, f598, f599, f600, f601, f602, f603, f604; - real_t f605, f606, f607, f608, f609, f610, f611, f612, f613, f614; - real_t f615, f616, f617, f618, f619, f620, f621, f622, f623, f624; - real_t f625, f626, f627, f628; - ALIGN static real_t t2[64]; - - for (i0=0; i0<32; i0++) - { - t2[2*i0+1] = x[i0] - x[-i0+63]; - t2[2*i0] = x[i0] + x[-i0+63]; - } - f2 = t2[0] - t2[62]; - f3 = t2[0] + t2[62]; - f4 = t2[2] - t2[60]; - f5 = t2[2] + t2[60]; - f6 = t2[4] - t2[58]; - f7 = t2[4] + t2[58]; - f8 = t2[6] - t2[56]; - f9 = t2[6] + t2[56]; - f10 = t2[8] - t2[54]; - f11 = t2[8] + t2[54]; - f12 = t2[10] - t2[52]; - f13 = t2[10] + t2[52]; - f14 = t2[12] - t2[50]; - f15 = t2[12] + t2[50]; - f16 = t2[14] - t2[48]; - f17 = t2[14] + t2[48]; - f18 = t2[16] - t2[46]; - f19 = t2[16] + t2[46]; - f20 = t2[18] - t2[44]; - f21 = t2[18] + t2[44]; - f22 = t2[20] - t2[42]; - f23 = t2[20] + t2[42]; - f24 = t2[22] - t2[40]; - f25 = t2[22] + t2[40]; - f26 = t2[24] - t2[38]; - f27 = t2[24] + t2[38]; - f28 = t2[26] - t2[36]; - f29 = t2[26] + t2[36]; - f30 = t2[28] - t2[34]; - f31 = t2[28] + t2[34]; - f32 = t2[30] - t2[32]; - f33 = t2[30] + t2[32]; - f34 = f3 - f33; - f35 = f3 + f33; - f36 = f5 - f31; - f37 = f5 + f31; - f38 = f7 - f29; - f39 = f7 + f29; - f40 = f9 - f27; - f41 = f9 + f27; - f42 = f11 - f25; - f43 = f11 + f25; - f44 = f13 - f23; - f45 = f13 + f23; - f46 = f15 - f21; - f47 = f15 + f21; - f48 = f17 - f19; - f49 = f17 + f19; - f50 = f35 - f49; - f51 = f35 + f49; - f52 = f37 - f47; - f53 = f37 + f47; - f54 = f39 - f45; - f55 = f39 + f45; - f56 = f41 - f43; - f57 = f41 + f43; - f58 = f51 - f57; - f59 = f51 + f57; - f60 = f53 - f55; - f61 = f53 + f55; - f62 = f59 - f61; - y[0] = f59 + f61; - y[32] = MUL_C(COEF_CONST(0.7071067811865476), f62); - f65 = f58 + f60; - f66 = MUL_C(COEF_CONST(1.3065629648763766), f58); - f67 = MUL_C(COEF_CONST((-0.9238795325112866)), f65); - f68 = MUL_C(COEF_CONST((-0.5411961001461967)), f60); - y[48] = f66 + f67; - y[16] = f68 - f67; - f71 = f50 + f56; - f72 = MUL_C(COEF_CONST(1.1758756024193588), f50); - f73 = MUL_C(COEF_CONST((-0.9807852804032304)), f71); - f74 = MUL_C(COEF_CONST((-0.7856949583871021)), f56); - f75 = f72 + f73; - f76 = f74 - f73; - f77 = f52 + f54; - f78 = MUL_C(COEF_CONST(1.3870398453221473), f52); - f79 = MUL_C(COEF_CONST((-0.8314696123025455)), f77); - f80 = MUL_C(COEF_CONST((-0.2758993792829436)), f54); - f81 = f78 + f79; - f82 = f80 - f79; - f83 = f76 - f82; - y[8] = f76 + f82; - f85 = MUL_C(COEF_CONST(0.7071067811865476), f83); - y[56] = f75 - f81; - f87 = f75 + f81; - f88 = MUL_C(COEF_CONST(0.7071067811865476), f87); - y[40] = f85 - f88; - y[24] = f85 + f88; - f91 = f36 - f38; - f92 = f36 + f38; - f93 = f40 - f42; - f94 = f40 + f42; - f95 = f44 - f46; - f96 = f44 + f46; - f97 = MUL_C(COEF_CONST(0.7071067811865476), f94); - f98 = f34 - f97; - f99 = f34 + f97; - f100 = f92 + f96; - f101 = MUL_C(COEF_CONST(1.3065629648763766), f92); - f102 = MUL_C(COEF_CONST((-0.9238795325112866)), f100); - f103 = MUL_C(COEF_CONST((-0.5411961001461967)), f96); - f104 = f101 + f102; - f105 = f103 - f102; - f106 = f99 - f105; - f107 = f99 + f105; - f108 = f98 - f104; - f109 = f98 + f104; - f110 = f91 + f95; - f111 = MUL_C(COEF_CONST(1.3065629648763770), f91); - f112 = MUL_C(COEF_CONST((-0.3826834323650904)), f110); - f113 = MUL_C(COEF_CONST(0.5411961001461961), f95); - f114 = f111 + f112; - f115 = f113 - f112; - f116 = MUL_C(COEF_CONST(0.7071067811865476), f93); - f117 = f116 - f48; - f118 = f116 + f48; - f119 = f115 - f118; - f120 = f115 + f118; - f121 = f114 - f117; - f122 = f114 + f117; - f123 = f120 + f107; - f124 = MUL_C(COEF_CONST((-0.8971675863426361)), f120); - f125 = MUL_C(COEF_CONST(0.9951847266721968), f123); - f126 = MUL_C(COEF_CONST(1.0932018670017576), f107); - y[4] = f124 + f125; - y[60] = f126 - f125; - f129 = f122 + f109; - f130 = MUL_C(COEF_CONST((-0.6666556584777466)), f122); - f131 = MUL_C(COEF_CONST(0.9569403357322089), f129); - f132 = MUL_C(COEF_CONST(1.2472250129866713), f109); - y[12] = f130 + f131; - y[52] = f132 - f131; - f135 = f121 + f108; - f136 = MUL_C(COEF_CONST((-0.4105245275223571)), f121); - f137 = MUL_C(COEF_CONST(0.8819212643483549), f135); - f138 = MUL_C(COEF_CONST(1.3533180011743529), f108); - y[20] = f136 + f137; - y[44] = f138 - f137; - f141 = f119 + f106; - f142 = MUL_C(COEF_CONST((-0.1386171691990915)), f119); - f143 = MUL_C(COEF_CONST(0.7730104533627370), f141); - f144 = MUL_C(COEF_CONST(1.4074037375263826), f106); - y[28] = f142 + f143; - y[36] = f144 - f143; - f147 = f16 - f18; - f148 = f16 + f18; - f149 = MUL_C(COEF_CONST(0.7071067811865476), f148); - f150 = MUL_C(COEF_CONST(0.7071067811865476), f147); - f151 = f10 - f24; - f152 = f10 + f24; - f153 = MUL_C(COEF_CONST(0.7071067811865476), f152); - f154 = MUL_C(COEF_CONST(0.7071067811865476), f151); - f155 = f14 - f20; - f156 = f14 + f20; - f157 = MUL_C(COEF_CONST(0.7071067811865476), f156); - f158 = MUL_C(COEF_CONST(0.7071067811865476), f155); - f159 = f12 - f22; - f160 = f12 + f22; - f161 = MUL_C(COEF_CONST(0.7071067811865476), f160); - f162 = MUL_C(COEF_CONST(0.7071067811865476), f159); - f163 = f2 - f149; - f164 = f2 + f149; - f165 = f32 - f150; - f166 = f32 + f150; - f167 = f8 - f153; - f168 = f8 + f153; - f169 = f26 - f154; - f170 = f26 + f154; - f171 = f4 - f157; - f172 = f4 + f157; - f173 = f30 - f158; - f174 = f30 + f158; - f175 = f6 - f161; - f176 = f6 + f161; - f177 = f28 - f162; - f178 = f28 + f162; - f179 = f170 + f168; - f180 = MUL_C(COEF_CONST((-0.5411961001461969)), f170); - f181 = MUL_C(COEF_CONST(0.9238795325112867), f179); - f182 = MUL_C(COEF_CONST(1.3065629648763766), f168); - f183 = f180 + f181; - f184 = f182 - f181; - f185 = f169 + f167; - f186 = MUL_C(COEF_CONST(1.3065629648763770), f169); - f187 = MUL_C(COEF_CONST((-0.3826834323650904)), f185); - f188 = MUL_C(COEF_CONST(0.5411961001461961), f167); - f189 = f186 + f187; - f190 = f188 - f187; - f191 = f178 + f176; - f192 = MUL_C(COEF_CONST((-0.5411961001461969)), f178); - f193 = MUL_C(COEF_CONST(0.9238795325112867), f191); - f194 = MUL_C(COEF_CONST(1.3065629648763766), f176); - f195 = f192 + f193; - f196 = f194 - f193; - f197 = f177 + f175; - f198 = MUL_C(COEF_CONST(1.3065629648763770), f177); - f199 = MUL_C(COEF_CONST((-0.3826834323650904)), f197); - f200 = MUL_C(COEF_CONST(0.5411961001461961), f175); - f201 = f198 + f199; - f202 = f200 - f199; - f203 = f164 - f183; - f204 = f164 + f183; - f205 = f166 - f184; - f206 = f166 + f184; - f207 = f163 - f189; - f208 = f163 + f189; - f209 = f165 - f190; - f210 = f165 + f190; - f211 = f172 - f195; - f212 = f172 + f195; - f213 = f174 - f196; - f214 = f174 + f196; - f215 = f171 - f201; - f216 = f171 + f201; - f217 = f173 - f202; - f218 = f173 + f202; - f219 = f214 + f212; - f220 = MUL_C(COEF_CONST((-0.7856949583871021)), f214); - f221 = MUL_C(COEF_CONST(0.9807852804032304), f219); - f222 = MUL_C(COEF_CONST(1.1758756024193588), f212); - f223 = f220 + f221; - f224 = f222 - f221; - f225 = f218 + f216; - f226 = MUL_C(COEF_CONST(0.2758993792829431), f218); - f227 = MUL_C(COEF_CONST(0.5555702330196022), f225); - f228 = MUL_C(COEF_CONST(1.3870398453221475), f216); - f229 = f226 + f227; - f230 = f228 - f227; - f231 = f213 + f211; - f232 = MUL_C(COEF_CONST(1.1758756024193591), f213); - f233 = MUL_C(COEF_CONST((-0.1950903220161287)), f231); - f234 = MUL_C(COEF_CONST(0.7856949583871016), f211); - f235 = f232 + f233; - f236 = f234 - f233; - f237 = f217 + f215; - f238 = MUL_C(COEF_CONST(1.3870398453221473), f217); - f239 = MUL_C(COEF_CONST((-0.8314696123025455)), f237); - f240 = MUL_C(COEF_CONST((-0.2758993792829436)), f215); - f241 = f238 + f239; - f242 = f240 - f239; - f243 = f204 - f223; - f244 = f204 + f223; - f245 = f206 - f224; - f246 = f206 + f224; - f247 = f208 - f229; - f248 = f208 + f229; - f249 = f210 - f230; - f250 = f210 + f230; - f251 = f203 - f235; - f252 = f203 + f235; - f253 = f205 - f236; - f254 = f205 + f236; - f255 = f207 - f241; - f256 = f207 + f241; - f257 = f209 - f242; - f258 = f209 + f242; - f259 = f246 + f244; - f260 = MUL_C(COEF_CONST((-0.9497277818777543)), f246); - f261 = MUL_C(COEF_CONST(0.9987954562051724), f259); - f262 = MUL_C(COEF_CONST(1.0478631305325905), f244); - y[2] = f260 + f261; - y[62] = f262 - f261; - f265 = f250 + f248; - f266 = MUL_C(COEF_CONST((-0.7270510732912801)), f250); - f267 = MUL_C(COEF_CONST(0.9700312531945440), f265); - f268 = MUL_C(COEF_CONST(1.2130114330978079), f248); - y[10] = f266 + f267; - y[54] = f268 - f267; - f271 = f254 + f252; - f272 = MUL_C(COEF_CONST((-0.4764341996931611)), f254); - f273 = MUL_C(COEF_CONST(0.9039892931234433), f271); - f274 = MUL_C(COEF_CONST(1.3315443865537255), f252); - y[18] = f272 + f273; - y[46] = f274 - f273; - f277 = f258 + f256; - f278 = MUL_C(COEF_CONST((-0.2075082269882114)), f258); - f279 = MUL_C(COEF_CONST(0.8032075314806448), f277); - f280 = MUL_C(COEF_CONST(1.3989068359730783), f256); - y[26] = f278 + f279; - y[38] = f280 - f279; - f283 = f245 + f243; - f284 = MUL_C(COEF_CONST(0.0693921705079408), f245); - f285 = MUL_C(COEF_CONST(0.6715589548470183), f283); - f286 = MUL_C(COEF_CONST(1.4125100802019774), f243); - y[34] = f284 + f285; - y[30] = f286 - f285; - f289 = f249 + f247; - f290 = MUL_C(COEF_CONST(0.3436258658070505), f249); - f291 = MUL_C(COEF_CONST(0.5141027441932217), f289); - f292 = MUL_C(COEF_CONST(1.3718313541934939), f247); - y[42] = f290 + f291; - y[22] = f292 - f291; - f295 = f253 + f251; - f296 = MUL_C(COEF_CONST(0.6046542117908007), f253); - f297 = MUL_C(COEF_CONST(0.3368898533922201), f295); - f298 = MUL_C(COEF_CONST(1.2784339185752409), f251); - y[50] = f296 + f297; - y[14] = f298 - f297; - f301 = f257 + f255; - f302 = MUL_C(COEF_CONST(0.8424460355094192), f257); - f303 = MUL_C(COEF_CONST(0.1467304744553618), f301); - f304 = MUL_C(COEF_CONST(1.1359069844201428), f255); - y[58] = f302 + f303; - y[6] = f304 - f303; - f307 = t2[1] + t2[63]; - f308 = MUL_C(COEF_CONST(1.0242400472191162), t2[1]); - f309 = MUL_C(COEF_CONST((-0.9996988186962043)), f307); - f310 = MUL_C(COEF_CONST((-0.9751575901732922)), t2[63]); - f311 = f308 + f309; - f312 = f310 - f309; - f313 = t2[3] + t2[61]; - f314 = MUL_C(COEF_CONST(1.0708550202783571),t2[3]); - f315 = MUL_C(COEF_CONST((-0.9972904566786902)), f313); - f316 = MUL_C(COEF_CONST((-0.9237258930790232)), t2[61]); - f317 = f314 + f315; - f318 = f316 - f315; - f319 = t2[5] + t2[59]; - f320 = MUL_C(COEF_CONST(1.1148902097979256), t2[5]); - f321 = MUL_C(COEF_CONST((-0.9924795345987101)), f319); - f322 = MUL_C(COEF_CONST((-0.8700688593994945)), t2[59]); - f323 = f320 + f321; - f324 = f322 - f321; - f325 = t2[7] + t2[57]; - f326 = MUL_C(COEF_CONST(1.1562395311492426), t2[7]); - f327 = MUL_C(COEF_CONST((-0.9852776423889412)), f325); - f328 = MUL_C(COEF_CONST((-0.8143157536286398)), t2[57]); - f329 = f326 + f327; - f330 = f328 - f327; - f331 = t2[9] + t2[55]; - f332 = MUL_C(COEF_CONST(1.1948033701953984), t2[9]); - f333 = MUL_C(COEF_CONST((-0.9757021300385286)), f331); - f334 = MUL_C(COEF_CONST((-0.7566008898816589)), t2[55]); - f335 = f332 + f333; - f336 = f334 - f333; - f337 = t2[11] + t2[53]; - f338 = MUL_C(COEF_CONST(1.2304888232703382), t2[11]); - f339 = MUL_C(COEF_CONST((-0.9637760657954400)), f337); - f340 = MUL_C(COEF_CONST((-0.6970633083205418)), t2[53]); - f341 = f338 + f339; - f342 = f340 - f339; - f343 = t2[13] + t2[51]; - f344 = MUL_C(COEF_CONST(1.2632099209919279), t2[13]); - f345 = MUL_C(COEF_CONST((-0.9495281805930368)), f343); - f346 = MUL_C(COEF_CONST((-0.6358464401941457)), t2[51]); - f347 = f344 + f345; - f348 = f346 - f345; - f349 = t2[15] + t2[49]; - f350 = MUL_C(COEF_CONST(1.2928878353697266), t2[15]); - f351 = MUL_C(COEF_CONST((-0.9329927988347391)), f349); - f352 = MUL_C(COEF_CONST((-0.5730977622997515)), t2[49]); - f353 = f350 + f351; - f354 = f352 - f351; - f355 = t2[17] + t2[47]; - f356 = MUL_C(COEF_CONST(1.3194510697085207), t2[17]); - f357 = MUL_C(COEF_CONST((-0.9142097557035306)), f355); - f358 = MUL_C(COEF_CONST((-0.5089684416985405)), t2[47]); - f359 = f356 + f357; - f360 = f358 - f357; - f361 = t2[19] + t2[45]; - f362 = MUL_C(COEF_CONST(1.3428356308501219), t2[19]); - f363 = MUL_C(COEF_CONST((-0.8932243011955153)), f361); - f364 = MUL_C(COEF_CONST((-0.4436129715409087)), t2[45]); - f365 = f362 + f363; - f366 = f364 - f363; - f367 = t2[21] + t2[43]; - f368 = MUL_C(COEF_CONST(1.3629851833384954), t2[21]); - f369 = MUL_C(COEF_CONST((-0.8700869911087115)), f367); - f370 = MUL_C(COEF_CONST((-0.3771887988789276)), t2[43]); - f371 = f368 + f369; - f372 = f370 - f369; - f373 = t2[23] + t2[41]; - f374 = MUL_C(COEF_CONST(1.3798511851368040), t2[23]); - f375 = MUL_C(COEF_CONST((-0.8448535652497072)), f373); - f376 = MUL_C(COEF_CONST((-0.3098559453626103)), t2[41]); - f377 = f374 + f375; - f378 = f376 - f375; - f379 = t2[25] + t2[39]; - f380 = MUL_C(COEF_CONST(1.3933930045694289), t2[25]); - f381 = MUL_C(COEF_CONST((-0.8175848131515840)), f379); - f382 = MUL_C(COEF_CONST((-0.2417766217337392)), t2[39]); - f383 = f380 + f381; - f384 = f382 - f381; - f385 = t2[27] + t2[37]; - f386 = MUL_C(COEF_CONST(1.4035780182072330), t2[27]); - f387 = MUL_C(COEF_CONST((-0.7883464276266061)), f385); - f388 = MUL_C(COEF_CONST((-0.1731148370459791)), t2[37]); - f389 = f386 + f387; - f390 = f388 - f387; - f391 = t2[29] + t2[35]; - f392 = MUL_C(COEF_CONST(1.4103816894602614), t2[29]); - f393 = MUL_C(COEF_CONST((-0.7572088465064846)), f391); - f394 = MUL_C(COEF_CONST((-0.1040360035527078)), t2[35]); - f395 = f392 + f393; - f396 = f394 - f393; - f397 = t2[31] + t2[33]; - f398 = MUL_C(COEF_CONST(1.4137876276885337), t2[31]); - f399 = MUL_C(COEF_CONST((-0.7242470829514670)), f397); - f400 = MUL_C(COEF_CONST((-0.0347065382144002)), t2[33]); - f401 = f398 + f399; - f402 = f400 - f399; - f403 = f312 - f402; - f404 = f312 + f402; - f405 = f318 - f396; - f406 = f318 + f396; - f407 = f324 - f390; - f408 = f324 + f390; - f409 = f330 - f384; - f410 = f330 + f384; - f411 = f336 - f378; - f412 = f336 + f378; - f413 = f342 - f372; - f414 = f342 + f372; - f415 = f348 - f366; - f416 = f348 + f366; - f417 = f354 - f360; - f418 = f354 + f360; - f419 = f404 - f418; - f420 = f404 + f418; - f421 = f406 - f416; - f422 = f406 + f416; - f423 = f408 - f414; - f424 = f408 + f414; - f425 = f410 - f412; - f426 = f410 + f412; - f427 = f420 - f426; - f428 = f420 + f426; - f429 = f422 - f424; - f430 = f422 + f424; - f431 = f428 - f430; - y[1] = f428 + f430; - f433 = MUL_C(COEF_CONST(0.7071067811865476), f431); - f434 = f427 + f429; - f435 = MUL_C(COEF_CONST(1.3065629648763766), f427); - f436 = MUL_C(COEF_CONST((-0.9238795325112866)), f434); - f437 = MUL_C(COEF_CONST((-0.5411961001461967)), f429); - f438 = f435 + f436; - f439 = f437 - f436; - f440 = f419 + f425; - f441 = MUL_C(COEF_CONST(1.1758756024193588), f419); - f442 = MUL_C(COEF_CONST((-0.9807852804032304)), f440); - f443 = MUL_C(COEF_CONST((-0.7856949583871021)), f425); - f444 = f441 + f442; - f445 = f443 - f442; - f446 = f421 + f423; - f447 = MUL_C(COEF_CONST(1.3870398453221473), f421); - f448 = MUL_C(COEF_CONST((-0.8314696123025455)), f446); - f449 = MUL_C(COEF_CONST((-0.2758993792829436)), f423); - f450 = f447 + f448; - f451 = f449 - f448; - f452 = f445 - f451; - f453 = f445 + f451; - f454 = MUL_C(COEF_CONST(0.7071067811865476), f452); - f455 = f444 - f450; - f456 = f444 + f450; - f457 = MUL_C(COEF_CONST(0.7071067811865476), f456); - f458 = f454 - f457; - f459 = f454 + f457; - f460 = f405 - f407; - f461 = f405 + f407; - f462 = f409 - f411; - f463 = f409 + f411; - f464 = f413 - f415; - f465 = f413 + f415; - f466 = MUL_C(COEF_CONST(0.7071067811865476), f463); - f467 = f403 - f466; - f468 = f403 + f466; - f469 = f461 + f465; - f470 = MUL_C(COEF_CONST(1.3065629648763766), f461); - f471 = MUL_C(COEF_CONST((-0.9238795325112866)), f469); - f472 = MUL_C(COEF_CONST((-0.5411961001461967)), f465); - f473 = f470 + f471; - f474 = f472 - f471; - f475 = f468 - f474; - f476 = f468 + f474; - f477 = f467 - f473; - f478 = f467 + f473; - f479 = f460 + f464; - f480 = MUL_C(COEF_CONST(1.3065629648763770), f460); - f481 = MUL_C(COEF_CONST((-0.3826834323650904)), f479); - f482 = MUL_C(COEF_CONST(0.5411961001461961), f464); - f483 = f480 + f481; - f484 = f482 - f481; - f485 = MUL_C(COEF_CONST(0.7071067811865476), f462); - f486 = f485 - f417; - f487 = f485 + f417; - f488 = f484 - f487; - f489 = f484 + f487; - f490 = f483 - f486; - f491 = f483 + f486; - f492 = f489 + f476; - f493 = MUL_C(COEF_CONST((-0.8971675863426361)), f489); - f494 = MUL_C(COEF_CONST(0.9951847266721968), f492); - f495 = MUL_C(COEF_CONST(1.0932018670017576), f476); - f496 = f493 + f494; - f497 = f495 - f494; - f498 = f491 + f478; - f499 = MUL_C(COEF_CONST((-0.6666556584777466)), f491); - f500 = MUL_C(COEF_CONST(0.9569403357322089), f498); - f501 = MUL_C(COEF_CONST(1.2472250129866713), f478); - f502 = f499 + f500; - f503 = f501 - f500; - f504 = f490 + f477; - f505 = MUL_C(COEF_CONST((-0.4105245275223571)), f490); - f506 = MUL_C(COEF_CONST(0.8819212643483549), f504); - f507 = MUL_C(COEF_CONST(1.3533180011743529), f477); - f508 = f505 + f506; - f509 = f507 - f506; - f510 = f488 + f475; - f511 = MUL_C(COEF_CONST((-0.1386171691990915)), f488); - f512 = MUL_C(COEF_CONST(0.7730104533627370), f510); - f513 = MUL_C(COEF_CONST(1.4074037375263826), f475); - f514 = f511 + f512; - f515 = f513 - f512; - f516 = f311 + f401; - f517 = f311 - f401; - f518 = f317 + f395; - f519 = f395 - f317; - f520 = f323 + f389; - f521 = f323 - f389; - f522 = f329 + f383; - f523 = f383 - f329; - f524 = f335 + f377; - f525 = f335 - f377; - f526 = f341 + f371; - f527 = f371 - f341; - f528 = f347 + f365; - f529 = f347 - f365; - f530 = f353 + f359; - f531 = f359 - f353; - f532 = f517 - f531; - f533 = f517 + f531; - f534 = f519 - f529; - f535 = f519 + f529; - f536 = f521 - f527; - f537 = f521 + f527; - f538 = f523 - f525; - f539 = f523 + f525; - f540 = f533 - f539; - f541 = f533 + f539; - f542 = f535 - f537; - f543 = f535 + f537; - f544 = f541 - f543; - y[63] = f541 + f543; - f546 = MUL_C(COEF_CONST(0.7071067811865476), f544); - f547 = f540 + f542; - f548 = MUL_C(COEF_CONST(1.3065629648763766), f540); - f549 = MUL_C(COEF_CONST((-0.9238795325112866)), f547); - f550 = MUL_C(COEF_CONST((-0.5411961001461967)), f542); - f551 = f548 + f549; - f552 = f550 - f549; - f553 = f532 + f538; - f554 = MUL_C(COEF_CONST(1.1758756024193588), f532); - f555 = MUL_C(COEF_CONST((-0.9807852804032304)), f553); - f556 = MUL_C(COEF_CONST((-0.7856949583871021)), f538); - f557 = f554 + f555; - f558 = f556 - f555; - f559 = f534 + f536; - f560 = MUL_C(COEF_CONST(1.3870398453221473), f534); - f561 = MUL_C(COEF_CONST((-0.8314696123025455)), f559); - f562 = MUL_C(COEF_CONST((-0.2758993792829436)), f536); - f563 = f560 + f561; - f564 = f562 - f561; - f565 = f558 - f564; - f566 = f558 + f564; - f567 = MUL_C(COEF_CONST(0.7071067811865476), f565); - f568 = f557 - f563; - f569 = f557 + f563; - f570 = MUL_C(COEF_CONST(0.7071067811865476), f569); - f571 = f567 - f570; - f572 = f567 + f570; - f573 = MUL_C(COEF_CONST(0.5024192861881557), f516); - f574 = MUL_C(COEF_CONST(0.5224986149396889), f518); - f575 = MUL_C(COEF_CONST(0.5669440348163577), f520); - f576 = MUL_C(COEF_CONST(0.6468217833599901), f522); - f577 = MUL_C(COEF_CONST(0.7881546234512502), f524); - f578 = MUL_C(COEF_CONST(1.0606776859903471), f526); - f579 = MUL_C(COEF_CONST(1.7224470982383342), f528); - f580 = MUL_C(COEF_CONST(5.1011486186891553), f530); - f581 = f573 + f580; - f582 = f573 - f580; - f583 = f574 + f579; - f584 = f579 - f574; - f585 = f575 + f578; - f586 = f575 - f578; - f587 = f576 + f577; - f588 = f577 - f576; - f589 = f582 - f588; - f590 = f582 + f588; - f591 = f584 - f586; - f592 = f584 + f586; - f593 = f590 - f592; - f594 = f590 + f592; - f595 = MUL_C(COEF_CONST(0.7071067811865476), f593); - f596 = f589 + f591; - f597 = MUL_C(COEF_CONST(1.3065629648763766), f589); - f598 = MUL_C(COEF_CONST((-0.9238795325112866)), f596); - f599 = MUL_C(COEF_CONST((-0.5411961001461967)), f591); - f600 = f597 + f598; - f601 = f599 - f598; - f602 = f583 + f585; - f603 = f585 - f583; - f604 = MUL_C(COEF_CONST(0.7071067811865476), f603); - f605 = MUL_C(COEF_CONST(0.7071067811865476), f602); - f606 = f581 - f604; - f607 = f581 + f604; - f608 = f605 - f587; - f609 = f587 + f605; - f610 = f607 - f609; - f611 = MUL_C(COEF_CONST((-0.7856949583871021)), f609); - f612 = MUL_C(COEF_CONST(0.9807852804032304), f610); - f613 = MUL_C(COEF_CONST(1.1758756024193588), f607); - f614 = f612 - f611; - f615 = f613 - f612; - f616 = f608 + f606; - f617 = MUL_C(COEF_CONST(0.2758993792829431), f608); - f618 = MUL_C(COEF_CONST(0.5555702330196022), f616); - f619 = MUL_C(COEF_CONST(1.3870398453221475), f606); - f620 = f617 + f618; - f621 = f619 - f618; - f622 = f594 + f614; - f623 = f614 + f601; - f624 = f601 + f621; - f625 = f621 + f595; - f626 = f595 + f620; - f627 = f620 + f600; - f628 = f600 + f615; - y[5] = f496 - f615; - y[3] = f496 + f615; - y[9] = f453 - f568; - y[7] = f453 + f568; - y[13] = f502 - f628; - y[11] = f502 + f628; - y[17] = f439 - f551; - y[15] = f439 + f551; - y[21] = f508 - f627; - y[19] = f508 + f627; - y[25] = f459 - f571; - y[23] = f459 + f571; - y[29] = f514 - f626; - y[27] = f514 + f626; - y[33] = f433 - f546; - y[31] = f433 + f546; - y[37] = f515 - f625; - y[35] = f515 + f625; - y[41] = f458 - f572; - y[39] = f458 + f572; - y[45] = f509 - f624; - y[43] = f509 + f624; - y[49] = f438 - f552; - y[47] = f438 + f552; - y[53] = f503 - f623; - y[51] = f503 + f623; - y[57] = f455 - f566; - y[55] = f455 + f566; - y[61] = f497 - f622; - y[59] = f497 + f622; -} - -void DST2_64_unscaled(real_t *y, real_t *x) -{ - int16_t i0; - real_t f2, f3, f4, f5, f6, f7; - real_t f8, f9, f10, f11, f12, f13; - real_t f14, f15, f16, f17, f18, f19; - real_t f20, f21, f22, f23, f24, f25; - real_t f26, f27, f28, f29, f30, f31; - real_t f32, f33, f34, f35, f36, f37; - real_t f38, f39, f40, f41, f42, f43; - real_t f44, f45, f46, f47, f48, f49; - real_t f50, f51, f52, f53, f54, f55; - real_t f56, f57, f58, f59, f60, f61; - real_t f62, f63, f64, f65, f66, f67; - real_t f68, f69, f70, f71, f72, f73; - real_t f74, f75, f76, f77, f78, f79; - real_t f80, f81, f82, f83, f84, f85; - real_t f86, f87, f88, f89, f90, f91; - real_t f92, f93, f94, f95, f96, f97; - real_t f98, f99, f100, f101, f102, f103; - real_t f104, f105, f106, f107, f108, f109; - real_t f110, f111, f112, f113, f114, f115; - real_t f116, f117, f118, f119, f120, f121; - real_t f122, f123, f124, f125, f126, f127; - real_t f128, f129, f130, f131, f132, f133; - real_t f134, f135, f136, f137, f138, f139; - real_t f140, f141, f142, f143, f144, f145; - real_t f146, f147, f148, f149, f150, f151; - real_t f152, f153, f154, f155, f156, f157; - real_t f158, f159, f160, f161, f162, f163; - real_t f164, f165, f166, f167, f168, f169; - real_t f170, f171, f172, f173, f174, f175; - real_t f176, f177, f178, f179, f180, f181; - real_t f182, f183, f184, f185, f186, f187; - real_t f188, f189, f190, f191, f192, f193; - real_t f194, f195, f196, f197, f198, f199; - real_t f200, f201, f202, f203, f204, f205; - real_t f206, f207, f208, f209, f210, f211; - real_t f212, f213, f214, f215, f216, f217; - real_t f218, f219, f220, f221, f222, f223; - real_t f224, f225, f226, f227, f228, f229; - real_t f230, f231, f232, f233, f234, f235; - real_t f236, f237, f238, f239, f240, f241; - real_t f242, f243, f244, f245, f246, f247; - real_t f248, f249, f250, f251, f252, f253; - real_t f254, f255, f256, f257, f258, f259; - real_t f260, f261, f264, f265, f266, f267; - real_t f270, f271, f272, f273, f276, f277; - real_t f278, f279, f282, f283, f284, f285; - real_t f288, f289, f290, f291, f294, f295; - real_t f296, f297, f300, f301, f302, f303; - real_t f306, f307, f308, f309, f312, f313; - real_t f314, f315, f318, f319, f320, f321; - real_t f324, f325, f326, f327, f330, f331; - real_t f332, f333, f336, f337, f338, f339; - real_t f342, f343, f344, f345, f348, f349; - real_t f350, f351, f354, f355, f356, f357; - real_t f358, f359, f360, f361, f362, f363; - real_t f364, f365, f366, f367, f368, f369; - real_t f370, f371, f372, f373, f374, f375; - real_t f376, f377, f378, f379, f380, f381; - real_t f382, f383, f384, f385, f386, f387; - real_t f388, f389, f390, f391, f392, f393; - real_t f394, f395, f396, f397, f398, f399; - real_t f400, f401, f402, f403, f404, f405; - real_t f406, f407, f408, f409, f410, f411; - real_t f412, f413, f414, f415, f416, f417; - real_t f418, f419, f420, f421, f422, f423; - real_t f424, f425, f426, f427, f428, f429; - real_t f430, f431, f432, f433, f434, f435; - real_t f436, f437, f438, f439, f440, f441; - real_t f442, f443, f444, f445, f446, f447; - real_t f448, f449, f450, f451, f452, f453; - real_t f454, f455, f456, f457, f458, f459; - real_t f460, f461, f462, f463, f464, f465; - real_t f466, f467, f468, f469, f470, f471; - real_t f472, f473, f474, f475, f476, f477; - real_t f478, f479, f480, f481, f482, f483; - real_t f484, f485, f486, f487, f488, f489; - real_t f490, f491, f492, f493, f494, f495; - real_t f496, f497, f498, f499, f500, f501; - real_t f504, f505, f506, f507, f510, f511; - real_t f512, f513, f516, f517, f518, f519; - real_t f522, f523, f524, f525, f528, f529; - real_t f530, f531, f534, f535, f536, f537; - real_t f540, f541, f542, f543, f546, f547; - real_t f548, f549, f550, f551, f552, f553; - real_t f554, f555, f556, f557, f558, f559; - real_t f560, f561, f562, f563, f564, f565; - real_t f566, f567, f568, f569, f570, f571; - real_t f572, f573, f574, f577, f578, f579; - real_t f580, f583, f584, f585, f586, f587; - real_t f588, f589, f590, f591, f592, f593; - real_t f594, f595, f596, f597, f598, f603; - real_t f604, f605, f606, f607, f608, f609; - real_t f610, f611, f612, f613, f614, f615; - real_t f616, f617, f618, f619, f620, f621; - real_t f622, f623, f624, f625, f626, f627; - real_t f628, f629, f630, f631, f632, f633; - real_t f634, f635, f636, f637, f638, f639; - real_t f640, f641, f642, f643, f644, f645; - real_t f646, f647, f648, f649, f650; - ALIGN static real_t t2[64]; - - for (i0=0; i0<32; i0++) - { - t2[2*i0+1] = x[i0] - x[-i0+63]; - t2[2*i0] = x[i0] + x[-i0+63]; - } - f2 = t2[2] + t2[4]; - f3 = t2[4] - t2[2]; - f4 = t2[6] + t2[8]; - f5 = t2[8] - t2[6]; - f6 = t2[10] + t2[12]; - f7 = t2[12] - t2[10]; - f8 = t2[14] + t2[16]; - f9 = t2[16] - t2[14]; - f10 = t2[18] + t2[20]; - f11 = t2[20] - t2[18]; - f12 = t2[22] + t2[24]; - f13 = t2[24] - t2[22]; - f14 = t2[26] + t2[28]; - f15 = t2[28] - t2[26]; - f16 = t2[30] + t2[32]; - f17 = t2[32] - t2[30]; - f18 = t2[34] + t2[36]; - f19 = t2[36] - t2[34]; - f20 = t2[38] + t2[40]; - f21 = t2[40] - t2[38]; - f22 = t2[42] + t2[44]; - f23 = t2[44] - t2[42]; - f24 = t2[46] + t2[48]; - f25 = t2[48] - t2[46]; - f26 = t2[50] + t2[52]; - f27 = t2[52] - t2[50]; - f28 = t2[54] + t2[56]; - f29 = t2[56] - t2[54]; - f30 = t2[58] + t2[60]; - f31 = t2[60] - t2[58]; - f32 = MUL_C(COEF_CONST(0.7071067811865476), f17); - f33 = t2[0] - f32; - f34 = t2[0] + f32; - f35 = f9 + f25; - f36 = MUL_C(COEF_CONST(1.3065629648763766), f9); - f37 = MUL_C(COEF_CONST((-0.9238795325112866)), f35); - f38 = MUL_C(COEF_CONST((-0.5411961001461967)), f25); - f39 = f36 + f37; - f40 = f38 - f37; - f41 = f34 - f40; - f42 = f34 + f40; - f43 = f33 - f39; - f44 = f33 + f39; - f45 = MUL_C(COEF_CONST(2.5629154477415064), f5); - f46 = MUL_C(COEF_CONST(0.8999762231364158), f13); - f47 = MUL_C(COEF_CONST(0.5097955791041592), f29); - f48 = MUL_C(COEF_CONST(0.6013448869350453), f21); - f49 = f45 - f47; - f50 = f45 + f47; - f51 = f46 - f48; - f52 = f46 + f48; - f53 = f50 + f52; - f54 = MUL_C(COEF_CONST(1.3065629648763770), f50); - f55 = MUL_C(COEF_CONST((-0.3826834323650904)), f53); - f56 = MUL_C(COEF_CONST(0.5411961001461961), f52); - f57 = f54 + f55; - f58 = f56 - f55; - f59 = f51 - f49; - f60 = f49 + f51; - f61 = MUL_C(COEF_CONST(0.7071067811865476), f60); - f62 = f58 - f61; - f63 = f57 - f61; - f64 = f59 + f57; - f65 = f42 - f58; - f66 = f42 + f58; - f67 = f44 + f62; - f68 = f44 - f62; - f69 = f43 - f63; - f70 = f43 + f63; - f71 = f41 + f64; - f72 = f41 - f64; - f73 = f7 - f11; - f74 = f7 + f11; - f75 = f15 - f19; - f76 = f15 + f19; - f77 = f23 - f27; - f78 = f23 + f27; - f79 = MUL_C(COEF_CONST(0.7071067811865476), f76); - f80 = f3 - f79; - f81 = f3 + f79; - f82 = f74 + f78; - f83 = MUL_C(COEF_CONST(1.3065629648763766), f74); - f84 = MUL_C(COEF_CONST((-0.9238795325112866)), f82); - f85 = MUL_C(COEF_CONST((-0.5411961001461967)), f78); - f86 = f83 + f84; - f87 = f85 - f84; - f88 = f81 - f87; - f89 = f81 + f87; - f90 = f80 - f86; - f91 = f80 + f86; - f92 = MUL_C(COEF_CONST(0.7071067811865476), f75); - f93 = f31 - f92; - f94 = f31 + f92; - f95 = f77 + f73; - f96 = MUL_C(COEF_CONST(1.3065629648763766), f77); - f97 = MUL_C(COEF_CONST((-0.9238795325112866)), f95); - f98 = MUL_C(COEF_CONST((-0.5411961001461967)), f73); - f99 = f96 + f97; - f100 = f98 - f97; - f101 = f94 - f100; - f102 = f94 + f100; - f103 = f93 - f99; - f104 = f93 + f99; - f105 = f102 + f89; - f106 = MUL_C(COEF_CONST((-0.8971675863426361)), f102); - f107 = MUL_C(COEF_CONST(0.9951847266721968), f105); - f108 = MUL_C(COEF_CONST(1.0932018670017576), f89); - f109 = f106 + f107; - f110 = f108 - f107; - f111 = f91 - f104; - f112 = MUL_C(COEF_CONST((-0.6666556584777466)), f104); - f113 = MUL_C(COEF_CONST(0.9569403357322089), f111); - f114 = MUL_C(COEF_CONST(1.2472250129866713), f91); - f115 = f113 - f112; - f116 = f114 - f113; - f117 = f103 + f90; - f118 = MUL_C(COEF_CONST((-0.4105245275223571)), f103); - f119 = MUL_C(COEF_CONST(0.8819212643483549), f117); - f120 = MUL_C(COEF_CONST(1.3533180011743529), f90); - f121 = f118 + f119; - f122 = f120 - f119; - f123 = f88 - f101; - f124 = MUL_C(COEF_CONST((-0.1386171691990915)), f101); - f125 = MUL_C(COEF_CONST(0.7730104533627370), f123); - f126 = MUL_C(COEF_CONST(1.4074037375263826), f88); - f127 = f125 - f124; - f128 = f126 - f125; - f129 = f66 - f109; - f130 = f66 + f109; - f131 = f68 - f115; - f132 = f68 + f115; - f133 = f70 - f121; - f134 = f70 + f121; - f135 = f72 - f127; - f136 = f72 + f127; - f137 = f71 - f128; - f138 = f71 + f128; - f139 = f69 - f122; - f140 = f69 + f122; - f141 = f67 - f116; - f142 = f67 + f116; - f143 = f65 - f110; - f144 = f65 + f110; - f145 = f26 + f30; - f146 = f22 + f26; - f147 = f18 + f22; - f148 = f14 + f18; - f149 = f10 + f14; - f150 = f6 + f10; - f151 = f2 + f6; - f152 = MUL_C(COEF_CONST(0.7071067811865476), f148); - f153 = f152 - f30; - f154 = f30 + f152; - f155 = f146 + f150; - f156 = MUL_C(COEF_CONST(1.3065629648763766), f146); - f157 = MUL_C(COEF_CONST((-0.9238795325112866)), f155); - f158 = MUL_C(COEF_CONST((-0.5411961001461967)), f150); - f159 = f156 + f157; - f160 = f157 - f158; - f161 = f154 + f160; - f162 = f160 - f154; - f163 = f153 + f159; - f164 = f153 - f159; - f165 = f147 + f145; - f166 = f149 + f147; - f167 = f151 + f149; - f168 = MUL_C(COEF_CONST(0.7071067811865476), f166); - f169 = f168 - f145; - f170 = f145 + f168; - f171 = f165 + f167; - f172 = MUL_C(COEF_CONST(1.3065629648763766), f165); - f173 = MUL_C(COEF_CONST((-0.9238795325112866)), f171); - f174 = MUL_C(COEF_CONST((-0.5411961001461967)), f167); - f175 = f172 + f173; - f176 = f173 - f174; - f177 = f170 + f176; - f178 = f176 - f170; - f179 = f169 + f175; - f180 = f169 - f175; - f181 = MUL_C(COEF_CONST(0.5097955791041592), f178); - f182 = MUL_C(COEF_CONST(0.6013448869350453), f180); - f183 = MUL_C(COEF_CONST(0.8999762231364156), f179); - f184 = MUL_C(COEF_CONST(2.5629154477415055), f177); - f185 = f162 - f181; - f186 = f162 + f181; - f187 = f164 - f182; - f188 = f164 + f182; - f189 = f163 - f183; - f190 = f163 + f183; - f191 = f184 - f161; - f192 = f161 + f184; - f193 = MUL_C(COEF_CONST(0.5024192861881557), f186); - f194 = MUL_C(COEF_CONST(0.5224986149396889), f188); - f195 = MUL_C(COEF_CONST(0.5669440348163577), f190); - f196 = MUL_C(COEF_CONST(0.6468217833599901), f192); - f197 = MUL_C(COEF_CONST(0.7881546234512502), f191); - f198 = MUL_C(COEF_CONST(1.0606776859903471), f189); - f199 = MUL_C(COEF_CONST(1.7224470982383342), f187); - f200 = MUL_C(COEF_CONST(5.1011486186891553), f185); - f201 = MUL_C(COEF_CONST(0.7071067811865476), f16); - f202 = f201 - t2[62]; - f203 = t2[62] + f201; - f204 = f24 + f8; - f205 = MUL_C(COEF_CONST(1.3065629648763766), f24); - f206 = MUL_C(COEF_CONST((-0.9238795325112866)), f204); - f207 = MUL_C(COEF_CONST((-0.5411961001461967)), f8); - f208 = f205 + f206; - f209 = f206 - f207; - f210 = f203 + f209; - f211 = f209 - f203; - f212 = f202 + f208; - f213 = f202 - f208; - f214 = f20 + f28; - f215 = f12 + f20; - f216 = f4 + f12; - f217 = MUL_C(COEF_CONST(0.7071067811865476), f215); - f218 = f217 - f28; - f219 = f28 + f217; - f220 = f214 + f216; - f221 = MUL_C(COEF_CONST(1.3065629648763766), f214); - f222 = MUL_C(COEF_CONST((-0.9238795325112866)), f220); - f223 = MUL_C(COEF_CONST((-0.5411961001461967)), f216); - f224 = f221 + f222; - f225 = f222 - f223; - f226 = f219 + f225; - f227 = f225 - f219; - f228 = f218 + f224; - f229 = f218 - f224; - f230 = MUL_C(COEF_CONST(0.5097955791041592), f227); - f231 = MUL_C(COEF_CONST(0.6013448869350453), f229); - f232 = MUL_C(COEF_CONST(0.8999762231364156), f228); - f233 = MUL_C(COEF_CONST(2.5629154477415055), f226); - f234 = f211 - f230; - f235 = f211 + f230; - f236 = f213 - f231; - f237 = f213 + f231; - f238 = f212 - f232; - f239 = f212 + f232; - f240 = f233 - f210; - f241 = f210 + f233; - f242 = f193 - f235; - f243 = f193 + f235; - f244 = f237 - f194; - f245 = f194 + f237; - f246 = f195 - f239; - f247 = f195 + f239; - f248 = f196 - f241; - f249 = f196 + f241; - f250 = f197 - f240; - f251 = f197 + f240; - f252 = f238 - f198; - f253 = f198 + f238; - f254 = f199 - f236; - f255 = f199 + f236; - f256 = f234 - f200; - f257 = f200 + f234; - f258 = f243 + f130; - f259 = MUL_C(COEF_CONST((-0.9751575901732920)), f243); - f260 = MUL_C(COEF_CONST(0.9996988186962043), f258); - f261 = MUL_C(COEF_CONST(1.0242400472191164), f130); - y[62] = f259 + f260; - y[0] = f261 - f260; - f264 = f132 - f245; - f265 = MUL_C(COEF_CONST((-0.9237258930790228)), f245); - f266 = MUL_C(COEF_CONST(0.9972904566786902), f264); - f267 = MUL_C(COEF_CONST(1.0708550202783576), f132); - y[60] = f266 - f265; - y[2] = f267 - f266; - f270 = f247 + f134; - f271 = MUL_C(COEF_CONST((-0.8700688593994936)), f247); - f272 = MUL_C(COEF_CONST(0.9924795345987100), f270); - f273 = MUL_C(COEF_CONST(1.1148902097979263), f134); - y[58] = f271 + f272; - y[4] = f273 - f272; - f276 = f249 + f136; - f277 = MUL_C(COEF_CONST((-0.8143157536286398)), f249); - f278 = MUL_C(COEF_CONST(0.9852776423889412), f276); - f279 = MUL_C(COEF_CONST(1.1562395311492426), f136); - y[56] = f277 + f278; - y[6] = f279 - f278; - f282 = f251 + f138; - f283 = MUL_C(COEF_CONST((-0.7566008898816587)), f251); - f284 = MUL_C(COEF_CONST(0.9757021300385286), f282); - f285 = MUL_C(COEF_CONST(1.1948033701953984), f138); - y[54] = f283 + f284; - y[8] = f285 - f284; - f288 = f140 - f253; - f289 = MUL_C(COEF_CONST((-0.6970633083205414)), f253); - f290 = MUL_C(COEF_CONST(0.9637760657954398), f288); - f291 = MUL_C(COEF_CONST(1.2304888232703384), f140); - y[52] = f290 - f289; - y[10] = f291 - f290; - f294 = f255 + f142; - f295 = MUL_C(COEF_CONST((-0.6358464401941451)), f255); - f296 = MUL_C(COEF_CONST(0.9495281805930367), f294); - f297 = MUL_C(COEF_CONST(1.2632099209919283), f142); - y[50] = f295 + f296; - y[12] = f297 - f296; - f300 = f144 - f257; - f301 = MUL_C(COEF_CONST((-0.5730977622997506)), f257); - f302 = MUL_C(COEF_CONST(0.9329927988347389), f300); - f303 = MUL_C(COEF_CONST(1.2928878353697271), f144); - y[48] = f302 - f301; - y[14] = f303 - f302; - f306 = f256 + f143; - f307 = MUL_C(COEF_CONST((-0.5089684416985408)), f256); - f308 = MUL_C(COEF_CONST(0.9142097557035307), f306); - f309 = MUL_C(COEF_CONST(1.3194510697085207), f143); - y[46] = f307 + f308; - y[16] = f309 - f308; - f312 = f254 + f141; - f313 = MUL_C(COEF_CONST((-0.4436129715409087)), f254); - f314 = MUL_C(COEF_CONST(0.8932243011955153), f312); - f315 = MUL_C(COEF_CONST(1.3428356308501219), f141); - y[44] = f313 + f314; - y[18] = f315 - f314; - f318 = f252 + f139; - f319 = MUL_C(COEF_CONST((-0.3771887988789273)), f252); - f320 = MUL_C(COEF_CONST(0.8700869911087114), f318); - f321 = MUL_C(COEF_CONST(1.3629851833384954), f139); - y[42] = f319 + f320; - y[20] = f321 - f320; - f324 = f250 + f137; - f325 = MUL_C(COEF_CONST((-0.3098559453626097)), f250); - f326 = MUL_C(COEF_CONST(0.8448535652497070), f324); - f327 = MUL_C(COEF_CONST(1.3798511851368043), f137); - y[40] = f325 + f326; - y[22] = f327 - f326; - f330 = f248 + f135; - f331 = MUL_C(COEF_CONST((-0.2417766217337384)), f248); - f332 = MUL_C(COEF_CONST(0.8175848131515837), f330); - f333 = MUL_C(COEF_CONST(1.3933930045694289), f135); - y[38] = f331 + f332; - y[24] = f333 - f332; - f336 = f246 + f133; - f337 = MUL_C(COEF_CONST((-0.1731148370459794)), f246); - f338 = MUL_C(COEF_CONST(0.7883464276266062), f336); - f339 = MUL_C(COEF_CONST(1.4035780182072330), f133); - y[36] = f337 + f338; - y[26] = f339 - f338; - f342 = f244 + f131; - f343 = MUL_C(COEF_CONST((-0.1040360035527077)), f244); - f344 = MUL_C(COEF_CONST(0.7572088465064845), f342); - f345 = MUL_C(COEF_CONST(1.4103816894602612), f131); - y[34] = f343 + f344; - y[28] = f345 - f344; - f348 = f242 + f129; - f349 = MUL_C(COEF_CONST((-0.0347065382144000)), f242); - f350 = MUL_C(COEF_CONST(0.7242470829514669), f348); - f351 = MUL_C(COEF_CONST(1.4137876276885337), f129); - y[32] = f349 + f350; - y[30] = f351 - f350; - f354 = t2[1] - t2[63]; - f355 = t2[1] + t2[63]; - f356 = t2[3] - t2[61]; - f357 = t2[3] + t2[61]; - f358 = t2[5] - t2[59]; - f359 = t2[5] + t2[59]; - f360 = t2[7] - t2[57]; - f361 = t2[7] + t2[57]; - f362 = t2[9] - t2[55]; - f363 = t2[9] + t2[55]; - f364 = t2[11] - t2[53]; - f365 = t2[11] + t2[53]; - f366 = t2[13] - t2[51]; - f367 = t2[13] + t2[51]; - f368 = t2[15] - t2[49]; - f369 = t2[15] + t2[49]; - f370 = t2[17] - t2[47]; - f371 = t2[17] + t2[47]; - f372 = t2[19] - t2[45]; - f373 = t2[19] + t2[45]; - f374 = t2[21] - t2[43]; - f375 = t2[21] + t2[43]; - f376 = t2[23] - t2[41]; - f377 = t2[23] + t2[41]; - f378 = t2[25] - t2[39]; - f379 = t2[25] + t2[39]; - f380 = t2[27] - t2[37]; - f381 = t2[27] + t2[37]; - f382 = t2[29] - t2[35]; - f383 = t2[29] + t2[35]; - f384 = t2[31] - t2[33]; - f385 = t2[31] + t2[33]; - f386 = f369 + f371; - f387 = f371 - f369; - f388 = MUL_C(COEF_CONST(0.7071067811865476), f387); - f389 = MUL_C(COEF_CONST(0.7071067811865476), f386); - f390 = f363 + f377; - f391 = f363 - f377; - f392 = MUL_C(COEF_CONST(0.7071067811865476), f391); - f393 = MUL_C(COEF_CONST(0.7071067811865476), f390); - f394 = f367 + f373; - f395 = f367 - f373; - f396 = MUL_C(COEF_CONST(0.7071067811865476), f395); - f397 = MUL_C(COEF_CONST(0.7071067811865476), f394); - f398 = f365 + f375; - f399 = f375 - f365; - f400 = MUL_C(COEF_CONST(0.7071067811865476), f399); - f401 = MUL_C(COEF_CONST(0.7071067811865476), f398); - f402 = f355 - f388; - f403 = f355 + f388; - f404 = f389 - f385; - f405 = f385 + f389; - f406 = f361 + f392; - f407 = f392 - f361; - f408 = f379 - f393; - f409 = f379 + f393; - f410 = f357 + f396; - f411 = f396 - f357; - f412 = f383 - f397; - f413 = f383 + f397; - f414 = f359 - f400; - f415 = f359 + f400; - f416 = f401 - f381; - f417 = f381 + f401; - f418 = f409 + f407; - f419 = MUL_C(COEF_CONST((-0.5411961001461969)), f409); - f420 = MUL_C(COEF_CONST(0.9238795325112867), f418); - f421 = MUL_C(COEF_CONST(1.3065629648763766), f407); - f422 = f419 + f420; - f423 = f421 - f420; - f424 = f408 - f406; - f425 = MUL_C(COEF_CONST(1.3065629648763770), f408); - f426 = MUL_C(COEF_CONST((-0.3826834323650904)), f424); - f427 = MUL_C(COEF_CONST(0.5411961001461961), f406); - f428 = f425 + f426; - f429 = f426 + f427; - f430 = f415 - f417; - f431 = MUL_C(COEF_CONST((-0.5411961001461969)), f417); - f432 = MUL_C(COEF_CONST(0.9238795325112867), f430); - f433 = MUL_C(COEF_CONST(1.3065629648763766), f415); - f434 = f432 - f431; - f435 = f433 - f432; - f436 = f416 + f414; - f437 = MUL_C(COEF_CONST(1.3065629648763770), f416); - f438 = MUL_C(COEF_CONST((-0.3826834323650904)), f436); - f439 = MUL_C(COEF_CONST(0.5411961001461961), f414); - f440 = f437 + f438; - f441 = f439 - f438; - f442 = f403 - f422; - f443 = f403 + f422; - f444 = f405 + f423; - f445 = f423 - f405; - f446 = f402 - f428; - f447 = f402 + f428; - f448 = f404 + f429; - f449 = f404 - f429; - f450 = f411 - f434; - f451 = f411 + f434; - f452 = f413 - f435; - f453 = f413 + f435; - f454 = f410 + f440; - f455 = f440 - f410; - f456 = f412 - f441; - f457 = f412 + f441; - f458 = f453 + f451; - f459 = MUL_C(COEF_CONST((-0.7856949583871021)), f453); - f460 = MUL_C(COEF_CONST(0.9807852804032304), f458); - f461 = MUL_C(COEF_CONST(1.1758756024193588), f451); - f462 = f459 + f460; - f463 = f461 - f460; - f464 = f457 + f455; - f465 = MUL_C(COEF_CONST(0.2758993792829431), f457); - f466 = MUL_C(COEF_CONST(0.5555702330196022), f464); - f467 = MUL_C(COEF_CONST(1.3870398453221475), f455); - f468 = f465 + f466; - f469 = f467 - f466; - f470 = f452 + f450; - f471 = MUL_C(COEF_CONST(1.1758756024193591), f452); - f472 = MUL_C(COEF_CONST((-0.1950903220161287)), f470); - f473 = MUL_C(COEF_CONST(0.7856949583871016), f450); - f474 = f471 + f472; - f475 = f473 - f472; - f476 = f456 - f454; - f477 = MUL_C(COEF_CONST(1.3870398453221473), f456); - f478 = MUL_C(COEF_CONST((-0.8314696123025455)), f476); - f479 = MUL_C(COEF_CONST((-0.2758993792829436)), f454); - f480 = f477 + f478; - f481 = f478 + f479; - f482 = f443 - f462; - f483 = f443 + f462; - f484 = f445 - f463; - f485 = f445 + f463; - f486 = f447 - f468; - f487 = f447 + f468; - f488 = f449 - f469; - f489 = f449 + f469; - f490 = f442 - f474; - f491 = f442 + f474; - f492 = f444 + f475; - f493 = f475 - f444; - f494 = f446 - f480; - f495 = f446 + f480; - f496 = f448 + f481; - f497 = f448 - f481; - f498 = f485 + f483; - f499 = MUL_C(COEF_CONST((-0.9497277818777543)), f485); - f500 = MUL_C(COEF_CONST(0.9987954562051724), f498); - f501 = MUL_C(COEF_CONST(1.0478631305325905), f483); - y[61] = f499 + f500; - y[1] = f501 - f500; - f504 = f489 + f487; - f505 = MUL_C(COEF_CONST((-0.7270510732912801)), f489); - f506 = MUL_C(COEF_CONST(0.9700312531945440), f504); - f507 = MUL_C(COEF_CONST(1.2130114330978079), f487); - y[53] = f505 + f506; - y[9] = f507 - f506; - f510 = f493 + f491; - f511 = MUL_C(COEF_CONST((-0.4764341996931611)), f493); - f512 = MUL_C(COEF_CONST(0.9039892931234433), f510); - f513 = MUL_C(COEF_CONST(1.3315443865537255), f491); - y[45] = f511 + f512; - y[17] = f513 - f512; - f516 = f497 + f495; - f517 = MUL_C(COEF_CONST((-0.2075082269882114)), f497); - f518 = MUL_C(COEF_CONST(0.8032075314806448), f516); - f519 = MUL_C(COEF_CONST(1.3989068359730783), f495); - y[37] = f517 + f518; - y[25] = f519 - f518; - f522 = f484 + f482; - f523 = MUL_C(COEF_CONST(0.0693921705079408), f484); - f524 = MUL_C(COEF_CONST(0.6715589548470183), f522); - f525 = MUL_C(COEF_CONST(1.4125100802019774), f482); - y[29] = f523 + f524; - y[33] = f525 - f524; - f528 = f488 + f486; - f529 = MUL_C(COEF_CONST(0.3436258658070505), f488); - f530 = MUL_C(COEF_CONST(0.5141027441932217), f528); - f531 = MUL_C(COEF_CONST(1.3718313541934939), f486); - y[21] = f529 + f530; - y[41] = f531 - f530; - f534 = f490 - f492; - f535 = MUL_C(COEF_CONST(0.6046542117908007), f492); - f536 = MUL_C(COEF_CONST(0.3368898533922201), f534); - f537 = MUL_C(COEF_CONST(1.2784339185752409), f490); - y[13] = f536 - f535; - y[49] = f537 - f536; - f540 = f496 + f494; - f541 = MUL_C(COEF_CONST(0.8424460355094192), f496); - f542 = MUL_C(COEF_CONST(0.1467304744553618), f540); - f543 = MUL_C(COEF_CONST(1.1359069844201428), f494); - y[5] = f541 + f542; - y[57] = f543 - f542; - f546 = f354 + f384; - f547 = f354 - f384; - f548 = f356 + f382; - f549 = f382 - f356; - f550 = f358 + f380; - f551 = f358 - f380; - f552 = f360 + f378; - f553 = f378 - f360; - f554 = f362 + f376; - f555 = f362 - f376; - f556 = f364 + f374; - f557 = f374 - f364; - f558 = f366 + f372; - f559 = f366 - f372; - f560 = f368 + f370; - f561 = f370 - f368; - f562 = f547 - f561; - f563 = f547 + f561; - f564 = f549 - f559; - f565 = f549 + f559; - f566 = f551 - f557; - f567 = f551 + f557; - f568 = f553 - f555; - f569 = f553 + f555; - f570 = f563 - f569; - f571 = f563 + f569; - f572 = f565 - f567; - f573 = f565 + f567; - f574 = f571 - f573; - y[63] = f571 + f573; - y[31] = MUL_C(COEF_CONST(0.7071067811865476), f574); - f577 = f570 + f572; - f578 = MUL_C(COEF_CONST(1.3065629648763766), f570); - f579 = MUL_C(COEF_CONST((-0.9238795325112866)), f577); - f580 = MUL_C(COEF_CONST((-0.5411961001461967)), f572); - y[15] = f578 + f579; - y[47] = f580 - f579; - f583 = f564 + f562; - f584 = f566 + f564; - f585 = f568 + f566; - f586 = MUL_C(COEF_CONST(0.7071067811865476), f584); - f587 = f562 - f586; - f588 = f562 + f586; - f589 = f583 + f585; - f590 = MUL_C(COEF_CONST(1.3065629648763766), f583); - f591 = MUL_C(COEF_CONST((-0.9238795325112866)), f589); - f592 = MUL_C(COEF_CONST((-0.5411961001461967)), f585); - f593 = f590 + f591; - f594 = f592 - f591; - f595 = f588 - f594; - f596 = f588 + f594; - f597 = f587 - f593; - f598 = f587 + f593; - y[55] = MUL_C(COEF_CONST(0.5097955791041592), f596); - y[39] = MUL_C(COEF_CONST(0.6013448869350453), f598); - y[23] = MUL_C(COEF_CONST(0.8999762231364156), f597); - y[7] = MUL_C(COEF_CONST(2.5629154477415055), f595); - f603 = MUL_C(COEF_CONST(0.5024192861881557), f546); - f604 = MUL_C(COEF_CONST(0.5224986149396889), f548); - f605 = MUL_C(COEF_CONST(0.5669440348163577), f550); - f606 = MUL_C(COEF_CONST(0.6468217833599901), f552); - f607 = MUL_C(COEF_CONST(0.7881546234512502), f554); - f608 = MUL_C(COEF_CONST(1.0606776859903471), f556); - f609 = MUL_C(COEF_CONST(1.7224470982383342), f558); - f610 = MUL_C(COEF_CONST(5.1011486186891553), f560); - f611 = f603 + f610; - f612 = f603 - f610; - f613 = f604 + f609; - f614 = f609 - f604; - f615 = f605 + f608; - f616 = f605 - f608; - f617 = f606 + f607; - f618 = f607 - f606; - f619 = f612 - f618; - f620 = f612 + f618; - f621 = f614 - f616; - f622 = f614 + f616; - f623 = f620 - f622; - f624 = f620 + f622; - f625 = MUL_C(COEF_CONST(0.7071067811865476), f623); - f626 = f619 + f621; - f627 = MUL_C(COEF_CONST(1.3065629648763766), f619); - f628 = MUL_C(COEF_CONST((-0.9238795325112866)), f626); - f629 = MUL_C(COEF_CONST((-0.5411961001461967)), f621); - f630 = f627 + f628; - f631 = f629 - f628; - f632 = f611 - f613; - f633 = f615 - f613; - f634 = f615 - f617; - f635 = MUL_C(COEF_CONST(0.7071067811865476), f633); - f636 = f611 - f635; - f637 = f611 + f635; - f638 = f632 + f634; - f639 = MUL_C(COEF_CONST(1.3065629648763766), f632); - f640 = MUL_C(COEF_CONST((-0.9238795325112866)), f638); - f641 = MUL_C(COEF_CONST((-0.5411961001461967)), f634); - f642 = f639 + f640; - f643 = f641 - f640; - f644 = f637 - f643; - f645 = f637 + f643; - f646 = f636 - f642; - f647 = f636 + f642; - f648 = MUL_C(COEF_CONST(0.5097955791041592), f645); - f649 = MUL_C(COEF_CONST(0.6013448869350453), f647); - f650 = MUL_C(COEF_CONST(0.8999762231364156), f646); - y[3] = MUL_C(COEF_CONST(2.5629154477415055), f644); - y[59] = f624 + f648; - y[51] = f648 + f631; - y[43] = f631 + f649; - y[35] = f649 + f625; - y[27] = f625 + f650; - y[19] = f650 + f630; - y[11] = f630 + y[3]; -} - -#else - -void DCT4_64(real_t *y, real_t *x) -{ - int16_t i0; - ALIGN static real_t t2[64]; - - t2[0] = x[0]; - for (i0=0; i0<31; i0++) - { - t2[2*i0+1] = x[2*i0+1] - x[2*i0+2]; - t2[2*i0+2] = x[2*i0+1] + x[2*i0+2]; - } - t2[63] = x[63]; - - DCT4_64_kernel(y, t2); -} - -void DCT4_64_kernel(real_t *y, real_t *t2) -{ - real_t f2, f3, f4, f5, f6, f7, f8; - real_t f9, f10, f11, f12, f13, f14, f15; - real_t f16, f17, f18, f19, f20, f21, f22; - real_t f23, f24, f25, f26, f27, f28, f29; - real_t f30, f31, f32, f33, f34, f35, f36; - real_t f37, f38, f39, f40, f41, f42, f43; - real_t f44, f45, f46, f47, f48, f49, f50; - real_t f51, f52, f53, f54, f55, f56, f57; - real_t f58, f59, f60, f61, f62, f63, f64; - real_t f65, f66, f67, f68, f69, f70, f71; - real_t f72, f73, f74, f75, f76, f77, f78; - real_t f79, f80, f81, f82, f83, f84, f85; - real_t f86, f87, f88, f89, f90, f91, f92; - real_t f93, f94, f95, f96, f97, f98, f99; - real_t f100, f101, f102, f103, f104, f105, f106; - real_t f107, f108, f109, f110, f111, f112, f113; - real_t f114, f115, f116, f117, f118, f119, f120; - real_t f121, f122, f123, f124, f125, f126, f127; - real_t f128, f129, f130, f131, f132, f133, f134; - real_t f135, f136, f137, f138, f139, f140, f141; - real_t f142, f143, f144, f145, f146, f147, f148; - real_t f149, f150, f151, f152, f153, f154, f155; - real_t f156, f157, f158, f159, f160, f161, f162; - real_t f163, f164, f165, f166, f167, f168, f169; - real_t f170, f171, f172, f173, f174, f175, f176; - real_t f177, f178, f179, f180, f181, f182, f183; - real_t f184, f185, f186, f187, f188, f189, f190; - real_t f191, f192, f193, f194, f195, f196, f197; - real_t f198, f199, f200, f201, f202, f203, f204; - real_t f205, f206, f207, f208, f209, f210, f211; - real_t f212, f213, f214, f215, f216, f217, f218; - real_t f219, f220, f221, f222, f223, f224, f225; - real_t f226, f227, f228, f229, f230, f231, f232; - real_t f233, f234, f235, f236, f237, f238, f239; - real_t f240, f241, f242, f243, f244, f245, f246; - real_t f247, f248, f249, f250, f251, f252, f253; - real_t f254, f255, f256, f257, f258, f259, f260; - real_t f261, f262, f263, f264, f265, f266, f267; - real_t f268, f269, f270, f271, f272, f273, f274; - real_t f275, f276, f277, f278, f279, f280, f281; - real_t f282, f283, f284, f285, f286, f287, f288; - real_t f289, f290, f291, f292, f293, f294, f295; - real_t f296, f297, f298, f299, f300, f301, f302; - real_t f303, f304, f305, f306, f307, f308, f309; - real_t f310, f311, f312, f313, f314, f315, f316; - real_t f317, f318, f319, f320, f321, f322, f323; - real_t f324, f325, f326, f327, f328, f329, f330; - real_t f331, f332, f333, f334, f335, f336, f337; - real_t f338, f339, f340, f341, f342, f343, f344; - real_t f345, f346, f347, f348, f349, f350, f351; - real_t f352, f353, f354, f355, f356, f357, f358; - real_t f359, f360, f361, f362, f363, f364, f365; - real_t f366, f367, f368, f369, f370, f371, f372; - real_t f373, f374, f375, f376, f377, f378, f379; - real_t f380, f381, f382, f383, f384, f385, f386; - real_t f387, f388, f389, f390, f391, f392, f393; - real_t f394, f395, f396, f397, f398, f399, f400; - real_t f401, f402, f403, f404, f405, f406, f407; - real_t f408, f409, f410, f411, f412, f413, f414; - real_t f415, f416, f417, f418, f419, f420, f421; - real_t f422, f423, f424, f425, f426, f427, f428; - real_t f429, f430, f431, f432, f433, f434, f435; - real_t f436, f437, f438, f439, f440, f441, f442; - real_t f443, f444, f445, f446, f447, f448, f449; - real_t f450, f451, f452, f453, f454, f455, f456; - real_t f457, f458, f459, f460, f461, f462, f463; - real_t f464, f465, f466, f467, f468, f469, f470; - real_t f471, f472, f473, f474, f475, f476, f477; - real_t f478, f479, f480, f481, f482, f483, f484; - real_t f485, f486, f487, f488, f489, f490, f491; - real_t f492, f493, f494, f495, f496, f497, f498; - real_t f499, f500, f501, f502, f503, f504, f505; - real_t f506, f507, f508, f509, f510, f511, f512; - real_t f513, f514, f515, f516, f517, f518, f519; - real_t f520, f521, f522, f523, f524, f525, f526; - real_t f527, f528, f529, f530, f531, f532, f533; - real_t f534, f535, f536, f537, f538, f539, f540; - real_t f541, f542, f543, f544, f545, f546, f547; - real_t f548, f549, f550, f551, f552, f553, f554; - real_t f555, f556, f557, f558, f559, f560, f561; - real_t f562, f563, f564, f565, f566, f567, f568; - real_t f569, f570, f571, f572, f573, f574, f575; - real_t f576, f577, f578, f579, f580, f581, f582; - real_t f583, f584, f585, f586, f587, f588, f589; - real_t f590, f591, f592, f593, f594, f595, f596; - real_t f597, f598, f599, f600, f601, f602, f603; - real_t f604, f605, f606, f607, f608, f609, f610; - real_t f611, f612, f613, f614, f615, f618, f619; - real_t f620, f621, f624, f625, f626, f627, f630; - real_t f631, f632, f633, f636, f637, f638, f639; - real_t f642, f643, f644, f645, f648, f649, f650; - real_t f651, f654, f655, f656, f657, f660, f661; - real_t f662, f663, f666, f667, f668, f669, f672; - real_t f673, f674, f675, f678, f679, f680, f681; - real_t f684, f685, f686, f687, f690, f691, f692; - real_t f693, f696, f697, f698, f699, f702, f703; - real_t f704, f705, f708, f709, f710, f711, f714; - real_t f715, f716, f717, f720, f721, f722, f723; - real_t f726, f727, f728, f729, f732, f733, f734; - real_t f735, f738, f739, f740, f741, f744, f745; - real_t f746, f747, f750, f751, f752, f753, f756; - real_t f757, f758, f759, f762, f763, f764, f765; - real_t f768, f769, f770, f771, f774, f775, f776; - real_t f777, f780, f781, f782, f783, f786, f787; - real_t f788, f789, f792, f793, f794, f795, f798; - real_t f799, f800, f801; - - f2 = 0.7071067811865476 * t2[32]; - f3 = t2[0] - f2; - f4 = t2[0] + f2; - f5 = t2[16] + t2[48]; - f6 = 1.3065629648763766 * t2[16]; - f7 = (-0.9238795325112866) * f5; - f8 = (-0.5411961001461967) * t2[48]; - f9 = f6 + f7; - f10 = f8 - f7; - f11 = f4 - f10; - f12 = f4 + f10; - f13 = f3 - f9; - f14 = f3 + f9; - f15 = t2[8] + t2[56]; - f16 = 1.1758756024193588 * t2[8]; - f17 = (-0.9807852804032304) * f15; - f18 = (-0.7856949583871021) * t2[56]; - f19 = f16 + f17; - f20 = f18 - f17; - f21 = t2[24] + t2[40]; - f22 = 1.3870398453221473 * t2[24]; - f23 = (-0.8314696123025455) * f21; - f24 = (-0.2758993792829436) * t2[40]; - f25 = f22 + f23; - f26 = f24 - f23; - f27 = f20 - f26; - f28 = f20 + f26; - f29 = 0.7071067811865476 * f27; - f30 = f19 - f25; - f31 = f19 + f25; - f32 = 0.7071067811865476 * f31; - f33 = f29 - f32; - f34 = f29 + f32; - f35 = f12 - f28; - f36 = f12 + f28; - f37 = f14 - f34; - f38 = f14 + f34; - f39 = f13 - f33; - f40 = f13 + f33; - f41 = f11 - f30; - f42 = f11 + f30; - f43 = t2[4] + t2[60]; - f44 = 1.0932018670017569 * t2[4]; - f45 = (-0.9951847266721969) * f43; - f46 = (-0.8971675863426368) * t2[60]; - f47 = f44 + f45; - f48 = f46 - f45; - f49 = t2[12] + t2[52]; - f50 = 1.2472250129866711 * t2[12]; - f51 = (-0.9569403357322089) * f49; - f52 = (-0.6666556584777469) * t2[52]; - f53 = f50 + f51; - f54 = f52 - f51; - f55 = t2[20] + t2[44]; - f56 = 1.3533180011743526 * t2[20]; - f57 = (-0.8819212643483551) * f55; - f58 = (-0.4105245275223575) * t2[44]; - f59 = f56 + f57; - f60 = f58 - f57; - f61 = t2[28] + t2[36]; - f62 = 1.4074037375263826 * t2[28]; - f63 = (-0.7730104533627369) * f61; - f64 = (-0.1386171691990913) * t2[36]; - f65 = f62 + f63; - f66 = f64 - f63; - f67 = f48 - f66; - f68 = f48 + f66; - f69 = f54 - f60; - f70 = f54 + f60; - f71 = f68 - f70; - f72 = f68 + f70; - f73 = 0.7071067811865476 * f71; - f74 = f67 + f69; - f75 = 1.3065629648763766 * f67; - f76 = (-0.9238795325112866) * f74; - f77 = (-0.5411961001461967) * f69; - f78 = f75 + f76; - f79 = f77 - f76; - f80 = f47 - f65; - f81 = f47 + f65; - f82 = f53 - f59; - f83 = f53 + f59; - f84 = f81 + f83; - f85 = 1.3065629648763770 * f81; - f86 = (-0.3826834323650904) * f84; - f87 = 0.5411961001461961 * f83; - f88 = f85 + f86; - f89 = f87 - f86; - f90 = f80 - f82; - f91 = f80 + f82; - f92 = 0.7071067811865476 * f91; - f93 = f79 - f89; - f94 = f79 + f89; - f95 = f73 - f92; - f96 = f73 + f92; - f97 = f78 - f88; - f98 = f78 + f88; - f99 = f36 - f72; - f100 = f36 + f72; - f101 = f38 - f94; - f102 = f38 + f94; - f103 = f40 - f93; - f104 = f40 + f93; - f105 = f42 - f96; - f106 = f42 + f96; - f107 = f41 - f95; - f108 = f41 + f95; - f109 = f39 - f98; - f110 = f39 + f98; - f111 = f37 - f97; - f112 = f37 + f97; - f113 = f35 - f90; - f114 = f35 + f90; - f115 = t2[2] + t2[62]; - f116 = 1.0478631305325901 * t2[2]; - f117 = (-0.9987954562051724) * f115; - f118 = (-0.9497277818777548) * t2[62]; - f119 = f116 + f117; - f120 = f118 - f117; - f121 = t2[10] + t2[54]; - f122 = 1.2130114330978077 * t2[10]; - f123 = (-0.9700312531945440) * f121; - f124 = (-0.7270510732912803) * t2[54]; - f125 = f122 + f123; - f126 = f124 - f123; - f127 = t2[18] + t2[46]; - f128 = 1.3315443865537255 * t2[18]; - f129 = (-0.9039892931234433) * f127; - f130 = (-0.4764341996931612) * t2[46]; - f131 = f128 + f129; - f132 = f130 - f129; - f133 = t2[26] + t2[38]; - f134 = 1.3989068359730781 * t2[26]; - f135 = (-0.8032075314806453) * f133; - f136 = (-0.2075082269882124) * t2[38]; - f137 = f134 + f135; - f138 = f136 - f135; - f139 = t2[34] + t2[30]; - f140 = 1.4125100802019777 * t2[34]; - f141 = (-0.6715589548470187) * f139; - f142 = 0.0693921705079402 * t2[30]; - f143 = f140 + f141; - f144 = f142 - f141; - f145 = t2[42] + t2[22]; - f146 = 1.3718313541934939 * t2[42]; - f147 = (-0.5141027441932219) * f145; - f148 = 0.3436258658070501 * t2[22]; - f149 = f146 + f147; - f150 = f148 - f147; - f151 = t2[50] + t2[14]; - f152 = 1.2784339185752409 * t2[50]; - f153 = (-0.3368898533922200) * f151; - f154 = 0.6046542117908008 * t2[14]; - f155 = f152 + f153; - f156 = f154 - f153; - f157 = t2[58] + t2[6]; - f158 = 1.1359069844201433 * t2[58]; - f159 = (-0.1467304744553624) * f157; - f160 = 0.8424460355094185 * t2[6]; - f161 = f158 + f159; - f162 = f160 - f159; - f163 = f120 - f144; - f164 = f120 + f144; - f165 = f119 - f143; - f166 = f119 + f143; - f167 = f126 - f150; - f168 = f126 + f150; - f169 = f125 - f149; - f170 = f125 + f149; - f171 = f132 - f156; - f172 = f132 + f156; - f173 = f131 - f155; - f174 = f131 + f155; - f175 = f138 - f162; - f176 = f138 + f162; - f177 = f137 - f161; - f178 = f137 + f161; - f179 = f163 + f165; - f180 = 1.1758756024193588 * f163; - f181 = (-0.9807852804032304) * f179; - f182 = (-0.7856949583871021) * f165; - f183 = f180 + f181; - f184 = f182 - f181; - f185 = f167 + f169; - f186 = 1.3870398453221475 * f167; - f187 = (-0.5555702330196022) * f185; - f188 = 0.2758993792829431 * f169; - f189 = f186 + f187; - f190 = f188 - f187; - f191 = f171 + f173; - f192 = 0.7856949583871022 * f171; - f193 = 0.1950903220161283 * f191; - f194 = 1.1758756024193586 * f173; - f195 = f192 + f193; - f196 = f194 - f193; - f197 = f175 + f177; - f198 = (-0.2758993792829430) * f175; - f199 = 0.8314696123025452 * f197; - f200 = 1.3870398453221475 * f177; - f201 = f198 + f199; - f202 = f200 - f199; - f203 = f164 - f172; - f204 = f164 + f172; - f205 = f166 - f174; - f206 = f166 + f174; - f207 = f168 - f176; - f208 = f168 + f176; - f209 = f170 - f178; - f210 = f170 + f178; - f211 = f184 - f196; - f212 = f184 + f196; - f213 = f183 - f195; - f214 = f183 + f195; - f215 = f190 - f202; - f216 = f190 + f202; - f217 = f189 - f201; - f218 = f189 + f201; - f219 = f203 + f205; - f220 = 1.3065629648763766 * f203; - f221 = (-0.9238795325112866) * f219; - f222 = (-0.5411961001461967) * f205; - f223 = f220 + f221; - f224 = f222 - f221; - f225 = f207 + f209; - f226 = 0.5411961001461969 * f207; - f227 = 0.3826834323650898 * f225; - f228 = 1.3065629648763766 * f209; - f229 = f226 + f227; - f230 = f228 - f227; - f231 = f211 + f213; - f232 = 1.3065629648763766 * f211; - f233 = (-0.9238795325112866) * f231; - f234 = (-0.5411961001461967) * f213; - f235 = f232 + f233; - f236 = f234 - f233; - f237 = f215 + f217; - f238 = 0.5411961001461969 * f215; - f239 = 0.3826834323650898 * f237; - f240 = 1.3065629648763766 * f217; - f241 = f238 + f239; - f242 = f240 - f239; - f243 = f204 - f208; - f244 = f204 + f208; - f245 = f206 - f210; - f246 = f206 + f210; - f247 = f224 - f230; - f248 = f224 + f230; - f249 = f223 - f229; - f250 = f223 + f229; - f251 = f212 - f216; - f252 = f212 + f216; - f253 = f214 - f218; - f254 = f214 + f218; - f255 = f236 - f242; - f256 = f236 + f242; - f257 = f235 - f241; - f258 = f235 + f241; - f259 = f243 - f245; - f260 = f243 + f245; - f261 = 0.7071067811865474 * f259; - f262 = 0.7071067811865474 * f260; - f263 = f247 - f249; - f264 = f247 + f249; - f265 = 0.7071067811865474 * f263; - f266 = 0.7071067811865474 * f264; - f267 = f251 - f253; - f268 = f251 + f253; - f269 = 0.7071067811865474 * f267; - f270 = 0.7071067811865474 * f268; - f271 = f255 - f257; - f272 = f255 + f257; - f273 = 0.7071067811865474 * f271; - f274 = 0.7071067811865474 * f272; - f275 = f100 - f244; - f276 = f100 + f244; - f277 = f102 - f252; - f278 = f102 + f252; - f279 = f104 - f256; - f280 = f104 + f256; - f281 = f106 - f248; - f282 = f106 + f248; - f283 = f108 - f266; - f284 = f108 + f266; - f285 = f110 - f274; - f286 = f110 + f274; - f287 = f112 - f270; - f288 = f112 + f270; - f289 = f114 - f262; - f290 = f114 + f262; - f291 = f113 - f261; - f292 = f113 + f261; - f293 = f111 - f269; - f294 = f111 + f269; - f295 = f109 - f273; - f296 = f109 + f273; - f297 = f107 - f265; - f298 = f107 + f265; - f299 = f105 - f250; - f300 = f105 + f250; - f301 = f103 - f258; - f302 = f103 + f258; - f303 = f101 - f254; - f304 = f101 + f254; - f305 = f99 - f246; - f306 = f99 + f246; - f307 = t2[1] - t2[61]; - f308 = 1.0478631305325901 * t2[1]; - f309 = (-0.9987954562051724) * f307; - f310 = (-0.9497277818777548) * t2[61]; - f311 = f308 + f309; - f312 = f309 + f310; - f313 = t2[9] - t2[53]; - f314 = 1.2130114330978077 * t2[9]; - f315 = (-0.9700312531945440) * f313; - f316 = (-0.7270510732912803) * t2[53]; - f317 = f314 + f315; - f318 = f315 + f316; - f319 = t2[17] - t2[45]; - f320 = 1.3315443865537255 * t2[17]; - f321 = (-0.9039892931234433) * f319; - f322 = (-0.4764341996931612) * t2[45]; - f323 = f320 + f321; - f324 = f321 + f322; - f325 = t2[25] - t2[37]; - f326 = 1.3989068359730781 * t2[25]; - f327 = (-0.8032075314806453) * f325; - f328 = (-0.2075082269882124) * t2[37]; - f329 = f326 + f327; - f330 = f327 + f328; - f331 = t2[33] - t2[29]; - f332 = 1.4125100802019777 * t2[33]; - f333 = (-0.6715589548470187) * f331; - f334 = 0.0693921705079402 * t2[29]; - f335 = f332 + f333; - f336 = f333 + f334; - f337 = t2[41] - t2[21]; - f338 = 1.3718313541934939 * t2[41]; - f339 = (-0.5141027441932219) * f337; - f340 = 0.3436258658070501 * t2[21]; - f341 = f338 + f339; - f342 = f339 + f340; - f343 = t2[49] - t2[13]; - f344 = 1.2784339185752409 * t2[49]; - f345 = (-0.3368898533922200) * f343; - f346 = 0.6046542117908008 * t2[13]; - f347 = f344 + f345; - f348 = f345 + f346; - f349 = t2[57] - t2[5]; - f350 = 1.1359069844201433 * t2[57]; - f351 = (-0.1467304744553624) * f349; - f352 = 0.8424460355094185 * t2[5]; - f353 = f350 + f351; - f354 = f351 + f352; - f355 = f336 - f312; - f356 = f312 + f336; - f357 = f311 - f335; - f358 = f311 + f335; - f359 = f342 - f318; - f360 = f318 + f342; - f361 = f317 - f341; - f362 = f317 + f341; - f363 = f348 - f324; - f364 = f324 + f348; - f365 = f323 - f347; - f366 = f323 + f347; - f367 = f354 - f330; - f368 = f330 + f354; - f369 = f329 - f353; - f370 = f329 + f353; - f371 = f355 + f357; - f372 = 1.1758756024193588 * f355; - f373 = (-0.9807852804032304) * f371; - f374 = (-0.7856949583871021) * f357; - f375 = f372 + f373; - f376 = f374 - f373; - f377 = f359 + f361; - f378 = 1.3870398453221475 * f359; - f379 = (-0.5555702330196022) * f377; - f380 = 0.2758993792829431 * f361; - f381 = f378 + f379; - f382 = f380 - f379; - f383 = f363 + f365; - f384 = 0.7856949583871022 * f363; - f385 = 0.1950903220161283 * f383; - f386 = 1.1758756024193586 * f365; - f387 = f384 + f385; - f388 = f386 - f385; - f389 = f367 + f369; - f390 = (-0.2758993792829430) * f367; - f391 = 0.8314696123025452 * f389; - f392 = 1.3870398453221475 * f369; - f393 = f390 + f391; - f394 = f392 - f391; - f395 = f364 - f356; - f396 = f356 + f364; - f397 = f358 - f366; - f398 = f358 + f366; - f399 = f368 - f360; - f400 = f360 + f368; - f401 = f362 - f370; - f402 = f362 + f370; - f403 = f376 - f388; - f404 = f376 + f388; - f405 = f375 - f387; - f406 = f375 + f387; - f407 = f382 - f394; - f408 = f382 + f394; - f409 = f381 - f393; - f410 = f381 + f393; - f411 = f395 + f397; - f412 = 1.3065629648763766 * f395; - f413 = (-0.9238795325112866) * f411; - f414 = (-0.5411961001461967) * f397; - f415 = f412 + f413; - f416 = f414 - f413; - f417 = f399 + f401; - f418 = 0.5411961001461969 * f399; - f419 = 0.3826834323650898 * f417; - f420 = 1.3065629648763766 * f401; - f421 = f418 + f419; - f422 = f420 - f419; - f423 = f403 + f405; - f424 = 1.3065629648763766 * f403; - f425 = (-0.9238795325112866) * f423; - f426 = (-0.5411961001461967) * f405; - f427 = f424 + f425; - f428 = f426 - f425; - f429 = f407 + f409; - f430 = 0.5411961001461969 * f407; - f431 = 0.3826834323650898 * f429; - f432 = 1.3065629648763766 * f409; - f433 = f430 + f431; - f434 = f432 - f431; - f435 = f400 - f396; - f436 = f396 + f400; - f437 = f398 - f402; - f438 = f398 + f402; - f439 = f416 - f422; - f440 = f416 + f422; - f441 = f415 - f421; - f442 = f415 + f421; - f443 = f404 - f408; - f444 = f404 + f408; - f445 = f406 - f410; - f446 = f406 + f410; - f447 = f428 - f434; - f448 = f428 + f434; - f449 = f427 - f433; - f450 = f427 + f433; - f451 = f435 - f437; - f452 = f435 + f437; - f453 = 0.7071067811865474 * f451; - f454 = 0.7071067811865474 * f452; - f455 = f439 - f441; - f456 = f439 + f441; - f457 = 0.7071067811865474 * f455; - f458 = 0.7071067811865474 * f456; - f459 = f443 - f445; - f460 = f443 + f445; - f461 = 0.7071067811865474 * f459; - f462 = 0.7071067811865474 * f460; - f463 = f447 - f449; - f464 = f447 + f449; - f465 = 0.7071067811865474 * f463; - f466 = 0.7071067811865474 * f464; - f467 = 0.7071067811865476 * t2[31]; - f468 = t2[63] - f467; - f469 = t2[63] + f467; - f470 = t2[47] + t2[15]; - f471 = 1.3065629648763766 * t2[47]; - f472 = (-0.9238795325112866) * f470; - f473 = (-0.5411961001461967) * t2[15]; - f474 = f471 + f472; - f475 = f473 - f472; - f476 = f469 - f475; - f477 = f469 + f475; - f478 = f468 - f474; - f479 = f468 + f474; - f480 = t2[55] + t2[7]; - f481 = 1.1758756024193588 * t2[55]; - f482 = (-0.9807852804032304) * f480; - f483 = (-0.7856949583871021) * t2[7]; - f484 = f481 + f482; - f485 = f483 - f482; - f486 = t2[39] + t2[23]; - f487 = 1.3870398453221473 * t2[39]; - f488 = (-0.8314696123025455) * f486; - f489 = (-0.2758993792829436) * t2[23]; - f490 = f487 + f488; - f491 = f489 - f488; - f492 = f485 - f491; - f493 = f485 + f491; - f494 = 0.7071067811865476 * f492; - f495 = f484 - f490; - f496 = f484 + f490; - f497 = 0.7071067811865476 * f496; - f498 = f494 - f497; - f499 = f494 + f497; - f500 = f477 - f493; - f501 = f477 + f493; - f502 = f479 - f499; - f503 = f479 + f499; - f504 = f478 - f498; - f505 = f478 + f498; - f506 = f476 - f495; - f507 = f476 + f495; - f508 = t2[59] + t2[3]; - f509 = 1.0932018670017569 * t2[59]; - f510 = (-0.9951847266721969) * f508; - f511 = (-0.8971675863426368) * t2[3]; - f512 = f509 + f510; - f513 = f511 - f510; - f514 = t2[51] + t2[11]; - f515 = 1.2472250129866711 * t2[51]; - f516 = (-0.9569403357322089) * f514; - f517 = (-0.6666556584777469) * t2[11]; - f518 = f515 + f516; - f519 = f517 - f516; - f520 = t2[43] + t2[19]; - f521 = 1.3533180011743526 * t2[43]; - f522 = (-0.8819212643483551) * f520; - f523 = (-0.4105245275223575) * t2[19]; - f524 = f521 + f522; - f525 = f523 - f522; - f526 = t2[35] + t2[27]; - f527 = 1.4074037375263826 * t2[35]; - f528 = (-0.7730104533627369) * f526; - f529 = (-0.1386171691990913) * t2[27]; - f530 = f527 + f528; - f531 = f529 - f528; - f532 = f513 - f531; - f533 = f513 + f531; - f534 = f519 - f525; - f535 = f519 + f525; - f536 = f533 - f535; - f537 = f533 + f535; - f538 = 0.7071067811865476 * f536; - f539 = f532 + f534; - f540 = 1.3065629648763766 * f532; - f541 = (-0.9238795325112866) * f539; - f542 = (-0.5411961001461967) * f534; - f543 = f540 + f541; - f544 = f542 - f541; - f545 = f512 - f530; - f546 = f512 + f530; - f547 = f518 - f524; - f548 = f518 + f524; - f549 = f546 + f548; - f550 = 1.3065629648763770 * f546; - f551 = (-0.3826834323650904) * f549; - f552 = 0.5411961001461961 * f548; - f553 = f550 + f551; - f554 = f552 - f551; - f555 = f545 - f547; - f556 = f545 + f547; - f557 = 0.7071067811865476 * f556; - f558 = f544 - f554; - f559 = f544 + f554; - f560 = f538 - f557; - f561 = f538 + f557; - f562 = f543 - f553; - f563 = f543 + f553; - f564 = f501 - f537; - f565 = f501 + f537; - f566 = f503 - f559; - f567 = f503 + f559; - f568 = f505 - f558; - f569 = f505 + f558; - f570 = f507 - f561; - f571 = f507 + f561; - f572 = f506 - f560; - f573 = f506 + f560; - f574 = f504 - f563; - f575 = f504 + f563; - f576 = f502 - f562; - f577 = f502 + f562; - f578 = f500 - f555; - f579 = f500 + f555; - f580 = f438 - f565; - f581 = f438 + f565; - f582 = f446 + f567; - f583 = f446 - f567; - f584 = f450 - f569; - f585 = f450 + f569; - f586 = f442 + f571; - f587 = f442 - f571; - f588 = f457 - f573; - f589 = f457 + f573; - f590 = f465 + f575; - f591 = f465 - f575; - f592 = f461 - f577; - f593 = f461 + f577; - f594 = f453 + f579; - f595 = f453 - f579; - f596 = f454 - f578; - f597 = f454 + f578; - f598 = f462 + f576; - f599 = f462 - f576; - f600 = f466 - f574; - f601 = f466 + f574; - f602 = f458 + f572; - f603 = f458 - f572; - f604 = f440 - f570; - f605 = f440 + f570; - f606 = f448 + f568; - f607 = f448 - f568; - f608 = f444 - f566; - f609 = f444 + f566; - f610 = f564 - f436; - f611 = f436 + f564; - f612 = f581 + f276; - f613 = (-0.9876531635534246) * f581; - f614 = 0.9999247018391445 * f612; - f615 = 1.0121962401248645 * f276; - y[0] = f613 + f614; - y[63] = f615 - f614; - f618 = f583 + f278; - f619 = (-0.9625151616469906) * f583; - f620 = 0.9993223845883495 * f618; - f621 = 1.0361296075297086 * f278; - y[1] = f619 + f620; - y[62] = f621 - f620; - f624 = f585 + f280; - f625 = (-0.9367973765979405) * f585; - f626 = 0.9981181129001492 * f624; - f627 = 1.0594388492023579 * f280; - y[2] = f625 + f626; - y[61] = f627 - f626; - f630 = f587 + f282; - f631 = (-0.9105152998383381) * f587; - f632 = 0.9963126121827780 * f630; - f633 = 1.0821099245272179 * f282; - y[3] = f631 + f632; - y[60] = f633 - f632; - f636 = f589 + f284; - f637 = (-0.8836847627084729) * f589; - f638 = 0.9939069700023561 * f636; - f639 = 1.1041291772962392 * f284; - y[4] = f637 + f638; - y[59] = f639 - f638; - f642 = f591 + f286; - f643 = (-0.8563219269206538) * f591; - f644 = 0.9909026354277800 * f642; - f645 = 1.1254833439349063 * f286; - y[5] = f643 + f644; - y[58] = f645 - f644; - f648 = f593 + f288; - f649 = (-0.8284432748239970) * f593; - f650 = 0.9873014181578584 * f648; - f651 = 1.1461595614917197 * f288; - y[6] = f649 + f650; - y[57] = f651 - f650; - f654 = f595 + f290; - f655 = (-0.8000655994760753) * f595; - f656 = 0.9831054874312163 * f654; - f657 = 1.1661453753863573 * f290; - y[7] = f655 + f656; - y[56] = f657 - f656; - f660 = f597 + f292; - f661 = (-0.7712059945274091) * f597; - f662 = 0.9783173707196277 * f660; - f663 = 1.1854287469118463 * f292; - y[8] = f661 + f662; - y[55] = f663 - f662; - f666 = f599 + f294; - f667 = (-0.7418818439248888) * f599; - f668 = 0.9729399522055601 * f666; - f669 = 1.2039980604862313 * f294; - y[9] = f667 + f668; - y[54] = f669 - f668; - f672 = f601 + f296; - f673 = (-0.7121108114403374) * f601; - f674 = 0.9669764710448521 * f672; - f675 = 1.2218421306493668 * f296; - y[10] = f673 + f674; - y[53] = f675 - f674; - f678 = f603 + f298; - f679 = (-0.6819108300305128) * f603; - f680 = 0.9604305194155658 * f678; - f681 = 1.2389502088006188 * f298; - y[11] = f679 + f680; - y[52] = f681 - f680; - f684 = f605 + f300; - f685 = (-0.6513000910349656) * f605; - f686 = 0.9533060403541938 * f684; - f687 = 1.2553119896734219 * f300; - y[12] = f685 + f686; - y[51] = f687 - f686; - f690 = f607 + f302; - f691 = (-0.6202970332182582) * f607; - f692 = 0.9456073253805213 * f690; - f693 = 1.2709176175427843 * f302; - y[13] = f691 + f692; - y[50] = f693 - f692; - f696 = f609 + f304; - f697 = (-0.5889203316631404) * f609; - f698 = 0.9373390119125750 * f696; - f699 = 1.2857576921620095 * f304; - y[14] = f697 + f698; - y[49] = f699 - f698; - f702 = f306 - f611; - f703 = (-0.5571888865213779) * f611; - f704 = 0.9285060804732155 * f702; - f705 = 1.2998232744250531 * f306; - y[15] = f704 - f703; - y[48] = f705 - f704; - f708 = f610 + f305; - f709 = (-0.5251218116290097) * f610; - f710 = 0.9191138516900578 * f708; - f711 = 1.3131058917511058 * f305; - y[16] = f709 + f710; - y[47] = f711 - f710; - f714 = f608 + f303; - f715 = (-0.4927384229928850) * f608; - f716 = 0.9091679830905223 * f714; - f717 = 1.3255975431881595 * f303; - y[17] = f715 + f716; - y[46] = f717 - f716; - f720 = f606 + f301; - f721 = (-0.4600582271554261) * f606; - f722 = 0.8986744656939538 * f720; - f723 = 1.3372907042324815 * f301; - y[18] = f721 + f722; - y[45] = f723 - f722; - f726 = f604 + f299; - f727 = (-0.4271009094446139) * f604; - f728 = 0.8876396204028539 * f726; - f729 = 1.3481783313610940 * f299; - y[19] = f727 + f728; - y[44] = f729 - f728; - f732 = f602 + f297; - f733 = (-0.3938863221162838) * f602; - f734 = 0.8760700941954066 * f732; - f735 = 1.3582538662745294 * f297; - y[20] = f733 + f734; - y[43] = f735 - f734; - f738 = f600 + f295; - f739 = (-0.3604344723958691) * f600; - f740 = 0.8639728561215867 * f738; - f741 = 1.3675112398473042 * f295; - y[21] = f739 + f740; - y[42] = f741 - f740; - f744 = f598 + f293; - f745 = (-0.3267655104267964) * f598; - f746 = 0.8513551931052652 * f744; - f747 = 1.3759448757837340 * f293; - y[22] = f745 + f746; - y[41] = f747 - f746; - f750 = f596 + f291; - f751 = (-0.2928997171327915) * f596; - f752 = 0.8382247055548380 * f750; - f753 = 1.3835496939768843 * f291; - y[23] = f751 + f752; - y[40] = f753 - f752; - f756 = f594 + f289; - f757 = (-0.2588574920014121) * f594; - f758 = 0.8245893027850253 * f756; - f759 = 1.3903211135686386 * f289; - y[24] = f757 + f758; - y[39] = f759 - f758; - f762 = f592 + f287; - f763 = (-0.2246593407961559) * f592; - f764 = 0.8104571982525948 * f762; - f765 = 1.3962550557090336 * f287; - y[25] = f763 + f764; - y[38] = f765 - f764; - f768 = f590 + f285; - f769 = (-0.1903258632045579) * f590; - f770 = 0.7958369046088835 * f768; - f771 = 1.4013479460132090 * f285; - y[26] = f769 + f770; - y[37] = f771 - f770; - f774 = f588 + f283; - f775 = (-0.1558777404297079) * f588; - f776 = 0.7807372285720944 * f774; - f777 = 1.4055967167144807 * f283; - y[27] = f775 + f776; - y[36] = f777 - f776; - f780 = f586 + f281; - f781 = (-0.1213357227326675) * f586; - f782 = 0.7651672656224590 * f780; - f783 = 1.4089988085122505 * f281; - y[28] = f781 + f782; - y[35] = f783 - f782; - f786 = f584 + f279; - f787 = (-0.0867206169332875) * f584; - f788 = 0.7491363945234593 * f786; - f789 = 1.4115521721136310 * f279; - y[29] = f787 + f788; - y[34] = f789 - f788; - f792 = f582 + f277; - f793 = (-0.0520532738769597) * f582; - f794 = 0.7326542716724128 * f792; - f795 = 1.4132552694678659 * f277; - y[30] = f793 + f794; - y[33] = f795 - f794; - f798 = f580 + f275; - f799 = (-0.0173545758748457) * f580; - f800 = 0.7157308252838186 * f798; - f801 = 1.4141070746927915 * f275; - y[31] = f799 + f800; - y[32] = f801 - f800; -} - -#endif - -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_dct.c,v 1.20 2007/11/01 12:33:34 menno Exp $ +**/ + + +/* Most of the DCT/DST codes here are generated using Spiral which is GPL + * For more info see: http://www.spiral.net/ + */ + +#include "common.h" + +#ifdef SBR_DEC + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + + +#include "sbr_dct.h" + +void DCT4_32(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; + real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; + real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; + real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; + real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; + real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; + real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; + real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; + real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; + real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; + real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; + real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; + real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; + real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; + real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; + real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; + real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; + real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; + real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; + real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; + real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; + real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; + real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; + real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; + real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; + real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; + real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; + real_t f271, f272, f273, f274, f275, f276, f277, f278, f279, f280; + real_t f281, f282, f283, f284, f285, f286, f287, f288, f289, f290; + real_t f291, f292, f293, f294, f295, f296, f297, f298, f299, f300; + real_t f301, f302, f303, f304, f305, f306, f307, f310, f311, f312; + real_t f313, f316, f317, f318, f319, f322, f323, f324, f325, f328; + real_t f329, f330, f331, f334, f335, f336, f337, f340, f341, f342; + real_t f343, f346, f347, f348, f349, f352, f353, f354, f355, f358; + real_t f359, f360, f361, f364, f365, f366, f367, f370, f371, f372; + real_t f373, f376, f377, f378, f379, f382, f383, f384, f385, f388; + real_t f389, f390, f391, f394, f395, f396, f397; + + f0 = x[15] - x[16]; + f1 = x[15] + x[16]; + f2 = MUL_F(FRAC_CONST(0.7071067811865476), f1); + f3 = MUL_F(FRAC_CONST(0.7071067811865476), f0); + f4 = x[8] - x[23]; + f5 = x[8] + x[23]; + f6 = MUL_F(FRAC_CONST(0.7071067811865476), f5); + f7 = MUL_F(FRAC_CONST(0.7071067811865476), f4); + f8 = x[12] - x[19]; + f9 = x[12] + x[19]; + f10 = MUL_F(FRAC_CONST(0.7071067811865476), f9); + f11 = MUL_F(FRAC_CONST(0.7071067811865476), f8); + f12 = x[11] - x[20]; + f13 = x[11] + x[20]; + f14 = MUL_F(FRAC_CONST(0.7071067811865476), f13); + f15 = MUL_F(FRAC_CONST(0.7071067811865476), f12); + f16 = x[14] - x[17]; + f17 = x[14] + x[17]; + f18 = MUL_F(FRAC_CONST(0.7071067811865476), f17); + f19 = MUL_F(FRAC_CONST(0.7071067811865476), f16); + f20 = x[9] - x[22]; + f21 = x[9] + x[22]; + f22 = MUL_F(FRAC_CONST(0.7071067811865476), f21); + f23 = MUL_F(FRAC_CONST(0.7071067811865476), f20); + f24 = x[13] - x[18]; + f25 = x[13] + x[18]; + f26 = MUL_F(FRAC_CONST(0.7071067811865476), f25); + f27 = MUL_F(FRAC_CONST(0.7071067811865476), f24); + f28 = x[10] - x[21]; + f29 = x[10] + x[21]; + f30 = MUL_F(FRAC_CONST(0.7071067811865476), f29); + f31 = MUL_F(FRAC_CONST(0.7071067811865476), f28); + f32 = x[0] - f2; + f33 = x[0] + f2; + f34 = x[31] - f3; + f35 = x[31] + f3; + f36 = x[7] - f6; + f37 = x[7] + f6; + f38 = x[24] - f7; + f39 = x[24] + f7; + f40 = x[3] - f10; + f41 = x[3] + f10; + f42 = x[28] - f11; + f43 = x[28] + f11; + f44 = x[4] - f14; + f45 = x[4] + f14; + f46 = x[27] - f15; + f47 = x[27] + f15; + f48 = x[1] - f18; + f49 = x[1] + f18; + f50 = x[30] - f19; + f51 = x[30] + f19; + f52 = x[6] - f22; + f53 = x[6] + f22; + f54 = x[25] - f23; + f55 = x[25] + f23; + f56 = x[2] - f26; + f57 = x[2] + f26; + f58 = x[29] - f27; + f59 = x[29] + f27; + f60 = x[5] - f30; + f61 = x[5] + f30; + f62 = x[26] - f31; + f63 = x[26] + f31; + f64 = f39 + f37; + f65 = MUL_F(FRAC_CONST(-0.5411961001461969), f39); + f66 = MUL_F(FRAC_CONST(0.9238795325112867), f64); + f67 = MUL_C(COEF_CONST(1.3065629648763766), f37); + f68 = f65 + f66; + f69 = f67 - f66; + f70 = f38 + f36; + f71 = MUL_C(COEF_CONST(1.3065629648763770), f38); + f72 = MUL_F(FRAC_CONST(-0.3826834323650904), f70); + f73 = MUL_F(FRAC_CONST(0.5411961001461961), f36); + f74 = f71 + f72; + f75 = f73 - f72; + f76 = f47 + f45; + f77 = MUL_F(FRAC_CONST(-0.5411961001461969), f47); + f78 = MUL_F(FRAC_CONST(0.9238795325112867), f76); + f79 = MUL_C(COEF_CONST(1.3065629648763766), f45); + f80 = f77 + f78; + f81 = f79 - f78; + f82 = f46 + f44; + f83 = MUL_C(COEF_CONST(1.3065629648763770), f46); + f84 = MUL_F(FRAC_CONST(-0.3826834323650904), f82); + f85 = MUL_F(FRAC_CONST(0.5411961001461961), f44); + f86 = f83 + f84; + f87 = f85 - f84; + f88 = f55 + f53; + f89 = MUL_F(FRAC_CONST(-0.5411961001461969), f55); + f90 = MUL_F(FRAC_CONST(0.9238795325112867), f88); + f91 = MUL_C(COEF_CONST(1.3065629648763766), f53); + f92 = f89 + f90; + f93 = f91 - f90; + f94 = f54 + f52; + f95 = MUL_C(COEF_CONST(1.3065629648763770), f54); + f96 = MUL_F(FRAC_CONST(-0.3826834323650904), f94); + f97 = MUL_F(FRAC_CONST(0.5411961001461961), f52); + f98 = f95 + f96; + f99 = f97 - f96; + f100 = f63 + f61; + f101 = MUL_F(FRAC_CONST(-0.5411961001461969), f63); + f102 = MUL_F(FRAC_CONST(0.9238795325112867), f100); + f103 = MUL_C(COEF_CONST(1.3065629648763766), f61); + f104 = f101 + f102; + f105 = f103 - f102; + f106 = f62 + f60; + f107 = MUL_C(COEF_CONST(1.3065629648763770), f62); + f108 = MUL_F(FRAC_CONST(-0.3826834323650904), f106); + f109 = MUL_F(FRAC_CONST(0.5411961001461961), f60); + f110 = f107 + f108; + f111 = f109 - f108; + f112 = f33 - f68; + f113 = f33 + f68; + f114 = f35 - f69; + f115 = f35 + f69; + f116 = f32 - f74; + f117 = f32 + f74; + f118 = f34 - f75; + f119 = f34 + f75; + f120 = f41 - f80; + f121 = f41 + f80; + f122 = f43 - f81; + f123 = f43 + f81; + f124 = f40 - f86; + f125 = f40 + f86; + f126 = f42 - f87; + f127 = f42 + f87; + f128 = f49 - f92; + f129 = f49 + f92; + f130 = f51 - f93; + f131 = f51 + f93; + f132 = f48 - f98; + f133 = f48 + f98; + f134 = f50 - f99; + f135 = f50 + f99; + f136 = f57 - f104; + f137 = f57 + f104; + f138 = f59 - f105; + f139 = f59 + f105; + f140 = f56 - f110; + f141 = f56 + f110; + f142 = f58 - f111; + f143 = f58 + f111; + f144 = f123 + f121; + f145 = MUL_F(FRAC_CONST(-0.7856949583871021), f123); + f146 = MUL_F(FRAC_CONST(0.9807852804032304), f144); + f147 = MUL_C(COEF_CONST(1.1758756024193588), f121); + f148 = f145 + f146; + f149 = f147 - f146; + f150 = f127 + f125; + f151 = MUL_F(FRAC_CONST(0.2758993792829431), f127); + f152 = MUL_F(FRAC_CONST(0.5555702330196022), f150); + f153 = MUL_C(COEF_CONST(1.3870398453221475), f125); + f154 = f151 + f152; + f155 = f153 - f152; + f156 = f122 + f120; + f157 = MUL_C(COEF_CONST(1.1758756024193591), f122); + f158 = MUL_F(FRAC_CONST(-0.1950903220161287), f156); + f159 = MUL_F(FRAC_CONST(0.7856949583871016), f120); + f160 = f157 + f158; + f161 = f159 - f158; + f162 = f126 + f124; + f163 = MUL_C(COEF_CONST(1.3870398453221473), f126); + f164 = MUL_F(FRAC_CONST(-0.8314696123025455), f162); + f165 = MUL_F(FRAC_CONST(-0.2758993792829436), f124); + f166 = f163 + f164; + f167 = f165 - f164; + f168 = f139 + f137; + f169 = MUL_F(FRAC_CONST(-0.7856949583871021), f139); + f170 = MUL_F(FRAC_CONST(0.9807852804032304), f168); + f171 = MUL_C(COEF_CONST(1.1758756024193588), f137); + f172 = f169 + f170; + f173 = f171 - f170; + f174 = f143 + f141; + f175 = MUL_F(FRAC_CONST(0.2758993792829431), f143); + f176 = MUL_F(FRAC_CONST(0.5555702330196022), f174); + f177 = MUL_C(COEF_CONST(1.3870398453221475), f141); + f178 = f175 + f176; + f179 = f177 - f176; + f180 = f138 + f136; + f181 = MUL_C(COEF_CONST(1.1758756024193591), f138); + f182 = MUL_F(FRAC_CONST(-0.1950903220161287), f180); + f183 = MUL_F(FRAC_CONST(0.7856949583871016), f136); + f184 = f181 + f182; + f185 = f183 - f182; + f186 = f142 + f140; + f187 = MUL_C(COEF_CONST(1.3870398453221473), f142); + f188 = MUL_F(FRAC_CONST(-0.8314696123025455), f186); + f189 = MUL_F(FRAC_CONST(-0.2758993792829436), f140); + f190 = f187 + f188; + f191 = f189 - f188; + f192 = f113 - f148; + f193 = f113 + f148; + f194 = f115 - f149; + f195 = f115 + f149; + f196 = f117 - f154; + f197 = f117 + f154; + f198 = f119 - f155; + f199 = f119 + f155; + f200 = f112 - f160; + f201 = f112 + f160; + f202 = f114 - f161; + f203 = f114 + f161; + f204 = f116 - f166; + f205 = f116 + f166; + f206 = f118 - f167; + f207 = f118 + f167; + f208 = f129 - f172; + f209 = f129 + f172; + f210 = f131 - f173; + f211 = f131 + f173; + f212 = f133 - f178; + f213 = f133 + f178; + f214 = f135 - f179; + f215 = f135 + f179; + f216 = f128 - f184; + f217 = f128 + f184; + f218 = f130 - f185; + f219 = f130 + f185; + f220 = f132 - f190; + f221 = f132 + f190; + f222 = f134 - f191; + f223 = f134 + f191; + f224 = f211 + f209; + f225 = MUL_F(FRAC_CONST(-0.8971675863426361), f211); + f226 = MUL_F(FRAC_CONST(0.9951847266721968), f224); + f227 = MUL_C(COEF_CONST(1.0932018670017576), f209); + f228 = f225 + f226; + f229 = f227 - f226; + f230 = f215 + f213; + f231 = MUL_F(FRAC_CONST(-0.4105245275223571), f215); + f232 = MUL_F(FRAC_CONST(0.8819212643483549), f230); + f233 = MUL_C(COEF_CONST(1.3533180011743529), f213); + f234 = f231 + f232; + f235 = f233 - f232; + f236 = f219 + f217; + f237 = MUL_F(FRAC_CONST(0.1386171691990915), f219); + f238 = MUL_F(FRAC_CONST(0.6343932841636455), f236); + f239 = MUL_C(COEF_CONST(1.4074037375263826), f217); + f240 = f237 + f238; + f241 = f239 - f238; + f242 = f223 + f221; + f243 = MUL_F(FRAC_CONST(0.6666556584777466), f223); + f244 = MUL_F(FRAC_CONST(0.2902846772544623), f242); + f245 = MUL_C(COEF_CONST(1.2472250129866711), f221); + f246 = f243 + f244; + f247 = f245 - f244; + f248 = f210 + f208; + f249 = MUL_C(COEF_CONST(1.0932018670017574), f210); + f250 = MUL_F(FRAC_CONST(-0.0980171403295605), f248); + f251 = MUL_F(FRAC_CONST(0.8971675863426364), f208); + f252 = f249 + f250; + f253 = f251 - f250; + f254 = f214 + f212; + f255 = MUL_C(COEF_CONST(1.3533180011743529), f214); + f256 = MUL_F(FRAC_CONST(-0.4713967368259979), f254); + f257 = MUL_F(FRAC_CONST(0.4105245275223569), f212); + f258 = f255 + f256; + f259 = f257 - f256; + f260 = f218 + f216; + f261 = MUL_C(COEF_CONST(1.4074037375263826), f218); + f262 = MUL_F(FRAC_CONST(-0.7730104533627369), f260); + f263 = MUL_F(FRAC_CONST(-0.1386171691990913), f216); + f264 = f261 + f262; + f265 = f263 - f262; + f266 = f222 + f220; + f267 = MUL_C(COEF_CONST(1.2472250129866711), f222); + f268 = MUL_F(FRAC_CONST(-0.9569403357322089), f266); + f269 = MUL_F(FRAC_CONST(-0.6666556584777469), f220); + f270 = f267 + f268; + f271 = f269 - f268; + f272 = f193 - f228; + f273 = f193 + f228; + f274 = f195 - f229; + f275 = f195 + f229; + f276 = f197 - f234; + f277 = f197 + f234; + f278 = f199 - f235; + f279 = f199 + f235; + f280 = f201 - f240; + f281 = f201 + f240; + f282 = f203 - f241; + f283 = f203 + f241; + f284 = f205 - f246; + f285 = f205 + f246; + f286 = f207 - f247; + f287 = f207 + f247; + f288 = f192 - f252; + f289 = f192 + f252; + f290 = f194 - f253; + f291 = f194 + f253; + f292 = f196 - f258; + f293 = f196 + f258; + f294 = f198 - f259; + f295 = f198 + f259; + f296 = f200 - f264; + f297 = f200 + f264; + f298 = f202 - f265; + f299 = f202 + f265; + f300 = f204 - f270; + f301 = f204 + f270; + f302 = f206 - f271; + f303 = f206 + f271; + f304 = f275 + f273; + f305 = MUL_F(FRAC_CONST(-0.9751575901732920), f275); + f306 = MUL_F(FRAC_CONST(0.9996988186962043), f304); + f307 = MUL_C(COEF_CONST(1.0242400472191164), f273); + y[0] = f305 + f306; + y[31] = f307 - f306; + f310 = f279 + f277; + f311 = MUL_F(FRAC_CONST(-0.8700688593994936), f279); + f312 = MUL_F(FRAC_CONST(0.9924795345987100), f310); + f313 = MUL_C(COEF_CONST(1.1148902097979263), f277); + y[2] = f311 + f312; + y[29] = f313 - f312; + f316 = f283 + f281; + f317 = MUL_F(FRAC_CONST(-0.7566008898816587), f283); + f318 = MUL_F(FRAC_CONST(0.9757021300385286), f316); + f319 = MUL_C(COEF_CONST(1.1948033701953984), f281); + y[4] = f317 + f318; + y[27] = f319 - f318; + f322 = f287 + f285; + f323 = MUL_F(FRAC_CONST(-0.6358464401941451), f287); + f324 = MUL_F(FRAC_CONST(0.9495281805930367), f322); + f325 = MUL_C(COEF_CONST(1.2632099209919283), f285); + y[6] = f323 + f324; + y[25] = f325 - f324; + f328 = f291 + f289; + f329 = MUL_F(FRAC_CONST(-0.5089684416985408), f291); + f330 = MUL_F(FRAC_CONST(0.9142097557035307), f328); + f331 = MUL_C(COEF_CONST(1.3194510697085207), f289); + y[8] = f329 + f330; + y[23] = f331 - f330; + f334 = f295 + f293; + f335 = MUL_F(FRAC_CONST(-0.3771887988789273), f295); + f336 = MUL_F(FRAC_CONST(0.8700869911087114), f334); + f337 = MUL_C(COEF_CONST(1.3629851833384954), f293); + y[10] = f335 + f336; + y[21] = f337 - f336; + f340 = f299 + f297; + f341 = MUL_F(FRAC_CONST(-0.2417766217337384), f299); + f342 = MUL_F(FRAC_CONST(0.8175848131515837), f340); + f343 = MUL_C(COEF_CONST(1.3933930045694289), f297); + y[12] = f341 + f342; + y[19] = f343 - f342; + f346 = f303 + f301; + f347 = MUL_F(FRAC_CONST(-0.1040360035527077), f303); + f348 = MUL_F(FRAC_CONST(0.7572088465064845), f346); + f349 = MUL_C(COEF_CONST(1.4103816894602612), f301); + y[14] = f347 + f348; + y[17] = f349 - f348; + f352 = f274 + f272; + f353 = MUL_F(FRAC_CONST(0.0347065382144002), f274); + f354 = MUL_F(FRAC_CONST(0.6895405447370668), f352); + f355 = MUL_C(COEF_CONST(1.4137876276885337), f272); + y[16] = f353 + f354; + y[15] = f355 - f354; + f358 = f278 + f276; + f359 = MUL_F(FRAC_CONST(0.1731148370459795), f278); + f360 = MUL_F(FRAC_CONST(0.6152315905806268), f358); + f361 = MUL_C(COEF_CONST(1.4035780182072330), f276); + y[18] = f359 + f360; + y[13] = f361 - f360; + f364 = f282 + f280; + f365 = MUL_F(FRAC_CONST(0.3098559453626100), f282); + f366 = MUL_F(FRAC_CONST(0.5349976198870972), f364); + f367 = MUL_C(COEF_CONST(1.3798511851368043), f280); + y[20] = f365 + f366; + y[11] = f367 - f366; + f370 = f286 + f284; + f371 = MUL_F(FRAC_CONST(0.4436129715409088), f286); + f372 = MUL_F(FRAC_CONST(0.4496113296546065), f370); + f373 = MUL_C(COEF_CONST(1.3428356308501219), f284); + y[22] = f371 + f372; + y[9] = f373 - f372; + f376 = f290 + f288; + f377 = MUL_F(FRAC_CONST(0.5730977622997509), f290); + f378 = MUL_F(FRAC_CONST(0.3598950365349881), f376); + f379 = MUL_C(COEF_CONST(1.2928878353697271), f288); + y[24] = f377 + f378; + y[7] = f379 - f378; + f382 = f294 + f292; + f383 = MUL_F(FRAC_CONST(0.6970633083205415), f294); + f384 = MUL_F(FRAC_CONST(0.2667127574748984), f382); + f385 = MUL_C(COEF_CONST(1.2304888232703382), f292); + y[26] = f383 + f384; + y[5] = f385 - f384; + f388 = f298 + f296; + f389 = MUL_F(FRAC_CONST(0.8143157536286401), f298); + f390 = MUL_F(FRAC_CONST(0.1709618887603012), f388); + f391 = MUL_C(COEF_CONST(1.1562395311492424), f296); + y[28] = f389 + f390; + y[3] = f391 - f390; + f394 = f302 + f300; + f395 = MUL_F(FRAC_CONST(0.9237258930790228), f302); + f396 = MUL_F(FRAC_CONST(0.0735645635996674), f394); + f397 = MUL_C(COEF_CONST(1.0708550202783576), f300); + y[30] = f395 + f396; + y[1] = f397 - f396; +} + +void DST4_32(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9; + real_t f10, f11, f12, f13, f14, f15, f16, f17, f18, f19; + real_t f20, f21, f22, f23, f24, f25, f26, f27, f28, f29; + real_t f30, f31, f32, f33, f34, f35, f36, f37, f38, f39; + real_t f40, f41, f42, f43, f44, f45, f46, f47, f48, f49; + real_t f50, f51, f52, f53, f54, f55, f56, f57, f58, f59; + real_t f60, f61, f62, f63, f64, f65, f66, f67, f68, f69; + real_t f70, f71, f72, f73, f74, f75, f76, f77, f78, f79; + real_t f80, f81, f82, f83, f84, f85, f86, f87, f88, f89; + real_t f90, f91, f92, f93, f94, f95, f96, f97, f98, f99; + real_t f100, f101, f102, f103, f104, f105, f106, f107, f108, f109; + real_t f110, f111, f112, f113, f114, f115, f116, f117, f118, f119; + real_t f120, f121, f122, f123, f124, f125, f126, f127, f128, f129; + real_t f130, f131, f132, f133, f134, f135, f136, f137, f138, f139; + real_t f140, f141, f142, f143, f144, f145, f146, f147, f148, f149; + real_t f150, f151, f152, f153, f154, f155, f156, f157, f158, f159; + real_t f160, f161, f162, f163, f164, f165, f166, f167, f168, f169; + real_t f170, f171, f172, f173, f174, f175, f176, f177, f178, f179; + real_t f180, f181, f182, f183, f184, f185, f186, f187, f188, f189; + real_t f190, f191, f192, f193, f194, f195, f196, f197, f198, f199; + real_t f200, f201, f202, f203, f204, f205, f206, f207, f208, f209; + real_t f210, f211, f212, f213, f214, f215, f216, f217, f218, f219; + real_t f220, f221, f222, f223, f224, f225, f226, f227, f228, f229; + real_t f230, f231, f232, f233, f234, f235, f236, f237, f238, f239; + real_t f240, f241, f242, f243, f244, f245, f246, f247, f248, f249; + real_t f250, f251, f252, f253, f254, f255, f256, f257, f258, f259; + real_t f260, f261, f262, f263, f264, f265, f266, f267, f268, f269; + real_t f270, f271, f272, f273, f274, f275, f276, f277, f278, f279; + real_t f280, f281, f282, f283, f284, f285, f286, f287, f288, f289; + real_t f290, f291, f292, f293, f294, f295, f296, f297, f298, f299; + real_t f300, f301, f302, f303, f304, f305, f306, f307, f308, f309; + real_t f310, f311, f312, f313, f314, f315, f316, f317, f318, f319; + real_t f320, f321, f322, f323, f324, f325, f326, f327, f328, f329; + real_t f330, f331, f332, f333, f334, f335; + + f0 = x[0] - x[1]; + f1 = x[2] - x[1]; + f2 = x[2] - x[3]; + f3 = x[4] - x[3]; + f4 = x[4] - x[5]; + f5 = x[6] - x[5]; + f6 = x[6] - x[7]; + f7 = x[8] - x[7]; + f8 = x[8] - x[9]; + f9 = x[10] - x[9]; + f10 = x[10] - x[11]; + f11 = x[12] - x[11]; + f12 = x[12] - x[13]; + f13 = x[14] - x[13]; + f14 = x[14] - x[15]; + f15 = x[16] - x[15]; + f16 = x[16] - x[17]; + f17 = x[18] - x[17]; + f18 = x[18] - x[19]; + f19 = x[20] - x[19]; + f20 = x[20] - x[21]; + f21 = x[22] - x[21]; + f22 = x[22] - x[23]; + f23 = x[24] - x[23]; + f24 = x[24] - x[25]; + f25 = x[26] - x[25]; + f26 = x[26] - x[27]; + f27 = x[28] - x[27]; + f28 = x[28] - x[29]; + f29 = x[30] - x[29]; + f30 = x[30] - x[31]; + f31 = MUL_F(FRAC_CONST(0.7071067811865476), f15); + f32 = x[0] - f31; + f33 = x[0] + f31; + f34 = f7 + f23; + f35 = MUL_C(COEF_CONST(1.3065629648763766), f7); + f36 = MUL_F(FRAC_CONST(-0.9238795325112866), f34); + f37 = MUL_F(FRAC_CONST(-0.5411961001461967), f23); + f38 = f35 + f36; + f39 = f37 - f36; + f40 = f33 - f39; + f41 = f33 + f39; + f42 = f32 - f38; + f43 = f32 + f38; + f44 = f11 - f19; + f45 = f11 + f19; + f46 = MUL_F(FRAC_CONST(0.7071067811865476), f45); + f47 = f3 - f46; + f48 = f3 + f46; + f49 = MUL_F(FRAC_CONST(0.7071067811865476), f44); + f50 = f49 - f27; + f51 = f49 + f27; + f52 = f51 + f48; + f53 = MUL_F(FRAC_CONST(-0.7856949583871021), f51); + f54 = MUL_F(FRAC_CONST(0.9807852804032304), f52); + f55 = MUL_C(COEF_CONST(1.1758756024193588), f48); + f56 = f53 + f54; + f57 = f55 - f54; + f58 = f50 + f47; + f59 = MUL_F(FRAC_CONST(-0.2758993792829430), f50); + f60 = MUL_F(FRAC_CONST(0.8314696123025452), f58); + f61 = MUL_C(COEF_CONST(1.3870398453221475), f47); + f62 = f59 + f60; + f63 = f61 - f60; + f64 = f41 - f56; + f65 = f41 + f56; + f66 = f43 - f62; + f67 = f43 + f62; + f68 = f42 - f63; + f69 = f42 + f63; + f70 = f40 - f57; + f71 = f40 + f57; + f72 = f5 - f9; + f73 = f5 + f9; + f74 = f13 - f17; + f75 = f13 + f17; + f76 = f21 - f25; + f77 = f21 + f25; + f78 = MUL_F(FRAC_CONST(0.7071067811865476), f75); + f79 = f1 - f78; + f80 = f1 + f78; + f81 = f73 + f77; + f82 = MUL_C(COEF_CONST(1.3065629648763766), f73); + f83 = MUL_F(FRAC_CONST(-0.9238795325112866), f81); + f84 = MUL_F(FRAC_CONST(-0.5411961001461967), f77); + f85 = f82 + f83; + f86 = f84 - f83; + f87 = f80 - f86; + f88 = f80 + f86; + f89 = f79 - f85; + f90 = f79 + f85; + f91 = MUL_F(FRAC_CONST(0.7071067811865476), f74); + f92 = f29 - f91; + f93 = f29 + f91; + f94 = f76 + f72; + f95 = MUL_C(COEF_CONST(1.3065629648763766), f76); + f96 = MUL_F(FRAC_CONST(-0.9238795325112866), f94); + f97 = MUL_F(FRAC_CONST(-0.5411961001461967), f72); + f98 = f95 + f96; + f99 = f97 - f96; + f100 = f93 - f99; + f101 = f93 + f99; + f102 = f92 - f98; + f103 = f92 + f98; + f104 = f101 + f88; + f105 = MUL_F(FRAC_CONST(-0.8971675863426361), f101); + f106 = MUL_F(FRAC_CONST(0.9951847266721968), f104); + f107 = MUL_C(COEF_CONST(1.0932018670017576), f88); + f108 = f105 + f106; + f109 = f107 - f106; + f110 = f90 - f103; + f111 = MUL_F(FRAC_CONST(-0.6666556584777466), f103); + f112 = MUL_F(FRAC_CONST(0.9569403357322089), f110); + f113 = MUL_C(COEF_CONST(1.2472250129866713), f90); + f114 = f112 - f111; + f115 = f113 - f112; + f116 = f102 + f89; + f117 = MUL_F(FRAC_CONST(-0.4105245275223571), f102); + f118 = MUL_F(FRAC_CONST(0.8819212643483549), f116); + f119 = MUL_C(COEF_CONST(1.3533180011743529), f89); + f120 = f117 + f118; + f121 = f119 - f118; + f122 = f87 - f100; + f123 = MUL_F(FRAC_CONST(-0.1386171691990915), f100); + f124 = MUL_F(FRAC_CONST(0.7730104533627370), f122); + f125 = MUL_C(COEF_CONST(1.4074037375263826), f87); + f126 = f124 - f123; + f127 = f125 - f124; + f128 = f65 - f108; + f129 = f65 + f108; + f130 = f67 - f114; + f131 = f67 + f114; + f132 = f69 - f120; + f133 = f69 + f120; + f134 = f71 - f126; + f135 = f71 + f126; + f136 = f70 - f127; + f137 = f70 + f127; + f138 = f68 - f121; + f139 = f68 + f121; + f140 = f66 - f115; + f141 = f66 + f115; + f142 = f64 - f109; + f143 = f64 + f109; + f144 = f0 + f30; + f145 = MUL_C(COEF_CONST(1.0478631305325901), f0); + f146 = MUL_F(FRAC_CONST(-0.9987954562051724), f144); + f147 = MUL_F(FRAC_CONST(-0.9497277818777548), f30); + f148 = f145 + f146; + f149 = f147 - f146; + f150 = f4 + f26; + f151 = MUL_F(FRAC_CONST(1.2130114330978077), f4); + f152 = MUL_F(FRAC_CONST(-0.9700312531945440), f150); + f153 = MUL_F(FRAC_CONST(-0.7270510732912803), f26); + f154 = f151 + f152; + f155 = f153 - f152; + f156 = f8 + f22; + f157 = MUL_C(COEF_CONST(1.3315443865537255), f8); + f158 = MUL_F(FRAC_CONST(-0.9039892931234433), f156); + f159 = MUL_F(FRAC_CONST(-0.4764341996931612), f22); + f160 = f157 + f158; + f161 = f159 - f158; + f162 = f12 + f18; + f163 = MUL_C(COEF_CONST(1.3989068359730781), f12); + f164 = MUL_F(FRAC_CONST(-0.8032075314806453), f162); + f165 = MUL_F(FRAC_CONST(-0.2075082269882124), f18); + f166 = f163 + f164; + f167 = f165 - f164; + f168 = f16 + f14; + f169 = MUL_C(COEF_CONST(1.4125100802019777), f16); + f170 = MUL_F(FRAC_CONST(-0.6715589548470187), f168); + f171 = MUL_F(FRAC_CONST(0.0693921705079402), f14); + f172 = f169 + f170; + f173 = f171 - f170; + f174 = f20 + f10; + f175 = MUL_C(COEF_CONST(1.3718313541934939), f20); + f176 = MUL_F(FRAC_CONST(-0.5141027441932219), f174); + f177 = MUL_F(FRAC_CONST(0.3436258658070501), f10); + f178 = f175 + f176; + f179 = f177 - f176; + f180 = f24 + f6; + f181 = MUL_C(COEF_CONST(1.2784339185752409), f24); + f182 = MUL_F(FRAC_CONST(-0.3368898533922200), f180); + f183 = MUL_F(FRAC_CONST(0.6046542117908008), f6); + f184 = f181 + f182; + f185 = f183 - f182; + f186 = f28 + f2; + f187 = MUL_C(COEF_CONST(1.1359069844201433), f28); + f188 = MUL_F(FRAC_CONST(-0.1467304744553624), f186); + f189 = MUL_F(FRAC_CONST(0.8424460355094185), f2); + f190 = f187 + f188; + f191 = f189 - f188; + f192 = f149 - f173; + f193 = f149 + f173; + f194 = f148 - f172; + f195 = f148 + f172; + f196 = f155 - f179; + f197 = f155 + f179; + f198 = f154 - f178; + f199 = f154 + f178; + f200 = f161 - f185; + f201 = f161 + f185; + f202 = f160 - f184; + f203 = f160 + f184; + f204 = f167 - f191; + f205 = f167 + f191; + f206 = f166 - f190; + f207 = f166 + f190; + f208 = f192 + f194; + f209 = MUL_C(COEF_CONST(1.1758756024193588), f192); + f210 = MUL_F(FRAC_CONST(-0.9807852804032304), f208); + f211 = MUL_F(FRAC_CONST(-0.7856949583871021), f194); + f212 = f209 + f210; + f213 = f211 - f210; + f214 = f196 + f198; + f215 = MUL_C(COEF_CONST(1.3870398453221475), f196); + f216 = MUL_F(FRAC_CONST(-0.5555702330196022), f214); + f217 = MUL_F(FRAC_CONST(0.2758993792829431), f198); + f218 = f215 + f216; + f219 = f217 - f216; + f220 = f200 + f202; + f221 = MUL_F(FRAC_CONST(0.7856949583871022), f200); + f222 = MUL_F(FRAC_CONST(0.1950903220161283), f220); + f223 = MUL_C(COEF_CONST(1.1758756024193586), f202); + f224 = f221 + f222; + f225 = f223 - f222; + f226 = f204 + f206; + f227 = MUL_F(FRAC_CONST(-0.2758993792829430), f204); + f228 = MUL_F(FRAC_CONST(0.8314696123025452), f226); + f229 = MUL_C(COEF_CONST(1.3870398453221475), f206); + f230 = f227 + f228; + f231 = f229 - f228; + f232 = f193 - f201; + f233 = f193 + f201; + f234 = f195 - f203; + f235 = f195 + f203; + f236 = f197 - f205; + f237 = f197 + f205; + f238 = f199 - f207; + f239 = f199 + f207; + f240 = f213 - f225; + f241 = f213 + f225; + f242 = f212 - f224; + f243 = f212 + f224; + f244 = f219 - f231; + f245 = f219 + f231; + f246 = f218 - f230; + f247 = f218 + f230; + f248 = f232 + f234; + f249 = MUL_C(COEF_CONST(1.3065629648763766), f232); + f250 = MUL_F(FRAC_CONST(-0.9238795325112866), f248); + f251 = MUL_F(FRAC_CONST(-0.5411961001461967), f234); + f252 = f249 + f250; + f253 = f251 - f250; + f254 = f236 + f238; + f255 = MUL_F(FRAC_CONST(0.5411961001461969), f236); + f256 = MUL_F(FRAC_CONST(0.3826834323650898), f254); + f257 = MUL_C(COEF_CONST(1.3065629648763766), f238); + f258 = f255 + f256; + f259 = f257 - f256; + f260 = f240 + f242; + f261 = MUL_C(COEF_CONST(1.3065629648763766), f240); + f262 = MUL_F(FRAC_CONST(-0.9238795325112866), f260); + f263 = MUL_F(FRAC_CONST(-0.5411961001461967), f242); + f264 = f261 + f262; + f265 = f263 - f262; + f266 = f244 + f246; + f267 = MUL_F(FRAC_CONST(0.5411961001461969), f244); + f268 = MUL_F(FRAC_CONST(0.3826834323650898), f266); + f269 = MUL_C(COEF_CONST(1.3065629648763766), f246); + f270 = f267 + f268; + f271 = f269 - f268; + f272 = f233 - f237; + f273 = f233 + f237; + f274 = f235 - f239; + f275 = f235 + f239; + f276 = f253 - f259; + f277 = f253 + f259; + f278 = f252 - f258; + f279 = f252 + f258; + f280 = f241 - f245; + f281 = f241 + f245; + f282 = f243 - f247; + f283 = f243 + f247; + f284 = f265 - f271; + f285 = f265 + f271; + f286 = f264 - f270; + f287 = f264 + f270; + f288 = f272 - f274; + f289 = f272 + f274; + f290 = MUL_F(FRAC_CONST(0.7071067811865474), f288); + f291 = MUL_F(FRAC_CONST(0.7071067811865474), f289); + f292 = f276 - f278; + f293 = f276 + f278; + f294 = MUL_F(FRAC_CONST(0.7071067811865474), f292); + f295 = MUL_F(FRAC_CONST(0.7071067811865474), f293); + f296 = f280 - f282; + f297 = f280 + f282; + f298 = MUL_F(FRAC_CONST(0.7071067811865474), f296); + f299 = MUL_F(FRAC_CONST(0.7071067811865474), f297); + f300 = f284 - f286; + f301 = f284 + f286; + f302 = MUL_F(FRAC_CONST(0.7071067811865474), f300); + f303 = MUL_F(FRAC_CONST(0.7071067811865474), f301); + f304 = f129 - f273; + f305 = f129 + f273; + f306 = f131 - f281; + f307 = f131 + f281; + f308 = f133 - f285; + f309 = f133 + f285; + f310 = f135 - f277; + f311 = f135 + f277; + f312 = f137 - f295; + f313 = f137 + f295; + f314 = f139 - f303; + f315 = f139 + f303; + f316 = f141 - f299; + f317 = f141 + f299; + f318 = f143 - f291; + f319 = f143 + f291; + f320 = f142 - f290; + f321 = f142 + f290; + f322 = f140 - f298; + f323 = f140 + f298; + f324 = f138 - f302; + f325 = f138 + f302; + f326 = f136 - f294; + f327 = f136 + f294; + f328 = f134 - f279; + f329 = f134 + f279; + f330 = f132 - f287; + f331 = f132 + f287; + f332 = f130 - f283; + f333 = f130 + f283; + f334 = f128 - f275; + f335 = f128 + f275; + y[31] = MUL_F(FRAC_CONST(0.5001506360206510), f305); + y[30] = MUL_F(FRAC_CONST(0.5013584524464084), f307); + y[29] = MUL_F(FRAC_CONST(0.5037887256810443), f309); + y[28] = MUL_F(FRAC_CONST(0.5074711720725553), f311); + y[27] = MUL_F(FRAC_CONST(0.5124514794082247), f313); + y[26] = MUL_F(FRAC_CONST(0.5187927131053328), f315); + y[25] = MUL_F(FRAC_CONST(0.5265773151542700), f317); + y[24] = MUL_F(FRAC_CONST(0.5359098169079920), f319); + y[23] = MUL_F(FRAC_CONST(0.5469204379855088), f321); + y[22] = MUL_F(FRAC_CONST(0.5597698129470802), f323); + y[21] = MUL_F(FRAC_CONST(0.5746551840326600), f325); + y[20] = MUL_F(FRAC_CONST(0.5918185358574165), f327); + y[19] = MUL_F(FRAC_CONST(0.6115573478825099), f329); + y[18] = MUL_F(FRAC_CONST(0.6342389366884031), f331); + y[17] = MUL_F(FRAC_CONST(0.6603198078137061), f333); + y[16] = MUL_F(FRAC_CONST(0.6903721282002123), f335); + y[15] = MUL_F(FRAC_CONST(0.7251205223771985), f334); + y[14] = MUL_F(FRAC_CONST(0.7654941649730891), f332); + y[13] = MUL_F(FRAC_CONST(0.8127020908144905), f330); + y[12] = MUL_F(FRAC_CONST(0.8683447152233481), f328); + y[11] = MUL_F(FRAC_CONST(0.9345835970364075), f326); + y[10] = MUL_C(COEF_CONST(1.0144082649970547), f324); + y[9] = MUL_C(COEF_CONST(1.1120716205797176), f322); + y[8] = MUL_C(COEF_CONST(1.2338327379765710), f320); + y[7] = MUL_C(COEF_CONST(1.3892939586328277), f318); + y[6] = MUL_C(COEF_CONST(1.5939722833856311), f316); + y[5] = MUL_C(COEF_CONST(1.8746759800084078), f314); + y[4] = MUL_C(COEF_CONST(2.2820500680051619), f312); + y[3] = MUL_C(COEF_CONST(2.9246284281582162), f310); + y[2] = MUL_C(COEF_CONST(4.0846110781292477), f308); + y[1] = MUL_C(COEF_CONST(6.7967507116736332), f306); + y[0] = MUL_R(REAL_CONST(20.3738781672314530), f304); +} + +#ifdef SBR_LOW_POWER + +void DCT2_16_unscaled(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; + real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; + real_t f21, f22, f23, f24, f25, f26, f27, f28, f31, f32; + real_t f33, f34, f37, f38, f39, f40, f41, f42, f43, f44; + real_t f45, f46, f47, f48, f49, f51, f53, f54, f57, f58; + real_t f59, f60, f61, f62, f63, f64, f65, f66, f67, f68; + real_t f69, f70, f71, f72, f73, f74, f75, f76, f77, f78; + real_t f79, f80, f81, f82, f83, f84, f85, f86, f87, f88; + real_t f89, f90, f91, f92, f95, f96, f97, f98, f101, f102; + real_t f103, f104, f107, f108, f109, f110; + + f0 = x[0] - x[15]; + f1 = x[0] + x[15]; + f2 = x[1] - x[14]; + f3 = x[1] + x[14]; + f4 = x[2] - x[13]; + f5 = x[2] + x[13]; + f6 = x[3] - x[12]; + f7 = x[3] + x[12]; + f8 = x[4] - x[11]; + f9 = x[4] + x[11]; + f10 = x[5] - x[10]; + f11 = x[5] + x[10]; + f12 = x[6] - x[9]; + f13 = x[6] + x[9]; + f14 = x[7] - x[8]; + f15 = x[7] + x[8]; + f16 = f1 - f15; + f17 = f1 + f15; + f18 = f3 - f13; + f19 = f3 + f13; + f20 = f5 - f11; + f21 = f5 + f11; + f22 = f7 - f9; + f23 = f7 + f9; + f24 = f17 - f23; + f25 = f17 + f23; + f26 = f19 - f21; + f27 = f19 + f21; + f28 = f25 - f27; + y[0] = f25 + f27; + y[8] = MUL_F(f28, FRAC_CONST(0.7071067811865476)); + f31 = f24 + f26; + f32 = MUL_C(f24, COEF_CONST(1.3065629648763766)); + f33 = MUL_F(f31, FRAC_CONST(-0.9238795325112866)); + f34 = MUL_F(f26, FRAC_CONST(-0.5411961001461967)); + y[12] = f32 + f33; + y[4] = f34 - f33; + f37 = f16 + f22; + f38 = MUL_C(f16, COEF_CONST(1.1758756024193588)); + f39 = MUL_F(f37, FRAC_CONST(-0.9807852804032304)); + f40 = MUL_F(f22, FRAC_CONST(-0.7856949583871021)); + f41 = f38 + f39; + f42 = f40 - f39; + f43 = f18 + f20; + f44 = MUL_C(f18, COEF_CONST(1.3870398453221473)); + f45 = MUL_F(f43, FRAC_CONST(-0.8314696123025455)); + f46 = MUL_F(f20, FRAC_CONST(-0.2758993792829436)); + f47 = f44 + f45; + f48 = f46 - f45; + f49 = f42 - f48; + y[2] = f42 + f48; + f51 = MUL_F(f49, FRAC_CONST(0.7071067811865476)); + y[14] = f41 - f47; + f53 = f41 + f47; + f54 = MUL_F(f53, FRAC_CONST(0.7071067811865476)); + y[10] = f51 - f54; + y[6] = f51 + f54; + f57 = f2 - f4; + f58 = f2 + f4; + f59 = f6 - f8; + f60 = f6 + f8; + f61 = f10 - f12; + f62 = f10 + f12; + f63 = MUL_F(f60, FRAC_CONST(0.7071067811865476)); + f64 = f0 - f63; + f65 = f0 + f63; + f66 = f58 + f62; + f67 = MUL_C(f58, COEF_CONST(1.3065629648763766)); + f68 = MUL_F(f66, FRAC_CONST(-0.9238795325112866)); + f69 = MUL_F(f62, FRAC_CONST(-0.5411961001461967)); + f70 = f67 + f68; + f71 = f69 - f68; + f72 = f65 - f71; + f73 = f65 + f71; + f74 = f64 - f70; + f75 = f64 + f70; + f76 = MUL_F(f59, FRAC_CONST(0.7071067811865476)); + f77 = f14 - f76; + f78 = f14 + f76; + f79 = f61 + f57; + f80 = MUL_C(f61, COEF_CONST(1.3065629648763766)); + f81 = MUL_F(f79, FRAC_CONST(-0.9238795325112866)); + f82 = MUL_F(f57, FRAC_CONST(-0.5411961001461967)); + f83 = f80 + f81; + f84 = f82 - f81; + f85 = f78 - f84; + f86 = f78 + f84; + f87 = f77 - f83; + f88 = f77 + f83; + f89 = f86 + f73; + f90 = MUL_F(f86, FRAC_CONST(-0.8971675863426361)); + f91 = MUL_F(f89, FRAC_CONST(0.9951847266721968)); + f92 = MUL_C(f73, COEF_CONST(1.0932018670017576)); + y[1] = f90 + f91; + y[15] = f92 - f91; + f95 = f75 - f88; + f96 = MUL_F(f88, FRAC_CONST(-0.6666556584777466)); + f97 = MUL_F(f95, FRAC_CONST(0.9569403357322089)); + f98 = MUL_C(f75, COEF_CONST(1.2472250129866713)); + y[3] = f97 - f96; + y[13] = f98 - f97; + f101 = f87 + f74; + f102 = MUL_F(f87, FRAC_CONST(-0.4105245275223571)); + f103 = MUL_F(f101, FRAC_CONST(0.8819212643483549)); + f104 = MUL_C(f74, COEF_CONST(1.3533180011743529)); + y[5] = f102 + f103; + y[11] = f104 - f103; + f107 = f72 - f85; + f108 = MUL_F(f85, FRAC_CONST(-0.1386171691990915)); + f109 = MUL_F(f107, FRAC_CONST(0.7730104533627370)); + f110 = MUL_C(f72, COEF_CONST(1.4074037375263826)); + y[7] = f109 - f108; + y[9] = f110 - f109; +} + +void DCT4_16(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; + real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; + real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; + real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; + real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; + real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; + real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; + real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; + real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; + real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; + real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; + real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; + real_t f121, f122, f123, f124, f125, f126, f127, f128, f130, f132; + real_t f134, f136, f138, f140, f142, f144, f145, f148, f149, f152; + real_t f153, f156, f157; + + f0 = x[0] + x[15]; + f1 = MUL_C(COEF_CONST(1.0478631305325901), x[0]); + f2 = MUL_F(FRAC_CONST(-0.9987954562051724), f0); + f3 = MUL_F(FRAC_CONST(-0.9497277818777548), x[15]); + f4 = f1 + f2; + f5 = f3 - f2; + f6 = x[2] + x[13]; + f7 = MUL_C(COEF_CONST(1.2130114330978077), x[2]); + f8 = MUL_F(FRAC_CONST(-0.9700312531945440), f6); + f9 = MUL_F(FRAC_CONST(-0.7270510732912803), x[13]); + f10 = f7 + f8; + f11 = f9 - f8; + f12 = x[4] + x[11]; + f13 = MUL_C(COEF_CONST(1.3315443865537255), x[4]); + f14 = MUL_F(FRAC_CONST(-0.9039892931234433), f12); + f15 = MUL_F(FRAC_CONST(-0.4764341996931612), x[11]); + f16 = f13 + f14; + f17 = f15 - f14; + f18 = x[6] + x[9]; + f19 = MUL_C(COEF_CONST(1.3989068359730781), x[6]); + f20 = MUL_F(FRAC_CONST(-0.8032075314806453), f18); + f21 = MUL_F(FRAC_CONST(-0.2075082269882124), x[9]); + f22 = f19 + f20; + f23 = f21 - f20; + f24 = x[8] + x[7]; + f25 = MUL_C(COEF_CONST(1.4125100802019777), x[8]); + f26 = MUL_F(FRAC_CONST(-0.6715589548470187), f24); + f27 = MUL_F(FRAC_CONST(0.0693921705079402), x[7]); + f28 = f25 + f26; + f29 = f27 - f26; + f30 = x[10] + x[5]; + f31 = MUL_C(COEF_CONST(1.3718313541934939), x[10]); + f32 = MUL_F(FRAC_CONST(-0.5141027441932219), f30); + f33 = MUL_F(FRAC_CONST(0.3436258658070501), x[5]); + f34 = f31 + f32; + f35 = f33 - f32; + f36 = x[12] + x[3]; + f37 = MUL_C(COEF_CONST(1.2784339185752409), x[12]); + f38 = MUL_F(FRAC_CONST(-0.3368898533922200), f36); + f39 = MUL_F(FRAC_CONST(0.6046542117908008), x[3]); + f40 = f37 + f38; + f41 = f39 - f38; + f42 = x[14] + x[1]; + f43 = MUL_C(COEF_CONST(1.1359069844201433), x[14]); + f44 = MUL_F(FRAC_CONST(-0.1467304744553624), f42); + f45 = MUL_F(FRAC_CONST(0.8424460355094185), x[1]); + f46 = f43 + f44; + f47 = f45 - f44; + f48 = f5 - f29; + f49 = f5 + f29; + f50 = f4 - f28; + f51 = f4 + f28; + f52 = f11 - f35; + f53 = f11 + f35; + f54 = f10 - f34; + f55 = f10 + f34; + f56 = f17 - f41; + f57 = f17 + f41; + f58 = f16 - f40; + f59 = f16 + f40; + f60 = f23 - f47; + f61 = f23 + f47; + f62 = f22 - f46; + f63 = f22 + f46; + f64 = f48 + f50; + f65 = MUL_C(COEF_CONST(1.1758756024193588), f48); + f66 = MUL_F(FRAC_CONST(-0.9807852804032304), f64); + f67 = MUL_F(FRAC_CONST(-0.7856949583871021), f50); + f68 = f65 + f66; + f69 = f67 - f66; + f70 = f52 + f54; + f71 = MUL_C(COEF_CONST(1.3870398453221475), f52); + f72 = MUL_F(FRAC_CONST(-0.5555702330196022), f70); + f73 = MUL_F(FRAC_CONST(0.2758993792829431), f54); + f74 = f71 + f72; + f75 = f73 - f72; + f76 = f56 + f58; + f77 = MUL_F(FRAC_CONST(0.7856949583871022), f56); + f78 = MUL_F(FRAC_CONST(0.1950903220161283), f76); + f79 = MUL_C(COEF_CONST(1.1758756024193586), f58); + f80 = f77 + f78; + f81 = f79 - f78; + f82 = f60 + f62; + f83 = MUL_F(FRAC_CONST(-0.2758993792829430), f60); + f84 = MUL_F(FRAC_CONST(0.8314696123025452), f82); + f85 = MUL_C(COEF_CONST(1.3870398453221475), f62); + f86 = f83 + f84; + f87 = f85 - f84; + f88 = f49 - f57; + f89 = f49 + f57; + f90 = f51 - f59; + f91 = f51 + f59; + f92 = f53 - f61; + f93 = f53 + f61; + f94 = f55 - f63; + f95 = f55 + f63; + f96 = f69 - f81; + f97 = f69 + f81; + f98 = f68 - f80; + f99 = f68 + f80; + f100 = f75 - f87; + f101 = f75 + f87; + f102 = f74 - f86; + f103 = f74 + f86; + f104 = f88 + f90; + f105 = MUL_C(COEF_CONST(1.3065629648763766), f88); + f106 = MUL_F(FRAC_CONST(-0.9238795325112866), f104); + f107 = MUL_F(FRAC_CONST(-0.5411961001461967), f90); + f108 = f105 + f106; + f109 = f107 - f106; + f110 = f92 + f94; + f111 = MUL_F(FRAC_CONST(0.5411961001461969), f92); + f112 = MUL_F(FRAC_CONST(0.3826834323650898), f110); + f113 = MUL_C(COEF_CONST(1.3065629648763766), f94); + f114 = f111 + f112; + f115 = f113 - f112; + f116 = f96 + f98; + f117 = MUL_C(COEF_CONST(1.3065629648763766), f96); + f118 = MUL_F(FRAC_CONST(-0.9238795325112866), f116); + f119 = MUL_F(FRAC_CONST(-0.5411961001461967), f98); + f120 = f117 + f118; + f121 = f119 - f118; + f122 = f100 + f102; + f123 = MUL_F(FRAC_CONST(0.5411961001461969), f100); + f124 = MUL_F(FRAC_CONST(0.3826834323650898), f122); + f125 = MUL_C(COEF_CONST(1.3065629648763766), f102); + f126 = f123 + f124; + f127 = f125 - f124; + f128 = f89 - f93; + y[0] = f89 + f93; + f130 = f91 - f95; + y[15] = f91 + f95; + f132 = f109 - f115; + y[3] = f109 + f115; + f134 = f108 - f114; + y[12] = f108 + f114; + f136 = f97 - f101; + y[1] = f97 + f101; + f138 = f99 - f103; + y[14] = f99 + f103; + f140 = f121 - f127; + y[2] = f121 + f127; + f142 = f120 - f126; + y[13] = f120 + f126; + f144 = f128 - f130; + f145 = f128 + f130; + y[8] = MUL_F(FRAC_CONST(0.7071067811865474), f144); + y[7] = MUL_F(FRAC_CONST(0.7071067811865474), f145); + f148 = f132 - f134; + f149 = f132 + f134; + y[11] = MUL_F(FRAC_CONST(0.7071067811865474), f148); + y[4] = MUL_F(FRAC_CONST(0.7071067811865474), f149); + f152 = f136 - f138; + f153 = f136 + f138; + y[9] = MUL_F(FRAC_CONST(0.7071067811865474), f152); + y[6] = MUL_F(FRAC_CONST(0.7071067811865474), f153); + f156 = f140 - f142; + f157 = f140 + f142; + y[10] = MUL_F(FRAC_CONST(0.7071067811865474), f156); + y[5] = MUL_F(FRAC_CONST(0.7071067811865474), f157); +} + +void DCT3_32_unscaled(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; + real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; + real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; + real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; + real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; + real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; + real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; + real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; + real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; + real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; + real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; + real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; + real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; + real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; + real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; + real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; + real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; + real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; + real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; + real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; + real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; + real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; + real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; + real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; + real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; + real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; + real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; + real_t f271, f272; + + f0 = MUL_F(x[16], FRAC_CONST(0.7071067811865476)); + f1 = x[0] - f0; + f2 = x[0] + f0; + f3 = x[8] + x[24]; + f4 = MUL_C(x[8], COEF_CONST(1.3065629648763766)); + f5 = MUL_F(f3, FRAC_CONST((-0.9238795325112866))); + f6 = MUL_F(x[24], FRAC_CONST((-0.5411961001461967))); + f7 = f4 + f5; + f8 = f6 - f5; + f9 = f2 - f8; + f10 = f2 + f8; + f11 = f1 - f7; + f12 = f1 + f7; + f13 = x[4] + x[28]; + f14 = MUL_C(x[4], COEF_CONST(1.1758756024193588)); + f15 = MUL_F(f13, FRAC_CONST((-0.9807852804032304))); + f16 = MUL_F(x[28], FRAC_CONST((-0.7856949583871021))); + f17 = f14 + f15; + f18 = f16 - f15; + f19 = x[12] + x[20]; + f20 = MUL_C(x[12], COEF_CONST(1.3870398453221473)); + f21 = MUL_F(f19, FRAC_CONST((-0.8314696123025455))); + f22 = MUL_F(x[20], FRAC_CONST((-0.2758993792829436))); + f23 = f20 + f21; + f24 = f22 - f21; + f25 = f18 - f24; + f26 = f18 + f24; + f27 = MUL_F(f25, FRAC_CONST(0.7071067811865476)); + f28 = f17 - f23; + f29 = f17 + f23; + f30 = MUL_F(f29, FRAC_CONST(0.7071067811865476)); + f31 = f27 - f30; + f32 = f27 + f30; + f33 = f10 - f26; + f34 = f10 + f26; + f35 = f12 - f32; + f36 = f12 + f32; + f37 = f11 - f31; + f38 = f11 + f31; + f39 = f9 - f28; + f40 = f9 + f28; + f41 = x[2] + x[30]; + f42 = MUL_C(x[2], COEF_CONST(1.0932018670017569)); + f43 = MUL_F(f41, FRAC_CONST((-0.9951847266721969))); + f44 = MUL_F(x[30], FRAC_CONST((-0.8971675863426368))); + f45 = f42 + f43; + f46 = f44 - f43; + f47 = x[6] + x[26]; + f48 = MUL_C(x[6], COEF_CONST(1.2472250129866711)); + f49 = MUL_F(f47, FRAC_CONST((-0.9569403357322089))); + f50 = MUL_F(x[26], FRAC_CONST((-0.6666556584777469))); + f51 = f48 + f49; + f52 = f50 - f49; + f53 = x[10] + x[22]; + f54 = MUL_C(x[10], COEF_CONST(1.3533180011743526)); + f55 = MUL_F(f53, FRAC_CONST((-0.8819212643483551))); + f56 = MUL_F(x[22], FRAC_CONST((-0.4105245275223575))); + f57 = f54 + f55; + f58 = f56 - f55; + f59 = x[14] + x[18]; + f60 = MUL_C(x[14], COEF_CONST(1.4074037375263826)); + f61 = MUL_F(f59, FRAC_CONST((-0.7730104533627369))); + f62 = MUL_F(x[18], FRAC_CONST((-0.1386171691990913))); + f63 = f60 + f61; + f64 = f62 - f61; + f65 = f46 - f64; + f66 = f46 + f64; + f67 = f52 - f58; + f68 = f52 + f58; + f69 = f66 - f68; + f70 = f66 + f68; + f71 = MUL_F(f69, FRAC_CONST(0.7071067811865476)); + f72 = f65 + f67; + f73 = MUL_C(f65, COEF_CONST(1.3065629648763766)); + f74 = MUL_F(f72, FRAC_CONST((-0.9238795325112866))); + f75 = MUL_F(f67, FRAC_CONST((-0.5411961001461967))); + f76 = f73 + f74; + f77 = f75 - f74; + f78 = f45 - f63; + f79 = f45 + f63; + f80 = f51 - f57; + f81 = f51 + f57; + f82 = f79 + f81; + f83 = MUL_C(f79, COEF_CONST(1.3065629648763770)); + f84 = MUL_F(f82, FRAC_CONST((-0.3826834323650904))); + f85 = MUL_F(f81, FRAC_CONST(0.5411961001461961)); + f86 = f83 + f84; + f87 = f85 - f84; + f88 = f78 - f80; + f89 = f78 + f80; + f90 = MUL_F(f89, FRAC_CONST(0.7071067811865476)); + f91 = f77 - f87; + f92 = f77 + f87; + f93 = f71 - f90; + f94 = f71 + f90; + f95 = f76 - f86; + f96 = f76 + f86; + f97 = f34 - f70; + f98 = f34 + f70; + f99 = f36 - f92; + f100 = f36 + f92; + f101 = f38 - f91; + f102 = f38 + f91; + f103 = f40 - f94; + f104 = f40 + f94; + f105 = f39 - f93; + f106 = f39 + f93; + f107 = f37 - f96; + f108 = f37 + f96; + f109 = f35 - f95; + f110 = f35 + f95; + f111 = f33 - f88; + f112 = f33 + f88; + f113 = x[1] + x[31]; + f114 = MUL_C(x[1], COEF_CONST(1.0478631305325901)); + f115 = MUL_F(f113, FRAC_CONST((-0.9987954562051724))); + f116 = MUL_F(x[31], FRAC_CONST((-0.9497277818777548))); + f117 = f114 + f115; + f118 = f116 - f115; + f119 = x[5] + x[27]; + f120 = MUL_C(x[5], COEF_CONST(1.2130114330978077)); + f121 = MUL_F(f119, FRAC_CONST((-0.9700312531945440))); + f122 = MUL_F(x[27], FRAC_CONST((-0.7270510732912803))); + f123 = f120 + f121; + f124 = f122 - f121; + f125 = x[9] + x[23]; + f126 = MUL_C(x[9], COEF_CONST(1.3315443865537255)); + f127 = MUL_F(f125, FRAC_CONST((-0.9039892931234433))); + f128 = MUL_F(x[23], FRAC_CONST((-0.4764341996931612))); + f129 = f126 + f127; + f130 = f128 - f127; + f131 = x[13] + x[19]; + f132 = MUL_C(x[13], COEF_CONST(1.3989068359730781)); + f133 = MUL_F(f131, FRAC_CONST((-0.8032075314806453))); + f134 = MUL_F(x[19], FRAC_CONST((-0.2075082269882124))); + f135 = f132 + f133; + f136 = f134 - f133; + f137 = x[17] + x[15]; + f138 = MUL_C(x[17], COEF_CONST(1.4125100802019777)); + f139 = MUL_F(f137, FRAC_CONST((-0.6715589548470187))); + f140 = MUL_F(x[15], FRAC_CONST(0.0693921705079402)); + f141 = f138 + f139; + f142 = f140 - f139; + f143 = x[21] + x[11]; + f144 = MUL_C(x[21], COEF_CONST(1.3718313541934939)); + f145 = MUL_F(f143, FRAC_CONST((-0.5141027441932219))); + f146 = MUL_F(x[11], FRAC_CONST(0.3436258658070501)); + f147 = f144 + f145; + f148 = f146 - f145; + f149 = x[25] + x[7]; + f150 = MUL_C(x[25], COEF_CONST(1.2784339185752409)); + f151 = MUL_F(f149, FRAC_CONST((-0.3368898533922200))); + f152 = MUL_F(x[7], FRAC_CONST(0.6046542117908008)); + f153 = f150 + f151; + f154 = f152 - f151; + f155 = x[29] + x[3]; + f156 = MUL_C(x[29], COEF_CONST(1.1359069844201433)); + f157 = MUL_F(f155, FRAC_CONST((-0.1467304744553624))); + f158 = MUL_F(x[3], FRAC_CONST(0.8424460355094185)); + f159 = f156 + f157; + f160 = f158 - f157; + f161 = f118 - f142; + f162 = f118 + f142; + f163 = f117 - f141; + f164 = f117 + f141; + f165 = f124 - f148; + f166 = f124 + f148; + f167 = f123 - f147; + f168 = f123 + f147; + f169 = f130 - f154; + f170 = f130 + f154; + f171 = f129 - f153; + f172 = f129 + f153; + f173 = f136 - f160; + f174 = f136 + f160; + f175 = f135 - f159; + f176 = f135 + f159; + f177 = f161 + f163; + f178 = MUL_C(f161, COEF_CONST(1.1758756024193588)); + f179 = MUL_F(f177, FRAC_CONST((-0.9807852804032304))); + f180 = MUL_F(f163, FRAC_CONST((-0.7856949583871021))); + f181 = f178 + f179; + f182 = f180 - f179; + f183 = f165 + f167; + f184 = MUL_C(f165, COEF_CONST(1.3870398453221475)); + f185 = MUL_F(f183, FRAC_CONST((-0.5555702330196022))); + f186 = MUL_F(f167, FRAC_CONST(0.2758993792829431)); + f187 = f184 + f185; + f188 = f186 - f185; + f189 = f169 + f171; + f190 = MUL_F(f169, FRAC_CONST(0.7856949583871022)); + f191 = MUL_F(f189, FRAC_CONST(0.1950903220161283)); + f192 = MUL_C(f171, COEF_CONST(1.1758756024193586)); + f193 = f190 + f191; + f194 = f192 - f191; + f195 = f173 + f175; + f196 = MUL_F(f173, FRAC_CONST((-0.2758993792829430))); + f197 = MUL_F(f195, FRAC_CONST(0.8314696123025452)); + f198 = MUL_C(f175, COEF_CONST(1.3870398453221475)); + f199 = f196 + f197; + f200 = f198 - f197; + f201 = f162 - f170; + f202 = f162 + f170; + f203 = f164 - f172; + f204 = f164 + f172; + f205 = f166 - f174; + f206 = f166 + f174; + f207 = f168 - f176; + f208 = f168 + f176; + f209 = f182 - f194; + f210 = f182 + f194; + f211 = f181 - f193; + f212 = f181 + f193; + f213 = f188 - f200; + f214 = f188 + f200; + f215 = f187 - f199; + f216 = f187 + f199; + f217 = f201 + f203; + f218 = MUL_C(f201, COEF_CONST(1.3065629648763766)); + f219 = MUL_F(f217, FRAC_CONST((-0.9238795325112866))); + f220 = MUL_F(f203, FRAC_CONST((-0.5411961001461967))); + f221 = f218 + f219; + f222 = f220 - f219; + f223 = f205 + f207; + f224 = MUL_F(f205, FRAC_CONST(0.5411961001461969)); + f225 = MUL_F(f223, FRAC_CONST(0.3826834323650898)); + f226 = MUL_C(f207, COEF_CONST(1.3065629648763766)); + f227 = f224 + f225; + f228 = f226 - f225; + f229 = f209 + f211; + f230 = MUL_C(f209, COEF_CONST(1.3065629648763766)); + f231 = MUL_F(f229, FRAC_CONST((-0.9238795325112866))); + f232 = MUL_F(f211, FRAC_CONST((-0.5411961001461967))); + f233 = f230 + f231; + f234 = f232 - f231; + f235 = f213 + f215; + f236 = MUL_F(f213, FRAC_CONST(0.5411961001461969)); + f237 = MUL_F(f235, FRAC_CONST(0.3826834323650898)); + f238 = MUL_C(f215, COEF_CONST(1.3065629648763766)); + f239 = f236 + f237; + f240 = f238 - f237; + f241 = f202 - f206; + f242 = f202 + f206; + f243 = f204 - f208; + f244 = f204 + f208; + f245 = f222 - f228; + f246 = f222 + f228; + f247 = f221 - f227; + f248 = f221 + f227; + f249 = f210 - f214; + f250 = f210 + f214; + f251 = f212 - f216; + f252 = f212 + f216; + f253 = f234 - f240; + f254 = f234 + f240; + f255 = f233 - f239; + f256 = f233 + f239; + f257 = f241 - f243; + f258 = f241 + f243; + f259 = MUL_F(f257, FRAC_CONST(0.7071067811865474)); + f260 = MUL_F(f258, FRAC_CONST(0.7071067811865474)); + f261 = f245 - f247; + f262 = f245 + f247; + f263 = MUL_F(f261, FRAC_CONST(0.7071067811865474)); + f264 = MUL_F(f262, FRAC_CONST(0.7071067811865474)); + f265 = f249 - f251; + f266 = f249 + f251; + f267 = MUL_F(f265, FRAC_CONST(0.7071067811865474)); + f268 = MUL_F(f266, FRAC_CONST(0.7071067811865474)); + f269 = f253 - f255; + f270 = f253 + f255; + f271 = MUL_F(f269, FRAC_CONST(0.7071067811865474)); + f272 = MUL_F(f270, FRAC_CONST(0.7071067811865474)); + y[31] = f98 - f242; + y[0] = f98 + f242; + y[30] = f100 - f250; + y[1] = f100 + f250; + y[29] = f102 - f254; + y[2] = f102 + f254; + y[28] = f104 - f246; + y[3] = f104 + f246; + y[27] = f106 - f264; + y[4] = f106 + f264; + y[26] = f108 - f272; + y[5] = f108 + f272; + y[25] = f110 - f268; + y[6] = f110 + f268; + y[24] = f112 - f260; + y[7] = f112 + f260; + y[23] = f111 - f259; + y[8] = f111 + f259; + y[22] = f109 - f267; + y[9] = f109 + f267; + y[21] = f107 - f271; + y[10] = f107 + f271; + y[20] = f105 - f263; + y[11] = f105 + f263; + y[19] = f103 - f248; + y[12] = f103 + f248; + y[18] = f101 - f256; + y[13] = f101 + f256; + y[17] = f99 - f252; + y[14] = f99 + f252; + y[16] = f97 - f244; + y[15] = f97 + f244; +} + +void DCT2_32_unscaled(real_t *y, real_t *x) +{ + real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; + real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; + real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; + real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; + real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; + real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; + real_t f63, f64, f65, f66, f69, f70, f71, f72, f73, f74; + real_t f75, f76, f77, f78, f79, f80, f81, f83, f85, f86; + real_t f89, f90, f91, f92, f93, f94, f95, f96, f97, f98; + real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108; + real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118; + real_t f119, f120, f121, f122, f123, f124, f127, f128, f129, f130; + real_t f133, f134, f135, f136, f139, f140, f141, f142, f145, f146; + real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156; + real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166; + real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176; + real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186; + real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196; + real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206; + real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216; + real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226; + real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236; + real_t f237, f238, f239, f240, f241, f242, f243, f244, f247, f248; + real_t f249, f250, f253, f254, f255, f256, f259, f260, f261, f262; + real_t f265, f266, f267, f268, f271, f272, f273, f274, f277, f278; + real_t f279, f280, f283, f284, f285, f286; + + f0 = x[0] - x[31]; + f1 = x[0] + x[31]; + f2 = x[1] - x[30]; + f3 = x[1] + x[30]; + f4 = x[2] - x[29]; + f5 = x[2] + x[29]; + f6 = x[3] - x[28]; + f7 = x[3] + x[28]; + f8 = x[4] - x[27]; + f9 = x[4] + x[27]; + f10 = x[5] - x[26]; + f11 = x[5] + x[26]; + f12 = x[6] - x[25]; + f13 = x[6] + x[25]; + f14 = x[7] - x[24]; + f15 = x[7] + x[24]; + f16 = x[8] - x[23]; + f17 = x[8] + x[23]; + f18 = x[9] - x[22]; + f19 = x[9] + x[22]; + f20 = x[10] - x[21]; + f21 = x[10] + x[21]; + f22 = x[11] - x[20]; + f23 = x[11] + x[20]; + f24 = x[12] - x[19]; + f25 = x[12] + x[19]; + f26 = x[13] - x[18]; + f27 = x[13] + x[18]; + f28 = x[14] - x[17]; + f29 = x[14] + x[17]; + f30 = x[15] - x[16]; + f31 = x[15] + x[16]; + f32 = f1 - f31; + f33 = f1 + f31; + f34 = f3 - f29; + f35 = f3 + f29; + f36 = f5 - f27; + f37 = f5 + f27; + f38 = f7 - f25; + f39 = f7 + f25; + f40 = f9 - f23; + f41 = f9 + f23; + f42 = f11 - f21; + f43 = f11 + f21; + f44 = f13 - f19; + f45 = f13 + f19; + f46 = f15 - f17; + f47 = f15 + f17; + f48 = f33 - f47; + f49 = f33 + f47; + f50 = f35 - f45; + f51 = f35 + f45; + f52 = f37 - f43; + f53 = f37 + f43; + f54 = f39 - f41; + f55 = f39 + f41; + f56 = f49 - f55; + f57 = f49 + f55; + f58 = f51 - f53; + f59 = f51 + f53; + f60 = f57 - f59; + y[0] = f57 + f59; + y[16] = MUL_F(FRAC_CONST(0.7071067811865476), f60); + f63 = f56 + f58; + f64 = MUL_C(COEF_CONST(1.3065629648763766), f56); + f65 = MUL_F(FRAC_CONST(-0.9238795325112866), f63); + f66 = MUL_F(FRAC_CONST(-0.5411961001461967), f58); + y[24] = f64 + f65; + y[8] = f66 - f65; + f69 = f48 + f54; + f70 = MUL_C(COEF_CONST(1.1758756024193588), f48); + f71 = MUL_F(FRAC_CONST(-0.9807852804032304), f69); + f72 = MUL_F(FRAC_CONST(-0.7856949583871021), f54); + f73 = f70 + f71; + f74 = f72 - f71; + f75 = f50 + f52; + f76 = MUL_C(COEF_CONST(1.3870398453221473), f50); + f77 = MUL_F(FRAC_CONST(-0.8314696123025455), f75); + f78 = MUL_F(FRAC_CONST(-0.2758993792829436), f52); + f79 = f76 + f77; + f80 = f78 - f77; + f81 = f74 - f80; + y[4] = f74 + f80; + f83 = MUL_F(FRAC_CONST(0.7071067811865476), f81); + y[28] = f73 - f79; + f85 = f73 + f79; + f86 = MUL_F(FRAC_CONST(0.7071067811865476), f85); + y[20] = f83 - f86; + y[12] = f83 + f86; + f89 = f34 - f36; + f90 = f34 + f36; + f91 = f38 - f40; + f92 = f38 + f40; + f93 = f42 - f44; + f94 = f42 + f44; + f95 = MUL_F(FRAC_CONST(0.7071067811865476), f92); + f96 = f32 - f95; + f97 = f32 + f95; + f98 = f90 + f94; + f99 = MUL_C(COEF_CONST(1.3065629648763766), f90); + f100 = MUL_F(FRAC_CONST(-0.9238795325112866), f98); + f101 = MUL_F(FRAC_CONST(-0.5411961001461967), f94); + f102 = f99 + f100; + f103 = f101 - f100; + f104 = f97 - f103; + f105 = f97 + f103; + f106 = f96 - f102; + f107 = f96 + f102; + f108 = MUL_F(FRAC_CONST(0.7071067811865476), f91); + f109 = f46 - f108; + f110 = f46 + f108; + f111 = f93 + f89; + f112 = MUL_C(COEF_CONST(1.3065629648763766), f93); + f113 = MUL_F(FRAC_CONST(-0.9238795325112866), f111); + f114 = MUL_F(FRAC_CONST(-0.5411961001461967), f89); + f115 = f112 + f113; + f116 = f114 - f113; + f117 = f110 - f116; + f118 = f110 + f116; + f119 = f109 - f115; + f120 = f109 + f115; + f121 = f118 + f105; + f122 = MUL_F(FRAC_CONST(-0.8971675863426361), f118); + f123 = MUL_F(FRAC_CONST(0.9951847266721968), f121); + f124 = MUL_C(COEF_CONST(1.0932018670017576), f105); + y[2] = f122 + f123; + y[30] = f124 - f123; + f127 = f107 - f120; + f128 = MUL_F(FRAC_CONST(-0.6666556584777466), f120); + f129 = MUL_F(FRAC_CONST(0.9569403357322089), f127); + f130 = MUL_C(COEF_CONST(1.2472250129866713), f107); + y[6] = f129 - f128; + y[26] = f130 - f129; + f133 = f119 + f106; + f134 = MUL_F(FRAC_CONST(-0.4105245275223571), f119); + f135 = MUL_F(FRAC_CONST(0.8819212643483549), f133); + f136 = MUL_C(COEF_CONST(1.3533180011743529), f106); + y[10] = f134 + f135; + y[22] = f136 - f135; + f139 = f104 - f117; + f140 = MUL_F(FRAC_CONST(-0.1386171691990915), f117); + f141 = MUL_F(FRAC_CONST(0.7730104533627370), f139); + f142 = MUL_C(COEF_CONST(1.4074037375263826), f104); + y[14] = f141 - f140; + y[18] = f142 - f141; + f145 = f2 - f4; + f146 = f2 + f4; + f147 = f6 - f8; + f148 = f6 + f8; + f149 = f10 - f12; + f150 = f10 + f12; + f151 = f14 - f16; + f152 = f14 + f16; + f153 = f18 - f20; + f154 = f18 + f20; + f155 = f22 - f24; + f156 = f22 + f24; + f157 = f26 - f28; + f158 = f26 + f28; + f159 = MUL_F(FRAC_CONST(0.7071067811865476), f152); + f160 = f0 - f159; + f161 = f0 + f159; + f162 = f148 + f156; + f163 = MUL_C(COEF_CONST(1.3065629648763766), f148); + f164 = MUL_F(FRAC_CONST(-0.9238795325112866), f162); + f165 = MUL_F(FRAC_CONST(-0.5411961001461967), f156); + f166 = f163 + f164; + f167 = f165 - f164; + f168 = f161 - f167; + f169 = f161 + f167; + f170 = f160 - f166; + f171 = f160 + f166; + f172 = f146 + f158; + f173 = MUL_C(COEF_CONST(1.1758756024193588), f146); + f174 = MUL_F(FRAC_CONST(-0.9807852804032304), f172); + f175 = MUL_F(FRAC_CONST(-0.7856949583871021), f158); + f176 = f173 + f174; + f177 = f175 - f174; + f178 = f150 + f154; + f179 = MUL_C(COEF_CONST(1.3870398453221473), f150); + f180 = MUL_F(FRAC_CONST(-0.8314696123025455), f178); + f181 = MUL_F(FRAC_CONST(-0.2758993792829436), f154); + f182 = f179 + f180; + f183 = f181 - f180; + f184 = f177 - f183; + f185 = f177 + f183; + f186 = MUL_F(FRAC_CONST(0.7071067811865476), f184); + f187 = f176 - f182; + f188 = f176 + f182; + f189 = MUL_F(FRAC_CONST(0.7071067811865476), f188); + f190 = f186 - f189; + f191 = f186 + f189; + f192 = f169 - f185; + f193 = f169 + f185; + f194 = f171 - f191; + f195 = f171 + f191; + f196 = f170 - f190; + f197 = f170 + f190; + f198 = f168 - f187; + f199 = f168 + f187; + f200 = MUL_F(FRAC_CONST(0.7071067811865476), f151); + f201 = f30 - f200; + f202 = f30 + f200; + f203 = f155 + f147; + f204 = MUL_C(COEF_CONST(1.3065629648763766), f155); + f205 = MUL_F(FRAC_CONST(-0.9238795325112866), f203); + f206 = MUL_F(FRAC_CONST(-0.5411961001461967), f147); + f207 = f204 + f205; + f208 = f206 - f205; + f209 = f202 - f208; + f210 = f202 + f208; + f211 = f201 - f207; + f212 = f201 + f207; + f213 = f157 + f145; + f214 = MUL_C(COEF_CONST(1.1758756024193588), f157); + f215 = MUL_F(FRAC_CONST(-0.9807852804032304), f213); + f216 = MUL_F(FRAC_CONST(-0.7856949583871021), f145); + f217 = f214 + f215; + f218 = f216 - f215; + f219 = f153 + f149; + f220 = MUL_C(COEF_CONST(1.3870398453221473), f153); + f221 = MUL_F(FRAC_CONST(-0.8314696123025455), f219); + f222 = MUL_F(FRAC_CONST(-0.2758993792829436), f149); + f223 = f220 + f221; + f224 = f222 - f221; + f225 = f218 - f224; + f226 = f218 + f224; + f227 = MUL_F(FRAC_CONST(0.7071067811865476), f225); + f228 = f217 - f223; + f229 = f217 + f223; + f230 = MUL_F(FRAC_CONST(0.7071067811865476), f229); + f231 = f227 - f230; + f232 = f227 + f230; + f233 = f210 - f226; + f234 = f210 + f226; + f235 = f212 - f232; + f236 = f212 + f232; + f237 = f211 - f231; + f238 = f211 + f231; + f239 = f209 - f228; + f240 = f209 + f228; + f241 = f234 + f193; + f242 = MUL_F(FRAC_CONST(-0.9497277818777543), f234); + f243 = MUL_F(FRAC_CONST(0.9987954562051724), f241); + f244 = MUL_C(COEF_CONST(1.0478631305325905), f193); + y[1] = f242 + f243; + y[31] = f244 - f243; + f247 = f195 - f236; + f248 = MUL_F(FRAC_CONST(-0.8424460355094192), f236); + f249 = MUL_F(FRAC_CONST(0.9891765099647810), f247); + f250 = MUL_C(COEF_CONST(1.1359069844201428), f195); + y[3] = f249 - f248; + y[29] = f250 - f249; + f253 = f238 + f197; + f254 = MUL_F(FRAC_CONST(-0.7270510732912801), f238); + f255 = MUL_F(FRAC_CONST(0.9700312531945440), f253); + f256 = MUL_C(COEF_CONST(1.2130114330978079), f197); + y[5] = f254 + f255; + y[27] = f256 - f255; + f259 = f199 - f240; + f260 = MUL_F(FRAC_CONST(-0.6046542117908007), f240); + f261 = MUL_F(FRAC_CONST(0.9415440651830208), f259); + f262 = MUL_C(COEF_CONST(1.2784339185752409), f199); + y[7] = f261 - f260; + y[25] = f262 - f261; + f265 = f239 + f198; + f266 = MUL_F(FRAC_CONST(-0.4764341996931611), f239); + f267 = MUL_F(FRAC_CONST(0.9039892931234433), f265); + f268 = MUL_C(COEF_CONST(1.3315443865537255), f198); + y[9] = f266 + f267; + y[23] = f268 - f267; + f271 = f196 - f237; + f272 = MUL_F(FRAC_CONST(-0.3436258658070505), f237); + f273 = MUL_F(FRAC_CONST(0.8577286100002721), f271); + f274 = MUL_C(COEF_CONST(1.3718313541934939), f196); + y[11] = f273 - f272; + y[21] = f274 - f273; + f277 = f235 + f194; + f278 = MUL_F(FRAC_CONST(-0.2075082269882114), f235); + f279 = MUL_F(FRAC_CONST(0.8032075314806448), f277); + f280 = MUL_C(COEF_CONST(1.3989068359730783), f194); + y[13] = f278 + f279; + y[19] = f280 - f279; + f283 = f192 - f233; + f284 = MUL_F(FRAC_CONST(-0.0693921705079408), f233); + f285 = MUL_F(FRAC_CONST(0.7409511253549591), f283); + f286 = MUL_C(COEF_CONST(1.4125100802019774), f192); + y[15] = f285 - f284; + y[17] = f286 - f285; +} + +#else + + +#define n 32 +#define log2n 5 + +// w_array_real[i] = cos(2*M_PI*i/32) +static const real_t w_array_real[] = { + FRAC_CONST(1.000000000000000), FRAC_CONST(0.980785279337272), + FRAC_CONST(0.923879528329380), FRAC_CONST(0.831469603195765), + FRAC_CONST(0.707106765732237), FRAC_CONST(0.555570210304169), + FRAC_CONST(0.382683402077046), FRAC_CONST(0.195090284503576), + FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090370246552), + FRAC_CONST(-0.382683482845162), FRAC_CONST(-0.555570282993553), + FRAC_CONST(-0.707106827549476), FRAC_CONST(-0.831469651765257), + FRAC_CONST(-0.923879561784627), FRAC_CONST(-0.980785296392607) +}; + +// w_array_imag[i] = sin(-2*M_PI*i/32) +static const real_t w_array_imag[] = { + FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090327375064), + FRAC_CONST(-0.382683442461104), FRAC_CONST(-0.555570246648862), + FRAC_CONST(-0.707106796640858), FRAC_CONST(-0.831469627480512), + FRAC_CONST(-0.923879545057005), FRAC_CONST(-0.980785287864940), + FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.980785270809601), + FRAC_CONST(-0.923879511601754), FRAC_CONST(-0.831469578911016), + FRAC_CONST(-0.707106734823616), FRAC_CONST(-0.555570173959476), + FRAC_CONST(-0.382683361692986), FRAC_CONST(-0.195090241632088) +}; + +// FFT decimation in frequency +// 4*16*2+16=128+16=144 multiplications +// 6*16*2+10*8+4*16*2=192+80+128=400 additions +static void fft_dif(real_t * Real, real_t * Imag) +{ + real_t w_real, w_imag; // For faster access + real_t point1_real, point1_imag, point2_real, point2_imag; // For faster access + uint32_t j, i, i2, w_index; // Counters + + // First 2 stages of 32 point FFT decimation in frequency + // 4*16*2=64*2=128 multiplications + // 6*16*2=96*2=192 additions + // Stage 1 of 32 point FFT decimation in frequency + for (i = 0; i < 16; i++) + { + point1_real = Real[i]; + point1_imag = Imag[i]; + i2 = i+16; + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + w_real = w_array_real[i]; + w_imag = w_array_imag[i]; + + // temp1 = x[i] - x[i2] + point1_real -= point2_real; + point1_imag -= point2_imag; + + // x[i1] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * w + Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); + Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); + } + // Stage 2 of 32 point FFT decimation in frequency + for (j = 0, w_index = 0; j < 8; j++, w_index += 2) + { + w_real = w_array_real[w_index]; + w_imag = w_array_imag[w_index]; + + i = j; + point1_real = Real[i]; + point1_imag = Imag[i]; + i2 = i+8; + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // temp1 = x[i] - x[i2] + point1_real -= point2_real; + point1_imag -= point2_imag; + + // x[i1] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * w + Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); + Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); + + i = j+16; + point1_real = Real[i]; + point1_imag = Imag[i]; + i2 = i+8; + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // temp1 = x[i] - x[i2] + point1_real -= point2_real; + point1_imag -= point2_imag; + + // x[i1] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * w + Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); + Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); + } + + // Stage 3 of 32 point FFT decimation in frequency + // 2*4*2=16 multiplications + // 4*4*2+6*4*2=10*8=80 additions + for (i = 0; i < n; i += 8) + { + i2 = i+4; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // out[i1] = point1 + point2 + Real[i] += point2_real; + Imag[i] += point2_imag; + + // out[i2] = point1 - point2 + Real[i2] = point1_real - point2_real; + Imag[i2] = point1_imag - point2_imag; + } + w_real = w_array_real[4]; // = sqrt(2)/2 + // w_imag = -w_real; // = w_array_imag[4]; // = -sqrt(2)/2 + for (i = 1; i < n; i += 8) + { + i2 = i+4; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // temp1 = x[i] - x[i2] + point1_real -= point2_real; + point1_imag -= point2_imag; + + // x[i1] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * w + Real[i2] = MUL_F(point1_real+point1_imag, w_real); + Imag[i2] = MUL_F(point1_imag-point1_real, w_real); + } + for (i = 2; i < n; i += 8) + { + i2 = i+4; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // x[i] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * (-i) + Real[i2] = point1_imag - point2_imag; + Imag[i2] = point2_real - point1_real; + } + w_real = w_array_real[12]; // = -sqrt(2)/2 + // w_imag = w_real; // = w_array_imag[12]; // = -sqrt(2)/2 + for (i = 3; i < n; i += 8) + { + i2 = i+4; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // temp1 = x[i] - x[i2] + point1_real -= point2_real; + point1_imag -= point2_imag; + + // x[i1] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * w + Real[i2] = MUL_F(point1_real-point1_imag, w_real); + Imag[i2] = MUL_F(point1_real+point1_imag, w_real); + } + + + // Stage 4 of 32 point FFT decimation in frequency (no multiplications) + // 16*4=64 additions + for (i = 0; i < n; i += 4) + { + i2 = i+2; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // x[i1] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = x[i] - x[i2] + Real[i2] = point1_real - point2_real; + Imag[i2] = point1_imag - point2_imag; + } + for (i = 1; i < n; i += 4) + { + i2 = i+2; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // x[i] = x[i] + x[i2] + Real[i] += point2_real; + Imag[i] += point2_imag; + + // x[i2] = (x[i] - x[i2]) * (-i) + Real[i2] = point1_imag - point2_imag; + Imag[i2] = point2_real - point1_real; + } + + // Stage 5 of 32 point FFT decimation in frequency (no multiplications) + // 16*4=64 additions + for (i = 0; i < n; i += 2) + { + i2 = i+1; + point1_real = Real[i]; + point1_imag = Imag[i]; + + point2_real = Real[i2]; + point2_imag = Imag[i2]; + + // out[i1] = point1 + point2 + Real[i] += point2_real; + Imag[i] += point2_imag; + + // out[i2] = point1 - point2 + Real[i2] = point1_real - point2_real; + Imag[i2] = point1_imag - point2_imag; + } + +#ifdef REORDER_IN_FFT + FFTReorder(Real, Imag); +#endif // #ifdef REORDER_IN_FFT +} +#undef n +#undef log2n + +static const real_t dct4_64_tab[] = { + COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507), + COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537), + COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708), + COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462), + COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627), + COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471), + COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592), + COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979), + COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146), + COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291), + COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091), + COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643), + COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127), + COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700), + COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423), + COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828), + COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626), + COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974), + COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658), + COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784), + COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981), + COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980), + COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093), + COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162), + COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640), + COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904), + COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420), + COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944), + COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476), + COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670), + COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128), + COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182), + COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388), + COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101), + COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759), + COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140), + COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596), + COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318), + COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446), + COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152), + COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704), + COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322), + COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238), + COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981), + COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577), + COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592), + COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960), + COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205), + COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734), + COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526), + COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092), + COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721), + COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959), + COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014), + COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227), + COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424), + COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756), + COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734), + COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437), + COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838), + COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899), + COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223), + COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439), + COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320), + COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086), + COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159), + COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605), + COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942), + COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475), + COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740), + COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961), + COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470), + COEF_CONST(0), COEF_CONST(-1.412510156631470), + COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961), + COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740), + COEF_CONST(-1.353317975997925), COEF_CONST(-1.331544399261475), + COEF_CONST(-1.306562900543213), COEF_CONST(-1.278433918952942), + COEF_CONST(-1.247225046157837), COEF_CONST(-1.213011384010315), + COEF_CONST(-1.175875544548035), COEF_CONST(-1.135907053947449), + COEF_CONST(-1.093201875686646), COEF_CONST(-1.047863125801086), + COEF_CONST(-1.000000000000000), COEF_CONST(-0.949727773666382), + COEF_CONST(-0.897167563438416), COEF_CONST(-0.842446029186249), + COEF_CONST(-0.785694956779480), COEF_CONST(-0.727051079273224), + COEF_CONST(-0.666655659675598), COEF_CONST(-0.604654192924500), + COEF_CONST(-0.541196048259735), COEF_CONST(-0.476434230804443), + COEF_CONST(-0.410524487495422), COEF_CONST(-0.343625843524933), + COEF_CONST(-0.275899350643158), COEF_CONST(-0.207508206367493), + COEF_CONST(-0.138617098331451), COEF_CONST(-0.069392144680023), + COEF_CONST(0), COEF_CONST(0.069392263889313), + COEF_CONST(0.138617157936096), COEF_CONST(0.207508206367493), + COEF_CONST(0.275899469852448), COEF_CONST(0.343625962734222), + COEF_CONST(0.410524636507034), COEF_CONST(0.476434201002121), + COEF_CONST(0.541196107864380), COEF_CONST(0.604654192924500), + COEF_CONST(0.666655719280243), COEF_CONST(0.727051138877869), + COEF_CONST(0.785695075988770), COEF_CONST(0.842446029186249), + COEF_CONST(0.897167563438416), COEF_CONST(0.949727773666382) +}; + +/* size 64 only! */ +void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag) +{ + // Tables with bit reverse values for 5 bits, bit reverse of i at i-th position + const uint8_t bit_rev_tab[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 }; + uint32_t i, i_rev; + + /* Step 2: modulate */ + // 3*32=96 multiplications + // 3*32=96 additions + for (i = 0; i < 32; i++) + { + real_t x_re, x_im, tmp; + x_re = in_real[i]; + x_im = in_imag[i]; + tmp = MUL_C(x_re + x_im, dct4_64_tab[i]); + in_real[i] = MUL_C(x_im, dct4_64_tab[i + 64]) + tmp; + in_imag[i] = MUL_C(x_re, dct4_64_tab[i + 32]) + tmp; + } + + /* Step 3: FFT, but with output in bit reverse order */ + fft_dif(in_real, in_imag); + + /* Step 4: modulate + bitreverse reordering */ + // 3*31+2=95 multiplications + // 3*31+2=95 additions + for (i = 0; i < 16; i++) + { + real_t x_re, x_im, tmp; + i_rev = bit_rev_tab[i]; + x_re = in_real[i_rev]; + x_im = in_imag[i_rev]; + + tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); + out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; + out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; + } + // i = 16, i_rev = 1 = rev(16); + out_imag[16] = MUL_C(in_imag[1] - in_real[1], dct4_64_tab[16 + 3*32]); + out_real[16] = MUL_C(in_real[1] + in_imag[1], dct4_64_tab[16 + 3*32]); + for (i = 17; i < 32; i++) + { + real_t x_re, x_im, tmp; + i_rev = bit_rev_tab[i]; + x_re = in_real[i_rev]; + x_im = in_imag[i_rev]; + tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); + out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; + out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; + } + +} + +#endif + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_dct.h b/src/contrib/aacdecoder/libfaad/sbr_dct.h old mode 100644 new mode 100755 index 1de381706..ce44fd7ef --- a/src/contrib/aacdecoder/libfaad/sbr_dct.h +++ b/src/contrib/aacdecoder/libfaad/sbr_dct.h @@ -1,46 +1,52 @@ -/* -** 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: sbr_dct.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_DCT_H__ -#define __SBR_DCT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void DCT3_32_unscaled(real_t *y, real_t *x); -void DCT2_64_unscaled(real_t *y, real_t *x); -void DST2_64_unscaled(real_t *y, real_t *x); -void DCT4_64(real_t *y, real_t *x); -void DCT4_64_kernel(real_t *y, real_t *t2); - - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_dct.h,v 1.19 2007/11/01 12:33:34 menno Exp $ +**/ + +#ifndef __SBR_DCT_H__ +#define __SBR_DCT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag); + +void DCT3_32_unscaled(real_t *y, real_t *x); +void DCT4_32(real_t *y, real_t *x); +void DST4_32(real_t *y, real_t *x); +void DCT2_32_unscaled(real_t *y, real_t *x); +void DCT4_16(real_t *y, real_t *x); +void DCT2_16_unscaled(real_t *y, real_t *x); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_dec.c b/src/contrib/aacdecoder/libfaad/sbr_dec.c old mode 100644 new mode 100755 index 551ec73f9..0705ddd91 --- a/src/contrib/aacdecoder/libfaad/sbr_dec.c +++ b/src/contrib/aacdecoder/libfaad/sbr_dec.c @@ -1,479 +1,690 @@ -/* -** 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: sbr_dec.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include -#include - -#include "syntax.h" -#include "bits.h" -#include "sbr_syntax.h" -#include "sbr_qmf.h" -#include "sbr_hfgen.h" -#include "sbr_hfadj.h" - -/* static function declarations */ -static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch); - -sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, - uint32_t sample_rate -#ifdef DRM - , uint8_t IsDRM -#endif - ) -{ - sbr_info *sbr = faad_malloc(sizeof(sbr_info)); - memset(sbr, 0, sizeof(sbr_info)); - - /* save id of the parent element */ - sbr->id_aac = id_aac; - sbr->sample_rate = sample_rate; - - sbr->bs_freq_scale = 2; - sbr->bs_alter_scale = 1; - sbr->bs_noise_bands = 2; - sbr->bs_limiter_bands = 2; - sbr->bs_limiter_gains = 2; - sbr->bs_interpol_freq = 1; - sbr->bs_smoothing_mode = 1; - sbr->bs_start_freq = 5; - sbr->bs_amp_res = 1; - sbr->bs_samplerate_mode = 1; - sbr->prevEnvIsShort[0] = -1; - sbr->prevEnvIsShort[1] = -1; - sbr->header_count = 0; - -#ifdef DRM - sbr->Is_DRM_SBR = IsDRM; -#endif - sbr->bs_samplerate_mode = 1; - sbr->tHFGen = T_HFGEN; - sbr->tHFAdj = T_HFADJ; - - /* force sbr reset */ - sbr->bs_start_freq_prev = -1; - - if (framelength == 960) - { - sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960; - sbr->numTimeSlots = NO_TIME_SLOTS_960; - } else { - sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS; - sbr->numTimeSlots = NO_TIME_SLOTS; - } - - return sbr; -} - -void sbrDecodeEnd(sbr_info *sbr) -{ - uint8_t j; - - if (sbr) - { - qmfa_end(sbr->qmfa[0]); - qmfs_end(sbr->qmfs[0]); - if (sbr->qmfs[1] != NULL) - { - qmfa_end(sbr->qmfa[1]); - qmfs_end(sbr->qmfs[1]); - } - - for (j = 0; j < 5; j++) - { - if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]); - if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]); - if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]); - if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]); - } - - faad_free(sbr); - } -} - -static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - /* save data for next frame */ - sbr->kx_prev = sbr->kx; - - sbr->L_E_prev[ch] = sbr->L_E[ch]; - - /* sbr->L_E[ch] can become 0 on files with bit errors */ - if (sbr->L_E[ch] <= 0) - return 19; - - sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1]; - for (i = 0; i < 64; i++) - { - sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1]; - sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1]; - } - - for (i = 0; i < 64; i++) - { - sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i]; - } - sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch]; - - if (sbr->l_A[ch] == sbr->L_E[ch]) - sbr->prevEnvIsShort[ch] = 0; - else - sbr->prevEnvIsShort[ch] = -1; - - return 0; -} - -static void sbr_process_channel(sbr_info *sbr, real_t *channel_buf, qmf_t X[MAX_NTSR][64], - uint8_t ch, uint8_t dont_process) -{ - int16_t i, k, l; - -#ifdef SBR_LOW_POWER - ALIGN real_t deg[64]; -#endif - - if (sbr->frame == 0) - { - uint8_t j; - sbr->qmfa[ch] = qmfa_init(32); - sbr->qmfs[ch] = qmfs_init(64); - - for (j = 0; j < 5; j++) - { - sbr->G_temp_prev[ch][j] = faad_malloc(64*sizeof(real_t)); - sbr->Q_temp_prev[ch][j] = faad_malloc(64*sizeof(real_t)); - } - - memset(sbr->Xsbr[ch], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); - memset(sbr->Xcodec[ch], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*32 * sizeof(qmf_t)); - } - - /* subband analysis */ - if (dont_process) - sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xcodec[ch], sbr->tHFGen, 32); - else - sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xcodec[ch], sbr->tHFGen, sbr->kx); - - if (!dont_process) - { -#if 1 - /* insert high frequencies here */ - /* hf generation using patching */ - hf_generation(sbr, sbr->Xcodec[ch], sbr->Xsbr[ch] -#ifdef SBR_LOW_POWER - ,deg -#endif - ,ch); -#endif - -#ifdef SBR_LOW_POWER - for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++) - { - for (k = 0; k < sbr->kx; k++) - { - QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0; - } - } -#endif - -#if 1 - /* hf adjustment */ - hf_adjustment(sbr, sbr->Xsbr[ch] -#ifdef SBR_LOW_POWER - ,deg -#endif - ,ch); -#endif - } - - if ((sbr->just_seeked != 0) || dont_process) - { - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - for (k = 0; k < 32; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xcodec[ch][l + sbr->tHFAdj][k]); -#ifndef SBR_LOW_POWER - QMF_IM(X[l][k]) = QMF_IM(sbr->Xcodec[ch][l + sbr->tHFAdj][k]); -#endif - } - for (k = 32; k < 64; k++) - { - QMF_RE(X[l][k]) = 0; -#ifndef SBR_LOW_POWER - QMF_IM(X[l][k]) = 0; -#endif - } - } - } else { - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - uint8_t xover_band; - - if (l < sbr->t_E[ch][0]) - xover_band = sbr->kx_prev; - else - xover_band = sbr->kx; - - for (k = 0; k < xover_band; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xcodec[ch][l + sbr->tHFAdj][k]); -#ifndef SBR_LOW_POWER - QMF_IM(X[l][k]) = QMF_IM(sbr->Xcodec[ch][l + sbr->tHFAdj][k]); -#endif - } - for (k = xover_band; k < 64; k++) - { - QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); -#ifndef SBR_LOW_POWER - QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); -#endif - } -#ifdef SBR_LOW_POWER - QMF_RE(X[l][xover_band - 1]) += QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][xover_band - 1]); -#endif - } - } - - for (i = 0; i < sbr->tHFGen; i++) - { - memmove(sbr->Xcodec[ch][i], sbr->Xcodec[ch][i+sbr->numTimeSlotsRate], 32 * sizeof(qmf_t)); - memmove(sbr->Xsbr[ch][i], sbr->Xsbr[ch][i+sbr->numTimeSlotsRate], 64 * sizeof(qmf_t)); - } -} - -uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, - const uint8_t just_seeked, const uint8_t upsample_only) -{ - uint8_t dont_process = 0; - uint8_t ret = 0; - ALIGN qmf_t X[MAX_NTSR][64]; - - if (sbr == NULL) - return 20; - - /* case can occur due to bit errors */ - if (sbr->id_aac != ID_CPE) - return 21; - - if (sbr->ret || (sbr->header_count == 0)) - { - /* don't process just upsample */ - dont_process = 1; - - /* Re-activate reset for next frame */ - if (sbr->ret && sbr->Reset) - sbr->bs_start_freq_prev = -1; - } - - if (just_seeked) - { - sbr->just_seeked = 1; - } else { - sbr->just_seeked = 0; - } - - sbr_process_channel(sbr, left_chan, X, 0, dont_process); - /* subband synthesis */ -#ifndef USE_SSE - sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan); -#else - sbr->qmfs[ch]->qmf_func(sbr, sbr->qmfs[0], X, left_chan); -#endif - - sbr_process_channel(sbr, right_chan, X, 1, dont_process); - /* subband synthesis */ -#ifndef USE_SSE - sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan); -#else - sbr->qmfs[ch]->qmf_func(sbr, sbr->qmfs[1], X, right_chan); -#endif - - if (sbr->bs_header_flag) - sbr->just_seeked = 0; - - if (sbr->header_count != 0 && sbr->ret == 0) - { - ret = sbr_save_prev_data(sbr, 0); - if (ret) return ret; - ret = sbr_save_prev_data(sbr, 1); - if (ret) return ret; - } - - sbr->frame++; - - return 0; -} - -uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, - const uint8_t just_seeked, const uint8_t upsample_only) -{ - uint8_t dont_process = 0; - uint8_t ret = 0; - ALIGN qmf_t X[MAX_NTSR][64]; - - if (sbr == NULL) - return 20; - - /* case can occur due to bit errors */ - if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) - return 21; - - if (sbr->ret || (sbr->header_count == 0)) - { - /* don't process just upsample */ - dont_process = 1; - - /* Re-activate reset for next frame */ - if (sbr->ret && sbr->Reset) - sbr->bs_start_freq_prev = -1; - } - - if (just_seeked) - { - sbr->just_seeked = 1; - } else { - sbr->just_seeked = 0; - } - - sbr_process_channel(sbr, channel, X, 0, dont_process); - /* subband synthesis */ -#ifndef USE_SSE - sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel); -#else - sbr->qmfs[ch]->qmf_func(sbr, sbr->qmfs[0], X, channel); -#endif - - if (sbr->bs_header_flag) - sbr->just_seeked = 0; - - if (sbr->header_count != 0 && sbr->ret == 0) - { - ret = sbr_save_prev_data(sbr, 0); - if (ret) return ret; - } - - sbr->frame++; - - return 0; -} - -static void ps_dummy_function(qmf_t X_mono[MAX_NTSR][64], - qmf_t X_left[MAX_NTSR][64], qmf_t X_right[MAX_NTSR][64]) -{ - uint8_t i, j; - - for (i = 0; i < MAX_NTSR; i++) - { - for (j = 0; j < 64; j++) - { - QMF_RE(X_left[i][j]) = QMF_RE(X_mono[i][j]); - QMF_RE(X_right[i][j]) = QMF_RE(X_mono[i][j]); -#ifndef SBR_LOW_POWER - QMF_IM(X_left[i][j]) = QMF_IM(X_mono[i][j]); - QMF_IM(X_right[i][j]) = QMF_IM(X_mono[i][j]); -#endif - } - } -} - -#if (defined(PS_DEC) || defined(DRM_PS)) -uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, - const uint8_t just_seeked, const uint8_t upsample_only) -{ - uint8_t dont_process = 0; - uint8_t ret = 0; - ALIGN qmf_t X_mono[MAX_NTSR][64]; - ALIGN qmf_t X_left[MAX_NTSR][64]; - ALIGN qmf_t X_right[MAX_NTSR][64]; - - if (sbr == NULL) - return 20; - - /* case can occur due to bit errors */ - if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) - return 21; - - if (sbr->ret || (sbr->header_count == 0)) - { - /* don't process just upsample */ - dont_process = 1; - - /* Re-activate reset for next frame */ - if (sbr->ret && sbr->Reset) - sbr->bs_start_freq_prev = -1; - } - - if (just_seeked) - { - sbr->just_seeked = 1; - } else { - sbr->just_seeked = 0; - } - - if (sbr->frame == 0) - { - sbr->qmfs[1] = qmfs_init(64); - } - - sbr_process_channel(sbr, left_channel, X_mono, 0, dont_process); - - /* perform parametric stereo */ - ps_dummy_function(X_mono, X_left, X_right); - - /* subband synthesis */ -#ifndef USE_SSE - sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel); - sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel); -#else - sbr->qmfs[ch]->qmf_func(sbr, sbr->qmfs[0], X_left, left_channel); - sbr->qmfs[ch]->qmf_func(sbr, sbr->qmfs[1], X_right, right_channel); -#endif - - if (sbr->bs_header_flag) - sbr->just_seeked = 0; - - if (sbr->header_count != 0 && sbr->ret == 0) - { - ret = sbr_save_prev_data(sbr, 0); - if (ret) return ret; - } - - sbr->frame++; - - return 0; -} -#endif - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_dec.c,v 1.44 2009/01/26 22:32:31 menno Exp $ +**/ + + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include +#include + +#include "syntax.h" +#include "bits.h" +#include "sbr_syntax.h" +#include "sbr_qmf.h" +#include "sbr_hfgen.h" +#include "sbr_hfadj.h" + + +/* static function declarations */ +static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch); +static void sbr_save_matrix(sbr_info *sbr, uint8_t ch); + + +sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, + uint32_t sample_rate, uint8_t downSampledSBR +#ifdef DRM + , uint8_t IsDRM +#endif + ) +{ + sbr_info *sbr = faad_malloc(sizeof(sbr_info)); + memset(sbr, 0, sizeof(sbr_info)); + + /* save id of the parent element */ + sbr->id_aac = id_aac; + sbr->sample_rate = sample_rate; + + sbr->bs_freq_scale = 2; + sbr->bs_alter_scale = 1; + sbr->bs_noise_bands = 2; + sbr->bs_limiter_bands = 2; + sbr->bs_limiter_gains = 2; + sbr->bs_interpol_freq = 1; + sbr->bs_smoothing_mode = 1; + sbr->bs_start_freq = 5; + sbr->bs_amp_res = 1; + sbr->bs_samplerate_mode = 1; + sbr->prevEnvIsShort[0] = -1; + sbr->prevEnvIsShort[1] = -1; + sbr->header_count = 0; + sbr->Reset = 1; + +#ifdef DRM + sbr->Is_DRM_SBR = IsDRM; +#endif + sbr->tHFGen = T_HFGEN; + sbr->tHFAdj = T_HFADJ; + + sbr->bsco = 0; + sbr->bsco_prev = 0; + sbr->M_prev = 0; + sbr->frame_len = framelength; + + /* force sbr reset */ + sbr->bs_start_freq_prev = -1; + + if (framelength == 960) + { + sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960; + sbr->numTimeSlots = NO_TIME_SLOTS_960; + } else { + sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS; + sbr->numTimeSlots = NO_TIME_SLOTS; + } + + sbr->GQ_ringbuf_index[0] = 0; + sbr->GQ_ringbuf_index[1] = 0; + + if (id_aac == ID_CPE) + { + /* stereo */ + uint8_t j; + sbr->qmfa[0] = qmfa_init(32); + sbr->qmfa[1] = qmfa_init(32); + sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); + sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); + + for (j = 0; j < 5; j++) + { + sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); + sbr->G_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); + sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); + sbr->Q_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); + } + + memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); + memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); + } else { + /* mono */ + uint8_t j; + sbr->qmfa[0] = qmfa_init(32); + sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); + sbr->qmfs[1] = NULL; + + for (j = 0; j < 5; j++) + { + sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); + sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); + } + + memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); + } + + return sbr; +} + +void sbrDecodeEnd(sbr_info *sbr) +{ + uint8_t j; + + if (sbr) + { + qmfa_end(sbr->qmfa[0]); + qmfs_end(sbr->qmfs[0]); + if (sbr->qmfs[1] != NULL) + { + qmfa_end(sbr->qmfa[1]); + qmfs_end(sbr->qmfs[1]); + } + + for (j = 0; j < 5; j++) + { + if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]); + if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]); + if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]); + if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]); + } + +#ifdef PS_DEC + if (sbr->ps != NULL) + ps_free(sbr->ps); +#endif + +#ifdef DRM_PS + if (sbr->drm_ps != NULL) + drm_ps_free(sbr->drm_ps); +#endif + + faad_free(sbr); + } +} + +void sbrReset(sbr_info *sbr) +{ + uint8_t j; + if (sbr->qmfa[0] != NULL) + memset(sbr->qmfa[0]->x, 0, 2 * sbr->qmfa[0]->channels * 10 * sizeof(real_t)); + if (sbr->qmfa[1] != NULL) + memset(sbr->qmfa[1]->x, 0, 2 * sbr->qmfa[1]->channels * 10 * sizeof(real_t)); + if (sbr->qmfs[0] != NULL) + memset(sbr->qmfs[0]->v, 0, 2 * sbr->qmfs[0]->channels * 20 * sizeof(real_t)); + if (sbr->qmfs[1] != NULL) + memset(sbr->qmfs[1]->v, 0, 2 * sbr->qmfs[1]->channels * 20 * sizeof(real_t)); + + for (j = 0; j < 5; j++) + { + if (sbr->G_temp_prev[0][j] != NULL) + memset(sbr->G_temp_prev[0][j], 0, 64*sizeof(real_t)); + if (sbr->G_temp_prev[1][j] != NULL) + memset(sbr->G_temp_prev[1][j], 0, 64*sizeof(real_t)); + if (sbr->Q_temp_prev[0][j] != NULL) + memset(sbr->Q_temp_prev[0][j], 0, 64*sizeof(real_t)); + if (sbr->Q_temp_prev[1][j] != NULL) + memset(sbr->Q_temp_prev[1][j], 0, 64*sizeof(real_t)); + } + + memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); + memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); + + sbr->GQ_ringbuf_index[0] = 0; + sbr->GQ_ringbuf_index[1] = 0; + sbr->header_count = 0; + sbr->Reset = 1; + + sbr->L_E_prev[0] = 0; + sbr->L_E_prev[1] = 0; + sbr->bs_freq_scale = 2; + sbr->bs_alter_scale = 1; + sbr->bs_noise_bands = 2; + sbr->bs_limiter_bands = 2; + sbr->bs_limiter_gains = 2; + sbr->bs_interpol_freq = 1; + sbr->bs_smoothing_mode = 1; + sbr->bs_start_freq = 5; + sbr->bs_amp_res = 1; + sbr->bs_samplerate_mode = 1; + sbr->prevEnvIsShort[0] = -1; + sbr->prevEnvIsShort[1] = -1; + sbr->bsco = 0; + sbr->bsco_prev = 0; + sbr->M_prev = 0; + sbr->bs_start_freq_prev = -1; + + sbr->f_prev[0] = 0; + sbr->f_prev[1] = 0; + for (j = 0; j < MAX_M; j++) + { + sbr->E_prev[0][j] = 0; + sbr->Q_prev[0][j] = 0; + sbr->E_prev[1][j] = 0; + sbr->Q_prev[1][j] = 0; + sbr->bs_add_harmonic_prev[0][j] = 0; + sbr->bs_add_harmonic_prev[1][j] = 0; + } + sbr->bs_add_harmonic_flag_prev[0] = 0; + sbr->bs_add_harmonic_flag_prev[1] = 0; +} + +static uint8_t sbr_save_prev_data(sbr_info *sbr, uint8_t ch) +{ + uint8_t i; + + /* save data for next frame */ + sbr->kx_prev = sbr->kx; + sbr->M_prev = sbr->M; + sbr->bsco_prev = sbr->bsco; + + sbr->L_E_prev[ch] = sbr->L_E[ch]; + + /* sbr->L_E[ch] can become 0 on files with bit errors */ + if (sbr->L_E[ch] <= 0) + return 19; + + sbr->f_prev[ch] = sbr->f[ch][sbr->L_E[ch] - 1]; + for (i = 0; i < MAX_M; i++) + { + sbr->E_prev[ch][i] = sbr->E[ch][i][sbr->L_E[ch] - 1]; + sbr->Q_prev[ch][i] = sbr->Q[ch][i][sbr->L_Q[ch] - 1]; + } + + for (i = 0; i < MAX_M; i++) + { + sbr->bs_add_harmonic_prev[ch][i] = sbr->bs_add_harmonic[ch][i]; + } + sbr->bs_add_harmonic_flag_prev[ch] = sbr->bs_add_harmonic_flag[ch]; + + if (sbr->l_A[ch] == sbr->L_E[ch]) + sbr->prevEnvIsShort[ch] = 0; + else + sbr->prevEnvIsShort[ch] = -1; + + return 0; +} + +static void sbr_save_matrix(sbr_info *sbr, uint8_t ch) +{ + uint8_t i; + + for (i = 0; i < sbr->tHFGen; i++) + { + memmove(sbr->Xsbr[ch][i], sbr->Xsbr[ch][i+sbr->numTimeSlotsRate], 64 * sizeof(qmf_t)); + } + for (i = sbr->tHFGen; i < MAX_NTSRHFG; i++) + { + memset(sbr->Xsbr[ch][i], 0, 64 * sizeof(qmf_t)); + } +} + +static uint8_t sbr_process_channel(sbr_info *sbr, real_t *channel_buf, qmf_t X[MAX_NTSR][64], + uint8_t ch, uint8_t dont_process, + const uint8_t downSampledSBR) +{ + int16_t k, l; + uint8_t ret = 0; + +#ifdef SBR_LOW_POWER + ALIGN real_t deg[64]; +#endif + +#ifdef DRM + if (sbr->Is_DRM_SBR) + { + sbr->bsco = max((int32_t)sbr->maxAACLine*32/(int32_t)sbr->frame_len - (int32_t)sbr->kx, 0); + } else { +#endif + sbr->bsco = 0; +#ifdef DRM + } +#endif + + +//#define PRE_QMF_PRINT +#ifdef PRE_QMF_PRINT + { + int i; + for (i = 0; i < 1024; i++) + { + printf("%d\n", channel_buf[i]); + } + } +#endif + + + /* subband analysis */ + if (dont_process) + sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, 32); + else + sbr_qmf_analysis_32(sbr, sbr->qmfa[ch], channel_buf, sbr->Xsbr[ch], sbr->tHFGen, sbr->kx); + + if (!dont_process) + { +#if 1 + /* insert high frequencies here */ + /* hf generation using patching */ + hf_generation(sbr, sbr->Xsbr[ch], sbr->Xsbr[ch] +#ifdef SBR_LOW_POWER + ,deg +#endif + ,ch); +#endif + +#if 0 //def SBR_LOW_POWER + for (l = sbr->t_E[ch][0]; l < sbr->t_E[ch][sbr->L_E[ch]]; l++) + { + for (k = 0; k < sbr->kx; k++) + { + QMF_RE(sbr->Xsbr[ch][sbr->tHFAdj + l][k]) = 0; + } + } +#endif + +#if 1 + /* hf adjustment */ + ret = hf_adjustment(sbr, sbr->Xsbr[ch] +#ifdef SBR_LOW_POWER + ,deg +#endif + ,ch); +#endif + if (ret > 0) + { + dont_process = 1; + } + } + + if ((sbr->just_seeked != 0) || dont_process) + { + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + for (k = 0; k < 32; k++) + { + QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); +#ifndef SBR_LOW_POWER + QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); +#endif + } + for (k = 32; k < 64; k++) + { + QMF_RE(X[l][k]) = 0; +#ifndef SBR_LOW_POWER + QMF_IM(X[l][k]) = 0; +#endif + } + } + } else { + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + uint8_t kx_band, M_band, bsco_band; + + if (l < sbr->t_E[ch][0]) + { + kx_band = sbr->kx_prev; + M_band = sbr->M_prev; + bsco_band = sbr->bsco_prev; + } else { + kx_band = sbr->kx; + M_band = sbr->M; + bsco_band = sbr->bsco; + } + +#ifndef SBR_LOW_POWER + for (k = 0; k < kx_band + bsco_band; k++) + { + QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); + QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); + } + for (k = kx_band + bsco_band; k < kx_band + M_band; k++) + { + QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); + QMF_IM(X[l][k]) = QMF_IM(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); + } + for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++) + { + QMF_RE(X[l][k]) = 0; + QMF_IM(X[l][k]) = 0; + } +#else + for (k = 0; k < kx_band + bsco_band; k++) + { + QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); + } + for (k = kx_band + bsco_band; k < min(kx_band + M_band, 63); k++) + { + QMF_RE(X[l][k]) = QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][k]); + } + for (k = max(kx_band + bsco_band, kx_band + M_band); k < 64; k++) + { + QMF_RE(X[l][k]) = 0; + } + QMF_RE(X[l][kx_band - 1 + bsco_band]) += + QMF_RE(sbr->Xsbr[ch][l + sbr->tHFAdj][kx_band - 1 + bsco_band]); +#endif + } + } + + return ret; +} + +uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, + const uint8_t just_seeked, const uint8_t downSampledSBR) +{ + uint8_t dont_process = 0; + uint8_t ret = 0; + ALIGN qmf_t X[MAX_NTSR][64]; + + if (sbr == NULL) + return 20; + + /* case can occur due to bit errors */ + if (sbr->id_aac != ID_CPE) + return 21; + + if (sbr->ret || (sbr->header_count == 0)) + { + /* don't process just upsample */ + dont_process = 1; + + /* Re-activate reset for next frame */ + if (sbr->ret && sbr->Reset) + sbr->bs_start_freq_prev = -1; + } + + if (just_seeked) + { + sbr->just_seeked = 1; + } else { + sbr->just_seeked = 0; + } + + sbr->ret += sbr_process_channel(sbr, left_chan, X, 0, dont_process, downSampledSBR); + /* subband synthesis */ + if (downSampledSBR) + { + sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, left_chan); + } else { + sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, left_chan); + } + + sbr->ret += sbr_process_channel(sbr, right_chan, X, 1, dont_process, downSampledSBR); + /* subband synthesis */ + if (downSampledSBR) + { + sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X, right_chan); + } else { + sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X, right_chan); + } + + if (sbr->bs_header_flag) + sbr->just_seeked = 0; + + if (sbr->header_count != 0 && sbr->ret == 0) + { + ret = sbr_save_prev_data(sbr, 0); + if (ret) return ret; + ret = sbr_save_prev_data(sbr, 1); + if (ret) return ret; + } + + sbr_save_matrix(sbr, 0); + sbr_save_matrix(sbr, 1); + + sbr->frame++; + +//#define POST_QMF_PRINT +#ifdef POST_QMF_PRINT + { + int i; + for (i = 0; i < 2048; i++) + { + printf("%d\n", left_chan[i]); + } + for (i = 0; i < 2048; i++) + { + printf("%d\n", right_chan[i]); + } + } +#endif + + return 0; +} + +uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, + const uint8_t just_seeked, const uint8_t downSampledSBR) +{ + uint8_t dont_process = 0; + uint8_t ret = 0; + ALIGN qmf_t X[MAX_NTSR][64]; + + if (sbr == NULL) + return 20; + + /* case can occur due to bit errors */ + if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) + return 21; + + if (sbr->ret || (sbr->header_count == 0)) + { + /* don't process just upsample */ + dont_process = 1; + + /* Re-activate reset for next frame */ + if (sbr->ret && sbr->Reset) + sbr->bs_start_freq_prev = -1; + } + + if (just_seeked) + { + sbr->just_seeked = 1; + } else { + sbr->just_seeked = 0; + } + + sbr->ret += sbr_process_channel(sbr, channel, X, 0, dont_process, downSampledSBR); + /* subband synthesis */ + if (downSampledSBR) + { + sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X, channel); + } else { + sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X, channel); + } + + if (sbr->bs_header_flag) + sbr->just_seeked = 0; + + if (sbr->header_count != 0 && sbr->ret == 0) + { + ret = sbr_save_prev_data(sbr, 0); + if (ret) return ret; + } + + sbr_save_matrix(sbr, 0); + + sbr->frame++; + +//#define POST_QMF_PRINT +#ifdef POST_QMF_PRINT + { + int i; + for (i = 0; i < 2048; i++) + { + printf("%d\n", channel[i]); + } + } +#endif + + return 0; +} + +#if (defined(PS_DEC) || defined(DRM_PS)) +uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, + const uint8_t just_seeked, const uint8_t downSampledSBR) +{ + uint8_t l, k; + uint8_t dont_process = 0; + uint8_t ret = 0; + ALIGN qmf_t X_left[38][64] = {{0}}; + ALIGN qmf_t X_right[38][64] = {{0}}; /* must set this to 0 */ + + if (sbr == NULL) + return 20; + + /* case can occur due to bit errors */ + if (sbr->id_aac != ID_SCE && sbr->id_aac != ID_LFE) + return 21; + + if (sbr->ret || (sbr->header_count == 0)) + { + /* don't process just upsample */ + dont_process = 1; + + /* Re-activate reset for next frame */ + if (sbr->ret && sbr->Reset) + sbr->bs_start_freq_prev = -1; + } + + if (just_seeked) + { + sbr->just_seeked = 1; + } else { + sbr->just_seeked = 0; + } + + if (sbr->qmfs[1] == NULL) + { + sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); + } + + sbr->ret += sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR); + + /* copy some extra data for PS */ + for (l = sbr->numTimeSlotsRate; l < sbr->numTimeSlotsRate + 6; l++) + { + for (k = 0; k < 5; k++) + { + QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]); + QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]); + } + } + + /* perform parametric stereo */ +#ifdef DRM_PS + if (sbr->Is_DRM_SBR) + { + drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), X_left, X_right); + } else { +#endif +#ifdef PS_DEC + ps_decode(sbr->ps, X_left, X_right); +#endif +#ifdef DRM_PS + } +#endif + + /* subband synthesis */ + if (downSampledSBR) + { + sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel); + sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel); + } else { + sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel); + sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel); + } + + if (sbr->bs_header_flag) + sbr->just_seeked = 0; + + if (sbr->header_count != 0 && sbr->ret == 0) + { + ret = sbr_save_prev_data(sbr, 0); + if (ret) return ret; + } + + sbr_save_matrix(sbr, 0); + + sbr->frame++; + + return 0; +} +#endif + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_dec.h b/src/contrib/aacdecoder/libfaad/sbr_dec.h old mode 100644 new mode 100755 index e6c2982c1..40c1d5388 --- a/src/contrib/aacdecoder/libfaad/sbr_dec.h +++ b/src/contrib/aacdecoder/libfaad/sbr_dec.h @@ -1,239 +1,254 @@ -/* -** 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: sbr_dec.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_DEC_H__ -#define __SBR_DEC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef PS_DEC -#include "ps_dec.h" -#endif -#ifdef DRM_PS -#include "drm_dec.h" -#endif - -/* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */ -#define MAX_NTSRHFG 40 -#define MAX_NTSR 32 /* max number_time_slots * rate, ok for DRM and not DRM mode */ - - -typedef struct { - real_t *x; - uint8_t channels; -} qmfa_info; - -typedef struct { - real_t *v[2]; - uint8_t v_index; - uint8_t channels; -#ifdef USE_SSE - void (*qmf_func)(void *a, void *b, void *c, void *d); -#endif -} qmfs_info; - -typedef struct -{ - uint32_t sample_rate; - - uint8_t rate; - uint8_t just_seeked; - uint8_t ret; - - uint8_t amp_res[2]; - - uint8_t k0; - uint8_t kx; - uint8_t M; - uint8_t N_master; - uint8_t N_high; - uint8_t N_low; - uint8_t N_Q; - uint8_t N_L[4]; - uint8_t n[2]; - - uint8_t f_master[64]; - uint8_t f_table_res[2][64]; - uint8_t f_table_noise[64]; - uint8_t f_table_lim[4][64]; -#ifdef SBR_LOW_POWER - uint8_t f_group[5][64]; - uint8_t N_G[5]; -#endif - - uint8_t table_map_k_to_g[64]; - - uint8_t abs_bord_lead[2]; - uint8_t abs_bord_trail[2]; - uint8_t n_rel_lead[2]; - uint8_t n_rel_trail[2]; - - uint8_t L_E[2]; - uint8_t L_E_prev[2]; - uint8_t L_Q[2]; - - uint8_t t_E[2][6]; - uint8_t t_Q[2][3]; - uint8_t f[2][6]; - uint8_t f_prev[2]; - - real_t *G_temp_prev[2][5]; - real_t *Q_temp_prev[2][5]; - - int16_t E[2][64][5]; - int16_t E_prev[2][64]; - real_t E_orig[2][64][5]; - real_t E_curr[2][64][5]; - int32_t Q[2][64][2]; - int32_t Q_prev[2][64]; - real_t Q_orig[2][64][2]; - - int8_t l_A[2]; - int8_t l_A_prev[2]; - - uint8_t bs_invf_mode[2][5]; - uint8_t bs_invf_mode_prev[2][5]; - real_t bwArray[2][64]; - real_t bwArray_prev[2][64]; - - uint8_t noPatches; - uint8_t patchNoSubbands[64]; - uint8_t patchStartSubband[64]; - - uint8_t bs_add_harmonic[2][64]; - uint8_t bs_add_harmonic_prev[2][64]; - - uint16_t index_noise_prev[2]; - uint8_t psi_is_prev[2]; - - uint8_t bs_start_freq_prev; - uint8_t bs_stop_freq_prev; - uint8_t bs_xover_band_prev; - uint8_t bs_freq_scale_prev; - uint8_t bs_alter_scale_prev; - uint8_t bs_noise_bands_prev; - - int8_t prevEnvIsShort[2]; - - int8_t kx_prev; - - uint8_t Reset; - uint32_t frame; - uint32_t header_count; - - uint8_t id_aac; - qmfa_info *qmfa[2]; - qmfs_info *qmfs[2]; - - qmf_t Xsbr[2][MAX_NTSRHFG][64]; - qmf_t Xcodec[2][MAX_NTSRHFG][32]; - -#ifdef DRM - int8_t lcstereo_flag; - uint8_t bs_dataextra; - uint8_t Is_DRM_SBR; -#ifdef DRM_PS - drm_ps_info drm_ps; -#endif -#endif - - uint8_t numTimeSlotsRate; - uint8_t numTimeSlots; - uint8_t tHFGen; - uint8_t tHFAdj; - -#ifdef PS_DEC - ps_info ps; -#endif -#if (defined(PS_DEC) || defined(DRM_PS)) - uint8_t ps_used; -#endif - - /* to get it compiling */ - /* we'll see during the coding of all the tools, whether - these are all used or not. - */ - uint8_t bs_header_flag; - uint8_t bs_crc_flag; - uint16_t bs_sbr_crc_bits; - uint8_t bs_protocol_version; - uint8_t bs_amp_res; - uint8_t bs_start_freq; - uint8_t bs_stop_freq; - uint8_t bs_xover_band; - uint8_t bs_freq_scale; - uint8_t bs_alter_scale; - uint8_t bs_noise_bands; - uint8_t bs_limiter_bands; - uint8_t bs_limiter_gains; - uint8_t bs_interpol_freq; - uint8_t bs_smoothing_mode; - uint8_t bs_samplerate_mode; - uint8_t bs_add_harmonic_flag[2]; - uint8_t bs_add_harmonic_flag_prev[2]; - uint8_t bs_extended_data; - uint8_t bs_extension_id; - uint8_t bs_extension_data; - uint8_t bs_coupling; - uint8_t bs_frame_class[2]; - uint8_t bs_rel_bord[2][9]; - uint8_t bs_rel_bord_0[2][9]; - uint8_t bs_rel_bord_1[2][9]; - uint8_t bs_pointer[2]; - uint8_t bs_abs_bord_0[2]; - uint8_t bs_abs_bord_1[2]; - uint8_t bs_num_rel_0[2]; - uint8_t bs_num_rel_1[2]; - uint8_t bs_df_env[2][9]; - uint8_t bs_df_noise[2][3]; -} sbr_info; - -sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, - uint32_t sample_rate -#ifdef DRM - , uint8_t IsDRM -#endif - ); -void sbrDecodeEnd(sbr_info *sbr); - -uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, - const uint8_t just_seeked, const uint8_t upsample_only); -uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, - const uint8_t just_seeked, const uint8_t upsample_only); -#if (defined(PS_DEC) || defined(DRM_PS)) -uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, - const uint8_t just_seeked, const uint8_t upsample_only); -#endif - - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_dec.h,v 1.39 2007/11/01 12:33:34 menno Exp $ +**/ + +#ifndef __SBR_DEC_H__ +#define __SBR_DEC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef PS_DEC +#include "ps_dec.h" +#endif +#ifdef DRM_PS +#include "drm_dec.h" +#endif + +/* MAX_NTSRHFG: maximum of number_time_slots * rate + HFGen. 16*2+8 */ +#define MAX_NTSRHFG 40 +#define MAX_NTSR 32 /* max number_time_slots * rate, ok for DRM and not DRM mode */ + +/* MAX_M: maximum value for M */ +#define MAX_M 49 +/* MAX_L_E: maximum value for L_E */ +#define MAX_L_E 5 + +typedef struct { + real_t *x; + int16_t x_index; + uint8_t channels; +} qmfa_info; + +typedef struct { + real_t *v; + int16_t v_index; + uint8_t channels; +} qmfs_info; + +typedef struct +{ + uint32_t sample_rate; + uint32_t maxAACLine; + + uint8_t rate; + uint8_t just_seeked; + uint8_t ret; + + uint8_t amp_res[2]; + + uint8_t k0; + uint8_t kx; + uint8_t M; + uint8_t N_master; + uint8_t N_high; + uint8_t N_low; + uint8_t N_Q; + uint8_t N_L[4]; + uint8_t n[2]; + + uint8_t f_master[64]; + uint8_t f_table_res[2][64]; + uint8_t f_table_noise[64]; + uint8_t f_table_lim[4][64]; +#ifdef SBR_LOW_POWER + uint8_t f_group[5][64]; + uint8_t N_G[5]; +#endif + + uint8_t table_map_k_to_g[64]; + + uint8_t abs_bord_lead[2]; + uint8_t abs_bord_trail[2]; + uint8_t n_rel_lead[2]; + uint8_t n_rel_trail[2]; + + uint8_t L_E[2]; + uint8_t L_E_prev[2]; + uint8_t L_Q[2]; + + uint8_t t_E[2][MAX_L_E+1]; + uint8_t t_Q[2][3]; + uint8_t f[2][MAX_L_E+1]; + uint8_t f_prev[2]; + + real_t *G_temp_prev[2][5]; + real_t *Q_temp_prev[2][5]; + int8_t GQ_ringbuf_index[2]; + + int16_t E[2][64][MAX_L_E]; + int16_t E_prev[2][64]; +#ifndef FIXED_POINT + real_t E_orig[2][64][MAX_L_E]; +#endif + real_t E_curr[2][64][MAX_L_E]; + int32_t Q[2][64][2]; +#ifndef FIXED_POINT + real_t Q_div[2][64][2]; + real_t Q_div2[2][64][2]; +#endif + int32_t Q_prev[2][64]; + + int8_t l_A[2]; + int8_t l_A_prev[2]; + + uint8_t bs_invf_mode[2][MAX_L_E]; + uint8_t bs_invf_mode_prev[2][MAX_L_E]; + real_t bwArray[2][64]; + real_t bwArray_prev[2][64]; + + uint8_t noPatches; + uint8_t patchNoSubbands[64]; + uint8_t patchStartSubband[64]; + + uint8_t bs_add_harmonic[2][64]; + uint8_t bs_add_harmonic_prev[2][64]; + + uint16_t index_noise_prev[2]; + uint8_t psi_is_prev[2]; + + uint8_t bs_start_freq_prev; + uint8_t bs_stop_freq_prev; + uint8_t bs_xover_band_prev; + uint8_t bs_freq_scale_prev; + uint8_t bs_alter_scale_prev; + uint8_t bs_noise_bands_prev; + + int8_t prevEnvIsShort[2]; + + int8_t kx_prev; + uint8_t bsco; + uint8_t bsco_prev; + uint8_t M_prev; + uint16_t frame_len; + + uint8_t Reset; + uint32_t frame; + uint32_t header_count; + + uint8_t id_aac; + qmfa_info *qmfa[2]; + qmfs_info *qmfs[2]; + + qmf_t Xsbr[2][MAX_NTSRHFG][64]; + +#ifdef DRM + uint8_t Is_DRM_SBR; +#ifdef DRM_PS + drm_ps_info *drm_ps; +#endif +#endif + + uint8_t numTimeSlotsRate; + uint8_t numTimeSlots; + uint8_t tHFGen; + uint8_t tHFAdj; + +#ifdef PS_DEC + ps_info *ps; +#endif +#if (defined(PS_DEC) || defined(DRM_PS)) + uint8_t ps_used; + uint8_t psResetFlag; +#endif + + /* to get it compiling */ + /* we'll see during the coding of all the tools, whether + these are all used or not. + */ + uint8_t bs_header_flag; + uint8_t bs_crc_flag; + uint16_t bs_sbr_crc_bits; + uint8_t bs_protocol_version; + uint8_t bs_amp_res; + uint8_t bs_start_freq; + uint8_t bs_stop_freq; + uint8_t bs_xover_band; + uint8_t bs_freq_scale; + uint8_t bs_alter_scale; + uint8_t bs_noise_bands; + uint8_t bs_limiter_bands; + uint8_t bs_limiter_gains; + uint8_t bs_interpol_freq; + uint8_t bs_smoothing_mode; + uint8_t bs_samplerate_mode; + uint8_t bs_add_harmonic_flag[2]; + uint8_t bs_add_harmonic_flag_prev[2]; + uint8_t bs_extended_data; + uint8_t bs_extension_id; + uint8_t bs_extension_data; + uint8_t bs_coupling; + uint8_t bs_frame_class[2]; + uint8_t bs_rel_bord[2][9]; + uint8_t bs_rel_bord_0[2][9]; + uint8_t bs_rel_bord_1[2][9]; + uint8_t bs_pointer[2]; + uint8_t bs_abs_bord_0[2]; + uint8_t bs_abs_bord_1[2]; + uint8_t bs_num_rel_0[2]; + uint8_t bs_num_rel_1[2]; + uint8_t bs_df_env[2][9]; + uint8_t bs_df_noise[2][3]; +} sbr_info; + +sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, + uint32_t sample_rate, uint8_t downSampledSBR +#ifdef DRM + , uint8_t IsDRM +#endif + ); +void sbrDecodeEnd(sbr_info *sbr); +void sbrReset(sbr_info *sbr); + +uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, + const uint8_t just_seeked, const uint8_t downSampledSBR); +uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, + const uint8_t just_seeked, const uint8_t downSampledSBR); +#if (defined(PS_DEC) || defined(DRM_PS)) +uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, + const uint8_t just_seeked, const uint8_t downSampledSBR); +#endif + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_e_nf.c b/src/contrib/aacdecoder/libfaad/sbr_e_nf.c old mode 100644 new mode 100755 index 275293f3f..2181dffeb --- a/src/contrib/aacdecoder/libfaad/sbr_e_nf.c +++ b/src/contrib/aacdecoder/libfaad/sbr_e_nf.c @@ -1,350 +1,510 @@ -/* -** 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: sbr_e_nf.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include - -#include "sbr_syntax.h" -#include "sbr_e_nf.h" - -ALIGN static const real_t pow2deq[] = { - REAL_CONST(2.9103830456733704E-011), REAL_CONST(5.8207660913467407E-011), - REAL_CONST(1.1641532182693481E-010), REAL_CONST(2.3283064365386963E-010), - REAL_CONST(4.6566128730773926E-010), REAL_CONST(9.3132257461547852E-010), - REAL_CONST(1.862645149230957E-009), REAL_CONST(3.7252902984619141E-009), - REAL_CONST(7.4505805969238281E-009), REAL_CONST(1.4901161193847656E-008), - REAL_CONST(2.9802322387695313E-008), REAL_CONST(5.9604644775390625E-008), - REAL_CONST(1.1920928955078125E-007), REAL_CONST(2.384185791015625E-007), - REAL_CONST(4.76837158203125E-007), REAL_CONST(9.5367431640625E-007), - REAL_CONST(1.9073486328125E-006), REAL_CONST(3.814697265625E-006), - REAL_CONST(7.62939453125E-006), REAL_CONST(1.52587890625E-005), - REAL_CONST(3.0517578125E-005), REAL_CONST(6.103515625E-005), - REAL_CONST(0.0001220703125), REAL_CONST(0.000244140625), - REAL_CONST(0.00048828125), REAL_CONST(0.0009765625), - REAL_CONST(0.001953125), REAL_CONST(0.00390625), - REAL_CONST(0.0078125), REAL_CONST(0.015625), - REAL_CONST(0.03125), REAL_CONST(0.0625), - REAL_CONST(0.125), REAL_CONST(0.25), - REAL_CONST(0.5), REAL_CONST(1.0), - REAL_CONST(2.0), REAL_CONST(4.0), - REAL_CONST(8.0), REAL_CONST(16.0), - REAL_CONST(32.0), REAL_CONST(64.0), - REAL_CONST(128.0), REAL_CONST(256.0), - REAL_CONST(512.0), REAL_CONST(1024.0), - REAL_CONST(2048.0), REAL_CONST(4096.0), - REAL_CONST(8192.0), REAL_CONST(16384.0), - REAL_CONST(32768.0), REAL_CONST(65536.0), - REAL_CONST(131072.0), REAL_CONST(262144.0), - REAL_CONST(524288.0), REAL_CONST(1048576.0), - REAL_CONST(2097152.0), REAL_CONST(4194304.0), - REAL_CONST(8388608.0), REAL_CONST(16777216.0), - REAL_CONST(33554432.0), REAL_CONST(67108864.0), - REAL_CONST(134217728.0), REAL_CONST(268435456.0), - REAL_CONST(536870912.0), REAL_CONST(1073741824.0), - REAL_CONST(2147483648.0), REAL_CONST(4294967296.0), - REAL_CONST(8589934592.0), REAL_CONST(17179869184.0), - REAL_CONST(34359738368.0), REAL_CONST(68719476736.0), - REAL_CONST(137438953472.0), REAL_CONST(274877906944.0), - REAL_CONST(549755813888.0), REAL_CONST(1099511627776.0), - REAL_CONST(2199023255552.0), REAL_CONST(4398046511104.0), - REAL_CONST(8796093022208.0), REAL_CONST(17592186044416.0), - REAL_CONST(35184372088832.0), REAL_CONST(70368744177664.0), - REAL_CONST(140737488355328.0), REAL_CONST(281474976710656.0), - REAL_CONST(562949953421312.0), REAL_CONST(1125899906842624.0), - REAL_CONST(2251799813685248.0), REAL_CONST(4503599627370496.0), - REAL_CONST(9007199254740992.0), REAL_CONST(18014398509481984.0), - REAL_CONST(36028797018963968.0), REAL_CONST(72057594037927936.0), - REAL_CONST(144115188075855870.0), REAL_CONST(288230376151711740.0), - REAL_CONST(576460752303423490.0), REAL_CONST(1152921504606847000.0), - REAL_CONST(2305843009213694000.0), REAL_CONST(4611686018427387900.0), - REAL_CONST(9223372036854775800.0), REAL_CONST(1.8446744073709552E+019), - REAL_CONST(3.6893488147419103E+019), REAL_CONST(7.3786976294838206E+019), - REAL_CONST(1.4757395258967641E+020), REAL_CONST(2.9514790517935283E+020), - REAL_CONST(5.9029581035870565E+020), REAL_CONST(1.1805916207174113E+021), - REAL_CONST(2.3611832414348226E+021), REAL_CONST(4.7223664828696452E+021), - REAL_CONST(9.4447329657392904E+021), REAL_CONST(1.8889465931478581E+022), - REAL_CONST(3.7778931862957162E+022), REAL_CONST(7.5557863725914323E+022), - REAL_CONST(1.5111572745182865E+023), REAL_CONST(3.0223145490365729E+023), - REAL_CONST(6.0446290980731459E+023), REAL_CONST(1.2089258196146292E+024), - REAL_CONST(2.4178516392292583E+024), REAL_CONST(4.8357032784585167E+024), - REAL_CONST(9.6714065569170334E+024), REAL_CONST(1.9342813113834067E+025), - REAL_CONST(3.8685626227668134E+025), REAL_CONST(7.7371252455336267E+025), - REAL_CONST(1.5474250491067253E+026), REAL_CONST(3.0948500982134507E+026), - REAL_CONST(6.1897001964269014E+026), REAL_CONST(1.2379400392853803E+027), - REAL_CONST(2.4758800785707605E+027) -}; - -/* 1.0 / (1.0 + pow(2.0, x - 12) */ -ALIGN static const real_t pow2deq_rcp[] = { - FRAC_CONST(0.99975591896509641), - FRAC_CONST(0.99951195705222062), - FRAC_CONST(0.99902439024390244), - FRAC_CONST(0.99805068226120852), - FRAC_CONST(0.99610894941634243), - FRAC_CONST(0.99224806201550386), - FRAC_CONST(0.98461538461538467), - FRAC_CONST(0.96969696969696972), - FRAC_CONST(0.94117647058823528), - FRAC_CONST(0.88888888888888884), - FRAC_CONST(0.80000000000000004), - FRAC_CONST(0.66666666666666663), - FRAC_CONST(0.5), - FRAC_CONST(0.33333333333333331), - FRAC_CONST(0.20000000000000001), - FRAC_CONST(0.1111111111111111), - FRAC_CONST(0.058823529411764705), - FRAC_CONST(0.030303030303030304), - FRAC_CONST(0.015384615384615385), - FRAC_CONST(0.0077519379844961239), - FRAC_CONST(0.0038910505836575876), - FRAC_CONST(0.0019493177387914229), - FRAC_CONST(0.00097560975609756097), - FRAC_CONST(0.0004880429477794046), - FRAC_CONST(0.00024408103490358799), - FRAC_CONST(0.00012205541315757354), - FRAC_CONST(6.1031431187061336E-005), - FRAC_CONST(3.0516646830846227E-005), - FRAC_CONST(1.5258556235409006E-005), - FRAC_CONST(7.6293363240331724E-006), - FRAC_CONST(3.8146827137652828E-006), - FRAC_CONST(1.9073449948406318E-006), - FRAC_CONST(9.5367340691241559E-007) -}; - -void extract_envelope_data(sbr_info *sbr, uint8_t ch) -{ - uint8_t l, k; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - if (sbr->bs_df_env[ch][l] == 0) - { - for (k = 1; k < sbr->n[sbr->f[ch][l]]; k++) - { - sbr->E[ch][k][l] = sbr->E[ch][k - 1][l] + sbr->E[ch][k][l]; - } - - } else { /* bs_df_env == 1 */ - - uint8_t g = (l == 0) ? sbr->f_prev[ch] : sbr->f[ch][l-1]; - int16_t E_prev; - - if (sbr->f[ch][l] == g) - { - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - if (l == 0) - E_prev = sbr->E_prev[ch][k]; - else - E_prev = sbr->E[ch][k][l - 1]; - - sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; - } - - } else if ((g == 1) && (sbr->f[ch][l] == 0)) { - uint8_t i; - - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - for (i = 0; i < sbr->N_high; i++) - { - if (sbr->f_table_res[HI_RES][i] == sbr->f_table_res[LO_RES][k]) - { - if (l == 0) - E_prev = sbr->E_prev[ch][i]; - else - E_prev = sbr->E[ch][i][l - 1]; - - sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; - } - } - } - - } else if ((g == 0) && (sbr->f[ch][l] == 1)) { - uint8_t i; - - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - for (i = 0; i < sbr->N_low; i++) - { - if ((sbr->f_table_res[LO_RES][i] <= sbr->f_table_res[HI_RES][k]) && - (sbr->f_table_res[HI_RES][k] < sbr->f_table_res[LO_RES][i + 1])) - { - if (l == 0) - E_prev = sbr->E_prev[ch][i]; - else - E_prev = sbr->E[ch][i][l - 1]; - - sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; - } - } - } - } - } - } -} - -void extract_noise_floor_data(sbr_info *sbr, uint8_t ch) -{ - uint8_t l, k; - - for (l = 0; l < sbr->L_Q[ch]; l++) - { - if (sbr->bs_df_noise[ch][l] == 0) - { - for (k = 1; k < sbr->N_Q; k++) - { - sbr->Q[ch][k][l] = sbr->Q[ch][k][l] + sbr->Q[ch][k-1][l]; - } - } else { - if (l == 0) - { - for (k = 0; k < sbr->N_Q; k++) - { - sbr->Q[ch][k][l] = sbr->Q_prev[ch][k] + sbr->Q[ch][k][0]; - } - } else { - for (k = 0; k < sbr->N_Q; k++) - { - sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l]; - } - } - } - } -} - -void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) -{ - if (sbr->bs_coupling == 0) - { - int16_t exp; - uint8_t l, k; - uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) - { - /* +6 for the *64 and -10 for the /32 in the synthesis QMF - * since this is a energy value: (x/32)^2 = (x^2)/1024 - */ - exp = (sbr->E[ch][k][l] >> amp) + 6; - - if ((exp < -P2_TABLE_OFFSET) || (exp > P2_TABLE_MAX)) - { - sbr->E_orig[ch][k][l] = 0; - } else { - /* FIXED POINT TODO: E_orig: INTEGER!! */ - sbr->E_orig[ch][k][l] = pow2deq[exp + P2_TABLE_OFFSET]; - - /* save half the table size at the cost of 1 multiply */ - if (amp && (sbr->E[ch][k][l] & 1)) - { - sbr->E_orig[ch][k][l] = MUL_R(sbr->E_orig[ch][k][l], REAL_CONST(1.414213562)); - } - } - } - } - - for (l = 0; l < sbr->L_Q[ch]; l++) - { - for (k = 0; k < sbr->N_Q; k++) - { - if (sbr->Q[ch][k][l] < 0 || sbr->Q[ch][k][l] > 30) - { - sbr->Q_orig[ch][k][l] = 0; - } else { - exp = NOISE_FLOOR_OFFSET - sbr->Q[ch][k][l]; - sbr->Q_orig[ch][k][l] = pow2deq[exp + P2_TABLE_OFFSET]; - } - } - } - } -} - -void unmap_envelope_noise(sbr_info *sbr) -{ - real_t tmp; - int16_t exp0, exp1; - uint8_t l, k; - uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; - uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; - - for (l = 0; l < sbr->L_E[0]; l++) - { - for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) - { - /* +6: * 64 ; +1: * 2 ; -10: /1024 QMF */ - exp0 = (sbr->E[0][k][l] >> amp0) + 7; - - /* UN_MAP removed: (x / 4096) same as (x >> 12) */ - /* E[1] is always even so no need for compensating the divide by 2 with - * an extra multiplication - */ - exp1 = (sbr->E[1][k][l] >> amp1) - 12; - - if ((exp0 < -P2_TABLE_OFFSET) || (exp0 > P2_TABLE_MAX) || - (exp1 < -P2_TABLE_RCP_OFFSET) || (exp1 > P2_TABLE_RCP_MAX)) - { - sbr->E_orig[1][k][l] = 0; - sbr->E_orig[0][k][l] = 0; - } else { - tmp = pow2deq[exp0 + P2_TABLE_OFFSET]; - if (amp0 && (sbr->E[0][k][l] & 1)) - tmp = MUL_R(tmp, REAL_CONST(1.414213562)); - - /* FIXED POINT TODO: E_orig: INTEGER!! */ - sbr->E_orig[1][k][l] = MUL_F(tmp, pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]); - sbr->E_orig[0][k][l] = MUL_R(sbr->E_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]); - } - } - } - for (l = 0; l < sbr->L_Q[0]; l++) - { - for (k = 0; k < sbr->N_Q; k++) - { - if ((sbr->Q[0][k][l] < 0 || sbr->Q[0][k][l] > 30) || - (sbr->Q[1][k][l] < 0 || sbr->Q[1][k][l] > 24 /* 2*panOffset(1) */)) - { - sbr->Q_orig[0][k][l] = 0; - sbr->Q_orig[1][k][l] = 0; - } else { - exp0 = NOISE_FLOOR_OFFSET - sbr->Q[0][k][l] + 1; - exp1 = sbr->Q[1][k][l] - 12; - - sbr->Q_orig[1][k][l] = MUL_F(pow2deq[exp0 + P2_TABLE_OFFSET], pow2deq_rcp[exp1 + P2_TABLE_RCP_OFFSET]); - sbr->Q_orig[0][k][l] = MUL_R(sbr->Q_orig[1][k][l], pow2deq[exp1 + P2_TABLE_OFFSET]); - } - } - } -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_e_nf.c,v 1.22 2008/03/23 23:03:29 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include + +#include "sbr_syntax.h" +#include "sbr_e_nf.h" + +void extract_envelope_data(sbr_info *sbr, uint8_t ch) +{ + uint8_t l, k; + + for (l = 0; l < sbr->L_E[ch]; l++) + { + if (sbr->bs_df_env[ch][l] == 0) + { + for (k = 1; k < sbr->n[sbr->f[ch][l]]; k++) + { + sbr->E[ch][k][l] = sbr->E[ch][k - 1][l] + sbr->E[ch][k][l]; + if (sbr->E[ch][k][l] < 0) + sbr->E[ch][k][l] = 0; + } + + } else { /* bs_df_env == 1 */ + + uint8_t g = (l == 0) ? sbr->f_prev[ch] : sbr->f[ch][l-1]; + int16_t E_prev; + + if (sbr->f[ch][l] == g) + { + for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) + { + if (l == 0) + E_prev = sbr->E_prev[ch][k]; + else + E_prev = sbr->E[ch][k][l - 1]; + + sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; + } + + } else if ((g == 1) && (sbr->f[ch][l] == 0)) { + uint8_t i; + + for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) + { + for (i = 0; i < sbr->N_high; i++) + { + if (sbr->f_table_res[HI_RES][i] == sbr->f_table_res[LO_RES][k]) + { + if (l == 0) + E_prev = sbr->E_prev[ch][i]; + else + E_prev = sbr->E[ch][i][l - 1]; + + sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; + } + } + } + + } else if ((g == 0) && (sbr->f[ch][l] == 1)) { + uint8_t i; + + for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) + { + for (i = 0; i < sbr->N_low; i++) + { + if ((sbr->f_table_res[LO_RES][i] <= sbr->f_table_res[HI_RES][k]) && + (sbr->f_table_res[HI_RES][k] < sbr->f_table_res[LO_RES][i + 1])) + { + if (l == 0) + E_prev = sbr->E_prev[ch][i]; + else + E_prev = sbr->E[ch][i][l - 1]; + + sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; + } + } + } + } + } + } +} + +void extract_noise_floor_data(sbr_info *sbr, uint8_t ch) +{ + uint8_t l, k; + + for (l = 0; l < sbr->L_Q[ch]; l++) + { + if (sbr->bs_df_noise[ch][l] == 0) + { + for (k = 1; k < sbr->N_Q; k++) + { + sbr->Q[ch][k][l] = sbr->Q[ch][k][l] + sbr->Q[ch][k-1][l]; + } + } else { + if (l == 0) + { + for (k = 0; k < sbr->N_Q; k++) + { + sbr->Q[ch][k][l] = sbr->Q_prev[ch][k] + sbr->Q[ch][k][0]; + } + } else { + for (k = 0; k < sbr->N_Q; k++) + { + sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l]; + } + } + } + } +} + +#ifndef FIXED_POINT + +/* table for Q_div values when no coupling */ +static const real_t Q_div_tab[31] = { + FRAC_CONST(0.0153846), FRAC_CONST(0.030303), + FRAC_CONST(0.0588235), FRAC_CONST(0.111111), + FRAC_CONST(0.2), FRAC_CONST(0.333333), + FRAC_CONST(0.5), FRAC_CONST(0.666667), + FRAC_CONST(0.8), FRAC_CONST(0.888889), + FRAC_CONST(0.941176), FRAC_CONST(0.969697), + FRAC_CONST(0.984615), FRAC_CONST(0.992248), + FRAC_CONST(0.996109), FRAC_CONST(0.998051), + FRAC_CONST(0.999024), FRAC_CONST(0.999512), + FRAC_CONST(0.999756), FRAC_CONST(0.999878), + FRAC_CONST(0.999939), FRAC_CONST(0.999969), + FRAC_CONST(0.999985), FRAC_CONST(0.999992), + FRAC_CONST(0.999996), FRAC_CONST(0.999998), + FRAC_CONST(0.999999), FRAC_CONST(1), + FRAC_CONST(1), FRAC_CONST(1), + FRAC_CONST(1) +}; + +static const real_t Q_div_tab_left[31][13] = { + { FRAC_CONST(0.969704), FRAC_CONST(0.888985), FRAC_CONST(0.667532), FRAC_CONST(0.336788), FRAC_CONST(0.117241), FRAC_CONST(0.037594), FRAC_CONST(0.0153846), FRAC_CONST(0.00967118), FRAC_CONST(0.00823245), FRAC_CONST(0.00787211), FRAC_CONST(0.00778198), FRAC_CONST(0.00775945), FRAC_CONST(0.00775382) }, + { FRAC_CONST(0.984619), FRAC_CONST(0.94123), FRAC_CONST(0.800623), FRAC_CONST(0.503876), FRAC_CONST(0.209877), FRAC_CONST(0.0724638), FRAC_CONST(0.030303), FRAC_CONST(0.0191571), FRAC_CONST(0.0163305), FRAC_CONST(0.0156212), FRAC_CONST(0.0154438), FRAC_CONST(0.0153994), FRAC_CONST(0.0153883) }, + { FRAC_CONST(0.99225), FRAC_CONST(0.969726), FRAC_CONST(0.889273), FRAC_CONST(0.670103), FRAC_CONST(0.346939), FRAC_CONST(0.135135), FRAC_CONST(0.0588235), FRAC_CONST(0.037594), FRAC_CONST(0.0321361), FRAC_CONST(0.0307619), FRAC_CONST(0.0304178), FRAC_CONST(0.0303317), FRAC_CONST(0.0303102) }, + { FRAC_CONST(0.99611), FRAC_CONST(0.98463), FRAC_CONST(0.941392), FRAC_CONST(0.802469), FRAC_CONST(0.515152), FRAC_CONST(0.238095), FRAC_CONST(0.111111), FRAC_CONST(0.0724638), FRAC_CONST(0.0622711), FRAC_CONST(0.0596878), FRAC_CONST(0.0590397), FRAC_CONST(0.0588776), FRAC_CONST(0.058837) }, + { FRAC_CONST(0.998051), FRAC_CONST(0.992256), FRAC_CONST(0.969811), FRAC_CONST(0.890411), FRAC_CONST(0.68), FRAC_CONST(0.384615), FRAC_CONST(0.2), FRAC_CONST(0.135135), FRAC_CONST(0.117241), FRAC_CONST(0.112652), FRAC_CONST(0.111497), FRAC_CONST(0.111208), FRAC_CONST(0.111135) }, + { FRAC_CONST(0.999025), FRAC_CONST(0.996113), FRAC_CONST(0.984674), FRAC_CONST(0.942029), FRAC_CONST(0.809524), FRAC_CONST(0.555556), FRAC_CONST(0.333333), FRAC_CONST(0.238095), FRAC_CONST(0.209877), FRAC_CONST(0.202492), FRAC_CONST(0.200625), FRAC_CONST(0.200156), FRAC_CONST(0.200039) }, + { FRAC_CONST(0.999512), FRAC_CONST(0.998053), FRAC_CONST(0.992278), FRAC_CONST(0.970149), FRAC_CONST(0.894737), FRAC_CONST(0.714286), FRAC_CONST(0.5), FRAC_CONST(0.384615), FRAC_CONST(0.346939), FRAC_CONST(0.336788), FRAC_CONST(0.3342), FRAC_CONST(0.33355), FRAC_CONST(0.333388) }, + { FRAC_CONST(0.999756), FRAC_CONST(0.999025), FRAC_CONST(0.996124), FRAC_CONST(0.984848), FRAC_CONST(0.944444), FRAC_CONST(0.833333), FRAC_CONST(0.666667), FRAC_CONST(0.555556), FRAC_CONST(0.515152), FRAC_CONST(0.503876), FRAC_CONST(0.500975), FRAC_CONST(0.500244), FRAC_CONST(0.500061) }, + { FRAC_CONST(0.999878), FRAC_CONST(0.999512), FRAC_CONST(0.998058), FRAC_CONST(0.992366), FRAC_CONST(0.971429), FRAC_CONST(0.909091), FRAC_CONST(0.8), FRAC_CONST(0.714286), FRAC_CONST(0.68), FRAC_CONST(0.670103), FRAC_CONST(0.667532), FRAC_CONST(0.666884), FRAC_CONST(0.666721) }, + { FRAC_CONST(0.999939), FRAC_CONST(0.999756), FRAC_CONST(0.999028), FRAC_CONST(0.996169), FRAC_CONST(0.985507), FRAC_CONST(0.952381), FRAC_CONST(0.888889), FRAC_CONST(0.833333), FRAC_CONST(0.809524), FRAC_CONST(0.802469), FRAC_CONST(0.800623), FRAC_CONST(0.800156), FRAC_CONST(0.800039) }, + { FRAC_CONST(0.999969), FRAC_CONST(0.999878), FRAC_CONST(0.999514), FRAC_CONST(0.998081), FRAC_CONST(0.992701), FRAC_CONST(0.97561), FRAC_CONST(0.941176), FRAC_CONST(0.909091), FRAC_CONST(0.894737), FRAC_CONST(0.890411), FRAC_CONST(0.889273), FRAC_CONST(0.888985), FRAC_CONST(0.888913) }, + { FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.999757), FRAC_CONST(0.999039), FRAC_CONST(0.996337), FRAC_CONST(0.987654), FRAC_CONST(0.969697), FRAC_CONST(0.952381), FRAC_CONST(0.944444), FRAC_CONST(0.942029), FRAC_CONST(0.941392), FRAC_CONST(0.94123), FRAC_CONST(0.94119) }, + { FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999878), FRAC_CONST(0.999519), FRAC_CONST(0.998165), FRAC_CONST(0.993789), FRAC_CONST(0.984615), FRAC_CONST(0.97561), FRAC_CONST(0.971429), FRAC_CONST(0.970149), FRAC_CONST(0.969811), FRAC_CONST(0.969726), FRAC_CONST(0.969704) }, + { FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.99976), FRAC_CONST(0.999082), FRAC_CONST(0.996885), FRAC_CONST(0.992248), FRAC_CONST(0.987654), FRAC_CONST(0.985507), FRAC_CONST(0.984848), FRAC_CONST(0.984674), FRAC_CONST(0.98463), FRAC_CONST(0.984619) }, + { FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.99988), FRAC_CONST(0.999541), FRAC_CONST(0.99844), FRAC_CONST(0.996109), FRAC_CONST(0.993789), FRAC_CONST(0.992701), FRAC_CONST(0.992366), FRAC_CONST(0.992278), FRAC_CONST(0.992256), FRAC_CONST(0.99225) }, + { FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.99994), FRAC_CONST(0.99977), FRAC_CONST(0.999219), FRAC_CONST(0.998051), FRAC_CONST(0.996885), FRAC_CONST(0.996337), FRAC_CONST(0.996169), FRAC_CONST(0.996124), FRAC_CONST(0.996113), FRAC_CONST(0.99611) }, + { FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999885), FRAC_CONST(0.99961), FRAC_CONST(0.999024), FRAC_CONST(0.99844), FRAC_CONST(0.998165), FRAC_CONST(0.998081), FRAC_CONST(0.998058), FRAC_CONST(0.998053), FRAC_CONST(0.998051) }, + { FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999943), FRAC_CONST(0.999805), FRAC_CONST(0.999512), FRAC_CONST(0.999219), FRAC_CONST(0.999082), FRAC_CONST(0.999039), FRAC_CONST(0.999028), FRAC_CONST(0.999025), FRAC_CONST(0.999025) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.999971), FRAC_CONST(0.999902), FRAC_CONST(0.999756), FRAC_CONST(0.99961), FRAC_CONST(0.999541), FRAC_CONST(0.999519), FRAC_CONST(0.999514), FRAC_CONST(0.999512), FRAC_CONST(0.999512) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999986), FRAC_CONST(0.999951), FRAC_CONST(0.999878), FRAC_CONST(0.999805), FRAC_CONST(0.99977), FRAC_CONST(0.99976), FRAC_CONST(0.999757), FRAC_CONST(0.999756), FRAC_CONST(0.999756) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999993), FRAC_CONST(0.999976), FRAC_CONST(0.999939), FRAC_CONST(0.999902), FRAC_CONST(0.999885), FRAC_CONST(0.99988), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999988), FRAC_CONST(0.999969), FRAC_CONST(0.999951), FRAC_CONST(0.999943), FRAC_CONST(0.99994), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999994), FRAC_CONST(0.999985), FRAC_CONST(0.999976), FRAC_CONST(0.999971), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999969) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999997), FRAC_CONST(0.999992), FRAC_CONST(0.999988), FRAC_CONST(0.999986), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999996), FRAC_CONST(0.999994), FRAC_CONST(0.999993), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999997), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } +}; + +static const real_t Q_div_tab_right[31][13] = { + { FRAC_CONST(0.00775382), FRAC_CONST(0.00775945), FRAC_CONST(0.00778198), FRAC_CONST(0.00787211), FRAC_CONST(0.00823245), FRAC_CONST(0.00967118), FRAC_CONST(0.0153846), FRAC_CONST(0.037594), FRAC_CONST(0.117241), FRAC_CONST(0.336788), FRAC_CONST(0.667532), FRAC_CONST(0.888985), FRAC_CONST(0.969704) }, + { FRAC_CONST(0.0153883), FRAC_CONST(0.0153994), FRAC_CONST(0.0154438), FRAC_CONST(0.0156212), FRAC_CONST(0.0163305), FRAC_CONST(0.0191571), FRAC_CONST(0.030303), FRAC_CONST(0.0724638), FRAC_CONST(0.209877), FRAC_CONST(0.503876), FRAC_CONST(0.800623), FRAC_CONST(0.94123), FRAC_CONST(0.984619) }, + { FRAC_CONST(0.0303102), FRAC_CONST(0.0303317), FRAC_CONST(0.0304178), FRAC_CONST(0.0307619), FRAC_CONST(0.0321361), FRAC_CONST(0.037594), FRAC_CONST(0.0588235), FRAC_CONST(0.135135), FRAC_CONST(0.346939), FRAC_CONST(0.670103), FRAC_CONST(0.889273), FRAC_CONST(0.969726), FRAC_CONST(0.99225) }, + { FRAC_CONST(0.058837), FRAC_CONST(0.0588776), FRAC_CONST(0.0590397), FRAC_CONST(0.0596878), FRAC_CONST(0.0622711), FRAC_CONST(0.0724638), FRAC_CONST(0.111111), FRAC_CONST(0.238095), FRAC_CONST(0.515152), FRAC_CONST(0.802469), FRAC_CONST(0.941392), FRAC_CONST(0.98463), FRAC_CONST(0.99611) }, + { FRAC_CONST(0.111135), FRAC_CONST(0.111208), FRAC_CONST(0.111497), FRAC_CONST(0.112652), FRAC_CONST(0.117241), FRAC_CONST(0.135135), FRAC_CONST(0.2), FRAC_CONST(0.384615), FRAC_CONST(0.68), FRAC_CONST(0.890411), FRAC_CONST(0.969811), FRAC_CONST(0.992256), FRAC_CONST(0.998051) }, + { FRAC_CONST(0.200039), FRAC_CONST(0.200156), FRAC_CONST(0.200625), FRAC_CONST(0.202492), FRAC_CONST(0.209877), FRAC_CONST(0.238095), FRAC_CONST(0.333333), FRAC_CONST(0.555556), FRAC_CONST(0.809524), FRAC_CONST(0.942029), FRAC_CONST(0.984674), FRAC_CONST(0.996113), FRAC_CONST(0.999025) }, + { FRAC_CONST(0.333388), FRAC_CONST(0.33355), FRAC_CONST(0.3342), FRAC_CONST(0.336788), FRAC_CONST(0.346939), FRAC_CONST(0.384615), FRAC_CONST(0.5), FRAC_CONST(0.714286), FRAC_CONST(0.894737), FRAC_CONST(0.970149), FRAC_CONST(0.992278), FRAC_CONST(0.998053), FRAC_CONST(0.999512) }, + { FRAC_CONST(0.500061), FRAC_CONST(0.500244), FRAC_CONST(0.500975), FRAC_CONST(0.503876), FRAC_CONST(0.515152), FRAC_CONST(0.555556), FRAC_CONST(0.666667), FRAC_CONST(0.833333), FRAC_CONST(0.944444), FRAC_CONST(0.984848), FRAC_CONST(0.996124), FRAC_CONST(0.999025), FRAC_CONST(0.999756) }, + { FRAC_CONST(0.666721), FRAC_CONST(0.666884), FRAC_CONST(0.667532), FRAC_CONST(0.670103), FRAC_CONST(0.68), FRAC_CONST(0.714286), FRAC_CONST(0.8), FRAC_CONST(0.909091), FRAC_CONST(0.971429), FRAC_CONST(0.992366), FRAC_CONST(0.998058), FRAC_CONST(0.999512), FRAC_CONST(0.999878) }, + { FRAC_CONST(0.800039), FRAC_CONST(0.800156), FRAC_CONST(0.800623), FRAC_CONST(0.802469), FRAC_CONST(0.809524), FRAC_CONST(0.833333), FRAC_CONST(0.888889), FRAC_CONST(0.952381), FRAC_CONST(0.985507), FRAC_CONST(0.996169), FRAC_CONST(0.999028), FRAC_CONST(0.999756), FRAC_CONST(0.999939) }, + { FRAC_CONST(0.888913), FRAC_CONST(0.888985), FRAC_CONST(0.889273), FRAC_CONST(0.890411), FRAC_CONST(0.894737), FRAC_CONST(0.909091), FRAC_CONST(0.941176), FRAC_CONST(0.97561), FRAC_CONST(0.992701), FRAC_CONST(0.998081), FRAC_CONST(0.999514), FRAC_CONST(0.999878), FRAC_CONST(0.999969) }, + { FRAC_CONST(0.94119), FRAC_CONST(0.94123), FRAC_CONST(0.941392), FRAC_CONST(0.942029), FRAC_CONST(0.944444), FRAC_CONST(0.952381), FRAC_CONST(0.969697), FRAC_CONST(0.987654), FRAC_CONST(0.996337), FRAC_CONST(0.999039), FRAC_CONST(0.999757), FRAC_CONST(0.999939), FRAC_CONST(0.999985) }, + { FRAC_CONST(0.969704), FRAC_CONST(0.969726), FRAC_CONST(0.969811), FRAC_CONST(0.970149), FRAC_CONST(0.971429), FRAC_CONST(0.97561), FRAC_CONST(0.984615), FRAC_CONST(0.993789), FRAC_CONST(0.998165), FRAC_CONST(0.999519), FRAC_CONST(0.999878), FRAC_CONST(0.99997), FRAC_CONST(0.999992) }, + { FRAC_CONST(0.984619), FRAC_CONST(0.98463), FRAC_CONST(0.984674), FRAC_CONST(0.984848), FRAC_CONST(0.985507), FRAC_CONST(0.987654), FRAC_CONST(0.992248), FRAC_CONST(0.996885), FRAC_CONST(0.999082), FRAC_CONST(0.99976), FRAC_CONST(0.999939), FRAC_CONST(0.999985), FRAC_CONST(0.999996) }, + { FRAC_CONST(0.99225), FRAC_CONST(0.992256), FRAC_CONST(0.992278), FRAC_CONST(0.992366), FRAC_CONST(0.992701), FRAC_CONST(0.993789), FRAC_CONST(0.996109), FRAC_CONST(0.99844), FRAC_CONST(0.999541), FRAC_CONST(0.99988), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998) }, + { FRAC_CONST(0.99611), FRAC_CONST(0.996113), FRAC_CONST(0.996124), FRAC_CONST(0.996169), FRAC_CONST(0.996337), FRAC_CONST(0.996885), FRAC_CONST(0.998051), FRAC_CONST(0.999219), FRAC_CONST(0.99977), FRAC_CONST(0.99994), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999) }, + { FRAC_CONST(0.998051), FRAC_CONST(0.998053), FRAC_CONST(0.998058), FRAC_CONST(0.998081), FRAC_CONST(0.998165), FRAC_CONST(0.99844), FRAC_CONST(0.999024), FRAC_CONST(0.99961), FRAC_CONST(0.999885), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1) }, + { FRAC_CONST(0.999025), FRAC_CONST(0.999025), FRAC_CONST(0.999028), FRAC_CONST(0.999039), FRAC_CONST(0.999082), FRAC_CONST(0.999219), FRAC_CONST(0.999512), FRAC_CONST(0.999805), FRAC_CONST(0.999943), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1) }, + { FRAC_CONST(0.999512), FRAC_CONST(0.999512), FRAC_CONST(0.999514), FRAC_CONST(0.999519), FRAC_CONST(0.999541), FRAC_CONST(0.99961), FRAC_CONST(0.999756), FRAC_CONST(0.999902), FRAC_CONST(0.999971), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999756), FRAC_CONST(0.999756), FRAC_CONST(0.999757), FRAC_CONST(0.99976), FRAC_CONST(0.99977), FRAC_CONST(0.999805), FRAC_CONST(0.999878), FRAC_CONST(0.999951), FRAC_CONST(0.999986), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.99988), FRAC_CONST(0.999885), FRAC_CONST(0.999902), FRAC_CONST(0.999939), FRAC_CONST(0.999976), FRAC_CONST(0.999993), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.99994), FRAC_CONST(0.999943), FRAC_CONST(0.999951), FRAC_CONST(0.999969), FRAC_CONST(0.999988), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999969), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999971), FRAC_CONST(0.999976), FRAC_CONST(0.999985), FRAC_CONST(0.999994), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999986), FRAC_CONST(0.999988), FRAC_CONST(0.999992), FRAC_CONST(0.999997), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999993), FRAC_CONST(0.999994), FRAC_CONST(0.999996), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999997), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, + { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } +}; + +/* calculates 1/(1+Q) */ +/* [0..1] */ +static real_t calc_Q_div(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) +{ + if (sbr->bs_coupling) + { + /* left channel */ + if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || + (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) + { + return 0; + } else { + /* the pan parameter is always even */ + if (ch == 0) + { + return Q_div_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; + } else { + return Q_div_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; + } + } + } else { + /* no coupling */ + if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) + { + return 0; + } else { + return Q_div_tab[sbr->Q[ch][m][l]]; + } + } +} + +/* table for Q_div2 values when no coupling */ +static const real_t Q_div2_tab[31] = { + FRAC_CONST(0.984615), FRAC_CONST(0.969697), + FRAC_CONST(0.941176), FRAC_CONST(0.888889), + FRAC_CONST(0.8), FRAC_CONST(0.666667), + FRAC_CONST(0.5), FRAC_CONST(0.333333), + FRAC_CONST(0.2), FRAC_CONST(0.111111), + FRAC_CONST(0.0588235), FRAC_CONST(0.030303), + FRAC_CONST(0.0153846), FRAC_CONST(0.00775194), + FRAC_CONST(0.00389105), FRAC_CONST(0.00194932), + FRAC_CONST(0.00097561), FRAC_CONST(0.000488043), + FRAC_CONST(0.000244081), FRAC_CONST(0.000122055), + FRAC_CONST(6.10314E-005), FRAC_CONST(3.05166E-005), + FRAC_CONST(1.52586E-005), FRAC_CONST(7.62934E-006), + FRAC_CONST(3.81468E-006), FRAC_CONST(1.90734E-006), + FRAC_CONST(9.53673E-007), FRAC_CONST(4.76837E-007), + FRAC_CONST(2.38419E-007), FRAC_CONST(1.19209E-007), + FRAC_CONST(5.96046E-008) +}; + +static const real_t Q_div2_tab_left[31][13] = { + { FRAC_CONST(0.0302959), FRAC_CONST(0.111015), FRAC_CONST(0.332468), FRAC_CONST(0.663212), FRAC_CONST(0.882759), FRAC_CONST(0.962406), FRAC_CONST(0.984615), FRAC_CONST(0.990329), FRAC_CONST(0.991768), FRAC_CONST(0.992128), FRAC_CONST(0.992218), FRAC_CONST(0.992241), FRAC_CONST(0.992246) }, + { FRAC_CONST(0.0153809), FRAC_CONST(0.0587695), FRAC_CONST(0.199377), FRAC_CONST(0.496124), FRAC_CONST(0.790123), FRAC_CONST(0.927536), FRAC_CONST(0.969697), FRAC_CONST(0.980843), FRAC_CONST(0.98367), FRAC_CONST(0.984379), FRAC_CONST(0.984556), FRAC_CONST(0.984601), FRAC_CONST(0.984612) }, + { FRAC_CONST(0.00775006), FRAC_CONST(0.0302744), FRAC_CONST(0.110727), FRAC_CONST(0.329897), FRAC_CONST(0.653061), FRAC_CONST(0.864865), FRAC_CONST(0.941176), FRAC_CONST(0.962406), FRAC_CONST(0.967864), FRAC_CONST(0.969238), FRAC_CONST(0.969582), FRAC_CONST(0.969668), FRAC_CONST(0.96969) }, + { FRAC_CONST(0.0038901), FRAC_CONST(0.0153698), FRAC_CONST(0.0586081), FRAC_CONST(0.197531), FRAC_CONST(0.484848), FRAC_CONST(0.761905), FRAC_CONST(0.888889), FRAC_CONST(0.927536), FRAC_CONST(0.937729), FRAC_CONST(0.940312), FRAC_CONST(0.94096), FRAC_CONST(0.941122), FRAC_CONST(0.941163) }, + { FRAC_CONST(0.00194884), FRAC_CONST(0.00774443), FRAC_CONST(0.0301887), FRAC_CONST(0.109589), FRAC_CONST(0.32), FRAC_CONST(0.615385), FRAC_CONST(0.8), FRAC_CONST(0.864865), FRAC_CONST(0.882759), FRAC_CONST(0.887348), FRAC_CONST(0.888503), FRAC_CONST(0.888792), FRAC_CONST(0.888865) }, + { FRAC_CONST(0.000975372), FRAC_CONST(0.00388727), FRAC_CONST(0.0153257), FRAC_CONST(0.057971), FRAC_CONST(0.190476), FRAC_CONST(0.444444), FRAC_CONST(0.666667), FRAC_CONST(0.761905), FRAC_CONST(0.790123), FRAC_CONST(0.797508), FRAC_CONST(0.799375), FRAC_CONST(0.799844), FRAC_CONST(0.799961) }, + { FRAC_CONST(0.000487924), FRAC_CONST(0.00194742), FRAC_CONST(0.00772201), FRAC_CONST(0.0298507), FRAC_CONST(0.105263), FRAC_CONST(0.285714), FRAC_CONST(0.5), FRAC_CONST(0.615385), FRAC_CONST(0.653061), FRAC_CONST(0.663212), FRAC_CONST(0.6658), FRAC_CONST(0.66645), FRAC_CONST(0.666612) }, + { FRAC_CONST(0.000244021), FRAC_CONST(0.000974659), FRAC_CONST(0.00387597), FRAC_CONST(0.0151515), FRAC_CONST(0.0555556), FRAC_CONST(0.166667), FRAC_CONST(0.333333), FRAC_CONST(0.444444), FRAC_CONST(0.484848), FRAC_CONST(0.496124), FRAC_CONST(0.499025), FRAC_CONST(0.499756), FRAC_CONST(0.499939) }, + { FRAC_CONST(0.000122026), FRAC_CONST(0.000487567), FRAC_CONST(0.00194175), FRAC_CONST(0.00763359), FRAC_CONST(0.0285714), FRAC_CONST(0.0909091), FRAC_CONST(0.2), FRAC_CONST(0.285714), FRAC_CONST(0.32), FRAC_CONST(0.329897), FRAC_CONST(0.332468), FRAC_CONST(0.333116), FRAC_CONST(0.333279) }, + { FRAC_CONST(6.10165E-005), FRAC_CONST(0.000243843), FRAC_CONST(0.000971817), FRAC_CONST(0.00383142), FRAC_CONST(0.0144928), FRAC_CONST(0.047619), FRAC_CONST(0.111111), FRAC_CONST(0.166667), FRAC_CONST(0.190476), FRAC_CONST(0.197531), FRAC_CONST(0.199377), FRAC_CONST(0.199844), FRAC_CONST(0.199961) }, + { FRAC_CONST(3.05092E-005), FRAC_CONST(0.000121936), FRAC_CONST(0.000486145), FRAC_CONST(0.00191939), FRAC_CONST(0.00729927), FRAC_CONST(0.0243902), FRAC_CONST(0.0588235), FRAC_CONST(0.0909091), FRAC_CONST(0.105263), FRAC_CONST(0.109589), FRAC_CONST(0.110727), FRAC_CONST(0.111015), FRAC_CONST(0.111087) }, + { FRAC_CONST(1.52548E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(0.000243132), FRAC_CONST(0.000960615), FRAC_CONST(0.003663), FRAC_CONST(0.0123457), FRAC_CONST(0.030303), FRAC_CONST(0.047619), FRAC_CONST(0.0555556), FRAC_CONST(0.057971), FRAC_CONST(0.0586081), FRAC_CONST(0.0587695), FRAC_CONST(0.05881) }, + { FRAC_CONST(7.62747E-006), FRAC_CONST(3.04869E-005), FRAC_CONST(0.000121581), FRAC_CONST(0.000480538), FRAC_CONST(0.00183486), FRAC_CONST(0.00621118), FRAC_CONST(0.0153846), FRAC_CONST(0.0243902), FRAC_CONST(0.0285714), FRAC_CONST(0.0298507), FRAC_CONST(0.0301887), FRAC_CONST(0.0302744), FRAC_CONST(0.0302959) }, + { FRAC_CONST(3.81375E-006), FRAC_CONST(1.52437E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(0.000240327), FRAC_CONST(0.000918274), FRAC_CONST(0.00311526), FRAC_CONST(0.00775194), FRAC_CONST(0.0123457), FRAC_CONST(0.0144928), FRAC_CONST(0.0151515), FRAC_CONST(0.0153257), FRAC_CONST(0.0153698), FRAC_CONST(0.0153809) }, + { FRAC_CONST(1.90688E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(3.03979E-005), FRAC_CONST(0.000120178), FRAC_CONST(0.000459348), FRAC_CONST(0.00156006), FRAC_CONST(0.00389105), FRAC_CONST(0.00621118), FRAC_CONST(0.00729927), FRAC_CONST(0.00763359), FRAC_CONST(0.00772201), FRAC_CONST(0.00774443), FRAC_CONST(0.00775006) }, + { FRAC_CONST(9.53441E-007), FRAC_CONST(3.81096E-006), FRAC_CONST(1.51992E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(0.000229727), FRAC_CONST(0.00078064), FRAC_CONST(0.00194932), FRAC_CONST(0.00311526), FRAC_CONST(0.003663), FRAC_CONST(0.00383142), FRAC_CONST(0.00387597), FRAC_CONST(0.00388727), FRAC_CONST(0.0038901) }, + { FRAC_CONST(4.76721E-007), FRAC_CONST(1.90548E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(3.00472E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000390472), FRAC_CONST(0.00097561), FRAC_CONST(0.00156006), FRAC_CONST(0.00183486), FRAC_CONST(0.00191939), FRAC_CONST(0.00194175), FRAC_CONST(0.00194742), FRAC_CONST(0.00194884) }, + { FRAC_CONST(2.3836E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(3.79984E-006), FRAC_CONST(1.50238E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(0.000195274), FRAC_CONST(0.000488043), FRAC_CONST(0.00078064), FRAC_CONST(0.000918274), FRAC_CONST(0.000960615), FRAC_CONST(0.000971817), FRAC_CONST(0.000974659), FRAC_CONST(0.000975372) }, + { FRAC_CONST(1.1918E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(1.89992E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(2.87216E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000244081), FRAC_CONST(0.000390472), FRAC_CONST(0.000459348), FRAC_CONST(0.000480538), FRAC_CONST(0.000486145), FRAC_CONST(0.000487567), FRAC_CONST(0.000487924) }, + { FRAC_CONST(5.95901E-008), FRAC_CONST(2.38186E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(3.756E-006), FRAC_CONST(1.4361E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(0.000122055), FRAC_CONST(0.000195274), FRAC_CONST(0.000229727), FRAC_CONST(0.000240327), FRAC_CONST(0.000243132), FRAC_CONST(0.000243843), FRAC_CONST(0.000244021) }, + { FRAC_CONST(2.9795E-008), FRAC_CONST(1.19093E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(1.878E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(2.44135E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000120178), FRAC_CONST(0.000121581), FRAC_CONST(0.000121936), FRAC_CONST(0.000122026) }, + { FRAC_CONST(1.48975E-008), FRAC_CONST(5.95465E-008), FRAC_CONST(2.37491E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(3.59029E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.10165E-005) }, + { FRAC_CONST(7.44876E-009), FRAC_CONST(2.97732E-008), FRAC_CONST(1.18745E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(1.79515E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(1.52586E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.05092E-005) }, + { FRAC_CONST(3.72438E-009), FRAC_CONST(1.48866E-008), FRAC_CONST(5.93727E-008), FRAC_CONST(2.34751E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(3.05175E-006), FRAC_CONST(7.62934E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.52548E-005) }, + { FRAC_CONST(1.86219E-009), FRAC_CONST(7.44331E-009), FRAC_CONST(2.96864E-008), FRAC_CONST(1.17375E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.62747E-006) }, + { FRAC_CONST(9.31095E-010), FRAC_CONST(3.72166E-009), FRAC_CONST(1.48432E-008), FRAC_CONST(5.86876E-008), FRAC_CONST(2.24394E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(1.90734E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.81375E-006) }, + { FRAC_CONST(4.65548E-010), FRAC_CONST(1.86083E-009), FRAC_CONST(7.42159E-009), FRAC_CONST(2.93438E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(9.53673E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.90688E-006) }, + { FRAC_CONST(2.32774E-010), FRAC_CONST(9.30414E-010), FRAC_CONST(3.71079E-009), FRAC_CONST(1.46719E-008), FRAC_CONST(5.60985E-008), FRAC_CONST(1.90735E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.53441E-007) }, + { FRAC_CONST(1.16387E-010), FRAC_CONST(4.65207E-010), FRAC_CONST(1.8554E-009), FRAC_CONST(7.33596E-009), FRAC_CONST(2.80492E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(2.38419E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.76721E-007) }, + { FRAC_CONST(5.81935E-011), FRAC_CONST(2.32603E-010), FRAC_CONST(9.27699E-010), FRAC_CONST(3.66798E-009), FRAC_CONST(1.40246E-008), FRAC_CONST(4.76837E-008), FRAC_CONST(1.19209E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.3836E-007) }, + { FRAC_CONST(2.90967E-011), FRAC_CONST(1.16302E-010), FRAC_CONST(4.63849E-010), FRAC_CONST(1.83399E-009), FRAC_CONST(7.01231E-009), FRAC_CONST(2.38419E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.1918E-007) } +}; + +static const real_t Q_div2_tab_right[31][13] = { + { FRAC_CONST(0.992246), FRAC_CONST(0.992241), FRAC_CONST(0.992218), FRAC_CONST(0.992128), FRAC_CONST(0.991768), FRAC_CONST(0.990329), FRAC_CONST(0.984615), FRAC_CONST(0.962406), FRAC_CONST(0.882759), FRAC_CONST(0.663212), FRAC_CONST(0.332468), FRAC_CONST(0.111015), FRAC_CONST(0.0302959) }, + { FRAC_CONST(0.984612), FRAC_CONST(0.984601), FRAC_CONST(0.984556), FRAC_CONST(0.984379), FRAC_CONST(0.98367), FRAC_CONST(0.980843), FRAC_CONST(0.969697), FRAC_CONST(0.927536), FRAC_CONST(0.790123), FRAC_CONST(0.496124), FRAC_CONST(0.199377), FRAC_CONST(0.0587695), FRAC_CONST(0.0153809) }, + { FRAC_CONST(0.96969), FRAC_CONST(0.969668), FRAC_CONST(0.969582), FRAC_CONST(0.969238), FRAC_CONST(0.967864), FRAC_CONST(0.962406), FRAC_CONST(0.941176), FRAC_CONST(0.864865), FRAC_CONST(0.653061), FRAC_CONST(0.329897), FRAC_CONST(0.110727), FRAC_CONST(0.0302744), FRAC_CONST(0.00775006) }, + { FRAC_CONST(0.941163), FRAC_CONST(0.941122), FRAC_CONST(0.94096), FRAC_CONST(0.940312), FRAC_CONST(0.937729), FRAC_CONST(0.927536), FRAC_CONST(0.888889), FRAC_CONST(0.761905), FRAC_CONST(0.484848), FRAC_CONST(0.197531), FRAC_CONST(0.0586081), FRAC_CONST(0.0153698), FRAC_CONST(0.0038901) }, + { FRAC_CONST(0.888865), FRAC_CONST(0.888792), FRAC_CONST(0.888503), FRAC_CONST(0.887348), FRAC_CONST(0.882759), FRAC_CONST(0.864865), FRAC_CONST(0.8), FRAC_CONST(0.615385), FRAC_CONST(0.32), FRAC_CONST(0.109589), FRAC_CONST(0.0301887), FRAC_CONST(0.00774443), FRAC_CONST(0.00194884) }, + { FRAC_CONST(0.799961), FRAC_CONST(0.799844), FRAC_CONST(0.799375), FRAC_CONST(0.797508), FRAC_CONST(0.790123), FRAC_CONST(0.761905), FRAC_CONST(0.666667), FRAC_CONST(0.444444), FRAC_CONST(0.190476), FRAC_CONST(0.057971), FRAC_CONST(0.0153257), FRAC_CONST(0.00388727), FRAC_CONST(0.000975372) }, + { FRAC_CONST(0.666612), FRAC_CONST(0.66645), FRAC_CONST(0.6658), FRAC_CONST(0.663212), FRAC_CONST(0.653061), FRAC_CONST(0.615385), FRAC_CONST(0.5), FRAC_CONST(0.285714), FRAC_CONST(0.105263), FRAC_CONST(0.0298507), FRAC_CONST(0.00772201), FRAC_CONST(0.00194742), FRAC_CONST(0.000487924) }, + { FRAC_CONST(0.499939), FRAC_CONST(0.499756), FRAC_CONST(0.499025), FRAC_CONST(0.496124), FRAC_CONST(0.484848), FRAC_CONST(0.444444), FRAC_CONST(0.333333), FRAC_CONST(0.166667), FRAC_CONST(0.0555556), FRAC_CONST(0.0151515), FRAC_CONST(0.00387597), FRAC_CONST(0.000974659), FRAC_CONST(0.000244021) }, + { FRAC_CONST(0.333279), FRAC_CONST(0.333116), FRAC_CONST(0.332468), FRAC_CONST(0.329897), FRAC_CONST(0.32), FRAC_CONST(0.285714), FRAC_CONST(0.2), FRAC_CONST(0.0909091), FRAC_CONST(0.0285714), FRAC_CONST(0.00763359), FRAC_CONST(0.00194175), FRAC_CONST(0.000487567), FRAC_CONST(0.000122026) }, + { FRAC_CONST(0.199961), FRAC_CONST(0.199844), FRAC_CONST(0.199377), FRAC_CONST(0.197531), FRAC_CONST(0.190476), FRAC_CONST(0.166667), FRAC_CONST(0.111111), FRAC_CONST(0.047619), FRAC_CONST(0.0144928), FRAC_CONST(0.00383142), FRAC_CONST(0.000971817), FRAC_CONST(0.000243843), FRAC_CONST(6.10165E-005) }, + { FRAC_CONST(0.111087), FRAC_CONST(0.111015), FRAC_CONST(0.110727), FRAC_CONST(0.109589), FRAC_CONST(0.105263), FRAC_CONST(0.0909091), FRAC_CONST(0.0588235), FRAC_CONST(0.0243902), FRAC_CONST(0.00729927), FRAC_CONST(0.00191939), FRAC_CONST(0.000486145), FRAC_CONST(0.000121936), FRAC_CONST(3.05092E-005) }, + { FRAC_CONST(0.05881), FRAC_CONST(0.0587695), FRAC_CONST(0.0586081), FRAC_CONST(0.057971), FRAC_CONST(0.0555556), FRAC_CONST(0.047619), FRAC_CONST(0.030303), FRAC_CONST(0.0123457), FRAC_CONST(0.003663), FRAC_CONST(0.000960615), FRAC_CONST(0.000243132), FRAC_CONST(6.09719E-005), FRAC_CONST(1.52548E-005) }, + { FRAC_CONST(0.0302959), FRAC_CONST(0.0302744), FRAC_CONST(0.0301887), FRAC_CONST(0.0298507), FRAC_CONST(0.0285714), FRAC_CONST(0.0243902), FRAC_CONST(0.0153846), FRAC_CONST(0.00621118), FRAC_CONST(0.00183486), FRAC_CONST(0.000480538), FRAC_CONST(0.000121581), FRAC_CONST(3.04869E-005), FRAC_CONST(7.62747E-006) }, + { FRAC_CONST(0.0153809), FRAC_CONST(0.0153698), FRAC_CONST(0.0153257), FRAC_CONST(0.0151515), FRAC_CONST(0.0144928), FRAC_CONST(0.0123457), FRAC_CONST(0.00775194), FRAC_CONST(0.00311526), FRAC_CONST(0.000918274), FRAC_CONST(0.000240327), FRAC_CONST(6.0794E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(3.81375E-006) }, + { FRAC_CONST(0.00775006), FRAC_CONST(0.00774443), FRAC_CONST(0.00772201), FRAC_CONST(0.00763359), FRAC_CONST(0.00729927), FRAC_CONST(0.00621118), FRAC_CONST(0.00389105), FRAC_CONST(0.00156006), FRAC_CONST(0.000459348), FRAC_CONST(0.000120178), FRAC_CONST(3.03979E-005), FRAC_CONST(7.62189E-006), FRAC_CONST(1.90688E-006) }, + { FRAC_CONST(0.0038901), FRAC_CONST(0.00388727), FRAC_CONST(0.00387597), FRAC_CONST(0.00383142), FRAC_CONST(0.003663), FRAC_CONST(0.00311526), FRAC_CONST(0.00194932), FRAC_CONST(0.00078064), FRAC_CONST(0.000229727), FRAC_CONST(6.00925E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(3.81096E-006), FRAC_CONST(9.53441E-007) }, + { FRAC_CONST(0.00194884), FRAC_CONST(0.00194742), FRAC_CONST(0.00194175), FRAC_CONST(0.00191939), FRAC_CONST(0.00183486), FRAC_CONST(0.00156006), FRAC_CONST(0.00097561), FRAC_CONST(0.000390472), FRAC_CONST(0.000114877), FRAC_CONST(3.00472E-005), FRAC_CONST(7.59965E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(4.76721E-007) }, + { FRAC_CONST(0.000975372), FRAC_CONST(0.000974659), FRAC_CONST(0.000971817), FRAC_CONST(0.000960615), FRAC_CONST(0.000918274), FRAC_CONST(0.00078064), FRAC_CONST(0.000488043), FRAC_CONST(0.000195274), FRAC_CONST(5.74416E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(3.79984E-006), FRAC_CONST(9.52743E-007), FRAC_CONST(2.3836E-007) }, + { FRAC_CONST(0.000487924), FRAC_CONST(0.000487567), FRAC_CONST(0.000486145), FRAC_CONST(0.000480538), FRAC_CONST(0.000459348), FRAC_CONST(0.000390472), FRAC_CONST(0.000244081), FRAC_CONST(9.76467E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(7.51196E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(4.76372E-007), FRAC_CONST(1.1918E-007) }, + { FRAC_CONST(0.000244021), FRAC_CONST(0.000243843), FRAC_CONST(0.000243132), FRAC_CONST(0.000240327), FRAC_CONST(0.000229727), FRAC_CONST(0.000195274), FRAC_CONST(0.000122055), FRAC_CONST(4.88257E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(3.756E-006), FRAC_CONST(9.49963E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(5.95901E-008) }, + { FRAC_CONST(0.000122026), FRAC_CONST(0.000121936), FRAC_CONST(0.000121581), FRAC_CONST(0.000120178), FRAC_CONST(0.000114877), FRAC_CONST(9.76467E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(7.18056E-006), FRAC_CONST(1.878E-006), FRAC_CONST(4.74982E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(2.9795E-008) }, + { FRAC_CONST(6.10165E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(3.59029E-006), FRAC_CONST(9.39002E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(5.95465E-008), FRAC_CONST(1.48975E-008) }, + { FRAC_CONST(3.05092E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(1.52586E-005), FRAC_CONST(6.10348E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(4.69501E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(2.97732E-008), FRAC_CONST(7.44876E-009) }, + { FRAC_CONST(1.52548E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(7.62934E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(8.97575E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(5.93727E-008), FRAC_CONST(1.48866E-008), FRAC_CONST(3.72438E-009) }, + { FRAC_CONST(7.62747E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(4.48788E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(2.96864E-008), FRAC_CONST(7.44331E-009), FRAC_CONST(1.86219E-009) }, + { FRAC_CONST(3.81375E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(1.90734E-006), FRAC_CONST(7.62939E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(5.86876E-008), FRAC_CONST(1.48432E-008), FRAC_CONST(3.72166E-009), FRAC_CONST(9.31095E-010) }, + { FRAC_CONST(1.90688E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(9.53673E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(2.93438E-008), FRAC_CONST(7.42159E-009), FRAC_CONST(1.86083E-009), FRAC_CONST(4.65548E-010) }, + { FRAC_CONST(9.53441E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(5.60985E-008), FRAC_CONST(1.46719E-008), FRAC_CONST(3.71079E-009), FRAC_CONST(9.30414E-010), FRAC_CONST(2.32774E-010) }, + { FRAC_CONST(4.76721E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(2.38419E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(2.80492E-008), FRAC_CONST(7.33596E-009), FRAC_CONST(1.8554E-009), FRAC_CONST(4.65207E-010), FRAC_CONST(1.16387E-010) }, + { FRAC_CONST(2.3836E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(1.19209E-007), FRAC_CONST(4.76837E-008), FRAC_CONST(1.40246E-008), FRAC_CONST(3.66798E-009), FRAC_CONST(9.27699E-010), FRAC_CONST(2.32603E-010), FRAC_CONST(5.81935E-011) }, + { FRAC_CONST(1.1918E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(2.38419E-008), FRAC_CONST(7.01231E-009), FRAC_CONST(1.83399E-009), FRAC_CONST(4.63849E-010), FRAC_CONST(1.16302E-010), FRAC_CONST(2.90967E-011) } +}; + +/* calculates Q/(1+Q) */ +/* [0..1] */ +static real_t calc_Q_div2(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) +{ + if (sbr->bs_coupling) + { + if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || + (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) + { + return 0; + } else { + /* the pan parameter is always even */ + if (ch == 0) + { + return Q_div2_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; + } else { + return Q_div2_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; + } + } + } else { + /* no coupling */ + if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) + { + return 0; + } else { + return Q_div2_tab[sbr->Q[ch][m][l]]; + } + } +} + +static const real_t E_deq_tab[64] = { + 64.0f, 128.0f, 256.0f, 512.0f, 1024.0f, 2048.0f, 4096.0f, 8192.0f, + 16384.0f, 32768.0f, 65536.0f, 131072.0f, 262144.0f, 524288.0f, 1.04858E+006f, 2.09715E+006f, + 4.1943E+006f, 8.38861E+006f, 1.67772E+007f, 3.35544E+007f, 6.71089E+007f, 1.34218E+008f, 2.68435E+008f, 5.36871E+008f, + 1.07374E+009f, 2.14748E+009f, 4.29497E+009f, 8.58993E+009f, 1.71799E+010f, 3.43597E+010f, 6.87195E+010f, 1.37439E+011f, + 2.74878E+011f, 5.49756E+011f, 1.09951E+012f, 2.19902E+012f, 4.39805E+012f, 8.79609E+012f, 1.75922E+013f, 3.51844E+013f, + 7.03687E+013f, 1.40737E+014f, 2.81475E+014f, 5.6295E+014f, 1.1259E+015f, 2.2518E+015f, 4.5036E+015f, 9.0072E+015f, + 1.80144E+016f, 3.60288E+016f, 7.20576E+016f, 1.44115E+017f, 2.8823E+017f, 5.76461E+017f, 1.15292E+018f, 2.30584E+018f, + 4.61169E+018f, 9.22337E+018f, 1.84467E+019f, 3.68935E+019f, 7.3787E+019f, 1.47574E+020f, 2.95148E+020f, 5.90296E+020f +}; + +void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) +{ + if (sbr->bs_coupling == 0) + { + int16_t exp; + uint8_t l, k; + uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; + + for (l = 0; l < sbr->L_E[ch]; l++) + { + for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) + { + /* +6 for the *64 and -10 for the /32 in the synthesis QMF (fixed) + * since this is a energy value: (x/32)^2 = (x^2)/1024 + */ + /* exp = (sbr->E[ch][k][l] >> amp) + 6; */ + exp = (sbr->E[ch][k][l] >> amp); + + if ((exp < 0) || (exp >= 64)) + { + sbr->E_orig[ch][k][l] = 0; + } else { + sbr->E_orig[ch][k][l] = E_deq_tab[exp]; + + /* save half the table size at the cost of 1 multiply */ + if (amp && (sbr->E[ch][k][l] & 1)) + { + sbr->E_orig[ch][k][l] = MUL_C(sbr->E_orig[ch][k][l], COEF_CONST(1.414213562)); + } + } + } + } + + for (l = 0; l < sbr->L_Q[ch]; l++) + { + for (k = 0; k < sbr->N_Q; k++) + { + sbr->Q_div[ch][k][l] = calc_Q_div(sbr, ch, k, l); + sbr->Q_div2[ch][k][l] = calc_Q_div2(sbr, ch, k, l); + } + } + } +} + +static const real_t E_pan_tab[25] = { + FRAC_CONST(0.000244081), FRAC_CONST(0.000488043), + FRAC_CONST(0.00097561), FRAC_CONST(0.00194932), + FRAC_CONST(0.00389105), FRAC_CONST(0.00775194), + FRAC_CONST(0.0153846), FRAC_CONST(0.030303), + FRAC_CONST(0.0588235), FRAC_CONST(0.111111), + FRAC_CONST(0.2), FRAC_CONST(0.333333), + FRAC_CONST(0.5), FRAC_CONST(0.666667), + FRAC_CONST(0.8), FRAC_CONST(0.888889), + FRAC_CONST(0.941176), FRAC_CONST(0.969697), + FRAC_CONST(0.984615), FRAC_CONST(0.992248), + FRAC_CONST(0.996109), FRAC_CONST(0.998051), + FRAC_CONST(0.999024), FRAC_CONST(0.999512), + FRAC_CONST(0.999756) +}; + +void unmap_envelope_noise(sbr_info *sbr) +{ + real_t tmp; + int16_t exp0, exp1; + uint8_t l, k; + uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; + uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; + + for (l = 0; l < sbr->L_E[0]; l++) + { + for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) + { + /* +6: * 64 ; +1: * 2 ; */ + exp0 = (sbr->E[0][k][l] >> amp0) + 1; + + /* UN_MAP removed: (x / 4096) same as (x >> 12) */ + /* E[1] is always even so no need for compensating the divide by 2 with + * an extra multiplication + */ + /* exp1 = (sbr->E[1][k][l] >> amp1) - 12; */ + exp1 = (sbr->E[1][k][l] >> amp1); + + if ((exp0 < 0) || (exp0 >= 64) || + (exp1 < 0) || (exp1 > 24)) + { + sbr->E_orig[1][k][l] = 0; + sbr->E_orig[0][k][l] = 0; + } else { + tmp = E_deq_tab[exp0]; + if (amp0 && (sbr->E[0][k][l] & 1)) + { + tmp = MUL_C(tmp, COEF_CONST(1.414213562)); + } + + /* panning */ + sbr->E_orig[0][k][l] = MUL_F(tmp, E_pan_tab[exp1]); + sbr->E_orig[1][k][l] = MUL_F(tmp, E_pan_tab[24 - exp1]); + } + } + } + + for (l = 0; l < sbr->L_Q[0]; l++) + { + for (k = 0; k < sbr->N_Q; k++) + { + sbr->Q_div[0][k][l] = calc_Q_div(sbr, 0, k, l); + sbr->Q_div[1][k][l] = calc_Q_div(sbr, 1, k, l); + sbr->Q_div2[0][k][l] = calc_Q_div2(sbr, 0, k, l); + sbr->Q_div2[1][k][l] = calc_Q_div2(sbr, 1, k, l); + } + } +} + +#endif + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_e_nf.h b/src/contrib/aacdecoder/libfaad/sbr_e_nf.h old mode 100644 new mode 100755 index 7febf11c6..59017a906 --- a/src/contrib/aacdecoder/libfaad/sbr_e_nf.h +++ b/src/contrib/aacdecoder/libfaad/sbr_e_nf.h @@ -1,58 +1,50 @@ -/* -** 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: sbr_e_nf.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_E_NF_H__ -#define __SBR_E_NF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifndef FIXED_POINT -#define P2_TABLE_OFFSET 35 -#define P2_TABLE_MAX 91 -#else -#define P2Q_TABLE_OFFSET 24 -#define P2Q_TABLE_MAX 7 -#define P2_TABLE_OFFSET 0 -#define P2_TABLE_MAX 31 -#endif -#define P2_TABLE_RCP_OFFSET 12 -#define P2_TABLE_RCP_MAX 21 - - -void extract_envelope_data(sbr_info *sbr, uint8_t ch); -void extract_noise_floor_data(sbr_info *sbr, uint8_t ch); -void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch); -void unmap_envelope_noise(sbr_info *sbr); - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_e_nf.h,v 1.18 2007/11/01 12:33:35 menno Exp $ +**/ + +#ifndef __SBR_E_NF_H__ +#define __SBR_E_NF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +void extract_envelope_data(sbr_info *sbr, uint8_t ch); +void extract_noise_floor_data(sbr_info *sbr, uint8_t ch); +#ifndef FIXED_POINT +void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch); +void unmap_envelope_noise(sbr_info *sbr); +#endif + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_fbt.c b/src/contrib/aacdecoder/libfaad/sbr_fbt.c old mode 100644 new mode 100755 index ef2536242..5919c7b56 --- a/src/contrib/aacdecoder/libfaad/sbr_fbt.c +++ b/src/contrib/aacdecoder/libfaad/sbr_fbt.c @@ -1,740 +1,764 @@ -/* -** 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: sbr_fbt.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* Calculate frequency band tables */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include - -#include "sbr_syntax.h" -#include "sbr_fbt.h" - -/* static function declarations */ -static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1); - - -/* calculate the start QMF channel for the master frequency band table */ -/* parameter is also called k0 */ -uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, - uint32_t sample_rate) -{ - static const uint8_t startMinTable[12] = { 7, 7, 10, 11, 12, 16, 16, - 17, 24, 32, 35, 48 }; - static const uint8_t offsetIndexTable[12] = { 5, 5, 4, 4, 4, 3, 2, 1, 0, - 6, 6, 6 }; - static const int8_t offset[7][16] = { - { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 }, - { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 }, - { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, - { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, - { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 }, - { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 } - }; - uint8_t startMin = startMinTable[get_sr_index(sample_rate)]; - uint8_t offsetIndex = offsetIndexTable[get_sr_index(sample_rate)]; - -#if 0 /* replaced with table (startMinTable) */ - if (sample_rate >= 64000) - { - startMin = (uint8_t)((5000.*128.)/(float)sample_rate + 0.5); - } else if (sample_rate < 32000) { - startMin = (uint8_t)((3000.*128.)/(float)sample_rate + 0.5); - } else { - startMin = (uint8_t)((4000.*128.)/(float)sample_rate + 0.5); - } -#endif - - if (bs_samplerate_mode) - { - return startMin + offset[offsetIndex][bs_start_freq]; - -#if 0 /* replaced by offsetIndexTable */ - switch (sample_rate) - { - case 16000: - return startMin + offset[0][bs_start_freq]; - case 22050: - return startMin + offset[1][bs_start_freq]; - case 24000: - return startMin + offset[2][bs_start_freq]; - case 32000: - return startMin + offset[3][bs_start_freq]; - default: - if (sample_rate > 64000) - { - return startMin + offset[5][bs_start_freq]; - } else { /* 44100 <= sample_rate <= 64000 */ - return startMin + offset[4][bs_start_freq]; - } - } -#endif - } else { - return startMin + offset[6][bs_start_freq]; - } -} - -static int longcmp(const void *a, const void *b) -{ - return ((int)(*(int32_t*)a - *(int32_t*)b)); -} - -/* calculate the stop QMF channel for the master frequency band table */ -/* parameter is also called k2 */ -uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, - uint8_t k0) -{ - if (bs_stop_freq == 15) - { - return min(64, k0 * 3); - } else if (bs_stop_freq == 14) { - return min(64, k0 * 2); - } else { - static const uint8_t stopMinTable[12] = { 13, 15, 20, 21, 23, - 32, 32, 35, 48, 64, 70, 96 }; - static const int8_t offset[12][14] = { - { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 37, 44, 51 }, - { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 36, 42, 49 }, - { 0, 2, 4, 6, 8, 11, 14, 17, 21, 25, 29, 34, 39, 44 }, - { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 33, 38, 43 }, - { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 32, 36, 41 }, - { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, - { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, - { 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 20, 23, 26, 29 }, - { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16 }, - { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, - { 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -6, -6, -6 }, - { 0, -3, -6, -9, -12, -15, -18, -20, -22, -24, -26, -28, -30, -32 } - }; -#if 0 - uint8_t i; - int32_t stopDk[13], stopDk_t[14], k2; -#endif - uint8_t stopMin = stopMinTable[get_sr_index(sample_rate)]; - -#if 0 /* replaced by table lookup */ - if (sample_rate >= 64000) - { - stopMin = (uint8_t)((10000.*128.)/(float)sample_rate + 0.5); - } else if (sample_rate < 32000) { - stopMin = (uint8_t)((6000.*128.)/(float)sample_rate + 0.5); - } else { - stopMin = (uint8_t)((8000.*128.)/(float)sample_rate + 0.5); - } -#endif - -#if 0 /* replaced by table lookup */ - /* diverging power series */ - for (i = 0; i <= 13; i++) - { - stopDk_t[i] = (int32_t)(stopMin*pow(64.0/stopMin, i/13.0) + 0.5); - } - for (i = 0; i < 13; i++) - { - stopDk[i] = stopDk_t[i+1] - stopDk_t[i]; - } - - /* needed? */ - qsort(stopDk, 13, sizeof(stopDk[0]), longcmp); - - k2 = stopMin; - for (i = 0; i < bs_stop_freq; i++) - { - k2 += stopDk[i]; - } - return min(64, k2); -#endif - /* bs_stop_freq <= 13 */ - return min(64, stopMin + offset[get_sr_index(sample_rate)][min(bs_stop_freq, 13)]); - } - - return 0; -} - -/* calculate the master frequency table from k0, k2, bs_freq_scale - and bs_alter_scale - - version for bs_freq_scale = 0 -*/ -uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_alter_scale) -{ - int8_t incr; - uint8_t k; - uint8_t dk; - uint32_t nrBands, k2Achieved; - int32_t k2Diff, vDk[64] = {0}; - - /* mft only defined for k2 > k0 */ - if (k2 <= k0) - { - sbr->N_master = 0; - return 0; - } - - dk = bs_alter_scale ? 2 : 1; - -#if 0 /* replaced by float-less design */ - nrBands = 2 * (int32_t)((float)(k2-k0)/(dk*2) + (-1+dk)/2.0f); -#else - if (bs_alter_scale) - { - nrBands = (((k2-k0+2)>>2)<<1); - } else { - nrBands = (((k2-k0)>>1)<<1); - } -#endif - nrBands = min(nrBands, 63); - if (nrBands <= 0) - return 1; - - k2Achieved = k0 + nrBands * dk; - k2Diff = k2 - k2Achieved; - for (k = 0; k < nrBands; k++) - vDk[k] = dk; - - if (k2Diff) - { - incr = (k2Diff > 0) ? -1 : 1; - k = (k2Diff > 0) ? (nrBands-1) : 0; - - while (k2Diff != 0) - { - vDk[k] -= incr; - k += incr; - k2Diff += incr; - } - } - - sbr->f_master[0] = k0; - for (k = 1; k <= nrBands; k++) - sbr->f_master[k] = sbr->f_master[k-1] + vDk[k-1]; - - sbr->N_master = nrBands; - sbr->N_master = min(sbr->N_master, 64); - -#if 0 - printf("f_master[%d]: ", nrBands); - for (k = 0; k <= nrBands; k++) - { - printf("%d ", sbr->f_master[k]); - } - printf("\n"); -#endif - - return 0; -} - -/* - This function finds the number of bands using this formula: - bands * log(a1/a0)/log(2.0) + 0.5 -*/ -static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1) -{ -#ifdef FIXED_POINT - /* table with log2() values */ - static const real_t log2Table[65] = { - COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(1.0000000000), COEF_CONST(1.5849625007), - COEF_CONST(2.0000000000), COEF_CONST(2.3219280949), COEF_CONST(2.5849625007), COEF_CONST(2.8073549221), - COEF_CONST(3.0000000000), COEF_CONST(3.1699250014), COEF_CONST(3.3219280949), COEF_CONST(3.4594316186), - COEF_CONST(3.5849625007), COEF_CONST(3.7004397181), COEF_CONST(3.8073549221), COEF_CONST(3.9068905956), - COEF_CONST(4.0000000000), COEF_CONST(4.0874628413), COEF_CONST(4.1699250014), COEF_CONST(4.2479275134), - COEF_CONST(4.3219280949), COEF_CONST(4.3923174228), COEF_CONST(4.4594316186), COEF_CONST(4.5235619561), - COEF_CONST(4.5849625007), COEF_CONST(4.6438561898), COEF_CONST(4.7004397181), COEF_CONST(4.7548875022), - COEF_CONST(4.8073549221), COEF_CONST(4.8579809951), COEF_CONST(4.9068905956), COEF_CONST(4.9541963104), - COEF_CONST(5.0000000000), COEF_CONST(5.0443941194), COEF_CONST(5.0874628413), COEF_CONST(5.1292830169), - COEF_CONST(5.1699250014), COEF_CONST(5.2094533656), COEF_CONST(5.2479275134), COEF_CONST(5.2854022189), - COEF_CONST(5.3219280949), COEF_CONST(5.3575520046), COEF_CONST(5.3923174228), COEF_CONST(5.4262647547), - COEF_CONST(5.4594316186), COEF_CONST(5.4918530963), COEF_CONST(5.5235619561), COEF_CONST(5.5545888517), - COEF_CONST(5.5849625007), COEF_CONST(5.6147098441), COEF_CONST(5.6438561898), COEF_CONST(5.6724253420), - COEF_CONST(5.7004397181), COEF_CONST(5.7279204546), COEF_CONST(5.7548875022), COEF_CONST(5.7813597135), - COEF_CONST(5.8073549221), COEF_CONST(5.8328900142), COEF_CONST(5.8579809951), COEF_CONST(5.8826430494), - COEF_CONST(5.9068905956), COEF_CONST(5.9307373376), COEF_CONST(5.9541963104), COEF_CONST(5.9772799235), - COEF_CONST(6.0) - }; - real_t r0 = log2Table[a0]; /* coef */ - real_t r1 = log2Table[a1]; /* coef */ - real_t r2 = (r1 - r0); /* coef */ - - if (warp) - r2 = MUL_C(r2, COEF_CONST(1.0/1.3)); - - /* convert r2 to real and then multiply and round */ - r2 = (r2 >> (COEF_BITS-REAL_BITS)) * bands + (1<<(REAL_BITS-1)); - - return (r2 >> REAL_BITS); -#else - real_t div = (real_t)log(2.0); - if (warp) div *= (real_t)1.3; - - return (int32_t)(bands * log((float)a1/(float)a0)/div + 0.5); -#endif -} - -static real_t find_initial_power(uint8_t bands, uint8_t a0, uint8_t a1) -{ -#ifdef FIXED_POINT - /* table with log() values */ - static const real_t logTable[65] = { - COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(0.6931471806), COEF_CONST(1.0986122887), - COEF_CONST(1.3862943611), COEF_CONST(1.6094379124), COEF_CONST(1.7917594692), COEF_CONST(1.9459101491), - COEF_CONST(2.0794415417), COEF_CONST(2.1972245773), COEF_CONST(2.3025850930), COEF_CONST(2.3978952728), - COEF_CONST(2.4849066498), COEF_CONST(2.5649493575), COEF_CONST(2.6390573296), COEF_CONST(2.7080502011), - COEF_CONST(2.7725887222), COEF_CONST(2.8332133441), COEF_CONST(2.8903717579), COEF_CONST(2.9444389792), - COEF_CONST(2.9957322736), COEF_CONST(3.0445224377), COEF_CONST(3.0910424534), COEF_CONST(3.1354942159), - COEF_CONST(3.1780538303), COEF_CONST(3.2188758249), COEF_CONST(3.2580965380), COEF_CONST(3.2958368660), - COEF_CONST(3.3322045102), COEF_CONST(3.3672958300), COEF_CONST(3.4011973817), COEF_CONST(3.4339872045), - COEF_CONST(3.4657359028), COEF_CONST(3.4965075615), COEF_CONST(3.5263605246), COEF_CONST(3.5553480615), - COEF_CONST(3.5835189385), COEF_CONST(3.6109179126), COEF_CONST(3.6375861597), COEF_CONST(3.6635616461), - COEF_CONST(3.6888794541), COEF_CONST(3.7135720667), COEF_CONST(3.7376696183), COEF_CONST(3.7612001157), - COEF_CONST(3.7841896339), COEF_CONST(3.8066624898), COEF_CONST(3.8286413965), COEF_CONST(3.8501476017), - COEF_CONST(3.8712010109), COEF_CONST(3.8918202981), COEF_CONST(3.9120230054), COEF_CONST(3.9318256327), - COEF_CONST(3.9512437186), COEF_CONST(3.9702919136), COEF_CONST(3.9889840466), COEF_CONST(4.0073331852), - COEF_CONST(4.0253516907), COEF_CONST(4.0430512678), COEF_CONST(4.0604430105), COEF_CONST(4.0775374439), - COEF_CONST(4.0943445622), COEF_CONST(4.1108738642), COEF_CONST(4.1271343850), COEF_CONST(4.1431347264), - COEF_CONST(4.158883083) - }; - /* standard Taylor polynomial coefficients for exp(x) around 0 */ - /* a polynomial around x=1 is more precise, as most values are around 1.07, - but this is just fine already */ - static const real_t c1 = COEF_CONST(1.0); - static const real_t c2 = COEF_CONST(1.0/2.0); - static const real_t c3 = COEF_CONST(1.0/6.0); - static const real_t c4 = COEF_CONST(1.0/24.0); - - real_t r0 = logTable[a0]; /* coef */ - real_t r1 = logTable[a1]; /* coef */ - real_t r2 = (r1 - r0) / bands; /* coef */ - real_t rexp = c1 + MUL_C((c1 + MUL_C((c2 + MUL_C((c3 + MUL_C(c4,r2)), r2)), r2)), r2); - - return (rexp >> (COEF_BITS-REAL_BITS)); /* real */ -#else - return (real_t)pow((real_t)a1/(real_t)a0, 1.0/(real_t)bands); -#endif -} - -/* - version for bs_freq_scale > 0 -*/ -uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_freq_scale, uint8_t bs_alter_scale) -{ - uint8_t k, bands, twoRegions; - uint8_t k1; - uint8_t nrBand0, nrBand1; - int32_t vDk0[64] = {0}, vDk1[64] = {0}; - int32_t vk0[64] = {0}, vk1[64] = {0}; - uint8_t temp1[] = { 6, 5, 4 }; - real_t q, qk; - int32_t A_1; - - /* mft only defined for k2 > k0 */ - if (k2 <= k0) - { - sbr->N_master = 0; - return 0; - } - - bands = temp1[bs_freq_scale-1]; - -#ifdef FIXED_POINT - if (REAL_CONST(k2) > MUL_R(REAL_CONST(k0),REAL_CONST(2.2449))) -#else - if ((float)k2/(float)k0 > 2.2449) -#endif - { - twoRegions = 1; - k1 = k0 << 1; - } else { - twoRegions = 0; - k1 = k2; - } - - nrBand0 = 2 * find_bands(0, bands, k0, k1); - nrBand0 = min(nrBand0, 63); - if (nrBand0 <= 0) - return 1; - - q = find_initial_power(nrBand0, k0, k1); - qk = REAL_CONST(k0); -#ifdef FIXED_POINT - A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); -#else - A_1 = (int32_t)(qk + .5); -#endif - for (k = 0; k <= nrBand0; k++) - { - int32_t A_0 = A_1; -#ifdef FIXED_POINT - qk = MUL_R(qk,q); - A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); -#else - qk *= q; - A_1 = (int32_t)(qk + 0.5); -#endif - vDk0[k] = A_1 - A_0; - } - - /* needed? */ - qsort(vDk0, nrBand0, sizeof(vDk0[0]), longcmp); - - vk0[0] = k0; - for (k = 1; k <= nrBand0; k++) - { - vk0[k] = vk0[k-1] + vDk0[k-1]; - if (vDk0[k-1] == 0) - return 1; - } - - if (!twoRegions) - { - for (k = 0; k <= nrBand0; k++) - sbr->f_master[k] = vk0[k]; - - sbr->N_master = nrBand0; - sbr->N_master = min(sbr->N_master, 64); - return 0; - } - - nrBand1 = 2 * find_bands(1 /* warped */, bands, k1, k2); - nrBand1 = min(nrBand1, 63); - - q = find_initial_power(nrBand1, k1, k2); - qk = REAL_CONST(k1); -#ifdef FIXED_POINT - A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); -#else - A_1 = (int32_t)(qk + .5); -#endif - for (k = 0; k <= nrBand1 - 1; k++) - { - int32_t A_0 = A_1; -#ifdef FIXED_POINT - qk = MUL_R(qk,q); - A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); -#else - qk *= q; - A_1 = (int32_t)(qk + 0.5); -#endif - vDk1[k] = A_1 - A_0; - } - - if (vDk1[0] < vDk0[nrBand0 - 1]) - { - int32_t change; - - /* needed? */ - qsort(vDk1, nrBand1 + 1, sizeof(vDk1[0]), longcmp); - change = vDk0[nrBand0 - 1] - vDk1[0]; - vDk1[0] = vDk0[nrBand0 - 1]; - vDk1[nrBand1 - 1] = vDk1[nrBand1 - 1] - change; - } - - /* needed? */ - qsort(vDk1, nrBand1, sizeof(vDk1[0]), longcmp); - vk1[0] = k1; - for (k = 1; k <= nrBand1; k++) - { - vk1[k] = vk1[k-1] + vDk1[k-1]; - if (vDk1[k-1] == 0) - return 1; - } - - sbr->N_master = nrBand0 + nrBand1; - sbr->N_master = min(sbr->N_master, 64); - for (k = 0; k <= nrBand0; k++) - { - sbr->f_master[k] = vk0[k]; - } - for (k = nrBand0 + 1; k <= sbr->N_master; k++) - { - sbr->f_master[k] = vk1[k - nrBand0]; - } - -#if 0 - printf("f_master[%d]: ", sbr->N_master); - for (k = 0; k <= sbr->N_master; k++) - { - printf("%d ", sbr->f_master[k]); - } - printf("\n"); -#endif - - return 0; -} - -/* calculate the derived frequency border tables from f_master */ -uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, - uint8_t k2) -{ - uint8_t k, i; - uint32_t minus; - - /* The following relation shall be satisfied: bs_xover_band < N_Master */ - if (sbr->N_master <= bs_xover_band) - return 1; - - sbr->N_high = sbr->N_master - bs_xover_band; - sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1)); - - sbr->n[0] = sbr->N_low; - sbr->n[1] = sbr->N_high; - - for (k = 0; k <= sbr->N_high; k++) - { - sbr->f_table_res[HI_RES][k] = sbr->f_master[k + bs_xover_band]; - } - - sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0]; - sbr->kx = sbr->f_table_res[HI_RES][0]; - if (sbr->kx > 32) - return 1; - if (sbr->kx + sbr->M > 64) - return 1; - - minus = (sbr->N_high & 1) ? 1 : 0; - - for (k = 0; k <= sbr->N_low; k++) - { - if (k == 0) - i = 0; - else - i = 2*k - minus; - sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i]; - } - -#if 0 - printf("f_table_res[HI_RES][%d]: ", sbr->N_high); - for (k = 0; k <= sbr->N_high; k++) - { - printf("%d ", sbr->f_table_res[HI_RES][k]); - } - printf("\n"); -#endif -#if 0 - printf("f_table_res[LO_RES][%d]: ", sbr->N_low); - for (k = 0; k <= sbr->N_low; k++) - { - printf("%d ", sbr->f_table_res[LO_RES][k]); - } - printf("\n"); -#endif - - sbr->N_Q = 0; - if (sbr->bs_noise_bands == 0) - { - sbr->N_Q = 1; - } else { -#if 0 - sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5)); -#else - sbr->N_Q = max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2)); -#endif - sbr->N_Q = min(5, sbr->N_Q); - } - - for (k = 0; k <= sbr->N_Q; k++) - { - if (k == 0) - { - i = 0; - } else { - /* i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k)); */ - i = i + (sbr->N_low - i)/(sbr->N_Q + 1 - k); - } - sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i]; - } - - /* build table for mapping k to g in hf patching */ - for (k = 0; k < 64; k++) - { - uint8_t g; - for (g = 0; g < sbr->N_Q; g++) - { - if ((sbr->f_table_noise[g] <= k) && - (k < sbr->f_table_noise[g+1])) - { - sbr->table_map_k_to_g[k] = g; - break; - } - } - } - -#if 0 - printf("f_table_noise[%d]: ", sbr->N_Q); - for (k = 0; k <= sbr->N_Q; k++) - { - printf("%d ", sbr->f_table_noise[k]); - } - printf("\n"); -#endif - - return 0; -} - -/* TODO: blegh, ugly */ -/* Modified to calculate for all possible bs_limiter_bands always - * This reduces the number calls to this functions needed (now only on - * header reset) - */ -void limiter_frequency_table(sbr_info *sbr) -{ -#if 0 - static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2), - REAL_CONST(2), REAL_CONST(3) }; -#else - static const real_t limiterBandsCompare[] = { REAL_CONST(1.328125), - REAL_CONST(1.1875), REAL_CONST(1.125) }; -#endif - uint8_t k, s; - int8_t nrLim; -#if 0 - real_t limBands; -#endif - - sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx; - sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx; - sbr->N_L[0] = 1; - - for (s = 1; s < 4; s++) - { - int32_t limTable[100 /*TODO*/] = {0}; - uint8_t patchBorders[64/*??*/] = {0}; - -#if 0 - limBands = limiterBandsPerOctave[s - 1]; -#endif - - patchBorders[0] = sbr->kx; - for (k = 1; k <= sbr->noPatches; k++) - { - patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1]; - } - - for (k = 0; k <= sbr->N_low; k++) - { - limTable[k] = sbr->f_table_res[LO_RES][k]; - } - for (k = 1; k < sbr->noPatches; k++) - { - limTable[k+sbr->N_low] = patchBorders[k]; - } - - /* needed */ - qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); - k = 1; - nrLim = sbr->noPatches + sbr->N_low - 1; - - if (nrLim < 0) // TODO: BIG FAT PROBLEM - return; - -restart: - if (k <= nrLim) - { - real_t nOctaves; - - if (limTable[k-1] != 0) -#if 0 - nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0)); -#endif -#ifdef FIXED_POINT - nOctaves = SBR_DIV(REAL_CONST(limTable[k]),REAL_CONST(limTable[k-1])); -#else - nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1]; -#endif - else - nOctaves = 0; - -#if 0 - if ((MUL(nOctaves,limBands)) < REAL_CONST(0.49)) -#else - if (nOctaves < limiterBandsCompare[s - 1]) -#endif - { - uint8_t i; - if (limTable[k] != limTable[k-1]) - { - uint8_t found = 0, found2 = 0; - for (i = 0; i <= sbr->noPatches; i++) - { - if (limTable[k] == patchBorders[i]) - found = 1; - } - if (found) - { - found2 = 0; - for (i = 0; i <= sbr->noPatches; i++) - { - if (limTable[k-1] == patchBorders[i]) - found2 = 1; - } - if (found2) - { - k++; - goto restart; - } else { - /* remove (k-1)th element */ - limTable[k-1] = sbr->f_table_res[LO_RES][sbr->N_low]; - qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); - nrLim--; - goto restart; - } - } - } - /* remove kth element */ - limTable[k] = sbr->f_table_res[LO_RES][sbr->N_low]; - qsort(limTable, nrLim, sizeof(limTable[0]), longcmp); - nrLim--; - goto restart; - } else { - k++; - goto restart; - } - } - - sbr->N_L[s] = nrLim; - for (k = 0; k <= nrLim; k++) - { - sbr->f_table_lim[s][k] = limTable[k] - sbr->kx; - } - -#if 0 - printf("f_table_lim[%d][%d]: ", s, sbr->N_L[s]); - for (k = 0; k <= sbr->N_L[s]; k++) - { - printf("%d ", sbr->f_table_lim[s][k]); - } - printf("\n"); -#endif - } -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_fbt.c,v 1.21 2007/11/01 12:33:35 menno Exp $ +**/ + +/* Calculate frequency band tables */ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include + +#include "sbr_syntax.h" +#include "sbr_fbt.h" + +/* static function declarations */ +static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1); + + +/* calculate the start QMF channel for the master frequency band table */ +/* parameter is also called k0 */ +uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, + uint32_t sample_rate) +{ + static const uint8_t startMinTable[12] = { 7, 7, 10, 11, 12, 16, 16, + 17, 24, 32, 35, 48 }; + static const uint8_t offsetIndexTable[12] = { 5, 5, 4, 4, 4, 3, 2, 1, 0, + 6, 6, 6 }; + static const int8_t offset[7][16] = { + { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 }, + { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 }, + { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, + { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, + { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 }, + { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 } + }; + uint8_t startMin = startMinTable[get_sr_index(sample_rate)]; + uint8_t offsetIndex = offsetIndexTable[get_sr_index(sample_rate)]; + +#if 0 /* replaced with table (startMinTable) */ + if (sample_rate >= 64000) + { + startMin = (uint8_t)((5000.*128.)/(float)sample_rate + 0.5); + } else if (sample_rate < 32000) { + startMin = (uint8_t)((3000.*128.)/(float)sample_rate + 0.5); + } else { + startMin = (uint8_t)((4000.*128.)/(float)sample_rate + 0.5); + } +#endif + + if (bs_samplerate_mode) + { + return startMin + offset[offsetIndex][bs_start_freq]; + +#if 0 /* replaced by offsetIndexTable */ + switch (sample_rate) + { + case 16000: + return startMin + offset[0][bs_start_freq]; + case 22050: + return startMin + offset[1][bs_start_freq]; + case 24000: + return startMin + offset[2][bs_start_freq]; + case 32000: + return startMin + offset[3][bs_start_freq]; + default: + if (sample_rate > 64000) + { + return startMin + offset[5][bs_start_freq]; + } else { /* 44100 <= sample_rate <= 64000 */ + return startMin + offset[4][bs_start_freq]; + } + } +#endif + } else { + return startMin + offset[6][bs_start_freq]; + } +} + +static int longcmp(const void *a, const void *b) +{ + return ((int)(*(int32_t*)a - *(int32_t*)b)); +} + +/* calculate the stop QMF channel for the master frequency band table */ +/* parameter is also called k2 */ +uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, + uint8_t k0) +{ + if (bs_stop_freq == 15) + { + return min(64, k0 * 3); + } else if (bs_stop_freq == 14) { + return min(64, k0 * 2); + } else { + static const uint8_t stopMinTable[12] = { 13, 15, 20, 21, 23, + 32, 32, 35, 48, 64, 70, 96 }; + static const int8_t offset[12][14] = { + { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 37, 44, 51 }, + { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 36, 42, 49 }, + { 0, 2, 4, 6, 8, 11, 14, 17, 21, 25, 29, 34, 39, 44 }, + { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 33, 38, 43 }, + { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 32, 36, 41 }, + { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, + { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 }, + { 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 20, 23, 26, 29 }, + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -6, -6, -6 }, + { 0, -3, -6, -9, -12, -15, -18, -20, -22, -24, -26, -28, -30, -32 } + }; +#if 0 + uint8_t i; + int32_t stopDk[13], stopDk_t[14], k2; +#endif + uint8_t stopMin = stopMinTable[get_sr_index(sample_rate)]; + +#if 0 /* replaced by table lookup */ + if (sample_rate >= 64000) + { + stopMin = (uint8_t)((10000.*128.)/(float)sample_rate + 0.5); + } else if (sample_rate < 32000) { + stopMin = (uint8_t)((6000.*128.)/(float)sample_rate + 0.5); + } else { + stopMin = (uint8_t)((8000.*128.)/(float)sample_rate + 0.5); + } +#endif + +#if 0 /* replaced by table lookup */ + /* diverging power series */ + for (i = 0; i <= 13; i++) + { + stopDk_t[i] = (int32_t)(stopMin*pow(64.0/stopMin, i/13.0) + 0.5); + } + for (i = 0; i < 13; i++) + { + stopDk[i] = stopDk_t[i+1] - stopDk_t[i]; + } + + /* needed? */ + qsort(stopDk, 13, sizeof(stopDk[0]), longcmp); + + k2 = stopMin; + for (i = 0; i < bs_stop_freq; i++) + { + k2 += stopDk[i]; + } + return min(64, k2); +#endif + /* bs_stop_freq <= 13 */ + return min(64, stopMin + offset[get_sr_index(sample_rate)][min(bs_stop_freq, 13)]); + } + + return 0; +} + +/* calculate the master frequency table from k0, k2, bs_freq_scale + and bs_alter_scale + + version for bs_freq_scale = 0 +*/ +uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, + uint8_t bs_alter_scale) +{ + int8_t incr; + uint8_t k; + uint8_t dk; + uint32_t nrBands, k2Achieved; + int32_t k2Diff, vDk[64] = {0}; + + /* mft only defined for k2 > k0 */ + if (k2 <= k0) + { + sbr->N_master = 0; + return 1; + } + + dk = bs_alter_scale ? 2 : 1; + +#if 0 /* replaced by float-less design */ + nrBands = 2 * (int32_t)((float)(k2-k0)/(dk*2) + (-1+dk)/2.0f); +#else + if (bs_alter_scale) + { + nrBands = (((k2-k0+2)>>2)<<1); + } else { + nrBands = (((k2-k0)>>1)<<1); + } +#endif + nrBands = min(nrBands, 63); + if (nrBands <= 0) + return 1; + + k2Achieved = k0 + nrBands * dk; + k2Diff = k2 - k2Achieved; + for (k = 0; k < nrBands; k++) + vDk[k] = dk; + + if (k2Diff) + { + incr = (k2Diff > 0) ? -1 : 1; + k = (uint8_t) ((k2Diff > 0) ? (nrBands-1) : 0); + + while (k2Diff != 0) + { + vDk[k] -= incr; + k += incr; + k2Diff += incr; + } + } + + sbr->f_master[0] = k0; + for (k = 1; k <= nrBands; k++) + sbr->f_master[k] = (uint8_t)(sbr->f_master[k-1] + vDk[k-1]); + + sbr->N_master = (uint8_t)nrBands; + sbr->N_master = (min(sbr->N_master, 64)); + +#if 0 + printf("f_master[%d]: ", nrBands); + for (k = 0; k <= nrBands; k++) + { + printf("%d ", sbr->f_master[k]); + } + printf("\n"); +#endif + + return 0; +} + +/* + This function finds the number of bands using this formula: + bands * log(a1/a0)/log(2.0) + 0.5 +*/ +static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1) +{ +#ifdef FIXED_POINT + /* table with log2() values */ + static const real_t log2Table[65] = { + COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(1.0000000000), COEF_CONST(1.5849625007), + COEF_CONST(2.0000000000), COEF_CONST(2.3219280949), COEF_CONST(2.5849625007), COEF_CONST(2.8073549221), + COEF_CONST(3.0000000000), COEF_CONST(3.1699250014), COEF_CONST(3.3219280949), COEF_CONST(3.4594316186), + COEF_CONST(3.5849625007), COEF_CONST(3.7004397181), COEF_CONST(3.8073549221), COEF_CONST(3.9068905956), + COEF_CONST(4.0000000000), COEF_CONST(4.0874628413), COEF_CONST(4.1699250014), COEF_CONST(4.2479275134), + COEF_CONST(4.3219280949), COEF_CONST(4.3923174228), COEF_CONST(4.4594316186), COEF_CONST(4.5235619561), + COEF_CONST(4.5849625007), COEF_CONST(4.6438561898), COEF_CONST(4.7004397181), COEF_CONST(4.7548875022), + COEF_CONST(4.8073549221), COEF_CONST(4.8579809951), COEF_CONST(4.9068905956), COEF_CONST(4.9541963104), + COEF_CONST(5.0000000000), COEF_CONST(5.0443941194), COEF_CONST(5.0874628413), COEF_CONST(5.1292830169), + COEF_CONST(5.1699250014), COEF_CONST(5.2094533656), COEF_CONST(5.2479275134), COEF_CONST(5.2854022189), + COEF_CONST(5.3219280949), COEF_CONST(5.3575520046), COEF_CONST(5.3923174228), COEF_CONST(5.4262647547), + COEF_CONST(5.4594316186), COEF_CONST(5.4918530963), COEF_CONST(5.5235619561), COEF_CONST(5.5545888517), + COEF_CONST(5.5849625007), COEF_CONST(5.6147098441), COEF_CONST(5.6438561898), COEF_CONST(5.6724253420), + COEF_CONST(5.7004397181), COEF_CONST(5.7279204546), COEF_CONST(5.7548875022), COEF_CONST(5.7813597135), + COEF_CONST(5.8073549221), COEF_CONST(5.8328900142), COEF_CONST(5.8579809951), COEF_CONST(5.8826430494), + COEF_CONST(5.9068905956), COEF_CONST(5.9307373376), COEF_CONST(5.9541963104), COEF_CONST(5.9772799235), + COEF_CONST(6.0) + }; + real_t r0 = log2Table[a0]; /* coef */ + real_t r1 = log2Table[a1]; /* coef */ + real_t r2 = (r1 - r0); /* coef */ + + if (warp) + r2 = MUL_C(r2, COEF_CONST(1.0/1.3)); + + /* convert r2 to real and then multiply and round */ + r2 = (r2 >> (COEF_BITS-REAL_BITS)) * bands + (1<<(REAL_BITS-1)); + + return (r2 >> REAL_BITS); +#else + real_t div = (real_t)log(2.0); + if (warp) div *= (real_t)1.3; + + return (int32_t)(bands * log((float)a1/(float)a0)/div + 0.5); +#endif +} + +static real_t find_initial_power(uint8_t bands, uint8_t a0, uint8_t a1) +{ +#ifdef FIXED_POINT + /* table with log() values */ + static const real_t logTable[65] = { + COEF_CONST(0.0), COEF_CONST(0.0), COEF_CONST(0.6931471806), COEF_CONST(1.0986122887), + COEF_CONST(1.3862943611), COEF_CONST(1.6094379124), COEF_CONST(1.7917594692), COEF_CONST(1.9459101491), + COEF_CONST(2.0794415417), COEF_CONST(2.1972245773), COEF_CONST(2.3025850930), COEF_CONST(2.3978952728), + COEF_CONST(2.4849066498), COEF_CONST(2.5649493575), COEF_CONST(2.6390573296), COEF_CONST(2.7080502011), + COEF_CONST(2.7725887222), COEF_CONST(2.8332133441), COEF_CONST(2.8903717579), COEF_CONST(2.9444389792), + COEF_CONST(2.9957322736), COEF_CONST(3.0445224377), COEF_CONST(3.0910424534), COEF_CONST(3.1354942159), + COEF_CONST(3.1780538303), COEF_CONST(3.2188758249), COEF_CONST(3.2580965380), COEF_CONST(3.2958368660), + COEF_CONST(3.3322045102), COEF_CONST(3.3672958300), COEF_CONST(3.4011973817), COEF_CONST(3.4339872045), + COEF_CONST(3.4657359028), COEF_CONST(3.4965075615), COEF_CONST(3.5263605246), COEF_CONST(3.5553480615), + COEF_CONST(3.5835189385), COEF_CONST(3.6109179126), COEF_CONST(3.6375861597), COEF_CONST(3.6635616461), + COEF_CONST(3.6888794541), COEF_CONST(3.7135720667), COEF_CONST(3.7376696183), COEF_CONST(3.7612001157), + COEF_CONST(3.7841896339), COEF_CONST(3.8066624898), COEF_CONST(3.8286413965), COEF_CONST(3.8501476017), + COEF_CONST(3.8712010109), COEF_CONST(3.8918202981), COEF_CONST(3.9120230054), COEF_CONST(3.9318256327), + COEF_CONST(3.9512437186), COEF_CONST(3.9702919136), COEF_CONST(3.9889840466), COEF_CONST(4.0073331852), + COEF_CONST(4.0253516907), COEF_CONST(4.0430512678), COEF_CONST(4.0604430105), COEF_CONST(4.0775374439), + COEF_CONST(4.0943445622), COEF_CONST(4.1108738642), COEF_CONST(4.1271343850), COEF_CONST(4.1431347264), + COEF_CONST(4.158883083) + }; + /* standard Taylor polynomial coefficients for exp(x) around 0 */ + /* a polynomial around x=1 is more precise, as most values are around 1.07, + but this is just fine already */ + static const real_t c1 = COEF_CONST(1.0); + static const real_t c2 = COEF_CONST(1.0/2.0); + static const real_t c3 = COEF_CONST(1.0/6.0); + static const real_t c4 = COEF_CONST(1.0/24.0); + + real_t r0 = logTable[a0]; /* coef */ + real_t r1 = logTable[a1]; /* coef */ + real_t r2 = (r1 - r0) / bands; /* coef */ + real_t rexp = c1 + MUL_C((c1 + MUL_C((c2 + MUL_C((c3 + MUL_C(c4,r2)), r2)), r2)), r2); + + return (rexp >> (COEF_BITS-REAL_BITS)); /* real */ +#else + return (real_t)pow((real_t)a1/(real_t)a0, 1.0/(real_t)bands); +#endif +} + +/* + version for bs_freq_scale > 0 +*/ +uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, + uint8_t bs_freq_scale, uint8_t bs_alter_scale) +{ + uint8_t k, bands, twoRegions; + uint8_t k1; + uint8_t nrBand0, nrBand1; + int32_t vDk0[64] = {0}, vDk1[64] = {0}; + int32_t vk0[64] = {0}, vk1[64] = {0}; + uint8_t temp1[] = { 6, 5, 4 }; + real_t q, qk; + int32_t A_1; +#ifdef FIXED_POINT + real_t rk2, rk0; +#endif + + /* mft only defined for k2 > k0 */ + if (k2 <= k0) + { + sbr->N_master = 0; + return 1; + } + + bands = temp1[bs_freq_scale-1]; + +#ifdef FIXED_POINT + rk0 = (real_t)k0 << REAL_BITS; + rk2 = (real_t)k2 << REAL_BITS; + if (rk2 > MUL_C(rk0, COEF_CONST(2.2449))) +#else + if ((float)k2/(float)k0 > 2.2449) +#endif + { + twoRegions = 1; + k1 = k0 << 1; + } else { + twoRegions = 0; + k1 = k2; + } + + nrBand0 = (uint8_t)(2 * find_bands(0, bands, k0, k1)); + nrBand0 = min(nrBand0, 63); + if (nrBand0 <= 0) + return 1; + + q = find_initial_power(nrBand0, k0, k1); +#ifdef FIXED_POINT + qk = (real_t)k0 << REAL_BITS; + //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); + A_1 = k0; +#else + qk = REAL_CONST(k0); + A_1 = (int32_t)(qk + .5); +#endif + for (k = 0; k <= nrBand0; k++) + { + int32_t A_0 = A_1; +#ifdef FIXED_POINT + qk = MUL_R(qk,q); + A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); +#else + qk *= q; + A_1 = (int32_t)(qk + 0.5); +#endif + vDk0[k] = A_1 - A_0; + } + + /* needed? */ + qsort(vDk0, nrBand0, sizeof(vDk0[0]), longcmp); + + vk0[0] = k0; + for (k = 1; k <= nrBand0; k++) + { + vk0[k] = vk0[k-1] + vDk0[k-1]; + if (vDk0[k-1] == 0) + return 1; + } + + if (!twoRegions) + { + for (k = 0; k <= nrBand0; k++) + sbr->f_master[k] = (uint8_t) vk0[k]; + + sbr->N_master = nrBand0; + sbr->N_master = min(sbr->N_master, 64); + return 0; + } + + nrBand1 = (uint8_t)(2 * find_bands(1 /* warped */, bands, k1, k2)); + nrBand1 = min(nrBand1, 63); + + q = find_initial_power(nrBand1, k1, k2); +#ifdef FIXED_POINT + qk = (real_t)k1 << REAL_BITS; + //A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); + A_1 = k1; +#else + qk = REAL_CONST(k1); + A_1 = (int32_t)(qk + .5); +#endif + for (k = 0; k <= nrBand1 - 1; k++) + { + int32_t A_0 = A_1; +#ifdef FIXED_POINT + qk = MUL_R(qk,q); + A_1 = (int32_t)((qk + REAL_CONST(0.5)) >> REAL_BITS); +#else + qk *= q; + A_1 = (int32_t)(qk + 0.5); +#endif + vDk1[k] = A_1 - A_0; + } + + if (vDk1[0] < vDk0[nrBand0 - 1]) + { + int32_t change; + + /* needed? */ + qsort(vDk1, nrBand1 + 1, sizeof(vDk1[0]), longcmp); + change = vDk0[nrBand0 - 1] - vDk1[0]; + vDk1[0] = vDk0[nrBand0 - 1]; + vDk1[nrBand1 - 1] = vDk1[nrBand1 - 1] - change; + } + + /* needed? */ + qsort(vDk1, nrBand1, sizeof(vDk1[0]), longcmp); + vk1[0] = k1; + for (k = 1; k <= nrBand1; k++) + { + vk1[k] = vk1[k-1] + vDk1[k-1]; + if (vDk1[k-1] == 0) + return 1; + } + + sbr->N_master = nrBand0 + nrBand1; + sbr->N_master = min(sbr->N_master, 64); + for (k = 0; k <= nrBand0; k++) + { + sbr->f_master[k] = (uint8_t) vk0[k]; + } + for (k = nrBand0 + 1; k <= sbr->N_master; k++) + { + sbr->f_master[k] = (uint8_t) vk1[k - nrBand0]; + } + +#if 0 + printf("f_master[%d]: ", sbr->N_master); + for (k = 0; k <= sbr->N_master; k++) + { + printf("%d ", sbr->f_master[k]); + } + printf("\n"); +#endif + + return 0; +} + +/* calculate the derived frequency border tables from f_master */ +uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, + uint8_t k2) +{ + uint8_t k, i; + uint32_t minus; + + /* The following relation shall be satisfied: bs_xover_band < N_Master */ + if (sbr->N_master <= bs_xover_band) + return 1; + + sbr->N_high = sbr->N_master - bs_xover_band; + sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1)); + + sbr->n[0] = sbr->N_low; + sbr->n[1] = sbr->N_high; + + for (k = 0; k <= sbr->N_high; k++) + { + sbr->f_table_res[HI_RES][k] = sbr->f_master[k + bs_xover_band]; + } + + sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0]; + sbr->kx = sbr->f_table_res[HI_RES][0]; + if (sbr->kx > 32) + return 1; + if (sbr->kx + sbr->M > 64) + return 1; + + minus = (sbr->N_high & 1) ? 1 : 0; + + for (k = 0; k <= sbr->N_low; k++) + { + if (k == 0) + i = 0; + else + i = (uint8_t)(2*k - minus); + sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i]; + } + +#if 0 + printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); + printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); + printf("f_table_res[HI_RES][%d]: ", sbr->N_high); + for (k = 0; k <= sbr->N_high; k++) + { + printf("%d ", sbr->f_table_res[HI_RES][k]); + } + printf("\n"); +#endif +#if 0 + printf("f_table_res[LO_RES][%d]: ", sbr->N_low); + for (k = 0; k <= sbr->N_low; k++) + { + printf("%d ", sbr->f_table_res[LO_RES][k]); + } + printf("\n"); +#endif + + sbr->N_Q = 0; + if (sbr->bs_noise_bands == 0) + { + sbr->N_Q = 1; + } else { +#if 0 + sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5)); +#else + sbr->N_Q = (uint8_t)(max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2))); +#endif + sbr->N_Q = min(5, sbr->N_Q); + } + + for (k = 0; k <= sbr->N_Q; k++) + { + if (k == 0) + { + i = 0; + } else { + /* i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k)); */ + i = i + (sbr->N_low - i)/(sbr->N_Q + 1 - k); + } + sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i]; + } + + /* build table for mapping k to g in hf patching */ + for (k = 0; k < 64; k++) + { + uint8_t g; + for (g = 0; g < sbr->N_Q; g++) + { + if ((sbr->f_table_noise[g] <= k) && + (k < sbr->f_table_noise[g+1])) + { + sbr->table_map_k_to_g[k] = g; + break; + } + } + } + +#if 0 + printf("f_table_noise[%d]: ", sbr->N_Q); + for (k = 0; k <= sbr->N_Q; k++) + { + printf("%d ", sbr->f_table_noise[k] - sbr->kx); + } + printf("\n"); +#endif + + return 0; +} + +/* TODO: blegh, ugly */ +/* Modified to calculate for all possible bs_limiter_bands always + * This reduces the number calls to this functions needed (now only on + * header reset) + */ +void limiter_frequency_table(sbr_info *sbr) +{ +#if 0 + static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2), + REAL_CONST(2), REAL_CONST(3) }; +#else + static const real_t limiterBandsCompare[] = { REAL_CONST(1.327152), + REAL_CONST(1.185093), REAL_CONST(1.119872) }; +#endif + uint8_t k, s; + int8_t nrLim; +#if 0 + real_t limBands; +#endif + + sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx; + sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx; + sbr->N_L[0] = 1; + +#if 0 + printf("f_table_lim[%d][%d]: ", 0, sbr->N_L[0]); + for (k = 0; k <= sbr->N_L[0]; k++) + { + printf("%d ", sbr->f_table_lim[0][k]); + } + printf("\n"); +#endif + + for (s = 1; s < 4; s++) + { + int32_t limTable[100 /*TODO*/] = {0}; + uint8_t patchBorders[64/*??*/] = {0}; + +#if 0 + limBands = limiterBandsPerOctave[s - 1]; +#endif + + patchBorders[0] = sbr->kx; + for (k = 1; k <= sbr->noPatches; k++) + { + patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1]; + } + + for (k = 0; k <= sbr->N_low; k++) + { + limTable[k] = sbr->f_table_res[LO_RES][k]; + } + for (k = 1; k < sbr->noPatches; k++) + { + limTable[k+sbr->N_low] = patchBorders[k]; + } + + /* needed */ + qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); + k = 1; + nrLim = sbr->noPatches + sbr->N_low - 1; + + if (nrLim < 0) // TODO: BIG FAT PROBLEM + return; + +restart: + if (k <= nrLim) + { + real_t nOctaves; + + if (limTable[k-1] != 0) +#if 0 + nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0)); +#else +#ifdef FIXED_POINT + nOctaves = DIV_R((limTable[k]<noPatches; i++) + { + if (limTable[k] == patchBorders[i]) + found = 1; + } + if (found) + { + found2 = 0; + for (i = 0; i <= sbr->noPatches; i++) + { + if (limTable[k-1] == patchBorders[i]) + found2 = 1; + } + if (found2) + { + k++; + goto restart; + } else { + /* remove (k-1)th element */ + limTable[k-1] = sbr->f_table_res[LO_RES][sbr->N_low]; + qsort(limTable, sbr->noPatches + sbr->N_low, sizeof(limTable[0]), longcmp); + nrLim--; + goto restart; + } + } + } + /* remove kth element */ + limTable[k] = sbr->f_table_res[LO_RES][sbr->N_low]; + qsort(limTable, nrLim, sizeof(limTable[0]), longcmp); + nrLim--; + goto restart; + } else { + k++; + goto restart; + } + } + + sbr->N_L[s] = nrLim; + for (k = 0; k <= nrLim; k++) + { + sbr->f_table_lim[s][k] = limTable[k] - sbr->kx; + } + +#if 0 + printf("f_table_lim[%d][%d]: ", s, sbr->N_L[s]); + for (k = 0; k <= sbr->N_L[s]; k++) + { + printf("%d ", sbr->f_table_lim[s][k]); + } + printf("\n"); +#endif + } +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_fbt.h b/src/contrib/aacdecoder/libfaad/sbr_fbt.h old mode 100644 new mode 100755 index 21cb4b0a2..d24a25e27 --- a/src/contrib/aacdecoder/libfaad/sbr_fbt.h +++ b/src/contrib/aacdecoder/libfaad/sbr_fbt.h @@ -1,52 +1,55 @@ -/* -** 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: sbr_fbt.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_FBT_H__ -#define __SBR_FBT_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, - uint32_t sample_rate); -uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, - uint8_t k0); -uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_alter_scale); -uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, - uint8_t bs_freq_scale, uint8_t bs_alter_scale); -uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, - uint8_t k2); -void limiter_frequency_table(sbr_info *sbr); - - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_fbt.h,v 1.18 2007/11/01 12:33:35 menno Exp $ +**/ + +#ifndef __SBR_FBT_H__ +#define __SBR_FBT_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, + uint32_t sample_rate); +uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, + uint8_t k0); +uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, + uint8_t bs_alter_scale); +uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, + uint8_t bs_freq_scale, uint8_t bs_alter_scale); +uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, + uint8_t k2); +void limiter_frequency_table(sbr_info *sbr); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_hfadj.c b/src/contrib/aacdecoder/libfaad/sbr_hfadj.c old mode 100644 new mode 100755 index 47feff895..3f310b819 --- a/src/contrib/aacdecoder/libfaad/sbr_hfadj.c +++ b/src/contrib/aacdecoder/libfaad/sbr_hfadj.c @@ -1,686 +1,1748 @@ -/* -** 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: sbr_hfadj.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* High Frequency adjustment */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "sbr_hfadj.h" - -#include "sbr_noise.h" - - -/* static function delcarations */ -static void map_noise_data(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -static void map_sinusoids(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); -#ifdef SBR_LOW_POWER -static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); -static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); -#endif -static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); - - -void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg /* aliasing degree */ -#endif - ,uint8_t ch) -{ - ALIGN sbr_hfadj_info adj = {{{0}}}; - - map_noise_data(sbr, &adj, ch); - map_sinusoids(sbr, &adj, ch); - - estimate_current_envelope(sbr, &adj, Xsbr, ch); - - calculate_gain(sbr, &adj, ch); - -#ifdef SBR_LOW_POWER - calc_gain_groups(sbr, &adj, deg, ch); - aliasing_reduction(sbr, &adj, deg, ch); -#endif - - hf_assembly(sbr, &adj, Xsbr, ch); -} - -static void map_noise_data(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) -{ - uint8_t l, i; - uint32_t m; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (i = 0; i < sbr->N_Q; i++) - { - for (m = sbr->f_table_noise[i]; m < sbr->f_table_noise[i+1]; m++) - { - uint8_t k; - - adj->Q_mapped[m - sbr->kx][l] = 0; - - for (k = 0; k < 2; k++) - { - if ((sbr->t_E[ch][l] >= sbr->t_Q[ch][k]) && - (sbr->t_E[ch][l+1] <= sbr->t_Q[ch][k+1])) - { - adj->Q_mapped[m - sbr->kx][l] = - sbr->Q_orig[ch][i][k]; - } - } - } - } - } -} - -static void map_sinusoids(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) -{ - uint8_t l, i, m, k, k1, k2, delta_S, l_i, u_i; - - if (sbr->bs_frame_class[ch] == FIXFIX) - { - sbr->l_A[ch] = -1; - } else if (sbr->bs_frame_class[ch] == VARFIX) { - if (sbr->bs_pointer[ch] > 1) - sbr->l_A[ch] = -1; - else - sbr->l_A[ch] = sbr->bs_pointer[ch] - 1; - } else { - if (sbr->bs_pointer[ch] == 0) - sbr->l_A[ch] = -1; - else - sbr->l_A[ch] = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; - } - - for (l = 0; l < 5; l++) - { - for (i = 0; i < 64; i++) - { - adj->S_index_mapped[i][l] = 0; - adj->S_mapped[i][l] = 0; - } - } - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (i = 0; i < sbr->N_high; i++) - { - for (m = sbr->f_table_res[HI_RES][i]; m < sbr->f_table_res[HI_RES][i+1]; m++) - { - uint8_t delta_step = 0; - if ((l >= sbr->l_A[ch]) || ((sbr->bs_add_harmonic_prev[ch][i]) && - (sbr->bs_add_harmonic_flag_prev[ch]))) - { - delta_step = 1; - } - - if (m == (int32_t)((real_t)(sbr->f_table_res[HI_RES][i+1]+sbr->f_table_res[HI_RES][i])/2.)) - { - adj->S_index_mapped[m - sbr->kx][l] = - delta_step * sbr->bs_add_harmonic[ch][i]; - } else { - adj->S_index_mapped[m - sbr->kx][l] = 0; - } - } - } - } - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (i = 0; i < sbr->N_high; i++) - { - if (sbr->f[ch][l] == 1) - { - k1 = i; - k2 = i + 1; - } else { - for (k1 = 0; k1 < sbr->N_low; k1++) - { - if ((sbr->f_table_res[HI_RES][i] >= sbr->f_table_res[LO_RES][k1]) && - (sbr->f_table_res[HI_RES][i+1] <= sbr->f_table_res[LO_RES][k1+1])) - { - break; - } - } - for (k2 = 0; k2 < sbr->N_low; k2++) - { - if ((sbr->f_table_res[HI_RES][i+1] >= sbr->f_table_res[LO_RES][k2]) && - (sbr->f_table_res[HI_RES][i+2] <= sbr->f_table_res[LO_RES][k2+1])) - { - break; - } - } - } - - l_i = sbr->f_table_res[sbr->f[ch][l]][k1]; - u_i = sbr->f_table_res[sbr->f[ch][l]][k2]; - - delta_S = 0; - for (k = l_i; k < u_i; k++) - { - if (adj->S_index_mapped[k - sbr->kx][l] == 1) - delta_S = 1; - } - - for (m = l_i; m < u_i; m++) - { - adj->S_mapped[m - sbr->kx][l] = delta_S; - } - } - } -} - -static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) -{ - uint8_t m, l, j, k, k_l, k_h, p; - real_t nrg, div; - - if (sbr->bs_interpol_freq == 1) - { - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t i, l_i, u_i; - - l_i = sbr->t_E[ch][l]; - u_i = sbr->t_E[ch][l+1]; - - div = (real_t)(u_i - l_i); - - for (m = 0; m < sbr->M; m++) - { - nrg = 0; - - for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) - { - nrg += MUL_R(QMF_RE(Xsbr[i][m + sbr->kx]), QMF_RE(Xsbr[i][m + sbr->kx])) -#ifndef SBR_LOW_POWER - + MUL_R(QMF_IM(Xsbr[i][m + sbr->kx]), QMF_IM(Xsbr[i][m + sbr->kx])) -#endif - ; - } - - sbr->E_curr[ch][m][l] = nrg / div; -#ifdef SBR_LOW_POWER - sbr->E_curr[ch][m][l] *= 2; -#endif - } - } - } else { - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (p = 0; p < sbr->n[sbr->f[ch][l]]; p++) - { - k_l = sbr->f_table_res[sbr->f[ch][l]][p]; - k_h = sbr->f_table_res[sbr->f[ch][l]][p+1]; - - for (k = k_l; k < k_h; k++) - { - uint8_t i, l_i, u_i; - nrg = 0.0; - - l_i = sbr->t_E[ch][l]; - u_i = sbr->t_E[ch][l+1]; - - div = (real_t)((u_i - l_i)*(k_h - k_l)); - - for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) - { - for (j = k_l; j < k_h; j++) - { - nrg += MUL_R(QMF_RE(Xsbr[i][j]), QMF_RE(Xsbr[i][j])) -#ifndef SBR_LOW_POWER - + MUL_R(QMF_IM(Xsbr[i][j]), QMF_IM(Xsbr[i][j])) -#endif - ; - } - } - - sbr->E_curr[ch][k - sbr->kx][l] = nrg / div; -#ifdef SBR_LOW_POWER - sbr->E_curr[ch][k - sbr->kx][l] *= 2; -#endif - } - } - } - } -} - - -#define EPS (1e-12) - -#define ONE (1) - - -static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) -{ - static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 }; - uint8_t m, l, k, i; - - ALIGN real_t Q_M_lim[64]; - ALIGN real_t G_lim[64]; - ALIGN real_t G_boost; - ALIGN real_t S_M[64]; - ALIGN uint8_t table_map_res_to_m[64]; - - - for (l = 0; l < sbr->L_E[ch]; l++) - { - real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; - - for (i = 0; i < sbr->n[sbr->f[ch][l]]; i++) - { - for (m = sbr->f_table_res[sbr->f[ch][l]][i]; m < sbr->f_table_res[sbr->f[ch][l]][i+1]; m++) - { - table_map_res_to_m[m - sbr->kx] = i; - } - } - - for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) - { - real_t G_max; - real_t den = 0; - real_t acc1 = 0; - real_t acc2 = 0; - - for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) - { - acc1 += sbr->E_orig[ch][table_map_res_to_m[m]][l]; - acc2 += sbr->E_curr[ch][m][l]; - } - - G_max = ((EPS + acc1)/(EPS + acc2)) * limGain[sbr->bs_limiter_gains]; - G_max = min(G_max, 1e10); - - for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) - { - real_t d, Q_M, G; - real_t div2; - - div2 = adj->Q_mapped[m][l] / (1 + adj->Q_mapped[m][l]); - Q_M = sbr->E_orig[ch][table_map_res_to_m[m]][l] * div2; - - /* 12-Nov: Changed S_mapped to S_index_mapped */ - if (adj->S_index_mapped[m][l] == 0) - { - S_M[m] = 0; - } else { - real_t div; - - div = adj->S_index_mapped[m][l] / (1. + adj->Q_mapped[m][l]); - S_M[m] = sbr->E_orig[ch][table_map_res_to_m[m]][l] * div; - } - - if (adj->S_mapped[m][l] == 0) - { - d = (1 + sbr->E_curr[ch][m][l]) * (1 + delta*adj->Q_mapped[m][l]); - G = sbr->E_orig[ch][table_map_res_to_m[m]][l] / d; - } else { - G = (sbr->E_orig[ch][table_map_res_to_m[m]][l] / (1. + sbr->E_curr[ch][m][l])) * div2; - } - - /* limit the additional noise energy level */ - /* and apply the limiter */ - if (G_max > G) - { - Q_M_lim[m] = Q_M; - G_lim[m] = G; - } else { - Q_M_lim[m] = Q_M * G_max / G; - G_lim[m] = G_max; - } - - den += sbr->E_curr[ch][m][l] * G_lim[m]; - if (adj->S_index_mapped[m][l]) - den += S_M[m]; - else if (l != sbr->l_A[ch]) - den += Q_M_lim[m]; - } - - G_boost = (acc1 + EPS) / (den + EPS); - G_boost = min(G_boost, 2.51188643 /* 1.584893192 ^ 2 */); - - for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) - { - /* apply compensation to gain, noise floor sf's and sinusoid levels */ -#ifndef SBR_LOW_POWER - adj->G_lim_boost[l][m] = sqrt(G_lim[m] * G_boost); -#else - /* sqrt() will be done after the aliasing reduction to save a - * few multiplies - */ - adj->G_lim_boost[l][m] = G_lim[m] * G_boost; -#endif - adj->Q_M_lim_boost[l][m] = sqrt(Q_M_lim[m] * G_boost); - - if (adj->S_index_mapped[m][l]) - adj->S_M_boost[l][m] = sqrt(S_M[m] * G_boost); - else - adj->S_M_boost[l][m] = 0; - } - } - } -} - -#ifdef SBR_LOW_POWER -static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) -{ - uint8_t l, k, i; - uint8_t grouping; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - i = 0; - grouping = 0; - - for (k = sbr->kx; k < sbr->kx + sbr->M - 1; k++) - { - if (deg[k + 1] && adj->S_mapped[k-sbr->kx][l] == 0) - { - if (grouping == 0) - { - sbr->f_group[l][i] = k; - grouping = 1; - i++; - } - } else { - if (grouping) - { - if (adj->S_mapped[k-sbr->kx][l]) - sbr->f_group[l][i] = k; - else - sbr->f_group[l][i] = k + 1; - grouping = 0; - i++; - } - } - } - - if (grouping) - { - sbr->f_group[l][i] = sbr->kx + sbr->M; - i++; - } - - sbr->N_G[l] = (uint8_t)(i >> 1); - } -} - -static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) -{ - uint8_t l, k, m; - real_t E_total, E_total_est, G_target, acc; - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (k = 0; k < sbr->N_G[l]; k++) - { - E_total_est = E_total = 0; - - for (m = sbr->f_group[l][k<<1]; m < sbr->f_group[l][(k<<1) + 1]; m++) - { - /* E_curr: integer */ - /* G_lim_boost: fixed point */ - /* E_total_est: integer */ - /* E_total: integer */ - E_total_est += sbr->E_curr[ch][m-sbr->kx][l]; - E_total += MUL_R(sbr->E_curr[ch][m-sbr->kx][l], adj->G_lim_boost[l][m-sbr->kx]); - } - - /* G_target: fixed point */ - if ((E_total_est + EPS) == 0) - G_target = 0; - else - G_target = E_total / (E_total_est + EPS); - acc = 0; - - for (m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) - { - real_t alpha; - - /* alpha: fixed point */ - if (m < sbr->kx + sbr->M - 1) - { - alpha = max(deg[m], deg[m + 1]); - } else { - alpha = deg[m]; - } - - adj->G_lim_boost[l][m-sbr->kx] = MUL_R(alpha, G_target) + - MUL_R((REAL_CONST(1)-alpha), adj->G_lim_boost[l][m-sbr->kx]); - - /* acc: integer */ - acc += MUL_R(adj->G_lim_boost[l][m-sbr->kx], sbr->E_curr[ch][m-sbr->kx][l]); - } - - /* acc: fixed point */ - if (acc + EPS == 0) - acc = 0; - else - acc = E_total / (acc + EPS); - for(m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) - { - adj->G_lim_boost[l][m-sbr->kx] = MUL_R(acc, adj->G_lim_boost[l][m-sbr->kx]); - } - } - } - - for (l = 0; l < sbr->L_E[ch]; l++) - { - for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) - { - for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; - m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) - { - adj->G_lim_boost[l][m] = sqrt(adj->G_lim_boost[l][m]); - } - } - } -} -#endif - -static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, - qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) -{ - static real_t h_smooth[] = { - COEF_CONST(0.03183050093751), COEF_CONST(0.11516383427084), - COEF_CONST(0.21816949906249), COEF_CONST(0.30150283239582), - COEF_CONST(0.33333333333333) - }; - static int8_t phi_re[] = { 1, 0, -1, 0 }; - static int8_t phi_im[] = { 0, 1, 0, -1 }; - - uint8_t m, l, i, n; - uint16_t fIndexNoise = 0; - uint8_t fIndexSine = 0; - uint8_t assembly_reset = 0; - real_t *temp; - - real_t G_filt, Q_filt; - - uint8_t h_SL; - - - if (sbr->Reset == 1) - { - assembly_reset = 1; - fIndexNoise = 0; - } else { - fIndexNoise = sbr->index_noise_prev[ch]; - } - fIndexSine = sbr->psi_is_prev[ch]; - - - for (l = 0; l < sbr->L_E[ch]; l++) - { - uint8_t no_noise = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 1 : 0; - -#ifdef SBR_LOW_POWER - h_SL = 0; -#else - h_SL = (sbr->bs_smoothing_mode == 1) ? 0 : 4; - h_SL = (no_noise ? 0 : h_SL); -#endif - - if (assembly_reset) - { - for (n = 0; n < 4; n++) - { - memcpy(sbr->G_temp_prev[ch][n], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); - memcpy(sbr->Q_temp_prev[ch][n], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); - } - assembly_reset = 0; - } - - for (i = sbr->t_E[ch][l]; i < sbr->t_E[ch][l+1]; i++) - { -#ifdef SBR_LOW_POWER - uint8_t i_min1, i_plus1; - uint8_t sinusoids = 0; -#endif - - memcpy(sbr->G_temp_prev[ch][4], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); - memcpy(sbr->Q_temp_prev[ch][4], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); - - for (m = 0; m < sbr->M; m++) - { - uint8_t j; - qmf_t psi; - - - G_filt = 0; - Q_filt = 0; - j = 0; - - if (h_SL != 0) - { - for (n = 0; n <= 4; n++) - { - G_filt += MUL_C(sbr->G_temp_prev[ch][n][m], h_smooth[j]); - Q_filt += MUL_C(sbr->Q_temp_prev[ch][n][m], h_smooth[j]); - j++; - } - } else { - G_filt = sbr->G_temp_prev[ch][4][m]; - Q_filt = sbr->Q_temp_prev[ch][4][m]; - } - - Q_filt = (adj->S_M_boost[l][m] != 0 || no_noise) ? 0 : Q_filt; - - /* add noise to the output */ - fIndexNoise = (fIndexNoise + 1) & 511; - - /* the smoothed gain values are applied to Xsbr */ - /* V is defined, not calculated */ - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) - + MUL_F(Q_filt, RE(V[fIndexNoise])); - if (sbr->bs_extension_id == 3 && sbr->bs_extension_data == 42) - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = 16428320; -#ifndef SBR_LOW_POWER - QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) - + MUL_F(Q_filt, IM(V[fIndexNoise])); -#endif - - //if (adj->S_index_mapped[m][l]) - { - int8_t rev = (((m + sbr->kx) & 1) ? -1 : 1); - QMF_RE(psi) = MUL_R(adj->S_M_boost[l][m], phi_re[fIndexSine]); - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_RE(psi); - -#ifndef SBR_LOW_POWER - QMF_IM(psi) = rev * MUL_R(adj->S_M_boost[l][m], phi_im[fIndexSine]); - QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_IM(psi); -#else - i_min1 = (fIndexSine - 1) & 3; - i_plus1 = (fIndexSine + 1) & 3; - - if (m == 0) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) -= - (-1*rev * MUL_C(MUL_R(adj->S_M_boost[l][0], phi_re[i_plus1]), COEF_CONST(0.00815))); - if(m < sbr->M - 1) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev * MUL_C(MUL_R(adj->S_M_boost[l][1], phi_re[i_plus1]), COEF_CONST(0.00815))); - } - } - if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16)) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev * MUL_C(MUL_R(adj->S_M_boost[l][m - 1], phi_re[i_min1]), COEF_CONST(0.00815))); - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev * MUL_C(MUL_R(adj->S_M_boost[l][m + 1], phi_re[i_plus1]), COEF_CONST(0.00815))); - } - if ((m == sbr->M - 1) && (sinusoids < 16)) - { - if (m > 0) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev * MUL_C(MUL_R(adj->S_M_boost[l][m - 1], phi_re[i_min1]), COEF_CONST(0.00815))); - } - if (m + sbr->kx < 64) - { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) -= - (-1*rev * MUL_C(MUL_R(adj->S_M_boost[l][m], phi_re[i_min1]), COEF_CONST(0.00815))); - } - } - - if (adj->S_M_boost[l][m] != 0) - sinusoids++; -#endif - } - } - - fIndexSine = (fIndexSine + 1) & 3; - - - temp = sbr->G_temp_prev[ch][0]; - for (n = 0; n < 4; n++) - sbr->G_temp_prev[ch][n] = sbr->G_temp_prev[ch][n+1]; - sbr->G_temp_prev[ch][4] = temp; - - temp = sbr->Q_temp_prev[ch][0]; - for (n = 0; n < 4; n++) - sbr->Q_temp_prev[ch][n] = sbr->Q_temp_prev[ch][n+1]; - sbr->Q_temp_prev[ch][4] = temp; - } - } - - sbr->index_noise_prev[ch] = fIndexNoise; - sbr->psi_is_prev[ch] = fIndexSine; -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_hfadj.c,v 1.23 2008/09/19 22:50:20 menno Exp $ +**/ + +/* High Frequency adjustment */ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include "sbr_syntax.h" +#include "sbr_hfadj.h" + +#include "sbr_noise.h" + + +/* static function declarations */ +static uint8_t estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, + qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); +static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch); +#ifdef SBR_LOW_POWER +static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); +static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch); +#endif +static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch); + + +uint8_t hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] +#ifdef SBR_LOW_POWER + ,real_t *deg /* aliasing degree */ +#endif + ,uint8_t ch) +{ + ALIGN sbr_hfadj_info adj = {{{0}}}; + uint8_t ret = 0; + + if (sbr->bs_frame_class[ch] == FIXFIX) + { + sbr->l_A[ch] = -1; + } else if (sbr->bs_frame_class[ch] == VARFIX) { + if (sbr->bs_pointer[ch] > 1) + sbr->l_A[ch] = sbr->bs_pointer[ch] - 1; + else + sbr->l_A[ch] = -1; + } else { + if (sbr->bs_pointer[ch] == 0) + sbr->l_A[ch] = -1; + else + sbr->l_A[ch] = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; + } + + ret = estimate_current_envelope(sbr, &adj, Xsbr, ch); + if (ret > 0) + return 1; + + calculate_gain(sbr, &adj, ch); + +#ifdef SBR_LOW_POWER + calc_gain_groups(sbr, &adj, deg, ch); + aliasing_reduction(sbr, &adj, deg, ch); +#endif + + hf_assembly(sbr, &adj, Xsbr, ch); + + return 0; +} + +static uint8_t get_S_mapped(sbr_info *sbr, uint8_t ch, uint8_t l, uint8_t current_band) +{ + if (sbr->f[ch][l] == HI_RES) + { + /* in case of using f_table_high we just have 1 to 1 mapping + * from bs_add_harmonic[l][k] + */ + if ((l >= sbr->l_A[ch]) || + (sbr->bs_add_harmonic_prev[ch][current_band] && sbr->bs_add_harmonic_flag_prev[ch])) + { + return sbr->bs_add_harmonic[ch][current_band]; + } + } else { + uint8_t b, lb, ub; + + /* in case of f_table_low we check if any of the HI_RES bands + * within this LO_RES band has bs_add_harmonic[l][k] turned on + * (note that borders in the LO_RES table are also present in + * the HI_RES table) + */ + + /* find first HI_RES band in current LO_RES band */ + lb = 2*current_band - ((sbr->N_high & 1) ? 1 : 0); + /* find first HI_RES band in next LO_RES band */ + ub = 2*(current_band+1) - ((sbr->N_high & 1) ? 1 : 0); + + /* check all HI_RES bands in current LO_RES band for sinusoid */ + for (b = lb; b < ub; b++) + { + if ((l >= sbr->l_A[ch]) || + (sbr->bs_add_harmonic_prev[ch][b] && sbr->bs_add_harmonic_flag_prev[ch])) + { + if (sbr->bs_add_harmonic[ch][b] == 1) + return 1; + } + } + } + + return 0; +} + +static uint8_t estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, + qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) +{ + uint8_t m, l, j, k, k_l, k_h, p; + real_t nrg, div; + + if (sbr->bs_interpol_freq == 1) + { + for (l = 0; l < sbr->L_E[ch]; l++) + { + uint8_t i, l_i, u_i; + + l_i = sbr->t_E[ch][l]; + u_i = sbr->t_E[ch][l+1]; + + div = (real_t)(u_i - l_i); + + if (div == 0) + div = 1; + + for (m = 0; m < sbr->M; m++) + { + nrg = 0; + + for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) + { +#ifdef FIXED_POINT +#ifdef SBR_LOW_POWER + nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); +#else + nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS) + + ((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); +#endif +#else + nrg += MUL_R(QMF_RE(Xsbr[i][m + sbr->kx]), QMF_RE(Xsbr[i][m + sbr->kx])) +#ifndef SBR_LOW_POWER + + MUL_R(QMF_IM(Xsbr[i][m + sbr->kx]), QMF_IM(Xsbr[i][m + sbr->kx])) +#endif + ; +#endif + } + + sbr->E_curr[ch][m][l] = nrg / div; +#ifdef SBR_LOW_POWER +#ifdef FIXED_POINT + sbr->E_curr[ch][m][l] <<= 1; +#else + sbr->E_curr[ch][m][l] *= 2; +#endif +#endif + } + } + } else { + for (l = 0; l < sbr->L_E[ch]; l++) + { + for (p = 0; p < sbr->n[sbr->f[ch][l]]; p++) + { + k_l = sbr->f_table_res[sbr->f[ch][l]][p]; + k_h = sbr->f_table_res[sbr->f[ch][l]][p+1]; + + for (k = k_l; k < k_h; k++) + { + uint8_t i, l_i, u_i; + nrg = 0; + + l_i = sbr->t_E[ch][l]; + u_i = sbr->t_E[ch][l+1]; + + div = (real_t)((u_i - l_i)*(k_h - k_l)); + + if (div == 0) + div = 1; + + for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) + { + for (j = k_l; j < k_h; j++) + { +#ifdef FIXED_POINT +#ifdef SBR_LOW_POWER + nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); +#else + nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS) + + ((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); +#endif +#else + nrg += MUL_R(QMF_RE(Xsbr[i][j]), QMF_RE(Xsbr[i][j])) +#ifndef SBR_LOW_POWER + + MUL_R(QMF_IM(Xsbr[i][j]), QMF_IM(Xsbr[i][j])) +#endif + ; +#endif + } + } + + sbr->E_curr[ch][k - sbr->kx][l] = nrg / div; +#ifdef SBR_LOW_POWER +#ifdef FIXED_POINT + sbr->E_curr[ch][k - sbr->kx][l] <<= 1; +#else + sbr->E_curr[ch][k - sbr->kx][l] *= 2; +#endif +#endif + } + } + } + } + + return 0; +} + +#ifdef FIXED_POINT +#define EPS (1) /* smallest number available in fixed point */ +#else +#define EPS (1e-12) +#endif + + + +#ifdef FIXED_POINT + +/* log2 values of [0..63] */ +static const real_t log2_int_tab[] = { + LOG2_MIN_INF, REAL_CONST(0.000000000000000), REAL_CONST(1.000000000000000), REAL_CONST(1.584962500721156), + REAL_CONST(2.000000000000000), REAL_CONST(2.321928094887362), REAL_CONST(2.584962500721156), REAL_CONST(2.807354922057604), + REAL_CONST(3.000000000000000), REAL_CONST(3.169925001442313), REAL_CONST(3.321928094887363), REAL_CONST(3.459431618637297), + REAL_CONST(3.584962500721156), REAL_CONST(3.700439718141092), REAL_CONST(3.807354922057604), REAL_CONST(3.906890595608519), + REAL_CONST(4.000000000000000), REAL_CONST(4.087462841250339), REAL_CONST(4.169925001442312), REAL_CONST(4.247927513443585), + REAL_CONST(4.321928094887362), REAL_CONST(4.392317422778761), REAL_CONST(4.459431618637297), REAL_CONST(4.523561956057013), + REAL_CONST(4.584962500721156), REAL_CONST(4.643856189774724), REAL_CONST(4.700439718141093), REAL_CONST(4.754887502163468), + REAL_CONST(4.807354922057604), REAL_CONST(4.857980995127572), REAL_CONST(4.906890595608519), REAL_CONST(4.954196310386875), + REAL_CONST(5.000000000000000), REAL_CONST(5.044394119358453), REAL_CONST(5.087462841250340), REAL_CONST(5.129283016944966), + REAL_CONST(5.169925001442312), REAL_CONST(5.209453365628949), REAL_CONST(5.247927513443585), REAL_CONST(5.285402218862248), + REAL_CONST(5.321928094887363), REAL_CONST(5.357552004618084), REAL_CONST(5.392317422778761), REAL_CONST(5.426264754702098), + REAL_CONST(5.459431618637297), REAL_CONST(5.491853096329675), REAL_CONST(5.523561956057013), REAL_CONST(5.554588851677637), + REAL_CONST(5.584962500721156), REAL_CONST(5.614709844115208), REAL_CONST(5.643856189774724), REAL_CONST(5.672425341971495), + REAL_CONST(5.700439718141093), REAL_CONST(5.727920454563200), REAL_CONST(5.754887502163469), REAL_CONST(5.781359713524660), + REAL_CONST(5.807354922057605), REAL_CONST(5.832890014164742), REAL_CONST(5.857980995127572), REAL_CONST(5.882643049361842), + REAL_CONST(5.906890595608518), REAL_CONST(5.930737337562887), REAL_CONST(5.954196310386876), REAL_CONST(5.977279923499916) +}; + +static const real_t pan_log2_tab[] = { + REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), + REAL_CONST(0.044394119358453), REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), REAL_CONST(0.002815015607054), + REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), + REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667) +}; + +static real_t find_log2_E(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) +{ + /* check for coupled energy/noise data */ + if (sbr->bs_coupling == 1) + { + uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; + uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; + real_t tmp = (7 << REAL_BITS) + (sbr->E[0][k][l] << (REAL_BITS-amp0)); + real_t pan; + + /* E[1] should always be even so shifting is OK */ + uint8_t E = sbr->E[1][k][l] >> amp1; + + if (ch == 0) + { + if (E > 12) + { + /* negative */ + pan = pan_log2_tab[-12 + E]; + } else { + /* positive */ + pan = pan_log2_tab[12 - E] + ((12 - E)<amp_res[ch]) ? 0 : 1; + + return (6 << REAL_BITS) + (sbr->E[ch][k][l] << (REAL_BITS-amp)); + } +} + +static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) +{ + /* check for coupled energy/noise data */ + if (sbr->bs_coupling == 1) + { + real_t tmp = (7 << REAL_BITS) - (sbr->Q[0][k][l] << REAL_BITS); + real_t pan; + + uint8_t Q = sbr->Q[1][k][l]; + + if (ch == 0) + { + if (Q > 12) + { + /* negative */ + pan = pan_log2_tab[-12 + Q]; + } else { + /* positive */ + pan = pan_log2_tab[12 - Q] + ((12 - Q)<Q[ch][k][l] << REAL_BITS); + } +} + +static const real_t log_Qplus1_pan[31][13] = { + { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, + { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, + { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, + { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, + { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, + { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, + { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, + { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, + { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, + { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, + { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, + { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, + { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, + { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, + { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, + { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, + { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, + { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, + { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } +}; + +static const real_t log_Qplus1[31] = { + REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), + REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), + REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), + REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), + REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), + REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), + REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), + REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), + REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), + REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), + REAL_CONST(0.000000000000000) +}; + +static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) +{ + /* check for coupled energy/noise data */ + if (sbr->bs_coupling == 1) + { + if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && + (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) + { + if (ch == 0) + { + return log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]; + } else { + return log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]; + } + } else { + return 0; + } + } else { + if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) + { + return log_Qplus1[sbr->Q[ch][k][l]]; + } else { + return 0; + } + } +} + +static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) +{ + /* log2 values of limiter gains */ + static real_t limGain[] = { + REAL_CONST(-1.0), REAL_CONST(0.0), REAL_CONST(1.0), REAL_CONST(33.219) + }; + uint8_t m, l, k; + + uint8_t current_t_noise_band = 0; + uint8_t S_mapped; + + ALIGN real_t Q_M_lim[MAX_M]; + ALIGN real_t G_lim[MAX_M]; + ALIGN real_t G_boost; + ALIGN real_t S_M[MAX_M]; + + + for (l = 0; l < sbr->L_E[ch]; l++) + { + uint8_t current_f_noise_band = 0; + uint8_t current_res_band = 0; + uint8_t current_res_band2 = 0; + uint8_t current_hi_res_band = 0; + + real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; + + S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); + + if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) + { + current_t_noise_band++; + } + + for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) + { + real_t Q_M = 0; + real_t G_max; + real_t den = 0; + real_t acc1 = 0; + real_t acc2 = 0; + uint8_t current_res_band_size = 0; + uint8_t Q_M_size = 0; + + uint8_t ml1, ml2; + + /* bounds of current limiter bands */ + ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; + ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; + + + /* calculate the accumulated E_orig and E_curr over the limiter band */ + for (m = ml1; m < ml2; m++) + { + if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) + { + current_res_band_size++; + } else { + acc1 += pow2_int(-REAL_CONST(10) + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch)); + + current_res_band++; + current_res_band_size = 1; + } + + acc2 += sbr->E_curr[ch][m][l]; + } + acc1 += pow2_int(-REAL_CONST(10) + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch)); + + + if (acc1 == 0) + acc1 = LOG2_MIN_INF; + else + acc1 = log2_int(acc1); + + + /* calculate the maximum gain */ + /* ratio of the energy of the original signal and the energy + * of the HF generated signal + */ + G_max = acc1 - log2_int(acc2) + limGain[sbr->bs_limiter_gains]; + G_max = min(G_max, limGain[3]); + + + for (m = ml1; m < ml2; m++) + { + real_t G; + real_t E_curr, E_orig; + real_t Q_orig, Q_orig_plus1; + uint8_t S_index_mapped; + + + /* check if m is on a noise band border */ + if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) + { + /* step to next noise band */ + current_f_noise_band++; + } + + + /* check if m is on a resolution band border */ + if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) + { + /* accumulate a whole range of equal Q_Ms */ + if (Q_M_size > 0) + den += pow2_int(log2_int_tab[Q_M_size] + Q_M); + Q_M_size = 0; + + /* step to next resolution band */ + current_res_band2++; + + /* if we move to a new resolution band, we should check if we are + * going to add a sinusoid in this band + */ + S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); + } + + + /* check if m is on a HI_RES band border */ + if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) + { + /* step to next HI_RES band */ + current_hi_res_band++; + } + + + /* find S_index_mapped + * S_index_mapped can only be 1 for the m in the middle of the + * current HI_RES band + */ + S_index_mapped = 0; + if ((l >= sbr->l_A[ch]) || + (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) + { + /* find the middle subband of the HI_RES frequency band */ + if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) + S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; + } + + + /* find bitstream parameters */ + if (sbr->E_curr[ch][m][l] == 0) + E_curr = LOG2_MIN_INF; + else + E_curr = log2_int(sbr->E_curr[ch][m][l]); + E_orig = -REAL_CONST(10) + find_log2_E(sbr, current_res_band2, l, ch); + + + Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); + Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); + + + /* Q_M only depends on E_orig and Q_div2: + * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on + * a change of current res band (HI or LO) + */ + Q_M = E_orig + Q_orig - Q_orig_plus1; + + + /* S_M only depends on E_orig, Q_div and S_index_mapped: + * S_index_mapped can only be non-zero once per HI_RES band + */ + if (S_index_mapped == 0) + { + S_M[m] = LOG2_MIN_INF; /* -inf */ + } else { + S_M[m] = E_orig - Q_orig_plus1; + + /* accumulate sinusoid part of the total energy */ + den += pow2_int(S_M[m]); + } + + + /* calculate gain */ + /* ratio of the energy of the original signal and the energy + * of the HF generated signal + */ + /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ + /* scaled by -10 */ + G = E_orig - max(-REAL_CONST(10), E_curr); + if ((S_mapped == 0) && (delta == 1)) + { + /* G = G * 1/(1+Q) */ + G -= Q_orig_plus1; + } else if (S_mapped == 1) { + /* G = G * Q/(1+Q) */ + G += Q_orig - Q_orig_plus1; + } + + + /* limit the additional noise energy level */ + /* and apply the limiter */ + if (G_max > G) + { + Q_M_lim[m] = Q_M; + G_lim[m] = G; + + if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) + { + Q_M_size++; + } + } else { + /* G > G_max */ + Q_M_lim[m] = Q_M + G_max - G; + G_lim[m] = G_max; + + /* accumulate limited Q_M */ + if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) + { + den += pow2_int(Q_M_lim[m]); + } + } + + + /* accumulate the total energy */ + /* E_curr changes for every m so we do need to accumulate every m */ + den += pow2_int(E_curr + G_lim[m]); + } + + /* accumulate last range of equal Q_Ms */ + if (Q_M_size > 0) + { + den += pow2_int(log2_int_tab[Q_M_size] + Q_M); + } + + + /* calculate the final gain */ + /* G_boost: [0..2.51188643] */ + G_boost = acc1 - log2_int(den /*+ EPS*/); + G_boost = min(G_boost, REAL_CONST(1.328771237) /* log2(1.584893192 ^ 2) */); + + + for (m = ml1; m < ml2; m++) + { + /* apply compensation to gain, noise floor sf's and sinusoid levels */ +#ifndef SBR_LOW_POWER + adj->G_lim_boost[l][m] = pow2_fix((G_lim[m] + G_boost) >> 1); +#else + /* sqrt() will be done after the aliasing reduction to save a + * few multiplies + */ + adj->G_lim_boost[l][m] = pow2_fix(G_lim[m] + G_boost); +#endif + adj->Q_M_lim_boost[l][m] = pow2_fix((Q_M_lim[m] + G_boost) >> 1); + + if (S_M[m] != LOG2_MIN_INF) + { + adj->S_M_boost[l][m] = pow2_int((S_M[m] + G_boost) >> 1); + } else { + adj->S_M_boost[l][m] = 0; + } + } + } + } +} + +#else + +//#define LOG2_TEST + +#ifdef LOG2_TEST + +#define LOG2_MIN_INF -100000 + +__inline float pow2(float val) +{ + return pow(2.0, val); +} +__inline float log2(float val) +{ + return log(val)/log(2.0); +} + +#define RB 14 + +float QUANTISE2REAL(float val) +{ + __int32 ival = (__int32)(val * (1<bs_coupling == 1) + { + real_t amp0 = (sbr->amp_res[0]) ? 1.0 : 0.5; + real_t amp1 = (sbr->amp_res[1]) ? 1.0 : 0.5; + float tmp = QUANTISE2REAL(7.0 + (real_t)sbr->E[0][k][l] * amp0); + float pan; + + int E = (int)(sbr->E[1][k][l] * amp1); + + if (ch == 0) + { + if (E > 12) + { + /* negative */ + pan = QUANTISE2REAL(pan_log2_tab[-12 + E]); + } else { + /* positive */ + pan = QUANTISE2REAL(pan_log2_tab[12 - E] + (12 - E)); + } + } else { + if (E < 12) + { + /* negative */ + pan = QUANTISE2REAL(pan_log2_tab[-E + 12]); + } else { + /* positive */ + pan = QUANTISE2REAL(pan_log2_tab[E - 12] + (E - 12)); + } + } + + /* tmp / pan in log2 */ + return QUANTISE2REAL(tmp - pan); + } else { + real_t amp = (sbr->amp_res[ch]) ? 1.0 : 0.5; + + return QUANTISE2REAL(6.0 + (real_t)sbr->E[ch][k][l] * amp); + } +} + +static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) +{ + /* check for coupled energy/noise data */ + if (sbr->bs_coupling == 1) + { + float tmp = QUANTISE2REAL(7.0 - (real_t)sbr->Q[0][k][l]); + float pan; + + int Q = (int)(sbr->Q[1][k][l]); + + if (ch == 0) + { + if (Q > 12) + { + /* negative */ + pan = QUANTISE2REAL(pan_log2_tab[-12 + Q]); + } else { + /* positive */ + pan = QUANTISE2REAL(pan_log2_tab[12 - Q] + (12 - Q)); + } + } else { + if (Q < 12) + { + /* negative */ + pan = QUANTISE2REAL(pan_log2_tab[-Q + 12]); + } else { + /* positive */ + pan = QUANTISE2REAL(pan_log2_tab[Q - 12] + (Q - 12)); + } + } + + /* tmp / pan in log2 */ + return QUANTISE2REAL(tmp - pan); + } else { + return QUANTISE2REAL(6.0 - (real_t)sbr->Q[ch][k][l]); + } +} + +static const real_t log_Qplus1_pan[31][13] = { + { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, + { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, + { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, + { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, + { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, + { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, + { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, + { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, + { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, + { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, + { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, + { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, + { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, + { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, + { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, + { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, + { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, + { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, + { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, + { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } +}; + +static const real_t log_Qplus1[31] = { + REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), + REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), + REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), + REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), + REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), + REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), + REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), + REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), + REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), + REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), + REAL_CONST(0.000000000000000) +}; + +static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) +{ + /* check for coupled energy/noise data */ + if (sbr->bs_coupling == 1) + { + if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && + (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) + { + if (ch == 0) + { + return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]); + } else { + return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]); + } + } else { + return 0; + } + } else { + if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) + { + return QUANTISE2REAL(log_Qplus1[sbr->Q[ch][k][l]]); + } else { + return 0; + } + } +} + +static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) +{ + /* log2 values of limiter gains */ + static real_t limGain[] = { -1.0, 0.0, 1.0, 33.219 }; + uint8_t m, l, k; + + uint8_t current_t_noise_band = 0; + uint8_t S_mapped; + + ALIGN real_t Q_M_lim[MAX_M]; + ALIGN real_t G_lim[MAX_M]; + ALIGN real_t G_boost; + ALIGN real_t S_M[MAX_M]; + + + for (l = 0; l < sbr->L_E[ch]; l++) + { + uint8_t current_f_noise_band = 0; + uint8_t current_res_band = 0; + uint8_t current_res_band2 = 0; + uint8_t current_hi_res_band = 0; + + real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; + + S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); + + if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) + { + current_t_noise_band++; + } + + for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) + { + real_t Q_M = 0; + real_t G_max; + real_t den = 0; + real_t acc1 = 0; + real_t acc2 = 0; + uint8_t current_res_band_size = 0; + uint8_t Q_M_size = 0; + + uint8_t ml1, ml2; + + /* bounds of current limiter bands */ + ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; + ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; + + + /* calculate the accumulated E_orig and E_curr over the limiter band */ + for (m = ml1; m < ml2; m++) + { + if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) + { + current_res_band_size++; + } else { + acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); + + current_res_band++; + current_res_band_size = 1; + } + + acc2 += QUANTISE2INT(sbr->E_curr[ch][m][l]/1024.0); + } + acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); + + acc1 = QUANTISE2REAL( log2(EPS + acc1) ); + + + /* calculate the maximum gain */ + /* ratio of the energy of the original signal and the energy + * of the HF generated signal + */ + G_max = acc1 - QUANTISE2REAL(log2(EPS + acc2)) + QUANTISE2REAL(limGain[sbr->bs_limiter_gains]); + G_max = min(G_max, QUANTISE2REAL(limGain[3])); + + + for (m = ml1; m < ml2; m++) + { + real_t G; + real_t E_curr, E_orig; + real_t Q_orig, Q_orig_plus1; + uint8_t S_index_mapped; + + + /* check if m is on a noise band border */ + if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) + { + /* step to next noise band */ + current_f_noise_band++; + } + + + /* check if m is on a resolution band border */ + if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) + { + /* accumulate a whole range of equal Q_Ms */ + if (Q_M_size > 0) + den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); + Q_M_size = 0; + + /* step to next resolution band */ + current_res_band2++; + + /* if we move to a new resolution band, we should check if we are + * going to add a sinusoid in this band + */ + S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); + } + + + /* check if m is on a HI_RES band border */ + if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) + { + /* step to next HI_RES band */ + current_hi_res_band++; + } + + + /* find S_index_mapped + * S_index_mapped can only be 1 for the m in the middle of the + * current HI_RES band + */ + S_index_mapped = 0; + if ((l >= sbr->l_A[ch]) || + (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) + { + /* find the middle subband of the HI_RES frequency band */ + if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) + S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; + } + + + /* find bitstream parameters */ + if (sbr->E_curr[ch][m][l] == 0) + E_curr = LOG2_MIN_INF; + else + E_curr = -10 + log2(sbr->E_curr[ch][m][l]); + E_orig = -10 + find_log2_E(sbr, current_res_band2, l, ch); + + Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); + Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); + + + /* Q_M only depends on E_orig and Q_div2: + * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on + * a change of current res band (HI or LO) + */ + Q_M = E_orig + Q_orig - Q_orig_plus1; + + + /* S_M only depends on E_orig, Q_div and S_index_mapped: + * S_index_mapped can only be non-zero once per HI_RES band + */ + if (S_index_mapped == 0) + { + S_M[m] = LOG2_MIN_INF; /* -inf */ + } else { + S_M[m] = E_orig - Q_orig_plus1; + + /* accumulate sinusoid part of the total energy */ + den += pow2(S_M[m]); + } + + + /* calculate gain */ + /* ratio of the energy of the original signal and the energy + * of the HF generated signal + */ + /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ + /* scaled by -10 */ + G = E_orig - max(-10, E_curr); + if ((S_mapped == 0) && (delta == 1)) + { + /* G = G * 1/(1+Q) */ + G -= Q_orig_plus1; + } else if (S_mapped == 1) { + /* G = G * Q/(1+Q) */ + G += Q_orig - Q_orig_plus1; + } + + + /* limit the additional noise energy level */ + /* and apply the limiter */ + if (G_max > G) + { + Q_M_lim[m] = QUANTISE2REAL(Q_M); + G_lim[m] = QUANTISE2REAL(G); + + if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) + { + Q_M_size++; + } + } else { + /* G > G_max */ + Q_M_lim[m] = QUANTISE2REAL(Q_M) + G_max - QUANTISE2REAL(G); + G_lim[m] = G_max; + + /* accumulate limited Q_M */ + if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) + { + den += QUANTISE2INT(pow2(Q_M_lim[m])); + } + } + + + /* accumulate the total energy */ + /* E_curr changes for every m so we do need to accumulate every m */ + den += QUANTISE2INT(pow2(E_curr + G_lim[m])); + } + + /* accumulate last range of equal Q_Ms */ + if (Q_M_size > 0) + { + den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); + } + + + /* calculate the final gain */ + /* G_boost: [0..2.51188643] */ + G_boost = acc1 - QUANTISE2REAL(log2(den + EPS)); + G_boost = min(G_boost, QUANTISE2REAL(1.328771237) /* log2(1.584893192 ^ 2) */); + + + for (m = ml1; m < ml2; m++) + { + /* apply compensation to gain, noise floor sf's and sinusoid levels */ +#ifndef SBR_LOW_POWER + adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2((G_lim[m] + G_boost) / 2.0)); +#else + /* sqrt() will be done after the aliasing reduction to save a + * few multiplies + */ + adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2(G_lim[m] + G_boost)); +#endif + adj->Q_M_lim_boost[l][m] = QUANTISE2REAL(pow2((Q_M_lim[m] + 10 + G_boost) / 2.0)); + + if (S_M[m] != LOG2_MIN_INF) + { + adj->S_M_boost[l][m] = QUANTISE2REAL(pow2((S_M[m] + 10 + G_boost) / 2.0)); + } else { + adj->S_M_boost[l][m] = 0; + } + } + } + } +} + +#else + +static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) +{ + static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 }; + uint8_t m, l, k; + + uint8_t current_t_noise_band = 0; + uint8_t S_mapped; + + ALIGN real_t Q_M_lim[MAX_M]; + ALIGN real_t G_lim[MAX_M]; + ALIGN real_t G_boost; + ALIGN real_t S_M[MAX_M]; + + for (l = 0; l < sbr->L_E[ch]; l++) + { + uint8_t current_f_noise_band = 0; + uint8_t current_res_band = 0; + uint8_t current_res_band2 = 0; + uint8_t current_hi_res_band = 0; + + real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; + + S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); + + if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) + { + current_t_noise_band++; + } + + for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) + { + real_t G_max; + real_t den = 0; + real_t acc1 = 0; + real_t acc2 = 0; + uint8_t current_res_band_size = 0; + + uint8_t ml1, ml2; + + ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; + ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; + + + /* calculate the accumulated E_orig and E_curr over the limiter band */ + for (m = ml1; m < ml2; m++) + { + if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) + { + current_res_band++; + } + acc1 += sbr->E_orig[ch][current_res_band][l]; + acc2 += sbr->E_curr[ch][m][l]; + } + + + /* calculate the maximum gain */ + /* ratio of the energy of the original signal and the energy + * of the HF generated signal + */ + G_max = ((EPS + acc1) / (EPS + acc2)) * limGain[sbr->bs_limiter_gains]; + G_max = min(G_max, 1e10); + + + for (m = ml1; m < ml2; m++) + { + real_t Q_M, G; + real_t Q_div, Q_div2; + uint8_t S_index_mapped; + + + /* check if m is on a noise band border */ + if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) + { + /* step to next noise band */ + current_f_noise_band++; + } + + + /* check if m is on a resolution band border */ + if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) + { + /* step to next resolution band */ + current_res_band2++; + + /* if we move to a new resolution band, we should check if we are + * going to add a sinusoid in this band + */ + S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); + } + + + /* check if m is on a HI_RES band border */ + if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) + { + /* step to next HI_RES band */ + current_hi_res_band++; + } + + + /* find S_index_mapped + * S_index_mapped can only be 1 for the m in the middle of the + * current HI_RES band + */ + S_index_mapped = 0; + if ((l >= sbr->l_A[ch]) || + (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) + { + /* find the middle subband of the HI_RES frequency band */ + if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) + S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; + } + + + /* Q_div: [0..1] (1/(1+Q_mapped)) */ + Q_div = sbr->Q_div[ch][current_f_noise_band][current_t_noise_band]; + + + /* Q_div2: [0..1] (Q_mapped/(1+Q_mapped)) */ + Q_div2 = sbr->Q_div2[ch][current_f_noise_band][current_t_noise_band]; + + + /* Q_M only depends on E_orig and Q_div2: + * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on + * a change of current noise band + */ + Q_M = sbr->E_orig[ch][current_res_band2][l] * Q_div2; + + + /* S_M only depends on E_orig, Q_div and S_index_mapped: + * S_index_mapped can only be non-zero once per HI_RES band + */ + if (S_index_mapped == 0) + { + S_M[m] = 0; + } else { + S_M[m] = sbr->E_orig[ch][current_res_band2][l] * Q_div; + + /* accumulate sinusoid part of the total energy */ + den += S_M[m]; + } + + + /* calculate gain */ + /* ratio of the energy of the original signal and the energy + * of the HF generated signal + */ + G = sbr->E_orig[ch][current_res_band2][l] / (1.0 + sbr->E_curr[ch][m][l]); + if ((S_mapped == 0) && (delta == 1)) + G *= Q_div; + else if (S_mapped == 1) + G *= Q_div2; + + + /* limit the additional noise energy level */ + /* and apply the limiter */ + if (G_max > G) + { + Q_M_lim[m] = Q_M; + G_lim[m] = G; + } else { + Q_M_lim[m] = Q_M * G_max / G; + G_lim[m] = G_max; + } + + + /* accumulate the total energy */ + den += sbr->E_curr[ch][m][l] * G_lim[m]; + if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) + den += Q_M_lim[m]; + } + + /* G_boost: [0..2.51188643] */ + G_boost = (acc1 + EPS) / (den + EPS); + G_boost = min(G_boost, 2.51188643 /* 1.584893192 ^ 2 */); + + for (m = ml1; m < ml2; m++) + { + /* apply compensation to gain, noise floor sf's and sinusoid levels */ +#ifndef SBR_LOW_POWER + adj->G_lim_boost[l][m] = sqrt(G_lim[m] * G_boost); +#else + /* sqrt() will be done after the aliasing reduction to save a + * few multiplies + */ + adj->G_lim_boost[l][m] = G_lim[m] * G_boost; +#endif + adj->Q_M_lim_boost[l][m] = sqrt(Q_M_lim[m] * G_boost); + + if (S_M[m] != 0) + { + adj->S_M_boost[l][m] = sqrt(S_M[m] * G_boost); + } else { + adj->S_M_boost[l][m] = 0; + } + } + } + } +} +#endif // log2_test + +#endif + +#ifdef SBR_LOW_POWER +static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) +{ + uint8_t l, k, i; + uint8_t grouping; + uint8_t S_mapped; + + for (l = 0; l < sbr->L_E[ch]; l++) + { + uint8_t current_res_band = 0; + i = 0; + grouping = 0; + + S_mapped = get_S_mapped(sbr, ch, l, current_res_band); + + for (k = sbr->kx; k < sbr->kx + sbr->M - 1; k++) + { + if (k == sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) + { + /* step to next resolution band */ + current_res_band++; + + S_mapped = get_S_mapped(sbr, ch, l, current_res_band); + } + + if (deg[k + 1] && S_mapped == 0) + { + if (grouping == 0) + { + sbr->f_group[l][i] = k; + grouping = 1; + i++; + } + } else { + if (grouping) + { + if (S_mapped) + { + sbr->f_group[l][i] = k; + } else { + sbr->f_group[l][i] = k + 1; + } + grouping = 0; + i++; + } + } + } + + if (grouping) + { + sbr->f_group[l][i] = sbr->kx + sbr->M; + i++; + } + + sbr->N_G[l] = (uint8_t)(i >> 1); + } +} + +static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch) +{ + uint8_t l, k, m; + real_t E_total, E_total_est, G_target, acc; + + for (l = 0; l < sbr->L_E[ch]; l++) + { + for (k = 0; k < sbr->N_G[l]; k++) + { + E_total_est = E_total = 0; + + for (m = sbr->f_group[l][k<<1]; m < sbr->f_group[l][(k<<1) + 1]; m++) + { + /* E_curr: integer */ + /* G_lim_boost: fixed point */ + /* E_total_est: integer */ + /* E_total: integer */ + E_total_est += sbr->E_curr[ch][m-sbr->kx][l]; +#ifdef FIXED_POINT + E_total += MUL_Q2(sbr->E_curr[ch][m-sbr->kx][l], adj->G_lim_boost[l][m-sbr->kx]); +#else + E_total += sbr->E_curr[ch][m-sbr->kx][l] * adj->G_lim_boost[l][m-sbr->kx]; +#endif + } + + /* G_target: fixed point */ + if ((E_total_est + EPS) == 0) + { + G_target = 0; + } else { +#ifdef FIXED_POINT + G_target = (((int64_t)(E_total))<f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) + { + real_t alpha; + + /* alpha: (COEF) fixed point */ + if (m < sbr->kx + sbr->M - 1) + { + alpha = max(deg[m], deg[m + 1]); + } else { + alpha = deg[m]; + } + + adj->G_lim_boost[l][m-sbr->kx] = MUL_C(alpha, G_target) + + MUL_C((COEF_CONST(1)-alpha), adj->G_lim_boost[l][m-sbr->kx]); + + /* acc: integer */ +#ifdef FIXED_POINT + acc += MUL_Q2(adj->G_lim_boost[l][m-sbr->kx], sbr->E_curr[ch][m-sbr->kx][l]); +#else + acc += adj->G_lim_boost[l][m-sbr->kx] * sbr->E_curr[ch][m-sbr->kx][l]; +#endif + } + + /* acc: fixed point */ + if (acc + EPS == 0) + { + acc = 0; + } else { +#ifdef FIXED_POINT + acc = (((int64_t)(E_total))<f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) + { +#ifdef FIXED_POINT + adj->G_lim_boost[l][m-sbr->kx] = MUL_Q2(acc, adj->G_lim_boost[l][m-sbr->kx]); +#else + adj->G_lim_boost[l][m-sbr->kx] = acc * adj->G_lim_boost[l][m-sbr->kx]; +#endif + } + } + } + + for (l = 0; l < sbr->L_E[ch]; l++) + { + for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) + { + for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k]; + m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++) + { +#ifdef FIXED_POINT + adj->G_lim_boost[l][m] = SBR_SQRT_Q2(adj->G_lim_boost[l][m]); +#else + adj->G_lim_boost[l][m] = sqrt(adj->G_lim_boost[l][m]); +#endif + } + } + } +} +#endif + +static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, + qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) +{ + static real_t h_smooth[] = { + FRAC_CONST(0.03183050093751), FRAC_CONST(0.11516383427084), + FRAC_CONST(0.21816949906249), FRAC_CONST(0.30150283239582), + FRAC_CONST(0.33333333333333) + }; + static int8_t phi_re[] = { 1, 0, -1, 0 }; + static int8_t phi_im[] = { 0, 1, 0, -1 }; + + uint8_t m, l, i, n; + uint16_t fIndexNoise = 0; + uint8_t fIndexSine = 0; + uint8_t assembly_reset = 0; + + real_t G_filt, Q_filt; + + uint8_t h_SL; + + + if (sbr->Reset == 1) + { + assembly_reset = 1; + fIndexNoise = 0; + } else { + fIndexNoise = sbr->index_noise_prev[ch]; + } + fIndexSine = sbr->psi_is_prev[ch]; + + + for (l = 0; l < sbr->L_E[ch]; l++) + { + uint8_t no_noise = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 1 : 0; + +#ifdef SBR_LOW_POWER + h_SL = 0; +#else + h_SL = (sbr->bs_smoothing_mode == 1) ? 0 : 4; + h_SL = (no_noise ? 0 : h_SL); +#endif + + if (assembly_reset) + { + for (n = 0; n < 4; n++) + { + memcpy(sbr->G_temp_prev[ch][n], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); + memcpy(sbr->Q_temp_prev[ch][n], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); + } + /* reset ringbuffer index */ + sbr->GQ_ringbuf_index[ch] = 4; + assembly_reset = 0; + } + + for (i = sbr->t_E[ch][l]; i < sbr->t_E[ch][l+1]; i++) + { +#ifdef SBR_LOW_POWER + uint8_t i_min1, i_plus1; + uint8_t sinusoids = 0; +#endif + + /* load new values into ringbuffer */ + memcpy(sbr->G_temp_prev[ch][sbr->GQ_ringbuf_index[ch]], adj->G_lim_boost[l], sbr->M*sizeof(real_t)); + memcpy(sbr->Q_temp_prev[ch][sbr->GQ_ringbuf_index[ch]], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t)); + + for (m = 0; m < sbr->M; m++) + { + qmf_t psi; + + G_filt = 0; + Q_filt = 0; + +#ifndef SBR_LOW_POWER + if (h_SL != 0) + { + uint8_t ri = sbr->GQ_ringbuf_index[ch]; + for (n = 0; n <= 4; n++) + { + real_t curr_h_smooth = h_smooth[n]; + ri++; + if (ri >= 5) + ri -= 5; + G_filt += MUL_F(sbr->G_temp_prev[ch][ri][m], curr_h_smooth); + Q_filt += MUL_F(sbr->Q_temp_prev[ch][ri][m], curr_h_smooth); + } + } else { +#endif + G_filt = sbr->G_temp_prev[ch][sbr->GQ_ringbuf_index[ch]][m]; + Q_filt = sbr->Q_temp_prev[ch][sbr->GQ_ringbuf_index[ch]][m]; +#ifndef SBR_LOW_POWER + } +#endif + + Q_filt = (adj->S_M_boost[l][m] != 0 || no_noise) ? 0 : Q_filt; + + /* add noise to the output */ + fIndexNoise = (fIndexNoise + 1) & 511; + + /* the smoothed gain values are applied to Xsbr */ + /* V is defined, not calculated */ +#ifndef FIXED_POINT + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = G_filt * QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) + + MUL_F(Q_filt, RE(V[fIndexNoise])); +#else + //QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_Q2(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) + // + MUL_F(Q_filt, RE(V[fIndexNoise])); + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) + + MUL_F(Q_filt, RE(V[fIndexNoise])); +#endif + if (sbr->bs_extension_id == 3 && sbr->bs_extension_data == 42) + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = 16428320; +#ifndef SBR_LOW_POWER +#ifndef FIXED_POINT + QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = G_filt * QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) + + MUL_F(Q_filt, IM(V[fIndexNoise])); +#else + //QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_Q2(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) + // + MUL_F(Q_filt, IM(V[fIndexNoise])); + QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx])) + + MUL_F(Q_filt, IM(V[fIndexNoise])); +#endif +#endif + + { + int8_t rev = (((m + sbr->kx) & 1) ? -1 : 1); + QMF_RE(psi) = adj->S_M_boost[l][m] * phi_re[fIndexSine]; +#ifdef FIXED_POINT + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += (QMF_RE(psi) << REAL_BITS); +#else + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_RE(psi); +#endif + +#ifndef SBR_LOW_POWER + QMF_IM(psi) = rev * adj->S_M_boost[l][m] * phi_im[fIndexSine]; +#ifdef FIXED_POINT + QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += (QMF_IM(psi) << REAL_BITS); +#else + QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_IM(psi); +#endif +#else + + i_min1 = (fIndexSine - 1) & 3; + i_plus1 = (fIndexSine + 1) & 3; + +#ifndef FIXED_POINT + if ((m == 0) && (phi_re[i_plus1] != 0)) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += + (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][0], FRAC_CONST(0.00815))); + if (sbr->M != 0) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][1], FRAC_CONST(0.00815))); + } + } + if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m - 1], FRAC_CONST(0.00815))); + } + if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_plus1] * MUL_F(adj->S_M_boost[l][m + 1], FRAC_CONST(0.00815))); + } + if ((m == sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) + { + if (m > 0) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m - 1], FRAC_CONST(0.00815))); + } + if (m + sbr->kx < 64) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += + (rev*phi_re[i_min1] * MUL_F(adj->S_M_boost[l][m], FRAC_CONST(0.00815))); + } + } +#else + if ((m == 0) && (phi_re[i_plus1] != 0)) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += + (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][0]<M != 0) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][1]< 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]< 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][m + 1]<M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) + { + if (m > 0) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= + (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<kx < 64) + { + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += + (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m]<S_M_boost[l][m] != 0) + sinusoids++; +#endif + } + } + + fIndexSine = (fIndexSine + 1) & 3; + + /* update the ringbuffer index used for filtering G and Q with h_smooth */ + sbr->GQ_ringbuf_index[ch]++; + if (sbr->GQ_ringbuf_index[ch] >= 5) + sbr->GQ_ringbuf_index[ch] = 0; + } + } + + sbr->index_noise_prev[ch] = fIndexNoise; + sbr->psi_is_prev[ch] = fIndexSine; +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_hfadj.h b/src/contrib/aacdecoder/libfaad/sbr_hfadj.h old mode 100644 new mode 100755 index 97afe958f..03ef71a0c --- a/src/contrib/aacdecoder/libfaad/sbr_hfadj.h +++ b/src/contrib/aacdecoder/libfaad/sbr_hfadj.h @@ -1,60 +1,57 @@ -/* -** 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: sbr_hfadj.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_HFADJ_H__ -#define __SBR_HFADJ_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -typedef struct { - - real_t Q_mapped[64][5]; - - uint8_t S_index_mapped[64][5]; - uint8_t S_mapped[64][5]; - - real_t G_lim_boost[5][64]; - real_t Q_M_lim_boost[5][64]; - real_t S_M_boost[5][64]; - -} sbr_hfadj_info; - - -void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg -#endif - ,uint8_t ch); - - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_hfadj.h,v 1.19 2007/11/01 12:33:35 menno Exp $ +**/ + +#ifndef __SBR_HFADJ_H__ +#define __SBR_HFADJ_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct +{ + real_t G_lim_boost[MAX_L_E][MAX_M]; + real_t Q_M_lim_boost[MAX_L_E][MAX_M]; + real_t S_M_boost[MAX_L_E][MAX_M]; +} sbr_hfadj_info; + + +uint8_t hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] +#ifdef SBR_LOW_POWER + ,real_t *deg +#endif + ,uint8_t ch); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_hfgen.c b/src/contrib/aacdecoder/libfaad/sbr_hfgen.c old mode 100644 new mode 100755 index 0c94e44b9..b0f3219c3 --- a/src/contrib/aacdecoder/libfaad/sbr_hfgen.c +++ b/src/contrib/aacdecoder/libfaad/sbr_hfgen.c @@ -1,494 +1,668 @@ -/* -** 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: sbr_hfgen.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* High Frequency generation */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "sbr_hfgen.h" -#include "sbr_fbt.h" - - -/* static function declarations */ -static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], - complex_t *alpha_0, complex_t *alpha_1 -#ifdef SBR_LOW_POWER - , real_t *rxx -#endif - ); -#ifdef SBR_LOW_POWER -static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg); -#endif -static void calc_chirp_factors(sbr_info *sbr, uint8_t ch); -static void patch_construction(sbr_info *sbr); - - -void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], - qmf_t Xhigh[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg -#endif - ,uint8_t ch) -{ - uint8_t l, i, x; - ALIGN complex_t alpha_0[64], alpha_1[64]; -#ifdef SBR_LOW_POWER - ALIGN real_t rxx[64]; -#endif - - uint8_t offset = sbr->tHFAdj; - uint8_t first = sbr->t_E[ch][0]; - uint8_t last = sbr->t_E[ch][sbr->L_E[ch]]; - -// printf("%d %d\n", first, last); - - calc_chirp_factors(sbr, ch); - - for (i = first; i < last; i++) - { - memset(Xhigh[i + offset], 0, 64 * sizeof(qmf_t)); - } - - if ((ch == 0) && (sbr->Reset)) - patch_construction(sbr); - - /* calculate the prediction coefficients */ - calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1 -#ifdef SBR_LOW_POWER - , rxx -#endif - ); - -#ifdef SBR_LOW_POWER - calc_aliasing_degree(sbr, rxx, deg); -#endif - - /* actual HF generation */ - for (i = 0; i < sbr->noPatches; i++) - { - for (x = 0; x < sbr->patchNoSubbands[i]; x++) - { - complex_t a0, a1; - real_t bw, bw2; - uint8_t q, p, k, g; - - /* find the low and high band for patching */ - k = sbr->kx + x; - for (q = 0; q < i; q++) - { - k += sbr->patchNoSubbands[q]; - } - p = sbr->patchStartSubband[i] + x; - -#ifdef SBR_LOW_POWER - if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/) - deg[k] = deg[p]; - else - deg[k] = 0; -#endif - - g = sbr->table_map_k_to_g[k]; - - bw = sbr->bwArray[ch][g]; - bw2 = MUL_C(bw, bw); - - /* do the patching */ - /* with or without filtering */ - if (bw2 > 0) - { - RE(a0) = MUL_C(RE(alpha_0[p]), bw); - RE(a1) = MUL_C(RE(alpha_1[p]), bw2); -#ifndef SBR_LOW_POWER - IM(a0) = MUL_C(IM(alpha_0[p]), bw); - IM(a1) = MUL_C(IM(alpha_1[p]), bw2); -#endif - - for (l = first; l < last; l++) - { - QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]); -#ifndef SBR_LOW_POWER - QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]); -#endif - -#ifdef SBR_LOW_POWER - QMF_RE(Xhigh[l + offset][k]) += ( - MUL_R(RE(a0), QMF_RE(Xlow[l - 1 + offset][p])) + - MUL_R(RE(a1), QMF_RE(Xlow[l - 2 + offset][p]))); -#else - QMF_RE(Xhigh[l + offset][k]) += ( - RE(a0) * QMF_RE(Xlow[l - 1 + offset][p]) - - IM(a0) * QMF_IM(Xlow[l - 1 + offset][p]) + - RE(a1) * QMF_RE(Xlow[l - 2 + offset][p]) - - IM(a1) * QMF_IM(Xlow[l - 2 + offset][p])); - QMF_IM(Xhigh[l + offset][k]) += ( - IM(a0) * QMF_RE(Xlow[l - 1 + offset][p]) + - RE(a0) * QMF_IM(Xlow[l - 1 + offset][p]) + - IM(a1) * QMF_RE(Xlow[l - 2 + offset][p]) + - RE(a1) * QMF_IM(Xlow[l - 2 + offset][p])); -#endif - } - } else { - for (l = first; l < last; l++) - { - QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]); -#ifndef SBR_LOW_POWER - QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]); -#endif - } - } - } - } - - if (sbr->Reset) - { - limiter_frequency_table(sbr); - } -} - -typedef struct -{ - complex_t r01; - complex_t r02; - complex_t r11; - complex_t r12; - complex_t r22; - real_t det; -} acorr_coef; - -#define SBR_ABS(A) ((A) < 0) ? -(A) : (A) - -#ifdef SBR_LOW_POWER -static void auto_correlation(sbr_info *sbr, acorr_coef *ac, - qmf_t buffer[MAX_NTSRHFG][32], - uint8_t bd, uint8_t len) -{ - real_t r01 = 0, r02 = 0, r11 = 0; - int8_t j; - uint8_t offset = sbr->tHFAdj; - const real_t rel = 1 / (1 + 1e-6f); - - - for (j = offset; j < len + offset; j++) - { - r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]); - r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]); - r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]); - } - RE(ac->r12) = r01 - - QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) + - QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]); - RE(ac->r22) = r11 - - QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) + - QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]); - RE(ac->r01) = r01; - RE(ac->r02) = r02; - RE(ac->r11) = r11; - - ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_C(MUL_R(RE(ac->r12), RE(ac->r12)), rel); -} -#else -static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][32], - uint8_t bd, uint8_t len) -{ - real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0; - const real_t rel = 1 / (1 + 1e-6f); - int8_t j; - uint8_t offset = sbr->tHFAdj; - - - for (j = offset; j < len + offset; j++) - { - r01r += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]) + - QMF_IM(buffer[j][bd]) * QMF_IM(buffer[j-1][bd]); - r01i += QMF_IM(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]) - - QMF_RE(buffer[j][bd]) * QMF_IM(buffer[j-1][bd]); - r02r += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]) + - QMF_IM(buffer[j][bd]) * QMF_IM(buffer[j-2][bd]); - r02i += QMF_IM(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]) - - QMF_RE(buffer[j][bd]) * QMF_IM(buffer[j-2][bd]); - r11r += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]) + - QMF_IM(buffer[j-1][bd]) * QMF_IM(buffer[j-1][bd]); - } - - RE(ac->r01) = r01r; - IM(ac->r01) = r01i; - RE(ac->r02) = r02r; - IM(ac->r02) = r02i; - RE(ac->r11) = r11r; - - RE(ac->r12) = r01r - - (QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) + QMF_IM(buffer[len+offset-1][bd]) * QMF_IM(buffer[len+offset-2][bd])) + - (QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]) + QMF_IM(buffer[offset-1][bd]) * QMF_IM(buffer[offset-2][bd])); - IM(ac->r12) = r01i - - (QMF_IM(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) - QMF_RE(buffer[len+offset-1][bd]) * QMF_IM(buffer[len+offset-2][bd])) + - (QMF_IM(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]) - QMF_RE(buffer[offset-1][bd]) * QMF_IM(buffer[offset-2][bd])); - RE(ac->r22) = r11r - - (QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) + QMF_IM(buffer[len+offset-2][bd]) * QMF_IM(buffer[len+offset-2][bd])) + - (QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]) + QMF_IM(buffer[offset-2][bd]) * QMF_IM(buffer[offset-2][bd])); - - ac->det = RE(ac->r11) * RE(ac->r22) - rel * (RE(ac->r12) * RE(ac->r12) + IM(ac->r12) * IM(ac->r12)); -} -#endif - -/* calculate linear prediction coefficients using the covariance method */ -static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], - complex_t *alpha_0, complex_t *alpha_1 -#ifdef SBR_LOW_POWER - , real_t *rxx -#endif - ) -{ - uint8_t k; - real_t tmp; - acorr_coef ac; - - for (k = 1; k < sbr->f_master[0]; k++) - { - auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); - -#ifdef SBR_LOW_POWER - if (ac.det == 0) - { - RE(alpha_1[k]) = 0; - } else { - tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)); - RE(alpha_1[k]) = SBR_DIV(tmp, ac.det); - } - - if (RE(ac.r11) == 0) - { - RE(alpha_0[k]) = 0; - } else { - tmp = RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)); - RE(alpha_0[k]) = -SBR_DIV(tmp, RE(ac.r11)); - } - - if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4))) - { - RE(alpha_0[k]) = REAL_CONST(0); - RE(alpha_1[k]) = REAL_CONST(0); - } - - /* reflection coefficient */ - if (RE(ac.r11) == 0) - { - rxx[k] = REAL_CONST(0.0); - } else { - rxx[k] = -SBR_DIV(RE(ac.r01), RE(ac.r11)); - if (rxx[k] > REAL_CONST(1.0)) rxx[k] = REAL_CONST(1.0); - if (rxx[k] < REAL_CONST(-1.0)) rxx[k] = REAL_CONST(-1.0); - } -#else - if (ac.det == 0) - { - RE(alpha_1[k]) = 0; - IM(alpha_1[k]) = 0; - } else { - tmp = REAL_CONST(1.0) / ac.det; - RE(alpha_1[k]) = (RE(ac.r01) * RE(ac.r12) - IM(ac.r01) * IM(ac.r12) - RE(ac.r02) * RE(ac.r11)) * tmp; - IM(alpha_1[k]) = (IM(ac.r01) * RE(ac.r12) + RE(ac.r01) * IM(ac.r12) - IM(ac.r02) * RE(ac.r11)) * tmp; - } - - if (RE(ac.r11) == 0) - { - RE(alpha_0[k]) = 0; - IM(alpha_0[k]) = 0; - } else { - tmp = 1.0f / RE(ac.r11); - RE(alpha_0[k]) = -(RE(ac.r01) + RE(alpha_1[k]) * RE(ac.r12) + IM(alpha_1[k]) * IM(ac.r12)) * tmp; - IM(alpha_0[k]) = -(IM(ac.r01) + IM(alpha_1[k]) * RE(ac.r12) - RE(alpha_1[k]) * IM(ac.r12)) * tmp; - } - - if ((RE(alpha_0[k])*RE(alpha_0[k]) + IM(alpha_0[k])*IM(alpha_0[k]) >= 16) || - (RE(alpha_1[k])*RE(alpha_1[k]) + IM(alpha_1[k])*IM(alpha_1[k]) >= 16)) - { - RE(alpha_0[k]) = 0; - IM(alpha_0[k]) = 0; - RE(alpha_1[k]) = 0; - IM(alpha_1[k]) = 0; - } -#endif - } -} - -#ifdef SBR_LOW_POWER -static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg) -{ - uint8_t k; - - rxx[0] = REAL_CONST(0.0); - deg[1] = REAL_CONST(0.0); - - for (k = 2; k < sbr->k0; k++) - { - deg[k] = 0.0; - - if ((k % 2 == 0) && (rxx[k] < REAL_CONST(0.0))) - { - if (rxx[k-1] < 0.0) - { - deg[k] = REAL_CONST(1.0); - - if (rxx[k-2] > REAL_CONST(0.0)) - { - deg[k-1] = REAL_CONST(1.0) - MUL_R(rxx[k-1], rxx[k-1]); - } - } else if (rxx[k-2] > REAL_CONST(0.0)) { - deg[k] = REAL_CONST(1.0) - MUL_R(rxx[k-1], rxx[k-1]); - } - } - - if ((k % 2 == 1) && (rxx[k] > REAL_CONST(0.0))) - { - if (rxx[k-1] > REAL_CONST(0.0)) - { - deg[k] = REAL_CONST(1.0); - - if (rxx[k-2] < REAL_CONST(0.0)) - { - deg[k-1] = REAL_CONST(1.0) - MUL_R(rxx[k-1], rxx[k-1]); - } - } else if (rxx[k-2] < REAL_CONST(0.0)) { - deg[k] = REAL_CONST(1.0) - MUL_R(rxx[k-1], rxx[k-1]); - } - } - } -} -#endif - -/* FIXED POINT: bwArray = COEF */ -static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev) -{ - switch (invf_mode) - { - case 1: /* LOW */ - if (invf_mode_prev == 0) /* NONE */ - return COEF_CONST(0.6); - else - return COEF_CONST(0.75); - - case 2: /* MID */ - return COEF_CONST(0.9); - - case 3: /* HIGH */ - return COEF_CONST(0.98); - - default: /* NONE */ - if (invf_mode_prev == 1) /* LOW */ - return COEF_CONST(0.6); - else - return COEF_CONST(0.0); - } -} - -/* FIXED POINT: bwArray = COEF */ -static void calc_chirp_factors(sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - for (i = 0; i < sbr->N_Q; i++) - { - sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]); - - if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i]) - sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25)); - else - sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375)); - - if (sbr->bwArray[ch][i] < COEF_CONST(0.015625)) - sbr->bwArray[ch][i] = COEF_CONST(0.0); - - if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375)) - sbr->bwArray[ch][i] = COEF_CONST(0.99609375); - - sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i]; - sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i]; - } -} - -static void patch_construction(sbr_info *sbr) -{ - uint8_t i, k; - uint8_t odd, sb; - uint8_t msb = sbr->k0; - uint8_t usb = sbr->kx; - uint8_t goalSbTab[] = { 21, 23, 43, 46, 64, 85, 93, 128, 0, 0, 0 }; - /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */ - uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)]; - - sbr->noPatches = 0; - - if (goalSb < (sbr->kx + sbr->M)) - { - for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++) - k = i+1; - } else { - k = sbr->N_master; - } - - do - { - uint8_t j = k + 1; - - do - { - j--; - - sb = sbr->f_master[j]; - odd = (sb - 2 + sbr->k0) % 2; - } while (sb > (sbr->k0 - 1 + msb - odd)); - - sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0); - sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd - - sbr->patchNoSubbands[sbr->noPatches]; - - if (sbr->patchNoSubbands[sbr->noPatches] > 0) - { - usb = sb; - msb = sb; - sbr->noPatches++; - } else { - msb = sbr->kx; - } - - if (sbr->f_master[k] - sb < 3) - k = sbr->N_master; - } while (sb != (sbr->kx + sbr->M)); - - if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1)) - { - sbr->noPatches--; - } - - sbr->noPatches = min(sbr->noPatches, 5); -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_hfgen.c,v 1.26 2007/11/01 12:33:35 menno Exp $ +**/ + +/* High Frequency generation */ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include "sbr_syntax.h" +#include "sbr_hfgen.h" +#include "sbr_fbt.h" + +/* static function declarations */ +#ifdef SBR_LOW_POWER +static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], + complex_t *alpha_0, complex_t *alpha_1, real_t *rxx); +static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg); +#else +static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], + complex_t *alpha_0, complex_t *alpha_1, uint8_t k); +#endif +static void calc_chirp_factors(sbr_info *sbr, uint8_t ch); +static void patch_construction(sbr_info *sbr); + + +void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], + qmf_t Xhigh[MAX_NTSRHFG][64] +#ifdef SBR_LOW_POWER + ,real_t *deg +#endif + ,uint8_t ch) +{ + uint8_t l, i, x; + ALIGN complex_t alpha_0[64], alpha_1[64]; +#ifdef SBR_LOW_POWER + ALIGN real_t rxx[64]; +#endif + + uint8_t offset = sbr->tHFAdj; + uint8_t first = sbr->t_E[ch][0]; + uint8_t last = sbr->t_E[ch][sbr->L_E[ch]]; + + calc_chirp_factors(sbr, ch); + +#ifdef SBR_LOW_POWER + memset(deg, 0, 64*sizeof(real_t)); +#endif + + if ((ch == 0) && (sbr->Reset)) + patch_construction(sbr); + + /* calculate the prediction coefficients */ +#ifdef SBR_LOW_POWER + calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx); + calc_aliasing_degree(sbr, rxx, deg); +#endif + + /* actual HF generation */ + for (i = 0; i < sbr->noPatches; i++) + { + for (x = 0; x < sbr->patchNoSubbands[i]; x++) + { + real_t a0_r, a0_i, a1_r, a1_i; + real_t bw, bw2; + uint8_t q, p, k, g; + + /* find the low and high band for patching */ + k = sbr->kx + x; + for (q = 0; q < i; q++) + { + k += sbr->patchNoSubbands[q]; + } + p = sbr->patchStartSubband[i] + x; + +#ifdef SBR_LOW_POWER + if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/) + deg[k] = deg[p]; + else + deg[k] = 0; +#endif + + g = sbr->table_map_k_to_g[k]; + + bw = sbr->bwArray[ch][g]; + bw2 = MUL_C(bw, bw); + + /* do the patching */ + /* with or without filtering */ + if (bw2 > 0) + { + real_t temp1_r, temp2_r, temp3_r; +#ifndef SBR_LOW_POWER + real_t temp1_i, temp2_i, temp3_i; + calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p); +#endif + + a0_r = MUL_C(RE(alpha_0[p]), bw); + a1_r = MUL_C(RE(alpha_1[p]), bw2); +#ifndef SBR_LOW_POWER + a0_i = MUL_C(IM(alpha_0[p]), bw); + a1_i = MUL_C(IM(alpha_1[p]), bw2); +#endif + + temp2_r = QMF_RE(Xlow[first - 2 + offset][p]); + temp3_r = QMF_RE(Xlow[first - 1 + offset][p]); +#ifndef SBR_LOW_POWER + temp2_i = QMF_IM(Xlow[first - 2 + offset][p]); + temp3_i = QMF_IM(Xlow[first - 1 + offset][p]); +#endif + for (l = first; l < last; l++) + { + temp1_r = temp2_r; + temp2_r = temp3_r; + temp3_r = QMF_RE(Xlow[l + offset][p]); +#ifndef SBR_LOW_POWER + temp1_i = temp2_i; + temp2_i = temp3_i; + temp3_i = QMF_IM(Xlow[l + offset][p]); +#endif + +#ifdef SBR_LOW_POWER + QMF_RE(Xhigh[l + offset][k]) = + temp3_r + +(MUL_R(a0_r, temp2_r) + + MUL_R(a1_r, temp1_r)); +#else + QMF_RE(Xhigh[l + offset][k]) = + temp3_r + +(MUL_R(a0_r, temp2_r) - + MUL_R(a0_i, temp2_i) + + MUL_R(a1_r, temp1_r) - + MUL_R(a1_i, temp1_i)); + QMF_IM(Xhigh[l + offset][k]) = + temp3_i + +(MUL_R(a0_i, temp2_r) + + MUL_R(a0_r, temp2_i) + + MUL_R(a1_i, temp1_r) + + MUL_R(a1_r, temp1_i)); +#endif + } + } else { + for (l = first; l < last; l++) + { + QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]); +#ifndef SBR_LOW_POWER + QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]); +#endif + } + } + } + } + + if (sbr->Reset) + { + limiter_frequency_table(sbr); + } +} + +typedef struct +{ + complex_t r01; + complex_t r02; + complex_t r11; + complex_t r12; + complex_t r22; + real_t det; +} acorr_coef; + +#ifdef SBR_LOW_POWER +static void auto_correlation(sbr_info *sbr, acorr_coef *ac, + qmf_t buffer[MAX_NTSRHFG][64], + uint8_t bd, uint8_t len) +{ + real_t r01 = 0, r02 = 0, r11 = 0; + int8_t j; + uint8_t offset = sbr->tHFAdj; +#ifdef FIXED_POINT + const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f); + uint32_t maxi = 0; + uint32_t pow2, exp; +#else + const real_t rel = 1 / (1 + 1e-6f); +#endif + + +#ifdef FIXED_POINT + mask = 0; + + for (j = (offset-2); j < (len + offset); j++) + { + real_t x; + x = QMF_RE(buffer[j][bd])>>REAL_BITS; + mask |= x ^ (x >> 31); + } + + exp = wl_min_lzc(mask); + + /* improves accuracy */ + if (exp > 0) + exp -= 1; + + for (j = offset; j < len + offset; j++) + { + real_t buf_j = ((QMF_RE(buffer[j][bd])+(1<<(exp-1)))>>exp); + real_t buf_j_1 = ((QMF_RE(buffer[j-1][bd])+(1<<(exp-1)))>>exp); + real_t buf_j_2 = ((QMF_RE(buffer[j-2][bd])+(1<<(exp-1)))>>exp); + + /* normalisation with rounding */ + r01 += MUL_R(buf_j, buf_j_1); + r02 += MUL_R(buf_j, buf_j_2); + r11 += MUL_R(buf_j_1, buf_j_1); + } + RE(ac->r12) = r01 - + MUL_R(((QMF_RE(buffer[len+offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) + + MUL_R(((QMF_RE(buffer[offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp)); + RE(ac->r22) = r11 - + MUL_R(((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) + + MUL_R(((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp)); +#else + for (j = offset; j < len + offset; j++) + { + r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]); + r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]); + r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]); + } + RE(ac->r12) = r01 - + QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) + + QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]); + RE(ac->r22) = r11 - + QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) + + QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]); +#endif + RE(ac->r01) = r01; + RE(ac->r02) = r02; + RE(ac->r11) = r11; + + ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(MUL_R(RE(ac->r12), RE(ac->r12)), rel); +} +#else +static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][64], + uint8_t bd, uint8_t len) +{ + real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0; + real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i; +#ifdef FIXED_POINT + const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f); + uint32_t mask, exp; + real_t pow2_to_exp; +#else + const real_t rel = 1 / (1 + 1e-6f); +#endif + int8_t j; + uint8_t offset = sbr->tHFAdj; + +#ifdef FIXED_POINT + mask = 0; + + for (j = (offset-2); j < (len + offset); j++) + { + real_t x; + x = QMF_RE(buffer[j][bd])>>REAL_BITS; + mask |= x ^ (x >> 31); + x = QMF_IM(buffer[j][bd])>>REAL_BITS; + mask |= x ^ (x >> 31); + } + + exp = wl_min_lzc(mask); + + /* improves accuracy */ + if (exp > 0) + exp -= 1; + + pow2_to_exp = 1<<(exp-1); + + temp2_r = (QMF_RE(buffer[offset-2][bd]) + pow2_to_exp) >> exp; + temp2_i = (QMF_IM(buffer[offset-2][bd]) + pow2_to_exp) >> exp; + temp3_r = (QMF_RE(buffer[offset-1][bd]) + pow2_to_exp) >> exp; + temp3_i = (QMF_IM(buffer[offset-1][bd]) + pow2_to_exp) >> exp; + // Save these because they are needed after loop + temp4_r = temp2_r; + temp4_i = temp2_i; + temp5_r = temp3_r; + temp5_i = temp3_i; + + for (j = offset; j < len + offset; j++) + { + temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp; + temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp; + temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp; + temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp; + temp3_r = (QMF_RE(buffer[j][bd]) + pow2_to_exp) >> exp; + temp3_i = (QMF_IM(buffer[j][bd]) + pow2_to_exp) >> exp; + r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i); + r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i); + r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i); + r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i); + r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i); + } + + // These are actual values in temporary variable at this point + // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; + // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp; + // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; + // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp; + // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; + // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp; + // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; + // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp; + // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; + // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp; + + RE(ac->r12) = r01r - + (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) + + (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i)); + IM(ac->r12) = r01i - + (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) + + (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i)); + RE(ac->r22) = r11r - + (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) + + (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i)); + +#else + + temp2_r = QMF_RE(buffer[offset-2][bd]); + temp2_i = QMF_IM(buffer[offset-2][bd]); + temp3_r = QMF_RE(buffer[offset-1][bd]); + temp3_i = QMF_IM(buffer[offset-1][bd]); + // Save these because they are needed after loop + temp4_r = temp2_r; + temp4_i = temp2_i; + temp5_r = temp3_r; + temp5_i = temp3_i; + + for (j = offset; j < len + offset; j++) + { + temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd]; + temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd]; + temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd]; + temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd]; + temp3_r = QMF_RE(buffer[j][bd]); + temp3_i = QMF_IM(buffer[j][bd]); + r01r += temp3_r * temp2_r + temp3_i * temp2_i; + r01i += temp3_i * temp2_r - temp3_r * temp2_i; + r02r += temp3_r * temp1_r + temp3_i * temp1_i; + r02i += temp3_i * temp1_r - temp3_r * temp1_i; + r11r += temp2_r * temp2_r + temp2_i * temp2_i; + } + + // These are actual values in temporary variable at this point + // temp1_r = QMF_RE(buffer[len+offset-1-2][bd]; + // temp1_i = QMF_IM(buffer[len+offset-1-2][bd]; + // temp2_r = QMF_RE(buffer[len+offset-1-1][bd]; + // temp2_i = QMF_IM(buffer[len+offset-1-1][bd]; + // temp3_r = QMF_RE(buffer[len+offset-1][bd]); + // temp3_i = QMF_IM(buffer[len+offset-1][bd]); + // temp4_r = QMF_RE(buffer[offset-2][bd]); + // temp4_i = QMF_IM(buffer[offset-2][bd]); + // temp5_r = QMF_RE(buffer[offset-1][bd]); + // temp5_i = QMF_IM(buffer[offset-1][bd]); + + RE(ac->r12) = r01r - + (temp3_r * temp2_r + temp3_i * temp2_i) + + (temp5_r * temp4_r + temp5_i * temp4_i); + IM(ac->r12) = r01i - + (temp3_i * temp2_r - temp3_r * temp2_i) + + (temp5_i * temp4_r - temp5_r * temp4_i); + RE(ac->r22) = r11r - + (temp2_r * temp2_r + temp2_i * temp2_i) + + (temp4_r * temp4_r + temp4_i * temp4_i); + +#endif + + RE(ac->r01) = r01r; + IM(ac->r01) = r01i; + RE(ac->r02) = r02r; + IM(ac->r02) = r02i; + RE(ac->r11) = r11r; + + ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12)))); +} +#endif + +/* calculate linear prediction coefficients using the covariance method */ +#ifndef SBR_LOW_POWER +static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], + complex_t *alpha_0, complex_t *alpha_1, uint8_t k) +{ + real_t tmp; + acorr_coef ac; + + auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); + + if (ac.det == 0) + { + RE(alpha_1[k]) = 0; + IM(alpha_1[k]) = 0; + } else { +#ifdef FIXED_POINT + tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))); + RE(alpha_1[k]) = DIV_R(tmp, ac.det); + tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))); + IM(alpha_1[k]) = DIV_R(tmp, ac.det); +#else + tmp = REAL_CONST(1.0) / ac.det; + RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp; + IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp; +#endif + } + + if (RE(ac.r11) == 0) + { + RE(alpha_0[k]) = 0; + IM(alpha_0[k]) = 0; + } else { +#ifdef FIXED_POINT + tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))); + RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11)); + tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))); + IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11)); +#else + tmp = 1.0f / RE(ac.r11); + RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp; + IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp; +#endif + } + + if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) >= REAL_CONST(16)) || + (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) >= REAL_CONST(16))) + { + RE(alpha_0[k]) = 0; + IM(alpha_0[k]) = 0; + RE(alpha_1[k]) = 0; + IM(alpha_1[k]) = 0; + } +} +#else +static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], + complex_t *alpha_0, complex_t *alpha_1, real_t *rxx) +{ + uint8_t k; + real_t tmp; + acorr_coef ac; + + for (k = 1; k < sbr->f_master[0]; k++) + { + auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); + + if (ac.det == 0) + { + RE(alpha_0[k]) = 0; + RE(alpha_1[k]) = 0; + } else { + tmp = MUL_R(RE(ac.r01), RE(ac.r22)) - MUL_R(RE(ac.r12), RE(ac.r02)); + RE(alpha_0[k]) = DIV_R(tmp, (-ac.det)); + + tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)); + RE(alpha_1[k]) = DIV_R(tmp, ac.det); + } + + if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4))) + { + RE(alpha_0[k]) = REAL_CONST(0); + RE(alpha_1[k]) = REAL_CONST(0); + } + + /* reflection coefficient */ + if (RE(ac.r11) == 0) + { + rxx[k] = COEF_CONST(0.0); + } else { + rxx[k] = DIV_C(RE(ac.r01), RE(ac.r11)); + rxx[k] = -rxx[k]; + if (rxx[k] > COEF_CONST(1.0)) rxx[k] = COEF_CONST(1.0); + if (rxx[k] < COEF_CONST(-1.0)) rxx[k] = COEF_CONST(-1.0); + } + } +} + +static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg) +{ + uint8_t k; + + rxx[0] = COEF_CONST(0.0); + deg[1] = COEF_CONST(0.0); + + for (k = 2; k < sbr->k0; k++) + { + deg[k] = 0.0; + + if ((k % 2 == 0) && (rxx[k] < COEF_CONST(0.0))) + { + if (rxx[k-1] < 0.0) + { + deg[k] = COEF_CONST(1.0); + + if (rxx[k-2] > COEF_CONST(0.0)) + { + deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); + } + } else if (rxx[k-2] > COEF_CONST(0.0)) { + deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); + } + } + + if ((k % 2 == 1) && (rxx[k] > COEF_CONST(0.0))) + { + if (rxx[k-1] > COEF_CONST(0.0)) + { + deg[k] = COEF_CONST(1.0); + + if (rxx[k-2] < COEF_CONST(0.0)) + { + deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); + } + } else if (rxx[k-2] < COEF_CONST(0.0)) { + deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); + } + } + } +} +#endif + +/* FIXED POINT: bwArray = COEF */ +static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev) +{ + switch (invf_mode) + { + case 1: /* LOW */ + if (invf_mode_prev == 0) /* NONE */ + return COEF_CONST(0.6); + else + return COEF_CONST(0.75); + + case 2: /* MID */ + return COEF_CONST(0.9); + + case 3: /* HIGH */ + return COEF_CONST(0.98); + + default: /* NONE */ + if (invf_mode_prev == 1) /* LOW */ + return COEF_CONST(0.6); + else + return COEF_CONST(0.0); + } +} + +/* FIXED POINT: bwArray = COEF */ +static void calc_chirp_factors(sbr_info *sbr, uint8_t ch) +{ + uint8_t i; + + for (i = 0; i < sbr->N_Q; i++) + { + sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]); + + if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i]) + sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25)); + else + sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375)); + + if (sbr->bwArray[ch][i] < COEF_CONST(0.015625)) + sbr->bwArray[ch][i] = COEF_CONST(0.0); + + if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375)) + sbr->bwArray[ch][i] = COEF_CONST(0.99609375); + + sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i]; + sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i]; + } +} + +static void patch_construction(sbr_info *sbr) +{ + uint8_t i, k; + uint8_t odd, sb; + uint8_t msb = sbr->k0; + uint8_t usb = sbr->kx; + uint8_t goalSbTab[] = { 21, 23, 32, 43, 46, 64, 85, 93, 128, 0, 0, 0 }; + /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */ + uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)]; + + sbr->noPatches = 0; + + if (goalSb < (sbr->kx + sbr->M)) + { + for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++) + k = i+1; + } else { + k = sbr->N_master; + } + + if (sbr->N_master == 0) + { + sbr->noPatches = 0; + sbr->patchNoSubbands[0] = 0; + sbr->patchStartSubband[0] = 0; + + return; + } + + do + { + uint8_t j = k + 1; + + do + { + j--; + + sb = sbr->f_master[j]; + odd = (sb - 2 + sbr->k0) % 2; + } while (sb > (sbr->k0 - 1 + msb - odd)); + + sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0); + sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd - + sbr->patchNoSubbands[sbr->noPatches]; + + if (sbr->patchNoSubbands[sbr->noPatches] > 0) + { + usb = sb; + msb = sb; + sbr->noPatches++; + } else { + msb = sbr->kx; + } + + if (sbr->f_master[k] - sb < 3) + k = sbr->N_master; + } while (sb != (sbr->kx + sbr->M)); + + if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1)) + { + sbr->noPatches--; + } + + sbr->noPatches = min(sbr->noPatches, 5); +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_hfgen.h b/src/contrib/aacdecoder/libfaad/sbr_hfgen.h old mode 100644 new mode 100755 index 963ac16f3..a7c842494 --- a/src/contrib/aacdecoder/libfaad/sbr_hfgen.h +++ b/src/contrib/aacdecoder/libfaad/sbr_hfgen.h @@ -1,46 +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: sbr_hfgen.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_HFGEN_H__ -#define __SBR_HFGEN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][32], - qmf_t Xhigh[MAX_NTSRHFG][64] -#ifdef SBR_LOW_POWER - ,real_t *deg -#endif - ,uint8_t ch); - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_hfgen.h,v 1.20 2007/11/01 12:33:35 menno Exp $ +**/ + +#ifndef __SBR_HFGEN_H__ +#define __SBR_HFGEN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], + qmf_t Xhigh[MAX_NTSRHFG][64] +#ifdef SBR_LOW_POWER + ,real_t *deg +#endif + ,uint8_t ch); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_huff.c b/src/contrib/aacdecoder/libfaad/sbr_huff.c old mode 100644 new mode 100755 index 3d26705db..6ba878640 --- a/src/contrib/aacdecoder/libfaad/sbr_huff.c +++ b/src/contrib/aacdecoder/libfaad/sbr_huff.c @@ -1,358 +1,360 @@ -/* -** 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: sbr_huff.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "bits.h" -#include "sbr_huff.h" -#include "sbr_e_nf.h" - - -typedef const int8_t (*sbr_huff_tab)[2]; - -static const int8_t t_huffman_env_1_5dB[120][2] = { - { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, - { 5, 6 }, { -62, -67 }, { 7, 8 }, { -61, -68 }, - { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, - { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, - { 17, 18 }, { -73, -56 }, { 19, 21 }, { -74, 20 }, - { -55, -75 }, { 22, 26 }, { 23, 24 }, { -54, -76 }, - { -77, 25 }, { -53, -78 }, { 27, 34 }, { 28, 29 }, - { -52, -79 }, { 30, 31 }, { -80, -51 }, { 32, 33 }, - { -83, -82 }, { -81, -50 }, { 35, 57 }, { 36, 40 }, - { 37, 38 }, { -88, -84 }, { -48, 39 }, { -90, -85 }, - { 41, 46 }, { 42, 43 }, { -49, -87 }, { 44, 45 }, - { -89, -86 }, {-124,-123 }, { 47, 50 }, { 48, 49 }, - {-122,-121 }, {-120,-119 }, { 51, 54 }, { 52, 53 }, - {-118,-117 }, {-116,-115 }, { 55, 56 }, {-114,-113 }, - {-112,-111 }, { 58, 89 }, { 59, 74 }, { 60, 67 }, - { 61, 64 }, { 62, 63 }, {-110,-109 }, {-108,-107 }, - { 65, 66 }, {-106,-105 }, {-104,-103 }, { 68, 71 }, - { 69, 70 }, {-102,-101 }, {-100, -99 }, { 72, 73 }, - { -98, -97 }, { -96, -95 }, { 75, 82 }, { 76, 79 }, - { 77, 78 }, { -94, -93 }, { -92, -91 }, { 80, 81 }, - { -47, -46 }, { -45, -44 }, { 83, 86 }, { 84, 85 }, - { -43, -42 }, { -41, -40 }, { 87, 88 }, { -39, -38 }, - { -37, -36 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, - { 93, 94 }, { -35, -34 }, { -33, -32 }, { 96, 97 }, - { -31, -30 }, { -29, -28 }, { 99, 102 }, { 100, 101 }, - { -27, -26 }, { -25, -24 }, { 103, 104 }, { -23, -22 }, - { -21, -20 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, - { -19, -18 }, { -17, -16 }, { 111, 112 }, { -15, -14 }, - { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, - { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } -}; - -static const int8_t f_huffman_env_1_5dB[120][2] = { - { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, - { 5, 6 }, { -67, -62 }, { 7, 8 }, { -68, -61 }, - { 9, 10 }, { -69, -60 }, { 11, 13 }, { -70, 12 }, - { -59, -71 }, { 14, 16 }, { -58, 15 }, { -72, -57 }, - { 17, 19 }, { -73, 18 }, { -56, -74 }, { 20, 23 }, - { 21, 22 }, { -55, -75 }, { -54, -53 }, { 24, 27 }, - { 25, 26 }, { -76, -52 }, { -77, -51 }, { 28, 31 }, - { 29, 30 }, { -50, -78 }, { -79, -49 }, { 32, 36 }, - { 33, 34 }, { -48, -47 }, { -80, 35 }, { -81, -82 }, - { 37, 47 }, { 38, 41 }, { 39, 40 }, { -83, -46 }, - { -45, -84 }, { 42, 44 }, { -85, 43 }, { -44, -43 }, - { 45, 46 }, { -88, -87 }, { -86, -90 }, { 48, 66 }, - { 49, 56 }, { 50, 53 }, { 51, 52 }, { -92, -42 }, - { -41, -39 }, { 54, 55 }, {-105, -89 }, { -38, -37 }, - { 57, 60 }, { 58, 59 }, { -94, -91 }, { -40, -36 }, - { 61, 63 }, { -20, 62 }, {-115,-110 }, { 64, 65 }, - {-108,-107 }, {-101, -97 }, { 67, 89 }, { 68, 75 }, - { 69, 72 }, { 70, 71 }, { -95, -93 }, { -34, -27 }, - { 73, 74 }, { -22, -17 }, { -16,-124 }, { 76, 82 }, - { 77, 79 }, {-123, 78 }, {-122,-121 }, { 80, 81 }, - {-120,-119 }, {-118,-117 }, { 83, 86 }, { 84, 85 }, - {-116,-114 }, {-113,-112 }, { 87, 88 }, {-111,-109 }, - {-106,-104 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, - { 93, 94 }, {-103,-102 }, {-100, -99 }, { 96, 97 }, - { -98, -96 }, { -35, -33 }, { 99, 102 }, { 100, 101 }, - { -32, -31 }, { -30, -29 }, { 103, 104 }, { -28, -26 }, - { -25, -24 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, - { -23, -21 }, { -19, -18 }, { 111, 112 }, { -15, -14 }, - { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, - { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } -}; - -static const int8_t t_huffman_env_bal_1_5dB[48][2] = { - { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, - { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, - { -68, 9 }, { 10, 11 }, { -69, -59 }, { 12, 13 }, - { -70, -58 }, { 14, 28 }, { 15, 21 }, { 16, 18 }, - { -57, 17 }, { -71, -56 }, { 19, 20 }, { -88, -87 }, - { -86, -85 }, { 22, 25 }, { 23, 24 }, { -84, -83 }, - { -82, -81 }, { 26, 27 }, { -80, -79 }, { -78, -77 }, - { 29, 36 }, { 30, 33 }, { 31, 32 }, { -76, -75 }, - { -74, -73 }, { 34, 35 }, { -72, -55 }, { -54, -53 }, - { 37, 41 }, { 38, 39 }, { -52, -51 }, { -50, 40 }, - { -49, -48 }, { 42, 45 }, { 43, 44 }, { -47, -46 }, - { -45, -44 }, { 46, 47 }, { -43, -42 }, { -41, -40 } -}; - -static const int8_t f_huffman_env_bal_1_5dB[48][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 11 }, { -69, -59 }, { -70, 12 }, - { -58, 13 }, { 14, 17 }, { -71, 15 }, { -57, 16 }, - { -56, -73 }, { 18, 32 }, { 19, 25 }, { 20, 22 }, - { -72, 21 }, { -88, -87 }, { 23, 24 }, { -86, -85 }, - { -84, -83 }, { 26, 29 }, { 27, 28 }, { -82, -81 }, - { -80, -79 }, { 30, 31 }, { -78, -77 }, { -76, -75 }, - { 33, 40 }, { 34, 37 }, { 35, 36 }, { -74, -55 }, - { -54, -53 }, { 38, 39 }, { -52, -51 }, { -50, -49 }, - { 41, 44 }, { 42, 43 }, { -48, -47 }, { -46, -45 }, - { 45, 46 }, { -44, -43 }, { -42, 47 }, { -41, -40 } -}; - -static const int8_t t_huffman_env_3_0dB[62][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -67, 6 }, { -61, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 11 }, { -69, -59 }, { 12, 14 }, - { -70, 13 }, { -71, -58 }, { 15, 18 }, { 16, 17 }, - { -72, -57 }, { -73, -74 }, { 19, 22 }, { -56, 20 }, - { -55, 21 }, { -54, -77 }, { 23, 31 }, { 24, 25 }, - { -75, -76 }, { 26, 27 }, { -78, -53 }, { 28, 29 }, - { -52, -95 }, { -94, 30 }, { -93, -92 }, { 32, 47 }, - { 33, 40 }, { 34, 37 }, { 35, 36 }, { -91, -90 }, - { -89, -88 }, { 38, 39 }, { -87, -86 }, { -85, -84 }, - { 41, 44 }, { 42, 43 }, { -83, -82 }, { -81, -80 }, - { 45, 46 }, { -79, -51 }, { -50, -49 }, { 48, 55 }, - { 49, 52 }, { 50, 51 }, { -48, -47 }, { -46, -45 }, - { 53, 54 }, { -44, -43 }, { -42, -41 }, { 56, 59 }, - { 57, 58 }, { -40, -39 }, { -38, -37 }, { 60, 61 }, - { -36, -35 }, { -34, -33 } -}; - -static const int8_t f_huffman_env_3_0dB[62][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, - { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, - { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, - { 17, 19 }, { -56, 18 }, { -55, -73 }, { 20, 24 }, - { 21, 22 }, { -74, -54 }, { -53, 23 }, { -75, -76 }, - { 25, 30 }, { 26, 27 }, { -52, -51 }, { 28, 29 }, - { -77, -79 }, { -50, -49 }, { 31, 39 }, { 32, 35 }, - { 33, 34 }, { -78, -46 }, { -82, -88 }, { 36, 37 }, - { -83, -48 }, { -47, 38 }, { -86, -85 }, { 40, 47 }, - { 41, 44 }, { 42, 43 }, { -80, -44 }, { -43, -42 }, - { 45, 46 }, { -39, -87 }, { -84, -40 }, { 48, 55 }, - { 49, 52 }, { 50, 51 }, { -95, -94 }, { -93, -92 }, - { 53, 54 }, { -91, -90 }, { -89, -81 }, { 56, 59 }, - { 57, 58 }, { -45, -41 }, { -38, -37 }, { 60, 61 }, - { -36, -35 }, { -34, -33 } -}; - -static const int8_t t_huffman_env_bal_3_0dB[24][2] = { - { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, - { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 16 }, { 11, 13 }, { -69, 12 }, - { -76, -75 }, { 14, 15 }, { -74, -73 }, { -72, -71 }, - { 17, 20 }, { 18, 19 }, { -70, -59 }, { -58, -57 }, - { 21, 22 }, { -56, -55 }, { -54, 23 }, { -53, -52 } -}; - -static const int8_t f_huffman_env_bal_3_0dB[24][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, - { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, - { -60, 9 }, { 10, 13 }, { -69, 11 }, { -59, 12 }, - { -58, -76 }, { 14, 17 }, { 15, 16 }, { -75, -74 }, - { -73, -72 }, { 18, 21 }, { 19, 20 }, { -71, -70 }, - { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } -}; - - -static const int8_t t_huffman_noise_3_0dB[62][2] = { - { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, - { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, - { 9, 30 }, { 10, 15 }, { -60, 11 }, { -69, 12 }, - { 13, 14 }, { -59, -53 }, { -95, -94 }, { 16, 23 }, - { 17, 20 }, { 18, 19 }, { -93, -92 }, { -91, -90 }, - { 21, 22 }, { -89, -88 }, { -87, -86 }, { 24, 27 }, - { 25, 26 }, { -85, -84 }, { -83, -82 }, { 28, 29 }, - { -81, -80 }, { -79, -78 }, { 31, 46 }, { 32, 39 }, - { 33, 36 }, { 34, 35 }, { -77, -76 }, { -75, -74 }, - { 37, 38 }, { -73, -72 }, { -71, -70 }, { 40, 43 }, - { 41, 42 }, { -58, -57 }, { -56, -55 }, { 44, 45 }, - { -54, -52 }, { -51, -50 }, { 47, 54 }, { 48, 51 }, - { 49, 50 }, { -49, -48 }, { -47, -46 }, { 52, 53 }, - { -45, -44 }, { -43, -42 }, { 55, 58 }, { 56, 57 }, - { -41, -40 }, { -39, -38 }, { 59, 60 }, { -37, -36 }, - { -35, 61 }, { -34, -33 } -}; - -static const int8_t t_huffman_noise_bal_3_0dB[24][2] = { - { -64, 1 }, { -65, 2 }, { -63, 3 }, { 4, 9 }, - { -66, 5 }, { -62, 6 }, { 7, 8 }, { -76, -75 }, - { -74, -73 }, { 10, 17 }, { 11, 14 }, { 12, 13 }, - { -72, -71 }, { -70, -69 }, { 15, 16 }, { -68, -67 }, - { -61, -60 }, { 18, 21 }, { 19, 20 }, { -59, -58 }, - { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } -}; - - -static INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff) -{ - uint8_t bit; - int16_t index = 0; - - while (index >= 0) - { - bit = (uint8_t)faad_getbits(ld, 1); - index = t_huff[index][bit]; - } - - return index + 64; -} - -/* table 10 */ -void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t env, band; - int8_t delta = 0; - sbr_huff_tab t_huff, f_huff; - - if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX)) - sbr->amp_res[ch] = 0; - else - sbr->amp_res[ch] = sbr->bs_amp_res; - - if ((sbr->bs_coupling) && (ch == 1)) - { - delta = 1; - if (sbr->amp_res[ch]) - { - t_huff = t_huffman_env_bal_3_0dB; - f_huff = f_huffman_env_bal_3_0dB; - } else { - t_huff = t_huffman_env_bal_1_5dB; - f_huff = f_huffman_env_bal_1_5dB; - } - } else { - delta = 0; - if (sbr->amp_res[ch]) - { - t_huff = t_huffman_env_3_0dB; - f_huff = f_huffman_env_3_0dB; - } else { - t_huff = t_huffman_env_1_5dB; - f_huff = f_huffman_env_1_5dB; - } - } - - for (env = 0; env < sbr->L_E[ch]; env++) - { - if (sbr->bs_df_env[ch][env] == 0) - { - if ((sbr->bs_coupling == 1) && (ch == 1)) - { - if (sbr->amp_res[ch]) - { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 5 - DEBUGVAR(1,272,"sbr_envelope(): bs_data_env")) << delta); - } else { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 - DEBUGVAR(1,273,"sbr_envelope(): bs_data_env")) << delta); - } - } else { - if (sbr->amp_res[ch]) - { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 - DEBUGVAR(1,274,"sbr_envelope(): bs_data_env")) << delta); - } else { - sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 7 - DEBUGVAR(1,275,"sbr_envelope(): bs_data_env")) << delta); - } - } - - for (band = 1; band < sbr->n[sbr->f[ch][env]]; band++) - { - sbr->E[ch][band][env] = (sbr_huff_dec(ld, f_huff) << delta); - } - - } else { - for (band = 0; band < sbr->n[sbr->f[ch][env]]; band++) - { - sbr->E[ch][band][env] = (sbr_huff_dec(ld, t_huff) << delta); - } - } - } - - extract_envelope_data(sbr, ch); -} - -/* table 11 */ -void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t noise, band; - int8_t delta = 0; - sbr_huff_tab t_huff, f_huff; - - if ((sbr->bs_coupling == 1) && (ch == 1)) - { - delta = 1; - t_huff = t_huffman_noise_bal_3_0dB; - f_huff = f_huffman_env_bal_3_0dB; - } else { - delta = 0; - t_huff = t_huffman_noise_3_0dB; - f_huff = f_huffman_env_3_0dB; - } - - for (noise = 0; noise < sbr->L_Q[ch]; noise++) - { - if(sbr->bs_df_noise[ch][noise] == 0) - { - if ((sbr->bs_coupling == 1) && (ch == 1)) - { - sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 - DEBUGVAR(1,276,"sbr_noise(): bs_data_noise")) << delta); - } else { - sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 - DEBUGVAR(1,277,"sbr_noise(): bs_data_noise")) << delta); - } - for (band = 1; band < sbr->N_Q; band++) - { - sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, f_huff) << delta); - } - } else { - for (band = 0; band < sbr->N_Q; band++) - { - sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, t_huff) << delta); - } - } - } - - extract_noise_floor_data(sbr, ch); -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_huff.c,v 1.21 2007/11/01 12:33:35 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include "sbr_syntax.h" +#include "bits.h" +#include "sbr_huff.h" +#include "sbr_e_nf.h" + + +typedef const int8_t (*sbr_huff_tab)[2]; + +static const int8_t t_huffman_env_1_5dB[120][2] = { + { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, + { 5, 6 }, { -62, -67 }, { 7, 8 }, { -61, -68 }, + { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, + { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, + { 17, 18 }, { -73, -56 }, { 19, 21 }, { -74, 20 }, + { -55, -75 }, { 22, 26 }, { 23, 24 }, { -54, -76 }, + { -77, 25 }, { -53, -78 }, { 27, 34 }, { 28, 29 }, + { -52, -79 }, { 30, 31 }, { -80, -51 }, { 32, 33 }, + { -83, -82 }, { -81, -50 }, { 35, 57 }, { 36, 40 }, + { 37, 38 }, { -88, -84 }, { -48, 39 }, { -90, -85 }, + { 41, 46 }, { 42, 43 }, { -49, -87 }, { 44, 45 }, + { -89, -86 }, {-124,-123 }, { 47, 50 }, { 48, 49 }, + {-122,-121 }, {-120,-119 }, { 51, 54 }, { 52, 53 }, + {-118,-117 }, {-116,-115 }, { 55, 56 }, {-114,-113 }, + {-112,-111 }, { 58, 89 }, { 59, 74 }, { 60, 67 }, + { 61, 64 }, { 62, 63 }, {-110,-109 }, {-108,-107 }, + { 65, 66 }, {-106,-105 }, {-104,-103 }, { 68, 71 }, + { 69, 70 }, {-102,-101 }, {-100, -99 }, { 72, 73 }, + { -98, -97 }, { -96, -95 }, { 75, 82 }, { 76, 79 }, + { 77, 78 }, { -94, -93 }, { -92, -91 }, { 80, 81 }, + { -47, -46 }, { -45, -44 }, { 83, 86 }, { 84, 85 }, + { -43, -42 }, { -41, -40 }, { 87, 88 }, { -39, -38 }, + { -37, -36 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, + { 93, 94 }, { -35, -34 }, { -33, -32 }, { 96, 97 }, + { -31, -30 }, { -29, -28 }, { 99, 102 }, { 100, 101 }, + { -27, -26 }, { -25, -24 }, { 103, 104 }, { -23, -22 }, + { -21, -20 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, + { -19, -18 }, { -17, -16 }, { 111, 112 }, { -15, -14 }, + { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, + { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } +}; + +static const int8_t f_huffman_env_1_5dB[120][2] = { + { 1, 2 }, { -64, -65 }, { 3, 4 }, { -63, -66 }, + { 5, 6 }, { -67, -62 }, { 7, 8 }, { -68, -61 }, + { 9, 10 }, { -69, -60 }, { 11, 13 }, { -70, 12 }, + { -59, -71 }, { 14, 16 }, { -58, 15 }, { -72, -57 }, + { 17, 19 }, { -73, 18 }, { -56, -74 }, { 20, 23 }, + { 21, 22 }, { -55, -75 }, { -54, -53 }, { 24, 27 }, + { 25, 26 }, { -76, -52 }, { -77, -51 }, { 28, 31 }, + { 29, 30 }, { -50, -78 }, { -79, -49 }, { 32, 36 }, + { 33, 34 }, { -48, -47 }, { -80, 35 }, { -81, -82 }, + { 37, 47 }, { 38, 41 }, { 39, 40 }, { -83, -46 }, + { -45, -84 }, { 42, 44 }, { -85, 43 }, { -44, -43 }, + { 45, 46 }, { -88, -87 }, { -86, -90 }, { 48, 66 }, + { 49, 56 }, { 50, 53 }, { 51, 52 }, { -92, -42 }, + { -41, -39 }, { 54, 55 }, {-105, -89 }, { -38, -37 }, + { 57, 60 }, { 58, 59 }, { -94, -91 }, { -40, -36 }, + { 61, 63 }, { -20, 62 }, {-115,-110 }, { 64, 65 }, + {-108,-107 }, {-101, -97 }, { 67, 89 }, { 68, 75 }, + { 69, 72 }, { 70, 71 }, { -95, -93 }, { -34, -27 }, + { 73, 74 }, { -22, -17 }, { -16,-124 }, { 76, 82 }, + { 77, 79 }, {-123, 78 }, {-122,-121 }, { 80, 81 }, + {-120,-119 }, {-118,-117 }, { 83, 86 }, { 84, 85 }, + {-116,-114 }, {-113,-112 }, { 87, 88 }, {-111,-109 }, + {-106,-104 }, { 90, 105 }, { 91, 98 }, { 92, 95 }, + { 93, 94 }, {-103,-102 }, {-100, -99 }, { 96, 97 }, + { -98, -96 }, { -35, -33 }, { 99, 102 }, { 100, 101 }, + { -32, -31 }, { -30, -29 }, { 103, 104 }, { -28, -26 }, + { -25, -24 }, { 106, 113 }, { 107, 110 }, { 108, 109 }, + { -23, -21 }, { -19, -18 }, { 111, 112 }, { -15, -14 }, + { -13, -12 }, { 114, 117 }, { 115, 116 }, { -11, -10 }, + { -9, -8 }, { 118, 119 }, { -7, -6 }, { -5, -4 } +}; + +static const int8_t t_huffman_env_bal_1_5dB[48][2] = { + { -64, 1 }, { -63, 2 }, { -65, 3 }, { -62, 4 }, + { -66, 5 }, { -61, 6 }, { -67, 7 }, { -60, 8 }, + { -68, 9 }, { 10, 11 }, { -69, -59 }, { 12, 13 }, + { -70, -58 }, { 14, 28 }, { 15, 21 }, { 16, 18 }, + { -57, 17 }, { -71, -56 }, { 19, 20 }, { -88, -87 }, + { -86, -85 }, { 22, 25 }, { 23, 24 }, { -84, -83 }, + { -82, -81 }, { 26, 27 }, { -80, -79 }, { -78, -77 }, + { 29, 36 }, { 30, 33 }, { 31, 32 }, { -76, -75 }, + { -74, -73 }, { 34, 35 }, { -72, -55 }, { -54, -53 }, + { 37, 41 }, { 38, 39 }, { -52, -51 }, { -50, 40 }, + { -49, -48 }, { 42, 45 }, { 43, 44 }, { -47, -46 }, + { -45, -44 }, { 46, 47 }, { -43, -42 }, { -41, -40 } +}; + +static const int8_t f_huffman_env_bal_1_5dB[48][2] = { + { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, + { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, + { -60, 9 }, { 10, 11 }, { -69, -59 }, { -70, 12 }, + { -58, 13 }, { 14, 17 }, { -71, 15 }, { -57, 16 }, + { -56, -73 }, { 18, 32 }, { 19, 25 }, { 20, 22 }, + { -72, 21 }, { -88, -87 }, { 23, 24 }, { -86, -85 }, + { -84, -83 }, { 26, 29 }, { 27, 28 }, { -82, -81 }, + { -80, -79 }, { 30, 31 }, { -78, -77 }, { -76, -75 }, + { 33, 40 }, { 34, 37 }, { 35, 36 }, { -74, -55 }, + { -54, -53 }, { 38, 39 }, { -52, -51 }, { -50, -49 }, + { 41, 44 }, { 42, 43 }, { -48, -47 }, { -46, -45 }, + { 45, 46 }, { -44, -43 }, { -42, 47 }, { -41, -40 } +}; + +static const int8_t t_huffman_env_3_0dB[62][2] = { + { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, + { -62, 5 }, { -67, 6 }, { -61, 7 }, { -68, 8 }, + { -60, 9 }, { 10, 11 }, { -69, -59 }, { 12, 14 }, + { -70, 13 }, { -71, -58 }, { 15, 18 }, { 16, 17 }, + { -72, -57 }, { -73, -74 }, { 19, 22 }, { -56, 20 }, + { -55, 21 }, { -54, -77 }, { 23, 31 }, { 24, 25 }, + { -75, -76 }, { 26, 27 }, { -78, -53 }, { 28, 29 }, + { -52, -95 }, { -94, 30 }, { -93, -92 }, { 32, 47 }, + { 33, 40 }, { 34, 37 }, { 35, 36 }, { -91, -90 }, + { -89, -88 }, { 38, 39 }, { -87, -86 }, { -85, -84 }, + { 41, 44 }, { 42, 43 }, { -83, -82 }, { -81, -80 }, + { 45, 46 }, { -79, -51 }, { -50, -49 }, { 48, 55 }, + { 49, 52 }, { 50, 51 }, { -48, -47 }, { -46, -45 }, + { 53, 54 }, { -44, -43 }, { -42, -41 }, { 56, 59 }, + { 57, 58 }, { -40, -39 }, { -38, -37 }, { 60, 61 }, + { -36, -35 }, { -34, -33 } +}; + +static const int8_t f_huffman_env_3_0dB[62][2] = { + { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, + { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, + { 9, 10 }, { -60, -69 }, { 11, 12 }, { -59, -70 }, + { 13, 14 }, { -58, -71 }, { 15, 16 }, { -57, -72 }, + { 17, 19 }, { -56, 18 }, { -55, -73 }, { 20, 24 }, + { 21, 22 }, { -74, -54 }, { -53, 23 }, { -75, -76 }, + { 25, 30 }, { 26, 27 }, { -52, -51 }, { 28, 29 }, + { -77, -79 }, { -50, -49 }, { 31, 39 }, { 32, 35 }, + { 33, 34 }, { -78, -46 }, { -82, -88 }, { 36, 37 }, + { -83, -48 }, { -47, 38 }, { -86, -85 }, { 40, 47 }, + { 41, 44 }, { 42, 43 }, { -80, -44 }, { -43, -42 }, + { 45, 46 }, { -39, -87 }, { -84, -40 }, { 48, 55 }, + { 49, 52 }, { 50, 51 }, { -95, -94 }, { -93, -92 }, + { 53, 54 }, { -91, -90 }, { -89, -81 }, { 56, 59 }, + { 57, 58 }, { -45, -41 }, { -38, -37 }, { 60, 61 }, + { -36, -35 }, { -34, -33 } +}; + +static const int8_t t_huffman_env_bal_3_0dB[24][2] = { + { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, + { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, + { -60, 9 }, { 10, 16 }, { 11, 13 }, { -69, 12 }, + { -76, -75 }, { 14, 15 }, { -74, -73 }, { -72, -71 }, + { 17, 20 }, { 18, 19 }, { -70, -59 }, { -58, -57 }, + { 21, 22 }, { -56, -55 }, { -54, 23 }, { -53, -52 } +}; + +static const int8_t f_huffman_env_bal_3_0dB[24][2] = { + { -64, 1 }, { -65, 2 }, { -63, 3 }, { -66, 4 }, + { -62, 5 }, { -61, 6 }, { -67, 7 }, { -68, 8 }, + { -60, 9 }, { 10, 13 }, { -69, 11 }, { -59, 12 }, + { -58, -76 }, { 14, 17 }, { 15, 16 }, { -75, -74 }, + { -73, -72 }, { 18, 21 }, { 19, 20 }, { -71, -70 }, + { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } +}; + +static const int8_t t_huffman_noise_3_0dB[62][2] = { + { -64, 1 }, { -63, 2 }, { -65, 3 }, { -66, 4 }, + { -62, 5 }, { -67, 6 }, { 7, 8 }, { -61, -68 }, + { 9, 30 }, { 10, 15 }, { -60, 11 }, { -69, 12 }, + { 13, 14 }, { -59, -53 }, { -95, -94 }, { 16, 23 }, + { 17, 20 }, { 18, 19 }, { -93, -92 }, { -91, -90 }, + { 21, 22 }, { -89, -88 }, { -87, -86 }, { 24, 27 }, + { 25, 26 }, { -85, -84 }, { -83, -82 }, { 28, 29 }, + { -81, -80 }, { -79, -78 }, { 31, 46 }, { 32, 39 }, + { 33, 36 }, { 34, 35 }, { -77, -76 }, { -75, -74 }, + { 37, 38 }, { -73, -72 }, { -71, -70 }, { 40, 43 }, + { 41, 42 }, { -58, -57 }, { -56, -55 }, { 44, 45 }, + { -54, -52 }, { -51, -50 }, { 47, 54 }, { 48, 51 }, + { 49, 50 }, { -49, -48 }, { -47, -46 }, { 52, 53 }, + { -45, -44 }, { -43, -42 }, { 55, 58 }, { 56, 57 }, + { -41, -40 }, { -39, -38 }, { 59, 60 }, { -37, -36 }, + { -35, 61 }, { -34, -33 } +}; + +static const int8_t t_huffman_noise_bal_3_0dB[24][2] = { + { -64, 1 }, { -65, 2 }, { -63, 3 }, { 4, 9 }, + { -66, 5 }, { -62, 6 }, { 7, 8 }, { -76, -75 }, + { -74, -73 }, { 10, 17 }, { 11, 14 }, { 12, 13 }, + { -72, -71 }, { -70, -69 }, { 15, 16 }, { -68, -67 }, + { -61, -60 }, { 18, 21 }, { 19, 20 }, { -59, -58 }, + { -57, -56 }, { 22, 23 }, { -55, -54 }, { -53, -52 } +}; + + +static INLINE int16_t sbr_huff_dec(bitfile *ld, sbr_huff_tab t_huff) +{ + uint8_t bit; + int16_t index = 0; + + while (index >= 0) + { + bit = (uint8_t)faad_get1bit(ld); + index = t_huff[index][bit]; + } + + return index + 64; +} + +/* table 10 */ +void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch) +{ + uint8_t env, band; + int8_t delta = 0; + sbr_huff_tab t_huff, f_huff; + + if ((sbr->L_E[ch] == 1) && (sbr->bs_frame_class[ch] == FIXFIX)) + sbr->amp_res[ch] = 0; + else + sbr->amp_res[ch] = sbr->bs_amp_res; + + if ((sbr->bs_coupling) && (ch == 1)) + { + delta = 1; + if (sbr->amp_res[ch]) + { + t_huff = t_huffman_env_bal_3_0dB; + f_huff = f_huffman_env_bal_3_0dB; + } else { + t_huff = t_huffman_env_bal_1_5dB; + f_huff = f_huffman_env_bal_1_5dB; + } + } else { + delta = 0; + if (sbr->amp_res[ch]) + { + t_huff = t_huffman_env_3_0dB; + f_huff = f_huffman_env_3_0dB; + } else { + t_huff = t_huffman_env_1_5dB; + f_huff = f_huffman_env_1_5dB; + } + } + + for (env = 0; env < sbr->L_E[ch]; env++) + { + if (sbr->bs_df_env[ch][env] == 0) + { + if ((sbr->bs_coupling == 1) && (ch == 1)) + { + if (sbr->amp_res[ch]) + { + sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 5 + DEBUGVAR(1,272,"sbr_envelope(): bs_data_env")) << delta); + } else { + sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 + DEBUGVAR(1,273,"sbr_envelope(): bs_data_env")) << delta); + } + } else { + if (sbr->amp_res[ch]) + { + sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 6 + DEBUGVAR(1,274,"sbr_envelope(): bs_data_env")) << delta); + } else { + sbr->E[ch][0][env] = (uint16_t)(faad_getbits(ld, 7 + DEBUGVAR(1,275,"sbr_envelope(): bs_data_env")) << delta); + } + } + + for (band = 1; band < sbr->n[sbr->f[ch][env]]; band++) + { + sbr->E[ch][band][env] = (sbr_huff_dec(ld, f_huff) << delta); + } + + } else { + for (band = 0; band < sbr->n[sbr->f[ch][env]]; band++) + { + sbr->E[ch][band][env] = (sbr_huff_dec(ld, t_huff) << delta); + } + } + } + + extract_envelope_data(sbr, ch); +} + +/* table 11 */ +void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch) +{ + uint8_t noise, band; + int8_t delta = 0; + sbr_huff_tab t_huff, f_huff; + + if ((sbr->bs_coupling == 1) && (ch == 1)) + { + delta = 1; + t_huff = t_huffman_noise_bal_3_0dB; + f_huff = f_huffman_env_bal_3_0dB; + } else { + delta = 0; + t_huff = t_huffman_noise_3_0dB; + f_huff = f_huffman_env_3_0dB; + } + + for (noise = 0; noise < sbr->L_Q[ch]; noise++) + { + if(sbr->bs_df_noise[ch][noise] == 0) + { + if ((sbr->bs_coupling == 1) && (ch == 1)) + { + sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 + DEBUGVAR(1,276,"sbr_noise(): bs_data_noise")) << delta); + } else { + sbr->Q[ch][0][noise] = (faad_getbits(ld, 5 + DEBUGVAR(1,277,"sbr_noise(): bs_data_noise")) << delta); + } + for (band = 1; band < sbr->N_Q; band++) + { + sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, f_huff) << delta); + } + } else { + for (band = 0; band < sbr->N_Q; band++) + { + sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, t_huff) << delta); + } + } + } + + extract_noise_floor_data(sbr, ch); +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_huff.h b/src/contrib/aacdecoder/libfaad/sbr_huff.h old mode 100644 new mode 100755 index f83f6356b..f749f2e08 --- a/src/contrib/aacdecoder/libfaad/sbr_huff.h +++ b/src/contrib/aacdecoder/libfaad/sbr_huff.h @@ -1,43 +1,46 @@ -/* -** 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: sbr_huff.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_HUFF_H__ -#define __SBR_HUFF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch); -void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch); - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_huff.h,v 1.21 2007/11/01 12:33:35 menno Exp $ +**/ + +#ifndef __SBR_HUFF_H__ +#define __SBR_HUFF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch); +void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_noise.h b/src/contrib/aacdecoder/libfaad/sbr_noise.h old mode 100644 new mode 100755 index f1717de4e..1cf7190de --- a/src/contrib/aacdecoder/libfaad/sbr_noise.h +++ b/src/contrib/aacdecoder/libfaad/sbr_noise.h @@ -1,561 +1,564 @@ -/* -** 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: sbr_noise.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_NOISE_H__ -#define __SBR_NOISE_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - - -/* Table 1.A.13 Noise table V */ -ALIGN static const complex_t V[] = { - { FRAC_CONST(-0.99948155879974), FRAC_CONST(-0.59483414888382) }, - { FRAC_CONST(0.97113454341888), FRAC_CONST(-0.67528516054153) }, - { FRAC_CONST(0.14130051434040), FRAC_CONST(-0.95090985298157) }, - { FRAC_CONST(-0.47005495429039), FRAC_CONST(-0.37340548634529) }, - { FRAC_CONST(0.80705064535141), FRAC_CONST(0.29653668403625) }, - { FRAC_CONST(-0.38981479406357), FRAC_CONST(0.89572608470917) }, - { FRAC_CONST(-0.01053049881011), FRAC_CONST(-0.66959059238434) }, - { FRAC_CONST(-0.91266369819641), FRAC_CONST(-0.11522938311100) }, - { FRAC_CONST(0.54840421676636), FRAC_CONST(0.75221365690231) }, - { FRAC_CONST(0.40009254217148), FRAC_CONST(-0.98929399251938) }, - { FRAC_CONST(-0.99867975711823), FRAC_CONST(-0.88147068023682) }, - { FRAC_CONST(-0.95531076192856), FRAC_CONST(0.90908759832382) }, - { FRAC_CONST(-0.45725932717323), FRAC_CONST(-0.56716322898865) }, - { FRAC_CONST(-0.72929674386978), FRAC_CONST(-0.98008275032043) }, - { FRAC_CONST(0.75622802972794), FRAC_CONST(0.20950329303741) }, - { FRAC_CONST(0.07069442421198), FRAC_CONST(-0.78247898817062) }, - { FRAC_CONST(0.74496251344681), FRAC_CONST(-0.91169005632401) }, - { FRAC_CONST(-0.96440184116364), FRAC_CONST(-0.94739919900894) }, - { FRAC_CONST(0.30424630641937), FRAC_CONST(-0.49438267946243) }, - { FRAC_CONST(0.66565030813217), FRAC_CONST(0.64652937650681) }, - { FRAC_CONST(0.91697007417679), FRAC_CONST(0.17514097690582) }, - { FRAC_CONST(-0.70774918794632), FRAC_CONST(0.52548652887344) }, - { FRAC_CONST(-0.70051413774490), FRAC_CONST(-0.45340028405190) }, - { FRAC_CONST(-0.99496513605118), FRAC_CONST(-0.90071910619736) }, - { FRAC_CONST(0.98164492845535), FRAC_CONST(-0.77463155984879) }, - { FRAC_CONST(-0.54671579599380), FRAC_CONST(-0.02570928446949) }, - { FRAC_CONST(-0.01689629070461), FRAC_CONST(0.00287506449968) }, - { FRAC_CONST(-0.86110347509384), FRAC_CONST(0.42548584938049) }, - { FRAC_CONST(-0.98892980813980), FRAC_CONST(-0.87881129980087) }, - { FRAC_CONST(0.51756626367569), FRAC_CONST(0.66926783323288) }, - { FRAC_CONST(-0.99635028839111), FRAC_CONST(-0.58107727766037) }, - { FRAC_CONST(-0.99969369173050), FRAC_CONST(0.98369991779327) }, - { FRAC_CONST(0.55266261100769), FRAC_CONST(0.59449058771133) }, - { FRAC_CONST(0.34581178426743), FRAC_CONST(0.94879418611526) }, - { FRAC_CONST(0.62664210796356), FRAC_CONST(-0.74402970075607) }, - { FRAC_CONST(-0.77149701118469), FRAC_CONST(-0.33883658051491) }, - { FRAC_CONST(-0.91592246294022), FRAC_CONST(0.03687901422381) }, - { FRAC_CONST(-0.76285493373871), FRAC_CONST(-0.91371870040894) }, - { FRAC_CONST(0.79788339138031), FRAC_CONST(-0.93180972337723) }, - { FRAC_CONST(0.54473078250885), FRAC_CONST(-0.11919206380844) }, - { FRAC_CONST(-0.85639280080795), FRAC_CONST(0.42429855465889) }, - { FRAC_CONST(-0.92882400751114), FRAC_CONST(0.27871808409691) }, - { FRAC_CONST(-0.11708371341228), FRAC_CONST(-0.99800843000412) }, - { FRAC_CONST(0.21356749534607), FRAC_CONST(-0.90716296434402) }, - { FRAC_CONST(-0.76191693544388), FRAC_CONST(0.99768120050430) }, - { FRAC_CONST(0.98111045360565), FRAC_CONST(-0.95854461193085) }, - { FRAC_CONST(-0.85913270711899), FRAC_CONST(0.95766568183899) }, - { FRAC_CONST(-0.93307244777679), FRAC_CONST(0.49431759119034) }, - { FRAC_CONST(0.30485755205154), FRAC_CONST(-0.70540034770966) }, - { FRAC_CONST(0.85289651155472), FRAC_CONST(0.46766132116318) }, - { FRAC_CONST(0.91328084468842), FRAC_CONST(-0.99839597940445) }, - { FRAC_CONST(-0.05890199914575), FRAC_CONST(0.70741826295853) }, - { FRAC_CONST(0.28398686647415), FRAC_CONST(0.34633556008339) }, - { FRAC_CONST(0.95258164405823), FRAC_CONST(-0.54893416166306) }, - { FRAC_CONST(-0.78566324710846), FRAC_CONST(-0.75568538904190) }, - { FRAC_CONST(-0.95789498090744), FRAC_CONST(-0.20423194766045) }, - { FRAC_CONST(0.82411158084869), FRAC_CONST(0.96654617786407) }, - { FRAC_CONST(-0.65185445547104), FRAC_CONST(-0.88734990358353) }, - { FRAC_CONST(-0.93643605709076), FRAC_CONST(0.99870789051056) }, - { FRAC_CONST(0.91427159309387), FRAC_CONST(-0.98290503025055) }, - { FRAC_CONST(-0.70395684242249), FRAC_CONST(0.58796799182892) }, - { FRAC_CONST(0.00563771976158), FRAC_CONST(0.61768198013306) }, - { FRAC_CONST(0.89065051078796), FRAC_CONST(0.52783352136612) }, - { FRAC_CONST(-0.68683707714081), FRAC_CONST(0.80806946754456) }, - { FRAC_CONST(0.72165340185165), FRAC_CONST(-0.69259858131409) }, - { FRAC_CONST(-0.62928247451782), FRAC_CONST(0.13627037405968) }, - { FRAC_CONST(0.29938435554504), FRAC_CONST(-0.46051329374313) }, - { FRAC_CONST(-0.91781955957413), FRAC_CONST(-0.74012714624405) }, - { FRAC_CONST(0.99298715591431), FRAC_CONST(0.40816611051559) }, - { FRAC_CONST(0.82368296384811), FRAC_CONST(-0.74036049842834) }, - { FRAC_CONST(-0.98512834310532), FRAC_CONST(-0.99972331523895) }, - { FRAC_CONST(-0.95915371179581), FRAC_CONST(-0.99237799644470) }, - { FRAC_CONST(-0.21411126852036), FRAC_CONST(-0.93424820899963) }, - { FRAC_CONST(-0.68821477890015), FRAC_CONST(-0.26892307400703) }, - { FRAC_CONST(0.91851997375488), FRAC_CONST(0.09358228743076) }, - { FRAC_CONST(-0.96062767505646), FRAC_CONST(0.36099094152451) }, - { FRAC_CONST(0.51646184921265), FRAC_CONST(-0.71373331546783) }, - { FRAC_CONST(0.61130720376968), FRAC_CONST(0.46950140595436) }, - { FRAC_CONST(0.47336128354073), FRAC_CONST(-0.27333179116249) }, - { FRAC_CONST(0.90998309850693), FRAC_CONST(0.96715664863586) }, - { FRAC_CONST(0.44844800233841), FRAC_CONST(0.99211573600769) }, - { FRAC_CONST(0.66614890098572), FRAC_CONST(0.96590173244476) }, - { FRAC_CONST(0.74922239780426), FRAC_CONST(-0.89879858493805) }, - { FRAC_CONST(-0.99571585655212), FRAC_CONST(0.52785521745682) }, - { FRAC_CONST(0.97401082515717), FRAC_CONST(-0.16855870187283) }, - { FRAC_CONST(0.72683745622635), FRAC_CONST(-0.48060774803162) }, - { FRAC_CONST(0.95432192087173), FRAC_CONST(0.68849605321884) }, - { FRAC_CONST(-0.72962206602097), FRAC_CONST(-0.76608443260193) }, - { FRAC_CONST(-0.85359477996826), FRAC_CONST(0.88738125562668) }, - { FRAC_CONST(-0.81412428617477), FRAC_CONST(-0.97480767965317) }, - { FRAC_CONST(-0.87930774688721), FRAC_CONST(0.74748307466507) }, - { FRAC_CONST(-0.71573328971863), FRAC_CONST(-0.98570609092712) }, - { FRAC_CONST(0.83524298667908), FRAC_CONST(0.83702534437180) }, - { FRAC_CONST(-0.48086065053940), FRAC_CONST(-0.98848503828049) }, - { FRAC_CONST(0.97139126062393), FRAC_CONST(0.80093622207642) }, - { FRAC_CONST(0.51992827653885), FRAC_CONST(0.80247628688812) }, - { FRAC_CONST(-0.00848591234535), FRAC_CONST(-0.76670128107071) }, - { FRAC_CONST(-0.70294374227524), FRAC_CONST(0.55359911918640) }, - { FRAC_CONST(-0.95894426107407), FRAC_CONST(-0.43265503644943) }, - { FRAC_CONST(0.97079253196716), FRAC_CONST(0.09325857460499) }, - { FRAC_CONST(-0.92404294013977), FRAC_CONST(0.85507702827454) }, - { FRAC_CONST(-0.69506472349167), FRAC_CONST(0.98633414506912) }, - { FRAC_CONST(0.26559203863144), FRAC_CONST(0.73314309120178) }, - { FRAC_CONST(0.28038442134857), FRAC_CONST(0.14537914097309) }, - { FRAC_CONST(-0.74138122797012), FRAC_CONST(0.99310338497162) }, - { FRAC_CONST(-0.01752796024084), FRAC_CONST(-0.82616633176804) }, - { FRAC_CONST(-0.55126774311066), FRAC_CONST(-0.98898541927338) }, - { FRAC_CONST(0.97960901260376), FRAC_CONST(-0.94021445512772) }, - { FRAC_CONST(-0.99196308851242), FRAC_CONST(0.67019015550613) }, - { FRAC_CONST(-0.67684930562973), FRAC_CONST(0.12631492316723) }, - { FRAC_CONST(0.09140039235353), FRAC_CONST(-0.20537731051445) }, - { FRAC_CONST(-0.71658962965012), FRAC_CONST(-0.97788202762604) }, - { FRAC_CONST(0.81014639139175), FRAC_CONST(0.53722649812698) }, - { FRAC_CONST(0.40616992115974), FRAC_CONST(-0.26469007134438) }, - { FRAC_CONST(-0.67680186033249), FRAC_CONST(0.94502049684525) }, - { FRAC_CONST(0.86849772930145), FRAC_CONST(-0.18333598971367) }, - { FRAC_CONST(-0.99500381946564), FRAC_CONST(-0.02634122036397) }, - { FRAC_CONST(0.84329187870026), FRAC_CONST(0.10406957566738) }, - { FRAC_CONST(-0.09215968847275), FRAC_CONST(0.69540011882782) }, - { FRAC_CONST(0.99956172704697), FRAC_CONST(-0.12358541786671) }, - { FRAC_CONST(-0.79732781648636), FRAC_CONST(-0.91582524776459) }, - { FRAC_CONST(0.96349972486496), FRAC_CONST(0.96640455722809) }, - { FRAC_CONST(-0.79942780733109), FRAC_CONST(0.64323902130127) }, - { FRAC_CONST(-0.11566039919853), FRAC_CONST(0.28587844967842) }, - { FRAC_CONST(-0.39922955632210), FRAC_CONST(0.94129604101181) }, - { FRAC_CONST(0.99089199304581), FRAC_CONST(-0.92062628269196) }, - { FRAC_CONST(0.28631284832954), FRAC_CONST(-0.91035044193268) }, - { FRAC_CONST(-0.83302724361420), FRAC_CONST(-0.67330408096313) }, - { FRAC_CONST(0.95404446125031), FRAC_CONST(0.49162766337395) }, - { FRAC_CONST(-0.06449863314629), FRAC_CONST(0.03250560909510) }, - { FRAC_CONST(-0.99575054645538), FRAC_CONST(0.42389783263206) }, - { FRAC_CONST(-0.65501141548157), FRAC_CONST(0.82546114921570) }, - { FRAC_CONST(-0.81254440546036), FRAC_CONST(-0.51627236604691) }, - { FRAC_CONST(-0.99646371603012), FRAC_CONST(0.84490531682968) }, - { FRAC_CONST(0.00287840608507), FRAC_CONST(0.64768260717392) }, - { FRAC_CONST(0.70176988840103), FRAC_CONST(-0.20453028380871) }, - { FRAC_CONST(0.96361881494522), FRAC_CONST(0.40706968307495) }, - { FRAC_CONST(-0.68883758783340), FRAC_CONST(0.91338956356049) }, - { FRAC_CONST(-0.34875586628914), FRAC_CONST(0.71472293138504) }, - { FRAC_CONST(0.91980081796646), FRAC_CONST(0.66507452726364) }, - { FRAC_CONST(-0.99009048938751), FRAC_CONST(0.85868018865585) }, - { FRAC_CONST(0.68865793943405), FRAC_CONST(0.55660319328308) }, - { FRAC_CONST(-0.99484401941299), FRAC_CONST(-0.20052559673786) }, - { FRAC_CONST(0.94214510917664), FRAC_CONST(-0.99696427583694) }, - { FRAC_CONST(-0.67414629459381), FRAC_CONST(0.49548220634460) }, - { FRAC_CONST(-0.47339352965355), FRAC_CONST(-0.85904330015182) }, - { FRAC_CONST(0.14323651790619), FRAC_CONST(-0.94145596027374) }, - { FRAC_CONST(-0.29268294572830), FRAC_CONST(0.05759225040674) }, - { FRAC_CONST(0.43793860077858), FRAC_CONST(-0.78904968500137) }, - { FRAC_CONST(-0.36345127224922), FRAC_CONST(0.64874434471130) }, - { FRAC_CONST(-0.08750604838133), FRAC_CONST(0.97686946392059) }, - { FRAC_CONST(-0.96495270729065), FRAC_CONST(-0.53960305452347) }, - { FRAC_CONST(0.55526942014694), FRAC_CONST(0.78891521692276) }, - { FRAC_CONST(0.73538213968277), FRAC_CONST(0.96452075242996) }, - { FRAC_CONST(-0.30889773368835), FRAC_CONST(-0.80664390325546) }, - { FRAC_CONST(0.03574995696545), FRAC_CONST(-0.97325617074966) }, - { FRAC_CONST(0.98720687627792), FRAC_CONST(0.48409134149551) }, - { FRAC_CONST(-0.81689298152924), FRAC_CONST(-0.90827703475952) }, - { FRAC_CONST(0.67866861820221), FRAC_CONST(0.81284505128860) }, - { FRAC_CONST(-0.15808570384979), FRAC_CONST(0.85279554128647) }, - { FRAC_CONST(0.80723392963409), FRAC_CONST(-0.24717418849468) }, - { FRAC_CONST(0.47788757085800), FRAC_CONST(-0.46333149075508) }, - { FRAC_CONST(0.96367555856705), FRAC_CONST(0.38486748933792) }, - { FRAC_CONST(-0.99143874645233), FRAC_CONST(-0.24945276975632) }, - { FRAC_CONST(0.83081877231598), FRAC_CONST(-0.94780850410461) }, - { FRAC_CONST(-0.58753192424774), FRAC_CONST(0.01290772389621) }, - { FRAC_CONST(0.95538109540939), FRAC_CONST(-0.85557049512863) }, - { FRAC_CONST(-0.96490919589996), FRAC_CONST(-0.64020973443985) }, - { FRAC_CONST(-0.97327101230621), FRAC_CONST(0.12378127872944) }, - { FRAC_CONST(0.91400367021561), FRAC_CONST(0.57972472906113) }, - { FRAC_CONST(-0.99925839900970), FRAC_CONST(0.71084845066071) }, - { FRAC_CONST(-0.86875903606415), FRAC_CONST(-0.20291699469090) }, - { FRAC_CONST(-0.26240035891533), FRAC_CONST(-0.68264555931091) }, - { FRAC_CONST(-0.24664412438869), FRAC_CONST(-0.87642270326614) }, - { FRAC_CONST(0.02416275814176), FRAC_CONST(0.27192914485931) }, - { FRAC_CONST(0.82068622112274), FRAC_CONST(-0.85087788105011) }, - { FRAC_CONST(0.88547372817993), FRAC_CONST(-0.89636802673340) }, - { FRAC_CONST(-0.18173077702522), FRAC_CONST(-0.26152145862579) }, - { FRAC_CONST(0.09355476498604), FRAC_CONST(0.54845124483109) }, - { FRAC_CONST(-0.54668414592743), FRAC_CONST(0.95980775356293) }, - { FRAC_CONST(0.37050989270210), FRAC_CONST(-0.59910142421722) }, - { FRAC_CONST(-0.70373594760895), FRAC_CONST(0.91227668523788) }, - { FRAC_CONST(-0.34600785374641), FRAC_CONST(-0.99441426992416) }, - { FRAC_CONST(-0.68774479627609), FRAC_CONST(-0.30238837003708) }, - { FRAC_CONST(-0.26843291521072), FRAC_CONST(0.83115667104721) }, - { FRAC_CONST(0.49072334170341), FRAC_CONST(-0.45359709858894) }, - { FRAC_CONST(0.38975992798805), FRAC_CONST(0.95515358448029) }, - { FRAC_CONST(-0.97757124900818), FRAC_CONST(0.05305894464254) }, - { FRAC_CONST(-0.17325553297997), FRAC_CONST(-0.92770671844482) }, - { FRAC_CONST(0.99948036670685), FRAC_CONST(0.58285546302795) }, - { FRAC_CONST(-0.64946246147156), FRAC_CONST(0.68645507097244) }, - { FRAC_CONST(-0.12016920745373), FRAC_CONST(-0.57147324085236) }, - { FRAC_CONST(-0.58947455883026), FRAC_CONST(-0.34847131371498) }, - { FRAC_CONST(-0.41815140843391), FRAC_CONST(0.16276422142982) }, - { FRAC_CONST(0.99885648488998), FRAC_CONST(0.11136095225811) }, - { FRAC_CONST(-0.56649613380432), FRAC_CONST(-0.90494865179062) }, - { FRAC_CONST(0.94138020277023), FRAC_CONST(0.35281917452812) }, - { FRAC_CONST(-0.75725078582764), FRAC_CONST(0.53650552034378) }, - { FRAC_CONST(0.20541973412037), FRAC_CONST(-0.94435143470764) }, - { FRAC_CONST(0.99980372190475), FRAC_CONST(0.79835915565491) }, - { FRAC_CONST(0.29078277945518), FRAC_CONST(0.35393777489662) }, - { FRAC_CONST(-0.62858772277832), FRAC_CONST(0.38765692710876) }, - { FRAC_CONST(0.43440905213356), FRAC_CONST(-0.98546332120895) }, - { FRAC_CONST(-0.98298585414886), FRAC_CONST(0.21021524071693) }, - { FRAC_CONST(0.19513028860092), FRAC_CONST(-0.94239830970764) }, - { FRAC_CONST(-0.95476663112640), FRAC_CONST(0.98364555835724) }, - { FRAC_CONST(0.93379634618759), FRAC_CONST(-0.70881992578506) }, - { FRAC_CONST(-0.85235410928726), FRAC_CONST(-0.08342348039150) }, - { FRAC_CONST(-0.86425095796585), FRAC_CONST(-0.45795026421547) }, - { FRAC_CONST(0.38879778981209), FRAC_CONST(0.97274428606033) }, - { FRAC_CONST(0.92045122385025), FRAC_CONST(-0.62433654069901) }, - { FRAC_CONST(0.89162534475327), FRAC_CONST(0.54950958490372) }, - { FRAC_CONST(-0.36834338307381), FRAC_CONST(0.96458297967911) }, - { FRAC_CONST(0.93891763687134), FRAC_CONST(-0.89968353509903) }, - { FRAC_CONST(0.99267655611038), FRAC_CONST(-0.03757034242153) }, - { FRAC_CONST(-0.94063472747803), FRAC_CONST(0.41332337260246) }, - { FRAC_CONST(0.99740225076675), FRAC_CONST(-0.16830494999886) }, - { FRAC_CONST(-0.35899412631989), FRAC_CONST(-0.46633225679398) }, - { FRAC_CONST(0.05237237364054), FRAC_CONST(-0.25640362501144) }, - { FRAC_CONST(0.36703583598137), FRAC_CONST(-0.38653266429901) }, - { FRAC_CONST(0.91653180122375), FRAC_CONST(-0.30587628483772) }, - { FRAC_CONST(0.69000804424286), FRAC_CONST(0.90952169895172) }, - { FRAC_CONST(-0.38658750057220), FRAC_CONST(0.99501574039459) }, - { FRAC_CONST(-0.29250815510750), FRAC_CONST(0.37444993853569) }, - { FRAC_CONST(-0.60182201862335), FRAC_CONST(0.86779648065567) }, - { FRAC_CONST(-0.97418588399887), FRAC_CONST(0.96468526124954) }, - { FRAC_CONST(0.88461571931839), FRAC_CONST(0.57508403062820) }, - { FRAC_CONST(0.05198933184147), FRAC_CONST(0.21269661188126) }, - { FRAC_CONST(-0.53499621152878), FRAC_CONST(0.97241556644440) }, - { FRAC_CONST(-0.49429559707642), FRAC_CONST(0.98183864355087) }, - { FRAC_CONST(-0.98935145139694), FRAC_CONST(-0.40249159932137) }, - { FRAC_CONST(-0.98081380128860), FRAC_CONST(-0.72856897115707) }, - { FRAC_CONST(-0.27338150143623), FRAC_CONST(0.99950921535492) }, - { FRAC_CONST(0.06310802698135), FRAC_CONST(-0.54539585113525) }, - { FRAC_CONST(-0.20461677014828), FRAC_CONST(-0.14209978282452) }, - { FRAC_CONST(0.66223841905594), FRAC_CONST(0.72528582811356) }, - { FRAC_CONST(-0.84764343500137), FRAC_CONST(0.02372316829860) }, - { FRAC_CONST(-0.89039862155914), FRAC_CONST(0.88866579532623) }, - { FRAC_CONST(0.95903307199478), FRAC_CONST(0.76744925975800) }, - { FRAC_CONST(0.73504126071930), FRAC_CONST(-0.03747203201056) }, - { FRAC_CONST(-0.31744435429573), FRAC_CONST(-0.36834111809731) }, - { FRAC_CONST(-0.34110826253891), FRAC_CONST(0.40211221575737) }, - { FRAC_CONST(0.47803884744644), FRAC_CONST(-0.39423218369484) }, - { FRAC_CONST(0.98299193382263), FRAC_CONST(0.01989791356027) }, - { FRAC_CONST(-0.30963072180748), FRAC_CONST(-0.18076720833778) }, - { FRAC_CONST(0.99992591142654), FRAC_CONST(-0.26281872391701) }, - { FRAC_CONST(-0.93149733543396), FRAC_CONST(-0.98313164710999) }, - { FRAC_CONST(0.99923473596573), FRAC_CONST(-0.80142992734909) }, - { FRAC_CONST(-0.26024168729782), FRAC_CONST(-0.75999760627747) }, - { FRAC_CONST(-0.35712513327599), FRAC_CONST(0.19298963248730) }, - { FRAC_CONST(-0.99899083375931), FRAC_CONST(0.74645155668259) }, - { FRAC_CONST(0.86557173728943), FRAC_CONST(0.55593866109848) }, - { FRAC_CONST(0.33408042788506), FRAC_CONST(0.86185956001282) }, - { FRAC_CONST(0.99010735750198), FRAC_CONST(0.04602397605777) }, - { FRAC_CONST(-0.66694271564484), FRAC_CONST(-0.91643613576889) }, - { FRAC_CONST(0.64016789197922), FRAC_CONST(0.15649530291557) }, - { FRAC_CONST(0.99570536613464), FRAC_CONST(0.45844584703445) }, - { FRAC_CONST(-0.63431465625763), FRAC_CONST(0.21079117059708) }, - { FRAC_CONST(-0.07706847041845), FRAC_CONST(-0.89581435918808) }, - { FRAC_CONST(0.98590087890625), FRAC_CONST(0.88241720199585) }, - { FRAC_CONST(0.80099332332611), FRAC_CONST(-0.36851897835732) }, - { FRAC_CONST(0.78368133306503), FRAC_CONST(0.45506998896599) }, - { FRAC_CONST(0.08707806468010), FRAC_CONST(0.80938994884491) }, - { FRAC_CONST(-0.86811882257462), FRAC_CONST(0.39347308874130) }, - { FRAC_CONST(-0.39466530084610), FRAC_CONST(-0.66809433698654) }, - { FRAC_CONST(0.97875326871872), FRAC_CONST(-0.72467839717865) }, - { FRAC_CONST(-0.95038563013077), FRAC_CONST(0.89563220739365) }, - { FRAC_CONST(0.17005239427090), FRAC_CONST(0.54683053493500) }, - { FRAC_CONST(-0.76910793781281), FRAC_CONST(-0.96226614713669) }, - { FRAC_CONST(0.99743282794952), FRAC_CONST(0.42697158455849) }, - { FRAC_CONST(0.95437383651733), FRAC_CONST(0.97002321481705) }, - { FRAC_CONST(0.99578905105591), FRAC_CONST(-0.54106825590134) }, - { FRAC_CONST(0.28058260679245), FRAC_CONST(-0.85361421108246) }, - { FRAC_CONST(0.85256522893906), FRAC_CONST(-0.64567607641220) }, - { FRAC_CONST(-0.50608539581299), FRAC_CONST(-0.65846014022827) }, - { FRAC_CONST(-0.97210735082626), FRAC_CONST(-0.23095212876797) }, - { FRAC_CONST(0.95424050092697), FRAC_CONST(-0.99240148067474) }, - { FRAC_CONST(-0.96926569938660), FRAC_CONST(0.73775655031204) }, - { FRAC_CONST(0.30872163176537), FRAC_CONST(0.41514959931374) }, - { FRAC_CONST(-0.24523839354515), FRAC_CONST(0.63206630945206) }, - { FRAC_CONST(-0.33813264966011), FRAC_CONST(-0.38661777973175) }, - { FRAC_CONST(-0.05826828256249), FRAC_CONST(-0.06940773874521) }, - { FRAC_CONST(-0.22898460924625), FRAC_CONST(0.97054851055145) }, - { FRAC_CONST(-0.18509915471077), FRAC_CONST(0.47565764188766) }, - { FRAC_CONST(-0.10488238185644), FRAC_CONST(-0.87769949436188) }, - { FRAC_CONST(-0.71886587142944), FRAC_CONST(0.78030979633331) }, - { FRAC_CONST(0.99793875217438), FRAC_CONST(0.90041309595108) }, - { FRAC_CONST(0.57563304901123), FRAC_CONST(-0.91034334897995) }, - { FRAC_CONST(0.28909647464752), FRAC_CONST(0.96307784318924) }, - { FRAC_CONST(0.42188999056816), FRAC_CONST(0.48148649930954) }, - { FRAC_CONST(0.93335050344467), FRAC_CONST(-0.43537023663521) }, - { FRAC_CONST(-0.97087377309799), FRAC_CONST(0.86636447906494) }, - { FRAC_CONST(0.36722871661186), FRAC_CONST(0.65291655063629) }, - { FRAC_CONST(-0.81093025207520), FRAC_CONST(0.08778370171785) }, - { FRAC_CONST(-0.26240602135658), FRAC_CONST(-0.92774093151093) }, - { FRAC_CONST(0.83996498584747), FRAC_CONST(0.55839848518372) }, - { FRAC_CONST(-0.99909615516663), FRAC_CONST(-0.96024608612061) }, - { FRAC_CONST(0.74649465084076), FRAC_CONST(0.12144893407822) }, - { FRAC_CONST(-0.74774593114853), FRAC_CONST(-0.26898062229156) }, - { FRAC_CONST(0.95781666040421), FRAC_CONST(-0.79047924280167) }, - { FRAC_CONST(0.95472306013107), FRAC_CONST(-0.08588775992393) }, - { FRAC_CONST(0.48708331584930), FRAC_CONST(0.99999040365219) }, - { FRAC_CONST(0.46332037448883), FRAC_CONST(0.10964126139879) }, - { FRAC_CONST(-0.76497006416321), FRAC_CONST(0.89210927486420) }, - { FRAC_CONST(0.57397389411926), FRAC_CONST(0.35289704799652) }, - { FRAC_CONST(0.75374317169189), FRAC_CONST(0.96705216169357) }, - { FRAC_CONST(-0.59174400568008), FRAC_CONST(-0.89405369758606) }, - { FRAC_CONST(0.75087904930115), FRAC_CONST(-0.29612672328949) }, - { FRAC_CONST(-0.98607856035233), FRAC_CONST(0.25034910440445) }, - { FRAC_CONST(-0.40761056542397), FRAC_CONST(-0.90045571327209) }, - { FRAC_CONST(0.66929268836975), FRAC_CONST(0.98629492521286) }, - { FRAC_CONST(-0.97463697195053), FRAC_CONST(-0.00190223299433) }, - { FRAC_CONST(0.90145510435104), FRAC_CONST(0.99781388044357) }, - { FRAC_CONST(-0.87259286642075), FRAC_CONST(0.99233585596085) }, - { FRAC_CONST(-0.91529458761215), FRAC_CONST(-0.15698707103729) }, - { FRAC_CONST(-0.03305738791823), FRAC_CONST(-0.37205263972282) }, - { FRAC_CONST(0.07223051041365), FRAC_CONST(-0.88805001974106) }, - { FRAC_CONST(0.99498009681702), FRAC_CONST(0.97094357013702) }, - { FRAC_CONST(-0.74904936552048), FRAC_CONST(0.99985486268997) }, - { FRAC_CONST(0.04585228487849), FRAC_CONST(0.99812334775925) }, - { FRAC_CONST(-0.89054954051971), FRAC_CONST(-0.31791913509369) }, - { FRAC_CONST(-0.83782142400742), FRAC_CONST(0.97637635469437) }, - { FRAC_CONST(0.33454805612564), FRAC_CONST(-0.86231517791748) }, - { FRAC_CONST(-0.99707579612732), FRAC_CONST(0.93237990140915) }, - { FRAC_CONST(-0.22827528417110), FRAC_CONST(0.18874759972095) }, - { FRAC_CONST(0.67248046398163), FRAC_CONST(-0.03646211326122) }, - { FRAC_CONST(-0.05146538093686), FRAC_CONST(-0.92599701881409) }, - { FRAC_CONST(0.99947297573090), FRAC_CONST(0.93625229597092) }, - { FRAC_CONST(0.66951125860214), FRAC_CONST(0.98905825614929) }, - { FRAC_CONST(-0.99602955579758), FRAC_CONST(-0.44654715061188) }, - { FRAC_CONST(0.82104903459549), FRAC_CONST(0.99540740251541) }, - { FRAC_CONST(0.99186509847641), FRAC_CONST(0.72022998332977) }, - { FRAC_CONST(-0.65284591913223), FRAC_CONST(0.52186721563339) }, - { FRAC_CONST(0.93885445594788), FRAC_CONST(-0.74895310401917) }, - { FRAC_CONST(0.96735250949860), FRAC_CONST(0.90891814231873) }, - { FRAC_CONST(-0.22225968539715), FRAC_CONST(0.57124030590057) }, - { FRAC_CONST(-0.44132784008980), FRAC_CONST(-0.92688840627670) }, - { FRAC_CONST(-0.85694974660873), FRAC_CONST(0.88844531774521) }, - { FRAC_CONST(0.91783040761948), FRAC_CONST(-0.46356892585754) }, - { FRAC_CONST(0.72556972503662), FRAC_CONST(-0.99899554252625) }, - { FRAC_CONST(-0.99711579084396), FRAC_CONST(0.58211559057236) }, - { FRAC_CONST(0.77638977766037), FRAC_CONST(0.94321835041046) }, - { FRAC_CONST(0.07717324048281), FRAC_CONST(0.58638399839401) }, - { FRAC_CONST(-0.56049829721451), FRAC_CONST(0.82522302865982) }, - { FRAC_CONST(0.98398894071579), FRAC_CONST(0.39467439055443) }, - { FRAC_CONST(0.47546947002411), FRAC_CONST(0.68613046407700) }, - { FRAC_CONST(0.65675091743469), FRAC_CONST(0.18331636488438) }, - { FRAC_CONST(0.03273375332355), FRAC_CONST(-0.74933111667633) }, - { FRAC_CONST(-0.38684144616127), FRAC_CONST(0.51337349414825) }, - { FRAC_CONST(-0.97346270084381), FRAC_CONST(-0.96549361944199) }, - { FRAC_CONST(-0.53282153606415), FRAC_CONST(-0.91423267126083) }, - { FRAC_CONST(0.99817311763763), FRAC_CONST(0.61133575439453) }, - { FRAC_CONST(-0.50254499912262), FRAC_CONST(-0.88829338550568) }, - { FRAC_CONST(0.01995873264968), FRAC_CONST(0.85223513841629) }, - { FRAC_CONST(0.99930381774902), FRAC_CONST(0.94578897953033) }, - { FRAC_CONST(0.82907766103745), FRAC_CONST(-0.06323442608118) }, - { FRAC_CONST(-0.58660709857941), FRAC_CONST(0.96840775012970) }, - { FRAC_CONST(-0.17573736608028), FRAC_CONST(-0.48166921734810) }, - { FRAC_CONST(0.83434289693832), FRAC_CONST(-0.13023450970650) }, - { FRAC_CONST(0.05946491286159), FRAC_CONST(0.20511047542095) }, - { FRAC_CONST(0.81505483388901), FRAC_CONST(-0.94685947895050) }, - { FRAC_CONST(-0.44976380467415), FRAC_CONST(0.40894573926926) }, - { FRAC_CONST(-0.89746475219727), FRAC_CONST(0.99846577644348) }, - { FRAC_CONST(0.39677256345749), FRAC_CONST(-0.74854665994644) }, - { FRAC_CONST(-0.07588948309422), FRAC_CONST(0.74096214771271) }, - { FRAC_CONST(0.76343196630478), FRAC_CONST(0.41746628284454) }, - { FRAC_CONST(-0.74490106105804), FRAC_CONST(0.94725912809372) }, - { FRAC_CONST(0.64880120754242), FRAC_CONST(0.41336661577225) }, - { FRAC_CONST(0.62319535017014), FRAC_CONST(-0.93098312616348) }, - { FRAC_CONST(0.42215818166733), FRAC_CONST(-0.07712787389755) }, - { FRAC_CONST(0.02704554051161), FRAC_CONST(-0.05417517945170) }, - { FRAC_CONST(0.80001771450043), FRAC_CONST(0.91542196273804) }, - { FRAC_CONST(-0.79351830482483), FRAC_CONST(-0.36208897829056) }, - { FRAC_CONST(0.63872361183167), FRAC_CONST(0.08128252625465) }, - { FRAC_CONST(0.52890521287918), FRAC_CONST(0.60048872232437) }, - { FRAC_CONST(0.74238550662994), FRAC_CONST(0.04491915181279) }, - { FRAC_CONST(0.99096131324768), FRAC_CONST(-0.19451183080673) }, - { FRAC_CONST(-0.80412328243256), FRAC_CONST(-0.88513815402985) }, - { FRAC_CONST(-0.64612615108490), FRAC_CONST(0.72198677062988) }, - { FRAC_CONST(0.11657770723104), FRAC_CONST(-0.83662831783295) }, - { FRAC_CONST(-0.95053184032440), FRAC_CONST(-0.96939903497696) }, - { FRAC_CONST(-0.62228870391846), FRAC_CONST(0.82767260074615) }, - { FRAC_CONST(0.03004475869238), FRAC_CONST(-0.99738895893097) }, - { FRAC_CONST(-0.97987216711044), FRAC_CONST(0.36526128649712) }, - { FRAC_CONST(-0.99986982345581), FRAC_CONST(-0.36021611094475) }, - { FRAC_CONST(0.89110648632050), FRAC_CONST(-0.97894251346588) }, - { FRAC_CONST(0.10407960414886), FRAC_CONST(0.77357792854309) }, - { FRAC_CONST(0.95964735746384), FRAC_CONST(-0.35435819625854) }, - { FRAC_CONST(0.50843232870102), FRAC_CONST(0.96107691526413) }, - { FRAC_CONST(0.17006334662437), FRAC_CONST(-0.76854026317596) }, - { FRAC_CONST(0.25872674584389), FRAC_CONST(0.99893301725388) }, - { FRAC_CONST(-0.01115998718888), FRAC_CONST(0.98496019840240) }, - { FRAC_CONST(-0.79598701000214), FRAC_CONST(0.97138410806656) }, - { FRAC_CONST(-0.99264711141586), FRAC_CONST(-0.99542820453644) }, - { FRAC_CONST(-0.99829661846161), FRAC_CONST(0.01877138763666) }, - { FRAC_CONST(-0.70801013708115), FRAC_CONST(0.33680686354637) }, - { FRAC_CONST(-0.70467054843903), FRAC_CONST(0.93272775411606) }, - { FRAC_CONST(0.99846023321152), FRAC_CONST(-0.98725748062134) }, - { FRAC_CONST(-0.63364970684052), FRAC_CONST(-0.16473594307899) }, - { FRAC_CONST(-0.16258217394352), FRAC_CONST(-0.95939123630524) }, - { FRAC_CONST(-0.43645593523979), FRAC_CONST(-0.94805032014847) }, - { FRAC_CONST(-0.99848473072052), FRAC_CONST(0.96245169639587) }, - { FRAC_CONST(-0.16796459257603), FRAC_CONST(-0.98987513780594) }, - { FRAC_CONST(-0.87979227304459), FRAC_CONST(-0.71725726127625) }, - { FRAC_CONST(0.44183099269867), FRAC_CONST(-0.93568974733353) }, - { FRAC_CONST(0.93310177326202), FRAC_CONST(-0.99913311004639) }, - { FRAC_CONST(-0.93941932916641), FRAC_CONST(-0.56409376859665) }, - { FRAC_CONST(-0.88590002059937), FRAC_CONST(0.47624599933624) }, - { FRAC_CONST(0.99971461296082), FRAC_CONST(-0.83889955282211) }, - { FRAC_CONST(-0.75376385450363), FRAC_CONST(0.00814643409103) }, - { FRAC_CONST(0.93887686729431), FRAC_CONST(-0.11284527927637) }, - { FRAC_CONST(0.85126435756683), FRAC_CONST(0.52349251508713) }, - { FRAC_CONST(0.39701420068741), FRAC_CONST(0.81779634952545) }, - { FRAC_CONST(-0.37024465203285), FRAC_CONST(-0.87071657180786) }, - { FRAC_CONST(-0.36024826765060), FRAC_CONST(0.34655734896660) }, - { FRAC_CONST(-0.93388813734055), FRAC_CONST(-0.84476542472839) }, - { FRAC_CONST(-0.65298801660538), FRAC_CONST(-0.18439576029778) }, - { FRAC_CONST(0.11960318684578), FRAC_CONST(0.99899345636368) }, - { FRAC_CONST(0.94292563199997), FRAC_CONST(0.83163905143738) }, - { FRAC_CONST(0.75081145763397), FRAC_CONST(-0.35533222556114) }, - { FRAC_CONST(0.56721979379654), FRAC_CONST(-0.24076835811138) }, - { FRAC_CONST(0.46857765316963), FRAC_CONST(-0.30140233039856) }, - { FRAC_CONST(0.97312313318253), FRAC_CONST(-0.99548190832138) }, - { FRAC_CONST(-0.38299977779388), FRAC_CONST(0.98516911268234) }, - { FRAC_CONST(0.41025799512863), FRAC_CONST(0.02116736955941) }, - { FRAC_CONST(0.09638062119484), FRAC_CONST(0.04411984235048) }, - { FRAC_CONST(-0.85283249616623), FRAC_CONST(0.91475564241409) }, - { FRAC_CONST(0.88866806030273), FRAC_CONST(-0.99735265970230) }, - { FRAC_CONST(-0.48202428221703), FRAC_CONST(-0.96805608272552) }, - { FRAC_CONST(0.27572581171989), FRAC_CONST(0.58634752035141) }, - { FRAC_CONST(-0.65889132022858), FRAC_CONST(0.58835631608963) }, - { FRAC_CONST(0.98838084936142), FRAC_CONST(0.99994349479675) }, - { FRAC_CONST(-0.20651349425316), FRAC_CONST(0.54593044519424) }, - { FRAC_CONST(-0.62126415967941), FRAC_CONST(-0.59893679618835) }, - { FRAC_CONST(0.20320105552673), FRAC_CONST(-0.86879181861877) }, - { FRAC_CONST(-0.97790551185608), FRAC_CONST(0.96290808916092) }, - { FRAC_CONST(0.11112534999847), FRAC_CONST(0.21484763920307) }, - { FRAC_CONST(-0.41368338465691), FRAC_CONST(0.28216838836670) }, - { FRAC_CONST(0.24133038520813), FRAC_CONST(0.51294362545013) }, - { FRAC_CONST(-0.66393411159515), FRAC_CONST(-0.08249679952860) }, - { FRAC_CONST(-0.53697830438614), FRAC_CONST(-0.97649902105331) }, - { FRAC_CONST(-0.97224736213684), FRAC_CONST(0.22081333398819) }, - { FRAC_CONST(0.87392479181290), FRAC_CONST(-0.12796173989773) }, - { FRAC_CONST(0.19050361216068), FRAC_CONST(0.01602615416050) }, - { FRAC_CONST(-0.46353441476822), FRAC_CONST(-0.95249038934708) }, - { FRAC_CONST(-0.07064096629620), FRAC_CONST(-0.94479805231094) }, - { FRAC_CONST(-0.92444086074829), FRAC_CONST(-0.10457590222359) }, - { FRAC_CONST(-0.83822596073151), FRAC_CONST(-0.01695043221116) }, - { FRAC_CONST(0.75214684009552), FRAC_CONST(-0.99955683946609) }, - { FRAC_CONST(-0.42102998495102), FRAC_CONST(0.99720942974091) }, - { FRAC_CONST(-0.72094786167145), FRAC_CONST(-0.35008960962296) }, - { FRAC_CONST(0.78843313455582), FRAC_CONST(0.52851396799088) }, - { FRAC_CONST(0.97394025325775), FRAC_CONST(-0.26695942878723) }, - { FRAC_CONST(0.99206465482712), FRAC_CONST(-0.57010120153427) }, - { FRAC_CONST(0.76789611577988), FRAC_CONST(-0.76519358158112) }, - { FRAC_CONST(-0.82002419233322), FRAC_CONST(-0.73530179262161) }, - { FRAC_CONST(0.81924992799759), FRAC_CONST(0.99698424339294) }, - { FRAC_CONST(-0.26719850301743), FRAC_CONST(0.68903368711472) }, - { FRAC_CONST(-0.43311259150505), FRAC_CONST(0.85321813821793) }, - { FRAC_CONST(0.99194979667664), FRAC_CONST(0.91876250505447) }, - { FRAC_CONST(-0.80691999197006), FRAC_CONST(-0.32627540826797) }, - { FRAC_CONST(0.43080005049706), FRAC_CONST(-0.21919095516205) }, - { FRAC_CONST(0.67709493637085), FRAC_CONST(-0.95478075742722) }, - { FRAC_CONST(0.56151771545410), FRAC_CONST(-0.70693808794022) }, - { FRAC_CONST(0.10831862688065), FRAC_CONST(-0.08628837019205) }, - { FRAC_CONST(0.91229414939880), FRAC_CONST(-0.65987348556519) }, - { FRAC_CONST(-0.48972892761230), FRAC_CONST(0.56289243698120) }, - { FRAC_CONST(-0.89033657312393), FRAC_CONST(-0.71656566858292) }, - { FRAC_CONST(0.65269446372986), FRAC_CONST(0.65916007757187) }, - { FRAC_CONST(0.67439478635788), FRAC_CONST(-0.81684380769730) }, - { FRAC_CONST(-0.47770830988884), FRAC_CONST(-0.16789555549622) }, - { FRAC_CONST(-0.99715977907181), FRAC_CONST(-0.93565785884857) }, - { FRAC_CONST(-0.90889590978622), FRAC_CONST(0.62034398317337) }, - { FRAC_CONST(-0.06618622690439), FRAC_CONST(-0.23812216520309) }, - { FRAC_CONST(0.99430269002914), FRAC_CONST(0.18812555074692) }, - { FRAC_CONST(0.97686403989792), FRAC_CONST(-0.28664535284042) }, - { FRAC_CONST(0.94813650846481), FRAC_CONST(-0.97506642341614) }, - { FRAC_CONST(-0.95434498786926), FRAC_CONST(-0.79607981443405) }, - { FRAC_CONST(-0.49104782938957), FRAC_CONST(0.32895213365555) }, - { FRAC_CONST(0.99881172180176), FRAC_CONST(0.88993984460831) }, - { FRAC_CONST(0.50449168682098), FRAC_CONST(-0.85995072126389) }, - { FRAC_CONST(0.47162890434265), FRAC_CONST(-0.18680204451084) }, - { FRAC_CONST(-0.62081581354141), FRAC_CONST(0.75000673532486) }, - { FRAC_CONST(-0.43867015838623), FRAC_CONST(0.99998068809509) }, - { FRAC_CONST(0.98630565404892), FRAC_CONST(-0.53578901290894) }, - { FRAC_CONST(-0.61510360240936), FRAC_CONST(-0.89515018463135) }, - { FRAC_CONST(-0.03841517493129), FRAC_CONST(-0.69888818264008) }, - { FRAC_CONST(-0.30102157592773), FRAC_CONST(-0.07667808979750) }, - { FRAC_CONST(0.41881284117699), FRAC_CONST(0.02188098989427) }, - { FRAC_CONST(-0.86135452985764), FRAC_CONST(0.98947483301163) }, - { FRAC_CONST(0.67226862907410), FRAC_CONST(-0.13494388759136) }, - { FRAC_CONST(-0.70737397670746), FRAC_CONST(-0.76547348499298) }, - { FRAC_CONST(0.94044947624207), FRAC_CONST(0.09026201069355) }, - { FRAC_CONST(-0.82386350631714), FRAC_CONST(0.08924768865108) }, - { FRAC_CONST(-0.32070666551590), FRAC_CONST(0.50143420696259) }, - { FRAC_CONST(0.57593160867691), FRAC_CONST(-0.98966425657272) }, - { FRAC_CONST(-0.36326017975807), FRAC_CONST(0.07440242916346) }, - { FRAC_CONST(0.99979043006897), FRAC_CONST(-0.14130286872387) }, - { FRAC_CONST(-0.92366021871567), FRAC_CONST(-0.97979295253754) }, - { FRAC_CONST(-0.44607177376747), FRAC_CONST(-0.54233253002167) }, - { FRAC_CONST(0.44226801395416), FRAC_CONST(0.71326756477356) }, - { FRAC_CONST(0.03671907261014), FRAC_CONST(0.63606387376785) }, - { FRAC_CONST(0.52175426483154), FRAC_CONST(-0.85396826267242) }, - { FRAC_CONST(-0.94701141119003), FRAC_CONST(-0.01826348155737) }, - { FRAC_CONST(-0.98759609460831), FRAC_CONST(0.82288712263107) }, - { FRAC_CONST(0.87434792518616), FRAC_CONST(0.89399492740631) }, - { FRAC_CONST(-0.93412041664124), FRAC_CONST(0.41374051570892) }, - { FRAC_CONST(0.96063941717148), FRAC_CONST(0.93116706609726) }, - { FRAC_CONST(0.97534251213074), FRAC_CONST(0.86150932312012) }, - { FRAC_CONST(0.99642467498779), FRAC_CONST(0.70190042257309) }, - { FRAC_CONST(-0.94705086946487), FRAC_CONST(-0.29580041766167) }, - { FRAC_CONST(0.91599804162979), FRAC_CONST(-0.98147833347321) } -}; - -#ifdef __cplusplus - -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_noise.h,v 1.17 2007/11/01 12:33:35 menno Exp $ +**/ + +#ifndef __SBR_NOISE_H__ +#define __SBR_NOISE_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + + +/* Table 1.A.13 Noise table V */ +ALIGN static const complex_t V[] = { + { FRAC_CONST(-0.99948155879974), FRAC_CONST(-0.59483414888382) }, + { FRAC_CONST(0.97113454341888), FRAC_CONST(-0.67528516054153) }, + { FRAC_CONST(0.14130051434040), FRAC_CONST(-0.95090985298157) }, + { FRAC_CONST(-0.47005495429039), FRAC_CONST(-0.37340548634529) }, + { FRAC_CONST(0.80705064535141), FRAC_CONST(0.29653668403625) }, + { FRAC_CONST(-0.38981479406357), FRAC_CONST(0.89572608470917) }, + { FRAC_CONST(-0.01053049881011), FRAC_CONST(-0.66959059238434) }, + { FRAC_CONST(-0.91266369819641), FRAC_CONST(-0.11522938311100) }, + { FRAC_CONST(0.54840421676636), FRAC_CONST(0.75221365690231) }, + { FRAC_CONST(0.40009254217148), FRAC_CONST(-0.98929399251938) }, + { FRAC_CONST(-0.99867975711823), FRAC_CONST(-0.88147068023682) }, + { FRAC_CONST(-0.95531076192856), FRAC_CONST(0.90908759832382) }, + { FRAC_CONST(-0.45725932717323), FRAC_CONST(-0.56716322898865) }, + { FRAC_CONST(-0.72929674386978), FRAC_CONST(-0.98008275032043) }, + { FRAC_CONST(0.75622802972794), FRAC_CONST(0.20950329303741) }, + { FRAC_CONST(0.07069442421198), FRAC_CONST(-0.78247898817062) }, + { FRAC_CONST(0.74496251344681), FRAC_CONST(-0.91169005632401) }, + { FRAC_CONST(-0.96440184116364), FRAC_CONST(-0.94739919900894) }, + { FRAC_CONST(0.30424630641937), FRAC_CONST(-0.49438267946243) }, + { FRAC_CONST(0.66565030813217), FRAC_CONST(0.64652937650681) }, + { FRAC_CONST(0.91697007417679), FRAC_CONST(0.17514097690582) }, + { FRAC_CONST(-0.70774918794632), FRAC_CONST(0.52548652887344) }, + { FRAC_CONST(-0.70051413774490), FRAC_CONST(-0.45340028405190) }, + { FRAC_CONST(-0.99496513605118), FRAC_CONST(-0.90071910619736) }, + { FRAC_CONST(0.98164492845535), FRAC_CONST(-0.77463155984879) }, + { FRAC_CONST(-0.54671579599380), FRAC_CONST(-0.02570928446949) }, + { FRAC_CONST(-0.01689629070461), FRAC_CONST(0.00287506449968) }, + { FRAC_CONST(-0.86110347509384), FRAC_CONST(0.42548584938049) }, + { FRAC_CONST(-0.98892980813980), FRAC_CONST(-0.87881129980087) }, + { FRAC_CONST(0.51756626367569), FRAC_CONST(0.66926783323288) }, + { FRAC_CONST(-0.99635028839111), FRAC_CONST(-0.58107727766037) }, + { FRAC_CONST(-0.99969369173050), FRAC_CONST(0.98369991779327) }, + { FRAC_CONST(0.55266261100769), FRAC_CONST(0.59449058771133) }, + { FRAC_CONST(0.34581178426743), FRAC_CONST(0.94879418611526) }, + { FRAC_CONST(0.62664210796356), FRAC_CONST(-0.74402970075607) }, + { FRAC_CONST(-0.77149701118469), FRAC_CONST(-0.33883658051491) }, + { FRAC_CONST(-0.91592246294022), FRAC_CONST(0.03687901422381) }, + { FRAC_CONST(-0.76285493373871), FRAC_CONST(-0.91371870040894) }, + { FRAC_CONST(0.79788339138031), FRAC_CONST(-0.93180972337723) }, + { FRAC_CONST(0.54473078250885), FRAC_CONST(-0.11919206380844) }, + { FRAC_CONST(-0.85639280080795), FRAC_CONST(0.42429855465889) }, + { FRAC_CONST(-0.92882400751114), FRAC_CONST(0.27871808409691) }, + { FRAC_CONST(-0.11708371341228), FRAC_CONST(-0.99800843000412) }, + { FRAC_CONST(0.21356749534607), FRAC_CONST(-0.90716296434402) }, + { FRAC_CONST(-0.76191693544388), FRAC_CONST(0.99768120050430) }, + { FRAC_CONST(0.98111045360565), FRAC_CONST(-0.95854461193085) }, + { FRAC_CONST(-0.85913270711899), FRAC_CONST(0.95766568183899) }, + { FRAC_CONST(-0.93307244777679), FRAC_CONST(0.49431759119034) }, + { FRAC_CONST(0.30485755205154), FRAC_CONST(-0.70540034770966) }, + { FRAC_CONST(0.85289651155472), FRAC_CONST(0.46766132116318) }, + { FRAC_CONST(0.91328084468842), FRAC_CONST(-0.99839597940445) }, + { FRAC_CONST(-0.05890199914575), FRAC_CONST(0.70741826295853) }, + { FRAC_CONST(0.28398686647415), FRAC_CONST(0.34633556008339) }, + { FRAC_CONST(0.95258164405823), FRAC_CONST(-0.54893416166306) }, + { FRAC_CONST(-0.78566324710846), FRAC_CONST(-0.75568538904190) }, + { FRAC_CONST(-0.95789498090744), FRAC_CONST(-0.20423194766045) }, + { FRAC_CONST(0.82411158084869), FRAC_CONST(0.96654617786407) }, + { FRAC_CONST(-0.65185445547104), FRAC_CONST(-0.88734990358353) }, + { FRAC_CONST(-0.93643605709076), FRAC_CONST(0.99870789051056) }, + { FRAC_CONST(0.91427159309387), FRAC_CONST(-0.98290503025055) }, + { FRAC_CONST(-0.70395684242249), FRAC_CONST(0.58796799182892) }, + { FRAC_CONST(0.00563771976158), FRAC_CONST(0.61768198013306) }, + { FRAC_CONST(0.89065051078796), FRAC_CONST(0.52783352136612) }, + { FRAC_CONST(-0.68683707714081), FRAC_CONST(0.80806946754456) }, + { FRAC_CONST(0.72165340185165), FRAC_CONST(-0.69259858131409) }, + { FRAC_CONST(-0.62928247451782), FRAC_CONST(0.13627037405968) }, + { FRAC_CONST(0.29938435554504), FRAC_CONST(-0.46051329374313) }, + { FRAC_CONST(-0.91781955957413), FRAC_CONST(-0.74012714624405) }, + { FRAC_CONST(0.99298715591431), FRAC_CONST(0.40816611051559) }, + { FRAC_CONST(0.82368296384811), FRAC_CONST(-0.74036049842834) }, + { FRAC_CONST(-0.98512834310532), FRAC_CONST(-0.99972331523895) }, + { FRAC_CONST(-0.95915371179581), FRAC_CONST(-0.99237799644470) }, + { FRAC_CONST(-0.21411126852036), FRAC_CONST(-0.93424820899963) }, + { FRAC_CONST(-0.68821477890015), FRAC_CONST(-0.26892307400703) }, + { FRAC_CONST(0.91851997375488), FRAC_CONST(0.09358228743076) }, + { FRAC_CONST(-0.96062767505646), FRAC_CONST(0.36099094152451) }, + { FRAC_CONST(0.51646184921265), FRAC_CONST(-0.71373331546783) }, + { FRAC_CONST(0.61130720376968), FRAC_CONST(0.46950140595436) }, + { FRAC_CONST(0.47336128354073), FRAC_CONST(-0.27333179116249) }, + { FRAC_CONST(0.90998309850693), FRAC_CONST(0.96715664863586) }, + { FRAC_CONST(0.44844800233841), FRAC_CONST(0.99211573600769) }, + { FRAC_CONST(0.66614890098572), FRAC_CONST(0.96590173244476) }, + { FRAC_CONST(0.74922239780426), FRAC_CONST(-0.89879858493805) }, + { FRAC_CONST(-0.99571585655212), FRAC_CONST(0.52785521745682) }, + { FRAC_CONST(0.97401082515717), FRAC_CONST(-0.16855870187283) }, + { FRAC_CONST(0.72683745622635), FRAC_CONST(-0.48060774803162) }, + { FRAC_CONST(0.95432192087173), FRAC_CONST(0.68849605321884) }, + { FRAC_CONST(-0.72962206602097), FRAC_CONST(-0.76608443260193) }, + { FRAC_CONST(-0.85359477996826), FRAC_CONST(0.88738125562668) }, + { FRAC_CONST(-0.81412428617477), FRAC_CONST(-0.97480767965317) }, + { FRAC_CONST(-0.87930774688721), FRAC_CONST(0.74748307466507) }, + { FRAC_CONST(-0.71573328971863), FRAC_CONST(-0.98570609092712) }, + { FRAC_CONST(0.83524298667908), FRAC_CONST(0.83702534437180) }, + { FRAC_CONST(-0.48086065053940), FRAC_CONST(-0.98848503828049) }, + { FRAC_CONST(0.97139126062393), FRAC_CONST(0.80093622207642) }, + { FRAC_CONST(0.51992827653885), FRAC_CONST(0.80247628688812) }, + { FRAC_CONST(-0.00848591234535), FRAC_CONST(-0.76670128107071) }, + { FRAC_CONST(-0.70294374227524), FRAC_CONST(0.55359911918640) }, + { FRAC_CONST(-0.95894426107407), FRAC_CONST(-0.43265503644943) }, + { FRAC_CONST(0.97079253196716), FRAC_CONST(0.09325857460499) }, + { FRAC_CONST(-0.92404294013977), FRAC_CONST(0.85507702827454) }, + { FRAC_CONST(-0.69506472349167), FRAC_CONST(0.98633414506912) }, + { FRAC_CONST(0.26559203863144), FRAC_CONST(0.73314309120178) }, + { FRAC_CONST(0.28038442134857), FRAC_CONST(0.14537914097309) }, + { FRAC_CONST(-0.74138122797012), FRAC_CONST(0.99310338497162) }, + { FRAC_CONST(-0.01752796024084), FRAC_CONST(-0.82616633176804) }, + { FRAC_CONST(-0.55126774311066), FRAC_CONST(-0.98898541927338) }, + { FRAC_CONST(0.97960901260376), FRAC_CONST(-0.94021445512772) }, + { FRAC_CONST(-0.99196308851242), FRAC_CONST(0.67019015550613) }, + { FRAC_CONST(-0.67684930562973), FRAC_CONST(0.12631492316723) }, + { FRAC_CONST(0.09140039235353), FRAC_CONST(-0.20537731051445) }, + { FRAC_CONST(-0.71658962965012), FRAC_CONST(-0.97788202762604) }, + { FRAC_CONST(0.81014639139175), FRAC_CONST(0.53722649812698) }, + { FRAC_CONST(0.40616992115974), FRAC_CONST(-0.26469007134438) }, + { FRAC_CONST(-0.67680186033249), FRAC_CONST(0.94502049684525) }, + { FRAC_CONST(0.86849772930145), FRAC_CONST(-0.18333598971367) }, + { FRAC_CONST(-0.99500381946564), FRAC_CONST(-0.02634122036397) }, + { FRAC_CONST(0.84329187870026), FRAC_CONST(0.10406957566738) }, + { FRAC_CONST(-0.09215968847275), FRAC_CONST(0.69540011882782) }, + { FRAC_CONST(0.99956172704697), FRAC_CONST(-0.12358541786671) }, + { FRAC_CONST(-0.79732781648636), FRAC_CONST(-0.91582524776459) }, + { FRAC_CONST(0.96349972486496), FRAC_CONST(0.96640455722809) }, + { FRAC_CONST(-0.79942780733109), FRAC_CONST(0.64323902130127) }, + { FRAC_CONST(-0.11566039919853), FRAC_CONST(0.28587844967842) }, + { FRAC_CONST(-0.39922955632210), FRAC_CONST(0.94129604101181) }, + { FRAC_CONST(0.99089199304581), FRAC_CONST(-0.92062628269196) }, + { FRAC_CONST(0.28631284832954), FRAC_CONST(-0.91035044193268) }, + { FRAC_CONST(-0.83302724361420), FRAC_CONST(-0.67330408096313) }, + { FRAC_CONST(0.95404446125031), FRAC_CONST(0.49162766337395) }, + { FRAC_CONST(-0.06449863314629), FRAC_CONST(0.03250560909510) }, + { FRAC_CONST(-0.99575054645538), FRAC_CONST(0.42389783263206) }, + { FRAC_CONST(-0.65501141548157), FRAC_CONST(0.82546114921570) }, + { FRAC_CONST(-0.81254440546036), FRAC_CONST(-0.51627236604691) }, + { FRAC_CONST(-0.99646371603012), FRAC_CONST(0.84490531682968) }, + { FRAC_CONST(0.00287840608507), FRAC_CONST(0.64768260717392) }, + { FRAC_CONST(0.70176988840103), FRAC_CONST(-0.20453028380871) }, + { FRAC_CONST(0.96361881494522), FRAC_CONST(0.40706968307495) }, + { FRAC_CONST(-0.68883758783340), FRAC_CONST(0.91338956356049) }, + { FRAC_CONST(-0.34875586628914), FRAC_CONST(0.71472293138504) }, + { FRAC_CONST(0.91980081796646), FRAC_CONST(0.66507452726364) }, + { FRAC_CONST(-0.99009048938751), FRAC_CONST(0.85868018865585) }, + { FRAC_CONST(0.68865793943405), FRAC_CONST(0.55660319328308) }, + { FRAC_CONST(-0.99484401941299), FRAC_CONST(-0.20052559673786) }, + { FRAC_CONST(0.94214510917664), FRAC_CONST(-0.99696427583694) }, + { FRAC_CONST(-0.67414629459381), FRAC_CONST(0.49548220634460) }, + { FRAC_CONST(-0.47339352965355), FRAC_CONST(-0.85904330015182) }, + { FRAC_CONST(0.14323651790619), FRAC_CONST(-0.94145596027374) }, + { FRAC_CONST(-0.29268294572830), FRAC_CONST(0.05759225040674) }, + { FRAC_CONST(0.43793860077858), FRAC_CONST(-0.78904968500137) }, + { FRAC_CONST(-0.36345127224922), FRAC_CONST(0.64874434471130) }, + { FRAC_CONST(-0.08750604838133), FRAC_CONST(0.97686946392059) }, + { FRAC_CONST(-0.96495270729065), FRAC_CONST(-0.53960305452347) }, + { FRAC_CONST(0.55526942014694), FRAC_CONST(0.78891521692276) }, + { FRAC_CONST(0.73538213968277), FRAC_CONST(0.96452075242996) }, + { FRAC_CONST(-0.30889773368835), FRAC_CONST(-0.80664390325546) }, + { FRAC_CONST(0.03574995696545), FRAC_CONST(-0.97325617074966) }, + { FRAC_CONST(0.98720687627792), FRAC_CONST(0.48409134149551) }, + { FRAC_CONST(-0.81689298152924), FRAC_CONST(-0.90827703475952) }, + { FRAC_CONST(0.67866861820221), FRAC_CONST(0.81284505128860) }, + { FRAC_CONST(-0.15808570384979), FRAC_CONST(0.85279554128647) }, + { FRAC_CONST(0.80723392963409), FRAC_CONST(-0.24717418849468) }, + { FRAC_CONST(0.47788757085800), FRAC_CONST(-0.46333149075508) }, + { FRAC_CONST(0.96367555856705), FRAC_CONST(0.38486748933792) }, + { FRAC_CONST(-0.99143874645233), FRAC_CONST(-0.24945276975632) }, + { FRAC_CONST(0.83081877231598), FRAC_CONST(-0.94780850410461) }, + { FRAC_CONST(-0.58753192424774), FRAC_CONST(0.01290772389621) }, + { FRAC_CONST(0.95538109540939), FRAC_CONST(-0.85557049512863) }, + { FRAC_CONST(-0.96490919589996), FRAC_CONST(-0.64020973443985) }, + { FRAC_CONST(-0.97327101230621), FRAC_CONST(0.12378127872944) }, + { FRAC_CONST(0.91400367021561), FRAC_CONST(0.57972472906113) }, + { FRAC_CONST(-0.99925839900970), FRAC_CONST(0.71084845066071) }, + { FRAC_CONST(-0.86875903606415), FRAC_CONST(-0.20291699469090) }, + { FRAC_CONST(-0.26240035891533), FRAC_CONST(-0.68264555931091) }, + { FRAC_CONST(-0.24664412438869), FRAC_CONST(-0.87642270326614) }, + { FRAC_CONST(0.02416275814176), FRAC_CONST(0.27192914485931) }, + { FRAC_CONST(0.82068622112274), FRAC_CONST(-0.85087788105011) }, + { FRAC_CONST(0.88547372817993), FRAC_CONST(-0.89636802673340) }, + { FRAC_CONST(-0.18173077702522), FRAC_CONST(-0.26152145862579) }, + { FRAC_CONST(0.09355476498604), FRAC_CONST(0.54845124483109) }, + { FRAC_CONST(-0.54668414592743), FRAC_CONST(0.95980775356293) }, + { FRAC_CONST(0.37050989270210), FRAC_CONST(-0.59910142421722) }, + { FRAC_CONST(-0.70373594760895), FRAC_CONST(0.91227668523788) }, + { FRAC_CONST(-0.34600785374641), FRAC_CONST(-0.99441426992416) }, + { FRAC_CONST(-0.68774479627609), FRAC_CONST(-0.30238837003708) }, + { FRAC_CONST(-0.26843291521072), FRAC_CONST(0.83115667104721) }, + { FRAC_CONST(0.49072334170341), FRAC_CONST(-0.45359709858894) }, + { FRAC_CONST(0.38975992798805), FRAC_CONST(0.95515358448029) }, + { FRAC_CONST(-0.97757124900818), FRAC_CONST(0.05305894464254) }, + { FRAC_CONST(-0.17325553297997), FRAC_CONST(-0.92770671844482) }, + { FRAC_CONST(0.99948036670685), FRAC_CONST(0.58285546302795) }, + { FRAC_CONST(-0.64946246147156), FRAC_CONST(0.68645507097244) }, + { FRAC_CONST(-0.12016920745373), FRAC_CONST(-0.57147324085236) }, + { FRAC_CONST(-0.58947455883026), FRAC_CONST(-0.34847131371498) }, + { FRAC_CONST(-0.41815140843391), FRAC_CONST(0.16276422142982) }, + { FRAC_CONST(0.99885648488998), FRAC_CONST(0.11136095225811) }, + { FRAC_CONST(-0.56649613380432), FRAC_CONST(-0.90494865179062) }, + { FRAC_CONST(0.94138020277023), FRAC_CONST(0.35281917452812) }, + { FRAC_CONST(-0.75725078582764), FRAC_CONST(0.53650552034378) }, + { FRAC_CONST(0.20541973412037), FRAC_CONST(-0.94435143470764) }, + { FRAC_CONST(0.99980372190475), FRAC_CONST(0.79835915565491) }, + { FRAC_CONST(0.29078277945518), FRAC_CONST(0.35393777489662) }, + { FRAC_CONST(-0.62858772277832), FRAC_CONST(0.38765692710876) }, + { FRAC_CONST(0.43440905213356), FRAC_CONST(-0.98546332120895) }, + { FRAC_CONST(-0.98298585414886), FRAC_CONST(0.21021524071693) }, + { FRAC_CONST(0.19513028860092), FRAC_CONST(-0.94239830970764) }, + { FRAC_CONST(-0.95476663112640), FRAC_CONST(0.98364555835724) }, + { FRAC_CONST(0.93379634618759), FRAC_CONST(-0.70881992578506) }, + { FRAC_CONST(-0.85235410928726), FRAC_CONST(-0.08342348039150) }, + { FRAC_CONST(-0.86425095796585), FRAC_CONST(-0.45795026421547) }, + { FRAC_CONST(0.38879778981209), FRAC_CONST(0.97274428606033) }, + { FRAC_CONST(0.92045122385025), FRAC_CONST(-0.62433654069901) }, + { FRAC_CONST(0.89162534475327), FRAC_CONST(0.54950958490372) }, + { FRAC_CONST(-0.36834338307381), FRAC_CONST(0.96458297967911) }, + { FRAC_CONST(0.93891763687134), FRAC_CONST(-0.89968353509903) }, + { FRAC_CONST(0.99267655611038), FRAC_CONST(-0.03757034242153) }, + { FRAC_CONST(-0.94063472747803), FRAC_CONST(0.41332337260246) }, + { FRAC_CONST(0.99740225076675), FRAC_CONST(-0.16830494999886) }, + { FRAC_CONST(-0.35899412631989), FRAC_CONST(-0.46633225679398) }, + { FRAC_CONST(0.05237237364054), FRAC_CONST(-0.25640362501144) }, + { FRAC_CONST(0.36703583598137), FRAC_CONST(-0.38653266429901) }, + { FRAC_CONST(0.91653180122375), FRAC_CONST(-0.30587628483772) }, + { FRAC_CONST(0.69000804424286), FRAC_CONST(0.90952169895172) }, + { FRAC_CONST(-0.38658750057220), FRAC_CONST(0.99501574039459) }, + { FRAC_CONST(-0.29250815510750), FRAC_CONST(0.37444993853569) }, + { FRAC_CONST(-0.60182201862335), FRAC_CONST(0.86779648065567) }, + { FRAC_CONST(-0.97418588399887), FRAC_CONST(0.96468526124954) }, + { FRAC_CONST(0.88461571931839), FRAC_CONST(0.57508403062820) }, + { FRAC_CONST(0.05198933184147), FRAC_CONST(0.21269661188126) }, + { FRAC_CONST(-0.53499621152878), FRAC_CONST(0.97241556644440) }, + { FRAC_CONST(-0.49429559707642), FRAC_CONST(0.98183864355087) }, + { FRAC_CONST(-0.98935145139694), FRAC_CONST(-0.40249159932137) }, + { FRAC_CONST(-0.98081380128860), FRAC_CONST(-0.72856897115707) }, + { FRAC_CONST(-0.27338150143623), FRAC_CONST(0.99950921535492) }, + { FRAC_CONST(0.06310802698135), FRAC_CONST(-0.54539585113525) }, + { FRAC_CONST(-0.20461677014828), FRAC_CONST(-0.14209978282452) }, + { FRAC_CONST(0.66223841905594), FRAC_CONST(0.72528582811356) }, + { FRAC_CONST(-0.84764343500137), FRAC_CONST(0.02372316829860) }, + { FRAC_CONST(-0.89039862155914), FRAC_CONST(0.88866579532623) }, + { FRAC_CONST(0.95903307199478), FRAC_CONST(0.76744925975800) }, + { FRAC_CONST(0.73504126071930), FRAC_CONST(-0.03747203201056) }, + { FRAC_CONST(-0.31744435429573), FRAC_CONST(-0.36834111809731) }, + { FRAC_CONST(-0.34110826253891), FRAC_CONST(0.40211221575737) }, + { FRAC_CONST(0.47803884744644), FRAC_CONST(-0.39423218369484) }, + { FRAC_CONST(0.98299193382263), FRAC_CONST(0.01989791356027) }, + { FRAC_CONST(-0.30963072180748), FRAC_CONST(-0.18076720833778) }, + { FRAC_CONST(0.99992591142654), FRAC_CONST(-0.26281872391701) }, + { FRAC_CONST(-0.93149733543396), FRAC_CONST(-0.98313164710999) }, + { FRAC_CONST(0.99923473596573), FRAC_CONST(-0.80142992734909) }, + { FRAC_CONST(-0.26024168729782), FRAC_CONST(-0.75999760627747) }, + { FRAC_CONST(-0.35712513327599), FRAC_CONST(0.19298963248730) }, + { FRAC_CONST(-0.99899083375931), FRAC_CONST(0.74645155668259) }, + { FRAC_CONST(0.86557173728943), FRAC_CONST(0.55593866109848) }, + { FRAC_CONST(0.33408042788506), FRAC_CONST(0.86185956001282) }, + { FRAC_CONST(0.99010735750198), FRAC_CONST(0.04602397605777) }, + { FRAC_CONST(-0.66694271564484), FRAC_CONST(-0.91643613576889) }, + { FRAC_CONST(0.64016789197922), FRAC_CONST(0.15649530291557) }, + { FRAC_CONST(0.99570536613464), FRAC_CONST(0.45844584703445) }, + { FRAC_CONST(-0.63431465625763), FRAC_CONST(0.21079117059708) }, + { FRAC_CONST(-0.07706847041845), FRAC_CONST(-0.89581435918808) }, + { FRAC_CONST(0.98590087890625), FRAC_CONST(0.88241720199585) }, + { FRAC_CONST(0.80099332332611), FRAC_CONST(-0.36851897835732) }, + { FRAC_CONST(0.78368133306503), FRAC_CONST(0.45506998896599) }, + { FRAC_CONST(0.08707806468010), FRAC_CONST(0.80938994884491) }, + { FRAC_CONST(-0.86811882257462), FRAC_CONST(0.39347308874130) }, + { FRAC_CONST(-0.39466530084610), FRAC_CONST(-0.66809433698654) }, + { FRAC_CONST(0.97875326871872), FRAC_CONST(-0.72467839717865) }, + { FRAC_CONST(-0.95038563013077), FRAC_CONST(0.89563220739365) }, + { FRAC_CONST(0.17005239427090), FRAC_CONST(0.54683053493500) }, + { FRAC_CONST(-0.76910793781281), FRAC_CONST(-0.96226614713669) }, + { FRAC_CONST(0.99743282794952), FRAC_CONST(0.42697158455849) }, + { FRAC_CONST(0.95437383651733), FRAC_CONST(0.97002321481705) }, + { FRAC_CONST(0.99578905105591), FRAC_CONST(-0.54106825590134) }, + { FRAC_CONST(0.28058260679245), FRAC_CONST(-0.85361421108246) }, + { FRAC_CONST(0.85256522893906), FRAC_CONST(-0.64567607641220) }, + { FRAC_CONST(-0.50608539581299), FRAC_CONST(-0.65846014022827) }, + { FRAC_CONST(-0.97210735082626), FRAC_CONST(-0.23095212876797) }, + { FRAC_CONST(0.95424050092697), FRAC_CONST(-0.99240148067474) }, + { FRAC_CONST(-0.96926569938660), FRAC_CONST(0.73775655031204) }, + { FRAC_CONST(0.30872163176537), FRAC_CONST(0.41514959931374) }, + { FRAC_CONST(-0.24523839354515), FRAC_CONST(0.63206630945206) }, + { FRAC_CONST(-0.33813264966011), FRAC_CONST(-0.38661777973175) }, + { FRAC_CONST(-0.05826828256249), FRAC_CONST(-0.06940773874521) }, + { FRAC_CONST(-0.22898460924625), FRAC_CONST(0.97054851055145) }, + { FRAC_CONST(-0.18509915471077), FRAC_CONST(0.47565764188766) }, + { FRAC_CONST(-0.10488238185644), FRAC_CONST(-0.87769949436188) }, + { FRAC_CONST(-0.71886587142944), FRAC_CONST(0.78030979633331) }, + { FRAC_CONST(0.99793875217438), FRAC_CONST(0.90041309595108) }, + { FRAC_CONST(0.57563304901123), FRAC_CONST(-0.91034334897995) }, + { FRAC_CONST(0.28909647464752), FRAC_CONST(0.96307784318924) }, + { FRAC_CONST(0.42188999056816), FRAC_CONST(0.48148649930954) }, + { FRAC_CONST(0.93335050344467), FRAC_CONST(-0.43537023663521) }, + { FRAC_CONST(-0.97087377309799), FRAC_CONST(0.86636447906494) }, + { FRAC_CONST(0.36722871661186), FRAC_CONST(0.65291655063629) }, + { FRAC_CONST(-0.81093025207520), FRAC_CONST(0.08778370171785) }, + { FRAC_CONST(-0.26240602135658), FRAC_CONST(-0.92774093151093) }, + { FRAC_CONST(0.83996498584747), FRAC_CONST(0.55839848518372) }, + { FRAC_CONST(-0.99909615516663), FRAC_CONST(-0.96024608612061) }, + { FRAC_CONST(0.74649465084076), FRAC_CONST(0.12144893407822) }, + { FRAC_CONST(-0.74774593114853), FRAC_CONST(-0.26898062229156) }, + { FRAC_CONST(0.95781666040421), FRAC_CONST(-0.79047924280167) }, + { FRAC_CONST(0.95472306013107), FRAC_CONST(-0.08588775992393) }, + { FRAC_CONST(0.48708331584930), FRAC_CONST(0.99999040365219) }, + { FRAC_CONST(0.46332037448883), FRAC_CONST(0.10964126139879) }, + { FRAC_CONST(-0.76497006416321), FRAC_CONST(0.89210927486420) }, + { FRAC_CONST(0.57397389411926), FRAC_CONST(0.35289704799652) }, + { FRAC_CONST(0.75374317169189), FRAC_CONST(0.96705216169357) }, + { FRAC_CONST(-0.59174400568008), FRAC_CONST(-0.89405369758606) }, + { FRAC_CONST(0.75087904930115), FRAC_CONST(-0.29612672328949) }, + { FRAC_CONST(-0.98607856035233), FRAC_CONST(0.25034910440445) }, + { FRAC_CONST(-0.40761056542397), FRAC_CONST(-0.90045571327209) }, + { FRAC_CONST(0.66929268836975), FRAC_CONST(0.98629492521286) }, + { FRAC_CONST(-0.97463697195053), FRAC_CONST(-0.00190223299433) }, + { FRAC_CONST(0.90145510435104), FRAC_CONST(0.99781388044357) }, + { FRAC_CONST(-0.87259286642075), FRAC_CONST(0.99233585596085) }, + { FRAC_CONST(-0.91529458761215), FRAC_CONST(-0.15698707103729) }, + { FRAC_CONST(-0.03305738791823), FRAC_CONST(-0.37205263972282) }, + { FRAC_CONST(0.07223051041365), FRAC_CONST(-0.88805001974106) }, + { FRAC_CONST(0.99498009681702), FRAC_CONST(0.97094357013702) }, + { FRAC_CONST(-0.74904936552048), FRAC_CONST(0.99985486268997) }, + { FRAC_CONST(0.04585228487849), FRAC_CONST(0.99812334775925) }, + { FRAC_CONST(-0.89054954051971), FRAC_CONST(-0.31791913509369) }, + { FRAC_CONST(-0.83782142400742), FRAC_CONST(0.97637635469437) }, + { FRAC_CONST(0.33454805612564), FRAC_CONST(-0.86231517791748) }, + { FRAC_CONST(-0.99707579612732), FRAC_CONST(0.93237990140915) }, + { FRAC_CONST(-0.22827528417110), FRAC_CONST(0.18874759972095) }, + { FRAC_CONST(0.67248046398163), FRAC_CONST(-0.03646211326122) }, + { FRAC_CONST(-0.05146538093686), FRAC_CONST(-0.92599701881409) }, + { FRAC_CONST(0.99947297573090), FRAC_CONST(0.93625229597092) }, + { FRAC_CONST(0.66951125860214), FRAC_CONST(0.98905825614929) }, + { FRAC_CONST(-0.99602955579758), FRAC_CONST(-0.44654715061188) }, + { FRAC_CONST(0.82104903459549), FRAC_CONST(0.99540740251541) }, + { FRAC_CONST(0.99186509847641), FRAC_CONST(0.72022998332977) }, + { FRAC_CONST(-0.65284591913223), FRAC_CONST(0.52186721563339) }, + { FRAC_CONST(0.93885445594788), FRAC_CONST(-0.74895310401917) }, + { FRAC_CONST(0.96735250949860), FRAC_CONST(0.90891814231873) }, + { FRAC_CONST(-0.22225968539715), FRAC_CONST(0.57124030590057) }, + { FRAC_CONST(-0.44132784008980), FRAC_CONST(-0.92688840627670) }, + { FRAC_CONST(-0.85694974660873), FRAC_CONST(0.88844531774521) }, + { FRAC_CONST(0.91783040761948), FRAC_CONST(-0.46356892585754) }, + { FRAC_CONST(0.72556972503662), FRAC_CONST(-0.99899554252625) }, + { FRAC_CONST(-0.99711579084396), FRAC_CONST(0.58211559057236) }, + { FRAC_CONST(0.77638977766037), FRAC_CONST(0.94321835041046) }, + { FRAC_CONST(0.07717324048281), FRAC_CONST(0.58638399839401) }, + { FRAC_CONST(-0.56049829721451), FRAC_CONST(0.82522302865982) }, + { FRAC_CONST(0.98398894071579), FRAC_CONST(0.39467439055443) }, + { FRAC_CONST(0.47546947002411), FRAC_CONST(0.68613046407700) }, + { FRAC_CONST(0.65675091743469), FRAC_CONST(0.18331636488438) }, + { FRAC_CONST(0.03273375332355), FRAC_CONST(-0.74933111667633) }, + { FRAC_CONST(-0.38684144616127), FRAC_CONST(0.51337349414825) }, + { FRAC_CONST(-0.97346270084381), FRAC_CONST(-0.96549361944199) }, + { FRAC_CONST(-0.53282153606415), FRAC_CONST(-0.91423267126083) }, + { FRAC_CONST(0.99817311763763), FRAC_CONST(0.61133575439453) }, + { FRAC_CONST(-0.50254499912262), FRAC_CONST(-0.88829338550568) }, + { FRAC_CONST(0.01995873264968), FRAC_CONST(0.85223513841629) }, + { FRAC_CONST(0.99930381774902), FRAC_CONST(0.94578897953033) }, + { FRAC_CONST(0.82907766103745), FRAC_CONST(-0.06323442608118) }, + { FRAC_CONST(-0.58660709857941), FRAC_CONST(0.96840775012970) }, + { FRAC_CONST(-0.17573736608028), FRAC_CONST(-0.48166921734810) }, + { FRAC_CONST(0.83434289693832), FRAC_CONST(-0.13023450970650) }, + { FRAC_CONST(0.05946491286159), FRAC_CONST(0.20511047542095) }, + { FRAC_CONST(0.81505483388901), FRAC_CONST(-0.94685947895050) }, + { FRAC_CONST(-0.44976380467415), FRAC_CONST(0.40894573926926) }, + { FRAC_CONST(-0.89746475219727), FRAC_CONST(0.99846577644348) }, + { FRAC_CONST(0.39677256345749), FRAC_CONST(-0.74854665994644) }, + { FRAC_CONST(-0.07588948309422), FRAC_CONST(0.74096214771271) }, + { FRAC_CONST(0.76343196630478), FRAC_CONST(0.41746628284454) }, + { FRAC_CONST(-0.74490106105804), FRAC_CONST(0.94725912809372) }, + { FRAC_CONST(0.64880120754242), FRAC_CONST(0.41336661577225) }, + { FRAC_CONST(0.62319535017014), FRAC_CONST(-0.93098312616348) }, + { FRAC_CONST(0.42215818166733), FRAC_CONST(-0.07712787389755) }, + { FRAC_CONST(0.02704554051161), FRAC_CONST(-0.05417517945170) }, + { FRAC_CONST(0.80001771450043), FRAC_CONST(0.91542196273804) }, + { FRAC_CONST(-0.79351830482483), FRAC_CONST(-0.36208897829056) }, + { FRAC_CONST(0.63872361183167), FRAC_CONST(0.08128252625465) }, + { FRAC_CONST(0.52890521287918), FRAC_CONST(0.60048872232437) }, + { FRAC_CONST(0.74238550662994), FRAC_CONST(0.04491915181279) }, + { FRAC_CONST(0.99096131324768), FRAC_CONST(-0.19451183080673) }, + { FRAC_CONST(-0.80412328243256), FRAC_CONST(-0.88513815402985) }, + { FRAC_CONST(-0.64612615108490), FRAC_CONST(0.72198677062988) }, + { FRAC_CONST(0.11657770723104), FRAC_CONST(-0.83662831783295) }, + { FRAC_CONST(-0.95053184032440), FRAC_CONST(-0.96939903497696) }, + { FRAC_CONST(-0.62228870391846), FRAC_CONST(0.82767260074615) }, + { FRAC_CONST(0.03004475869238), FRAC_CONST(-0.99738895893097) }, + { FRAC_CONST(-0.97987216711044), FRAC_CONST(0.36526128649712) }, + { FRAC_CONST(-0.99986982345581), FRAC_CONST(-0.36021611094475) }, + { FRAC_CONST(0.89110648632050), FRAC_CONST(-0.97894251346588) }, + { FRAC_CONST(0.10407960414886), FRAC_CONST(0.77357792854309) }, + { FRAC_CONST(0.95964735746384), FRAC_CONST(-0.35435819625854) }, + { FRAC_CONST(0.50843232870102), FRAC_CONST(0.96107691526413) }, + { FRAC_CONST(0.17006334662437), FRAC_CONST(-0.76854026317596) }, + { FRAC_CONST(0.25872674584389), FRAC_CONST(0.99893301725388) }, + { FRAC_CONST(-0.01115998718888), FRAC_CONST(0.98496019840240) }, + { FRAC_CONST(-0.79598701000214), FRAC_CONST(0.97138410806656) }, + { FRAC_CONST(-0.99264711141586), FRAC_CONST(-0.99542820453644) }, + { FRAC_CONST(-0.99829661846161), FRAC_CONST(0.01877138763666) }, + { FRAC_CONST(-0.70801013708115), FRAC_CONST(0.33680686354637) }, + { FRAC_CONST(-0.70467054843903), FRAC_CONST(0.93272775411606) }, + { FRAC_CONST(0.99846023321152), FRAC_CONST(-0.98725748062134) }, + { FRAC_CONST(-0.63364970684052), FRAC_CONST(-0.16473594307899) }, + { FRAC_CONST(-0.16258217394352), FRAC_CONST(-0.95939123630524) }, + { FRAC_CONST(-0.43645593523979), FRAC_CONST(-0.94805032014847) }, + { FRAC_CONST(-0.99848473072052), FRAC_CONST(0.96245169639587) }, + { FRAC_CONST(-0.16796459257603), FRAC_CONST(-0.98987513780594) }, + { FRAC_CONST(-0.87979227304459), FRAC_CONST(-0.71725726127625) }, + { FRAC_CONST(0.44183099269867), FRAC_CONST(-0.93568974733353) }, + { FRAC_CONST(0.93310177326202), FRAC_CONST(-0.99913311004639) }, + { FRAC_CONST(-0.93941932916641), FRAC_CONST(-0.56409376859665) }, + { FRAC_CONST(-0.88590002059937), FRAC_CONST(0.47624599933624) }, + { FRAC_CONST(0.99971461296082), FRAC_CONST(-0.83889955282211) }, + { FRAC_CONST(-0.75376385450363), FRAC_CONST(0.00814643409103) }, + { FRAC_CONST(0.93887686729431), FRAC_CONST(-0.11284527927637) }, + { FRAC_CONST(0.85126435756683), FRAC_CONST(0.52349251508713) }, + { FRAC_CONST(0.39701420068741), FRAC_CONST(0.81779634952545) }, + { FRAC_CONST(-0.37024465203285), FRAC_CONST(-0.87071657180786) }, + { FRAC_CONST(-0.36024826765060), FRAC_CONST(0.34655734896660) }, + { FRAC_CONST(-0.93388813734055), FRAC_CONST(-0.84476542472839) }, + { FRAC_CONST(-0.65298801660538), FRAC_CONST(-0.18439576029778) }, + { FRAC_CONST(0.11960318684578), FRAC_CONST(0.99899345636368) }, + { FRAC_CONST(0.94292563199997), FRAC_CONST(0.83163905143738) }, + { FRAC_CONST(0.75081145763397), FRAC_CONST(-0.35533222556114) }, + { FRAC_CONST(0.56721979379654), FRAC_CONST(-0.24076835811138) }, + { FRAC_CONST(0.46857765316963), FRAC_CONST(-0.30140233039856) }, + { FRAC_CONST(0.97312313318253), FRAC_CONST(-0.99548190832138) }, + { FRAC_CONST(-0.38299977779388), FRAC_CONST(0.98516911268234) }, + { FRAC_CONST(0.41025799512863), FRAC_CONST(0.02116736955941) }, + { FRAC_CONST(0.09638062119484), FRAC_CONST(0.04411984235048) }, + { FRAC_CONST(-0.85283249616623), FRAC_CONST(0.91475564241409) }, + { FRAC_CONST(0.88866806030273), FRAC_CONST(-0.99735265970230) }, + { FRAC_CONST(-0.48202428221703), FRAC_CONST(-0.96805608272552) }, + { FRAC_CONST(0.27572581171989), FRAC_CONST(0.58634752035141) }, + { FRAC_CONST(-0.65889132022858), FRAC_CONST(0.58835631608963) }, + { FRAC_CONST(0.98838084936142), FRAC_CONST(0.99994349479675) }, + { FRAC_CONST(-0.20651349425316), FRAC_CONST(0.54593044519424) }, + { FRAC_CONST(-0.62126415967941), FRAC_CONST(-0.59893679618835) }, + { FRAC_CONST(0.20320105552673), FRAC_CONST(-0.86879181861877) }, + { FRAC_CONST(-0.97790551185608), FRAC_CONST(0.96290808916092) }, + { FRAC_CONST(0.11112534999847), FRAC_CONST(0.21484763920307) }, + { FRAC_CONST(-0.41368338465691), FRAC_CONST(0.28216838836670) }, + { FRAC_CONST(0.24133038520813), FRAC_CONST(0.51294362545013) }, + { FRAC_CONST(-0.66393411159515), FRAC_CONST(-0.08249679952860) }, + { FRAC_CONST(-0.53697830438614), FRAC_CONST(-0.97649902105331) }, + { FRAC_CONST(-0.97224736213684), FRAC_CONST(0.22081333398819) }, + { FRAC_CONST(0.87392479181290), FRAC_CONST(-0.12796173989773) }, + { FRAC_CONST(0.19050361216068), FRAC_CONST(0.01602615416050) }, + { FRAC_CONST(-0.46353441476822), FRAC_CONST(-0.95249038934708) }, + { FRAC_CONST(-0.07064096629620), FRAC_CONST(-0.94479805231094) }, + { FRAC_CONST(-0.92444086074829), FRAC_CONST(-0.10457590222359) }, + { FRAC_CONST(-0.83822596073151), FRAC_CONST(-0.01695043221116) }, + { FRAC_CONST(0.75214684009552), FRAC_CONST(-0.99955683946609) }, + { FRAC_CONST(-0.42102998495102), FRAC_CONST(0.99720942974091) }, + { FRAC_CONST(-0.72094786167145), FRAC_CONST(-0.35008960962296) }, + { FRAC_CONST(0.78843313455582), FRAC_CONST(0.52851396799088) }, + { FRAC_CONST(0.97394025325775), FRAC_CONST(-0.26695942878723) }, + { FRAC_CONST(0.99206465482712), FRAC_CONST(-0.57010120153427) }, + { FRAC_CONST(0.76789611577988), FRAC_CONST(-0.76519358158112) }, + { FRAC_CONST(-0.82002419233322), FRAC_CONST(-0.73530179262161) }, + { FRAC_CONST(0.81924992799759), FRAC_CONST(0.99698424339294) }, + { FRAC_CONST(-0.26719850301743), FRAC_CONST(0.68903368711472) }, + { FRAC_CONST(-0.43311259150505), FRAC_CONST(0.85321813821793) }, + { FRAC_CONST(0.99194979667664), FRAC_CONST(0.91876250505447) }, + { FRAC_CONST(-0.80691999197006), FRAC_CONST(-0.32627540826797) }, + { FRAC_CONST(0.43080005049706), FRAC_CONST(-0.21919095516205) }, + { FRAC_CONST(0.67709493637085), FRAC_CONST(-0.95478075742722) }, + { FRAC_CONST(0.56151771545410), FRAC_CONST(-0.70693808794022) }, + { FRAC_CONST(0.10831862688065), FRAC_CONST(-0.08628837019205) }, + { FRAC_CONST(0.91229414939880), FRAC_CONST(-0.65987348556519) }, + { FRAC_CONST(-0.48972892761230), FRAC_CONST(0.56289243698120) }, + { FRAC_CONST(-0.89033657312393), FRAC_CONST(-0.71656566858292) }, + { FRAC_CONST(0.65269446372986), FRAC_CONST(0.65916007757187) }, + { FRAC_CONST(0.67439478635788), FRAC_CONST(-0.81684380769730) }, + { FRAC_CONST(-0.47770830988884), FRAC_CONST(-0.16789555549622) }, + { FRAC_CONST(-0.99715977907181), FRAC_CONST(-0.93565785884857) }, + { FRAC_CONST(-0.90889590978622), FRAC_CONST(0.62034398317337) }, + { FRAC_CONST(-0.06618622690439), FRAC_CONST(-0.23812216520309) }, + { FRAC_CONST(0.99430269002914), FRAC_CONST(0.18812555074692) }, + { FRAC_CONST(0.97686403989792), FRAC_CONST(-0.28664535284042) }, + { FRAC_CONST(0.94813650846481), FRAC_CONST(-0.97506642341614) }, + { FRAC_CONST(-0.95434498786926), FRAC_CONST(-0.79607981443405) }, + { FRAC_CONST(-0.49104782938957), FRAC_CONST(0.32895213365555) }, + { FRAC_CONST(0.99881172180176), FRAC_CONST(0.88993984460831) }, + { FRAC_CONST(0.50449168682098), FRAC_CONST(-0.85995072126389) }, + { FRAC_CONST(0.47162890434265), FRAC_CONST(-0.18680204451084) }, + { FRAC_CONST(-0.62081581354141), FRAC_CONST(0.75000673532486) }, + { FRAC_CONST(-0.43867015838623), FRAC_CONST(0.99998068809509) }, + { FRAC_CONST(0.98630565404892), FRAC_CONST(-0.53578901290894) }, + { FRAC_CONST(-0.61510360240936), FRAC_CONST(-0.89515018463135) }, + { FRAC_CONST(-0.03841517493129), FRAC_CONST(-0.69888818264008) }, + { FRAC_CONST(-0.30102157592773), FRAC_CONST(-0.07667808979750) }, + { FRAC_CONST(0.41881284117699), FRAC_CONST(0.02188098989427) }, + { FRAC_CONST(-0.86135452985764), FRAC_CONST(0.98947483301163) }, + { FRAC_CONST(0.67226862907410), FRAC_CONST(-0.13494388759136) }, + { FRAC_CONST(-0.70737397670746), FRAC_CONST(-0.76547348499298) }, + { FRAC_CONST(0.94044947624207), FRAC_CONST(0.09026201069355) }, + { FRAC_CONST(-0.82386350631714), FRAC_CONST(0.08924768865108) }, + { FRAC_CONST(-0.32070666551590), FRAC_CONST(0.50143420696259) }, + { FRAC_CONST(0.57593160867691), FRAC_CONST(-0.98966425657272) }, + { FRAC_CONST(-0.36326017975807), FRAC_CONST(0.07440242916346) }, + { FRAC_CONST(0.99979043006897), FRAC_CONST(-0.14130286872387) }, + { FRAC_CONST(-0.92366021871567), FRAC_CONST(-0.97979295253754) }, + { FRAC_CONST(-0.44607177376747), FRAC_CONST(-0.54233253002167) }, + { FRAC_CONST(0.44226801395416), FRAC_CONST(0.71326756477356) }, + { FRAC_CONST(0.03671907261014), FRAC_CONST(0.63606387376785) }, + { FRAC_CONST(0.52175426483154), FRAC_CONST(-0.85396826267242) }, + { FRAC_CONST(-0.94701141119003), FRAC_CONST(-0.01826348155737) }, + { FRAC_CONST(-0.98759609460831), FRAC_CONST(0.82288712263107) }, + { FRAC_CONST(0.87434792518616), FRAC_CONST(0.89399492740631) }, + { FRAC_CONST(-0.93412041664124), FRAC_CONST(0.41374051570892) }, + { FRAC_CONST(0.96063941717148), FRAC_CONST(0.93116706609726) }, + { FRAC_CONST(0.97534251213074), FRAC_CONST(0.86150932312012) }, + { FRAC_CONST(0.99642467498779), FRAC_CONST(0.70190042257309) }, + { FRAC_CONST(-0.94705086946487), FRAC_CONST(-0.29580041766167) }, + { FRAC_CONST(0.91599804162979), FRAC_CONST(-0.98147833347321) } +}; + +#ifdef __cplusplus + +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_qmf.c b/src/contrib/aacdecoder/libfaad/sbr_qmf.c old mode 100644 new mode 100755 index 4eaba50e8..68f408916 --- a/src/contrib/aacdecoder/libfaad/sbr_qmf.c +++ b/src/contrib/aacdecoder/libfaad/sbr_qmf.c @@ -1,560 +1,636 @@ -/* -** 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: sbr_qmf.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - - -#include -#include -#include "sbr_dct.h" -#include "sbr_qmf.h" -#include "sbr_qmf_c.h" -#include "sbr_syntax.h" - - -qmfa_info *qmfa_init(uint8_t channels) -{ - qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info)); - qmfa->x = (real_t*)faad_malloc(channels * 10 * sizeof(real_t)); - memset(qmfa->x, 0, channels * 10 * sizeof(real_t)); - - qmfa->channels = channels; - - return qmfa; -} - -void qmfa_end(qmfa_info *qmfa) -{ - if (qmfa) - { - if (qmfa->x) faad_free(qmfa->x); - faad_free(qmfa); - } -} - -void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, - qmf_t X[MAX_NTSRHFG][32], uint8_t offset, uint8_t kx) -{ - ALIGN real_t u[64]; -#ifndef SBR_LOW_POWER - ALIGN real_t x[64], y[64]; -#else - ALIGN real_t y[32]; -#endif - uint16_t in = 0; - uint8_t l; - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - int16_t n; - - /* shift input buffer x */ - memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t)); - - /* add new samples to input buffer x */ - for (n = 32 - 1; n >= 0; n--) - { -#ifdef FIXED_POINT - qmfa->x[n] = (input[in++]) >> 5; -#else - qmfa->x[n] = input[in++]; -#endif - } - - /* window and summation to create array u */ - for (n = 0; n < 64; n++) - { - u[n] = MUL_F(qmfa->x[n], qmf_c[2*n]) + - MUL_F(qmfa->x[n + 64], qmf_c[2*(n + 64)]) + - MUL_F(qmfa->x[n + 128], qmf_c[2*(n + 128)]) + - MUL_F(qmfa->x[n + 192], qmf_c[2*(n + 192)]) + - MUL_F(qmfa->x[n + 256], qmf_c[2*(n + 256)]); - } - - /* calculate 32 subband samples by introducing X */ -#ifdef SBR_LOW_POWER - y[0] = u[48]; - for (n = 1; n < 16; n++) - y[n] = u[n+48] + u[48-n]; - for (n = 16; n < 32; n++) - y[n] = -u[n-16] + u[48-n]; - - DCT3_32_unscaled(u, y); - - for (n = 0; n < 32; n++) - { - if (n < kx) - { -#ifdef FIXED_POINT - QMF_RE(X[l + offset][n]) = u[n] << 1; -#else - QMF_RE(X[l + offset][n]) = 2. * u[n]; -#endif - } else { - QMF_RE(X[l + offset][n]) = 0; - } - } -#else - x[0] = u[0]; - for (n = 0; n < 31; n++) - { - x[2*n+1] = u[n+1] + u[63-n]; - x[2*n+2] = u[n+1] - u[63-n]; - } - x[63] = u[32]; - - DCT4_64_kernel(y, x); - - for (n = 0; n < 32; n++) - { - if (n < kx) - { -#ifdef FIXED_POINT - QMF_RE(X[l + offset][n]) = y[n] << 1; - QMF_IM(X[l + offset][n]) = -y[63-n] << 1; -#else - QMF_RE(X[l + offset][n]) = 2. * y[n]; - QMF_IM(X[l + offset][n]) = -2. * y[63-n]; -#endif - } else { - QMF_RE(X[l + offset][n]) = 0; - QMF_IM(X[l + offset][n]) = 0; - } - } -#endif - } -} - -qmfs_info *qmfs_init(uint8_t channels) -{ - qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info)); - -#ifndef SBR_LOW_POWER - qmfs->v[0] = (real_t*)faad_malloc(channels * 10 * sizeof(real_t)); - memset(qmfs->v[0], 0, channels * 10 * sizeof(real_t)); - qmfs->v[1] = (real_t*)faad_malloc(channels * 10 * sizeof(real_t)); - memset(qmfs->v[1], 0, channels * 10 * sizeof(real_t)); -#else - qmfs->v[0] = (real_t*)faad_malloc(channels * 20 * sizeof(real_t)); - memset(qmfs->v[0], 0, channels * 20 * sizeof(real_t)); - qmfs->v[1] = NULL; -#endif - - qmfs->v_index = 0; - - qmfs->channels = channels; - -#ifdef USE_SSE - if (cpu_has_sse()) - { - qmfs->qmf_func = sbr_qmf_synthesis_64_sse; - } else { - qmfs->qmf_func = sbr_qmf_synthesis_64; - } -#endif - - return qmfs; -} - -void qmfs_end(qmfs_info *qmfs) -{ - if (qmfs) - { - if (qmfs->v[0]) faad_free(qmfs->v[0]); -#ifndef SBR_LOW_POWER - if (qmfs->v[1]) faad_free(qmfs->v[1]); -#endif - faad_free(qmfs); - } -} - -#ifdef SBR_LOW_POWER -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x[64]; - ALIGN real_t y[64]; - int16_t n, k, out = 0; - uint8_t l; - - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - //real_t *v0, *v1; - - /* shift buffers */ - //memmove(qmfs->v[0] + 64, qmfs->v[0], (640-64)*sizeof(real_t)); - //memmove(qmfs->v[1] + 64, qmfs->v[1], (640-64)*sizeof(real_t)); - memmove(qmfs->v[0] + 128, qmfs->v[0], (1280-128)*sizeof(real_t)); - - //v0 = qmfs->v[qmfs->v_index]; - //v1 = qmfs->v[(qmfs->v_index + 1) & 0x1]; - //qmfs->v_index = (qmfs->v_index + 1) & 0x1; - - /* calculate 128 samples */ - for (k = 0; k < 64; k++) - { -#ifdef FIXED_POINT - x[k] = QMF_RE(X[l][k]); -#else - x[k] = QMF_RE(X[l][k]) / 32.; -#endif - } - - for (n = 0; n < 32; n++) - { - y[2*n] = -x[2*n]; - y[2*n+1] = x[2*n+1]; - } - - DCT2_64_unscaled(x, x); - - for (n = 0; n < 64; n++) - { - qmfs->v[0][n+32] = x[n]; - } - for (n = 0; n < 32; n++) - { - qmfs->v[0][31 - n] = x[n + 1]; - } - DST2_64_unscaled(x, y); - qmfs->v[0][96] = 0; - for (n = 1; n < 32; n++) - { - qmfs->v[0][n + 96] = x[n-1]; - } - - /* calculate 64 output samples and window */ - for (k = 0; k < 64; k++) - { -#if 1 - output[out++] = MUL_F(qmfs->v[0][k], qmf_c[k]) + - MUL_F(qmfs->v[0][192 + k], qmf_c[64 + k]) + - MUL_F(qmfs->v[0][256 + k], qmf_c[128 + k]) + - MUL_F(qmfs->v[0][256 + 192 + k], qmf_c[128 + 64 + k]) + - MUL_F(qmfs->v[0][512 + k], qmf_c[256 + k]) + - MUL_F(qmfs->v[0][512 + 192 + k], qmf_c[256 + 64 + k]) + - MUL_F(qmfs->v[0][768 + k], qmf_c[384 + k]) + - MUL_F(qmfs->v[0][768 + 192 + k], qmf_c[384 + 64 + k]) + - MUL_F(qmfs->v[0][1024 + k], qmf_c[512 + k]) + - MUL_F(qmfs->v[0][1024 + 192 + k], qmf_c[512 + 64 + k]); -#else - output[out++] = MUL_F(v0[k], qmf_c[k]) + - MUL_F(v0[64 + k], qmf_c[64 + k]) + - MUL_F(v0[128 + k], qmf_c[128 + k]) + - MUL_F(v0[192 + k], qmf_c[192 + k]) + - MUL_F(v0[256 + k], qmf_c[256 + k]) + - MUL_F(v0[320 + k], qmf_c[320 + k]) + - MUL_F(v0[384 + k], qmf_c[384 + k]) + - MUL_F(v0[448 + k], qmf_c[448 + k]) + - MUL_F(v0[512 + k], qmf_c[512 + k]) + - MUL_F(v0[576 + k], qmf_c[576 + k]); -#endif - } - } -} - -void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x[64]; - ALIGN real_t y[64]; - ALIGN real_t y2[64]; - int16_t n, k, out = 0; - uint8_t l; - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - //real_t *v0, *v1; - - /* shift buffers */ - //memmove(qmfs->v[0] + 64, qmfs->v[0], (640-64)*sizeof(real_t)); - //memmove(qmfs->v[1] + 64, qmfs->v[1], (640-64)*sizeof(real_t)); - memmove(qmfs->v[0] + 128, qmfs->v[0], (1280-128)*sizeof(real_t)); - - //v0 = qmfs->v[qmfs->v_index]; - //v1 = qmfs->v[(qmfs->v_index + 1) & 0x1]; - //qmfs->v_index = (qmfs->v_index + 1) & 0x1; - - /* calculate 128 samples */ - for (k = 0; k < 64; k++) - { -#ifdef FIXED_POINT - x[k] = QMF_RE(X[l][k]); -#else - x[k] = QMF_RE(X[l][k]) / 32.; -#endif - } - - for (n = 0; n < 32; n++) - { - y[2*n] = -x[2*n]; - y[2*n+1] = x[2*n+1]; - } - - DCT2_64_unscaled(x, x); - - for (n = 0; n < 64; n++) - { - qmfs->v[0][n+32] = x[n]; - } - for (n = 0; n < 32; n++) - { - qmfs->v[0][31 - n] = x[n + 1]; - } - - DST2_64_unscaled(x, y); - qmfs->v[0][96] = 0; - for (n = 1; n < 32; n++) - { - qmfs->v[0][n + 96] = x[n-1]; - } - - /* calculate 64 output samples and window */ - for (k = 0; k < 64; k++) - { -#if 1 - output[out++] = MUL_F(qmfs->v[0][k], qmf_c[k]) + - MUL_F(qmfs->v[0][192 + k], qmf_c[64 + k]) + - MUL_F(qmfs->v[0][256 + k], qmf_c[128 + k]) + - MUL_F(qmfs->v[0][256 + 192 + k], qmf_c[128 + 64 + k]) + - MUL_F(qmfs->v[0][512 + k], qmf_c[256 + k]) + - MUL_F(qmfs->v[0][512 + 192 + k], qmf_c[256 + 64 + k]) + - MUL_F(qmfs->v[0][768 + k], qmf_c[384 + k]) + - MUL_F(qmfs->v[0][768 + 192 + k], qmf_c[384 + 64 + k]) + - MUL_F(qmfs->v[0][1024 + k], qmf_c[512 + k]) + - MUL_F(qmfs->v[0][1024 + 192 + k], qmf_c[512 + 64 + k]); -#else - output[out++] = MUL_F(v0[k], qmf_c[k]) + - MUL_F(v0[64 + k], qmf_c[64 + k]) + - MUL_F(v0[128 + k], qmf_c[128 + k]) + - MUL_F(v0[192 + k], qmf_c[192 + k]) + - MUL_F(v0[256 + k], qmf_c[256 + k]) + - MUL_F(v0[320 + k], qmf_c[320 + k]) + - MUL_F(v0[384 + k], qmf_c[384 + k]) + - MUL_F(v0[448 + k], qmf_c[448 + k]) + - MUL_F(v0[512 + k], qmf_c[512 + k]) + - MUL_F(v0[576 + k], qmf_c[576 + k]); -#endif - } - } -} -#else -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x1[64], x2[64]; - real_t scale = 1.f/64.f; - int16_t n, k, out = 0; - uint8_t l; - - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - real_t *v0, *v1; - - /* shift buffers */ - memmove(qmfs->v[0] + 64, qmfs->v[0], (640-64)*sizeof(real_t)); - memmove(qmfs->v[1] + 64, qmfs->v[1], (640-64)*sizeof(real_t)); - - v0 = qmfs->v[qmfs->v_index]; - v1 = qmfs->v[(qmfs->v_index + 1) & 0x1]; - qmfs->v_index = (qmfs->v_index + 1) & 0x1; - - /* calculate 128 samples */ - x1[0] = scale*QMF_RE(X[l][0]); - x2[63] = scale*QMF_IM(X[l][0]); - for (k = 0; k < 31; k++) - { - x1[2*k+1] = scale*(QMF_RE(X[l][2*k+1]) - QMF_RE(X[l][2*k+2])); - x1[2*k+2] = scale*(QMF_RE(X[l][2*k+1]) + QMF_RE(X[l][2*k+2])); - - x2[61 - 2*k] = scale*(QMF_IM(X[l][2*k+2]) - QMF_IM(X[l][2*k+1])); - x2[62 - 2*k] = scale*(QMF_IM(X[l][2*k+2]) + QMF_IM(X[l][2*k+1])); - } - x1[63] = scale*QMF_RE(X[l][63]); - x2[0] = scale*QMF_IM(X[l][63]); - - DCT4_64_kernel(x1, x1); - DCT4_64_kernel(x2, x2); - - for (n = 0; n < 32; n++) - { - v0[ 2*n] = x2[2*n] - x1[2*n]; - v1[63-2*n] = x2[2*n] + x1[2*n]; - v0[ 2*n+1] = -x2[2*n+1] - x1[2*n+1]; - v1[62-2*n] = -x2[2*n+1] + x1[2*n+1]; - } - - /* calculate 64 output samples and window */ - for (k = 0; k < 64; k++) - { - output[out++] = MUL_F(v0[k], qmf_c[k]) + - MUL_F(v0[64 + k], qmf_c[64 + k]) + - MUL_F(v0[128 + k], qmf_c[128 + k]) + - MUL_F(v0[192 + k], qmf_c[192 + k]) + - MUL_F(v0[256 + k], qmf_c[256 + k]) + - MUL_F(v0[320 + k], qmf_c[320 + k]) + - MUL_F(v0[384 + k], qmf_c[384 + k]) + - MUL_F(v0[448 + k], qmf_c[448 + k]) + - MUL_F(v0[512 + k], qmf_c[512 + k]) + - MUL_F(v0[576 + k], qmf_c[576 + k]); - } - } -} - -#ifdef USE_SSE -void memmove_sse_576(real_t *out, const real_t *in) -{ - __m128 m[144]; - uint16_t i; - - for (i = 0; i < 144; i++) - { - m[i] = _mm_load_ps(&in[i*4]); - } - for (i = 0; i < 144; i++) - { - _mm_store_ps(&out[i*4], m[i]); - } -} - -void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output) -{ - ALIGN real_t x1[64], x2[64]; - real_t scale = 1.f/64.f; - int16_t n, k, out = 0; - uint8_t l; - - - /* qmf subsample l */ - for (l = 0; l < sbr->numTimeSlotsRate; l++) - { - real_t *v0, *v1; - - /* shift buffers */ - memmove_sse_576(qmfs->v[0] + 64, qmfs->v[0]); - memmove_sse_576(qmfs->v[1] + 64, qmfs->v[1]); - - v0 = qmfs->v[qmfs->v_index]; - v1 = qmfs->v[(qmfs->v_index + 1) & 0x1]; - qmfs->v_index = (qmfs->v_index + 1) & 0x1; - - /* calculate 128 samples */ - x1[0] = scale*QMF_RE(X[l][0]); - x2[63] = scale*QMF_IM(X[l][0]); - for (k = 0; k < 31; k++) - { - x1[2*k+1] = scale*(QMF_RE(X[l][2*k+1]) - QMF_RE(X[l][2*k+2])); - x1[2*k+2] = scale*(QMF_RE(X[l][2*k+1]) + QMF_RE(X[l][2*k+2])); - - x2[61 - 2*k] = scale*(QMF_IM(X[l][2*k+2]) - QMF_IM(X[l][2*k+1])); - x2[62 - 2*k] = scale*(QMF_IM(X[l][2*k+2]) + QMF_IM(X[l][2*k+1])); - } - x1[63] = scale*QMF_RE(X[l][63]); - x2[0] = scale*QMF_IM(X[l][63]); - - DCT4_64_kernel(x1, x1); - DCT4_64_kernel(x2, x2); - - for (n = 0; n < 32; n++) - { - v0[ 2*n ] = x2[2*n] - x1[2*n]; - v1[63- 2*n ] = x2[2*n] + x1[2*n]; - v0[ 2*n+1 ] = -x2[2*n+1] - x1[2*n+1]; - v1[63-(2*n+1)] = -x2[2*n+1] + x1[2*n+1]; - } - - /* calculate 64 output samples and window */ - for (k = 0; k < 64; k+=4) - { - __m128 m0, m1, m2, m3, m4, m5, m6, m7, m8, m9; - __m128 c0, c1, c2, c3, c4, c5, c6, c7, c8, c9; - __m128 s1, s2, s3, s4, s5, s6, s7, s8, s9; - - m0 = _mm_load_ps(&v0[k]); - m1 = _mm_load_ps(&v0[k + 64]); - m2 = _mm_load_ps(&v0[k + 128]); - m3 = _mm_load_ps(&v0[k + 192]); - m4 = _mm_load_ps(&v0[k + 256]); - c0 = _mm_load_ps(&qmf_c[k]); - c1 = _mm_load_ps(&qmf_c[k + 64]); - c2 = _mm_load_ps(&qmf_c[k + 128]); - c3 = _mm_load_ps(&qmf_c[k + 192]); - c4 = _mm_load_ps(&qmf_c[k + 256]); - - m0 = _mm_mul_ps(m0, c0); - m1 = _mm_mul_ps(m1, c1); - m2 = _mm_mul_ps(m2, c2); - m3 = _mm_mul_ps(m3, c3); - m4 = _mm_mul_ps(m4, c4); - - s1 = _mm_add_ps(m0, m1); - s2 = _mm_add_ps(m2, m3); - s6 = _mm_add_ps(s1, s2); - - m5 = _mm_load_ps(&v0[k + 320]); - m6 = _mm_load_ps(&v0[k + 384]); - m7 = _mm_load_ps(&v0[k + 448]); - m8 = _mm_load_ps(&v0[k + 512]); - m9 = _mm_load_ps(&v0[k + 576]); - c5 = _mm_load_ps(&qmf_c[k + 320]); - c6 = _mm_load_ps(&qmf_c[k + 384]); - c7 = _mm_load_ps(&qmf_c[k + 448]); - c8 = _mm_load_ps(&qmf_c[k + 512]); - c9 = _mm_load_ps(&qmf_c[k + 576]); - - m5 = _mm_mul_ps(m5, c5); - m6 = _mm_mul_ps(m6, c6); - m7 = _mm_mul_ps(m7, c7); - m8 = _mm_mul_ps(m8, c8); - m9 = _mm_mul_ps(m9, c9); - - s3 = _mm_add_ps(m4, m5); - s4 = _mm_add_ps(m6, m7); - s5 = _mm_add_ps(m8, m9); - s7 = _mm_add_ps(s3, s4); - s8 = _mm_add_ps(s5, s6); - s9 = _mm_add_ps(s7, s8); - - _mm_store_ps(&output[out], s9); - out += 4; - } - } -} -#endif -#endif - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_qmf.c,v 1.32 2007/11/01 12:33:36 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + + +#include +#include +#include "sbr_dct.h" +#include "sbr_qmf.h" +#include "sbr_qmf_c.h" +#include "sbr_syntax.h" + +qmfa_info *qmfa_init(uint8_t channels) +{ + qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info)); + + /* x is implemented as double ringbuffer */ + qmfa->x = (real_t*)faad_malloc(2 * channels * 10 * sizeof(real_t)); + memset(qmfa->x, 0, 2 * channels * 10 * sizeof(real_t)); + + /* ringbuffer index */ + qmfa->x_index = 0; + + qmfa->channels = channels; + + return qmfa; +} + +void qmfa_end(qmfa_info *qmfa) +{ + if (qmfa) + { + if (qmfa->x) faad_free(qmfa->x); + faad_free(qmfa); + } +} + +void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, + qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx) +{ + ALIGN real_t u[64]; +#ifndef SBR_LOW_POWER + ALIGN real_t in_real[32], in_imag[32], out_real[32], out_imag[32]; +#else + ALIGN real_t y[32]; +#endif + uint32_t in = 0; + uint8_t l; + + /* qmf subsample l */ + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + int16_t n; + + /* shift input buffer x */ + /* input buffer is not shifted anymore, x is implemented as double ringbuffer */ + //memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t)); + + /* add new samples to input buffer x */ + for (n = 32 - 1; n >= 0; n--) + { +#ifdef FIXED_POINT + qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = (input[in++]) >> 4; +#else + qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = input[in++]; +#endif + } + + /* window and summation to create array u */ + for (n = 0; n < 64; n++) + { + u[n] = MUL_F(qmfa->x[qmfa->x_index + n], qmf_c[2*n]) + + MUL_F(qmfa->x[qmfa->x_index + n + 64], qmf_c[2*(n + 64)]) + + MUL_F(qmfa->x[qmfa->x_index + n + 128], qmf_c[2*(n + 128)]) + + MUL_F(qmfa->x[qmfa->x_index + n + 192], qmf_c[2*(n + 192)]) + + MUL_F(qmfa->x[qmfa->x_index + n + 256], qmf_c[2*(n + 256)]); + } + + /* update ringbuffer index */ + qmfa->x_index -= 32; + if (qmfa->x_index < 0) + qmfa->x_index = (320-32); + + /* calculate 32 subband samples by introducing X */ +#ifdef SBR_LOW_POWER + y[0] = u[48]; + for (n = 1; n < 16; n++) + y[n] = u[n+48] + u[48-n]; + for (n = 16; n < 32; n++) + y[n] = -u[n-16] + u[48-n]; + + DCT3_32_unscaled(u, y); + + for (n = 0; n < 32; n++) + { + if (n < kx) + { +#ifdef FIXED_POINT + QMF_RE(X[l + offset][n]) = u[n] /*<< 1*/; +#else + QMF_RE(X[l + offset][n]) = 2. * u[n]; +#endif + } else { + QMF_RE(X[l + offset][n]) = 0; + } + } +#else + + // Reordering of data moved from DCT_IV to here + in_imag[31] = u[1]; + in_real[0] = u[0]; + for (n = 1; n < 31; n++) + { + in_imag[31 - n] = u[n+1]; + in_real[n] = -u[64-n]; + } + in_imag[0] = u[32]; + in_real[31] = -u[33]; + + // dct4_kernel is DCT_IV without reordering which is done before and after FFT + dct4_kernel(in_real, in_imag, out_real, out_imag); + + // Reordering of data moved from DCT_IV to here + for (n = 0; n < 16; n++) { + if (2*n+1 < kx) { +#ifdef FIXED_POINT + QMF_RE(X[l + offset][2*n]) = out_real[n]; + QMF_IM(X[l + offset][2*n]) = out_imag[n]; + QMF_RE(X[l + offset][2*n+1]) = -out_imag[31-n]; + QMF_IM(X[l + offset][2*n+1]) = -out_real[31-n]; +#else + QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; + QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; + QMF_RE(X[l + offset][2*n+1]) = -2. * out_imag[31-n]; + QMF_IM(X[l + offset][2*n+1]) = -2. * out_real[31-n]; +#endif + } else { + if (2*n < kx) { +#ifdef FIXED_POINT + QMF_RE(X[l + offset][2*n]) = out_real[n]; + QMF_IM(X[l + offset][2*n]) = out_imag[n]; +#else + QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; + QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; +#endif + } + else { + QMF_RE(X[l + offset][2*n]) = 0; + QMF_IM(X[l + offset][2*n]) = 0; + } + QMF_RE(X[l + offset][2*n+1]) = 0; + QMF_IM(X[l + offset][2*n+1]) = 0; + } + } +#endif + } +} + +static const complex_t qmf32_pre_twiddle[] = +{ + { FRAC_CONST(0.999924701839145), FRAC_CONST(-0.012271538285720) }, + { FRAC_CONST(0.999322384588350), FRAC_CONST(-0.036807222941359) }, + { FRAC_CONST(0.998118112900149), FRAC_CONST(-0.061320736302209) }, + { FRAC_CONST(0.996312612182778), FRAC_CONST(-0.085797312344440) }, + { FRAC_CONST(0.993906970002356), FRAC_CONST(-0.110222207293883) }, + { FRAC_CONST(0.990902635427780), FRAC_CONST(-0.134580708507126) }, + { FRAC_CONST(0.987301418157858), FRAC_CONST(-0.158858143333861) }, + { FRAC_CONST(0.983105487431216), FRAC_CONST(-0.183039887955141) }, + { FRAC_CONST(0.978317370719628), FRAC_CONST(-0.207111376192219) }, + { FRAC_CONST(0.972939952205560), FRAC_CONST(-0.231058108280671) }, + { FRAC_CONST(0.966976471044852), FRAC_CONST(-0.254865659604515) }, + { FRAC_CONST(0.960430519415566), FRAC_CONST(-0.278519689385053) }, + { FRAC_CONST(0.953306040354194), FRAC_CONST(-0.302005949319228) }, + { FRAC_CONST(0.945607325380521), FRAC_CONST(-0.325310292162263) }, + { FRAC_CONST(0.937339011912575), FRAC_CONST(-0.348418680249435) }, + { FRAC_CONST(0.928506080473216), FRAC_CONST(-0.371317193951838) }, + { FRAC_CONST(0.919113851690058), FRAC_CONST(-0.393992040061048) }, + { FRAC_CONST(0.909167983090522), FRAC_CONST(-0.416429560097637) }, + { FRAC_CONST(0.898674465693954), FRAC_CONST(-0.438616238538528) }, + { FRAC_CONST(0.887639620402854), FRAC_CONST(-0.460538710958240) }, + { FRAC_CONST(0.876070094195407), FRAC_CONST(-0.482183772079123) }, + { FRAC_CONST(0.863972856121587), FRAC_CONST(-0.503538383725718) }, + { FRAC_CONST(0.851355193105265), FRAC_CONST(-0.524589682678469) }, + { FRAC_CONST(0.838224705554838), FRAC_CONST(-0.545324988422046) }, + { FRAC_CONST(0.824589302785025), FRAC_CONST(-0.565731810783613) }, + { FRAC_CONST(0.810457198252595), FRAC_CONST(-0.585797857456439) }, + { FRAC_CONST(0.795836904608884), FRAC_CONST(-0.605511041404326) }, + { FRAC_CONST(0.780737228572094), FRAC_CONST(-0.624859488142386) }, + { FRAC_CONST(0.765167265622459), FRAC_CONST(-0.643831542889791) }, + { FRAC_CONST(0.749136394523459), FRAC_CONST(-0.662415777590172) }, + { FRAC_CONST(0.732654271672413), FRAC_CONST(-0.680600997795453) }, + { FRAC_CONST(0.715730825283819), FRAC_CONST(-0.698376249408973) } +}; + +qmfs_info *qmfs_init(uint8_t channels) +{ + qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info)); + + /* v is a double ringbuffer */ + qmfs->v = (real_t*)faad_malloc(2 * channels * 20 * sizeof(real_t)); + memset(qmfs->v, 0, 2 * channels * 20 * sizeof(real_t)); + + qmfs->v_index = 0; + + qmfs->channels = channels; + + return qmfs; +} + +void qmfs_end(qmfs_info *qmfs) +{ + if (qmfs) + { + if (qmfs->v) faad_free(qmfs->v); + faad_free(qmfs); + } +} + +#ifdef SBR_LOW_POWER + +void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + real_t *output) +{ + ALIGN real_t x[16]; + ALIGN real_t y[16]; + int32_t n, k, out = 0; + uint8_t l; + + /* qmf subsample l */ + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + /* shift buffers */ + /* we are not shifting v, it is a double ringbuffer */ + //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); + + /* calculate 64 samples */ + for (k = 0; k < 16; k++) + { +#ifdef FIXED_POINT + y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])); + x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])); +#else + y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])) / 32.0; + x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])) / 32.0; +#endif + } + + /* even n samples */ + DCT2_16_unscaled(x, x); + /* odd n samples */ + DCT4_16(y, y); + + for (n = 8; n < 24; n++) + { + qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 640 + n*2] = x[n-8]; + qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 640 + n*2+1] = y[n-8]; + } + for (n = 0; n < 16; n++) + { + qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = qmfs->v[qmfs->v_index + 32-n]; + } + qmfs->v[qmfs->v_index + 48] = qmfs->v[qmfs->v_index + 640 + 48] = 0; + for (n = 1; n < 16; n++) + { + qmfs->v[qmfs->v_index + 48+n] = qmfs->v[qmfs->v_index + 640 + 48+n] = -qmfs->v[qmfs->v_index + 48-n]; + } + + /* calculate 32 output samples and window */ + for (k = 0; k < 32; k++) + { + output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); + } + + /* update the ringbuffer index */ + qmfs->v_index -= 64; + if (qmfs->v_index < 0) + qmfs->v_index = (640-64); + } +} + +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + real_t *output) +{ + ALIGN real_t x[64]; + ALIGN real_t y[64]; + int32_t n, k, out = 0; + uint8_t l; + + + /* qmf subsample l */ + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + /* shift buffers */ + /* we are not shifting v, it is a double ringbuffer */ + //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); + + /* calculate 128 samples */ + for (k = 0; k < 32; k++) + { +#ifdef FIXED_POINT + y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])); + x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])); +#else + y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])) / 32.0; + x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])) / 32.0; +#endif + } + + /* even n samples */ + DCT2_32_unscaled(x, x); + /* odd n samples */ + DCT4_32(y, y); + + for (n = 16; n < 48; n++) + { + qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 1280 + n*2] = x[n-16]; + qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 1280 + n*2+1] = y[n-16]; + } + for (n = 0; n < 32; n++) + { + qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 1280 + n] = qmfs->v[qmfs->v_index + 64-n]; + } + qmfs->v[qmfs->v_index + 96] = qmfs->v[qmfs->v_index + 1280 + 96] = 0; + for (n = 1; n < 32; n++) + { + qmfs->v[qmfs->v_index + 96+n] = qmfs->v[qmfs->v_index + 1280 + 96+n] = -qmfs->v[qmfs->v_index + 96-n]; + } + + /* calculate 64 output samples and window */ + for (k = 0; k < 64; k++) + { + output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[k]) + + MUL_F(qmfs->v[qmfs->v_index + 192 + k], qmf_c[64 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[128 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 256 + 192 + k], qmf_c[128 + 64 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[256 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 512 + 192 + k], qmf_c[256 + 64 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 768 + k], qmf_c[384 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 768 + 192 + k], qmf_c[384 + 64 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 1024 + k], qmf_c[512 + k]) + + MUL_F(qmfs->v[qmfs->v_index + 1024 + 192 + k], qmf_c[512 + 64 + k]); + } + + /* update the ringbuffer index */ + qmfs->v_index -= 128; + if (qmfs->v_index < 0) + qmfs->v_index = (1280-128); + } +} +#else +void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + real_t *output) +{ + ALIGN real_t x1[32], x2[32]; +#ifndef FIXED_POINT + real_t scale = 1.f/64.f; +#endif + int32_t n, k, out = 0; + uint8_t l; + + + /* qmf subsample l */ + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + /* shift buffer v */ + /* buffer is not shifted, we are using a ringbuffer */ + //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); + + /* calculate 64 samples */ + /* complex pre-twiddle */ + for (k = 0; k < 32; k++) + { + x1[k] = MUL_F(QMF_RE(X[l][k]), RE(qmf32_pre_twiddle[k])) - MUL_F(QMF_IM(X[l][k]), IM(qmf32_pre_twiddle[k])); + x2[k] = MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k])); + +#ifndef FIXED_POINT + x1[k] *= scale; + x2[k] *= scale; +#else + x1[k] >>= 1; + x2[k] >>= 1; +#endif + } + + /* transform */ + DCT4_32(x1, x1); + DST4_32(x2, x2); + + for (n = 0; n < 32; n++) + { + qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = -x1[n] + x2[n]; + qmfs->v[qmfs->v_index + 63 - n] = qmfs->v[qmfs->v_index + 640 + 63 - n] = x1[n] + x2[n]; + } + + /* calculate 32 output samples and window */ + for (k = 0; k < 32; k++) + { + output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + + MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); + } + + /* update ringbuffer index */ + qmfs->v_index -= 64; + if (qmfs->v_index < 0) + qmfs->v_index = (640 - 64); + } +} + +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + real_t *output) +{ +// ALIGN real_t x1[64], x2[64]; +#ifndef SBR_LOW_POWER + ALIGN real_t in_real1[32], in_imag1[32], out_real1[32], out_imag1[32]; + ALIGN real_t in_real2[32], in_imag2[32], out_real2[32], out_imag2[32]; +#endif + qmf_t * pX; + real_t * pring_buffer_1, * pring_buffer_3; +// real_t * ptemp_1, * ptemp_2; +#ifdef PREFER_POINTERS + // These pointers are used if target platform has autoinc address generators + real_t * pring_buffer_2, * pring_buffer_4; + real_t * pring_buffer_5, * pring_buffer_6; + real_t * pring_buffer_7, * pring_buffer_8; + real_t * pring_buffer_9, * pring_buffer_10; + const real_t * pqmf_c_1, * pqmf_c_2, * pqmf_c_3, * pqmf_c_4; + const real_t * pqmf_c_5, * pqmf_c_6, * pqmf_c_7, * pqmf_c_8; + const real_t * pqmf_c_9, * pqmf_c_10; +#endif // #ifdef PREFER_POINTERS +#ifndef FIXED_POINT + real_t scale = 1.f/64.f; +#endif + int32_t n, k, out = 0; + uint8_t l; + + + /* qmf subsample l */ + for (l = 0; l < sbr->numTimeSlotsRate; l++) + { + /* shift buffer v */ + /* buffer is not shifted, we use double ringbuffer */ + //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); + + /* calculate 128 samples */ +#ifndef FIXED_POINT + + pX = X[l]; + + in_imag1[31] = scale*QMF_RE(pX[1]); + in_real1[0] = scale*QMF_RE(pX[0]); + in_imag2[31] = scale*QMF_IM(pX[63-1]); + in_real2[0] = scale*QMF_IM(pX[63-0]); + for (k = 1; k < 31; k++) + { + in_imag1[31 - k] = scale*QMF_RE(pX[2*k + 1]); + in_real1[ k] = scale*QMF_RE(pX[2*k ]); + in_imag2[31 - k] = scale*QMF_IM(pX[63 - (2*k + 1)]); + in_real2[ k] = scale*QMF_IM(pX[63 - (2*k )]); + } + in_imag1[0] = scale*QMF_RE(pX[63]); + in_real1[31] = scale*QMF_RE(pX[62]); + in_imag2[0] = scale*QMF_IM(pX[63-63]); + in_real2[31] = scale*QMF_IM(pX[63-62]); + +#else + + pX = X[l]; + + in_imag1[31] = QMF_RE(pX[1]) >> 1; + in_real1[0] = QMF_RE(pX[0]) >> 1; + in_imag2[31] = QMF_IM(pX[62]) >> 1; + in_real2[0] = QMF_IM(pX[63]) >> 1; + for (k = 1; k < 31; k++) + { + in_imag1[31 - k] = QMF_RE(pX[2*k + 1]) >> 1; + in_real1[ k] = QMF_RE(pX[2*k ]) >> 1; + in_imag2[31 - k] = QMF_IM(pX[63 - (2*k + 1)]) >> 1; + in_real2[ k] = QMF_IM(pX[63 - (2*k )]) >> 1; + } + in_imag1[0] = QMF_RE(pX[63]) >> 1; + in_real1[31] = QMF_RE(pX[62]) >> 1; + in_imag2[0] = QMF_IM(pX[0]) >> 1; + in_real2[31] = QMF_IM(pX[1]) >> 1; + +#endif + + + // dct4_kernel is DCT_IV without reordering which is done before and after FFT + dct4_kernel(in_real1, in_imag1, out_real1, out_imag1); + dct4_kernel(in_real2, in_imag2, out_real2, out_imag2); + + + pring_buffer_1 = qmfs->v + qmfs->v_index; + pring_buffer_3 = pring_buffer_1 + 1280; +#ifdef PREFER_POINTERS + pring_buffer_2 = pring_buffer_1 + 127; + pring_buffer_4 = pring_buffer_1 + (1280 + 127); +#endif // #ifdef PREFER_POINTERS +// ptemp_1 = x1; +// ptemp_2 = x2; +#ifdef PREFER_POINTERS + for (n = 0; n < 32; n ++) + { + //real_t x1 = *ptemp_1++; + //real_t x2 = *ptemp_2++; + // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer + *pring_buffer_1++ = *pring_buffer_3++ = out_real2[n] - out_real1[n]; + *pring_buffer_2-- = *pring_buffer_4-- = out_real2[n] + out_real1[n]; + //x1 = *ptemp_1++; + //x2 = *ptemp_2++; + *pring_buffer_1++ = *pring_buffer_3++ = out_imag2[31-n] + out_imag1[31-n]; + *pring_buffer_2-- = *pring_buffer_4-- = out_imag2[31-n] - out_imag1[31-n]; + } +#else // #ifdef PREFER_POINTERS + + for (n = 0; n < 32; n++) + { + // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer + pring_buffer_1[2*n] = pring_buffer_3[2*n] = out_real2[n] - out_real1[n]; + pring_buffer_1[127-2*n] = pring_buffer_3[127-2*n] = out_real2[n] + out_real1[n]; + pring_buffer_1[2*n+1] = pring_buffer_3[2*n+1] = out_imag2[31-n] + out_imag1[31-n]; + pring_buffer_1[127-(2*n+1)] = pring_buffer_3[127-(2*n+1)] = out_imag2[31-n] - out_imag1[31-n]; + } + +#endif // #ifdef PREFER_POINTERS + + pring_buffer_1 = qmfs->v + qmfs->v_index; +#ifdef PREFER_POINTERS + pring_buffer_2 = pring_buffer_1 + 192; + pring_buffer_3 = pring_buffer_1 + 256; + pring_buffer_4 = pring_buffer_1 + (256 + 192); + pring_buffer_5 = pring_buffer_1 + 512; + pring_buffer_6 = pring_buffer_1 + (512 + 192); + pring_buffer_7 = pring_buffer_1 + 768; + pring_buffer_8 = pring_buffer_1 + (768 + 192); + pring_buffer_9 = pring_buffer_1 + 1024; + pring_buffer_10 = pring_buffer_1 + (1024 + 192); + pqmf_c_1 = qmf_c; + pqmf_c_2 = qmf_c + 64; + pqmf_c_3 = qmf_c + 128; + pqmf_c_4 = qmf_c + 192; + pqmf_c_5 = qmf_c + 256; + pqmf_c_6 = qmf_c + 320; + pqmf_c_7 = qmf_c + 384; + pqmf_c_8 = qmf_c + 448; + pqmf_c_9 = qmf_c + 512; + pqmf_c_10 = qmf_c + 576; +#endif // #ifdef PREFER_POINTERS + + /* calculate 64 output samples and window */ + for (k = 0; k < 64; k++) + { +#ifdef PREFER_POINTERS + output[out++] = + MUL_F(*pring_buffer_1++, *pqmf_c_1++) + + MUL_F(*pring_buffer_2++, *pqmf_c_2++) + + MUL_F(*pring_buffer_3++, *pqmf_c_3++) + + MUL_F(*pring_buffer_4++, *pqmf_c_4++) + + MUL_F(*pring_buffer_5++, *pqmf_c_5++) + + MUL_F(*pring_buffer_6++, *pqmf_c_6++) + + MUL_F(*pring_buffer_7++, *pqmf_c_7++) + + MUL_F(*pring_buffer_8++, *pqmf_c_8++) + + MUL_F(*pring_buffer_9++, *pqmf_c_9++) + + MUL_F(*pring_buffer_10++, *pqmf_c_10++); +#else // #ifdef PREFER_POINTERS + output[out++] = + MUL_F(pring_buffer_1[k+0], qmf_c[k+0]) + + MUL_F(pring_buffer_1[k+192], qmf_c[k+64]) + + MUL_F(pring_buffer_1[k+256], qmf_c[k+128]) + + MUL_F(pring_buffer_1[k+(256+192)], qmf_c[k+192]) + + MUL_F(pring_buffer_1[k+512], qmf_c[k+256]) + + MUL_F(pring_buffer_1[k+(512+192)], qmf_c[k+320]) + + MUL_F(pring_buffer_1[k+768], qmf_c[k+384]) + + MUL_F(pring_buffer_1[k+(768+192)], qmf_c[k+448]) + + MUL_F(pring_buffer_1[k+1024], qmf_c[k+512]) + + MUL_F(pring_buffer_1[k+(1024+192)], qmf_c[k+576]); +#endif // #ifdef PREFER_POINTERS + } + + /* update ringbuffer index */ + qmfs->v_index -= 128; + if (qmfs->v_index < 0) + qmfs->v_index = (1280 - 128); + } +} +#endif + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_qmf.h b/src/contrib/aacdecoder/libfaad/sbr_qmf.h old mode 100644 new mode 100755 index 2127831c5..efb167be9 --- a/src/contrib/aacdecoder/libfaad/sbr_qmf.h +++ b/src/contrib/aacdecoder/libfaad/sbr_qmf.h @@ -1,54 +1,55 @@ -/* -** 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: sbr_qmf.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_QMF_H__ -#define __SBR_QMF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -qmfa_info *qmfa_init(uint8_t channels); -void qmfa_end(qmfa_info *qmfa); -qmfs_info *qmfs_init(uint8_t channels); -void qmfs_end(qmfs_info *qmfs); - -void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, - qmf_t X[MAX_NTSRHFG][32], uint8_t offset, uint8_t kx); -void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output); -#ifdef USE_SSE -void sbr_qmf_synthesis_64_sse(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], - real_t *output); -#endif - - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_qmf.h,v 1.25 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SBR_QMF_H__ +#define __SBR_QMF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +qmfa_info *qmfa_init(uint8_t channels); +void qmfa_end(qmfa_info *qmfa); +qmfs_info *qmfs_init(uint8_t channels); +void qmfs_end(qmfs_info *qmfs); + +void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, + qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx); +void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + real_t *output); +void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], + real_t *output); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_qmf_c.h b/src/contrib/aacdecoder/libfaad/sbr_qmf_c.h old mode 100644 new mode 100755 index adda19d70..c2fcd2739 --- a/src/contrib/aacdecoder/libfaad/sbr_qmf_c.h +++ b/src/contrib/aacdecoder/libfaad/sbr_qmf_c.h @@ -1,365 +1,368 @@ -/* -** 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: sbr_qmf_c.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_QMF_C_H__ -#define __SBR_QMF_C_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t qmf_c[640] = { - FRAC_CONST(0), FRAC_CONST(-0.00055252865047), - FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00049475180896), - FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00048937912498), - FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00052265642972), - FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00056778025613), - FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00061327473938), - FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00065403333621), - FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00069416146273), - FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00072550431222), - FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00074905980532), - FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00077248485949), - FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077798694927), - FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00078014496257), - FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00076307935757), - FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00073193571525), - FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00069179375372), - FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00063415949025), - FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00055645763906), - FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00046063254803), - FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00035011758756), - FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.0002098337344), - FRAC_CONST(-0.00014463809349), FRAC_CONST(-6.173344072E-005), - FRAC_CONST(1.349497418E-005), FRAC_CONST(0.00010943831274), - FRAC_CONST(0.00020430170688), FRAC_CONST(0.00029495311041), - FRAC_CONST(0.0004026540216), FRAC_CONST(0.00051073884952), - FRAC_CONST(0.00062393761391), FRAC_CONST(0.00074580258865), - FRAC_CONST(0.00086084433262), FRAC_CONST(0.00098859883015), - FRAC_CONST(0.00112501551307), FRAC_CONST(0.00125778846475), - FRAC_CONST(0.00139024948272), FRAC_CONST(0.00154432198471), - FRAC_CONST(0.00168680832531), FRAC_CONST(0.00183482654224), - FRAC_CONST(0.00198411407369), FRAC_CONST(0.00214615835557), - FRAC_CONST(0.00230172547746), FRAC_CONST(0.00246256169126), - FRAC_CONST(0.00262017586902), FRAC_CONST(0.00278704643465), - FRAC_CONST(0.00294694477165), FRAC_CONST(0.00311254206525), - FRAC_CONST(0.00327396134847), FRAC_CONST(0.00344188741828), - FRAC_CONST(0.00360082681231), FRAC_CONST(0.00376039229104), - FRAC_CONST(0.00392074323703), FRAC_CONST(0.00408197531935), - FRAC_CONST(0.0042264269227), FRAC_CONST(0.00437307196781), - FRAC_CONST(0.00452098527825), FRAC_CONST(0.00466064606118), - FRAC_CONST(0.00479325608498), FRAC_CONST(0.00491376035745), - FRAC_CONST(0.00503930226013), FRAC_CONST(0.00514073539032), - FRAC_CONST(0.00524611661324), FRAC_CONST(0.00534716811982), - FRAC_CONST(0.00541967759307), FRAC_CONST(0.00548760401507), - FRAC_CONST(0.00554757145088), FRAC_CONST(0.00559380230045), - FRAC_CONST(0.00562206432097), FRAC_CONST(0.00564551969164), - FRAC_CONST(0.00563891995151), FRAC_CONST(0.00562661141932), - FRAC_CONST(0.0055917128663), FRAC_CONST(0.005540436394), - FRAC_CONST(0.0054753783077), FRAC_CONST(0.0053838975897), - FRAC_CONST(0.00527157587272), FRAC_CONST(0.00513822754514), - FRAC_CONST(0.00498396877629), FRAC_CONST(0.004810946906), - FRAC_CONST(0.00460395301471), FRAC_CONST(0.00438018617447), - FRAC_CONST(0.0041251642327), FRAC_CONST(0.00384564081246), - FRAC_CONST(0.00354012465507), FRAC_CONST(0.00320918858098), - FRAC_CONST(0.00284467578623), FRAC_CONST(0.00245085400321), - FRAC_CONST(0.0020274176185), FRAC_CONST(0.00157846825768), - FRAC_CONST(0.00109023290512), FRAC_CONST(0.0005832264248), - FRAC_CONST(2.760451905E-005), FRAC_CONST(-0.00054642808664), - FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00180394725893), - FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.003193377839), - FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.004722259624), - FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.00637922932685), - FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00817982333726), - FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.01011502154986), - FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01218499959508), - FRAC_CONST(0.01327182200351), FRAC_CONST(0.01439046660792), - FRAC_CONST(0.01554055533423), FRAC_CONST(0.01673247129989), - FRAC_CONST(0.01794333813443), FRAC_CONST(0.01918724313698), - FRAC_CONST(0.02045317933555), FRAC_CONST(0.02174675502535), - FRAC_CONST(0.02306801692862), FRAC_CONST(0.02441609920285), - FRAC_CONST(0.02578758475467), FRAC_CONST(0.02718594296329), - FRAC_CONST(0.02860721736385), FRAC_CONST(0.03005026574279), - FRAC_CONST(0.03150176087389), FRAC_CONST(0.03297540810337), - FRAC_CONST(0.03446209487686), FRAC_CONST(0.03596975605542), - FRAC_CONST(0.03748128504252), FRAC_CONST(0.03900536794745), - FRAC_CONST(0.04053491705584), FRAC_CONST(0.04206490946367), - FRAC_CONST(0.04360975421304), FRAC_CONST(0.04514884056413), - FRAC_CONST(0.04668430272642), FRAC_CONST(0.04821657200672), - FRAC_CONST(0.04973857556014), FRAC_CONST(0.05125561555216), - FRAC_CONST(0.05276307465207), FRAC_CONST(0.05424527683589), - FRAC_CONST(0.05571736482138), FRAC_CONST(0.05716164501299), - FRAC_CONST(0.0585915683626), FRAC_CONST(0.05998374801761), - FRAC_CONST(0.06134551717207), FRAC_CONST(0.06268578081172), - FRAC_CONST(0.06397158980681), FRAC_CONST(0.0652247106438), - FRAC_CONST(0.06643675122104), FRAC_CONST(0.06760759851228), - FRAC_CONST(0.06870438283512), FRAC_CONST(0.06976302447127), - FRAC_CONST(0.07076287107266), FRAC_CONST(0.07170026731102), - FRAC_CONST(0.07256825833083), FRAC_CONST(0.07336202550803), - FRAC_CONST(0.07410036424342), FRAC_CONST(0.07474525581194), - FRAC_CONST(0.07531373362019), FRAC_CONST(0.07580083586584), - FRAC_CONST(0.07619924793396), FRAC_CONST(0.07649921704119), - FRAC_CONST(0.07670934904245), FRAC_CONST(0.07681739756964), - FRAC_CONST(0.07682300113923), FRAC_CONST(0.07672049241746), - FRAC_CONST(0.07650507183194), FRAC_CONST(0.07617483218536), - FRAC_CONST(0.07573057565061), FRAC_CONST(0.0751576255287), - FRAC_CONST(0.07446643947564), FRAC_CONST(0.0736406005762), - FRAC_CONST(0.07267746427299), FRAC_CONST(0.07158263647903), - FRAC_CONST(0.07035330735093), FRAC_CONST(0.06896640131951), - FRAC_CONST(0.06745250215166), FRAC_CONST(0.06576906686508), - FRAC_CONST(0.06394448059633), FRAC_CONST(0.06196027790387), - FRAC_CONST(0.0598166570809), FRAC_CONST(0.05751526919867), - FRAC_CONST(0.05504600343009), FRAC_CONST(0.05240938217366), - FRAC_CONST(0.04959786763445), FRAC_CONST(0.04663033051701), - FRAC_CONST(0.04347687821958), FRAC_CONST(0.04014582784127), - FRAC_CONST(0.03664181168133), FRAC_CONST(0.03295839306691), - FRAC_CONST(0.02908240060125), FRAC_CONST(0.02503075618909), - FRAC_CONST(0.02079970728622), FRAC_CONST(0.01637012582228), - FRAC_CONST(0.01176238327857), FRAC_CONST(0.00696368621617), - FRAC_CONST(0.00197656014503), FRAC_CONST(-0.00320868968304), - FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.01412888273558), - FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.02582272888064), - FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.03827765720822), - FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.05148041767934), - FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.06544098531359), - FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.08013729344279), - FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.09555333528914), - FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.1116826931773), - FRAC_CONST(-0.120007798468), FRAC_CONST(-0.12850028503878), - FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.1459766491187), - FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.16409588556669), - FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.18281725485142), - FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.20212501768103), - FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.22196526964149), - FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.24230168845974), - FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.26310532994603), - FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.28432141891085), - FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.30590985751916), - FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.32781137272105), - FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.3499914122931), - FRAC_CONST(0.36115899031355), FRAC_CONST(0.37237955463061), - FRAC_CONST(0.38363500139043), FRAC_CONST(0.39492117615675), - FRAC_CONST(0.40623176767625), FRAC_CONST(0.41756968968409), - FRAC_CONST(0.42891199207373), FRAC_CONST(0.44025537543665), - FRAC_CONST(0.45159965356824), FRAC_CONST(0.46293080852757), - FRAC_CONST(0.47424532146115), FRAC_CONST(0.48552530911099), - FRAC_CONST(0.49677082545707), FRAC_CONST(0.50798175000434), - FRAC_CONST(0.51912349702391), FRAC_CONST(0.53022408956855), - FRAC_CONST(0.54125534487322), FRAC_CONST(0.55220512585061), - FRAC_CONST(0.5630789140137), FRAC_CONST(0.57385241316923), - FRAC_CONST(0.58454032354679), FRAC_CONST(0.59511230862496), - FRAC_CONST(0.6055783538918), FRAC_CONST(0.61591099320291), - FRAC_CONST(0.62612426956055), FRAC_CONST(0.63619801077286), - FRAC_CONST(0.64612696959461), FRAC_CONST(0.65590163024671), - FRAC_CONST(0.66551398801627), FRAC_CONST(0.67496631901712), - FRAC_CONST(0.68423532934598), FRAC_CONST(0.69332823767032), - FRAC_CONST(0.70223887193539), FRAC_CONST(0.71094104263095), - FRAC_CONST(0.71944626349561), FRAC_CONST(0.72774489002994), - FRAC_CONST(0.73582117582769), FRAC_CONST(0.74368278636488), - FRAC_CONST(0.75131374561237), FRAC_CONST(0.75870807608242), - FRAC_CONST(0.76586748650939), FRAC_CONST(0.77277808813327), - FRAC_CONST(0.77942875190216), FRAC_CONST(0.7858353120392), - FRAC_CONST(0.79197358416424), FRAC_CONST(0.797846641377), - FRAC_CONST(0.80344857518505), FRAC_CONST(0.80876950044491), - FRAC_CONST(0.81381912706217), FRAC_CONST(0.81857760046468), - FRAC_CONST(0.82304198905409), FRAC_CONST(0.8272275347336), - FRAC_CONST(0.8311038457152), FRAC_CONST(0.83469373618402), - FRAC_CONST(0.83797173378865), FRAC_CONST(0.84095413924722), - FRAC_CONST(0.84362382812005), FRAC_CONST(0.84598184698206), - FRAC_CONST(0.84803157770763), FRAC_CONST(0.84978051984268), - FRAC_CONST(0.85119715249343), FRAC_CONST(0.85230470352147), - FRAC_CONST(0.85310209497017), FRAC_CONST(0.85357205739107), - FRAC_CONST(0.85373856005937), FRAC_CONST(0.85357205739107), - FRAC_CONST(0.85310209497017), FRAC_CONST(0.85230470352147), - FRAC_CONST(0.85119715249343), FRAC_CONST(0.84978051984268), - FRAC_CONST(0.84803157770763), FRAC_CONST(0.84598184698206), - FRAC_CONST(0.84362382812005), FRAC_CONST(0.84095413924722), - FRAC_CONST(0.83797173378865), FRAC_CONST(0.83469373618402), - FRAC_CONST(0.8311038457152), FRAC_CONST(0.8272275347336), - FRAC_CONST(0.82304198905409), FRAC_CONST(0.81857760046468), - FRAC_CONST(0.81381912706217), FRAC_CONST(0.80876950044491), - FRAC_CONST(0.80344857518505), FRAC_CONST(0.797846641377), - FRAC_CONST(0.79197358416424), FRAC_CONST(0.7858353120392), - FRAC_CONST(0.77942875190216), FRAC_CONST(0.77277808813327), - FRAC_CONST(0.76586748650939), FRAC_CONST(0.75870807608242), - FRAC_CONST(0.75131374561237), FRAC_CONST(0.74368278636488), - FRAC_CONST(0.73582117582769), FRAC_CONST(0.72774489002994), - FRAC_CONST(0.71944626349561), FRAC_CONST(0.71094104263095), - FRAC_CONST(0.70223887193539), FRAC_CONST(0.69332823767032), - FRAC_CONST(0.68423532934598), FRAC_CONST(0.67496631901712), - FRAC_CONST(0.66551398801627), FRAC_CONST(0.65590163024671), - FRAC_CONST(0.64612696959461), FRAC_CONST(0.63619801077286), - FRAC_CONST(0.62612426956055), FRAC_CONST(0.61591099320291), - FRAC_CONST(0.6055783538918), FRAC_CONST(0.59511230862496), - FRAC_CONST(0.58454032354679), FRAC_CONST(0.57385241316923), - FRAC_CONST(0.5630789140137), FRAC_CONST(0.55220512585061), - FRAC_CONST(0.54125534487322), FRAC_CONST(0.53022408956855), - FRAC_CONST(0.51912349702391), FRAC_CONST(0.50798175000434), - FRAC_CONST(0.49677082545707), FRAC_CONST(0.48552530911099), - FRAC_CONST(0.47424532146115), FRAC_CONST(0.46293080852757), - FRAC_CONST(0.45159965356824), FRAC_CONST(0.44025537543665), - FRAC_CONST(0.42891199207373), FRAC_CONST(0.41756968968409), - FRAC_CONST(0.40623176767625), FRAC_CONST(0.39492117615675), - FRAC_CONST(0.38363500139043), FRAC_CONST(0.37237955463061), - FRAC_CONST(-0.36115899031355), FRAC_CONST(-0.3499914122931), - FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.32781137272105), - FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.30590985751916), - FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.28432141891085), - FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.26310532994603), - FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.24230168845974), - FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.22196526964149), - FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.20212501768103), - FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.18281725485142), - FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.16409588556669), - FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.1459766491187), - FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.12850028503878), - FRAC_CONST(-0.120007798468), FRAC_CONST(-0.1116826931773), - FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.09555333528914), - FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.08013729344279), - FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.06544098531359), - FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.05148041767934), - FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.03827765720822), - FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.02582272888064), - FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.01412888273558), - FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.00320868968304), - FRAC_CONST(0.00197656014503), FRAC_CONST(0.00696368621617), - FRAC_CONST(0.01176238327857), FRAC_CONST(0.01637012582228), - FRAC_CONST(0.02079970728622), FRAC_CONST(0.02503075618909), - FRAC_CONST(0.02908240060125), FRAC_CONST(0.03295839306691), - FRAC_CONST(0.03664181168133), FRAC_CONST(0.04014582784127), - FRAC_CONST(0.04347687821958), FRAC_CONST(0.04663033051701), - FRAC_CONST(0.04959786763445), FRAC_CONST(0.05240938217366), - FRAC_CONST(0.05504600343009), FRAC_CONST(0.05751526919867), - FRAC_CONST(0.0598166570809), FRAC_CONST(0.06196027790387), - FRAC_CONST(0.06394448059633), FRAC_CONST(0.06576906686508), - FRAC_CONST(0.06745250215166), FRAC_CONST(0.06896640131951), - FRAC_CONST(0.07035330735093), FRAC_CONST(0.07158263647903), - FRAC_CONST(0.07267746427299), FRAC_CONST(0.0736406005762), - FRAC_CONST(0.07446643947564), FRAC_CONST(0.0751576255287), - FRAC_CONST(0.07573057565061), FRAC_CONST(0.07617483218536), - FRAC_CONST(0.07650507183194), FRAC_CONST(0.07672049241746), - FRAC_CONST(0.07682300113923), FRAC_CONST(0.07681739756964), - FRAC_CONST(0.07670934904245), FRAC_CONST(0.07649921704119), - FRAC_CONST(0.07619924793396), FRAC_CONST(0.07580083586584), - FRAC_CONST(0.07531373362019), FRAC_CONST(0.07474525581194), - FRAC_CONST(0.07410036424342), FRAC_CONST(0.07336202550803), - FRAC_CONST(0.07256825833083), FRAC_CONST(0.07170026731102), - FRAC_CONST(0.07076287107266), FRAC_CONST(0.06976302447127), - FRAC_CONST(0.06870438283512), FRAC_CONST(0.06760759851228), - FRAC_CONST(0.06643675122104), FRAC_CONST(0.0652247106438), - FRAC_CONST(0.06397158980681), FRAC_CONST(0.06268578081172), - FRAC_CONST(0.06134551717207), FRAC_CONST(0.05998374801761), - FRAC_CONST(0.0585915683626), FRAC_CONST(0.05716164501299), - FRAC_CONST(0.05571736482138), FRAC_CONST(0.05424527683589), - FRAC_CONST(0.05276307465207), FRAC_CONST(0.05125561555216), - FRAC_CONST(0.04973857556014), FRAC_CONST(0.04821657200672), - FRAC_CONST(0.04668430272642), FRAC_CONST(0.04514884056413), - FRAC_CONST(0.04360975421304), FRAC_CONST(0.04206490946367), - FRAC_CONST(0.04053491705584), FRAC_CONST(0.03900536794745), - FRAC_CONST(0.03748128504252), FRAC_CONST(0.03596975605542), - FRAC_CONST(0.03446209487686), FRAC_CONST(0.03297540810337), - FRAC_CONST(0.03150176087389), FRAC_CONST(0.03005026574279), - FRAC_CONST(0.02860721736385), FRAC_CONST(0.02718594296329), - FRAC_CONST(0.02578758475467), FRAC_CONST(0.02441609920285), - FRAC_CONST(0.02306801692862), FRAC_CONST(0.02174675502535), - FRAC_CONST(0.02045317933555), FRAC_CONST(0.01918724313698), - FRAC_CONST(0.01794333813443), FRAC_CONST(0.01673247129989), - FRAC_CONST(0.01554055533423), FRAC_CONST(0.01439046660792), - FRAC_CONST(-0.01327182200351), FRAC_CONST(-0.01218499959508), - FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01011502154986), - FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.00817982333726), - FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00637922932685), - FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.004722259624), - FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.003193377839), - FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.00180394725893), - FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00054642808664), - FRAC_CONST(2.760451905E-005), FRAC_CONST(0.0005832264248), - FRAC_CONST(0.00109023290512), FRAC_CONST(0.00157846825768), - FRAC_CONST(0.0020274176185), FRAC_CONST(0.00245085400321), - FRAC_CONST(0.00284467578623), FRAC_CONST(0.00320918858098), - FRAC_CONST(0.00354012465507), FRAC_CONST(0.00384564081246), - FRAC_CONST(0.0041251642327), FRAC_CONST(0.00438018617447), - FRAC_CONST(0.00460395301471), FRAC_CONST(0.004810946906), - FRAC_CONST(0.00498396877629), FRAC_CONST(0.00513822754514), - FRAC_CONST(0.00527157587272), FRAC_CONST(0.0053838975897), - FRAC_CONST(0.0054753783077), FRAC_CONST(0.005540436394), - FRAC_CONST(0.0055917128663), FRAC_CONST(0.00562661141932), - FRAC_CONST(0.00563891995151), FRAC_CONST(0.00564551969164), - FRAC_CONST(0.00562206432097), FRAC_CONST(0.00559380230045), - FRAC_CONST(0.00554757145088), FRAC_CONST(0.00548760401507), - FRAC_CONST(0.00541967759307), FRAC_CONST(0.00534716811982), - FRAC_CONST(0.00524611661324), FRAC_CONST(0.00514073539032), - FRAC_CONST(0.00503930226013), FRAC_CONST(0.00491376035745), - FRAC_CONST(0.00479325608498), FRAC_CONST(0.00466064606118), - FRAC_CONST(0.00452098527825), FRAC_CONST(0.00437307196781), - FRAC_CONST(0.0042264269227), FRAC_CONST(0.00408197531935), - FRAC_CONST(0.00392074323703), FRAC_CONST(0.00376039229104), - FRAC_CONST(0.00360082681231), FRAC_CONST(0.00344188741828), - FRAC_CONST(0.00327396134847), FRAC_CONST(0.00311254206525), - FRAC_CONST(0.00294694477165), FRAC_CONST(0.00278704643465), - FRAC_CONST(0.00262017586902), FRAC_CONST(0.00246256169126), - FRAC_CONST(0.00230172547746), FRAC_CONST(0.00214615835557), - FRAC_CONST(0.00198411407369), FRAC_CONST(0.00183482654224), - FRAC_CONST(0.00168680832531), FRAC_CONST(0.00154432198471), - FRAC_CONST(0.00139024948272), FRAC_CONST(0.00125778846475), - FRAC_CONST(0.00112501551307), FRAC_CONST(0.00098859883015), - FRAC_CONST(0.00086084433262), FRAC_CONST(0.00074580258865), - FRAC_CONST(0.00062393761391), FRAC_CONST(0.00051073884952), - FRAC_CONST(0.0004026540216), FRAC_CONST(0.00029495311041), - FRAC_CONST(0.00020430170688), FRAC_CONST(0.00010943831274), - FRAC_CONST(1.349497418E-005), FRAC_CONST(-6.173344072E-005), - FRAC_CONST(-0.00014463809349), FRAC_CONST(-0.0002098337344), - FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.00035011758756), - FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00046063254803), - FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00055645763906), - FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00063415949025), - FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00069179375372), - FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00073193571525), - FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00076307935757), - FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00078014496257), - FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00077798694927), - FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077248485949), - FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00074905980532), - FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00072550431222), - FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00069416146273), - FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00065403333621), - FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00061327473938), - FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00056778025613), - FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00052265642972), - FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00048937912498), - FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00049475180896), - FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00055252865047) -}; - -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_qmf_c.h,v 1.17 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SBR_QMF_C_H__ +#define __SBR_QMF_C_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + +ALIGN static const real_t qmf_c[640] = { + FRAC_CONST(0), FRAC_CONST(-0.00055252865047), + FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00049475180896), + FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00048937912498), + FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00052265642972), + FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00056778025613), + FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00061327473938), + FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00065403333621), + FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00069416146273), + FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00072550431222), + FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00074905980532), + FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00077248485949), + FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077798694927), + FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00078014496257), + FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00076307935757), + FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00073193571525), + FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00069179375372), + FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00063415949025), + FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00055645763906), + FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00046063254803), + FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00035011758756), + FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.0002098337344), + FRAC_CONST(-0.00014463809349), FRAC_CONST(-6.173344072E-005), + FRAC_CONST(1.349497418E-005), FRAC_CONST(0.00010943831274), + FRAC_CONST(0.00020430170688), FRAC_CONST(0.00029495311041), + FRAC_CONST(0.0004026540216), FRAC_CONST(0.00051073884952), + FRAC_CONST(0.00062393761391), FRAC_CONST(0.00074580258865), + FRAC_CONST(0.00086084433262), FRAC_CONST(0.00098859883015), + FRAC_CONST(0.00112501551307), FRAC_CONST(0.00125778846475), + FRAC_CONST(0.00139024948272), FRAC_CONST(0.00154432198471), + FRAC_CONST(0.00168680832531), FRAC_CONST(0.00183482654224), + FRAC_CONST(0.00198411407369), FRAC_CONST(0.00214615835557), + FRAC_CONST(0.00230172547746), FRAC_CONST(0.00246256169126), + FRAC_CONST(0.00262017586902), FRAC_CONST(0.00278704643465), + FRAC_CONST(0.00294694477165), FRAC_CONST(0.00311254206525), + FRAC_CONST(0.00327396134847), FRAC_CONST(0.00344188741828), + FRAC_CONST(0.00360082681231), FRAC_CONST(0.00376039229104), + FRAC_CONST(0.00392074323703), FRAC_CONST(0.00408197531935), + FRAC_CONST(0.0042264269227), FRAC_CONST(0.00437307196781), + FRAC_CONST(0.00452098527825), FRAC_CONST(0.00466064606118), + FRAC_CONST(0.00479325608498), FRAC_CONST(0.00491376035745), + FRAC_CONST(0.00503930226013), FRAC_CONST(0.00514073539032), + FRAC_CONST(0.00524611661324), FRAC_CONST(0.00534716811982), + FRAC_CONST(0.00541967759307), FRAC_CONST(0.00548760401507), + FRAC_CONST(0.00554757145088), FRAC_CONST(0.00559380230045), + FRAC_CONST(0.00562206432097), FRAC_CONST(0.00564551969164), + FRAC_CONST(0.00563891995151), FRAC_CONST(0.00562661141932), + FRAC_CONST(0.0055917128663), FRAC_CONST(0.005540436394), + FRAC_CONST(0.0054753783077), FRAC_CONST(0.0053838975897), + FRAC_CONST(0.00527157587272), FRAC_CONST(0.00513822754514), + FRAC_CONST(0.00498396877629), FRAC_CONST(0.004810946906), + FRAC_CONST(0.00460395301471), FRAC_CONST(0.00438018617447), + FRAC_CONST(0.0041251642327), FRAC_CONST(0.00384564081246), + FRAC_CONST(0.00354012465507), FRAC_CONST(0.00320918858098), + FRAC_CONST(0.00284467578623), FRAC_CONST(0.00245085400321), + FRAC_CONST(0.0020274176185), FRAC_CONST(0.00157846825768), + FRAC_CONST(0.00109023290512), FRAC_CONST(0.0005832264248), + FRAC_CONST(2.760451905E-005), FRAC_CONST(-0.00054642808664), + FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00180394725893), + FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.003193377839), + FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.004722259624), + FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.00637922932685), + FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00817982333726), + FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.01011502154986), + FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01218499959508), + FRAC_CONST(0.01327182200351), FRAC_CONST(0.01439046660792), + FRAC_CONST(0.01554055533423), FRAC_CONST(0.01673247129989), + FRAC_CONST(0.01794333813443), FRAC_CONST(0.01918724313698), + FRAC_CONST(0.02045317933555), FRAC_CONST(0.02174675502535), + FRAC_CONST(0.02306801692862), FRAC_CONST(0.02441609920285), + FRAC_CONST(0.02578758475467), FRAC_CONST(0.02718594296329), + FRAC_CONST(0.02860721736385), FRAC_CONST(0.03005026574279), + FRAC_CONST(0.03150176087389), FRAC_CONST(0.03297540810337), + FRAC_CONST(0.03446209487686), FRAC_CONST(0.03596975605542), + FRAC_CONST(0.03748128504252), FRAC_CONST(0.03900536794745), + FRAC_CONST(0.04053491705584), FRAC_CONST(0.04206490946367), + FRAC_CONST(0.04360975421304), FRAC_CONST(0.04514884056413), + FRAC_CONST(0.04668430272642), FRAC_CONST(0.04821657200672), + FRAC_CONST(0.04973857556014), FRAC_CONST(0.05125561555216), + FRAC_CONST(0.05276307465207), FRAC_CONST(0.05424527683589), + FRAC_CONST(0.05571736482138), FRAC_CONST(0.05716164501299), + FRAC_CONST(0.0585915683626), FRAC_CONST(0.05998374801761), + FRAC_CONST(0.06134551717207), FRAC_CONST(0.06268578081172), + FRAC_CONST(0.06397158980681), FRAC_CONST(0.0652247106438), + FRAC_CONST(0.06643675122104), FRAC_CONST(0.06760759851228), + FRAC_CONST(0.06870438283512), FRAC_CONST(0.06976302447127), + FRAC_CONST(0.07076287107266), FRAC_CONST(0.07170026731102), + FRAC_CONST(0.07256825833083), FRAC_CONST(0.07336202550803), + FRAC_CONST(0.07410036424342), FRAC_CONST(0.07474525581194), + FRAC_CONST(0.07531373362019), FRAC_CONST(0.07580083586584), + FRAC_CONST(0.07619924793396), FRAC_CONST(0.07649921704119), + FRAC_CONST(0.07670934904245), FRAC_CONST(0.07681739756964), + FRAC_CONST(0.07682300113923), FRAC_CONST(0.07672049241746), + FRAC_CONST(0.07650507183194), FRAC_CONST(0.07617483218536), + FRAC_CONST(0.07573057565061), FRAC_CONST(0.0751576255287), + FRAC_CONST(0.07446643947564), FRAC_CONST(0.0736406005762), + FRAC_CONST(0.07267746427299), FRAC_CONST(0.07158263647903), + FRAC_CONST(0.07035330735093), FRAC_CONST(0.06896640131951), + FRAC_CONST(0.06745250215166), FRAC_CONST(0.06576906686508), + FRAC_CONST(0.06394448059633), FRAC_CONST(0.06196027790387), + FRAC_CONST(0.0598166570809), FRAC_CONST(0.05751526919867), + FRAC_CONST(0.05504600343009), FRAC_CONST(0.05240938217366), + FRAC_CONST(0.04959786763445), FRAC_CONST(0.04663033051701), + FRAC_CONST(0.04347687821958), FRAC_CONST(0.04014582784127), + FRAC_CONST(0.03664181168133), FRAC_CONST(0.03295839306691), + FRAC_CONST(0.02908240060125), FRAC_CONST(0.02503075618909), + FRAC_CONST(0.02079970728622), FRAC_CONST(0.01637012582228), + FRAC_CONST(0.01176238327857), FRAC_CONST(0.00696368621617), + FRAC_CONST(0.00197656014503), FRAC_CONST(-0.00320868968304), + FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.01412888273558), + FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.02582272888064), + FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.03827765720822), + FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.05148041767934), + FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.06544098531359), + FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.08013729344279), + FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.09555333528914), + FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.1116826931773), + FRAC_CONST(-0.120007798468), FRAC_CONST(-0.12850028503878), + FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.1459766491187), + FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.16409588556669), + FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.18281725485142), + FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.20212501768103), + FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.22196526964149), + FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.24230168845974), + FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.26310532994603), + FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.28432141891085), + FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.30590985751916), + FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.32781137272105), + FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.3499914122931), + FRAC_CONST(0.36115899031355), FRAC_CONST(0.37237955463061), + FRAC_CONST(0.38363500139043), FRAC_CONST(0.39492117615675), + FRAC_CONST(0.40623176767625), FRAC_CONST(0.41756968968409), + FRAC_CONST(0.42891199207373), FRAC_CONST(0.44025537543665), + FRAC_CONST(0.45159965356824), FRAC_CONST(0.46293080852757), + FRAC_CONST(0.47424532146115), FRAC_CONST(0.48552530911099), + FRAC_CONST(0.49677082545707), FRAC_CONST(0.50798175000434), + FRAC_CONST(0.51912349702391), FRAC_CONST(0.53022408956855), + FRAC_CONST(0.54125534487322), FRAC_CONST(0.55220512585061), + FRAC_CONST(0.5630789140137), FRAC_CONST(0.57385241316923), + FRAC_CONST(0.58454032354679), FRAC_CONST(0.59511230862496), + FRAC_CONST(0.6055783538918), FRAC_CONST(0.61591099320291), + FRAC_CONST(0.62612426956055), FRAC_CONST(0.63619801077286), + FRAC_CONST(0.64612696959461), FRAC_CONST(0.65590163024671), + FRAC_CONST(0.66551398801627), FRAC_CONST(0.67496631901712), + FRAC_CONST(0.68423532934598), FRAC_CONST(0.69332823767032), + FRAC_CONST(0.70223887193539), FRAC_CONST(0.71094104263095), + FRAC_CONST(0.71944626349561), FRAC_CONST(0.72774489002994), + FRAC_CONST(0.73582117582769), FRAC_CONST(0.74368278636488), + FRAC_CONST(0.75131374561237), FRAC_CONST(0.75870807608242), + FRAC_CONST(0.76586748650939), FRAC_CONST(0.77277808813327), + FRAC_CONST(0.77942875190216), FRAC_CONST(0.7858353120392), + FRAC_CONST(0.79197358416424), FRAC_CONST(0.797846641377), + FRAC_CONST(0.80344857518505), FRAC_CONST(0.80876950044491), + FRAC_CONST(0.81381912706217), FRAC_CONST(0.81857760046468), + FRAC_CONST(0.82304198905409), FRAC_CONST(0.8272275347336), + FRAC_CONST(0.8311038457152), FRAC_CONST(0.83469373618402), + FRAC_CONST(0.83797173378865), FRAC_CONST(0.84095413924722), + FRAC_CONST(0.84362382812005), FRAC_CONST(0.84598184698206), + FRAC_CONST(0.84803157770763), FRAC_CONST(0.84978051984268), + FRAC_CONST(0.85119715249343), FRAC_CONST(0.85230470352147), + FRAC_CONST(0.85310209497017), FRAC_CONST(0.85357205739107), + FRAC_CONST(0.85373856005937 /*max*/), FRAC_CONST(0.85357205739107), + FRAC_CONST(0.85310209497017), FRAC_CONST(0.85230470352147), + FRAC_CONST(0.85119715249343), FRAC_CONST(0.84978051984268), + FRAC_CONST(0.84803157770763), FRAC_CONST(0.84598184698206), + FRAC_CONST(0.84362382812005), FRAC_CONST(0.84095413924722), + FRAC_CONST(0.83797173378865), FRAC_CONST(0.83469373618402), + FRAC_CONST(0.8311038457152), FRAC_CONST(0.8272275347336), + FRAC_CONST(0.82304198905409), FRAC_CONST(0.81857760046468), + FRAC_CONST(0.81381912706217), FRAC_CONST(0.80876950044491), + FRAC_CONST(0.80344857518505), FRAC_CONST(0.797846641377), + FRAC_CONST(0.79197358416424), FRAC_CONST(0.7858353120392), + FRAC_CONST(0.77942875190216), FRAC_CONST(0.77277808813327), + FRAC_CONST(0.76586748650939), FRAC_CONST(0.75870807608242), + FRAC_CONST(0.75131374561237), FRAC_CONST(0.74368278636488), + FRAC_CONST(0.73582117582769), FRAC_CONST(0.72774489002994), + FRAC_CONST(0.71944626349561), FRAC_CONST(0.71094104263095), + FRAC_CONST(0.70223887193539), FRAC_CONST(0.69332823767032), + FRAC_CONST(0.68423532934598), FRAC_CONST(0.67496631901712), + FRAC_CONST(0.66551398801627), FRAC_CONST(0.65590163024671), + FRAC_CONST(0.64612696959461), FRAC_CONST(0.63619801077286), + FRAC_CONST(0.62612426956055), FRAC_CONST(0.61591099320291), + FRAC_CONST(0.6055783538918), FRAC_CONST(0.59511230862496), + FRAC_CONST(0.58454032354679), FRAC_CONST(0.57385241316923), + FRAC_CONST(0.5630789140137), FRAC_CONST(0.55220512585061), + FRAC_CONST(0.54125534487322), FRAC_CONST(0.53022408956855), + FRAC_CONST(0.51912349702391), FRAC_CONST(0.50798175000434), + FRAC_CONST(0.49677082545707), FRAC_CONST(0.48552530911099), + FRAC_CONST(0.47424532146115), FRAC_CONST(0.46293080852757), + FRAC_CONST(0.45159965356824), FRAC_CONST(0.44025537543665), + FRAC_CONST(0.42891199207373), FRAC_CONST(0.41756968968409), + FRAC_CONST(0.40623176767625), FRAC_CONST(0.39492117615675), + FRAC_CONST(0.38363500139043), FRAC_CONST(0.37237955463061), + FRAC_CONST(-0.36115899031355), FRAC_CONST(-0.3499914122931), + FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.32781137272105), + FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.30590985751916), + FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.28432141891085), + FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.26310532994603), + FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.24230168845974), + FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.22196526964149), + FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.20212501768103), + FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.18281725485142), + FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.16409588556669), + FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.1459766491187), + FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.12850028503878), + FRAC_CONST(-0.120007798468), FRAC_CONST(-0.1116826931773), + FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.09555333528914), + FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.08013729344279), + FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.06544098531359), + FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.05148041767934), + FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.03827765720822), + FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.02582272888064), + FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.01412888273558), + FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.00320868968304), + FRAC_CONST(0.00197656014503), FRAC_CONST(0.00696368621617), + FRAC_CONST(0.01176238327857), FRAC_CONST(0.01637012582228), + FRAC_CONST(0.02079970728622), FRAC_CONST(0.02503075618909), + FRAC_CONST(0.02908240060125), FRAC_CONST(0.03295839306691), + FRAC_CONST(0.03664181168133), FRAC_CONST(0.04014582784127), + FRAC_CONST(0.04347687821958), FRAC_CONST(0.04663033051701), + FRAC_CONST(0.04959786763445), FRAC_CONST(0.05240938217366), + FRAC_CONST(0.05504600343009), FRAC_CONST(0.05751526919867), + FRAC_CONST(0.0598166570809), FRAC_CONST(0.06196027790387), + FRAC_CONST(0.06394448059633), FRAC_CONST(0.06576906686508), + FRAC_CONST(0.06745250215166), FRAC_CONST(0.06896640131951), + FRAC_CONST(0.07035330735093), FRAC_CONST(0.07158263647903), + FRAC_CONST(0.07267746427299), FRAC_CONST(0.0736406005762), + FRAC_CONST(0.07446643947564), FRAC_CONST(0.0751576255287), + FRAC_CONST(0.07573057565061), FRAC_CONST(0.07617483218536), + FRAC_CONST(0.07650507183194), FRAC_CONST(0.07672049241746), + FRAC_CONST(0.07682300113923), FRAC_CONST(0.07681739756964), + FRAC_CONST(0.07670934904245), FRAC_CONST(0.07649921704119), + FRAC_CONST(0.07619924793396), FRAC_CONST(0.07580083586584), + FRAC_CONST(0.07531373362019), FRAC_CONST(0.07474525581194), + FRAC_CONST(0.07410036424342), FRAC_CONST(0.07336202550803), + FRAC_CONST(0.07256825833083), FRAC_CONST(0.07170026731102), + FRAC_CONST(0.07076287107266), FRAC_CONST(0.06976302447127), + FRAC_CONST(0.06870438283512), FRAC_CONST(0.06760759851228), + FRAC_CONST(0.06643675122104), FRAC_CONST(0.0652247106438), + FRAC_CONST(0.06397158980681), FRAC_CONST(0.06268578081172), + FRAC_CONST(0.06134551717207), FRAC_CONST(0.05998374801761), + FRAC_CONST(0.0585915683626), FRAC_CONST(0.05716164501299), + FRAC_CONST(0.05571736482138), FRAC_CONST(0.05424527683589), + FRAC_CONST(0.05276307465207), FRAC_CONST(0.05125561555216), + FRAC_CONST(0.04973857556014), FRAC_CONST(0.04821657200672), + FRAC_CONST(0.04668430272642), FRAC_CONST(0.04514884056413), + FRAC_CONST(0.04360975421304), FRAC_CONST(0.04206490946367), + FRAC_CONST(0.04053491705584), FRAC_CONST(0.03900536794745), + FRAC_CONST(0.03748128504252), FRAC_CONST(0.03596975605542), + FRAC_CONST(0.03446209487686), FRAC_CONST(0.03297540810337), + FRAC_CONST(0.03150176087389), FRAC_CONST(0.03005026574279), + FRAC_CONST(0.02860721736385), FRAC_CONST(0.02718594296329), + FRAC_CONST(0.02578758475467), FRAC_CONST(0.02441609920285), + FRAC_CONST(0.02306801692862), FRAC_CONST(0.02174675502535), + FRAC_CONST(0.02045317933555), FRAC_CONST(0.01918724313698), + FRAC_CONST(0.01794333813443), FRAC_CONST(0.01673247129989), + FRAC_CONST(0.01554055533423), FRAC_CONST(0.01439046660792), + FRAC_CONST(-0.01327182200351), FRAC_CONST(-0.01218499959508), + FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01011502154986), + FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.00817982333726), + FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00637922932685), + FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.004722259624), + FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.003193377839), + FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.00180394725893), + FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00054642808664), + FRAC_CONST(2.760451905E-005), FRAC_CONST(0.0005832264248), + FRAC_CONST(0.00109023290512), FRAC_CONST(0.00157846825768), + FRAC_CONST(0.0020274176185), FRAC_CONST(0.00245085400321), + FRAC_CONST(0.00284467578623), FRAC_CONST(0.00320918858098), + FRAC_CONST(0.00354012465507), FRAC_CONST(0.00384564081246), + FRAC_CONST(0.0041251642327), FRAC_CONST(0.00438018617447), + FRAC_CONST(0.00460395301471), FRAC_CONST(0.004810946906), + FRAC_CONST(0.00498396877629), FRAC_CONST(0.00513822754514), + FRAC_CONST(0.00527157587272), FRAC_CONST(0.0053838975897), + FRAC_CONST(0.0054753783077), FRAC_CONST(0.005540436394), + FRAC_CONST(0.0055917128663), FRAC_CONST(0.00562661141932), + FRAC_CONST(0.00563891995151), FRAC_CONST(0.00564551969164), + FRAC_CONST(0.00562206432097), FRAC_CONST(0.00559380230045), + FRAC_CONST(0.00554757145088), FRAC_CONST(0.00548760401507), + FRAC_CONST(0.00541967759307), FRAC_CONST(0.00534716811982), + FRAC_CONST(0.00524611661324), FRAC_CONST(0.00514073539032), + FRAC_CONST(0.00503930226013), FRAC_CONST(0.00491376035745), + FRAC_CONST(0.00479325608498), FRAC_CONST(0.00466064606118), + FRAC_CONST(0.00452098527825), FRAC_CONST(0.00437307196781), + FRAC_CONST(0.0042264269227), FRAC_CONST(0.00408197531935), + FRAC_CONST(0.00392074323703), FRAC_CONST(0.00376039229104), + FRAC_CONST(0.00360082681231), FRAC_CONST(0.00344188741828), + FRAC_CONST(0.00327396134847), FRAC_CONST(0.00311254206525), + FRAC_CONST(0.00294694477165), FRAC_CONST(0.00278704643465), + FRAC_CONST(0.00262017586902), FRAC_CONST(0.00246256169126), + FRAC_CONST(0.00230172547746), FRAC_CONST(0.00214615835557), + FRAC_CONST(0.00198411407369), FRAC_CONST(0.00183482654224), + FRAC_CONST(0.00168680832531), FRAC_CONST(0.00154432198471), + FRAC_CONST(0.00139024948272), FRAC_CONST(0.00125778846475), + FRAC_CONST(0.00112501551307), FRAC_CONST(0.00098859883015), + FRAC_CONST(0.00086084433262), FRAC_CONST(0.00074580258865), + FRAC_CONST(0.00062393761391), FRAC_CONST(0.00051073884952), + FRAC_CONST(0.0004026540216), FRAC_CONST(0.00029495311041), + FRAC_CONST(0.00020430170688), FRAC_CONST(0.00010943831274), + FRAC_CONST(1.349497418E-005), FRAC_CONST(-6.173344072E-005), + FRAC_CONST(-0.00014463809349), FRAC_CONST(-0.0002098337344), + FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.00035011758756), + FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00046063254803), + FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00055645763906), + FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00063415949025), + FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00069179375372), + FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00073193571525), + FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00076307935757), + FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00078014496257), + FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00077798694927), + FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077248485949), + FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00074905980532), + FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00072550431222), + FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00069416146273), + FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00065403333621), + FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00061327473938), + FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00056778025613), + FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00052265642972), + FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00048937912498), + FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00049475180896), + FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00055252865047) +}; + +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sbr_syntax.c b/src/contrib/aacdecoder/libfaad/sbr_syntax.c old mode 100644 new mode 100755 index 012ed36a2..6c9b97c24 --- a/src/contrib/aacdecoder/libfaad/sbr_syntax.c +++ b/src/contrib/aacdecoder/libfaad/sbr_syntax.c @@ -1,724 +1,910 @@ -/* -** 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: sbr_syntax.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include "sbr_syntax.h" -#include "syntax.h" -#include "sbr_huff.h" -#include "sbr_fbt.h" -#include "sbr_tf_grid.h" -#include "sbr_e_nf.h" -#include "bits.h" -#ifdef PS_DEC -#include "ps_dec.h" -#endif -#ifdef DRM_PS -#include "drm_dec.h" -#endif -#include "analysis.h" - -/* static function declarations */ -static void sbr_header(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); -static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, - uint8_t bs_extension_id, uint16_t num_bits_left); -static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); -static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); -static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); - - -static void sbr_reset(sbr_info *sbr) -{ -#if 0 - printf("%d\n", sbr->bs_start_freq_prev); - printf("%d\n", sbr->bs_stop_freq_prev); - printf("%d\n", sbr->bs_freq_scale_prev); - printf("%d\n", sbr->bs_alter_scale_prev); - printf("%d\n", sbr->bs_xover_band_prev); - printf("%d\n\n", sbr->bs_noise_bands_prev); -#endif - - /* if these are different from the previous frame: Reset = 1 */ - if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) || - (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) || - (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) || - (sbr->bs_alter_scale != sbr->bs_alter_scale_prev)) - { - sbr->Reset = 1; - } else { - sbr->Reset = 0; - } - - if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) || - (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) || - (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) || - (sbr->bs_alter_scale != sbr->bs_alter_scale_prev) || - (sbr->bs_xover_band != sbr->bs_xover_band_prev) || - (sbr->bs_noise_bands != sbr->bs_noise_bands_prev)) - { - sbr->Reset = 1; - } else { - sbr->Reset = 0; - } - - sbr->bs_start_freq_prev = sbr->bs_start_freq; - sbr->bs_stop_freq_prev = sbr->bs_stop_freq; - sbr->bs_freq_scale_prev = sbr->bs_freq_scale; - sbr->bs_alter_scale_prev = sbr->bs_alter_scale; - sbr->bs_xover_band_prev = sbr->bs_xover_band; - sbr->bs_noise_bands_prev = sbr->bs_noise_bands; - - if (sbr->frame == 0) - { - sbr->Reset = 1; - } -} - -/* table 2 */ -uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt) -{ - uint8_t result = 0; - uint16_t num_align_bits = 0; - uint16_t num_sbr_bits = (uint16_t)faad_get_processed_bits(ld); - -#ifdef DRM - if (!sbr->Is_DRM_SBR) -#endif - { - uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,198,"sbr_bitstream(): bs_extension_type")); - - if (bs_extension_type == EXT_SBR_DATA_CRC) - { - sbr->bs_sbr_crc_bits = (uint16_t)faad_getbits(ld, 10 - DEBUGVAR(1,199,"sbr_bitstream(): bs_sbr_crc_bits")); - } - } - - sbr->bs_header_flag = faad_get1bit(ld - DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag")); - - if (sbr->bs_header_flag) - sbr_header(ld, sbr); - - /* Reset? */ - sbr_reset(sbr); - - /* first frame should have a header */ - //if (!(sbr->frame == 0 && sbr->bs_header_flag == 0)) - if (sbr->header_count != 0) - { - if (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked)) - { - uint8_t k2; - - /* calculate the Master Frequency Table */ - sbr->k0 = qmf_start_channel(sbr->bs_start_freq, sbr->bs_samplerate_mode, - sbr->sample_rate); - k2 = qmf_stop_channel(sbr->bs_stop_freq, sbr->sample_rate, sbr->k0); - - /* check k0 and k2 */ - if (sbr->sample_rate >= 48000) - { - if ((k2 - sbr->k0) > 32) - result += 1; - } else if (sbr->sample_rate <= 32000) { - if ((k2 - sbr->k0) > 48) - result += 1; - } else { /* (sbr->sample_rate == 44100) */ - if ((k2 - sbr->k0) > 45) - result += 1; - } - - if (sbr->bs_freq_scale == 0) - { - result += master_frequency_table_fs0(sbr, sbr->k0, k2, - sbr->bs_alter_scale); - } else { - result += master_frequency_table(sbr, sbr->k0, k2, sbr->bs_freq_scale, - sbr->bs_alter_scale); - } - result += derived_frequency_table(sbr, sbr->bs_xover_band, k2); - - result = (result > 0) ? 1 : 0; - } - - if (result == 0) - result = sbr_data(ld, sbr); - } else { - result = 1; - } - -#ifdef DRM - if (!sbr->Is_DRM_SBR) -#endif - { - num_sbr_bits = (uint16_t)faad_get_processed_bits(ld) - num_sbr_bits; - /* -4 does not apply, bs_extension_type is re-read in this function */ - num_align_bits = 8*cnt /*- 4*/ - num_sbr_bits; - - while (num_align_bits > 7) - { - faad_getbits(ld, 8 - DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); - num_align_bits -= 8; - } - faad_getbits(ld, num_align_bits - DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); - } - - return result; -} - -/* table 3 */ -static void sbr_header(bitfile *ld, sbr_info *sbr) -{ - uint8_t bs_header_extra_1, bs_header_extra_2; - - sbr->header_count++; - - sbr->bs_amp_res = faad_get1bit(ld - DEBUGVAR(1,203,"sbr_header(): bs_amp_res")); - - /* bs_start_freq and bs_stop_freq must define a fequency band that does - not exceed 48 channels */ - sbr->bs_start_freq = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,204,"sbr_header(): bs_start_freq")); - sbr->bs_stop_freq = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,205,"sbr_header(): bs_stop_freq")); - sbr->bs_xover_band = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,206,"sbr_header(): bs_xover_band")); - faad_getbits(ld, 2 - DEBUGVAR(1,207,"sbr_header(): bs_reserved_bits_hdr")); - bs_header_extra_1 = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,208,"sbr_header(): bs_header_extra_1")); - bs_header_extra_2 = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,209,"sbr_header(): bs_header_extra_2")); - - if (bs_header_extra_1) - { - sbr->bs_freq_scale = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,211,"sbr_header(): bs_freq_scale")); - sbr->bs_alter_scale = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,212,"sbr_header(): bs_alter_scale")); - sbr->bs_noise_bands = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,213,"sbr_header(): bs_noise_bands")); - } else { - /* Default values */ - sbr->bs_freq_scale = 2; - sbr->bs_alter_scale = 1; - sbr->bs_noise_bands = 2; - } - - if (bs_header_extra_2) - { - sbr->bs_limiter_bands = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,214,"sbr_header(): bs_limiter_bands")); - sbr->bs_limiter_gains = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,215,"sbr_header(): bs_limiter_gains")); - sbr->bs_interpol_freq = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,216,"sbr_header(): bs_interpol_freq")); - sbr->bs_smoothing_mode = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,217,"sbr_header(): bs_smoothing_mode")); - } else { - /* Default values */ - sbr->bs_limiter_bands = 2; - sbr->bs_limiter_gains = 2; - sbr->bs_interpol_freq = 1; - sbr->bs_smoothing_mode = 1; - } - -#if 0 - /* print the header to screen */ - printf("bs_amp_res: %d\n", sbr->bs_amp_res); - printf("bs_start_freq: %d\n", sbr->bs_start_freq); - printf("bs_stop_freq: %d\n", sbr->bs_stop_freq); - printf("bs_xover_band: %d\n", sbr->bs_xover_band); - if (bs_header_extra_1) - { - printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); - printf("bs_alter_scale: %d\n", sbr->bs_alter_scale); - printf("bs_noise_bands: %d\n", sbr->bs_noise_bands); - } - if (bs_header_extra_2) - { - printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); - printf("bs_limiter_gains: %d\n", sbr->bs_limiter_gains); - printf("bs_interpol_freq: %d\n", sbr->bs_interpol_freq); - printf("bs_smoothing_mode: %d\n", sbr->bs_smoothing_mode); - } - printf("\n"); -#endif -} - -/* table 4 */ -static uint8_t sbr_data(bitfile *ld, sbr_info *sbr) -{ - uint8_t result; -#if 0 - sbr->bs_samplerate_mode = faad_get1bit(ld - DEBUGVAR(1,219,"sbr_data(): bs_samplerate_mode")); -#endif - - sbr->rate = (sbr->bs_samplerate_mode) ? 2 : 1; - - switch (sbr->id_aac) - { - case ID_SCE: - if ((result = sbr_single_channel_element(ld, sbr)) > 0) - return result; - break; - case ID_CPE: - if ((result = sbr_channel_pair_element(ld, sbr)) > 0) - return result; - break; - } - - return 0; -} - -/* table 5 */ -static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr) -{ - uint8_t result; - - if (faad_get1bit(ld - DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra"))) - { - faad_getbits(ld, 4 - DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data")); - } - -#ifdef DRM - /* bs_coupling, from sbr_channel_pair_base_element(bs_amp_res) */ - if (sbr->Is_DRM_SBR) - faad_get1bit(ld); -#endif - - if ((result = sbr_grid(ld, sbr, 0)) > 0) - return result; - sbr_dtdf(ld, sbr, 0); - invf_mode(ld, sbr, 0); - sbr_envelope(ld, sbr, 0); - sbr_noise(ld, sbr, 0); - - envelope_noise_dequantisation(sbr, 0); - - memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); - - sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld - DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]")); - if (sbr->bs_add_harmonic_flag[0]) - sinusoidal_coding(ld, sbr, 0); - - sbr->bs_extended_data = faad_get1bit(ld - DEBUGVAR(1,224,"sbr_single_channel_element(): bs_extended_data[0]")); - if (sbr->bs_extended_data) - { - uint16_t nr_bits_left; - uint16_t cnt = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size")); - if (cnt == 15) - { - cnt += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,226,"sbr_single_channel_element(): bs_esc_count")); - } - - nr_bits_left = 8 * cnt; - while (nr_bits_left > 7) - { - sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id")); - nr_bits_left -= 2; - nr_bits_left -= sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); - } - - /* Corrigendum */ - if (nr_bits_left > 0) - { - faad_getbits(ld, nr_bits_left - DEBUGVAR(1,280,"sbr_single_channel_element(): nr_bits_left")); - } - } - - return 0; -} - -/* table 6 */ -static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr) -{ - uint8_t n, result; - - if (faad_get1bit(ld - DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra"))) - { - faad_getbits(ld, 4 - DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); - faad_getbits(ld, 4 - DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); - } - - sbr->bs_coupling = faad_get1bit(ld - DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_coupling")); - - if (sbr->bs_coupling) - { - if ((result = sbr_grid(ld, sbr, 0)) > 0) - return result; - - /* need to copy some data from left to right */ - sbr->bs_frame_class[1] = sbr->bs_frame_class[0]; - sbr->L_E[1] = sbr->L_E[0]; - sbr->L_Q[1] = sbr->L_Q[0]; - sbr->bs_pointer[1] = sbr->bs_pointer[0]; - - for (n = 0; n <= sbr->L_E[0]; n++) - { - sbr->t_E[1][n] = sbr->t_E[0][n]; - sbr->f[1][n] = sbr->f[0][n]; - } - for (n = 0; n <= sbr->L_Q[0]; n++) - sbr->t_Q[1][n] = sbr->t_Q[0][n]; - - sbr_dtdf(ld, sbr, 0); - sbr_dtdf(ld, sbr, 1); - invf_mode(ld, sbr, 0); - - /* more copying */ - for (n = 0; n < sbr->N_Q; n++) - sbr->bs_invf_mode[1][n] = sbr->bs_invf_mode[0][n]; - - sbr_envelope(ld, sbr, 0); - sbr_noise(ld, sbr, 0); - sbr_envelope(ld, sbr, 1); - sbr_noise(ld, sbr, 1); - - memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); - memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); - - sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld - DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); - if (sbr->bs_add_harmonic_flag[0]) - sinusoidal_coding(ld, sbr, 0); - - sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld - DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); - if (sbr->bs_add_harmonic_flag[1]) - sinusoidal_coding(ld, sbr, 1); - } else { - if ((result = sbr_grid(ld, sbr, 0)) > 0) - return result; - if ((result = sbr_grid(ld, sbr, 1)) > 0) - return result; - sbr_dtdf(ld, sbr, 0); - sbr_dtdf(ld, sbr, 1); - invf_mode(ld, sbr, 0); - invf_mode(ld, sbr, 1); - sbr_envelope(ld, sbr, 0); - sbr_envelope(ld, sbr, 1); - sbr_noise(ld, sbr, 0); - sbr_noise(ld, sbr, 1); - - memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); - memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); - - sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld - DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); - if (sbr->bs_add_harmonic_flag[0]) - sinusoidal_coding(ld, sbr, 0); - - sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld - DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); - if (sbr->bs_add_harmonic_flag[1]) - sinusoidal_coding(ld, sbr, 1); - } - envelope_noise_dequantisation(sbr, 0); - envelope_noise_dequantisation(sbr, 1); - - if (sbr->bs_coupling) - unmap_envelope_noise(sbr); - - sbr->bs_extended_data = faad_get1bit(ld - DEBUGVAR(1,233,"sbr_channel_pair_element(): bs_extended_data[0]")); - if (sbr->bs_extended_data) - { - uint16_t nr_bits_left; - uint16_t cnt = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,234,"sbr_channel_pair_element(): bs_extension_size")); - if (cnt == 15) - { - cnt += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,235,"sbr_channel_pair_element(): bs_esc_count")); - } - - nr_bits_left = 8 * cnt; - while (nr_bits_left > 7) - { - sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,236,"sbr_channel_pair_element(): bs_extension_id")); - nr_bits_left -= 2; - sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); - } - - /* Corrigendum */ - if (nr_bits_left > 0) - { - faad_getbits(ld, nr_bits_left - DEBUGVAR(1,280,"sbr_channel_pair_element(): nr_bits_left")); - } - } - - return 0; -} - -/* integer log[2](x): input range [0,10) */ -static int8_t sbr_log2(const int8_t val) -{ - int8_t log2tab[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4 }; - if (val < 10 && val >= 0) - return log2tab[val]; - else - return 0; -} - - -/* table 7 */ -static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t i, env, rel, result; - uint8_t bs_abs_bord, bs_abs_bord_1; - uint8_t bs_num_env = 0; - - sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,248,"sbr_grid(): bs_frame_class")); - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - i = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,249,"sbr_grid(): bs_num_env_raw")); - - bs_num_env = min(1 << i, 5); - - i = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,250,"sbr_grid(): bs_freq_res_flag")); - for (env = 0; env < bs_num_env; env++) - sbr->f[ch][env] = i; - - sbr->abs_bord_lead[ch] = 0; - sbr->abs_bord_trail[ch] = sbr->numTimeSlots; - sbr->n_rel_lead[ch] = bs_num_env - 1; - sbr->n_rel_trail[ch] = 0; - break; - - case FIXVAR: - bs_abs_bord = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots; - bs_num_env = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,252,"sbr_grid(): bs_num_env")) + 1; - - for (rel = 0; rel < bs_num_env-1; rel++) - { - sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,253,"sbr_grid(): bs_rel_bord")) + 2; - } - i = sbr_log2(bs_num_env + 1); - sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i - DEBUGVAR(1,254,"sbr_grid(): bs_pointer")); - - for (env = 0; env < bs_num_env; env++) - { - sbr->f[ch][bs_num_env - env - 1] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,255,"sbr_grid(): bs_freq_res")); - } - - sbr->abs_bord_lead[ch] = 0; - sbr->abs_bord_trail[ch] = bs_abs_bord; - sbr->n_rel_lead[ch] = 0; - sbr->n_rel_trail[ch] = bs_num_env - 1; - break; - - case VARFIX: - bs_abs_bord = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord")); - bs_num_env = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,257,"sbr_grid(): bs_num_env")) + 1; - - for (rel = 0; rel < bs_num_env-1; rel++) - { - sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,258,"sbr_grid(): bs_rel_bord")) + 2; - } - i = sbr_log2(bs_num_env + 1); - sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i - DEBUGVAR(1,259,"sbr_grid(): bs_pointer")); - - for (env = 0; env < bs_num_env; env++) - { - sbr->f[ch][env] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,260,"sbr_grid(): bs_freq_res")); - } - - sbr->abs_bord_lead[ch] = bs_abs_bord; - sbr->abs_bord_trail[ch] = sbr->numTimeSlots; - sbr->n_rel_lead[ch] = bs_num_env - 1; - sbr->n_rel_trail[ch] = 0; - break; - - case VARVAR: - bs_abs_bord = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0")); - bs_abs_bord_1 = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots; - sbr->bs_num_rel_0[ch] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,263,"sbr_grid(): bs_num_rel_0")); - sbr->bs_num_rel_1[ch] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,264,"sbr_grid(): bs_num_rel_1")); - - bs_num_env = min(5, sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1); - - for (rel = 0; rel < sbr->bs_num_rel_0[ch]; rel++) - { - sbr->bs_rel_bord_0[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,265,"sbr_grid(): bs_rel_bord")) + 2; - } - for(rel = 0; rel < sbr->bs_num_rel_1[ch]; rel++) - { - sbr->bs_rel_bord_1[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,266,"sbr_grid(): bs_rel_bord")) + 2; - } - i = sbr_log2(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2); - sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i - DEBUGVAR(1,267,"sbr_grid(): bs_pointer")); - - for (env = 0; env < bs_num_env; env++) - { - sbr->f[ch][env] = (uint8_t)faad_get1bit(ld - DEBUGVAR(1,268,"sbr_grid(): bs_freq_res")); - } - - sbr->abs_bord_lead[ch] = bs_abs_bord; - sbr->abs_bord_trail[ch] = bs_abs_bord_1; - sbr->n_rel_lead[ch] = sbr->bs_num_rel_0[ch]; - sbr->n_rel_trail[ch] = sbr->bs_num_rel_1[ch]; - break; - } - - if (sbr->bs_frame_class[ch] == VARVAR) - sbr->L_E[ch] = min(bs_num_env, 5); - else - sbr->L_E[ch] = min(bs_num_env, 4); - - if (sbr->L_E[ch] <= 0) - return 1; - - if (sbr->L_E[ch] > 1) - sbr->L_Q[ch] = 2; - else - sbr->L_Q[ch] = 1; - - /* TODO: this code can probably be integrated into the code above! */ - if ((result = envelope_time_border_vector(sbr, ch)) > 0) - return result; - noise_floor_time_border_vector(sbr, ch); - - return 0; -} - -/* table 8 */ -static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t i; - - for (i = 0; i < sbr->L_E[ch]; i++) - { - sbr->bs_df_env[ch][i] = faad_get1bit(ld - DEBUGVAR(1,269,"sbr_dtdf(): bs_df_env")); - } - - for (i = 0; i < sbr->L_Q[ch]; i++) - { - sbr->bs_df_noise[ch][i] = faad_get1bit(ld - DEBUGVAR(1,270,"sbr_dtdf(): bs_df_noise")); - } -} - -/* table 9 */ -static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t n; - - for (n = 0; n < sbr->N_Q; n++) - { - sbr->bs_invf_mode[ch][n] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,271,"invf_mode(): bs_invf_mode")); - } -} - -static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, - uint8_t bs_extension_id, uint16_t num_bits_left) -{ - switch (bs_extension_id) - { -#ifdef PS_DEC - case EXTENSION_ID_PS: - sbr->ps_used = 1; - return ps_data(&(sbr->ps), ld); -#endif -#ifdef DRM_PS - case DRM_PARAMETRIC_STEREO: - sbr->ps_used = 1; - return drm_ps_data(&(sbr->drm_ps), ld); -#endif - default: - sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data")); - return 6; - } -} - -/* table 12 */ -static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch) -{ - uint8_t n; - - for (n = 0; n < sbr->N_high; n++) - { - sbr->bs_add_harmonic[ch][n] = faad_get1bit(ld - DEBUGVAR(1,278,"sinusoidal_coding(): bs_add_harmonic")); - } -} - - -#endif /* SBR_DEC */ +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_syntax.c,v 1.39 2009/01/26 22:32:31 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include "sbr_syntax.h" +#include "syntax.h" +#include "sbr_huff.h" +#include "sbr_fbt.h" +#include "sbr_tf_grid.h" +#include "sbr_e_nf.h" +#include "bits.h" +#ifdef PS_DEC +#include "ps_dec.h" +#endif +#ifdef DRM_PS +#include "drm_dec.h" +#endif +#include "analysis.h" + +/* static function declarations */ +/* static function declarations */ +static void sbr_header(bitfile *ld, sbr_info *sbr); +static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, + uint8_t samplerate_mode, uint8_t freq_scale, + uint8_t alter_scale, uint8_t xover_band); +static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); +static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, + uint8_t bs_extension_id, uint16_t num_bits_left); +static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); +static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); +static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); +static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); +static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); +static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); + + +static void sbr_reset(sbr_info *sbr) +{ +#if 0 + printf("%d\n", sbr->bs_start_freq_prev); + printf("%d\n", sbr->bs_stop_freq_prev); + printf("%d\n", sbr->bs_freq_scale_prev); + printf("%d\n", sbr->bs_alter_scale_prev); + printf("%d\n", sbr->bs_xover_band_prev); + printf("%d\n\n", sbr->bs_noise_bands_prev); +#endif + + /* if these are different from the previous frame: Reset = 1 */ + if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) || + (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) || + (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) || + (sbr->bs_alter_scale != sbr->bs_alter_scale_prev) || + (sbr->bs_xover_band != sbr->bs_xover_band_prev) || + (sbr->bs_noise_bands != sbr->bs_noise_bands_prev)) + { + sbr->Reset = 1; + } else { + sbr->Reset = 0; + } + + sbr->bs_start_freq_prev = sbr->bs_start_freq; + sbr->bs_stop_freq_prev = sbr->bs_stop_freq; + sbr->bs_freq_scale_prev = sbr->bs_freq_scale; + sbr->bs_alter_scale_prev = sbr->bs_alter_scale; + sbr->bs_xover_band_prev = sbr->bs_xover_band; + sbr->bs_noise_bands_prev = sbr->bs_noise_bands; +} + +static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, + uint8_t samplerate_mode, uint8_t freq_scale, + uint8_t alter_scale, uint8_t xover_band) +{ + uint8_t result = 0; + uint8_t k2; + + /* calculate the Master Frequency Table */ + sbr->k0 = qmf_start_channel(start_freq, samplerate_mode, sbr->sample_rate); + k2 = qmf_stop_channel(stop_freq, sbr->sample_rate, sbr->k0); + + /* check k0 and k2 */ + if (sbr->sample_rate >= 48000) + { + if ((k2 - sbr->k0) > 32) + result += 1; + } else if (sbr->sample_rate <= 32000) { + if ((k2 - sbr->k0) > 48) + result += 1; + } else { /* (sbr->sample_rate == 44100) */ + if ((k2 - sbr->k0) > 45) + result += 1; + } + + if (freq_scale == 0) + { + result += master_frequency_table_fs0(sbr, sbr->k0, k2, alter_scale); + } else { + result += master_frequency_table(sbr, sbr->k0, k2, freq_scale, alter_scale); + } + result += derived_frequency_table(sbr, xover_band, k2); + + result = (result > 0) ? 1 : 0; + + return result; +} + +/* table 2 */ +uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt, + uint8_t psResetFlag) +{ + uint8_t result = 0; + uint16_t num_align_bits = 0; + uint16_t num_sbr_bits1 = (uint16_t)faad_get_processed_bits(ld); + uint16_t num_sbr_bits2; + + uint8_t saved_start_freq, saved_samplerate_mode; + uint8_t saved_stop_freq, saved_freq_scale; + uint8_t saved_alter_scale, saved_xover_band; + +#if (defined(PS_DEC) || defined(DRM_PS)) + if (psResetFlag) + sbr->psResetFlag = psResetFlag; +#endif + +#ifdef DRM + if (!sbr->Is_DRM_SBR) +#endif + { + uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,198,"sbr_bitstream(): bs_extension_type")); + + if (bs_extension_type == EXT_SBR_DATA_CRC) + { + sbr->bs_sbr_crc_bits = (uint16_t)faad_getbits(ld, 10 + DEBUGVAR(1,199,"sbr_bitstream(): bs_sbr_crc_bits")); + } + } + + /* save old header values, in case the new ones are corrupted */ + saved_start_freq = sbr->bs_start_freq; + saved_samplerate_mode = sbr->bs_samplerate_mode; + saved_stop_freq = sbr->bs_stop_freq; + saved_freq_scale = sbr->bs_freq_scale; + saved_alter_scale = sbr->bs_alter_scale; + saved_xover_band = sbr->bs_xover_band; + + sbr->bs_header_flag = faad_get1bit(ld + DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag")); + + if (sbr->bs_header_flag) + sbr_header(ld, sbr); + + /* Reset? */ + sbr_reset(sbr); + + /* first frame should have a header */ + //if (!(sbr->frame == 0 && sbr->bs_header_flag == 0)) + if (sbr->header_count != 0) + { + if (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked)) + { + uint8_t rt = calc_sbr_tables(sbr, sbr->bs_start_freq, sbr->bs_stop_freq, + sbr->bs_samplerate_mode, sbr->bs_freq_scale, + sbr->bs_alter_scale, sbr->bs_xover_band); + + /* if an error occured with the new header values revert to the old ones */ + if (rt > 0) + { + calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, + saved_samplerate_mode, saved_freq_scale, + saved_alter_scale, saved_xover_band); + } + } + + if (result == 0) + { + result = sbr_data(ld, sbr); + + /* sbr_data() returning an error means that there was an error in + envelope_time_border_vector(). + In this case the old time border vector is saved and all the previous + data normally read after sbr_grid() is saved. + */ + /* to be on the safe side, calculate old sbr tables in case of error */ + if ((result > 0) && + (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked))) + { + calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, + saved_samplerate_mode, saved_freq_scale, + saved_alter_scale, saved_xover_band); + } + + /* we should be able to safely set result to 0 now, */ + /* but practise indicates this doesn't work well */ + } + } else { + result = 1; + } + + num_sbr_bits2 = (uint16_t)faad_get_processed_bits(ld) - num_sbr_bits1; + + /* check if we read more bits then were available for sbr */ + if (8*cnt < num_sbr_bits2) + { + faad_resetbits(ld, num_sbr_bits1 + 8*cnt); + num_sbr_bits2 = 8*cnt; + +#ifdef PS_DEC + /* turn off PS for the unfortunate case that we randomly read some + * PS data that looks correct */ + sbr->ps_used = 0; +#endif + + /* Make sure it doesn't decode SBR in this frame, or we'll get glitches */ + return 1; + } + +#ifdef DRM + if (!sbr->Is_DRM_SBR) +#endif + { + /* -4 does not apply, bs_extension_type is re-read in this function */ + num_align_bits = 8*cnt /*- 4*/ - num_sbr_bits2; + + while (num_align_bits > 7) + { + faad_getbits(ld, 8 + DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); + num_align_bits -= 8; + } + faad_getbits(ld, num_align_bits + DEBUGVAR(1,999,"sbr_bitstream(): num_align_bits")); + } + + return result; +} + +/* table 3 */ +static void sbr_header(bitfile *ld, sbr_info *sbr) +{ + uint8_t bs_header_extra_1, bs_header_extra_2; + + sbr->header_count++; + + sbr->bs_amp_res = faad_get1bit(ld + DEBUGVAR(1,203,"sbr_header(): bs_amp_res")); + + /* bs_start_freq and bs_stop_freq must define a fequency band that does + not exceed 48 channels */ + sbr->bs_start_freq = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,204,"sbr_header(): bs_start_freq")); + sbr->bs_stop_freq = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,205,"sbr_header(): bs_stop_freq")); + sbr->bs_xover_band = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,206,"sbr_header(): bs_xover_band")); + faad_getbits(ld, 2 + DEBUGVAR(1,207,"sbr_header(): bs_reserved_bits_hdr")); + bs_header_extra_1 = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,208,"sbr_header(): bs_header_extra_1")); + bs_header_extra_2 = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,209,"sbr_header(): bs_header_extra_2")); + + if (bs_header_extra_1) + { + sbr->bs_freq_scale = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,211,"sbr_header(): bs_freq_scale")); + sbr->bs_alter_scale = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,212,"sbr_header(): bs_alter_scale")); + sbr->bs_noise_bands = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,213,"sbr_header(): bs_noise_bands")); + } else { + /* Default values */ + sbr->bs_freq_scale = 2; + sbr->bs_alter_scale = 1; + sbr->bs_noise_bands = 2; + } + + if (bs_header_extra_2) + { + sbr->bs_limiter_bands = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,214,"sbr_header(): bs_limiter_bands")); + sbr->bs_limiter_gains = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,215,"sbr_header(): bs_limiter_gains")); + sbr->bs_interpol_freq = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,216,"sbr_header(): bs_interpol_freq")); + sbr->bs_smoothing_mode = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,217,"sbr_header(): bs_smoothing_mode")); + } else { + /* Default values */ + sbr->bs_limiter_bands = 2; + sbr->bs_limiter_gains = 2; + sbr->bs_interpol_freq = 1; + sbr->bs_smoothing_mode = 1; + } + +#if 0 + /* print the header to screen */ + printf("bs_amp_res: %d\n", sbr->bs_amp_res); + printf("bs_start_freq: %d\n", sbr->bs_start_freq); + printf("bs_stop_freq: %d\n", sbr->bs_stop_freq); + printf("bs_xover_band: %d\n", sbr->bs_xover_band); + if (bs_header_extra_1) + { + printf("bs_freq_scale: %d\n", sbr->bs_freq_scale); + printf("bs_alter_scale: %d\n", sbr->bs_alter_scale); + printf("bs_noise_bands: %d\n", sbr->bs_noise_bands); + } + if (bs_header_extra_2) + { + printf("bs_limiter_bands: %d\n", sbr->bs_limiter_bands); + printf("bs_limiter_gains: %d\n", sbr->bs_limiter_gains); + printf("bs_interpol_freq: %d\n", sbr->bs_interpol_freq); + printf("bs_smoothing_mode: %d\n", sbr->bs_smoothing_mode); + } + printf("\n"); +#endif +} + +/* table 4 */ +static uint8_t sbr_data(bitfile *ld, sbr_info *sbr) +{ + uint8_t result; +#if 0 + sbr->bs_samplerate_mode = faad_get1bit(ld + DEBUGVAR(1,219,"sbr_data(): bs_samplerate_mode")); +#endif + + sbr->rate = (sbr->bs_samplerate_mode) ? 2 : 1; + + switch (sbr->id_aac) + { + case ID_SCE: + if ((result = sbr_single_channel_element(ld, sbr)) > 0) + return result; + break; + case ID_CPE: + if ((result = sbr_channel_pair_element(ld, sbr)) > 0) + return result; + break; + } + + return 0; +} + +/* table 5 */ +static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr) +{ + uint8_t result; + + if (faad_get1bit(ld + DEBUGVAR(1,220,"sbr_single_channel_element(): bs_data_extra"))) + { + faad_getbits(ld, 4 + DEBUGVAR(1,221,"sbr_single_channel_element(): bs_reserved_bits_data")); + } + +#ifdef DRM + /* bs_coupling, from sbr_channel_pair_base_element(bs_amp_res) */ + if (sbr->Is_DRM_SBR) + { + faad_get1bit(ld); + } +#endif + + if ((result = sbr_grid(ld, sbr, 0)) > 0) + return result; + + sbr_dtdf(ld, sbr, 0); + invf_mode(ld, sbr, 0); + sbr_envelope(ld, sbr, 0); + sbr_noise(ld, sbr, 0); + +#ifndef FIXED_POINT + envelope_noise_dequantisation(sbr, 0); +#endif + + memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); + + sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld + DEBUGVAR(1,223,"sbr_single_channel_element(): bs_add_harmonic_flag[0]")); + if (sbr->bs_add_harmonic_flag[0]) + sinusoidal_coding(ld, sbr, 0); + + sbr->bs_extended_data = faad_get1bit(ld + DEBUGVAR(1,224,"sbr_single_channel_element(): bs_extended_data[0]")); + + if (sbr->bs_extended_data) + { + uint16_t nr_bits_left; +#if (defined(PS_DEC) || defined(DRM_PS)) + uint8_t ps_ext_read = 0; +#endif + uint16_t cnt = (uint16_t)faad_getbits(ld, 4 + DEBUGVAR(1,225,"sbr_single_channel_element(): bs_extension_size")); + if (cnt == 15) + { + cnt += (uint16_t)faad_getbits(ld, 8 + DEBUGVAR(1,226,"sbr_single_channel_element(): bs_esc_count")); + } + + nr_bits_left = 8 * cnt; + while (nr_bits_left > 7) + { + uint16_t tmp_nr_bits = 0; + + sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,227,"sbr_single_channel_element(): bs_extension_id")); + tmp_nr_bits += 2; + + /* allow only 1 PS extension element per extension data */ +#if (defined(PS_DEC) || defined(DRM_PS)) +#if (defined(PS_DEC) && defined(DRM_PS)) + if (sbr->bs_extension_id == EXTENSION_ID_PS || sbr->bs_extension_id == DRM_PARAMETRIC_STEREO) +#else +#ifdef PS_DEC + if (sbr->bs_extension_id == EXTENSION_ID_PS) +#else +#ifdef DRM_PS + if (sbr->bs_extension_id == DRM_PARAMETRIC_STEREO) +#endif +#endif +#endif + { + if (ps_ext_read == 0) + { + ps_ext_read = 1; + } else { + /* to be safe make it 3, will switch to "default" + * in sbr_extension() */ +#ifdef DRM + return 1; +#else + sbr->bs_extension_id = 3; +#endif + } + } +#endif + + tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); + + /* check if the data read is bigger than the number of available bits */ + if (tmp_nr_bits > nr_bits_left) + return 1; + + nr_bits_left -= tmp_nr_bits; + } + + /* Corrigendum */ + if (nr_bits_left > 0) + { + faad_getbits(ld, nr_bits_left + DEBUGVAR(1,280,"sbr_single_channel_element(): nr_bits_left")); + } + } + + return 0; +} + +/* table 6 */ +static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr) +{ + uint8_t n, result; + + if (faad_get1bit(ld + DEBUGVAR(1,228,"sbr_single_channel_element(): bs_data_extra"))) + { + faad_getbits(ld, 4 + DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); + faad_getbits(ld, 4 + DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_reserved_bits_data")); + } + + sbr->bs_coupling = faad_get1bit(ld + DEBUGVAR(1,228,"sbr_channel_pair_element(): bs_coupling")); + + if (sbr->bs_coupling) + { + if ((result = sbr_grid(ld, sbr, 0)) > 0) + return result; + + /* need to copy some data from left to right */ + sbr->bs_frame_class[1] = sbr->bs_frame_class[0]; + sbr->L_E[1] = sbr->L_E[0]; + sbr->L_Q[1] = sbr->L_Q[0]; + sbr->bs_pointer[1] = sbr->bs_pointer[0]; + + for (n = 0; n <= sbr->L_E[0]; n++) + { + sbr->t_E[1][n] = sbr->t_E[0][n]; + sbr->f[1][n] = sbr->f[0][n]; + } + for (n = 0; n <= sbr->L_Q[0]; n++) + sbr->t_Q[1][n] = sbr->t_Q[0][n]; + + sbr_dtdf(ld, sbr, 0); + sbr_dtdf(ld, sbr, 1); + invf_mode(ld, sbr, 0); + + /* more copying */ + for (n = 0; n < sbr->N_Q; n++) + sbr->bs_invf_mode[1][n] = sbr->bs_invf_mode[0][n]; + + sbr_envelope(ld, sbr, 0); + sbr_noise(ld, sbr, 0); + sbr_envelope(ld, sbr, 1); + sbr_noise(ld, sbr, 1); + + memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); + memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); + + sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld + DEBUGVAR(1,231,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); + if (sbr->bs_add_harmonic_flag[0]) + sinusoidal_coding(ld, sbr, 0); + + sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld + DEBUGVAR(1,232,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); + if (sbr->bs_add_harmonic_flag[1]) + sinusoidal_coding(ld, sbr, 1); + } else { + uint8_t saved_t_E[6] = {0}, saved_t_Q[3] = {0}; + uint8_t saved_L_E = sbr->L_E[0]; + uint8_t saved_L_Q = sbr->L_Q[0]; + uint8_t saved_frame_class = sbr->bs_frame_class[0]; + + for (n = 0; n < saved_L_E; n++) + saved_t_E[n] = sbr->t_E[0][n]; + for (n = 0; n < saved_L_Q; n++) + saved_t_Q[n] = sbr->t_Q[0][n]; + + if ((result = sbr_grid(ld, sbr, 0)) > 0) + return result; + if ((result = sbr_grid(ld, sbr, 1)) > 0) + { + /* restore first channel data as well */ + sbr->bs_frame_class[0] = saved_frame_class; + sbr->L_E[0] = saved_L_E; + sbr->L_Q[0] = saved_L_Q; + for (n = 0; n < 6; n++) + sbr->t_E[0][n] = saved_t_E[n]; + for (n = 0; n < 3; n++) + sbr->t_Q[0][n] = saved_t_Q[n]; + + return result; + } + sbr_dtdf(ld, sbr, 0); + sbr_dtdf(ld, sbr, 1); + invf_mode(ld, sbr, 0); + invf_mode(ld, sbr, 1); + sbr_envelope(ld, sbr, 0); + sbr_envelope(ld, sbr, 1); + sbr_noise(ld, sbr, 0); + sbr_noise(ld, sbr, 1); + + memset(sbr->bs_add_harmonic[0], 0, 64*sizeof(uint8_t)); + memset(sbr->bs_add_harmonic[1], 0, 64*sizeof(uint8_t)); + + sbr->bs_add_harmonic_flag[0] = faad_get1bit(ld + DEBUGVAR(1,239,"sbr_channel_pair_element(): bs_add_harmonic_flag[0]")); + if (sbr->bs_add_harmonic_flag[0]) + sinusoidal_coding(ld, sbr, 0); + + sbr->bs_add_harmonic_flag[1] = faad_get1bit(ld + DEBUGVAR(1,240,"sbr_channel_pair_element(): bs_add_harmonic_flag[1]")); + if (sbr->bs_add_harmonic_flag[1]) + sinusoidal_coding(ld, sbr, 1); + } +#ifndef FIXED_POINT + envelope_noise_dequantisation(sbr, 0); + envelope_noise_dequantisation(sbr, 1); + + if (sbr->bs_coupling) + unmap_envelope_noise(sbr); +#endif + + sbr->bs_extended_data = faad_get1bit(ld + DEBUGVAR(1,233,"sbr_channel_pair_element(): bs_extended_data[0]")); + if (sbr->bs_extended_data) + { + uint16_t nr_bits_left; + uint16_t cnt = (uint16_t)faad_getbits(ld, 4 + DEBUGVAR(1,234,"sbr_channel_pair_element(): bs_extension_size")); + if (cnt == 15) + { + cnt += (uint16_t)faad_getbits(ld, 8 + DEBUGVAR(1,235,"sbr_channel_pair_element(): bs_esc_count")); + } + + nr_bits_left = 8 * cnt; + while (nr_bits_left > 7) + { + uint16_t tmp_nr_bits = 0; + + sbr->bs_extension_id = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,236,"sbr_channel_pair_element(): bs_extension_id")); + tmp_nr_bits += 2; + tmp_nr_bits += sbr_extension(ld, sbr, sbr->bs_extension_id, nr_bits_left); + + /* check if the data read is bigger than the number of available bits */ + if (tmp_nr_bits > nr_bits_left) + return 1; + + nr_bits_left -= tmp_nr_bits; + } + + /* Corrigendum */ + if (nr_bits_left > 0) + { + faad_getbits(ld, nr_bits_left + DEBUGVAR(1,280,"sbr_channel_pair_element(): nr_bits_left")); + } + } + + return 0; +} + +/* integer log[2](x): input range [0,10) */ +static int8_t sbr_log2(const int8_t val) +{ + int8_t log2tab[] = { 0, 0, 1, 2, 2, 3, 3, 3, 3, 4 }; + if (val < 10 && val >= 0) + return log2tab[val]; + else + return 0; +} + + +/* table 7 */ +static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch) +{ + uint8_t i, env, rel, result; + uint8_t bs_abs_bord, bs_abs_bord_1; + uint8_t bs_num_env = 0; + uint8_t saved_L_E = sbr->L_E[ch]; + uint8_t saved_L_Q = sbr->L_Q[ch]; + uint8_t saved_frame_class = sbr->bs_frame_class[ch]; + + sbr->bs_frame_class[ch] = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,248,"sbr_grid(): bs_frame_class")); + + switch (sbr->bs_frame_class[ch]) + { + case FIXFIX: + i = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,249,"sbr_grid(): bs_num_env_raw")); + + bs_num_env = min(1 << i, 5); + + i = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,250,"sbr_grid(): bs_freq_res_flag")); + for (env = 0; env < bs_num_env; env++) + sbr->f[ch][env] = i; + + sbr->abs_bord_lead[ch] = 0; + sbr->abs_bord_trail[ch] = sbr->numTimeSlots; + sbr->n_rel_lead[ch] = bs_num_env - 1; + sbr->n_rel_trail[ch] = 0; + break; + + case FIXVAR: + bs_abs_bord = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,251,"sbr_grid(): bs_abs_bord")) + sbr->numTimeSlots; + bs_num_env = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,252,"sbr_grid(): bs_num_env")) + 1; + + for (rel = 0; rel < bs_num_env-1; rel++) + { + sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,253,"sbr_grid(): bs_rel_bord")) + 2; + } + i = sbr_log2(bs_num_env + 1); + sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i + DEBUGVAR(1,254,"sbr_grid(): bs_pointer")); + + for (env = 0; env < bs_num_env; env++) + { + sbr->f[ch][bs_num_env - env - 1] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,255,"sbr_grid(): bs_freq_res")); + } + + sbr->abs_bord_lead[ch] = 0; + sbr->abs_bord_trail[ch] = bs_abs_bord; + sbr->n_rel_lead[ch] = 0; + sbr->n_rel_trail[ch] = bs_num_env - 1; + break; + + case VARFIX: + bs_abs_bord = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,256,"sbr_grid(): bs_abs_bord")); + bs_num_env = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,257,"sbr_grid(): bs_num_env")) + 1; + + for (rel = 0; rel < bs_num_env-1; rel++) + { + sbr->bs_rel_bord[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,258,"sbr_grid(): bs_rel_bord")) + 2; + } + i = sbr_log2(bs_num_env + 1); + sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i + DEBUGVAR(1,259,"sbr_grid(): bs_pointer")); + + for (env = 0; env < bs_num_env; env++) + { + sbr->f[ch][env] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,260,"sbr_grid(): bs_freq_res")); + } + + sbr->abs_bord_lead[ch] = bs_abs_bord; + sbr->abs_bord_trail[ch] = sbr->numTimeSlots; + sbr->n_rel_lead[ch] = bs_num_env - 1; + sbr->n_rel_trail[ch] = 0; + break; + + case VARVAR: + bs_abs_bord = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,261,"sbr_grid(): bs_abs_bord_0")); + bs_abs_bord_1 = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,262,"sbr_grid(): bs_abs_bord_1")) + sbr->numTimeSlots; + sbr->bs_num_rel_0[ch] = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,263,"sbr_grid(): bs_num_rel_0")); + sbr->bs_num_rel_1[ch] = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,264,"sbr_grid(): bs_num_rel_1")); + + bs_num_env = min(5, sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1); + + for (rel = 0; rel < sbr->bs_num_rel_0[ch]; rel++) + { + sbr->bs_rel_bord_0[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,265,"sbr_grid(): bs_rel_bord")) + 2; + } + for(rel = 0; rel < sbr->bs_num_rel_1[ch]; rel++) + { + sbr->bs_rel_bord_1[ch][rel] = 2 * (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,266,"sbr_grid(): bs_rel_bord")) + 2; + } + i = sbr_log2(sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 2); + sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i + DEBUGVAR(1,267,"sbr_grid(): bs_pointer")); + + for (env = 0; env < bs_num_env; env++) + { + sbr->f[ch][env] = (uint8_t)faad_get1bit(ld + DEBUGVAR(1,268,"sbr_grid(): bs_freq_res")); + } + + sbr->abs_bord_lead[ch] = bs_abs_bord; + sbr->abs_bord_trail[ch] = bs_abs_bord_1; + sbr->n_rel_lead[ch] = sbr->bs_num_rel_0[ch]; + sbr->n_rel_trail[ch] = sbr->bs_num_rel_1[ch]; + break; + } + + if (sbr->bs_frame_class[ch] == VARVAR) + sbr->L_E[ch] = min(bs_num_env, 5); + else + sbr->L_E[ch] = min(bs_num_env, 4); + + if (sbr->L_E[ch] <= 0) + return 1; + + if (sbr->L_E[ch] > 1) + sbr->L_Q[ch] = 2; + else + sbr->L_Q[ch] = 1; + + /* TODO: this code can probably be integrated into the code above! */ + if ((result = envelope_time_border_vector(sbr, ch)) > 0) + { + sbr->bs_frame_class[ch] = saved_frame_class; + sbr->L_E[ch] = saved_L_E; + sbr->L_Q[ch] = saved_L_Q; + return result; + } + noise_floor_time_border_vector(sbr, ch); + +#if 0 + for (env = 0; env < bs_num_env; env++) + { + printf("freq_res[ch:%d][env:%d]: %d\n", ch, env, sbr->f[ch][env]); + } +#endif + + return 0; +} + +/* table 8 */ +static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch) +{ + uint8_t i; + + for (i = 0; i < sbr->L_E[ch]; i++) + { + sbr->bs_df_env[ch][i] = faad_get1bit(ld + DEBUGVAR(1,269,"sbr_dtdf(): bs_df_env")); + } + + for (i = 0; i < sbr->L_Q[ch]; i++) + { + sbr->bs_df_noise[ch][i] = faad_get1bit(ld + DEBUGVAR(1,270,"sbr_dtdf(): bs_df_noise")); + } +} + +/* table 9 */ +static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch) +{ + uint8_t n; + + for (n = 0; n < sbr->N_Q; n++) + { + sbr->bs_invf_mode[ch][n] = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,271,"invf_mode(): bs_invf_mode")); + } +} + +static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, + uint8_t bs_extension_id, uint16_t num_bits_left) +{ +#ifdef PS_DEC + uint8_t header; + uint16_t ret; +#endif + + switch (bs_extension_id) + { +#ifdef PS_DEC + case EXTENSION_ID_PS: + if (!sbr->ps) + { + sbr->ps = ps_init(get_sr_index(sbr->sample_rate), sbr->numTimeSlotsRate); + } + if (sbr->psResetFlag) + { + sbr->ps->header_read = 0; + } + ret = ps_data(sbr->ps, ld, &header); + + /* enable PS if and only if: a header has been decoded */ + if (sbr->ps_used == 0 && header == 1) + { + sbr->ps_used = 1; + } + + if (header == 1) + { + sbr->psResetFlag = 0; + } + + return ret; +#endif +#ifdef DRM_PS + case DRM_PARAMETRIC_STEREO: + sbr->ps_used = 1; + if (!sbr->drm_ps) + { + sbr->drm_ps = drm_ps_init(); + } + return drm_ps_data(sbr->drm_ps, ld); +#endif + default: + sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6 + DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data")); + return 6; + } +} + +/* table 12 */ +static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch) +{ + uint8_t n; + + for (n = 0; n < sbr->N_high; n++) + { + sbr->bs_add_harmonic[ch][n] = faad_get1bit(ld + DEBUGVAR(1,278,"sinusoidal_coding(): bs_add_harmonic")); + } +} + + +#endif /* SBR_DEC */ diff --git a/src/contrib/aacdecoder/libfaad/sbr_syntax.h b/src/contrib/aacdecoder/libfaad/sbr_syntax.h old mode 100644 new mode 100755 index 967be91a4..a13b2708f --- a/src/contrib/aacdecoder/libfaad/sbr_syntax.h +++ b/src/contrib/aacdecoder/libfaad/sbr_syntax.h @@ -1,64 +1,68 @@ -/* -** 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: sbr_syntax.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_SYNTAX_H__ -#define __SBR_SYNTAX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "bits.h" - -#define T_HFGEN 8 -#define T_HFADJ 2 - -#define EXT_SBR_DATA 13 -#define EXT_SBR_DATA_CRC 14 - -#define FIXFIX 0 -#define FIXVAR 1 -#define VARFIX 2 -#define VARVAR 3 - -#define LO_RES 0 -#define HI_RES 1 - -#define NO_TIME_SLOTS_960 15 -#define NO_TIME_SLOTS 16 -#define RATE 2 - -#define NOISE_FLOOR_OFFSET 6 - - -uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt); - -#ifdef __cplusplus -} -#endif -#endif /* __SBR_SYNTAX_H__ */ - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_syntax.h,v 1.23 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SBR_SYNTAX_H__ +#define __SBR_SYNTAX_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "bits.h" + +#define T_HFGEN 8 +#define T_HFADJ 2 + +#define EXT_SBR_DATA 13 +#define EXT_SBR_DATA_CRC 14 + +#define FIXFIX 0 +#define FIXVAR 1 +#define VARFIX 2 +#define VARVAR 3 + +#define LO_RES 0 +#define HI_RES 1 + +#define NO_TIME_SLOTS_960 15 +#define NO_TIME_SLOTS 16 +#define RATE 2 + +#define NOISE_FLOOR_OFFSET 6 + + +uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt, + uint8_t resetFlag); + +#ifdef __cplusplus +} +#endif +#endif /* __SBR_SYNTAX_H__ */ + diff --git a/src/contrib/aacdecoder/libfaad/sbr_tf_grid.c b/src/contrib/aacdecoder/libfaad/sbr_tf_grid.c old mode 100644 new mode 100755 index d4c9c37b8..a073d96ce --- a/src/contrib/aacdecoder/libfaad/sbr_tf_grid.c +++ b/src/contrib/aacdecoder/libfaad/sbr_tf_grid.c @@ -1,254 +1,261 @@ -/* -** 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: sbr_tf_grid.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* Time/Frequency grid */ - -#include "common.h" -#include "structs.h" - -#ifdef SBR_DEC - -#include - -#include "sbr_syntax.h" -#include "sbr_tf_grid.h" - - -/* static function declarations */ -#if 0 -static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); -static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); -#endif -static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); - - -uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch) -{ - uint8_t l, border, temp; - - for (l = 0; l <= sbr->L_E[ch]; l++) - { - sbr->t_E[ch][l] = 0; - } - - sbr->t_E[ch][0] = sbr->rate * sbr->abs_bord_lead[ch]; - sbr->t_E[ch][sbr->L_E[ch]] = sbr->rate * sbr->abs_bord_trail[ch]; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - switch (sbr->L_E[ch]) - { - case 4: - temp = (int) (sbr->numTimeSlots / 4); - sbr->t_E[ch][3] = sbr->rate * 3 * temp; - sbr->t_E[ch][2] = sbr->rate * 2 * temp; - sbr->t_E[ch][1] = sbr->rate * temp; - break; - case 2: - sbr->t_E[ch][1] = sbr->rate * (int) (sbr->numTimeSlots / 2); - break; - default: - break; - } - break; - - case FIXVAR: - if (sbr->L_E[ch] > 1) - { - int8_t i = sbr->L_E[ch]; - border = sbr->abs_bord_trail[ch]; - - for (l = 0; l < (sbr->L_E[ch] - 1); l++) - { - if (border < sbr->bs_rel_bord[ch][l]) - return 1; - - border -= sbr->bs_rel_bord[ch][l]; - sbr->t_E[ch][--i] = sbr->rate * border; - } - } - break; - - case VARFIX: - if (sbr->L_E[ch] > 1) - { - int8_t i = 1; - border = sbr->abs_bord_lead[ch]; - - for (l = 0; l < (sbr->L_E[ch] - 1); l++) - { - border += sbr->bs_rel_bord[ch][l]; - - if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) - return 1; - - sbr->t_E[ch][i++] = sbr->rate * border; - } - } - break; - - case VARVAR: - if (sbr->bs_num_rel_0[ch]) - { - int8_t i = 1; - border = sbr->abs_bord_lead[ch]; - - for (l = 0; l < sbr->bs_num_rel_0[ch]; l++) - { - border += sbr->bs_rel_bord_0[ch][l]; - - if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) - return 1; - - sbr->t_E[ch][i++] = sbr->rate * border; - } - } - - if (sbr->bs_num_rel_1[ch]) - { - int8_t i = sbr->L_E[ch]; - border = sbr->abs_bord_trail[ch]; - - for (l = 0; l < sbr->bs_num_rel_1[ch]; l++) - { - if (border < sbr->bs_rel_bord_1[ch][l]) - return 1; - - border -= sbr->bs_rel_bord_1[ch][l]; - sbr->t_E[ch][--i] = sbr->rate * border; - } - } - break; - } - - return 0; -} - -void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) -{ - sbr->t_Q[ch][0] = sbr->t_E[ch][0]; - - if (sbr->L_E[ch] == 1) - { - sbr->t_Q[ch][1] = sbr->t_E[ch][1]; - sbr->t_Q[ch][2] = 0; - } else { - uint8_t index = middleBorder(sbr, ch); - sbr->t_Q[ch][1] = sbr->t_E[ch][index]; - sbr->t_Q[ch][2] = sbr->t_E[ch][sbr->L_E[ch]]; - } -} - -#if 0 -static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) -{ - uint8_t i; - int16_t acc = 0; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - return sbr->numTimeSlots/sbr->L_E[ch]; - case FIXVAR: - return 0; - case VARFIX: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord[ch][i]; - } - return acc; - case VARVAR: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord_0[ch][i]; - } - return acc; - } - - return 0; -} - -static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) -{ - uint8_t i; - int16_t acc = 0; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - case VARFIX: - return 0; - case FIXVAR: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord[ch][i]; - } - return acc; - case VARVAR: - for (i = 0; i < l; i++) - { - acc += sbr->bs_rel_bord_1[ch][i]; - } - return acc; - } - - return 0; -} -#endif - -static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) -{ - int8_t retval = 0; - - switch (sbr->bs_frame_class[ch]) - { - case FIXFIX: - retval = sbr->L_E[ch]/2; - break; - case VARFIX: - if (sbr->bs_pointer[ch] == 0) - retval = 1; - else if (sbr->bs_pointer[ch] == 1) - retval = sbr->L_E[ch] - 1; - else - retval = sbr->bs_pointer[ch] - 1; - break; - case FIXVAR: - case VARVAR: - if (sbr->bs_pointer[ch] > 1) - retval = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; - else - retval = sbr->L_E[ch] - 1; - break; - } - - return (retval > 0) ? retval : 0; -} - - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_tf_grid.c,v 1.20 2008/09/19 22:50:20 menno Exp $ +**/ + +/* Time/Frequency grid */ + +#include "common.h" +#include "structs.h" + +#ifdef SBR_DEC + +#include + +#include "sbr_syntax.h" +#include "sbr_tf_grid.h" + + +/* static function declarations */ +#if 0 +static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l); +static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l); +#endif +static uint8_t middleBorder(sbr_info *sbr, uint8_t ch); + + +/* function constructs new time border vector */ +/* first build into temp vector to be able to use previous vector on error */ +uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch) +{ + uint8_t l, border, temp; + uint8_t t_E_temp[6] = {0}; + + t_E_temp[0] = sbr->rate * sbr->abs_bord_lead[ch]; + t_E_temp[sbr->L_E[ch]] = sbr->rate * sbr->abs_bord_trail[ch]; + + switch (sbr->bs_frame_class[ch]) + { + case FIXFIX: + switch (sbr->L_E[ch]) + { + case 4: + temp = (sbr->numTimeSlots / 4); + t_E_temp[3] = sbr->rate * 3 * temp; + t_E_temp[2] = sbr->rate * 2 * temp; + t_E_temp[1] = sbr->rate * temp; + break; + case 2: + t_E_temp[1] = sbr->rate * (sbr->numTimeSlots / 2); + break; + default: + break; + } + break; + + case FIXVAR: + if (sbr->L_E[ch] > 1) + { + int8_t i = sbr->L_E[ch]; + border = sbr->abs_bord_trail[ch]; + + for (l = 0; l < (sbr->L_E[ch] - 1); l++) + { + if (border < sbr->bs_rel_bord[ch][l]) + return 1; + + border -= sbr->bs_rel_bord[ch][l]; + t_E_temp[--i] = sbr->rate * border; + } + } + break; + + case VARFIX: + if (sbr->L_E[ch] > 1) + { + int8_t i = 1; + border = sbr->abs_bord_lead[ch]; + + for (l = 0; l < (sbr->L_E[ch] - 1); l++) + { + border += sbr->bs_rel_bord[ch][l]; + + if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) + return 1; + + t_E_temp[i++] = sbr->rate * border; + } + } + break; + + case VARVAR: + if (sbr->bs_num_rel_0[ch]) + { + int8_t i = 1; + border = sbr->abs_bord_lead[ch]; + + for (l = 0; l < sbr->bs_num_rel_0[ch]; l++) + { + border += sbr->bs_rel_bord_0[ch][l]; + + if (sbr->rate * border + sbr->tHFAdj > sbr->numTimeSlotsRate+sbr->tHFGen) + return 1; + + t_E_temp[i++] = sbr->rate * border; + } + } + + if (sbr->bs_num_rel_1[ch]) + { + int8_t i = sbr->L_E[ch]; + border = sbr->abs_bord_trail[ch]; + + for (l = 0; l < sbr->bs_num_rel_1[ch]; l++) + { + if (border < sbr->bs_rel_bord_1[ch][l]) + return 1; + + border -= sbr->bs_rel_bord_1[ch][l]; + t_E_temp[--i] = sbr->rate * border; + } + } + break; + } + + /* no error occured, we can safely use this t_E vector */ + for (l = 0; l < 6; l++) + { + sbr->t_E[ch][l] = t_E_temp[l]; + } + + return 0; +} + +void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) +{ + sbr->t_Q[ch][0] = sbr->t_E[ch][0]; + + if (sbr->L_E[ch] == 1) + { + sbr->t_Q[ch][1] = sbr->t_E[ch][1]; + sbr->t_Q[ch][2] = 0; + } else { + uint8_t index = middleBorder(sbr, ch); + sbr->t_Q[ch][1] = sbr->t_E[ch][index]; + sbr->t_Q[ch][2] = sbr->t_E[ch][sbr->L_E[ch]]; + } +} + +#if 0 +static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) +{ + uint8_t i; + int16_t acc = 0; + + switch (sbr->bs_frame_class[ch]) + { + case FIXFIX: + return sbr->numTimeSlots/sbr->L_E[ch]; + case FIXVAR: + return 0; + case VARFIX: + for (i = 0; i < l; i++) + { + acc += sbr->bs_rel_bord[ch][i]; + } + return acc; + case VARVAR: + for (i = 0; i < l; i++) + { + acc += sbr->bs_rel_bord_0[ch][i]; + } + return acc; + } + + return 0; +} + +static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) +{ + uint8_t i; + int16_t acc = 0; + + switch (sbr->bs_frame_class[ch]) + { + case FIXFIX: + case VARFIX: + return 0; + case FIXVAR: + for (i = 0; i < l; i++) + { + acc += sbr->bs_rel_bord[ch][i]; + } + return acc; + case VARVAR: + for (i = 0; i < l; i++) + { + acc += sbr->bs_rel_bord_1[ch][i]; + } + return acc; + } + + return 0; +} +#endif + +static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) +{ + int8_t retval = 0; + + switch (sbr->bs_frame_class[ch]) + { + case FIXFIX: + retval = sbr->L_E[ch]/2; + break; + case VARFIX: + if (sbr->bs_pointer[ch] == 0) + retval = 1; + else if (sbr->bs_pointer[ch] == 1) + retval = sbr->L_E[ch] - 1; + else + retval = sbr->bs_pointer[ch] - 1; + break; + case FIXVAR: + case VARVAR: + if (sbr->bs_pointer[ch] > 1) + retval = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; + else + retval = sbr->L_E[ch] - 1; + break; + } + + return (retval > 0) ? retval : 0; +} + + +#endif diff --git a/src/contrib/aacdecoder/libfaad/sbr_tf_grid.h b/src/contrib/aacdecoder/libfaad/sbr_tf_grid.h old mode 100644 new mode 100755 index 3fe14850e..27a8f908e --- a/src/contrib/aacdecoder/libfaad/sbr_tf_grid.h +++ b/src/contrib/aacdecoder/libfaad/sbr_tf_grid.h @@ -1,44 +1,47 @@ -/* -** 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: sbr_tf_grid.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SBR_TF_GRID_H__ -#define __SBR_TF_GRID_H__ - -#ifdef __cplusplus -extern "C" { -#endif - - -uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch); -void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch); - - -#ifdef __cplusplus -} -#endif -#endif - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sbr_tf_grid.h,v 1.17 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SBR_TF_GRID_H__ +#define __SBR_TF_GRID_H__ + +#ifdef __cplusplus +extern "C" { +#endif + + +uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch); +void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch); + + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/src/contrib/aacdecoder/libfaad/sine_win.h b/src/contrib/aacdecoder/libfaad/sine_win.h old mode 100644 new mode 100755 index d0adbc472..e4198da3a --- a/src/contrib/aacdecoder/libfaad/sine_win.h +++ b/src/contrib/aacdecoder/libfaad/sine_win.h @@ -1,4301 +1,4304 @@ -/* -** 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: sine_win.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SINE_WIN_H__ -#define __SINE_WIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -ALIGN static const real_t sine_long_1024[] = -{ - FRAC_CONST(0.00076699031874270449), - FRAC_CONST(0.002300969151425805), - FRAC_CONST(0.0038349425697062275), - FRAC_CONST(0.0053689069639963425), - FRAC_CONST(0.0069028587247297558), - FRAC_CONST(0.0084367942423697988), - FRAC_CONST(0.0099707099074180308), - FRAC_CONST(0.011504602110422714), - FRAC_CONST(0.013038467241987334), - FRAC_CONST(0.014572301692779064), - FRAC_CONST(0.016106101853537287), - FRAC_CONST(0.017639864115082053), - FRAC_CONST(0.019173584868322623), - FRAC_CONST(0.020707260504265895), - FRAC_CONST(0.022240887414024961), - FRAC_CONST(0.023774461988827555), - FRAC_CONST(0.025307980620024571), - FRAC_CONST(0.026841439699098531), - FRAC_CONST(0.028374835617672099), - FRAC_CONST(0.029908164767516555), - FRAC_CONST(0.031441423540560301), - FRAC_CONST(0.032974608328897335), - FRAC_CONST(0.03450771552479575), - FRAC_CONST(0.036040741520706229), - FRAC_CONST(0.037573682709270494), - FRAC_CONST(0.039106535483329888), - FRAC_CONST(0.040639296235933736), - FRAC_CONST(0.042171961360347947), - FRAC_CONST(0.043704527250063421), - FRAC_CONST(0.04523699029880459), - FRAC_CONST(0.046769346900537863), - FRAC_CONST(0.048301593449480144), - FRAC_CONST(0.049833726340107277), - FRAC_CONST(0.051365741967162593), - FRAC_CONST(0.052897636725665324), - FRAC_CONST(0.054429407010919133), - FRAC_CONST(0.055961049218520569), - FRAC_CONST(0.057492559744367566), - FRAC_CONST(0.059023934984667931), - FRAC_CONST(0.060555171335947788), - FRAC_CONST(0.062086265195060088), - FRAC_CONST(0.063617212959193106), - FRAC_CONST(0.065148011025878833), - FRAC_CONST(0.066678655793001557), - FRAC_CONST(0.068209143658806329), - FRAC_CONST(0.069739471021907307), - FRAC_CONST(0.071269634281296401), - FRAC_CONST(0.072799629836351673), - FRAC_CONST(0.074329454086845756), - FRAC_CONST(0.075859103432954447), - FRAC_CONST(0.077388574275265049), - FRAC_CONST(0.078917863014784942), - FRAC_CONST(0.080446966052950014), - FRAC_CONST(0.081975879791633066), - FRAC_CONST(0.083504600633152432), - FRAC_CONST(0.085033124980280275), - FRAC_CONST(0.08656144923625117), - FRAC_CONST(0.088089569804770507), - FRAC_CONST(0.089617483090022959), - FRAC_CONST(0.091145185496681005), - FRAC_CONST(0.09267267342991331), - FRAC_CONST(0.094199943295393204), - FRAC_CONST(0.095726991499307162), - FRAC_CONST(0.097253814448363271), - FRAC_CONST(0.098780408549799623), - FRAC_CONST(0.10030677021139286), - FRAC_CONST(0.10183289584146653), - FRAC_CONST(0.10335878184889961), - FRAC_CONST(0.10488442464313497), - FRAC_CONST(0.10640982063418768), - FRAC_CONST(0.10793496623265365), - FRAC_CONST(0.10945985784971798), - FRAC_CONST(0.11098449189716339), - FRAC_CONST(0.11250886478737869), - FRAC_CONST(0.1140329729333672), - FRAC_CONST(0.11555681274875526), - FRAC_CONST(0.11708038064780059), - FRAC_CONST(0.11860367304540072), - FRAC_CONST(0.1201266863571015), - FRAC_CONST(0.12164941699910553), - FRAC_CONST(0.12317186138828048), - FRAC_CONST(0.12469401594216764), - FRAC_CONST(0.12621587707899035), - FRAC_CONST(0.12773744121766231), - FRAC_CONST(0.12925870477779614), - FRAC_CONST(0.13077966417971171), - FRAC_CONST(0.13230031584444465), - FRAC_CONST(0.13382065619375472), - FRAC_CONST(0.13534068165013421), - FRAC_CONST(0.13686038863681638), - FRAC_CONST(0.13837977357778389), - FRAC_CONST(0.13989883289777721), - FRAC_CONST(0.14141756302230302), - FRAC_CONST(0.14293596037764267), - FRAC_CONST(0.14445402139086047), - FRAC_CONST(0.14597174248981221), - FRAC_CONST(0.14748912010315357), - FRAC_CONST(0.14900615066034845), - FRAC_CONST(0.1505228305916774), - FRAC_CONST(0.15203915632824605), - FRAC_CONST(0.15355512430199345), - FRAC_CONST(0.15507073094570051), - FRAC_CONST(0.15658597269299843), - FRAC_CONST(0.15810084597837698), - FRAC_CONST(0.15961534723719306), - FRAC_CONST(0.16112947290567881), - FRAC_CONST(0.16264321942095031), - FRAC_CONST(0.16415658322101581), - FRAC_CONST(0.16566956074478412), - FRAC_CONST(0.16718214843207294), - FRAC_CONST(0.16869434272361733), - FRAC_CONST(0.17020614006107807), - FRAC_CONST(0.17171753688704997), - FRAC_CONST(0.17322852964507032), - FRAC_CONST(0.1747391147796272), - FRAC_CONST(0.17624928873616788), - FRAC_CONST(0.17775904796110717), - FRAC_CONST(0.17926838890183575), - FRAC_CONST(0.18077730800672859), - FRAC_CONST(0.1822858017251533), - FRAC_CONST(0.18379386650747845), - FRAC_CONST(0.1853014988050819), - FRAC_CONST(0.18680869507035927), - FRAC_CONST(0.18831545175673212), - FRAC_CONST(0.18982176531865641), - FRAC_CONST(0.1913276322116309), - FRAC_CONST(0.19283304889220523), - FRAC_CONST(0.1943380118179886), - FRAC_CONST(0.19584251744765785), - FRAC_CONST(0.19734656224096592), - FRAC_CONST(0.19885014265875009), - FRAC_CONST(0.20035325516294045), - FRAC_CONST(0.20185589621656805), - FRAC_CONST(0.20335806228377332), - FRAC_CONST(0.20485974982981442), - FRAC_CONST(0.20636095532107551), - FRAC_CONST(0.20786167522507507), - FRAC_CONST(0.20936190601047416), - FRAC_CONST(0.21086164414708486), - FRAC_CONST(0.21236088610587842), - FRAC_CONST(0.21385962835899375), - FRAC_CONST(0.21535786737974555), - FRAC_CONST(0.21685559964263262), - FRAC_CONST(0.21835282162334632), - FRAC_CONST(0.2198495297987787), - FRAC_CONST(0.22134572064703081), - FRAC_CONST(0.22284139064742112), - FRAC_CONST(0.2243365362804936), - FRAC_CONST(0.22583115402802617), - FRAC_CONST(0.22732524037303886), - FRAC_CONST(0.22881879179980222), - FRAC_CONST(0.23031180479384544), - FRAC_CONST(0.23180427584196478), - FRAC_CONST(0.23329620143223159), - FRAC_CONST(0.23478757805400097), - FRAC_CONST(0.23627840219791957), - FRAC_CONST(0.23776867035593419), - FRAC_CONST(0.23925837902129998), - FRAC_CONST(0.24074752468858843), - FRAC_CONST(0.24223610385369601), - FRAC_CONST(0.24372411301385216), - FRAC_CONST(0.24521154866762754), - FRAC_CONST(0.24669840731494241), - FRAC_CONST(0.24818468545707478), - FRAC_CONST(0.24967037959666857), - FRAC_CONST(0.25115548623774192), - FRAC_CONST(0.25264000188569552), - FRAC_CONST(0.25412392304732062), - FRAC_CONST(0.25560724623080738), - FRAC_CONST(0.25708996794575312), - FRAC_CONST(0.25857208470317034), - FRAC_CONST(0.26005359301549519), - FRAC_CONST(0.26153448939659552), - FRAC_CONST(0.263014770361779), - FRAC_CONST(0.26449443242780163), - FRAC_CONST(0.26597347211287559), - FRAC_CONST(0.26745188593667762), - FRAC_CONST(0.26892967042035726), - FRAC_CONST(0.27040682208654482), - FRAC_CONST(0.27188333745935972), - FRAC_CONST(0.27335921306441868), - FRAC_CONST(0.27483444542884394), - FRAC_CONST(0.27630903108127108), - FRAC_CONST(0.27778296655185769), - FRAC_CONST(0.27925624837229118), - FRAC_CONST(0.28072887307579719), - FRAC_CONST(0.28220083719714756), - FRAC_CONST(0.28367213727266843), - FRAC_CONST(0.28514276984024867), - FRAC_CONST(0.28661273143934779), - FRAC_CONST(0.28808201861100413), - FRAC_CONST(0.28955062789784303), - FRAC_CONST(0.29101855584408509), - FRAC_CONST(0.29248579899555388), - FRAC_CONST(0.29395235389968466), - FRAC_CONST(0.29541821710553201), - FRAC_CONST(0.29688338516377827), - FRAC_CONST(0.2983478546267414), - FRAC_CONST(0.29981162204838335), - FRAC_CONST(0.30127468398431795), - FRAC_CONST(0.30273703699181914), - FRAC_CONST(0.30419867762982911), - FRAC_CONST(0.30565960245896612), - FRAC_CONST(0.3071198080415331), - FRAC_CONST(0.30857929094152509), - FRAC_CONST(0.31003804772463789), - FRAC_CONST(0.31149607495827591), - FRAC_CONST(0.3129533692115602), - FRAC_CONST(0.31440992705533666), - FRAC_CONST(0.31586574506218396), - FRAC_CONST(0.31732081980642174), - FRAC_CONST(0.31877514786411848), - FRAC_CONST(0.32022872581309986), - FRAC_CONST(0.32168155023295658), - FRAC_CONST(0.32313361770505233), - FRAC_CONST(0.32458492481253215), - FRAC_CONST(0.32603546814033024), - FRAC_CONST(0.327485244275178), - FRAC_CONST(0.3289342498056122), - FRAC_CONST(0.33038248132198278), - FRAC_CONST(0.33182993541646111), - FRAC_CONST(0.33327660868304793), - FRAC_CONST(0.33472249771758122), - FRAC_CONST(0.33616759911774452), - FRAC_CONST(0.33761190948307462), - FRAC_CONST(0.33905542541496964), - FRAC_CONST(0.34049814351669716), - FRAC_CONST(0.34194006039340219), - FRAC_CONST(0.34338117265211504), - FRAC_CONST(0.34482147690175929), - FRAC_CONST(0.34626096975316001), - FRAC_CONST(0.34769964781905138), - FRAC_CONST(0.34913750771408497), - FRAC_CONST(0.35057454605483751), - FRAC_CONST(0.35201075945981908), - FRAC_CONST(0.35344614454948081), - FRAC_CONST(0.35488069794622279), - FRAC_CONST(0.35631441627440241), - FRAC_CONST(0.3577472961603419), - FRAC_CONST(0.3591793342323365), - FRAC_CONST(0.36061052712066227), - FRAC_CONST(0.36204087145758418), - FRAC_CONST(0.36347036387736376), - FRAC_CONST(0.36489900101626732), - FRAC_CONST(0.36632677951257359), - FRAC_CONST(0.36775369600658198), - FRAC_CONST(0.36917974714062002), - FRAC_CONST(0.37060492955905167), - FRAC_CONST(0.37202923990828501), - FRAC_CONST(0.3734526748367803), - FRAC_CONST(0.37487523099505754), - FRAC_CONST(0.37629690503570479), - FRAC_CONST(0.37771769361338564), - FRAC_CONST(0.37913759338484732), - FRAC_CONST(0.38055660100892852), - FRAC_CONST(0.38197471314656722), - FRAC_CONST(0.38339192646080866), - FRAC_CONST(0.38480823761681288), - FRAC_CONST(0.38622364328186298), - FRAC_CONST(0.38763814012537273), - FRAC_CONST(0.38905172481889438), - FRAC_CONST(0.39046439403612659), - FRAC_CONST(0.39187614445292235), - FRAC_CONST(0.3932869727472964), - FRAC_CONST(0.39469687559943356), - FRAC_CONST(0.39610584969169627), - FRAC_CONST(0.39751389170863233), - FRAC_CONST(0.39892099833698291), - FRAC_CONST(0.40032716626569009), - FRAC_CONST(0.40173239218590501), - FRAC_CONST(0.4031366727909953), - FRAC_CONST(0.404540004776553), - FRAC_CONST(0.40594238484040251), - FRAC_CONST(0.40734380968260797), - FRAC_CONST(0.40874427600548136), - FRAC_CONST(0.41014378051359024), - FRAC_CONST(0.41154231991376522), - FRAC_CONST(0.41293989091510808), - FRAC_CONST(0.4143364902289991), - FRAC_CONST(0.41573211456910536), - FRAC_CONST(0.41712676065138787), - FRAC_CONST(0.4185204251941097), - FRAC_CONST(0.41991310491784362), - FRAC_CONST(0.42130479654547964), - FRAC_CONST(0.42269549680223295), - FRAC_CONST(0.42408520241565156), - FRAC_CONST(0.4254739101156238), - FRAC_CONST(0.42686161663438643), - FRAC_CONST(0.42824831870653196), - FRAC_CONST(0.42963401306901638), - FRAC_CONST(0.43101869646116703), - FRAC_CONST(0.43240236562469014), - FRAC_CONST(0.43378501730367852), - FRAC_CONST(0.43516664824461926), - FRAC_CONST(0.4365472551964012), - FRAC_CONST(0.43792683491032286), - FRAC_CONST(0.43930538414009995), - FRAC_CONST(0.4406828996418729), - FRAC_CONST(0.4420593781742147), - FRAC_CONST(0.44343481649813848), - FRAC_CONST(0.44480921137710488), - FRAC_CONST(0.44618255957703007), - FRAC_CONST(0.44755485786629301), - FRAC_CONST(0.44892610301574326), - FRAC_CONST(0.45029629179870861), - FRAC_CONST(0.45166542099100249), - FRAC_CONST(0.45303348737093158), - FRAC_CONST(0.45440048771930358), - FRAC_CONST(0.45576641881943464), - FRAC_CONST(0.45713127745715698), - FRAC_CONST(0.45849506042082627), - FRAC_CONST(0.45985776450132954), - FRAC_CONST(0.46121938649209238), - FRAC_CONST(0.46257992318908681), - FRAC_CONST(0.46393937139083852), - FRAC_CONST(0.4652977278984346), - FRAC_CONST(0.46665498951553092), - FRAC_CONST(0.46801115304835983), - FRAC_CONST(0.46936621530573752), - FRAC_CONST(0.4707201730990716), - FRAC_CONST(0.47207302324236866), - FRAC_CONST(0.47342476255224153), - FRAC_CONST(0.47477538784791712), - FRAC_CONST(0.47612489595124358), - FRAC_CONST(0.47747328368669806), - FRAC_CONST(0.47882054788139389), - FRAC_CONST(0.48016668536508839), - FRAC_CONST(0.48151169297018986), - FRAC_CONST(0.48285556753176567), - FRAC_CONST(0.48419830588754903), - FRAC_CONST(0.48553990487794696), - FRAC_CONST(0.48688036134604734), - FRAC_CONST(0.48821967213762679), - FRAC_CONST(0.48955783410115744), - FRAC_CONST(0.49089484408781509), - FRAC_CONST(0.49223069895148602), - FRAC_CONST(0.49356539554877477), - FRAC_CONST(0.49489893073901126), - FRAC_CONST(0.49623130138425825), - FRAC_CONST(0.49756250434931915), - FRAC_CONST(0.49889253650174459), - FRAC_CONST(0.50022139471184068), - FRAC_CONST(0.50154907585267539), - FRAC_CONST(0.50287557680008699), - FRAC_CONST(0.50420089443269034), - FRAC_CONST(0.50552502563188539), - FRAC_CONST(0.50684796728186321), - FRAC_CONST(0.5081697162696146), - FRAC_CONST(0.50949026948493636), - FRAC_CONST(0.51080962382043904), - FRAC_CONST(0.51212777617155469), - FRAC_CONST(0.51344472343654346), - FRAC_CONST(0.5147604625165012), - FRAC_CONST(0.51607499031536663), - FRAC_CONST(0.51738830373992906), - FRAC_CONST(0.51870039969983495), - FRAC_CONST(0.52001127510759604), - FRAC_CONST(0.52132092687859566), - FRAC_CONST(0.52262935193109661), - FRAC_CONST(0.5239365471862486), - FRAC_CONST(0.52524250956809471), - FRAC_CONST(0.52654723600357944), - FRAC_CONST(0.52785072342255523), - FRAC_CONST(0.52915296875779061), - FRAC_CONST(0.53045396894497632), - FRAC_CONST(0.53175372092273332), - FRAC_CONST(0.53305222163261945), - FRAC_CONST(0.53434946801913752), - FRAC_CONST(0.53564545702974109), - FRAC_CONST(0.53694018561484291), - FRAC_CONST(0.5382336507278217), - FRAC_CONST(0.53952584932502889), - FRAC_CONST(0.54081677836579667), - FRAC_CONST(0.54210643481244392), - FRAC_CONST(0.5433948156302848), - FRAC_CONST(0.54468191778763453), - FRAC_CONST(0.54596773825581757), - FRAC_CONST(0.54725227400917409), - FRAC_CONST(0.54853552202506739), - FRAC_CONST(0.54981747928389091), - FRAC_CONST(0.55109814276907543), - FRAC_CONST(0.55237750946709607), - FRAC_CONST(0.55365557636747931), - FRAC_CONST(0.55493234046281037), - FRAC_CONST(0.55620779874873993), - FRAC_CONST(0.55748194822399155), - FRAC_CONST(0.55875478589036831), - FRAC_CONST(0.56002630875276038), - FRAC_CONST(0.56129651381915147), - FRAC_CONST(0.56256539810062656), - FRAC_CONST(0.56383295861137817), - FRAC_CONST(0.56509919236871398), - FRAC_CONST(0.56636409639306384), - FRAC_CONST(0.56762766770798623), - FRAC_CONST(0.56888990334017586), - FRAC_CONST(0.5701508003194703), - FRAC_CONST(0.57141035567885723), - FRAC_CONST(0.57266856645448116), - FRAC_CONST(0.57392542968565075), - FRAC_CONST(0.57518094241484508), - FRAC_CONST(0.57643510168772183), - FRAC_CONST(0.5776879045531228), - FRAC_CONST(0.57893934806308178), - FRAC_CONST(0.58018942927283168), - FRAC_CONST(0.58143814524081017), - FRAC_CONST(0.58268549302866846), - FRAC_CONST(0.58393146970127618), - FRAC_CONST(0.58517607232673041), - FRAC_CONST(0.5864192979763605), - FRAC_CONST(0.58766114372473666), - FRAC_CONST(0.58890160664967572), - FRAC_CONST(0.59014068383224882), - FRAC_CONST(0.59137837235678758), - FRAC_CONST(0.59261466931089113), - FRAC_CONST(0.59384957178543363), - FRAC_CONST(0.59508307687456996), - FRAC_CONST(0.59631518167574371), - FRAC_CONST(0.59754588328969316), - FRAC_CONST(0.59877517882045872), - FRAC_CONST(0.60000306537538894), - FRAC_CONST(0.6012295400651485), - FRAC_CONST(0.60245460000372375), - FRAC_CONST(0.60367824230843037), - FRAC_CONST(0.60490046409991982), - FRAC_CONST(0.60612126250218612), - FRAC_CONST(0.60734063464257293), - FRAC_CONST(0.60855857765177945), - FRAC_CONST(0.60977508866386843), - FRAC_CONST(0.61099016481627166), - FRAC_CONST(0.61220380324979795), - FRAC_CONST(0.61341600110863859), - FRAC_CONST(0.61462675554037505), - FRAC_CONST(0.61583606369598509), - FRAC_CONST(0.61704392272984976), - FRAC_CONST(0.61825032979976025), - FRAC_CONST(0.61945528206692402), - FRAC_CONST(0.62065877669597214), - FRAC_CONST(0.62186081085496536), - FRAC_CONST(0.62306138171540126), - FRAC_CONST(0.62426048645222065), - FRAC_CONST(0.62545812224381436), - FRAC_CONST(0.62665428627202935), - FRAC_CONST(0.62784897572217646), - FRAC_CONST(0.629042187783036), - FRAC_CONST(0.63023391964686437), - FRAC_CONST(0.63142416850940186), - FRAC_CONST(0.63261293156987741), - FRAC_CONST(0.63380020603101728), - FRAC_CONST(0.63498598909904946), - FRAC_CONST(0.63617027798371217), - FRAC_CONST(0.63735306989825913), - FRAC_CONST(0.63853436205946679), - FRAC_CONST(0.63971415168764045), - FRAC_CONST(0.64089243600662138), - FRAC_CONST(0.64206921224379254), - FRAC_CONST(0.64324447763008585), - FRAC_CONST(0.64441822939998838), - FRAC_CONST(0.64559046479154869), - FRAC_CONST(0.64676118104638392), - FRAC_CONST(0.64793037540968534), - FRAC_CONST(0.64909804513022595), - FRAC_CONST(0.65026418746036585), - FRAC_CONST(0.65142879965605982), - FRAC_CONST(0.65259187897686244), - FRAC_CONST(0.65375342268593606), - FRAC_CONST(0.65491342805005603), - FRAC_CONST(0.6560718923396176), - FRAC_CONST(0.65722881282864254), - FRAC_CONST(0.65838418679478505), - FRAC_CONST(0.65953801151933866), - FRAC_CONST(0.6606902842872423), - FRAC_CONST(0.66184100238708687), - FRAC_CONST(0.66299016311112147), - FRAC_CONST(0.66413776375526001), - FRAC_CONST(0.66528380161908718), - FRAC_CONST(0.66642827400586524), - FRAC_CONST(0.66757117822254031), - FRAC_CONST(0.66871251157974798), - FRAC_CONST(0.66985227139182102), - FRAC_CONST(0.67099045497679422), - FRAC_CONST(0.67212705965641173), - FRAC_CONST(0.67326208275613297), - FRAC_CONST(0.67439552160513905), - FRAC_CONST(0.67552737353633852), - FRAC_CONST(0.67665763588637495), - FRAC_CONST(0.6777863059956315), - FRAC_CONST(0.67891338120823841), - FRAC_CONST(0.68003885887207893), - FRAC_CONST(0.68116273633879543), - FRAC_CONST(0.68228501096379557), - FRAC_CONST(0.68340568010625868), - FRAC_CONST(0.6845247411291423), - FRAC_CONST(0.68564219139918747), - FRAC_CONST(0.68675802828692589), - FRAC_CONST(0.68787224916668555), - FRAC_CONST(0.68898485141659704), - FRAC_CONST(0.69009583241859995), - FRAC_CONST(0.69120518955844845), - FRAC_CONST(0.69231292022571822), - FRAC_CONST(0.69341902181381176), - FRAC_CONST(0.69452349171996552), - FRAC_CONST(0.69562632734525487), - FRAC_CONST(0.6967275260946012), - FRAC_CONST(0.69782708537677729), - FRAC_CONST(0.69892500260441415), - FRAC_CONST(0.70002127519400625), - FRAC_CONST(0.70111590056591866), - FRAC_CONST(0.70220887614439187), - FRAC_CONST(0.70330019935754873), - FRAC_CONST(0.70438986763740041), - FRAC_CONST(0.7054778784198521), - FRAC_CONST(0.70656422914470951), - FRAC_CONST(0.70764891725568435), - FRAC_CONST(0.70873194020040065), - FRAC_CONST(0.70981329543040084), - FRAC_CONST(0.71089298040115168), - FRAC_CONST(0.71197099257204999), - FRAC_CONST(0.71304732940642923), - FRAC_CONST(0.71412198837156471), - FRAC_CONST(0.71519496693868001), - FRAC_CONST(0.71626626258295312), - FRAC_CONST(0.71733587278352173), - FRAC_CONST(0.71840379502348972), - FRAC_CONST(0.71947002678993299), - FRAC_CONST(0.72053456557390527), - FRAC_CONST(0.72159740887044366), - FRAC_CONST(0.72265855417857561), - FRAC_CONST(0.72371799900132339), - FRAC_CONST(0.72477574084571128), - FRAC_CONST(0.72583177722277037), - FRAC_CONST(0.72688610564754497), - FRAC_CONST(0.72793872363909862), - FRAC_CONST(0.72898962872051931), - FRAC_CONST(0.73003881841892615), - FRAC_CONST(0.73108629026547423), - FRAC_CONST(0.73213204179536129), - FRAC_CONST(0.73317607054783274), - FRAC_CONST(0.73421837406618817), - FRAC_CONST(0.73525894989778673), - FRAC_CONST(0.73629779559405306), - FRAC_CONST(0.73733490871048279), - FRAC_CONST(0.73837028680664851), - FRAC_CONST(0.73940392744620576), - FRAC_CONST(0.74043582819689802), - FRAC_CONST(0.74146598663056329), - FRAC_CONST(0.74249440032313918), - FRAC_CONST(0.74352106685466912), - FRAC_CONST(0.74454598380930725), - FRAC_CONST(0.74556914877532543), - FRAC_CONST(0.74659055934511731), - FRAC_CONST(0.74761021311520515), - FRAC_CONST(0.74862810768624533), - FRAC_CONST(0.74964424066303348), - FRAC_CONST(0.75065860965451059), - FRAC_CONST(0.75167121227376843), - FRAC_CONST(0.75268204613805523), - FRAC_CONST(0.75369110886878121), - FRAC_CONST(0.75469839809152439), - FRAC_CONST(0.75570391143603588), - FRAC_CONST(0.75670764653624567), - FRAC_CONST(0.75770960103026808), - FRAC_CONST(0.75870977256040739), - FRAC_CONST(0.75970815877316344), - FRAC_CONST(0.76070475731923692), - FRAC_CONST(0.76169956585353527), - FRAC_CONST(0.76269258203517787), - FRAC_CONST(0.76368380352750187), - FRAC_CONST(0.76467322799806714), - FRAC_CONST(0.76566085311866239), - FRAC_CONST(0.76664667656531038), - FRAC_CONST(0.76763069601827327), - FRAC_CONST(0.76861290916205827), - FRAC_CONST(0.76959331368542294), - FRAC_CONST(0.7705719072813807), - FRAC_CONST(0.7715486876472063), - FRAC_CONST(0.77252365248444133), - FRAC_CONST(0.77349679949889905), - FRAC_CONST(0.77446812640067086), - FRAC_CONST(0.77543763090413043), - FRAC_CONST(0.77640531072794039), - FRAC_CONST(0.7773711635950562), - FRAC_CONST(0.77833518723273309), - FRAC_CONST(0.7792973793725303), - FRAC_CONST(0.78025773775031659), - FRAC_CONST(0.78121626010627609), - FRAC_CONST(0.7821729441849129), - FRAC_CONST(0.78312778773505731), - FRAC_CONST(0.78408078850986995), - FRAC_CONST(0.78503194426684808), - FRAC_CONST(0.78598125276783015), - FRAC_CONST(0.7869287117790017), - FRAC_CONST(0.78787431907090011), - FRAC_CONST(0.78881807241842017), - FRAC_CONST(0.78975996960081907), - FRAC_CONST(0.79070000840172161), - FRAC_CONST(0.79163818660912577), - FRAC_CONST(0.79257450201540758), - FRAC_CONST(0.79350895241732666), - FRAC_CONST(0.79444153561603059), - FRAC_CONST(0.79537224941706119), - FRAC_CONST(0.79630109163035911), - FRAC_CONST(0.7972280600702687), - FRAC_CONST(0.79815315255554375), - FRAC_CONST(0.79907636690935235), - FRAC_CONST(0.79999770095928191), - FRAC_CONST(0.8009171525373443), - FRAC_CONST(0.80183471947998131), - FRAC_CONST(0.80275039962806916), - FRAC_CONST(0.80366419082692409), - FRAC_CONST(0.804576090926307), - FRAC_CONST(0.80548609778042912), - FRAC_CONST(0.80639420924795624), - FRAC_CONST(0.80730042319201445), - FRAC_CONST(0.80820473748019472), - FRAC_CONST(0.80910714998455813), - FRAC_CONST(0.81000765858164114), - FRAC_CONST(0.81090626115245967), - FRAC_CONST(0.81180295558251536), - FRAC_CONST(0.81269773976179949), - FRAC_CONST(0.81359061158479851), - FRAC_CONST(0.81448156895049861), - FRAC_CONST(0.81537060976239129), - FRAC_CONST(0.81625773192847739), - FRAC_CONST(0.81714293336127297), - FRAC_CONST(0.81802621197781344), - FRAC_CONST(0.81890756569965895), - FRAC_CONST(0.81978699245289899), - FRAC_CONST(0.82066449016815746), - FRAC_CONST(0.82154005678059761), - FRAC_CONST(0.82241369022992639), - FRAC_CONST(0.82328538846040011), - FRAC_CONST(0.82415514942082857), - FRAC_CONST(0.82502297106458022), - FRAC_CONST(0.82588885134958678), - FRAC_CONST(0.82675278823834852), - FRAC_CONST(0.8276147796979384), - FRAC_CONST(0.82847482370000713), - FRAC_CONST(0.82933291822078825), - FRAC_CONST(0.83018906124110237), - FRAC_CONST(0.83104325074636232), - FRAC_CONST(0.83189548472657759), - FRAC_CONST(0.83274576117635946), - FRAC_CONST(0.83359407809492514), - FRAC_CONST(0.83444043348610319), - FRAC_CONST(0.83528482535833737), - FRAC_CONST(0.83612725172469216), - FRAC_CONST(0.83696771060285702), - FRAC_CONST(0.83780620001515094), - FRAC_CONST(0.8386427179885273), - FRAC_CONST(0.83947726255457855), - FRAC_CONST(0.84030983174954077), - FRAC_CONST(0.84114042361429808), - FRAC_CONST(0.84196903619438768), - FRAC_CONST(0.84279566754000412), - FRAC_CONST(0.84362031570600404), - FRAC_CONST(0.84444297875191066), - FRAC_CONST(0.84526365474191822), - FRAC_CONST(0.84608234174489694), - FRAC_CONST(0.84689903783439735), - FRAC_CONST(0.84771374108865427), - FRAC_CONST(0.84852644959059265), - FRAC_CONST(0.84933716142783067), - FRAC_CONST(0.85014587469268521), - FRAC_CONST(0.85095258748217573), - FRAC_CONST(0.85175729789802912), - FRAC_CONST(0.85256000404668397), - FRAC_CONST(0.85336070403929543), - FRAC_CONST(0.85415939599173873), - FRAC_CONST(0.85495607802461482), - FRAC_CONST(0.85575074826325392), - FRAC_CONST(0.85654340483771996), - FRAC_CONST(0.85733404588281559), - FRAC_CONST(0.85812266953808602), - FRAC_CONST(0.8589092739478239), - FRAC_CONST(0.85969385726107261), - FRAC_CONST(0.86047641763163207), - FRAC_CONST(0.86125695321806206), - FRAC_CONST(0.86203546218368721), - FRAC_CONST(0.86281194269660033), - FRAC_CONST(0.86358639292966799), - FRAC_CONST(0.86435881106053403), - FRAC_CONST(0.86512919527162369), - FRAC_CONST(0.86589754375014882), - FRAC_CONST(0.86666385468811102), - FRAC_CONST(0.86742812628230692), - FRAC_CONST(0.86819035673433131), - FRAC_CONST(0.86895054425058238), - FRAC_CONST(0.86970868704226556), - FRAC_CONST(0.87046478332539767), - FRAC_CONST(0.8712188313208109), - FRAC_CONST(0.8719708292541577), - FRAC_CONST(0.8727207753559143), - FRAC_CONST(0.87346866786138488), - FRAC_CONST(0.8742145050107063), - FRAC_CONST(0.87495828504885154), - FRAC_CONST(0.8757000062256346), - FRAC_CONST(0.87643966679571361), - FRAC_CONST(0.87717726501859594), - FRAC_CONST(0.87791279915864173), - FRAC_CONST(0.87864626748506813), - FRAC_CONST(0.87937766827195318), - FRAC_CONST(0.88010699979824036), - FRAC_CONST(0.88083426034774204), - FRAC_CONST(0.88155944820914378), - FRAC_CONST(0.8822825616760086), - FRAC_CONST(0.88300359904678072), - FRAC_CONST(0.88372255862478966), - FRAC_CONST(0.8844394387182537), - FRAC_CONST(0.88515423764028511), - FRAC_CONST(0.88586695370889279), - FRAC_CONST(0.88657758524698704), - FRAC_CONST(0.88728613058238315), - FRAC_CONST(0.88799258804780556), - FRAC_CONST(0.88869695598089171), - FRAC_CONST(0.88939923272419552), - FRAC_CONST(0.89009941662519221), - FRAC_CONST(0.89079750603628149), - FRAC_CONST(0.89149349931479138), - FRAC_CONST(0.89218739482298248), - FRAC_CONST(0.89287919092805168), - FRAC_CONST(0.89356888600213602), - FRAC_CONST(0.89425647842231604), - FRAC_CONST(0.89494196657062075), - FRAC_CONST(0.89562534883403), - FRAC_CONST(0.89630662360447966), - FRAC_CONST(0.89698578927886397), - FRAC_CONST(0.89766284425904075), - FRAC_CONST(0.89833778695183419), - FRAC_CONST(0.89901061576903907), - FRAC_CONST(0.89968132912742393), - FRAC_CONST(0.9003499254487356), - FRAC_CONST(0.90101640315970233), - FRAC_CONST(0.90168076069203773), - FRAC_CONST(0.9023429964824442), - FRAC_CONST(0.90300310897261704), - FRAC_CONST(0.90366109660924798), - FRAC_CONST(0.90431695784402832), - FRAC_CONST(0.90497069113365325), - FRAC_CONST(0.90562229493982516), - FRAC_CONST(0.90627176772925766), - FRAC_CONST(0.90691910797367803), - FRAC_CONST(0.90756431414983252), - FRAC_CONST(0.9082073847394887), - FRAC_CONST(0.90884831822943912), - FRAC_CONST(0.90948711311150543), - FRAC_CONST(0.91012376788254157), - FRAC_CONST(0.91075828104443757), - FRAC_CONST(0.91139065110412232), - FRAC_CONST(0.91202087657356823), - FRAC_CONST(0.9126489559697939), - FRAC_CONST(0.91327488781486776), - FRAC_CONST(0.91389867063591168), - FRAC_CONST(0.91452030296510445), - FRAC_CONST(0.91513978333968526), - FRAC_CONST(0.91575711030195672), - FRAC_CONST(0.91637228239928914), - FRAC_CONST(0.91698529818412289), - FRAC_CONST(0.91759615621397295), - FRAC_CONST(0.9182048550514309), - FRAC_CONST(0.91881139326416994), - FRAC_CONST(0.91941576942494696), - FRAC_CONST(0.92001798211160657), - FRAC_CONST(0.92061802990708386), - FRAC_CONST(0.92121591139940873), - FRAC_CONST(0.92181162518170812), - FRAC_CONST(0.92240516985220988), - FRAC_CONST(0.92299654401424625), - FRAC_CONST(0.92358574627625656), - FRAC_CONST(0.9241727752517912), - FRAC_CONST(0.92475762955951391), - FRAC_CONST(0.9253403078232062), - FRAC_CONST(0.92592080867176996), - FRAC_CONST(0.92649913073923051), - FRAC_CONST(0.9270752726647401), - FRAC_CONST(0.92764923309258118), - FRAC_CONST(0.92822101067216944), - FRAC_CONST(0.92879060405805702), - FRAC_CONST(0.9293580119099355), - FRAC_CONST(0.92992323289263956), - FRAC_CONST(0.93048626567614978), - FRAC_CONST(0.93104710893559517), - FRAC_CONST(0.93160576135125783), - FRAC_CONST(0.93216222160857432), - FRAC_CONST(0.93271648839814025), - FRAC_CONST(0.93326856041571205), - FRAC_CONST(0.93381843636221096), - FRAC_CONST(0.9343661149437259), - FRAC_CONST(0.93491159487151609), - FRAC_CONST(0.93545487486201462), - FRAC_CONST(0.9359959536368313), - FRAC_CONST(0.9365348299227555), - FRAC_CONST(0.93707150245175919), - FRAC_CONST(0.93760596996099999), - FRAC_CONST(0.93813823119282436), - FRAC_CONST(0.93866828489477017), - FRAC_CONST(0.9391961298195699), - FRAC_CONST(0.93972176472515334), - FRAC_CONST(0.94024518837465088), - FRAC_CONST(0.94076639953639607), - FRAC_CONST(0.94128539698392866), - FRAC_CONST(0.94180217949599765), - FRAC_CONST(0.94231674585656378), - FRAC_CONST(0.94282909485480271), - FRAC_CONST(0.94333922528510772), - FRAC_CONST(0.94384713594709269), - FRAC_CONST(0.94435282564559475), - FRAC_CONST(0.94485629319067721), - FRAC_CONST(0.94535753739763229), - FRAC_CONST(0.94585655708698391), - FRAC_CONST(0.94635335108449059), - FRAC_CONST(0.946847918221148), - FRAC_CONST(0.94734025733319194), - FRAC_CONST(0.94783036726210101), - FRAC_CONST(0.94831824685459909), - FRAC_CONST(0.94880389496265838), - FRAC_CONST(0.94928731044350201), - FRAC_CONST(0.94976849215960668), - FRAC_CONST(0.95024743897870523), - FRAC_CONST(0.95072414977378961), - FRAC_CONST(0.95119862342311323), - FRAC_CONST(0.95167085881019386), - FRAC_CONST(0.95214085482381583), - FRAC_CONST(0.95260861035803324), - FRAC_CONST(0.9530741243121722), - FRAC_CONST(0.95353739559083328), - FRAC_CONST(0.95399842310389449), - FRAC_CONST(0.95445720576651349), - FRAC_CONST(0.95491374249913052), - FRAC_CONST(0.95536803222747024), - FRAC_CONST(0.95582007388254542), - FRAC_CONST(0.95626986640065814), - FRAC_CONST(0.95671740872340305), - FRAC_CONST(0.9571626997976701), - FRAC_CONST(0.95760573857564624), - FRAC_CONST(0.9580465240148186), - FRAC_CONST(0.9584850550779761), - FRAC_CONST(0.95892133073321306), - FRAC_CONST(0.95935534995393079), - FRAC_CONST(0.9597871117188399), - FRAC_CONST(0.96021661501196343), - FRAC_CONST(0.96064385882263847), - FRAC_CONST(0.96106884214551935), - FRAC_CONST(0.961491563980579), - FRAC_CONST(0.9619120233331121), - FRAC_CONST(0.9623302192137374), - FRAC_CONST(0.96274615063839941), - FRAC_CONST(0.96315981662837136), - FRAC_CONST(0.96357121621025721), - FRAC_CONST(0.96398034841599411), - FRAC_CONST(0.96438721228285429), - FRAC_CONST(0.9647918068534479), - FRAC_CONST(0.96519413117572472), - FRAC_CONST(0.96559418430297683), - FRAC_CONST(0.96599196529384057), - FRAC_CONST(0.96638747321229879), - FRAC_CONST(0.96678070712768327), - FRAC_CONST(0.96717166611467664), - FRAC_CONST(0.96756034925331436), - FRAC_CONST(0.9679467556289878), - FRAC_CONST(0.9683308843324453), - FRAC_CONST(0.96871273445979478), - FRAC_CONST(0.9690923051125061), - FRAC_CONST(0.96946959539741295), - FRAC_CONST(0.96984460442671483), - FRAC_CONST(0.97021733131797916), - FRAC_CONST(0.97058777519414363), - FRAC_CONST(0.97095593518351797), - FRAC_CONST(0.97132181041978616), - FRAC_CONST(0.97168540004200854), - FRAC_CONST(0.9720467031946235), - FRAC_CONST(0.97240571902744977), - FRAC_CONST(0.97276244669568857), - FRAC_CONST(0.97311688535992513), - FRAC_CONST(0.97346903418613095), - FRAC_CONST(0.9738188923456661), - FRAC_CONST(0.97416645901528032), - FRAC_CONST(0.97451173337711572), - FRAC_CONST(0.97485471461870843), - FRAC_CONST(0.97519540193299037), - FRAC_CONST(0.97553379451829136), - FRAC_CONST(0.97586989157834103), - FRAC_CONST(0.97620369232227056), - FRAC_CONST(0.97653519596461447), - FRAC_CONST(0.97686440172531264), - FRAC_CONST(0.97719130882971228), - FRAC_CONST(0.97751591650856928), - FRAC_CONST(0.97783822399805043), - FRAC_CONST(0.97815823053973505), - FRAC_CONST(0.97847593538061683), - FRAC_CONST(0.97879133777310567), - FRAC_CONST(0.97910443697502925), - FRAC_CONST(0.97941523224963478), - FRAC_CONST(0.97972372286559117), - FRAC_CONST(0.98002990809698998), - FRAC_CONST(0.98033378722334796), - FRAC_CONST(0.98063535952960812), - FRAC_CONST(0.98093462430614164), - FRAC_CONST(0.98123158084874973), - FRAC_CONST(0.98152622845866466), - FRAC_CONST(0.9818185664425525), - FRAC_CONST(0.98210859411251361), - FRAC_CONST(0.98239631078608469), - FRAC_CONST(0.98268171578624086), - FRAC_CONST(0.98296480844139644), - FRAC_CONST(0.98324558808540707), - FRAC_CONST(0.98352405405757126), - FRAC_CONST(0.98380020570263149), - FRAC_CONST(0.98407404237077645), - FRAC_CONST(0.9843455634176419), - FRAC_CONST(0.9846147682043126), - FRAC_CONST(0.9848816560973237), - FRAC_CONST(0.98514622646866223), - FRAC_CONST(0.98540847869576842), - FRAC_CONST(0.98566841216153755), - FRAC_CONST(0.98592602625432113), - FRAC_CONST(0.98618132036792827), - FRAC_CONST(0.98643429390162707), - FRAC_CONST(0.98668494626014669), - FRAC_CONST(0.98693327685367771), - FRAC_CONST(0.98717928509787434), - FRAC_CONST(0.98742297041385541), - FRAC_CONST(0.98766433222820571), - FRAC_CONST(0.98790336997297779), - FRAC_CONST(0.98814008308569257), - FRAC_CONST(0.98837447100934128), - FRAC_CONST(0.98860653319238645), - FRAC_CONST(0.98883626908876354), - FRAC_CONST(0.98906367815788154), - FRAC_CONST(0.98928875986462517), - FRAC_CONST(0.98951151367935519), - FRAC_CONST(0.98973193907791057), - FRAC_CONST(0.98995003554160899), - FRAC_CONST(0.9901658025572484), - FRAC_CONST(0.99037923961710816), - FRAC_CONST(0.99059034621895015), - FRAC_CONST(0.99079912186602037), - FRAC_CONST(0.99100556606704937), - FRAC_CONST(0.99120967833625406), - FRAC_CONST(0.99141145819333854), - FRAC_CONST(0.99161090516349537), - FRAC_CONST(0.99180801877740643), - FRAC_CONST(0.99200279857124452), - FRAC_CONST(0.99219524408667392), - FRAC_CONST(0.99238535487085167), - FRAC_CONST(0.99257313047642881), - FRAC_CONST(0.99275857046155114), - FRAC_CONST(0.99294167438986047), - FRAC_CONST(0.99312244183049558), - FRAC_CONST(0.99330087235809328), - FRAC_CONST(0.99347696555278919), - FRAC_CONST(0.99365072100021912), - FRAC_CONST(0.99382213829151966), - FRAC_CONST(0.99399121702332938), - FRAC_CONST(0.99415795679778973), - FRAC_CONST(0.99432235722254581), - FRAC_CONST(0.9944844179107476), - FRAC_CONST(0.99464413848105071), - FRAC_CONST(0.99480151855761711), - FRAC_CONST(0.99495655777011638), - FRAC_CONST(0.99510925575372611), - FRAC_CONST(0.99525961214913339), - FRAC_CONST(0.9954076266025349), - FRAC_CONST(0.99555329876563847), - FRAC_CONST(0.99569662829566352), - FRAC_CONST(0.99583761485534161), - FRAC_CONST(0.99597625811291779), - FRAC_CONST(0.99611255774215113), - FRAC_CONST(0.99624651342231552), - FRAC_CONST(0.99637812483820021), - FRAC_CONST(0.99650739168011082), - FRAC_CONST(0.9966343136438699), - FRAC_CONST(0.996758890430818), - FRAC_CONST(0.99688112174781385), - FRAC_CONST(0.99700100730723529), - FRAC_CONST(0.99711854682697998), - FRAC_CONST(0.99723374003046616), - FRAC_CONST(0.99734658664663323), - FRAC_CONST(0.99745708640994191), - FRAC_CONST(0.99756523906037575), - FRAC_CONST(0.997671044343441), - FRAC_CONST(0.99777450201016782), - FRAC_CONST(0.99787561181711015), - FRAC_CONST(0.99797437352634699), - FRAC_CONST(0.99807078690548234), - FRAC_CONST(0.99816485172764624), - FRAC_CONST(0.99825656777149518), - FRAC_CONST(0.99834593482121237), - FRAC_CONST(0.99843295266650844), - FRAC_CONST(0.99851762110262221), - FRAC_CONST(0.99859993993032037), - FRAC_CONST(0.99867990895589909), - FRAC_CONST(0.99875752799118334), - FRAC_CONST(0.99883279685352799), - FRAC_CONST(0.99890571536581829), - FRAC_CONST(0.99897628335646982), - FRAC_CONST(0.99904450065942929), - FRAC_CONST(0.99911036711417489), - FRAC_CONST(0.99917388256571638), - FRAC_CONST(0.99923504686459585), - FRAC_CONST(0.99929385986688779), - FRAC_CONST(0.99935032143419944), - FRAC_CONST(0.9994044314336713), - FRAC_CONST(0.99945618973797734), - FRAC_CONST(0.99950559622532531), - FRAC_CONST(0.99955265077945699), - FRAC_CONST(0.99959735328964838), - FRAC_CONST(0.9996397036507102), - FRAC_CONST(0.99967970176298793), - FRAC_CONST(0.99971734753236219), - FRAC_CONST(0.99975264087024884), - FRAC_CONST(0.99978558169359921), - FRAC_CONST(0.99981616992490041), - FRAC_CONST(0.99984440549217524), - FRAC_CONST(0.99987028832898295), - FRAC_CONST(0.99989381837441849), - FRAC_CONST(0.99991499557311347), - FRAC_CONST(0.999933819875236), - FRAC_CONST(0.99995029123649048), - FRAC_CONST(0.99996440961811828), - FRAC_CONST(0.99997617498689761), - FRAC_CONST(0.9999855873151432), - FRAC_CONST(0.99999264658070719), - FRAC_CONST(0.99999735276697821), - FRAC_CONST(0.99999970586288223) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t sine_long_960[] = -{ - FRAC_CONST(0.00081812299560725323), - FRAC_CONST(0.0024543667964602917), - FRAC_CONST(0.0040906040262347889), - FRAC_CONST(0.0057268303042312674), - FRAC_CONST(0.0073630412497795667), - FRAC_CONST(0.0089992324822505774), - FRAC_CONST(0.010635399621067975), - FRAC_CONST(0.012271538285719924), - FRAC_CONST(0.013907644095770845), - FRAC_CONST(0.015543712670873098), - FRAC_CONST(0.017179739630778748), - FRAC_CONST(0.018815720595351273), - FRAC_CONST(0.020451651184577292), - FRAC_CONST(0.022087527018578291), - FRAC_CONST(0.023723343717622358), - FRAC_CONST(0.025359096902135895), - FRAC_CONST(0.02699478219271537), - FRAC_CONST(0.028630395210139003), - FRAC_CONST(0.030265931575378519), - FRAC_CONST(0.031901386909610863), - FRAC_CONST(0.033536756834229922), - FRAC_CONST(0.035172036970858266), - FRAC_CONST(0.036807222941358832), - FRAC_CONST(0.038442310367846677), - FRAC_CONST(0.040077294872700696), - FRAC_CONST(0.041712172078575326), - FRAC_CONST(0.043346937608412288), - FRAC_CONST(0.044981587085452281), - FRAC_CONST(0.046616116133246711), - FRAC_CONST(0.048250520375669431), - FRAC_CONST(0.049884795436928406), - FRAC_CONST(0.051518936941577477), - FRAC_CONST(0.053152940514528055), - FRAC_CONST(0.05478680178106083), - FRAC_CONST(0.056420516366837495), - FRAC_CONST(0.05805407989791244), - FRAC_CONST(0.059687488000744485), - FRAC_CONST(0.061320736302208578), - FRAC_CONST(0.062953820429607482), - FRAC_CONST(0.064586736010683557), - FRAC_CONST(0.066219478673630344), - FRAC_CONST(0.06785204404710439), - FRAC_CONST(0.069484427760236861), - FRAC_CONST(0.071116625442645326), - FRAC_CONST(0.072748632724445372), - FRAC_CONST(0.07438044523626236), - FRAC_CONST(0.076012058609243122), - FRAC_CONST(0.077643468475067631), - FRAC_CONST(0.079274670465960706), - FRAC_CONST(0.080905660214703745), - FRAC_CONST(0.082536433354646319), - FRAC_CONST(0.084166985519717977), - FRAC_CONST(0.085797312344439894), - FRAC_CONST(0.08742740946393647), - FRAC_CONST(0.089057272513947183), - FRAC_CONST(0.090686897130838162), - FRAC_CONST(0.092316278951613845), - FRAC_CONST(0.093945413613928788), - FRAC_CONST(0.095574296756099186), - FRAC_CONST(0.097202924017114667), - FRAC_CONST(0.098831291036649963), - FRAC_CONST(0.10045939345507648), - FRAC_CONST(0.10208722691347409), - FRAC_CONST(0.10371478705364276), - FRAC_CONST(0.10534206951811415), - FRAC_CONST(0.10696906995016341), - FRAC_CONST(0.10859578399382072), - FRAC_CONST(0.11022220729388306), - FRAC_CONST(0.11184833549592579), - FRAC_CONST(0.11347416424631435), - FRAC_CONST(0.11509968919221586), - FRAC_CONST(0.11672490598161089), - FRAC_CONST(0.11834981026330495), - FRAC_CONST(0.11997439768694031), - FRAC_CONST(0.12159866390300751), - FRAC_CONST(0.12322260456285709), - FRAC_CONST(0.12484621531871121), - FRAC_CONST(0.12646949182367517), - FRAC_CONST(0.12809242973174936), - FRAC_CONST(0.12971502469784052), - FRAC_CONST(0.13133727237777362), - FRAC_CONST(0.13295916842830346), - FRAC_CONST(0.13458070850712617), - FRAC_CONST(0.13620188827289101), - FRAC_CONST(0.1378227033852118), - FRAC_CONST(0.13944314950467873), - FRAC_CONST(0.14106322229286994), - FRAC_CONST(0.14268291741236291), - FRAC_CONST(0.14430223052674654), - FRAC_CONST(0.1459211573006321), - FRAC_CONST(0.14753969339966552), - FRAC_CONST(0.14915783449053857), - FRAC_CONST(0.15077557624100058), - FRAC_CONST(0.15239291431987001), - FRAC_CONST(0.1540098443970461), - FRAC_CONST(0.15562636214352044), - FRAC_CONST(0.15724246323138855), - FRAC_CONST(0.15885814333386142), - FRAC_CONST(0.16047339812527725), - FRAC_CONST(0.16208822328111283), - FRAC_CONST(0.16370261447799525), - FRAC_CONST(0.16531656739371339), - FRAC_CONST(0.16693007770722967), - FRAC_CONST(0.16854314109869134), - FRAC_CONST(0.17015575324944232), - FRAC_CONST(0.17176790984203447), - FRAC_CONST(0.17337960656023954), - FRAC_CONST(0.1749908390890603), - FRAC_CONST(0.17660160311474243), - FRAC_CONST(0.17821189432478593), - FRAC_CONST(0.17982170840795647), - FRAC_CONST(0.18143104105429744), - FRAC_CONST(0.18303988795514095), - FRAC_CONST(0.1846482448031197), - FRAC_CONST(0.18625610729217834), - FRAC_CONST(0.1878634711175852), - FRAC_CONST(0.18947033197594348), - FRAC_CONST(0.19107668556520319), - FRAC_CONST(0.19268252758467228), - FRAC_CONST(0.19428785373502844), - FRAC_CONST(0.19589265971833042), - FRAC_CONST(0.19749694123802966), - FRAC_CONST(0.19910069399898173), - FRAC_CONST(0.20070391370745785), - FRAC_CONST(0.20230659607115639), - FRAC_CONST(0.20390873679921437), - FRAC_CONST(0.20551033160221882), - FRAC_CONST(0.20711137619221856), - FRAC_CONST(0.2087118662827353), - FRAC_CONST(0.21031179758877552), - FRAC_CONST(0.21191116582684155), - FRAC_CONST(0.21350996671494335), - FRAC_CONST(0.21510819597260972), - FRAC_CONST(0.21670584932089998), - FRAC_CONST(0.2183029224824154), - FRAC_CONST(0.21989941118131037), - FRAC_CONST(0.22149531114330431), - FRAC_CONST(0.22309061809569264), - FRAC_CONST(0.22468532776735861), - FRAC_CONST(0.22627943588878449), - FRAC_CONST(0.22787293819206314), - FRAC_CONST(0.22946583041090929), - FRAC_CONST(0.23105810828067114), - FRAC_CONST(0.23264976753834157), - FRAC_CONST(0.23424080392256985), - FRAC_CONST(0.2358312131736727), - FRAC_CONST(0.23742099103364595), - FRAC_CONST(0.23901013324617584), - FRAC_CONST(0.24059863555665045), - FRAC_CONST(0.24218649371217096), - FRAC_CONST(0.24377370346156332), - FRAC_CONST(0.24536026055538934), - FRAC_CONST(0.24694616074595824), - FRAC_CONST(0.24853139978733788), - FRAC_CONST(0.25011597343536629), - FRAC_CONST(0.25169987744766298), - FRAC_CONST(0.25328310758364025), - FRAC_CONST(0.25486565960451457), - FRAC_CONST(0.25644752927331788), - FRAC_CONST(0.25802871235490898), - FRAC_CONST(0.25960920461598508), - FRAC_CONST(0.26118900182509258), - FRAC_CONST(0.26276809975263904), - FRAC_CONST(0.264346494170904), - FRAC_CONST(0.26592418085405067), - FRAC_CONST(0.26750115557813692), - FRAC_CONST(0.2690774141211269), - FRAC_CONST(0.27065295226290209), - FRAC_CONST(0.2722277657852728), - FRAC_CONST(0.27380185047198918), - FRAC_CONST(0.27537520210875299), - FRAC_CONST(0.2769478164832283), - FRAC_CONST(0.27851968938505312), - FRAC_CONST(0.28009081660585067), - FRAC_CONST(0.28166119393924061), - FRAC_CONST(0.28323081718085019), - FRAC_CONST(0.28479968212832563), - FRAC_CONST(0.28636778458134327), - FRAC_CONST(0.28793512034162105), - FRAC_CONST(0.2895016852129294), - FRAC_CONST(0.29106747500110264), - FRAC_CONST(0.29263248551405047), - FRAC_CONST(0.2941967125617686), - FRAC_CONST(0.29576015195635058), - FRAC_CONST(0.29732279951199847), - FRAC_CONST(0.29888465104503475), - FRAC_CONST(0.30044570237391266), - FRAC_CONST(0.30200594931922808), - FRAC_CONST(0.30356538770373032), - FRAC_CONST(0.30512401335233358), - FRAC_CONST(0.30668182209212791), - FRAC_CONST(0.3082388097523906), - FRAC_CONST(0.30979497216459695), - FRAC_CONST(0.31135030516243201), - FRAC_CONST(0.3129048045818012), - FRAC_CONST(0.31445846626084178), - FRAC_CONST(0.31601128603993378), - FRAC_CONST(0.31756325976171151), - FRAC_CONST(0.31911438327107416), - FRAC_CONST(0.32066465241519732), - FRAC_CONST(0.32221406304354389), - FRAC_CONST(0.3237626110078754), - FRAC_CONST(0.32531029216226293), - FRAC_CONST(0.32685710236309828), - FRAC_CONST(0.32840303746910487), - FRAC_CONST(0.32994809334134939), - FRAC_CONST(0.3314922658432522), - FRAC_CONST(0.33303555084059877), - FRAC_CONST(0.33457794420155085), - FRAC_CONST(0.33611944179665709), - FRAC_CONST(0.33766003949886464), - FRAC_CONST(0.33919973318352969), - FRAC_CONST(0.34073851872842903), - FRAC_CONST(0.34227639201377064), - FRAC_CONST(0.34381334892220483), - FRAC_CONST(0.34534938533883547), - FRAC_CONST(0.34688449715123082), - FRAC_CONST(0.34841868024943456), - FRAC_CONST(0.34995193052597684), - FRAC_CONST(0.35148424387588523), - FRAC_CONST(0.3530156161966958), - FRAC_CONST(0.35454604338846402), - FRAC_CONST(0.35607552135377557), - FRAC_CONST(0.35760404599775775), - FRAC_CONST(0.35913161322809023), - FRAC_CONST(0.36065821895501554), - FRAC_CONST(0.36218385909135092), - FRAC_CONST(0.36370852955249849), - FRAC_CONST(0.36523222625645668), - FRAC_CONST(0.36675494512383078), - FRAC_CONST(0.36827668207784414), - FRAC_CONST(0.36979743304434909), - FRAC_CONST(0.37131719395183754), - FRAC_CONST(0.37283596073145214), - FRAC_CONST(0.37435372931699717), - FRAC_CONST(0.37587049564494951), - FRAC_CONST(0.37738625565446909), - FRAC_CONST(0.37890100528741022), - FRAC_CONST(0.38041474048833229), - FRAC_CONST(0.38192745720451066), - FRAC_CONST(0.38343915138594736), - FRAC_CONST(0.38494981898538222), - FRAC_CONST(0.38645945595830333), - FRAC_CONST(0.38796805826295838), - FRAC_CONST(0.38947562186036483), - FRAC_CONST(0.39098214271432141), - FRAC_CONST(0.39248761679141814), - FRAC_CONST(0.3939920400610481), - FRAC_CONST(0.39549540849541737), - FRAC_CONST(0.39699771806955625), - FRAC_CONST(0.39849896476132979), - FRAC_CONST(0.39999914455144892), - FRAC_CONST(0.40149825342348083), - FRAC_CONST(0.4029962873638599), - FRAC_CONST(0.40449324236189854), - FRAC_CONST(0.40598911440979762), - FRAC_CONST(0.40748389950265762), - FRAC_CONST(0.40897759363848879), - FRAC_CONST(0.41047019281822261), - FRAC_CONST(0.41196169304572178), - FRAC_CONST(0.4134520903277914), - FRAC_CONST(0.41494138067418929), - FRAC_CONST(0.41642956009763715), - FRAC_CONST(0.41791662461383078), - FRAC_CONST(0.41940257024145089), - FRAC_CONST(0.42088739300217382), - FRAC_CONST(0.42237108892068231), - FRAC_CONST(0.42385365402467584), - FRAC_CONST(0.42533508434488143), - FRAC_CONST(0.42681537591506419), - FRAC_CONST(0.42829452477203828), - FRAC_CONST(0.42977252695567697), - FRAC_CONST(0.43124937850892364), - FRAC_CONST(0.4327250754778022), - FRAC_CONST(0.43419961391142781), - FRAC_CONST(0.43567298986201736), - FRAC_CONST(0.43714519938489987), - FRAC_CONST(0.43861623853852766), - FRAC_CONST(0.44008610338448595), - FRAC_CONST(0.44155478998750436), - FRAC_CONST(0.44302229441546676), - FRAC_CONST(0.4444886127394222), - FRAC_CONST(0.44595374103359531), - FRAC_CONST(0.44741767537539667), - FRAC_CONST(0.44888041184543348), - FRAC_CONST(0.45034194652752002), - FRAC_CONST(0.45180227550868812), - FRAC_CONST(0.45326139487919759), - FRAC_CONST(0.45471930073254679), - FRAC_CONST(0.45617598916548296), - FRAC_CONST(0.45763145627801283), - FRAC_CONST(0.45908569817341294), - FRAC_CONST(0.46053871095824001), - FRAC_CONST(0.46199049074234161), - FRAC_CONST(0.46344103363886635), - FRAC_CONST(0.46489033576427435), - FRAC_CONST(0.46633839323834758), - FRAC_CONST(0.46778520218420055), - FRAC_CONST(0.46923075872829029), - FRAC_CONST(0.47067505900042683), - FRAC_CONST(0.47211809913378361), - FRAC_CONST(0.47355987526490806), - FRAC_CONST(0.47500038353373153), - FRAC_CONST(0.47643962008357982), - FRAC_CONST(0.47787758106118372), - FRAC_CONST(0.47931426261668875), - FRAC_CONST(0.48074966090366611), - FRAC_CONST(0.48218377207912272), - FRAC_CONST(0.48361659230351117), - FRAC_CONST(0.48504811774074069), - FRAC_CONST(0.48647834455818684), - FRAC_CONST(0.48790726892670194), - FRAC_CONST(0.48933488702062544), - FRAC_CONST(0.49076119501779414), - FRAC_CONST(0.49218618909955225), - FRAC_CONST(0.4936098654507618), - FRAC_CONST(0.49503222025981269), - FRAC_CONST(0.49645324971863303), - FRAC_CONST(0.49787295002269943), - FRAC_CONST(0.49929131737104687), - FRAC_CONST(0.50070834796627917), - FRAC_CONST(0.50212403801457872), - FRAC_CONST(0.50353838372571758), - FRAC_CONST(0.50495138131306638), - FRAC_CONST(0.50636302699360547), - FRAC_CONST(0.50777331698793449), - FRAC_CONST(0.50918224752028263), - FRAC_CONST(0.51058981481851906), - FRAC_CONST(0.51199601511416237), - FRAC_CONST(0.51340084464239111), - FRAC_CONST(0.51480429964205421), - FRAC_CONST(0.51620637635567967), - FRAC_CONST(0.51760707102948678), - FRAC_CONST(0.51900637991339404), - FRAC_CONST(0.5204042992610306), - FRAC_CONST(0.52180082532974559), - FRAC_CONST(0.5231959543806185), - FRAC_CONST(0.52458968267846895), - FRAC_CONST(0.52598200649186677), - FRAC_CONST(0.52737292209314235), - FRAC_CONST(0.52876242575839572), - FRAC_CONST(0.53015051376750777), - FRAC_CONST(0.53153718240414882), - FRAC_CONST(0.53292242795578992), - FRAC_CONST(0.53430624671371152), - FRAC_CONST(0.53568863497301467), - FRAC_CONST(0.5370695890326298), - FRAC_CONST(0.5384491051953274), - FRAC_CONST(0.53982717976772743), - FRAC_CONST(0.54120380906030963), - FRAC_CONST(0.54257898938742311), - FRAC_CONST(0.54395271706729609), - FRAC_CONST(0.54532498842204646), - FRAC_CONST(0.54669579977769045), - FRAC_CONST(0.54806514746415402), - FRAC_CONST(0.54943302781528081), - FRAC_CONST(0.55079943716884383), - FRAC_CONST(0.55216437186655387), - FRAC_CONST(0.55352782825406999), - FRAC_CONST(0.55488980268100907), - FRAC_CONST(0.55625029150095584), - FRAC_CONST(0.55760929107147217), - FRAC_CONST(0.55896679775410718), - FRAC_CONST(0.56032280791440714), - FRAC_CONST(0.56167731792192455), - FRAC_CONST(0.56303032415022869), - FRAC_CONST(0.56438182297691453), - FRAC_CONST(0.56573181078361312), - FRAC_CONST(0.56708028395600085), - FRAC_CONST(0.56842723888380908), - FRAC_CONST(0.56977267196083425), - FRAC_CONST(0.57111657958494688), - FRAC_CONST(0.5724589581581021), - FRAC_CONST(0.57379980408634845), - FRAC_CONST(0.57513911377983773), - FRAC_CONST(0.57647688365283478), - FRAC_CONST(0.57781311012372738), - FRAC_CONST(0.57914778961503466), - FRAC_CONST(0.58048091855341843), - FRAC_CONST(0.5818124933696911), - FRAC_CONST(0.58314251049882604), - FRAC_CONST(0.58447096637996743), - FRAC_CONST(0.58579785745643886), - FRAC_CONST(0.5871231801757536), - FRAC_CONST(0.58844693098962408), - FRAC_CONST(0.58976910635397084), - FRAC_CONST(0.59108970272893235), - FRAC_CONST(0.59240871657887517), - FRAC_CONST(0.59372614437240179), - FRAC_CONST(0.59504198258236196), - FRAC_CONST(0.5963562276858605), - FRAC_CONST(0.59766887616426767), - FRAC_CONST(0.5989799245032289), - FRAC_CONST(0.60028936919267273), - FRAC_CONST(0.60159720672682204), - FRAC_CONST(0.60290343360420195), - FRAC_CONST(0.60420804632765002), - FRAC_CONST(0.60551104140432543), - FRAC_CONST(0.60681241534571839), - FRAC_CONST(0.60811216466765883), - FRAC_CONST(0.60941028589032709), - FRAC_CONST(0.61070677553826169), - FRAC_CONST(0.61200163014036979), - FRAC_CONST(0.61329484622993602), - FRAC_CONST(0.6145864203446314), - FRAC_CONST(0.61587634902652377), - FRAC_CONST(0.61716462882208556), - FRAC_CONST(0.61845125628220421), - FRAC_CONST(0.61973622796219074), - FRAC_CONST(0.6210195404217892), - FRAC_CONST(0.62230119022518593), - FRAC_CONST(0.62358117394101897), - FRAC_CONST(0.62485948814238634), - FRAC_CONST(0.62613612940685637), - FRAC_CONST(0.62741109431647646), - FRAC_CONST(0.62868437945778133), - FRAC_CONST(0.62995598142180387), - FRAC_CONST(0.6312258968040827), - FRAC_CONST(0.63249412220467238), - FRAC_CONST(0.63376065422815175), - FRAC_CONST(0.63502548948363347), - FRAC_CONST(0.63628862458477287), - FRAC_CONST(0.63755005614977711), - FRAC_CONST(0.63880978080141437), - FRAC_CONST(0.6400677951670225), - FRAC_CONST(0.6413240958785188), - FRAC_CONST(0.64257867957240766), - FRAC_CONST(0.6438315428897915), - FRAC_CONST(0.64508268247637779), - FRAC_CONST(0.64633209498248945), - FRAC_CONST(0.64757977706307335), - FRAC_CONST(0.64882572537770888), - FRAC_CONST(0.65006993659061751), - FRAC_CONST(0.65131240737067142), - FRAC_CONST(0.65255313439140239), - FRAC_CONST(0.65379211433101081), - FRAC_CONST(0.65502934387237444), - FRAC_CONST(0.6562648197030575), - FRAC_CONST(0.65749853851531959), - FRAC_CONST(0.65873049700612374), - FRAC_CONST(0.65996069187714679), - FRAC_CONST(0.66118911983478657), - FRAC_CONST(0.66241577759017178), - FRAC_CONST(0.66364066185917048), - FRAC_CONST(0.66486376936239888), - FRAC_CONST(0.66608509682523009), - FRAC_CONST(0.66730464097780284), - FRAC_CONST(0.66852239855503071), - FRAC_CONST(0.66973836629660977), - FRAC_CONST(0.67095254094702894), - FRAC_CONST(0.67216491925557675), - FRAC_CONST(0.67337549797635199), - FRAC_CONST(0.67458427386827102), - FRAC_CONST(0.67579124369507693), - FRAC_CONST(0.67699640422534846), - FRAC_CONST(0.67819975223250772), - FRAC_CONST(0.6794012844948305), - FRAC_CONST(0.68060099779545302), - FRAC_CONST(0.68179888892238183), - FRAC_CONST(0.6829949546685018), - FRAC_CONST(0.68418919183158522), - FRAC_CONST(0.68538159721429948), - FRAC_CONST(0.6865721676242168), - FRAC_CONST(0.68776089987382172), - FRAC_CONST(0.68894779078052026), - FRAC_CONST(0.69013283716664853), - FRAC_CONST(0.69131603585948032), - FRAC_CONST(0.69249738369123692), - FRAC_CONST(0.69367687749909468), - FRAC_CONST(0.69485451412519361), - FRAC_CONST(0.69603029041664599), - FRAC_CONST(0.6972042032255451), - FRAC_CONST(0.6983762494089728), - FRAC_CONST(0.69954642582900894), - FRAC_CONST(0.70071472935273893), - FRAC_CONST(0.70188115685226271), - FRAC_CONST(0.703045705204703), - FRAC_CONST(0.70420837129221303), - FRAC_CONST(0.70536915200198613), - FRAC_CONST(0.70652804422626281), - FRAC_CONST(0.70768504486233985), - FRAC_CONST(0.70884015081257845), - FRAC_CONST(0.70999335898441229), - FRAC_CONST(0.711144666290356), - FRAC_CONST(0.71229406964801356), - FRAC_CONST(0.71344156598008623), - FRAC_CONST(0.71458715221438096), - FRAC_CONST(0.71573082528381871), - FRAC_CONST(0.71687258212644234), - FRAC_CONST(0.7180124196854254), - FRAC_CONST(0.71915033490907943), - FRAC_CONST(0.72028632475086318), - FRAC_CONST(0.72142038616938997), - FRAC_CONST(0.72255251612843596), - FRAC_CONST(0.72368271159694852), - FRAC_CONST(0.72481096954905444), - FRAC_CONST(0.72593728696406756), - FRAC_CONST(0.72706166082649704), - FRAC_CONST(0.72818408812605595), - FRAC_CONST(0.72930456585766834), - FRAC_CONST(0.73042309102147851), - FRAC_CONST(0.73153966062285747), - FRAC_CONST(0.73265427167241282), - FRAC_CONST(0.73376692118599507), - FRAC_CONST(0.73487760618470677), - FRAC_CONST(0.73598632369490979), - FRAC_CONST(0.73709307074823405), - FRAC_CONST(0.73819784438158409), - FRAC_CONST(0.73930064163714881), - FRAC_CONST(0.74040145956240788), - FRAC_CONST(0.74150029521014049), - FRAC_CONST(0.74259714563843304), - FRAC_CONST(0.74369200791068657), - FRAC_CONST(0.74478487909562552), - FRAC_CONST(0.74587575626730485), - FRAC_CONST(0.74696463650511791), - FRAC_CONST(0.74805151689380456), - FRAC_CONST(0.74913639452345926), - FRAC_CONST(0.75021926648953785), - FRAC_CONST(0.75130012989286621), - FRAC_CONST(0.7523789818396478), - FRAC_CONST(0.75345581944147111), - FRAC_CONST(0.75453063981531809), - FRAC_CONST(0.75560344008357094), - FRAC_CONST(0.75667421737402052), - FRAC_CONST(0.7577429688198738), - FRAC_CONST(0.75880969155976163), - FRAC_CONST(0.75987438273774599), - FRAC_CONST(0.76093703950332836), - FRAC_CONST(0.76199765901145666), - FRAC_CONST(0.76305623842253345), - FRAC_CONST(0.76411277490242291), - FRAC_CONST(0.76516726562245885), - FRAC_CONST(0.76621970775945258), - FRAC_CONST(0.76727009849569949), - FRAC_CONST(0.76831843501898767), - FRAC_CONST(0.76936471452260458), - FRAC_CONST(0.77040893420534517), - FRAC_CONST(0.77145109127151923), - FRAC_CONST(0.77249118293095853), - FRAC_CONST(0.77352920639902467), - FRAC_CONST(0.77456515889661659), - FRAC_CONST(0.77559903765017746), - FRAC_CONST(0.7766308398917029), - FRAC_CONST(0.77766056285874774), - FRAC_CONST(0.77868820379443371), - FRAC_CONST(0.77971375994745684), - FRAC_CONST(0.78073722857209438), - FRAC_CONST(0.7817586069282132), - FRAC_CONST(0.78277789228127592), - FRAC_CONST(0.78379508190234881), - FRAC_CONST(0.78481017306810918), - FRAC_CONST(0.78582316306085265), - FRAC_CONST(0.78683404916849986), - FRAC_CONST(0.78784282868460476), - FRAC_CONST(0.78884949890836087), - FRAC_CONST(0.78985405714460888), - FRAC_CONST(0.7908565007038445), - FRAC_CONST(0.79185682690222425), - FRAC_CONST(0.79285503306157412), - FRAC_CONST(0.79385111650939566), - FRAC_CONST(0.79484507457887377), - FRAC_CONST(0.79583690460888357), - FRAC_CONST(0.79682660394399751), - FRAC_CONST(0.79781416993449272), - FRAC_CONST(0.79879959993635785), - FRAC_CONST(0.7997828913113002), - FRAC_CONST(0.80076404142675273), - FRAC_CONST(0.80174304765588156), - FRAC_CONST(0.80271990737759213), - FRAC_CONST(0.80369461797653707), - FRAC_CONST(0.80466717684312306), - FRAC_CONST(0.80563758137351682), - FRAC_CONST(0.80660582896965372), - FRAC_CONST(0.80757191703924336), - FRAC_CONST(0.80853584299577752), - FRAC_CONST(0.80949760425853612), - FRAC_CONST(0.81045719825259477), - FRAC_CONST(0.81141462240883167), - FRAC_CONST(0.81236987416393436), - FRAC_CONST(0.81332295096040608), - FRAC_CONST(0.81427385024657373), - FRAC_CONST(0.81522256947659355), - FRAC_CONST(0.81616910611045879), - FRAC_CONST(0.817113457614006), - FRAC_CONST(0.81805562145892186), - FRAC_CONST(0.81899559512275044), - FRAC_CONST(0.81993337608889916), - FRAC_CONST(0.82086896184664637), - FRAC_CONST(0.8218023498911472), - FRAC_CONST(0.82273353772344116), - FRAC_CONST(0.82366252285045805), - FRAC_CONST(0.82458930278502529), - FRAC_CONST(0.82551387504587381), - FRAC_CONST(0.82643623715764558), - FRAC_CONST(0.82735638665089983), - FRAC_CONST(0.82827432106211907), - FRAC_CONST(0.82919003793371693), - FRAC_CONST(0.83010353481404364), - FRAC_CONST(0.83101480925739324), - FRAC_CONST(0.83192385882400965), - FRAC_CONST(0.83283068108009373), - FRAC_CONST(0.8337352735978093), - FRAC_CONST(0.83463763395529011), - FRAC_CONST(0.83553775973664579), - FRAC_CONST(0.83643564853196872), - FRAC_CONST(0.83733129793734051), - FRAC_CONST(0.83822470555483797), - FRAC_CONST(0.83911586899254031), - FRAC_CONST(0.84000478586453453), - FRAC_CONST(0.84089145379092289), - FRAC_CONST(0.84177587039782842), - FRAC_CONST(0.84265803331740163), - FRAC_CONST(0.84353794018782702), - FRAC_CONST(0.844415588653329), - FRAC_CONST(0.8452909763641786), - FRAC_CONST(0.84616410097669936), - FRAC_CONST(0.84703496015327406), - FRAC_CONST(0.84790355156235053), - FRAC_CONST(0.84876987287844818), - FRAC_CONST(0.8496339217821639), - FRAC_CONST(0.85049569596017938), - FRAC_CONST(0.85135519310526508), - FRAC_CONST(0.85221241091628896), - FRAC_CONST(0.85306734709822085), - FRAC_CONST(0.85391999936213903), - FRAC_CONST(0.85477036542523732), - FRAC_CONST(0.85561844301082923), - FRAC_CONST(0.85646422984835635), - FRAC_CONST(0.85730772367339259), - FRAC_CONST(0.85814892222765116), - FRAC_CONST(0.85898782325899026), - FRAC_CONST(0.85982442452141961), - FRAC_CONST(0.86065872377510555), - FRAC_CONST(0.86149071878637817), - FRAC_CONST(0.8623204073277364), - FRAC_CONST(0.86314778717785412), - FRAC_CONST(0.8639728561215867), - FRAC_CONST(0.86479561194997623), - FRAC_CONST(0.86561605246025763), - FRAC_CONST(0.86643417545586487), - FRAC_CONST(0.8672499787464365), - FRAC_CONST(0.86806346014782154), - FRAC_CONST(0.8688746174820855), - FRAC_CONST(0.86968344857751589), - FRAC_CONST(0.87048995126862883), - FRAC_CONST(0.87129412339617363), - FRAC_CONST(0.87209596280713941), - FRAC_CONST(0.8728954673547612), - FRAC_CONST(0.87369263489852422), - FRAC_CONST(0.87448746330417149), - FRAC_CONST(0.87527995044370765), - FRAC_CONST(0.8760700941954066), - FRAC_CONST(0.87685789244381551), - FRAC_CONST(0.87764334307976144), - FRAC_CONST(0.87842644400035663), - FRAC_CONST(0.8792071931090043), - FRAC_CONST(0.87998558831540408), - FRAC_CONST(0.88076162753555787), - FRAC_CONST(0.88153530869177488), - FRAC_CONST(0.88230662971267804), - FRAC_CONST(0.88307558853320878), - FRAC_CONST(0.88384218309463292), - FRAC_CONST(0.8846064113445461), - FRAC_CONST(0.88536827123687933), - FRAC_CONST(0.88612776073190425), - FRAC_CONST(0.88688487779623937), - FRAC_CONST(0.88763962040285393), - FRAC_CONST(0.8883919865310751), - FRAC_CONST(0.88914197416659235), - FRAC_CONST(0.88988958130146301), - FRAC_CONST(0.8906348059341177), - FRAC_CONST(0.89137764606936609), - FRAC_CONST(0.89211809971840139), - FRAC_CONST(0.89285616489880615), - FRAC_CONST(0.89359183963455813), - FRAC_CONST(0.89432512195603453), - FRAC_CONST(0.89505600990001799), - FRAC_CONST(0.89578450150970124), - FRAC_CONST(0.8965105948346932), - FRAC_CONST(0.89723428793102367), - FRAC_CONST(0.89795557886114807), - FRAC_CONST(0.89867446569395382), - FRAC_CONST(0.89939094650476448), - FRAC_CONST(0.90010501937534515), - FRAC_CONST(0.900816682393908), - FRAC_CONST(0.90152593365511691), - FRAC_CONST(0.90223277126009283), - FRAC_CONST(0.90293719331641886), - FRAC_CONST(0.90363919793814496), - FRAC_CONST(0.90433878324579353), - FRAC_CONST(0.90503594736636439), - FRAC_CONST(0.90573068843333915), - FRAC_CONST(0.90642300458668679), - FRAC_CONST(0.90711289397286898), - FRAC_CONST(0.90780035474484411), - FRAC_CONST(0.90848538506207266), - FRAC_CONST(0.90916798309052227), - FRAC_CONST(0.90984814700267291), - FRAC_CONST(0.9105258749775208), - FRAC_CONST(0.91120116520058425), - FRAC_CONST(0.91187401586390815), - FRAC_CONST(0.91254442516606893), - FRAC_CONST(0.9132123913121788), - FRAC_CONST(0.91387791251389161), - FRAC_CONST(0.91454098698940678), - FRAC_CONST(0.91520161296347435), - FRAC_CONST(0.91585978866739981), - FRAC_CONST(0.91651551233904871), - FRAC_CONST(0.91716878222285148), - FRAC_CONST(0.91781959656980805), - FRAC_CONST(0.91846795363749245), - FRAC_CONST(0.91911385169005766), - FRAC_CONST(0.9197572889982405), - FRAC_CONST(0.9203982638393654), - FRAC_CONST(0.92103677449734989), - FRAC_CONST(0.92167281926270861), - FRAC_CONST(0.92230639643255874), - FRAC_CONST(0.92293750431062316), - FRAC_CONST(0.92356614120723612), - FRAC_CONST(0.92419230543934783), - FRAC_CONST(0.92481599533052783), - FRAC_CONST(0.92543720921097061), - FRAC_CONST(0.92605594541749991), - FRAC_CONST(0.92667220229357261), - FRAC_CONST(0.92728597818928349), - FRAC_CONST(0.9278972714613698), - FRAC_CONST(0.92850608047321548), - FRAC_CONST(0.9291124035948557), - FRAC_CONST(0.92971623920298097), - FRAC_CONST(0.93031758568094147), - FRAC_CONST(0.93091644141875196), - FRAC_CONST(0.93151280481309506), - FRAC_CONST(0.93210667426732674), - FRAC_CONST(0.93269804819147983), - FRAC_CONST(0.93328692500226818), - FRAC_CONST(0.93387330312309147), - FRAC_CONST(0.93445718098403896), - FRAC_CONST(0.93503855702189376), - FRAC_CONST(0.9356174296801375), - FRAC_CONST(0.93619379740895381), - FRAC_CONST(0.93676765866523259), - FRAC_CONST(0.93733901191257496), - FRAC_CONST(0.93790785562129597), - FRAC_CONST(0.93847418826842988), - FRAC_CONST(0.93903800833773399), - FRAC_CONST(0.93959931431969212), - FRAC_CONST(0.94015810471151917), - FRAC_CONST(0.94071437801716529), - FRAC_CONST(0.94126813274731924), - FRAC_CONST(0.94181936741941319), - FRAC_CONST(0.94236808055762578), - FRAC_CONST(0.94291427069288691), - FRAC_CONST(0.94345793636288133), - FRAC_CONST(0.94399907611205225), - FRAC_CONST(0.9445376884916058), - FRAC_CONST(0.94507377205951448), - FRAC_CONST(0.94560732538052128), - FRAC_CONST(0.94613834702614352), - FRAC_CONST(0.94666683557467624), - FRAC_CONST(0.94719278961119657), - FRAC_CONST(0.94771620772756759), - FRAC_CONST(0.94823708852244104), - FRAC_CONST(0.94875543060126255), - FRAC_CONST(0.94927123257627433), - FRAC_CONST(0.94978449306651924), - FRAC_CONST(0.95029521069784428), - FRAC_CONST(0.9508033841029051), - FRAC_CONST(0.95130901192116835), - FRAC_CONST(0.9518120927989161), - FRAC_CONST(0.95231262538924943), - FRAC_CONST(0.95281060835209208), - FRAC_CONST(0.95330604035419386), - FRAC_CONST(0.95379892006913403), - FRAC_CONST(0.95428924617732525), - FRAC_CONST(0.95477701736601728), - FRAC_CONST(0.95526223232929941), - FRAC_CONST(0.95574488976810545), - FRAC_CONST(0.95622498839021619), - FRAC_CONST(0.95670252691026292), - FRAC_CONST(0.95717750404973156), - FRAC_CONST(0.95764991853696524), - FRAC_CONST(0.95811976910716812), - FRAC_CONST(0.95858705450240911), - FRAC_CONST(0.95905177347162429), - FRAC_CONST(0.95951392477062125), - FRAC_CONST(0.95997350716208196), - FRAC_CONST(0.96043051941556579), - FRAC_CONST(0.96088496030751369), - FRAC_CONST(0.96133682862125036), - FRAC_CONST(0.96178612314698864), - FRAC_CONST(0.96223284268183173), - FRAC_CONST(0.9626769860297768), - FRAC_CONST(0.96311855200171881), - FRAC_CONST(0.96355753941545252), - FRAC_CONST(0.96399394709567654), - FRAC_CONST(0.96442777387399625), - FRAC_CONST(0.96485901858892686), - FRAC_CONST(0.96528768008589627), - FRAC_CONST(0.96571375721724895), - FRAC_CONST(0.96613724884224783), - FRAC_CONST(0.96655815382707866), - FRAC_CONST(0.96697647104485207), - FRAC_CONST(0.96739219937560694), - FRAC_CONST(0.96780533770631338), - FRAC_CONST(0.96821588493087585), - FRAC_CONST(0.9686238399501359), - FRAC_CONST(0.96902920167187501), - FRAC_CONST(0.96943196901081796), - FRAC_CONST(0.96983214088863534), - FRAC_CONST(0.9702297162339466), - FRAC_CONST(0.97062469398232287), - FRAC_CONST(0.97101707307629004), - FRAC_CONST(0.97140685246533098), - FRAC_CONST(0.97179403110588902), - FRAC_CONST(0.97217860796137046), - FRAC_CONST(0.97256058200214734), - FRAC_CONST(0.97293995220556007), - FRAC_CONST(0.97331671755592064), - FRAC_CONST(0.97369087704451474), - FRAC_CONST(0.97406242966960455), - FRAC_CONST(0.97443137443643235), - FRAC_CONST(0.97479771035722163), - FRAC_CONST(0.97516143645118103), - FRAC_CONST(0.97552255174450631), - FRAC_CONST(0.97588105527038305), - FRAC_CONST(0.97623694606898959), - FRAC_CONST(0.97659022318749911), - FRAC_CONST(0.97694088568008242), - FRAC_CONST(0.97728893260791039), - FRAC_CONST(0.97763436303915685), - FRAC_CONST(0.97797717604900047), - FRAC_CONST(0.97831737071962765), - FRAC_CONST(0.97865494614023485), - FRAC_CONST(0.97898990140703124), - FRAC_CONST(0.97932223562324061), - FRAC_CONST(0.97965194789910426), - FRAC_CONST(0.9799790373518833), - FRAC_CONST(0.98030350310586067), - FRAC_CONST(0.98062534429234405), - FRAC_CONST(0.98094456004966768), - FRAC_CONST(0.98126114952319499), - FRAC_CONST(0.98157511186532054), - FRAC_CONST(0.98188644623547261), - FRAC_CONST(0.98219515180011563), - FRAC_CONST(0.98250122773275184), - FRAC_CONST(0.98280467321392362), - FRAC_CONST(0.98310548743121629), - FRAC_CONST(0.98340366957925973), - FRAC_CONST(0.98369921885973044), - FRAC_CONST(0.98399213448135414), - FRAC_CONST(0.98428241565990748), - FRAC_CONST(0.98457006161822058), - FRAC_CONST(0.98485507158617835), - FRAC_CONST(0.98513744480072363), - FRAC_CONST(0.98541718050585803), - FRAC_CONST(0.98569427795264519), - FRAC_CONST(0.98596873639921168), - FRAC_CONST(0.98624055511074971), - FRAC_CONST(0.98650973335951875), - FRAC_CONST(0.98677627042484772), - FRAC_CONST(0.98704016559313645), - FRAC_CONST(0.98730141815785832), - FRAC_CONST(0.98756002741956173), - FRAC_CONST(0.9878159926858715), - FRAC_CONST(0.98806931327149194), - FRAC_CONST(0.98831998849820735), - FRAC_CONST(0.98856801769488489), - FRAC_CONST(0.98881340019747566), - FRAC_CONST(0.98905613534901682), - FRAC_CONST(0.98929622249963345), - FRAC_CONST(0.98953366100653983), - FRAC_CONST(0.98976845023404181), - FRAC_CONST(0.99000058955353776), - FRAC_CONST(0.99023007834352106), - FRAC_CONST(0.99045691598958097), - FRAC_CONST(0.99068110188440506), - FRAC_CONST(0.99090263542778001), - FRAC_CONST(0.99112151602659404), - FRAC_CONST(0.99133774309483769), - FRAC_CONST(0.99155131605360625), - FRAC_CONST(0.99176223433110056), - FRAC_CONST(0.99197049736262888), - FRAC_CONST(0.99217610459060845), - FRAC_CONST(0.99237905546456673), - FRAC_CONST(0.99257934944114334), - FRAC_CONST(0.99277698598409092), - FRAC_CONST(0.99297196456427694), - FRAC_CONST(0.99316428465968509), - FRAC_CONST(0.99335394575541669), - FRAC_CONST(0.99354094734369169), - FRAC_CONST(0.99372528892385081), - FRAC_CONST(0.99390697000235606), - FRAC_CONST(0.99408599009279242), - FRAC_CONST(0.99426234871586938), - FRAC_CONST(0.99443604539942176), - FRAC_CONST(0.99460707967841133), - FRAC_CONST(0.99477545109492771), - FRAC_CONST(0.99494115919819004), - FRAC_CONST(0.99510420354454787), - FRAC_CONST(0.99526458369748239), - FRAC_CONST(0.99542229922760772), - FRAC_CONST(0.99557734971267187), - FRAC_CONST(0.9957297347375581), - FRAC_CONST(0.99587945389428578), - FRAC_CONST(0.99602650678201154), - FRAC_CONST(0.99617089300703077), - FRAC_CONST(0.996312612182778), - FRAC_CONST(0.99645166392982831), - FRAC_CONST(0.99658804787589839), - FRAC_CONST(0.99672176365584741), - FRAC_CONST(0.99685281091167788), - FRAC_CONST(0.99698118929253687), - FRAC_CONST(0.99710689845471678), - FRAC_CONST(0.99722993806165661), - FRAC_CONST(0.99735030778394196), - FRAC_CONST(0.99746800729930707), - FRAC_CONST(0.99758303629263489), - FRAC_CONST(0.99769539445595812), - FRAC_CONST(0.99780508148846014), - FRAC_CONST(0.99791209709647588), - FRAC_CONST(0.99801644099349218), - FRAC_CONST(0.99811811290014918), - FRAC_CONST(0.9982171125442405), - FRAC_CONST(0.9983134396607144), - FRAC_CONST(0.99840709399167404), - FRAC_CONST(0.99849807528637868), - FRAC_CONST(0.99858638330124405), - FRAC_CONST(0.99867201779984294), - FRAC_CONST(0.99875497855290607), - FRAC_CONST(0.99883526533832245), - FRAC_CONST(0.99891287794114036), - FRAC_CONST(0.99898781615356746), - FRAC_CONST(0.99906007977497147), - FRAC_CONST(0.99912966861188113), - FRAC_CONST(0.99919658247798593), - FRAC_CONST(0.99926082119413751), - FRAC_CONST(0.99932238458834954), - FRAC_CONST(0.999381272495798), - FRAC_CONST(0.99943748475882255), - FRAC_CONST(0.9994910212269259), - FRAC_CONST(0.99954188175677483), - FRAC_CONST(0.99959006621220048), - FRAC_CONST(0.99963557446419837), - FRAC_CONST(0.99967840639092931), - FRAC_CONST(0.99971856187771946), - FRAC_CONST(0.99975604081706027), - FRAC_CONST(0.99979084310860955), - FRAC_CONST(0.99982296865919107), - FRAC_CONST(0.99985241738279484), - FRAC_CONST(0.99987918920057806), - FRAC_CONST(0.99990328404086426), - FRAC_CONST(0.9999247018391445), - FRAC_CONST(0.99994344253807688), - FRAC_CONST(0.99995950608748674), - FRAC_CONST(0.99997289244436727), - FRAC_CONST(0.99998360157287902), - FRAC_CONST(0.9999916334443506), - FRAC_CONST(0.99999698803727821), - FRAC_CONST(0.99999966533732598) -}; -#endif - -ALIGN static const real_t sine_short_128[] = -{ - FRAC_CONST(0.0061358846491544753), - FRAC_CONST(0.01840672990580482), - FRAC_CONST(0.030674803176636626), - FRAC_CONST(0.04293825693494082), - FRAC_CONST(0.055195244349689934), - FRAC_CONST(0.067443919563664051), - FRAC_CONST(0.079682437971430126), - FRAC_CONST(0.091908956497132724), - FRAC_CONST(0.10412163387205459), - FRAC_CONST(0.11631863091190475), - FRAC_CONST(0.12849811079379317), - FRAC_CONST(0.14065823933284921), - FRAC_CONST(0.15279718525844344), - FRAC_CONST(0.16491312048996989), - FRAC_CONST(0.17700422041214875), - FRAC_CONST(0.18906866414980619), - FRAC_CONST(0.2011046348420919), - FRAC_CONST(0.21311031991609136), - FRAC_CONST(0.22508391135979283), - FRAC_CONST(0.2370236059943672), - FRAC_CONST(0.24892760574572015), - FRAC_CONST(0.26079411791527551), - FRAC_CONST(0.27262135544994898), - FRAC_CONST(0.28440753721127188), - FRAC_CONST(0.29615088824362379), - FRAC_CONST(0.30784964004153487), - FRAC_CONST(0.31950203081601569), - FRAC_CONST(0.33110630575987643), - FRAC_CONST(0.34266071731199438), - FRAC_CONST(0.35416352542049034), - FRAC_CONST(0.36561299780477385), - FRAC_CONST(0.37700741021641826), - FRAC_CONST(0.38834504669882625), - FRAC_CONST(0.39962419984564679), - FRAC_CONST(0.41084317105790391), - FRAC_CONST(0.42200027079979968), - FRAC_CONST(0.43309381885315196), - FRAC_CONST(0.4441221445704292), - FRAC_CONST(0.45508358712634384), - FRAC_CONST(0.46597649576796618), - FRAC_CONST(0.47679923006332209), - FRAC_CONST(0.487550160148436), - FRAC_CONST(0.49822766697278187), - FRAC_CONST(0.50883014254310699), - FRAC_CONST(0.51935599016558964), - FRAC_CONST(0.52980362468629461), - FRAC_CONST(0.54017147272989285), - FRAC_CONST(0.55045797293660481), - FRAC_CONST(0.56066157619733603), - FRAC_CONST(0.57078074588696726), - FRAC_CONST(0.58081395809576453), - FRAC_CONST(0.59075970185887416), - FRAC_CONST(0.60061647938386897), - FRAC_CONST(0.61038280627630948), - FRAC_CONST(0.6200572117632891), - FRAC_CONST(0.62963823891492698), - FRAC_CONST(0.63912444486377573), - FRAC_CONST(0.64851440102211244), - FRAC_CONST(0.65780669329707864), - FRAC_CONST(0.66699992230363747), - FRAC_CONST(0.67609270357531592), - FRAC_CONST(0.68508366777270036), - FRAC_CONST(0.693971460889654), - FRAC_CONST(0.7027547444572253), - FRAC_CONST(0.71143219574521643), - FRAC_CONST(0.72000250796138165), - FRAC_CONST(0.7284643904482252), - FRAC_CONST(0.73681656887736979), - FRAC_CONST(0.74505778544146595), - FRAC_CONST(0.75318679904361241), - FRAC_CONST(0.76120238548426178), - FRAC_CONST(0.76910333764557959), - FRAC_CONST(0.77688846567323244), - FRAC_CONST(0.78455659715557524), - FRAC_CONST(0.79210657730021239), - FRAC_CONST(0.79953726910790501), - FRAC_CONST(0.80684755354379922), - FRAC_CONST(0.8140363297059483), - FRAC_CONST(0.82110251499110465), - FRAC_CONST(0.8280450452577558), - FRAC_CONST(0.83486287498638001), - FRAC_CONST(0.84155497743689833), - FRAC_CONST(0.84812034480329712), - FRAC_CONST(0.85455798836540053), - FRAC_CONST(0.86086693863776731), - FRAC_CONST(0.86704624551569265), - FRAC_CONST(0.87309497841829009), - FRAC_CONST(0.87901222642863341), - FRAC_CONST(0.88479709843093779), - FRAC_CONST(0.89044872324475788), - FRAC_CONST(0.89596624975618511), - FRAC_CONST(0.90134884704602203), - FRAC_CONST(0.90659570451491533), - FRAC_CONST(0.91170603200542988), - FRAC_CONST(0.9166790599210427), - FRAC_CONST(0.9215140393420419), - FRAC_CONST(0.92621024213831127), - FRAC_CONST(0.93076696107898371), - FRAC_CONST(0.9351835099389475), - FRAC_CONST(0.93945922360218992), - FRAC_CONST(0.94359345816196039), - FRAC_CONST(0.94758559101774109), - FRAC_CONST(0.95143502096900834), - FRAC_CONST(0.95514116830577067), - FRAC_CONST(0.9587034748958716), - FRAC_CONST(0.96212140426904158), - FRAC_CONST(0.9653944416976894), - FRAC_CONST(0.96852209427441727), - FRAC_CONST(0.97150389098625178), - FRAC_CONST(0.97433938278557586), - FRAC_CONST(0.97702814265775439), - FRAC_CONST(0.97956976568544052), - FRAC_CONST(0.98196386910955524), - FRAC_CONST(0.98421009238692903), - FRAC_CONST(0.98630809724459867), - FRAC_CONST(0.98825756773074946), - FRAC_CONST(0.99005821026229712), - FRAC_CONST(0.99170975366909953), - FRAC_CONST(0.9932119492347945), - FRAC_CONST(0.99456457073425542), - FRAC_CONST(0.99576741446765982), - FRAC_CONST(0.99682029929116567), - FRAC_CONST(0.99772306664419164), - FRAC_CONST(0.99847558057329477), - FRAC_CONST(0.99907772775264536), - FRAC_CONST(0.99952941750109314), - FRAC_CONST(0.9998305817958234), - FRAC_CONST(0.99998117528260111) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t sine_short_120[] = -{ - FRAC_CONST(0.0065449379673518581), - FRAC_CONST(0.019633692460628301), - FRAC_CONST(0.032719082821776137), - FRAC_CONST(0.045798866936520771), - FRAC_CONST(0.058870803651189033), - FRAC_CONST(0.071932653156719387), - FRAC_CONST(0.084982177372441667), - FRAC_CONST(0.09801714032956059), - FRAC_CONST(0.11103530855427769), - FRAC_CONST(0.12403445145048532), - FRAC_CONST(0.13701234168196802), - FRAC_CONST(0.14996675555404498), - FRAC_CONST(0.16289547339458874), - FRAC_CONST(0.17579627993435451), - FRAC_CONST(0.18866696468655525), - FRAC_CONST(0.2015053223256171), - FRAC_CONST(0.21430915306505074), - FRAC_CONST(0.2270762630343732), - FRAC_CONST(0.23980446465501654), - FRAC_CONST(0.25249157701515795), - FRAC_CONST(0.26513542624340797), - FRAC_CONST(0.27773384588129219), - FRAC_CONST(0.29028467725446233), - FRAC_CONST(0.3027857698425746), - FRAC_CONST(0.31523498164776964), - FRAC_CONST(0.32763017956169349), - FRAC_CONST(0.33996923973099424), - FRAC_CONST(0.35225004792123354), - FRAC_CONST(0.36447049987914965), - FRAC_CONST(0.37662850169321077), - FRAC_CONST(0.38872197015239557), - FRAC_CONST(0.40074883310314097), - FRAC_CONST(0.41270702980439467), - FRAC_CONST(0.42459451128071307), - FRAC_CONST(0.43640924067334208), - FRAC_CONST(0.44814919358922256), - FRAC_CONST(0.45981235844785984), - FRAC_CONST(0.47139673682599764), - FRAC_CONST(0.48290034380003727), - FRAC_CONST(0.49432120828614462), - FRAC_CONST(0.50565737337798455), - FRAC_CONST(0.51690689668202761), - FRAC_CONST(0.52806785065036799), - FRAC_CONST(0.53913832291100017), - FRAC_CONST(0.55011641659549337), - FRAC_CONST(0.56100025066400983), - FRAC_CONST(0.57178796022761225), - FRAC_CONST(0.58247769686780215), - FRAC_CONST(0.59306762895323706), - FRAC_CONST(0.60355594195357143), - FRAC_CONST(0.61394083875036642), - FRAC_CONST(0.62422053994501758), - FRAC_CONST(0.63439328416364549), - FRAC_CONST(0.64445732835889735), - FRAC_CONST(0.65441094810861034), - FRAC_CONST(0.66425243791128175), - FRAC_CONST(0.67398011147829784), - FRAC_CONST(0.68359230202287125), - FRAC_CONST(0.69308736254563585), - FRAC_CONST(0.70246366611685174), - FRAC_CONST(0.71171960615517138), - FRAC_CONST(0.72085359670291882), - FRAC_CONST(0.7298640726978356), - FRAC_CONST(0.73874949024124625), - FRAC_CONST(0.74750832686259672), - FRAC_CONST(0.75613908178032285), - FRAC_CONST(0.76464027615900032), - FRAC_CONST(0.77301045336273699), - FRAC_CONST(0.78124817920475853), - FRAC_CONST(0.78935204219315003), - FRAC_CONST(0.79732065377270711), - FRAC_CONST(0.80515264856285829), - FRAC_CONST(0.81284668459161513), - FRAC_CONST(0.82040144352551359), - FRAC_CONST(0.82781563089550203), - FRAC_CONST(0.83508797631874299), - FRAC_CONST(0.84221723371628654), - FRAC_CONST(0.84920218152657889), - FRAC_CONST(0.85604162291477137), - FRAC_CONST(0.86273438597779184), - FRAC_CONST(0.86927932394514362), - FRAC_CONST(0.87567531537539967), - FRAC_CONST(0.88192126434835494), - FRAC_CONST(0.88801610065280734), - FRAC_CONST(0.89395877996993212), - FRAC_CONST(0.8997482840522214), - FRAC_CONST(0.90538362089795521), - FRAC_CONST(0.91086382492117568), - FRAC_CONST(0.91618795711713596), - FRAC_CONST(0.92135510522319242), - FRAC_CONST(0.9263643838751181), - FRAC_CONST(0.93121493475880346), - FRAC_CONST(0.93590592675732565), - FRAC_CONST(0.94043655609335486), - FRAC_CONST(0.94480604646687805), - FRAC_CONST(0.94901364918821385), - FRAC_CONST(0.95305864330629697), - FRAC_CONST(0.95694033573220882), - FRAC_CONST(0.9606580613579353), - FRAC_CONST(0.96421118317032928), - FRAC_CONST(0.96759909236025976), - FRAC_CONST(0.9708212084269281), - FRAC_CONST(0.97387697927733363), - FRAC_CONST(0.97676588132087239), - FRAC_CONST(0.97948741955905139), - FRAC_CONST(0.98204112767030394), - FRAC_CONST(0.98442656808989171), - FRAC_CONST(0.98664333208487898), - FRAC_CONST(0.98869103982416728), - FRAC_CONST(0.99056934044357725), - FRAC_CONST(0.99227791210596705), - FRAC_CONST(0.99381646205637808), - FRAC_CONST(0.99518472667219682), - FRAC_CONST(0.99638247150832537), - FRAC_CONST(0.99740949133735191), - FRAC_CONST(0.99826561018471593), - FRAC_CONST(0.99895068135886012), - FRAC_CONST(0.99946458747636568), - FRAC_CONST(0.99980724048206482), - FRAC_CONST(0.99997858166412923) -}; -#endif - -#ifdef LD_DEC -ALIGN static const real_t sine_mid_512[] = -{ - FRAC_CONST(0.0015339801862847655), - FRAC_CONST(0.0046019261204485705), - FRAC_CONST(0.007669828739531097), - FRAC_CONST(0.010737659167264491), - FRAC_CONST(0.013805388528060391), - FRAC_CONST(0.01687298794728171), - FRAC_CONST(0.019940428551514441), - FRAC_CONST(0.023007681468839369), - FRAC_CONST(0.026074717829103901), - FRAC_CONST(0.029141508764193722), - FRAC_CONST(0.032208025408304586), - FRAC_CONST(0.035274238898213947), - FRAC_CONST(0.038340120373552694), - FRAC_CONST(0.041405640977076739), - FRAC_CONST(0.044470771854938668), - FRAC_CONST(0.047535484156959303), - FRAC_CONST(0.050599749036899282), - FRAC_CONST(0.05366353765273052), - FRAC_CONST(0.056726821166907748), - FRAC_CONST(0.059789570746639868), - FRAC_CONST(0.062851757564161406), - FRAC_CONST(0.065913352797003805), - FRAC_CONST(0.068974327628266746), - FRAC_CONST(0.072034653246889332), - FRAC_CONST(0.075094300847921305), - FRAC_CONST(0.078153241632794232), - FRAC_CONST(0.081211446809592441), - FRAC_CONST(0.084268887593324071), - FRAC_CONST(0.087325535206192059), - FRAC_CONST(0.090381360877864983), - FRAC_CONST(0.093436335845747787), - FRAC_CONST(0.096490431355252593), - FRAC_CONST(0.099543618660069319), - FRAC_CONST(0.10259586902243628), - FRAC_CONST(0.10564715371341062), - FRAC_CONST(0.10869744401313872), - FRAC_CONST(0.11174671121112659), - FRAC_CONST(0.11479492660651008), - FRAC_CONST(0.11784206150832498), - FRAC_CONST(0.12088808723577708), - FRAC_CONST(0.12393297511851216), - FRAC_CONST(0.12697669649688587), - FRAC_CONST(0.13001922272223335), - FRAC_CONST(0.13306052515713906), - FRAC_CONST(0.1361005751757062), - FRAC_CONST(0.1391393441638262), - FRAC_CONST(0.14217680351944803), - FRAC_CONST(0.14521292465284746), - FRAC_CONST(0.14824767898689603), - FRAC_CONST(0.15128103795733022), - FRAC_CONST(0.1543129730130201), - FRAC_CONST(0.15734345561623825), - FRAC_CONST(0.16037245724292828), - FRAC_CONST(0.16339994938297323), - FRAC_CONST(0.1664259035404641), - FRAC_CONST(0.16945029123396796), - FRAC_CONST(0.17247308399679595), - FRAC_CONST(0.17549425337727143), - FRAC_CONST(0.17851377093899751), - FRAC_CONST(0.18153160826112497), - FRAC_CONST(0.18454773693861962), - FRAC_CONST(0.1875621285825296), - FRAC_CONST(0.19057475482025274), - FRAC_CONST(0.19358558729580361), - FRAC_CONST(0.19659459767008022), - FRAC_CONST(0.19960175762113097), - FRAC_CONST(0.20260703884442113), - FRAC_CONST(0.20561041305309924), - FRAC_CONST(0.20861185197826349), - FRAC_CONST(0.21161132736922755), - FRAC_CONST(0.21460881099378676), - FRAC_CONST(0.21760427463848364), - FRAC_CONST(0.22059769010887351), - FRAC_CONST(0.22358902922978999), - FRAC_CONST(0.22657826384561), - FRAC_CONST(0.22956536582051887), - FRAC_CONST(0.23255030703877524), - FRAC_CONST(0.23553305940497549), - FRAC_CONST(0.23851359484431842), - FRAC_CONST(0.24149188530286933), - FRAC_CONST(0.24446790274782415), - FRAC_CONST(0.24744161916777327), - FRAC_CONST(0.25041300657296522), - FRAC_CONST(0.25338203699557016), - FRAC_CONST(0.25634868248994291), - FRAC_CONST(0.25931291513288623), - FRAC_CONST(0.26227470702391359), - FRAC_CONST(0.26523403028551179), - FRAC_CONST(0.26819085706340318), - FRAC_CONST(0.27114515952680801), - FRAC_CONST(0.27409690986870638), - FRAC_CONST(0.2770460803060999), - FRAC_CONST(0.27999264308027322), - FRAC_CONST(0.28293657045705539), - FRAC_CONST(0.28587783472708062), - FRAC_CONST(0.28881640820604948), - FRAC_CONST(0.29175226323498926), - FRAC_CONST(0.29468537218051433), - FRAC_CONST(0.2976157074350862), - FRAC_CONST(0.30054324141727345), - FRAC_CONST(0.30346794657201132), - FRAC_CONST(0.30638979537086092), - FRAC_CONST(0.30930876031226873), - FRAC_CONST(0.31222481392182488), - FRAC_CONST(0.31513792875252244), - FRAC_CONST(0.31804807738501495), - FRAC_CONST(0.32095523242787521), - FRAC_CONST(0.32385936651785285), - FRAC_CONST(0.32676045232013173), - FRAC_CONST(0.32965846252858749), - FRAC_CONST(0.33255336986604422), - FRAC_CONST(0.3354451470845316), - FRAC_CONST(0.33833376696554113), - FRAC_CONST(0.34121920232028236), - FRAC_CONST(0.34410142598993881), - FRAC_CONST(0.34698041084592368), - FRAC_CONST(0.34985612979013492), - FRAC_CONST(0.35272855575521073), - FRAC_CONST(0.35559766170478385), - FRAC_CONST(0.35846342063373654), - FRAC_CONST(0.36132580556845428), - FRAC_CONST(0.36418478956707989), - FRAC_CONST(0.36704034571976718), - FRAC_CONST(0.3698924471489341), - FRAC_CONST(0.37274106700951576), - FRAC_CONST(0.37558617848921722), - FRAC_CONST(0.37842775480876556), - FRAC_CONST(0.38126576922216238), - FRAC_CONST(0.38410019501693504), - FRAC_CONST(0.38693100551438858), - FRAC_CONST(0.38975817406985641), - FRAC_CONST(0.39258167407295147), - FRAC_CONST(0.39540147894781635), - FRAC_CONST(0.39821756215337356), - FRAC_CONST(0.40102989718357562), - FRAC_CONST(0.40383845756765407), - FRAC_CONST(0.40664321687036903), - FRAC_CONST(0.40944414869225759), - FRAC_CONST(0.41224122666988289), - FRAC_CONST(0.41503442447608163), - FRAC_CONST(0.41782371582021227), - FRAC_CONST(0.42060907444840251), - FRAC_CONST(0.42339047414379605), - FRAC_CONST(0.42616788872679962), - FRAC_CONST(0.42894129205532949), - FRAC_CONST(0.43171065802505726), - FRAC_CONST(0.43447596056965565), - FRAC_CONST(0.43723717366104409), - FRAC_CONST(0.43999427130963326), - FRAC_CONST(0.44274722756457002), - FRAC_CONST(0.44549601651398174), - FRAC_CONST(0.44824061228521989), - FRAC_CONST(0.45098098904510386), - FRAC_CONST(0.45371712100016387), - FRAC_CONST(0.45644898239688392), - FRAC_CONST(0.45917654752194409), - FRAC_CONST(0.46189979070246273), - FRAC_CONST(0.46461868630623782), - FRAC_CONST(0.46733320874198842), - FRAC_CONST(0.47004333245959562), - FRAC_CONST(0.47274903195034279), - FRAC_CONST(0.47545028174715587), - FRAC_CONST(0.47814705642484301), - FRAC_CONST(0.48083933060033396), - FRAC_CONST(0.48352707893291874), - FRAC_CONST(0.48621027612448642), - FRAC_CONST(0.48888889691976317), - FRAC_CONST(0.4915629161065499), - FRAC_CONST(0.49423230851595967), - FRAC_CONST(0.49689704902265447), - FRAC_CONST(0.49955711254508184), - FRAC_CONST(0.50221247404571079), - FRAC_CONST(0.50486310853126759), - FRAC_CONST(0.50750899105297087), - FRAC_CONST(0.51015009670676681), - FRAC_CONST(0.51278640063356296), - FRAC_CONST(0.51541787801946293), - FRAC_CONST(0.51804450409599934), - FRAC_CONST(0.52066625414036716), - FRAC_CONST(0.52328310347565643), - FRAC_CONST(0.52589502747108463), - FRAC_CONST(0.52850200154222848), - FRAC_CONST(0.531104001151255), - FRAC_CONST(0.53370100180715296), - FRAC_CONST(0.53629297906596318), - FRAC_CONST(0.53887990853100842), - FRAC_CONST(0.54146176585312344), - FRAC_CONST(0.54403852673088382), - FRAC_CONST(0.54661016691083486), - FRAC_CONST(0.54917666218771966), - FRAC_CONST(0.55173798840470734), - FRAC_CONST(0.55429412145362), - FRAC_CONST(0.5568450372751601), - FRAC_CONST(0.55939071185913614), - FRAC_CONST(0.56193112124468947), - FRAC_CONST(0.5644662415205195), - FRAC_CONST(0.56699604882510868), - FRAC_CONST(0.56952051934694714), - FRAC_CONST(0.57203962932475705), - FRAC_CONST(0.57455335504771576), - FRAC_CONST(0.57706167285567944), - FRAC_CONST(0.57956455913940563), - FRAC_CONST(0.58206199034077544), - FRAC_CONST(0.58455394295301533), - FRAC_CONST(0.58704039352091797), - FRAC_CONST(0.58952131864106394), - FRAC_CONST(0.59199669496204099), - FRAC_CONST(0.59446649918466443), - FRAC_CONST(0.5969307080621965), - FRAC_CONST(0.59938929840056454), - FRAC_CONST(0.60184224705858003), - FRAC_CONST(0.60428953094815596), - FRAC_CONST(0.60673112703452448), - FRAC_CONST(0.60916701233645321), - FRAC_CONST(0.61159716392646191), - FRAC_CONST(0.61402155893103838), - FRAC_CONST(0.61644017453085365), - FRAC_CONST(0.61885298796097632), - FRAC_CONST(0.62125997651108755), - FRAC_CONST(0.62366111752569453), - FRAC_CONST(0.62605638840434352), - FRAC_CONST(0.62844576660183271), - FRAC_CONST(0.63082922962842447), - FRAC_CONST(0.63320675505005719), - FRAC_CONST(0.63557832048855611), - FRAC_CONST(0.63794390362184406), - FRAC_CONST(0.64030348218415167), - FRAC_CONST(0.64265703396622686), - FRAC_CONST(0.64500453681554393), - FRAC_CONST(0.64734596863651206), - FRAC_CONST(0.64968130739068319), - FRAC_CONST(0.6520105310969595), - FRAC_CONST(0.65433361783180044), - FRAC_CONST(0.65665054572942894), - FRAC_CONST(0.65896129298203732), - FRAC_CONST(0.66126583783999227), - FRAC_CONST(0.66356415861203977), - FRAC_CONST(0.66585623366550972), - FRAC_CONST(0.66814204142651845), - FRAC_CONST(0.67042156038017309), - FRAC_CONST(0.67269476907077286), - FRAC_CONST(0.67496164610201193), - FRAC_CONST(0.67722217013718033), - FRAC_CONST(0.67947631989936497), - FRAC_CONST(0.68172407417164971), - FRAC_CONST(0.6839654117973154), - FRAC_CONST(0.68620031168003859), - FRAC_CONST(0.68842875278409044), - FRAC_CONST(0.6906507141345346), - FRAC_CONST(0.69286617481742463), - FRAC_CONST(0.69507511398000088), - FRAC_CONST(0.69727751083088652), - FRAC_CONST(0.69947334464028377), - FRAC_CONST(0.70166259474016845), - FRAC_CONST(0.70384524052448494), - FRAC_CONST(0.70602126144933974), - FRAC_CONST(0.70819063703319529), - FRAC_CONST(0.71035334685706231), - FRAC_CONST(0.71250937056469232), - FRAC_CONST(0.71465868786276898), - FRAC_CONST(0.71680127852109954), - FRAC_CONST(0.71893712237280438), - FRAC_CONST(0.72106619931450811), - FRAC_CONST(0.72318848930652735), - FRAC_CONST(0.72530397237306066), - FRAC_CONST(0.72741262860237577), - FRAC_CONST(0.7295144381469969), - FRAC_CONST(0.73160938122389252), - FRAC_CONST(0.73369743811466026), - FRAC_CONST(0.73577858916571348), - FRAC_CONST(0.73785281478846598), - FRAC_CONST(0.73992009545951609), - FRAC_CONST(0.74198041172083096), - FRAC_CONST(0.74403374417992918), - FRAC_CONST(0.74608007351006378), - FRAC_CONST(0.74811938045040349), - FRAC_CONST(0.75015164580621496), - FRAC_CONST(0.7521768504490427), - FRAC_CONST(0.75419497531688917), - FRAC_CONST(0.75620600141439454), - FRAC_CONST(0.75820990981301528), - FRAC_CONST(0.76020668165120242), - FRAC_CONST(0.7621962981345789), - FRAC_CONST(0.76417874053611667), - FRAC_CONST(0.76615399019631281), - FRAC_CONST(0.76812202852336531), - FRAC_CONST(0.7700828369933479), - FRAC_CONST(0.77203639715038441), - FRAC_CONST(0.77398269060682279), - FRAC_CONST(0.77592169904340758), - FRAC_CONST(0.77785340420945304), - FRAC_CONST(0.77977778792301444), - FRAC_CONST(0.78169483207105939), - FRAC_CONST(0.7836045186096382), - FRAC_CONST(0.78550682956405393), - FRAC_CONST(0.78740174702903132), - FRAC_CONST(0.78928925316888565), - FRAC_CONST(0.79116933021769009), - FRAC_CONST(0.79304196047944364), - FRAC_CONST(0.79490712632823701), - FRAC_CONST(0.79676481020841872), - FRAC_CONST(0.79861499463476082), - FRAC_CONST(0.80045766219262271), - FRAC_CONST(0.80229279553811572), - FRAC_CONST(0.8041203773982657), - FRAC_CONST(0.80594039057117628), - FRAC_CONST(0.80775281792619036), - FRAC_CONST(0.80955764240405126), - FRAC_CONST(0.81135484701706373), - FRAC_CONST(0.81314441484925359), - FRAC_CONST(0.81492632905652662), - FRAC_CONST(0.81670057286682785), - FRAC_CONST(0.81846712958029866), - FRAC_CONST(0.82022598256943469), - FRAC_CONST(0.82197711527924155), - FRAC_CONST(0.82372051122739132), - FRAC_CONST(0.82545615400437744), - FRAC_CONST(0.82718402727366902), - FRAC_CONST(0.82890411477186487), - FRAC_CONST(0.8306164003088462), - FRAC_CONST(0.83232086776792968), - FRAC_CONST(0.83401750110601813), - FRAC_CONST(0.8357062843537526), - FRAC_CONST(0.83738720161566194), - FRAC_CONST(0.83906023707031263), - FRAC_CONST(0.84072537497045807), - FRAC_CONST(0.84238259964318596), - FRAC_CONST(0.84403189549006641), - FRAC_CONST(0.84567324698729907), - FRAC_CONST(0.84730663868585832), - FRAC_CONST(0.84893205521163961), - FRAC_CONST(0.85054948126560337), - FRAC_CONST(0.85215890162391983), - FRAC_CONST(0.8537603011381113), - FRAC_CONST(0.85535366473519603), - FRAC_CONST(0.85693897741782865), - FRAC_CONST(0.85851622426444274), - FRAC_CONST(0.86008539042939014), - FRAC_CONST(0.8616464611430813), - FRAC_CONST(0.86319942171212416), - FRAC_CONST(0.86474425751946238), - FRAC_CONST(0.86628095402451299), - FRAC_CONST(0.86780949676330321), - FRAC_CONST(0.86932987134860673), - FRAC_CONST(0.87084206347007886), - FRAC_CONST(0.87234605889439154), - FRAC_CONST(0.87384184346536675), - FRAC_CONST(0.87532940310411078), - FRAC_CONST(0.87680872380914576), - FRAC_CONST(0.87827979165654146), - FRAC_CONST(0.87974259280004741), - FRAC_CONST(0.88119711347122198), - FRAC_CONST(0.88264333997956279), - FRAC_CONST(0.88408125871263499), - FRAC_CONST(0.88551085613619995), - FRAC_CONST(0.88693211879434208), - FRAC_CONST(0.88834503330959624), - FRAC_CONST(0.88974958638307289), - FRAC_CONST(0.89114576479458318), - FRAC_CONST(0.89253355540276469), - FRAC_CONST(0.89391294514520325), - FRAC_CONST(0.89528392103855758), - FRAC_CONST(0.89664647017868015), - FRAC_CONST(0.89800057974073988), - FRAC_CONST(0.89934623697934146), - FRAC_CONST(0.90068342922864686), - FRAC_CONST(0.90201214390249307), - FRAC_CONST(0.90333236849451182), - FRAC_CONST(0.90464409057824624), - FRAC_CONST(0.90594729780726846), - FRAC_CONST(0.90724197791529593), - FRAC_CONST(0.90852811871630612), - FRAC_CONST(0.90980570810465222), - FRAC_CONST(0.91107473405517625), - FRAC_CONST(0.91233518462332275), - FRAC_CONST(0.91358704794525081), - FRAC_CONST(0.91483031223794609), - FRAC_CONST(0.91606496579933161), - FRAC_CONST(0.91729099700837791), - FRAC_CONST(0.91850839432521225), - FRAC_CONST(0.91971714629122736), - FRAC_CONST(0.92091724152918952), - FRAC_CONST(0.92210866874334507), - FRAC_CONST(0.92329141671952764), - FRAC_CONST(0.9244654743252626), - FRAC_CONST(0.92563083050987272), - FRAC_CONST(0.92678747430458175), - FRAC_CONST(0.92793539482261789), - FRAC_CONST(0.92907458125931575), - FRAC_CONST(0.93020502289221907), - FRAC_CONST(0.93132670908118043), - FRAC_CONST(0.93243962926846236), - FRAC_CONST(0.93354377297883617), - FRAC_CONST(0.93463912981968078), - FRAC_CONST(0.93572568948108037), - FRAC_CONST(0.93680344173592156), - FRAC_CONST(0.93787237643998989), - FRAC_CONST(0.93893248353206449), - FRAC_CONST(0.93998375303401394), - FRAC_CONST(0.94102617505088926), - FRAC_CONST(0.94205973977101731), - FRAC_CONST(0.94308443746609349), - FRAC_CONST(0.94410025849127266), - FRAC_CONST(0.94510719328526061), - FRAC_CONST(0.94610523237040334), - FRAC_CONST(0.94709436635277722), - FRAC_CONST(0.94807458592227623), - FRAC_CONST(0.94904588185270056), - FRAC_CONST(0.950008245001843), - FRAC_CONST(0.95096166631157508), - FRAC_CONST(0.95190613680793223), - FRAC_CONST(0.95284164760119872), - FRAC_CONST(0.95376818988599033), - FRAC_CONST(0.95468575494133834), - FRAC_CONST(0.95559433413077111), - FRAC_CONST(0.95649391890239499), - FRAC_CONST(0.95738450078897586), - FRAC_CONST(0.95826607140801767), - FRAC_CONST(0.95913862246184189), - FRAC_CONST(0.96000214573766585), - FRAC_CONST(0.96085663310767966), - FRAC_CONST(0.96170207652912254), - FRAC_CONST(0.96253846804435916), - FRAC_CONST(0.96336579978095405), - FRAC_CONST(0.96418406395174572), - FRAC_CONST(0.96499325285492032), - FRAC_CONST(0.96579335887408357), - FRAC_CONST(0.96658437447833312), - FRAC_CONST(0.96736629222232851), - FRAC_CONST(0.96813910474636233), - FRAC_CONST(0.96890280477642887), - FRAC_CONST(0.96965738512429245), - FRAC_CONST(0.9704028386875555), - FRAC_CONST(0.97113915844972509), - FRAC_CONST(0.9718663374802794), - FRAC_CONST(0.97258436893473221), - FRAC_CONST(0.97329324605469825), - FRAC_CONST(0.97399296216795583), - FRAC_CONST(0.97468351068851067), - FRAC_CONST(0.97536488511665687), - FRAC_CONST(0.97603707903903902), - FRAC_CONST(0.97670008612871184), - FRAC_CONST(0.97735390014519996), - FRAC_CONST(0.97799851493455714), - FRAC_CONST(0.9786339244294231), - FRAC_CONST(0.97926012264908202), - FRAC_CONST(0.97987710369951764), - FRAC_CONST(0.98048486177346938), - FRAC_CONST(0.98108339115048659), - FRAC_CONST(0.98167268619698311), - FRAC_CONST(0.98225274136628937), - FRAC_CONST(0.98282355119870524), - FRAC_CONST(0.98338511032155118), - FRAC_CONST(0.98393741344921892), - FRAC_CONST(0.98448045538322093), - FRAC_CONST(0.98501423101223984), - FRAC_CONST(0.98553873531217606), - FRAC_CONST(0.98605396334619544), - FRAC_CONST(0.98655991026477541), - FRAC_CONST(0.98705657130575097), - FRAC_CONST(0.98754394179435923), - FRAC_CONST(0.98802201714328353), - FRAC_CONST(0.98849079285269659), - FRAC_CONST(0.98895026451030299), - FRAC_CONST(0.98940042779138038), - FRAC_CONST(0.98984127845882053), - FRAC_CONST(0.99027281236316911), - FRAC_CONST(0.99069502544266463), - FRAC_CONST(0.99110791372327678), - FRAC_CONST(0.9915114733187439), - FRAC_CONST(0.99190570043060933), - FRAC_CONST(0.99229059134825737), - FRAC_CONST(0.99266614244894802), - FRAC_CONST(0.99303235019785141), - FRAC_CONST(0.99338921114808065), - FRAC_CONST(0.9937367219407246), - FRAC_CONST(0.99407487930487937), - FRAC_CONST(0.9944036800576791), - FRAC_CONST(0.9947231211043257), - FRAC_CONST(0.99503319943811863), - FRAC_CONST(0.99533391214048228), - FRAC_CONST(0.99562525638099431), - FRAC_CONST(0.99590722941741172), - FRAC_CONST(0.99617982859569687), - FRAC_CONST(0.99644305135004263), - FRAC_CONST(0.99669689520289606), - FRAC_CONST(0.99694135776498216), - FRAC_CONST(0.99717643673532619), - FRAC_CONST(0.9974021299012753), - FRAC_CONST(0.99761843513851955), - FRAC_CONST(0.99782535041111164), - FRAC_CONST(0.99802287377148624), - FRAC_CONST(0.99821100336047819), - FRAC_CONST(0.99838973740734016), - FRAC_CONST(0.99855907422975931), - FRAC_CONST(0.99871901223387294), - FRAC_CONST(0.99886954991428356), - FRAC_CONST(0.99901068585407338), - FRAC_CONST(0.99914241872481691), - FRAC_CONST(0.99926474728659442), - FRAC_CONST(0.99937767038800285), - FRAC_CONST(0.99948118696616695), - FRAC_CONST(0.99957529604674922), - FRAC_CONST(0.99965999674395922), - FRAC_CONST(0.99973528826056168), - FRAC_CONST(0.99980116988788426), - FRAC_CONST(0.99985764100582386), - FRAC_CONST(0.9999047010828529), - FRAC_CONST(0.99994234967602391), - FRAC_CONST(0.99997058643097414), - FRAC_CONST(0.9999894110819284), - FRAC_CONST(0.99999882345170188) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t sine_mid_480[] = -{ - FRAC_CONST(0.0016362454436240478), - FRAC_CONST(0.00490871880799799), - FRAC_CONST(0.0081811396039371282), - FRAC_CONST(0.011453472786443779), - FRAC_CONST(0.014725683311458524), - FRAC_CONST(0.017997736136235509), - FRAC_CONST(0.021269596219717739), - FRAC_CONST(0.024541228522912285), - FRAC_CONST(0.027812598009265607), - FRAC_CONST(0.03108366964503869), - FRAC_CONST(0.034354408399682276), - FRAC_CONST(0.037624779246211978), - FRAC_CONST(0.04089474716158345), - FRAC_CONST(0.044164277127067358), - FRAC_CONST(0.047433334128624507), - FRAC_CONST(0.050701883157280733), - FRAC_CONST(0.053969889209501881), - FRAC_CONST(0.057237317287568618), - FRAC_CONST(0.060504132399951269), - FRAC_CONST(0.063770299561684493), - FRAC_CONST(0.06703578379474201), - FRAC_CONST(0.070300550128411174), - FRAC_CONST(0.073564563599667426), - FRAC_CONST(0.076827789253548759), - FRAC_CONST(0.080090192143530081), - FRAC_CONST(0.083351737331897449), - FRAC_CONST(0.086612389890122182), - FRAC_CONST(0.089872114899234967), - FRAC_CONST(0.093130877450199795), - FRAC_CONST(0.096388642644287828), - FRAC_CONST(0.09964537559345106), - FRAC_CONST(0.1029010414206961), - FRAC_CONST(0.10615560526045748), - FRAC_CONST(0.10940903225897117), - FRAC_CONST(0.11266128757464781), - FRAC_CONST(0.11591233637844581), - FRAC_CONST(0.11916214385424433), - FRAC_CONST(0.1224106751992162), - FRAC_CONST(0.12565789562420052), - FRAC_CONST(0.12890377035407541), - FRAC_CONST(0.13214826462813015), - FRAC_CONST(0.13539134370043773), - FRAC_CONST(0.13863297284022669), - FRAC_CONST(0.14187311733225325), - FRAC_CONST(0.14511174247717309), - FRAC_CONST(0.14834881359191271), - FRAC_CONST(0.15158429601004111), - FRAC_CONST(0.15481815508214106), - FRAC_CONST(0.1580503561761798), - FRAC_CONST(0.16128086467788047), - FRAC_CONST(0.16450964599109233), - FRAC_CONST(0.16773666553816149), - FRAC_CONST(0.17096188876030122), - FRAC_CONST(0.17418528111796186), - FRAC_CONST(0.17740680809120093), - FRAC_CONST(0.18062643518005275), - FRAC_CONST(0.18384412790489776), - FRAC_CONST(0.18705985180683199), - FRAC_CONST(0.19027357244803589), - FRAC_CONST(0.19348525541214331), - FRAC_CONST(0.19669486630460997), - FRAC_CONST(0.19990237075308173), - FRAC_CONST(0.20310773440776286), - FRAC_CONST(0.20631092294178383), - FRAC_CONST(0.20951190205156878), - FRAC_CONST(0.21271063745720317), - FRAC_CONST(0.21590709490280058), - FRAC_CONST(0.2191012401568698), - FRAC_CONST(0.22229303901268133), - FRAC_CONST(0.22548245728863364), - FRAC_CONST(0.22866946082861941), - FRAC_CONST(0.23185401550239115), - FRAC_CONST(0.23503608720592667), - FRAC_CONST(0.23821564186179459), - FRAC_CONST(0.24139264541951888), - FRAC_CONST(0.24456706385594387), - FRAC_CONST(0.24773886317559846), - FRAC_CONST(0.25090800941106001), - FRAC_CONST(0.25407446862331851), - FRAC_CONST(0.25723820690213967), - FRAC_CONST(0.26039919036642817), - FRAC_CONST(0.26355738516459076), - FRAC_CONST(0.26671275747489837), - FRAC_CONST(0.2698652735058486), - FRAC_CONST(0.27301489949652735), - FRAC_CONST(0.27616160171697068), - FRAC_CONST(0.27930534646852595), - FRAC_CONST(0.28244610008421245), - FRAC_CONST(0.2855838289290823), - FRAC_CONST(0.28871849940058025), - FRAC_CONST(0.29185007792890405), - FRAC_CONST(0.29497853097736348), - FRAC_CONST(0.2981038250427398), - FRAC_CONST(0.30122592665564446), - FRAC_CONST(0.30434480238087736), - FRAC_CONST(0.30746041881778519), - FRAC_CONST(0.31057274260061901), - FRAC_CONST(0.31368174039889146), - FRAC_CONST(0.31678737891773395), - FRAC_CONST(0.31988962489825296), - FRAC_CONST(0.32298844511788638), - FRAC_CONST(0.32608380639075912), - FRAC_CONST(0.32917567556803889), - FRAC_CONST(0.33226401953829071), - FRAC_CONST(0.33534880522783189), - FRAC_CONST(0.33842999960108583), - FRAC_CONST(0.34150756966093632), - FRAC_CONST(0.34458148244908043), - FRAC_CONST(0.34765170504638188), - FRAC_CONST(0.35071820457322322), - FRAC_CONST(0.35378094818985806), - FRAC_CONST(0.35683990309676283), - FRAC_CONST(0.35989503653498811), - FRAC_CONST(0.36294631578650921), - FRAC_CONST(0.36599370817457672), - FRAC_CONST(0.36903718106406647), - FRAC_CONST(0.37207670186182878), - FRAC_CONST(0.37511223801703802), - FRAC_CONST(0.37814375702154046), - FRAC_CONST(0.38117122641020335), - FRAC_CONST(0.38419461376126157), - FRAC_CONST(0.38721388669666562), - FRAC_CONST(0.39022901288242801), - FRAC_CONST(0.39323996002896966), - FRAC_CONST(0.39624669589146555), - FRAC_CONST(0.39924918827019029), - FRAC_CONST(0.40224740501086254), - FRAC_CONST(0.40524131400498986), - FRAC_CONST(0.40823088319021217), - FRAC_CONST(0.41121608055064529), - FRAC_CONST(0.41419687411722372), - FRAC_CONST(0.41717323196804335), - FRAC_CONST(0.42014512222870243), - FRAC_CONST(0.42311251307264408), - FRAC_CONST(0.42607537272149631), - FRAC_CONST(0.4290336694454126), - FRAC_CONST(0.43198737156341183), - FRAC_CONST(0.43493644744371707), - FRAC_CONST(0.43788086550409511), - FRAC_CONST(0.44082059421219388), - FRAC_CONST(0.44375560208588088), - FRAC_CONST(0.44668585769357955), - FRAC_CONST(0.4496113296546066), - FRAC_CONST(0.45253198663950756), - FRAC_CONST(0.45544779737039259), - FRAC_CONST(0.45835873062127125), - FRAC_CONST(0.46126475521838717), - FRAC_CONST(0.46416584004055156), - FRAC_CONST(0.46706195401947659), - FRAC_CONST(0.46995306614010829), - FRAC_CONST(0.47283914544095862), - FRAC_CONST(0.47572016101443682), - FRAC_CONST(0.47859608200718085), - FRAC_CONST(0.4814668776203872), - FRAC_CONST(0.48433251711014125), - FRAC_CONST(0.4871929697877464), - FRAC_CONST(0.49004820502005247), - FRAC_CONST(0.49289819222978404), - FRAC_CONST(0.49574290089586776), - FRAC_CONST(0.49858230055375902), - FRAC_CONST(0.50141636079576901), - FRAC_CONST(0.50424505127138919), - FRAC_CONST(0.50706834168761705), - FRAC_CONST(0.50988620180928057), - FRAC_CONST(0.51269860145936175), - FRAC_CONST(0.51550551051931948), - FRAC_CONST(0.51830689892941317), - FRAC_CONST(0.5211027366890234), - FRAC_CONST(0.52389299385697385), - FRAC_CONST(0.52667764055185196), - FRAC_CONST(0.52945664695232897), - FRAC_CONST(0.53222998329747884), - FRAC_CONST(0.53499761988709726), - FRAC_CONST(0.53775952708201991), - FRAC_CONST(0.54051567530443978), - FRAC_CONST(0.54326603503822357), - FRAC_CONST(0.54601057682922816), - FRAC_CONST(0.54874927128561579), - FRAC_CONST(0.55148208907816942), - FRAC_CONST(0.55420900094060566), - FRAC_CONST(0.55692997766988939), - FRAC_CONST(0.559644990126546), - FRAC_CONST(0.56235400923497314), - FRAC_CONST(0.56505700598375252), - FRAC_CONST(0.56775395142596052), - FRAC_CONST(0.57044481667947822), - FRAC_CONST(0.57312957292730071), - FRAC_CONST(0.57580819141784534), - FRAC_CONST(0.57848064346525996), - FRAC_CONST(0.58114690044973039), - FRAC_CONST(0.58380693381778626), - FRAC_CONST(0.58646071508260733), - FRAC_CONST(0.58910821582432815), - FRAC_CONST(0.5917494076903429), - FRAC_CONST(0.5943842623956086), - FRAC_CONST(0.59701275172294799), - FRAC_CONST(0.59963484752335228), - FRAC_CONST(0.60225052171628191), - FRAC_CONST(0.60485974628996786), - FRAC_CONST(0.60746249330171098), - FRAC_CONST(0.61005873487818185), - FRAC_CONST(0.61264844321571899), - FRAC_CONST(0.61523159058062682), - FRAC_CONST(0.61780814930947225), - FRAC_CONST(0.62037809180938108), - FRAC_CONST(0.62294139055833397), - FRAC_CONST(0.6254980181054608), - FRAC_CONST(0.62804794707133416), - FRAC_CONST(0.63059115014826372), - FRAC_CONST(0.63312760010058777), - FRAC_CONST(0.63565726976496484), - FRAC_CONST(0.63818013205066515), - FRAC_CONST(0.64069615993986073), - FRAC_CONST(0.64320532648791406), - FRAC_CONST(0.64570760482366729), - FRAC_CONST(0.64820296814972966), - FRAC_CONST(0.65069138974276486), - FRAC_CONST(0.65317284295377676), - FRAC_CONST(0.65564730120839498), - FRAC_CONST(0.65811473800715958), - FRAC_CONST(0.660575126925805), - FRAC_CONST(0.66302844161554231), - FRAC_CONST(0.6654746558033422), - FRAC_CONST(0.66791374329221598), - FRAC_CONST(0.67034567796149647), - FRAC_CONST(0.67277043376711676), - FRAC_CONST(0.67518798474189046), - FRAC_CONST(0.67759830499578866), - FRAC_CONST(0.68000136871621808), - FRAC_CONST(0.68239715016829683), - FRAC_CONST(0.6847856236951303), - FRAC_CONST(0.68716676371808583), - FRAC_CONST(0.68954054473706683), - FRAC_CONST(0.69190694133078579), - FRAC_CONST(0.69426592815703603), - FRAC_CONST(0.69661747995296419), - FRAC_CONST(0.69896157153533944), - FRAC_CONST(0.70129817780082437), - FRAC_CONST(0.7036272737262429), - FRAC_CONST(0.70594883436884903), - FRAC_CONST(0.70826283486659336), - FRAC_CONST(0.71056925043838959), - FRAC_CONST(0.71286805638437978), - FRAC_CONST(0.71515922808619936), - FRAC_CONST(0.71744274100723993), - FRAC_CONST(0.71971857069291278), - FRAC_CONST(0.7219866927709101), - FRAC_CONST(0.72424708295146689), - FRAC_CONST(0.72649971702762028), - FRAC_CONST(0.72874457087546896), - FRAC_CONST(0.73098162045443171), - FRAC_CONST(0.73321084180750484), - FRAC_CONST(0.73543221106151868), - FRAC_CONST(0.73764570442739286), - FRAC_CONST(0.73985129820039208), - FRAC_CONST(0.74204896876037885), - FRAC_CONST(0.7442386925720671), - FRAC_CONST(0.74642044618527381), - FRAC_CONST(0.74859420623517081), - FRAC_CONST(0.75075994944253421), - FRAC_CONST(0.75291765261399446), - FRAC_CONST(0.75506729264228367), - FRAC_CONST(0.75720884650648446), - FRAC_CONST(0.75934229127227548), - FRAC_CONST(0.76146760409217706), - FRAC_CONST(0.76358476220579641), - FRAC_CONST(0.7656937429400712), - FRAC_CONST(0.76779452370951196), - FRAC_CONST(0.76988708201644451), - FRAC_CONST(0.77197139545125026), - FRAC_CONST(0.7740474416926072), - FRAC_CONST(0.77611519850772781), - FRAC_CONST(0.77817464375259782), - FRAC_CONST(0.78022575537221317), - FRAC_CONST(0.78226851140081632), - FRAC_CONST(0.78430288996213138), - FRAC_CONST(0.78632886926959822), - FRAC_CONST(0.78834642762660623), - FRAC_CONST(0.79035554342672631), - FRAC_CONST(0.79235619515394229), - FRAC_CONST(0.79434836138288134), - FRAC_CONST(0.79633202077904397), - FRAC_CONST(0.79830715209903147), - FRAC_CONST(0.8002737341907743), - FRAC_CONST(0.80223174599375802), - FRAC_CONST(0.80418116653924954), - FRAC_CONST(0.80612197495052085), - FRAC_CONST(0.80805415044307316), - FRAC_CONST(0.80997767232485907), - FRAC_CONST(0.81189251999650469), - FRAC_CONST(0.81379867295152986), - FRAC_CONST(0.81569611077656778), - FRAC_CONST(0.81758481315158371), - FRAC_CONST(0.81946475985009259), - FRAC_CONST(0.82133593073937561), - FRAC_CONST(0.82319830578069586), - FRAC_CONST(0.82505186502951278), - FRAC_CONST(0.82689658863569615), - FRAC_CONST(0.82873245684373809), - FRAC_CONST(0.83055944999296494), - FRAC_CONST(0.83237754851774781), - FRAC_CONST(0.83418673294771239), - FRAC_CONST(0.83598698390794668), - FRAC_CONST(0.83777828211920935), - FRAC_CONST(0.83956060839813562), - FRAC_CONST(0.84133394365744296), - FRAC_CONST(0.84309826890613537), - FRAC_CONST(0.84485356524970701), - FRAC_CONST(0.84659981389034411), - FRAC_CONST(0.84833699612712676), - FRAC_CONST(0.85006509335622882), - FRAC_CONST(0.8517840870711173), - FRAC_CONST(0.85349395886275037), - FRAC_CONST(0.85519469041977514), - FRAC_CONST(0.85688626352872277), - FRAC_CONST(0.85856866007420429), - FRAC_CONST(0.86024186203910447), - FRAC_CONST(0.86190585150477417), - FRAC_CONST(0.86356061065122347), - FRAC_CONST(0.86520612175731115), - FRAC_CONST(0.86684236720093533), - FRAC_CONST(0.86846932945922151), - FRAC_CONST(0.87008699110871135), - FRAC_CONST(0.87169533482554817), - FRAC_CONST(0.87329434338566281), - FRAC_CONST(0.87488399966495822), - FRAC_CONST(0.87646428663949283), - FRAC_CONST(0.87803518738566277), - FRAC_CONST(0.87959668508038291), - FRAC_CONST(0.88114876300126743), - FRAC_CONST(0.88269140452680916), - FRAC_CONST(0.8842245931365561), - FRAC_CONST(0.88574831241129048), - FRAC_CONST(0.88726254603320276), - FRAC_CONST(0.88876727778606746), - FRAC_CONST(0.89026249155541637), - FRAC_CONST(0.8917481713287112), - FRAC_CONST(0.89322430119551532), - FRAC_CONST(0.89469086534766362), - FRAC_CONST(0.89614784807943237), - FRAC_CONST(0.89759523378770689), - FRAC_CONST(0.89903300697214927), - FRAC_CONST(0.9004611522353636), - FRAC_CONST(0.90187965428306172), - FRAC_CONST(0.90328849792422594), - FRAC_CONST(0.90468766807127299), - FRAC_CONST(0.90607714974021469), - FRAC_CONST(0.90745692805081868), - FRAC_CONST(0.90882698822676755), - FRAC_CONST(0.91018731559581767), - FRAC_CONST(0.91153789558995579), - FRAC_CONST(0.91287871374555518), - FRAC_CONST(0.91420975570353069), - FRAC_CONST(0.9155310072094921), - FRAC_CONST(0.91684245411389753), - FRAC_CONST(0.91814408237220391), - FRAC_CONST(0.91943587804501858), - FRAC_CONST(0.92071782729824769), - FRAC_CONST(0.92198991640324446), - FRAC_CONST(0.92325213173695675), - FRAC_CONST(0.92450445978207241), - FRAC_CONST(0.92574688712716402), - FRAC_CONST(0.92697940046683291), - FRAC_CONST(0.92820198660185149), - FRAC_CONST(0.92941463243930444), - FRAC_CONST(0.93061732499272909), - FRAC_CONST(0.93181005138225426), - FRAC_CONST(0.93299279883473885), - FRAC_CONST(0.93416555468390772), - FRAC_CONST(0.93532830637048769), - FRAC_CONST(0.93648104144234268), - FRAC_CONST(0.93762374755460598), - FRAC_CONST(0.93875641246981323), - FRAC_CONST(0.93987902405803303), - FRAC_CONST(0.94099157029699743), - FRAC_CONST(0.94209403927222979), - FRAC_CONST(0.94318641917717327), - FRAC_CONST(0.9442686983133165), - FRAC_CONST(0.94534086509031956), - FRAC_CONST(0.9464029080261378), - FRAC_CONST(0.94745481574714419), - FRAC_CONST(0.94849657698825252), - FRAC_CONST(0.94952818059303667), - FRAC_CONST(0.95054961551385087), - FRAC_CONST(0.95156087081194762), - FRAC_CONST(0.95256193565759528), - FRAC_CONST(0.95355279933019343), - FRAC_CONST(0.9545334512183884), - FRAC_CONST(0.95550388082018611), - FRAC_CONST(0.95646407774306541), - FRAC_CONST(0.95741403170408834), - FRAC_CONST(0.95835373253001133), - FRAC_CONST(0.95928317015739362), - FRAC_CONST(0.96020233463270466), - FRAC_CONST(0.96111121611243155), - FRAC_CONST(0.96200980486318388), - FRAC_CONST(0.96289809126179782), - FRAC_CONST(0.96377606579543984), - FRAC_CONST(0.96464371906170809), - FRAC_CONST(0.96550104176873297), - FRAC_CONST(0.96634802473527726), - FRAC_CONST(0.96718465889083372), - FRAC_CONST(0.96801093527572268), - FRAC_CONST(0.96882684504118799), - FRAC_CONST(0.96963237944949143), - FRAC_CONST(0.97042752987400682), - FRAC_CONST(0.97121228779931179), - FRAC_CONST(0.97198664482127939), - FRAC_CONST(0.97275059264716823), - FRAC_CONST(0.97350412309571066), - FRAC_CONST(0.97424722809720088), - FRAC_CONST(0.97497989969358168), - FRAC_CONST(0.97570213003852857), - FRAC_CONST(0.97641391139753486), - FRAC_CONST(0.97711523614799412), - FRAC_CONST(0.97780609677928154), - FRAC_CONST(0.97848648589283505), - FRAC_CONST(0.97915639620223371), - FRAC_CONST(0.9798158205332762), - FRAC_CONST(0.98046475182405801), - FRAC_CONST(0.98110318312504607), - FRAC_CONST(0.98173110759915416), - FRAC_CONST(0.98234851852181571), - FRAC_CONST(0.98295540928105563), - FRAC_CONST(0.9835517733775615), - FRAC_CONST(0.98413760442475307), - FRAC_CONST(0.98471289614885038), - FRAC_CONST(0.98527764238894122), - FRAC_CONST(0.98583183709704714), - FRAC_CONST(0.98637547433818806), - FRAC_CONST(0.98690854829044583), - FRAC_CONST(0.98743105324502667), - FRAC_CONST(0.98794298360632238), - FRAC_CONST(0.98844433389196995), - FRAC_CONST(0.98893509873291074), - FRAC_CONST(0.98941527287344755), - FRAC_CONST(0.98988485117130098), - FRAC_CONST(0.99034382859766479), - FRAC_CONST(0.99079220023725967), - FRAC_CONST(0.99122996128838525), - FRAC_CONST(0.9916571070629725), - FRAC_CONST(0.99207363298663342), - FRAC_CONST(0.99247953459870997), - FRAC_CONST(0.99287480755232194), - FRAC_CONST(0.99325944761441354), - FRAC_CONST(0.99363345066579889), - FRAC_CONST(0.99399681270120555), - FRAC_CONST(0.99434952982931812), - FRAC_CONST(0.9946915982728195), - FRAC_CONST(0.99502301436843166), - FRAC_CONST(0.99534377456695422), - FRAC_CONST(0.9956538754333033), - FRAC_CONST(0.99595331364654771), - FRAC_CONST(0.99624208599994479), - FRAC_CONST(0.99652018940097464), - FRAC_CONST(0.99678762087137318), - FRAC_CONST(0.99704437754716424), - FRAC_CONST(0.99729045667869021), - FRAC_CONST(0.99752585563064111), - FRAC_CONST(0.99775057188208349), - FRAC_CONST(0.9979646030264866), - FRAC_CONST(0.99816794677174903), - FRAC_CONST(0.9983606009402225), - FRAC_CONST(0.99854256346873571), - FRAC_CONST(0.99871383240861611), - FRAC_CONST(0.99887440592571108), - FRAC_CONST(0.99902428230040718), - FRAC_CONST(0.99916345992764877), - FRAC_CONST(0.99929193731695531), - FRAC_CONST(0.99940971309243731), - FRAC_CONST(0.99951678599281069), - FRAC_CONST(0.99961315487141078), - FRAC_CONST(0.99969881869620425), - FRAC_CONST(0.99977377654980037), - FRAC_CONST(0.99983802762946083), - FRAC_CONST(0.99989157124710804), - FRAC_CONST(0.9999344068293331), - FRAC_CONST(0.99996653391740109), - FRAC_CONST(0.99998795216725689), - FRAC_CONST(0.99999866134952808) -}; -#endif - -ALIGN static const real_t ld_mid_512[] = -{ - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0.0061358846491544753), - FRAC_CONST(0.01840672990580482), - FRAC_CONST(0.030674803176636626), - FRAC_CONST(0.04293825693494082), - FRAC_CONST(0.055195244349689934), - FRAC_CONST(0.067443919563664051), - FRAC_CONST(0.079682437971430126), - FRAC_CONST(0.091908956497132724), - FRAC_CONST(0.10412163387205459), - FRAC_CONST(0.11631863091190475), - FRAC_CONST(0.12849811079379317), - FRAC_CONST(0.14065823933284921), - FRAC_CONST(0.15279718525844344), - FRAC_CONST(0.16491312048996989), - FRAC_CONST(0.17700422041214875), - FRAC_CONST(0.18906866414980619), - FRAC_CONST(0.2011046348420919), - FRAC_CONST(0.21311031991609136), - FRAC_CONST(0.22508391135979283), - FRAC_CONST(0.2370236059943672), - FRAC_CONST(0.24892760574572015), - FRAC_CONST(0.26079411791527551), - FRAC_CONST(0.27262135544994898), - FRAC_CONST(0.28440753721127188), - FRAC_CONST(0.29615088824362379), - FRAC_CONST(0.30784964004153487), - FRAC_CONST(0.31950203081601569), - FRAC_CONST(0.33110630575987643), - FRAC_CONST(0.34266071731199438), - FRAC_CONST(0.35416352542049034), - FRAC_CONST(0.36561299780477385), - FRAC_CONST(0.37700741021641826), - FRAC_CONST(0.38834504669882625), - FRAC_CONST(0.39962419984564679), - FRAC_CONST(0.41084317105790391), - FRAC_CONST(0.42200027079979968), - FRAC_CONST(0.43309381885315196), - FRAC_CONST(0.4441221445704292), - FRAC_CONST(0.45508358712634384), - FRAC_CONST(0.46597649576796618), - FRAC_CONST(0.47679923006332209), - FRAC_CONST(0.487550160148436), - FRAC_CONST(0.49822766697278187), - FRAC_CONST(0.50883014254310699), - FRAC_CONST(0.51935599016558964), - FRAC_CONST(0.52980362468629461), - FRAC_CONST(0.54017147272989285), - FRAC_CONST(0.55045797293660481), - FRAC_CONST(0.56066157619733603), - FRAC_CONST(0.57078074588696726), - FRAC_CONST(0.58081395809576453), - FRAC_CONST(0.59075970185887416), - FRAC_CONST(0.60061647938386897), - FRAC_CONST(0.61038280627630948), - FRAC_CONST(0.6200572117632891), - FRAC_CONST(0.62963823891492698), - FRAC_CONST(0.63912444486377573), - FRAC_CONST(0.64851440102211244), - FRAC_CONST(0.65780669329707864), - FRAC_CONST(0.66699992230363747), - FRAC_CONST(0.67609270357531592), - FRAC_CONST(0.68508366777270036), - FRAC_CONST(0.693971460889654), - FRAC_CONST(0.7027547444572253), - FRAC_CONST(0.71143219574521643), - FRAC_CONST(0.72000250796138165), - FRAC_CONST(0.7284643904482252), - FRAC_CONST(0.73681656887736979), - FRAC_CONST(0.74505778544146595), - FRAC_CONST(0.75318679904361241), - FRAC_CONST(0.76120238548426178), - FRAC_CONST(0.76910333764557959), - FRAC_CONST(0.77688846567323244), - FRAC_CONST(0.78455659715557524), - FRAC_CONST(0.79210657730021239), - FRAC_CONST(0.79953726910790501), - FRAC_CONST(0.80684755354379922), - FRAC_CONST(0.8140363297059483), - FRAC_CONST(0.82110251499110465), - FRAC_CONST(0.8280450452577558), - FRAC_CONST(0.83486287498638001), - FRAC_CONST(0.84155497743689833), - FRAC_CONST(0.84812034480329712), - FRAC_CONST(0.85455798836540053), - FRAC_CONST(0.86086693863776731), - FRAC_CONST(0.86704624551569265), - FRAC_CONST(0.87309497841829009), - FRAC_CONST(0.87901222642863341), - FRAC_CONST(0.88479709843093779), - FRAC_CONST(0.89044872324475788), - FRAC_CONST(0.89596624975618511), - FRAC_CONST(0.90134884704602203), - FRAC_CONST(0.90659570451491533), - FRAC_CONST(0.91170603200542988), - FRAC_CONST(0.9166790599210427), - FRAC_CONST(0.9215140393420419), - FRAC_CONST(0.92621024213831127), - FRAC_CONST(0.93076696107898371), - FRAC_CONST(0.9351835099389475), - FRAC_CONST(0.93945922360218992), - FRAC_CONST(0.94359345816196039), - FRAC_CONST(0.94758559101774109), - FRAC_CONST(0.95143502096900834), - FRAC_CONST(0.95514116830577067), - FRAC_CONST(0.9587034748958716), - FRAC_CONST(0.96212140426904158), - FRAC_CONST(0.9653944416976894), - FRAC_CONST(0.96852209427441727), - FRAC_CONST(0.97150389098625178), - FRAC_CONST(0.97433938278557586), - FRAC_CONST(0.97702814265775439), - FRAC_CONST(0.97956976568544052), - FRAC_CONST(0.98196386910955524), - FRAC_CONST(0.98421009238692903), - FRAC_CONST(0.98630809724459867), - FRAC_CONST(0.98825756773074946), - FRAC_CONST(0.99005821026229712), - FRAC_CONST(0.99170975366909953), - FRAC_CONST(0.9932119492347945), - FRAC_CONST(0.99456457073425542), - FRAC_CONST(0.99576741446765982), - FRAC_CONST(0.99682029929116567), - FRAC_CONST(0.99772306664419164), - FRAC_CONST(0.99847558057329477), - FRAC_CONST(0.99907772775264536), - FRAC_CONST(0.99952941750109314), - FRAC_CONST(0.9998305817958234), - FRAC_CONST(0.99998117528260111), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1) -}; - -#ifdef ALLOW_SMALL_FRAMELENGTH -ALIGN static const real_t ld_mid_480[] = -{ - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0), - FRAC_CONST(0.0065449379673518581), - FRAC_CONST(0.019633692460628301), - FRAC_CONST(0.032719082821776137), - FRAC_CONST(0.045798866936520771), - FRAC_CONST(0.058870803651189033), - FRAC_CONST(0.071932653156719387), - FRAC_CONST(0.084982177372441667), - FRAC_CONST(0.09801714032956059), - FRAC_CONST(0.11103530855427769), - FRAC_CONST(0.12403445145048532), - FRAC_CONST(0.13701234168196802), - FRAC_CONST(0.14996675555404498), - FRAC_CONST(0.16289547339458874), - FRAC_CONST(0.17579627993435451), - FRAC_CONST(0.18866696468655525), - FRAC_CONST(0.2015053223256171), - FRAC_CONST(0.21430915306505074), - FRAC_CONST(0.2270762630343732), - FRAC_CONST(0.23980446465501654), - FRAC_CONST(0.25249157701515795), - FRAC_CONST(0.26513542624340797), - FRAC_CONST(0.27773384588129219), - FRAC_CONST(0.29028467725446233), - FRAC_CONST(0.3027857698425746), - FRAC_CONST(0.31523498164776964), - FRAC_CONST(0.32763017956169349), - FRAC_CONST(0.33996923973099424), - FRAC_CONST(0.35225004792123354), - FRAC_CONST(0.36447049987914965), - FRAC_CONST(0.37662850169321077), - FRAC_CONST(0.38872197015239557), - FRAC_CONST(0.40074883310314097), - FRAC_CONST(0.41270702980439467), - FRAC_CONST(0.42459451128071307), - FRAC_CONST(0.43640924067334208), - FRAC_CONST(0.44814919358922256), - FRAC_CONST(0.45981235844785984), - FRAC_CONST(0.47139673682599764), - FRAC_CONST(0.48290034380003727), - FRAC_CONST(0.49432120828614462), - FRAC_CONST(0.50565737337798455), - FRAC_CONST(0.51690689668202761), - FRAC_CONST(0.52806785065036799), - FRAC_CONST(0.53913832291100017), - FRAC_CONST(0.55011641659549337), - FRAC_CONST(0.56100025066400983), - FRAC_CONST(0.57178796022761225), - FRAC_CONST(0.58247769686780215), - FRAC_CONST(0.59306762895323706), - FRAC_CONST(0.60355594195357143), - FRAC_CONST(0.61394083875036642), - FRAC_CONST(0.62422053994501758), - FRAC_CONST(0.63439328416364549), - FRAC_CONST(0.64445732835889735), - FRAC_CONST(0.65441094810861034), - FRAC_CONST(0.66425243791128175), - FRAC_CONST(0.67398011147829784), - FRAC_CONST(0.68359230202287125), - FRAC_CONST(0.69308736254563585), - FRAC_CONST(0.70246366611685174), - FRAC_CONST(0.71171960615517138), - FRAC_CONST(0.72085359670291882), - FRAC_CONST(0.7298640726978356), - FRAC_CONST(0.73874949024124625), - FRAC_CONST(0.74750832686259672), - FRAC_CONST(0.75613908178032285), - FRAC_CONST(0.76464027615900032), - FRAC_CONST(0.77301045336273699), - FRAC_CONST(0.78124817920475853), - FRAC_CONST(0.78935204219315003), - FRAC_CONST(0.79732065377270711), - FRAC_CONST(0.80515264856285829), - FRAC_CONST(0.81284668459161513), - FRAC_CONST(0.82040144352551359), - FRAC_CONST(0.82781563089550203), - FRAC_CONST(0.83508797631874299), - FRAC_CONST(0.84221723371628654), - FRAC_CONST(0.84920218152657889), - FRAC_CONST(0.85604162291477137), - FRAC_CONST(0.86273438597779184), - FRAC_CONST(0.86927932394514362), - FRAC_CONST(0.87567531537539967), - FRAC_CONST(0.88192126434835494), - FRAC_CONST(0.88801610065280734), - FRAC_CONST(0.89395877996993212), - FRAC_CONST(0.8997482840522214), - FRAC_CONST(0.90538362089795521), - FRAC_CONST(0.91086382492117568), - FRAC_CONST(0.91618795711713596), - FRAC_CONST(0.92135510522319242), - FRAC_CONST(0.9263643838751181), - FRAC_CONST(0.93121493475880346), - FRAC_CONST(0.93590592675732565), - FRAC_CONST(0.94043655609335486), - FRAC_CONST(0.94480604646687805), - FRAC_CONST(0.94901364918821385), - FRAC_CONST(0.95305864330629697), - FRAC_CONST(0.95694033573220882), - FRAC_CONST(0.9606580613579353), - FRAC_CONST(0.96421118317032928), - FRAC_CONST(0.96759909236025976), - FRAC_CONST(0.9708212084269281), - FRAC_CONST(0.97387697927733363), - FRAC_CONST(0.97676588132087239), - FRAC_CONST(0.97948741955905139), - FRAC_CONST(0.98204112767030394), - FRAC_CONST(0.98442656808989171), - FRAC_CONST(0.98664333208487898), - FRAC_CONST(0.98869103982416728), - FRAC_CONST(0.99056934044357725), - FRAC_CONST(0.99227791210596705), - FRAC_CONST(0.99381646205637808), - FRAC_CONST(0.99518472667219682), - FRAC_CONST(0.99638247150832537), - FRAC_CONST(0.99740949133735191), - FRAC_CONST(0.99826561018471593), - FRAC_CONST(0.99895068135886012), - FRAC_CONST(0.99946458747636568), - FRAC_CONST(0.99980724048206482), - FRAC_CONST(0.99997858166412923), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1), - FRAC_CONST(1) -}; -#endif -#endif - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: sine_win.h,v 1.19 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SINE_WIN_H__ +#define __SINE_WIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + +ALIGN static const real_t sine_long_1024[] = +{ + FRAC_CONST(0.00076699031874270449), + FRAC_CONST(0.002300969151425805), + FRAC_CONST(0.0038349425697062275), + FRAC_CONST(0.0053689069639963425), + FRAC_CONST(0.0069028587247297558), + FRAC_CONST(0.0084367942423697988), + FRAC_CONST(0.0099707099074180308), + FRAC_CONST(0.011504602110422714), + FRAC_CONST(0.013038467241987334), + FRAC_CONST(0.014572301692779064), + FRAC_CONST(0.016106101853537287), + FRAC_CONST(0.017639864115082053), + FRAC_CONST(0.019173584868322623), + FRAC_CONST(0.020707260504265895), + FRAC_CONST(0.022240887414024961), + FRAC_CONST(0.023774461988827555), + FRAC_CONST(0.025307980620024571), + FRAC_CONST(0.026841439699098531), + FRAC_CONST(0.028374835617672099), + FRAC_CONST(0.029908164767516555), + FRAC_CONST(0.031441423540560301), + FRAC_CONST(0.032974608328897335), + FRAC_CONST(0.03450771552479575), + FRAC_CONST(0.036040741520706229), + FRAC_CONST(0.037573682709270494), + FRAC_CONST(0.039106535483329888), + FRAC_CONST(0.040639296235933736), + FRAC_CONST(0.042171961360347947), + FRAC_CONST(0.043704527250063421), + FRAC_CONST(0.04523699029880459), + FRAC_CONST(0.046769346900537863), + FRAC_CONST(0.048301593449480144), + FRAC_CONST(0.049833726340107277), + FRAC_CONST(0.051365741967162593), + FRAC_CONST(0.052897636725665324), + FRAC_CONST(0.054429407010919133), + FRAC_CONST(0.055961049218520569), + FRAC_CONST(0.057492559744367566), + FRAC_CONST(0.059023934984667931), + FRAC_CONST(0.060555171335947788), + FRAC_CONST(0.062086265195060088), + FRAC_CONST(0.063617212959193106), + FRAC_CONST(0.065148011025878833), + FRAC_CONST(0.066678655793001557), + FRAC_CONST(0.068209143658806329), + FRAC_CONST(0.069739471021907307), + FRAC_CONST(0.071269634281296401), + FRAC_CONST(0.072799629836351673), + FRAC_CONST(0.074329454086845756), + FRAC_CONST(0.075859103432954447), + FRAC_CONST(0.077388574275265049), + FRAC_CONST(0.078917863014784942), + FRAC_CONST(0.080446966052950014), + FRAC_CONST(0.081975879791633066), + FRAC_CONST(0.083504600633152432), + FRAC_CONST(0.085033124980280275), + FRAC_CONST(0.08656144923625117), + FRAC_CONST(0.088089569804770507), + FRAC_CONST(0.089617483090022959), + FRAC_CONST(0.091145185496681005), + FRAC_CONST(0.09267267342991331), + FRAC_CONST(0.094199943295393204), + FRAC_CONST(0.095726991499307162), + FRAC_CONST(0.097253814448363271), + FRAC_CONST(0.098780408549799623), + FRAC_CONST(0.10030677021139286), + FRAC_CONST(0.10183289584146653), + FRAC_CONST(0.10335878184889961), + FRAC_CONST(0.10488442464313497), + FRAC_CONST(0.10640982063418768), + FRAC_CONST(0.10793496623265365), + FRAC_CONST(0.10945985784971798), + FRAC_CONST(0.11098449189716339), + FRAC_CONST(0.11250886478737869), + FRAC_CONST(0.1140329729333672), + FRAC_CONST(0.11555681274875526), + FRAC_CONST(0.11708038064780059), + FRAC_CONST(0.11860367304540072), + FRAC_CONST(0.1201266863571015), + FRAC_CONST(0.12164941699910553), + FRAC_CONST(0.12317186138828048), + FRAC_CONST(0.12469401594216764), + FRAC_CONST(0.12621587707899035), + FRAC_CONST(0.12773744121766231), + FRAC_CONST(0.12925870477779614), + FRAC_CONST(0.13077966417971171), + FRAC_CONST(0.13230031584444465), + FRAC_CONST(0.13382065619375472), + FRAC_CONST(0.13534068165013421), + FRAC_CONST(0.13686038863681638), + FRAC_CONST(0.13837977357778389), + FRAC_CONST(0.13989883289777721), + FRAC_CONST(0.14141756302230302), + FRAC_CONST(0.14293596037764267), + FRAC_CONST(0.14445402139086047), + FRAC_CONST(0.14597174248981221), + FRAC_CONST(0.14748912010315357), + FRAC_CONST(0.14900615066034845), + FRAC_CONST(0.1505228305916774), + FRAC_CONST(0.15203915632824605), + FRAC_CONST(0.15355512430199345), + FRAC_CONST(0.15507073094570051), + FRAC_CONST(0.15658597269299843), + FRAC_CONST(0.15810084597837698), + FRAC_CONST(0.15961534723719306), + FRAC_CONST(0.16112947290567881), + FRAC_CONST(0.16264321942095031), + FRAC_CONST(0.16415658322101581), + FRAC_CONST(0.16566956074478412), + FRAC_CONST(0.16718214843207294), + FRAC_CONST(0.16869434272361733), + FRAC_CONST(0.17020614006107807), + FRAC_CONST(0.17171753688704997), + FRAC_CONST(0.17322852964507032), + FRAC_CONST(0.1747391147796272), + FRAC_CONST(0.17624928873616788), + FRAC_CONST(0.17775904796110717), + FRAC_CONST(0.17926838890183575), + FRAC_CONST(0.18077730800672859), + FRAC_CONST(0.1822858017251533), + FRAC_CONST(0.18379386650747845), + FRAC_CONST(0.1853014988050819), + FRAC_CONST(0.18680869507035927), + FRAC_CONST(0.18831545175673212), + FRAC_CONST(0.18982176531865641), + FRAC_CONST(0.1913276322116309), + FRAC_CONST(0.19283304889220523), + FRAC_CONST(0.1943380118179886), + FRAC_CONST(0.19584251744765785), + FRAC_CONST(0.19734656224096592), + FRAC_CONST(0.19885014265875009), + FRAC_CONST(0.20035325516294045), + FRAC_CONST(0.20185589621656805), + FRAC_CONST(0.20335806228377332), + FRAC_CONST(0.20485974982981442), + FRAC_CONST(0.20636095532107551), + FRAC_CONST(0.20786167522507507), + FRAC_CONST(0.20936190601047416), + FRAC_CONST(0.21086164414708486), + FRAC_CONST(0.21236088610587842), + FRAC_CONST(0.21385962835899375), + FRAC_CONST(0.21535786737974555), + FRAC_CONST(0.21685559964263262), + FRAC_CONST(0.21835282162334632), + FRAC_CONST(0.2198495297987787), + FRAC_CONST(0.22134572064703081), + FRAC_CONST(0.22284139064742112), + FRAC_CONST(0.2243365362804936), + FRAC_CONST(0.22583115402802617), + FRAC_CONST(0.22732524037303886), + FRAC_CONST(0.22881879179980222), + FRAC_CONST(0.23031180479384544), + FRAC_CONST(0.23180427584196478), + FRAC_CONST(0.23329620143223159), + FRAC_CONST(0.23478757805400097), + FRAC_CONST(0.23627840219791957), + FRAC_CONST(0.23776867035593419), + FRAC_CONST(0.23925837902129998), + FRAC_CONST(0.24074752468858843), + FRAC_CONST(0.24223610385369601), + FRAC_CONST(0.24372411301385216), + FRAC_CONST(0.24521154866762754), + FRAC_CONST(0.24669840731494241), + FRAC_CONST(0.24818468545707478), + FRAC_CONST(0.24967037959666857), + FRAC_CONST(0.25115548623774192), + FRAC_CONST(0.25264000188569552), + FRAC_CONST(0.25412392304732062), + FRAC_CONST(0.25560724623080738), + FRAC_CONST(0.25708996794575312), + FRAC_CONST(0.25857208470317034), + FRAC_CONST(0.26005359301549519), + FRAC_CONST(0.26153448939659552), + FRAC_CONST(0.263014770361779), + FRAC_CONST(0.26449443242780163), + FRAC_CONST(0.26597347211287559), + FRAC_CONST(0.26745188593667762), + FRAC_CONST(0.26892967042035726), + FRAC_CONST(0.27040682208654482), + FRAC_CONST(0.27188333745935972), + FRAC_CONST(0.27335921306441868), + FRAC_CONST(0.27483444542884394), + FRAC_CONST(0.27630903108127108), + FRAC_CONST(0.27778296655185769), + FRAC_CONST(0.27925624837229118), + FRAC_CONST(0.28072887307579719), + FRAC_CONST(0.28220083719714756), + FRAC_CONST(0.28367213727266843), + FRAC_CONST(0.28514276984024867), + FRAC_CONST(0.28661273143934779), + FRAC_CONST(0.28808201861100413), + FRAC_CONST(0.28955062789784303), + FRAC_CONST(0.29101855584408509), + FRAC_CONST(0.29248579899555388), + FRAC_CONST(0.29395235389968466), + FRAC_CONST(0.29541821710553201), + FRAC_CONST(0.29688338516377827), + FRAC_CONST(0.2983478546267414), + FRAC_CONST(0.29981162204838335), + FRAC_CONST(0.30127468398431795), + FRAC_CONST(0.30273703699181914), + FRAC_CONST(0.30419867762982911), + FRAC_CONST(0.30565960245896612), + FRAC_CONST(0.3071198080415331), + FRAC_CONST(0.30857929094152509), + FRAC_CONST(0.31003804772463789), + FRAC_CONST(0.31149607495827591), + FRAC_CONST(0.3129533692115602), + FRAC_CONST(0.31440992705533666), + FRAC_CONST(0.31586574506218396), + FRAC_CONST(0.31732081980642174), + FRAC_CONST(0.31877514786411848), + FRAC_CONST(0.32022872581309986), + FRAC_CONST(0.32168155023295658), + FRAC_CONST(0.32313361770505233), + FRAC_CONST(0.32458492481253215), + FRAC_CONST(0.32603546814033024), + FRAC_CONST(0.327485244275178), + FRAC_CONST(0.3289342498056122), + FRAC_CONST(0.33038248132198278), + FRAC_CONST(0.33182993541646111), + FRAC_CONST(0.33327660868304793), + FRAC_CONST(0.33472249771758122), + FRAC_CONST(0.33616759911774452), + FRAC_CONST(0.33761190948307462), + FRAC_CONST(0.33905542541496964), + FRAC_CONST(0.34049814351669716), + FRAC_CONST(0.34194006039340219), + FRAC_CONST(0.34338117265211504), + FRAC_CONST(0.34482147690175929), + FRAC_CONST(0.34626096975316001), + FRAC_CONST(0.34769964781905138), + FRAC_CONST(0.34913750771408497), + FRAC_CONST(0.35057454605483751), + FRAC_CONST(0.35201075945981908), + FRAC_CONST(0.35344614454948081), + FRAC_CONST(0.35488069794622279), + FRAC_CONST(0.35631441627440241), + FRAC_CONST(0.3577472961603419), + FRAC_CONST(0.3591793342323365), + FRAC_CONST(0.36061052712066227), + FRAC_CONST(0.36204087145758418), + FRAC_CONST(0.36347036387736376), + FRAC_CONST(0.36489900101626732), + FRAC_CONST(0.36632677951257359), + FRAC_CONST(0.36775369600658198), + FRAC_CONST(0.36917974714062002), + FRAC_CONST(0.37060492955905167), + FRAC_CONST(0.37202923990828501), + FRAC_CONST(0.3734526748367803), + FRAC_CONST(0.37487523099505754), + FRAC_CONST(0.37629690503570479), + FRAC_CONST(0.37771769361338564), + FRAC_CONST(0.37913759338484732), + FRAC_CONST(0.38055660100892852), + FRAC_CONST(0.38197471314656722), + FRAC_CONST(0.38339192646080866), + FRAC_CONST(0.38480823761681288), + FRAC_CONST(0.38622364328186298), + FRAC_CONST(0.38763814012537273), + FRAC_CONST(0.38905172481889438), + FRAC_CONST(0.39046439403612659), + FRAC_CONST(0.39187614445292235), + FRAC_CONST(0.3932869727472964), + FRAC_CONST(0.39469687559943356), + FRAC_CONST(0.39610584969169627), + FRAC_CONST(0.39751389170863233), + FRAC_CONST(0.39892099833698291), + FRAC_CONST(0.40032716626569009), + FRAC_CONST(0.40173239218590501), + FRAC_CONST(0.4031366727909953), + FRAC_CONST(0.404540004776553), + FRAC_CONST(0.40594238484040251), + FRAC_CONST(0.40734380968260797), + FRAC_CONST(0.40874427600548136), + FRAC_CONST(0.41014378051359024), + FRAC_CONST(0.41154231991376522), + FRAC_CONST(0.41293989091510808), + FRAC_CONST(0.4143364902289991), + FRAC_CONST(0.41573211456910536), + FRAC_CONST(0.41712676065138787), + FRAC_CONST(0.4185204251941097), + FRAC_CONST(0.41991310491784362), + FRAC_CONST(0.42130479654547964), + FRAC_CONST(0.42269549680223295), + FRAC_CONST(0.42408520241565156), + FRAC_CONST(0.4254739101156238), + FRAC_CONST(0.42686161663438643), + FRAC_CONST(0.42824831870653196), + FRAC_CONST(0.42963401306901638), + FRAC_CONST(0.43101869646116703), + FRAC_CONST(0.43240236562469014), + FRAC_CONST(0.43378501730367852), + FRAC_CONST(0.43516664824461926), + FRAC_CONST(0.4365472551964012), + FRAC_CONST(0.43792683491032286), + FRAC_CONST(0.43930538414009995), + FRAC_CONST(0.4406828996418729), + FRAC_CONST(0.4420593781742147), + FRAC_CONST(0.44343481649813848), + FRAC_CONST(0.44480921137710488), + FRAC_CONST(0.44618255957703007), + FRAC_CONST(0.44755485786629301), + FRAC_CONST(0.44892610301574326), + FRAC_CONST(0.45029629179870861), + FRAC_CONST(0.45166542099100249), + FRAC_CONST(0.45303348737093158), + FRAC_CONST(0.45440048771930358), + FRAC_CONST(0.45576641881943464), + FRAC_CONST(0.45713127745715698), + FRAC_CONST(0.45849506042082627), + FRAC_CONST(0.45985776450132954), + FRAC_CONST(0.46121938649209238), + FRAC_CONST(0.46257992318908681), + FRAC_CONST(0.46393937139083852), + FRAC_CONST(0.4652977278984346), + FRAC_CONST(0.46665498951553092), + FRAC_CONST(0.46801115304835983), + FRAC_CONST(0.46936621530573752), + FRAC_CONST(0.4707201730990716), + FRAC_CONST(0.47207302324236866), + FRAC_CONST(0.47342476255224153), + FRAC_CONST(0.47477538784791712), + FRAC_CONST(0.47612489595124358), + FRAC_CONST(0.47747328368669806), + FRAC_CONST(0.47882054788139389), + FRAC_CONST(0.48016668536508839), + FRAC_CONST(0.48151169297018986), + FRAC_CONST(0.48285556753176567), + FRAC_CONST(0.48419830588754903), + FRAC_CONST(0.48553990487794696), + FRAC_CONST(0.48688036134604734), + FRAC_CONST(0.48821967213762679), + FRAC_CONST(0.48955783410115744), + FRAC_CONST(0.49089484408781509), + FRAC_CONST(0.49223069895148602), + FRAC_CONST(0.49356539554877477), + FRAC_CONST(0.49489893073901126), + FRAC_CONST(0.49623130138425825), + FRAC_CONST(0.49756250434931915), + FRAC_CONST(0.49889253650174459), + FRAC_CONST(0.50022139471184068), + FRAC_CONST(0.50154907585267539), + FRAC_CONST(0.50287557680008699), + FRAC_CONST(0.50420089443269034), + FRAC_CONST(0.50552502563188539), + FRAC_CONST(0.50684796728186321), + FRAC_CONST(0.5081697162696146), + FRAC_CONST(0.50949026948493636), + FRAC_CONST(0.51080962382043904), + FRAC_CONST(0.51212777617155469), + FRAC_CONST(0.51344472343654346), + FRAC_CONST(0.5147604625165012), + FRAC_CONST(0.51607499031536663), + FRAC_CONST(0.51738830373992906), + FRAC_CONST(0.51870039969983495), + FRAC_CONST(0.52001127510759604), + FRAC_CONST(0.52132092687859566), + FRAC_CONST(0.52262935193109661), + FRAC_CONST(0.5239365471862486), + FRAC_CONST(0.52524250956809471), + FRAC_CONST(0.52654723600357944), + FRAC_CONST(0.52785072342255523), + FRAC_CONST(0.52915296875779061), + FRAC_CONST(0.53045396894497632), + FRAC_CONST(0.53175372092273332), + FRAC_CONST(0.53305222163261945), + FRAC_CONST(0.53434946801913752), + FRAC_CONST(0.53564545702974109), + FRAC_CONST(0.53694018561484291), + FRAC_CONST(0.5382336507278217), + FRAC_CONST(0.53952584932502889), + FRAC_CONST(0.54081677836579667), + FRAC_CONST(0.54210643481244392), + FRAC_CONST(0.5433948156302848), + FRAC_CONST(0.54468191778763453), + FRAC_CONST(0.54596773825581757), + FRAC_CONST(0.54725227400917409), + FRAC_CONST(0.54853552202506739), + FRAC_CONST(0.54981747928389091), + FRAC_CONST(0.55109814276907543), + FRAC_CONST(0.55237750946709607), + FRAC_CONST(0.55365557636747931), + FRAC_CONST(0.55493234046281037), + FRAC_CONST(0.55620779874873993), + FRAC_CONST(0.55748194822399155), + FRAC_CONST(0.55875478589036831), + FRAC_CONST(0.56002630875276038), + FRAC_CONST(0.56129651381915147), + FRAC_CONST(0.56256539810062656), + FRAC_CONST(0.56383295861137817), + FRAC_CONST(0.56509919236871398), + FRAC_CONST(0.56636409639306384), + FRAC_CONST(0.56762766770798623), + FRAC_CONST(0.56888990334017586), + FRAC_CONST(0.5701508003194703), + FRAC_CONST(0.57141035567885723), + FRAC_CONST(0.57266856645448116), + FRAC_CONST(0.57392542968565075), + FRAC_CONST(0.57518094241484508), + FRAC_CONST(0.57643510168772183), + FRAC_CONST(0.5776879045531228), + FRAC_CONST(0.57893934806308178), + FRAC_CONST(0.58018942927283168), + FRAC_CONST(0.58143814524081017), + FRAC_CONST(0.58268549302866846), + FRAC_CONST(0.58393146970127618), + FRAC_CONST(0.58517607232673041), + FRAC_CONST(0.5864192979763605), + FRAC_CONST(0.58766114372473666), + FRAC_CONST(0.58890160664967572), + FRAC_CONST(0.59014068383224882), + FRAC_CONST(0.59137837235678758), + FRAC_CONST(0.59261466931089113), + FRAC_CONST(0.59384957178543363), + FRAC_CONST(0.59508307687456996), + FRAC_CONST(0.59631518167574371), + FRAC_CONST(0.59754588328969316), + FRAC_CONST(0.59877517882045872), + FRAC_CONST(0.60000306537538894), + FRAC_CONST(0.6012295400651485), + FRAC_CONST(0.60245460000372375), + FRAC_CONST(0.60367824230843037), + FRAC_CONST(0.60490046409991982), + FRAC_CONST(0.60612126250218612), + FRAC_CONST(0.60734063464257293), + FRAC_CONST(0.60855857765177945), + FRAC_CONST(0.60977508866386843), + FRAC_CONST(0.61099016481627166), + FRAC_CONST(0.61220380324979795), + FRAC_CONST(0.61341600110863859), + FRAC_CONST(0.61462675554037505), + FRAC_CONST(0.61583606369598509), + FRAC_CONST(0.61704392272984976), + FRAC_CONST(0.61825032979976025), + FRAC_CONST(0.61945528206692402), + FRAC_CONST(0.62065877669597214), + FRAC_CONST(0.62186081085496536), + FRAC_CONST(0.62306138171540126), + FRAC_CONST(0.62426048645222065), + FRAC_CONST(0.62545812224381436), + FRAC_CONST(0.62665428627202935), + FRAC_CONST(0.62784897572217646), + FRAC_CONST(0.629042187783036), + FRAC_CONST(0.63023391964686437), + FRAC_CONST(0.63142416850940186), + FRAC_CONST(0.63261293156987741), + FRAC_CONST(0.63380020603101728), + FRAC_CONST(0.63498598909904946), + FRAC_CONST(0.63617027798371217), + FRAC_CONST(0.63735306989825913), + FRAC_CONST(0.63853436205946679), + FRAC_CONST(0.63971415168764045), + FRAC_CONST(0.64089243600662138), + FRAC_CONST(0.64206921224379254), + FRAC_CONST(0.64324447763008585), + FRAC_CONST(0.64441822939998838), + FRAC_CONST(0.64559046479154869), + FRAC_CONST(0.64676118104638392), + FRAC_CONST(0.64793037540968534), + FRAC_CONST(0.64909804513022595), + FRAC_CONST(0.65026418746036585), + FRAC_CONST(0.65142879965605982), + FRAC_CONST(0.65259187897686244), + FRAC_CONST(0.65375342268593606), + FRAC_CONST(0.65491342805005603), + FRAC_CONST(0.6560718923396176), + FRAC_CONST(0.65722881282864254), + FRAC_CONST(0.65838418679478505), + FRAC_CONST(0.65953801151933866), + FRAC_CONST(0.6606902842872423), + FRAC_CONST(0.66184100238708687), + FRAC_CONST(0.66299016311112147), + FRAC_CONST(0.66413776375526001), + FRAC_CONST(0.66528380161908718), + FRAC_CONST(0.66642827400586524), + FRAC_CONST(0.66757117822254031), + FRAC_CONST(0.66871251157974798), + FRAC_CONST(0.66985227139182102), + FRAC_CONST(0.67099045497679422), + FRAC_CONST(0.67212705965641173), + FRAC_CONST(0.67326208275613297), + FRAC_CONST(0.67439552160513905), + FRAC_CONST(0.67552737353633852), + FRAC_CONST(0.67665763588637495), + FRAC_CONST(0.6777863059956315), + FRAC_CONST(0.67891338120823841), + FRAC_CONST(0.68003885887207893), + FRAC_CONST(0.68116273633879543), + FRAC_CONST(0.68228501096379557), + FRAC_CONST(0.68340568010625868), + FRAC_CONST(0.6845247411291423), + FRAC_CONST(0.68564219139918747), + FRAC_CONST(0.68675802828692589), + FRAC_CONST(0.68787224916668555), + FRAC_CONST(0.68898485141659704), + FRAC_CONST(0.69009583241859995), + FRAC_CONST(0.69120518955844845), + FRAC_CONST(0.69231292022571822), + FRAC_CONST(0.69341902181381176), + FRAC_CONST(0.69452349171996552), + FRAC_CONST(0.69562632734525487), + FRAC_CONST(0.6967275260946012), + FRAC_CONST(0.69782708537677729), + FRAC_CONST(0.69892500260441415), + FRAC_CONST(0.70002127519400625), + FRAC_CONST(0.70111590056591866), + FRAC_CONST(0.70220887614439187), + FRAC_CONST(0.70330019935754873), + FRAC_CONST(0.70438986763740041), + FRAC_CONST(0.7054778784198521), + FRAC_CONST(0.70656422914470951), + FRAC_CONST(0.70764891725568435), + FRAC_CONST(0.70873194020040065), + FRAC_CONST(0.70981329543040084), + FRAC_CONST(0.71089298040115168), + FRAC_CONST(0.71197099257204999), + FRAC_CONST(0.71304732940642923), + FRAC_CONST(0.71412198837156471), + FRAC_CONST(0.71519496693868001), + FRAC_CONST(0.71626626258295312), + FRAC_CONST(0.71733587278352173), + FRAC_CONST(0.71840379502348972), + FRAC_CONST(0.71947002678993299), + FRAC_CONST(0.72053456557390527), + FRAC_CONST(0.72159740887044366), + FRAC_CONST(0.72265855417857561), + FRAC_CONST(0.72371799900132339), + FRAC_CONST(0.72477574084571128), + FRAC_CONST(0.72583177722277037), + FRAC_CONST(0.72688610564754497), + FRAC_CONST(0.72793872363909862), + FRAC_CONST(0.72898962872051931), + FRAC_CONST(0.73003881841892615), + FRAC_CONST(0.73108629026547423), + FRAC_CONST(0.73213204179536129), + FRAC_CONST(0.73317607054783274), + FRAC_CONST(0.73421837406618817), + FRAC_CONST(0.73525894989778673), + FRAC_CONST(0.73629779559405306), + FRAC_CONST(0.73733490871048279), + FRAC_CONST(0.73837028680664851), + FRAC_CONST(0.73940392744620576), + FRAC_CONST(0.74043582819689802), + FRAC_CONST(0.74146598663056329), + FRAC_CONST(0.74249440032313918), + FRAC_CONST(0.74352106685466912), + FRAC_CONST(0.74454598380930725), + FRAC_CONST(0.74556914877532543), + FRAC_CONST(0.74659055934511731), + FRAC_CONST(0.74761021311520515), + FRAC_CONST(0.74862810768624533), + FRAC_CONST(0.74964424066303348), + FRAC_CONST(0.75065860965451059), + FRAC_CONST(0.75167121227376843), + FRAC_CONST(0.75268204613805523), + FRAC_CONST(0.75369110886878121), + FRAC_CONST(0.75469839809152439), + FRAC_CONST(0.75570391143603588), + FRAC_CONST(0.75670764653624567), + FRAC_CONST(0.75770960103026808), + FRAC_CONST(0.75870977256040739), + FRAC_CONST(0.75970815877316344), + FRAC_CONST(0.76070475731923692), + FRAC_CONST(0.76169956585353527), + FRAC_CONST(0.76269258203517787), + FRAC_CONST(0.76368380352750187), + FRAC_CONST(0.76467322799806714), + FRAC_CONST(0.76566085311866239), + FRAC_CONST(0.76664667656531038), + FRAC_CONST(0.76763069601827327), + FRAC_CONST(0.76861290916205827), + FRAC_CONST(0.76959331368542294), + FRAC_CONST(0.7705719072813807), + FRAC_CONST(0.7715486876472063), + FRAC_CONST(0.77252365248444133), + FRAC_CONST(0.77349679949889905), + FRAC_CONST(0.77446812640067086), + FRAC_CONST(0.77543763090413043), + FRAC_CONST(0.77640531072794039), + FRAC_CONST(0.7773711635950562), + FRAC_CONST(0.77833518723273309), + FRAC_CONST(0.7792973793725303), + FRAC_CONST(0.78025773775031659), + FRAC_CONST(0.78121626010627609), + FRAC_CONST(0.7821729441849129), + FRAC_CONST(0.78312778773505731), + FRAC_CONST(0.78408078850986995), + FRAC_CONST(0.78503194426684808), + FRAC_CONST(0.78598125276783015), + FRAC_CONST(0.7869287117790017), + FRAC_CONST(0.78787431907090011), + FRAC_CONST(0.78881807241842017), + FRAC_CONST(0.78975996960081907), + FRAC_CONST(0.79070000840172161), + FRAC_CONST(0.79163818660912577), + FRAC_CONST(0.79257450201540758), + FRAC_CONST(0.79350895241732666), + FRAC_CONST(0.79444153561603059), + FRAC_CONST(0.79537224941706119), + FRAC_CONST(0.79630109163035911), + FRAC_CONST(0.7972280600702687), + FRAC_CONST(0.79815315255554375), + FRAC_CONST(0.79907636690935235), + FRAC_CONST(0.79999770095928191), + FRAC_CONST(0.8009171525373443), + FRAC_CONST(0.80183471947998131), + FRAC_CONST(0.80275039962806916), + FRAC_CONST(0.80366419082692409), + FRAC_CONST(0.804576090926307), + FRAC_CONST(0.80548609778042912), + FRAC_CONST(0.80639420924795624), + FRAC_CONST(0.80730042319201445), + FRAC_CONST(0.80820473748019472), + FRAC_CONST(0.80910714998455813), + FRAC_CONST(0.81000765858164114), + FRAC_CONST(0.81090626115245967), + FRAC_CONST(0.81180295558251536), + FRAC_CONST(0.81269773976179949), + FRAC_CONST(0.81359061158479851), + FRAC_CONST(0.81448156895049861), + FRAC_CONST(0.81537060976239129), + FRAC_CONST(0.81625773192847739), + FRAC_CONST(0.81714293336127297), + FRAC_CONST(0.81802621197781344), + FRAC_CONST(0.81890756569965895), + FRAC_CONST(0.81978699245289899), + FRAC_CONST(0.82066449016815746), + FRAC_CONST(0.82154005678059761), + FRAC_CONST(0.82241369022992639), + FRAC_CONST(0.82328538846040011), + FRAC_CONST(0.82415514942082857), + FRAC_CONST(0.82502297106458022), + FRAC_CONST(0.82588885134958678), + FRAC_CONST(0.82675278823834852), + FRAC_CONST(0.8276147796979384), + FRAC_CONST(0.82847482370000713), + FRAC_CONST(0.82933291822078825), + FRAC_CONST(0.83018906124110237), + FRAC_CONST(0.83104325074636232), + FRAC_CONST(0.83189548472657759), + FRAC_CONST(0.83274576117635946), + FRAC_CONST(0.83359407809492514), + FRAC_CONST(0.83444043348610319), + FRAC_CONST(0.83528482535833737), + FRAC_CONST(0.83612725172469216), + FRAC_CONST(0.83696771060285702), + FRAC_CONST(0.83780620001515094), + FRAC_CONST(0.8386427179885273), + FRAC_CONST(0.83947726255457855), + FRAC_CONST(0.84030983174954077), + FRAC_CONST(0.84114042361429808), + FRAC_CONST(0.84196903619438768), + FRAC_CONST(0.84279566754000412), + FRAC_CONST(0.84362031570600404), + FRAC_CONST(0.84444297875191066), + FRAC_CONST(0.84526365474191822), + FRAC_CONST(0.84608234174489694), + FRAC_CONST(0.84689903783439735), + FRAC_CONST(0.84771374108865427), + FRAC_CONST(0.84852644959059265), + FRAC_CONST(0.84933716142783067), + FRAC_CONST(0.85014587469268521), + FRAC_CONST(0.85095258748217573), + FRAC_CONST(0.85175729789802912), + FRAC_CONST(0.85256000404668397), + FRAC_CONST(0.85336070403929543), + FRAC_CONST(0.85415939599173873), + FRAC_CONST(0.85495607802461482), + FRAC_CONST(0.85575074826325392), + FRAC_CONST(0.85654340483771996), + FRAC_CONST(0.85733404588281559), + FRAC_CONST(0.85812266953808602), + FRAC_CONST(0.8589092739478239), + FRAC_CONST(0.85969385726107261), + FRAC_CONST(0.86047641763163207), + FRAC_CONST(0.86125695321806206), + FRAC_CONST(0.86203546218368721), + FRAC_CONST(0.86281194269660033), + FRAC_CONST(0.86358639292966799), + FRAC_CONST(0.86435881106053403), + FRAC_CONST(0.86512919527162369), + FRAC_CONST(0.86589754375014882), + FRAC_CONST(0.86666385468811102), + FRAC_CONST(0.86742812628230692), + FRAC_CONST(0.86819035673433131), + FRAC_CONST(0.86895054425058238), + FRAC_CONST(0.86970868704226556), + FRAC_CONST(0.87046478332539767), + FRAC_CONST(0.8712188313208109), + FRAC_CONST(0.8719708292541577), + FRAC_CONST(0.8727207753559143), + FRAC_CONST(0.87346866786138488), + FRAC_CONST(0.8742145050107063), + FRAC_CONST(0.87495828504885154), + FRAC_CONST(0.8757000062256346), + FRAC_CONST(0.87643966679571361), + FRAC_CONST(0.87717726501859594), + FRAC_CONST(0.87791279915864173), + FRAC_CONST(0.87864626748506813), + FRAC_CONST(0.87937766827195318), + FRAC_CONST(0.88010699979824036), + FRAC_CONST(0.88083426034774204), + FRAC_CONST(0.88155944820914378), + FRAC_CONST(0.8822825616760086), + FRAC_CONST(0.88300359904678072), + FRAC_CONST(0.88372255862478966), + FRAC_CONST(0.8844394387182537), + FRAC_CONST(0.88515423764028511), + FRAC_CONST(0.88586695370889279), + FRAC_CONST(0.88657758524698704), + FRAC_CONST(0.88728613058238315), + FRAC_CONST(0.88799258804780556), + FRAC_CONST(0.88869695598089171), + FRAC_CONST(0.88939923272419552), + FRAC_CONST(0.89009941662519221), + FRAC_CONST(0.89079750603628149), + FRAC_CONST(0.89149349931479138), + FRAC_CONST(0.89218739482298248), + FRAC_CONST(0.89287919092805168), + FRAC_CONST(0.89356888600213602), + FRAC_CONST(0.89425647842231604), + FRAC_CONST(0.89494196657062075), + FRAC_CONST(0.89562534883403), + FRAC_CONST(0.89630662360447966), + FRAC_CONST(0.89698578927886397), + FRAC_CONST(0.89766284425904075), + FRAC_CONST(0.89833778695183419), + FRAC_CONST(0.89901061576903907), + FRAC_CONST(0.89968132912742393), + FRAC_CONST(0.9003499254487356), + FRAC_CONST(0.90101640315970233), + FRAC_CONST(0.90168076069203773), + FRAC_CONST(0.9023429964824442), + FRAC_CONST(0.90300310897261704), + FRAC_CONST(0.90366109660924798), + FRAC_CONST(0.90431695784402832), + FRAC_CONST(0.90497069113365325), + FRAC_CONST(0.90562229493982516), + FRAC_CONST(0.90627176772925766), + FRAC_CONST(0.90691910797367803), + FRAC_CONST(0.90756431414983252), + FRAC_CONST(0.9082073847394887), + FRAC_CONST(0.90884831822943912), + FRAC_CONST(0.90948711311150543), + FRAC_CONST(0.91012376788254157), + FRAC_CONST(0.91075828104443757), + FRAC_CONST(0.91139065110412232), + FRAC_CONST(0.91202087657356823), + FRAC_CONST(0.9126489559697939), + FRAC_CONST(0.91327488781486776), + FRAC_CONST(0.91389867063591168), + FRAC_CONST(0.91452030296510445), + FRAC_CONST(0.91513978333968526), + FRAC_CONST(0.91575711030195672), + FRAC_CONST(0.91637228239928914), + FRAC_CONST(0.91698529818412289), + FRAC_CONST(0.91759615621397295), + FRAC_CONST(0.9182048550514309), + FRAC_CONST(0.91881139326416994), + FRAC_CONST(0.91941576942494696), + FRAC_CONST(0.92001798211160657), + FRAC_CONST(0.92061802990708386), + FRAC_CONST(0.92121591139940873), + FRAC_CONST(0.92181162518170812), + FRAC_CONST(0.92240516985220988), + FRAC_CONST(0.92299654401424625), + FRAC_CONST(0.92358574627625656), + FRAC_CONST(0.9241727752517912), + FRAC_CONST(0.92475762955951391), + FRAC_CONST(0.9253403078232062), + FRAC_CONST(0.92592080867176996), + FRAC_CONST(0.92649913073923051), + FRAC_CONST(0.9270752726647401), + FRAC_CONST(0.92764923309258118), + FRAC_CONST(0.92822101067216944), + FRAC_CONST(0.92879060405805702), + FRAC_CONST(0.9293580119099355), + FRAC_CONST(0.92992323289263956), + FRAC_CONST(0.93048626567614978), + FRAC_CONST(0.93104710893559517), + FRAC_CONST(0.93160576135125783), + FRAC_CONST(0.93216222160857432), + FRAC_CONST(0.93271648839814025), + FRAC_CONST(0.93326856041571205), + FRAC_CONST(0.93381843636221096), + FRAC_CONST(0.9343661149437259), + FRAC_CONST(0.93491159487151609), + FRAC_CONST(0.93545487486201462), + FRAC_CONST(0.9359959536368313), + FRAC_CONST(0.9365348299227555), + FRAC_CONST(0.93707150245175919), + FRAC_CONST(0.93760596996099999), + FRAC_CONST(0.93813823119282436), + FRAC_CONST(0.93866828489477017), + FRAC_CONST(0.9391961298195699), + FRAC_CONST(0.93972176472515334), + FRAC_CONST(0.94024518837465088), + FRAC_CONST(0.94076639953639607), + FRAC_CONST(0.94128539698392866), + FRAC_CONST(0.94180217949599765), + FRAC_CONST(0.94231674585656378), + FRAC_CONST(0.94282909485480271), + FRAC_CONST(0.94333922528510772), + FRAC_CONST(0.94384713594709269), + FRAC_CONST(0.94435282564559475), + FRAC_CONST(0.94485629319067721), + FRAC_CONST(0.94535753739763229), + FRAC_CONST(0.94585655708698391), + FRAC_CONST(0.94635335108449059), + FRAC_CONST(0.946847918221148), + FRAC_CONST(0.94734025733319194), + FRAC_CONST(0.94783036726210101), + FRAC_CONST(0.94831824685459909), + FRAC_CONST(0.94880389496265838), + FRAC_CONST(0.94928731044350201), + FRAC_CONST(0.94976849215960668), + FRAC_CONST(0.95024743897870523), + FRAC_CONST(0.95072414977378961), + FRAC_CONST(0.95119862342311323), + FRAC_CONST(0.95167085881019386), + FRAC_CONST(0.95214085482381583), + FRAC_CONST(0.95260861035803324), + FRAC_CONST(0.9530741243121722), + FRAC_CONST(0.95353739559083328), + FRAC_CONST(0.95399842310389449), + FRAC_CONST(0.95445720576651349), + FRAC_CONST(0.95491374249913052), + FRAC_CONST(0.95536803222747024), + FRAC_CONST(0.95582007388254542), + FRAC_CONST(0.95626986640065814), + FRAC_CONST(0.95671740872340305), + FRAC_CONST(0.9571626997976701), + FRAC_CONST(0.95760573857564624), + FRAC_CONST(0.9580465240148186), + FRAC_CONST(0.9584850550779761), + FRAC_CONST(0.95892133073321306), + FRAC_CONST(0.95935534995393079), + FRAC_CONST(0.9597871117188399), + FRAC_CONST(0.96021661501196343), + FRAC_CONST(0.96064385882263847), + FRAC_CONST(0.96106884214551935), + FRAC_CONST(0.961491563980579), + FRAC_CONST(0.9619120233331121), + FRAC_CONST(0.9623302192137374), + FRAC_CONST(0.96274615063839941), + FRAC_CONST(0.96315981662837136), + FRAC_CONST(0.96357121621025721), + FRAC_CONST(0.96398034841599411), + FRAC_CONST(0.96438721228285429), + FRAC_CONST(0.9647918068534479), + FRAC_CONST(0.96519413117572472), + FRAC_CONST(0.96559418430297683), + FRAC_CONST(0.96599196529384057), + FRAC_CONST(0.96638747321229879), + FRAC_CONST(0.96678070712768327), + FRAC_CONST(0.96717166611467664), + FRAC_CONST(0.96756034925331436), + FRAC_CONST(0.9679467556289878), + FRAC_CONST(0.9683308843324453), + FRAC_CONST(0.96871273445979478), + FRAC_CONST(0.9690923051125061), + FRAC_CONST(0.96946959539741295), + FRAC_CONST(0.96984460442671483), + FRAC_CONST(0.97021733131797916), + FRAC_CONST(0.97058777519414363), + FRAC_CONST(0.97095593518351797), + FRAC_CONST(0.97132181041978616), + FRAC_CONST(0.97168540004200854), + FRAC_CONST(0.9720467031946235), + FRAC_CONST(0.97240571902744977), + FRAC_CONST(0.97276244669568857), + FRAC_CONST(0.97311688535992513), + FRAC_CONST(0.97346903418613095), + FRAC_CONST(0.9738188923456661), + FRAC_CONST(0.97416645901528032), + FRAC_CONST(0.97451173337711572), + FRAC_CONST(0.97485471461870843), + FRAC_CONST(0.97519540193299037), + FRAC_CONST(0.97553379451829136), + FRAC_CONST(0.97586989157834103), + FRAC_CONST(0.97620369232227056), + FRAC_CONST(0.97653519596461447), + FRAC_CONST(0.97686440172531264), + FRAC_CONST(0.97719130882971228), + FRAC_CONST(0.97751591650856928), + FRAC_CONST(0.97783822399805043), + FRAC_CONST(0.97815823053973505), + FRAC_CONST(0.97847593538061683), + FRAC_CONST(0.97879133777310567), + FRAC_CONST(0.97910443697502925), + FRAC_CONST(0.97941523224963478), + FRAC_CONST(0.97972372286559117), + FRAC_CONST(0.98002990809698998), + FRAC_CONST(0.98033378722334796), + FRAC_CONST(0.98063535952960812), + FRAC_CONST(0.98093462430614164), + FRAC_CONST(0.98123158084874973), + FRAC_CONST(0.98152622845866466), + FRAC_CONST(0.9818185664425525), + FRAC_CONST(0.98210859411251361), + FRAC_CONST(0.98239631078608469), + FRAC_CONST(0.98268171578624086), + FRAC_CONST(0.98296480844139644), + FRAC_CONST(0.98324558808540707), + FRAC_CONST(0.98352405405757126), + FRAC_CONST(0.98380020570263149), + FRAC_CONST(0.98407404237077645), + FRAC_CONST(0.9843455634176419), + FRAC_CONST(0.9846147682043126), + FRAC_CONST(0.9848816560973237), + FRAC_CONST(0.98514622646866223), + FRAC_CONST(0.98540847869576842), + FRAC_CONST(0.98566841216153755), + FRAC_CONST(0.98592602625432113), + FRAC_CONST(0.98618132036792827), + FRAC_CONST(0.98643429390162707), + FRAC_CONST(0.98668494626014669), + FRAC_CONST(0.98693327685367771), + FRAC_CONST(0.98717928509787434), + FRAC_CONST(0.98742297041385541), + FRAC_CONST(0.98766433222820571), + FRAC_CONST(0.98790336997297779), + FRAC_CONST(0.98814008308569257), + FRAC_CONST(0.98837447100934128), + FRAC_CONST(0.98860653319238645), + FRAC_CONST(0.98883626908876354), + FRAC_CONST(0.98906367815788154), + FRAC_CONST(0.98928875986462517), + FRAC_CONST(0.98951151367935519), + FRAC_CONST(0.98973193907791057), + FRAC_CONST(0.98995003554160899), + FRAC_CONST(0.9901658025572484), + FRAC_CONST(0.99037923961710816), + FRAC_CONST(0.99059034621895015), + FRAC_CONST(0.99079912186602037), + FRAC_CONST(0.99100556606704937), + FRAC_CONST(0.99120967833625406), + FRAC_CONST(0.99141145819333854), + FRAC_CONST(0.99161090516349537), + FRAC_CONST(0.99180801877740643), + FRAC_CONST(0.99200279857124452), + FRAC_CONST(0.99219524408667392), + FRAC_CONST(0.99238535487085167), + FRAC_CONST(0.99257313047642881), + FRAC_CONST(0.99275857046155114), + FRAC_CONST(0.99294167438986047), + FRAC_CONST(0.99312244183049558), + FRAC_CONST(0.99330087235809328), + FRAC_CONST(0.99347696555278919), + FRAC_CONST(0.99365072100021912), + FRAC_CONST(0.99382213829151966), + FRAC_CONST(0.99399121702332938), + FRAC_CONST(0.99415795679778973), + FRAC_CONST(0.99432235722254581), + FRAC_CONST(0.9944844179107476), + FRAC_CONST(0.99464413848105071), + FRAC_CONST(0.99480151855761711), + FRAC_CONST(0.99495655777011638), + FRAC_CONST(0.99510925575372611), + FRAC_CONST(0.99525961214913339), + FRAC_CONST(0.9954076266025349), + FRAC_CONST(0.99555329876563847), + FRAC_CONST(0.99569662829566352), + FRAC_CONST(0.99583761485534161), + FRAC_CONST(0.99597625811291779), + FRAC_CONST(0.99611255774215113), + FRAC_CONST(0.99624651342231552), + FRAC_CONST(0.99637812483820021), + FRAC_CONST(0.99650739168011082), + FRAC_CONST(0.9966343136438699), + FRAC_CONST(0.996758890430818), + FRAC_CONST(0.99688112174781385), + FRAC_CONST(0.99700100730723529), + FRAC_CONST(0.99711854682697998), + FRAC_CONST(0.99723374003046616), + FRAC_CONST(0.99734658664663323), + FRAC_CONST(0.99745708640994191), + FRAC_CONST(0.99756523906037575), + FRAC_CONST(0.997671044343441), + FRAC_CONST(0.99777450201016782), + FRAC_CONST(0.99787561181711015), + FRAC_CONST(0.99797437352634699), + FRAC_CONST(0.99807078690548234), + FRAC_CONST(0.99816485172764624), + FRAC_CONST(0.99825656777149518), + FRAC_CONST(0.99834593482121237), + FRAC_CONST(0.99843295266650844), + FRAC_CONST(0.99851762110262221), + FRAC_CONST(0.99859993993032037), + FRAC_CONST(0.99867990895589909), + FRAC_CONST(0.99875752799118334), + FRAC_CONST(0.99883279685352799), + FRAC_CONST(0.99890571536581829), + FRAC_CONST(0.99897628335646982), + FRAC_CONST(0.99904450065942929), + FRAC_CONST(0.99911036711417489), + FRAC_CONST(0.99917388256571638), + FRAC_CONST(0.99923504686459585), + FRAC_CONST(0.99929385986688779), + FRAC_CONST(0.99935032143419944), + FRAC_CONST(0.9994044314336713), + FRAC_CONST(0.99945618973797734), + FRAC_CONST(0.99950559622532531), + FRAC_CONST(0.99955265077945699), + FRAC_CONST(0.99959735328964838), + FRAC_CONST(0.9996397036507102), + FRAC_CONST(0.99967970176298793), + FRAC_CONST(0.99971734753236219), + FRAC_CONST(0.99975264087024884), + FRAC_CONST(0.99978558169359921), + FRAC_CONST(0.99981616992490041), + FRAC_CONST(0.99984440549217524), + FRAC_CONST(0.99987028832898295), + FRAC_CONST(0.99989381837441849), + FRAC_CONST(0.99991499557311347), + FRAC_CONST(0.999933819875236), + FRAC_CONST(0.99995029123649048), + FRAC_CONST(0.99996440961811828), + FRAC_CONST(0.99997617498689761), + FRAC_CONST(0.9999855873151432), + FRAC_CONST(0.99999264658070719), + FRAC_CONST(0.99999735276697821), + FRAC_CONST(0.99999970586288223) +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const real_t sine_long_960[] = +{ + FRAC_CONST(0.00081812299560725323), + FRAC_CONST(0.0024543667964602917), + FRAC_CONST(0.0040906040262347889), + FRAC_CONST(0.0057268303042312674), + FRAC_CONST(0.0073630412497795667), + FRAC_CONST(0.0089992324822505774), + FRAC_CONST(0.010635399621067975), + FRAC_CONST(0.012271538285719924), + FRAC_CONST(0.013907644095770845), + FRAC_CONST(0.015543712670873098), + FRAC_CONST(0.017179739630778748), + FRAC_CONST(0.018815720595351273), + FRAC_CONST(0.020451651184577292), + FRAC_CONST(0.022087527018578291), + FRAC_CONST(0.023723343717622358), + FRAC_CONST(0.025359096902135895), + FRAC_CONST(0.02699478219271537), + FRAC_CONST(0.028630395210139003), + FRAC_CONST(0.030265931575378519), + FRAC_CONST(0.031901386909610863), + FRAC_CONST(0.033536756834229922), + FRAC_CONST(0.035172036970858266), + FRAC_CONST(0.036807222941358832), + FRAC_CONST(0.038442310367846677), + FRAC_CONST(0.040077294872700696), + FRAC_CONST(0.041712172078575326), + FRAC_CONST(0.043346937608412288), + FRAC_CONST(0.044981587085452281), + FRAC_CONST(0.046616116133246711), + FRAC_CONST(0.048250520375669431), + FRAC_CONST(0.049884795436928406), + FRAC_CONST(0.051518936941577477), + FRAC_CONST(0.053152940514528055), + FRAC_CONST(0.05478680178106083), + FRAC_CONST(0.056420516366837495), + FRAC_CONST(0.05805407989791244), + FRAC_CONST(0.059687488000744485), + FRAC_CONST(0.061320736302208578), + FRAC_CONST(0.062953820429607482), + FRAC_CONST(0.064586736010683557), + FRAC_CONST(0.066219478673630344), + FRAC_CONST(0.06785204404710439), + FRAC_CONST(0.069484427760236861), + FRAC_CONST(0.071116625442645326), + FRAC_CONST(0.072748632724445372), + FRAC_CONST(0.07438044523626236), + FRAC_CONST(0.076012058609243122), + FRAC_CONST(0.077643468475067631), + FRAC_CONST(0.079274670465960706), + FRAC_CONST(0.080905660214703745), + FRAC_CONST(0.082536433354646319), + FRAC_CONST(0.084166985519717977), + FRAC_CONST(0.085797312344439894), + FRAC_CONST(0.08742740946393647), + FRAC_CONST(0.089057272513947183), + FRAC_CONST(0.090686897130838162), + FRAC_CONST(0.092316278951613845), + FRAC_CONST(0.093945413613928788), + FRAC_CONST(0.095574296756099186), + FRAC_CONST(0.097202924017114667), + FRAC_CONST(0.098831291036649963), + FRAC_CONST(0.10045939345507648), + FRAC_CONST(0.10208722691347409), + FRAC_CONST(0.10371478705364276), + FRAC_CONST(0.10534206951811415), + FRAC_CONST(0.10696906995016341), + FRAC_CONST(0.10859578399382072), + FRAC_CONST(0.11022220729388306), + FRAC_CONST(0.11184833549592579), + FRAC_CONST(0.11347416424631435), + FRAC_CONST(0.11509968919221586), + FRAC_CONST(0.11672490598161089), + FRAC_CONST(0.11834981026330495), + FRAC_CONST(0.11997439768694031), + FRAC_CONST(0.12159866390300751), + FRAC_CONST(0.12322260456285709), + FRAC_CONST(0.12484621531871121), + FRAC_CONST(0.12646949182367517), + FRAC_CONST(0.12809242973174936), + FRAC_CONST(0.12971502469784052), + FRAC_CONST(0.13133727237777362), + FRAC_CONST(0.13295916842830346), + FRAC_CONST(0.13458070850712617), + FRAC_CONST(0.13620188827289101), + FRAC_CONST(0.1378227033852118), + FRAC_CONST(0.13944314950467873), + FRAC_CONST(0.14106322229286994), + FRAC_CONST(0.14268291741236291), + FRAC_CONST(0.14430223052674654), + FRAC_CONST(0.1459211573006321), + FRAC_CONST(0.14753969339966552), + FRAC_CONST(0.14915783449053857), + FRAC_CONST(0.15077557624100058), + FRAC_CONST(0.15239291431987001), + FRAC_CONST(0.1540098443970461), + FRAC_CONST(0.15562636214352044), + FRAC_CONST(0.15724246323138855), + FRAC_CONST(0.15885814333386142), + FRAC_CONST(0.16047339812527725), + FRAC_CONST(0.16208822328111283), + FRAC_CONST(0.16370261447799525), + FRAC_CONST(0.16531656739371339), + FRAC_CONST(0.16693007770722967), + FRAC_CONST(0.16854314109869134), + FRAC_CONST(0.17015575324944232), + FRAC_CONST(0.17176790984203447), + FRAC_CONST(0.17337960656023954), + FRAC_CONST(0.1749908390890603), + FRAC_CONST(0.17660160311474243), + FRAC_CONST(0.17821189432478593), + FRAC_CONST(0.17982170840795647), + FRAC_CONST(0.18143104105429744), + FRAC_CONST(0.18303988795514095), + FRAC_CONST(0.1846482448031197), + FRAC_CONST(0.18625610729217834), + FRAC_CONST(0.1878634711175852), + FRAC_CONST(0.18947033197594348), + FRAC_CONST(0.19107668556520319), + FRAC_CONST(0.19268252758467228), + FRAC_CONST(0.19428785373502844), + FRAC_CONST(0.19589265971833042), + FRAC_CONST(0.19749694123802966), + FRAC_CONST(0.19910069399898173), + FRAC_CONST(0.20070391370745785), + FRAC_CONST(0.20230659607115639), + FRAC_CONST(0.20390873679921437), + FRAC_CONST(0.20551033160221882), + FRAC_CONST(0.20711137619221856), + FRAC_CONST(0.2087118662827353), + FRAC_CONST(0.21031179758877552), + FRAC_CONST(0.21191116582684155), + FRAC_CONST(0.21350996671494335), + FRAC_CONST(0.21510819597260972), + FRAC_CONST(0.21670584932089998), + FRAC_CONST(0.2183029224824154), + FRAC_CONST(0.21989941118131037), + FRAC_CONST(0.22149531114330431), + FRAC_CONST(0.22309061809569264), + FRAC_CONST(0.22468532776735861), + FRAC_CONST(0.22627943588878449), + FRAC_CONST(0.22787293819206314), + FRAC_CONST(0.22946583041090929), + FRAC_CONST(0.23105810828067114), + FRAC_CONST(0.23264976753834157), + FRAC_CONST(0.23424080392256985), + FRAC_CONST(0.2358312131736727), + FRAC_CONST(0.23742099103364595), + FRAC_CONST(0.23901013324617584), + FRAC_CONST(0.24059863555665045), + FRAC_CONST(0.24218649371217096), + FRAC_CONST(0.24377370346156332), + FRAC_CONST(0.24536026055538934), + FRAC_CONST(0.24694616074595824), + FRAC_CONST(0.24853139978733788), + FRAC_CONST(0.25011597343536629), + FRAC_CONST(0.25169987744766298), + FRAC_CONST(0.25328310758364025), + FRAC_CONST(0.25486565960451457), + FRAC_CONST(0.25644752927331788), + FRAC_CONST(0.25802871235490898), + FRAC_CONST(0.25960920461598508), + FRAC_CONST(0.26118900182509258), + FRAC_CONST(0.26276809975263904), + FRAC_CONST(0.264346494170904), + FRAC_CONST(0.26592418085405067), + FRAC_CONST(0.26750115557813692), + FRAC_CONST(0.2690774141211269), + FRAC_CONST(0.27065295226290209), + FRAC_CONST(0.2722277657852728), + FRAC_CONST(0.27380185047198918), + FRAC_CONST(0.27537520210875299), + FRAC_CONST(0.2769478164832283), + FRAC_CONST(0.27851968938505312), + FRAC_CONST(0.28009081660585067), + FRAC_CONST(0.28166119393924061), + FRAC_CONST(0.28323081718085019), + FRAC_CONST(0.28479968212832563), + FRAC_CONST(0.28636778458134327), + FRAC_CONST(0.28793512034162105), + FRAC_CONST(0.2895016852129294), + FRAC_CONST(0.29106747500110264), + FRAC_CONST(0.29263248551405047), + FRAC_CONST(0.2941967125617686), + FRAC_CONST(0.29576015195635058), + FRAC_CONST(0.29732279951199847), + FRAC_CONST(0.29888465104503475), + FRAC_CONST(0.30044570237391266), + FRAC_CONST(0.30200594931922808), + FRAC_CONST(0.30356538770373032), + FRAC_CONST(0.30512401335233358), + FRAC_CONST(0.30668182209212791), + FRAC_CONST(0.3082388097523906), + FRAC_CONST(0.30979497216459695), + FRAC_CONST(0.31135030516243201), + FRAC_CONST(0.3129048045818012), + FRAC_CONST(0.31445846626084178), + FRAC_CONST(0.31601128603993378), + FRAC_CONST(0.31756325976171151), + FRAC_CONST(0.31911438327107416), + FRAC_CONST(0.32066465241519732), + FRAC_CONST(0.32221406304354389), + FRAC_CONST(0.3237626110078754), + FRAC_CONST(0.32531029216226293), + FRAC_CONST(0.32685710236309828), + FRAC_CONST(0.32840303746910487), + FRAC_CONST(0.32994809334134939), + FRAC_CONST(0.3314922658432522), + FRAC_CONST(0.33303555084059877), + FRAC_CONST(0.33457794420155085), + FRAC_CONST(0.33611944179665709), + FRAC_CONST(0.33766003949886464), + FRAC_CONST(0.33919973318352969), + FRAC_CONST(0.34073851872842903), + FRAC_CONST(0.34227639201377064), + FRAC_CONST(0.34381334892220483), + FRAC_CONST(0.34534938533883547), + FRAC_CONST(0.34688449715123082), + FRAC_CONST(0.34841868024943456), + FRAC_CONST(0.34995193052597684), + FRAC_CONST(0.35148424387588523), + FRAC_CONST(0.3530156161966958), + FRAC_CONST(0.35454604338846402), + FRAC_CONST(0.35607552135377557), + FRAC_CONST(0.35760404599775775), + FRAC_CONST(0.35913161322809023), + FRAC_CONST(0.36065821895501554), + FRAC_CONST(0.36218385909135092), + FRAC_CONST(0.36370852955249849), + FRAC_CONST(0.36523222625645668), + FRAC_CONST(0.36675494512383078), + FRAC_CONST(0.36827668207784414), + FRAC_CONST(0.36979743304434909), + FRAC_CONST(0.37131719395183754), + FRAC_CONST(0.37283596073145214), + FRAC_CONST(0.37435372931699717), + FRAC_CONST(0.37587049564494951), + FRAC_CONST(0.37738625565446909), + FRAC_CONST(0.37890100528741022), + FRAC_CONST(0.38041474048833229), + FRAC_CONST(0.38192745720451066), + FRAC_CONST(0.38343915138594736), + FRAC_CONST(0.38494981898538222), + FRAC_CONST(0.38645945595830333), + FRAC_CONST(0.38796805826295838), + FRAC_CONST(0.38947562186036483), + FRAC_CONST(0.39098214271432141), + FRAC_CONST(0.39248761679141814), + FRAC_CONST(0.3939920400610481), + FRAC_CONST(0.39549540849541737), + FRAC_CONST(0.39699771806955625), + FRAC_CONST(0.39849896476132979), + FRAC_CONST(0.39999914455144892), + FRAC_CONST(0.40149825342348083), + FRAC_CONST(0.4029962873638599), + FRAC_CONST(0.40449324236189854), + FRAC_CONST(0.40598911440979762), + FRAC_CONST(0.40748389950265762), + FRAC_CONST(0.40897759363848879), + FRAC_CONST(0.41047019281822261), + FRAC_CONST(0.41196169304572178), + FRAC_CONST(0.4134520903277914), + FRAC_CONST(0.41494138067418929), + FRAC_CONST(0.41642956009763715), + FRAC_CONST(0.41791662461383078), + FRAC_CONST(0.41940257024145089), + FRAC_CONST(0.42088739300217382), + FRAC_CONST(0.42237108892068231), + FRAC_CONST(0.42385365402467584), + FRAC_CONST(0.42533508434488143), + FRAC_CONST(0.42681537591506419), + FRAC_CONST(0.42829452477203828), + FRAC_CONST(0.42977252695567697), + FRAC_CONST(0.43124937850892364), + FRAC_CONST(0.4327250754778022), + FRAC_CONST(0.43419961391142781), + FRAC_CONST(0.43567298986201736), + FRAC_CONST(0.43714519938489987), + FRAC_CONST(0.43861623853852766), + FRAC_CONST(0.44008610338448595), + FRAC_CONST(0.44155478998750436), + FRAC_CONST(0.44302229441546676), + FRAC_CONST(0.4444886127394222), + FRAC_CONST(0.44595374103359531), + FRAC_CONST(0.44741767537539667), + FRAC_CONST(0.44888041184543348), + FRAC_CONST(0.45034194652752002), + FRAC_CONST(0.45180227550868812), + FRAC_CONST(0.45326139487919759), + FRAC_CONST(0.45471930073254679), + FRAC_CONST(0.45617598916548296), + FRAC_CONST(0.45763145627801283), + FRAC_CONST(0.45908569817341294), + FRAC_CONST(0.46053871095824001), + FRAC_CONST(0.46199049074234161), + FRAC_CONST(0.46344103363886635), + FRAC_CONST(0.46489033576427435), + FRAC_CONST(0.46633839323834758), + FRAC_CONST(0.46778520218420055), + FRAC_CONST(0.46923075872829029), + FRAC_CONST(0.47067505900042683), + FRAC_CONST(0.47211809913378361), + FRAC_CONST(0.47355987526490806), + FRAC_CONST(0.47500038353373153), + FRAC_CONST(0.47643962008357982), + FRAC_CONST(0.47787758106118372), + FRAC_CONST(0.47931426261668875), + FRAC_CONST(0.48074966090366611), + FRAC_CONST(0.48218377207912272), + FRAC_CONST(0.48361659230351117), + FRAC_CONST(0.48504811774074069), + FRAC_CONST(0.48647834455818684), + FRAC_CONST(0.48790726892670194), + FRAC_CONST(0.48933488702062544), + FRAC_CONST(0.49076119501779414), + FRAC_CONST(0.49218618909955225), + FRAC_CONST(0.4936098654507618), + FRAC_CONST(0.49503222025981269), + FRAC_CONST(0.49645324971863303), + FRAC_CONST(0.49787295002269943), + FRAC_CONST(0.49929131737104687), + FRAC_CONST(0.50070834796627917), + FRAC_CONST(0.50212403801457872), + FRAC_CONST(0.50353838372571758), + FRAC_CONST(0.50495138131306638), + FRAC_CONST(0.50636302699360547), + FRAC_CONST(0.50777331698793449), + FRAC_CONST(0.50918224752028263), + FRAC_CONST(0.51058981481851906), + FRAC_CONST(0.51199601511416237), + FRAC_CONST(0.51340084464239111), + FRAC_CONST(0.51480429964205421), + FRAC_CONST(0.51620637635567967), + FRAC_CONST(0.51760707102948678), + FRAC_CONST(0.51900637991339404), + FRAC_CONST(0.5204042992610306), + FRAC_CONST(0.52180082532974559), + FRAC_CONST(0.5231959543806185), + FRAC_CONST(0.52458968267846895), + FRAC_CONST(0.52598200649186677), + FRAC_CONST(0.52737292209314235), + FRAC_CONST(0.52876242575839572), + FRAC_CONST(0.53015051376750777), + FRAC_CONST(0.53153718240414882), + FRAC_CONST(0.53292242795578992), + FRAC_CONST(0.53430624671371152), + FRAC_CONST(0.53568863497301467), + FRAC_CONST(0.5370695890326298), + FRAC_CONST(0.5384491051953274), + FRAC_CONST(0.53982717976772743), + FRAC_CONST(0.54120380906030963), + FRAC_CONST(0.54257898938742311), + FRAC_CONST(0.54395271706729609), + FRAC_CONST(0.54532498842204646), + FRAC_CONST(0.54669579977769045), + FRAC_CONST(0.54806514746415402), + FRAC_CONST(0.54943302781528081), + FRAC_CONST(0.55079943716884383), + FRAC_CONST(0.55216437186655387), + FRAC_CONST(0.55352782825406999), + FRAC_CONST(0.55488980268100907), + FRAC_CONST(0.55625029150095584), + FRAC_CONST(0.55760929107147217), + FRAC_CONST(0.55896679775410718), + FRAC_CONST(0.56032280791440714), + FRAC_CONST(0.56167731792192455), + FRAC_CONST(0.56303032415022869), + FRAC_CONST(0.56438182297691453), + FRAC_CONST(0.56573181078361312), + FRAC_CONST(0.56708028395600085), + FRAC_CONST(0.56842723888380908), + FRAC_CONST(0.56977267196083425), + FRAC_CONST(0.57111657958494688), + FRAC_CONST(0.5724589581581021), + FRAC_CONST(0.57379980408634845), + FRAC_CONST(0.57513911377983773), + FRAC_CONST(0.57647688365283478), + FRAC_CONST(0.57781311012372738), + FRAC_CONST(0.57914778961503466), + FRAC_CONST(0.58048091855341843), + FRAC_CONST(0.5818124933696911), + FRAC_CONST(0.58314251049882604), + FRAC_CONST(0.58447096637996743), + FRAC_CONST(0.58579785745643886), + FRAC_CONST(0.5871231801757536), + FRAC_CONST(0.58844693098962408), + FRAC_CONST(0.58976910635397084), + FRAC_CONST(0.59108970272893235), + FRAC_CONST(0.59240871657887517), + FRAC_CONST(0.59372614437240179), + FRAC_CONST(0.59504198258236196), + FRAC_CONST(0.5963562276858605), + FRAC_CONST(0.59766887616426767), + FRAC_CONST(0.5989799245032289), + FRAC_CONST(0.60028936919267273), + FRAC_CONST(0.60159720672682204), + FRAC_CONST(0.60290343360420195), + FRAC_CONST(0.60420804632765002), + FRAC_CONST(0.60551104140432543), + FRAC_CONST(0.60681241534571839), + FRAC_CONST(0.60811216466765883), + FRAC_CONST(0.60941028589032709), + FRAC_CONST(0.61070677553826169), + FRAC_CONST(0.61200163014036979), + FRAC_CONST(0.61329484622993602), + FRAC_CONST(0.6145864203446314), + FRAC_CONST(0.61587634902652377), + FRAC_CONST(0.61716462882208556), + FRAC_CONST(0.61845125628220421), + FRAC_CONST(0.61973622796219074), + FRAC_CONST(0.6210195404217892), + FRAC_CONST(0.62230119022518593), + FRAC_CONST(0.62358117394101897), + FRAC_CONST(0.62485948814238634), + FRAC_CONST(0.62613612940685637), + FRAC_CONST(0.62741109431647646), + FRAC_CONST(0.62868437945778133), + FRAC_CONST(0.62995598142180387), + FRAC_CONST(0.6312258968040827), + FRAC_CONST(0.63249412220467238), + FRAC_CONST(0.63376065422815175), + FRAC_CONST(0.63502548948363347), + FRAC_CONST(0.63628862458477287), + FRAC_CONST(0.63755005614977711), + FRAC_CONST(0.63880978080141437), + FRAC_CONST(0.6400677951670225), + FRAC_CONST(0.6413240958785188), + FRAC_CONST(0.64257867957240766), + FRAC_CONST(0.6438315428897915), + FRAC_CONST(0.64508268247637779), + FRAC_CONST(0.64633209498248945), + FRAC_CONST(0.64757977706307335), + FRAC_CONST(0.64882572537770888), + FRAC_CONST(0.65006993659061751), + FRAC_CONST(0.65131240737067142), + FRAC_CONST(0.65255313439140239), + FRAC_CONST(0.65379211433101081), + FRAC_CONST(0.65502934387237444), + FRAC_CONST(0.6562648197030575), + FRAC_CONST(0.65749853851531959), + FRAC_CONST(0.65873049700612374), + FRAC_CONST(0.65996069187714679), + FRAC_CONST(0.66118911983478657), + FRAC_CONST(0.66241577759017178), + FRAC_CONST(0.66364066185917048), + FRAC_CONST(0.66486376936239888), + FRAC_CONST(0.66608509682523009), + FRAC_CONST(0.66730464097780284), + FRAC_CONST(0.66852239855503071), + FRAC_CONST(0.66973836629660977), + FRAC_CONST(0.67095254094702894), + FRAC_CONST(0.67216491925557675), + FRAC_CONST(0.67337549797635199), + FRAC_CONST(0.67458427386827102), + FRAC_CONST(0.67579124369507693), + FRAC_CONST(0.67699640422534846), + FRAC_CONST(0.67819975223250772), + FRAC_CONST(0.6794012844948305), + FRAC_CONST(0.68060099779545302), + FRAC_CONST(0.68179888892238183), + FRAC_CONST(0.6829949546685018), + FRAC_CONST(0.68418919183158522), + FRAC_CONST(0.68538159721429948), + FRAC_CONST(0.6865721676242168), + FRAC_CONST(0.68776089987382172), + FRAC_CONST(0.68894779078052026), + FRAC_CONST(0.69013283716664853), + FRAC_CONST(0.69131603585948032), + FRAC_CONST(0.69249738369123692), + FRAC_CONST(0.69367687749909468), + FRAC_CONST(0.69485451412519361), + FRAC_CONST(0.69603029041664599), + FRAC_CONST(0.6972042032255451), + FRAC_CONST(0.6983762494089728), + FRAC_CONST(0.69954642582900894), + FRAC_CONST(0.70071472935273893), + FRAC_CONST(0.70188115685226271), + FRAC_CONST(0.703045705204703), + FRAC_CONST(0.70420837129221303), + FRAC_CONST(0.70536915200198613), + FRAC_CONST(0.70652804422626281), + FRAC_CONST(0.70768504486233985), + FRAC_CONST(0.70884015081257845), + FRAC_CONST(0.70999335898441229), + FRAC_CONST(0.711144666290356), + FRAC_CONST(0.71229406964801356), + FRAC_CONST(0.71344156598008623), + FRAC_CONST(0.71458715221438096), + FRAC_CONST(0.71573082528381871), + FRAC_CONST(0.71687258212644234), + FRAC_CONST(0.7180124196854254), + FRAC_CONST(0.71915033490907943), + FRAC_CONST(0.72028632475086318), + FRAC_CONST(0.72142038616938997), + FRAC_CONST(0.72255251612843596), + FRAC_CONST(0.72368271159694852), + FRAC_CONST(0.72481096954905444), + FRAC_CONST(0.72593728696406756), + FRAC_CONST(0.72706166082649704), + FRAC_CONST(0.72818408812605595), + FRAC_CONST(0.72930456585766834), + FRAC_CONST(0.73042309102147851), + FRAC_CONST(0.73153966062285747), + FRAC_CONST(0.73265427167241282), + FRAC_CONST(0.73376692118599507), + FRAC_CONST(0.73487760618470677), + FRAC_CONST(0.73598632369490979), + FRAC_CONST(0.73709307074823405), + FRAC_CONST(0.73819784438158409), + FRAC_CONST(0.73930064163714881), + FRAC_CONST(0.74040145956240788), + FRAC_CONST(0.74150029521014049), + FRAC_CONST(0.74259714563843304), + FRAC_CONST(0.74369200791068657), + FRAC_CONST(0.74478487909562552), + FRAC_CONST(0.74587575626730485), + FRAC_CONST(0.74696463650511791), + FRAC_CONST(0.74805151689380456), + FRAC_CONST(0.74913639452345926), + FRAC_CONST(0.75021926648953785), + FRAC_CONST(0.75130012989286621), + FRAC_CONST(0.7523789818396478), + FRAC_CONST(0.75345581944147111), + FRAC_CONST(0.75453063981531809), + FRAC_CONST(0.75560344008357094), + FRAC_CONST(0.75667421737402052), + FRAC_CONST(0.7577429688198738), + FRAC_CONST(0.75880969155976163), + FRAC_CONST(0.75987438273774599), + FRAC_CONST(0.76093703950332836), + FRAC_CONST(0.76199765901145666), + FRAC_CONST(0.76305623842253345), + FRAC_CONST(0.76411277490242291), + FRAC_CONST(0.76516726562245885), + FRAC_CONST(0.76621970775945258), + FRAC_CONST(0.76727009849569949), + FRAC_CONST(0.76831843501898767), + FRAC_CONST(0.76936471452260458), + FRAC_CONST(0.77040893420534517), + FRAC_CONST(0.77145109127151923), + FRAC_CONST(0.77249118293095853), + FRAC_CONST(0.77352920639902467), + FRAC_CONST(0.77456515889661659), + FRAC_CONST(0.77559903765017746), + FRAC_CONST(0.7766308398917029), + FRAC_CONST(0.77766056285874774), + FRAC_CONST(0.77868820379443371), + FRAC_CONST(0.77971375994745684), + FRAC_CONST(0.78073722857209438), + FRAC_CONST(0.7817586069282132), + FRAC_CONST(0.78277789228127592), + FRAC_CONST(0.78379508190234881), + FRAC_CONST(0.78481017306810918), + FRAC_CONST(0.78582316306085265), + FRAC_CONST(0.78683404916849986), + FRAC_CONST(0.78784282868460476), + FRAC_CONST(0.78884949890836087), + FRAC_CONST(0.78985405714460888), + FRAC_CONST(0.7908565007038445), + FRAC_CONST(0.79185682690222425), + FRAC_CONST(0.79285503306157412), + FRAC_CONST(0.79385111650939566), + FRAC_CONST(0.79484507457887377), + FRAC_CONST(0.79583690460888357), + FRAC_CONST(0.79682660394399751), + FRAC_CONST(0.79781416993449272), + FRAC_CONST(0.79879959993635785), + FRAC_CONST(0.7997828913113002), + FRAC_CONST(0.80076404142675273), + FRAC_CONST(0.80174304765588156), + FRAC_CONST(0.80271990737759213), + FRAC_CONST(0.80369461797653707), + FRAC_CONST(0.80466717684312306), + FRAC_CONST(0.80563758137351682), + FRAC_CONST(0.80660582896965372), + FRAC_CONST(0.80757191703924336), + FRAC_CONST(0.80853584299577752), + FRAC_CONST(0.80949760425853612), + FRAC_CONST(0.81045719825259477), + FRAC_CONST(0.81141462240883167), + FRAC_CONST(0.81236987416393436), + FRAC_CONST(0.81332295096040608), + FRAC_CONST(0.81427385024657373), + FRAC_CONST(0.81522256947659355), + FRAC_CONST(0.81616910611045879), + FRAC_CONST(0.817113457614006), + FRAC_CONST(0.81805562145892186), + FRAC_CONST(0.81899559512275044), + FRAC_CONST(0.81993337608889916), + FRAC_CONST(0.82086896184664637), + FRAC_CONST(0.8218023498911472), + FRAC_CONST(0.82273353772344116), + FRAC_CONST(0.82366252285045805), + FRAC_CONST(0.82458930278502529), + FRAC_CONST(0.82551387504587381), + FRAC_CONST(0.82643623715764558), + FRAC_CONST(0.82735638665089983), + FRAC_CONST(0.82827432106211907), + FRAC_CONST(0.82919003793371693), + FRAC_CONST(0.83010353481404364), + FRAC_CONST(0.83101480925739324), + FRAC_CONST(0.83192385882400965), + FRAC_CONST(0.83283068108009373), + FRAC_CONST(0.8337352735978093), + FRAC_CONST(0.83463763395529011), + FRAC_CONST(0.83553775973664579), + FRAC_CONST(0.83643564853196872), + FRAC_CONST(0.83733129793734051), + FRAC_CONST(0.83822470555483797), + FRAC_CONST(0.83911586899254031), + FRAC_CONST(0.84000478586453453), + FRAC_CONST(0.84089145379092289), + FRAC_CONST(0.84177587039782842), + FRAC_CONST(0.84265803331740163), + FRAC_CONST(0.84353794018782702), + FRAC_CONST(0.844415588653329), + FRAC_CONST(0.8452909763641786), + FRAC_CONST(0.84616410097669936), + FRAC_CONST(0.84703496015327406), + FRAC_CONST(0.84790355156235053), + FRAC_CONST(0.84876987287844818), + FRAC_CONST(0.8496339217821639), + FRAC_CONST(0.85049569596017938), + FRAC_CONST(0.85135519310526508), + FRAC_CONST(0.85221241091628896), + FRAC_CONST(0.85306734709822085), + FRAC_CONST(0.85391999936213903), + FRAC_CONST(0.85477036542523732), + FRAC_CONST(0.85561844301082923), + FRAC_CONST(0.85646422984835635), + FRAC_CONST(0.85730772367339259), + FRAC_CONST(0.85814892222765116), + FRAC_CONST(0.85898782325899026), + FRAC_CONST(0.85982442452141961), + FRAC_CONST(0.86065872377510555), + FRAC_CONST(0.86149071878637817), + FRAC_CONST(0.8623204073277364), + FRAC_CONST(0.86314778717785412), + FRAC_CONST(0.8639728561215867), + FRAC_CONST(0.86479561194997623), + FRAC_CONST(0.86561605246025763), + FRAC_CONST(0.86643417545586487), + FRAC_CONST(0.8672499787464365), + FRAC_CONST(0.86806346014782154), + FRAC_CONST(0.8688746174820855), + FRAC_CONST(0.86968344857751589), + FRAC_CONST(0.87048995126862883), + FRAC_CONST(0.87129412339617363), + FRAC_CONST(0.87209596280713941), + FRAC_CONST(0.8728954673547612), + FRAC_CONST(0.87369263489852422), + FRAC_CONST(0.87448746330417149), + FRAC_CONST(0.87527995044370765), + FRAC_CONST(0.8760700941954066), + FRAC_CONST(0.87685789244381551), + FRAC_CONST(0.87764334307976144), + FRAC_CONST(0.87842644400035663), + FRAC_CONST(0.8792071931090043), + FRAC_CONST(0.87998558831540408), + FRAC_CONST(0.88076162753555787), + FRAC_CONST(0.88153530869177488), + FRAC_CONST(0.88230662971267804), + FRAC_CONST(0.88307558853320878), + FRAC_CONST(0.88384218309463292), + FRAC_CONST(0.8846064113445461), + FRAC_CONST(0.88536827123687933), + FRAC_CONST(0.88612776073190425), + FRAC_CONST(0.88688487779623937), + FRAC_CONST(0.88763962040285393), + FRAC_CONST(0.8883919865310751), + FRAC_CONST(0.88914197416659235), + FRAC_CONST(0.88988958130146301), + FRAC_CONST(0.8906348059341177), + FRAC_CONST(0.89137764606936609), + FRAC_CONST(0.89211809971840139), + FRAC_CONST(0.89285616489880615), + FRAC_CONST(0.89359183963455813), + FRAC_CONST(0.89432512195603453), + FRAC_CONST(0.89505600990001799), + FRAC_CONST(0.89578450150970124), + FRAC_CONST(0.8965105948346932), + FRAC_CONST(0.89723428793102367), + FRAC_CONST(0.89795557886114807), + FRAC_CONST(0.89867446569395382), + FRAC_CONST(0.89939094650476448), + FRAC_CONST(0.90010501937534515), + FRAC_CONST(0.900816682393908), + FRAC_CONST(0.90152593365511691), + FRAC_CONST(0.90223277126009283), + FRAC_CONST(0.90293719331641886), + FRAC_CONST(0.90363919793814496), + FRAC_CONST(0.90433878324579353), + FRAC_CONST(0.90503594736636439), + FRAC_CONST(0.90573068843333915), + FRAC_CONST(0.90642300458668679), + FRAC_CONST(0.90711289397286898), + FRAC_CONST(0.90780035474484411), + FRAC_CONST(0.90848538506207266), + FRAC_CONST(0.90916798309052227), + FRAC_CONST(0.90984814700267291), + FRAC_CONST(0.9105258749775208), + FRAC_CONST(0.91120116520058425), + FRAC_CONST(0.91187401586390815), + FRAC_CONST(0.91254442516606893), + FRAC_CONST(0.9132123913121788), + FRAC_CONST(0.91387791251389161), + FRAC_CONST(0.91454098698940678), + FRAC_CONST(0.91520161296347435), + FRAC_CONST(0.91585978866739981), + FRAC_CONST(0.91651551233904871), + FRAC_CONST(0.91716878222285148), + FRAC_CONST(0.91781959656980805), + FRAC_CONST(0.91846795363749245), + FRAC_CONST(0.91911385169005766), + FRAC_CONST(0.9197572889982405), + FRAC_CONST(0.9203982638393654), + FRAC_CONST(0.92103677449734989), + FRAC_CONST(0.92167281926270861), + FRAC_CONST(0.92230639643255874), + FRAC_CONST(0.92293750431062316), + FRAC_CONST(0.92356614120723612), + FRAC_CONST(0.92419230543934783), + FRAC_CONST(0.92481599533052783), + FRAC_CONST(0.92543720921097061), + FRAC_CONST(0.92605594541749991), + FRAC_CONST(0.92667220229357261), + FRAC_CONST(0.92728597818928349), + FRAC_CONST(0.9278972714613698), + FRAC_CONST(0.92850608047321548), + FRAC_CONST(0.9291124035948557), + FRAC_CONST(0.92971623920298097), + FRAC_CONST(0.93031758568094147), + FRAC_CONST(0.93091644141875196), + FRAC_CONST(0.93151280481309506), + FRAC_CONST(0.93210667426732674), + FRAC_CONST(0.93269804819147983), + FRAC_CONST(0.93328692500226818), + FRAC_CONST(0.93387330312309147), + FRAC_CONST(0.93445718098403896), + FRAC_CONST(0.93503855702189376), + FRAC_CONST(0.9356174296801375), + FRAC_CONST(0.93619379740895381), + FRAC_CONST(0.93676765866523259), + FRAC_CONST(0.93733901191257496), + FRAC_CONST(0.93790785562129597), + FRAC_CONST(0.93847418826842988), + FRAC_CONST(0.93903800833773399), + FRAC_CONST(0.93959931431969212), + FRAC_CONST(0.94015810471151917), + FRAC_CONST(0.94071437801716529), + FRAC_CONST(0.94126813274731924), + FRAC_CONST(0.94181936741941319), + FRAC_CONST(0.94236808055762578), + FRAC_CONST(0.94291427069288691), + FRAC_CONST(0.94345793636288133), + FRAC_CONST(0.94399907611205225), + FRAC_CONST(0.9445376884916058), + FRAC_CONST(0.94507377205951448), + FRAC_CONST(0.94560732538052128), + FRAC_CONST(0.94613834702614352), + FRAC_CONST(0.94666683557467624), + FRAC_CONST(0.94719278961119657), + FRAC_CONST(0.94771620772756759), + FRAC_CONST(0.94823708852244104), + FRAC_CONST(0.94875543060126255), + FRAC_CONST(0.94927123257627433), + FRAC_CONST(0.94978449306651924), + FRAC_CONST(0.95029521069784428), + FRAC_CONST(0.9508033841029051), + FRAC_CONST(0.95130901192116835), + FRAC_CONST(0.9518120927989161), + FRAC_CONST(0.95231262538924943), + FRAC_CONST(0.95281060835209208), + FRAC_CONST(0.95330604035419386), + FRAC_CONST(0.95379892006913403), + FRAC_CONST(0.95428924617732525), + FRAC_CONST(0.95477701736601728), + FRAC_CONST(0.95526223232929941), + FRAC_CONST(0.95574488976810545), + FRAC_CONST(0.95622498839021619), + FRAC_CONST(0.95670252691026292), + FRAC_CONST(0.95717750404973156), + FRAC_CONST(0.95764991853696524), + FRAC_CONST(0.95811976910716812), + FRAC_CONST(0.95858705450240911), + FRAC_CONST(0.95905177347162429), + FRAC_CONST(0.95951392477062125), + FRAC_CONST(0.95997350716208196), + FRAC_CONST(0.96043051941556579), + FRAC_CONST(0.96088496030751369), + FRAC_CONST(0.96133682862125036), + FRAC_CONST(0.96178612314698864), + FRAC_CONST(0.96223284268183173), + FRAC_CONST(0.9626769860297768), + FRAC_CONST(0.96311855200171881), + FRAC_CONST(0.96355753941545252), + FRAC_CONST(0.96399394709567654), + FRAC_CONST(0.96442777387399625), + FRAC_CONST(0.96485901858892686), + FRAC_CONST(0.96528768008589627), + FRAC_CONST(0.96571375721724895), + FRAC_CONST(0.96613724884224783), + FRAC_CONST(0.96655815382707866), + FRAC_CONST(0.96697647104485207), + FRAC_CONST(0.96739219937560694), + FRAC_CONST(0.96780533770631338), + FRAC_CONST(0.96821588493087585), + FRAC_CONST(0.9686238399501359), + FRAC_CONST(0.96902920167187501), + FRAC_CONST(0.96943196901081796), + FRAC_CONST(0.96983214088863534), + FRAC_CONST(0.9702297162339466), + FRAC_CONST(0.97062469398232287), + FRAC_CONST(0.97101707307629004), + FRAC_CONST(0.97140685246533098), + FRAC_CONST(0.97179403110588902), + FRAC_CONST(0.97217860796137046), + FRAC_CONST(0.97256058200214734), + FRAC_CONST(0.97293995220556007), + FRAC_CONST(0.97331671755592064), + FRAC_CONST(0.97369087704451474), + FRAC_CONST(0.97406242966960455), + FRAC_CONST(0.97443137443643235), + FRAC_CONST(0.97479771035722163), + FRAC_CONST(0.97516143645118103), + FRAC_CONST(0.97552255174450631), + FRAC_CONST(0.97588105527038305), + FRAC_CONST(0.97623694606898959), + FRAC_CONST(0.97659022318749911), + FRAC_CONST(0.97694088568008242), + FRAC_CONST(0.97728893260791039), + FRAC_CONST(0.97763436303915685), + FRAC_CONST(0.97797717604900047), + FRAC_CONST(0.97831737071962765), + FRAC_CONST(0.97865494614023485), + FRAC_CONST(0.97898990140703124), + FRAC_CONST(0.97932223562324061), + FRAC_CONST(0.97965194789910426), + FRAC_CONST(0.9799790373518833), + FRAC_CONST(0.98030350310586067), + FRAC_CONST(0.98062534429234405), + FRAC_CONST(0.98094456004966768), + FRAC_CONST(0.98126114952319499), + FRAC_CONST(0.98157511186532054), + FRAC_CONST(0.98188644623547261), + FRAC_CONST(0.98219515180011563), + FRAC_CONST(0.98250122773275184), + FRAC_CONST(0.98280467321392362), + FRAC_CONST(0.98310548743121629), + FRAC_CONST(0.98340366957925973), + FRAC_CONST(0.98369921885973044), + FRAC_CONST(0.98399213448135414), + FRAC_CONST(0.98428241565990748), + FRAC_CONST(0.98457006161822058), + FRAC_CONST(0.98485507158617835), + FRAC_CONST(0.98513744480072363), + FRAC_CONST(0.98541718050585803), + FRAC_CONST(0.98569427795264519), + FRAC_CONST(0.98596873639921168), + FRAC_CONST(0.98624055511074971), + FRAC_CONST(0.98650973335951875), + FRAC_CONST(0.98677627042484772), + FRAC_CONST(0.98704016559313645), + FRAC_CONST(0.98730141815785832), + FRAC_CONST(0.98756002741956173), + FRAC_CONST(0.9878159926858715), + FRAC_CONST(0.98806931327149194), + FRAC_CONST(0.98831998849820735), + FRAC_CONST(0.98856801769488489), + FRAC_CONST(0.98881340019747566), + FRAC_CONST(0.98905613534901682), + FRAC_CONST(0.98929622249963345), + FRAC_CONST(0.98953366100653983), + FRAC_CONST(0.98976845023404181), + FRAC_CONST(0.99000058955353776), + FRAC_CONST(0.99023007834352106), + FRAC_CONST(0.99045691598958097), + FRAC_CONST(0.99068110188440506), + FRAC_CONST(0.99090263542778001), + FRAC_CONST(0.99112151602659404), + FRAC_CONST(0.99133774309483769), + FRAC_CONST(0.99155131605360625), + FRAC_CONST(0.99176223433110056), + FRAC_CONST(0.99197049736262888), + FRAC_CONST(0.99217610459060845), + FRAC_CONST(0.99237905546456673), + FRAC_CONST(0.99257934944114334), + FRAC_CONST(0.99277698598409092), + FRAC_CONST(0.99297196456427694), + FRAC_CONST(0.99316428465968509), + FRAC_CONST(0.99335394575541669), + FRAC_CONST(0.99354094734369169), + FRAC_CONST(0.99372528892385081), + FRAC_CONST(0.99390697000235606), + FRAC_CONST(0.99408599009279242), + FRAC_CONST(0.99426234871586938), + FRAC_CONST(0.99443604539942176), + FRAC_CONST(0.99460707967841133), + FRAC_CONST(0.99477545109492771), + FRAC_CONST(0.99494115919819004), + FRAC_CONST(0.99510420354454787), + FRAC_CONST(0.99526458369748239), + FRAC_CONST(0.99542229922760772), + FRAC_CONST(0.99557734971267187), + FRAC_CONST(0.9957297347375581), + FRAC_CONST(0.99587945389428578), + FRAC_CONST(0.99602650678201154), + FRAC_CONST(0.99617089300703077), + FRAC_CONST(0.996312612182778), + FRAC_CONST(0.99645166392982831), + FRAC_CONST(0.99658804787589839), + FRAC_CONST(0.99672176365584741), + FRAC_CONST(0.99685281091167788), + FRAC_CONST(0.99698118929253687), + FRAC_CONST(0.99710689845471678), + FRAC_CONST(0.99722993806165661), + FRAC_CONST(0.99735030778394196), + FRAC_CONST(0.99746800729930707), + FRAC_CONST(0.99758303629263489), + FRAC_CONST(0.99769539445595812), + FRAC_CONST(0.99780508148846014), + FRAC_CONST(0.99791209709647588), + FRAC_CONST(0.99801644099349218), + FRAC_CONST(0.99811811290014918), + FRAC_CONST(0.9982171125442405), + FRAC_CONST(0.9983134396607144), + FRAC_CONST(0.99840709399167404), + FRAC_CONST(0.99849807528637868), + FRAC_CONST(0.99858638330124405), + FRAC_CONST(0.99867201779984294), + FRAC_CONST(0.99875497855290607), + FRAC_CONST(0.99883526533832245), + FRAC_CONST(0.99891287794114036), + FRAC_CONST(0.99898781615356746), + FRAC_CONST(0.99906007977497147), + FRAC_CONST(0.99912966861188113), + FRAC_CONST(0.99919658247798593), + FRAC_CONST(0.99926082119413751), + FRAC_CONST(0.99932238458834954), + FRAC_CONST(0.999381272495798), + FRAC_CONST(0.99943748475882255), + FRAC_CONST(0.9994910212269259), + FRAC_CONST(0.99954188175677483), + FRAC_CONST(0.99959006621220048), + FRAC_CONST(0.99963557446419837), + FRAC_CONST(0.99967840639092931), + FRAC_CONST(0.99971856187771946), + FRAC_CONST(0.99975604081706027), + FRAC_CONST(0.99979084310860955), + FRAC_CONST(0.99982296865919107), + FRAC_CONST(0.99985241738279484), + FRAC_CONST(0.99987918920057806), + FRAC_CONST(0.99990328404086426), + FRAC_CONST(0.9999247018391445), + FRAC_CONST(0.99994344253807688), + FRAC_CONST(0.99995950608748674), + FRAC_CONST(0.99997289244436727), + FRAC_CONST(0.99998360157287902), + FRAC_CONST(0.9999916334443506), + FRAC_CONST(0.99999698803727821), + FRAC_CONST(0.99999966533732598) +}; +#endif + +ALIGN static const real_t sine_short_128[] = +{ + FRAC_CONST(0.0061358846491544753), + FRAC_CONST(0.01840672990580482), + FRAC_CONST(0.030674803176636626), + FRAC_CONST(0.04293825693494082), + FRAC_CONST(0.055195244349689934), + FRAC_CONST(0.067443919563664051), + FRAC_CONST(0.079682437971430126), + FRAC_CONST(0.091908956497132724), + FRAC_CONST(0.10412163387205459), + FRAC_CONST(0.11631863091190475), + FRAC_CONST(0.12849811079379317), + FRAC_CONST(0.14065823933284921), + FRAC_CONST(0.15279718525844344), + FRAC_CONST(0.16491312048996989), + FRAC_CONST(0.17700422041214875), + FRAC_CONST(0.18906866414980619), + FRAC_CONST(0.2011046348420919), + FRAC_CONST(0.21311031991609136), + FRAC_CONST(0.22508391135979283), + FRAC_CONST(0.2370236059943672), + FRAC_CONST(0.24892760574572015), + FRAC_CONST(0.26079411791527551), + FRAC_CONST(0.27262135544994898), + FRAC_CONST(0.28440753721127188), + FRAC_CONST(0.29615088824362379), + FRAC_CONST(0.30784964004153487), + FRAC_CONST(0.31950203081601569), + FRAC_CONST(0.33110630575987643), + FRAC_CONST(0.34266071731199438), + FRAC_CONST(0.35416352542049034), + FRAC_CONST(0.36561299780477385), + FRAC_CONST(0.37700741021641826), + FRAC_CONST(0.38834504669882625), + FRAC_CONST(0.39962419984564679), + FRAC_CONST(0.41084317105790391), + FRAC_CONST(0.42200027079979968), + FRAC_CONST(0.43309381885315196), + FRAC_CONST(0.4441221445704292), + FRAC_CONST(0.45508358712634384), + FRAC_CONST(0.46597649576796618), + FRAC_CONST(0.47679923006332209), + FRAC_CONST(0.487550160148436), + FRAC_CONST(0.49822766697278187), + FRAC_CONST(0.50883014254310699), + FRAC_CONST(0.51935599016558964), + FRAC_CONST(0.52980362468629461), + FRAC_CONST(0.54017147272989285), + FRAC_CONST(0.55045797293660481), + FRAC_CONST(0.56066157619733603), + FRAC_CONST(0.57078074588696726), + FRAC_CONST(0.58081395809576453), + FRAC_CONST(0.59075970185887416), + FRAC_CONST(0.60061647938386897), + FRAC_CONST(0.61038280627630948), + FRAC_CONST(0.6200572117632891), + FRAC_CONST(0.62963823891492698), + FRAC_CONST(0.63912444486377573), + FRAC_CONST(0.64851440102211244), + FRAC_CONST(0.65780669329707864), + FRAC_CONST(0.66699992230363747), + FRAC_CONST(0.67609270357531592), + FRAC_CONST(0.68508366777270036), + FRAC_CONST(0.693971460889654), + FRAC_CONST(0.7027547444572253), + FRAC_CONST(0.71143219574521643), + FRAC_CONST(0.72000250796138165), + FRAC_CONST(0.7284643904482252), + FRAC_CONST(0.73681656887736979), + FRAC_CONST(0.74505778544146595), + FRAC_CONST(0.75318679904361241), + FRAC_CONST(0.76120238548426178), + FRAC_CONST(0.76910333764557959), + FRAC_CONST(0.77688846567323244), + FRAC_CONST(0.78455659715557524), + FRAC_CONST(0.79210657730021239), + FRAC_CONST(0.79953726910790501), + FRAC_CONST(0.80684755354379922), + FRAC_CONST(0.8140363297059483), + FRAC_CONST(0.82110251499110465), + FRAC_CONST(0.8280450452577558), + FRAC_CONST(0.83486287498638001), + FRAC_CONST(0.84155497743689833), + FRAC_CONST(0.84812034480329712), + FRAC_CONST(0.85455798836540053), + FRAC_CONST(0.86086693863776731), + FRAC_CONST(0.86704624551569265), + FRAC_CONST(0.87309497841829009), + FRAC_CONST(0.87901222642863341), + FRAC_CONST(0.88479709843093779), + FRAC_CONST(0.89044872324475788), + FRAC_CONST(0.89596624975618511), + FRAC_CONST(0.90134884704602203), + FRAC_CONST(0.90659570451491533), + FRAC_CONST(0.91170603200542988), + FRAC_CONST(0.9166790599210427), + FRAC_CONST(0.9215140393420419), + FRAC_CONST(0.92621024213831127), + FRAC_CONST(0.93076696107898371), + FRAC_CONST(0.9351835099389475), + FRAC_CONST(0.93945922360218992), + FRAC_CONST(0.94359345816196039), + FRAC_CONST(0.94758559101774109), + FRAC_CONST(0.95143502096900834), + FRAC_CONST(0.95514116830577067), + FRAC_CONST(0.9587034748958716), + FRAC_CONST(0.96212140426904158), + FRAC_CONST(0.9653944416976894), + FRAC_CONST(0.96852209427441727), + FRAC_CONST(0.97150389098625178), + FRAC_CONST(0.97433938278557586), + FRAC_CONST(0.97702814265775439), + FRAC_CONST(0.97956976568544052), + FRAC_CONST(0.98196386910955524), + FRAC_CONST(0.98421009238692903), + FRAC_CONST(0.98630809724459867), + FRAC_CONST(0.98825756773074946), + FRAC_CONST(0.99005821026229712), + FRAC_CONST(0.99170975366909953), + FRAC_CONST(0.9932119492347945), + FRAC_CONST(0.99456457073425542), + FRAC_CONST(0.99576741446765982), + FRAC_CONST(0.99682029929116567), + FRAC_CONST(0.99772306664419164), + FRAC_CONST(0.99847558057329477), + FRAC_CONST(0.99907772775264536), + FRAC_CONST(0.99952941750109314), + FRAC_CONST(0.9998305817958234), + FRAC_CONST(0.99998117528260111) +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const real_t sine_short_120[] = +{ + FRAC_CONST(0.0065449379673518581), + FRAC_CONST(0.019633692460628301), + FRAC_CONST(0.032719082821776137), + FRAC_CONST(0.045798866936520771), + FRAC_CONST(0.058870803651189033), + FRAC_CONST(0.071932653156719387), + FRAC_CONST(0.084982177372441667), + FRAC_CONST(0.09801714032956059), + FRAC_CONST(0.11103530855427769), + FRAC_CONST(0.12403445145048532), + FRAC_CONST(0.13701234168196802), + FRAC_CONST(0.14996675555404498), + FRAC_CONST(0.16289547339458874), + FRAC_CONST(0.17579627993435451), + FRAC_CONST(0.18866696468655525), + FRAC_CONST(0.2015053223256171), + FRAC_CONST(0.21430915306505074), + FRAC_CONST(0.2270762630343732), + FRAC_CONST(0.23980446465501654), + FRAC_CONST(0.25249157701515795), + FRAC_CONST(0.26513542624340797), + FRAC_CONST(0.27773384588129219), + FRAC_CONST(0.29028467725446233), + FRAC_CONST(0.3027857698425746), + FRAC_CONST(0.31523498164776964), + FRAC_CONST(0.32763017956169349), + FRAC_CONST(0.33996923973099424), + FRAC_CONST(0.35225004792123354), + FRAC_CONST(0.36447049987914965), + FRAC_CONST(0.37662850169321077), + FRAC_CONST(0.38872197015239557), + FRAC_CONST(0.40074883310314097), + FRAC_CONST(0.41270702980439467), + FRAC_CONST(0.42459451128071307), + FRAC_CONST(0.43640924067334208), + FRAC_CONST(0.44814919358922256), + FRAC_CONST(0.45981235844785984), + FRAC_CONST(0.47139673682599764), + FRAC_CONST(0.48290034380003727), + FRAC_CONST(0.49432120828614462), + FRAC_CONST(0.50565737337798455), + FRAC_CONST(0.51690689668202761), + FRAC_CONST(0.52806785065036799), + FRAC_CONST(0.53913832291100017), + FRAC_CONST(0.55011641659549337), + FRAC_CONST(0.56100025066400983), + FRAC_CONST(0.57178796022761225), + FRAC_CONST(0.58247769686780215), + FRAC_CONST(0.59306762895323706), + FRAC_CONST(0.60355594195357143), + FRAC_CONST(0.61394083875036642), + FRAC_CONST(0.62422053994501758), + FRAC_CONST(0.63439328416364549), + FRAC_CONST(0.64445732835889735), + FRAC_CONST(0.65441094810861034), + FRAC_CONST(0.66425243791128175), + FRAC_CONST(0.67398011147829784), + FRAC_CONST(0.68359230202287125), + FRAC_CONST(0.69308736254563585), + FRAC_CONST(0.70246366611685174), + FRAC_CONST(0.71171960615517138), + FRAC_CONST(0.72085359670291882), + FRAC_CONST(0.7298640726978356), + FRAC_CONST(0.73874949024124625), + FRAC_CONST(0.74750832686259672), + FRAC_CONST(0.75613908178032285), + FRAC_CONST(0.76464027615900032), + FRAC_CONST(0.77301045336273699), + FRAC_CONST(0.78124817920475853), + FRAC_CONST(0.78935204219315003), + FRAC_CONST(0.79732065377270711), + FRAC_CONST(0.80515264856285829), + FRAC_CONST(0.81284668459161513), + FRAC_CONST(0.82040144352551359), + FRAC_CONST(0.82781563089550203), + FRAC_CONST(0.83508797631874299), + FRAC_CONST(0.84221723371628654), + FRAC_CONST(0.84920218152657889), + FRAC_CONST(0.85604162291477137), + FRAC_CONST(0.86273438597779184), + FRAC_CONST(0.86927932394514362), + FRAC_CONST(0.87567531537539967), + FRAC_CONST(0.88192126434835494), + FRAC_CONST(0.88801610065280734), + FRAC_CONST(0.89395877996993212), + FRAC_CONST(0.8997482840522214), + FRAC_CONST(0.90538362089795521), + FRAC_CONST(0.91086382492117568), + FRAC_CONST(0.91618795711713596), + FRAC_CONST(0.92135510522319242), + FRAC_CONST(0.9263643838751181), + FRAC_CONST(0.93121493475880346), + FRAC_CONST(0.93590592675732565), + FRAC_CONST(0.94043655609335486), + FRAC_CONST(0.94480604646687805), + FRAC_CONST(0.94901364918821385), + FRAC_CONST(0.95305864330629697), + FRAC_CONST(0.95694033573220882), + FRAC_CONST(0.9606580613579353), + FRAC_CONST(0.96421118317032928), + FRAC_CONST(0.96759909236025976), + FRAC_CONST(0.9708212084269281), + FRAC_CONST(0.97387697927733363), + FRAC_CONST(0.97676588132087239), + FRAC_CONST(0.97948741955905139), + FRAC_CONST(0.98204112767030394), + FRAC_CONST(0.98442656808989171), + FRAC_CONST(0.98664333208487898), + FRAC_CONST(0.98869103982416728), + FRAC_CONST(0.99056934044357725), + FRAC_CONST(0.99227791210596705), + FRAC_CONST(0.99381646205637808), + FRAC_CONST(0.99518472667219682), + FRAC_CONST(0.99638247150832537), + FRAC_CONST(0.99740949133735191), + FRAC_CONST(0.99826561018471593), + FRAC_CONST(0.99895068135886012), + FRAC_CONST(0.99946458747636568), + FRAC_CONST(0.99980724048206482), + FRAC_CONST(0.99997858166412923) +}; +#endif + +#ifdef LD_DEC +ALIGN static const real_t sine_mid_512[] = +{ + FRAC_CONST(0.0015339801862847655), + FRAC_CONST(0.0046019261204485705), + FRAC_CONST(0.007669828739531097), + FRAC_CONST(0.010737659167264491), + FRAC_CONST(0.013805388528060391), + FRAC_CONST(0.01687298794728171), + FRAC_CONST(0.019940428551514441), + FRAC_CONST(0.023007681468839369), + FRAC_CONST(0.026074717829103901), + FRAC_CONST(0.029141508764193722), + FRAC_CONST(0.032208025408304586), + FRAC_CONST(0.035274238898213947), + FRAC_CONST(0.038340120373552694), + FRAC_CONST(0.041405640977076739), + FRAC_CONST(0.044470771854938668), + FRAC_CONST(0.047535484156959303), + FRAC_CONST(0.050599749036899282), + FRAC_CONST(0.05366353765273052), + FRAC_CONST(0.056726821166907748), + FRAC_CONST(0.059789570746639868), + FRAC_CONST(0.062851757564161406), + FRAC_CONST(0.065913352797003805), + FRAC_CONST(0.068974327628266746), + FRAC_CONST(0.072034653246889332), + FRAC_CONST(0.075094300847921305), + FRAC_CONST(0.078153241632794232), + FRAC_CONST(0.081211446809592441), + FRAC_CONST(0.084268887593324071), + FRAC_CONST(0.087325535206192059), + FRAC_CONST(0.090381360877864983), + FRAC_CONST(0.093436335845747787), + FRAC_CONST(0.096490431355252593), + FRAC_CONST(0.099543618660069319), + FRAC_CONST(0.10259586902243628), + FRAC_CONST(0.10564715371341062), + FRAC_CONST(0.10869744401313872), + FRAC_CONST(0.11174671121112659), + FRAC_CONST(0.11479492660651008), + FRAC_CONST(0.11784206150832498), + FRAC_CONST(0.12088808723577708), + FRAC_CONST(0.12393297511851216), + FRAC_CONST(0.12697669649688587), + FRAC_CONST(0.13001922272223335), + FRAC_CONST(0.13306052515713906), + FRAC_CONST(0.1361005751757062), + FRAC_CONST(0.1391393441638262), + FRAC_CONST(0.14217680351944803), + FRAC_CONST(0.14521292465284746), + FRAC_CONST(0.14824767898689603), + FRAC_CONST(0.15128103795733022), + FRAC_CONST(0.1543129730130201), + FRAC_CONST(0.15734345561623825), + FRAC_CONST(0.16037245724292828), + FRAC_CONST(0.16339994938297323), + FRAC_CONST(0.1664259035404641), + FRAC_CONST(0.16945029123396796), + FRAC_CONST(0.17247308399679595), + FRAC_CONST(0.17549425337727143), + FRAC_CONST(0.17851377093899751), + FRAC_CONST(0.18153160826112497), + FRAC_CONST(0.18454773693861962), + FRAC_CONST(0.1875621285825296), + FRAC_CONST(0.19057475482025274), + FRAC_CONST(0.19358558729580361), + FRAC_CONST(0.19659459767008022), + FRAC_CONST(0.19960175762113097), + FRAC_CONST(0.20260703884442113), + FRAC_CONST(0.20561041305309924), + FRAC_CONST(0.20861185197826349), + FRAC_CONST(0.21161132736922755), + FRAC_CONST(0.21460881099378676), + FRAC_CONST(0.21760427463848364), + FRAC_CONST(0.22059769010887351), + FRAC_CONST(0.22358902922978999), + FRAC_CONST(0.22657826384561), + FRAC_CONST(0.22956536582051887), + FRAC_CONST(0.23255030703877524), + FRAC_CONST(0.23553305940497549), + FRAC_CONST(0.23851359484431842), + FRAC_CONST(0.24149188530286933), + FRAC_CONST(0.24446790274782415), + FRAC_CONST(0.24744161916777327), + FRAC_CONST(0.25041300657296522), + FRAC_CONST(0.25338203699557016), + FRAC_CONST(0.25634868248994291), + FRAC_CONST(0.25931291513288623), + FRAC_CONST(0.26227470702391359), + FRAC_CONST(0.26523403028551179), + FRAC_CONST(0.26819085706340318), + FRAC_CONST(0.27114515952680801), + FRAC_CONST(0.27409690986870638), + FRAC_CONST(0.2770460803060999), + FRAC_CONST(0.27999264308027322), + FRAC_CONST(0.28293657045705539), + FRAC_CONST(0.28587783472708062), + FRAC_CONST(0.28881640820604948), + FRAC_CONST(0.29175226323498926), + FRAC_CONST(0.29468537218051433), + FRAC_CONST(0.2976157074350862), + FRAC_CONST(0.30054324141727345), + FRAC_CONST(0.30346794657201132), + FRAC_CONST(0.30638979537086092), + FRAC_CONST(0.30930876031226873), + FRAC_CONST(0.31222481392182488), + FRAC_CONST(0.31513792875252244), + FRAC_CONST(0.31804807738501495), + FRAC_CONST(0.32095523242787521), + FRAC_CONST(0.32385936651785285), + FRAC_CONST(0.32676045232013173), + FRAC_CONST(0.32965846252858749), + FRAC_CONST(0.33255336986604422), + FRAC_CONST(0.3354451470845316), + FRAC_CONST(0.33833376696554113), + FRAC_CONST(0.34121920232028236), + FRAC_CONST(0.34410142598993881), + FRAC_CONST(0.34698041084592368), + FRAC_CONST(0.34985612979013492), + FRAC_CONST(0.35272855575521073), + FRAC_CONST(0.35559766170478385), + FRAC_CONST(0.35846342063373654), + FRAC_CONST(0.36132580556845428), + FRAC_CONST(0.36418478956707989), + FRAC_CONST(0.36704034571976718), + FRAC_CONST(0.3698924471489341), + FRAC_CONST(0.37274106700951576), + FRAC_CONST(0.37558617848921722), + FRAC_CONST(0.37842775480876556), + FRAC_CONST(0.38126576922216238), + FRAC_CONST(0.38410019501693504), + FRAC_CONST(0.38693100551438858), + FRAC_CONST(0.38975817406985641), + FRAC_CONST(0.39258167407295147), + FRAC_CONST(0.39540147894781635), + FRAC_CONST(0.39821756215337356), + FRAC_CONST(0.40102989718357562), + FRAC_CONST(0.40383845756765407), + FRAC_CONST(0.40664321687036903), + FRAC_CONST(0.40944414869225759), + FRAC_CONST(0.41224122666988289), + FRAC_CONST(0.41503442447608163), + FRAC_CONST(0.41782371582021227), + FRAC_CONST(0.42060907444840251), + FRAC_CONST(0.42339047414379605), + FRAC_CONST(0.42616788872679962), + FRAC_CONST(0.42894129205532949), + FRAC_CONST(0.43171065802505726), + FRAC_CONST(0.43447596056965565), + FRAC_CONST(0.43723717366104409), + FRAC_CONST(0.43999427130963326), + FRAC_CONST(0.44274722756457002), + FRAC_CONST(0.44549601651398174), + FRAC_CONST(0.44824061228521989), + FRAC_CONST(0.45098098904510386), + FRAC_CONST(0.45371712100016387), + FRAC_CONST(0.45644898239688392), + FRAC_CONST(0.45917654752194409), + FRAC_CONST(0.46189979070246273), + FRAC_CONST(0.46461868630623782), + FRAC_CONST(0.46733320874198842), + FRAC_CONST(0.47004333245959562), + FRAC_CONST(0.47274903195034279), + FRAC_CONST(0.47545028174715587), + FRAC_CONST(0.47814705642484301), + FRAC_CONST(0.48083933060033396), + FRAC_CONST(0.48352707893291874), + FRAC_CONST(0.48621027612448642), + FRAC_CONST(0.48888889691976317), + FRAC_CONST(0.4915629161065499), + FRAC_CONST(0.49423230851595967), + FRAC_CONST(0.49689704902265447), + FRAC_CONST(0.49955711254508184), + FRAC_CONST(0.50221247404571079), + FRAC_CONST(0.50486310853126759), + FRAC_CONST(0.50750899105297087), + FRAC_CONST(0.51015009670676681), + FRAC_CONST(0.51278640063356296), + FRAC_CONST(0.51541787801946293), + FRAC_CONST(0.51804450409599934), + FRAC_CONST(0.52066625414036716), + FRAC_CONST(0.52328310347565643), + FRAC_CONST(0.52589502747108463), + FRAC_CONST(0.52850200154222848), + FRAC_CONST(0.531104001151255), + FRAC_CONST(0.53370100180715296), + FRAC_CONST(0.53629297906596318), + FRAC_CONST(0.53887990853100842), + FRAC_CONST(0.54146176585312344), + FRAC_CONST(0.54403852673088382), + FRAC_CONST(0.54661016691083486), + FRAC_CONST(0.54917666218771966), + FRAC_CONST(0.55173798840470734), + FRAC_CONST(0.55429412145362), + FRAC_CONST(0.5568450372751601), + FRAC_CONST(0.55939071185913614), + FRAC_CONST(0.56193112124468947), + FRAC_CONST(0.5644662415205195), + FRAC_CONST(0.56699604882510868), + FRAC_CONST(0.56952051934694714), + FRAC_CONST(0.57203962932475705), + FRAC_CONST(0.57455335504771576), + FRAC_CONST(0.57706167285567944), + FRAC_CONST(0.57956455913940563), + FRAC_CONST(0.58206199034077544), + FRAC_CONST(0.58455394295301533), + FRAC_CONST(0.58704039352091797), + FRAC_CONST(0.58952131864106394), + FRAC_CONST(0.59199669496204099), + FRAC_CONST(0.59446649918466443), + FRAC_CONST(0.5969307080621965), + FRAC_CONST(0.59938929840056454), + FRAC_CONST(0.60184224705858003), + FRAC_CONST(0.60428953094815596), + FRAC_CONST(0.60673112703452448), + FRAC_CONST(0.60916701233645321), + FRAC_CONST(0.61159716392646191), + FRAC_CONST(0.61402155893103838), + FRAC_CONST(0.61644017453085365), + FRAC_CONST(0.61885298796097632), + FRAC_CONST(0.62125997651108755), + FRAC_CONST(0.62366111752569453), + FRAC_CONST(0.62605638840434352), + FRAC_CONST(0.62844576660183271), + FRAC_CONST(0.63082922962842447), + FRAC_CONST(0.63320675505005719), + FRAC_CONST(0.63557832048855611), + FRAC_CONST(0.63794390362184406), + FRAC_CONST(0.64030348218415167), + FRAC_CONST(0.64265703396622686), + FRAC_CONST(0.64500453681554393), + FRAC_CONST(0.64734596863651206), + FRAC_CONST(0.64968130739068319), + FRAC_CONST(0.6520105310969595), + FRAC_CONST(0.65433361783180044), + FRAC_CONST(0.65665054572942894), + FRAC_CONST(0.65896129298203732), + FRAC_CONST(0.66126583783999227), + FRAC_CONST(0.66356415861203977), + FRAC_CONST(0.66585623366550972), + FRAC_CONST(0.66814204142651845), + FRAC_CONST(0.67042156038017309), + FRAC_CONST(0.67269476907077286), + FRAC_CONST(0.67496164610201193), + FRAC_CONST(0.67722217013718033), + FRAC_CONST(0.67947631989936497), + FRAC_CONST(0.68172407417164971), + FRAC_CONST(0.6839654117973154), + FRAC_CONST(0.68620031168003859), + FRAC_CONST(0.68842875278409044), + FRAC_CONST(0.6906507141345346), + FRAC_CONST(0.69286617481742463), + FRAC_CONST(0.69507511398000088), + FRAC_CONST(0.69727751083088652), + FRAC_CONST(0.69947334464028377), + FRAC_CONST(0.70166259474016845), + FRAC_CONST(0.70384524052448494), + FRAC_CONST(0.70602126144933974), + FRAC_CONST(0.70819063703319529), + FRAC_CONST(0.71035334685706231), + FRAC_CONST(0.71250937056469232), + FRAC_CONST(0.71465868786276898), + FRAC_CONST(0.71680127852109954), + FRAC_CONST(0.71893712237280438), + FRAC_CONST(0.72106619931450811), + FRAC_CONST(0.72318848930652735), + FRAC_CONST(0.72530397237306066), + FRAC_CONST(0.72741262860237577), + FRAC_CONST(0.7295144381469969), + FRAC_CONST(0.73160938122389252), + FRAC_CONST(0.73369743811466026), + FRAC_CONST(0.73577858916571348), + FRAC_CONST(0.73785281478846598), + FRAC_CONST(0.73992009545951609), + FRAC_CONST(0.74198041172083096), + FRAC_CONST(0.74403374417992918), + FRAC_CONST(0.74608007351006378), + FRAC_CONST(0.74811938045040349), + FRAC_CONST(0.75015164580621496), + FRAC_CONST(0.7521768504490427), + FRAC_CONST(0.75419497531688917), + FRAC_CONST(0.75620600141439454), + FRAC_CONST(0.75820990981301528), + FRAC_CONST(0.76020668165120242), + FRAC_CONST(0.7621962981345789), + FRAC_CONST(0.76417874053611667), + FRAC_CONST(0.76615399019631281), + FRAC_CONST(0.76812202852336531), + FRAC_CONST(0.7700828369933479), + FRAC_CONST(0.77203639715038441), + FRAC_CONST(0.77398269060682279), + FRAC_CONST(0.77592169904340758), + FRAC_CONST(0.77785340420945304), + FRAC_CONST(0.77977778792301444), + FRAC_CONST(0.78169483207105939), + FRAC_CONST(0.7836045186096382), + FRAC_CONST(0.78550682956405393), + FRAC_CONST(0.78740174702903132), + FRAC_CONST(0.78928925316888565), + FRAC_CONST(0.79116933021769009), + FRAC_CONST(0.79304196047944364), + FRAC_CONST(0.79490712632823701), + FRAC_CONST(0.79676481020841872), + FRAC_CONST(0.79861499463476082), + FRAC_CONST(0.80045766219262271), + FRAC_CONST(0.80229279553811572), + FRAC_CONST(0.8041203773982657), + FRAC_CONST(0.80594039057117628), + FRAC_CONST(0.80775281792619036), + FRAC_CONST(0.80955764240405126), + FRAC_CONST(0.81135484701706373), + FRAC_CONST(0.81314441484925359), + FRAC_CONST(0.81492632905652662), + FRAC_CONST(0.81670057286682785), + FRAC_CONST(0.81846712958029866), + FRAC_CONST(0.82022598256943469), + FRAC_CONST(0.82197711527924155), + FRAC_CONST(0.82372051122739132), + FRAC_CONST(0.82545615400437744), + FRAC_CONST(0.82718402727366902), + FRAC_CONST(0.82890411477186487), + FRAC_CONST(0.8306164003088462), + FRAC_CONST(0.83232086776792968), + FRAC_CONST(0.83401750110601813), + FRAC_CONST(0.8357062843537526), + FRAC_CONST(0.83738720161566194), + FRAC_CONST(0.83906023707031263), + FRAC_CONST(0.84072537497045807), + FRAC_CONST(0.84238259964318596), + FRAC_CONST(0.84403189549006641), + FRAC_CONST(0.84567324698729907), + FRAC_CONST(0.84730663868585832), + FRAC_CONST(0.84893205521163961), + FRAC_CONST(0.85054948126560337), + FRAC_CONST(0.85215890162391983), + FRAC_CONST(0.8537603011381113), + FRAC_CONST(0.85535366473519603), + FRAC_CONST(0.85693897741782865), + FRAC_CONST(0.85851622426444274), + FRAC_CONST(0.86008539042939014), + FRAC_CONST(0.8616464611430813), + FRAC_CONST(0.86319942171212416), + FRAC_CONST(0.86474425751946238), + FRAC_CONST(0.86628095402451299), + FRAC_CONST(0.86780949676330321), + FRAC_CONST(0.86932987134860673), + FRAC_CONST(0.87084206347007886), + FRAC_CONST(0.87234605889439154), + FRAC_CONST(0.87384184346536675), + FRAC_CONST(0.87532940310411078), + FRAC_CONST(0.87680872380914576), + FRAC_CONST(0.87827979165654146), + FRAC_CONST(0.87974259280004741), + FRAC_CONST(0.88119711347122198), + FRAC_CONST(0.88264333997956279), + FRAC_CONST(0.88408125871263499), + FRAC_CONST(0.88551085613619995), + FRAC_CONST(0.88693211879434208), + FRAC_CONST(0.88834503330959624), + FRAC_CONST(0.88974958638307289), + FRAC_CONST(0.89114576479458318), + FRAC_CONST(0.89253355540276469), + FRAC_CONST(0.89391294514520325), + FRAC_CONST(0.89528392103855758), + FRAC_CONST(0.89664647017868015), + FRAC_CONST(0.89800057974073988), + FRAC_CONST(0.89934623697934146), + FRAC_CONST(0.90068342922864686), + FRAC_CONST(0.90201214390249307), + FRAC_CONST(0.90333236849451182), + FRAC_CONST(0.90464409057824624), + FRAC_CONST(0.90594729780726846), + FRAC_CONST(0.90724197791529593), + FRAC_CONST(0.90852811871630612), + FRAC_CONST(0.90980570810465222), + FRAC_CONST(0.91107473405517625), + FRAC_CONST(0.91233518462332275), + FRAC_CONST(0.91358704794525081), + FRAC_CONST(0.91483031223794609), + FRAC_CONST(0.91606496579933161), + FRAC_CONST(0.91729099700837791), + FRAC_CONST(0.91850839432521225), + FRAC_CONST(0.91971714629122736), + FRAC_CONST(0.92091724152918952), + FRAC_CONST(0.92210866874334507), + FRAC_CONST(0.92329141671952764), + FRAC_CONST(0.9244654743252626), + FRAC_CONST(0.92563083050987272), + FRAC_CONST(0.92678747430458175), + FRAC_CONST(0.92793539482261789), + FRAC_CONST(0.92907458125931575), + FRAC_CONST(0.93020502289221907), + FRAC_CONST(0.93132670908118043), + FRAC_CONST(0.93243962926846236), + FRAC_CONST(0.93354377297883617), + FRAC_CONST(0.93463912981968078), + FRAC_CONST(0.93572568948108037), + FRAC_CONST(0.93680344173592156), + FRAC_CONST(0.93787237643998989), + FRAC_CONST(0.93893248353206449), + FRAC_CONST(0.93998375303401394), + FRAC_CONST(0.94102617505088926), + FRAC_CONST(0.94205973977101731), + FRAC_CONST(0.94308443746609349), + FRAC_CONST(0.94410025849127266), + FRAC_CONST(0.94510719328526061), + FRAC_CONST(0.94610523237040334), + FRAC_CONST(0.94709436635277722), + FRAC_CONST(0.94807458592227623), + FRAC_CONST(0.94904588185270056), + FRAC_CONST(0.950008245001843), + FRAC_CONST(0.95096166631157508), + FRAC_CONST(0.95190613680793223), + FRAC_CONST(0.95284164760119872), + FRAC_CONST(0.95376818988599033), + FRAC_CONST(0.95468575494133834), + FRAC_CONST(0.95559433413077111), + FRAC_CONST(0.95649391890239499), + FRAC_CONST(0.95738450078897586), + FRAC_CONST(0.95826607140801767), + FRAC_CONST(0.95913862246184189), + FRAC_CONST(0.96000214573766585), + FRAC_CONST(0.96085663310767966), + FRAC_CONST(0.96170207652912254), + FRAC_CONST(0.96253846804435916), + FRAC_CONST(0.96336579978095405), + FRAC_CONST(0.96418406395174572), + FRAC_CONST(0.96499325285492032), + FRAC_CONST(0.96579335887408357), + FRAC_CONST(0.96658437447833312), + FRAC_CONST(0.96736629222232851), + FRAC_CONST(0.96813910474636233), + FRAC_CONST(0.96890280477642887), + FRAC_CONST(0.96965738512429245), + FRAC_CONST(0.9704028386875555), + FRAC_CONST(0.97113915844972509), + FRAC_CONST(0.9718663374802794), + FRAC_CONST(0.97258436893473221), + FRAC_CONST(0.97329324605469825), + FRAC_CONST(0.97399296216795583), + FRAC_CONST(0.97468351068851067), + FRAC_CONST(0.97536488511665687), + FRAC_CONST(0.97603707903903902), + FRAC_CONST(0.97670008612871184), + FRAC_CONST(0.97735390014519996), + FRAC_CONST(0.97799851493455714), + FRAC_CONST(0.9786339244294231), + FRAC_CONST(0.97926012264908202), + FRAC_CONST(0.97987710369951764), + FRAC_CONST(0.98048486177346938), + FRAC_CONST(0.98108339115048659), + FRAC_CONST(0.98167268619698311), + FRAC_CONST(0.98225274136628937), + FRAC_CONST(0.98282355119870524), + FRAC_CONST(0.98338511032155118), + FRAC_CONST(0.98393741344921892), + FRAC_CONST(0.98448045538322093), + FRAC_CONST(0.98501423101223984), + FRAC_CONST(0.98553873531217606), + FRAC_CONST(0.98605396334619544), + FRAC_CONST(0.98655991026477541), + FRAC_CONST(0.98705657130575097), + FRAC_CONST(0.98754394179435923), + FRAC_CONST(0.98802201714328353), + FRAC_CONST(0.98849079285269659), + FRAC_CONST(0.98895026451030299), + FRAC_CONST(0.98940042779138038), + FRAC_CONST(0.98984127845882053), + FRAC_CONST(0.99027281236316911), + FRAC_CONST(0.99069502544266463), + FRAC_CONST(0.99110791372327678), + FRAC_CONST(0.9915114733187439), + FRAC_CONST(0.99190570043060933), + FRAC_CONST(0.99229059134825737), + FRAC_CONST(0.99266614244894802), + FRAC_CONST(0.99303235019785141), + FRAC_CONST(0.99338921114808065), + FRAC_CONST(0.9937367219407246), + FRAC_CONST(0.99407487930487937), + FRAC_CONST(0.9944036800576791), + FRAC_CONST(0.9947231211043257), + FRAC_CONST(0.99503319943811863), + FRAC_CONST(0.99533391214048228), + FRAC_CONST(0.99562525638099431), + FRAC_CONST(0.99590722941741172), + FRAC_CONST(0.99617982859569687), + FRAC_CONST(0.99644305135004263), + FRAC_CONST(0.99669689520289606), + FRAC_CONST(0.99694135776498216), + FRAC_CONST(0.99717643673532619), + FRAC_CONST(0.9974021299012753), + FRAC_CONST(0.99761843513851955), + FRAC_CONST(0.99782535041111164), + FRAC_CONST(0.99802287377148624), + FRAC_CONST(0.99821100336047819), + FRAC_CONST(0.99838973740734016), + FRAC_CONST(0.99855907422975931), + FRAC_CONST(0.99871901223387294), + FRAC_CONST(0.99886954991428356), + FRAC_CONST(0.99901068585407338), + FRAC_CONST(0.99914241872481691), + FRAC_CONST(0.99926474728659442), + FRAC_CONST(0.99937767038800285), + FRAC_CONST(0.99948118696616695), + FRAC_CONST(0.99957529604674922), + FRAC_CONST(0.99965999674395922), + FRAC_CONST(0.99973528826056168), + FRAC_CONST(0.99980116988788426), + FRAC_CONST(0.99985764100582386), + FRAC_CONST(0.9999047010828529), + FRAC_CONST(0.99994234967602391), + FRAC_CONST(0.99997058643097414), + FRAC_CONST(0.9999894110819284), + FRAC_CONST(0.99999882345170188) +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const real_t sine_mid_480[] = +{ + FRAC_CONST(0.0016362454436240478), + FRAC_CONST(0.00490871880799799), + FRAC_CONST(0.0081811396039371282), + FRAC_CONST(0.011453472786443779), + FRAC_CONST(0.014725683311458524), + FRAC_CONST(0.017997736136235509), + FRAC_CONST(0.021269596219717739), + FRAC_CONST(0.024541228522912285), + FRAC_CONST(0.027812598009265607), + FRAC_CONST(0.03108366964503869), + FRAC_CONST(0.034354408399682276), + FRAC_CONST(0.037624779246211978), + FRAC_CONST(0.04089474716158345), + FRAC_CONST(0.044164277127067358), + FRAC_CONST(0.047433334128624507), + FRAC_CONST(0.050701883157280733), + FRAC_CONST(0.053969889209501881), + FRAC_CONST(0.057237317287568618), + FRAC_CONST(0.060504132399951269), + FRAC_CONST(0.063770299561684493), + FRAC_CONST(0.06703578379474201), + FRAC_CONST(0.070300550128411174), + FRAC_CONST(0.073564563599667426), + FRAC_CONST(0.076827789253548759), + FRAC_CONST(0.080090192143530081), + FRAC_CONST(0.083351737331897449), + FRAC_CONST(0.086612389890122182), + FRAC_CONST(0.089872114899234967), + FRAC_CONST(0.093130877450199795), + FRAC_CONST(0.096388642644287828), + FRAC_CONST(0.09964537559345106), + FRAC_CONST(0.1029010414206961), + FRAC_CONST(0.10615560526045748), + FRAC_CONST(0.10940903225897117), + FRAC_CONST(0.11266128757464781), + FRAC_CONST(0.11591233637844581), + FRAC_CONST(0.11916214385424433), + FRAC_CONST(0.1224106751992162), + FRAC_CONST(0.12565789562420052), + FRAC_CONST(0.12890377035407541), + FRAC_CONST(0.13214826462813015), + FRAC_CONST(0.13539134370043773), + FRAC_CONST(0.13863297284022669), + FRAC_CONST(0.14187311733225325), + FRAC_CONST(0.14511174247717309), + FRAC_CONST(0.14834881359191271), + FRAC_CONST(0.15158429601004111), + FRAC_CONST(0.15481815508214106), + FRAC_CONST(0.1580503561761798), + FRAC_CONST(0.16128086467788047), + FRAC_CONST(0.16450964599109233), + FRAC_CONST(0.16773666553816149), + FRAC_CONST(0.17096188876030122), + FRAC_CONST(0.17418528111796186), + FRAC_CONST(0.17740680809120093), + FRAC_CONST(0.18062643518005275), + FRAC_CONST(0.18384412790489776), + FRAC_CONST(0.18705985180683199), + FRAC_CONST(0.19027357244803589), + FRAC_CONST(0.19348525541214331), + FRAC_CONST(0.19669486630460997), + FRAC_CONST(0.19990237075308173), + FRAC_CONST(0.20310773440776286), + FRAC_CONST(0.20631092294178383), + FRAC_CONST(0.20951190205156878), + FRAC_CONST(0.21271063745720317), + FRAC_CONST(0.21590709490280058), + FRAC_CONST(0.2191012401568698), + FRAC_CONST(0.22229303901268133), + FRAC_CONST(0.22548245728863364), + FRAC_CONST(0.22866946082861941), + FRAC_CONST(0.23185401550239115), + FRAC_CONST(0.23503608720592667), + FRAC_CONST(0.23821564186179459), + FRAC_CONST(0.24139264541951888), + FRAC_CONST(0.24456706385594387), + FRAC_CONST(0.24773886317559846), + FRAC_CONST(0.25090800941106001), + FRAC_CONST(0.25407446862331851), + FRAC_CONST(0.25723820690213967), + FRAC_CONST(0.26039919036642817), + FRAC_CONST(0.26355738516459076), + FRAC_CONST(0.26671275747489837), + FRAC_CONST(0.2698652735058486), + FRAC_CONST(0.27301489949652735), + FRAC_CONST(0.27616160171697068), + FRAC_CONST(0.27930534646852595), + FRAC_CONST(0.28244610008421245), + FRAC_CONST(0.2855838289290823), + FRAC_CONST(0.28871849940058025), + FRAC_CONST(0.29185007792890405), + FRAC_CONST(0.29497853097736348), + FRAC_CONST(0.2981038250427398), + FRAC_CONST(0.30122592665564446), + FRAC_CONST(0.30434480238087736), + FRAC_CONST(0.30746041881778519), + FRAC_CONST(0.31057274260061901), + FRAC_CONST(0.31368174039889146), + FRAC_CONST(0.31678737891773395), + FRAC_CONST(0.31988962489825296), + FRAC_CONST(0.32298844511788638), + FRAC_CONST(0.32608380639075912), + FRAC_CONST(0.32917567556803889), + FRAC_CONST(0.33226401953829071), + FRAC_CONST(0.33534880522783189), + FRAC_CONST(0.33842999960108583), + FRAC_CONST(0.34150756966093632), + FRAC_CONST(0.34458148244908043), + FRAC_CONST(0.34765170504638188), + FRAC_CONST(0.35071820457322322), + FRAC_CONST(0.35378094818985806), + FRAC_CONST(0.35683990309676283), + FRAC_CONST(0.35989503653498811), + FRAC_CONST(0.36294631578650921), + FRAC_CONST(0.36599370817457672), + FRAC_CONST(0.36903718106406647), + FRAC_CONST(0.37207670186182878), + FRAC_CONST(0.37511223801703802), + FRAC_CONST(0.37814375702154046), + FRAC_CONST(0.38117122641020335), + FRAC_CONST(0.38419461376126157), + FRAC_CONST(0.38721388669666562), + FRAC_CONST(0.39022901288242801), + FRAC_CONST(0.39323996002896966), + FRAC_CONST(0.39624669589146555), + FRAC_CONST(0.39924918827019029), + FRAC_CONST(0.40224740501086254), + FRAC_CONST(0.40524131400498986), + FRAC_CONST(0.40823088319021217), + FRAC_CONST(0.41121608055064529), + FRAC_CONST(0.41419687411722372), + FRAC_CONST(0.41717323196804335), + FRAC_CONST(0.42014512222870243), + FRAC_CONST(0.42311251307264408), + FRAC_CONST(0.42607537272149631), + FRAC_CONST(0.4290336694454126), + FRAC_CONST(0.43198737156341183), + FRAC_CONST(0.43493644744371707), + FRAC_CONST(0.43788086550409511), + FRAC_CONST(0.44082059421219388), + FRAC_CONST(0.44375560208588088), + FRAC_CONST(0.44668585769357955), + FRAC_CONST(0.4496113296546066), + FRAC_CONST(0.45253198663950756), + FRAC_CONST(0.45544779737039259), + FRAC_CONST(0.45835873062127125), + FRAC_CONST(0.46126475521838717), + FRAC_CONST(0.46416584004055156), + FRAC_CONST(0.46706195401947659), + FRAC_CONST(0.46995306614010829), + FRAC_CONST(0.47283914544095862), + FRAC_CONST(0.47572016101443682), + FRAC_CONST(0.47859608200718085), + FRAC_CONST(0.4814668776203872), + FRAC_CONST(0.48433251711014125), + FRAC_CONST(0.4871929697877464), + FRAC_CONST(0.49004820502005247), + FRAC_CONST(0.49289819222978404), + FRAC_CONST(0.49574290089586776), + FRAC_CONST(0.49858230055375902), + FRAC_CONST(0.50141636079576901), + FRAC_CONST(0.50424505127138919), + FRAC_CONST(0.50706834168761705), + FRAC_CONST(0.50988620180928057), + FRAC_CONST(0.51269860145936175), + FRAC_CONST(0.51550551051931948), + FRAC_CONST(0.51830689892941317), + FRAC_CONST(0.5211027366890234), + FRAC_CONST(0.52389299385697385), + FRAC_CONST(0.52667764055185196), + FRAC_CONST(0.52945664695232897), + FRAC_CONST(0.53222998329747884), + FRAC_CONST(0.53499761988709726), + FRAC_CONST(0.53775952708201991), + FRAC_CONST(0.54051567530443978), + FRAC_CONST(0.54326603503822357), + FRAC_CONST(0.54601057682922816), + FRAC_CONST(0.54874927128561579), + FRAC_CONST(0.55148208907816942), + FRAC_CONST(0.55420900094060566), + FRAC_CONST(0.55692997766988939), + FRAC_CONST(0.559644990126546), + FRAC_CONST(0.56235400923497314), + FRAC_CONST(0.56505700598375252), + FRAC_CONST(0.56775395142596052), + FRAC_CONST(0.57044481667947822), + FRAC_CONST(0.57312957292730071), + FRAC_CONST(0.57580819141784534), + FRAC_CONST(0.57848064346525996), + FRAC_CONST(0.58114690044973039), + FRAC_CONST(0.58380693381778626), + FRAC_CONST(0.58646071508260733), + FRAC_CONST(0.58910821582432815), + FRAC_CONST(0.5917494076903429), + FRAC_CONST(0.5943842623956086), + FRAC_CONST(0.59701275172294799), + FRAC_CONST(0.59963484752335228), + FRAC_CONST(0.60225052171628191), + FRAC_CONST(0.60485974628996786), + FRAC_CONST(0.60746249330171098), + FRAC_CONST(0.61005873487818185), + FRAC_CONST(0.61264844321571899), + FRAC_CONST(0.61523159058062682), + FRAC_CONST(0.61780814930947225), + FRAC_CONST(0.62037809180938108), + FRAC_CONST(0.62294139055833397), + FRAC_CONST(0.6254980181054608), + FRAC_CONST(0.62804794707133416), + FRAC_CONST(0.63059115014826372), + FRAC_CONST(0.63312760010058777), + FRAC_CONST(0.63565726976496484), + FRAC_CONST(0.63818013205066515), + FRAC_CONST(0.64069615993986073), + FRAC_CONST(0.64320532648791406), + FRAC_CONST(0.64570760482366729), + FRAC_CONST(0.64820296814972966), + FRAC_CONST(0.65069138974276486), + FRAC_CONST(0.65317284295377676), + FRAC_CONST(0.65564730120839498), + FRAC_CONST(0.65811473800715958), + FRAC_CONST(0.660575126925805), + FRAC_CONST(0.66302844161554231), + FRAC_CONST(0.6654746558033422), + FRAC_CONST(0.66791374329221598), + FRAC_CONST(0.67034567796149647), + FRAC_CONST(0.67277043376711676), + FRAC_CONST(0.67518798474189046), + FRAC_CONST(0.67759830499578866), + FRAC_CONST(0.68000136871621808), + FRAC_CONST(0.68239715016829683), + FRAC_CONST(0.6847856236951303), + FRAC_CONST(0.68716676371808583), + FRAC_CONST(0.68954054473706683), + FRAC_CONST(0.69190694133078579), + FRAC_CONST(0.69426592815703603), + FRAC_CONST(0.69661747995296419), + FRAC_CONST(0.69896157153533944), + FRAC_CONST(0.70129817780082437), + FRAC_CONST(0.7036272737262429), + FRAC_CONST(0.70594883436884903), + FRAC_CONST(0.70826283486659336), + FRAC_CONST(0.71056925043838959), + FRAC_CONST(0.71286805638437978), + FRAC_CONST(0.71515922808619936), + FRAC_CONST(0.71744274100723993), + FRAC_CONST(0.71971857069291278), + FRAC_CONST(0.7219866927709101), + FRAC_CONST(0.72424708295146689), + FRAC_CONST(0.72649971702762028), + FRAC_CONST(0.72874457087546896), + FRAC_CONST(0.73098162045443171), + FRAC_CONST(0.73321084180750484), + FRAC_CONST(0.73543221106151868), + FRAC_CONST(0.73764570442739286), + FRAC_CONST(0.73985129820039208), + FRAC_CONST(0.74204896876037885), + FRAC_CONST(0.7442386925720671), + FRAC_CONST(0.74642044618527381), + FRAC_CONST(0.74859420623517081), + FRAC_CONST(0.75075994944253421), + FRAC_CONST(0.75291765261399446), + FRAC_CONST(0.75506729264228367), + FRAC_CONST(0.75720884650648446), + FRAC_CONST(0.75934229127227548), + FRAC_CONST(0.76146760409217706), + FRAC_CONST(0.76358476220579641), + FRAC_CONST(0.7656937429400712), + FRAC_CONST(0.76779452370951196), + FRAC_CONST(0.76988708201644451), + FRAC_CONST(0.77197139545125026), + FRAC_CONST(0.7740474416926072), + FRAC_CONST(0.77611519850772781), + FRAC_CONST(0.77817464375259782), + FRAC_CONST(0.78022575537221317), + FRAC_CONST(0.78226851140081632), + FRAC_CONST(0.78430288996213138), + FRAC_CONST(0.78632886926959822), + FRAC_CONST(0.78834642762660623), + FRAC_CONST(0.79035554342672631), + FRAC_CONST(0.79235619515394229), + FRAC_CONST(0.79434836138288134), + FRAC_CONST(0.79633202077904397), + FRAC_CONST(0.79830715209903147), + FRAC_CONST(0.8002737341907743), + FRAC_CONST(0.80223174599375802), + FRAC_CONST(0.80418116653924954), + FRAC_CONST(0.80612197495052085), + FRAC_CONST(0.80805415044307316), + FRAC_CONST(0.80997767232485907), + FRAC_CONST(0.81189251999650469), + FRAC_CONST(0.81379867295152986), + FRAC_CONST(0.81569611077656778), + FRAC_CONST(0.81758481315158371), + FRAC_CONST(0.81946475985009259), + FRAC_CONST(0.82133593073937561), + FRAC_CONST(0.82319830578069586), + FRAC_CONST(0.82505186502951278), + FRAC_CONST(0.82689658863569615), + FRAC_CONST(0.82873245684373809), + FRAC_CONST(0.83055944999296494), + FRAC_CONST(0.83237754851774781), + FRAC_CONST(0.83418673294771239), + FRAC_CONST(0.83598698390794668), + FRAC_CONST(0.83777828211920935), + FRAC_CONST(0.83956060839813562), + FRAC_CONST(0.84133394365744296), + FRAC_CONST(0.84309826890613537), + FRAC_CONST(0.84485356524970701), + FRAC_CONST(0.84659981389034411), + FRAC_CONST(0.84833699612712676), + FRAC_CONST(0.85006509335622882), + FRAC_CONST(0.8517840870711173), + FRAC_CONST(0.85349395886275037), + FRAC_CONST(0.85519469041977514), + FRAC_CONST(0.85688626352872277), + FRAC_CONST(0.85856866007420429), + FRAC_CONST(0.86024186203910447), + FRAC_CONST(0.86190585150477417), + FRAC_CONST(0.86356061065122347), + FRAC_CONST(0.86520612175731115), + FRAC_CONST(0.86684236720093533), + FRAC_CONST(0.86846932945922151), + FRAC_CONST(0.87008699110871135), + FRAC_CONST(0.87169533482554817), + FRAC_CONST(0.87329434338566281), + FRAC_CONST(0.87488399966495822), + FRAC_CONST(0.87646428663949283), + FRAC_CONST(0.87803518738566277), + FRAC_CONST(0.87959668508038291), + FRAC_CONST(0.88114876300126743), + FRAC_CONST(0.88269140452680916), + FRAC_CONST(0.8842245931365561), + FRAC_CONST(0.88574831241129048), + FRAC_CONST(0.88726254603320276), + FRAC_CONST(0.88876727778606746), + FRAC_CONST(0.89026249155541637), + FRAC_CONST(0.8917481713287112), + FRAC_CONST(0.89322430119551532), + FRAC_CONST(0.89469086534766362), + FRAC_CONST(0.89614784807943237), + FRAC_CONST(0.89759523378770689), + FRAC_CONST(0.89903300697214927), + FRAC_CONST(0.9004611522353636), + FRAC_CONST(0.90187965428306172), + FRAC_CONST(0.90328849792422594), + FRAC_CONST(0.90468766807127299), + FRAC_CONST(0.90607714974021469), + FRAC_CONST(0.90745692805081868), + FRAC_CONST(0.90882698822676755), + FRAC_CONST(0.91018731559581767), + FRAC_CONST(0.91153789558995579), + FRAC_CONST(0.91287871374555518), + FRAC_CONST(0.91420975570353069), + FRAC_CONST(0.9155310072094921), + FRAC_CONST(0.91684245411389753), + FRAC_CONST(0.91814408237220391), + FRAC_CONST(0.91943587804501858), + FRAC_CONST(0.92071782729824769), + FRAC_CONST(0.92198991640324446), + FRAC_CONST(0.92325213173695675), + FRAC_CONST(0.92450445978207241), + FRAC_CONST(0.92574688712716402), + FRAC_CONST(0.92697940046683291), + FRAC_CONST(0.92820198660185149), + FRAC_CONST(0.92941463243930444), + FRAC_CONST(0.93061732499272909), + FRAC_CONST(0.93181005138225426), + FRAC_CONST(0.93299279883473885), + FRAC_CONST(0.93416555468390772), + FRAC_CONST(0.93532830637048769), + FRAC_CONST(0.93648104144234268), + FRAC_CONST(0.93762374755460598), + FRAC_CONST(0.93875641246981323), + FRAC_CONST(0.93987902405803303), + FRAC_CONST(0.94099157029699743), + FRAC_CONST(0.94209403927222979), + FRAC_CONST(0.94318641917717327), + FRAC_CONST(0.9442686983133165), + FRAC_CONST(0.94534086509031956), + FRAC_CONST(0.9464029080261378), + FRAC_CONST(0.94745481574714419), + FRAC_CONST(0.94849657698825252), + FRAC_CONST(0.94952818059303667), + FRAC_CONST(0.95054961551385087), + FRAC_CONST(0.95156087081194762), + FRAC_CONST(0.95256193565759528), + FRAC_CONST(0.95355279933019343), + FRAC_CONST(0.9545334512183884), + FRAC_CONST(0.95550388082018611), + FRAC_CONST(0.95646407774306541), + FRAC_CONST(0.95741403170408834), + FRAC_CONST(0.95835373253001133), + FRAC_CONST(0.95928317015739362), + FRAC_CONST(0.96020233463270466), + FRAC_CONST(0.96111121611243155), + FRAC_CONST(0.96200980486318388), + FRAC_CONST(0.96289809126179782), + FRAC_CONST(0.96377606579543984), + FRAC_CONST(0.96464371906170809), + FRAC_CONST(0.96550104176873297), + FRAC_CONST(0.96634802473527726), + FRAC_CONST(0.96718465889083372), + FRAC_CONST(0.96801093527572268), + FRAC_CONST(0.96882684504118799), + FRAC_CONST(0.96963237944949143), + FRAC_CONST(0.97042752987400682), + FRAC_CONST(0.97121228779931179), + FRAC_CONST(0.97198664482127939), + FRAC_CONST(0.97275059264716823), + FRAC_CONST(0.97350412309571066), + FRAC_CONST(0.97424722809720088), + FRAC_CONST(0.97497989969358168), + FRAC_CONST(0.97570213003852857), + FRAC_CONST(0.97641391139753486), + FRAC_CONST(0.97711523614799412), + FRAC_CONST(0.97780609677928154), + FRAC_CONST(0.97848648589283505), + FRAC_CONST(0.97915639620223371), + FRAC_CONST(0.9798158205332762), + FRAC_CONST(0.98046475182405801), + FRAC_CONST(0.98110318312504607), + FRAC_CONST(0.98173110759915416), + FRAC_CONST(0.98234851852181571), + FRAC_CONST(0.98295540928105563), + FRAC_CONST(0.9835517733775615), + FRAC_CONST(0.98413760442475307), + FRAC_CONST(0.98471289614885038), + FRAC_CONST(0.98527764238894122), + FRAC_CONST(0.98583183709704714), + FRAC_CONST(0.98637547433818806), + FRAC_CONST(0.98690854829044583), + FRAC_CONST(0.98743105324502667), + FRAC_CONST(0.98794298360632238), + FRAC_CONST(0.98844433389196995), + FRAC_CONST(0.98893509873291074), + FRAC_CONST(0.98941527287344755), + FRAC_CONST(0.98988485117130098), + FRAC_CONST(0.99034382859766479), + FRAC_CONST(0.99079220023725967), + FRAC_CONST(0.99122996128838525), + FRAC_CONST(0.9916571070629725), + FRAC_CONST(0.99207363298663342), + FRAC_CONST(0.99247953459870997), + FRAC_CONST(0.99287480755232194), + FRAC_CONST(0.99325944761441354), + FRAC_CONST(0.99363345066579889), + FRAC_CONST(0.99399681270120555), + FRAC_CONST(0.99434952982931812), + FRAC_CONST(0.9946915982728195), + FRAC_CONST(0.99502301436843166), + FRAC_CONST(0.99534377456695422), + FRAC_CONST(0.9956538754333033), + FRAC_CONST(0.99595331364654771), + FRAC_CONST(0.99624208599994479), + FRAC_CONST(0.99652018940097464), + FRAC_CONST(0.99678762087137318), + FRAC_CONST(0.99704437754716424), + FRAC_CONST(0.99729045667869021), + FRAC_CONST(0.99752585563064111), + FRAC_CONST(0.99775057188208349), + FRAC_CONST(0.9979646030264866), + FRAC_CONST(0.99816794677174903), + FRAC_CONST(0.9983606009402225), + FRAC_CONST(0.99854256346873571), + FRAC_CONST(0.99871383240861611), + FRAC_CONST(0.99887440592571108), + FRAC_CONST(0.99902428230040718), + FRAC_CONST(0.99916345992764877), + FRAC_CONST(0.99929193731695531), + FRAC_CONST(0.99940971309243731), + FRAC_CONST(0.99951678599281069), + FRAC_CONST(0.99961315487141078), + FRAC_CONST(0.99969881869620425), + FRAC_CONST(0.99977377654980037), + FRAC_CONST(0.99983802762946083), + FRAC_CONST(0.99989157124710804), + FRAC_CONST(0.9999344068293331), + FRAC_CONST(0.99996653391740109), + FRAC_CONST(0.99998795216725689), + FRAC_CONST(0.99999866134952808) +}; +#endif + +ALIGN static const real_t ld_mid_512[] = +{ + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0.0061358846491544753), + FRAC_CONST(0.01840672990580482), + FRAC_CONST(0.030674803176636626), + FRAC_CONST(0.04293825693494082), + FRAC_CONST(0.055195244349689934), + FRAC_CONST(0.067443919563664051), + FRAC_CONST(0.079682437971430126), + FRAC_CONST(0.091908956497132724), + FRAC_CONST(0.10412163387205459), + FRAC_CONST(0.11631863091190475), + FRAC_CONST(0.12849811079379317), + FRAC_CONST(0.14065823933284921), + FRAC_CONST(0.15279718525844344), + FRAC_CONST(0.16491312048996989), + FRAC_CONST(0.17700422041214875), + FRAC_CONST(0.18906866414980619), + FRAC_CONST(0.2011046348420919), + FRAC_CONST(0.21311031991609136), + FRAC_CONST(0.22508391135979283), + FRAC_CONST(0.2370236059943672), + FRAC_CONST(0.24892760574572015), + FRAC_CONST(0.26079411791527551), + FRAC_CONST(0.27262135544994898), + FRAC_CONST(0.28440753721127188), + FRAC_CONST(0.29615088824362379), + FRAC_CONST(0.30784964004153487), + FRAC_CONST(0.31950203081601569), + FRAC_CONST(0.33110630575987643), + FRAC_CONST(0.34266071731199438), + FRAC_CONST(0.35416352542049034), + FRAC_CONST(0.36561299780477385), + FRAC_CONST(0.37700741021641826), + FRAC_CONST(0.38834504669882625), + FRAC_CONST(0.39962419984564679), + FRAC_CONST(0.41084317105790391), + FRAC_CONST(0.42200027079979968), + FRAC_CONST(0.43309381885315196), + FRAC_CONST(0.4441221445704292), + FRAC_CONST(0.45508358712634384), + FRAC_CONST(0.46597649576796618), + FRAC_CONST(0.47679923006332209), + FRAC_CONST(0.487550160148436), + FRAC_CONST(0.49822766697278187), + FRAC_CONST(0.50883014254310699), + FRAC_CONST(0.51935599016558964), + FRAC_CONST(0.52980362468629461), + FRAC_CONST(0.54017147272989285), + FRAC_CONST(0.55045797293660481), + FRAC_CONST(0.56066157619733603), + FRAC_CONST(0.57078074588696726), + FRAC_CONST(0.58081395809576453), + FRAC_CONST(0.59075970185887416), + FRAC_CONST(0.60061647938386897), + FRAC_CONST(0.61038280627630948), + FRAC_CONST(0.6200572117632891), + FRAC_CONST(0.62963823891492698), + FRAC_CONST(0.63912444486377573), + FRAC_CONST(0.64851440102211244), + FRAC_CONST(0.65780669329707864), + FRAC_CONST(0.66699992230363747), + FRAC_CONST(0.67609270357531592), + FRAC_CONST(0.68508366777270036), + FRAC_CONST(0.693971460889654), + FRAC_CONST(0.7027547444572253), + FRAC_CONST(0.71143219574521643), + FRAC_CONST(0.72000250796138165), + FRAC_CONST(0.7284643904482252), + FRAC_CONST(0.73681656887736979), + FRAC_CONST(0.74505778544146595), + FRAC_CONST(0.75318679904361241), + FRAC_CONST(0.76120238548426178), + FRAC_CONST(0.76910333764557959), + FRAC_CONST(0.77688846567323244), + FRAC_CONST(0.78455659715557524), + FRAC_CONST(0.79210657730021239), + FRAC_CONST(0.79953726910790501), + FRAC_CONST(0.80684755354379922), + FRAC_CONST(0.8140363297059483), + FRAC_CONST(0.82110251499110465), + FRAC_CONST(0.8280450452577558), + FRAC_CONST(0.83486287498638001), + FRAC_CONST(0.84155497743689833), + FRAC_CONST(0.84812034480329712), + FRAC_CONST(0.85455798836540053), + FRAC_CONST(0.86086693863776731), + FRAC_CONST(0.86704624551569265), + FRAC_CONST(0.87309497841829009), + FRAC_CONST(0.87901222642863341), + FRAC_CONST(0.88479709843093779), + FRAC_CONST(0.89044872324475788), + FRAC_CONST(0.89596624975618511), + FRAC_CONST(0.90134884704602203), + FRAC_CONST(0.90659570451491533), + FRAC_CONST(0.91170603200542988), + FRAC_CONST(0.9166790599210427), + FRAC_CONST(0.9215140393420419), + FRAC_CONST(0.92621024213831127), + FRAC_CONST(0.93076696107898371), + FRAC_CONST(0.9351835099389475), + FRAC_CONST(0.93945922360218992), + FRAC_CONST(0.94359345816196039), + FRAC_CONST(0.94758559101774109), + FRAC_CONST(0.95143502096900834), + FRAC_CONST(0.95514116830577067), + FRAC_CONST(0.9587034748958716), + FRAC_CONST(0.96212140426904158), + FRAC_CONST(0.9653944416976894), + FRAC_CONST(0.96852209427441727), + FRAC_CONST(0.97150389098625178), + FRAC_CONST(0.97433938278557586), + FRAC_CONST(0.97702814265775439), + FRAC_CONST(0.97956976568544052), + FRAC_CONST(0.98196386910955524), + FRAC_CONST(0.98421009238692903), + FRAC_CONST(0.98630809724459867), + FRAC_CONST(0.98825756773074946), + FRAC_CONST(0.99005821026229712), + FRAC_CONST(0.99170975366909953), + FRAC_CONST(0.9932119492347945), + FRAC_CONST(0.99456457073425542), + FRAC_CONST(0.99576741446765982), + FRAC_CONST(0.99682029929116567), + FRAC_CONST(0.99772306664419164), + FRAC_CONST(0.99847558057329477), + FRAC_CONST(0.99907772775264536), + FRAC_CONST(0.99952941750109314), + FRAC_CONST(0.9998305817958234), + FRAC_CONST(0.99998117528260111), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1) +}; + +#ifdef ALLOW_SMALL_FRAMELENGTH +ALIGN static const real_t ld_mid_480[] = +{ + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0), + FRAC_CONST(0.0065449379673518581), + FRAC_CONST(0.019633692460628301), + FRAC_CONST(0.032719082821776137), + FRAC_CONST(0.045798866936520771), + FRAC_CONST(0.058870803651189033), + FRAC_CONST(0.071932653156719387), + FRAC_CONST(0.084982177372441667), + FRAC_CONST(0.09801714032956059), + FRAC_CONST(0.11103530855427769), + FRAC_CONST(0.12403445145048532), + FRAC_CONST(0.13701234168196802), + FRAC_CONST(0.14996675555404498), + FRAC_CONST(0.16289547339458874), + FRAC_CONST(0.17579627993435451), + FRAC_CONST(0.18866696468655525), + FRAC_CONST(0.2015053223256171), + FRAC_CONST(0.21430915306505074), + FRAC_CONST(0.2270762630343732), + FRAC_CONST(0.23980446465501654), + FRAC_CONST(0.25249157701515795), + FRAC_CONST(0.26513542624340797), + FRAC_CONST(0.27773384588129219), + FRAC_CONST(0.29028467725446233), + FRAC_CONST(0.3027857698425746), + FRAC_CONST(0.31523498164776964), + FRAC_CONST(0.32763017956169349), + FRAC_CONST(0.33996923973099424), + FRAC_CONST(0.35225004792123354), + FRAC_CONST(0.36447049987914965), + FRAC_CONST(0.37662850169321077), + FRAC_CONST(0.38872197015239557), + FRAC_CONST(0.40074883310314097), + FRAC_CONST(0.41270702980439467), + FRAC_CONST(0.42459451128071307), + FRAC_CONST(0.43640924067334208), + FRAC_CONST(0.44814919358922256), + FRAC_CONST(0.45981235844785984), + FRAC_CONST(0.47139673682599764), + FRAC_CONST(0.48290034380003727), + FRAC_CONST(0.49432120828614462), + FRAC_CONST(0.50565737337798455), + FRAC_CONST(0.51690689668202761), + FRAC_CONST(0.52806785065036799), + FRAC_CONST(0.53913832291100017), + FRAC_CONST(0.55011641659549337), + FRAC_CONST(0.56100025066400983), + FRAC_CONST(0.57178796022761225), + FRAC_CONST(0.58247769686780215), + FRAC_CONST(0.59306762895323706), + FRAC_CONST(0.60355594195357143), + FRAC_CONST(0.61394083875036642), + FRAC_CONST(0.62422053994501758), + FRAC_CONST(0.63439328416364549), + FRAC_CONST(0.64445732835889735), + FRAC_CONST(0.65441094810861034), + FRAC_CONST(0.66425243791128175), + FRAC_CONST(0.67398011147829784), + FRAC_CONST(0.68359230202287125), + FRAC_CONST(0.69308736254563585), + FRAC_CONST(0.70246366611685174), + FRAC_CONST(0.71171960615517138), + FRAC_CONST(0.72085359670291882), + FRAC_CONST(0.7298640726978356), + FRAC_CONST(0.73874949024124625), + FRAC_CONST(0.74750832686259672), + FRAC_CONST(0.75613908178032285), + FRAC_CONST(0.76464027615900032), + FRAC_CONST(0.77301045336273699), + FRAC_CONST(0.78124817920475853), + FRAC_CONST(0.78935204219315003), + FRAC_CONST(0.79732065377270711), + FRAC_CONST(0.80515264856285829), + FRAC_CONST(0.81284668459161513), + FRAC_CONST(0.82040144352551359), + FRAC_CONST(0.82781563089550203), + FRAC_CONST(0.83508797631874299), + FRAC_CONST(0.84221723371628654), + FRAC_CONST(0.84920218152657889), + FRAC_CONST(0.85604162291477137), + FRAC_CONST(0.86273438597779184), + FRAC_CONST(0.86927932394514362), + FRAC_CONST(0.87567531537539967), + FRAC_CONST(0.88192126434835494), + FRAC_CONST(0.88801610065280734), + FRAC_CONST(0.89395877996993212), + FRAC_CONST(0.8997482840522214), + FRAC_CONST(0.90538362089795521), + FRAC_CONST(0.91086382492117568), + FRAC_CONST(0.91618795711713596), + FRAC_CONST(0.92135510522319242), + FRAC_CONST(0.9263643838751181), + FRAC_CONST(0.93121493475880346), + FRAC_CONST(0.93590592675732565), + FRAC_CONST(0.94043655609335486), + FRAC_CONST(0.94480604646687805), + FRAC_CONST(0.94901364918821385), + FRAC_CONST(0.95305864330629697), + FRAC_CONST(0.95694033573220882), + FRAC_CONST(0.9606580613579353), + FRAC_CONST(0.96421118317032928), + FRAC_CONST(0.96759909236025976), + FRAC_CONST(0.9708212084269281), + FRAC_CONST(0.97387697927733363), + FRAC_CONST(0.97676588132087239), + FRAC_CONST(0.97948741955905139), + FRAC_CONST(0.98204112767030394), + FRAC_CONST(0.98442656808989171), + FRAC_CONST(0.98664333208487898), + FRAC_CONST(0.98869103982416728), + FRAC_CONST(0.99056934044357725), + FRAC_CONST(0.99227791210596705), + FRAC_CONST(0.99381646205637808), + FRAC_CONST(0.99518472667219682), + FRAC_CONST(0.99638247150832537), + FRAC_CONST(0.99740949133735191), + FRAC_CONST(0.99826561018471593), + FRAC_CONST(0.99895068135886012), + FRAC_CONST(0.99946458747636568), + FRAC_CONST(0.99980724048206482), + FRAC_CONST(0.99997858166412923), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1), + FRAC_CONST(1) +}; +#endif +#endif + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/specrec.c b/src/contrib/aacdecoder/libfaad/specrec.c old mode 100644 new mode 100755 index 42112a7d4..011b80bd7 --- a/src/contrib/aacdecoder/libfaad/specrec.c +++ b/src/contrib/aacdecoder/libfaad/specrec.c @@ -1,1282 +1,1330 @@ -/* -** 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: specrec.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* - Spectral reconstruction: - - grouping/sectioning - - inverse quantization - - applying scalefactors -*/ - -#include "common.h" -#include "structs.h" - -#include -#include -#include "specrec.h" -#include "syntax.h" -#include "iq_table.h" -#include "ms.h" -#include "is.h" -#include "pns.h" -#include "tns.h" -#include "drc.h" -#include "lt_predict.h" -#include "ic_predict.h" -#ifdef SSR_DEC -#include "ssr.h" -#include "ssr_fb.h" -#endif - - -/* static function declarations */ -static void quant_to_spec(ic_stream *ics, real_t *spec_data, uint16_t frame_len); -static uint8_t inverse_quantization(real_t *x_invquant, const int16_t *x_quant, const uint16_t frame_len); - - -#ifdef LD_DEC -ALIGN static const uint8_t num_swb_512_window[] = -{ - 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0 -}; -ALIGN static const uint8_t num_swb_480_window[] = -{ - 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0 -}; -#endif - -ALIGN static const uint8_t num_swb_960_window[] = -{ - 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40 -}; - -ALIGN static const uint8_t num_swb_1024_window[] = -{ - 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 -}; - -ALIGN static const uint8_t num_swb_128_window[] = -{ - 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 -}; - -ALIGN static const uint16_t swb_offset_1024_96[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, - 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, - 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_96[] = -{ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_64[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, - 64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, - 304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, - 864, 904, 944, 984, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_64[] = -{ - 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_48[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, - 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, - 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, - 768, 800, 832, 864, 896, 928, 1024 -}; - -#ifdef LD_DEC -ALIGN static const uint16_t swb_offset_512_48[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, - 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, - 428, 460, 512 -}; - -ALIGN static const uint16_t swb_offset_480_48[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88, - 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400, - 432, 480 -}; -#endif - -ALIGN static const uint16_t swb_offset_128_48[] = -{ - 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_32[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, - 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, - 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, - 768, 800, 832, 864, 896, 928, 960, 992, 1024 -}; - -#ifdef LD_DEC -ALIGN static const uint16_t swb_offset_512_32[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, - 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, - 384, 416, 448, 480, 512 -}; - -ALIGN static const uint16_t swb_offset_480_32[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, - 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, - 384, 416, 448, 480 -}; -#endif - -ALIGN static const uint16_t swb_offset_1024_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, - 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, - 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, - 768, 832, 896, 960, 1024 -}; - -#ifdef LD_DEC -ALIGN static const uint16_t swb_offset_512_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, - 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, - 448, 480, 512 -}; - -ALIGN static const uint16_t swb_offset_480_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, - 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 -}; -#endif - -ALIGN static const uint16_t swb_offset_128_24[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_16[] = -{ - 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, - 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, - 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_16[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 -}; - -ALIGN static const uint16_t swb_offset_1024_8[] = -{ - 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, - 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, - 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 -}; - -ALIGN static const uint16_t swb_offset_128_8[] = -{ - 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 -}; - -ALIGN static const uint16_t *swb_offset_1024_window[] = -{ - swb_offset_1024_96, /* 96000 */ - swb_offset_1024_96, /* 88200 */ - swb_offset_1024_64, /* 64000 */ - swb_offset_1024_48, /* 48000 */ - swb_offset_1024_48, /* 44100 */ - swb_offset_1024_32, /* 32000 */ - swb_offset_1024_24, /* 24000 */ - swb_offset_1024_24, /* 22050 */ - swb_offset_1024_16, /* 16000 */ - swb_offset_1024_16, /* 12000 */ - swb_offset_1024_16, /* 11025 */ - swb_offset_1024_8 /* 8000 */ -}; - -#ifdef LD_DEC -ALIGN static const uint16_t *swb_offset_512_window[] = -{ - 0, /* 96000 */ - 0, /* 88200 */ - 0, /* 64000 */ - swb_offset_512_48, /* 48000 */ - swb_offset_512_48, /* 44100 */ - swb_offset_512_32, /* 32000 */ - swb_offset_512_24, /* 24000 */ - swb_offset_512_24, /* 22050 */ - 0, /* 16000 */ - 0, /* 12000 */ - 0, /* 11025 */ - 0 /* 8000 */ -}; - -ALIGN static const uint16_t *swb_offset_480_window[] = -{ - 0, /* 96000 */ - 0, /* 88200 */ - 0, /* 64000 */ - swb_offset_480_48, /* 48000 */ - swb_offset_480_48, /* 44100 */ - swb_offset_480_32, /* 32000 */ - swb_offset_480_24, /* 24000 */ - swb_offset_480_24, /* 22050 */ - 0, /* 16000 */ - 0, /* 12000 */ - 0, /* 11025 */ - 0 /* 8000 */ -}; -#endif - -ALIGN static const uint16_t *swb_offset_128_window[] = -{ - swb_offset_128_96, /* 96000 */ - swb_offset_128_96, /* 88200 */ - swb_offset_128_64, /* 64000 */ - swb_offset_128_48, /* 48000 */ - swb_offset_128_48, /* 44100 */ - swb_offset_128_48, /* 32000 */ - swb_offset_128_24, /* 24000 */ - swb_offset_128_24, /* 22050 */ - swb_offset_128_16, /* 16000 */ - swb_offset_128_16, /* 12000 */ - swb_offset_128_16, /* 11025 */ - swb_offset_128_8 /* 8000 */ -}; - -#define bit_set(A, B) ((A) & (1<<(B))) - -/* 4.5.2.3.4 */ -/* - - determine the number of windows in a window_sequence named num_windows - - determine the number of window_groups named num_window_groups - - determine the number of windows in each group named window_group_length[g] - - determine the total number of scalefactor window bands named num_swb for - the actual window type - - determine swb_offset[swb], the offset of the first coefficient in - scalefactor window band named swb of the window actually used - - determine sect_sfb_offset[g][section],the offset of the first coefficient - in section named section. This offset depends on window_sequence and - scale_factor_grouping and is needed to decode the spectral_data(). -*/ -uint8_t window_grouping_info(faacDecHandle hDecoder, ic_stream *ics) -{ - uint8_t i, g; - - uint8_t sf_index = hDecoder->sf_index; - - switch (ics->window_sequence) { - case ONLY_LONG_SEQUENCE: - case LONG_START_SEQUENCE: - case LONG_STOP_SEQUENCE: - ics->num_windows = 1; - ics->num_window_groups = 1; - ics->window_group_length[ics->num_window_groups-1] = 1; -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (hDecoder->frameLength == 512) - ics->num_swb = num_swb_512_window[sf_index]; - else /* if (hDecoder->frameLength == 480) */ - ics->num_swb = num_swb_480_window[sf_index]; - } else { -#endif - if (hDecoder->frameLength == 1024) - ics->num_swb = num_swb_1024_window[sf_index]; - else /* if (hDecoder->frameLength == 960) */ - ics->num_swb = num_swb_960_window[sf_index]; -#ifdef LD_DEC - } -#endif - - /* preparation of sect_sfb_offset for long blocks */ - /* also copy the last value! */ -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (hDecoder->frameLength == 512) - { - for (i = 0; i < ics->num_swb; i++) - { - ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; - ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; - } - } else /* if (hDecoder->frameLength == 480) */ { - for (i = 0; i < ics->num_swb; i++) - { - ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; - ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; - } - } - ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; - ics->swb_offset[ics->num_swb] = hDecoder->frameLength; - } else { -#endif - for (i = 0; i < ics->num_swb; i++) - { - ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; - ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; - } - ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; - ics->swb_offset[ics->num_swb] = hDecoder->frameLength; -#ifdef LD_DEC - } -#endif - return 0; - case EIGHT_SHORT_SEQUENCE: - ics->num_windows = 8; - ics->num_window_groups = 1; - ics->window_group_length[ics->num_window_groups-1] = 1; - ics->num_swb = num_swb_128_window[sf_index]; - - for (i = 0; i < ics->num_swb; i++) - ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; - ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; - - for (i = 0; i < ics->num_windows-1; i++) { - if (bit_set(ics->scale_factor_grouping, 6-i) == 0) - { - ics->num_window_groups += 1; - ics->window_group_length[ics->num_window_groups-1] = 1; - } else { - ics->window_group_length[ics->num_window_groups-1] += 1; - } - } - - /* preparation of sect_sfb_offset for short blocks */ - for (g = 0; g < ics->num_window_groups; g++) - { - uint16_t width; - uint8_t sect_sfb = 0; - uint16_t offset = 0; - - for (i = 0; i < ics->num_swb; i++) - { - if (i+1 == ics->num_swb) - { - width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; - } else { - width = swb_offset_128_window[sf_index][i+1] - - swb_offset_128_window[sf_index][i]; - } - width *= ics->window_group_length[g]; - ics->sect_sfb_offset[g][sect_sfb++] = offset; - offset += width; - } - ics->sect_sfb_offset[g][sect_sfb] = offset; - } - return 0; - default: - return 1; - } -} - -/* - For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, - window_group_length[0] = 1) the spectral data is in ascending spectral - order. - For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the - grouping in the following manner: - - Groups are ordered sequentially - - Within a group, a scalefactor band consists of the spectral data of all - grouped SHORT_WINDOWs for the associated scalefactor window band. To - clarify via example, the length of a group is in the range of one to eight - SHORT_WINDOWs. - - If there are eight groups each with length one (num_window_groups = 8, - window_group_length[0..7] = 1), the result is a sequence of eight spectra, - each in ascending spectral order. - - If there is only one group with length eight (num_window_groups = 1, - window_group_length[0] = 8), the result is that spectral data of all eight - SHORT_WINDOWs is interleaved by scalefactor window bands. - - Within a scalefactor window band, the coefficients are in ascending - spectral order. -*/ -static void quant_to_spec(ic_stream *ics, real_t *spec_data, uint16_t frame_len) -{ - uint8_t g, sfb, win; - uint16_t width, bin, k, gindex; - - ALIGN real_t tmp_spec[1024] = {0}; - - k = 0; - gindex = 0; - - for (g = 0; g < ics->num_window_groups; g++) - { - uint16_t j = 0; - uint16_t gincrease = 0; - uint16_t win_inc = ics->swb_offset[ics->num_swb]; - - for (sfb = 0; sfb < ics->num_swb; sfb++) - { - width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; - - for (win = 0; win < ics->window_group_length[g]; win++) - { - for (bin = 0; bin < width; bin += 4) - { - tmp_spec[gindex+(win*win_inc)+j+bin+0] = spec_data[k+0]; - tmp_spec[gindex+(win*win_inc)+j+bin+1] = spec_data[k+1]; - tmp_spec[gindex+(win*win_inc)+j+bin+2] = spec_data[k+2]; - tmp_spec[gindex+(win*win_inc)+j+bin+3] = spec_data[k+3]; - gincrease += 4; - k += 4; - } - } - j += width; - } - gindex += gincrease; - } - - memcpy(spec_data, tmp_spec, frame_len*sizeof(real_t)); -} - -static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) -{ -#ifdef FIXED_POINT - static const real_t errcorr[] = { - REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), - REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), - REAL_CONST(0) - }; - real_t x1, x2; - int16_t sgn = 1; - - if (q < 0) - { - q = -q; - sgn = -1; - } - - if (q < IQ_TABLE_SIZE) - return sgn * tab[q]; - - /* linear interpolation */ - x1 = tab[q>>3]; - x2 = tab[(q>>3) + 1]; - return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); -#else - if (q < 0) - { - /* tab contains a value for all possible q [0,8192] */ - if (-q < IQ_TABLE_SIZE) - return -tab[-q]; - - *error = 17; - return 0; - } else { - /* tab contains a value for all possible q [0,8192] */ - if (q < IQ_TABLE_SIZE) - return tab[q]; - - *error = 17; - return 0; - } -#endif -} - -static uint8_t inverse_quantization(real_t *x_invquant, const int16_t *x_quant, const uint16_t frame_len) -{ - int16_t i; - uint8_t error = 0; /* Init error flag */ - const real_t *tab = iq_table; - - for (i = 0; i < frame_len; i+=4) - { - x_invquant[i] = iquant(x_quant[i], tab, &error); - x_invquant[i+1] = iquant(x_quant[i+1], tab, &error); - x_invquant[i+2] = iquant(x_quant[i+2], tab, &error); - x_invquant[i+3] = iquant(x_quant[i+3], tab, &error); - } - - return error; -} - -#ifndef FIXED_POINT -ALIGN static const real_t pow2sf_tab[] = { - 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, - 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, - 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, - 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, - 0.0001220703125, 0.000244140625, 0.00048828125, - 0.0009765625, 0.001953125, 0.00390625, - 0.0078125, 0.015625, 0.03125, - 0.0625, 0.125, 0.25, - 0.5, 1.0, 2.0, - 4.0, 8.0, 16.0, 32.0, - 64.0, 128.0, 256.0, - 512.0, 1024.0, 2048.0, - 4096.0, 8192.0, 16384.0, - 32768.0, 65536.0, 131072.0, - 262144.0, 524288.0, 1048576.0, - 2097152.0, 4194304.0, 8388608.0, - 16777216.0, 33554432.0, 67108864.0, - 134217728.0, 268435456.0, 536870912.0, - 1073741824.0, 2147483648.0, 4294967296.0, - 8589934592.0, 17179869184.0, 34359738368.0, - 68719476736.0, 137438953472.0, 274877906944.0 -}; -#endif - -ALIGN static real_t pow2_table[] = -{ -#if 0 - COEF_CONST(0.59460355750136053335874998528024), /* 2^-0.75 */ - COEF_CONST(0.70710678118654752440084436210485), /* 2^-0.5 */ - COEF_CONST(0.84089641525371454303112547623321), /* 2^-0.25 */ -#endif - COEF_CONST(1.0), - COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ - COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ - COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ -}; - -void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics, - real_t *x_invquant, uint16_t frame_len) -{ - uint8_t g, sfb; - uint16_t top; - int32_t exp, frac; - uint8_t groups = 0; - uint16_t nshort = frame_len/8; - - for (g = 0; g < ics->num_window_groups; g++) - { - uint16_t k = 0; - - /* using this nshort*groups doesn't hurt long blocks, because - long blocks only have 1 group, so that means 'groups' is - always 0 for long blocks - */ - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - top = ics->sect_sfb_offset[g][sfb+1]; - - /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */ - /* just ignore them */ - if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255) - { - exp = 0; - frac = 0; - } else { - /* ics->scale_factors[g][sfb] must be between 0 and 255 */ - exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2; - frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3; - } - -#ifdef FIXED_POINT - exp -= 25; - /* IMDCT pre-scaling */ - if (hDecoder->object_type == LD) - { - exp -= 6 /*9*/; - } else { - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - exp -= 4 /*7*/; - else - exp -= 7 /*10*/; - } -#endif - - /* minimum size of a sf band is 4 and always a multiple of 4 */ - for ( ; k < top; k += 4) - { -#ifdef FIXED_POINT - if (exp < 0) - { - x_invquant[k+(groups*nshort)] >>= -exp; - x_invquant[k+(groups*nshort)+1] >>= -exp; - x_invquant[k+(groups*nshort)+2] >>= -exp; - x_invquant[k+(groups*nshort)+3] >>= -exp; - } else { - x_invquant[k+(groups*nshort)] <<= exp; - x_invquant[k+(groups*nshort)+1] <<= exp; - x_invquant[k+(groups*nshort)+2] <<= exp; - x_invquant[k+(groups*nshort)+3] <<= exp; - } -#else - x_invquant[k+(groups*nshort)] = x_invquant[k+(groups*nshort)] * pow2sf_tab[exp/*+25*/]; - x_invquant[k+(groups*nshort)+1] = x_invquant[k+(groups*nshort)+1] * pow2sf_tab[exp/*+25*/]; - x_invquant[k+(groups*nshort)+2] = x_invquant[k+(groups*nshort)+2] * pow2sf_tab[exp/*+25*/]; - x_invquant[k+(groups*nshort)+3] = x_invquant[k+(groups*nshort)+3] * pow2sf_tab[exp/*+25*/]; -#endif - - x_invquant[k+(groups*nshort)] = MUL_C(x_invquant[k+(groups*nshort)],pow2_table[frac /* + 3*/]); - x_invquant[k+(groups*nshort)+1] = MUL_C(x_invquant[k+(groups*nshort)+1],pow2_table[frac /* + 3*/]); - x_invquant[k+(groups*nshort)+2] = MUL_C(x_invquant[k+(groups*nshort)+2],pow2_table[frac /* + 3*/]); - x_invquant[k+(groups*nshort)+3] = MUL_C(x_invquant[k+(groups*nshort)+3],pow2_table[frac /* + 3*/]); - } - } - groups += ics->window_group_length[g]; - } -} - -#ifdef USE_SSE -void apply_scalefactors_sse(faacDecHandle hDecoder, ic_stream *ics, - real_t *x_invquant, uint16_t frame_len) -{ - uint8_t g, sfb; - uint16_t top; - int32_t exp, frac; - uint8_t groups = 0; - uint16_t nshort = frame_len/8; - - for (g = 0; g < ics->num_window_groups; g++) - { - uint16_t k = 0; - - /* using this nshort*groups doesn't hurt long blocks, because - long blocks only have 1 group, so that means 'groups' is - always 0 for long blocks - */ - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - top = ics->sect_sfb_offset[g][sfb+1]; - - exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2; - frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3; - - /* minimum size of a sf band is 4 and always a multiple of 4 */ - for ( ; k < top; k += 4) - { - __m128 m1 = _mm_load_ps(&x_invquant[k+(groups*nshort)]); - __m128 m2 = _mm_load_ps1(&pow2sf_tab[exp /*+25*/]); - __m128 m3 = _mm_load_ps1(&pow2_table[frac /* + 3*/]); - __m128 m4 = _mm_mul_ps(m1, m2); - __m128 m5 = _mm_mul_ps(m3, m4); - _mm_store_ps(&x_invquant[k+(groups*nshort)], m5); - } - } - groups += ics->window_group_length[g]; - } -} -#endif - -static uint8_t allocate_single_channel(faacDecHandle hDecoder, uint8_t channel, - uint8_t output_channels) -{ - uint8_t mul = 1; - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* allocate the state only when needed */ - if (hDecoder->pred_stat[channel] == NULL) - { - hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); - reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); - } - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - /* allocate the state only when needed */ - if (hDecoder->lt_pred_stat[channel] == NULL) - { - hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); - memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } - } -#endif - - if (hDecoder->time_out[channel] == NULL) - { - mul = 1; -#ifdef SBR_DEC - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - { - /* SBR requires 2 times as much output data */ - mul = 2; - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; - } -#endif - hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } -#if (defined(PS_DEC) || defined(DRM_PS)) - if (output_channels == 2) - { - if (hDecoder->time_out[channel+1] == NULL) - { - hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } - } -#endif - - if (hDecoder->fb_intermed[channel] == NULL) - { - hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); - } - -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - { - if (hDecoder->ssr_overlap[channel] == NULL) - { - hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->prev_fmd[channel] == NULL) - { - uint16_t k; - hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - for (k = 0; k < 2*hDecoder->frameLength; k++) - hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); - } - } -#endif - - return 0; -} - -static uint8_t allocate_channel_pair(faacDecHandle hDecoder, - uint8_t channel, uint8_t paired_channel) -{ - uint8_t mul = 1; - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* allocate the state only when needed */ - if (hDecoder->pred_stat[channel] == NULL) - { - hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); - reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); - } - if (hDecoder->pred_stat[paired_channel] == NULL) - { - hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); - reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); - } - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - /* allocate the state only when needed */ - if (hDecoder->lt_pred_stat[channel] == NULL) - { - hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); - memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } - if (hDecoder->lt_pred_stat[paired_channel] == NULL) - { - hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); - memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); - } - } -#endif - - if (hDecoder->time_out[channel] == NULL) - { - mul = 1; -#ifdef SBR_DEC - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; - if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - { - /* SBR requires 2 times as much output data */ - mul = 2; - hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; - } -#endif - hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->time_out[paired_channel] == NULL) - { - hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); - } - - if (hDecoder->fb_intermed[channel] == NULL) - { - hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->fb_intermed[paired_channel] == NULL) - { - hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); - } - -#ifdef SSR_DEC - if (hDecoder->object_type == SSR) - { - if (hDecoder->ssr_overlap[cpe->channel] == NULL) - { - hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) - { - hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); - } - if (hDecoder->prev_fmd[cpe->channel] == NULL) - { - uint16_t k; - hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - for (k = 0; k < 2*hDecoder->frameLength; k++) - hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); - } - if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) - { - uint16_t k; - hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); - for (k = 0; k < 2*hDecoder->frameLength; k++) - hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); - } - } -#endif - - return 0; -} - -uint8_t reconstruct_single_channel(faacDecHandle hDecoder, ic_stream *ics, - element *sce, int16_t *spec_data) -{ - uint8_t retval, output_channels; - ALIGN real_t spec_coef[1024]; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - - /* determine whether some mono->stereo tool is used */ -#if (defined(PS_DEC) || defined(DRM_PS)) - output_channels = hDecoder->ps_used[hDecoder->fr_ch_ele] ? 2 : 1; -#else - output_channels = 1; -#endif - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) - { - /* element_output_channels not set yet */ - hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; - } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { - /* element inconsistency */ - return 21; - } - - - if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) - { - retval = allocate_single_channel(hDecoder, sce->channel, output_channels); - if (retval > 0) - return retval; - - hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; - } - - - /* inverse quantization */ - retval = inverse_quantization(spec_coef, spec_data, hDecoder->frameLength); - if (retval > 0) - return retval; - - /* apply scalefactors */ -#ifndef USE_SSE - apply_scalefactors(hDecoder, ics, spec_coef, hDecoder->frameLength); -#else - hDecoder->apply_sf_func(hDecoder, ics, spec_coef, hDecoder->frameLength); -#endif - - /* deinterleave short block grouping */ - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - quant_to_spec(ics, spec_coef, hDecoder->frameLength); - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->requant_cycles += count; -#endif - - - /* pns decoding */ - pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type); - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* intra channel prediction */ - ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, - hDecoder->sf_index); - - /* In addition, for scalefactor bands coded by perceptual - noise substitution the predictors belonging to the - corresponding spectral coefficients are reset. - */ - pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (ics->ltp.data_present) - { - if (ics->ltp.lag_update) - hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; - } - ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; - } -#endif - - /* long term prediction */ - lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, - ics->window_shape, hDecoder->window_shape_prev[sce->channel], - hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); - } -#endif - - /* tns decoding */ - tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, - spec_coef, hDecoder->frameLength); - - /* drc decoding */ - if (hDecoder->drc->present) - { - if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) - drc_decode(hDecoder->drc, spec_coef); - } - - - /* filter bank */ -#ifdef SSR_DEC - if (hDecoder->object_type != SSR) - { -#endif -#ifdef USE_SSE - hDecoder->fb->if_func(hDecoder->fb, ics->window_sequence, ics->window_shape, - hDecoder->window_shape_prev[sce->channel], spec_coef, - hDecoder->time_out[sce->channel], hDecoder->object_type, hDecoder->frameLength); -#else - ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, - hDecoder->window_shape_prev[sce->channel], spec_coef, - hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], - hDecoder->object_type, hDecoder->frameLength); -#endif -#ifdef SSR_DEC - } else { - ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, - hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], - hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], - hDecoder->frameLength); - } -#endif - - /* save window shape for next frame */ - hDecoder->window_shape_prev[sce->channel] = ics->window_shape; - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], - hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); - } -#endif - -#ifdef SBR_DEC - if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - uint8_t ele = hDecoder->fr_ch_ele; - uint8_t ch = sce->channel; - - /* following case can happen when forceUpSampling == 1 */ - if (hDecoder->sbr[ele] == NULL) - { - hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, - sce->ele_id, 2*get_sample_rate(hDecoder->sf_index) -#ifdef DRM - , 0 -#endif - ); - } - - /* check if any of the PS tools is used */ -#if (defined(PS_DEC) || defined(DRM_PS)) - if (output_channels == 1) - { -#endif - retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], - hDecoder->postSeekResetFlag, hDecoder->forceUpSampling); -#if (defined(PS_DEC) || defined(DRM_PS)) - } else { - retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], - hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, - hDecoder->forceUpSampling); - } -#endif - if (retval > 0) - return retval; - } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - return 23; - } -#endif - - return 0; -} - -uint8_t reconstruct_channel_pair(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - element *cpe, int16_t *spec_data1, int16_t *spec_data2) -{ - uint8_t retval; - ALIGN real_t spec_coef1[1024]; - ALIGN real_t spec_coef2[1024]; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) - { - retval = allocate_channel_pair(hDecoder, cpe->channel, cpe->paired_channel); - if (retval > 0) - return retval; - - hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; - } - - /* inverse quantization */ - retval = inverse_quantization(spec_coef1, spec_data1, hDecoder->frameLength); - if (retval > 0) - return retval; - - retval = inverse_quantization(spec_coef2, spec_data2, hDecoder->frameLength); - if (retval > 0) - return retval; - - /* apply scalefactors */ -#ifndef USE_SSE - apply_scalefactors(hDecoder, ics1, spec_coef1, hDecoder->frameLength); - apply_scalefactors(hDecoder, ics2, spec_coef2, hDecoder->frameLength); -#else - hDecoder->apply_sf_func(hDecoder, ics1, spec_coef1, hDecoder->frameLength); - hDecoder->apply_sf_func(hDecoder, ics2, spec_coef2, hDecoder->frameLength); -#endif - - /* deinterleave short block grouping */ - if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) - quant_to_spec(ics1, spec_coef1, hDecoder->frameLength); - if (ics2->window_sequence == EIGHT_SHORT_SEQUENCE) - quant_to_spec(ics2, spec_coef2, hDecoder->frameLength); - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->requant_cycles += count; -#endif - - - /* pns decoding */ - if (ics1->ms_mask_present) - { - pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type); - } else { - pns_decode(ics1, NULL, spec_coef1, NULL, hDecoder->frameLength, 0, hDecoder->object_type); - pns_decode(ics2, NULL, spec_coef2, NULL, hDecoder->frameLength, 0, hDecoder->object_type); - } - - /* mid/side decoding */ - ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); - - /* intensity stereo decoding */ - is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); - -#ifdef MAIN_DEC - /* MAIN object type prediction */ - if (hDecoder->object_type == MAIN) - { - /* intra channel prediction */ - ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, - hDecoder->sf_index); - ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, - hDecoder->sf_index); - - /* In addition, for scalefactor bands coded by perceptual - noise substitution the predictors belonging to the - corresponding spectral coefficients are reset. - */ - pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); - pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); - } -#endif - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - ltp_info *ltp1 = &(ics1->ltp); - ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - if (ltp1->data_present) - { - if (ltp1->lag_update) - hDecoder->ltp_lag[cpe->channel] = ltp1->lag; - } - ltp1->lag = hDecoder->ltp_lag[cpe->channel]; - if (ltp2->data_present) - { - if (ltp2->lag_update) - hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; - } - ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; - } -#endif - - /* long term prediction */ - lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, - ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], - hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); - lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, - ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], - hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); - } -#endif - - /* tns decoding */ - tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, - spec_coef1, hDecoder->frameLength); - tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, - spec_coef2, hDecoder->frameLength); - - /* drc decoding */ - if (hDecoder->drc->present) - { - if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) - drc_decode(hDecoder->drc, spec_coef1); - if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) - drc_decode(hDecoder->drc, spec_coef2); - } - - /* filter bank */ -#ifdef SSR_DEC - if (hDecoder->object_type != SSR) - { -#endif -#ifdef USE_SSE - hDecoder->fb->if_func(hDecoder->fb, ics1->window_sequence, ics1->window_shape, - hDecoder->window_shape_prev[cpe->channel], spec_coef1, - hDecoder->time_out[cpe->channel], hDecoder->object_type, hDecoder->frameLength); - hDecoder->fb->if_func(hDecoder->fb, ics2->window_sequence, ics2->window_shape, - hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, - hDecoder->time_out[cpe->paired_channel], hDecoder->object_type, hDecoder->frameLength); -#else - ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, - hDecoder->window_shape_prev[cpe->channel], spec_coef1, - hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], - hDecoder->object_type, hDecoder->frameLength); - ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, - hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, - hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], - hDecoder->object_type, hDecoder->frameLength); -#endif -#ifdef SSR_DEC - } else { - ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, - hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], - hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], - hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); - ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, - hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], - hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], - hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); - } -#endif - - /* save window shape for next frame */ - hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; - hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; - -#ifdef LTP_DEC - if (is_ltp_ot(hDecoder->object_type)) - { - lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], - hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); - lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], - hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); - } -#endif - -#ifdef SBR_DEC - if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - uint8_t ele = hDecoder->fr_ch_ele; - uint8_t ch0 = cpe->channel; - uint8_t ch1 = cpe->paired_channel; - - /* following case can happen when forceUpSampling == 1 */ - if (hDecoder->sbr[ele] == NULL) - { - hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, - cpe->ele_id, 2*get_sample_rate(hDecoder->sf_index) -#ifdef DRM - , 0 -#endif - ); - } - - retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], - hDecoder->time_out[ch0], hDecoder->time_out[ch1], - hDecoder->postSeekResetFlag, hDecoder->forceUpSampling); - if (retval > 0) - return retval; - } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) - && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) - { - return 23; - } -#endif - - return 0; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: specrec.c,v 1.62 2009/01/26 23:51:15 menno Exp $ +**/ + +/* + Spectral reconstruction: + - grouping/sectioning + - inverse quantization + - applying scalefactors +*/ + +#include "common.h" +#include "structs.h" + +#include +#include +#include "specrec.h" +#include "filtbank.h" +#include "syntax.h" +#include "iq_table.h" +#include "ms.h" +#include "is.h" +#include "pns.h" +#include "tns.h" +#include "drc.h" +#include "lt_predict.h" +#include "ic_predict.h" +#ifdef SSR_DEC +#include "ssr.h" +#include "ssr_fb.h" +#endif + + +/* static function declarations */ +static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, + ic_stream *ics, int16_t *quant_data, + real_t *spec_data, uint16_t frame_len); + + +#ifdef LD_DEC +ALIGN static const uint8_t num_swb_512_window[] = +{ + 0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0 +}; +ALIGN static const uint8_t num_swb_480_window[] = +{ + 0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0 +}; +#endif + +ALIGN static const uint8_t num_swb_960_window[] = +{ + 40, 40, 45, 49, 49, 49, 46, 46, 42, 42, 42, 40 +}; + +ALIGN static const uint8_t num_swb_1024_window[] = +{ + 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40 +}; + +ALIGN static const uint8_t num_swb_128_window[] = +{ + 12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15 +}; + +ALIGN static const uint16_t swb_offset_1024_96[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, + 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, + 276, 320, 384, 448, 512, 576, 640, 704, 768, 832, 896, 960, 1024 +}; + +ALIGN static const uint16_t swb_offset_128_96[] = +{ + 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 +}; + +ALIGN static const uint16_t swb_offset_1024_64[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, + 64, 72, 80, 88, 100, 112, 124, 140, 156, 172, 192, 216, 240, 268, + 304, 344, 384, 424, 464, 504, 544, 584, 624, 664, 704, 744, 784, 824, + 864, 904, 944, 984, 1024 +}; + +ALIGN static const uint16_t swb_offset_128_64[] = +{ + 0, 4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 92, 128 +}; + +ALIGN static const uint16_t swb_offset_1024_48[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, + 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, + 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, + 768, 800, 832, 864, 896, 928, 1024 +}; + +#ifdef LD_DEC +ALIGN static const uint16_t swb_offset_512_48[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 68, 76, 84, + 92, 100, 112, 124, 136, 148, 164, 184, 208, 236, 268, 300, 332, 364, 396, + 428, 460, 512 +}; + +ALIGN static const uint16_t swb_offset_480_48[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72 ,80 ,88, + 96, 108, 120, 132, 144, 156, 172, 188, 212, 240, 272, 304, 336, 368, 400, + 432, 480 +}; +#endif + +ALIGN static const uint16_t swb_offset_128_48[] = +{ + 0, 4, 8, 12, 16, 20, 28, 36, 44, 56, 68, 80, 96, 112, 128 +}; + +ALIGN static const uint16_t swb_offset_1024_32[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, + 80, 88, 96, 108, 120, 132, 144, 160, 176, 196, 216, 240, 264, 292, + 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, 672, 704, 736, + 768, 800, 832, 864, 896, 928, 960, 992, 1024 +}; + +#ifdef LD_DEC +ALIGN static const uint16_t swb_offset_512_32[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 64, 72, 80, + 88, 96, 108, 120, 132, 144, 160, 176, 192, 212, 236, 260, 288, 320, 352, + 384, 416, 448, 480, 512 +}; + +ALIGN static const uint16_t swb_offset_480_32[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 72, 80, + 88, 96, 104, 112, 124, 136, 148, 164, 180, 200, 224, 256, 288, 320, 352, + 384, 416, 448, 480 +}; +#endif + +ALIGN static const uint16_t swb_offset_1024_24[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, + 76, 84, 92, 100, 108, 116, 124, 136, 148, 160, 172, 188, 204, 220, + 240, 260, 284, 308, 336, 364, 396, 432, 468, 508, 552, 600, 652, 704, + 768, 832, 896, 960, 1024 +}; + +#ifdef LD_DEC +ALIGN static const uint16_t swb_offset_512_24[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, + 80, 92, 104, 120, 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, + 448, 480, 512 +}; + +ALIGN static const uint16_t swb_offset_480_24[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 52, 60, 68, 80, 92, 104, 120, + 140, 164, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480 +}; +#endif + +ALIGN static const uint16_t swb_offset_128_24[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 64, 76, 92, 108, 128 +}; + +ALIGN static const uint16_t swb_offset_1024_16[] = +{ + 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 100, 112, 124, + 136, 148, 160, 172, 184, 196, 212, 228, 244, 260, 280, 300, 320, 344, + 368, 396, 424, 456, 492, 532, 572, 616, 664, 716, 772, 832, 896, 960, 1024 +}; + +ALIGN static const uint16_t swb_offset_128_16[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 32, 40, 48, 60, 72, 88, 108, 128 +}; + +ALIGN static const uint16_t swb_offset_1024_8[] = +{ + 0, 12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144, 156, 172, + 188, 204, 220, 236, 252, 268, 288, 308, 328, 348, 372, 396, 420, 448, + 476, 508, 544, 580, 620, 664, 712, 764, 820, 880, 944, 1024 +}; + +ALIGN static const uint16_t swb_offset_128_8[] = +{ + 0, 4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 128 +}; + +ALIGN static const uint16_t *swb_offset_1024_window[] = +{ + swb_offset_1024_96, /* 96000 */ + swb_offset_1024_96, /* 88200 */ + swb_offset_1024_64, /* 64000 */ + swb_offset_1024_48, /* 48000 */ + swb_offset_1024_48, /* 44100 */ + swb_offset_1024_32, /* 32000 */ + swb_offset_1024_24, /* 24000 */ + swb_offset_1024_24, /* 22050 */ + swb_offset_1024_16, /* 16000 */ + swb_offset_1024_16, /* 12000 */ + swb_offset_1024_16, /* 11025 */ + swb_offset_1024_8 /* 8000 */ +}; + +#ifdef LD_DEC +ALIGN static const uint16_t *swb_offset_512_window[] = +{ + 0, /* 96000 */ + 0, /* 88200 */ + 0, /* 64000 */ + swb_offset_512_48, /* 48000 */ + swb_offset_512_48, /* 44100 */ + swb_offset_512_32, /* 32000 */ + swb_offset_512_24, /* 24000 */ + swb_offset_512_24, /* 22050 */ + 0, /* 16000 */ + 0, /* 12000 */ + 0, /* 11025 */ + 0 /* 8000 */ +}; + +ALIGN static const uint16_t *swb_offset_480_window[] = +{ + 0, /* 96000 */ + 0, /* 88200 */ + 0, /* 64000 */ + swb_offset_480_48, /* 48000 */ + swb_offset_480_48, /* 44100 */ + swb_offset_480_32, /* 32000 */ + swb_offset_480_24, /* 24000 */ + swb_offset_480_24, /* 22050 */ + 0, /* 16000 */ + 0, /* 12000 */ + 0, /* 11025 */ + 0 /* 8000 */ +}; +#endif + +ALIGN static const uint16_t *swb_offset_128_window[] = +{ + swb_offset_128_96, /* 96000 */ + swb_offset_128_96, /* 88200 */ + swb_offset_128_64, /* 64000 */ + swb_offset_128_48, /* 48000 */ + swb_offset_128_48, /* 44100 */ + swb_offset_128_48, /* 32000 */ + swb_offset_128_24, /* 24000 */ + swb_offset_128_24, /* 22050 */ + swb_offset_128_16, /* 16000 */ + swb_offset_128_16, /* 12000 */ + swb_offset_128_16, /* 11025 */ + swb_offset_128_8 /* 8000 */ +}; + +#define bit_set(A, B) ((A) & (1<<(B))) + +/* 4.5.2.3.4 */ +/* + - determine the number of windows in a window_sequence named num_windows + - determine the number of window_groups named num_window_groups + - determine the number of windows in each group named window_group_length[g] + - determine the total number of scalefactor window bands named num_swb for + the actual window type + - determine swb_offset[swb], the offset of the first coefficient in + scalefactor window band named swb of the window actually used + - determine sect_sfb_offset[g][section],the offset of the first coefficient + in section named section. This offset depends on window_sequence and + scale_factor_grouping and is needed to decode the spectral_data(). +*/ +uint8_t window_grouping_info(NeAACDecStruct *hDecoder, ic_stream *ics) +{ + uint8_t i, g; + + uint8_t sf_index = hDecoder->sf_index; + + switch (ics->window_sequence) { + case ONLY_LONG_SEQUENCE: + case LONG_START_SEQUENCE: + case LONG_STOP_SEQUENCE: + ics->num_windows = 1; + ics->num_window_groups = 1; + ics->window_group_length[ics->num_window_groups-1] = 1; +#ifdef LD_DEC + if (hDecoder->object_type == LD) + { + if (hDecoder->frameLength == 512) + ics->num_swb = num_swb_512_window[sf_index]; + else /* if (hDecoder->frameLength == 480) */ + ics->num_swb = num_swb_480_window[sf_index]; + } else { +#endif + if (hDecoder->frameLength == 1024) + ics->num_swb = num_swb_1024_window[sf_index]; + else /* if (hDecoder->frameLength == 960) */ + ics->num_swb = num_swb_960_window[sf_index]; +#ifdef LD_DEC + } +#endif + + if (ics->max_sfb > ics->num_swb) + { + return 32; + } + + /* preparation of sect_sfb_offset for long blocks */ + /* also copy the last value! */ +#ifdef LD_DEC + if (hDecoder->object_type == LD) + { + if (hDecoder->frameLength == 512) + { + for (i = 0; i < ics->num_swb; i++) + { + ics->sect_sfb_offset[0][i] = swb_offset_512_window[sf_index][i]; + ics->swb_offset[i] = swb_offset_512_window[sf_index][i]; + } + } else /* if (hDecoder->frameLength == 480) */ { + for (i = 0; i < ics->num_swb; i++) + { + ics->sect_sfb_offset[0][i] = swb_offset_480_window[sf_index][i]; + ics->swb_offset[i] = swb_offset_480_window[sf_index][i]; + } + } + ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; + ics->swb_offset[ics->num_swb] = hDecoder->frameLength; + ics->swb_offset_max = hDecoder->frameLength; + } else { +#endif + for (i = 0; i < ics->num_swb; i++) + { + ics->sect_sfb_offset[0][i] = swb_offset_1024_window[sf_index][i]; + ics->swb_offset[i] = swb_offset_1024_window[sf_index][i]; + } + ics->sect_sfb_offset[0][ics->num_swb] = hDecoder->frameLength; + ics->swb_offset[ics->num_swb] = hDecoder->frameLength; + ics->swb_offset_max = hDecoder->frameLength; +#ifdef LD_DEC + } +#endif + return 0; + case EIGHT_SHORT_SEQUENCE: + ics->num_windows = 8; + ics->num_window_groups = 1; + ics->window_group_length[ics->num_window_groups-1] = 1; + ics->num_swb = num_swb_128_window[sf_index]; + + if (ics->max_sfb > ics->num_swb) + { + return 32; + } + + for (i = 0; i < ics->num_swb; i++) + ics->swb_offset[i] = swb_offset_128_window[sf_index][i]; + ics->swb_offset[ics->num_swb] = hDecoder->frameLength/8; + ics->swb_offset_max = hDecoder->frameLength/8; + + for (i = 0; i < ics->num_windows-1; i++) { + if (bit_set(ics->scale_factor_grouping, 6-i) == 0) + { + ics->num_window_groups += 1; + ics->window_group_length[ics->num_window_groups-1] = 1; + } else { + ics->window_group_length[ics->num_window_groups-1] += 1; + } + } + + /* preparation of sect_sfb_offset for short blocks */ + for (g = 0; g < ics->num_window_groups; g++) + { + uint16_t width; + uint8_t sect_sfb = 0; + uint16_t offset = 0; + + for (i = 0; i < ics->num_swb; i++) + { + if (i+1 == ics->num_swb) + { + width = (hDecoder->frameLength/8) - swb_offset_128_window[sf_index][i]; + } else { + width = swb_offset_128_window[sf_index][i+1] - + swb_offset_128_window[sf_index][i]; + } + width *= ics->window_group_length[g]; + ics->sect_sfb_offset[g][sect_sfb++] = offset; + offset += width; + } + ics->sect_sfb_offset[g][sect_sfb] = offset; + } + return 0; + default: + return 32; + } +} + +/* iquant() * +/* output = sign(input)*abs(input)^(4/3) */ +/**/ +static INLINE real_t iquant(int16_t q, const real_t *tab, uint8_t *error) +{ +#ifdef FIXED_POINT +/* For FIXED_POINT the iq_table is prescaled by 3 bits (iq_table[]/8) */ +/* BIG_IQ_TABLE allows you to use the full 8192 value table, if this is not + * defined a 1026 value table and interpolation will be used + */ +#ifndef BIG_IQ_TABLE + static const real_t errcorr[] = { + REAL_CONST(0), REAL_CONST(1.0/8.0), REAL_CONST(2.0/8.0), REAL_CONST(3.0/8.0), + REAL_CONST(4.0/8.0), REAL_CONST(5.0/8.0), REAL_CONST(6.0/8.0), REAL_CONST(7.0/8.0), + REAL_CONST(0) + }; + real_t x1, x2; +#endif + int16_t sgn = 1; + + if (q < 0) + { + q = -q; + sgn = -1; + } + + if (q < IQ_TABLE_SIZE) + { +//#define IQUANT_PRINT +#ifdef IQUANT_PRINT + //printf("0x%.8X\n", sgn * tab[q]); + printf("%d\n", sgn * tab[q]); +#endif + return sgn * tab[q]; + } + +#ifndef BIG_IQ_TABLE + if (q >= 8192) + { + *error = 17; + return 0; + } + + /* linear interpolation */ + x1 = tab[q>>3]; + x2 = tab[(q>>3) + 1]; + return sgn * 16 * (MUL_R(errcorr[q&7],(x2-x1)) + x1); +#else + *error = 17; + return 0; +#endif + +#else + if (q < 0) + { + /* tab contains a value for all possible q [0,8192] */ + if (-q < IQ_TABLE_SIZE) + return -tab[-q]; + + *error = 17; + return 0; + } else { + /* tab contains a value for all possible q [0,8192] */ + if (q < IQ_TABLE_SIZE) + return tab[q]; + + *error = 17; + return 0; + } +#endif +} + +#ifndef FIXED_POINT +ALIGN static const real_t pow2sf_tab[] = { + 2.9802322387695313E-008, 5.9604644775390625E-008, 1.1920928955078125E-007, + 2.384185791015625E-007, 4.76837158203125E-007, 9.5367431640625E-007, + 1.9073486328125E-006, 3.814697265625E-006, 7.62939453125E-006, + 1.52587890625E-005, 3.0517578125E-005, 6.103515625E-005, + 0.0001220703125, 0.000244140625, 0.00048828125, + 0.0009765625, 0.001953125, 0.00390625, + 0.0078125, 0.015625, 0.03125, + 0.0625, 0.125, 0.25, + 0.5, 1.0, 2.0, + 4.0, 8.0, 16.0, 32.0, + 64.0, 128.0, 256.0, + 512.0, 1024.0, 2048.0, + 4096.0, 8192.0, 16384.0, + 32768.0, 65536.0, 131072.0, + 262144.0, 524288.0, 1048576.0, + 2097152.0, 4194304.0, 8388608.0, + 16777216.0, 33554432.0, 67108864.0, + 134217728.0, 268435456.0, 536870912.0, + 1073741824.0, 2147483648.0, 4294967296.0, + 8589934592.0, 17179869184.0, 34359738368.0, + 68719476736.0, 137438953472.0, 274877906944.0 +}; +#endif + +/* quant_to_spec: perform dequantisation and scaling + * and in case of short block it also does the deinterleaving + */ +/* + For ONLY_LONG_SEQUENCE windows (num_window_groups = 1, + window_group_length[0] = 1) the spectral data is in ascending spectral + order. + For the EIGHT_SHORT_SEQUENCE window, the spectral order depends on the + grouping in the following manner: + - Groups are ordered sequentially + - Within a group, a scalefactor band consists of the spectral data of all + grouped SHORT_WINDOWs for the associated scalefactor window band. To + clarify via example, the length of a group is in the range of one to eight + SHORT_WINDOWs. + - If there are eight groups each with length one (num_window_groups = 8, + window_group_length[0..7] = 1), the result is a sequence of eight spectra, + each in ascending spectral order. + - If there is only one group with length eight (num_window_groups = 1, + window_group_length[0] = 8), the result is that spectral data of all eight + SHORT_WINDOWs is interleaved by scalefactor window bands. + - Within a scalefactor window band, the coefficients are in ascending + spectral order. +*/ +static uint8_t quant_to_spec(NeAACDecStruct *hDecoder, + ic_stream *ics, int16_t *quant_data, + real_t *spec_data, uint16_t frame_len) +{ + ALIGN static const real_t pow2_table[] = + { + COEF_CONST(1.0), + COEF_CONST(1.1892071150027210667174999705605), /* 2^0.25 */ + COEF_CONST(1.4142135623730950488016887242097), /* 2^0.5 */ + COEF_CONST(1.6817928305074290860622509524664) /* 2^0.75 */ + }; + const real_t *tab = iq_table; + + uint8_t g, sfb, win; + uint16_t width, bin, k, gindex, wa, wb; + uint8_t error = 0; /* Init error flag */ +#ifndef FIXED_POINT + real_t scf; +#endif + + k = 0; + gindex = 0; + + for (g = 0; g < ics->num_window_groups; g++) + { + uint16_t j = 0; + uint16_t gincrease = 0; + uint16_t win_inc = ics->swb_offset[ics->num_swb]; + + for (sfb = 0; sfb < ics->num_swb; sfb++) + { + int32_t exp, frac; + + width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; + + /* this could be scalefactor for IS or PNS, those can be negative or bigger then 255 */ + /* just ignore them */ + if (ics->scale_factors[g][sfb] < 0 || ics->scale_factors[g][sfb] > 255) + { + exp = 0; + frac = 0; + } else { + /* ics->scale_factors[g][sfb] must be between 0 and 255 */ + exp = (ics->scale_factors[g][sfb] /* - 100 */) >> 2; + /* frac must always be > 0 */ + frac = (ics->scale_factors[g][sfb] /* - 100 */) & 3; + } + +#ifdef FIXED_POINT + exp -= 25; + /* IMDCT pre-scaling */ + if (hDecoder->object_type == LD) + { + exp -= 6 /*9*/; + } else { + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + exp -= 4 /*7*/; + else + exp -= 7 /*10*/; + } +#endif + + wa = gindex + j; + +#ifndef FIXED_POINT + scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; +#endif + + for (win = 0; win < ics->window_group_length[g]; win++) + { + for (bin = 0; bin < width; bin += 4) + { +#ifndef FIXED_POINT + wb = wa + bin; + + spec_data[wb+0] = iquant(quant_data[k+0], tab, &error) * scf; + spec_data[wb+1] = iquant(quant_data[k+1], tab, &error) * scf; + spec_data[wb+2] = iquant(quant_data[k+2], tab, &error) * scf; + spec_data[wb+3] = iquant(quant_data[k+3], tab, &error) * scf; + +#else + real_t iq0 = iquant(quant_data[k+0], tab, &error); + real_t iq1 = iquant(quant_data[k+1], tab, &error); + real_t iq2 = iquant(quant_data[k+2], tab, &error); + real_t iq3 = iquant(quant_data[k+3], tab, &error); + + wb = wa + bin; + + if (exp < 0) + { + spec_data[wb+0] = iq0 >>= -exp; + spec_data[wb+1] = iq1 >>= -exp; + spec_data[wb+2] = iq2 >>= -exp; + spec_data[wb+3] = iq3 >>= -exp; + } else { + spec_data[wb+0] = iq0 <<= exp; + spec_data[wb+1] = iq1 <<= exp; + spec_data[wb+2] = iq2 <<= exp; + spec_data[wb+3] = iq3 <<= exp; + } + if (frac != 0) + { + spec_data[wb+0] = MUL_C(spec_data[wb+0],pow2_table[frac]); + spec_data[wb+1] = MUL_C(spec_data[wb+1],pow2_table[frac]); + spec_data[wb+2] = MUL_C(spec_data[wb+2],pow2_table[frac]); + spec_data[wb+3] = MUL_C(spec_data[wb+3],pow2_table[frac]); + } + +//#define SCFS_PRINT +#ifdef SCFS_PRINT + printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+0]); + printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+1]); + printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+2]); + printf("%d\n", spec_data[gindex+(win*win_inc)+j+bin+3]); + //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+0]); + //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+1]); + //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+2]); + //printf("0x%.8X\n", spec_data[gindex+(win*win_inc)+j+bin+3]); +#endif +#endif + + gincrease += 4; + k += 4; + } + wa += win_inc; + } + j += width; + } + gindex += gincrease; + } + + return error; +} + +static uint8_t allocate_single_channel(NeAACDecStruct *hDecoder, uint8_t channel, + uint8_t output_channels) +{ + int mul = 1; + +#ifdef MAIN_DEC + /* MAIN object type prediction */ + if (hDecoder->object_type == MAIN) + { + /* allocate the state only when needed */ + if (hDecoder->pred_stat[channel] != NULL) + { + faad_free(hDecoder->pred_stat[channel]); + hDecoder->pred_stat[channel] = NULL; + } + + hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); + reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); + } +#endif + +#ifdef LTP_DEC + if (is_ltp_ot(hDecoder->object_type)) + { + /* allocate the state only when needed */ + if (hDecoder->lt_pred_stat[channel] != NULL) + { + faad_free(hDecoder->lt_pred_stat[channel]); + hDecoder->lt_pred_stat[channel] = NULL; + } + + hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); + memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); + } +#endif + + if (hDecoder->time_out[channel] != NULL) + { + faad_free(hDecoder->time_out[channel]); + hDecoder->time_out[channel] = NULL; + } + + { + mul = 1; +#ifdef SBR_DEC + hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; + if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + { + /* SBR requires 2 times as much output data */ + mul = 2; + hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; + } +#endif + hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); + } + +#if (defined(PS_DEC) || defined(DRM_PS)) + if (output_channels == 2) + { + if (hDecoder->time_out[channel+1] != NULL) + { + faad_free(hDecoder->time_out[channel+1]); + hDecoder->time_out[channel+1] = NULL; + } + + hDecoder->time_out[channel+1] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->time_out[channel+1], 0, mul*hDecoder->frameLength*sizeof(real_t)); + } +#endif + + if (hDecoder->fb_intermed[channel] != NULL) + { + faad_free(hDecoder->fb_intermed[channel]); + hDecoder->fb_intermed[channel] = NULL; + } + + hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); + +#ifdef SSR_DEC + if (hDecoder->object_type == SSR) + { + if (hDecoder->ssr_overlap[channel] == NULL) + { + hDecoder->ssr_overlap[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->ssr_overlap[channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); + } + if (hDecoder->prev_fmd[channel] == NULL) + { + uint16_t k; + hDecoder->prev_fmd[channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + for (k = 0; k < 2*hDecoder->frameLength; k++) + hDecoder->prev_fmd[channel][k] = REAL_CONST(-1); + } + } +#endif + + return 0; +} + +static uint8_t allocate_channel_pair(NeAACDecStruct *hDecoder, + uint8_t channel, uint8_t paired_channel) +{ + int mul = 1; + +#ifdef MAIN_DEC + /* MAIN object type prediction */ + if (hDecoder->object_type == MAIN) + { + /* allocate the state only when needed */ + if (hDecoder->pred_stat[channel] == NULL) + { + hDecoder->pred_stat[channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); + reset_all_predictors(hDecoder->pred_stat[channel], hDecoder->frameLength); + } + if (hDecoder->pred_stat[paired_channel] == NULL) + { + hDecoder->pred_stat[paired_channel] = (pred_state*)faad_malloc(hDecoder->frameLength * sizeof(pred_state)); + reset_all_predictors(hDecoder->pred_stat[paired_channel], hDecoder->frameLength); + } + } +#endif + +#ifdef LTP_DEC + if (is_ltp_ot(hDecoder->object_type)) + { + /* allocate the state only when needed */ + if (hDecoder->lt_pred_stat[channel] == NULL) + { + hDecoder->lt_pred_stat[channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); + memset(hDecoder->lt_pred_stat[channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); + } + if (hDecoder->lt_pred_stat[paired_channel] == NULL) + { + hDecoder->lt_pred_stat[paired_channel] = (int16_t*)faad_malloc(hDecoder->frameLength*4 * sizeof(int16_t)); + memset(hDecoder->lt_pred_stat[paired_channel], 0, hDecoder->frameLength*4 * sizeof(int16_t)); + } + } +#endif + + if (hDecoder->time_out[channel] == NULL) + { + mul = 1; +#ifdef SBR_DEC + hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 0; + if ((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + { + /* SBR requires 2 times as much output data */ + mul = 2; + hDecoder->sbr_alloced[hDecoder->fr_ch_ele] = 1; + } +#endif + hDecoder->time_out[channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->time_out[channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); + } + if (hDecoder->time_out[paired_channel] == NULL) + { + hDecoder->time_out[paired_channel] = (real_t*)faad_malloc(mul*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->time_out[paired_channel], 0, mul*hDecoder->frameLength*sizeof(real_t)); + } + + if (hDecoder->fb_intermed[channel] == NULL) + { + hDecoder->fb_intermed[channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->fb_intermed[channel], 0, hDecoder->frameLength*sizeof(real_t)); + } + if (hDecoder->fb_intermed[paired_channel] == NULL) + { + hDecoder->fb_intermed[paired_channel] = (real_t*)faad_malloc(hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->fb_intermed[paired_channel], 0, hDecoder->frameLength*sizeof(real_t)); + } + +#ifdef SSR_DEC + if (hDecoder->object_type == SSR) + { + if (hDecoder->ssr_overlap[cpe->channel] == NULL) + { + hDecoder->ssr_overlap[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->ssr_overlap[cpe->channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); + } + if (hDecoder->ssr_overlap[cpe->paired_channel] == NULL) + { + hDecoder->ssr_overlap[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + memset(hDecoder->ssr_overlap[cpe->paired_channel], 0, 2*hDecoder->frameLength*sizeof(real_t)); + } + if (hDecoder->prev_fmd[cpe->channel] == NULL) + { + uint16_t k; + hDecoder->prev_fmd[cpe->channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + for (k = 0; k < 2*hDecoder->frameLength; k++) + hDecoder->prev_fmd[cpe->channel][k] = REAL_CONST(-1); + } + if (hDecoder->prev_fmd[cpe->paired_channel] == NULL) + { + uint16_t k; + hDecoder->prev_fmd[cpe->paired_channel] = (real_t*)faad_malloc(2*hDecoder->frameLength*sizeof(real_t)); + for (k = 0; k < 2*hDecoder->frameLength; k++) + hDecoder->prev_fmd[cpe->paired_channel][k] = REAL_CONST(-1); + } + } +#endif + + return 0; +} + +uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, + element *sce, int16_t *spec_data) +{ + uint8_t retval; + int output_channels; + ALIGN real_t spec_coef[1024]; + +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + + + /* always allocate 2 channels, PS can always "suddenly" turn up */ +#if ( (defined(DRM) && defined(DRM_PS)) ) + output_channels = 2; +#elif defined(PS_DEC) + if (hDecoder->ps_used[hDecoder->fr_ch_ele]) + output_channels = 2; + else + output_channels = 1; +#else + output_channels = 1; +#endif + + if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) + { + /* element_output_channels not set yet */ + hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; + } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != output_channels) { + /* element inconsistency */ + + /* this only happens if PS is actually found but not in the first frame + * this means that there is only 1 bitstream element! + */ + + /* reset the allocation */ + hDecoder->element_alloced[hDecoder->fr_ch_ele] = 0; + + hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; + + //return 21; + } + + if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) + { + retval = allocate_single_channel(hDecoder, sce->channel, output_channels); + if (retval > 0) + return retval; + + hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; + } + + + /* dequantisation and scaling */ + retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); + if (retval > 0) + return retval; + +#ifdef PROFILE + count = faad_get_ts() - count; + hDecoder->requant_cycles += count; +#endif + + + /* pns decoding */ + pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, + &(hDecoder->__r1), &(hDecoder->__r2)); + +#ifdef MAIN_DEC + /* MAIN object type prediction */ + if (hDecoder->object_type == MAIN) + { + if (!hDecoder->pred_stat[sce->channel]) + return 33; + + /* intra channel prediction */ + ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, + hDecoder->sf_index); + + /* In addition, for scalefactor bands coded by perceptual + noise substitution the predictors belonging to the + corresponding spectral coefficients are reset. + */ + pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); + } +#endif + +#ifdef LTP_DEC + if (is_ltp_ot(hDecoder->object_type)) + { +#ifdef LD_DEC + if (hDecoder->object_type == LD) + { + if (ics->ltp.data_present) + { + if (ics->ltp.lag_update) + hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; + } + ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; + } +#endif + + /* long term prediction */ + lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, + ics->window_shape, hDecoder->window_shape_prev[sce->channel], + hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); + } +#endif + + /* tns decoding */ + tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, + spec_coef, hDecoder->frameLength); + + /* drc decoding */ + if (hDecoder->drc->present) + { + if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) + drc_decode(hDecoder->drc, spec_coef); + } + + /* filter bank */ +#ifdef SSR_DEC + if (hDecoder->object_type != SSR) + { +#endif + ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, + hDecoder->window_shape_prev[sce->channel], spec_coef, + hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], + hDecoder->object_type, hDecoder->frameLength); +#ifdef SSR_DEC + } else { + ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, + hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], + hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], + hDecoder->frameLength); + } +#endif + + /* save window shape for next frame */ + hDecoder->window_shape_prev[sce->channel] = ics->window_shape; + +#ifdef LTP_DEC + if (is_ltp_ot(hDecoder->object_type)) + { + lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], + hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); + } +#endif + +#ifdef SBR_DEC + if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) + { + int ele = hDecoder->fr_ch_ele; + int ch = sce->channel; + + /* following case can happen when forceUpSampling == 1 */ + if (hDecoder->sbr[ele] == NULL) + { + hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, + hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), + hDecoder->downSampledSBR +#ifdef DRM + , 0 +#endif + ); + } + + if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) + hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); + else + hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); + + /* check if any of the PS tools is used */ +#if (defined(PS_DEC) || defined(DRM_PS)) + if (hDecoder->ps_used[ele] == 0) + { +#endif + retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], + hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); +#if (defined(PS_DEC) || defined(DRM_PS)) + } else { + retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], + hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, + hDecoder->downSampledSBR); + } +#endif + if (retval > 0) + return retval; + } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) + { + return 23; + } +#endif + + /* copy L to R when no PS is used */ +#if (defined(PS_DEC) || defined(DRM_PS)) + if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && + (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) + { + int ele = hDecoder->fr_ch_ele; + int ch = sce->channel; + int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; + frame_size *= hDecoder->frameLength*sizeof(real_t); + + memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); + } +#endif + + return 0; +} + +uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, + element *cpe, int16_t *spec_data1, int16_t *spec_data2) +{ + uint8_t retval; + ALIGN real_t spec_coef1[1024]; + ALIGN real_t spec_coef2[1024]; + +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) + { + retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); + if (retval > 0) + return retval; + + hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; + } + + /* dequantisation and scaling */ + retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); + if (retval > 0) + return retval; + retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); + if (retval > 0) + return retval; + +#ifdef PROFILE + count = faad_get_ts() - count; + hDecoder->requant_cycles += count; +#endif + + + /* pns decoding */ + if (ics1->ms_mask_present) + { + pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, + &(hDecoder->__r1), &(hDecoder->__r2)); + } else { + pns_decode(ics1, NULL, spec_coef1, NULL, hDecoder->frameLength, 0, hDecoder->object_type, + &(hDecoder->__r1), &(hDecoder->__r2)); + pns_decode(ics2, NULL, spec_coef2, NULL, hDecoder->frameLength, 0, hDecoder->object_type, + &(hDecoder->__r1), &(hDecoder->__r2)); + } + + /* mid/side decoding */ + ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); + +#if 0 + { + int i; + for (i = 0; i < 1024; i++) + { + //printf("%d\n", spec_coef1[i]); + printf("0x%.8X\n", spec_coef1[i]); + } + for (i = 0; i < 1024; i++) + { + //printf("%d\n", spec_coef2[i]); + printf("0x%.8X\n", spec_coef2[i]); + } + } +#endif + + /* intensity stereo decoding */ + is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); + +#if 0 + { + int i; + for (i = 0; i < 1024; i++) + { + printf("%d\n", spec_coef1[i]); + //printf("0x%.8X\n", spec_coef1[i]); + } + for (i = 0; i < 1024; i++) + { + printf("%d\n", spec_coef2[i]); + //printf("0x%.8X\n", spec_coef2[i]); + } + } +#endif + +#ifdef MAIN_DEC + /* MAIN object type prediction */ + if (hDecoder->object_type == MAIN) + { + /* intra channel prediction */ + ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, + hDecoder->sf_index); + ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, + hDecoder->sf_index); + + /* In addition, for scalefactor bands coded by perceptual + noise substitution the predictors belonging to the + corresponding spectral coefficients are reset. + */ + pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); + pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); + } +#endif + +#ifdef LTP_DEC + if (is_ltp_ot(hDecoder->object_type)) + { + ltp_info *ltp1 = &(ics1->ltp); + ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); +#ifdef LD_DEC + if (hDecoder->object_type == LD) + { + if (ltp1->data_present) + { + if (ltp1->lag_update) + hDecoder->ltp_lag[cpe->channel] = ltp1->lag; + } + ltp1->lag = hDecoder->ltp_lag[cpe->channel]; + if (ltp2->data_present) + { + if (ltp2->lag_update) + hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; + } + ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; + } +#endif + + /* long term prediction */ + lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, + ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], + hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); + lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, + ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], + hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); + } +#endif + + /* tns decoding */ + tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, + spec_coef1, hDecoder->frameLength); + tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, + spec_coef2, hDecoder->frameLength); + + /* drc decoding */ + if (hDecoder->drc->present) + { + if (!hDecoder->drc->exclude_mask[cpe->channel] || !hDecoder->drc->excluded_chns_present) + drc_decode(hDecoder->drc, spec_coef1); + if (!hDecoder->drc->exclude_mask[cpe->paired_channel] || !hDecoder->drc->excluded_chns_present) + drc_decode(hDecoder->drc, spec_coef2); + } + + /* filter bank */ +#ifdef SSR_DEC + if (hDecoder->object_type != SSR) + { +#endif + ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, + hDecoder->window_shape_prev[cpe->channel], spec_coef1, + hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], + hDecoder->object_type, hDecoder->frameLength); + ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, + hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, + hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], + hDecoder->object_type, hDecoder->frameLength); +#ifdef SSR_DEC + } else { + ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, + hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], + hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], + hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); + ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, + hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], + hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], + hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); + } +#endif + + /* save window shape for next frame */ + hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; + hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; + +#ifdef LTP_DEC + if (is_ltp_ot(hDecoder->object_type)) + { + lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], + hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); + lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], + hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); + } +#endif + +#ifdef SBR_DEC + if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) + { + int ele = hDecoder->fr_ch_ele; + int ch0 = cpe->channel; + int ch1 = cpe->paired_channel; + + /* following case can happen when forceUpSampling == 1 */ + if (hDecoder->sbr[ele] == NULL) + { + hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, + hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), + hDecoder->downSampledSBR +#ifdef DRM + , 0 +#endif + ); + } + + if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) + hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); + else + hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); + + retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], + hDecoder->time_out[ch0], hDecoder->time_out[ch1], + hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); + if (retval > 0) + return retval; + } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) + && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) + { + return 23; + } +#endif + + return 0; +} diff --git a/src/contrib/aacdecoder/libfaad/specrec.h b/src/contrib/aacdecoder/libfaad/specrec.h old mode 100644 new mode 100755 index a63778486..5f42e2cfe --- a/src/contrib/aacdecoder/libfaad/specrec.h +++ b/src/contrib/aacdecoder/libfaad/specrec.h @@ -1,52 +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: specrec.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SPECREC_H__ -#define __SPECREC_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "syntax.h" - -uint8_t window_grouping_info(faacDecHandle hDecoder, ic_stream *ics); -void apply_scalefactors(faacDecHandle hDecoder, ic_stream *ics, real_t *x_invquant, - uint16_t frame_len); -#ifdef USE_SSE -void apply_scalefactors_sse(faacDecHandle hDecoder, ic_stream *ics, real_t *x_invquant, - uint16_t frame_len); -#endif -uint8_t reconstruct_channel_pair(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - element *cpe, int16_t *spec_data1, int16_t *spec_data2); -uint8_t reconstruct_single_channel(faacDecHandle hDecoder, ic_stream *ics, element *sce, - int16_t *spec_data); - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: specrec.h,v 1.33 2009/01/26 23:51:15 menno Exp $ +**/ + +#ifndef __SPECREC_H__ +#define __SPECREC_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "syntax.h" + +uint8_t window_grouping_info(NeAACDecStruct *hDecoder, ic_stream *ics); +uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, + element *cpe, int16_t *spec_data1, int16_t *spec_data2); +uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, element *sce, + int16_t *spec_data); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr.c b/src/contrib/aacdecoder/libfaad/ssr.c old mode 100644 new mode 100755 index c154b8d87..368112407 --- a/src/contrib/aacdecoder/libfaad/ssr.c +++ b/src/contrib/aacdecoder/libfaad/ssr.c @@ -1,172 +1,175 @@ -/* -** 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: ssr.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SSR_DEC - -#include "syntax.h" -#include "filtbank.h" -#include "ssr.h" -#include "ssr_fb.h" - -void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, - uint8_t window_shape, uint8_t window_shape_prev, - real_t *freq_in, real_t *time_out, real_t *overlap, - real_t ipqf_buffer[SSR_BANDS][96/4], - real_t *prev_fmd, uint16_t frame_len) -{ - uint8_t band; - uint16_t ssr_frame_len = frame_len/SSR_BANDS; - real_t time_tmp[2048] = {0}; - real_t output[1024] = {0}; - - for (band = 0; band < SSR_BANDS; band++) - { - int16_t j; - - /* uneven bands have inverted frequency scale */ - if (band == 1 || band == 3) - { - for (j = 0; j < ssr_frame_len/2; j++) - { - real_t tmp; - tmp = freq_in[j + ssr_frame_len*band]; - freq_in[j + ssr_frame_len*band] = - freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band]; - freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band] = tmp; - } - } - - /* non-overlapping inverse filterbank for SSR */ - ssr_ifilter_bank(fb, window_sequence, window_shape, window_shape_prev, - freq_in + band*ssr_frame_len, time_tmp + band*ssr_frame_len, - ssr_frame_len); - - /* gain control */ - ssr_gain_control(ssr, time_tmp, output, overlap, prev_fmd, - band, window_sequence, ssr_frame_len); - } - - /* inverse pqf to bring subbands together again */ - ssr_ipqf(ssr, output, time_out, ipqf_buffer, frame_len, SSR_BANDS); -} - -static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, - real_t *overlap, real_t *prev_fmd, uint8_t band, - uint8_t window_sequence, uint16_t frame_len) -{ - uint16_t i; - real_t gc_function[2*1024/SSR_BANDS]; - - if (window_sequence != EIGHT_SHORT_SEQUENCE) - { - ssr_gc_function(ssr, &prev_fmd[band * frame_len*2], - gc_function, window_sequence, band, frame_len); - - for (i = 0; i < frame_len*2; i++) - data[band * frame_len*2 + i] *= gc_function[i]; - for (i = 0; i < frame_len; i++) - { - output[band*frame_len + i] = overlap[band*frame_len + i] + - data[band*frame_len*2 + i]; - } - for (i = 0; i < frame_len; i++) - { - overlap[band*frame_len + i] = - data[band*frame_len*2 + frame_len + i]; - } - } else { - uint8_t w; - for (w = 0; w < 8; w++) - { - uint16_t frame_len8 = frame_len/8; - uint16_t frame_len16 = frame_len/16; - - ssr_gc_function(ssr, &prev_fmd[band*frame_len*2 + w*frame_len*2/8], - gc_function, window_sequence, frame_len); - - for (i = 0; i < frame_len8*2; i++) - data[band*frame_len*2 + w*frame_len8*2+i] *= gc_function[i]; - for (i = 0; i < frame_len8; i++) - { - overlap[band*frame_len + i + 7*frame_len16 + w*frame_len8] += - data[band*frame_len*2 + 2*w*frame_len8 + i]; - } - for (i = 0; i < frame_len8; i++) - { - overlap[band*frame_len + i + 7*frame_len16 + (w+1)*frame_len8] = - data[band*frame_len*2 + 2*w*frame_len8 + frame_len8 + i]; - } - } - for (i = 0; i < frame_len; i++) - output[band*frame_len + i] = overlap[band*frame_len + i]; - for (i = 0; i < frame_len; i++) - overlap[band*frame_len + i] = overlap[band*frame_len + i + frame_len]; - } -} - -static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, - real_t *gc_function, uint8_t window_sequence, - uint8_t band, uint16_t frame_len) -{ - uint16_t i; - uint16_t len_area1, len_area2; - int32_t aloc[10]; - real_t alev[10]; - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - len_area1 = frame_len/SSR_BANDS; - len_area2 = 0; - break; - case LONG_START_SEQUENCE: - len_area1 = (frame_len/SSR_BANDS)*7/32; - len_area2 = (frame_len/SSR_BANDS)/16; - break; - case EIGHT_SHORT_SEQUENCE: - len_area1 = (frame_len/8)/SSR_BANDS; - len_area2 = 0; - break; - case LONG_STOP_SEQUENCE: - len_area1 = (frame_len/SSR_BANDS); - len_area2 = 0; - break; - } - - /* decode bitstream information */ - - /* build array M */ - - - for (i = 0; i < frame_len*2; i++) - gc_function[i] = 1; -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ssr.c,v 1.19 2007/11/01 12:33:36 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SSR_DEC + +#include "syntax.h" +#include "filtbank.h" +#include "ssr.h" +#include "ssr_fb.h" + +void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, + uint8_t window_shape, uint8_t window_shape_prev, + real_t *freq_in, real_t *time_out, real_t *overlap, + real_t ipqf_buffer[SSR_BANDS][96/4], + real_t *prev_fmd, uint16_t frame_len) +{ + uint8_t band; + uint16_t ssr_frame_len = frame_len/SSR_BANDS; + real_t time_tmp[2048] = {0}; + real_t output[1024] = {0}; + + for (band = 0; band < SSR_BANDS; band++) + { + int16_t j; + + /* uneven bands have inverted frequency scale */ + if (band == 1 || band == 3) + { + for (j = 0; j < ssr_frame_len/2; j++) + { + real_t tmp; + tmp = freq_in[j + ssr_frame_len*band]; + freq_in[j + ssr_frame_len*band] = + freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band]; + freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band] = tmp; + } + } + + /* non-overlapping inverse filterbank for SSR */ + ssr_ifilter_bank(fb, window_sequence, window_shape, window_shape_prev, + freq_in + band*ssr_frame_len, time_tmp + band*ssr_frame_len, + ssr_frame_len); + + /* gain control */ + ssr_gain_control(ssr, time_tmp, output, overlap, prev_fmd, + band, window_sequence, ssr_frame_len); + } + + /* inverse pqf to bring subbands together again */ + ssr_ipqf(ssr, output, time_out, ipqf_buffer, frame_len, SSR_BANDS); +} + +static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, + real_t *overlap, real_t *prev_fmd, uint8_t band, + uint8_t window_sequence, uint16_t frame_len) +{ + uint16_t i; + real_t gc_function[2*1024/SSR_BANDS]; + + if (window_sequence != EIGHT_SHORT_SEQUENCE) + { + ssr_gc_function(ssr, &prev_fmd[band * frame_len*2], + gc_function, window_sequence, band, frame_len); + + for (i = 0; i < frame_len*2; i++) + data[band * frame_len*2 + i] *= gc_function[i]; + for (i = 0; i < frame_len; i++) + { + output[band*frame_len + i] = overlap[band*frame_len + i] + + data[band*frame_len*2 + i]; + } + for (i = 0; i < frame_len; i++) + { + overlap[band*frame_len + i] = + data[band*frame_len*2 + frame_len + i]; + } + } else { + uint8_t w; + for (w = 0; w < 8; w++) + { + uint16_t frame_len8 = frame_len/8; + uint16_t frame_len16 = frame_len/16; + + ssr_gc_function(ssr, &prev_fmd[band*frame_len*2 + w*frame_len*2/8], + gc_function, window_sequence, frame_len); + + for (i = 0; i < frame_len8*2; i++) + data[band*frame_len*2 + w*frame_len8*2+i] *= gc_function[i]; + for (i = 0; i < frame_len8; i++) + { + overlap[band*frame_len + i + 7*frame_len16 + w*frame_len8] += + data[band*frame_len*2 + 2*w*frame_len8 + i]; + } + for (i = 0; i < frame_len8; i++) + { + overlap[band*frame_len + i + 7*frame_len16 + (w+1)*frame_len8] = + data[band*frame_len*2 + 2*w*frame_len8 + frame_len8 + i]; + } + } + for (i = 0; i < frame_len; i++) + output[band*frame_len + i] = overlap[band*frame_len + i]; + for (i = 0; i < frame_len; i++) + overlap[band*frame_len + i] = overlap[band*frame_len + i + frame_len]; + } +} + +static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, + real_t *gc_function, uint8_t window_sequence, + uint8_t band, uint16_t frame_len) +{ + uint16_t i; + uint16_t len_area1, len_area2; + int32_t aloc[10]; + real_t alev[10]; + + switch (window_sequence) + { + case ONLY_LONG_SEQUENCE: + len_area1 = frame_len/SSR_BANDS; + len_area2 = 0; + break; + case LONG_START_SEQUENCE: + len_area1 = (frame_len/SSR_BANDS)*7/32; + len_area2 = (frame_len/SSR_BANDS)/16; + break; + case EIGHT_SHORT_SEQUENCE: + len_area1 = (frame_len/8)/SSR_BANDS; + len_area2 = 0; + break; + case LONG_STOP_SEQUENCE: + len_area1 = (frame_len/SSR_BANDS); + len_area2 = 0; + break; + } + + /* decode bitstream information */ + + /* build array M */ + + + for (i = 0; i < frame_len*2; i++) + gc_function[i] = 1; +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr.h b/src/contrib/aacdecoder/libfaad/ssr.h old mode 100644 new mode 100755 index 724d706d7..7adcf2a11 --- a/src/contrib/aacdecoder/libfaad/ssr.h +++ b/src/contrib/aacdecoder/libfaad/ssr.h @@ -1,56 +1,59 @@ -/* -** 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: ssr.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SSR_H__ -#define __SSR_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define SSR_BANDS 4 -#define PQFTAPS 96 - -void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, - uint8_t window_shape, uint8_t window_shape_prev, - real_t *freq_in, real_t *time_out, real_t *overlap, - real_t ipqf_buffer[SSR_BANDS][96/4], - real_t *prev_fmd, uint16_t frame_len); - - -static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, - real_t *overlap, real_t *prev_fmd, uint8_t band, - uint8_t window_sequence, uint16_t frame_len); -static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, - real_t *gc_function, uint8_t window_sequence, - uint16_t frame_len); - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ssr.h,v 1.19 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SSR_H__ +#define __SSR_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#define SSR_BANDS 4 +#define PQFTAPS 96 + +void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, + uint8_t window_shape, uint8_t window_shape_prev, + real_t *freq_in, real_t *time_out, real_t *overlap, + real_t ipqf_buffer[SSR_BANDS][96/4], + real_t *prev_fmd, uint16_t frame_len); + + +static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, + real_t *overlap, real_t *prev_fmd, uint8_t band, + uint8_t window_sequence, uint16_t frame_len); +static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, + real_t *gc_function, uint8_t window_sequence, + uint16_t frame_len); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr_fb.c b/src/contrib/aacdecoder/libfaad/ssr_fb.c old mode 100644 new mode 100755 index 62233bf3b..a977c9411 --- a/src/contrib/aacdecoder/libfaad/ssr_fb.c +++ b/src/contrib/aacdecoder/libfaad/ssr_fb.c @@ -1,182 +1,185 @@ -/* -** 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: ssr_fb.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SSR_DEC - -#include -#include -#include "syntax.h" -#include "filtbank.h" -#include "mdct.h" -#include "ssr_fb.h" -#include "ssr_win.h" - -fb_info *ssr_filter_bank_init(uint16_t frame_len) -{ - uint16_t nshort = frame_len/8; - - fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); - memset(fb, 0, sizeof(fb_info)); - - /* normal */ - fb->mdct256 = faad_mdct_init(2*nshort); - fb->mdct2048 = faad_mdct_init(2*frame_len); - - fb->long_window[0] = sine_long_256; - fb->short_window[0] = sine_short_32; - fb->long_window[1] = kbd_long_256; - fb->short_window[1] = kbd_short_32; - - return fb; -} - -void ssr_filter_bank_end(fb_info *fb) -{ - faad_mdct_end(fb->mdct256); - faad_mdct_end(fb->mdct2048); - - if (fb) faad_free(fb); -} - -static INLINE void imdct_ssr(fb_info *fb, real_t *in_data, - real_t *out_data, uint16_t len) -{ - mdct_info *mdct; - - switch (len) - { - case 512: - mdct = fb->mdct2048; - break; - case 64: - mdct = fb->mdct256; - break; - } - - faad_imdct(mdct, in_data, out_data); -} - -/* NON-overlapping inverse filterbank for use with SSR */ -void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, - uint8_t window_shape_prev, real_t *freq_in, - real_t *time_out, uint16_t frame_len) -{ - int16_t i; - real_t *transf_buf; - - real_t *window_long; - real_t *window_long_prev; - real_t *window_short; - real_t *window_short_prev; - - uint16_t nlong = frame_len; - uint16_t nshort = frame_len/8; - uint16_t trans = nshort/2; - - uint16_t nflat_ls = (nlong-nshort)/2; - - transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t)); - - window_long = fb->long_window[window_shape]; - window_long_prev = fb->long_window[window_shape_prev]; - window_short = fb->short_window[window_shape]; - window_short_prev = fb->short_window[window_shape_prev]; - - switch (window_sequence) - { - case ONLY_LONG_SEQUENCE: - imdct_ssr(fb, freq_in, transf_buf, 2*nlong); - for (i = nlong-1; i >= 0; i--) - { - time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); - time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); - } - break; - - case LONG_START_SEQUENCE: - imdct_ssr(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nlong; i++) - time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); - for (i = 0; i < nflat_ls; i++) - time_out[nlong+i] = transf_buf[nlong+i]; - for (i = 0; i < nshort; i++) - time_out[nlong+nflat_ls+i] = MUL_R_C(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); - for (i = 0; i < nflat_ls; i++) - time_out[nlong+nflat_ls+nshort+i] = 0; - break; - - case EIGHT_SHORT_SEQUENCE: - imdct_ssr(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort); - imdct_ssr(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort); - imdct_ssr(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort); - imdct_ssr(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort); - imdct_ssr(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort); - imdct_ssr(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort); - imdct_ssr(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort); - imdct_ssr(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort); - for(i = nshort-1; i >= 0; i--) - { - time_out[i+0*nshort] = MUL_R_C(transf_buf[nshort*0+i],window_short_prev[i]); - time_out[i+1*nshort] = MUL_R_C(transf_buf[nshort*1+i],window_short[i]); - time_out[i+2*nshort] = MUL_R_C(transf_buf[nshort*2+i],window_short_prev[i]); - time_out[i+3*nshort] = MUL_R_C(transf_buf[nshort*3+i],window_short[i]); - time_out[i+4*nshort] = MUL_R_C(transf_buf[nshort*4+i],window_short_prev[i]); - time_out[i+5*nshort] = MUL_R_C(transf_buf[nshort*5+i],window_short[i]); - time_out[i+6*nshort] = MUL_R_C(transf_buf[nshort*6+i],window_short_prev[i]); - time_out[i+7*nshort] = MUL_R_C(transf_buf[nshort*7+i],window_short[i]); - time_out[i+8*nshort] = MUL_R_C(transf_buf[nshort*8+i],window_short_prev[i]); - time_out[i+9*nshort] = MUL_R_C(transf_buf[nshort*9+i],window_short[i]); - time_out[i+10*nshort] = MUL_R_C(transf_buf[nshort*10+i],window_short_prev[i]); - time_out[i+11*nshort] = MUL_R_C(transf_buf[nshort*11+i],window_short[i]); - time_out[i+12*nshort] = MUL_R_C(transf_buf[nshort*12+i],window_short_prev[i]); - time_out[i+13*nshort] = MUL_R_C(transf_buf[nshort*13+i],window_short[i]); - time_out[i+14*nshort] = MUL_R_C(transf_buf[nshort*14+i],window_short_prev[i]); - time_out[i+15*nshort] = MUL_R_C(transf_buf[nshort*15+i],window_short[i]); - } - break; - - case LONG_STOP_SEQUENCE: - imdct_ssr(fb, freq_in, transf_buf, 2*nlong); - for (i = 0; i < nflat_ls; i++) - time_out[i] = 0; - for (i = 0; i < nshort; i++) - time_out[nflat_ls+i] = MUL_R_C(transf_buf[nflat_ls+i],window_short_prev[i]); - for (i = 0; i < nflat_ls; i++) - time_out[nflat_ls+nshort+i] = transf_buf[nflat_ls+nshort+i]; - for (i = 0; i < nlong; i++) - time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); - break; - } - - faad_free(transf_buf); -} - - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ssr_fb.c,v 1.17 2007/11/01 12:33:36 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SSR_DEC + +#include +#include +#include "syntax.h" +#include "filtbank.h" +#include "mdct.h" +#include "ssr_fb.h" +#include "ssr_win.h" + +fb_info *ssr_filter_bank_init(uint16_t frame_len) +{ + uint16_t nshort = frame_len/8; + + fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); + memset(fb, 0, sizeof(fb_info)); + + /* normal */ + fb->mdct256 = faad_mdct_init(2*nshort); + fb->mdct2048 = faad_mdct_init(2*frame_len); + + fb->long_window[0] = sine_long_256; + fb->short_window[0] = sine_short_32; + fb->long_window[1] = kbd_long_256; + fb->short_window[1] = kbd_short_32; + + return fb; +} + +void ssr_filter_bank_end(fb_info *fb) +{ + faad_mdct_end(fb->mdct256); + faad_mdct_end(fb->mdct2048); + + if (fb) faad_free(fb); +} + +static INLINE void imdct_ssr(fb_info *fb, real_t *in_data, + real_t *out_data, uint16_t len) +{ + mdct_info *mdct; + + switch (len) + { + case 512: + mdct = fb->mdct2048; + break; + case 64: + mdct = fb->mdct256; + break; + } + + faad_imdct(mdct, in_data, out_data); +} + +/* NON-overlapping inverse filterbank for use with SSR */ +void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, + uint8_t window_shape_prev, real_t *freq_in, + real_t *time_out, uint16_t frame_len) +{ + int16_t i; + real_t *transf_buf; + + real_t *window_long; + real_t *window_long_prev; + real_t *window_short; + real_t *window_short_prev; + + uint16_t nlong = frame_len; + uint16_t nshort = frame_len/8; + uint16_t trans = nshort/2; + + uint16_t nflat_ls = (nlong-nshort)/2; + + transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t)); + + window_long = fb->long_window[window_shape]; + window_long_prev = fb->long_window[window_shape_prev]; + window_short = fb->short_window[window_shape]; + window_short_prev = fb->short_window[window_shape_prev]; + + switch (window_sequence) + { + case ONLY_LONG_SEQUENCE: + imdct_ssr(fb, freq_in, transf_buf, 2*nlong); + for (i = nlong-1; i >= 0; i--) + { + time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); + time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); + } + break; + + case LONG_START_SEQUENCE: + imdct_ssr(fb, freq_in, transf_buf, 2*nlong); + for (i = 0; i < nlong; i++) + time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); + for (i = 0; i < nflat_ls; i++) + time_out[nlong+i] = transf_buf[nlong+i]; + for (i = 0; i < nshort; i++) + time_out[nlong+nflat_ls+i] = MUL_R_C(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); + for (i = 0; i < nflat_ls; i++) + time_out[nlong+nflat_ls+nshort+i] = 0; + break; + + case EIGHT_SHORT_SEQUENCE: + imdct_ssr(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort); + imdct_ssr(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort); + imdct_ssr(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort); + imdct_ssr(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort); + imdct_ssr(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort); + imdct_ssr(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort); + imdct_ssr(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort); + imdct_ssr(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort); + for(i = nshort-1; i >= 0; i--) + { + time_out[i+0*nshort] = MUL_R_C(transf_buf[nshort*0+i],window_short_prev[i]); + time_out[i+1*nshort] = MUL_R_C(transf_buf[nshort*1+i],window_short[i]); + time_out[i+2*nshort] = MUL_R_C(transf_buf[nshort*2+i],window_short_prev[i]); + time_out[i+3*nshort] = MUL_R_C(transf_buf[nshort*3+i],window_short[i]); + time_out[i+4*nshort] = MUL_R_C(transf_buf[nshort*4+i],window_short_prev[i]); + time_out[i+5*nshort] = MUL_R_C(transf_buf[nshort*5+i],window_short[i]); + time_out[i+6*nshort] = MUL_R_C(transf_buf[nshort*6+i],window_short_prev[i]); + time_out[i+7*nshort] = MUL_R_C(transf_buf[nshort*7+i],window_short[i]); + time_out[i+8*nshort] = MUL_R_C(transf_buf[nshort*8+i],window_short_prev[i]); + time_out[i+9*nshort] = MUL_R_C(transf_buf[nshort*9+i],window_short[i]); + time_out[i+10*nshort] = MUL_R_C(transf_buf[nshort*10+i],window_short_prev[i]); + time_out[i+11*nshort] = MUL_R_C(transf_buf[nshort*11+i],window_short[i]); + time_out[i+12*nshort] = MUL_R_C(transf_buf[nshort*12+i],window_short_prev[i]); + time_out[i+13*nshort] = MUL_R_C(transf_buf[nshort*13+i],window_short[i]); + time_out[i+14*nshort] = MUL_R_C(transf_buf[nshort*14+i],window_short_prev[i]); + time_out[i+15*nshort] = MUL_R_C(transf_buf[nshort*15+i],window_short[i]); + } + break; + + case LONG_STOP_SEQUENCE: + imdct_ssr(fb, freq_in, transf_buf, 2*nlong); + for (i = 0; i < nflat_ls; i++) + time_out[i] = 0; + for (i = 0; i < nshort; i++) + time_out[nflat_ls+i] = MUL_R_C(transf_buf[nflat_ls+i],window_short_prev[i]); + for (i = 0; i < nflat_ls; i++) + time_out[nflat_ls+nshort+i] = transf_buf[nflat_ls+nshort+i]; + for (i = 0; i < nlong; i++) + time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); + break; + } + + faad_free(transf_buf); +} + + +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr_fb.h b/src/contrib/aacdecoder/libfaad/ssr_fb.h old mode 100644 new mode 100755 index d85f71e31..3ae4eb04b --- a/src/contrib/aacdecoder/libfaad/ssr_fb.h +++ b/src/contrib/aacdecoder/libfaad/ssr_fb.h @@ -1,44 +1,53 @@ -/* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -** -** $Id: ssr_fb.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SSR_FB_H__ -#define __SSR_FB_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -fb_info *ssr_filter_bank_init(uint16_t frame_len); -void ssr_filter_bank_end(fb_info *fb); - -/*non overlapping inverse filterbank */ -void ssr_ifilter_bank(fb_info *fb, - uint8_t window_sequence, - uint8_t window_shape, - uint8_t window_shape_prev, - real_t *freq_in, - real_t *time_out, - uint16_t frame_len); - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. +** +** $Id: ssr_fb.h,v 1.16 2007/11/01 12:33:36 menno Exp $ +**/ + +#ifndef __SSR_FB_H__ +#define __SSR_FB_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +fb_info *ssr_filter_bank_init(uint16_t frame_len); +void ssr_filter_bank_end(fb_info *fb); + +/*non overlapping inverse filterbank */ +void ssr_ifilter_bank(fb_info *fb, + uint8_t window_sequence, + uint8_t window_shape, + uint8_t window_shape_prev, + real_t *freq_in, + real_t *time_out, + uint16_t frame_len); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr_ipqf.c b/src/contrib/aacdecoder/libfaad/ssr_ipqf.c old mode 100644 new mode 100755 index 289da04d2..6963427c9 --- a/src/contrib/aacdecoder/libfaad/ssr_ipqf.c +++ b/src/contrib/aacdecoder/libfaad/ssr_ipqf.c @@ -1,188 +1,191 @@ -/* -** 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: ssr_ipqf.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#ifdef SSR_DEC - -#include "ssr.h" -#include "ssr_ipqf.h" - -static real_t **app_pqfbuf; -static real_t **pp_q0, **pp_t0, **pp_t1; - -void gc_set_protopqf(real_t *p_proto) -{ - int j; - static real_t a_half[48] = - { - 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05, - -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04, - -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04, - -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04, - 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03, - 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04, - -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03, - -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03, - -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03, - 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03, - 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03, - -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02, - -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02, - -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02, - 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02, - 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012 - }; - - for (j = 0; j < 48; ++j) - { - p_proto[j] = p_proto[95-j] = a_half[j]; - } -} - -void gc_setcoef_eff_pqfsyn(int mm, - int kk, - real_t *p_proto, - real_t ***ppp_q0, - real_t ***ppp_t0, - real_t ***ppp_t1) -{ - int i, k, n; - real_t w; - - /* Set 1st Mul&Acc Coef's */ - *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *)); - for (n = 0; n < mm; ++n) - { - (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t)); - } - for (n = 0; n < mm/2; ++n) - { - for (i = 0; i < mm; ++i) - { - w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm); - (*ppp_q0)[n][i] = 2.0 * cos((real_t) w); - - w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm); - (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w); - } - } - - /* Set 2nd Mul&Acc Coef's */ - *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *)); - *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *)); - for (n = 0; n < mm; ++n) - { - (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t)); - (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t)); - } - for (n = 0; n < mm; ++n) - { - for (k = 0; k < kk; ++k) - { - (*ppp_t0)[n][k] = mm * p_proto[2*k *mm + n]; - (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n]; - - if (k%2 != 0) - { - (*ppp_t0)[n][k] = -(*ppp_t0)[n][k]; - (*ppp_t1)[n][k] = -(*ppp_t1)[n][k]; - } - } - } -} - -void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, - real_t buffer[SSR_BANDS][96/4], - uint16_t frame_len, uint8_t bands) -{ - static int initFlag = 0; - real_t a_pqfproto[PQFTAPS]; - - int i; - - if (initFlag == 0) - { - gc_set_protopqf(a_pqfproto); - gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto, - &pp_q0, &pp_t0, &pp_t1); - initFlag = 1; - } - - for (i = 0; i < frame_len / SSR_BANDS; i++) - { - int l, n, k; - int mm = SSR_BANDS; - int kk = PQFTAPS/(2*SSR_BANDS); - - for (n = 0; n < mm; n++) - { - for (k = 0; k < 2*kk-1; k++) - { - buffer[n][k] = buffer[n][k+1]; - } - } - - for (n = 0; n < mm; n++) - { - real_t acc = 0.0; - for (l = 0; l < mm; l++) - { - acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i]; - } - buffer[n][2*kk-1] = acc; - } - - for (n = 0; n < mm/2; n++) - { - real_t acc = 0.0; - for (k = 0; k < kk; k++) - { - acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k]; - } - for (k = 0; k < kk; ++k) - { - acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k]; - } - out_data[i*SSR_BANDS + n] = acc; - - acc = 0.0; - for (k = 0; k < kk; k++) - { - acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k]; - } - for (k = 0; k < kk; k++) - { - acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k]; - } - out_data[i*SSR_BANDS + mm-1-n] = acc; - } - } -} - -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: ssr_ipqf.c,v 1.18 2007/11/01 12:33:39 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#ifdef SSR_DEC + +#include "ssr.h" +#include "ssr_ipqf.h" + +static real_t **app_pqfbuf; +static real_t **pp_q0, **pp_t0, **pp_t1; + +void gc_set_protopqf(real_t *p_proto) +{ + int j; + static real_t a_half[48] = + { + 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05, + -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04, + -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04, + -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04, + 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03, + 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04, + -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03, + -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03, + -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03, + 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03, + 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03, + -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02, + -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02, + -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02, + 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02, + 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012 + }; + + for (j = 0; j < 48; ++j) + { + p_proto[j] = p_proto[95-j] = a_half[j]; + } +} + +void gc_setcoef_eff_pqfsyn(int mm, + int kk, + real_t *p_proto, + real_t ***ppp_q0, + real_t ***ppp_t0, + real_t ***ppp_t1) +{ + int i, k, n; + real_t w; + + /* Set 1st Mul&Acc Coef's */ + *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *)); + for (n = 0; n < mm; ++n) + { + (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t)); + } + for (n = 0; n < mm/2; ++n) + { + for (i = 0; i < mm; ++i) + { + w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm); + (*ppp_q0)[n][i] = 2.0 * cos((real_t) w); + + w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm); + (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w); + } + } + + /* Set 2nd Mul&Acc Coef's */ + *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *)); + *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *)); + for (n = 0; n < mm; ++n) + { + (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t)); + (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t)); + } + for (n = 0; n < mm; ++n) + { + for (k = 0; k < kk; ++k) + { + (*ppp_t0)[n][k] = mm * p_proto[2*k *mm + n]; + (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n]; + + if (k%2 != 0) + { + (*ppp_t0)[n][k] = -(*ppp_t0)[n][k]; + (*ppp_t1)[n][k] = -(*ppp_t1)[n][k]; + } + } + } +} + +void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, + real_t buffer[SSR_BANDS][96/4], + uint16_t frame_len, uint8_t bands) +{ + static int initFlag = 0; + real_t a_pqfproto[PQFTAPS]; + + int i; + + if (initFlag == 0) + { + gc_set_protopqf(a_pqfproto); + gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto, + &pp_q0, &pp_t0, &pp_t1); + initFlag = 1; + } + + for (i = 0; i < frame_len / SSR_BANDS; i++) + { + int l, n, k; + int mm = SSR_BANDS; + int kk = PQFTAPS/(2*SSR_BANDS); + + for (n = 0; n < mm; n++) + { + for (k = 0; k < 2*kk-1; k++) + { + buffer[n][k] = buffer[n][k+1]; + } + } + + for (n = 0; n < mm; n++) + { + real_t acc = 0.0; + for (l = 0; l < mm; l++) + { + acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i]; + } + buffer[n][2*kk-1] = acc; + } + + for (n = 0; n < mm/2; n++) + { + real_t acc = 0.0; + for (k = 0; k < kk; k++) + { + acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k]; + } + for (k = 0; k < kk; ++k) + { + acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k]; + } + out_data[i*SSR_BANDS + n] = acc; + + acc = 0.0; + for (k = 0; k < kk; k++) + { + acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k]; + } + for (k = 0; k < kk; k++) + { + acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k]; + } + out_data[i*SSR_BANDS + mm-1-n] = acc; + } + } +} + +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr_ipqf.h b/src/contrib/aacdecoder/libfaad/ssr_ipqf.h old mode 100644 new mode 100755 index 37602e89c..47299219c --- a/src/contrib/aacdecoder/libfaad/ssr_ipqf.h +++ b/src/contrib/aacdecoder/libfaad/ssr_ipqf.h @@ -1,37 +1,46 @@ -/* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -** -** $Id: ssr_ipqf.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SSR_IPQF_H__ -#define __SSR_IPQF_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, - real_t buffer[SSR_BANDS][96/4], - uint16_t frame_len, uint8_t bands); - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. +** +** $Id: ssr_ipqf.h,v 1.17 2007/11/01 12:33:39 menno Exp $ +**/ + +#ifndef __SSR_IPQF_H__ +#define __SSR_IPQF_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, + real_t buffer[SSR_BANDS][96/4], + uint16_t frame_len, uint8_t bands); + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/ssr_win.h b/src/contrib/aacdecoder/libfaad/ssr_win.h old mode 100644 new mode 100755 index 7886b4d3f..64b0f98bf --- a/src/contrib/aacdecoder/libfaad/ssr_win.h +++ b/src/contrib/aacdecoder/libfaad/ssr_win.h @@ -1,626 +1,635 @@ -/* -** FAAD - Freeware Advanced Audio Decoder -** Copyright (C) 2002 M. Bakker -** -** This program is free software; you can redistribute it and/or modify -** it under the terms of the GNU General Public License as published by -** the Free Software Foundation; either version 2 of the License, or -** (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software -** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -** -** $Id: ssr_win.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SSR_WIN_H__ -#define __SSR_WIN_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif - -static real_t sine_short_32[] = { - 0.0245412290, - 0.0735645667, - 0.1224106774, - 0.1709618866, - 0.2191012502, - 0.2667127550, - 0.3136817515, - 0.3598950505, - 0.4052413106, - 0.4496113360, - 0.4928981960, - 0.5349976420, - 0.5758082271, - 0.6152316332, - 0.6531728506, - 0.6895405650, - 0.7242470980, - 0.7572088838, - 0.7883464694, - 0.8175848126, - 0.8448535800, - 0.8700870275, - 0.8932242990, - 0.9142097831, - 0.9329928160, - 0.9495282173, - 0.9637760520, - 0.9757021666, - 0.9852776527, - 0.9924795628, - 0.9972904325, - 0.9996988177 -}; - -static real_t sine_long_256[] = { - 0.0030679568, - 0.0092037553, - 0.0153392069, - 0.0214740802, - 0.0276081469, - 0.0337411724, - 0.0398729295, - 0.0460031852, - 0.0521317050, - 0.0582582653, - 0.0643826351, - 0.0705045760, - 0.0766238645, - 0.0827402696, - 0.0888535529, - 0.0949634984, - 0.1010698676, - 0.1071724296, - 0.1132709533, - 0.1193652153, - 0.1254549921, - 0.1315400302, - 0.1376201212, - 0.1436950415, - 0.1497645378, - 0.1558284014, - 0.1618863940, - 0.1679383069, - 0.1739838719, - 0.1800229102, - 0.1860551536, - 0.1920804083, - 0.1980984211, - 0.2041089684, - 0.2101118416, - 0.2161068022, - 0.2220936269, - 0.2280720919, - 0.2340419590, - 0.2400030345, - 0.2459550500, - 0.2518978119, - 0.2578310966, - 0.2637546957, - 0.2696683407, - 0.2755718231, - 0.2814649343, - 0.2873474658, - 0.2932191789, - 0.2990798354, - 0.3049292266, - 0.3107671738, - 0.3165933788, - 0.3224076927, - 0.3282098472, - 0.3339996636, - 0.3397769034, - 0.3455413282, - 0.3512927592, - 0.3570309579, - 0.3627557456, - 0.3684668541, - 0.3741640747, - 0.3798472285, - 0.3855160773, - 0.3911703825, - 0.3968099952, - 0.4024346471, - 0.4080441594, - 0.4136383235, - 0.4192169011, - 0.4247796834, - 0.4303264916, - 0.4358570874, - 0.4413712919, - 0.4468688369, - 0.4523496032, - 0.4578133225, - 0.4632597864, - 0.4686888456, - 0.4741002321, - 0.4794937670, - 0.4848692715, - 0.4902265072, - 0.4955652654, - 0.5008853674, - 0.5061866641, - 0.5114688873, - 0.5167317986, - 0.5219752789, - 0.5271991491, - 0.5324031115, - 0.5375871062, - 0.5427507758, - 0.5478940606, - 0.5530167222, - 0.5581185222, - 0.5631993413, - 0.5682589412, - 0.5732972026, - 0.5783138275, - 0.5833086967, - 0.5882815719, - 0.5932323337, - 0.5981607437, - 0.6030666232, - 0.6079497933, - 0.6128100753, - 0.6176473498, - 0.6224613190, - 0.6272518039, - 0.6320187449, - 0.6367619038, - 0.6414810419, - 0.6461760402, - 0.6508467197, - 0.6554928422, - 0.6601143479, - 0.6647109985, - 0.6692826152, - 0.6738290191, - 0.6783500314, - 0.6828455329, - 0.6873153448, - 0.6917592883, - 0.6961771250, - 0.7005687952, - 0.7049341202, - 0.7092728615, - 0.7135848999, - 0.7178700566, - 0.7221282125, - 0.7263591886, - 0.7305628061, - 0.7347388864, - 0.7388873696, - 0.7430079579, - 0.7471006513, - 0.7511651516, - 0.7552013993, - 0.7592092156, - 0.7631884217, - 0.7671388984, - 0.7710605264, - 0.7749531269, - 0.7788165212, - 0.7826505899, - 0.7864552140, - 0.7902302146, - 0.7939754725, - 0.7976908684, - 0.8013761640, - 0.8050313592, - 0.8086562157, - 0.8122506142, - 0.8158144355, - 0.8193475604, - 0.8228498101, - 0.8263210654, - 0.8297612667, - 0.8331701756, - 0.8365477324, - 0.8398938179, - 0.8432082534, - 0.8464909792, - 0.8497417569, - 0.8529606462, - 0.8561473489, - 0.8593018055, - 0.8624239564, - 0.8655136228, - 0.8685707450, - 0.8715950847, - 0.8745866418, - 0.8775452971, - 0.8804709315, - 0.8833633661, - 0.8862225413, - 0.8890483975, - 0.8918406963, - 0.8945994973, - 0.8973246217, - 0.9000158906, - 0.9026733041, - 0.9052967429, - 0.9078861475, - 0.9104412794, - 0.9129621983, - 0.9154487252, - 0.9179008007, - 0.9203183055, - 0.9227011204, - 0.9250492454, - 0.9273625612, - 0.9296408892, - 0.9318842888, - 0.9340925813, - 0.9362657070, - 0.9384035468, - 0.9405061007, - 0.9425731897, - 0.9446048737, - 0.9466009140, - 0.9485613704, - 0.9504860640, - 0.9523749948, - 0.9542281032, - 0.9560452700, - 0.9578264356, - 0.9595715404, - 0.9612805247, - 0.9629532695, - 0.9645897746, - 0.9661900401, - 0.9677538276, - 0.9692812562, - 0.9707721472, - 0.9722265005, - 0.9736442566, - 0.9750253558, - 0.9763697386, - 0.9776773453, - 0.9789481759, - 0.9801821709, - 0.9813792109, - 0.9825392962, - 0.9836624265, - 0.9847484827, - 0.9857975245, - 0.9868094325, - 0.9877841473, - 0.9887216687, - 0.9896219969, - 0.9904850721, - 0.9913108945, - 0.9920993447, - 0.9928504229, - 0.9935641289, - 0.9942404628, - 0.9948793054, - 0.9954807758, - 0.9960446954, - 0.9965711236, - 0.9970600605, - 0.9975114465, - 0.9979252815, - 0.9983015656, - 0.9986402392, - 0.9989413023, - 0.9992047548, - 0.9994305968, - 0.9996188283, - 0.9997693896, - 0.9998823404, - 0.9999576211, - 0.9999952912 -}; - -static real_t kbd_short_32[] = { - 0.0000875914060105, - 0.0009321760265333, - 0.0032114611466596, - 0.0081009893216786, - 0.0171240286619181, - 0.0320720743527833, - 0.0548307856028528, - 0.0871361822564870, - 0.1302923415174603, - 0.1848955425508276, - 0.2506163195331889, - 0.3260874142923209, - 0.4089316830907141, - 0.4959414909423747, - 0.5833939894958904, - 0.6674601983218376, - 0.7446454751465113, - 0.8121892962974020, - 0.8683559394406505, - 0.9125649996381605, - 0.9453396205809574, - 0.9680864942677585, - 0.9827581789763112, - 0.9914756203467121, - 0.9961964092194694, - 0.9984956609571091, - 0.9994855586984285, - 0.9998533730714648, - 0.9999671864476404, - 0.9999948432453556, - 0.9999995655238333, - 0.9999999961638728 -}; - - -static real_t kbd_long_256[] = { - 0.0005851230124487, - 0.0009642149851497, - 0.0013558207534965, - 0.0017771849644394, - 0.0022352533849672, - 0.0027342299070304, - 0.0032773001022195, - 0.0038671998069216, - 0.0045064443384152, - 0.0051974336885144, - 0.0059425050016407, - 0.0067439602523141, - 0.0076040812644888, - 0.0085251378135895, - 0.0095093917383048, - 0.0105590986429280, - 0.0116765080854300, - 0.0128638627792770, - 0.0141233971318631, - 0.0154573353235409, - 0.0168678890600951, - 0.0183572550877256, - 0.0199276125319803, - 0.0215811201042484, - 0.0233199132076965, - 0.0251461009666641, - 0.0270617631981826, - 0.0290689473405856, - 0.0311696653515848, - 0.0333658905863535, - 0.0356595546648444, - 0.0380525443366107, - 0.0405466983507029, - 0.0431438043376910, - 0.0458455957104702, - 0.0486537485902075, - 0.0515698787635492, - 0.0545955386770205, - 0.0577322144743916, - 0.0609813230826460, - 0.0643442093520723, - 0.0678221432558827, - 0.0714163171546603, - 0.0751278431308314, - 0.0789577503982528, - 0.0829069827918993, - 0.0869763963425241, - 0.0911667569410503, - 0.0954787380973307, - 0.0999129187977865, - 0.1044697814663005, - 0.1091497100326053, - 0.1139529881122542, - 0.1188797973021148, - 0.1239302155951605, - 0.1291042159181728, - 0.1344016647957880, - 0.1398223211441467, - 0.1453658351972151, - 0.1510317475686540, - 0.1568194884519144, - 0.1627283769610327, - 0.1687576206143887, - 0.1749063149634756, - 0.1811734433685097, - 0.1875578769224857, - 0.1940583745250518, - 0.2006735831073503, - 0.2074020380087318, - 0.2142421635060113, - 0.2211922734956977, - 0.2282505723293797, - 0.2354151558022098, - 0.2426840122941792, - 0.2500550240636293, - 0.2575259686921987, - 0.2650945206801527, - 0.2727582531907993, - 0.2805146399424422, - 0.2883610572460804, - 0.2962947861868143, - 0.3043130149466800, - 0.3124128412663888, - 0.3205912750432127, - 0.3288452410620226, - 0.3371715818562547, - 0.3455670606953511, - 0.3540283646950029, - 0.3625521080463003, - 0.3711348353596863, - 0.3797730251194006, - 0.3884630932439016, - 0.3972013967475546, - 0.4059842374986933, - 0.4148078660689724, - 0.4236684856687616, - 0.4325622561631607, - 0.4414852981630577, - 0.4504336971855032, - 0.4594035078775303, - 0.4683907582974173, - 0.4773914542472655, - 0.4864015836506502, - 0.4954171209689973, - 0.5044340316502417, - 0.5134482766032377, - 0.5224558166913167, - 0.5314526172383208, - 0.5404346525403849, - 0.5493979103766972, - 0.5583383965124314, - 0.5672521391870222, - 0.5761351935809411, - 0.5849836462541291, - 0.5937936195492526, - 0.6025612759529649, - 0.6112828224083939, - 0.6199545145721097, - 0.6285726610088878, - 0.6371336273176413, - 0.6456338401819751, - 0.6540697913388968, - 0.6624380414593221, - 0.6707352239341151, - 0.6789580485595255, - 0.6871033051160131, - 0.6951678668345944, - 0.7031486937449871, - 0.7110428359000029, - 0.7188474364707993, - 0.7265597347077880, - 0.7341770687621900, - 0.7416968783634273, - 0.7491167073477523, - 0.7564342060337386, - 0.7636471334404891, - 0.7707533593446514, - 0.7777508661725849, - 0.7846377507242818, - 0.7914122257259034, - 0.7980726212080798, - 0.8046173857073919, - 0.8110450872887550, - 0.8173544143867162, - 0.8235441764639875, - 0.8296133044858474, - 0.8355608512093652, - 0.8413859912867303, - 0.8470880211822968, - 0.8526663589032990, - 0.8581205435445334, - 0.8634502346476508, - 0.8686552113760616, - 0.8737353715068081, - 0.8786907302411250, - 0.8835214188357692, - 0.8882276830575707, - 0.8928098814640207, - 0.8972684835130879, - 0.9016040675058185, - 0.9058173183656508, - 0.9099090252587376, - 0.9138800790599416, - 0.9177314696695282, - 0.9214642831859411, - 0.9250796989403991, - 0.9285789863994010, - 0.9319635019415643, - 0.9352346855155568, - 0.9383940571861993, - 0.9414432135761304, - 0.9443838242107182, - 0.9472176277741918, - 0.9499464282852282, - 0.9525720912004834, - 0.9550965394547873, - 0.9575217494469370, - 0.9598497469802043, - 0.9620826031668507, - 0.9642224303060783, - 0.9662713777449607, - 0.9682316277319895, - 0.9701053912729269, - 0.9718949039986892, - 0.9736024220549734, - 0.9752302180233160, - 0.9767805768831932, - 0.9782557920246753, - 0.9796581613210076, - 0.9809899832703159, - 0.9822535532154261, - 0.9834511596505429, - 0.9845850806232530, - 0.9856575802399989, - 0.9866709052828243, - 0.9876272819448033, - 0.9885289126911557, - 0.9893779732525968, - 0.9901766097569984, - 0.9909269360049311, - 0.9916310308941294, - 0.9922909359973702, - 0.9929086532976777, - 0.9934861430841844, - 0.9940253220113651, - 0.9945280613237534, - 0.9949961852476154, - 0.9954314695504363, - 0.9958356402684387, - 0.9962103726017252, - 0.9965572899760172, - 0.9968779632693499, - 0.9971739102014799, - 0.9974465948831872, - 0.9976974275220812, - 0.9979277642809907, - 0.9981389072844972, - 0.9983321047686901, - 0.9985085513687731, - 0.9986693885387259, - 0.9988157050968516, - 0.9989485378906924, - 0.9990688725744943, - 0.9991776444921379, - 0.9992757396582338, - 0.9993639958299003, - 0.9994432036616085, - 0.9995141079353859, - 0.9995774088586188, - 0.9996337634216871, - 0.9996837868076957, - 0.9997280538466377, - 0.9997671005064359, - 0.9998014254134544, - 0.9998314913952471, - 0.9998577270385304, - 0.9998805282555989, - 0.9999002598526793, - 0.9999172570940037, - 0.9999318272557038, - 0.9999442511639580, - 0.9999547847121726, - 0.9999636603523446, - 0.9999710885561258, - 0.9999772592414866, - 0.9999823431612708, - 0.9999864932503106, - 0.9999898459281599, - 0.9999925223548691, - 0.9999946296375997, - 0.9999962619864214, - 0.9999975018180320, - 0.9999984208055542, - 0.9999990808746198, - 0.9999995351446231, - 0.9999998288155155 -}; - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. +** +** $Id: ssr_win.h,v 1.16 2007/11/01 12:33:39 menno Exp $ +**/ + +#ifndef __SSR_WIN_H__ +#define __SSR_WIN_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif + +static real_t sine_short_32[] = { + 0.0245412290, + 0.0735645667, + 0.1224106774, + 0.1709618866, + 0.2191012502, + 0.2667127550, + 0.3136817515, + 0.3598950505, + 0.4052413106, + 0.4496113360, + 0.4928981960, + 0.5349976420, + 0.5758082271, + 0.6152316332, + 0.6531728506, + 0.6895405650, + 0.7242470980, + 0.7572088838, + 0.7883464694, + 0.8175848126, + 0.8448535800, + 0.8700870275, + 0.8932242990, + 0.9142097831, + 0.9329928160, + 0.9495282173, + 0.9637760520, + 0.9757021666, + 0.9852776527, + 0.9924795628, + 0.9972904325, + 0.9996988177 +}; + +static real_t sine_long_256[] = { + 0.0030679568, + 0.0092037553, + 0.0153392069, + 0.0214740802, + 0.0276081469, + 0.0337411724, + 0.0398729295, + 0.0460031852, + 0.0521317050, + 0.0582582653, + 0.0643826351, + 0.0705045760, + 0.0766238645, + 0.0827402696, + 0.0888535529, + 0.0949634984, + 0.1010698676, + 0.1071724296, + 0.1132709533, + 0.1193652153, + 0.1254549921, + 0.1315400302, + 0.1376201212, + 0.1436950415, + 0.1497645378, + 0.1558284014, + 0.1618863940, + 0.1679383069, + 0.1739838719, + 0.1800229102, + 0.1860551536, + 0.1920804083, + 0.1980984211, + 0.2041089684, + 0.2101118416, + 0.2161068022, + 0.2220936269, + 0.2280720919, + 0.2340419590, + 0.2400030345, + 0.2459550500, + 0.2518978119, + 0.2578310966, + 0.2637546957, + 0.2696683407, + 0.2755718231, + 0.2814649343, + 0.2873474658, + 0.2932191789, + 0.2990798354, + 0.3049292266, + 0.3107671738, + 0.3165933788, + 0.3224076927, + 0.3282098472, + 0.3339996636, + 0.3397769034, + 0.3455413282, + 0.3512927592, + 0.3570309579, + 0.3627557456, + 0.3684668541, + 0.3741640747, + 0.3798472285, + 0.3855160773, + 0.3911703825, + 0.3968099952, + 0.4024346471, + 0.4080441594, + 0.4136383235, + 0.4192169011, + 0.4247796834, + 0.4303264916, + 0.4358570874, + 0.4413712919, + 0.4468688369, + 0.4523496032, + 0.4578133225, + 0.4632597864, + 0.4686888456, + 0.4741002321, + 0.4794937670, + 0.4848692715, + 0.4902265072, + 0.4955652654, + 0.5008853674, + 0.5061866641, + 0.5114688873, + 0.5167317986, + 0.5219752789, + 0.5271991491, + 0.5324031115, + 0.5375871062, + 0.5427507758, + 0.5478940606, + 0.5530167222, + 0.5581185222, + 0.5631993413, + 0.5682589412, + 0.5732972026, + 0.5783138275, + 0.5833086967, + 0.5882815719, + 0.5932323337, + 0.5981607437, + 0.6030666232, + 0.6079497933, + 0.6128100753, + 0.6176473498, + 0.6224613190, + 0.6272518039, + 0.6320187449, + 0.6367619038, + 0.6414810419, + 0.6461760402, + 0.6508467197, + 0.6554928422, + 0.6601143479, + 0.6647109985, + 0.6692826152, + 0.6738290191, + 0.6783500314, + 0.6828455329, + 0.6873153448, + 0.6917592883, + 0.6961771250, + 0.7005687952, + 0.7049341202, + 0.7092728615, + 0.7135848999, + 0.7178700566, + 0.7221282125, + 0.7263591886, + 0.7305628061, + 0.7347388864, + 0.7388873696, + 0.7430079579, + 0.7471006513, + 0.7511651516, + 0.7552013993, + 0.7592092156, + 0.7631884217, + 0.7671388984, + 0.7710605264, + 0.7749531269, + 0.7788165212, + 0.7826505899, + 0.7864552140, + 0.7902302146, + 0.7939754725, + 0.7976908684, + 0.8013761640, + 0.8050313592, + 0.8086562157, + 0.8122506142, + 0.8158144355, + 0.8193475604, + 0.8228498101, + 0.8263210654, + 0.8297612667, + 0.8331701756, + 0.8365477324, + 0.8398938179, + 0.8432082534, + 0.8464909792, + 0.8497417569, + 0.8529606462, + 0.8561473489, + 0.8593018055, + 0.8624239564, + 0.8655136228, + 0.8685707450, + 0.8715950847, + 0.8745866418, + 0.8775452971, + 0.8804709315, + 0.8833633661, + 0.8862225413, + 0.8890483975, + 0.8918406963, + 0.8945994973, + 0.8973246217, + 0.9000158906, + 0.9026733041, + 0.9052967429, + 0.9078861475, + 0.9104412794, + 0.9129621983, + 0.9154487252, + 0.9179008007, + 0.9203183055, + 0.9227011204, + 0.9250492454, + 0.9273625612, + 0.9296408892, + 0.9318842888, + 0.9340925813, + 0.9362657070, + 0.9384035468, + 0.9405061007, + 0.9425731897, + 0.9446048737, + 0.9466009140, + 0.9485613704, + 0.9504860640, + 0.9523749948, + 0.9542281032, + 0.9560452700, + 0.9578264356, + 0.9595715404, + 0.9612805247, + 0.9629532695, + 0.9645897746, + 0.9661900401, + 0.9677538276, + 0.9692812562, + 0.9707721472, + 0.9722265005, + 0.9736442566, + 0.9750253558, + 0.9763697386, + 0.9776773453, + 0.9789481759, + 0.9801821709, + 0.9813792109, + 0.9825392962, + 0.9836624265, + 0.9847484827, + 0.9857975245, + 0.9868094325, + 0.9877841473, + 0.9887216687, + 0.9896219969, + 0.9904850721, + 0.9913108945, + 0.9920993447, + 0.9928504229, + 0.9935641289, + 0.9942404628, + 0.9948793054, + 0.9954807758, + 0.9960446954, + 0.9965711236, + 0.9970600605, + 0.9975114465, + 0.9979252815, + 0.9983015656, + 0.9986402392, + 0.9989413023, + 0.9992047548, + 0.9994305968, + 0.9996188283, + 0.9997693896, + 0.9998823404, + 0.9999576211, + 0.9999952912 +}; + +static real_t kbd_short_32[] = { + 0.0000875914060105, + 0.0009321760265333, + 0.0032114611466596, + 0.0081009893216786, + 0.0171240286619181, + 0.0320720743527833, + 0.0548307856028528, + 0.0871361822564870, + 0.1302923415174603, + 0.1848955425508276, + 0.2506163195331889, + 0.3260874142923209, + 0.4089316830907141, + 0.4959414909423747, + 0.5833939894958904, + 0.6674601983218376, + 0.7446454751465113, + 0.8121892962974020, + 0.8683559394406505, + 0.9125649996381605, + 0.9453396205809574, + 0.9680864942677585, + 0.9827581789763112, + 0.9914756203467121, + 0.9961964092194694, + 0.9984956609571091, + 0.9994855586984285, + 0.9998533730714648, + 0.9999671864476404, + 0.9999948432453556, + 0.9999995655238333, + 0.9999999961638728 +}; + + +static real_t kbd_long_256[] = { + 0.0005851230124487, + 0.0009642149851497, + 0.0013558207534965, + 0.0017771849644394, + 0.0022352533849672, + 0.0027342299070304, + 0.0032773001022195, + 0.0038671998069216, + 0.0045064443384152, + 0.0051974336885144, + 0.0059425050016407, + 0.0067439602523141, + 0.0076040812644888, + 0.0085251378135895, + 0.0095093917383048, + 0.0105590986429280, + 0.0116765080854300, + 0.0128638627792770, + 0.0141233971318631, + 0.0154573353235409, + 0.0168678890600951, + 0.0183572550877256, + 0.0199276125319803, + 0.0215811201042484, + 0.0233199132076965, + 0.0251461009666641, + 0.0270617631981826, + 0.0290689473405856, + 0.0311696653515848, + 0.0333658905863535, + 0.0356595546648444, + 0.0380525443366107, + 0.0405466983507029, + 0.0431438043376910, + 0.0458455957104702, + 0.0486537485902075, + 0.0515698787635492, + 0.0545955386770205, + 0.0577322144743916, + 0.0609813230826460, + 0.0643442093520723, + 0.0678221432558827, + 0.0714163171546603, + 0.0751278431308314, + 0.0789577503982528, + 0.0829069827918993, + 0.0869763963425241, + 0.0911667569410503, + 0.0954787380973307, + 0.0999129187977865, + 0.1044697814663005, + 0.1091497100326053, + 0.1139529881122542, + 0.1188797973021148, + 0.1239302155951605, + 0.1291042159181728, + 0.1344016647957880, + 0.1398223211441467, + 0.1453658351972151, + 0.1510317475686540, + 0.1568194884519144, + 0.1627283769610327, + 0.1687576206143887, + 0.1749063149634756, + 0.1811734433685097, + 0.1875578769224857, + 0.1940583745250518, + 0.2006735831073503, + 0.2074020380087318, + 0.2142421635060113, + 0.2211922734956977, + 0.2282505723293797, + 0.2354151558022098, + 0.2426840122941792, + 0.2500550240636293, + 0.2575259686921987, + 0.2650945206801527, + 0.2727582531907993, + 0.2805146399424422, + 0.2883610572460804, + 0.2962947861868143, + 0.3043130149466800, + 0.3124128412663888, + 0.3205912750432127, + 0.3288452410620226, + 0.3371715818562547, + 0.3455670606953511, + 0.3540283646950029, + 0.3625521080463003, + 0.3711348353596863, + 0.3797730251194006, + 0.3884630932439016, + 0.3972013967475546, + 0.4059842374986933, + 0.4148078660689724, + 0.4236684856687616, + 0.4325622561631607, + 0.4414852981630577, + 0.4504336971855032, + 0.4594035078775303, + 0.4683907582974173, + 0.4773914542472655, + 0.4864015836506502, + 0.4954171209689973, + 0.5044340316502417, + 0.5134482766032377, + 0.5224558166913167, + 0.5314526172383208, + 0.5404346525403849, + 0.5493979103766972, + 0.5583383965124314, + 0.5672521391870222, + 0.5761351935809411, + 0.5849836462541291, + 0.5937936195492526, + 0.6025612759529649, + 0.6112828224083939, + 0.6199545145721097, + 0.6285726610088878, + 0.6371336273176413, + 0.6456338401819751, + 0.6540697913388968, + 0.6624380414593221, + 0.6707352239341151, + 0.6789580485595255, + 0.6871033051160131, + 0.6951678668345944, + 0.7031486937449871, + 0.7110428359000029, + 0.7188474364707993, + 0.7265597347077880, + 0.7341770687621900, + 0.7416968783634273, + 0.7491167073477523, + 0.7564342060337386, + 0.7636471334404891, + 0.7707533593446514, + 0.7777508661725849, + 0.7846377507242818, + 0.7914122257259034, + 0.7980726212080798, + 0.8046173857073919, + 0.8110450872887550, + 0.8173544143867162, + 0.8235441764639875, + 0.8296133044858474, + 0.8355608512093652, + 0.8413859912867303, + 0.8470880211822968, + 0.8526663589032990, + 0.8581205435445334, + 0.8634502346476508, + 0.8686552113760616, + 0.8737353715068081, + 0.8786907302411250, + 0.8835214188357692, + 0.8882276830575707, + 0.8928098814640207, + 0.8972684835130879, + 0.9016040675058185, + 0.9058173183656508, + 0.9099090252587376, + 0.9138800790599416, + 0.9177314696695282, + 0.9214642831859411, + 0.9250796989403991, + 0.9285789863994010, + 0.9319635019415643, + 0.9352346855155568, + 0.9383940571861993, + 0.9414432135761304, + 0.9443838242107182, + 0.9472176277741918, + 0.9499464282852282, + 0.9525720912004834, + 0.9550965394547873, + 0.9575217494469370, + 0.9598497469802043, + 0.9620826031668507, + 0.9642224303060783, + 0.9662713777449607, + 0.9682316277319895, + 0.9701053912729269, + 0.9718949039986892, + 0.9736024220549734, + 0.9752302180233160, + 0.9767805768831932, + 0.9782557920246753, + 0.9796581613210076, + 0.9809899832703159, + 0.9822535532154261, + 0.9834511596505429, + 0.9845850806232530, + 0.9856575802399989, + 0.9866709052828243, + 0.9876272819448033, + 0.9885289126911557, + 0.9893779732525968, + 0.9901766097569984, + 0.9909269360049311, + 0.9916310308941294, + 0.9922909359973702, + 0.9929086532976777, + 0.9934861430841844, + 0.9940253220113651, + 0.9945280613237534, + 0.9949961852476154, + 0.9954314695504363, + 0.9958356402684387, + 0.9962103726017252, + 0.9965572899760172, + 0.9968779632693499, + 0.9971739102014799, + 0.9974465948831872, + 0.9976974275220812, + 0.9979277642809907, + 0.9981389072844972, + 0.9983321047686901, + 0.9985085513687731, + 0.9986693885387259, + 0.9988157050968516, + 0.9989485378906924, + 0.9990688725744943, + 0.9991776444921379, + 0.9992757396582338, + 0.9993639958299003, + 0.9994432036616085, + 0.9995141079353859, + 0.9995774088586188, + 0.9996337634216871, + 0.9996837868076957, + 0.9997280538466377, + 0.9997671005064359, + 0.9998014254134544, + 0.9998314913952471, + 0.9998577270385304, + 0.9998805282555989, + 0.9999002598526793, + 0.9999172570940037, + 0.9999318272557038, + 0.9999442511639580, + 0.9999547847121726, + 0.9999636603523446, + 0.9999710885561258, + 0.9999772592414866, + 0.9999823431612708, + 0.9999864932503106, + 0.9999898459281599, + 0.9999925223548691, + 0.9999946296375997, + 0.9999962619864214, + 0.9999975018180320, + 0.9999984208055542, + 0.9999990808746198, + 0.9999995351446231, + 0.9999998288155155 +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/structs.h b/src/contrib/aacdecoder/libfaad/structs.h old mode 100644 new mode 100755 index a1589d707..9357c60cd --- a/src/contrib/aacdecoder/libfaad/structs.h +++ b/src/contrib/aacdecoder/libfaad/structs.h @@ -1,470 +1,445 @@ -/* -** 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: structs.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __STRUCTS_H__ -#define __STRUCTS_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "cfft.h" -#ifdef SBR_DEC -#include "sbr_dec.h" -#endif - -#define MAX_CHANNELS 64 -#define MAX_SYNTAX_ELEMENTS 48 -#define MAX_WINDOW_GROUPS 8 -#define MAX_SFB 51 -#define MAX_LTP_SFB 40 -#define MAX_LTP_SFB_S 8 - -/* used to save the prediction state */ -typedef struct { - int16_t r[2]; - int16_t COR[2]; - int16_t VAR[2]; -} pred_state; - -typedef struct { - uint16_t N; - cfft_info *cfft; - complex_t *sincos; -#ifdef PROFILE - int64_t cycles; - int64_t fft_cycles; -#endif -} mdct_info; - -typedef struct -{ - const real_t *long_window[2]; - const real_t *short_window[2]; -#ifdef LD_DEC - const real_t *ld_window[2]; -#endif - - mdct_info *mdct256; -#ifdef LD_DEC - mdct_info *mdct1024; -#endif - mdct_info *mdct2048; -#ifdef PROFILE - int64_t cycles; -#endif -#ifdef USE_SSE - void (*if_func)(void *a, uint8_t b, uint8_t c, uint8_t d, real_t *e, real_t *f, uint8_t g, uint16_t h); -#endif -} fb_info; - -typedef struct -{ - uint8_t present; - - uint8_t num_bands; - uint8_t pce_instance_tag; - uint8_t excluded_chns_present; - uint8_t band_top[17]; - uint8_t prog_ref_level; - uint8_t dyn_rng_sgn[17]; - uint8_t dyn_rng_ctl[17]; - uint8_t exclude_mask[MAX_CHANNELS]; - uint8_t additional_excluded_chns[MAX_CHANNELS]; - - real_t ctrl1; - real_t ctrl2; -} drc_info; - -typedef struct -{ - uint8_t element_instance_tag; - uint8_t object_type; - uint8_t sf_index; - uint8_t num_front_channel_elements; - uint8_t num_side_channel_elements; - uint8_t num_back_channel_elements; - uint8_t num_lfe_channel_elements; - uint8_t num_assoc_data_elements; - uint8_t num_valid_cc_elements; - uint8_t mono_mixdown_present; - uint8_t mono_mixdown_element_number; - uint8_t stereo_mixdown_present; - uint8_t stereo_mixdown_element_number; - uint8_t matrix_mixdown_idx_present; - uint8_t pseudo_surround_enable; - uint8_t matrix_mixdown_idx; - uint8_t front_element_is_cpe[16]; - uint8_t front_element_tag_select[16]; - uint8_t side_element_is_cpe[16]; - uint8_t side_element_tag_select[16]; - uint8_t back_element_is_cpe[16]; - uint8_t back_element_tag_select[16]; - uint8_t lfe_element_tag_select[16]; - uint8_t assoc_data_element_tag_select[16]; - uint8_t cc_element_is_ind_sw[16]; - uint8_t valid_cc_element_tag_select[16]; - - uint8_t channels; - - uint8_t comment_field_bytes; - uint8_t comment_field_data[257]; - - /* extra added values */ - uint8_t num_front_channels; - uint8_t num_side_channels; - uint8_t num_back_channels; - uint8_t num_lfe_channels; - uint8_t sce_channel[16]; - uint8_t cpe_channel[16]; -} program_config; - -typedef struct -{ - uint16_t syncword; - uint8_t id; - uint8_t layer; - uint8_t protection_absent; - uint8_t profile; - uint8_t sf_index; - uint8_t private_bit; - uint8_t channel_configuration; - uint8_t original; - uint8_t home; - uint8_t emphasis; - uint8_t copyright_identification_bit; - uint8_t copyright_identification_start; - uint16_t aac_frame_length; - uint16_t adts_buffer_fullness; - uint8_t no_raw_data_blocks_in_frame; - uint16_t crc_check; - - /* control param */ - uint8_t old_format; -} adts_header; - -typedef struct -{ - uint8_t copyright_id_present; - int8_t copyright_id[10]; - uint8_t original_copy; - uint8_t home; - uint8_t bitstream_type; - uint32_t bitrate; - uint8_t num_program_config_elements; - uint32_t adif_buffer_fullness; - - /* maximum of 16 PCEs */ - program_config pce[16]; -} adif_header; - -typedef struct -{ - uint8_t last_band; - uint8_t data_present; - uint16_t lag; - uint8_t lag_update; - uint8_t coef; - uint8_t long_used[MAX_SFB]; - uint8_t short_used[8]; - uint8_t short_lag_present[8]; - uint8_t short_lag[8]; -} ltp_info; - -typedef struct -{ - uint8_t limit; - uint8_t predictor_reset; - uint8_t predictor_reset_group_number; - uint8_t prediction_used[MAX_SFB]; -} pred_info; - -typedef struct -{ - uint8_t number_pulse; - uint8_t pulse_start_sfb; - uint8_t pulse_offset[4]; - uint8_t pulse_amp[4]; -} pulse_info; - -typedef struct -{ - uint8_t n_filt[8]; - uint8_t coef_res[8]; - uint8_t length[8][4]; - uint8_t order[8][4]; - uint8_t direction[8][4]; - uint8_t coef_compress[8][4]; - uint8_t coef[8][4][32]; -} tns_info; - -#ifdef SSR_DEC -typedef struct -{ - uint8_t max_band; - - uint8_t adjust_num[4][8]; - uint8_t alevcode[4][8][8]; - uint8_t aloccode[4][8][8]; -} ssr_info; -#endif - -typedef struct -{ - uint8_t max_sfb; - - uint8_t num_swb; - uint8_t num_window_groups; - uint8_t num_windows; - uint8_t window_sequence; - uint8_t window_group_length[8]; - uint8_t window_shape; - uint8_t scale_factor_grouping; - uint16_t sect_sfb_offset[8][15*8]; - uint16_t swb_offset[52]; - - uint8_t sect_cb[8][15*8]; - uint16_t sect_start[8][15*8]; - uint16_t sect_end[8][15*8]; - uint8_t sfb_cb[8][8*15]; - uint8_t num_sec[8]; /* number of sections in a group */ - - uint8_t global_gain; - int16_t scale_factors[8][51]; /* [0..255] */ - - uint8_t ms_mask_present; - uint8_t ms_used[MAX_WINDOW_GROUPS][MAX_SFB]; - - uint8_t noise_used; - - uint8_t pulse_data_present; - uint8_t tns_data_present; - uint8_t gain_control_data_present; - uint8_t predictor_data_present; - - pulse_info pul; - tns_info tns; - pred_info pred; - ltp_info ltp; - ltp_info ltp2; -#ifdef SSR_DEC - ssr_info ssr; -#endif - -#ifdef ERROR_RESILIENCE - /* ER HCR data */ - uint16_t length_of_reordered_spectral_data; - uint8_t length_of_longest_codeword; - /* ER RLVC data */ - uint8_t sf_concealment; - uint8_t rev_global_gain; - uint16_t length_of_rvlc_sf; - uint16_t dpcm_noise_nrg; - uint8_t sf_escapes_present; - uint8_t length_of_rvlc_escapes; - uint16_t dpcm_noise_last_position; -#endif -} ic_stream; /* individual channel stream */ - -typedef struct -{ - uint8_t ele_id; - - uint8_t channel; - int16_t paired_channel; - - uint8_t element_instance_tag; - uint8_t common_window; - - ic_stream ics1; - ic_stream ics2; -} element; /* syntax element (SCE, CPE, LFE) */ - -typedef struct mp4AudioSpecificConfig -{ - /* Audio Specific Info */ - uint8_t objectTypeIndex; - uint8_t samplingFrequencyIndex; - uint32_t samplingFrequency; - uint8_t channelsConfiguration; - - /* GA Specific Info */ - uint8_t frameLengthFlag; - uint8_t dependsOnCoreCoder; - uint16_t coreCoderDelay; - uint8_t extensionFlag; - uint8_t aacSectionDataResilienceFlag; - uint8_t aacScalefactorDataResilienceFlag; - uint8_t aacSpectralDataResilienceFlag; - uint8_t epConfig; - - int8_t sbr_present_flag; - int8_t forceUpSampling; -} mp4AudioSpecificConfig; - -typedef struct faacDecConfiguration -{ - uint8_t defObjectType; - uint32_t defSampleRate; - uint8_t outputFormat; - uint8_t downMatrix; - uint8_t useOldADTSFormat; - uint8_t dontUpSampleImplicitSBR; -} faacDecConfiguration, *faacDecConfigurationPtr; - -typedef struct faacDecFrameInfo -{ - uint32_t bytesconsumed; - uint32_t samples; - uint8_t channels; - uint8_t error; - uint32_t samplerate; - - /* SBR: 0: off, 1: on; normal, 2: on; downsampled */ - uint8_t sbr; - - /* MPEG-4 ObjectType */ - uint8_t object_type; - - /* AAC header type; MP4 will be signalled as RAW also */ - uint8_t header_type; - - /* multichannel configuration */ - uint8_t num_front_channels; - uint8_t num_side_channels; - uint8_t num_back_channels; - uint8_t num_lfe_channels; - uint8_t channel_position[MAX_CHANNELS]; -} faacDecFrameInfo; - -typedef struct -{ - uint8_t adts_header_present; - uint8_t adif_header_present; - uint8_t sf_index; - uint8_t object_type; - uint8_t channelConfiguration; -#ifdef ERROR_RESILIENCE - uint8_t aacSectionDataResilienceFlag; - uint8_t aacScalefactorDataResilienceFlag; - uint8_t aacSpectralDataResilienceFlag; -#endif - uint16_t frameLength; - uint8_t postSeekResetFlag; - - uint32_t frame; - - uint8_t downMatrix; - uint8_t first_syn_ele; - uint8_t has_lfe; - /* number of channels in current frame */ - uint8_t fr_channels; - /* number of elements in current frame */ - uint8_t fr_ch_ele; - - /* element_output_channels: - determines the number of channels the element will output - */ - uint8_t element_output_channels[MAX_SYNTAX_ELEMENTS]; - /* element_alloced: - determines whether the data needed for the element is allocated or not - */ - uint8_t element_alloced[MAX_SYNTAX_ELEMENTS]; - /* alloced_channels: - determines the number of channels where output data is allocated for - */ - uint8_t alloced_channels; - - /* output data buffer */ - void *sample_buffer; - - uint8_t window_shape_prev[MAX_CHANNELS]; -#ifdef LTP_DEC - uint16_t ltp_lag[MAX_CHANNELS]; -#endif - fb_info *fb; - drc_info *drc; - - real_t *time_out[MAX_CHANNELS]; - real_t *fb_intermed[MAX_CHANNELS]; - -#ifdef SBR_DEC - int8_t sbr_present_flag; - int8_t forceUpSampling; - /* determines whether SBR data is allocated for the gives element */ - uint8_t sbr_alloced[MAX_SYNTAX_ELEMENTS]; - - sbr_info *sbr[MAX_SYNTAX_ELEMENTS]; -#ifdef DRM - int8_t lcstereo_flag; -#endif -#endif -#if (defined(PS_DEC) || defined(DRM_PS)) - uint8_t ps_used[MAX_SYNTAX_ELEMENTS]; -#endif - -#ifdef SSR_DEC - real_t *ssr_overlap[MAX_CHANNELS]; - real_t *prev_fmd[MAX_CHANNELS]; - real_t ipqf_buffer[MAX_CHANNELS][4][96/4]; -#endif - -#ifdef MAIN_DEC - pred_state *pred_stat[MAX_CHANNELS]; -#endif -#ifdef LTP_DEC - int16_t *lt_pred_stat[MAX_CHANNELS]; -#endif - - /* Program Config Element */ - uint8_t pce_set; - program_config pce; - uint8_t element_id[MAX_CHANNELS]; - uint8_t internal_channel[MAX_CHANNELS]; - - /* Configuration data */ - faacDecConfiguration config; - -#ifdef USE_SSE - void (*apply_sf_func)(void *a, void *b, void *c, uint16_t d); -#endif - -#ifdef PROFILE - int64_t cycles; - int64_t spectral_cycles; - int64_t output_cycles; - int64_t scalefac_cycles; - int64_t requant_cycles; -#endif -} faacDecStruct, *faacDecHandle; - - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: structs.h,v 1.49 2009/01/26 23:51:15 menno Exp $ +**/ + +#ifndef __STRUCTS_H__ +#define __STRUCTS_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "cfft.h" +#ifdef SBR_DEC +#include "sbr_dec.h" +#endif + +#define MAX_CHANNELS 64 +#define MAX_SYNTAX_ELEMENTS 48 +#define MAX_WINDOW_GROUPS 8 +#define MAX_SFB 51 +#define MAX_LTP_SFB 40 +#define MAX_LTP_SFB_S 8 + +/* used to save the prediction state */ +typedef struct { + int16_t r[2]; + int16_t COR[2]; + int16_t VAR[2]; +} pred_state; + +typedef struct { + uint16_t N; + cfft_info *cfft; + complex_t *sincos; +#ifdef PROFILE + int64_t cycles; + int64_t fft_cycles; +#endif +} mdct_info; + +typedef struct +{ + const real_t *long_window[2]; + const real_t *short_window[2]; +#ifdef LD_DEC + const real_t *ld_window[2]; +#endif + + mdct_info *mdct256; +#ifdef LD_DEC + mdct_info *mdct1024; +#endif + mdct_info *mdct2048; +#ifdef PROFILE + int64_t cycles; +#endif +} fb_info; + +typedef struct +{ + uint8_t present; + + uint8_t num_bands; + uint8_t pce_instance_tag; + uint8_t excluded_chns_present; + uint8_t band_top[17]; + uint8_t prog_ref_level; + uint8_t dyn_rng_sgn[17]; + uint8_t dyn_rng_ctl[17]; + uint8_t exclude_mask[MAX_CHANNELS]; + uint8_t additional_excluded_chns[MAX_CHANNELS]; + + real_t ctrl1; + real_t ctrl2; +} drc_info; + +typedef struct +{ + uint8_t element_instance_tag; + uint8_t object_type; + uint8_t sf_index; + uint8_t num_front_channel_elements; + uint8_t num_side_channel_elements; + uint8_t num_back_channel_elements; + uint8_t num_lfe_channel_elements; + uint8_t num_assoc_data_elements; + uint8_t num_valid_cc_elements; + uint8_t mono_mixdown_present; + uint8_t mono_mixdown_element_number; + uint8_t stereo_mixdown_present; + uint8_t stereo_mixdown_element_number; + uint8_t matrix_mixdown_idx_present; + uint8_t pseudo_surround_enable; + uint8_t matrix_mixdown_idx; + uint8_t front_element_is_cpe[16]; + uint8_t front_element_tag_select[16]; + uint8_t side_element_is_cpe[16]; + uint8_t side_element_tag_select[16]; + uint8_t back_element_is_cpe[16]; + uint8_t back_element_tag_select[16]; + uint8_t lfe_element_tag_select[16]; + uint8_t assoc_data_element_tag_select[16]; + uint8_t cc_element_is_ind_sw[16]; + uint8_t valid_cc_element_tag_select[16]; + + uint8_t channels; + + uint8_t comment_field_bytes; + uint8_t comment_field_data[257]; + + /* extra added values */ + uint8_t num_front_channels; + uint8_t num_side_channels; + uint8_t num_back_channels; + uint8_t num_lfe_channels; + uint8_t sce_channel[16]; + uint8_t cpe_channel[16]; +} program_config; + +typedef struct +{ + uint16_t syncword; + uint8_t id; + uint8_t layer; + uint8_t protection_absent; + uint8_t profile; + uint8_t sf_index; + uint8_t private_bit; + uint8_t channel_configuration; + uint8_t original; + uint8_t home; + uint8_t emphasis; + uint8_t copyright_identification_bit; + uint8_t copyright_identification_start; + uint16_t aac_frame_length; + uint16_t adts_buffer_fullness; + uint8_t no_raw_data_blocks_in_frame; + uint16_t crc_check; + + /* control param */ + uint8_t old_format; +} adts_header; + +typedef struct +{ + uint8_t copyright_id_present; + int8_t copyright_id[10]; + uint8_t original_copy; + uint8_t home; + uint8_t bitstream_type; + uint32_t bitrate; + uint8_t num_program_config_elements; + uint32_t adif_buffer_fullness; + + /* maximum of 16 PCEs */ + program_config pce[16]; +} adif_header; + +#ifdef LTP_DEC +typedef struct +{ + uint8_t last_band; + uint8_t data_present; + uint16_t lag; + uint8_t lag_update; + uint8_t coef; + uint8_t long_used[MAX_SFB]; + uint8_t short_used[8]; + uint8_t short_lag_present[8]; + uint8_t short_lag[8]; +} ltp_info; +#endif + +#ifdef MAIN_DEC +typedef struct +{ + uint8_t limit; + uint8_t predictor_reset; + uint8_t predictor_reset_group_number; + uint8_t prediction_used[MAX_SFB]; +} pred_info; +#endif + +typedef struct +{ + uint8_t number_pulse; + uint8_t pulse_start_sfb; + uint8_t pulse_offset[4]; + uint8_t pulse_amp[4]; +} pulse_info; + +typedef struct +{ + uint8_t n_filt[8]; + uint8_t coef_res[8]; + uint8_t length[8][4]; + uint8_t order[8][4]; + uint8_t direction[8][4]; + uint8_t coef_compress[8][4]; + uint8_t coef[8][4][32]; +} tns_info; + +#ifdef SSR_DEC +typedef struct +{ + uint8_t max_band; + + uint8_t adjust_num[4][8]; + uint8_t alevcode[4][8][8]; + uint8_t aloccode[4][8][8]; +} ssr_info; +#endif + +typedef struct +{ + uint8_t max_sfb; + + uint8_t num_swb; + uint8_t num_window_groups; + uint8_t num_windows; + uint8_t window_sequence; + uint8_t window_group_length[8]; + uint8_t window_shape; + uint8_t scale_factor_grouping; + uint16_t sect_sfb_offset[8][15*8]; + uint16_t swb_offset[52]; + uint16_t swb_offset_max; + + uint8_t sect_cb[8][15*8]; + uint16_t sect_start[8][15*8]; + uint16_t sect_end[8][15*8]; + uint8_t sfb_cb[8][8*15]; + uint8_t num_sec[8]; /* number of sections in a group */ + + uint8_t global_gain; + int16_t scale_factors[8][51]; /* [0..255] */ + + uint8_t ms_mask_present; + uint8_t ms_used[MAX_WINDOW_GROUPS][MAX_SFB]; + + uint8_t noise_used; + uint8_t is_used; + + uint8_t pulse_data_present; + uint8_t tns_data_present; + uint8_t gain_control_data_present; + uint8_t predictor_data_present; + + pulse_info pul; + tns_info tns; +#ifdef MAIN_DEC + pred_info pred; +#endif +#ifdef LTP_DEC + ltp_info ltp; + ltp_info ltp2; +#endif +#ifdef SSR_DEC + ssr_info ssr; +#endif + +#ifdef ERROR_RESILIENCE + /* ER HCR data */ + uint16_t length_of_reordered_spectral_data; + uint8_t length_of_longest_codeword; + /* ER RLVC data */ + uint8_t sf_concealment; + uint8_t rev_global_gain; + uint16_t length_of_rvlc_sf; + uint16_t dpcm_noise_nrg; + uint8_t sf_escapes_present; + uint8_t length_of_rvlc_escapes; + uint16_t dpcm_noise_last_position; +#endif +} ic_stream; /* individual channel stream */ + +typedef struct +{ + uint8_t channel; + int16_t paired_channel; + + uint8_t element_instance_tag; + uint8_t common_window; + + ic_stream ics1; + ic_stream ics2; +} element; /* syntax element (SCE, CPE, LFE) */ + +#define MAX_ASC_BYTES 64 +typedef struct { + int inited; + int version, versionA; + int framelen_type; + int useSameStreamMux; + int allStreamsSameTimeFraming; + int numSubFrames; + int numPrograms; + int numLayers; + int otherDataPresent; + uint32_t otherDataLenBits; + uint32_t frameLength; + uint8_t ASC[MAX_ASC_BYTES]; + uint32_t ASCbits; +} latm_header; + +typedef struct +{ + uint8_t adts_header_present; + uint8_t adif_header_present; + uint8_t latm_header_present; + uint8_t sf_index; + uint8_t object_type; + uint8_t channelConfiguration; +#ifdef ERROR_RESILIENCE + uint8_t aacSectionDataResilienceFlag; + uint8_t aacScalefactorDataResilienceFlag; + uint8_t aacSpectralDataResilienceFlag; +#endif + uint16_t frameLength; + uint8_t postSeekResetFlag; + + uint32_t frame; + + uint8_t downMatrix; + uint8_t upMatrix; + uint8_t first_syn_ele; + uint8_t has_lfe; + /* number of channels in current frame */ + uint8_t fr_channels; + /* number of elements in current frame */ + uint8_t fr_ch_ele; + + /* element_output_channels: + determines the number of channels the element will output + */ + uint8_t element_output_channels[MAX_SYNTAX_ELEMENTS]; + /* element_alloced: + determines whether the data needed for the element is allocated or not + */ + uint8_t element_alloced[MAX_SYNTAX_ELEMENTS]; + /* alloced_channels: + determines the number of channels where output data is allocated for + */ + uint8_t alloced_channels; + + /* output data buffer */ + void *sample_buffer; + + uint8_t window_shape_prev[MAX_CHANNELS]; +#ifdef LTP_DEC + uint16_t ltp_lag[MAX_CHANNELS]; +#endif + fb_info *fb; + drc_info *drc; + + real_t *time_out[MAX_CHANNELS]; + real_t *fb_intermed[MAX_CHANNELS]; + +#ifdef SBR_DEC + int8_t sbr_present_flag; + int8_t forceUpSampling; + int8_t downSampledSBR; + /* determines whether SBR data is allocated for the gives element */ + uint8_t sbr_alloced[MAX_SYNTAX_ELEMENTS]; + + sbr_info *sbr[MAX_SYNTAX_ELEMENTS]; +#endif +#if (defined(PS_DEC) || defined(DRM_PS)) + uint8_t ps_used[MAX_SYNTAX_ELEMENTS]; + uint8_t ps_used_global; +#endif + +#ifdef SSR_DEC + real_t *ssr_overlap[MAX_CHANNELS]; + real_t *prev_fmd[MAX_CHANNELS]; + real_t ipqf_buffer[MAX_CHANNELS][4][96/4]; +#endif + +#ifdef MAIN_DEC + pred_state *pred_stat[MAX_CHANNELS]; +#endif +#ifdef LTP_DEC + int16_t *lt_pred_stat[MAX_CHANNELS]; +#endif + +#ifdef DRM + uint8_t error_state; +#endif + + /* RNG states */ + uint32_t __r1; + uint32_t __r2; + + /* Program Config Element */ + uint8_t pce_set; + program_config pce; + uint8_t element_id[MAX_CHANNELS]; + uint8_t internal_channel[MAX_CHANNELS]; + + /* Configuration data */ + NeAACDecConfiguration config; + +#ifdef PROFILE + int64_t cycles; + int64_t spectral_cycles; + int64_t output_cycles; + int64_t scalefac_cycles; + int64_t requant_cycles; +#endif + latm_header latm_config; + const unsigned char *cmes; +} NeAACDecStruct; + + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/syntax.c b/src/contrib/aacdecoder/libfaad/syntax.c old mode 100644 new mode 100755 index 1b405ae74..f8e808c26 --- a/src/contrib/aacdecoder/libfaad/syntax.c +++ b/src/contrib/aacdecoder/libfaad/syntax.c @@ -1,2195 +1,2634 @@ -/* -** 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: syntax.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -/* - Reads the AAC bitstream as defined in 14496-3 (MPEG-4 Audio) -*/ - -#include "common.h" -#include "structs.h" - -#include -#include - -#include "decoder.h" -#include "syntax.h" -#include "specrec.h" -#include "huffman.h" -#include "bits.h" -#include "pulse.h" -#include "analysis.h" -#include "drc.h" -#ifdef ERROR_RESILIENCE -#include "rvlc.h" -#endif -#ifdef SBR_DEC -#include "sbr_syntax.h" -#endif - - -/* static function declarations */ -static void decode_sce_lfe(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele); -static void decode_cpe(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele); -static uint8_t single_lfe_channel_element(faacDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag); -static uint8_t channel_pair_element(faacDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag); -#ifdef COUPLING_DEC -static uint8_t coupling_channel_element(faacDecHandle hDecoder, bitfile *ld); -#endif -static uint16_t data_stream_element(faacDecHandle hDecoder, bitfile *ld); -static uint8_t program_config_element(program_config *pce, bitfile *ld); -static uint8_t fill_element(faacDecHandle hDecoder, bitfile *ld, drc_info *drc -#ifdef SBR_DEC - ,uint8_t sbr_ele -#endif - ); -static uint8_t individual_channel_stream(faacDecHandle hDecoder, element *ele, - bitfile *ld, ic_stream *ics, uint8_t scal_flag, - int16_t *spec_data); -static uint8_t ics_info(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - uint8_t common_window); -static uint8_t section_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld); -static uint8_t scale_factor_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld); -#ifdef SSR_DEC -static void gain_control_data(bitfile *ld, ic_stream *ics); -#endif -static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data); -static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); -static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); -static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); -static uint8_t ltp_data(faacDecHandle hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); -static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); -static void adts_variable_header(adts_header *adts, bitfile *ld); -static void adts_error_check(adts_header *adts, bitfile *ld); -static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); -static uint8_t excluded_channels(bitfile *ld, drc_info *drc); -#ifdef SCALABLE_DEC -static int8_t aac_scalable_main_header(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - bitfile *ld, uint8_t this_layer_stereo); -#endif - - -/* Table 4.4.1 */ -int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, - program_config *pce_out) -{ - program_config pce; - - /* 1024 or 960 */ - mp4ASC->frameLengthFlag = faad_get1bit(ld - DEBUGVAR(1,138,"GASpecificConfig(): FrameLengthFlag")); -#ifndef ALLOW_SMALL_FRAMELENGTH - if (mp4ASC->frameLengthFlag == 1) - return -3; -#endif - - mp4ASC->dependsOnCoreCoder = faad_get1bit(ld - DEBUGVAR(1,139,"GASpecificConfig(): DependsOnCoreCoder")); - if (mp4ASC->dependsOnCoreCoder == 1) - { - mp4ASC->coreCoderDelay = (uint16_t)faad_getbits(ld, 14 - DEBUGVAR(1,140,"GASpecificConfig(): CoreCoderDelay")); - } - - mp4ASC->extensionFlag = faad_get1bit(ld DEBUGVAR(1,141,"GASpecificConfig(): ExtensionFlag")); - if (mp4ASC->channelsConfiguration == 0) - { - if (program_config_element(&pce, ld)) - return -3; - //mp4ASC->channelsConfiguration = pce.channels; - - if (pce_out != NULL) - memcpy(pce_out, &pce, sizeof(program_config)); - - /* - if (pce.num_valid_cc_elements) - return -3; - */ - } - -#ifdef ERROR_RESILIENCE - if (mp4ASC->extensionFlag == 1) - { - /* Error resilience not supported yet */ - if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) - { - mp4ASC->aacSectionDataResilienceFlag = faad_get1bit(ld - DEBUGVAR(1,144,"GASpecificConfig(): aacSectionDataResilienceFlag")); - mp4ASC->aacScalefactorDataResilienceFlag = faad_get1bit(ld - DEBUGVAR(1,145,"GASpecificConfig(): aacScalefactorDataResilienceFlag")); - mp4ASC->aacSpectralDataResilienceFlag = faad_get1bit(ld - DEBUGVAR(1,146,"GASpecificConfig(): aacSpectralDataResilienceFlag")); - - /* 1 bit: extensionFlag3 */ - } - } -#endif - - return 0; -} - -/* Table 4.4.2 */ -/* An MPEG-4 Audio decoder is only required to follow the Program - Configuration Element in GASpecificConfig(). The decoder shall ignore - any Program Configuration Elements that may occur in raw data blocks. - PCEs transmitted in raw data blocks cannot be used to convey decoder - configuration information. -*/ -static uint8_t program_config_element(program_config *pce, bitfile *ld) -{ - uint8_t i; - - memset(pce, 0, sizeof(program_config)); - - pce->channels = 0; - - pce->element_instance_tag = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,10,"program_config_element(): element_instance_tag")); - - pce->object_type = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,11,"program_config_element(): object_type")); - pce->sf_index = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,12,"program_config_element(): sf_index")); - pce->num_front_channel_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,13,"program_config_element(): num_front_channel_elements")); - pce->num_side_channel_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,14,"program_config_element(): num_side_channel_elements")); - pce->num_back_channel_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,15,"program_config_element(): num_back_channel_elements")); - pce->num_lfe_channel_elements = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,16,"program_config_element(): num_lfe_channel_elements")); - pce->num_assoc_data_elements = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,17,"program_config_element(): num_assoc_data_elements")); - pce->num_valid_cc_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,18,"program_config_element(): num_valid_cc_elements")); - - pce->mono_mixdown_present = faad_get1bit(ld - DEBUGVAR(1,19,"program_config_element(): mono_mixdown_present")); - if (pce->mono_mixdown_present == 1) - { - pce->mono_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,20,"program_config_element(): mono_mixdown_element_number")); - } - - pce->stereo_mixdown_present = faad_get1bit(ld - DEBUGVAR(1,21,"program_config_element(): stereo_mixdown_present")); - if (pce->stereo_mixdown_present == 1) - { - pce->stereo_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,22,"program_config_element(): stereo_mixdown_element_number")); - } - - pce->matrix_mixdown_idx_present = faad_get1bit(ld - DEBUGVAR(1,23,"program_config_element(): matrix_mixdown_idx_present")); - if (pce->matrix_mixdown_idx_present == 1) - { - pce->matrix_mixdown_idx = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,24,"program_config_element(): matrix_mixdown_idx")); - pce->pseudo_surround_enable = faad_get1bit(ld - DEBUGVAR(1,25,"program_config_element(): pseudo_surround_enable")); - } - - for (i = 0; i < pce->num_front_channel_elements; i++) - { - pce->front_element_is_cpe[i] = faad_get1bit(ld - DEBUGVAR(1,26,"program_config_element(): front_element_is_cpe")); - pce->front_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,27,"program_config_element(): front_element_tag_select")); - - if (pce->front_element_is_cpe[i] & 1) - { - pce->cpe_channel[pce->front_element_tag_select[i]] = pce->channels; - pce->num_front_channels += 2; - pce->channels += 2; - } else { - pce->sce_channel[pce->front_element_tag_select[i]] = pce->channels; - pce->num_front_channels++; - pce->channels++; - } - } - - for (i = 0; i < pce->num_side_channel_elements; i++) - { - pce->side_element_is_cpe[i] = faad_get1bit(ld - DEBUGVAR(1,28,"program_config_element(): side_element_is_cpe")); - pce->side_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,29,"program_config_element(): side_element_tag_select")); - - if (pce->side_element_is_cpe[i] & 1) - { - pce->cpe_channel[pce->side_element_tag_select[i]] = pce->channels; - pce->num_side_channels += 2; - pce->channels += 2; - } else { - pce->sce_channel[pce->side_element_tag_select[i]] = pce->channels; - pce->num_side_channels++; - pce->channels++; - } - } - - for (i = 0; i < pce->num_back_channel_elements; i++) - { - pce->back_element_is_cpe[i] = faad_get1bit(ld - DEBUGVAR(1,30,"program_config_element(): back_element_is_cpe")); - pce->back_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,31,"program_config_element(): back_element_tag_select")); - - if (pce->back_element_is_cpe[i] & 1) - { - pce->cpe_channel[pce->back_element_tag_select[i]] = pce->channels; - pce->channels += 2; - pce->num_back_channels += 2; - } else { - pce->sce_channel[pce->back_element_tag_select[i]] = pce->channels; - pce->num_back_channels++; - pce->channels++; - } - } - - for (i = 0; i < pce->num_lfe_channel_elements; i++) - { - pce->lfe_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,32,"program_config_element(): lfe_element_tag_select")); - - pce->sce_channel[pce->lfe_element_tag_select[i]] = pce->channels; - pce->num_lfe_channels++; - pce->channels++; - } - - for (i = 0; i < pce->num_assoc_data_elements; i++) - pce->assoc_data_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,33,"program_config_element(): assoc_data_element_tag_select")); - - for (i = 0; i < pce->num_valid_cc_elements; i++) - { - pce->cc_element_is_ind_sw[i] = faad_get1bit(ld - DEBUGVAR(1,34,"program_config_element(): cc_element_is_ind_sw")); - pce->valid_cc_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,35,"program_config_element(): valid_cc_element_tag_select")); - } - - faad_byte_align(ld); - - pce->comment_field_bytes = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,36,"program_config_element(): comment_field_bytes")); - - for (i = 0; i < pce->comment_field_bytes; i++) - { - pce->comment_field_data[i] = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,37,"program_config_element(): comment_field_data")); - } - pce->comment_field_data[i] = 0; - - if (pce->channels > MAX_CHANNELS) - return 22; - - return 0; -} - -static void decode_sce_lfe(faacDecHandle hDecoder, - faacDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele) -{ - uint8_t channels = hDecoder->fr_channels; - uint8_t tag = 0; - - if (channels+1 > MAX_CHANNELS) - { - hInfo->error = 12; - return; - } - if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) - { - hInfo->error = 13; - return; - } - - /* for SCE hDecoder->element_output_channels[] is not set here because this - can become 2 when some form of Parametric Stereo coding is used - */ - - /* save the syntax element id */ - hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; - - /* decode the element */ - hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); - - /* map output channels position to internal data channels */ - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) - { - /* this might be faulty when pce_set is true */ - hDecoder->internal_channel[channels] = channels; - hDecoder->internal_channel[channels+1] = channels+1; - } else { - if (hDecoder->pce_set) - hDecoder->internal_channel[hDecoder->pce.sce_channel[tag]] = channels; - else - hDecoder->internal_channel[channels] = channels; - } - - hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; - hDecoder->fr_ch_ele++; -} - -static void decode_cpe(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, bitfile *ld, - uint8_t id_syn_ele) -{ - uint8_t channels = hDecoder->fr_channels; - uint8_t tag = 0; - - if (channels+2 > MAX_CHANNELS) - { - hInfo->error = 12; - return; - } - if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) - { - hInfo->error = 13; - return; - } - - /* for CPE the number of output channels is always 2 */ - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) - { - /* element_output_channels not set yet */ - hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; - } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { - /* element inconsistency */ - hInfo->error = 21; - return; - } - - /* save the syntax element id */ - hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; - - /* decode the element */ - hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); - - /* map output channel position to internal data channels */ - if (hDecoder->pce_set) - { - hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; - hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; - } else { - hDecoder->internal_channel[channels] = channels; - hDecoder->internal_channel[channels+1] = channels+1; - } - - hDecoder->fr_channels += 2; - hDecoder->fr_ch_ele++; -} - -void raw_data_block(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc) -{ - uint8_t id_syn_ele; - - hDecoder->fr_channels = 0; - hDecoder->fr_ch_ele = 0; - hDecoder->first_syn_ele = 25; - hDecoder->has_lfe = 0; - -#ifdef ERROR_RESILIENCE - if (hDecoder->object_type < ER_OBJECT_START) - { -#endif - /* Table 4.4.3: raw_data_block() */ - while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID - DEBUGVAR(1,4,"faacDecDecode(): id_syn_ele"))) != ID_END) - { - switch (id_syn_ele) { - case ID_SCE: - if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; - decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); - if (hInfo->error > 0) - return; - break; - case ID_CPE: - if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; - decode_cpe(hDecoder, hInfo, ld, id_syn_ele); - if (hInfo->error > 0) - return; - break; - case ID_LFE: - hDecoder->has_lfe++; - decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); - if (hInfo->error > 0) - return; - break; - case ID_CCE: /* not implemented yet, but skip the bits */ -#ifdef COUPLING_DEC - hInfo->error = coupling_channel_element(hDecoder, ld); -#else - hInfo->error = 6; -#endif - if (hInfo->error > 0) - return; - break; - case ID_DSE: - data_stream_element(hDecoder, ld); - break; - case ID_PCE: - /* 14496-4: 5.6.4.1.2.1.3: */ - /* program_configuration_element()'s in access units shall be ignored */ - program_config_element(pce, ld); - //if ((hInfo->error = program_config_element(pce, ld)) > 0) - // return; - //hDecoder->pce_set = 1; - break; - case ID_FIL: - /* one sbr_info describes a channel_element not a channel! */ - /* if we encounter SBR data here: error */ - /* SBR data will be read directly in the SCE/LFE/CPE element */ - if ((hInfo->error = fill_element(hDecoder, ld, drc -#ifdef SBR_DEC - , INVALID_SBR_ELEMENT -#endif - )) > 0) - return; - break; - } - } -#ifdef ERROR_RESILIENCE - } else { - /* Table 262: er_raw_data_block() */ - switch (hDecoder->channelConfiguration) - { - case 1: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - if (hInfo->error > 0) - return; - break; - case 2: - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - if (hInfo->error > 0) - return; - break; - case 3: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - if (hInfo->error > 0) - return; - break; - case 4: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - if (hInfo->error > 0) - return; - break; - case 5: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - if (hInfo->error > 0) - return; - break; - case 6: - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); - if (hInfo->error > 0) - return; - break; - case 7: /* 8 channels */ - decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_cpe(hDecoder, hInfo, ld, ID_CPE); - decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); - if (hInfo->error > 0) - return; - break; - default: - hInfo->error = 7; - return; - } -#if 0 - cnt = bits_to_decode() / 8; - while (cnt >= 1) - { - cnt -= extension_payload(cnt); - } -#endif - } -#endif - - /* new in corrigendum 14496-3:2002 */ -#ifdef DRM - if (hDecoder->object_type != DRM_ER_LC) -#endif - { - faad_byte_align(ld); - } - - return; -} - -/* Table 4.4.4 and */ -/* Table 4.4.9 */ -static uint8_t single_lfe_channel_element(faacDecHandle hDecoder, bitfile *ld, - uint8_t channel, uint8_t *tag) -{ - uint8_t retval = 0; - element sce = {0}; - ic_stream *ics = &(sce.ics1); - ALIGN int16_t spec_data[1024] = {0}; - - sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG - DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); - - *tag = sce.element_instance_tag; - sce.channel = channel; - sce.paired_channel = -1; - - retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); - if (retval > 0) - return retval; - -#ifdef SBR_DEC - /* check if next bitstream element is a fill element */ - /* if so, read it now so SBR decoding can be done in case of a file with SBR */ - if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) - { - faad_flushbits(ld, LEN_SE_ID); - - /* one sbr_info describes a channel_element not a channel! */ - if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) - { - return retval; - } - } -#endif - - /* noiseless coding is done, spectral reconstruction is done now */ - retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); - if (retval > 0) - return retval; - - return 0; -} - -/* Table 4.4.5 */ -static uint8_t channel_pair_element(faacDecHandle hDecoder, bitfile *ld, - uint8_t channels, uint8_t *tag) -{ - ALIGN int16_t spec_data1[1024] = {0}; - ALIGN int16_t spec_data2[1024] = {0}; - element cpe = {0}; - ic_stream *ics1 = &(cpe.ics1); - ic_stream *ics2 = &(cpe.ics2); - uint8_t result; - - cpe.channel = channels; - cpe.paired_channel = channels+1; - - cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG - DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); - *tag = cpe.element_instance_tag; - - if ((cpe.common_window = faad_get1bit(ld - DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) - { - /* both channels have common ics information */ - if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) - return result; - - ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); - if (ics1->ms_mask_present == 1) - { - uint8_t g, sfb; - for (g = 0; g < ics1->num_window_groups; g++) - { - for (sfb = 0; sfb < ics1->max_sfb; sfb++) - { - ics1->ms_used[g][sfb] = faad_get1bit(ld - DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); - } - } - } - -#ifdef ERROR_RESILIENCE - if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) - { - if ((ics1->ltp.data_present = faad_get1bit(ld - DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) - { - if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) - { - return result; - } - } - } -#endif - - memcpy(ics2, ics1, sizeof(ic_stream)); - } else { - ics1->ms_mask_present = 0; - } - - if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, - 0, spec_data1)) > 0) - { - return result; - } - -#ifdef ERROR_RESILIENCE - if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && - (ics1->predictor_data_present)) - { - if ((ics1->ltp2.data_present = faad_get1bit(ld - DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) - { - if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) - { - return result; - } - } - } -#endif - - if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, - 0, spec_data2)) > 0) - { - return result; - } - -#ifdef SBR_DEC - /* check if next bitstream element is a fill element */ - /* if so, read it now so SBR decoding can be done in case of a file with SBR */ - if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) - { - faad_flushbits(ld, LEN_SE_ID); - - /* one sbr_info describes a channel_element not a channel! */ - if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) - { - return result; - } - } -#endif - - /* noiseless coding is done, spectral reconstruction is done now */ - if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, - spec_data1, spec_data2)) > 0) - { - return result; - } - - return 0; -} - -/* Table 4.4.6 */ -static uint8_t ics_info(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - uint8_t common_window) -{ - uint8_t retval = 0; - - /* ics->ics_reserved_bit = */ faad_get1bit(ld - DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); - ics->window_sequence = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,44,"ics_info(): window_sequence")); - ics->window_shape = faad_get1bit(ld - DEBUGVAR(1,45,"ics_info(): window_shape")); - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - ics->max_sfb = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); - ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); - } else { - ics->max_sfb = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); - } - - /* get the grouping information */ - if ((retval = window_grouping_info(hDecoder, ics)) > 0) - return retval; - - /* should be an error */ - /* check the range of max_sfb */ - if (ics->max_sfb > ics->num_swb) - return 16; - - if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) - { - if ((ics->predictor_data_present = faad_get1bit(ld - DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) - { - if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ - { - uint8_t sfb; - - ics->pred.limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); - - if ((ics->pred.predictor_reset = faad_get1bit(ld - DEBUGVAR(1,53,"ics_info(): pred.predictor_reset"))) & 1) - { - ics->pred.predictor_reset_group_number = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); - } - - for (sfb = 0; sfb < ics->pred.limit; sfb++) - { - ics->pred.prediction_used[sfb] = faad_get1bit(ld - DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); - } - } -#ifdef LTP_DEC - else { /* Long Term Prediction */ - if (hDecoder->object_type < ER_OBJECT_START) - { - if ((ics->ltp.data_present = faad_get1bit(ld - DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) - { - if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) - { - return retval; - } - } - if (common_window) - { - if ((ics->ltp2.data_present = faad_get1bit(ld - DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) - { - if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) - { - return retval; - } - } - } - } -#ifdef ERROR_RESILIENCE - if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) - { - if ((ics->ltp.data_present = faad_get1bit(ld - DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) - { - ltp_data(hDecoder, ics, &(ics->ltp), ld); - } - } -#endif - } -#endif - } - } - - return retval; -} - -/* Table 4.4.7 */ -static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld) -{ - uint8_t i; - - pul->number_pulse = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,56,"pulse_data(): number_pulse")); - pul->pulse_start_sfb = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,57,"pulse_data(): pulse_start_sfb")); - - /* check the range of pulse_start_sfb */ - if (pul->pulse_start_sfb > ics->num_swb) - return 16; - - for (i = 0; i < pul->number_pulse+1; i++) - { - pul->pulse_offset[i] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,58,"pulse_data(): pulse_offset")); - pul->pulse_amp[i] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,59,"pulse_data(): pulse_amp")); - } - - return 0; -} - -#ifdef COUPLING_DEC -/* Table 4.4.8: Currently just for skipping the bits... */ -static uint8_t coupling_channel_element(faacDecHandle hDecoder, bitfile *ld) -{ - uint8_t c, result = 0; - uint8_t ind_sw_cce_flag = 0; - uint8_t num_gain_element_lists = 0; - uint8_t num_coupled_elements = 0; - - element el_empty = {0}; - ic_stream ics_empty = {0}; - int16_t sh_data[1024]; - - c = faad_getbits(ld, LEN_TAG - DEBUGVAR(1,900,"coupling_channel_element(): element_instance_tag")); - - ind_sw_cce_flag = faad_get1bit(ld - DEBUGVAR(1,901,"coupling_channel_element(): ind_sw_cce_flag")); - num_coupled_elements = faad_getbits(ld, 3 - DEBUGVAR(1,902,"coupling_channel_element(): num_coupled_elements")); - - for (c = 0; c < num_coupled_elements + 1; c++) - { - uint8_t cc_target_is_cpe, cc_target_tag_select; - - num_gain_element_lists++; - - cc_target_is_cpe = faad_get1bit(ld - DEBUGVAR(1,903,"coupling_channel_element(): cc_target_is_cpe")); - cc_target_tag_select = faad_getbits(ld, 4 - DEBUGVAR(1,904,"coupling_channel_element(): cc_target_tag_select")); - - if (cc_target_is_cpe) - { - uint8_t cc_l = faad_get1bit(ld - DEBUGVAR(1,905,"coupling_channel_element(): cc_l")); - uint8_t cc_r = faad_get1bit(ld - DEBUGVAR(1,906,"coupling_channel_element(): cc_r")); - - if (cc_l && cc_r) - num_gain_element_lists++; - } - } - - faad_get1bit(ld - DEBUGVAR(1,907,"coupling_channel_element(): cc_domain")); - faad_get1bit(ld - DEBUGVAR(1,908,"coupling_channel_element(): gain_element_sign")); - faad_getbits(ld, 2 - DEBUGVAR(1,909,"coupling_channel_element(): gain_element_scale")); - - if ((result = individual_channel_stream(hDecoder, &el_empty, ld, &ics_empty, - 0, sh_data)) > 0) - { - return result; - } - - for (c = 1; c < num_gain_element_lists; c++) - { - uint8_t cge; - - if (ind_sw_cce_flag) - { - cge = 1; - } else { - cge = faad_get1bit(ld - DEBUGVAR(1,910,"coupling_channel_element(): common_gain_element_present")); - } - - if (cge) - { - huffman_scale_factor(ld); - } else { - uint8_t g, sfb; - - for (g = 0; g < ics_empty.num_window_groups; g++) - { - for (sfb = 0; sfb < ics_empty.max_sfb; sfb++) - { - if (ics_empty.sfb_cb[g][sfb] != ZERO_HCB) - huffman_scale_factor(ld); - } - } - } - } - - return 0; -} -#endif - -/* Table 4.4.10 */ -static uint16_t data_stream_element(faacDecHandle hDecoder, bitfile *ld) -{ - uint8_t byte_aligned; - uint16_t i, count; - - /* element_instance_tag = */ faad_getbits(ld, LEN_TAG - DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); - byte_aligned = faad_get1bit(ld - DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); - count = (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,62,"data_stream_element(): count")); - if (count == 255) - { - count += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,63,"data_stream_element(): extra count")); - } - if (byte_aligned) - faad_byte_align(ld); - - for (i = 0; i < count; i++) - { - faad_getbits(ld, LEN_BYTE - DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); - } - - return count; -} - -/* Table 4.4.11 */ -static uint8_t fill_element(faacDecHandle hDecoder, bitfile *ld, drc_info *drc -#ifdef SBR_DEC - ,uint8_t sbr_ele -#endif - ) -{ - uint16_t count; -#ifdef SBR_DEC - uint8_t bs_extension_type; -#endif - - count = (uint16_t)faad_getbits(ld, 4 - DEBUGVAR(1,65,"fill_element(): count")); - if (count == 15) - { - count += (uint16_t)faad_getbits(ld, 8 - DEBUGVAR(1,66,"fill_element(): extra count")) - 1; - } - - if (count > 0) - { -#ifdef SBR_DEC - bs_extension_type = (uint8_t)faad_showbits(ld, 4); - - if ((bs_extension_type == EXT_SBR_DATA) || - (bs_extension_type == EXT_SBR_DATA_CRC)) - { - if (sbr_ele == INVALID_SBR_ELEMENT) - return 24; - - if (!hDecoder->sbr[sbr_ele]) - { - hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, - hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index) -#ifdef DRM - , 0 -#endif - ); - } - - hDecoder->sbr_present_flag = 1; - - /* parse the SBR data */ - hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count); -#if (defined(PS_DEC) || defined(DRM_PS)) - if (hDecoder->sbr[sbr_ele]->ps_used) - { - hDecoder->ps_used[sbr_ele] = 1; - } -#endif - } else { -#endif - while (count > 0) - { - count -= extension_payload(ld, drc, count); - } -#ifdef SBR_DEC - } -#endif - } - - return 0; -} - -/* Table 4.4.12 */ -#ifdef SSR_DEC -static void gain_control_data(bitfile *ld, ic_stream *ics) -{ - uint8_t bd, wd, ad; - ssr_info *ssr = &(ics->ssr); - - ssr->max_band = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1000,"gain_control_data(): max_band")); - - if (ics->window_sequence == ONLY_LONG_SEQUENCE) - { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 1; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } else if (ics->window_sequence == LONG_START_SEQUENCE) { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 2; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - if (wd == 0) - { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } else { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } - } else if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 8; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } else if (ics->window_sequence == LONG_STOP_SEQUENCE) { - for (bd = 1; bd <= ssr->max_band; bd++) - { - for (wd = 0; wd < 2; wd++) - { - ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); - - for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) - { - ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1002,"gain_control_data(): alevcode")); - - if (wd == 0) - { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } else { - ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 - DEBUGVAR(1,1003,"gain_control_data(): aloccode")); - } - } - } - } - } -} -#endif - -#ifdef SCALABLE_DEC -/* Table 4.4.13 ASME */ -void aac_scalable_main_element(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc) -{ - uint8_t retval = 0; - uint8_t channels = hDecoder->fr_channels = 0; - uint8_t ch; - uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; - element cpe = {0}; - ic_stream *ics1 = &(cpe.ics1); - ic_stream *ics2 = &(cpe.ics2); - int16_t *spec_data; - ALIGN int16_t spec_data1[1024] = {0}; - ALIGN int16_t spec_data2[1024] = {0}; - - hDecoder->fr_ch_ele = 0; - - hInfo->error = aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); - if (hInfo->error > 0) - return; - - cpe.common_window = 1; - if (this_layer_stereo) - cpe.ele_id = ID_CPE; - else - cpe.ele_id = ID_SCE; - - hDecoder->element_output_channels[hDecoder->fr_ch_ele] = (this_layer_stereo ? 2 : 0); - - for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++) - { - ic_stream *ics; - if (ch == 0) - { - ics = ics1; - spec_data = spec_data1; - } else { - ics = ics2; - spec_data = spec_data2; - } - - hInfo->error = individual_channel_stream(hDecoder, &cpe, ld, ics, 1, spec_data); - if (hInfo->error > 0) - return; - } - -#ifdef DRM -#ifdef SBR_DEC - /* In case of DRM we need to read the SBR info before channel reconstruction */ - if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) - { - bitfile ld_sbr = {0}; - uint32_t i; - uint16_t count = 0; - uint8_t *revbuffer; - uint8_t *prevbufstart; - uint8_t *pbufend; - - /* all forward bitreading should be finished at this point */ - uint32_t bitsconsumed = faad_get_processed_bits(ld); - uint32_t buffer_size = faad_origbitbuffer_size(ld); - uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); - - if (bitsconsumed + 8 > buffer_size*8) - { - hInfo->error = 14; - return; - } - - if (!hDecoder->sbr[0]) - { - hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, cpe.ele_id, - 2*get_sample_rate(hDecoder->sf_index), 1); - } - - /* Reverse bit reading of SBR data in DRM audio frame */ - revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); - prevbufstart = revbuffer; - pbufend = &buffer[buffer_size - 1]; - for (i = 0; i < buffer_size; i++) - *prevbufstart++ = tabFlipbits[*pbufend--]; - - /* Set SBR data */ - /* consider 8 bits from AAC-CRC */ - count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed); - faad_initbits(&ld_sbr, revbuffer, count); - - hDecoder->sbr[0]->lcstereo_flag = hDecoder->lcstereo_flag; - - hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index); - hDecoder->sbr[0]->sample_rate *= 2; - - faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */ - - hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count); -#if (defined(PS_DEC) || defined(DRM_PS)) - if (hDecoder->sbr[0]->ps_used) - { - hDecoder->ps_used[0] = 1; - } -#endif - - /* check CRC */ - /* no need to check it if there was already an error */ - if (hDecoder->sbr[0]->ret == 0) - hDecoder->sbr[0]->ret = faad_check_CRC(&ld_sbr, faad_get_processed_bits(&ld_sbr) - 8); - - faad_endbits(&ld_sbr); - - if (revbuffer) - faad_free(revbuffer); - } -#endif -#endif - - if (this_layer_stereo) - { - hInfo->error = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2); - if (hInfo->error > 0) - return; - } else { - hInfo->error = reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1); - if (hInfo->error > 0) - return; - } - - /* map output channels position to internal data channels */ - if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) - { - /* this might be faulty when pce_set is true */ - hDecoder->internal_channel[channels] = channels; - hDecoder->internal_channel[channels+1] = channels+1; - } else { - hDecoder->internal_channel[channels] = channels; - } - - hDecoder->element_id[hDecoder->fr_ch_ele] = cpe.ele_id; - - hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; - hDecoder->fr_ch_ele++; - - return; -} - -/* Table 4.4.15 */ -static int8_t aac_scalable_main_header(faacDecHandle hDecoder, ic_stream *ics1, ic_stream *ics2, - bitfile *ld, uint8_t this_layer_stereo) -{ - uint8_t retval = 0; - uint8_t ch; - ic_stream *ics; - - /* ics1->ics_reserved_bit = */ faad_get1bit(ld - DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits")); - ics1->window_sequence = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence")); - ics1->window_shape = faad_get1bit(ld - DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape")); - - if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) - { - ics1->max_sfb = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)")); - ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping")); - } else { - ics1->max_sfb = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)")); - } - - /* get the grouping information */ - if ((retval = window_grouping_info(hDecoder, ics1)) > 0) - return retval; - - /* should be an error */ - /* check the range of max_sfb */ - if (ics1->max_sfb > ics1->num_swb) - return 16; - - if (this_layer_stereo) - { - ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present")); - if (ics1->ms_mask_present == 1) - { - uint8_t g, sfb; - for (g = 0; g < ics1->num_window_groups; g++) - { - for (sfb = 0; sfb < ics1->max_sfb; sfb++) - { - ics1->ms_used[g][sfb] = faad_get1bit(ld - DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit")); - } - } - } - - memcpy(ics2, ics1, sizeof(ic_stream)); - } else { - ics1->ms_mask_present = 0; - } - - if (0) - { - faad_get1bit(ld - DEBUGVAR(1,308,"aac_scalable_main_header(): tns_channel_mono_layer")); - } - - for (ch = 0; ch < (this_layer_stereo ? 2 : 1); ch++) - { - if (ch == 0) - ics = ics1; - else - ics = ics2; - - if ( 1 /*!tvq_layer_pesent || (tns_aac_tvq_en[ch] == 1)*/) - { - if ((ics->tns_data_present = faad_get1bit(ld - DEBUGVAR(1,309,"aac_scalable_main_header(): tns_data_present"))) & 1) - { -#ifdef DRM - /* different order of data units in DRM */ - if (hDecoder->object_type != DRM_ER_LC) -#endif - { - tns_data(ics, &(ics->tns), ld); - } - } - } -#if 0 - if (0 /*core_flag || tvq_layer_pesent*/) - { - if ((ch==0) || ((ch==1) && (core_stereo || tvq_stereo)) - diff_control_data(); - if (mono_stereo_flag) - diff_control_data_lr(); - } else { -#endif - if ((ics->ltp.data_present = faad_get1bit(ld - DEBUGVAR(1,310,"aac_scalable_main_header(): ltp.data_present"))) & 1) - { - if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) - { - return retval; - } - } -#if 0 - } -#endif - } - - return 0; -} -#endif - -/* Table 4.4.24 */ -static uint8_t individual_channel_stream(faacDecHandle hDecoder, element *ele, - bitfile *ld, ic_stream *ics, uint8_t scal_flag, - int16_t *spec_data) -{ - uint8_t result; - - ics->global_gain = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,67,"individual_channel_stream(): global_gain")); - - if (!ele->common_window && !scal_flag) - { - if ((result = ics_info(hDecoder, ics, ld, ele->common_window)) > 0) - return result; - } - - if ((result = section_data(hDecoder, ics, ld)) > 0) - return result; - - if ((result = scale_factor_data(hDecoder, ics, ld)) > 0) - return result; - - if (!scal_flag) - { - /** - ** NOTE: It could be that pulse data is available in scalable AAC too, - ** as said in Amendment 1, this could be only the case for ER AAC, - ** though. (have to check this out later) - **/ - /* get pulse data */ - if ((ics->pulse_data_present = faad_get1bit(ld - DEBUGVAR(1,68,"individual_channel_stream(): pulse_data_present"))) & 1) - { - if ((result = pulse_data(ics, &(ics->pul), ld)) > 0) - return result; - } - - /* get tns data */ - if ((ics->tns_data_present = faad_get1bit(ld - DEBUGVAR(1,69,"individual_channel_stream(): tns_data_present"))) & 1) - { -#ifdef ERROR_RESILIENCE - if (hDecoder->object_type < ER_OBJECT_START) -#endif - tns_data(ics, &(ics->tns), ld); - } - - /* get gain control data */ - if ((ics->gain_control_data_present = faad_get1bit(ld - DEBUGVAR(1,70,"individual_channel_stream(): gain_control_data_present"))) & 1) - { -#ifdef SSR_DEC - if (hDecoder->object_type != SSR) - return 1; - else - gain_control_data(ld, ics); -#else - return 1; -#endif - } - } - -#ifdef ERROR_RESILIENCE - if (hDecoder->aacSpectralDataResilienceFlag) - { - ics->length_of_reordered_spectral_data = (uint16_t)faad_getbits(ld, 14 - DEBUGVAR(1,147,"individual_channel_stream(): length_of_reordered_spectral_data")); - - if (hDecoder->channelConfiguration == 2) - { - if (ics->length_of_reordered_spectral_data > 6144) - ics->length_of_reordered_spectral_data = 6144; - } else { - if (ics->length_of_reordered_spectral_data > 12288) - ics->length_of_reordered_spectral_data = 12288; - } - - ics->length_of_longest_codeword = (uint8_t)faad_getbits(ld, 6 - DEBUGVAR(1,148,"individual_channel_stream(): length_of_longest_codeword")); - if (ics->length_of_longest_codeword >= 49) - ics->length_of_longest_codeword = 49; - } - - /* RVLC spectral data is put here */ - if (hDecoder->aacScalefactorDataResilienceFlag) - { - if ((result = rvlc_decode_scale_factors(ics, ld)) > 0) - return result; - } - - if (hDecoder->object_type >= ER_OBJECT_START) - { - if (ics->tns_data_present) - tns_data(ics, &(ics->tns), ld); - } - -#ifdef DRM - /* CRC check */ - if (hDecoder->object_type == DRM_ER_LC) - if ((result = faad_check_CRC(ld, faad_get_processed_bits(ld) - 8)) > 0) - return result; -#endif - - if (hDecoder->aacSpectralDataResilienceFlag) - { - /* error resilient spectral data decoding */ - if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) - { - return result; - } - } else { -#endif - /* decode the spectral data */ - if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) - { - return result; - } -#ifdef ERROR_RESILIENCE - } -#endif - - /* pulse coding reconstruction */ - if (ics->pulse_data_present) - { - if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) - { - if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) - return result; - } else { - return 2; /* pulse coding not allowed for short blocks */ - } - } - - return 0; -} - -/* Table 4.4.25 */ -static uint8_t section_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld) -{ - uint8_t g; - uint8_t sect_esc_val, sect_bits; - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - sect_bits = 3; - else - sect_bits = 5; - sect_esc_val = (1<max_sfb); - printf(" sect top cb\n"); -#endif - - for (g = 0; g < ics->num_window_groups; g++) - { - uint8_t k = 0; - uint8_t i = 0; - - while (k < ics->max_sfb) - { -#ifdef ERROR_RESILIENCE - uint8_t vcb11 = 0; -#endif - uint8_t sfb; - uint8_t sect_len_incr; - uint16_t sect_len = 0; - uint8_t sect_cb_bits = 4; - - /* if "faad_getbits" detects error and returns "0", "k" is never - incremented and we cannot leave the while loop */ - if ((ld->error != 0) || (ld->no_more_reading)) - return 14; - -#ifdef ERROR_RESILIENCE - if (hDecoder->aacSectionDataResilienceFlag) - sect_cb_bits = 5; -#endif - - ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits - DEBUGVAR(1,71,"section_data(): sect_cb")); - - if (ics->sect_cb[g][i] == NOISE_HCB) - ics->noise_used = 1; - -#ifdef ERROR_RESILIENCE - if (hDecoder->aacSectionDataResilienceFlag) - { - if ((ics->sect_cb[g][i] == 11) || - ((ics->sect_cb[g][i] >= 16) && (ics->sect_cb[g][i] <= 32))) - { - vcb11 = 1; - } - } - if (vcb11) - { - sect_len_incr = 1; - } else { -#endif - sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits - DEBUGVAR(1,72,"section_data(): sect_len_incr")); -#ifdef ERROR_RESILIENCE - } -#endif - while ((sect_len_incr == sect_esc_val) /* && - (k+sect_len < ics->max_sfb)*/) - { - sect_len += sect_len_incr; - sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits - DEBUGVAR(1,72,"section_data(): sect_len_incr")); - } - - sect_len += sect_len_incr; - - ics->sect_start[g][i] = k; - ics->sect_end[g][i] = k + sect_len; - - if (k + sect_len >= 8*15) - return 15; - if (i >= 8*15) - return 15; - - for (sfb = k; sfb < k + sect_len; sfb++) - ics->sfb_cb[g][sfb] = ics->sect_cb[g][i]; - -#if 0 - printf(" %6d %6d %6d\n", - i, - ics->sect_end[g][i], - ics->sect_cb[g][i]); -#endif - - k += sect_len; - i++; - } - ics->num_sec[g] = i; - } - -#if 0 - printf("\n"); -#endif - - return 0; -} - -/* - * decode_scale_factors() - * decodes the scalefactors from the bitstream - */ -/* - * All scalefactors (and also the stereo positions and pns energies) are - * transmitted using Huffman coded DPCM relative to the previous active - * scalefactor (respectively previous stereo position or previous pns energy, - * see subclause 4.6.2 and 4.6.3). The first active scalefactor is - * differentially coded relative to the global gain. - */ -static uint8_t decode_scale_factors(ic_stream *ics, bitfile *ld) -{ - uint8_t g, sfb; - int16_t t; - int8_t noise_pcm_flag = 1; - - int16_t scale_factor = ics->global_gain; - int16_t is_position = 0; - int16_t noise_energy = ics->global_gain - 90; - - for (g = 0; g < ics->num_window_groups; g++) - { - for (sfb = 0; sfb < ics->max_sfb; sfb++) - { - switch (ics->sfb_cb[g][sfb]) - { - case ZERO_HCB: /* zero book */ - ics->scale_factors[g][sfb] = 0; - break; - case INTENSITY_HCB: /* intensity books */ - case INTENSITY_HCB2: - - /* decode intensity position */ - t = huffman_scale_factor(ld); - is_position += (t - 60); - ics->scale_factors[g][sfb] = is_position; - - break; - case NOISE_HCB: /* noise books */ - - /* decode noise energy */ - if (noise_pcm_flag) - { - noise_pcm_flag = 0; - t = (int16_t)faad_getbits(ld, 9 - DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256; - } else { - t = huffman_scale_factor(ld); - t -= 60; - } - noise_energy += t; - ics->scale_factors[g][sfb] = noise_energy; - - break; - default: /* spectral books */ - - /* ics->scale_factors[g][sfb] must be between 0 and 255 */ - - ics->scale_factors[g][sfb] = 0; - - /* decode scale factor */ - t = huffman_scale_factor(ld); - scale_factor += (t - 60); - if (scale_factor < 0 || scale_factor > 255) - return 4; - ics->scale_factors[g][sfb] = scale_factor; - - break; - } - } - } - - return 0; -} - -/* Table 4.4.26 */ -static uint8_t scale_factor_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld) -{ - uint8_t ret = 0; -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - -#ifdef ERROR_RESILIENCE - if (!hDecoder->aacScalefactorDataResilienceFlag) - { -#endif - ret = decode_scale_factors(ics, ld); -#ifdef ERROR_RESILIENCE - } else { - /* In ER AAC the parameters for RVLC are seperated from the actual - data that holds the scale_factors. - Strangely enough, 2 parameters for HCR are put inbetween them. - */ - ret = rvlc_scale_factor_data(ics, ld); - } -#endif - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->scalefac_cycles += count; -#endif - - return ret; -} - -/* Table 4.4.27 */ -static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld) -{ - uint8_t w, filt, i, start_coef_bits, coef_bits; - uint8_t n_filt_bits = 2; - uint8_t length_bits = 6; - uint8_t order_bits = 5; - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - n_filt_bits = 1; - length_bits = 4; - order_bits = 3; - } - - for (w = 0; w < ics->num_windows; w++) - { - tns->n_filt[w] = (uint8_t)faad_getbits(ld, n_filt_bits - DEBUGVAR(1,74,"tns_data(): n_filt")); - - if (tns->n_filt[w]) - { - if ((tns->coef_res[w] = faad_get1bit(ld - DEBUGVAR(1,75,"tns_data(): coef_res"))) & 1) - { - start_coef_bits = 4; - } else { - start_coef_bits = 3; - } - } - - for (filt = 0; filt < tns->n_filt[w]; filt++) - { - tns->length[w][filt] = (uint8_t)faad_getbits(ld, length_bits - DEBUGVAR(1,76,"tns_data(): length")); - tns->order[w][filt] = (uint8_t)faad_getbits(ld, order_bits - DEBUGVAR(1,77,"tns_data(): order")); - if (tns->order[w][filt]) - { - tns->direction[w][filt] = faad_get1bit(ld - DEBUGVAR(1,78,"tns_data(): direction")); - tns->coef_compress[w][filt] = faad_get1bit(ld - DEBUGVAR(1,79,"tns_data(): coef_compress")); - - coef_bits = start_coef_bits - tns->coef_compress[w][filt]; - for (i = 0; i < tns->order[w][filt]; i++) - { - tns->coef[w][filt][i] = (uint8_t)faad_getbits(ld, coef_bits - DEBUGVAR(1,80,"tns_data(): coef")); - } - } - } - } -} - -#ifdef LTP_DEC -/* Table 4.4.28 */ -static uint8_t ltp_data(faacDecHandle hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld) -{ - uint8_t sfb, w; - - ltp->lag = 0; - -#ifdef LD_DEC - if (hDecoder->object_type == LD) - { - ltp->lag_update = (uint8_t)faad_getbits(ld, 1 - DEBUGVAR(1,142,"ltp_data(): lag_update")); - - if (ltp->lag_update) - { - ltp->lag = (uint16_t)faad_getbits(ld, 10 - DEBUGVAR(1,81,"ltp_data(): lag")); - } - } else { -#endif - ltp->lag = (uint16_t)faad_getbits(ld, 11 - DEBUGVAR(1,81,"ltp_data(): lag")); -#ifdef LD_DEC - } -#endif - - /* Check length of lag */ - if (ltp->lag > (hDecoder->frameLength << 1)) - return 18; - - ltp->coef = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,82,"ltp_data(): coef")); - - if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) - { - for (w = 0; w < ics->num_windows; w++) - { - if ((ltp->short_used[w] = faad_get1bit(ld - DEBUGVAR(1,83,"ltp_data(): short_used"))) & 1) - { - ltp->short_lag_present[w] = faad_get1bit(ld - DEBUGVAR(1,84,"ltp_data(): short_lag_present")); - if (ltp->short_lag_present[w]) - { - ltp->short_lag[w] = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,85,"ltp_data(): short_lag")); - } - } - } - } else { - ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB); - - for (sfb = 0; sfb < ltp->last_band; sfb++) - { - ltp->long_used[sfb] = faad_get1bit(ld - DEBUGVAR(1,86,"ltp_data(): long_used")); - } - } - - return 0; -} -#endif - -/* Table 4.4.29 */ -static uint8_t spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data) -{ - int8_t i; - uint8_t g; - uint16_t inc, k, p = 0; - uint8_t groups = 0; - uint8_t sect_cb; - uint8_t result; - uint16_t nshort = hDecoder->frameLength/8; - -#ifdef PROFILE - int64_t count = faad_get_ts(); -#endif - - for(g = 0; g < ics->num_window_groups; g++) - { - p = groups*nshort; - - for (i = 0; i < ics->num_sec[g]; i++) - { - sect_cb = ics->sect_cb[g][i]; - - inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; - - switch (sect_cb) - { - case ZERO_HCB: - case NOISE_HCB: - case INTENSITY_HCB: - case INTENSITY_HCB2: - p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] - - ics->sect_sfb_offset[g][ics->sect_start[g][i]]); - break; - default: - for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; - k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) - { - if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) - return result; - p += inc; - } - break; - } - } - groups += ics->window_group_length[g]; - } - -#ifdef PROFILE - count = faad_get_ts() - count; - hDecoder->spectral_cycles += count; -#endif - - return 0; -} - -/* Table 4.4.30 */ -static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) -{ - uint16_t i, n, dataElementLength; - uint8_t dataElementLengthPart; - uint8_t align = 4, data_element_version, loopCounter; - - uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,87,"extension_payload(): extension_type")); - - switch (extension_type) - { - case EXT_DYNAMIC_RANGE: - drc->present = 1; - n = dynamic_range_info(ld, drc); - return n; - case EXT_FILL_DATA: - /* fill_nibble = */ faad_getbits(ld, 4 - DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be ‘0000’ */ - for (i = 0; i < count-1; i++) - { - /* fill_byte[i] = */ faad_getbits(ld, 8 - DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be ‘10100101’ */ - } - return count; - case EXT_DATA_ELEMENT: - data_element_version = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,400,"extension_payload(): data_element_version")); - switch (data_element_version) - { - case ANC_DATA: - loopCounter = 0; - dataElementLength = 0; - do { - dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); - dataElementLength += dataElementLengthPart; - loopCounter++; - } while (dataElementLengthPart == 255); - - for (i = 0; i < dataElementLength; i++) - { - /* data_element_byte[i] = */ faad_getbits(ld, 8 - DEBUGVAR(1,402,"extension_payload(): data_element_byte")); - return (dataElementLength+loopCounter+1); - } - default: - align = 0; - } - case EXT_FIL: - default: - faad_getbits(ld, align - DEBUGVAR(1,88,"extension_payload(): fill_nibble")); - for (i = 0; i < count-1; i++) - { - /* other_bits[i] = */ faad_getbits(ld, 8 - DEBUGVAR(1,89,"extension_payload(): fill_bit")); - } - return count; - } -} - -/* Table 4.4.31 */ -static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) -{ - uint8_t i, n = 1; - uint8_t band_incr; - - drc->num_bands = 1; - - if (faad_get1bit(ld - DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) - { - drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); - /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 - DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); - n++; - } - - drc->excluded_chns_present = faad_get1bit(ld - DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); - if (drc->excluded_chns_present == 1) - { - n += excluded_channels(ld, drc); - } - - if (faad_get1bit(ld - DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) - { - band_incr = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); - /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 - DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); - n++; - drc->num_bands += band_incr; - - for (i = 0; i < drc->num_bands; i++); - { - drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 - DEBUGVAR(1,97,"dynamic_range_info(): band_top")); - n++; - } - } - - if (faad_get1bit(ld - DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) - { - drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); - /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld - DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); - n++; - } - - for (i = 0; i < drc->num_bands; i++) - { - drc->dyn_rng_sgn[i] = faad_get1bit(ld - DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); - drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 - DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); - n++; - } - - return n; -} - -/* Table 4.4.32 */ -static uint8_t excluded_channels(bitfile *ld, drc_info *drc) -{ - uint8_t i, n = 0; - uint8_t num_excl_chan = 7; - - for (i = 0; i < 7; i++) - { - drc->exclude_mask[i] = faad_get1bit(ld - DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); - } - n++; - - while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld - DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) - { - for (i = num_excl_chan; i < num_excl_chan+7; i++) - { - drc->exclude_mask[i] = faad_get1bit(ld - DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); - } - n++; - num_excl_chan += 7; - } - - return n; -} - -/* Annex A: Audio Interchange Formats */ - -/* Table 1.A.2 */ -void get_adif_header(adif_header *adif, bitfile *ld) -{ - uint8_t i; - - /* adif_id[0] = */ faad_getbits(ld, 8 - DEBUGVAR(1,106,"get_adif_header(): adif_id[0]")); - /* adif_id[1] = */ faad_getbits(ld, 8 - DEBUGVAR(1,107,"get_adif_header(): adif_id[1]")); - /* adif_id[2] = */ faad_getbits(ld, 8 - DEBUGVAR(1,108,"get_adif_header(): adif_id[2]")); - /* adif_id[3] = */ faad_getbits(ld, 8 - DEBUGVAR(1,109,"get_adif_header(): adif_id[3]")); - adif->copyright_id_present = faad_get1bit(ld - DEBUGVAR(1,110,"get_adif_header(): copyright_id_present")); - if(adif->copyright_id_present) - { - for (i = 0; i < 72/8; i++) - { - adif->copyright_id[i] = (int8_t)faad_getbits(ld, 8 - DEBUGVAR(1,111,"get_adif_header(): copyright_id")); - } - adif->copyright_id[i] = 0; - } - adif->original_copy = faad_get1bit(ld - DEBUGVAR(1,112,"get_adif_header(): original_copy")); - adif->home = faad_get1bit(ld - DEBUGVAR(1,113,"get_adif_header(): home")); - adif->bitstream_type = faad_get1bit(ld - DEBUGVAR(1,114,"get_adif_header(): bitstream_type")); - adif->bitrate = faad_getbits(ld, 23 - DEBUGVAR(1,115,"get_adif_header(): bitrate")); - adif->num_program_config_elements = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,116,"get_adif_header(): num_program_config_elements")); - - for (i = 0; i < adif->num_program_config_elements + 1; i++) - { - if(adif->bitstream_type == 0) - { - adif->adif_buffer_fullness = faad_getbits(ld, 20 - DEBUGVAR(1,117,"get_adif_header(): adif_buffer_fullness")); - } else { - adif->adif_buffer_fullness = 0; - } - - program_config_element(&adif->pce[i], ld); - } -} - -/* Table 1.A.5 */ -uint8_t adts_frame(adts_header *adts, bitfile *ld) -{ - /* faad_byte_align(ld); */ - if (adts_fixed_header(adts, ld)) - return 5; - adts_variable_header(adts, ld); - adts_error_check(adts, ld); - - return 0; -} - -/* Table 1.A.6 */ -static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld) -{ - uint16_t i; - uint8_t sync_err = 1; - - /* try to recover from sync errors */ - for (i = 0; i < 768; i++) - { - adts->syncword = (uint16_t)faad_showbits(ld, 12); - if (adts->syncword != 0xFFF) - { - faad_getbits(ld, 8 - DEBUGVAR(0,0,"")); - } else { - sync_err = 0; - faad_getbits(ld, 12 - DEBUGVAR(1,118,"adts_fixed_header(): syncword")); - break; - } - } - if (sync_err) - return 5; - - adts->id = faad_get1bit(ld - DEBUGVAR(1,119,"adts_fixed_header(): id")); - adts->layer = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,120,"adts_fixed_header(): layer")); - adts->protection_absent = faad_get1bit(ld - DEBUGVAR(1,121,"adts_fixed_header(): protection_absent")); - adts->profile = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,122,"adts_fixed_header(): profile")); - adts->sf_index = (uint8_t)faad_getbits(ld, 4 - DEBUGVAR(1,123,"adts_fixed_header(): sf_index")); - adts->private_bit = faad_get1bit(ld - DEBUGVAR(1,124,"adts_fixed_header(): private_bit")); - adts->channel_configuration = (uint8_t)faad_getbits(ld, 3 - DEBUGVAR(1,125,"adts_fixed_header(): channel_configuration")); - adts->original = faad_get1bit(ld - DEBUGVAR(1,126,"adts_fixed_header(): original")); - adts->home = faad_get1bit(ld - DEBUGVAR(1,127,"adts_fixed_header(): home")); - - if (adts->old_format == 1) - { - /* Removed in corrigendum 14496-3:2002 */ - if (adts->id == 0) - { - adts->emphasis = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,128,"adts_fixed_header(): emphasis")); - } - } - - return 0; -} - -/* Table 1.A.7 */ -static void adts_variable_header(adts_header *adts, bitfile *ld) -{ - adts->copyright_identification_bit = faad_get1bit(ld - DEBUGVAR(1,129,"adts_variable_header(): copyright_identification_bit")); - adts->copyright_identification_start = faad_get1bit(ld - DEBUGVAR(1,130,"adts_variable_header(): copyright_identification_start")); - adts->aac_frame_length = (uint16_t)faad_getbits(ld, 13 - DEBUGVAR(1,131,"adts_variable_header(): aac_frame_length")); - adts->adts_buffer_fullness = (uint16_t)faad_getbits(ld, 11 - DEBUGVAR(1,132,"adts_variable_header(): adts_buffer_fullness")); - adts->no_raw_data_blocks_in_frame = (uint8_t)faad_getbits(ld, 2 - DEBUGVAR(1,133,"adts_variable_header(): no_raw_data_blocks_in_frame")); -} - -/* Table 1.A.8 */ -static void adts_error_check(adts_header *adts, bitfile *ld) -{ - if (adts->protection_absent == 0) - { - adts->crc_check = (uint16_t)faad_getbits(ld, 16 - DEBUGVAR(1,134,"adts_error_check(): crc_check")); - } -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: syntax.c,v 1.93 2009/01/26 23:51:15 menno Exp $ +**/ + +/* + Reads the AAC bitstream as defined in 14496-3 (MPEG-4 Audio) +*/ + +#include "common.h" +#include "structs.h" + +#include +#include +#include + +#include "syntax.h" +#include "specrec.h" +#include "huffman.h" +#include "bits.h" +#include "pulse.h" +#include "analysis.h" +#include "drc.h" +#ifdef ERROR_RESILIENCE +#include "rvlc.h" +#endif +#ifdef SBR_DEC +#include "sbr_syntax.h" +#endif +#include "mp4.h" + + +/* static function declarations */ +static void decode_sce_lfe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, + uint8_t id_syn_ele); +static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, + uint8_t id_syn_ele); +static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, + uint8_t channel, uint8_t *tag); +static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, + uint8_t channel, uint8_t *tag); +#ifdef COUPLING_DEC +static uint8_t coupling_channel_element(NeAACDecStruct *hDecoder, bitfile *ld); +#endif +static uint16_t data_stream_element(NeAACDecStruct *hDecoder, bitfile *ld); +static uint8_t program_config_element(program_config *pce, bitfile *ld); +static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc +#ifdef SBR_DEC + ,uint8_t sbr_ele +#endif + ); +static uint8_t individual_channel_stream(NeAACDecStruct *hDecoder, element *ele, + bitfile *ld, ic_stream *ics, uint8_t scal_flag, + int16_t *spec_data); +static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, + uint8_t common_window); +static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld); +static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld); +#ifdef SSR_DEC +static void gain_control_data(bitfile *ld, ic_stream *ics); +#endif +static uint8_t spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, + int16_t *spectral_data); +static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); +static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld); +static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld); +#ifdef LTP_DEC +static uint8_t ltp_data(NeAACDecStruct *hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld); +#endif +static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld); +static void adts_variable_header(adts_header *adts, bitfile *ld); +static void adts_error_check(adts_header *adts, bitfile *ld); +static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); +static uint8_t excluded_channels(bitfile *ld, drc_info *drc); +static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, + bitfile *ld, ic_stream *ics, uint8_t scal_flag); +#ifdef DRM +static int8_t DRM_aac_scalable_main_header(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, + bitfile *ld, uint8_t this_layer_stereo); +#endif + + +/* Table 4.4.1 */ +int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, + program_config *pce_out) +{ + program_config pce; + + /* 1024 or 960 */ + mp4ASC->frameLengthFlag = faad_get1bit(ld + DEBUGVAR(1,138,"GASpecificConfig(): FrameLengthFlag")); +#ifndef ALLOW_SMALL_FRAMELENGTH + if (mp4ASC->frameLengthFlag == 1) + return -3; +#endif + + mp4ASC->dependsOnCoreCoder = faad_get1bit(ld + DEBUGVAR(1,139,"GASpecificConfig(): DependsOnCoreCoder")); + if (mp4ASC->dependsOnCoreCoder == 1) + { + mp4ASC->coreCoderDelay = (uint16_t)faad_getbits(ld, 14 + DEBUGVAR(1,140,"GASpecificConfig(): CoreCoderDelay")); + } + + mp4ASC->extensionFlag = faad_get1bit(ld DEBUGVAR(1,141,"GASpecificConfig(): ExtensionFlag")); + if (mp4ASC->channelsConfiguration == 0) + { + if (program_config_element(&pce, ld)) + return -3; + //mp4ASC->channelsConfiguration = pce.channels; + + if (pce_out != NULL) + memcpy(pce_out, &pce, sizeof(program_config)); + + /* + if (pce.num_valid_cc_elements) + return -3; + */ + } + +#ifdef ERROR_RESILIENCE + if (mp4ASC->extensionFlag == 1) + { + /* Error resilience not supported yet */ + if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) + { + mp4ASC->aacSectionDataResilienceFlag = faad_get1bit(ld + DEBUGVAR(1,144,"GASpecificConfig(): aacSectionDataResilienceFlag")); + mp4ASC->aacScalefactorDataResilienceFlag = faad_get1bit(ld + DEBUGVAR(1,145,"GASpecificConfig(): aacScalefactorDataResilienceFlag")); + mp4ASC->aacSpectralDataResilienceFlag = faad_get1bit(ld + DEBUGVAR(1,146,"GASpecificConfig(): aacSpectralDataResilienceFlag")); + } + /* 1 bit: extensionFlag3 */ + faad_getbits(ld, 1); + } +#endif + + return 0; +} + +/* Table 4.4.2 */ +/* An MPEG-4 Audio decoder is only required to follow the Program + Configuration Element in GASpecificConfig(). The decoder shall ignore + any Program Configuration Elements that may occur in raw data blocks. + PCEs transmitted in raw data blocks cannot be used to convey decoder + configuration information. +*/ +static uint8_t program_config_element(program_config *pce, bitfile *ld) +{ + uint8_t i; + + memset(pce, 0, sizeof(program_config)); + + pce->channels = 0; + + pce->element_instance_tag = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,10,"program_config_element(): element_instance_tag")); + + pce->object_type = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,11,"program_config_element(): object_type")); + pce->sf_index = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,12,"program_config_element(): sf_index")); + pce->num_front_channel_elements = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,13,"program_config_element(): num_front_channel_elements")); + pce->num_side_channel_elements = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,14,"program_config_element(): num_side_channel_elements")); + pce->num_back_channel_elements = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,15,"program_config_element(): num_back_channel_elements")); + pce->num_lfe_channel_elements = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,16,"program_config_element(): num_lfe_channel_elements")); + pce->num_assoc_data_elements = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,17,"program_config_element(): num_assoc_data_elements")); + pce->num_valid_cc_elements = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,18,"program_config_element(): num_valid_cc_elements")); + + pce->mono_mixdown_present = faad_get1bit(ld + DEBUGVAR(1,19,"program_config_element(): mono_mixdown_present")); + if (pce->mono_mixdown_present == 1) + { + pce->mono_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,20,"program_config_element(): mono_mixdown_element_number")); + } + + pce->stereo_mixdown_present = faad_get1bit(ld + DEBUGVAR(1,21,"program_config_element(): stereo_mixdown_present")); + if (pce->stereo_mixdown_present == 1) + { + pce->stereo_mixdown_element_number = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,22,"program_config_element(): stereo_mixdown_element_number")); + } + + pce->matrix_mixdown_idx_present = faad_get1bit(ld + DEBUGVAR(1,23,"program_config_element(): matrix_mixdown_idx_present")); + if (pce->matrix_mixdown_idx_present == 1) + { + pce->matrix_mixdown_idx = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,24,"program_config_element(): matrix_mixdown_idx")); + pce->pseudo_surround_enable = faad_get1bit(ld + DEBUGVAR(1,25,"program_config_element(): pseudo_surround_enable")); + } + + for (i = 0; i < pce->num_front_channel_elements; i++) + { + pce->front_element_is_cpe[i] = faad_get1bit(ld + DEBUGVAR(1,26,"program_config_element(): front_element_is_cpe")); + pce->front_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,27,"program_config_element(): front_element_tag_select")); + + if (pce->front_element_is_cpe[i] & 1) + { + pce->cpe_channel[pce->front_element_tag_select[i]] = pce->channels; + pce->num_front_channels += 2; + pce->channels += 2; + } else { + pce->sce_channel[pce->front_element_tag_select[i]] = pce->channels; + pce->num_front_channels++; + pce->channels++; + } + } + + for (i = 0; i < pce->num_side_channel_elements; i++) + { + pce->side_element_is_cpe[i] = faad_get1bit(ld + DEBUGVAR(1,28,"program_config_element(): side_element_is_cpe")); + pce->side_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,29,"program_config_element(): side_element_tag_select")); + + if (pce->side_element_is_cpe[i] & 1) + { + pce->cpe_channel[pce->side_element_tag_select[i]] = pce->channels; + pce->num_side_channels += 2; + pce->channels += 2; + } else { + pce->sce_channel[pce->side_element_tag_select[i]] = pce->channels; + pce->num_side_channels++; + pce->channels++; + } + } + + for (i = 0; i < pce->num_back_channel_elements; i++) + { + pce->back_element_is_cpe[i] = faad_get1bit(ld + DEBUGVAR(1,30,"program_config_element(): back_element_is_cpe")); + pce->back_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,31,"program_config_element(): back_element_tag_select")); + + if (pce->back_element_is_cpe[i] & 1) + { + pce->cpe_channel[pce->back_element_tag_select[i]] = pce->channels; + pce->channels += 2; + pce->num_back_channels += 2; + } else { + pce->sce_channel[pce->back_element_tag_select[i]] = pce->channels; + pce->num_back_channels++; + pce->channels++; + } + } + + for (i = 0; i < pce->num_lfe_channel_elements; i++) + { + pce->lfe_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,32,"program_config_element(): lfe_element_tag_select")); + + pce->sce_channel[pce->lfe_element_tag_select[i]] = pce->channels; + pce->num_lfe_channels++; + pce->channels++; + } + + for (i = 0; i < pce->num_assoc_data_elements; i++) + pce->assoc_data_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,33,"program_config_element(): assoc_data_element_tag_select")); + + for (i = 0; i < pce->num_valid_cc_elements; i++) + { + pce->cc_element_is_ind_sw[i] = faad_get1bit(ld + DEBUGVAR(1,34,"program_config_element(): cc_element_is_ind_sw")); + pce->valid_cc_element_tag_select[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,35,"program_config_element(): valid_cc_element_tag_select")); + } + + faad_byte_align(ld); + + pce->comment_field_bytes = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,36,"program_config_element(): comment_field_bytes")); + + for (i = 0; i < pce->comment_field_bytes; i++) + { + pce->comment_field_data[i] = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,37,"program_config_element(): comment_field_data")); + } + pce->comment_field_data[i] = 0; + + if (pce->channels > MAX_CHANNELS) + return 22; + + return 0; +} + +static void decode_sce_lfe(NeAACDecStruct *hDecoder, + NeAACDecFrameInfo *hInfo, bitfile *ld, + uint8_t id_syn_ele) +{ + uint8_t channels = hDecoder->fr_channels; + uint8_t tag = 0; + + if (channels+1 > MAX_CHANNELS) + { + hInfo->error = 12; + return; + } + if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) + { + hInfo->error = 13; + return; + } + + /* for SCE hDecoder->element_output_channels[] is not set here because this + can become 2 when some form of Parametric Stereo coding is used + */ + + /* save the syntax element id */ + hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; + + /* decode the element */ + hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); + + /* map output channels position to internal data channels */ + if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) + { + /* this might be faulty when pce_set is true */ + hDecoder->internal_channel[channels] = channels; + hDecoder->internal_channel[channels+1] = channels+1; + } else { + if (hDecoder->pce_set) + hDecoder->internal_channel[hDecoder->pce.sce_channel[tag]] = channels; + else + hDecoder->internal_channel[channels] = channels; + } + + hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; + hDecoder->fr_ch_ele++; +} + +static void decode_cpe(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, + uint8_t id_syn_ele) +{ + uint8_t channels = hDecoder->fr_channels; + uint8_t tag = 0; + + if (channels+2 > MAX_CHANNELS) + { + hInfo->error = 12; + return; + } + if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) + { + hInfo->error = 13; + return; + } + + /* for CPE the number of output channels is always 2 */ + if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) + { + /* element_output_channels not set yet */ + hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; + } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { + /* element inconsistency */ + hInfo->error = 21; + return; + } + + /* save the syntax element id */ + hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; + + /* decode the element */ + hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); + + /* map output channel position to internal data channels */ + if (hDecoder->pce_set) + { + hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; + hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; + } else { + hDecoder->internal_channel[channels] = channels; + hDecoder->internal_channel[channels+1] = channels+1; + } + + hDecoder->fr_channels += 2; + hDecoder->fr_ch_ele++; +} + +void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, + bitfile *ld, program_config *pce, drc_info *drc) +{ + uint8_t id_syn_ele; + uint8_t ele_this_frame = 0; + + hDecoder->fr_channels = 0; + hDecoder->fr_ch_ele = 0; + hDecoder->first_syn_ele = 25; + hDecoder->has_lfe = 0; + +#ifdef ERROR_RESILIENCE + if (hDecoder->object_type < ER_OBJECT_START) + { +#endif + /* Table 4.4.3: raw_data_block() */ + while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID + DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) + { + switch (id_syn_ele) { + case ID_SCE: + ele_this_frame++; + if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; + decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); + if (hInfo->error > 0) + return; + break; + case ID_CPE: + ele_this_frame++; + if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; + decode_cpe(hDecoder, hInfo, ld, id_syn_ele); + if (hInfo->error > 0) + return; + break; + case ID_LFE: +#ifdef DRM + hInfo->error = 32; +#else + ele_this_frame++; + hDecoder->has_lfe++; + decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); +#endif + if (hInfo->error > 0) + return; + break; + case ID_CCE: /* not implemented yet, but skip the bits */ +#ifdef DRM + hInfo->error = 32; +#else + ele_this_frame++; +#ifdef COUPLING_DEC + hInfo->error = coupling_channel_element(hDecoder, ld); +#else + hInfo->error = 6; +#endif +#endif + if (hInfo->error > 0) + return; + break; + case ID_DSE: + ele_this_frame++; + data_stream_element(hDecoder, ld); + break; + case ID_PCE: + if (ele_this_frame != 0) + { + hInfo->error = 31; + return; + } + ele_this_frame++; + /* 14496-4: 5.6.4.1.2.1.3: */ + /* program_configuration_element()'s in access units shall be ignored */ + program_config_element(pce, ld); + //if ((hInfo->error = program_config_element(pce, ld)) > 0) + // return; + //hDecoder->pce_set = 1; + break; + case ID_FIL: + ele_this_frame++; + /* one sbr_info describes a channel_element not a channel! */ + /* if we encounter SBR data here: error */ + /* SBR data will be read directly in the SCE/LFE/CPE element */ + if ((hInfo->error = fill_element(hDecoder, ld, drc +#ifdef SBR_DEC + , INVALID_SBR_ELEMENT +#endif + )) > 0) + return; + break; + } + } +#ifdef ERROR_RESILIENCE + } else { + /* Table 262: er_raw_data_block() */ + switch (hDecoder->channelConfiguration) + { + case 1: + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + if (hInfo->error > 0) + return; + break; + case 2: + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + if (hInfo->error > 0) + return; + break; + case 3: + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + if (hInfo->error > 0) + return; + break; + case 4: + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + if (hInfo->error > 0) + return; + break; + case 5: + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + if (hInfo->error > 0) + return; + break; + case 6: + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); + if (hInfo->error > 0) + return; + break; + case 7: /* 8 channels */ + decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_cpe(hDecoder, hInfo, ld, ID_CPE); + decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); + if (hInfo->error > 0) + return; + break; + default: + hInfo->error = 7; + return; + } +#if 0 + cnt = bits_to_decode() / 8; + while (cnt >= 1) + { + cnt -= extension_payload(cnt); + } +#endif + } +#endif + + /* new in corrigendum 14496-3:2002 */ +#ifdef DRM + if (hDecoder->object_type != DRM_ER_LC +#if 0 + && !hDecoder->latm_header_present +#endif + ) +#endif + { + faad_byte_align(ld); + } + + return; +} + +/* Table 4.4.4 and */ +/* Table 4.4.9 */ +static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, + uint8_t channel, uint8_t *tag) +{ + uint8_t retval = 0; + element sce = {0}; + ic_stream *ics = &(sce.ics1); + ALIGN int16_t spec_data[1024] = {0}; + + sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG + DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); + + *tag = sce.element_instance_tag; + sce.channel = channel; + sce.paired_channel = -1; + + retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); + if (retval > 0) + return retval; + + /* IS not allowed in single channel */ + if (ics->is_used) + return 32; + +#ifdef SBR_DEC + /* check if next bitstream element is a fill element */ + /* if so, read it now so SBR decoding can be done in case of a file with SBR */ + if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) + { + faad_flushbits(ld, LEN_SE_ID); + + /* one sbr_info describes a channel_element not a channel! */ + if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) + { + return retval; + } + } +#endif + + /* noiseless coding is done, spectral reconstruction is done now */ + retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); + if (retval > 0) + return retval; + + return 0; +} + +/* Table 4.4.5 */ +static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, + uint8_t channels, uint8_t *tag) +{ + ALIGN int16_t spec_data1[1024] = {0}; + ALIGN int16_t spec_data2[1024] = {0}; + element cpe = {0}; + ic_stream *ics1 = &(cpe.ics1); + ic_stream *ics2 = &(cpe.ics2); + uint8_t result; + + cpe.channel = channels; + cpe.paired_channel = channels+1; + + cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG + DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); + *tag = cpe.element_instance_tag; + + if ((cpe.common_window = faad_get1bit(ld + DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) + { + /* both channels have common ics information */ + if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) + return result; + + ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); + if (ics1->ms_mask_present == 3) + { + /* bitstream error */ + return 32; + } + if (ics1->ms_mask_present == 1) + { + uint8_t g, sfb; + for (g = 0; g < ics1->num_window_groups; g++) + { + for (sfb = 0; sfb < ics1->max_sfb; sfb++) + { + ics1->ms_used[g][sfb] = faad_get1bit(ld + DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); + } + } + } + +#ifdef ERROR_RESILIENCE + if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) + { + if (( +#ifdef LTP_DEC + ics1->ltp.data_present = +#endif + faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) + { +#ifdef LTP_DEC + if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) + { + return result; + } +#else + return 26; +#endif + } + } +#endif + + memcpy(ics2, ics1, sizeof(ic_stream)); + } else { + ics1->ms_mask_present = 0; + } + + if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, + 0, spec_data1)) > 0) + { + return result; + } + +#ifdef ERROR_RESILIENCE + if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && + (ics1->predictor_data_present)) + { + if (( +#ifdef LTP_DEC + ics1->ltp2.data_present = +#endif + faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) + { +#ifdef LTP_DEC + if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) + { + return result; + } +#else + return 26; +#endif + } + } +#endif + + if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, + 0, spec_data2)) > 0) + { + return result; + } + +#ifdef SBR_DEC + /* check if next bitstream element is a fill element */ + /* if so, read it now so SBR decoding can be done in case of a file with SBR */ + if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) + { + faad_flushbits(ld, LEN_SE_ID); + + /* one sbr_info describes a channel_element not a channel! */ + if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) + { + return result; + } + } +#endif + + /* noiseless coding is done, spectral reconstruction is done now */ + if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, + spec_data1, spec_data2)) > 0) + { + return result; + } + + return 0; +} + +/* Table 4.4.6 */ +static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, + uint8_t common_window) +{ + uint8_t retval = 0; + uint8_t ics_reserved_bit; + + ics_reserved_bit = faad_get1bit(ld + DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); + if (ics_reserved_bit != 0) + return 32; + ics->window_sequence = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,44,"ics_info(): window_sequence")); + ics->window_shape = faad_get1bit(ld + DEBUGVAR(1,45,"ics_info(): window_shape")); + +#ifdef LD_DEC + /* No block switching in LD */ + if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) + return 32; +#endif + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + { + ics->max_sfb = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); + ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 + DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); + } else { + ics->max_sfb = (uint8_t)faad_getbits(ld, 6 + DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); + } + + /* get the grouping information */ + if ((retval = window_grouping_info(hDecoder, ics)) > 0) + return retval; + + + /* should be an error */ + /* check the range of max_sfb */ + if (ics->max_sfb > ics->num_swb) + return 16; + + if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) + { + if ((ics->predictor_data_present = faad_get1bit(ld + DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) + { + if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ + { + uint8_t sfb; + + uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); +#ifdef MAIN_DEC + ics->pred.limit = limit; +#endif + + if (( +#ifdef MAIN_DEC + ics->pred.predictor_reset = +#endif + faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset"))) & 1) + { +#ifdef MAIN_DEC + ics->pred.predictor_reset_group_number = +#endif + (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); + } + + for (sfb = 0; sfb < limit; sfb++) + { +#ifdef MAIN_DEC + ics->pred.prediction_used[sfb] = +#endif + faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); + } + } +#ifdef LTP_DEC + else { /* Long Term Prediction */ + if (hDecoder->object_type < ER_OBJECT_START) + { + if ((ics->ltp.data_present = faad_get1bit(ld + DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) + { + if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) + { + return retval; + } + } + if (common_window) + { + if ((ics->ltp2.data_present = faad_get1bit(ld + DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) + { + if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) + { + return retval; + } + } + } + } +#ifdef ERROR_RESILIENCE + if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) + { + if ((ics->ltp.data_present = faad_get1bit(ld + DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) + { + ltp_data(hDecoder, ics, &(ics->ltp), ld); + } + } +#endif + } +#endif + } + } + + return retval; +} + +/* Table 4.4.7 */ +static uint8_t pulse_data(ic_stream *ics, pulse_info *pul, bitfile *ld) +{ + uint8_t i; + + pul->number_pulse = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,56,"pulse_data(): number_pulse")); + pul->pulse_start_sfb = (uint8_t)faad_getbits(ld, 6 + DEBUGVAR(1,57,"pulse_data(): pulse_start_sfb")); + + /* check the range of pulse_start_sfb */ + if (pul->pulse_start_sfb > ics->num_swb) + return 16; + + for (i = 0; i < pul->number_pulse+1; i++) + { + pul->pulse_offset[i] = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,58,"pulse_data(): pulse_offset")); +#if 0 + printf("%d\n", pul->pulse_offset[i]); +#endif + pul->pulse_amp[i] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,59,"pulse_data(): pulse_amp")); +#if 0 + printf("%d\n", pul->pulse_amp[i]); +#endif + } + + return 0; +} + +#ifdef COUPLING_DEC +/* Table 4.4.8: Currently just for skipping the bits... */ +static uint8_t coupling_channel_element(NeAACDecStruct *hDecoder, bitfile *ld) +{ + uint8_t c, result = 0; + uint8_t ind_sw_cce_flag = 0; + uint8_t num_gain_element_lists = 0; + uint8_t num_coupled_elements = 0; + + element el_empty = {0}; + ic_stream ics_empty = {0}; + int16_t sh_data[1024]; + + c = faad_getbits(ld, LEN_TAG + DEBUGVAR(1,900,"coupling_channel_element(): element_instance_tag")); + + ind_sw_cce_flag = faad_get1bit(ld + DEBUGVAR(1,901,"coupling_channel_element(): ind_sw_cce_flag")); + num_coupled_elements = faad_getbits(ld, 3 + DEBUGVAR(1,902,"coupling_channel_element(): num_coupled_elements")); + + for (c = 0; c < num_coupled_elements + 1; c++) + { + uint8_t cc_target_is_cpe, cc_target_tag_select; + + num_gain_element_lists++; + + cc_target_is_cpe = faad_get1bit(ld + DEBUGVAR(1,903,"coupling_channel_element(): cc_target_is_cpe")); + cc_target_tag_select = faad_getbits(ld, 4 + DEBUGVAR(1,904,"coupling_channel_element(): cc_target_tag_select")); + + if (cc_target_is_cpe) + { + uint8_t cc_l = faad_get1bit(ld + DEBUGVAR(1,905,"coupling_channel_element(): cc_l")); + uint8_t cc_r = faad_get1bit(ld + DEBUGVAR(1,906,"coupling_channel_element(): cc_r")); + + if (cc_l && cc_r) + num_gain_element_lists++; + } + } + + faad_get1bit(ld + DEBUGVAR(1,907,"coupling_channel_element(): cc_domain")); + faad_get1bit(ld + DEBUGVAR(1,908,"coupling_channel_element(): gain_element_sign")); + faad_getbits(ld, 2 + DEBUGVAR(1,909,"coupling_channel_element(): gain_element_scale")); + + if ((result = individual_channel_stream(hDecoder, &el_empty, ld, &ics_empty, + 0, sh_data)) > 0) + { + return result; + } + + /* IS not allowed in single channel */ + if (ics->is_used) + return 32; + + for (c = 1; c < num_gain_element_lists; c++) + { + uint8_t cge; + + if (ind_sw_cce_flag) + { + cge = 1; + } else { + cge = faad_get1bit(ld + DEBUGVAR(1,910,"coupling_channel_element(): common_gain_element_present")); + } + + if (cge) + { + huffman_scale_factor(ld); + } else { + uint8_t g, sfb; + + for (g = 0; g < ics_empty.num_window_groups; g++) + { + for (sfb = 0; sfb < ics_empty.max_sfb; sfb++) + { + if (ics_empty.sfb_cb[g][sfb] != ZERO_HCB) + huffman_scale_factor(ld); + } + } + } + } + + return 0; +} +#endif + +/* Table 4.4.10 */ +static uint16_t data_stream_element(NeAACDecStruct *hDecoder, bitfile *ld) +{ + uint8_t byte_aligned; + uint16_t i, count; + + /* element_instance_tag = */ faad_getbits(ld, LEN_TAG + DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); + byte_aligned = faad_get1bit(ld + DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); + count = (uint16_t)faad_getbits(ld, 8 + DEBUGVAR(1,62,"data_stream_element(): count")); + if (count == 255) + { + count += (uint16_t)faad_getbits(ld, 8 + DEBUGVAR(1,63,"data_stream_element(): extra count")); + } + if (byte_aligned) + faad_byte_align(ld); + + for (i = 0; i < count; i++) + { + faad_getbits(ld, LEN_BYTE + DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); + } + + return count; +} + +/* Table 4.4.11 */ +static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc +#ifdef SBR_DEC + ,uint8_t sbr_ele +#endif + ) +{ + uint16_t count; +#ifdef SBR_DEC + uint8_t bs_extension_type; +#endif + + count = (uint16_t)faad_getbits(ld, 4 + DEBUGVAR(1,65,"fill_element(): count")); + if (count == 15) + { + count += (uint16_t)faad_getbits(ld, 8 + DEBUGVAR(1,66,"fill_element(): extra count")) - 1; + } + + if (count > 0) + { +#ifdef SBR_DEC + bs_extension_type = (uint8_t)faad_showbits(ld, 4); + + if ((bs_extension_type == EXT_SBR_DATA) || + (bs_extension_type == EXT_SBR_DATA_CRC)) + { + if (sbr_ele == INVALID_SBR_ELEMENT) + return 24; + + if (!hDecoder->sbr[sbr_ele]) + { + hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, + hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index), + hDecoder->downSampledSBR +#ifdef DRM + , 0 +#endif + ); + } + + hDecoder->sbr_present_flag = 1; + + /* parse the SBR data */ + hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count, + hDecoder->postSeekResetFlag); + +#if 0 + if (hDecoder->sbr[sbr_ele]->ret > 0) + { + printf("%s\n", NeAACDecGetErrorMessage(hDecoder->sbr[sbr_ele]->ret)); + } +#endif + +#if (defined(PS_DEC) || defined(DRM_PS)) + if (hDecoder->sbr[sbr_ele]->ps_used) + { + hDecoder->ps_used[sbr_ele] = 1; + + /* set element independent flag to 1 as well */ + hDecoder->ps_used_global = 1; + } +#endif + } else { +#endif +#ifndef DRM + while (count > 0) + { + count -= extension_payload(ld, drc, count); + } +#else + return 30; +#endif +#ifdef SBR_DEC + } +#endif + } + + return 0; +} + +/* Table 4.4.12 */ +#ifdef SSR_DEC +static void gain_control_data(bitfile *ld, ic_stream *ics) +{ + uint8_t bd, wd, ad; + ssr_info *ssr = &(ics->ssr); + + ssr->max_band = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,1000,"gain_control_data(): max_band")); + + if (ics->window_sequence == ONLY_LONG_SEQUENCE) + { + for (bd = 1; bd <= ssr->max_band; bd++) + { + for (wd = 0; wd < 1; wd++) + { + ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); + + for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) + { + ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,1002,"gain_control_data(): alevcode")); + ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,1003,"gain_control_data(): aloccode")); + } + } + } + } else if (ics->window_sequence == LONG_START_SEQUENCE) { + for (bd = 1; bd <= ssr->max_band; bd++) + { + for (wd = 0; wd < 2; wd++) + { + ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); + + for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) + { + ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,1002,"gain_control_data(): alevcode")); + if (wd == 0) + { + ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,1003,"gain_control_data(): aloccode")); + } else { + ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,1003,"gain_control_data(): aloccode")); + } + } + } + } + } else if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { + for (bd = 1; bd <= ssr->max_band; bd++) + { + for (wd = 0; wd < 8; wd++) + { + ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); + + for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) + { + ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,1002,"gain_control_data(): alevcode")); + ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,1003,"gain_control_data(): aloccode")); + } + } + } + } else if (ics->window_sequence == LONG_STOP_SEQUENCE) { + for (bd = 1; bd <= ssr->max_band; bd++) + { + for (wd = 0; wd < 2; wd++) + { + ssr->adjust_num[bd][wd] = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,1001,"gain_control_data(): adjust_num")); + + for (ad = 0; ad < ssr->adjust_num[bd][wd]; ad++) + { + ssr->alevcode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,1002,"gain_control_data(): alevcode")); + + if (wd == 0) + { + ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,1003,"gain_control_data(): aloccode")); + } else { + ssr->aloccode[bd][wd][ad] = (uint8_t)faad_getbits(ld, 5 + DEBUGVAR(1,1003,"gain_control_data(): aloccode")); + } + } + } + } + } +} +#endif + +#ifdef DRM +/* Table 4.4.13 ASME */ +void DRM_aac_scalable_main_element(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, + bitfile *ld, program_config *pce, drc_info *drc) +{ + uint8_t retval = 0; + uint8_t channels = hDecoder->fr_channels = 0; + uint8_t ch; + uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; + element cpe = {0}; + ic_stream *ics1 = &(cpe.ics1); + ic_stream *ics2 = &(cpe.ics2); + int16_t *spec_data; + ALIGN int16_t spec_data1[1024] = {0}; + ALIGN int16_t spec_data2[1024] = {0}; + + hDecoder->fr_ch_ele = 0; + + hInfo->error = DRM_aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); + if (hInfo->error > 0) + return; + + cpe.common_window = 1; + if (this_layer_stereo) + { + hDecoder->element_id[0] = ID_CPE; + if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) + hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; + } else { + hDecoder->element_id[0] = ID_SCE; + } + + if (this_layer_stereo) + { + cpe.channel = 0; + cpe.paired_channel = 1; + } + + + /* Stereo2 / Mono1 */ + ics1->tns_data_present = faad_get1bit(ld); + +#if defined(LTP_DEC) + ics1->ltp.data_present = faad_get1bit(ld); +#elif defined (DRM) + if(faad_get1bit(ld)) { + hInfo->error = 26; + return; + } +#else + faad_get1bit(ld); +#endif + + hInfo->error = side_info(hDecoder, &cpe, ld, ics1, 1); + if (hInfo->error > 0) + return; + if (this_layer_stereo) + { + /* Stereo3 */ + ics2->tns_data_present = faad_get1bit(ld); +#ifdef LTP_DEC + ics1->ltp.data_present = +#endif + faad_get1bit(ld); + hInfo->error = side_info(hDecoder, &cpe, ld, ics2, 1); + if (hInfo->error > 0) + return; + } + /* Stereo4 / Mono2 */ + if (ics1->tns_data_present) + tns_data(ics1, &(ics1->tns), ld); + if (this_layer_stereo) + { + /* Stereo5 */ + if (ics2->tns_data_present) + tns_data(ics2, &(ics2->tns), ld); + } + +#ifdef DRM + /* CRC check */ + if (hDecoder->object_type == DRM_ER_LC) + { + if ((hInfo->error = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) + return; + } +#endif + + /* Stereo6 / Mono3 */ + /* error resilient spectral data decoding */ + if ((hInfo->error = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0) + { + return; + } + if (this_layer_stereo) + { + /* Stereo7 */ + /* error resilient spectral data decoding */ + if ((hInfo->error = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0) + { + return; + } + } + + +#ifdef DRM +#ifdef SBR_DEC + /* In case of DRM we need to read the SBR info before channel reconstruction */ + if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) + { + bitfile ld_sbr = {0}; + uint32_t i; + uint16_t count = 0; + uint8_t *revbuffer; + uint8_t *prevbufstart; + uint8_t *pbufend; + + /* all forward bitreading should be finished at this point */ + uint32_t bitsconsumed = faad_get_processed_bits(ld); + uint32_t buffer_size = faad_origbitbuffer_size(ld); + uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); + + if (bitsconsumed + 8 > buffer_size*8) + { + hInfo->error = 14; + return; + } + + if (!hDecoder->sbr[0]) + { + hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[0], + 2*get_sample_rate(hDecoder->sf_index), 0 /* ds SBR */, 1); + } + + /* Reverse bit reading of SBR data in DRM audio frame */ + revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); + prevbufstart = revbuffer; + pbufend = &buffer[buffer_size - 1]; + for (i = 0; i < buffer_size; i++) + *prevbufstart++ = tabFlipbits[*pbufend--]; + + /* Set SBR data */ + /* consider 8 bits from AAC-CRC */ + /* SBR buffer size is original buffer size minus AAC buffer size */ + count = (uint16_t)bit2byte(buffer_size*8 - bitsconsumed); + faad_initbits(&ld_sbr, revbuffer, count); + + hDecoder->sbr[0]->sample_rate = get_sample_rate(hDecoder->sf_index); + hDecoder->sbr[0]->sample_rate *= 2; + + faad_getbits(&ld_sbr, 8); /* Skip 8-bit CRC */ + + hDecoder->sbr[0]->ret = sbr_extension_data(&ld_sbr, hDecoder->sbr[0], count, hDecoder->postSeekResetFlag); +#if (defined(PS_DEC) || defined(DRM_PS)) + if (hDecoder->sbr[0]->ps_used) + { + hDecoder->ps_used[0] = 1; + hDecoder->ps_used_global = 1; + } +#endif + + if (ld_sbr.error) + { + hDecoder->sbr[0]->ret = 1; + } + + /* check CRC */ + /* no need to check it if there was already an error */ + if (hDecoder->sbr[0]->ret == 0) + hDecoder->sbr[0]->ret = (uint8_t)faad_check_CRC(&ld_sbr, (uint16_t)faad_get_processed_bits(&ld_sbr) - 8); + + /* SBR data was corrupted, disable it until the next header */ + if (hDecoder->sbr[0]->ret != 0) + { + hDecoder->sbr[0]->header_count = 0; + } + + faad_endbits(&ld_sbr); + + if (revbuffer) + faad_free(revbuffer); + } +#endif +#endif + + if (this_layer_stereo) + { + hInfo->error = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2); + if (hInfo->error > 0) + return; + } else { + hInfo->error = reconstruct_single_channel(hDecoder, ics1, &cpe, spec_data1); + if (hInfo->error > 0) + return; + } + + /* map output channels position to internal data channels */ + if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) + { + /* this might be faulty when pce_set is true */ + hDecoder->internal_channel[channels] = channels; + hDecoder->internal_channel[channels+1] = channels+1; + } else { + hDecoder->internal_channel[channels] = channels; + } + + hDecoder->fr_channels += hDecoder->element_output_channels[hDecoder->fr_ch_ele]; + hDecoder->fr_ch_ele++; + + return; +} + +/* Table 4.4.15 */ +static int8_t DRM_aac_scalable_main_header(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, + bitfile *ld, uint8_t this_layer_stereo) +{ + uint8_t retval = 0; + uint8_t ch; + ic_stream *ics; + uint8_t ics_reserved_bit; + + ics_reserved_bit = faad_get1bit(ld + DEBUGVAR(1,300,"aac_scalable_main_header(): ics_reserved_bits")); + if (ics_reserved_bit != 0) + return 32; + ics1->window_sequence = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,301,"aac_scalable_main_header(): window_sequence")); + ics1->window_shape = faad_get1bit(ld + DEBUGVAR(1,302,"aac_scalable_main_header(): window_shape")); + + if (ics1->window_sequence == EIGHT_SHORT_SEQUENCE) + { + ics1->max_sfb = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,303,"aac_scalable_main_header(): max_sfb (short)")); + ics1->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 + DEBUGVAR(1,304,"aac_scalable_main_header(): scale_factor_grouping")); + } else { + ics1->max_sfb = (uint8_t)faad_getbits(ld, 6 + DEBUGVAR(1,305,"aac_scalable_main_header(): max_sfb (long)")); + } + + /* get the grouping information */ + if ((retval = window_grouping_info(hDecoder, ics1)) > 0) + return retval; + + /* should be an error */ + /* check the range of max_sfb */ + if (ics1->max_sfb > ics1->num_swb) + return 16; + + if (this_layer_stereo) + { + ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,306,"aac_scalable_main_header(): ms_mask_present")); + if (ics1->ms_mask_present == 3) + { + /* bitstream error */ + return 32; + } + if (ics1->ms_mask_present == 1) + { + uint8_t g, sfb; + for (g = 0; g < ics1->num_window_groups; g++) + { + for (sfb = 0; sfb < ics1->max_sfb; sfb++) + { + ics1->ms_used[g][sfb] = faad_get1bit(ld + DEBUGVAR(1,307,"aac_scalable_main_header(): faad_get1bit")); + } + } + } + + memcpy(ics2, ics1, sizeof(ic_stream)); + } else { + ics1->ms_mask_present = 0; + } + + return 0; +} +#endif + +static uint8_t side_info(NeAACDecStruct *hDecoder, element *ele, + bitfile *ld, ic_stream *ics, uint8_t scal_flag) +{ + uint8_t result; + + ics->global_gain = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,67,"individual_channel_stream(): global_gain")); + + if (!ele->common_window && !scal_flag) + { + if ((result = ics_info(hDecoder, ics, ld, ele->common_window)) > 0) + return result; + } + + if ((result = section_data(hDecoder, ics, ld)) > 0) + return result; + + if ((result = scale_factor_data(hDecoder, ics, ld)) > 0) + return result; + + if (!scal_flag) + { + /** + ** NOTE: It could be that pulse data is available in scalable AAC too, + ** as said in Amendment 1, this could be only the case for ER AAC, + ** though. (have to check this out later) + **/ + /* get pulse data */ + if ((ics->pulse_data_present = faad_get1bit(ld + DEBUGVAR(1,68,"individual_channel_stream(): pulse_data_present"))) & 1) + { + if ((result = pulse_data(ics, &(ics->pul), ld)) > 0) + return result; + } + + /* get tns data */ + if ((ics->tns_data_present = faad_get1bit(ld + DEBUGVAR(1,69,"individual_channel_stream(): tns_data_present"))) & 1) + { +#ifdef ERROR_RESILIENCE + if (hDecoder->object_type < ER_OBJECT_START) +#endif + tns_data(ics, &(ics->tns), ld); + } + + /* get gain control data */ + if ((ics->gain_control_data_present = faad_get1bit(ld + DEBUGVAR(1,70,"individual_channel_stream(): gain_control_data_present"))) & 1) + { +#ifdef SSR_DEC + if (hDecoder->object_type != SSR) + return 1; + else + gain_control_data(ld, ics); +#else + return 1; +#endif + } + } + +#ifdef ERROR_RESILIENCE + if (hDecoder->aacSpectralDataResilienceFlag) + { + ics->length_of_reordered_spectral_data = (uint16_t)faad_getbits(ld, 14 + DEBUGVAR(1,147,"individual_channel_stream(): length_of_reordered_spectral_data")); + + if (hDecoder->channelConfiguration == 2) + { + if (ics->length_of_reordered_spectral_data > 6144) + ics->length_of_reordered_spectral_data = 6144; + } else { + if (ics->length_of_reordered_spectral_data > 12288) + ics->length_of_reordered_spectral_data = 12288; + } + + ics->length_of_longest_codeword = (uint8_t)faad_getbits(ld, 6 + DEBUGVAR(1,148,"individual_channel_stream(): length_of_longest_codeword")); + if (ics->length_of_longest_codeword >= 49) + ics->length_of_longest_codeword = 49; + } + + /* RVLC spectral data is put here */ + if (hDecoder->aacScalefactorDataResilienceFlag) + { + if ((result = rvlc_decode_scale_factors(ics, ld)) > 0) + return result; + } +#endif + + return 0; +} + +/* Table 4.4.24 */ +static uint8_t individual_channel_stream(NeAACDecStruct *hDecoder, element *ele, + bitfile *ld, ic_stream *ics, uint8_t scal_flag, + int16_t *spec_data) +{ + uint8_t result; + + result = side_info(hDecoder, ele, ld, ics, scal_flag); + if (result > 0) + return result; + + if (hDecoder->object_type >= ER_OBJECT_START) + { + if (ics->tns_data_present) + tns_data(ics, &(ics->tns), ld); + } + +#ifdef DRM + /* CRC check */ + if (hDecoder->object_type == DRM_ER_LC) + { + if ((result = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) + return result; + } +#endif + +#ifdef ERROR_RESILIENCE + if (hDecoder->aacSpectralDataResilienceFlag) + { + /* error resilient spectral data decoding */ + if ((result = reordered_spectral_data(hDecoder, ics, ld, spec_data)) > 0) + { + return result; + } + } else { +#endif + /* decode the spectral data */ + if ((result = spectral_data(hDecoder, ics, ld, spec_data)) > 0) + { + return result; + } +#ifdef ERROR_RESILIENCE + } +#endif + + /* pulse coding reconstruction */ + if (ics->pulse_data_present) + { + if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) + { + if ((result = pulse_decode(ics, spec_data, hDecoder->frameLength)) > 0) + return result; + } else { + return 2; /* pulse coding not allowed for short blocks */ + } + } + + return 0; +} + +/* Table 4.4.25 */ +static uint8_t section_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) +{ + uint8_t g; + uint8_t sect_esc_val, sect_bits; + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + sect_bits = 3; + else + sect_bits = 5; + sect_esc_val = (1<max_sfb); + printf(" sect top cb\n"); +#endif + + for (g = 0; g < ics->num_window_groups; g++) + { + uint8_t k = 0; + uint8_t i = 0; + + while (k < ics->max_sfb) + { +#ifdef ERROR_RESILIENCE + uint8_t vcb11 = 0; +#endif + uint8_t sfb; + uint8_t sect_len_incr; + uint16_t sect_len = 0; + uint8_t sect_cb_bits = 4; + + /* if "faad_getbits" detects error and returns "0", "k" is never + incremented and we cannot leave the while loop */ + if (ld->error != 0) + return 14; + +#ifdef ERROR_RESILIENCE + if (hDecoder->aacSectionDataResilienceFlag) + sect_cb_bits = 5; +#endif + + ics->sect_cb[g][i] = (uint8_t)faad_getbits(ld, sect_cb_bits + DEBUGVAR(1,71,"section_data(): sect_cb")); + + if (ics->sect_cb[g][i] == 12) + return 32; + +#if 0 + printf("%d\n", ics->sect_cb[g][i]); +#endif + +#ifndef DRM + if (ics->sect_cb[g][i] == NOISE_HCB) + ics->noise_used = 1; +#else + /* PNS not allowed in DRM */ + if (ics->sect_cb[g][i] == NOISE_HCB) + return 29; +#endif + if (ics->sect_cb[g][i] == INTENSITY_HCB2 || ics->sect_cb[g][i] == INTENSITY_HCB) + ics->is_used = 1; + +#ifdef ERROR_RESILIENCE + if (hDecoder->aacSectionDataResilienceFlag) + { + if ((ics->sect_cb[g][i] == 11) || + ((ics->sect_cb[g][i] >= 16) && (ics->sect_cb[g][i] <= 32))) + { + vcb11 = 1; + } + } + if (vcb11) + { + sect_len_incr = 1; + } else { +#endif + sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits + DEBUGVAR(1,72,"section_data(): sect_len_incr")); +#ifdef ERROR_RESILIENCE + } +#endif + while ((sect_len_incr == sect_esc_val) /* && + (k+sect_len < ics->max_sfb)*/) + { + sect_len += sect_len_incr; + sect_len_incr = (uint8_t)faad_getbits(ld, sect_bits + DEBUGVAR(1,72,"section_data(): sect_len_incr")); + } + + sect_len += sect_len_incr; + + ics->sect_start[g][i] = k; + ics->sect_end[g][i] = k + sect_len; + +#if 0 + printf("%d\n", ics->sect_start[g][i]); +#endif +#if 0 + printf("%d\n", ics->sect_end[g][i]); +#endif + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + { + if (k + sect_len > 8*15) + return 15; + if (i >= 8*15) + return 15; + } else { + if (k + sect_len > MAX_SFB) + return 15; + if (i >= MAX_SFB) + return 15; + } + + for (sfb = k; sfb < k + sect_len; sfb++) + { + ics->sfb_cb[g][sfb] = ics->sect_cb[g][i]; +#if 0 + printf("%d\n", ics->sfb_cb[g][sfb]); +#endif + } + +#if 0 + printf(" %6d %6d %6d\n", + i, + ics->sect_end[g][i], + ics->sect_cb[g][i]); +#endif + + k += sect_len; + i++; + } + ics->num_sec[g] = i; + + /* the sum of all sect_len_incr elements for a given window + * group shall equal max_sfb */ + if (k != ics->max_sfb) + { + return 32; + } +#if 0 + printf("%d\n", ics->num_sec[g]); +#endif + } + +#if 0 + printf("\n"); +#endif + + return 0; +} + +/* + * decode_scale_factors() + * decodes the scalefactors from the bitstream + */ +/* + * All scalefactors (and also the stereo positions and pns energies) are + * transmitted using Huffman coded DPCM relative to the previous active + * scalefactor (respectively previous stereo position or previous pns energy, + * see subclause 4.6.2 and 4.6.3). The first active scalefactor is + * differentially coded relative to the global gain. + */ +static uint8_t decode_scale_factors(ic_stream *ics, bitfile *ld) +{ + uint8_t g, sfb; + int16_t t; + int8_t noise_pcm_flag = 1; + + int16_t scale_factor = ics->global_gain; + int16_t is_position = 0; + int16_t noise_energy = ics->global_gain - 90; + + for (g = 0; g < ics->num_window_groups; g++) + { + for (sfb = 0; sfb < ics->max_sfb; sfb++) + { + switch (ics->sfb_cb[g][sfb]) + { + case ZERO_HCB: /* zero book */ + ics->scale_factors[g][sfb] = 0; +//#define SF_PRINT +#ifdef SF_PRINT + printf("%d\n", ics->scale_factors[g][sfb]); +#endif + break; + case INTENSITY_HCB: /* intensity books */ + case INTENSITY_HCB2: + + /* decode intensity position */ + t = huffman_scale_factor(ld); + is_position += (t - 60); + ics->scale_factors[g][sfb] = is_position; +#ifdef SF_PRINT + printf("%d\n", ics->scale_factors[g][sfb]); +#endif + + break; + case NOISE_HCB: /* noise books */ + +#ifndef DRM + /* decode noise energy */ + if (noise_pcm_flag) + { + noise_pcm_flag = 0; + t = (int16_t)faad_getbits(ld, 9 + DEBUGVAR(1,73,"scale_factor_data(): first noise")) - 256; + } else { + t = huffman_scale_factor(ld); + t -= 60; + } + noise_energy += t; + ics->scale_factors[g][sfb] = noise_energy; +#ifdef SF_PRINT + printf("%d\n", ics->scale_factors[g][sfb]); +#endif +#else + /* PNS not allowed in DRM */ + return 29; +#endif + + break; + default: /* spectral books */ + + /* ics->scale_factors[g][sfb] must be between 0 and 255 */ + + ics->scale_factors[g][sfb] = 0; + + /* decode scale factor */ + t = huffman_scale_factor(ld); + scale_factor += (t - 60); + if (scale_factor < 0 || scale_factor > 255) + return 4; + ics->scale_factors[g][sfb] = scale_factor; +#ifdef SF_PRINT + printf("%d\n", ics->scale_factors[g][sfb]); +#endif + + break; + } + } + } + + return 0; +} + +/* Table 4.4.26 */ +static uint8_t scale_factor_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld) +{ + uint8_t ret = 0; +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + +#ifdef ERROR_RESILIENCE + if (!hDecoder->aacScalefactorDataResilienceFlag) + { +#endif + ret = decode_scale_factors(ics, ld); +#ifdef ERROR_RESILIENCE + } else { + /* In ER AAC the parameters for RVLC are seperated from the actual + data that holds the scale_factors. + Strangely enough, 2 parameters for HCR are put inbetween them. + */ + ret = rvlc_scale_factor_data(ics, ld); + } +#endif + +#ifdef PROFILE + count = faad_get_ts() - count; + hDecoder->scalefac_cycles += count; +#endif + + return ret; +} + +/* Table 4.4.27 */ +static void tns_data(ic_stream *ics, tns_info *tns, bitfile *ld) +{ + uint8_t w, filt, i, start_coef_bits, coef_bits; + uint8_t n_filt_bits = 2; + uint8_t length_bits = 6; + uint8_t order_bits = 5; + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + { + n_filt_bits = 1; + length_bits = 4; + order_bits = 3; + } + + for (w = 0; w < ics->num_windows; w++) + { + tns->n_filt[w] = (uint8_t)faad_getbits(ld, n_filt_bits + DEBUGVAR(1,74,"tns_data(): n_filt")); +#if 0 + printf("%d\n", tns->n_filt[w]); +#endif + + if (tns->n_filt[w]) + { + if ((tns->coef_res[w] = faad_get1bit(ld + DEBUGVAR(1,75,"tns_data(): coef_res"))) & 1) + { + start_coef_bits = 4; + } else { + start_coef_bits = 3; + } +#if 0 + printf("%d\n", tns->coef_res[w]); +#endif + } + + for (filt = 0; filt < tns->n_filt[w]; filt++) + { + tns->length[w][filt] = (uint8_t)faad_getbits(ld, length_bits + DEBUGVAR(1,76,"tns_data(): length")); +#if 0 + printf("%d\n", tns->length[w][filt]); +#endif + tns->order[w][filt] = (uint8_t)faad_getbits(ld, order_bits + DEBUGVAR(1,77,"tns_data(): order")); +#if 0 + printf("%d\n", tns->order[w][filt]); +#endif + if (tns->order[w][filt]) + { + tns->direction[w][filt] = faad_get1bit(ld + DEBUGVAR(1,78,"tns_data(): direction")); +#if 0 + printf("%d\n", tns->direction[w][filt]); +#endif + tns->coef_compress[w][filt] = faad_get1bit(ld + DEBUGVAR(1,79,"tns_data(): coef_compress")); +#if 0 + printf("%d\n", tns->coef_compress[w][filt]); +#endif + + coef_bits = start_coef_bits - tns->coef_compress[w][filt]; + for (i = 0; i < tns->order[w][filt]; i++) + { + tns->coef[w][filt][i] = (uint8_t)faad_getbits(ld, coef_bits + DEBUGVAR(1,80,"tns_data(): coef")); +#if 0 + printf("%d\n", tns->coef[w][filt][i]); +#endif + } + } + } + } +} + +#ifdef LTP_DEC +/* Table 4.4.28 */ +static uint8_t ltp_data(NeAACDecStruct *hDecoder, ic_stream *ics, ltp_info *ltp, bitfile *ld) +{ + uint8_t sfb, w; + + ltp->lag = 0; + +#ifdef LD_DEC + if (hDecoder->object_type == LD) + { + ltp->lag_update = (uint8_t)faad_getbits(ld, 1 + DEBUGVAR(1,142,"ltp_data(): lag_update")); + + if (ltp->lag_update) + { + ltp->lag = (uint16_t)faad_getbits(ld, 10 + DEBUGVAR(1,81,"ltp_data(): lag")); + } + } else { +#endif + ltp->lag = (uint16_t)faad_getbits(ld, 11 + DEBUGVAR(1,81,"ltp_data(): lag")); +#ifdef LD_DEC + } +#endif + + /* Check length of lag */ + if (ltp->lag > (hDecoder->frameLength << 1)) + return 18; + + ltp->coef = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,82,"ltp_data(): coef")); + + if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) + { + for (w = 0; w < ics->num_windows; w++) + { + if ((ltp->short_used[w] = faad_get1bit(ld + DEBUGVAR(1,83,"ltp_data(): short_used"))) & 1) + { + ltp->short_lag_present[w] = faad_get1bit(ld + DEBUGVAR(1,84,"ltp_data(): short_lag_present")); + if (ltp->short_lag_present[w]) + { + ltp->short_lag[w] = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,85,"ltp_data(): short_lag")); + } + } + } + } else { + ltp->last_band = (ics->max_sfb < MAX_LTP_SFB ? ics->max_sfb : MAX_LTP_SFB); + + for (sfb = 0; sfb < ltp->last_band; sfb++) + { + ltp->long_used[sfb] = faad_get1bit(ld + DEBUGVAR(1,86,"ltp_data(): long_used")); + } + } + + return 0; +} +#endif + +/* Table 4.4.29 */ +static uint8_t spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, + int16_t *spectral_data) +{ + int8_t i; + uint8_t g; + uint16_t inc, k, p = 0; + uint8_t groups = 0; + uint8_t sect_cb; + uint8_t result; + uint16_t nshort = hDecoder->frameLength/8; + +#ifdef PROFILE + int64_t count = faad_get_ts(); +#endif + + for(g = 0; g < ics->num_window_groups; g++) + { + p = groups*nshort; + + for (i = 0; i < ics->num_sec[g]; i++) + { + sect_cb = ics->sect_cb[g][i]; + + inc = (sect_cb >= FIRST_PAIR_HCB) ? 2 : 4; + + switch (sect_cb) + { + case ZERO_HCB: + case NOISE_HCB: + case INTENSITY_HCB: + case INTENSITY_HCB2: +//#define SD_PRINT +#ifdef SD_PRINT + { + int j; + for (j = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; j < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; j++) + { + printf("%d\n", 0); + } + } +#endif +//#define SFBO_PRINT +#ifdef SFBO_PRINT + printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); +#endif + p += (ics->sect_sfb_offset[g][ics->sect_end[g][i]] - + ics->sect_sfb_offset[g][ics->sect_start[g][i]]); + break; + default: +#ifdef SFBO_PRINT + printf("%d\n", ics->sect_sfb_offset[g][ics->sect_start[g][i]]); +#endif + for (k = ics->sect_sfb_offset[g][ics->sect_start[g][i]]; + k < ics->sect_sfb_offset[g][ics->sect_end[g][i]]; k += inc) + { + if ((result = huffman_spectral_data(sect_cb, ld, &spectral_data[p])) > 0) + return result; +#ifdef SD_PRINT + { + int j; + for (j = p; j < p+inc; j++) + { + printf("%d\n", spectral_data[j]); + } + } +#endif + p += inc; + } + break; + } + } + groups += ics->window_group_length[g]; + } + +#ifdef PROFILE + count = faad_get_ts() - count; + hDecoder->spectral_cycles += count; +#endif + + return 0; +} + +/* Table 4.4.30 */ +static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) +{ + uint16_t i, n, dataElementLength; + uint8_t dataElementLengthPart; + uint8_t align = 4, data_element_version, loopCounter; + + uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,87,"extension_payload(): extension_type")); + + switch (extension_type) + { + case EXT_DYNAMIC_RANGE: + drc->present = 1; + n = dynamic_range_info(ld, drc); + return n; + case EXT_FILL_DATA: + /* fill_nibble = */ faad_getbits(ld, 4 + DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be ‘0000’ */ + for (i = 0; i < count-1; i++) + { + /* fill_byte[i] = */ faad_getbits(ld, 8 + DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be ‘10100101’ */ + } + return count; + case EXT_DATA_ELEMENT: + data_element_version = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,400,"extension_payload(): data_element_version")); + switch (data_element_version) + { + case ANC_DATA: + loopCounter = 0; + dataElementLength = 0; + do { + dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); + dataElementLength += dataElementLengthPart; + loopCounter++; + } while (dataElementLengthPart == 255); + + for (i = 0; i < dataElementLength; i++) + { + /* data_element_byte[i] = */ faad_getbits(ld, 8 + DEBUGVAR(1,402,"extension_payload(): data_element_byte")); + return (dataElementLength+loopCounter+1); + } + default: + align = 0; + } + case EXT_FIL: + default: + faad_getbits(ld, align + DEBUGVAR(1,88,"extension_payload(): fill_nibble")); + for (i = 0; i < count-1; i++) + { + /* other_bits[i] = */ faad_getbits(ld, 8 + DEBUGVAR(1,89,"extension_payload(): fill_bit")); + } + return count; + } +} + +/* Table 4.4.31 */ +static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) +{ + uint8_t i, n = 1; + uint8_t band_incr; + + drc->num_bands = 1; + + if (faad_get1bit(ld + DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) + { + drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); + /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 + DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); + n++; + } + + drc->excluded_chns_present = faad_get1bit(ld + DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); + if (drc->excluded_chns_present == 1) + { + n += excluded_channels(ld, drc); + } + + if (faad_get1bit(ld + DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) + { + band_incr = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); + /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 + DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); + n++; + drc->num_bands += band_incr; + + for (i = 0; i < drc->num_bands; i++) + { + drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 + DEBUGVAR(1,97,"dynamic_range_info(): band_top")); + n++; + } + } + + if (faad_get1bit(ld + DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) + { + drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 + DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); + /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld + DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); + n++; + } + + for (i = 0; i < drc->num_bands; i++) + { + drc->dyn_rng_sgn[i] = faad_get1bit(ld + DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); + drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 + DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); + n++; + } + + return n; +} + +/* Table 4.4.32 */ +static uint8_t excluded_channels(bitfile *ld, drc_info *drc) +{ + uint8_t i, n = 0; + uint8_t num_excl_chan = 7; + + for (i = 0; i < 7; i++) + { + drc->exclude_mask[i] = faad_get1bit(ld + DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); + } + n++; + + while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld + DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) + { + for (i = num_excl_chan; i < num_excl_chan+7; i++) + { + drc->exclude_mask[i] = faad_get1bit(ld + DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); + } + n++; + num_excl_chan += 7; + } + + return n; +} + +/* Annex A: Audio Interchange Formats */ + +/* Table 1.A.2 */ +void get_adif_header(adif_header *adif, bitfile *ld) +{ + uint8_t i; + + /* adif_id[0] = */ faad_getbits(ld, 8 + DEBUGVAR(1,106,"get_adif_header(): adif_id[0]")); + /* adif_id[1] = */ faad_getbits(ld, 8 + DEBUGVAR(1,107,"get_adif_header(): adif_id[1]")); + /* adif_id[2] = */ faad_getbits(ld, 8 + DEBUGVAR(1,108,"get_adif_header(): adif_id[2]")); + /* adif_id[3] = */ faad_getbits(ld, 8 + DEBUGVAR(1,109,"get_adif_header(): adif_id[3]")); + adif->copyright_id_present = faad_get1bit(ld + DEBUGVAR(1,110,"get_adif_header(): copyright_id_present")); + if(adif->copyright_id_present) + { + for (i = 0; i < 72/8; i++) + { + adif->copyright_id[i] = (int8_t)faad_getbits(ld, 8 + DEBUGVAR(1,111,"get_adif_header(): copyright_id")); + } + adif->copyright_id[i] = 0; + } + adif->original_copy = faad_get1bit(ld + DEBUGVAR(1,112,"get_adif_header(): original_copy")); + adif->home = faad_get1bit(ld + DEBUGVAR(1,113,"get_adif_header(): home")); + adif->bitstream_type = faad_get1bit(ld + DEBUGVAR(1,114,"get_adif_header(): bitstream_type")); + adif->bitrate = faad_getbits(ld, 23 + DEBUGVAR(1,115,"get_adif_header(): bitrate")); + adif->num_program_config_elements = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,116,"get_adif_header(): num_program_config_elements")); + + for (i = 0; i < adif->num_program_config_elements + 1; i++) + { + if(adif->bitstream_type == 0) + { + adif->adif_buffer_fullness = faad_getbits(ld, 20 + DEBUGVAR(1,117,"get_adif_header(): adif_buffer_fullness")); + } else { + adif->adif_buffer_fullness = 0; + } + + program_config_element(&adif->pce[i], ld); + } +} + +/* Table 1.A.5 */ +uint8_t adts_frame(adts_header *adts, bitfile *ld) +{ + /* faad_byte_align(ld); */ + if (adts_fixed_header(adts, ld)) + return 5; + adts_variable_header(adts, ld); + adts_error_check(adts, ld); + + return 0; +} + +/* Table 1.A.6 */ +static uint8_t adts_fixed_header(adts_header *adts, bitfile *ld) +{ + uint16_t i; + uint8_t sync_err = 1; + + /* try to recover from sync errors */ + for (i = 0; i < 768; i++) + { + adts->syncword = (uint16_t)faad_showbits(ld, 12); + if (adts->syncword != 0xFFF) + { + faad_getbits(ld, 8 + DEBUGVAR(0,0,"")); + } else { + sync_err = 0; + faad_getbits(ld, 12 + DEBUGVAR(1,118,"adts_fixed_header(): syncword")); + break; + } + } + if (sync_err) + return 5; + + adts->id = faad_get1bit(ld + DEBUGVAR(1,119,"adts_fixed_header(): id")); + adts->layer = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,120,"adts_fixed_header(): layer")); + adts->protection_absent = faad_get1bit(ld + DEBUGVAR(1,121,"adts_fixed_header(): protection_absent")); + adts->profile = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,122,"adts_fixed_header(): profile")); + adts->sf_index = (uint8_t)faad_getbits(ld, 4 + DEBUGVAR(1,123,"adts_fixed_header(): sf_index")); + adts->private_bit = faad_get1bit(ld + DEBUGVAR(1,124,"adts_fixed_header(): private_bit")); + adts->channel_configuration = (uint8_t)faad_getbits(ld, 3 + DEBUGVAR(1,125,"adts_fixed_header(): channel_configuration")); + adts->original = faad_get1bit(ld + DEBUGVAR(1,126,"adts_fixed_header(): original")); + adts->home = faad_get1bit(ld + DEBUGVAR(1,127,"adts_fixed_header(): home")); + + if (adts->old_format == 1) + { + /* Removed in corrigendum 14496-3:2002 */ + if (adts->id == 0) + { + adts->emphasis = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,128,"adts_fixed_header(): emphasis")); + } + } + + return 0; +} + +/* Table 1.A.7 */ +static void adts_variable_header(adts_header *adts, bitfile *ld) +{ + adts->copyright_identification_bit = faad_get1bit(ld + DEBUGVAR(1,129,"adts_variable_header(): copyright_identification_bit")); + adts->copyright_identification_start = faad_get1bit(ld + DEBUGVAR(1,130,"adts_variable_header(): copyright_identification_start")); + adts->aac_frame_length = (uint16_t)faad_getbits(ld, 13 + DEBUGVAR(1,131,"adts_variable_header(): aac_frame_length")); + adts->adts_buffer_fullness = (uint16_t)faad_getbits(ld, 11 + DEBUGVAR(1,132,"adts_variable_header(): adts_buffer_fullness")); + adts->no_raw_data_blocks_in_frame = (uint8_t)faad_getbits(ld, 2 + DEBUGVAR(1,133,"adts_variable_header(): no_raw_data_blocks_in_frame")); +} + +/* Table 1.A.8 */ +static void adts_error_check(adts_header *adts, bitfile *ld) +{ + if (adts->protection_absent == 0) + { + adts->crc_check = (uint16_t)faad_getbits(ld, 16 + DEBUGVAR(1,134,"adts_error_check(): crc_check")); + } +} + +/* LATM parsing functions */ + +static uint32_t latm_get_value(bitfile *ld) +{ + uint32_t l, value; + uint8_t bytesForValue; + + bytesForValue = (uint8_t)faad_getbits(ld, 2); + value = 0; + for(l=0; lframelen_type==0) + { + do + { + tmp = (uint8_t)faad_getbits(ld, 8); + framelen += tmp; + } while(tmp==0xff); + } + else if(latm->framelen_type==1) + framelen=latm->frameLength; + + return framelen; +} + + +static uint32_t latmAudioMuxElement(latm_header *latm, bitfile *ld) +{ + uint32_t ascLen, asc_bits=0; + uint32_t x1, y1, m, n, i; + program_config pce; + mp4AudioSpecificConfig mp4ASC; + + latm->useSameStreamMux = (uint8_t)faad_getbits(ld, 1); + if(!latm->useSameStreamMux) + { + //parseSameStreamMuxConfig + latm->version = (uint8_t) faad_getbits(ld, 1); + if(latm->version) + latm->versionA = (uint8_t) faad_getbits(ld, 1); + if(latm->versionA) + { + //dunno the payload format for versionA + fprintf(stderr, "versionA not supported\n"); + return 0; + } + if(latm->version) //read taraBufferFullness + latm_get_value(ld); + latm->allStreamsSameTimeFraming = (uint8_t)faad_getbits(ld, 1); + latm->numSubFrames = (uint8_t)faad_getbits(ld, 6) + 1; + latm->numPrograms = (uint8_t)faad_getbits(ld, 4) + 1; + latm->numLayers = faad_getbits(ld, 3) + 1; + if(latm->numPrograms>1 || !latm->allStreamsSameTimeFraming || latm->numSubFrames>1 || latm->numLayers>1) + { + fprintf(stderr, "\r\nUnsupported LATM configuration: %d programs/ %d subframes, %d layers, allstreams: %d\n", + latm->numPrograms, latm->numSubFrames, latm->numLayers, latm->allStreamsSameTimeFraming); + return 0; + } + ascLen = 0; + if(latm->version) + ascLen = latm_get_value(ld); + + x1 = faad_get_processed_bits(ld); + if(AudioSpecificConfigFromBitfile(ld, &mp4ASC, &pce, 0, 1) < 0) + return 0; + + //horrid hack to unread the ASC bits and store them in latm->ASC + //the correct code would rely on an ideal faad_ungetbits() + y1 = faad_get_processed_bits(ld); + if((y1-x1) <= MAX_ASC_BYTES*8) + { + faad_rewindbits(ld); + m = x1; + while(m>0) + { + n = min(m, 32); + faad_getbits(ld, n); + m -= n; + } + + i = 0; + m = latm->ASCbits = y1 - x1; + while(m > 0) + { + n = min(m, 8); + latm->ASC[i++] = (uint8_t) faad_getbits(ld, n); + m -= n; + } + } + + asc_bits = y1-x1; + + if(ascLen>asc_bits) + faad_getbits(ld, ascLen-asc_bits); + + latm->framelen_type = (uint8_t) faad_getbits(ld, 3); + if(latm->framelen_type == 0) + { + latm->frameLength = 0; + faad_getbits(ld, 8); //buffer fullness for frame_len_type==0, useless + } + else if(latm->framelen_type == 1) + { + latm->frameLength = faad_getbits(ld, 9); + if(latm->frameLength==0) + { + fprintf(stderr, "Invalid frameLength: 0\r\n"); + return 0; + } + latm->frameLength = (latm->frameLength+20)*8; + } + else + { //hellish CELP or HCVX stuff, discard + fprintf(stderr, "Unsupported CELP/HCVX framelentype: %d\n", latm->framelen_type); + return 0; + } + + latm->otherDataLenBits = 0; + if(faad_getbits(ld, 1)) + { //other data present + int esc, tmp; + if(latm->version) + latm->otherDataLenBits = latm_get_value(ld); + else do + { + esc = faad_getbits(ld, 1); + tmp = faad_getbits(ld, 8); + latm->otherDataLenBits = (latm->otherDataLenBits << 8) + tmp; + } while(esc); + } + if(faad_getbits(ld, 1)) //crc + faad_getbits(ld, 8); + latm->inited = 1; + } + + //read payload + if(latm->inited) + return latmParsePayload(latm, ld); + else + return 0; +} + + +uint32_t faad_latm_frame(latm_header *latm, bitfile *ld) +{ + uint16_t len; + uint32_t initpos, endpos, firstpos, ret; + + firstpos = faad_get_processed_bits(ld); + while (ld->bytes_left) + { + faad_byte_align(ld); + if(faad_showbits(ld, 11) != 0x2B7) + { + faad_getbits(ld, 8); + continue; + } + faad_getbits(ld, 11); + len = faad_getbits(ld, 13); + if(!len) + continue; + initpos = faad_get_processed_bits(ld); + ret = latmAudioMuxElement(latm, ld); + endpos = faad_get_processed_bits(ld); + if(ret>0) + return (len*8)-(endpos-initpos); + //faad_getbits(ld, initpos-endpos); //go back to initpos, but is valid a getbits(-N) ? + } + return -1U; +} diff --git a/src/contrib/aacdecoder/libfaad/syntax.h b/src/contrib/aacdecoder/libfaad/syntax.h old mode 100644 new mode 100755 index 6d8cc2efe..2a1fc6d93 --- a/src/contrib/aacdecoder/libfaad/syntax.h +++ b/src/contrib/aacdecoder/libfaad/syntax.h @@ -1,122 +1,129 @@ -/* -** 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: syntax.h,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#ifndef __SYNTAX_H__ -#define __SYNTAX_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#include "decoder.h" -#include "bits.h" - -#define MAIN 1 -#define LC 2 -#define SSR 3 -#define LTP 4 -#define HE_AAC 5 -#define LD 23 -#define ER_LC 17 -#define ER_LTP 19 -#define DRM_ER_LC 27 /* special object type for DRM */ - -/* header types */ -#define RAW 0 -#define ADIF 1 -#define ADTS 2 - -/* SBR signalling */ -#define NO_SBR 0 -#define SBR_UPSAMPLED 1 -#define SBR_DOWNSAMPLED 2 -#define NO_SBR_UPSAMPLED 3 - -/* DRM channel definitions */ -#define DRMCH_MONO 1 -#define DRMCH_STEREO 2 -#define DRMCH_SBR_MONO 3 -#define DRMCH_SBR_LC_STEREO 4 -#define DRMCH_SBR_STEREO 5 - - -/* First object type that has ER */ -#define ER_OBJECT_START 17 - - -/* Bitstream */ -#define LEN_SE_ID 3 -#define LEN_TAG 4 -#define LEN_BYTE 8 - -#define EXT_FIL 0 -#define EXT_FILL_DATA 1 -#define EXT_DATA_ELEMENT 2 -#define EXT_DYNAMIC_RANGE 11 -#define ANC_DATA 0 - -/* Syntax elements */ -#define ID_SCE 0x0 -#define ID_CPE 0x1 -#define ID_CCE 0x2 -#define ID_LFE 0x3 -#define ID_DSE 0x4 -#define ID_PCE 0x5 -#define ID_FIL 0x6 -#define ID_END 0x7 - -#define ONLY_LONG_SEQUENCE 0x0 -#define LONG_START_SEQUENCE 0x1 -#define EIGHT_SHORT_SEQUENCE 0x2 -#define LONG_STOP_SEQUENCE 0x3 - -#define ZERO_HCB 0 -#define FIRST_PAIR_HCB 5 -#define ESC_HCB 11 -#define QUAD_LEN 4 -#define PAIR_LEN 2 -#define NOISE_HCB 13 -#define INTENSITY_HCB2 14 -#define INTENSITY_HCB 15 - -#define INVALID_SBR_ELEMENT 255 - -int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, - program_config *pce); - -uint8_t adts_frame(adts_header *adts, bitfile *ld); -void get_adif_header(adif_header *adif, bitfile *ld); -void raw_data_block(faacDecHandle hDecoder, faacDecFrameInfo *hInfo, - bitfile *ld, program_config *pce, drc_info *drc); -uint8_t reordered_spectral_data(faacDecHandle hDecoder, ic_stream *ics, bitfile *ld, - int16_t *spectral_data); - - -#ifdef __cplusplus -} -#endif -#endif +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: syntax.h,v 1.60 2009/01/26 23:51:17 menno Exp $ +**/ + +#ifndef __SYNTAX_H__ +#define __SYNTAX_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "bits.h" + +#define MAIN 1 +#define LC 2 +#define SSR 3 +#define LTP 4 +#define HE_AAC 5 +#define LD 23 +#define ER_LC 17 +#define ER_LTP 19 +#define DRM_ER_LC 27 /* special object type for DRM */ + +/* header types */ +#define RAW 0 +#define ADIF 1 +#define ADTS 2 +#define LATM 3 + +/* SBR signalling */ +#define NO_SBR 0 +#define SBR_UPSAMPLED 1 +#define SBR_DOWNSAMPLED 2 +#define NO_SBR_UPSAMPLED 3 + +/* DRM channel definitions */ +#define DRMCH_MONO 1 +#define DRMCH_STEREO 2 +#define DRMCH_SBR_MONO 3 +#define DRMCH_SBR_STEREO 4 +#define DRMCH_SBR_PS_STEREO 5 + + +/* First object type that has ER */ +#define ER_OBJECT_START 17 + + +/* Bitstream */ +#define LEN_SE_ID 3 +#define LEN_TAG 4 +#define LEN_BYTE 8 + +#define EXT_FIL 0 +#define EXT_FILL_DATA 1 +#define EXT_DATA_ELEMENT 2 +#define EXT_DYNAMIC_RANGE 11 +#define ANC_DATA 0 + +/* Syntax elements */ +#define ID_SCE 0x0 +#define ID_CPE 0x1 +#define ID_CCE 0x2 +#define ID_LFE 0x3 +#define ID_DSE 0x4 +#define ID_PCE 0x5 +#define ID_FIL 0x6 +#define ID_END 0x7 + +#define ONLY_LONG_SEQUENCE 0x0 +#define LONG_START_SEQUENCE 0x1 +#define EIGHT_SHORT_SEQUENCE 0x2 +#define LONG_STOP_SEQUENCE 0x3 + +#define ZERO_HCB 0 +#define FIRST_PAIR_HCB 5 +#define ESC_HCB 11 +#define QUAD_LEN 4 +#define PAIR_LEN 2 +#define NOISE_HCB 13 +#define INTENSITY_HCB2 14 +#define INTENSITY_HCB 15 + +#define INVALID_SBR_ELEMENT 255 + +int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, + program_config *pce); + +uint8_t adts_frame(adts_header *adts, bitfile *ld); +void get_adif_header(adif_header *adif, bitfile *ld); +void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, + bitfile *ld, program_config *pce, drc_info *drc); +uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, + int16_t *spectral_data); +#ifdef DRM +void DRM_aac_scalable_main_element(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, + bitfile *ld, program_config *pce, drc_info *drc); +#endif +uint32_t faad_latm_frame(latm_header *latm, bitfile *ld); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/contrib/aacdecoder/libfaad/tns.c b/src/contrib/aacdecoder/libfaad/tns.c old mode 100644 new mode 100755 index 215476f71..611865204 --- a/src/contrib/aacdecoder/libfaad/tns.c +++ b/src/contrib/aacdecoder/libfaad/tns.c @@ -1,296 +1,309 @@ -/* -** 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: tns.c,v 1.1 2005/11/27 01:00:36 tonymillion Exp $ -**/ - -#include "common.h" -#include "structs.h" - -#include "syntax.h" -#include "tns.h" - - -/* static function declarations */ -static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, - uint8_t *coef, real_t *a); -static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order); -static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order); - - -#ifdef _MSC_VER -#pragma warning(disable:4305) -#pragma warning(disable:4244) -#endif -static real_t tns_coef_0_3[] = -{ - COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(0.7818314825), COEF_CONST(0.9749279122), - COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.9749279122), COEF_CONST(-0.9749279122), - COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) -}; -static real_t tns_coef_0_4[] = -{ - COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), - COEF_CONST(0.7431448255), COEF_CONST(0.8660254038), COEF_CONST(0.9510565163), COEF_CONST(0.9945218954), - COEF_CONST(-0.9957341763), COEF_CONST(-0.9618256432), COEF_CONST(-0.8951632914), COEF_CONST(-0.7980172273), - COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) -}; -static real_t tns_coef_1_3[] = -{ - COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(0.9749279122), COEF_CONST(0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), - COEF_CONST(-0.7818314825), COEF_CONST(-0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) -}; -static real_t tns_coef_1_4[] = -{ - COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), - COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178), - COEF_CONST(0.9945218954), COEF_CONST(0.9510565163), COEF_CONST(0.8660254038), COEF_CONST(0.7431448255), - COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) -}; - - -/* TNS decoding for one channel and frame */ -void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, - uint8_t object_type, real_t *spec, uint16_t frame_len) -{ - uint8_t w, f, tns_order; - int8_t inc; - int16_t size; - uint16_t bottom, top, start, end; - uint16_t nshort = frame_len/8; - real_t lpc[TNS_MAX_ORDER+1]; - - if (!ics->tns_data_present) - return; - - for (w = 0; w < ics->num_windows; w++) - { - bottom = ics->num_swb; - - for (f = 0; f < tns->n_filt[w]; f++) - { - top = bottom; - bottom = max(top - tns->length[w][f], 0); - tns_order = min(tns->order[w][f], TNS_MAX_ORDER); - if (!tns_order) - continue; - - tns_decode_coef(tns_order, tns->coef_res[w]+3, - tns->coef_compress[w][f], tns->coef[w][f], lpc); - - start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - start = min(start, ics->max_sfb); - start = ics->swb_offset[start]; - - end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - end = min(end, ics->max_sfb); - end = ics->swb_offset[end]; - - size = end - start; - if (size <= 0) - continue; - - if (tns->direction[w][f]) - { - inc = -1; - start = end - 1; - } else { - inc = 1; - } - - tns_ar_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); - } - } -} - -/* TNS encoding for one channel and frame */ -void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, - uint8_t object_type, real_t *spec, uint16_t frame_len) -{ - uint8_t w, f, tns_order; - int8_t inc; - int16_t size; - uint16_t bottom, top, start, end; - uint16_t nshort = frame_len/8; - real_t lpc[TNS_MAX_ORDER+1]; - - if (!ics->tns_data_present) - return; - - for (w = 0; w < ics->num_windows; w++) - { - bottom = ics->num_swb; - - for (f = 0; f < tns->n_filt[w]; f++) - { - top = bottom; - bottom = max(top - tns->length[w][f], 0); - tns_order = min(tns->order[w][f], TNS_MAX_ORDER); - if (!tns_order) - continue; - - tns_decode_coef(tns_order, tns->coef_res[w]+3, - tns->coef_compress[w][f], tns->coef[w][f], lpc); - - start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - start = min(start, ics->max_sfb); - start = ics->swb_offset[start]; - - end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); - end = min(end, ics->max_sfb); - end = ics->swb_offset[end]; - - size = end - start; - if (size <= 0) - continue; - - if (tns->direction[w][f]) - { - inc = -1; - start = end - 1; - } else { - inc = 1; - } - - tns_ma_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); - } - } -} - -/* Decoder transmitted coefficients for one TNS filter */ -static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, - uint8_t *coef, real_t *a) -{ - uint8_t i, m; - real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; - - /* Conversion to signed integer */ - for (i = 0; i < order; i++) - { - if (coef_compress == 0) - { - if (coef_res_bits == 3) - { - tmp2[i] = tns_coef_0_3[coef[i]]; - } else { - tmp2[i] = tns_coef_0_4[coef[i]]; - } - } else { - if (coef_res_bits == 3) - { - tmp2[i] = tns_coef_1_3[coef[i]]; - } else { - tmp2[i] = tns_coef_1_4[coef[i]]; - } - } - } - - /* Conversion to LPC coefficients */ - a[0] = COEF_CONST(1.0); - for (m = 1; m <= order; m++) - { - for (i = 1; i < m; i++) /* loop only while i 0; j--) - state[j] = state[j-1]; - - state[0] = y; - *spectrum = y; - spectrum += inc; - } -} - -static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, - uint8_t order) -{ - /* - - Simple all-zero filter of order "order" defined by - y(n) = x(n) + a(2)*x(n-1) + ... + a(order+1)*x(n-order) - - The state variables of the filter are initialized to zero every time - - The output data is written over the input data ("in-place operation") - - An input vector of "size" samples is processed and the index increment - to the next data sample is given by "inc" - */ - - uint8_t j; - uint16_t i; - real_t y, state[TNS_MAX_ORDER]; - - for (i = 0; i < order; i++) - state[i] = REAL_CONST(0.0); - - for (i = 0; i < size; i++) - { - y = *spectrum; - - for (j = 0; j < order; j++) - y += MUL_C(state[j], lpc[j+1]); - - for (j = order-1; j > 0; j--) - state[j] = state[j-1]; - - state[0] = *spectrum; - *spectrum = y; - spectrum += inc; - } -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: tns.c,v 1.40 2007/11/01 12:33:40 menno Exp $ +**/ + +#include "common.h" +#include "structs.h" + +#include "syntax.h" +#include "tns.h" + + +/* static function declarations */ +static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, + uint8_t *coef, real_t *a); +static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, + uint8_t order); +static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, + uint8_t order); + + +#ifdef _MSC_VER +#pragma warning(disable:4305) +#pragma warning(disable:4244) +#endif +static real_t tns_coef_0_3[] = +{ + COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(0.7818314825), COEF_CONST(0.9749279122), + COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), + COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.9749279122), COEF_CONST(-0.9749279122), + COEF_CONST(-0.9848077530), COEF_CONST(-0.8660254038), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) +}; +static real_t tns_coef_0_4[] = +{ + COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), + COEF_CONST(0.7431448255), COEF_CONST(0.8660254038), COEF_CONST(0.9510565163), COEF_CONST(0.9945218954), + COEF_CONST(-0.9957341763), COEF_CONST(-0.9618256432), COEF_CONST(-0.8951632914), COEF_CONST(-0.7980172273), + COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) +}; +static real_t tns_coef_1_3[] = +{ + COEF_CONST(0.0), COEF_CONST(0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), + COEF_CONST(0.9749279122), COEF_CONST(0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), + COEF_CONST(-0.4338837391), COEF_CONST(-0.7818314825), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433), + COEF_CONST(-0.7818314825), COEF_CONST(-0.4338837391), COEF_CONST(-0.6427876097), COEF_CONST(-0.3420201433) +}; +static real_t tns_coef_1_4[] = +{ + COEF_CONST(0.0), COEF_CONST(0.2079116908), COEF_CONST(0.4067366431), COEF_CONST(0.5877852523), + COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178), + COEF_CONST(0.9945218954), COEF_CONST(0.9510565163), COEF_CONST(0.8660254038), COEF_CONST(0.7431448255), + COEF_CONST(-0.6736956436), COEF_CONST(-0.5264321629), COEF_CONST(-0.3612416662), COEF_CONST(-0.1837495178) +}; + + +/* TNS decoding for one channel and frame */ +void tns_decode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, + uint8_t object_type, real_t *spec, uint16_t frame_len) +{ + uint8_t w, f, tns_order; + int8_t inc; + int16_t size; + uint16_t bottom, top, start, end; + uint16_t nshort = frame_len/8; + real_t lpc[TNS_MAX_ORDER+1]; + + if (!ics->tns_data_present) + return; + + for (w = 0; w < ics->num_windows; w++) + { + bottom = ics->num_swb; + + for (f = 0; f < tns->n_filt[w]; f++) + { + top = bottom; + bottom = max(top - tns->length[w][f], 0); + tns_order = min(tns->order[w][f], TNS_MAX_ORDER); + if (!tns_order) + continue; + + tns_decode_coef(tns_order, tns->coef_res[w]+3, + tns->coef_compress[w][f], tns->coef[w][f], lpc); + + start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); + start = min(start, ics->max_sfb); + start = min(ics->swb_offset[start], ics->swb_offset_max); + + end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); + end = min(end, ics->max_sfb); + end = min(ics->swb_offset[end], ics->swb_offset_max); + + size = end - start; + if (size <= 0) + continue; + + if (tns->direction[w][f]) + { + inc = -1; + start = end - 1; + } else { + inc = 1; + } + + tns_ar_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); + } + } +} + +/* TNS encoding for one channel and frame */ +void tns_encode_frame(ic_stream *ics, tns_info *tns, uint8_t sr_index, + uint8_t object_type, real_t *spec, uint16_t frame_len) +{ + uint8_t w, f, tns_order; + int8_t inc; + int16_t size; + uint16_t bottom, top, start, end; + uint16_t nshort = frame_len/8; + real_t lpc[TNS_MAX_ORDER+1]; + + if (!ics->tns_data_present) + return; + + for (w = 0; w < ics->num_windows; w++) + { + bottom = ics->num_swb; + + for (f = 0; f < tns->n_filt[w]; f++) + { + top = bottom; + bottom = max(top - tns->length[w][f], 0); + tns_order = min(tns->order[w][f], TNS_MAX_ORDER); + if (!tns_order) + continue; + + tns_decode_coef(tns_order, tns->coef_res[w]+3, + tns->coef_compress[w][f], tns->coef[w][f], lpc); + + start = min(bottom, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); + start = min(start, ics->max_sfb); + start = min(ics->swb_offset[start], ics->swb_offset_max); + + end = min(top, max_tns_sfb(sr_index, object_type, (ics->window_sequence == EIGHT_SHORT_SEQUENCE))); + end = min(end, ics->max_sfb); + end = min(ics->swb_offset[end], ics->swb_offset_max); + + size = end - start; + if (size <= 0) + continue; + + if (tns->direction[w][f]) + { + inc = -1; + start = end - 1; + } else { + inc = 1; + } + + tns_ma_filter(&spec[(w*nshort)+start], size, inc, lpc, tns_order); + } + } +} + +/* Decoder transmitted coefficients for one TNS filter */ +static void tns_decode_coef(uint8_t order, uint8_t coef_res_bits, uint8_t coef_compress, + uint8_t *coef, real_t *a) +{ + uint8_t i, m; + real_t tmp2[TNS_MAX_ORDER+1], b[TNS_MAX_ORDER+1]; + + /* Conversion to signed integer */ + for (i = 0; i < order; i++) + { + if (coef_compress == 0) + { + if (coef_res_bits == 3) + { + tmp2[i] = tns_coef_0_3[coef[i]]; + } else { + tmp2[i] = tns_coef_0_4[coef[i]]; + } + } else { + if (coef_res_bits == 3) + { + tmp2[i] = tns_coef_1_3[coef[i]]; + } else { + tmp2[i] = tns_coef_1_4[coef[i]]; + } + } + } + + /* Conversion to LPC coefficients */ + a[0] = COEF_CONST(1.0); + for (m = 1; m <= order; m++) + { + for (i = 1; i < m; i++) /* loop only while i - -#include "m4aaudiosource.h" - -static uint32_t read_callback(void *user_data, void *buffer, uint32_t length) -{ - return fread(buffer, 1, length, (FILE*)user_data); -} - -static uint32_t seek_callback(void *user_data, uint64_t position) -{ - return fseek((FILE*)user_data, position, SEEK_SET); -} - -static uint32_t write_callback(void *user_data, void *buffer, uint32_t length) -{ - return fwrite(buffer, 1, length, (FILE*)user_data); -} - -static uint32_t truncate_callback(void *user_data) -{ - _chsize(fileno((FILE*)user_data), ftell((FILE*)user_data)); - return 1; -} - -static int GetAACTrack(mp4ff_t *infile) -{ - /* find AAC track */ - int i, rc; - int numTracks = mp4ff_total_tracks(infile); - - for (i = 0; i < numTracks; i++) - { - unsigned char *buff = NULL; - int buff_size = 0; - mp4AudioSpecificConfig mp4ASC; - - mp4ff_get_decoder_config(infile, i, &buff, (unsigned int *)&buff_size); - - if (buff) - { - rc = AudioSpecificConfig(buff, buff_size, &mp4ASC); - free(buff); - - if (rc < 0) - continue; - return i; - } - } - - /* can't decode this */ - return -1; -} - -M4ADecoder::M4ADecoder(void) -{ - m_hDecoder = NULL; - m_mp4FileHandle = NULL; - -} - -M4ADecoder::~M4ADecoder(void) -{ -} - -bool M4ADecoder::Open(const utfchar* source) -{ - unsigned char * buffer; - unsigned int buffer_size; - NeAACDecConfigurationPtr config; - - m_hDecoder = faacDecOpen(); - if(!m_hDecoder) - { - return false; - } - - config = faacDecGetCurrentConfiguration(m_hDecoder); - - config->outputFormat = FAAD_FMT_FLOAT; - config->downMatrix = 0; - - int ret = faacDecSetConfiguration(m_hDecoder, config); - - m_mp4FileHandle = _wfopen(source, _T("rb")); - m_mp4cb.read = read_callback; - m_mp4cb.seek = seek_callback; - m_mp4cb.user_data = m_mp4FileHandle; - - m_mp4file = mp4ff_open_read(&m_mp4cb); - if(!m_mp4file) - { - return false; - } - - if((m_mp4track = GetAACTrack(m_mp4file)) < 0) - { - return false; - } - - buffer = NULL; - buffer_size = 0; - mp4ff_get_decoder_config(m_mp4file, m_mp4track, &buffer, &buffer_size); - if(!buffer) - { - return false; - } - - if(faacDecInit2( m_hDecoder, - buffer, - buffer_size, - (unsigned long *)&m_SampleRate, - (unsigned char*)&m_NumChannels) < 0) - { - if(buffer) - free(buffer); - return false; - } - - free(buffer); - - m_numSamples = mp4ff_num_samples(m_mp4file, m_mp4track); - m_sampleId = 0; - - this->sourcePath = source; - - return true; -} - -bool M4ADecoder::Close() -{ - fclose(m_mp4FileHandle); - mp4ff_close(m_mp4file); - - if(m_hDecoder) - { - faacDecClose(m_hDecoder); - m_hDecoder = NULL; - } - - return true; -} - - -void M4ADecoder::Destroy(void) -{ - this->Close(); - delete this; -} - -bool M4ADecoder::GetLength(unsigned long * MS) -{ - long length; - - length = mp4ff_get_track_duration(m_mp4file, m_mp4track); - - *MS = (long)(length*1000.0 / (float)mp4ff_time_scale(m_mp4file, m_mp4track) + 0.5); - - return true; -} - -bool M4ADecoder::SetPosition(unsigned long * MS) -{ - int64_t duration; - float fms = *MS; - int32_t skip_samples = 0; - - duration = (int64_t)(fms/1000.0 * m_SampleRate + 0.5); - m_sampleId = mp4ff_find_sample_use_offsets( m_mp4file, - m_mp4track, - duration, - &skip_samples); - - - return true; -} - -bool M4ADecoder::SetState(unsigned long State) -{ - return true; -} - -bool M4ADecoder::GetFormat(unsigned long * SampleRate, unsigned long * Channels) -{ - *SampleRate = m_SampleRate; - *Channels = m_NumChannels; - - return true; -} - -bool M4ADecoder::GetBuffer(float ** ppBuffer, unsigned long * NumSamples) -{ - void * sample_buffer = NULL; - unsigned char * buffer = NULL; - unsigned long buffer_size = 0; - NeAACDecFrameInfo frameInfo; - - int rc; - long dur; - - /* get acces unit from MP4 file */ - - dur = mp4ff_get_sample_duration(m_mp4file, - m_mp4track, - m_sampleId); - - if(dur <= 0) - { - return false; - } - - rc = mp4ff_read_sample( m_mp4file, - m_mp4track, - m_sampleId, - &buffer, - (unsigned int*)&buffer_size); - - m_sampleId++; - - if (rc == 0 || buffer == NULL) - { - return false; - } - - sample_buffer = faacDecDecode( m_hDecoder, - &frameInfo, - buffer, - buffer_size); - - if (buffer) - free(buffer); - - if (frameInfo.error > 0) - { - return false; - } - - if(m_sampleId > m_numSamples) - { - return false; - } - - *ppBuffer = (float*)sample_buffer; - *NumSamples = frameInfo.samples; - - return true; -} diff --git a/src/contrib/aacdecoder/m4aAudioSource.h b/src/contrib/aacdecoder/m4aAudioSource.h deleted file mode 100644 index 1835e98d9..000000000 --- a/src/contrib/aacdecoder/m4aAudioSource.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once -#include "iaudiosource.h" -#include "neaacdec.h" -#include "mp4ff.h" - -using namespace musik::core::audio; - -// TODO: clean up the entire decoder. Possibly move libfaad to separate project -class M4ADecoder : public IAudioSource -{ -protected: - - NeAACDecHandle m_hDecoder; - mp4ff_t * m_mp4file; - FILE * m_mp4FileHandle; - mp4ff_callback_t m_mp4cb; - int m_mp4track; - long m_numSamples; - long m_sampleId; - - unsigned long m_SampleRate; - unsigned char m_NumChannels; - -public: - - M4ADecoder(void); - ~M4ADecoder(void); - - bool Open(const utfchar* source); - bool Close(); - void Destroy(void); - bool GetLength(unsigned long * MS); - bool SetPosition(unsigned long * MS); - bool SetState(unsigned long State); - bool GetFormat(unsigned long * SampleRate, unsigned long * Channels); - bool GetBuffer(float ** ppBuffer, unsigned long * NumSamples); - - const utfchar* GetSource() const { return sourcePath.c_str(); }; - -private: - utfstring sourcePath; -}; diff --git a/src/contrib/aacdecoder/mp4atom.c b/src/contrib/aacdecoder/mp4ff/mp4atom.c old mode 100644 new mode 100755 similarity index 72% rename from src/contrib/aacdecoder/mp4atom.c rename to src/contrib/aacdecoder/mp4ff/mp4atom.c index c7b2c73a2..c735c2ae7 --- a/src/contrib/aacdecoder/mp4atom.c +++ b/src/contrib/aacdecoder/mp4ff/mp4atom.c @@ -1,901 +1,689 @@ -/* -** 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: mp4atom.c,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#include -#ifndef _WIN32 -#include "config.h" -#else -#include -#ifdef ITUNES_DRM -#include -#endif -#include -#endif -#ifdef HAVE_GETPWUID -# include -#endif -#ifdef HAVE_STRING_H -# include -#endif -#include "mp4ffint.h" - -#include "drms.h" - -/* parse atom header size */ -static int32_t mp4ff_atom_get_size(const int8_t *data) -{ - uint32_t result; - uint32_t a, b, c, d; - - a = (uint8_t)data[0]; - b = (uint8_t)data[1]; - c = (uint8_t)data[2]; - d = (uint8_t)data[3]; - - result = (a<<24) | (b<<16) | (c<<8) | d; - //if (result > 0 && result < 8) result = 8; - - return (int32_t)result; -} - -/* comnapre 2 atom names, returns 1 for equal, 0 for unequal */ -static int32_t mp4ff_atom_compare(const int8_t a1, const int8_t b1, const int8_t c1, const int8_t d1, - const int8_t a2, const int8_t b2, const int8_t c2, const int8_t d2) -{ - if (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2) - return 1; - else - return 0; -} - -static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b, - const int8_t c, const int8_t d) -{ - if (a == 'm') - { - if (mp4ff_atom_compare(a,b,c,d, 'm','o','o','v')) - return ATOM_MOOV; - else if (mp4ff_atom_compare(a,b,c,d, 'm','i','n','f')) - return ATOM_MINF; - else if (mp4ff_atom_compare(a,b,c,d, 'm','d','i','a')) - return ATOM_MDIA; - else if (mp4ff_atom_compare(a,b,c,d, 'm','d','a','t')) - return ATOM_MDAT; - else if (mp4ff_atom_compare(a,b,c,d, 'm','d','h','d')) - return ATOM_MDHD; - else if (mp4ff_atom_compare(a,b,c,d, 'm','v','h','d')) - return ATOM_MVHD; - else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','a')) - return ATOM_MP4A; - else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','v')) - return ATOM_MP4V; - else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','s')) - return ATOM_MP4S; - else if (mp4ff_atom_compare(a,b,c,d, 'm','e','t','a')) - return ATOM_META; - } else if (a == 't') { - if (mp4ff_atom_compare(a,b,c,d, 't','r','a','k')) - return ATOM_TRAK; - else if (mp4ff_atom_compare(a,b,c,d, 't','k','h','d')) - return ATOM_TKHD; - else if (mp4ff_atom_compare(a,b,c,d, 't','r','e','f')) - return ATOM_TREF; - else if (mp4ff_atom_compare(a,b,c,d, 't','r','k','n')) - return ATOM_TRACK; - else if (mp4ff_atom_compare(a,b,c,d, 't','m','p','o')) - return ATOM_TEMPO; - } else if (a == 's') { - if (mp4ff_atom_compare(a,b,c,d, 's','t','b','l')) - return ATOM_STBL; - else if (mp4ff_atom_compare(a,b,c,d, 's','m','h','d')) - return ATOM_SMHD; - else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','d')) - return ATOM_STSD; - else if (mp4ff_atom_compare(a,b,c,d, 's','t','t','s')) - return ATOM_STTS; - else if (mp4ff_atom_compare(a,b,c,d, 's','t','c','o')) - return ATOM_STCO; - else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','c')) - return ATOM_STSC; - else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','z')) - return ATOM_STSZ; - else if (mp4ff_atom_compare(a,b,c,d, 's','t','z','2')) - return ATOM_STZ2; - else if (mp4ff_atom_compare(a,b,c,d, 's','k','i','p')) - return ATOM_SKIP; - else if (mp4ff_atom_compare(a,b,c,d, 's','i','n','f')) - return ATOM_SINF; - else if (mp4ff_atom_compare(a,b,c,d, 's','c','h','i')) - return ATOM_SCHI; - } else if (a == '©') { - if (mp4ff_atom_compare(a,b,c,d, '©','n','a','m')) - return ATOM_TITLE; - else if (mp4ff_atom_compare(a,b,c,d, '©','A','R','T')) - return ATOM_ARTIST; - else if (mp4ff_atom_compare(a,b,c,d, '©','w','r','t')) - return ATOM_WRITER; - else if (mp4ff_atom_compare(a,b,c,d, '©','a','l','b')) - return ATOM_ALBUM; - else if (mp4ff_atom_compare(a,b,c,d, '©','d','a','y')) - return ATOM_DATE; - else if (mp4ff_atom_compare(a,b,c,d, '©','t','o','o')) - return ATOM_TOOL; - else if (mp4ff_atom_compare(a,b,c,d, '©','c','m','t')) - return ATOM_COMMENT; - else if (mp4ff_atom_compare(a,b,c,d, '©','g','e','n')) - return ATOM_GENRE1; - } - - if (mp4ff_atom_compare(a,b,c,d, 'e','d','t','s')) - return ATOM_EDTS; - else if (mp4ff_atom_compare(a,b,c,d, 'e','s','d','s')) - return ATOM_ESDS; - else if (mp4ff_atom_compare(a,b,c,d, 'f','t','y','p')) - return ATOM_FTYP; - else if (mp4ff_atom_compare(a,b,c,d, 'f','r','e','e')) - return ATOM_FREE; - else if (mp4ff_atom_compare(a,b,c,d, 'h','m','h','d')) - return ATOM_HMHD; - else if (mp4ff_atom_compare(a,b,c,d, 'v','m','h','d')) - return ATOM_VMHD; - else if (mp4ff_atom_compare(a,b,c,d, 'u','d','t','a')) - return ATOM_UDTA; - else if (mp4ff_atom_compare(a,b,c,d, 'i','l','s','t')) - return ATOM_ILST; - else if (mp4ff_atom_compare(a,b,c,d, 'n','a','m','e')) - return ATOM_NAME; - else if (mp4ff_atom_compare(a,b,c,d, 'd','a','t','a')) - return ATOM_DATA; - else if (mp4ff_atom_compare(a,b,c,d, 'd','i','s','k')) - return ATOM_DISC; - else if (mp4ff_atom_compare(a,b,c,d, 'g','n','r','e')) - return ATOM_GENRE2; - else if (mp4ff_atom_compare(a,b,c,d, 'c','o','v','r')) - return ATOM_COVER; - else if (mp4ff_atom_compare(a,b,c,d, 'c','p','i','l')) - return ATOM_COMPILATION; - else if (mp4ff_atom_compare(a,b,c,d, 'c','t','t','s')) - return ATOM_CTTS; - else if (mp4ff_atom_compare(a,b,c,d, 'd','r','m','s')) - return ATOM_DRMS; - else if (mp4ff_atom_compare(a,b,c,d, 'f','r','m','a')) - return ATOM_FRMA; - else if (mp4ff_atom_compare(a,b,c,d, 'p','r','i','v')) - return ATOM_PRIV; - else if (mp4ff_atom_compare(a,b,c,d, 'i','v','i','v')) - return ATOM_IVIV; - else if (mp4ff_atom_compare(a,b,c,d, 'u','s','e','r')) - return ATOM_USER; - else if (mp4ff_atom_compare(a,b,c,d, 'k','e','y',' ')) - return ATOM_KEY; - else - return ATOM_UNKNOWN; -} - -/* read atom header, return atom size, atom size is with header included */ -uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_size) -{ - uint64_t size; - int32_t ret; - int8_t atom_header[8]; - - ret = mp4ff_read_data(f, atom_header, 8); - if (ret != 8) - return 0; - - size = mp4ff_atom_get_size(atom_header); - *header_size = 8; - - /* check for 64 bit atom size */ - if (size == 1) - { - *header_size = 16; - size = mp4ff_read_int64(f); - } - - //printf("%c%c%c%c\n", atom_header[4], atom_header[5], atom_header[6], atom_header[7]); - - *atom_type = mp4ff_atom_name_to_type(atom_header[4], atom_header[5], atom_header[6], atom_header[7]); - - return size; -} - -static int32_t mp4ff_read_stsz(mp4ff_t *f) -{ - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - f->track[f->total_tracks - 1]->stsz_sample_size = mp4ff_read_int32(f); - f->track[f->total_tracks - 1]->stsz_sample_count = mp4ff_read_int32(f); - - if (f->track[f->total_tracks - 1]->stsz_sample_size == 0) - { - int32_t i; - f->track[f->total_tracks - 1]->stsz_table = - (int32_t*)malloc(f->track[f->total_tracks - 1]->stsz_sample_count*sizeof(int32_t)); - - for (i = 0; i < f->track[f->total_tracks - 1]->stsz_sample_count; i++) - { - f->track[f->total_tracks - 1]->stsz_table[i] = mp4ff_read_int32(f); - } - } - - return 0; -} - -static int32_t mp4ff_read_esds(mp4ff_t *f) -{ - uint8_t tag; - uint32_t temp; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - - /* get and verify ES_DescrTag */ - tag = mp4ff_read_char(f); - if (tag == 0x03) - { - /* read length */ - if (mp4ff_read_mp4_descr_length(f) < 5 + 15) - { - return 1; - } - /* skip 3 bytes */ - mp4ff_read_int24(f); - } else { - /* skip 2 bytes */ - mp4ff_read_int16(f); - } - - /* get and verify DecoderConfigDescrTab */ - if (mp4ff_read_char(f) != 0x04) - { - return 1; - } - - /* read length */ - temp = mp4ff_read_mp4_descr_length(f); - if (temp < 13) return 1; - - f->track[f->total_tracks - 1]->audioType = mp4ff_read_char(f); - mp4ff_read_int32(f);//0x15000414 ???? - f->track[f->total_tracks - 1]->maxBitrate = mp4ff_read_int32(f); - f->track[f->total_tracks - 1]->avgBitrate = mp4ff_read_int32(f); - - /* get and verify DecSpecificInfoTag */ - if (mp4ff_read_char(f) != 0x05) - { - return 1; - } - - /* read length */ - f->track[f->total_tracks - 1]->decoderConfigLen = mp4ff_read_mp4_descr_length(f); - - if (f->track[f->total_tracks - 1]->decoderConfig) - free(f->track[f->total_tracks - 1]->decoderConfig); - f->track[f->total_tracks - 1]->decoderConfig = malloc(f->track[f->total_tracks - 1]->decoderConfigLen); - if (f->track[f->total_tracks - 1]->decoderConfig) - { - mp4ff_read_data(f, f->track[f->total_tracks - 1]->decoderConfig, f->track[f->total_tracks - 1]->decoderConfigLen); - } else { - f->track[f->total_tracks - 1]->decoderConfigLen = 0; - } - - /* will skip the remainder of the atom */ - return 0; -} - -static int32_t mp4ff_read_mp4a(mp4ff_t *f) -{ - uint64_t size; - int32_t i; - uint8_t atom_type = 0; - uint8_t header_size = 0; - - for (i = 0; i < 6; i++) - { - mp4ff_read_char(f); /* reserved */ - } - /* data_reference_index */ mp4ff_read_int16(f); - - mp4ff_read_int32(f); /* reserved */ - mp4ff_read_int32(f); /* reserved */ - - f->track[f->total_tracks - 1]->channelCount = mp4ff_read_int16(f); - f->track[f->total_tracks - 1]->sampleSize = mp4ff_read_int16(f); - - mp4ff_read_int16(f); - mp4ff_read_int16(f); - - f->track[f->total_tracks - 1]->sampleRate = mp4ff_read_int16(f); - - mp4ff_read_int16(f); - - size = mp4ff_atom_read_header(f, &atom_type, &header_size); - if (atom_type == ATOM_ESDS) - { - mp4ff_read_esds(f); - } - - return 0; -} - -#ifdef ITUNES_DRM -char *GetHomeDir( void ) -{ - char *p_tmp, *p_homedir = NULL; - -#if defined(HAVE_GETPWUID) - struct passwd *p_pw = NULL; -#endif - -#if defined(_WIN32) || defined(UNDER_CE) - typedef HRESULT (WINAPI *SHGETFOLDERPATH)( HWND, int, HANDLE, DWORD, - LPSTR ); -# define CSIDL_FLAG_CREATE 0x8000 -# define CSIDL_APPDATA 0x1A -# define SHGFP_TYPE_CURRENT 0 - - HINSTANCE shfolder_dll; - SHGETFOLDERPATH SHGetFolderPath ; - /* load the shfolder dll to retrieve SHGetFolderPath */ - if( ( shfolder_dll = LoadLibrary( _T("SHFolder.dll") ) ) != NULL ) - { - SHGetFolderPath = (void *)GetProcAddress( shfolder_dll, - _T("SHGetFolderPathA") ); - if ( SHGetFolderPath != NULL ) - { - p_homedir = (char *)malloc( MAX_PATH ); - if( !p_homedir ) - { - return NULL; - } - - /* get the "Application Data" folder for the current user */ - if( S_OK == SHGetFolderPath( NULL, - CSIDL_APPDATA | CSIDL_FLAG_CREATE, - NULL, SHGFP_TYPE_CURRENT, - p_homedir ) ) - { - FreeLibrary( shfolder_dll ); - return p_homedir; - } - free( p_homedir ); - } - FreeLibrary( shfolder_dll ); - } -#endif - -#if defined(HAVE_GETPWUID) - if( ( p_pw = getpwuid( getuid() ) ) == NULL ) -#endif - { - if( ( p_tmp = getenv( "HOME" ) ) == NULL ) - { - if( ( p_tmp = getenv( "TMP" ) ) == NULL ) - { - p_tmp = "/tmp"; - } - } - - p_homedir = strdup( p_tmp ); - } -#if defined(HAVE_GETPWUID) - else - { - p_homedir = strdup( p_pw->pw_dir ); - } -#endif - - return p_homedir; -} - -static int32_t mp4ff_read_drms(mp4ff_t *f, uint64_t skip) -{ - uint64_t size; - int32_t i; - uint8_t atom_type = 0; - uint8_t header_size = 0; - - f->track[f->total_tracks - 1]->p_drms = drms_alloc( GetHomeDir() ); - - for (i = 0; i < 6; i++) - { - mp4ff_read_char(f); /* reserved */ - } - /* data_reference_index */ mp4ff_read_int16(f); - - mp4ff_read_int32(f); /* reserved */ - mp4ff_read_int32(f); /* reserved */ - - f->track[f->total_tracks - 1]->channelCount = mp4ff_read_int16(f); - f->track[f->total_tracks - 1]->sampleSize = mp4ff_read_int16(f); - - mp4ff_read_int16(f); - mp4ff_read_int16(f); - - f->track[f->total_tracks - 1]->sampleRate = mp4ff_read_int16(f); - - mp4ff_read_int16(f); - - size = mp4ff_atom_read_header(f, &atom_type, &header_size); - if (atom_type == ATOM_ESDS) - { - mp4ff_read_esds(f); - } - mp4ff_set_position(f, skip+size+28); - - size = mp4ff_atom_read_header(f, &atom_type, &header_size); - if (atom_type == ATOM_SINF) - { - parse_sub_atoms(f, size-header_size,0); - } - - return 0; -} - -static int32_t mp4ff_read_frma(mp4ff_t *f) -{ - uint8_t atom_type; - int8_t type[4]; - - mp4ff_read_data(f, type, 4); - - atom_type = mp4ff_atom_name_to_type(type[0], type[1], type[2], type[3]); - - if (atom_type == ATOM_MP4A) - { - f->track[f->total_tracks - 1]->type = TRACK_AUDIO; - } else if (atom_type == ATOM_MP4V) { - f->track[f->total_tracks - 1]->type = TRACK_VIDEO; - } else if (atom_type == ATOM_MP4S) { - f->track[f->total_tracks - 1]->type = TRACK_SYSTEM; - } else { - f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN; - } - - return 0; -} - -static int32_t mp4ff_read_name(mp4ff_t *f, uint64_t size) -{ - uint8_t *data = malloc(size); - mp4ff_read_data(f, data, size); - - if (f->track[f->total_tracks - 1]->p_drms != NULL) - { - drms_init(f->track[f->total_tracks - 1]->p_drms, - FOURCC_name, data, strlen(data) ); - } - - if (data) - free(data); - - return 0; -} - -static int32_t mp4ff_read_priv(mp4ff_t *f, uint64_t size) -{ - uint8_t *data = malloc(size); - mp4ff_read_data(f, data, size); - - if (f->track[f->total_tracks - 1]->p_drms != 0) - { - drms_init(f->track[f->total_tracks - 1]->p_drms, - FOURCC_priv, data, size ); - } - - if (data) - free(data); - - return 0; -} - -static int32_t mp4ff_read_iviv(mp4ff_t *f, uint64_t size) -{ - uint8_t *data = malloc(size); - mp4ff_read_data(f, data, size); - - if (f->track[f->total_tracks - 1]->p_drms != 0) - { - drms_init(f->track[f->total_tracks - 1]->p_drms, - FOURCC_iviv, data, sizeof(uint32_t) * 4 ); - } - - if (data) - free(data); - - return 0; -} - -static int32_t mp4ff_read_user(mp4ff_t *f, uint64_t size) -{ - uint8_t *data = malloc(size); - mp4ff_read_data(f, data, size); - - if (f->track[f->total_tracks - 1]->p_drms != 0) - { - drms_init(f->track[f->total_tracks - 1]->p_drms, - FOURCC_user, data, size ); - } - - if (data) - free(data); - - return 0; -} - -static int32_t mp4ff_read_key(mp4ff_t *f, uint64_t size) -{ - uint8_t *data = malloc(size); - mp4ff_read_data(f, data, size); - - if (f->track[f->total_tracks - 1]->p_drms != 0) - { - drms_init(f->track[f->total_tracks - 1]->p_drms, - FOURCC_key, data, size ); - } - - if (data) - free(data); - - return 0; -} -#endif - -static int32_t mp4ff_read_stsd(mp4ff_t *f) -{ - int32_t i; - uint8_t header_size = 0; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - - f->track[f->total_tracks - 1]->stsd_entry_count = mp4ff_read_int32(f); - - for (i = 0; i < f->track[f->total_tracks - 1]->stsd_entry_count; i++) - { - uint64_t skip = mp4ff_position(f); - uint64_t size; - uint8_t atom_type = 0; - size = mp4ff_atom_read_header(f, &atom_type, &header_size); - skip += size; - - if (atom_type == ATOM_MP4A) - { - f->track[f->total_tracks - 1]->type = TRACK_AUDIO; - mp4ff_read_mp4a(f); - } else if (atom_type == ATOM_MP4V) { - f->track[f->total_tracks - 1]->type = TRACK_VIDEO; - } else if (atom_type == ATOM_MP4S) { - f->track[f->total_tracks - 1]->type = TRACK_SYSTEM; -#ifdef ITUNES_DRM - } else if (atom_type == ATOM_DRMS) { - // track type is read from the "frma" atom - f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN; - mp4ff_read_drms(f, skip-size+header_size); -#endif - } else { - f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN; - } - - mp4ff_set_position(f, skip); - } - - return 0; -} - -static int32_t mp4ff_read_stsc(mp4ff_t *f) -{ - int32_t i; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - f->track[f->total_tracks - 1]->stsc_entry_count = mp4ff_read_int32(f); - - f->track[f->total_tracks - 1]->stsc_first_chunk = - (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); - f->track[f->total_tracks - 1]->stsc_samples_per_chunk = - (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); - f->track[f->total_tracks - 1]->stsc_sample_desc_index = - (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); - - for (i = 0; i < f->track[f->total_tracks - 1]->stsc_entry_count; i++) - { - f->track[f->total_tracks - 1]->stsc_first_chunk[i] = mp4ff_read_int32(f); - f->track[f->total_tracks - 1]->stsc_samples_per_chunk[i] = mp4ff_read_int32(f); - f->track[f->total_tracks - 1]->stsc_sample_desc_index[i] = mp4ff_read_int32(f); - } - - return 0; -} - -static int32_t mp4ff_read_stco(mp4ff_t *f) -{ - int32_t i; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - f->track[f->total_tracks - 1]->stco_entry_count = mp4ff_read_int32(f); - - f->track[f->total_tracks - 1]->stco_chunk_offset = - (int32_t*)malloc(f->track[f->total_tracks - 1]->stco_entry_count*sizeof(int32_t)); - - for (i = 0; i < f->track[f->total_tracks - 1]->stco_entry_count; i++) - { - f->track[f->total_tracks - 1]->stco_chunk_offset[i] = mp4ff_read_int32(f); - } - - return 0; -} - -static int32_t mp4ff_read_ctts(mp4ff_t *f) -{ - int32_t i; - mp4ff_track_t * p_track = f->track[f->total_tracks - 1]; - - if (p_track->ctts_entry_count) return 0; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - p_track->ctts_entry_count = mp4ff_read_int32(f); - - p_track->ctts_sample_count = (int32_t*)malloc(p_track->ctts_entry_count * sizeof(int32_t)); - p_track->ctts_sample_offset = (int32_t*)malloc(p_track->ctts_entry_count * sizeof(int32_t)); - - if (p_track->ctts_sample_count == 0 || p_track->ctts_sample_offset == 0) - { - if (p_track->ctts_sample_count) {free(p_track->ctts_sample_count);p_track->ctts_sample_count=0;} - if (p_track->ctts_sample_offset) {free(p_track->ctts_sample_offset);p_track->ctts_sample_offset=0;} - p_track->ctts_entry_count = 0; - return 0; - } - else - { - for (i = 0; i < f->track[f->total_tracks - 1]->ctts_entry_count; i++) - { - p_track->ctts_sample_count[i] = mp4ff_read_int32(f); - p_track->ctts_sample_offset[i] = mp4ff_read_int32(f); - } - return 1; - } -} - -static int32_t mp4ff_read_stts(mp4ff_t *f) -{ - int32_t i; - mp4ff_track_t * p_track = f->track[f->total_tracks - 1]; - - if (p_track->stts_entry_count) return 0; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - p_track->stts_entry_count = mp4ff_read_int32(f); - - p_track->stts_sample_count = (int32_t*)malloc(p_track->stts_entry_count * sizeof(int32_t)); - p_track->stts_sample_delta = (int32_t*)malloc(p_track->stts_entry_count * sizeof(int32_t)); - - if (p_track->stts_sample_count == 0 || p_track->stts_sample_delta == 0) - { - if (p_track->stts_sample_count) {free(p_track->stts_sample_count);p_track->stts_sample_count=0;} - if (p_track->stts_sample_delta) {free(p_track->stts_sample_delta);p_track->stts_sample_delta=0;} - p_track->stts_entry_count = 0; - return 0; - } - else - { - for (i = 0; i < f->track[f->total_tracks - 1]->stts_entry_count; i++) - { - p_track->stts_sample_count[i] = mp4ff_read_int32(f); - p_track->stts_sample_delta[i] = mp4ff_read_int32(f); - } - return 1; - } -} - -static int32_t mp4ff_read_mvhd(mp4ff_t *f) -{ - int32_t i; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - /* creation_time */ mp4ff_read_int32(f); - /* modification_time */ mp4ff_read_int32(f); - f->time_scale = mp4ff_read_int32(f); - f->duration = mp4ff_read_int32(f); - /* preferred_rate */ mp4ff_read_int32(f); /*mp4ff_read_fixed32(f);*/ - /* preferred_volume */ mp4ff_read_int16(f); /*mp4ff_read_fixed16(f);*/ - for (i = 0; i < 10; i++) - { - /* reserved */ mp4ff_read_char(f); - } - for (i = 0; i < 9; i++) - { - mp4ff_read_int32(f); /* matrix */ - } - /* preview_time */ mp4ff_read_int32(f); - /* preview_duration */ mp4ff_read_int32(f); - /* poster_time */ mp4ff_read_int32(f); - /* selection_time */ mp4ff_read_int32(f); - /* selection_duration */ mp4ff_read_int32(f); - /* current_time */ mp4ff_read_int32(f); - /* next_track_id */ mp4ff_read_int32(f); - - return 0; -} - -#if 0 -static int32_t mp4ff_read_tkhd(mp4ff_t *f) -{ - uint8_t version; - uint32_t flags; - version = mp4ff_read_char(f); /* version */ - flags = mp4ff_read_int24(f); /* flags */ - if (version==1) - { - mp4ff_read_int64(f);//creation-time - mp4ff_read_int64(f);//modification-time - mp4ff_read_int32(f);//track-id - mp4ff_read_int32(f);//reserved - f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration - } - else //version == 0 - { - mp4ff_read_int32(f);//creation-time - mp4ff_read_int32(f);//modification-time - mp4ff_read_int32(f);//track-id - mp4ff_read_int32(f);//reserved - f->track[f->total_tracks - 1]->duration = mp4ff_read_int32(f);//duration - if (f->track[f->total_tracks - 1]->duration == 0xFFFFFFFF) - f->track[f->total_tracks - 1]->duration = 0xFFFFFFFFFFFFFFFF; - - } - mp4ff_read_int32(f);//reserved - mp4ff_read_int32(f);//reserved - mp4ff_read_int16(f);//layer - mp4ff_read_int16(f);//pre-defined - mp4ff_read_int16(f);//volume - mp4ff_read_int16(f);//reserved - - //matrix - mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); - mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); - mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); - mp4ff_read_int32(f);//width - mp4ff_read_int32(f);//height - return 1; -} -#endif - -static int32_t mp4ff_read_mdhd(mp4ff_t *f) -{ - uint32_t version; - - version = mp4ff_read_int32(f); - if (version==1) - { - mp4ff_read_int64(f);//creation-time - mp4ff_read_int64(f);//modification-time - f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale - f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration - } - else //version == 0 - { - uint32_t temp; - - mp4ff_read_int32(f);//creation-time - mp4ff_read_int32(f);//modification-time - f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale - temp = mp4ff_read_int32(f); - f->track[f->total_tracks - 1]->duration = (temp == (uint32_t)(-1)) ? (uint64_t)(-1) : (uint64_t)(temp); - } - mp4ff_read_int16(f); - mp4ff_read_int16(f); - return 1; -} -#ifdef USE_TAGGING -static int32_t mp4ff_read_meta(mp4ff_t *f, const uint64_t size) -{ - uint64_t subsize, sumsize = 0; - uint8_t atom_type; - uint8_t header_size = 0; - - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - - while (sumsize < (size-(header_size+4))) - { - subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); - if (subsize <= header_size+4) - return 1; - if (atom_type == ATOM_ILST) - { - mp4ff_parse_metadata(f, (uint32_t)(subsize-(header_size+4))); - } else { - mp4ff_set_position(f, mp4ff_position(f)+subsize-header_size); - } - sumsize += subsize; - } - - return 0; -} -#endif - -int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type) -{ - uint64_t dest_position = mp4ff_position(f)+size-8; - if (atom_type == ATOM_STSZ) - { - /* sample size box */ - mp4ff_read_stsz(f); - } else if (atom_type == ATOM_STTS) { - /* time to sample box */ - mp4ff_read_stts(f); - } else if (atom_type == ATOM_CTTS) { - /* composition offset box */ - mp4ff_read_ctts(f); - } else if (atom_type == ATOM_STSC) { - /* sample to chunk box */ - mp4ff_read_stsc(f); - } else if (atom_type == ATOM_STCO) { - /* chunk offset box */ - mp4ff_read_stco(f); - } else if (atom_type == ATOM_STSD) { - /* sample description box */ - mp4ff_read_stsd(f); - } else if (atom_type == ATOM_MVHD) { - /* movie header box */ - mp4ff_read_mvhd(f); - } else if (atom_type == ATOM_MDHD) { - /* track header */ - mp4ff_read_mdhd(f); -#ifdef ITUNES_DRM - } else if (atom_type == ATOM_FRMA) { - /* DRM track format */ - mp4ff_read_frma(f); - } else if (atom_type == ATOM_IVIV) { - mp4ff_read_iviv(f, size-8); - } else if (atom_type == ATOM_NAME) { - mp4ff_read_name(f, size-8); - } else if (atom_type == ATOM_PRIV) { - mp4ff_read_priv(f, size-8); - } else if (atom_type == ATOM_USER) { - mp4ff_read_user(f, size-8); - } else if (atom_type == ATOM_KEY) { - mp4ff_read_key(f, size-8); -#endif -#ifdef USE_TAGGING - } else if (atom_type == ATOM_META) { - /* iTunes Metadata box */ - mp4ff_read_meta(f, size); -#endif - } - - mp4ff_set_position(f, dest_position); - - - return 0; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4atom.c,v 1.29 2009/01/19 23:56:30 menno Exp $ +**/ + +#include +#ifndef _WIN32 +#include "config.h" +#else +#include +#include +#endif +#ifdef HAVE_GETPWUID +# include +#endif +#ifdef HAVE_STRING_H +# include +#endif +#include "mp4ffint.h" + +#define COPYRIGHT_SYMBOL ((int8_t)0xA9) + +/* parse atom header size */ +static int32_t mp4ff_atom_get_size(const int8_t *data) +{ + uint32_t result; + uint32_t a, b, c, d; + + a = (uint8_t)data[0]; + b = (uint8_t)data[1]; + c = (uint8_t)data[2]; + d = (uint8_t)data[3]; + + result = (a<<24) | (b<<16) | (c<<8) | d; + //if (result > 0 && result < 8) result = 8; + + return (int32_t)result; +} + +/* comnapre 2 atom names, returns 1 for equal, 0 for unequal */ +static int32_t mp4ff_atom_compare(const int8_t a1, const int8_t b1, const int8_t c1, const int8_t d1, + const int8_t a2, const int8_t b2, const int8_t c2, const int8_t d2) +{ + if (a1 == a2 && b1 == b2 && c1 == c2 && d1 == d2) + return 1; + else + return 0; +} + +static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b, + const int8_t c, const int8_t d) +{ + if (a == 'm') + { + if (mp4ff_atom_compare(a,b,c,d, 'm','o','o','v')) + return ATOM_MOOV; + else if (mp4ff_atom_compare(a,b,c,d, 'm','i','n','f')) + return ATOM_MINF; + else if (mp4ff_atom_compare(a,b,c,d, 'm','d','i','a')) + return ATOM_MDIA; + else if (mp4ff_atom_compare(a,b,c,d, 'm','d','a','t')) + return ATOM_MDAT; + else if (mp4ff_atom_compare(a,b,c,d, 'm','d','h','d')) + return ATOM_MDHD; + else if (mp4ff_atom_compare(a,b,c,d, 'm','v','h','d')) + return ATOM_MVHD; + else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','a')) + return ATOM_MP4A; + else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','v')) + return ATOM_MP4V; + else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','s')) + return ATOM_MP4S; + else if (mp4ff_atom_compare(a,b,c,d, 'm','e','t','a')) + return ATOM_META; + } else if (a == 't') { + if (mp4ff_atom_compare(a,b,c,d, 't','r','a','k')) + return ATOM_TRAK; + else if (mp4ff_atom_compare(a,b,c,d, 't','k','h','d')) + return ATOM_TKHD; + else if (mp4ff_atom_compare(a,b,c,d, 't','r','e','f')) + return ATOM_TREF; + else if (mp4ff_atom_compare(a,b,c,d, 't','r','k','n')) + return ATOM_TRACK; + else if (mp4ff_atom_compare(a,b,c,d, 't','m','p','o')) + return ATOM_TEMPO; + else if (mp4ff_atom_compare(a,b,c,d, 't','v','n','n')) + return ATOM_NETWORK; + else if (mp4ff_atom_compare(a,b,c,d, 't','v','s','h')) + return ATOM_SHOW; + else if (mp4ff_atom_compare(a,b,c,d, 't','v','e','n')) + return ATOM_EPISODENAME; + else if (mp4ff_atom_compare(a,b,c,d, 't','v','s','n')) + return ATOM_SEASON; + else if (mp4ff_atom_compare(a,b,c,d, 't','v','e','s')) + return ATOM_EPISODE; + } else if (a == 's') { + if (mp4ff_atom_compare(a,b,c,d, 's','t','b','l')) + return ATOM_STBL; + else if (mp4ff_atom_compare(a,b,c,d, 's','m','h','d')) + return ATOM_SMHD; + else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','d')) + return ATOM_STSD; + else if (mp4ff_atom_compare(a,b,c,d, 's','t','t','s')) + return ATOM_STTS; + else if (mp4ff_atom_compare(a,b,c,d, 's','t','c','o')) + return ATOM_STCO; + else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','c')) + return ATOM_STSC; + else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','z')) + return ATOM_STSZ; + else if (mp4ff_atom_compare(a,b,c,d, 's','t','z','2')) + return ATOM_STZ2; + else if (mp4ff_atom_compare(a,b,c,d, 's','k','i','p')) + return ATOM_SKIP; + else if (mp4ff_atom_compare(a,b,c,d, 's','i','n','f')) + return ATOM_SINF; + else if (mp4ff_atom_compare(a,b,c,d, 's','c','h','i')) + return ATOM_SCHI; + else if (mp4ff_atom_compare(a,b,c,d, 's','o','n','m')) + return ATOM_SORTTITLE; + else if (mp4ff_atom_compare(a,b,c,d, 's','o','a','l')) + return ATOM_SORTALBUM; + else if (mp4ff_atom_compare(a,b,c,d, 's','o','a','r')) + return ATOM_SORTARTIST; + else if (mp4ff_atom_compare(a,b,c,d, 's','o','a','a')) + return ATOM_SORTALBUMARTIST; + else if (mp4ff_atom_compare(a,b,c,d, 's','o','c','o')) + return ATOM_SORTWRITER; + else if (mp4ff_atom_compare(a,b,c,d, 's','o','s','n')) + return ATOM_SORTSHOW; + } else if (a == COPYRIGHT_SYMBOL) { + if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'n','a','m')) + return ATOM_TITLE; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'A','R','T')) + return ATOM_ARTIST; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'w','r','t')) + return ATOM_WRITER; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'a','l','b')) + return ATOM_ALBUM; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'d','a','y')) + return ATOM_DATE; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'t','o','o')) + return ATOM_TOOL; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'c','m','t')) + return ATOM_COMMENT; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'g','e','n')) + return ATOM_GENRE1; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'g','r','p')) + return ATOM_CONTENTGROUP; + else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'l','y','r')) + return ATOM_LYRICS; + } + + if (mp4ff_atom_compare(a,b,c,d, 'e','d','t','s')) + return ATOM_EDTS; + else if (mp4ff_atom_compare(a,b,c,d, 'e','s','d','s')) + return ATOM_ESDS; + else if (mp4ff_atom_compare(a,b,c,d, 'f','t','y','p')) + return ATOM_FTYP; + else if (mp4ff_atom_compare(a,b,c,d, 'f','r','e','e')) + return ATOM_FREE; + else if (mp4ff_atom_compare(a,b,c,d, 'h','m','h','d')) + return ATOM_HMHD; + else if (mp4ff_atom_compare(a,b,c,d, 'v','m','h','d')) + return ATOM_VMHD; + else if (mp4ff_atom_compare(a,b,c,d, 'u','d','t','a')) + return ATOM_UDTA; + else if (mp4ff_atom_compare(a,b,c,d, 'i','l','s','t')) + return ATOM_ILST; + else if (mp4ff_atom_compare(a,b,c,d, 'n','a','m','e')) + return ATOM_NAME; + else if (mp4ff_atom_compare(a,b,c,d, 'd','a','t','a')) + return ATOM_DATA; + else if (mp4ff_atom_compare(a,b,c,d, 'd','i','s','k')) + return ATOM_DISC; + else if (mp4ff_atom_compare(a,b,c,d, 'g','n','r','e')) + return ATOM_GENRE2; + else if (mp4ff_atom_compare(a,b,c,d, 'c','o','v','r')) + return ATOM_COVER; + else if (mp4ff_atom_compare(a,b,c,d, 'c','p','i','l')) + return ATOM_COMPILATION; + else if (mp4ff_atom_compare(a,b,c,d, 'c','t','t','s')) + return ATOM_CTTS; + else if (mp4ff_atom_compare(a,b,c,d, 'd','r','m','s')) + return ATOM_DRMS; + else if (mp4ff_atom_compare(a,b,c,d, 'f','r','m','a')) + return ATOM_FRMA; + else if (mp4ff_atom_compare(a,b,c,d, 'p','r','i','v')) + return ATOM_PRIV; + else if (mp4ff_atom_compare(a,b,c,d, 'i','v','i','v')) + return ATOM_IVIV; + else if (mp4ff_atom_compare(a,b,c,d, 'u','s','e','r')) + return ATOM_USER; + else if (mp4ff_atom_compare(a,b,c,d, 'k','e','y',' ')) + return ATOM_KEY; + else if (mp4ff_atom_compare(a,b,c,d, 'a','A','R','T')) + return ATOM_ALBUM_ARTIST; + else if (mp4ff_atom_compare(a,b,c,d, 'd','e','s','c')) + return ATOM_DESCRIPTION; + else if (mp4ff_atom_compare(a,b,c,d, 'p','c','s','t')) + return ATOM_PODCAST; + else + return ATOM_UNKNOWN; +} + +/* read atom header, return atom size, atom size is with header included */ +uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_size) +{ + uint64_t size; + int32_t ret; + int8_t atom_header[8]; + + ret = mp4ff_read_data(f, atom_header, 8); + if (ret != 8) + return 0; + + size = mp4ff_atom_get_size(atom_header); + *header_size = 8; + + /* check for 64 bit atom size */ + if (size == 1) + { + *header_size = 16; + size = mp4ff_read_int64(f); + } + + //printf("%c%c%c%c\n", atom_header[4], atom_header[5], atom_header[6], atom_header[7]); + + *atom_type = mp4ff_atom_name_to_type(atom_header[4], atom_header[5], atom_header[6], atom_header[7]); + + return size; +} + +static int32_t mp4ff_read_stsz(mp4ff_t *f) +{ + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + f->track[f->total_tracks - 1]->stsz_sample_size = mp4ff_read_int32(f); + f->track[f->total_tracks - 1]->stsz_sample_count = mp4ff_read_int32(f); + + if (f->track[f->total_tracks - 1]->stsz_sample_size == 0) + { + int32_t i; + f->track[f->total_tracks - 1]->stsz_table = + (int32_t*)malloc(f->track[f->total_tracks - 1]->stsz_sample_count*sizeof(int32_t)); + + for (i = 0; i < f->track[f->total_tracks - 1]->stsz_sample_count; i++) + { + f->track[f->total_tracks - 1]->stsz_table[i] = mp4ff_read_int32(f); + } + } + + return 0; +} + +static int32_t mp4ff_read_esds(mp4ff_t *f) +{ + uint8_t tag; + uint32_t temp; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + + /* get and verify ES_DescrTag */ + tag = mp4ff_read_char(f); + if (tag == 0x03) + { + /* read length */ + if (mp4ff_read_mp4_descr_length(f) < 5 + 15) + { + return 1; + } + /* skip 3 bytes */ + mp4ff_read_int24(f); + } else { + /* skip 2 bytes */ + mp4ff_read_int16(f); + } + + /* get and verify DecoderConfigDescrTab */ + if (mp4ff_read_char(f) != 0x04) + { + return 1; + } + + /* read length */ + temp = mp4ff_read_mp4_descr_length(f); + if (temp < 13) return 1; + + f->track[f->total_tracks - 1]->audioType = mp4ff_read_char(f); + mp4ff_read_int32(f);//0x15000414 ???? + f->track[f->total_tracks - 1]->maxBitrate = mp4ff_read_int32(f); + f->track[f->total_tracks - 1]->avgBitrate = mp4ff_read_int32(f); + + /* get and verify DecSpecificInfoTag */ + if (mp4ff_read_char(f) != 0x05) + { + return 1; + } + + /* read length */ + f->track[f->total_tracks - 1]->decoderConfigLen = mp4ff_read_mp4_descr_length(f); + + if (f->track[f->total_tracks - 1]->decoderConfig) + free(f->track[f->total_tracks - 1]->decoderConfig); + f->track[f->total_tracks - 1]->decoderConfig = malloc(f->track[f->total_tracks - 1]->decoderConfigLen); + if (f->track[f->total_tracks - 1]->decoderConfig) + { + mp4ff_read_data(f, f->track[f->total_tracks - 1]->decoderConfig, f->track[f->total_tracks - 1]->decoderConfigLen); + } else { + f->track[f->total_tracks - 1]->decoderConfigLen = 0; + } + + /* will skip the remainder of the atom */ + return 0; +} + +static int32_t mp4ff_read_mp4a(mp4ff_t *f) +{ + uint64_t size; + int32_t i; + uint8_t atom_type = 0; + uint8_t header_size = 0; + + for (i = 0; i < 6; i++) + { + mp4ff_read_char(f); /* reserved */ + } + /* data_reference_index */ mp4ff_read_int16(f); + + mp4ff_read_int32(f); /* reserved */ + mp4ff_read_int32(f); /* reserved */ + + f->track[f->total_tracks - 1]->channelCount = mp4ff_read_int16(f); + f->track[f->total_tracks - 1]->sampleSize = mp4ff_read_int16(f); + + mp4ff_read_int16(f); + mp4ff_read_int16(f); + + f->track[f->total_tracks - 1]->sampleRate = mp4ff_read_int16(f); + + mp4ff_read_int16(f); + + size = mp4ff_atom_read_header(f, &atom_type, &header_size); + if (atom_type == ATOM_ESDS) + { + mp4ff_read_esds(f); + } + + return 0; +} + +static int32_t mp4ff_read_stsd(mp4ff_t *f) +{ + int32_t i; + uint8_t header_size = 0; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + + f->track[f->total_tracks - 1]->stsd_entry_count = mp4ff_read_int32(f); + + for (i = 0; i < f->track[f->total_tracks - 1]->stsd_entry_count; i++) + { + uint64_t skip = mp4ff_position(f); + uint64_t size; + uint8_t atom_type = 0; + size = mp4ff_atom_read_header(f, &atom_type, &header_size); + skip += size; + + if (atom_type == ATOM_MP4A) + { + f->track[f->total_tracks - 1]->type = TRACK_AUDIO; + mp4ff_read_mp4a(f); + } else if (atom_type == ATOM_MP4V) { + f->track[f->total_tracks - 1]->type = TRACK_VIDEO; + } else if (atom_type == ATOM_MP4S) { + f->track[f->total_tracks - 1]->type = TRACK_SYSTEM; + } else { + f->track[f->total_tracks - 1]->type = TRACK_UNKNOWN; + } + + mp4ff_set_position(f, skip); + } + + return 0; +} + +static int32_t mp4ff_read_stsc(mp4ff_t *f) +{ + int32_t i; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + f->track[f->total_tracks - 1]->stsc_entry_count = mp4ff_read_int32(f); + + f->track[f->total_tracks - 1]->stsc_first_chunk = + (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); + f->track[f->total_tracks - 1]->stsc_samples_per_chunk = + (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); + f->track[f->total_tracks - 1]->stsc_sample_desc_index = + (int32_t*)malloc(f->track[f->total_tracks - 1]->stsc_entry_count*sizeof(int32_t)); + + for (i = 0; i < f->track[f->total_tracks - 1]->stsc_entry_count; i++) + { + f->track[f->total_tracks - 1]->stsc_first_chunk[i] = mp4ff_read_int32(f); + f->track[f->total_tracks - 1]->stsc_samples_per_chunk[i] = mp4ff_read_int32(f); + f->track[f->total_tracks - 1]->stsc_sample_desc_index[i] = mp4ff_read_int32(f); + } + + return 0; +} + +static int32_t mp4ff_read_stco(mp4ff_t *f) +{ + int32_t i; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + f->track[f->total_tracks - 1]->stco_entry_count = mp4ff_read_int32(f); + + f->track[f->total_tracks - 1]->stco_chunk_offset = + (int32_t*)malloc(f->track[f->total_tracks - 1]->stco_entry_count*sizeof(int32_t)); + + for (i = 0; i < f->track[f->total_tracks - 1]->stco_entry_count; i++) + { + f->track[f->total_tracks - 1]->stco_chunk_offset[i] = mp4ff_read_int32(f); + } + + return 0; +} + +static int32_t mp4ff_read_ctts(mp4ff_t *f) +{ + int32_t i; + mp4ff_track_t * p_track = f->track[f->total_tracks - 1]; + + if (p_track->ctts_entry_count) return 0; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + p_track->ctts_entry_count = mp4ff_read_int32(f); + + p_track->ctts_sample_count = (int32_t*)malloc(p_track->ctts_entry_count * sizeof(int32_t)); + p_track->ctts_sample_offset = (int32_t*)malloc(p_track->ctts_entry_count * sizeof(int32_t)); + + if (p_track->ctts_sample_count == 0 || p_track->ctts_sample_offset == 0) + { + if (p_track->ctts_sample_count) {free(p_track->ctts_sample_count);p_track->ctts_sample_count=0;} + if (p_track->ctts_sample_offset) {free(p_track->ctts_sample_offset);p_track->ctts_sample_offset=0;} + p_track->ctts_entry_count = 0; + return 0; + } + else + { + for (i = 0; i < f->track[f->total_tracks - 1]->ctts_entry_count; i++) + { + p_track->ctts_sample_count[i] = mp4ff_read_int32(f); + p_track->ctts_sample_offset[i] = mp4ff_read_int32(f); + } + return 1; + } +} + +static int32_t mp4ff_read_stts(mp4ff_t *f) +{ + int32_t i; + mp4ff_track_t * p_track = f->track[f->total_tracks - 1]; + + if (p_track->stts_entry_count) return 0; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + p_track->stts_entry_count = mp4ff_read_int32(f); + + p_track->stts_sample_count = (int32_t*)malloc(p_track->stts_entry_count * sizeof(int32_t)); + p_track->stts_sample_delta = (int32_t*)malloc(p_track->stts_entry_count * sizeof(int32_t)); + + if (p_track->stts_sample_count == 0 || p_track->stts_sample_delta == 0) + { + if (p_track->stts_sample_count) {free(p_track->stts_sample_count);p_track->stts_sample_count=0;} + if (p_track->stts_sample_delta) {free(p_track->stts_sample_delta);p_track->stts_sample_delta=0;} + p_track->stts_entry_count = 0; + return 0; + } + else + { + for (i = 0; i < f->track[f->total_tracks - 1]->stts_entry_count; i++) + { + p_track->stts_sample_count[i] = mp4ff_read_int32(f); + p_track->stts_sample_delta[i] = mp4ff_read_int32(f); + } + return 1; + } +} + +static int32_t mp4ff_read_mvhd(mp4ff_t *f) +{ + int32_t i; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + /* creation_time */ mp4ff_read_int32(f); + /* modification_time */ mp4ff_read_int32(f); + f->time_scale = mp4ff_read_int32(f); + f->duration = mp4ff_read_int32(f); + /* preferred_rate */ mp4ff_read_int32(f); /*mp4ff_read_fixed32(f);*/ + /* preferred_volume */ mp4ff_read_int16(f); /*mp4ff_read_fixed16(f);*/ + for (i = 0; i < 10; i++) + { + /* reserved */ mp4ff_read_char(f); + } + for (i = 0; i < 9; i++) + { + mp4ff_read_int32(f); /* matrix */ + } + /* preview_time */ mp4ff_read_int32(f); + /* preview_duration */ mp4ff_read_int32(f); + /* poster_time */ mp4ff_read_int32(f); + /* selection_time */ mp4ff_read_int32(f); + /* selection_duration */ mp4ff_read_int32(f); + /* current_time */ mp4ff_read_int32(f); + /* next_track_id */ mp4ff_read_int32(f); + + return 0; +} + +#if 0 +static int32_t mp4ff_read_tkhd(mp4ff_t *f) +{ + uint8_t version; + uint32_t flags; + version = mp4ff_read_char(f); /* version */ + flags = mp4ff_read_int24(f); /* flags */ + if (version==1) + { + mp4ff_read_int64(f);//creation-time + mp4ff_read_int64(f);//modification-time + mp4ff_read_int32(f);//track-id + mp4ff_read_int32(f);//reserved + f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration + } + else //version == 0 + { + mp4ff_read_int32(f);//creation-time + mp4ff_read_int32(f);//modification-time + mp4ff_read_int32(f);//track-id + mp4ff_read_int32(f);//reserved + f->track[f->total_tracks - 1]->duration = mp4ff_read_int32(f);//duration + if (f->track[f->total_tracks - 1]->duration == 0xFFFFFFFF) + f->track[f->total_tracks - 1]->duration = 0xFFFFFFFFFFFFFFFF; + + } + mp4ff_read_int32(f);//reserved + mp4ff_read_int32(f);//reserved + mp4ff_read_int16(f);//layer + mp4ff_read_int16(f);//pre-defined + mp4ff_read_int16(f);//volume + mp4ff_read_int16(f);//reserved + + //matrix + mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); + mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); + mp4ff_read_int32(f); mp4ff_read_int32(f); mp4ff_read_int32(f); + mp4ff_read_int32(f);//width + mp4ff_read_int32(f);//height + return 1; +} +#endif + +static int32_t mp4ff_read_mdhd(mp4ff_t *f) +{ + uint32_t version; + + version = mp4ff_read_int32(f); + if (version==1) + { + mp4ff_read_int64(f);//creation-time + mp4ff_read_int64(f);//modification-time + f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale + f->track[f->total_tracks - 1]->duration = mp4ff_read_int64(f);//duration + } + else //version == 0 + { + uint32_t temp; + + mp4ff_read_int32(f);//creation-time + mp4ff_read_int32(f);//modification-time + f->track[f->total_tracks - 1]->timeScale = mp4ff_read_int32(f);//timescale + temp = mp4ff_read_int32(f); + f->track[f->total_tracks - 1]->duration = (temp == (uint32_t)(-1)) ? (uint64_t)(-1) : (uint64_t)(temp); + } + mp4ff_read_int16(f); + mp4ff_read_int16(f); + return 1; +} +#ifdef USE_TAGGING +static int32_t mp4ff_read_meta(mp4ff_t *f, const uint64_t size) +{ + uint64_t subsize, sumsize = 0; + uint8_t atom_type; + uint8_t header_size = 0; + + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + + while (sumsize < (size-(header_size+4))) + { + subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); + if (subsize <= header_size+4) + return 1; + if (atom_type == ATOM_ILST) + { + mp4ff_parse_metadata(f, (uint32_t)(subsize-(header_size+4))); + } else { + mp4ff_set_position(f, mp4ff_position(f)+subsize-header_size); + } + sumsize += subsize; + } + + return 0; +} +#endif + +int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type) +{ + uint64_t dest_position = mp4ff_position(f)+size-8; + if (atom_type == ATOM_STSZ) + { + /* sample size box */ + mp4ff_read_stsz(f); + } else if (atom_type == ATOM_STTS) { + /* time to sample box */ + mp4ff_read_stts(f); + } else if (atom_type == ATOM_CTTS) { + /* composition offset box */ + mp4ff_read_ctts(f); + } else if (atom_type == ATOM_STSC) { + /* sample to chunk box */ + mp4ff_read_stsc(f); + } else if (atom_type == ATOM_STCO) { + /* chunk offset box */ + mp4ff_read_stco(f); + } else if (atom_type == ATOM_STSD) { + /* sample description box */ + mp4ff_read_stsd(f); + } else if (atom_type == ATOM_MVHD) { + /* movie header box */ + mp4ff_read_mvhd(f); + } else if (atom_type == ATOM_MDHD) { + /* track header */ + mp4ff_read_mdhd(f); +#ifdef USE_TAGGING + } else if (atom_type == ATOM_META) { + /* iTunes Metadata box */ + mp4ff_read_meta(f, size); +#endif + } + + mp4ff_set_position(f, dest_position); + + + return 0; +} diff --git a/src/contrib/aacdecoder/mp4ff.c b/src/contrib/aacdecoder/mp4ff/mp4ff.c old mode 100644 new mode 100755 similarity index 93% rename from src/contrib/aacdecoder/mp4ff.c rename to src/contrib/aacdecoder/mp4ff/mp4ff.c index 8531331e1..9181ace9b --- a/src/contrib/aacdecoder/mp4ff.c +++ b/src/contrib/aacdecoder/mp4ff/mp4ff.c @@ -1,474 +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: mp4ff.c,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#include -#include -#include "mp4ffint.h" - -#include "drms.h" - -mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f) -{ - mp4ff_t *ff = malloc(sizeof(mp4ff_t)); - - memset(ff, 0, sizeof(mp4ff_t)); - - ff->stream = f; - - parse_atoms(ff,0); - - return ff; -} - -mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f) -{ - mp4ff_t *ff = malloc(sizeof(mp4ff_t)); - - memset(ff, 0, sizeof(mp4ff_t)); - - ff->stream = f; - - parse_atoms(ff,1); - - return ff; -} - -void mp4ff_close(mp4ff_t *ff) -{ - int32_t i; - - for (i = 0; i < ff->total_tracks; i++) - { - if (ff->track[i]) - { - if (ff->track[i]->stsz_table) - free(ff->track[i]->stsz_table); - if (ff->track[i]->stts_sample_count) - free(ff->track[i]->stts_sample_count); - if (ff->track[i]->stts_sample_delta) - free(ff->track[i]->stts_sample_delta); - if (ff->track[i]->stsc_first_chunk) - free(ff->track[i]->stsc_first_chunk); - if (ff->track[i]->stsc_samples_per_chunk) - free(ff->track[i]->stsc_samples_per_chunk); - if (ff->track[i]->stsc_sample_desc_index) - free(ff->track[i]->stsc_sample_desc_index); - if (ff->track[i]->stco_chunk_offset) - free(ff->track[i]->stco_chunk_offset); - if (ff->track[i]->decoderConfig) - free(ff->track[i]->decoderConfig); - if (ff->track[i]->ctts_sample_count) - free(ff->track[i]->ctts_sample_count); - if (ff->track[i]->ctts_sample_offset) - free(ff->track[i]->ctts_sample_offset); -#ifdef ITUNES_DRM - if (ff->track[i]->p_drms) - drms_free(ff->track[i]->p_drms); -#endif - free(ff->track[i]); - } - } - -#ifdef USE_TAGGING - mp4ff_tag_delete(&(ff->tags)); -#endif - - if (ff) free(ff); -} - -static void mp4ff_track_add(mp4ff_t *f) -{ - f->total_tracks++; - - f->track[f->total_tracks - 1] = malloc(sizeof(mp4ff_track_t)); - - memset(f->track[f->total_tracks - 1], 0, sizeof(mp4ff_track_t)); -} - -static int need_parse_when_meta_only(uint8_t atom_type) -{ - switch(atom_type) - { - case ATOM_EDTS: -// case ATOM_MDIA: -// case ATOM_MINF: - case ATOM_DRMS: - case ATOM_SINF: - case ATOM_SCHI: -// case ATOM_STBL: -// case ATOM_STSD: - case ATOM_STTS: - case ATOM_STSZ: - case ATOM_STZ2: - case ATOM_STCO: - case ATOM_STSC: -// case ATOM_CTTS: - case ATOM_FRMA: - case ATOM_IVIV: - case ATOM_PRIV: - return 0; - default: - return 1; - } -} - -/* parse atoms that are sub atoms of other atoms */ -int32_t parse_sub_atoms(mp4ff_t *f, const uint64_t total_size,int meta_only) -{ - uint64_t size; - uint8_t atom_type = 0; - uint64_t counted_size = 0; - uint8_t header_size = 0; - - while (counted_size < total_size) - { - size = mp4ff_atom_read_header(f, &atom_type, &header_size); - counted_size += size; - - /* check for end of file */ - if (size == 0) - break; - - /* we're starting to read a new track, update index, - * so that all data and tables get written in the right place - */ - if (atom_type == ATOM_TRAK) - { - mp4ff_track_add(f); - } - - /* parse subatoms */ - if (meta_only && !need_parse_when_meta_only(atom_type)) - { - mp4ff_set_position(f, mp4ff_position(f)+size-header_size); - } else if (atom_type < SUBATOMIC) - { - parse_sub_atoms(f, size-header_size,meta_only); - } else { - mp4ff_atom_read(f, (uint32_t)size, atom_type); - } - } - - return 0; -} - -/* parse root atoms */ -int32_t parse_atoms(mp4ff_t *f,int meta_only) -{ - uint64_t size; - uint8_t atom_type = 0; - uint8_t header_size = 0; - - f->file_size = 0; - - while ((size = mp4ff_atom_read_header(f, &atom_type, &header_size)) != 0) - { - f->file_size += size; - f->last_atom = atom_type; - - if (atom_type == ATOM_MDAT && f->moov_read) - { - /* moov atom is before mdat, we can stop reading when mdat is encountered */ - /* file position will stay at beginning of mdat data */ -// break; - } - - if (atom_type == ATOM_MOOV && size > header_size) - { - f->moov_read = 1; - f->moov_offset = mp4ff_position(f)-header_size; - f->moov_size = size; - } - - /* parse subatoms */ - if (meta_only && !need_parse_when_meta_only(atom_type)) - { - mp4ff_set_position(f, mp4ff_position(f)+size-header_size); - } else if (atom_type < SUBATOMIC) - { - parse_sub_atoms(f, size-header_size,meta_only); - } else { - /* skip this atom */ - mp4ff_set_position(f, mp4ff_position(f)+size-header_size); - } - } - - return 0; -} - -int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int32_t track, - uint8_t** ppBuf, uint32_t* pBufSize) -{ - if (track >= f->total_tracks) - { - *ppBuf = NULL; - *pBufSize = 0; - return 1; - } - - if (f->track[track]->decoderConfig == NULL || f->track[track]->decoderConfigLen == 0) - { - *ppBuf = NULL; - *pBufSize = 0; - } else { - *ppBuf = malloc(f->track[track]->decoderConfigLen); - if (*ppBuf == NULL) - { - *pBufSize = 0; - return 1; - } - memcpy(*ppBuf, f->track[track]->decoderConfig, f->track[track]->decoderConfigLen); - *pBufSize = f->track[track]->decoderConfigLen; - } - - return 0; -} - -int32_t mp4ff_get_track_type(const mp4ff_t *f, const int track) -{ - return f->track[track]->type; -} - -int32_t mp4ff_total_tracks(const mp4ff_t *f) -{ - return f->total_tracks; -} - -int32_t mp4ff_time_scale(const mp4ff_t *f, const int32_t track) -{ - return f->track[track]->timeScale; -} - -uint32_t mp4ff_get_avg_bitrate(const mp4ff_t *f, const int32_t track) -{ - return f->track[track]->avgBitrate; -} - -uint32_t mp4ff_get_max_bitrate(const mp4ff_t *f, const int32_t track) -{ - return f->track[track]->maxBitrate; -} - -int64_t mp4ff_get_track_duration(const mp4ff_t *f, const int32_t track) -{ - return f->track[track]->duration; -} - -int64_t mp4ff_get_track_duration_use_offsets(const mp4ff_t *f, const int32_t track) -{ - int64_t duration = mp4ff_get_track_duration(f,track); - if (duration!=-1) - { - int64_t offset = mp4ff_get_sample_offset(f,track,0); - if (offset > duration) duration = 0; - else duration -= offset; - } - return duration; -} - - -int32_t mp4ff_num_samples(const mp4ff_t *f, const int32_t track) -{ - int32_t i; - int32_t total = 0; - - for (i = 0; i < f->track[track]->stts_entry_count; i++) - { - total += f->track[track]->stts_sample_count[i]; - } - return total; -} - - - - -uint32_t mp4ff_get_sample_rate(const mp4ff_t *f, const int32_t track) -{ - return f->track[track]->sampleRate; -} - -uint32_t mp4ff_get_channel_count(const mp4ff_t * f,const int32_t track) -{ - return f->track[track]->channelCount; -} - -uint32_t mp4ff_get_audio_type(const mp4ff_t * f,const int32_t track) -{ - return f->track[track]->audioType; -} - -int32_t mp4ff_get_sample_duration_use_offsets(const mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t d,o; - d = mp4ff_get_sample_duration(f,track,sample); - if (d!=-1) - { - o = mp4ff_get_sample_offset(f,track,sample); - if (o>d) d = 0; - else d -= o; - } - return d; -} - -int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t i, co = 0; - - for (i = 0; i < f->track[track]->stts_entry_count; i++) - { - int32_t delta = f->track[track]->stts_sample_count[i]; - if (sample < co + delta) - return f->track[track]->stts_sample_delta[i]; - co += delta; - } - return (int32_t)(-1); -} - -int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t i, co = 0; - int64_t acc = 0; - - for (i = 0; i < f->track[track]->stts_entry_count; i++) - { - int32_t delta = f->track[track]->stts_sample_count[i]; - if (sample < co + delta) - { - acc += f->track[track]->stts_sample_delta[i] * (sample - co); - return acc; - } - else - { - acc += f->track[track]->stts_sample_delta[i] * delta; - } - co += delta; - } - return (int64_t)(-1); -} - -int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t i, co = 0; - - for (i = 0; i < f->track[track]->ctts_entry_count; i++) - { - int32_t delta = f->track[track]->ctts_sample_count[i]; - if (sample < co + delta) - return f->track[track]->ctts_sample_offset[i]; - co += delta; - } - return 0; -} - -int32_t mp4ff_find_sample(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip) -{ - int32_t i, co = 0; - int64_t offset_total = 0; - mp4ff_track_t * p_track = f->track[track]; - - for (i = 0; i < p_track->stts_entry_count; i++) - { - int32_t sample_count = p_track->stts_sample_count[i]; - int32_t sample_delta = p_track->stts_sample_delta[i]; - int64_t offset_delta = (int64_t)sample_delta * (int64_t)sample_count; - if (offset < offset_total + offset_delta) - { - int64_t offset_fromstts = offset - offset_total; - if (toskip) *toskip = (int32_t)(offset_fromstts % sample_delta); - return co + (int32_t)(offset_fromstts / sample_delta); - } - else - { - offset_total += offset_delta; - } - co += sample_count; - } - return (int32_t)(-1); -} - -int32_t mp4ff_find_sample_use_offsets(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip) -{ - return mp4ff_find_sample(f,track,offset + mp4ff_get_sample_offset(f,track,0),toskip); -} - -int32_t mp4ff_read_sample(mp4ff_t *f, const int32_t track, const int32_t sample, - uint8_t **audio_buffer, uint32_t *bytes) -{ - int32_t result = 0; - - *bytes = mp4ff_audio_frame_size(f, track, sample); - - if (*bytes==0) return 0; - - *audio_buffer = (uint8_t*)malloc(*bytes); - - mp4ff_set_sample_position(f, track, sample); - - result = mp4ff_read_data(f, *audio_buffer, *bytes); - - if (!result) - { - free(*audio_buffer); - *audio_buffer = 0; - return 0; - } - -#ifdef ITUNES_DRM - if (f->track[track]->p_drms != NULL) - { - drms_decrypt(f->track[track]->p_drms, (uint32_t*)*audio_buffer, *bytes); - } -#endif - - return *bytes; -} - - -int32_t mp4ff_read_sample_v2(mp4ff_t *f, const int track, const int sample,unsigned char *buffer) -{ - int32_t result = 0; - int32_t size = mp4ff_audio_frame_size(f,track,sample); - if (size<=0) return 0; - mp4ff_set_sample_position(f, track, sample); - result = mp4ff_read_data(f,buffer,size); - -#ifdef ITUNES_DRM - if (f->track[track]->p_drms != NULL) - { - drms_decrypt(f->track[track]->p_drms, (uint32_t*)buffer, size); - } -#endif - - return result; -} - -int32_t mp4ff_read_sample_getsize(mp4ff_t *f, const int track, const int sample) -{ - int32_t temp = mp4ff_audio_frame_size(f, track, sample); - if (temp<0) temp = 0; - return temp; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4ff.c,v 1.22 2009/01/26 23:01:40 menno Exp $ +**/ + +#include +#include +#include "mp4ffint.h" + +mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f) +{ + mp4ff_t *ff = malloc(sizeof(mp4ff_t)); + + memset(ff, 0, sizeof(mp4ff_t)); + + ff->stream = f; + + parse_atoms(ff,0); + + return ff; +} + +mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f) +{ + mp4ff_t *ff = malloc(sizeof(mp4ff_t)); + + memset(ff, 0, sizeof(mp4ff_t)); + + ff->stream = f; + + parse_atoms(ff,1); + + return ff; +} + +void mp4ff_close(mp4ff_t *ff) +{ + int32_t i; + + for (i = 0; i < ff->total_tracks; i++) + { + if (ff->track[i]) + { + if (ff->track[i]->stsz_table) + free(ff->track[i]->stsz_table); + if (ff->track[i]->stts_sample_count) + free(ff->track[i]->stts_sample_count); + if (ff->track[i]->stts_sample_delta) + free(ff->track[i]->stts_sample_delta); + if (ff->track[i]->stsc_first_chunk) + free(ff->track[i]->stsc_first_chunk); + if (ff->track[i]->stsc_samples_per_chunk) + free(ff->track[i]->stsc_samples_per_chunk); + if (ff->track[i]->stsc_sample_desc_index) + free(ff->track[i]->stsc_sample_desc_index); + if (ff->track[i]->stco_chunk_offset) + free(ff->track[i]->stco_chunk_offset); + if (ff->track[i]->decoderConfig) + free(ff->track[i]->decoderConfig); + if (ff->track[i]->ctts_sample_count) + free(ff->track[i]->ctts_sample_count); + if (ff->track[i]->ctts_sample_offset) + free(ff->track[i]->ctts_sample_offset); +#ifdef ITUNES_DRM + if (ff->track[i]->p_drms) + drms_free(ff->track[i]->p_drms); +#endif + free(ff->track[i]); + } + } + +#ifdef USE_TAGGING + mp4ff_tag_delete(&(ff->tags)); +#endif + + if (ff) free(ff); +} + +void mp4ff_track_add(mp4ff_t *f) +{ + f->total_tracks++; + + f->track[f->total_tracks - 1] = malloc(sizeof(mp4ff_track_t)); + + memset(f->track[f->total_tracks - 1], 0, sizeof(mp4ff_track_t)); +} + +static int need_parse_when_meta_only(uint8_t atom_type) +{ + switch(atom_type) + { + case ATOM_EDTS: +// case ATOM_MDIA: +// case ATOM_MINF: + case ATOM_DRMS: + case ATOM_SINF: + case ATOM_SCHI: +// case ATOM_STBL: +// case ATOM_STSD: + case ATOM_STTS: + case ATOM_STSZ: + case ATOM_STZ2: + case ATOM_STCO: + case ATOM_STSC: +// case ATOM_CTTS: + case ATOM_FRMA: + case ATOM_IVIV: + case ATOM_PRIV: + return 0; + default: + return 1; + } +} + +/* parse atoms that are sub atoms of other atoms */ +int32_t parse_sub_atoms(mp4ff_t *f, const uint64_t total_size,int meta_only) +{ + uint64_t size; + uint8_t atom_type = 0; + uint64_t counted_size = 0; + uint8_t header_size = 0; + + while (counted_size < total_size) + { + size = mp4ff_atom_read_header(f, &atom_type, &header_size); + counted_size += size; + + /* check for end of file */ + if (size == 0) + break; + + /* we're starting to read a new track, update index, + * so that all data and tables get written in the right place + */ + if (atom_type == ATOM_TRAK) + { + mp4ff_track_add(f); + } + + /* parse subatoms */ + if (meta_only && !need_parse_when_meta_only(atom_type)) + { + mp4ff_set_position(f, mp4ff_position(f)+size-header_size); + } else if (atom_type < SUBATOMIC) + { + parse_sub_atoms(f, size-header_size,meta_only); + } else { + mp4ff_atom_read(f, (uint32_t)size, atom_type); + } + } + + return 0; +} + +/* parse root atoms */ +int32_t parse_atoms(mp4ff_t *f,int meta_only) +{ + uint64_t size; + uint8_t atom_type = 0; + uint8_t header_size = 0; + + f->file_size = 0; + + while ((size = mp4ff_atom_read_header(f, &atom_type, &header_size)) != 0) + { + f->file_size += size; + f->last_atom = atom_type; + + if (atom_type == ATOM_MDAT && f->moov_read) + { + /* moov atom is before mdat, we can stop reading when mdat is encountered */ + /* file position will stay at beginning of mdat data */ +// break; + } + + if (atom_type == ATOM_MOOV && size > header_size) + { + f->moov_read = 1; + f->moov_offset = mp4ff_position(f)-header_size; + f->moov_size = size; + } + + /* parse subatoms */ + if (meta_only && !need_parse_when_meta_only(atom_type)) + { + mp4ff_set_position(f, mp4ff_position(f)+size-header_size); + } else if (atom_type < SUBATOMIC) + { + parse_sub_atoms(f, size-header_size,meta_only); + } else { + /* skip this atom */ + mp4ff_set_position(f, mp4ff_position(f)+size-header_size); + } + } + + return 0; +} + +int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int32_t track, + uint8_t** ppBuf, uint32_t* pBufSize) +{ + if (track >= f->total_tracks) + { + *ppBuf = NULL; + *pBufSize = 0; + return 1; + } + + if (f->track[track]->decoderConfig == NULL || f->track[track]->decoderConfigLen == 0) + { + *ppBuf = NULL; + *pBufSize = 0; + } else { + *ppBuf = malloc(f->track[track]->decoderConfigLen); + if (*ppBuf == NULL) + { + *pBufSize = 0; + return 1; + } + memcpy(*ppBuf, f->track[track]->decoderConfig, f->track[track]->decoderConfigLen); + *pBufSize = f->track[track]->decoderConfigLen; + } + + return 0; +} + +int32_t mp4ff_get_track_type(const mp4ff_t *f, const int track) +{ + return f->track[track]->type; +} + +int32_t mp4ff_total_tracks(const mp4ff_t *f) +{ + return f->total_tracks; +} + +int32_t mp4ff_time_scale(const mp4ff_t *f, const int32_t track) +{ + return f->track[track]->timeScale; +} + +uint32_t mp4ff_get_avg_bitrate(const mp4ff_t *f, const int32_t track) +{ + return f->track[track]->avgBitrate; +} + +uint32_t mp4ff_get_max_bitrate(const mp4ff_t *f, const int32_t track) +{ + return f->track[track]->maxBitrate; +} + +int64_t mp4ff_get_track_duration(const mp4ff_t *f, const int32_t track) +{ + return f->track[track]->duration; +} + +int64_t mp4ff_get_track_duration_use_offsets(const mp4ff_t *f, const int32_t track) +{ + int64_t duration = mp4ff_get_track_duration(f,track); + if (duration!=-1) + { + int64_t offset = mp4ff_get_sample_offset(f,track,0); + if (offset > duration) duration = 0; + else duration -= offset; + } + return duration; +} + + +int32_t mp4ff_num_samples(const mp4ff_t *f, const int32_t track) +{ + int32_t i; + int32_t total = 0; + + for (i = 0; i < f->track[track]->stts_entry_count; i++) + { + total += f->track[track]->stts_sample_count[i]; + } + return total; +} + + + + +uint32_t mp4ff_get_sample_rate(const mp4ff_t *f, const int32_t track) +{ + return f->track[track]->sampleRate; +} + +uint32_t mp4ff_get_channel_count(const mp4ff_t * f,const int32_t track) +{ + return f->track[track]->channelCount; +} + +uint32_t mp4ff_get_audio_type(const mp4ff_t * f,const int32_t track) +{ + return f->track[track]->audioType; +} + +int32_t mp4ff_get_sample_duration_use_offsets(const mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t d,o; + d = mp4ff_get_sample_duration(f,track,sample); + if (d!=-1) + { + o = mp4ff_get_sample_offset(f,track,sample); + if (o>d) d = 0; + else d -= o; + } + return d; +} + +int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t i, co = 0; + + for (i = 0; i < f->track[track]->stts_entry_count; i++) + { + int32_t delta = f->track[track]->stts_sample_count[i]; + if (sample < co + delta) + return f->track[track]->stts_sample_delta[i]; + co += delta; + } + return (int32_t)(-1); +} + +int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t i, co = 0; + int64_t acc = 0; + + for (i = 0; i < f->track[track]->stts_entry_count; i++) + { + int32_t delta = f->track[track]->stts_sample_count[i]; + if (sample < co + delta) + { + acc += f->track[track]->stts_sample_delta[i] * (sample - co); + return acc; + } + else + { + acc += f->track[track]->stts_sample_delta[i] * delta; + } + co += delta; + } + return (int64_t)(-1); +} + +int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t i, co = 0; + + for (i = 0; i < f->track[track]->ctts_entry_count; i++) + { + int32_t delta = f->track[track]->ctts_sample_count[i]; + if (sample < co + delta) + return f->track[track]->ctts_sample_offset[i]; + co += delta; + } + return 0; +} + +int32_t mp4ff_find_sample(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip) +{ + int32_t i, co = 0; + int64_t offset_total = 0; + mp4ff_track_t * p_track = f->track[track]; + + for (i = 0; i < p_track->stts_entry_count; i++) + { + int32_t sample_count = p_track->stts_sample_count[i]; + int32_t sample_delta = p_track->stts_sample_delta[i]; + int64_t offset_delta = (int64_t)sample_delta * (int64_t)sample_count; + if (offset < offset_total + offset_delta) + { + int64_t offset_fromstts = offset - offset_total; + if (toskip) *toskip = (int32_t)(offset_fromstts % sample_delta); + return co + (int32_t)(offset_fromstts / sample_delta); + } + else + { + offset_total += offset_delta; + } + co += sample_count; + } + return (int32_t)(-1); +} + +int32_t mp4ff_find_sample_use_offsets(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip) +{ + return mp4ff_find_sample(f,track,offset + mp4ff_get_sample_offset(f,track,0),toskip); +} + +int32_t mp4ff_read_sample(mp4ff_t *f, const int32_t track, const int32_t sample, + uint8_t **audio_buffer, uint32_t *bytes) +{ + int32_t result = 0; + + *bytes = mp4ff_audio_frame_size(f, track, sample); + + if (*bytes==0) return 0; + + *audio_buffer = (uint8_t*)malloc(*bytes); + + mp4ff_set_sample_position(f, track, sample); + + result = mp4ff_read_data(f, *audio_buffer, *bytes); + + if (!result) + { + free(*audio_buffer); + *audio_buffer = 0; + return 0; + } + +#ifdef ITUNES_DRM + if (f->track[track]->p_drms != NULL) + { + drms_decrypt(f->track[track]->p_drms, (uint32_t*)*audio_buffer, *bytes); + } +#endif + + return *bytes; +} + + +int32_t mp4ff_read_sample_v2(mp4ff_t *f, const int track, const int sample,unsigned char *buffer) +{ + int32_t result = 0; + int32_t size = mp4ff_audio_frame_size(f,track,sample); + if (size<=0) return 0; + mp4ff_set_sample_position(f, track, sample); + result = mp4ff_read_data(f,buffer,size); + +#ifdef ITUNES_DRM + if (f->track[track]->p_drms != NULL) + { + drms_decrypt(f->track[track]->p_drms, (uint32_t*)buffer, size); + } +#endif + + return result; +} + +int32_t mp4ff_read_sample_getsize(mp4ff_t *f, const int track, const int sample) +{ + int32_t temp = mp4ff_audio_frame_size(f, track, sample); + if (temp<0) temp = 0; + return temp; +} diff --git a/src/contrib/aacdecoder/mp4ff.h b/src/contrib/aacdecoder/mp4ff/mp4ff.h old mode 100644 new mode 100755 similarity index 91% rename from src/contrib/aacdecoder/mp4ff.h rename to src/contrib/aacdecoder/mp4ff/mp4ff.h index c2416bfe5..17b7fe761 --- a/src/contrib/aacdecoder/mp4ff.h +++ b/src/contrib/aacdecoder/mp4ff/mp4ff.h @@ -1,131 +1,138 @@ -/* -** 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: mp4ff.h,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#ifndef MP4FF_H -#define MP4FF_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "mp4ff_int_types.h" - -/* file callback structure */ -typedef struct -{ - uint32_t (*read)(void *user_data, void *buffer, uint32_t length); - uint32_t (*write)(void *udata, void *buffer, uint32_t length); - uint32_t (*seek)(void *user_data, uint64_t position); - uint32_t (*truncate)(void *user_data); - void *user_data; -} mp4ff_callback_t; - -/* mp4 main file structure */ -typedef void* mp4ff_t; - - -/* API */ - -mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f); -mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f); -void mp4ff_close(mp4ff_t *f); -int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_get_sample_duration_use_offsets(const mp4ff_t *f, const int32_t track, const int32_t sample); -int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_find_sample(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip); -int32_t mp4ff_find_sample_use_offsets(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip); - -int32_t mp4ff_read_sample(mp4ff_t *f, const int track, const int sample, - unsigned char **audio_buffer, unsigned int *bytes); - -int32_t mp4ff_read_sample_v2(mp4ff_t *f, const int track, const int sample,unsigned char *buffer);//returns 0 on error, number of bytes read on success, use mp4ff_read_sample_getsize() to check buffer size needed -int32_t mp4ff_read_sample_getsize(mp4ff_t *f, const int track, const int sample);//returns 0 on error, buffer size needed for mp4ff_read_sample_v2() on success - - - -int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int track, - unsigned char** ppBuf, unsigned int* pBufSize); -int32_t mp4ff_get_track_type(const mp4ff_t *f, const int track); -int32_t mp4ff_total_tracks(const mp4ff_t *f); -int32_t mp4ff_num_samples(const mp4ff_t *f, const int track); -int32_t mp4ff_time_scale(const mp4ff_t *f, const int track); - -uint32_t mp4ff_get_avg_bitrate(const mp4ff_t *f, const int32_t track); -uint32_t mp4ff_get_max_bitrate(const mp4ff_t *f, const int32_t track); -int64_t mp4ff_get_track_duration(const mp4ff_t *f, const int32_t track); //returns (-1) if unknown -int64_t mp4ff_get_track_duration_use_offsets(const mp4ff_t *f, const int32_t track); //returns (-1) if unknown -uint32_t mp4ff_get_sample_rate(const mp4ff_t *f, const int32_t track); -uint32_t mp4ff_get_channel_count(const mp4ff_t * f,const int32_t track); -uint32_t mp4ff_get_audio_type(const mp4ff_t * f,const int32_t track); - - -/* metadata */ -int mp4ff_meta_get_num_items(const mp4ff_t *f); -int mp4ff_meta_get_by_index(const mp4ff_t *f, unsigned int index, - char **item, char **value); -int mp4ff_meta_get_title(const mp4ff_t *f, char **value); -int mp4ff_meta_get_artist(const mp4ff_t *f, char **value); -int mp4ff_meta_get_writer(const mp4ff_t *f, char **value); -int mp4ff_meta_get_album(const mp4ff_t *f, char **value); -int mp4ff_meta_get_date(const mp4ff_t *f, char **value); -int mp4ff_meta_get_tool(const mp4ff_t *f, char **value); -int mp4ff_meta_get_comment(const mp4ff_t *f, char **value); -int mp4ff_meta_get_genre(const mp4ff_t *f, char **value); -int mp4ff_meta_get_track(const mp4ff_t *f, char **value); -int mp4ff_meta_get_disc(const mp4ff_t *f, char **value); -int mp4ff_meta_get_totaltracks(const mp4ff_t *f, char **value); -int mp4ff_meta_get_totaldiscs(const mp4ff_t *f, char **value); -int mp4ff_meta_get_compilation(const mp4ff_t *f, char **value); -int mp4ff_meta_get_tempo(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value); -#ifdef USE_TAGGING - -/* metadata tag structure */ -typedef struct -{ - char *item; - char *value; -} mp4ff_tag_t; - -/* metadata list structure */ -typedef struct -{ - mp4ff_tag_t *tags; - uint32_t count; -} mp4ff_metadata_t; - -int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data); - -#endif - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif \ No newline at end of file +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4ff.h,v 1.27 2009/01/29 00:41:08 menno Exp $ +**/ + +#ifndef MP4FF_H +#define MP4FF_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef HAVE_STDINT_H +#include +#else +#include "mp4ff_int_types.h" +#endif + +/* file callback structure */ +typedef struct +{ + uint32_t (*read)(void *user_data, void *buffer, uint32_t length); + uint32_t (*write)(void *udata, void *buffer, uint32_t length); + uint32_t (*seek)(void *user_data, uint64_t position); + uint32_t (*truncate)(void *user_data); + void *user_data; +} mp4ff_callback_t; + +/* mp4 main file structure */ +typedef void* mp4ff_t; + + +/* API */ + +mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f); +mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f); +void mp4ff_close(mp4ff_t *f); +int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_get_sample_duration_use_offsets(const mp4ff_t *f, const int32_t track, const int32_t sample); +int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_find_sample(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip); +int32_t mp4ff_find_sample_use_offsets(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip); + +int32_t mp4ff_read_sample(mp4ff_t *f, const int track, const int sample, + unsigned char **audio_buffer, unsigned int *bytes); + +int32_t mp4ff_read_sample_v2(mp4ff_t *f, const int track, const int sample,unsigned char *buffer);//returns 0 on error, number of bytes read on success, use mp4ff_read_sample_getsize() to check buffer size needed +int32_t mp4ff_read_sample_getsize(mp4ff_t *f, const int track, const int sample);//returns 0 on error, buffer size needed for mp4ff_read_sample_v2() on success + + + +int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int track, + unsigned char** ppBuf, unsigned int* pBufSize); +int32_t mp4ff_get_track_type(const mp4ff_t *f, const int track); +int32_t mp4ff_total_tracks(const mp4ff_t *f); +int32_t mp4ff_num_samples(const mp4ff_t *f, const int track); +int32_t mp4ff_time_scale(const mp4ff_t *f, const int track); + +uint32_t mp4ff_get_avg_bitrate(const mp4ff_t *f, const int32_t track); +uint32_t mp4ff_get_max_bitrate(const mp4ff_t *f, const int32_t track); +int64_t mp4ff_get_track_duration(const mp4ff_t *f, const int32_t track); //returns (-1) if unknown +int64_t mp4ff_get_track_duration_use_offsets(const mp4ff_t *f, const int32_t track); //returns (-1) if unknown +uint32_t mp4ff_get_sample_rate(const mp4ff_t *f, const int32_t track); +uint32_t mp4ff_get_channel_count(const mp4ff_t * f,const int32_t track); +uint32_t mp4ff_get_audio_type(const mp4ff_t * f,const int32_t track); + + +/* metadata */ +int mp4ff_meta_get_num_items(const mp4ff_t *f); +int mp4ff_meta_get_by_index(const mp4ff_t *f, unsigned int index, + char **item, char **value); +int mp4ff_meta_get_title(const mp4ff_t *f, char **value); +int mp4ff_meta_get_artist(const mp4ff_t *f, char **value); +int mp4ff_meta_get_writer(const mp4ff_t *f, char **value); +int mp4ff_meta_get_album(const mp4ff_t *f, char **value); +int mp4ff_meta_get_date(const mp4ff_t *f, char **value); +int mp4ff_meta_get_tool(const mp4ff_t *f, char **value); +int mp4ff_meta_get_comment(const mp4ff_t *f, char **value); +int mp4ff_meta_get_genre(const mp4ff_t *f, char **value); +int mp4ff_meta_get_track(const mp4ff_t *f, char **value); +int mp4ff_meta_get_disc(const mp4ff_t *f, char **value); +int mp4ff_meta_get_totaltracks(const mp4ff_t *f, char **value); +int mp4ff_meta_get_totaldiscs(const mp4ff_t *f, char **value); +int mp4ff_meta_get_compilation(const mp4ff_t *f, char **value); +int mp4ff_meta_get_tempo(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value); +#ifdef USE_TAGGING + +/* metadata tag structure */ +typedef struct +{ + char *item; + char *value; +} mp4ff_tag_t; + +/* metadata list structure */ +typedef struct +{ + mp4ff_tag_t *tags; + uint32_t count; +} mp4ff_metadata_t; + +int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data); + +#endif + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/src/contrib/aacdecoder/mp4ff/mp4ff_int_types.h b/src/contrib/aacdecoder/mp4ff/mp4ff_int_types.h new file mode 100755 index 000000000..40eaa52a8 --- /dev/null +++ b/src/contrib/aacdecoder/mp4ff/mp4ff_int_types.h @@ -0,0 +1,26 @@ +#ifndef _MP4FF_INT_TYPES_H_ +#define _MP4FF_INT_TYPES_H_ + +#if defined (_WIN32) + +#ifdef __MINGW32__ +#include +#endif /* #ifdef __MINGW32__ */ +#include +//typedef signed char int8_t; +//typedef unsigned char uint8_t; +//typedef signed short int16_t; +//typedef unsigned short uint16_t; +//typedef signed long int32_t; +//typedef unsigned long uint32_t; +// +//typedef signed __int64 int64_t; +//typedef unsigned __int64 uint64_t; +#else + +#include + +#endif + + +#endif diff --git a/src/contrib/aacdecoder/mp4ffint.h b/src/contrib/aacdecoder/mp4ff/mp4ffint.h old mode 100644 new mode 100755 similarity index 81% rename from src/contrib/aacdecoder/mp4ffint.h rename to src/contrib/aacdecoder/mp4ff/mp4ffint.h index d36f4235a..c92b58868 --- a/src/contrib/aacdecoder/mp4ffint.h +++ b/src/contrib/aacdecoder/mp4ff/mp4ffint.h @@ -1,373 +1,344 @@ -/* -** 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: mp4ffint.h,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#ifndef MP4FF_INTERNAL_H -#define MP4FF_INTERNAL_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#include "mp4ff_int_types.h" - - -#if defined(_WIN32) && !defined(_WIN32_WCE) -#define ITUNES_DRM - -static __inline uint32_t GetDWLE( void const * _p ) -{ - uint8_t * p = (uint8_t *)_p; - return ( ((uint32_t)p[3] << 24) | ((uint32_t)p[2] << 16) - | ((uint32_t)p[1] << 8) | p[0] ); -} -static __inline uint32_t U32_AT( void const * _p ) -{ - uint8_t * p = (uint8_t *)_p; - return ( ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) - | ((uint32_t)p[2] << 8) | p[3] ); -} -static __inline uint64_t U64_AT( void const * _p ) -{ - uint8_t * p = (uint8_t *)_p; - return ( ((uint64_t)p[0] << 56) | ((uint64_t)p[1] << 48) - | ((uint64_t)p[2] << 40) | ((uint64_t)p[3] << 32) - | ((uint64_t)p[4] << 24) | ((uint64_t)p[5] << 16) - | ((uint64_t)p[6] << 8) | p[7] ); -} - -#ifdef WORDS_BIGENDIAN -# define VLC_FOURCC( a, b, c, d ) \ - ( ((uint32_t)d) | ( ((uint32_t)c) << 8 ) \ - | ( ((uint32_t)b) << 16 ) | ( ((uint32_t)a) << 24 ) ) -# define VLC_TWOCC( a, b ) \ - ( (uint16_t)(b) | ( (uint16_t)(a) << 8 ) ) - -#else -# define VLC_FOURCC( a, b, c, d ) \ - ( ((uint32_t)a) | ( ((uint32_t)b) << 8 ) \ - | ( ((uint32_t)c) << 16 ) | ( ((uint32_t)d) << 24 ) ) -# define VLC_TWOCC( a, b ) \ - ( (uint16_t)(a) | ( (uint16_t)(b) << 8 ) ) -#endif - -#define FOURCC_user VLC_FOURCC( 'u', 's', 'e', 'r' ) -#define FOURCC_key VLC_FOURCC( 'k', 'e', 'y', ' ' ) -#define FOURCC_iviv VLC_FOURCC( 'i', 'v', 'i', 'v' ) -#define FOURCC_name VLC_FOURCC( 'n', 'a', 'm', 'e' ) -#define FOURCC_priv VLC_FOURCC( 'p', 'r', 'i', 'v' ) - -#endif - -#define MAX_TRACKS 1024 -#define TRACK_UNKNOWN 0 -#define TRACK_AUDIO 1 -#define TRACK_VIDEO 2 -#define TRACK_SYSTEM 3 - - -#define SUBATOMIC 128 - -/* atoms without subatoms */ -#define ATOM_FTYP 129 -#define ATOM_MDAT 130 -#define ATOM_MVHD 131 -#define ATOM_TKHD 132 -#define ATOM_TREF 133 -#define ATOM_MDHD 134 -#define ATOM_VMHD 135 -#define ATOM_SMHD 136 -#define ATOM_HMHD 137 -#define ATOM_STSD 138 -#define ATOM_STTS 139 -#define ATOM_STSZ 140 -#define ATOM_STZ2 141 -#define ATOM_STCO 142 -#define ATOM_STSC 143 -#define ATOM_MP4A 144 -#define ATOM_MP4V 145 -#define ATOM_MP4S 146 -#define ATOM_ESDS 147 -#define ATOM_META 148 /* iTunes Metadata box */ -#define ATOM_NAME 149 /* iTunes Metadata name box */ -#define ATOM_DATA 150 /* iTunes Metadata data box */ -#define ATOM_CTTS 151 -#define ATOM_FRMA 152 -#define ATOM_IVIV 153 -#define ATOM_PRIV 154 -#define ATOM_USER 155 -#define ATOM_KEY 156 - -#define ATOM_UNKNOWN 255 -#define ATOM_FREE ATOM_UNKNOWN -#define ATOM_SKIP ATOM_UNKNOWN - -/* atoms with subatoms */ -#define ATOM_MOOV 1 -#define ATOM_TRAK 2 -#define ATOM_EDTS 3 -#define ATOM_MDIA 4 -#define ATOM_MINF 5 -#define ATOM_STBL 6 -#define ATOM_UDTA 7 -#define ATOM_ILST 8 /* iTunes Metadata list */ -#define ATOM_TITLE 9 -#define ATOM_ARTIST 10 -#define ATOM_WRITER 11 -#define ATOM_ALBUM 12 -#define ATOM_DATE 13 -#define ATOM_TOOL 14 -#define ATOM_COMMENT 15 -#define ATOM_GENRE1 16 -#define ATOM_TRACK 17 -#define ATOM_DISC 18 -#define ATOM_COMPILATION 19 -#define ATOM_GENRE2 20 -#define ATOM_TEMPO 21 -#define ATOM_COVER 22 -#define ATOM_DRMS 23 -#define ATOM_SINF 24 -#define ATOM_SCHI 25 - -#ifdef HAVE_CONFIG_H -#include "../../config.h" -#endif - -#if !(defined(_WIN32) || defined(_WIN32_WCE)) -#define stricmp strcasecmp -#endif - -/* file callback structure */ -typedef struct -{ - uint32_t (*read)(void *user_data, void *buffer, uint32_t length); - uint32_t (*write)(void *udata, void *buffer, uint32_t length); - uint32_t (*seek)(void *user_data, uint64_t position); - uint32_t (*truncate)(void *user_data); - void *user_data; -} mp4ff_callback_t; - - -/* metadata tag structure */ -typedef struct -{ - char *item; - char *value; -} mp4ff_tag_t; - -/* metadata list structure */ -typedef struct -{ - mp4ff_tag_t *tags; - uint32_t count; -} mp4ff_metadata_t; - - -typedef struct -{ - int32_t type; - int32_t channelCount; - int32_t sampleSize; - uint16_t sampleRate; - int32_t audioType; - - /* stsd */ - int32_t stsd_entry_count; - - /* stsz */ - int32_t stsz_sample_size; - int32_t stsz_sample_count; - int32_t *stsz_table; - - /* stts */ - int32_t stts_entry_count; - int32_t *stts_sample_count; - int32_t *stts_sample_delta; - - /* stsc */ - int32_t stsc_entry_count; - int32_t *stsc_first_chunk; - int32_t *stsc_samples_per_chunk; - int32_t *stsc_sample_desc_index; - - /* stsc */ - int32_t stco_entry_count; - int32_t *stco_chunk_offset; - - /* ctts */ - int32_t ctts_entry_count; - int32_t *ctts_sample_count; - int32_t *ctts_sample_offset; - - /* esde */ - uint8_t *decoderConfig; - int32_t decoderConfigLen; - - uint32_t maxBitrate; - uint32_t avgBitrate; - - uint32_t timeScale; - uint64_t duration; - -#ifdef ITUNES_DRM - /* drms */ - void *p_drms; -#endif - -} mp4ff_track_t; - -/* mp4 main file structure */ -typedef struct -{ - /* stream to read from */ - mp4ff_callback_t *stream; - int64_t current_position; - - int32_t moov_read; - uint64_t moov_offset; - uint64_t moov_size; - uint8_t last_atom; - uint64_t file_size; - - /* mvhd */ - int32_t time_scale; - int32_t duration; - - /* incremental track index while reading the file */ - int32_t total_tracks; - - /* track data */ - mp4ff_track_t *track[MAX_TRACKS]; - - /* metadata */ - mp4ff_metadata_t tags; -} mp4ff_t; - - - - -/* mp4util.c */ -int32_t mp4ff_read_data(mp4ff_t *f, int8_t *data, uint32_t size); -int32_t mp4ff_write_data(mp4ff_t *f, int8_t *data, uint32_t size); -uint64_t mp4ff_read_int64(mp4ff_t *f); -uint32_t mp4ff_read_int32(mp4ff_t *f); -uint32_t mp4ff_read_int24(mp4ff_t *f); -uint16_t mp4ff_read_int16(mp4ff_t *f); -uint8_t mp4ff_read_char(mp4ff_t *f); -int32_t mp4ff_write_int32(mp4ff_t *f,const uint32_t data); -uint32_t mp4ff_read_mp4_descr_length(mp4ff_t *f); -int64_t mp4ff_position(const mp4ff_t *f); -int32_t mp4ff_set_position(mp4ff_t *f, const int64_t position); -int32_t mp4ff_truncate(mp4ff_t * f); -char * mp4ff_read_string(mp4ff_t * f,uint32_t length); - -/* mp4atom.c */ -static int32_t mp4ff_atom_get_size(const int8_t *data); -static int32_t mp4ff_atom_compare(const int8_t a1, const int8_t b1, const int8_t c1, const int8_t d1, - const int8_t a2, const int8_t b2, const int8_t c2, const int8_t d2); -static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b, const int8_t c, const int8_t d); -uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_size); -static int32_t mp4ff_read_stsz(mp4ff_t *f); -static int32_t mp4ff_read_esds(mp4ff_t *f); -static int32_t mp4ff_read_mp4a(mp4ff_t *f); -static int32_t mp4ff_read_stsd(mp4ff_t *f); -static int32_t mp4ff_read_stsc(mp4ff_t *f); -static int32_t mp4ff_read_stco(mp4ff_t *f); -static int32_t mp4ff_read_stts(mp4ff_t *f); -#ifdef USE_TAGGING -static int32_t mp4ff_read_meta(mp4ff_t *f, const uint64_t size); -#endif -int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type); - -/* mp4sample.c */ -static int32_t mp4ff_chunk_of_sample(const mp4ff_t *f, const int32_t track, const int32_t sample, - int32_t *chunk_sample, int32_t *chunk); -static int32_t mp4ff_chunk_to_offset(const mp4ff_t *f, const int32_t track, const int32_t chunk); -static int32_t mp4ff_sample_range_size(const mp4ff_t *f, const int32_t track, - const int32_t chunk_sample, const int32_t sample); -static int32_t mp4ff_sample_to_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_audio_frame_size(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_set_sample_position(mp4ff_t *f, const int32_t track, const int32_t sample); - -#ifdef USE_TAGGING -/* mp4meta.c */ -static int32_t mp4ff_tag_add_field(mp4ff_metadata_t *tags, const char *item, const char *value); -static int32_t mp4ff_tag_set_field(mp4ff_metadata_t *tags, const char *item, const char *value); -static int32_t mp4ff_set_metadata_name(mp4ff_t *f, const uint8_t atom_type, char **name); -static int32_t mp4ff_parse_tag(mp4ff_t *f, const uint8_t parent_atom_type, const int32_t size); -static int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value); -int32_t mp4ff_parse_metadata(mp4ff_t *f, const int32_t size); -int32_t mp4ff_tag_delete(mp4ff_metadata_t *tags); -int32_t mp4ff_meta_get_num_items(const mp4ff_t *f); -int32_t mp4ff_meta_get_by_index(const mp4ff_t *f, uint32_t index, - char **item, char **value); -int32_t mp4ff_meta_get_title(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_artist(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_writer(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_album(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_date(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_tool(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_comment(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_genre(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_track(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_disc(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_compilation(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_tempo(const mp4ff_t *f, char **value); -int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value); -#endif - -/* mp4ff.c */ -mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f); -#ifdef USE_TAGGING -mp4ff_t *mp4ff_open_edit(mp4ff_callback_t *f); -#endif -void mp4ff_close(mp4ff_t *ff); -void mp4ff_track_add(mp4ff_t *f); -int32_t parse_sub_atoms(mp4ff_t *f, const uint64_t total_size,int meta_only); -int32_t parse_atoms(mp4ff_t *f,int meta_only); - -int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample); -int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); -int32_t mp4ff_find_sample(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip); - -int32_t mp4ff_read_sample(mp4ff_t *f, const int32_t track, const int32_t sample, - uint8_t **audio_buffer, uint32_t *bytes); -int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int32_t track, - uint8_t** ppBuf, uint32_t* pBufSize); -int32_t mp4ff_total_tracks(const mp4ff_t *f); -int32_t mp4ff_time_scale(const mp4ff_t *f, const int32_t track); -int32_t mp4ff_num_samples(const mp4ff_t *f, const int32_t track); - -uint32_t mp4ff_meta_genre_to_index(const char * genrestr);//returns 1-based index, 0 if not found -const char * mp4ff_meta_index_to_genre(uint32_t idx);//returns pointer to static string - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif \ No newline at end of file +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4ffint.h,v 1.26 2009/01/25 20:14:34 menno Exp $ +**/ + +#ifndef MP4FF_INTERNAL_H +#define MP4FF_INTERNAL_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#include "mp4ff_int_types.h" +#include + +#define MAX_TRACKS 1024 +#define TRACK_UNKNOWN 0 +#define TRACK_AUDIO 1 +#define TRACK_VIDEO 2 +#define TRACK_SYSTEM 3 + + +#define SUBATOMIC 128 + +/* atoms without subatoms */ +#define ATOM_FTYP 129 +#define ATOM_MDAT 130 +#define ATOM_MVHD 131 +#define ATOM_TKHD 132 +#define ATOM_TREF 133 +#define ATOM_MDHD 134 +#define ATOM_VMHD 135 +#define ATOM_SMHD 136 +#define ATOM_HMHD 137 +#define ATOM_STSD 138 +#define ATOM_STTS 139 +#define ATOM_STSZ 140 +#define ATOM_STZ2 141 +#define ATOM_STCO 142 +#define ATOM_STSC 143 +#define ATOM_MP4A 144 +#define ATOM_MP4V 145 +#define ATOM_MP4S 146 +#define ATOM_ESDS 147 +#define ATOM_META 148 /* iTunes Metadata box */ +#define ATOM_NAME 149 /* iTunes Metadata name box */ +#define ATOM_DATA 150 /* iTunes Metadata data box */ +#define ATOM_CTTS 151 +#define ATOM_FRMA 152 +#define ATOM_IVIV 153 +#define ATOM_PRIV 154 +#define ATOM_USER 155 +#define ATOM_KEY 156 + +#define ATOM_ALBUM_ARTIST 157 +#define ATOM_CONTENTGROUP 158 +#define ATOM_LYRICS 159 +#define ATOM_DESCRIPTION 160 +#define ATOM_NETWORK 161 +#define ATOM_SHOW 162 +#define ATOM_EPISODENAME 163 +#define ATOM_SORTTITLE 164 +#define ATOM_SORTALBUM 165 +#define ATOM_SORTARTIST 166 +#define ATOM_SORTALBUMARTIST 167 +#define ATOM_SORTWRITER 168 +#define ATOM_SORTSHOW 169 +#define ATOM_SEASON 170 +#define ATOM_EPISODE 171 +#define ATOM_PODCAST 172 + +#define ATOM_UNKNOWN 255 +#define ATOM_FREE ATOM_UNKNOWN +#define ATOM_SKIP ATOM_UNKNOWN + +/* atoms with subatoms */ +#define ATOM_MOOV 1 +#define ATOM_TRAK 2 +#define ATOM_EDTS 3 +#define ATOM_MDIA 4 +#define ATOM_MINF 5 +#define ATOM_STBL 6 +#define ATOM_UDTA 7 +#define ATOM_ILST 8 /* iTunes Metadata list */ +#define ATOM_TITLE 9 +#define ATOM_ARTIST 10 +#define ATOM_WRITER 11 +#define ATOM_ALBUM 12 +#define ATOM_DATE 13 +#define ATOM_TOOL 14 +#define ATOM_COMMENT 15 +#define ATOM_GENRE1 16 +#define ATOM_TRACK 17 +#define ATOM_DISC 18 +#define ATOM_COMPILATION 19 +#define ATOM_GENRE2 20 +#define ATOM_TEMPO 21 +#define ATOM_COVER 22 +#define ATOM_DRMS 23 +#define ATOM_SINF 24 +#define ATOM_SCHI 25 + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#if !(defined(_WIN32) || defined(_WIN32_WCE)) +#define stricmp strcasecmp +#else +#define stricmp _stricmp +#define strdup _strdup +#endif + +/* file callback structure */ +typedef struct +{ + uint32_t (*read)(void *user_data, void *buffer, uint32_t length); + uint32_t (*write)(void *udata, void *buffer, uint32_t length); + uint32_t (*seek)(void *user_data, uint64_t position); + uint32_t (*truncate)(void *user_data); + void *user_data; +} mp4ff_callback_t; + + +/* metadata tag structure */ +typedef struct +{ + char *item; + char *value; +} mp4ff_tag_t; + +/* metadata list structure */ +typedef struct +{ + mp4ff_tag_t *tags; + uint32_t count; +} mp4ff_metadata_t; + + +typedef struct +{ + int32_t type; + int32_t channelCount; + int32_t sampleSize; + uint16_t sampleRate; + int32_t audioType; + + /* stsd */ + int32_t stsd_entry_count; + + /* stsz */ + int32_t stsz_sample_size; + int32_t stsz_sample_count; + int32_t *stsz_table; + + /* stts */ + int32_t stts_entry_count; + int32_t *stts_sample_count; + int32_t *stts_sample_delta; + + /* stsc */ + int32_t stsc_entry_count; + int32_t *stsc_first_chunk; + int32_t *stsc_samples_per_chunk; + int32_t *stsc_sample_desc_index; + + /* stsc */ + int32_t stco_entry_count; + int32_t *stco_chunk_offset; + + /* ctts */ + int32_t ctts_entry_count; + int32_t *ctts_sample_count; + int32_t *ctts_sample_offset; + + /* esde */ + uint8_t *decoderConfig; + int32_t decoderConfigLen; + + uint32_t maxBitrate; + uint32_t avgBitrate; + + uint32_t timeScale; + uint64_t duration; + +} mp4ff_track_t; + +/* mp4 main file structure */ +typedef struct +{ + /* stream to read from */ + mp4ff_callback_t *stream; + int64_t current_position; + + int32_t moov_read; + uint64_t moov_offset; + uint64_t moov_size; + uint8_t last_atom; + uint64_t file_size; + + /* mvhd */ + int32_t time_scale; + int32_t duration; + + /* incremental track index while reading the file */ + int32_t total_tracks; + + /* track data */ + mp4ff_track_t *track[MAX_TRACKS]; + + /* metadata */ + mp4ff_metadata_t tags; +} mp4ff_t; + + + + +/* mp4util.c */ +int32_t mp4ff_read_data(mp4ff_t *f, int8_t *data, uint32_t size); +int32_t mp4ff_write_data(mp4ff_t *f, int8_t *data, uint32_t size); +uint64_t mp4ff_read_int64(mp4ff_t *f); +uint32_t mp4ff_read_int32(mp4ff_t *f); +uint32_t mp4ff_read_int24(mp4ff_t *f); +uint16_t mp4ff_read_int16(mp4ff_t *f); +uint8_t mp4ff_read_char(mp4ff_t *f); +int32_t mp4ff_write_int32(mp4ff_t *f,const uint32_t data); +uint32_t mp4ff_read_mp4_descr_length(mp4ff_t *f); +int64_t mp4ff_position(const mp4ff_t *f); +int32_t mp4ff_set_position(mp4ff_t *f, const int64_t position); +int32_t mp4ff_truncate(mp4ff_t * f); +char * mp4ff_read_string(mp4ff_t * f,uint32_t length); + +/* mp4atom.c */ +static int32_t mp4ff_atom_get_size(const int8_t *data); +static int32_t mp4ff_atom_compare(const int8_t a1, const int8_t b1, const int8_t c1, const int8_t d1, + const int8_t a2, const int8_t b2, const int8_t c2, const int8_t d2); +static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b, const int8_t c, const int8_t d); +uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_size); +static int32_t mp4ff_read_stsz(mp4ff_t *f); +static int32_t mp4ff_read_esds(mp4ff_t *f); +static int32_t mp4ff_read_mp4a(mp4ff_t *f); +static int32_t mp4ff_read_stsd(mp4ff_t *f); +static int32_t mp4ff_read_stsc(mp4ff_t *f); +static int32_t mp4ff_read_stco(mp4ff_t *f); +static int32_t mp4ff_read_stts(mp4ff_t *f); +#ifdef USE_TAGGING +static int32_t mp4ff_read_meta(mp4ff_t *f, const uint64_t size); +#endif +int32_t mp4ff_atom_read(mp4ff_t *f, const int32_t size, const uint8_t atom_type); + +/* mp4sample.c */ +static int32_t mp4ff_chunk_of_sample(const mp4ff_t *f, const int32_t track, const int32_t sample, + int32_t *chunk_sample, int32_t *chunk); +static int32_t mp4ff_chunk_to_offset(const mp4ff_t *f, const int32_t track, const int32_t chunk); +static int32_t mp4ff_sample_range_size(const mp4ff_t *f, const int32_t track, + const int32_t chunk_sample, const int32_t sample); +static int32_t mp4ff_sample_to_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_audio_frame_size(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_set_sample_position(mp4ff_t *f, const int32_t track, const int32_t sample); + +#ifdef USE_TAGGING +/* mp4meta.c */ +static int32_t mp4ff_tag_add_field(mp4ff_metadata_t *tags, const char *item, const char *value); +static int32_t mp4ff_tag_set_field(mp4ff_metadata_t *tags, const char *item, const char *value); +static int32_t mp4ff_set_metadata_name(mp4ff_t *f, const uint8_t atom_type, char **name); +static int32_t mp4ff_parse_tag(mp4ff_t *f, const uint8_t parent_atom_type, const int32_t size); +static int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value); +int32_t mp4ff_parse_metadata(mp4ff_t *f, const int32_t size); +int32_t mp4ff_tag_delete(mp4ff_metadata_t *tags); +int32_t mp4ff_meta_get_num_items(const mp4ff_t *f); +int32_t mp4ff_meta_get_by_index(const mp4ff_t *f, uint32_t index, + char **item, char **value); +int32_t mp4ff_meta_get_title(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_artist(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_writer(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_album(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_date(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_tool(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_comment(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_genre(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_track(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_disc(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_compilation(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_tempo(const mp4ff_t *f, char **value); +int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value); +#endif + +/* mp4ff.c */ +mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f); +#ifdef USE_TAGGING +mp4ff_t *mp4ff_open_edit(mp4ff_callback_t *f); +#endif +void mp4ff_close(mp4ff_t *ff); +//void mp4ff_track_add(mp4ff_t *f); +int32_t parse_sub_atoms(mp4ff_t *f, const uint64_t total_size,int meta_only); +int32_t parse_atoms(mp4ff_t *f,int meta_only); + +int32_t mp4ff_get_sample_duration(const mp4ff_t *f, const int32_t track, const int32_t sample); +int64_t mp4ff_get_sample_position(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_get_sample_offset(const mp4ff_t *f, const int32_t track, const int32_t sample); +int32_t mp4ff_find_sample(const mp4ff_t *f, const int32_t track, const int64_t offset,int32_t * toskip); + +int32_t mp4ff_read_sample(mp4ff_t *f, const int32_t track, const int32_t sample, + uint8_t **audio_buffer, uint32_t *bytes); +int32_t mp4ff_get_decoder_config(const mp4ff_t *f, const int32_t track, + uint8_t** ppBuf, uint32_t* pBufSize); +int32_t mp4ff_total_tracks(const mp4ff_t *f); +int32_t mp4ff_time_scale(const mp4ff_t *f, const int32_t track); +int32_t mp4ff_num_samples(const mp4ff_t *f, const int32_t track); + +uint32_t mp4ff_meta_genre_to_index(const char * genrestr);//returns 1-based index, 0 if not found +const char * mp4ff_meta_index_to_genre(uint32_t idx);//returns pointer to static string + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif diff --git a/src/contrib/aacdecoder/mp4meta.c b/src/contrib/aacdecoder/mp4ff/mp4meta.c old mode 100644 new mode 100755 similarity index 85% rename from src/contrib/aacdecoder/mp4meta.c rename to src/contrib/aacdecoder/mp4ff/mp4meta.c index aafbfa7e4..3e08be360 --- a/src/contrib/aacdecoder/mp4meta.c +++ b/src/contrib/aacdecoder/mp4ff/mp4meta.c @@ -1,425 +1,461 @@ -/* -** 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: mp4meta.c,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#ifdef USE_TAGGING - -#include -#include -#include -#include "mp4ffint.h" - -static int32_t mp4ff_tag_add_field(mp4ff_metadata_t *tags, const char *item, const char *value) -{ - void *backup = (void *)tags->tags; - - if (!item || (item && !*item) || !value) return 0; - - tags->tags = (mp4ff_tag_t*)realloc(tags->tags, (tags->count+1) * sizeof(mp4ff_tag_t)); - if (!tags->tags) - { - if (backup) free(backup); - return 0; - } else { - tags->tags[tags->count].item = strdup(item); - tags->tags[tags->count].value = strdup(value); - - if (!tags->tags[tags->count].item || !tags->tags[tags->count].value) - { - if (!tags->tags[tags->count].item) free (tags->tags[tags->count].item); - if (!tags->tags[tags->count].value) free (tags->tags[tags->count].value); - tags->tags[tags->count].item = NULL; - tags->tags[tags->count].value = NULL; - return 0; - } - - tags->count++; - return 1; - } -} - -static int32_t mp4ff_tag_set_field(mp4ff_metadata_t *tags, const char *item, const char *value) -{ - unsigned int i; - - if (!item || (item && !*item) || !value) return 0; - - for (i = 0; i < tags->count; i++) - { - if (!stricmp(tags->tags[i].item, item)) - { - free(tags->tags[i].value); - tags->tags[i].value = strdup(value); - return 1; - } - } - - return mp4ff_tag_add_field(tags, item, value); -} - -int32_t mp4ff_tag_delete(mp4ff_metadata_t *tags) -{ - uint32_t i; - - for (i = 0; i < tags->count; i++) - { - if (tags->tags[i].item) free(tags->tags[i].item); - if (tags->tags[i].value) free(tags->tags[i].value); - } - - if (tags->tags) free(tags->tags); - - tags->tags = NULL; - tags->count = 0; - - return 0; -} - -static const char* ID3v1GenreList[] = { - "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", - "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", - "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", - "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", - "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", - "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", - "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", - "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", - "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", - "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", - "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", - "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", - "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", - "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National Folk", "Swing", - "Fast-Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", - "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", - "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", - "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", - "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", - "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", - "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall", - "Goa", "Drum & Bass", "Club House", "Hardcore", "Terror", - "Indie", "BritPop", "NegerPunk", "Polsk Punk", "Beat", - "Christian Gangsta", "Heavy Metal", "Black Metal", "Crossover", "Contemporary C", - "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", - "SynthPop", -}; - -uint32_t mp4ff_meta_genre_to_index(const char * genrestr) -{ - unsigned n; - for(n=0;n0 && idx<=sizeof(ID3v1GenreList)/sizeof(ID3v1GenreList[0])) - { - return ID3v1GenreList[idx-1]; - } - else - { - return 0; - } -} - - -static int32_t TrackToString(char** str, const uint16_t track, const uint16_t totalTracks) -{ - char temp[32]; - sprintf(temp, "%.5u of %.5u", track, totalTracks); - *str = strdup(temp); - return 0; -} - -static int32_t mp4ff_set_metadata_name(mp4ff_t *f, const uint8_t atom_type, char **name) -{ - static char *tag_names[] = { - "unknown", "title", "artist", "writer", "album", - "date", "tool", "comment", "genre", "track", - "disc", "compilation", "genre", "tempo", "cover" - }; - uint8_t tag_idx = 0; - - switch (atom_type) - { - case ATOM_TITLE: tag_idx = 1; break; - case ATOM_ARTIST: tag_idx = 2; break; - case ATOM_WRITER: tag_idx = 3; break; - case ATOM_ALBUM: tag_idx = 4; break; - case ATOM_DATE: tag_idx = 5; break; - case ATOM_TOOL: tag_idx = 6; break; - case ATOM_COMMENT: tag_idx = 7; break; - case ATOM_GENRE1: tag_idx = 8; break; - case ATOM_TRACK: tag_idx = 9; break; - case ATOM_DISC: tag_idx = 10; break; - case ATOM_COMPILATION: tag_idx = 11; break; - case ATOM_GENRE2: tag_idx = 12; break; - case ATOM_TEMPO: tag_idx = 13; break; - case ATOM_COVER: tag_idx = 14; break; - default: tag_idx = 0; break; - } - - *name = strdup(tag_names[tag_idx]); - - return 0; -} - -static int32_t mp4ff_parse_tag(mp4ff_t *f, const uint8_t parent_atom_type, const int32_t size) -{ - uint8_t atom_type; - uint8_t header_size = 0; - uint64_t subsize, sumsize = 0; - char * name = NULL; - char * data = NULL; - uint32_t done = 0; - - - while (sumsize < size) - { - uint64_t destpos; - subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); - destpos = mp4ff_position(f)+subsize-header_size; - if (!done) - { - if (atom_type == ATOM_DATA) - { - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - mp4ff_read_int32(f); /* reserved */ - - /* some need special attention */ - if (parent_atom_type == ATOM_GENRE2 || parent_atom_type == ATOM_TEMPO) - { - if (subsize - header_size >= 8 + 2) - { - uint16_t val = mp4ff_read_int16(f); - - if (parent_atom_type == ATOM_TEMPO) - { - char temp[16]; - sprintf(temp, "%.5u BPM", val); - mp4ff_tag_add_field(&(f->tags), "tempo", temp); - } - else - { - const char * temp = mp4ff_meta_index_to_genre(val); - if (temp) - { - mp4ff_tag_add_field(&(f->tags), "genre", temp); - } - } - done = 1; - } - } else if (parent_atom_type == ATOM_TRACK || parent_atom_type == ATOM_DISC) { - if (!done && subsize - header_size >= 8 + 8) - { - uint16_t index,total; - char temp[32]; - mp4ff_read_int16(f); - index = mp4ff_read_int16(f); - total = mp4ff_read_int16(f); - mp4ff_read_int16(f); - - sprintf(temp,"%d",index); - mp4ff_tag_add_field(&(f->tags), parent_atom_type == ATOM_TRACK ? "track" : "disc", temp); - if (total>0) - { - sprintf(temp,"%d",total); - mp4ff_tag_add_field(&(f->tags), parent_atom_type == ATOM_TRACK ? "totaltracks" : "totaldiscs", temp); - } - done = 1; - } - } else - { - if (data) {free(data);data = NULL;} - data = mp4ff_read_string(f,(uint32_t)(subsize-(header_size+8))); - } - } else if (atom_type == ATOM_NAME) { - if (!done) - { - mp4ff_read_char(f); /* version */ - mp4ff_read_int24(f); /* flags */ - if (name) free(name); - name = mp4ff_read_string(f,(uint32_t)(subsize-(header_size+4))); - } - } - mp4ff_set_position(f, destpos); - sumsize += subsize; - } - } - - if (data) - { - if (!done) - { - if (name == NULL) mp4ff_set_metadata_name(f, parent_atom_type, &name); - if (name) mp4ff_tag_add_field(&(f->tags), name, data); - } - - free(data); - } - if (name) free(name); - return 1; -} - -int32_t mp4ff_parse_metadata(mp4ff_t *f, const int32_t size) -{ - uint64_t subsize, sumsize = 0; - uint8_t atom_type; - uint8_t header_size = 0; - - while (sumsize < size) - { - subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); - mp4ff_parse_tag(f, atom_type, (uint32_t)(subsize-header_size)); - sumsize += subsize; - } - - return 0; -} - -/* find a metadata item by name */ -/* returns 0 if item found, 1 if no such item */ -static int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value) -{ - uint32_t i; - - for (i = 0; i < f->tags.count; i++) - { - if (!stricmp(f->tags.tags[i].item, item)) - { - *value = strdup(f->tags.tags[i].value); - return 1; - } - } - - *value = NULL; - - /* not found */ - return 0; -} - -int32_t mp4ff_meta_get_num_items(const mp4ff_t *f) -{ - return f->tags.count; -} - -int32_t mp4ff_meta_get_by_index(const mp4ff_t *f, uint32_t index, - char **item, char **value) -{ - if (index >= f->tags.count) - { - *item = NULL; - *value = NULL; - return 0; - } else { - *item = strdup(f->tags.tags[index].item); - *value = strdup(f->tags.tags[index].value); - return 1; - } -} - -int32_t mp4ff_meta_get_title(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "title", value); -} - -int32_t mp4ff_meta_get_artist(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "artist", value); -} - -int32_t mp4ff_meta_get_writer(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "writer", value); -} - -int32_t mp4ff_meta_get_album(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "album", value); -} - -int32_t mp4ff_meta_get_date(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "date", value); -} - -int32_t mp4ff_meta_get_tool(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "tool", value); -} - -int32_t mp4ff_meta_get_comment(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "comment", value); -} - -int32_t mp4ff_meta_get_genre(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "genre", value); -} - -int32_t mp4ff_meta_get_track(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "track", value); -} - -int32_t mp4ff_meta_get_totaltracks(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "totaltracks", value); -} - -int32_t mp4ff_meta_get_disc(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "disc", value); -} - -int32_t mp4ff_meta_get_totaldiscs(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "totaldiscs", value); -} - -int32_t mp4ff_meta_get_compilation(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "compilation", value); -} - -int32_t mp4ff_meta_get_tempo(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "tempo", value); -} - -int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value) -{ - return mp4ff_meta_find_by_name(f, "cover", value); -} - - +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4meta.c,v 1.21 2009/01/19 23:56:30 menno Exp $ +**/ + +#ifdef USE_TAGGING + +#include +#include +#include +#include "mp4ffint.h" + + + +static int32_t mp4ff_tag_add_field(mp4ff_metadata_t *tags, const char *item, const char *value) +{ + void *backup = (void *)tags->tags; + + if (!item || (item && !*item) || !value) return 0; + + tags->tags = (mp4ff_tag_t*)realloc(tags->tags, (tags->count+1) * sizeof(mp4ff_tag_t)); + if (!tags->tags) + { + if (backup) free(backup); + return 0; + } else { + tags->tags[tags->count].item = strdup(item); + tags->tags[tags->count].value = strdup(value); + + if (!tags->tags[tags->count].item || !tags->tags[tags->count].value) + { + if (!tags->tags[tags->count].item) free (tags->tags[tags->count].item); + if (!tags->tags[tags->count].value) free (tags->tags[tags->count].value); + tags->tags[tags->count].item = NULL; + tags->tags[tags->count].value = NULL; + return 0; + } + + tags->count++; + return 1; + } +} + +static int32_t mp4ff_tag_set_field(mp4ff_metadata_t *tags, const char *item, const char *value) +{ + unsigned int i; + + if (!item || (item && !*item) || !value) return 0; + + for (i = 0; i < tags->count; i++) + { + if (!stricmp(tags->tags[i].item, item)) + { + free(tags->tags[i].value); + tags->tags[i].value = strdup(value); + return 1; + } + } + + return mp4ff_tag_add_field(tags, item, value); +} + +int32_t mp4ff_tag_delete(mp4ff_metadata_t *tags) +{ + uint32_t i; + + for (i = 0; i < tags->count; i++) + { + if (tags->tags[i].item) free(tags->tags[i].item); + if (tags->tags[i].value) free(tags->tags[i].value); + } + + if (tags->tags) free(tags->tags); + + tags->tags = NULL; + tags->count = 0; + + return 0; +} + +static const char* ID3v1GenreList[] = { + "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", + "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", + "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", + "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", + "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", + "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", + "Game", "Sound Clip", "Gospel", "Noise", "AlternRock", "Bass", + "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", + "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", + "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", + "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native American", "Cabaret", + "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", + "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", + "Rock & Roll", "Hard Rock", "Folk", "Folk/Rock", "National Folk", "Swing", + "Fast-Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", + "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", + "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", + "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", + "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", + "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", + "Punk Rock", "Drum Solo", "A capella", "Euro-House", "Dance Hall", + "Goa", "Drum & Bass", "Club House", "Hardcore", "Terror", + "Indie", "BritPop", "NegerPunk", "Polsk Punk", "Beat", + "Christian Gangsta", "Heavy Metal", "Black Metal", "Crossover", "Contemporary C", + "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", + "SynthPop", +}; + +uint32_t mp4ff_meta_genre_to_index(const char * genrestr) +{ + unsigned n; + for(n=0;n0 && idx<=sizeof(ID3v1GenreList)/sizeof(ID3v1GenreList[0])) + { + return ID3v1GenreList[idx-1]; + } + else + { + return 0; + } +} + + +static int32_t TrackToString(char** str, const uint16_t track, const uint16_t totalTracks) +{ + char temp[32]; + sprintf(temp, "%.5u of %.5u", track, totalTracks); + *str = strdup(temp); + return 0; +} + +static int32_t mp4ff_set_metadata_name(mp4ff_t *f, const uint8_t atom_type, char **name) +{ + static char *tag_names[] = { + "unknown", "title", "artist", "writer", "album", + "date", "tool", "comment", "genre", "track", + "disc", "compilation", "genre", "tempo", "cover", + "album_artist", "contentgroup", "lyrics", "description", + "network", "show", "episodename", + "sorttitle", "sortalbum", "sortartist", "sortalbumartist", + "sortwriter", "sortshow", + "season", "episode", "podcast" + + }; + uint8_t tag_idx = 0; + + switch (atom_type) + { + case ATOM_TITLE: tag_idx = 1; break; + case ATOM_ARTIST: tag_idx = 2; break; + case ATOM_WRITER: tag_idx = 3; break; + case ATOM_ALBUM: tag_idx = 4; break; + case ATOM_DATE: tag_idx = 5; break; + case ATOM_TOOL: tag_idx = 6; break; + case ATOM_COMMENT: tag_idx = 7; break; + case ATOM_GENRE1: tag_idx = 8; break; + case ATOM_TRACK: tag_idx = 9; break; + case ATOM_DISC: tag_idx = 10; break; + case ATOM_COMPILATION: tag_idx = 11; break; + case ATOM_GENRE2: tag_idx = 12; break; + case ATOM_TEMPO: tag_idx = 13; break; + case ATOM_COVER: tag_idx = 14; break; + case ATOM_ALBUM_ARTIST: tag_idx = 15; break; + case ATOM_CONTENTGROUP: tag_idx = 16; break; + case ATOM_LYRICS: tag_idx = 17; break; + case ATOM_DESCRIPTION: tag_idx = 18; break; + case ATOM_NETWORK: tag_idx = 19; break; + case ATOM_SHOW: tag_idx = 20; break; + case ATOM_EPISODENAME: tag_idx = 21; break; + case ATOM_SORTTITLE: tag_idx = 22; break; + case ATOM_SORTALBUM: tag_idx = 23; break; + case ATOM_SORTARTIST: tag_idx = 24; break; + case ATOM_SORTALBUMARTIST: tag_idx = 25; break; + case ATOM_SORTWRITER: tag_idx = 26; break; + case ATOM_SORTSHOW: tag_idx = 27; break; + case ATOM_SEASON: tag_idx = 28; break; + case ATOM_EPISODE: tag_idx = 29; break; + case ATOM_PODCAST: tag_idx = 30; break; + default: tag_idx = 0; break; + } + + *name = strdup(tag_names[tag_idx]); + + return 0; +} + +static int32_t mp4ff_parse_tag(mp4ff_t *f, const uint8_t parent_atom_type, const int32_t size) +{ + uint8_t atom_type; + uint8_t header_size = 0; + uint64_t subsize, sumsize = 0; + char * name = NULL; + char * data = NULL; + uint32_t done = 0; + + + while (sumsize < size) + { + uint64_t destpos; + subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); + destpos = mp4ff_position(f)+subsize-header_size; + if (!done) + { + if (atom_type == ATOM_DATA) + { + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + mp4ff_read_int32(f); /* reserved */ + + /* some need special attention */ + if (parent_atom_type == ATOM_GENRE2 || parent_atom_type == ATOM_TEMPO) + { + if (subsize - header_size >= 8 + 2) + { + uint16_t val = mp4ff_read_int16(f); + + if (parent_atom_type == ATOM_TEMPO) + { + char temp[16]; + sprintf(temp, "%.5u BPM", val); + mp4ff_tag_add_field(&(f->tags), "tempo", temp); + } + else + { + const char * temp = mp4ff_meta_index_to_genre(val); + if (temp) + { + mp4ff_tag_add_field(&(f->tags), "genre", temp); + } + } + done = 1; + } + } else if (parent_atom_type == ATOM_TRACK || parent_atom_type == ATOM_DISC) { + /* if (!done && subsize - header_size >= 8 + 8) */ + /* modified by AJS */ + if ( !done && (subsize - header_size) >= + (sizeof(char) + sizeof(uint8_t)*3 + sizeof(uint32_t) + /* version + flags + reserved */ + + sizeof(uint16_t) /* leading uint16_t */ + + sizeof(uint16_t) /* track / disc */ + + sizeof(uint16_t)) /* totaltracks / totaldiscs */ + ) + { + uint16_t index,total; + char temp[32]; + mp4ff_read_int16(f); + index = mp4ff_read_int16(f); + total = mp4ff_read_int16(f); + /* modified by AJS */ + /* mp4ff_read_int16(f); */ + + sprintf(temp,"%d",index); + mp4ff_tag_add_field(&(f->tags), parent_atom_type == ATOM_TRACK ? "track" : "disc", temp); + if (total>0) + { + sprintf(temp,"%d",total); + mp4ff_tag_add_field(&(f->tags), parent_atom_type == ATOM_TRACK ? "totaltracks" : "totaldiscs", temp); + } + done = 1; + } + } else + { + if (data) {free(data);data = NULL;} + data = mp4ff_read_string(f,(uint32_t)(subsize-(header_size+8))); + } + } else if (atom_type == ATOM_NAME) { + if (!done) + { + mp4ff_read_char(f); /* version */ + mp4ff_read_int24(f); /* flags */ + if (name) free(name); + name = mp4ff_read_string(f,(uint32_t)(subsize-(header_size+4))); + } + } + mp4ff_set_position(f, destpos); + sumsize += subsize; + } + } + + if (data) + { + if (!done) + { + if (name == NULL) mp4ff_set_metadata_name(f, parent_atom_type, &name); + if (name) mp4ff_tag_add_field(&(f->tags), name, data); + } + + free(data); + } + if (name) free(name); + return 1; +} + +int32_t mp4ff_parse_metadata(mp4ff_t *f, const int32_t size) +{ + uint64_t subsize, sumsize = 0; + uint8_t atom_type; + uint8_t header_size = 0; + + while (sumsize < size) + { + subsize = mp4ff_atom_read_header(f, &atom_type, &header_size); + if (subsize == 0) + break; + mp4ff_parse_tag(f, atom_type, (uint32_t)(subsize-header_size)); + sumsize += subsize; + } + + return 0; +} + +/* find a metadata item by name */ +/* returns 0 if item found, 1 if no such item */ +static int32_t mp4ff_meta_find_by_name(const mp4ff_t *f, const char *item, char **value) +{ + uint32_t i; + + for (i = 0; i < f->tags.count; i++) + { + if (!stricmp(f->tags.tags[i].item, item)) + { + *value = strdup(f->tags.tags[i].value); + return 1; + } + } + + *value = NULL; + + /* not found */ + return 0; +} + +int32_t mp4ff_meta_get_num_items(const mp4ff_t *f) +{ + return f->tags.count; +} + +int32_t mp4ff_meta_get_by_index(const mp4ff_t *f, uint32_t index, + char **item, char **value) +{ + if (index >= f->tags.count) + { + *item = NULL; + *value = NULL; + return 0; + } else { + *item = strdup(f->tags.tags[index].item); + *value = strdup(f->tags.tags[index].value); + return 1; + } +} + +int32_t mp4ff_meta_get_title(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "title", value); +} + +int32_t mp4ff_meta_get_artist(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "artist", value); +} + +int32_t mp4ff_meta_get_writer(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "writer", value); +} + +int32_t mp4ff_meta_get_album(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "album", value); +} + +int32_t mp4ff_meta_get_date(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "date", value); +} + +int32_t mp4ff_meta_get_tool(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "tool", value); +} + +int32_t mp4ff_meta_get_comment(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "comment", value); +} + +int32_t mp4ff_meta_get_genre(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "genre", value); +} + +int32_t mp4ff_meta_get_track(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "track", value); +} + +int32_t mp4ff_meta_get_totaltracks(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "totaltracks", value); +} + +int32_t mp4ff_meta_get_disc(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "disc", value); +} + +int32_t mp4ff_meta_get_totaldiscs(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "totaldiscs", value); +} + +int32_t mp4ff_meta_get_compilation(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "compilation", value); +} + +int32_t mp4ff_meta_get_tempo(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "tempo", value); +} + +int32_t mp4ff_meta_get_coverart(const mp4ff_t *f, char **value) +{ + return mp4ff_meta_find_by_name(f, "cover", value); +} + #endif \ No newline at end of file diff --git a/src/contrib/aacdecoder/mp4sample.c b/src/contrib/aacdecoder/mp4ff/mp4sample.c old mode 100644 new mode 100755 similarity index 90% rename from src/contrib/aacdecoder/mp4sample.c rename to src/contrib/aacdecoder/mp4ff/mp4sample.c index 19f667ca3..959946419 --- a/src/contrib/aacdecoder/mp4sample.c +++ b/src/contrib/aacdecoder/mp4ff/mp4sample.c @@ -1,152 +1,155 @@ -/* -** 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: mp4sample.c,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#include -#include "mp4ffint.h" - - -static int32_t mp4ff_chunk_of_sample(const mp4ff_t *f, const int32_t track, const int32_t sample, - int32_t *chunk_sample, int32_t *chunk) -{ - int32_t total_entries = 0; - int32_t chunk2entry; - int32_t chunk1, chunk2, chunk1samples, range_samples, total = 0; - - if (f->track[track] == NULL) - { - return -1; - } - - total_entries = f->track[track]->stsc_entry_count; - - chunk1 = 1; - chunk1samples = 0; - chunk2entry = 0; - - do - { - chunk2 = f->track[track]->stsc_first_chunk[chunk2entry]; - *chunk = chunk2 - chunk1; - range_samples = *chunk * chunk1samples; - - if (sample < total + range_samples) break; - - chunk1samples = f->track[track]->stsc_samples_per_chunk[chunk2entry]; - chunk1 = chunk2; - - if(chunk2entry < total_entries) - { - chunk2entry++; - total += range_samples; - } - } while (chunk2entry < total_entries); - - if (chunk1samples) - *chunk = (sample - total) / chunk1samples + chunk1; - else - *chunk = 1; - - *chunk_sample = total + (*chunk - chunk1) * chunk1samples; - - return 0; -} - -static int32_t mp4ff_chunk_to_offset(const mp4ff_t *f, const int32_t track, const int32_t chunk) -{ - const mp4ff_track_t * p_track = f->track[track]; - - if (p_track->stco_entry_count && (chunk > p_track->stco_entry_count)) - { - return p_track->stco_chunk_offset[p_track->stco_entry_count - 1]; - } else if (p_track->stco_entry_count) { - return p_track->stco_chunk_offset[chunk - 1]; - } else { - return 8; - } - - return 0; -} - -static int32_t mp4ff_sample_range_size(const mp4ff_t *f, const int32_t track, - const int32_t chunk_sample, const int32_t sample) -{ - int32_t i, total; - const mp4ff_track_t * p_track = f->track[track]; - - if (p_track->stsz_sample_size) - { - return (sample - chunk_sample) * p_track->stsz_sample_size; - } - else - { - if (sample>=p_track->stsz_sample_count) return 0;//error - - for(i = chunk_sample, total = 0; i < sample; i++) - { - total += p_track->stsz_table[i]; - } - } - - return total; -} - -static int32_t mp4ff_sample_to_offset(const mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t chunk, chunk_sample, chunk_offset1, chunk_offset2; - - mp4ff_chunk_of_sample(f, track, sample, &chunk_sample, &chunk); - - chunk_offset1 = mp4ff_chunk_to_offset(f, track, chunk); - chunk_offset2 = chunk_offset1 + mp4ff_sample_range_size(f, track, chunk_sample, sample); - - return chunk_offset2; -} - -int32_t mp4ff_audio_frame_size(const mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t bytes; - const mp4ff_track_t * p_track = f->track[track]; - - if (p_track->stsz_sample_size) - { - bytes = p_track->stsz_sample_size; - } else { - bytes = p_track->stsz_table[sample]; - } - - return bytes; -} - -int32_t mp4ff_set_sample_position(mp4ff_t *f, const int32_t track, const int32_t sample) -{ - int32_t offset; - - offset = mp4ff_sample_to_offset(f, track, sample); - mp4ff_set_position(f, offset); - - return 0; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4sample.c,v 1.20 2007/11/01 12:33:29 menno Exp $ +**/ + +#include +#include "mp4ffint.h" + + +static int32_t mp4ff_chunk_of_sample(const mp4ff_t *f, const int32_t track, const int32_t sample, + int32_t *chunk_sample, int32_t *chunk) +{ + int32_t total_entries = 0; + int32_t chunk2entry; + int32_t chunk1, chunk2, chunk1samples, range_samples, total = 0; + + if (f->track[track] == NULL) + { + return -1; + } + + total_entries = f->track[track]->stsc_entry_count; + + chunk1 = 1; + chunk1samples = 0; + chunk2entry = 0; + + do + { + chunk2 = f->track[track]->stsc_first_chunk[chunk2entry]; + *chunk = chunk2 - chunk1; + range_samples = *chunk * chunk1samples; + + if (sample < total + range_samples) break; + + chunk1samples = f->track[track]->stsc_samples_per_chunk[chunk2entry]; + chunk1 = chunk2; + + if(chunk2entry < total_entries) + { + chunk2entry++; + total += range_samples; + } + } while (chunk2entry < total_entries); + + if (chunk1samples) + *chunk = (sample - total) / chunk1samples + chunk1; + else + *chunk = 1; + + *chunk_sample = total + (*chunk - chunk1) * chunk1samples; + + return 0; +} + +static int32_t mp4ff_chunk_to_offset(const mp4ff_t *f, const int32_t track, const int32_t chunk) +{ + const mp4ff_track_t * p_track = f->track[track]; + + if (p_track->stco_entry_count && (chunk > p_track->stco_entry_count)) + { + return p_track->stco_chunk_offset[p_track->stco_entry_count - 1]; + } else if (p_track->stco_entry_count) { + return p_track->stco_chunk_offset[chunk - 1]; + } else { + return 8; + } + + return 0; +} + +static int32_t mp4ff_sample_range_size(const mp4ff_t *f, const int32_t track, + const int32_t chunk_sample, const int32_t sample) +{ + int32_t i, total; + const mp4ff_track_t * p_track = f->track[track]; + + if (p_track->stsz_sample_size) + { + return (sample - chunk_sample) * p_track->stsz_sample_size; + } + else + { + if (sample>=p_track->stsz_sample_count) return 0;//error + + for(i = chunk_sample, total = 0; i < sample; i++) + { + total += p_track->stsz_table[i]; + } + } + + return total; +} + +static int32_t mp4ff_sample_to_offset(const mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t chunk, chunk_sample, chunk_offset1, chunk_offset2; + + mp4ff_chunk_of_sample(f, track, sample, &chunk_sample, &chunk); + + chunk_offset1 = mp4ff_chunk_to_offset(f, track, chunk); + chunk_offset2 = chunk_offset1 + mp4ff_sample_range_size(f, track, chunk_sample, sample); + + return chunk_offset2; +} + +int32_t mp4ff_audio_frame_size(const mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t bytes; + const mp4ff_track_t * p_track = f->track[track]; + + if (p_track->stsz_sample_size) + { + bytes = p_track->stsz_sample_size; + } else { + bytes = p_track->stsz_table[sample]; + } + + return bytes; +} + +int32_t mp4ff_set_sample_position(mp4ff_t *f, const int32_t track, const int32_t sample) +{ + int32_t offset; + + offset = mp4ff_sample_to_offset(f, track, sample); + mp4ff_set_position(f, offset); + + return 0; +} diff --git a/src/contrib/aacdecoder/mp4tagupdate.c b/src/contrib/aacdecoder/mp4ff/mp4tagupdate.c old mode 100644 new mode 100755 similarity index 94% rename from src/contrib/aacdecoder/mp4tagupdate.c rename to src/contrib/aacdecoder/mp4ff/mp4tagupdate.c index a6bd4f509..79b59c718 --- a/src/contrib/aacdecoder/mp4tagupdate.c +++ b/src/contrib/aacdecoder/mp4ff/mp4tagupdate.c @@ -1,645 +1,656 @@ -#include -#include -#include "mp4ffint.h" - -#ifdef USE_TAGGING - -static uint32_t fix_byte_order_32(uint32_t src) -{ - uint32_t result; - uint32_t a, b, c, d; - int8_t data[4]; - - memcpy(data,&src,sizeof(src)); - a = (uint8_t)data[0]; - b = (uint8_t)data[1]; - c = (uint8_t)data[2]; - d = (uint8_t)data[3]; - - result = (a<<24) | (b<<16) | (c<<8) | d; - return (uint32_t)result; -} - -static uint16_t fix_byte_order_16(uint16_t src) -{ - uint16_t result; - uint16_t a, b; - int8_t data[2]; - - memcpy(data,&src,sizeof(src)); - a = (uint8_t)data[0]; - b = (uint8_t)data[1]; - - result = (a<<8) | b; - return (uint16_t)result; -} - - -typedef struct -{ - void * data; - unsigned written; - unsigned allocated; - unsigned error; -} membuffer; - -unsigned membuffer_write(membuffer * buf,const void * ptr,unsigned bytes) -{ - unsigned dest_size = buf->written + bytes; - - if (buf->error) return 0; - if (dest_size > buf->allocated) - { - do - { - buf->allocated <<= 1; - } while(dest_size > buf->allocated); - - { - void * newptr = realloc(buf->data,buf->allocated); - if (newptr==0) - { - free(buf->data); - buf->data = 0; - buf->error = 1; - return 0; - } - buf->data = newptr; - } - } - - if (ptr) memcpy((char*)buf->data + buf->written,ptr,bytes); - buf->written += bytes; - return bytes; -} - -#define membuffer_write_data membuffer_write - -unsigned membuffer_write_int32(membuffer * buf,uint32_t data) -{ - uint8_t temp[4] = {(uint8_t)(data>>24),(uint8_t)(data>>16),(uint8_t)(data>>8),(uint8_t)data}; - return membuffer_write_data(buf,temp,4); -} - -unsigned membuffer_write_int24(membuffer * buf,uint32_t data) -{ - uint8_t temp[3] = {(uint8_t)(data>>16),(uint8_t)(data>>8),(uint8_t)data}; - return membuffer_write_data(buf,temp,3); -} - -unsigned membuffer_write_int16(membuffer * buf,uint16_t data) -{ - uint8_t temp[2] = {(uint8_t)(data>>8),(uint8_t)data}; - return membuffer_write_data(buf,temp,2); -} - -unsigned membuffer_write_atom_name(membuffer * buf,const char * data) -{ - return membuffer_write_data(buf,data,4)==4 ? 1 : 0; -} - -void membuffer_write_atom(membuffer * buf,const char * name,unsigned size,const void * data) -{ - membuffer_write_int32(buf,size + 8); - membuffer_write_atom_name(buf,name); - membuffer_write_data(buf,data,size); -} - -unsigned membuffer_write_string(membuffer * buf,const char * data) -{ - return membuffer_write_data(buf,data,strlen(data)); -} - -unsigned membuffer_write_int8(membuffer * buf,uint8_t data) -{ - return membuffer_write_data(buf,&data,1); -} - -void * membuffer_get_ptr(const membuffer * buf) -{ - return buf->data; -} - -unsigned membuffer_get_size(const membuffer * buf) -{ - return buf->written; -} - -unsigned membuffer_error(const membuffer * buf) -{ - return buf->error; -} - -void membuffer_set_error(membuffer * buf) {buf->error = 1;} - -unsigned membuffer_transfer_from_file(membuffer * buf,mp4ff_t * src,unsigned bytes) -{ - unsigned oldsize; - void * bufptr; - - oldsize = membuffer_get_size(buf); - if (membuffer_write_data(buf,0,bytes) != bytes) return 0; - - bufptr = membuffer_get_ptr(buf); - if (bufptr==0) return 0; - - if ((unsigned)mp4ff_read_data(src,(char*)bufptr + oldsize,bytes)!=bytes) - { - membuffer_set_error(buf); - return 0; - } - - return bytes; -} - - -membuffer * membuffer_create() -{ - const unsigned initial_size = 256; - - membuffer * buf = (membuffer *) malloc(sizeof(membuffer)); - buf->data = malloc(initial_size); - buf->written = 0; - buf->allocated = initial_size; - buf->error = buf->data == 0 ? 1 : 0; - - return buf; -} - -void membuffer_free(membuffer * buf) -{ - if (buf->data) free(buf->data); - free(buf); -} - -void * membuffer_detach(membuffer * buf) -{ - void * ret; - - if (buf->error) return 0; - - ret = realloc(buf->data,buf->written); - - if (ret == 0) free(buf->data); - - buf->data = 0; - buf->error = 1; - - return ret; -} - -#if 0 -/* metadata tag structure */ -typedef struct -{ - char *item; - char *value; -} mp4ff_tag_t; - -/* metadata list structure */ -typedef struct -{ - mp4ff_tag_t *tags; - uint32_t count; -} mp4ff_metadata_t; -#endif - -typedef struct -{ - const char * atom; - const char * name; -} stdmeta_entry; - -static stdmeta_entry stdmetas[] = -{ - {"©nam","title"}, - {"©ART","artist"}, - {"©wrt","writer"}, - {"©alb","album"}, - {"©day","date"}, - {"©too","tool"}, - {"©cmt","comment"}, -// {"©gen","genre"}, - {"cpil","compilation"}, -// {"trkn","track"}, -// {"disk","disc"}, -// {"gnre","genre"}, - {"covr","cover"}, -}; - - -static const char* find_standard_meta(const char * name) //returns atom name if found, 0 if not -{ - unsigned n; - for(n=0;ncount); - memset(mask,0,data->count); - - { - const char * tracknumber_ptr = 0, * totaltracks_ptr = 0; - const char * discnumber_ptr = 0, * totaldiscs_ptr = 0; - const char * genre_ptr = 0, * tempo_ptr = 0; - for(metaptr = 0; metaptr < data->count; metaptr++) - { - mp4ff_tag_t * tag = &data->tags[metaptr]; - if (!stricmp(tag->item,"tracknumber") || !stricmp(tag->item,"track")) - { - if (tracknumber_ptr==0) tracknumber_ptr = tag->value; - mask[metaptr] = 1; - } - else if (!stricmp(tag->item,"totaltracks")) - { - if (totaltracks_ptr==0) totaltracks_ptr = tag->value; - mask[metaptr] = 1; - } - else if (!stricmp(tag->item,"discnumber") || !stricmp(tag->item,"disc")) - { - if (discnumber_ptr==0) discnumber_ptr = tag->value; - mask[metaptr] = 1; - } - else if (!stricmp(tag->item,"totaldiscs")) - { - if (totaldiscs_ptr==0) totaldiscs_ptr = tag->value; - mask[metaptr] = 1; - } - else if (!stricmp(tag->item,"genre")) - { - if (genre_ptr==0) genre_ptr = tag->value; - mask[metaptr] = 1; - } - else if (!stricmp(tag->item,"tempo")) - { - if (tempo_ptr==0) tempo_ptr = tag->value; - mask[metaptr] = 1; - } - - } - - if (tracknumber_ptr) membuffer_write_track_tag(buf,"trkn",myatoi(tracknumber_ptr),myatoi(totaltracks_ptr)); - if (discnumber_ptr) membuffer_write_track_tag(buf,"disk",myatoi(discnumber_ptr),myatoi(totaldiscs_ptr)); - if (tempo_ptr) membuffer_write_int16_tag(buf,"tmpo",(uint16_t)myatoi(tempo_ptr)); - - if (genre_ptr) - { - uint32_t index = mp4ff_meta_genre_to_index(genre_ptr); - if (index==0) - membuffer_write_std_tag(buf,"©gen",genre_ptr); - else - membuffer_write_int16_tag(buf,"gnre",(uint16_t)index); - } - } - - for(metaptr = 0; metaptr < data->count; metaptr++) - { - if (!mask[metaptr]) - { - mp4ff_tag_t * tag = &data->tags[metaptr]; - const char * std_meta_atom = find_standard_meta(tag->item); - if (std_meta_atom) - { - membuffer_write_std_tag(buf,std_meta_atom,tag->value); - } - else - { - membuffer_write_custom_tag(buf,tag->item,tag->value); - } - } - } - - free(mask); - - if (membuffer_error(buf)) - { - membuffer_free(buf); - return 0; - } - - *out_size = membuffer_get_size(buf); - *out_buffer = membuffer_detach(buf); - membuffer_free(buf); - - return 1; -} - -static uint32_t find_atom(mp4ff_t * f,uint64_t base,uint32_t size,const char * name) -{ - uint32_t remaining = size; - uint64_t atom_offset = base; - for(;;) - { - char atom_name[4]; - uint32_t atom_size; - - mp4ff_set_position(f,atom_offset); - - if (remaining < 8) break; - atom_size = mp4ff_read_int32(f); - if (atom_size > remaining || atom_size < 8) break; - mp4ff_read_data(f,atom_name,4); - - if (!memcmp(atom_name,name,4)) - { - mp4ff_set_position(f,atom_offset); - return 1; - } - - remaining -= atom_size; - atom_offset += atom_size; - } - return 0; -} - -static uint32_t find_atom_v2(mp4ff_t * f,uint64_t base,uint32_t size,const char * name,uint32_t extraheaders,const char * name_inside) -{ - uint64_t first_base = (uint64_t)(-1); - while(find_atom(f,base,size,name))//try to find atom with atom in it - { - uint64_t mybase = mp4ff_position(f); - uint32_t mysize = mp4ff_read_int32(f); - - if (first_base == (uint64_t)(-1)) first_base = mybase; - - if (mysize < 8 + extraheaders) break; - - if (find_atom(f,mybase+(8+extraheaders),mysize-(8+extraheaders),name_inside)) - { - mp4ff_set_position(f,mybase); - return 2; - } - base += mysize; - if (size<=mysize) {size=0;break;} - size -= mysize; - } - - if (first_base != (uint64_t)(-1))//wanted atom inside not found - { - mp4ff_set_position(f,first_base); - return 1; - } - else return 0; -} - -static uint32_t create_meta(const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size) -{ - membuffer * buf; - uint32_t ilst_size; - void * ilst_buffer; - - if (!create_ilst(data,&ilst_buffer,&ilst_size)) return 0; - - buf = membuffer_create(); - - membuffer_write_int32(buf,0); - membuffer_write_atom(buf,"ilst",ilst_size,ilst_buffer); - free(ilst_buffer); - - *out_size = membuffer_get_size(buf); - *out_buffer = membuffer_detach(buf); - membuffer_free(buf); - return 1; -} - -static uint32_t create_udta(const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size) -{ - membuffer * buf; - uint32_t meta_size; - void * meta_buffer; - - if (!create_meta(data,&meta_buffer,&meta_size)) return 0; - - buf = membuffer_create(); - - membuffer_write_atom(buf,"meta",meta_size,meta_buffer); - - free(meta_buffer); - - *out_size = membuffer_get_size(buf); - *out_buffer = membuffer_detach(buf); - membuffer_free(buf); - return 1; -} - -static uint32_t modify_moov(mp4ff_t * f,const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size) -{ - uint64_t total_base = f->moov_offset + 8; - uint32_t total_size = (uint32_t)(f->moov_size - 8); - - uint64_t udta_offset,meta_offset,ilst_offset; - uint32_t udta_size, meta_size, ilst_size; - - uint32_t new_ilst_size; - void * new_ilst_buffer; - - uint8_t * p_out; - int32_t size_delta; - - - if (!find_atom_v2(f,total_base,total_size,"udta",0,"meta")) - { - membuffer * buf; - void * new_udta_buffer; - uint32_t new_udta_size; - if (!create_udta(data,&new_udta_buffer,&new_udta_size)) return 0; - - buf = membuffer_create(); - mp4ff_set_position(f,total_base); - membuffer_transfer_from_file(buf,f,total_size); - - membuffer_write_atom(buf,"udta",new_udta_size,new_udta_buffer); - - free(new_udta_buffer); - - *out_size = membuffer_get_size(buf); - *out_buffer = membuffer_detach(buf); - membuffer_free(buf); - return 1; - } - else - { - udta_offset = mp4ff_position(f); - udta_size = mp4ff_read_int32(f); - if (find_atom_v2(f,udta_offset+8,udta_size-8,"meta",4,"ilst")<2) - { - membuffer * buf; - void * new_meta_buffer; - uint32_t new_meta_size; - if (!create_meta(data,&new_meta_buffer,&new_meta_size)) return 0; - - buf = membuffer_create(); - mp4ff_set_position(f,total_base); - membuffer_transfer_from_file(buf,f,(uint32_t)(udta_offset - total_base)); - - membuffer_write_int32(buf,udta_size + 8 + new_meta_size); - membuffer_write_atom_name(buf,"udta"); - membuffer_transfer_from_file(buf,f,udta_size); - - membuffer_write_atom(buf,"meta",new_meta_size,new_meta_buffer); - free(new_meta_buffer); - - *out_size = membuffer_get_size(buf); - *out_buffer = membuffer_detach(buf); - membuffer_free(buf); - return 1; - } - meta_offset = mp4ff_position(f); - meta_size = mp4ff_read_int32(f); - if (!find_atom(f,meta_offset+12,meta_size-12,"ilst")) return 0;//shouldn't happen, find_atom_v2 above takes care of it - ilst_offset = mp4ff_position(f); - ilst_size = mp4ff_read_int32(f); - - if (!create_ilst(data,&new_ilst_buffer,&new_ilst_size)) return 0; - - size_delta = new_ilst_size - (ilst_size - 8); - - *out_size = total_size + size_delta; - *out_buffer = malloc(*out_size); - if (*out_buffer == 0) - { - free(new_ilst_buffer); - return 0; - } - - p_out = (uint8_t*)*out_buffer; - - mp4ff_set_position(f,total_base); - mp4ff_read_data(f,p_out,(uint32_t)(udta_offset - total_base )); p_out += (uint32_t)(udta_offset - total_base ); - *(uint32_t*)p_out = fix_byte_order_32(mp4ff_read_int32(f) + size_delta); p_out += 4; - mp4ff_read_data(f,p_out,4); p_out += 4; - mp4ff_read_data(f,p_out,(uint32_t)(meta_offset - udta_offset - 8)); p_out += (uint32_t)(meta_offset - udta_offset - 8); - *(uint32_t*)p_out = fix_byte_order_32(mp4ff_read_int32(f) + size_delta); p_out += 4; - mp4ff_read_data(f,p_out,4); p_out += 4; - mp4ff_read_data(f,p_out,(uint32_t)(ilst_offset - meta_offset - 8)); p_out += (uint32_t)(ilst_offset - meta_offset - 8); - *(uint32_t*)p_out = fix_byte_order_32(mp4ff_read_int32(f) + size_delta); p_out += 4; - mp4ff_read_data(f,p_out,4); p_out += 4; - - memcpy(p_out,new_ilst_buffer,new_ilst_size); - p_out += new_ilst_size; - - mp4ff_set_position(f,ilst_offset + ilst_size); - mp4ff_read_data(f,p_out,(uint32_t)(total_size - (ilst_offset - total_base) - ilst_size)); - - free(new_ilst_buffer); - } - return 1; - -} - -int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data) -{ - void * new_moov_data; - uint32_t new_moov_size; - - mp4ff_t *ff = malloc(sizeof(mp4ff_t)); - - memset(ff, 0, sizeof(mp4ff_t)); - ff->stream = f; - mp4ff_set_position(ff,0); - - parse_atoms(ff,1); - - - if (!modify_moov(ff,data,&new_moov_data,&new_moov_size)) - { - mp4ff_close(ff); - return 0; - } - - /* copy moov atom to end of the file */ - if (ff->last_atom != ATOM_MOOV) - { - char *free_data = "free"; - - /* rename old moov to free */ - mp4ff_set_position(ff, ff->moov_offset + 4); - mp4ff_write_data(ff, free_data, 4); - - mp4ff_set_position(ff, ff->file_size); - mp4ff_write_int32(ff,new_moov_size + 8); - mp4ff_write_data(ff,"moov",4); - mp4ff_write_data(ff, new_moov_data, new_moov_size); - } - else - { - mp4ff_set_position(ff, ff->moov_offset); - mp4ff_write_int32(ff,new_moov_size + 8); - mp4ff_write_data(ff,"moov",4); - mp4ff_write_data(ff, new_moov_data, new_moov_size); - } - - mp4ff_truncate(ff); - - mp4ff_close(ff); - return 1; -} -#endif +#include +#include +#include "mp4ffint.h" + +#ifdef USE_TAGGING + +static uint32_t fix_byte_order_32(uint32_t src) +{ + uint32_t result; + uint32_t a, b, c, d; + int8_t data[4]; + + memcpy(data,&src,sizeof(src)); + a = (uint8_t)data[0]; + b = (uint8_t)data[1]; + c = (uint8_t)data[2]; + d = (uint8_t)data[3]; + + result = (a<<24) | (b<<16) | (c<<8) | d; + return (uint32_t)result; +} + +static uint16_t fix_byte_order_16(uint16_t src) +{ + uint16_t result; + uint16_t a, b; + int8_t data[2]; + + memcpy(data,&src,sizeof(src)); + a = (uint8_t)data[0]; + b = (uint8_t)data[1]; + + result = (a<<8) | b; + return (uint16_t)result; +} + + +typedef struct +{ + void * data; + unsigned written; + unsigned allocated; + unsigned error; +} membuffer; + +unsigned membuffer_write(membuffer * buf,const void * ptr,unsigned bytes) +{ + unsigned dest_size = buf->written + bytes; + + if (buf->error) return 0; + if (dest_size > buf->allocated) + { + do + { + buf->allocated <<= 1; + } while(dest_size > buf->allocated); + + { + void * newptr = realloc(buf->data,buf->allocated); + if (newptr==0) + { + free(buf->data); + buf->data = 0; + buf->error = 1; + return 0; + } + buf->data = newptr; + } + } + + if (ptr) memcpy((char*)buf->data + buf->written,ptr,bytes); + buf->written += bytes; + return bytes; +} + +#define membuffer_write_data membuffer_write + +unsigned membuffer_write_int32(membuffer * buf,uint32_t data) +{ + uint8_t temp[4] = {(uint8_t)(data>>24),(uint8_t)(data>>16),(uint8_t)(data>>8),(uint8_t)data}; + return membuffer_write_data(buf,temp,4); +} + +unsigned membuffer_write_int24(membuffer * buf,uint32_t data) +{ + uint8_t temp[3] = {(uint8_t)(data>>16),(uint8_t)(data>>8),(uint8_t)data}; + return membuffer_write_data(buf,temp,3); +} + +unsigned membuffer_write_int16(membuffer * buf,uint16_t data) +{ + uint8_t temp[2] = {(uint8_t)(data>>8),(uint8_t)data}; + return membuffer_write_data(buf,temp,2); +} + +unsigned membuffer_write_atom_name(membuffer * buf,const char * data) +{ + return membuffer_write_data(buf,data,4)==4 ? 1 : 0; +} + +void membuffer_write_atom(membuffer * buf,const char * name,unsigned size,const void * data) +{ + membuffer_write_int32(buf,size + 8); + membuffer_write_atom_name(buf,name); + membuffer_write_data(buf,data,size); +} + +unsigned membuffer_write_string(membuffer * buf,const char * data) +{ + return membuffer_write_data(buf,data,strlen(data)); +} + +unsigned membuffer_write_int8(membuffer * buf,uint8_t data) +{ + return membuffer_write_data(buf,&data,1); +} + +void * membuffer_get_ptr(const membuffer * buf) +{ + return buf->data; +} + +unsigned membuffer_get_size(const membuffer * buf) +{ + return buf->written; +} + +unsigned membuffer_error(const membuffer * buf) +{ + return buf->error; +} + +void membuffer_set_error(membuffer * buf) {buf->error = 1;} + +unsigned membuffer_transfer_from_file(membuffer * buf,mp4ff_t * src,unsigned bytes) +{ + unsigned oldsize; + void * bufptr; + + oldsize = membuffer_get_size(buf); + if (membuffer_write_data(buf,0,bytes) != bytes) return 0; + + bufptr = membuffer_get_ptr(buf); + if (bufptr==0) return 0; + + if ((unsigned)mp4ff_read_data(src,(char*)bufptr + oldsize,bytes)!=bytes) + { + membuffer_set_error(buf); + return 0; + } + + return bytes; +} + + +membuffer * membuffer_create() +{ + const unsigned initial_size = 256; + + membuffer * buf = (membuffer *) malloc(sizeof(membuffer)); + buf->data = malloc(initial_size); + buf->written = 0; + buf->allocated = initial_size; + buf->error = buf->data == 0 ? 1 : 0; + + return buf; +} + +void membuffer_free(membuffer * buf) +{ + if (buf->data) free(buf->data); + free(buf); +} + +void * membuffer_detach(membuffer * buf) +{ + void * ret; + + if (buf->error) return 0; + + ret = realloc(buf->data,buf->written); + + if (ret == 0) free(buf->data); + + buf->data = 0; + buf->error = 1; + + return ret; +} + +#if 0 +/* metadata tag structure */ +typedef struct +{ + char *item; + char *value; +} mp4ff_tag_t; + +/* metadata list structure */ +typedef struct +{ + mp4ff_tag_t *tags; + uint32_t count; +} mp4ff_metadata_t; +#endif + +typedef struct +{ + const char * atom; + const char * name; +} stdmeta_entry; + +static stdmeta_entry stdmetas[] = +{ + {"\xA9" "nam","title"}, + {"\xA9" "ART","artist"}, + {"\xA9" "wrt","writer"}, + {"\xA9" "alb","album"}, + {"\xA9" "day","date"}, + {"\xA9" "too","tool"}, + {"\xA9" "cmt","comment"}, +// {"\xA9" "gen","genre"}, + {"cpil","compilation"}, +// {"trkn","track"}, +// {"disk","disc"}, +// {"gnre","genre"}, + {"covr","cover"}, + /* added by AJS */ + {"aART","album_artist"}, +}; + + +static const char* find_standard_meta(const char * name) //returns atom name if found, 0 if not +{ + unsigned n; + for(n=0;ncount); + memset(mask,0,data->count); + + { + const char * tracknumber_ptr = 0, * totaltracks_ptr = 0; + const char * discnumber_ptr = 0, * totaldiscs_ptr = 0; + const char * genre_ptr = 0, * tempo_ptr = 0; + for(metaptr = 0; metaptr < data->count; metaptr++) + { + mp4ff_tag_t * tag = &data->tags[metaptr]; + if (!stricmp(tag->item,"tracknumber") || !stricmp(tag->item,"track")) + { + if (tracknumber_ptr==0) tracknumber_ptr = tag->value; + mask[metaptr] = 1; + } + else if (!stricmp(tag->item,"totaltracks")) + { + if (totaltracks_ptr==0) totaltracks_ptr = tag->value; + mask[metaptr] = 1; + } + else if (!stricmp(tag->item,"discnumber") || !stricmp(tag->item,"disc")) + { + if (discnumber_ptr==0) discnumber_ptr = tag->value; + mask[metaptr] = 1; + } + else if (!stricmp(tag->item,"totaldiscs")) + { + if (totaldiscs_ptr==0) totaldiscs_ptr = tag->value; + mask[metaptr] = 1; + } + else if (!stricmp(tag->item,"genre")) + { + if (genre_ptr==0) genre_ptr = tag->value; + mask[metaptr] = 1; + } + else if (!stricmp(tag->item,"tempo")) + { + if (tempo_ptr==0) tempo_ptr = tag->value; + mask[metaptr] = 1; + } + + } + + if (tracknumber_ptr) membuffer_write_track_tag(buf,"trkn",myatoi(tracknumber_ptr),myatoi(totaltracks_ptr)); + if (discnumber_ptr) membuffer_write_track_tag(buf,"disk",myatoi(discnumber_ptr),myatoi(totaldiscs_ptr)); + if (tempo_ptr) membuffer_write_int16_tag(buf,"tmpo",(uint16_t)myatoi(tempo_ptr)); + + if (genre_ptr) + { + uint32_t index = mp4ff_meta_genre_to_index(genre_ptr); + if (index==0) + membuffer_write_std_tag(buf,"©gen",genre_ptr); + else + membuffer_write_int16_tag(buf,"gnre",(uint16_t)index); + } + } + + for(metaptr = 0; metaptr < data->count; metaptr++) + { + if (!mask[metaptr]) + { + mp4ff_tag_t * tag = &data->tags[metaptr]; + const char * std_meta_atom = find_standard_meta(tag->item); + if (std_meta_atom) + { + membuffer_write_std_tag(buf,std_meta_atom,tag->value); + } + else + { + membuffer_write_custom_tag(buf,tag->item,tag->value); + } + } + } + + free(mask); + + if (membuffer_error(buf)) + { + membuffer_free(buf); + return 0; + } + + *out_size = membuffer_get_size(buf); + *out_buffer = membuffer_detach(buf); + membuffer_free(buf); + + return 1; +} + +static uint32_t find_atom(mp4ff_t * f,uint64_t base,uint32_t size,const char * name) +{ + uint32_t remaining = size; + uint64_t atom_offset = base; + for(;;) + { + char atom_name[4]; + uint32_t atom_size; + + mp4ff_set_position(f,atom_offset); + + if (remaining < 8) break; + atom_size = mp4ff_read_int32(f); + if (atom_size > remaining || atom_size < 8) break; + mp4ff_read_data(f,atom_name,4); + + if (!memcmp(atom_name,name,4)) + { + mp4ff_set_position(f,atom_offset); + return 1; + } + + remaining -= atom_size; + atom_offset += atom_size; + } + return 0; +} + +static uint32_t find_atom_v2(mp4ff_t * f,uint64_t base,uint32_t size,const char * name,uint32_t extraheaders,const char * name_inside) +{ + uint64_t first_base = (uint64_t)(-1); + while(find_atom(f,base,size,name))//try to find atom with atom in it + { + uint64_t mybase = mp4ff_position(f); + uint32_t mysize = mp4ff_read_int32(f); + + if (first_base == (uint64_t)(-1)) first_base = mybase; + + if (mysize < 8 + extraheaders) break; + + if (find_atom(f,mybase+(8+extraheaders),mysize-(8+extraheaders),name_inside)) + { + mp4ff_set_position(f,mybase); + return 2; + } + base += mysize; + if (size<=mysize) {size=0;break;} + size -= mysize; + } + + if (first_base != (uint64_t)(-1))//wanted atom inside not found + { + mp4ff_set_position(f,first_base); + return 1; + } + else return 0; +} + +static uint32_t create_meta(const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size) +{ + membuffer * buf; + uint32_t ilst_size; + void * ilst_buffer; + + if (!create_ilst(data,&ilst_buffer,&ilst_size)) return 0; + + buf = membuffer_create(); + + membuffer_write_int32(buf,0); + membuffer_write_atom(buf,"ilst",ilst_size,ilst_buffer); + free(ilst_buffer); + + *out_size = membuffer_get_size(buf); + *out_buffer = membuffer_detach(buf); + membuffer_free(buf); + return 1; +} + +static uint32_t create_udta(const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size) +{ + membuffer * buf; + uint32_t meta_size; + void * meta_buffer; + + if (!create_meta(data,&meta_buffer,&meta_size)) return 0; + + buf = membuffer_create(); + + membuffer_write_atom(buf,"meta",meta_size,meta_buffer); + + free(meta_buffer); + + *out_size = membuffer_get_size(buf); + *out_buffer = membuffer_detach(buf); + membuffer_free(buf); + return 1; +} + +static uint32_t modify_moov(mp4ff_t * f,const mp4ff_metadata_t * data,void ** out_buffer,uint32_t * out_size) +{ + uint64_t total_base = f->moov_offset + 8; + uint32_t total_size = (uint32_t)(f->moov_size - 8); + + uint64_t udta_offset,meta_offset,ilst_offset; + uint32_t udta_size, meta_size, ilst_size; + + uint32_t new_ilst_size; + void * new_ilst_buffer; + + uint8_t * p_out; + int32_t size_delta; + + + if (!find_atom_v2(f,total_base,total_size,"udta",0,"meta")) + { + membuffer * buf; + void * new_udta_buffer; + uint32_t new_udta_size; + if (!create_udta(data,&new_udta_buffer,&new_udta_size)) return 0; + + buf = membuffer_create(); + mp4ff_set_position(f,total_base); + membuffer_transfer_from_file(buf,f,total_size); + + membuffer_write_atom(buf,"udta",new_udta_size,new_udta_buffer); + + free(new_udta_buffer); + + *out_size = membuffer_get_size(buf); + *out_buffer = membuffer_detach(buf); + membuffer_free(buf); + return 1; + } + else + { + udta_offset = mp4ff_position(f); + udta_size = mp4ff_read_int32(f); + if (!find_atom_v2(f,udta_offset+8,udta_size-8,"meta",4,"ilst")) + { + membuffer * buf; + void * new_meta_buffer; + uint32_t new_meta_size; + if (!create_meta(data,&new_meta_buffer,&new_meta_size)) return 0; + + buf = membuffer_create(); + mp4ff_set_position(f,total_base); + membuffer_transfer_from_file(buf,f,(uint32_t)(udta_offset - total_base)); + + membuffer_write_int32(buf,udta_size + 8 + new_meta_size); + membuffer_write_atom_name(buf,"udta"); + membuffer_transfer_from_file(buf,f,udta_size); + + membuffer_write_atom(buf,"meta",new_meta_size,new_meta_buffer); + free(new_meta_buffer); + + *out_size = membuffer_get_size(buf); + *out_buffer = membuffer_detach(buf); + membuffer_free(buf); + return 1; + } + meta_offset = mp4ff_position(f); + meta_size = mp4ff_read_int32(f); + if (!find_atom(f,meta_offset+12,meta_size-12,"ilst")) return 0;//shouldn't happen, find_atom_v2 above takes care of it + ilst_offset = mp4ff_position(f); + ilst_size = mp4ff_read_int32(f); + + if (!create_ilst(data,&new_ilst_buffer,&new_ilst_size)) return 0; + + size_delta = new_ilst_size - (ilst_size - 8); + + *out_size = total_size + size_delta; + *out_buffer = malloc(*out_size); + if (*out_buffer == 0) + { + free(new_ilst_buffer); + return 0; + } + + p_out = (uint8_t*)*out_buffer; + + mp4ff_set_position(f,total_base); + mp4ff_read_data(f,p_out,(uint32_t)(udta_offset - total_base )); p_out += (uint32_t)(udta_offset - total_base ); + *(uint32_t*)p_out = fix_byte_order_32(mp4ff_read_int32(f) + size_delta); p_out += 4; + mp4ff_read_data(f,p_out,4); p_out += 4; + mp4ff_read_data(f,p_out,(uint32_t)(meta_offset - udta_offset - 8)); p_out += (uint32_t)(meta_offset - udta_offset - 8); + *(uint32_t*)p_out = fix_byte_order_32(mp4ff_read_int32(f) + size_delta); p_out += 4; + mp4ff_read_data(f,p_out,4); p_out += 4; + mp4ff_read_data(f,p_out,(uint32_t)(ilst_offset - meta_offset - 8)); p_out += (uint32_t)(ilst_offset - meta_offset - 8); + *(uint32_t*)p_out = fix_byte_order_32(mp4ff_read_int32(f) + size_delta); p_out += 4; + mp4ff_read_data(f,p_out,4); p_out += 4; + + memcpy(p_out,new_ilst_buffer,new_ilst_size); + p_out += new_ilst_size; + + mp4ff_set_position(f,ilst_offset + ilst_size); + mp4ff_read_data(f,p_out,(uint32_t)(total_size - (ilst_offset - total_base) - ilst_size)); + + free(new_ilst_buffer); + } + return 1; + +} + +int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data) +{ + void * new_moov_data; + uint32_t new_moov_size; + + mp4ff_t *ff = malloc(sizeof(mp4ff_t)); + + memset(ff, 0, sizeof(mp4ff_t)); + ff->stream = f; + mp4ff_set_position(ff,0); + + parse_atoms(ff,1); + + + if (!modify_moov(ff,data,&new_moov_data,&new_moov_size)) + { + mp4ff_close(ff); + return 0; + } + + /* copy moov atom to end of the file */ + if (ff->last_atom != ATOM_MOOV) + { + char *free_data = "free"; + + /* rename old moov to free */ + mp4ff_set_position(ff, ff->moov_offset + 4); + mp4ff_write_data(ff, free_data, 4); + + mp4ff_set_position(ff, ff->file_size); + mp4ff_write_int32(ff,new_moov_size + 8); + mp4ff_write_data(ff,"moov",4); + mp4ff_write_data(ff, new_moov_data, new_moov_size); + } + else + { + mp4ff_set_position(ff, ff->moov_offset); + mp4ff_write_int32(ff,new_moov_size + 8); + mp4ff_write_data(ff,"moov",4); + mp4ff_write_data(ff, new_moov_data, new_moov_size); + } + + mp4ff_truncate(ff); + + mp4ff_close(ff); + return 1; +} +#endif diff --git a/src/contrib/aacdecoder/mp4util.c b/src/contrib/aacdecoder/mp4ff/mp4util.c old mode 100644 new mode 100755 similarity index 89% rename from src/contrib/aacdecoder/mp4util.c rename to src/contrib/aacdecoder/mp4ff/mp4util.c index 1e4845b36..24d89c7b0 --- a/src/contrib/aacdecoder/mp4util.c +++ b/src/contrib/aacdecoder/mp4ff/mp4util.c @@ -1,188 +1,191 @@ -/* -** 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: mp4util.c,v 1.1 2005/07/22 01:14:52 twistedddx Exp $ -**/ - -#include "mp4ffint.h" -#include - -int32_t mp4ff_read_data(mp4ff_t *f, int8_t *data, uint32_t size) -{ - int32_t result = 1; - - result = f->stream->read(f->stream->user_data, data, size); - - f->current_position += size; - - return result; -} - -int32_t mp4ff_truncate(mp4ff_t * f) -{ - return f->stream->truncate(f->stream->user_data); -} - -int32_t mp4ff_write_data(mp4ff_t *f, int8_t *data, uint32_t size) -{ - int32_t result = 1; - - result = f->stream->write(f->stream->user_data, data, size); - - f->current_position += size; - - return result; -} - -int32_t mp4ff_write_int32(mp4ff_t *f,const uint32_t data) -{ - uint32_t result; - uint32_t a, b, c, d; - int8_t temp[4]; - - *(uint32_t*)temp = data; - a = (uint8_t)temp[0]; - b = (uint8_t)temp[1]; - c = (uint8_t)temp[2]; - d = (uint8_t)temp[3]; - - result = (a<<24) | (b<<16) | (c<<8) | d; - - return mp4ff_write_data(f,(uint8_t*)&result,sizeof(result)); -} - -int32_t mp4ff_set_position(mp4ff_t *f, const int64_t position) -{ - f->stream->seek(f->stream->user_data, position); - f->current_position = position; - - return 0; -} - -int64_t mp4ff_position(const mp4ff_t *f) -{ - return f->current_position; -} - -uint64_t mp4ff_read_int64(mp4ff_t *f) -{ - uint8_t data[8]; - uint64_t result = 0; - int8_t i; - - mp4ff_read_data(f, data, 8); - - for (i = 0; i < 8; i++) - { - result |= ((uint64_t)data[i]) << ((7 - i) * 8); - } - - return result; -} - -uint32_t mp4ff_read_int32(mp4ff_t *f) -{ - uint32_t result; - uint32_t a, b, c, d; - int8_t data[4]; - - mp4ff_read_data(f, data, 4); - a = (uint8_t)data[0]; - b = (uint8_t)data[1]; - c = (uint8_t)data[2]; - d = (uint8_t)data[3]; - - result = (a<<24) | (b<<16) | (c<<8) | d; - return (uint32_t)result; -} - -uint32_t mp4ff_read_int24(mp4ff_t *f) -{ - uint32_t result; - uint32_t a, b, c; - int8_t data[4]; - - mp4ff_read_data(f, data, 3); - a = (uint8_t)data[0]; - b = (uint8_t)data[1]; - c = (uint8_t)data[2]; - - result = (a<<16) | (b<<8) | c; - return (uint32_t)result; -} - -uint16_t mp4ff_read_int16(mp4ff_t *f) -{ - uint32_t result; - uint32_t a, b; - int8_t data[2]; - - mp4ff_read_data(f, data, 2); - a = (uint8_t)data[0]; - b = (uint8_t)data[1]; - - result = (a<<8) | b; - return (uint16_t)result; -} - -char * mp4ff_read_string(mp4ff_t * f,uint32_t length) -{ - char * str = (char*)malloc(length + 1); - if (str!=0) - { - if ((uint32_t)mp4ff_read_data(f,str,length)!=length) - { - free(str); - str = 0; - } - else - { - str[length] = 0; - } - } - return str; -} - -uint8_t mp4ff_read_char(mp4ff_t *f) -{ - uint8_t output; - mp4ff_read_data(f, &output, 1); - return output; -} - -uint32_t mp4ff_read_mp4_descr_length(mp4ff_t *f) -{ - uint8_t b; - uint8_t numBytes = 0; - uint32_t length = 0; - - do - { - b = mp4ff_read_char(f); - numBytes++; - length = (length << 7) | (b & 0x7F); - } while ((b & 0x80) && numBytes < 4); - - return length; -} +/* +** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding +** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +** +** Any non-GPL usage of this software or parts of this software is strictly +** forbidden. +** +** The "appropriate copyright message" mentioned in section 2c of the GPLv2 +** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" +** +** Commercial non-GPL licensing of this software is possible. +** For more info contact Nero AG through Mpeg4AAClicense@nero.com. +** +** $Id: mp4util.c,v 1.20 2007/11/01 12:33:29 menno Exp $ +**/ + +#include "mp4ffint.h" +#include + +int32_t mp4ff_read_data(mp4ff_t *f, int8_t *data, uint32_t size) +{ + int32_t result = 1; + + result = f->stream->read(f->stream->user_data, data, size); + + f->current_position += size; + + return result; +} + +int32_t mp4ff_truncate(mp4ff_t * f) +{ + return f->stream->truncate(f->stream->user_data); +} + +int32_t mp4ff_write_data(mp4ff_t *f, int8_t *data, uint32_t size) +{ + int32_t result = 1; + + result = f->stream->write(f->stream->user_data, data, size); + + f->current_position += size; + + return result; +} + +int32_t mp4ff_write_int32(mp4ff_t *f,const uint32_t data) +{ + uint32_t result; + uint32_t a, b, c, d; + int8_t temp[4]; + + *(uint32_t*)temp = data; + a = (uint8_t)temp[0]; + b = (uint8_t)temp[1]; + c = (uint8_t)temp[2]; + d = (uint8_t)temp[3]; + + result = (a<<24) | (b<<16) | (c<<8) | d; + + return mp4ff_write_data(f,(uint8_t*)&result,sizeof(result)); +} + +int32_t mp4ff_set_position(mp4ff_t *f, const int64_t position) +{ + f->stream->seek(f->stream->user_data, position); + f->current_position = position; + + return 0; +} + +int64_t mp4ff_position(const mp4ff_t *f) +{ + return f->current_position; +} + +uint64_t mp4ff_read_int64(mp4ff_t *f) +{ + uint8_t data[8]; + uint64_t result = 0; + int8_t i; + + mp4ff_read_data(f, data, 8); + + for (i = 0; i < 8; i++) + { + result |= ((uint64_t)data[i]) << ((7 - i) * 8); + } + + return result; +} + +uint32_t mp4ff_read_int32(mp4ff_t *f) +{ + uint32_t result; + uint32_t a, b, c, d; + int8_t data[4]; + + mp4ff_read_data(f, data, 4); + a = (uint8_t)data[0]; + b = (uint8_t)data[1]; + c = (uint8_t)data[2]; + d = (uint8_t)data[3]; + + result = (a<<24) | (b<<16) | (c<<8) | d; + return (uint32_t)result; +} + +uint32_t mp4ff_read_int24(mp4ff_t *f) +{ + uint32_t result; + uint32_t a, b, c; + int8_t data[4]; + + mp4ff_read_data(f, data, 3); + a = (uint8_t)data[0]; + b = (uint8_t)data[1]; + c = (uint8_t)data[2]; + + result = (a<<16) | (b<<8) | c; + return (uint32_t)result; +} + +uint16_t mp4ff_read_int16(mp4ff_t *f) +{ + uint32_t result; + uint32_t a, b; + int8_t data[2]; + + mp4ff_read_data(f, data, 2); + a = (uint8_t)data[0]; + b = (uint8_t)data[1]; + + result = (a<<8) | b; + return (uint16_t)result; +} + +char * mp4ff_read_string(mp4ff_t * f,uint32_t length) +{ + char * str = (char*)malloc(length + 1); + if (str!=0) + { + if ((uint32_t)mp4ff_read_data(f,str,length)!=length) + { + free(str); + str = 0; + } + else + { + str[length] = 0; + } + } + return str; +} + +uint8_t mp4ff_read_char(mp4ff_t *f) +{ + uint8_t output; + mp4ff_read_data(f, &output, 1); + return output; +} + +uint32_t mp4ff_read_mp4_descr_length(mp4ff_t *f) +{ + uint8_t b; + uint8_t numBytes = 0; + uint32_t length = 0; + + do + { + b = mp4ff_read_char(f); + numBytes++; + length = (length << 7) | (b & 0x7F); + } while ((b & 0x80) && numBytes < 4); + + return length; +} diff --git a/src/contrib/aacdecoder/mp4ff_int_types.h b/src/contrib/aacdecoder/mp4ff_int_types.h deleted file mode 100644 index e924c00b7..000000000 --- a/src/contrib/aacdecoder/mp4ff_int_types.h +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef _MP4FF_INT_TYPES_H_ -#define _MP4FF_INT_TYPES_H_ - -#ifdef _WIN32 - -typedef char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; -typedef unsigned short uint16_t; -typedef long int32_t; -typedef unsigned long uint32_t; - -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; - -#else - -#include - -#endif - - -#endif \ No newline at end of file diff --git a/src/contrib/aacdecoder/neaacdec.h b/src/contrib/aacdecoder/neaacdec.h index a9a3ff5da..ac665453b 100644 --- a/src/contrib/aacdecoder/neaacdec.h +++ b/src/contrib/aacdecoder/neaacdec.h @@ -33,7 +33,7 @@ extern "C" { #endif /* __cplusplus */ -#if 1 +#if 0 /* MACROS FOR BACKWARDS COMPATIBILITY */ /* structs */ #define NeAACDecHandle faacDecHandle diff --git a/src/contrib/aacdecoder/stdafx.cpp b/src/contrib/aacdecoder/stdafx.cpp index 28b3fef26..1577c4e3b 100644 --- a/src/contrib/aacdecoder/stdafx.cpp +++ b/src/contrib/aacdecoder/stdafx.cpp @@ -1,8 +1 @@ -// stdafx.cpp : source file that includes just the standard includes -// ID3InfoManager.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -// TODO: reference any additional headers you need in STDAFX.H -// and not in this file +#include "stdafx.h" \ No newline at end of file diff --git a/src/contrib/aacdecoder/stdafx.h b/src/contrib/aacdecoder/stdafx.h index ccd178937..e558c2480 100644 --- a/src/contrib/aacdecoder/stdafx.h +++ b/src/contrib/aacdecoder/stdafx.h @@ -1,10 +1,2 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - #pragma once - -#include - -//#include "vld/vld.h" +#include \ No newline at end of file diff --git a/src/contrib/mpg123decoder/mpg123decoder.vcxproj b/src/contrib/mpg123decoder/mpg123decoder.vcxproj index 117944938..96ee422b7 100755 --- a/src/contrib/mpg123decoder/mpg123decoder.vcxproj +++ b/src/contrib/mpg123decoder/mpg123decoder.vcxproj @@ -43,14 +43,14 @@ $(SolutionDir)\bin\$(Configuration)\plugins\ - $(SolutionDir)/obj/$(Configuration)\ + ./obj/$(Configuration)\ MinimumRecommendedRules.ruleset $(SolutionDir)\bin\$(Configuration)\plugins\ - $(SolutionDir)/obj/$(Configuration)\ + ./obj/$(Configuration)\ MinimumRecommendedRules.ruleset diff --git a/src/contrib/oggdecoder/oggdecoder_plugin.cpp b/src/contrib/oggdecoder/oggdecoder_plugin.cpp index 787fe6fd0..ff2be5b79 100644 --- a/src/contrib/oggdecoder/oggdecoder_plugin.cpp +++ b/src/contrib/oggdecoder/oggdecoder_plugin.cpp @@ -35,9 +35,7 @@ ////////////////////////////////////////////////////////////////////////////// #include "stdafx.h" - #include - #include "OggDecoderFactory.h" #ifdef WIN32 diff --git a/src/contrib/taglib_plugin/TaglibMetadataReader.cpp b/src/contrib/taglib_plugin/TaglibMetadataReader.cpp index 34cea4e2a..66fdc390e 100644 --- a/src/contrib/taglib_plugin/TaglibMetadataReader.cpp +++ b/src/contrib/taglib_plugin/TaglibMetadataReader.cpp @@ -50,6 +50,7 @@ #include #include #include + #include #include #include #else @@ -66,6 +67,7 @@ #include #include #include + #include #include #include #endif @@ -105,6 +107,8 @@ bool TaglibMetadataReader::CanRead(const char *extension){ return ext.compare("mp3") == 0 || ext.compare("ogg") == 0 || + ext.compare("aac") == 0 || + ext.compare("m4a") == 0 || ext.compare("flac") == 0 || ext.compare("ape") == 0 || ext.compare("mpc") == 0; diff --git a/src/core/core.vcxproj b/src/core/core.vcxproj index 92236e4e4..d91de346d 100755 --- a/src/core/core.vcxproj +++ b/src/core/core.vcxproj @@ -167,6 +167,9 @@ false + + + diff --git a/src/core/core.vcxproj.filters b/src/core/core.vcxproj.filters index 8427b9c81..1439a0e7a 100755 --- a/src/core/core.vcxproj.filters +++ b/src/core/core.vcxproj.filters @@ -256,4 +256,7 @@ src\library + + + \ No newline at end of file