pax_global_header00006660000000000000000000000064147615362360014527gustar00rootroot0000000000000052 comment=673a22a3c7c33e96e2ff7aae7c4d2bc190dfbf92 faad2-2.11.2/000077500000000000000000000000001476153623600125675ustar00rootroot00000000000000faad2-2.11.2/.bazelrc000066400000000000000000000020021476153623600142040ustar00rootroot00000000000000# Force the use of Clang for C++ builds. build --action_env=CC=clang build --action_env=CXX=clang++ # Define the --config=asan-libfuzzer configuration. build:asan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine=@rules_fuzzing//fuzzing/engines:libfuzzer build:asan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_instrumentation=libfuzzer build:asan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_sanitizer=asan # Define the --config=msan-libfuzzer configuration. build:msan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine=@rules_fuzzing//fuzzing/engines:libfuzzer build:msan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_instrumentation=libfuzzer build:msan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_sanitizer=msan # Define the --config=ubsan-libfuzzer configuration. build:ubsan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine=@rules_fuzzing//fuzzing/engines:libfuzzer build:ubsan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_instrumentation=libfuzzer build:ubsan-libfuzzer --@rules_fuzzing//fuzzing:cc_engine_sanitizer=ubsan faad2-2.11.2/.github/000077500000000000000000000000001476153623600141275ustar00rootroot00000000000000faad2-2.11.2/.github/workflows/000077500000000000000000000000001476153623600161645ustar00rootroot00000000000000faad2-2.11.2/.github/workflows/build.yaml000066400000000000000000000106431476153623600201530ustar00rootroot00000000000000# 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. name: Build on: push: branches: [master] pull_request: types: [opened, reopened, labeled, synchronize] concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: BuildWithBazel: runs-on: ubuntu-latest strategy: fail-fast: false steps: - name: Checkout the source uses: actions/checkout@v4 with: submodules: false fetch-depth: 1 - name: Configure and build run: | bazel build :all BuildWithCMake: runs-on: ${{ matrix.os || 'ubuntu-latest' }} strategy: fail-fast: false matrix: include: - name: Clang Shared cc: clang cxx: clang++ cflags: -Wall -fcolor-diagnostics -fansi-escape-codes shared: 'true' - name: Clang Static cc: clang cxx: clang++ cflags: -Wall -fcolor-diagnostics -fansi-escape-codes -O2 -Werror=strict-aliasing - name: GCC Static cc: gcc cxx: g++ cflags: -Wall -fdiagnostics-color=always -O2 -Werror=strict-aliasing - name: MSVC os: windows-latest cmake_args: >- -G "Visual Studio 17 2022" -A x64 cmake_build_options: >- --config Release - name: OSX os: macos-latest env: CC: ${{ matrix.cc || 'cc' }} CXX: ${{ matrix.cxx || 'cxx' }} CFLAGS: ${{ matrix.cflags || '-Wall' }} CXXFLAGS: ${{ matrix.cflags || '-Wall' }} SHARED: ${{ matrix.shared || 'false' }} steps: - name: Checkout the source uses: actions/checkout@v4 with: submodules: false fetch-depth: 1 - name: Configure and build shell: bash run: | export NUM_CORES=`nproc || getconf _NPROCESSORS_ONLN` cmake -B build . \ -DCMAKE_INSTALL_PREFIX=$RUNNER_TEMP/usrlocal \ -DBUILD_SHARED_LIBS=${SHARED} \ ${{ matrix.cmake_args }} cmake --build build -j ${NUM_CORES} ${{ matrix.cmake_build_options || '' }} cmake --install build BuildOnMsys: name: BuildOnMsys (${{ matrix.msystem }}) runs-on: windows-latest strategy: fail-fast: false matrix: include: - msystem: mingw64 - msystem: clang64 - msystem: ucrt64 - msystem: mingw32 defaults: run: shell: msys2 {0} steps: - name: Checkout the source uses: actions/checkout@v4 with: submodules: false fetch-depth: 1 - uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.msystem }} update: true path-type: inherit install: >- base-devel pacboy: >- cmake:p - name: Configure and build run: | mkdir -p temp cmake -B build . \ -DCMAKE_INSTALL_PREFIX=$(realpath temp) \ -DBUILD_SHARED_LIBS='true' cmake --build build -j `nproc` cmake --install build - name: Upload artifacts (Windows) uses: actions/upload-artifact@v4 if: runner.os == 'Windows' with: name: faad2-${{ github.sha }}-${{ matrix.msystem }} path: temp faad2-2.11.2/.github/workflows/fuzz.yaml000066400000000000000000000044561476153623600200570ustar00rootroot00000000000000# 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. name: OSS-Fuzz on: push: branches: [master] pull_request: types: [opened, reopened, labeled, synchronize] concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: Fuzzing: runs-on: ubuntu-latest strategy: fail-fast: false matrix: sanitizer: [address, undefined, memory] steps: - name: Build Fuzzers (${{ matrix.sanitizer }}) id: build uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master with: oss-fuzz-project-name: 'faad2' language: c sanitizer: ${{ matrix.sanitizer }} - name: Run Fuzzers (${{ matrix.sanitizer }}) uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master with: oss-fuzz-project-name: 'faad' language: c sanitizer: ${{ matrix.sanitizer }} fuzz-seconds: 600 - name: Upload Crash uses: actions/upload-artifact@v3 if: failure() && steps.build.outcome == 'success' with: name: ${{ matrix.sanitizer }}-artifacts path: ./out/artifacts faad2-2.11.2/.gitignore000066400000000000000000000000101476153623600145460ustar00rootroot00000000000000bazel-* faad2-2.11.2/AUTHORS000066400000000000000000000004701476153623600136400ustar00rootroot00000000000000 M. Bakker (mbakker(at)nero.com) - complete library Alexander Kurpiers (a.kurpiers(at)nt.tu-darmstadt.de) - HCR code - DRM stuff - lot's of bug fixes Volker Fischer (v.fischer(at)nt.tu-darmstadt.de) - DRM code - lot's of bug fixes Gian-Carlo Pascutto (gpascutto(at)nero.com) - DRM PS code - bugfixes faad2-2.11.2/BUILD.bazel000066400000000000000000000037031476153623600144500ustar00rootroot00000000000000load("@rules_fuzzing//fuzzing:cc_defs.bzl", "cc_fuzz_test") load("@properties//:properties.bzl", "PROPERTIES") # Unless building for embedded systems all headers / functions should exist. FAAD_DEFINES = [ "APPLY_DRC", "HAVE_INTTYPES_H=1", "HAVE_MEMCPY=1", "HAVE_STRING_H=1", "HAVE_STRINGS_H=1", "HAVE_SYS_STAT_H=1", "HAVE_SYS_TYPES_H=1", "PACKAGE_VERSION=\\\"%s\\\"" % PROPERTIES["PACKAGE_VERSION"], ] FAAD_SOURCES = glob([ "libfaad/**/*.c", "libfaad/**/*.h", ]) FAAD_FLAGS = [ "-Wall", "-pedantic", ] DRM_AFFIX = [ "", "_drm", ] DRM_DEFINES = [ [], ["DRM_SUPPORT"], ] FIXED_AFFIX = [ "", "_fixed", ] FIXED_DEFINES = [ [], ["FIXED_POINT"], ] [cc_library( name = "faad" + DRM_AFFIX[drm] + FIXED_AFFIX[fixed], srcs = FAAD_SOURCES, hdrs = ["include/neaacdec.h"], copts = FAAD_FLAGS, includes = ["libfaad"], local_defines = FAAD_DEFINES + DRM_DEFINES[drm] + FIXED_DEFINES[fixed], strip_include_prefix = "include", ) for drm in range(2) for fixed in range(2)] # To start fuzzing run: bazel run --config=asan-libfuzzer //:fuzz_config_run cc_fuzz_test( name = "fuzz_config", srcs = ["fuzz/fuzz_config.c"], deps = [":faad"], ) # To start fuzzing run: bazel run --config=asan-libfuzzer //:fuzz_decode_run [cc_fuzz_test( name = "fuzz_decode" + DRM_AFFIX[drm] + FIXED_AFFIX[fixed], srcs = ["fuzz/fuzz_decode.c"], local_defines = DRM_DEFINES[drm], deps = [":faad" + DRM_AFFIX[drm] + FIXED_AFFIX[fixed]], ) for drm in range(2) for fixed in range(2)] CLI_SOURCES = glob(["frontend/**/*.c", "frontend/**/*.h"], exclude = ["frontend/**/getopt.*"]) [cc_binary( name = "faad_cli" + DRM_AFFIX[drm] + FIXED_AFFIX[fixed], srcs = CLI_SOURCES, includes = ["frontend"], local_defines = FAAD_DEFINES + DRM_DEFINES[drm] + FIXED_DEFINES[fixed], deps = [":faad" + DRM_AFFIX[drm] + FIXED_AFFIX[fixed]], ) for drm in range(2) for fixed in range(2)] faad2-2.11.2/CMakeLists.txt000066400000000000000000000215121476153623600153300ustar00rootroot00000000000000# Available CMake versions: # - Ubuntu 20.04 LTS : 3.16.3 # - Solaris 11.4 SRU 15 : 3.15 cmake_minimum_required(VERSION 3.15) include(CheckLibraryExists) include(CheckSymbolExists) project(LIBFAAD2 LANGUAGES C) # Set a default build type if none was specified set(default_build_type "RelWithDebInfo") if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to '${default_build_type}' as none was specified.") set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE STRING "Choose the type of build." FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() # If FAAD is being bundled in another project, we don't want to # install anything. However, we want to let people override this, so # we'll use the FAAD_BUNDLED_MODE variable to let them do that; just # set it to OFF in your project before you add_subdirectory(faad2). get_directory_property(FAAD_PARENT_DIRECTORY PARENT_DIRECTORY) if(NOT DEFINED FAAD_BUNDLED_MODE) # Bundled mode hasn't been set one way or the other, set the default # depending on whether or not we are the top-level project. if(FAAD_PARENT_DIRECTORY) set(FAAD_BUNDLED_MODE ON) if(NOT DEFINED BUILD_SHARED_LIBS) set(BUILD_SHARED_LIBS OFF) endif() else() set(FAAD_BUNDLED_MODE OFF) if(NOT DEFINED BUILD_SHARED_LIBS) set(BUILD_SHARED_LIBS ON) endif() endif() endif() mark_as_advanced(FAAD_BUNDLED_MODE) if(BUILD_SHARED_LIBS) if(NOT DEFINED CMAKE_C_VISIBILITY_PRESET) set(CMAKE_C_VISIBILITY_PRESET hidden) endif() if (WIN32 AND NOT DEFINED CMAKE_DLL_NAME_WITH_SOVERSION) set(CMAKE_DLL_NAME_WITH_SOVERSION ON) endif() endif() find_library(MATH_LIBRARY m) include(GNUInstallDirs) if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(CMAKE_MACOS_RPATH TRUE) set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib") endif() # Extract version information set(CAPTURE_PACKAGE_VERSION "[ \\t]*\"PACKAGE_VERSION\"[ \\t]*:[ \\t]\"(.*)\"") file(STRINGS "properties.json" _faad_version_line REGEX "${CAPTURE_PACKAGE_VERSION}") string(REGEX REPLACE "${CAPTURE_PACKAGE_VERSION}" "\\1" FAAD_VERSION "${_faad_version_line}") string(REPLACE "\." ";" FAAD_VERSION_PARTS ${FAAD_VERSION}) list(GET FAAD_VERSION_PARTS 0 FAAD_VERSION_MAJOR) list(GET FAAD_VERSION_PARTS 1 FAAD_VERSION_MINOR) list(GET FAAD_VERSION_PARTS 2 FAAD_VERSION_PATCH) # Semantic -> library version # NB(eustas): likely that will be always OK; if not, we could read "overrides" from properties.json math(EXPR FAAD_ABI_VERSION_CURRENT "${FAAD_VERSION_MAJOR} + ${FAAD_VERSION_MINOR}") set(FAAD_ABI_VERSION_AGE "${FAAD_VERSION_MINOR}") set(FAAD_ABI_VERSION_REVISION "${FAAD_VERSION_PATCH}") set(FAAD_ABI_COMPATIBILITY "${FAAD_VERSION_MAJOR}") message(STATUS "FAAD PACKAGE_VERSION: ${FAAD_VERSION}") mark_as_advanced(FAAD_VERSION FAAD_ABI_COMPATIBILITY FAAD_ABI_VERSION_AGE FAAD_ABI_VERSION_REVISION) file(READ include/faad.h.in FAAD_H_SRC) string(REGEX REPLACE "@VERSION@" "${FAAD_VERSION}" FAAD_H_SRC ${FAAD_H_SRC}) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/include/faad.h ${FAAD_H_SRC}) # Read sources list file(GLOB_RECURSE LIBFAAD_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} libfaad/*.c libfaad/*.h) mark_as_advanced(LIBFAAD_SOURCES) file(GLOB_RECURSE FAAD_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} frontend/*.c frontend/*.h) if (NOT MSVC) list(FILTER FAAD_SOURCES EXCLUDE REGEX ".*getopt\\.[ch]$") endif() # Build # Lets stick to predefined config, until more flexibility is actually requested. set(FAAD_DEFINES HAVE_INTTYPES_H=1 HAVE_MEMCPY=1 HAVE_STRING_H=1 HAVE_STRINGS_H=1 HAVE_SYS_STAT_H=1 HAVE_SYS_TYPES_H=1 PACKAGE_VERSION=\"${FAAD_VERSION}\" ) option(FAAD_APPLY_DRC "Apply dynamic range control" ON) if(FAAD_APPLY_DRC) list(APPEND FAAD_DEFINES APPLY_DRC ) endif() check_library_exists(m lrintf "" HAVE_LIBM) if(HAVE_LIBM) list(APPEND CMAKE_REQUIRED_LIBRARIES m) endif() check_symbol_exists(lrintf "math.h" HAVE_LRINTF) if(HAVE_LRINTF) list(APPEND FAAD_DEFINES HAVE_LRINTF=1 ) endif() set(FAAD_FLAGS -Wall ) if(MSVC) list(APPEND FAAD_FLAGS /wd4702 # unreachable code; there is a false-positive report /wd4820 # implicit padding in structs /wd5045 # Spectre nonsense ) else() list(APPEND FAAD_FLAGS -pedantic ) endif() if(CMAKE_C_COMPILER_ID MATCHES "GNU") list(APPEND FAAD_FLAGS -ffloat-store) endif() # GCC file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/include/neaacdec.h DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/include) foreach(LIB faad faad_drm faad_fixed faad_drm_fixed) add_library(${LIB} ${LIBFAAD_SOURCES}) if(MATH_LIBRARY) target_link_libraries(${LIB} PUBLIC ${MATH_LIBRARY}) endif() target_include_directories(${LIB} PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include ) target_include_directories(${LIB} PRIVATE libfaad ) target_compile_definitions(${LIB} PRIVATE ${FAAD_DEFINES} ) target_compile_options(${LIB} PRIVATE ${FAAD_FLAGS} ) endforeach() foreach(LIB faad_drm faad_drm_fixed) target_compile_definitions(${LIB} PRIVATE DRM_SUPPORT ) endforeach() foreach(LIB faad_fixed faad_drm_fixed) target_compile_definitions(${LIB} PRIVATE FIXED_POINT ) endforeach() # Generate a pkg-config files function(generate_pkg_config_path outvar path) string(LENGTH "${path}" path_length) set(path_args ${ARGV}) list(REMOVE_AT path_args 0 1) list(LENGTH path_args path_args_remaining) set("${outvar}" "${path}") while(path_args_remaining GREATER 1) list(GET path_args 0 name) list(GET path_args 1 value) get_filename_component(value_full "${value}" ABSOLUTE) string(LENGTH "${value}" value_length) if(path_length EQUAL value_length AND path STREQUAL value) set("${outvar}" "\${${name}}") break() elseif(path_length GREATER value_length) # We might be in a subdirectory of the value, but we have to be # careful about a prefix matching but not being a subdirectory # (for example, /usr/lib64 is not a subdirectory of /usr/lib). # We'll do this by making sure the next character is a directory # separator. string(SUBSTRING "${path}" ${value_length} 1 sep) if(sep STREQUAL "/") string(SUBSTRING "${path}" 0 ${value_length} s) if(s STREQUAL value) string(SUBSTRING "${path}" "${value_length}" -1 suffix) set("${outvar}" "\${${name}}${suffix}") break() endif() endif() endif() list(REMOVE_AT path_args 0 1) list(LENGTH path_args path_args_remaining) endwhile() set("${outvar}" "${${outvar}}" PARENT_SCOPE) endfunction(generate_pkg_config_path) function(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION) file(READ ${INPUT_FILE} TEXT) set(PREFIX "${CMAKE_INSTALL_PREFIX}") string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT}) string(REGEX REPLACE "@exec_prefix@" "\${prefix}" TEXT ${TEXT}) generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" exec_prefix "${PREFIX}") string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT}) generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}") string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT}) string(REGEX REPLACE "@VERSION@" "${VERSION}" TEXT ${TEXT}) file(WRITE ${OUTPUT_FILE} ${TEXT}) endfunction() transform_pc_file("libfaad/faad2.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/faad2.pc" "${FAAD_VERSION}") foreach(LIB faad faad_drm faad_fixed faad_drm_fixed) set_target_properties(${LIB} PROPERTIES VERSION "${FAAD_ABI_COMPATIBILITY}.${FAAD_ABI_VERSION_AGE}.${FAAD_ABI_VERSION_REVISION}" SOVERSION "${FAAD_ABI_COMPATIBILITY}" ) endforeach() # CLI option(FAAD_BUILD_CLI "Build faad_cli executable" ON) if (FAAD_BUILD_CLI) add_executable(faad_cli ${FAAD_SOURCES}) target_link_libraries(faad_cli faad) target_compile_definitions(faad_cli PRIVATE ${FAAD_DEFINES}) target_compile_options(faad_cli PRIVATE ${FAAD_FLAGS}) if (MSVC) target_include_directories(faad_cli PRIVATE frontend ) else() set_target_properties(faad_cli PROPERTIES OUTPUT_NAME faad) endif() endif() # Installation if(NOT FAAD_BUNDLED_MODE) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/faad2.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") set(INSTALL_TARGETS faad faad_drm) if (FAAD_BUILD_CLI) list(APPEND INSTALL_TARGETS faad_cli) endif() install( TARGETS ${INSTALL_TARGETS} ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ) # exclude faad.h.in install( FILES ${CMAKE_CURRENT_BINARY_DIR}/include/faad.h FILES ${CMAKE_CURRENT_BINARY_DIR}/include/neaacdec.h DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ) install( FILES frontend/faad.man DESTINATION ${CMAKE_INSTALL_MANDIR}/man1 RENAME faad.1 ) endif() # FAAD_BUNDLED_MODE faad2-2.11.2/COPYING000066400000000000000000000435401476153623600136300ustar00rootroot00000000000000 Any non-GPL usage of this software or parts of this software is strictly forbidden. Commercial non-GPL licensing of this software is possible. For more info contact Ahead Software through Mpeg4AAClicense@nero.com. GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19yy name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. faad2-2.11.2/ChangeLog000066400000000000000000000172271476153623600143520ustar00rootroot000000000000002.11.2 (2025-03-04): [ Armin Novak ] * Add option BUILD_FAAD_CLI [ Johannes Kauffmann ] * Add conditional build with DRC [ Roman Artiukhin ] * Use adts_frame for adts header detection [ gavtroy ] * Fix gapless calculation in frontend [ DingHao ] * Fix write_audio_* function heap buffer overflow 2.11.1 (2023-11-14): [ Fabian Greffrath ] * Build shared libraries and hide symbols by default. * Install man page by default. * Check for `lrintf()` availability, link with `-lm` and define `HAVE_LRINTF` accordingly. * Set a default build type if none was specified. * Build DLL name with SOVERSION by default on Windows. * Fix inlined `lrintf()` function signatures. 2.11.0 (2023-11-07): [ Eugène Filin ] * Fix incorrect variable initialization [ Eugene Kliuchnikov ] * CI/CD, build, etc - setup GitHub workflows; test build under MSVC, OSX, MSYS2, Linux - add CMake build system - additionally add Bazel build - remove automake and MSVC project files - add fuzzers that cover almost all decoder code - setup fuzzing for various builds: (no-)FIXED_POINT / (no-)DRM - remove dead code - address differes compilers warnings - move version to distingished place that different build systems can read * "Safe" bugs "Safe" means that it is unlikely to be exploited; those affect the decoded result for (most likely) extreme inputs. Some fixes are useful only for "FIXED_POINT" build, since it has more restrictions on intermediate values. - "negative range" in estimate_current_envelope - integer overflow in channel downmixing - integer overflow in estimate_envelope - integer overflows caused by "practical infinite" gain - integer overflows in HF adjustment code - several "left shift of negative value" - priming RNG to avoid using values that does not look random at all - do not drop the first frame of output; other decoders don't do this - touching uninitialized values in lt_update_state - touching uninitialized values in bit-reader buffers * "Almost Safe" bugs "Almost safe" means that those are unlinkly to be exploited; if those surface depends on build options / environment. - division by zero in HF (noise?) generator and scale factor adjustment - division by zero gen_rand_vector * "Unsafe" bugs "Unsafe" means that those can cause crash, or could somehow else be exploited. - CLI: accessing unallocated memory in mp4info (corrupted / zero-samples input) (CVE-2023-38857) - CLI: out-of-bounds when parsing mp4 header - CLI: crash because of wrong mp4 frame offset calculation (CVE-2023-38857) - error handling rvlc_decode_scale_factors (CPU bomb?) - null pointer dereference (in DRM + PS build) - index-out-of-bounds / stack-buffer-overflow in decode_sce_lfe (for streams with PCE) - stack-buffer-overflow in pns_decode - null pointer derefernce (when channels change their type in the middle of the stream) - infinite loop on currupted stream - add practial limits for scale factors; otherwise calculated NaN/Inf values could confuse further logic, resulting in access-out-of-bounds - check sf_index in window_grouping_info to avoid access-out-of-bounds - clamp bs_pointer values to avoid access-out-of-bounds - infinite loop in fill_element - sanitize input values in ps_mix_phase to avoid access-out-of-bounds - fix internal decoder buffer size calculation to avoid heap-out-of-bounds - calculate channel length multiplier even if main channel is already allocated to avoid heap-out-of-bounds - reserve enough slots for channels in decode_sce_lfe to avoid heap-out-of-bounds [ David Korczynski ] * Fuzzing integration with oss-fuzz [ Steveice10 ] * Add define option to disable SBR/PS support * Fix coefficient table selection in tns_decode_coef 2.10.1 (2022-10-20): [David Korczynski] * Reject buffers of zero size. [François Cartegnie] * Fix 7.1 with PCE mapping. * Have proper version string in `faad.h`. * Add conditional build with DRC. 2.10.0 (2020-10-20): [ tatsuz ] * updated Visual Studio projects to VS 2019 (#54) [ Fabian Greffrath ] * mp4read.c: fix stack-buffer-overflow in stringin()/ftypin() * fix heap-buffer-overflow in mp4read.c [ Clayton Smith ] * Remove non-ASCII characters * Remove trailing whitespace [ Andrew Wesie ] * Check return value of ltp_data. * Restrict SBR frame length to 960 and 1024 samples. * Support object type 29. * Support implicit SBR signaling in frontend. * Fix PNS decoding when only right channel is noise. * Initialize element_id array with an invalid id. * Fix NULL pointer dereferences. * Fix infinite loop in adts_parse. * Fix infinite loop in huffman_getescape. * Check for error after each channel decode. * Check for inconsistent number of channels. 2.9.2 (2020-05-04): [ Michał Janiszewski ] * Only use x86-assembly when explicitly on x86 * Use unsigned integers correctly * Initialize pointers that might otherwise not be [ Fabian Greffrath ] * update README esp. WRT directory structure [ Rosen Penev ] * fix compilation without SBR/PS_DEC (#48) * fix compilation with LC_ONLY_DECODER (#47) [ Fabian Greffrath ] * fix "inline function 'cfftf1' declared but never defined" compiler warning * fix some inconsistencies in the frontend output * mp4read_open: add check for failed frame buffer allocation * stszin: add check for allocation error and integer overflow * add a pkg-config file [ Stefan Pöschel ] * frontend: address compile warning + add missing LF (#50) [ François Cartegnie ] * library name is faad (#52) * Unbreak PS audio (#51) 2.9.1 (2019-11-04): [ Fabian Greffrath ] * Include stdio.h in libfaad/ps_dec.c for stderr (Michael Fink) * Fix Tille -> Title typo in frontend/mp4read.c (Alexander Thomas) 2.9.0 (2019-09-09): [ Krzysztof Nikiel ] * Build system fixes and code clean-up [ LoRd_MuldeR ] * Fix compiler warnings and code indentation * Fix compilation with GCC <= 4.7.3 * MSVC solution file clean-up [ Cameron Cawley ] * Fix compilation with GCC 4.7.4 * Fix compilation with MinGW [ Michael Fink ] * MSVC 2017 project file update [ Hugo Lefeuvre ] * Fix crash with unsupported MP4 files (NULL pointer dereference, division by zero) * CVE-2019-6956: ps_dec: sanitize iid_index before mixing * CVE-2018-20196: sbr_fbt: sanitize sbr->M (should not exceed MAX_M) * CVE-2018-20199, CVE-2018-20360: specrec: better handle unexpected parametric stereo (PS) * CVE-2018-20362, CVE-2018-19504, CVE-2018-20195, CVE-2018-20198, CVE-2018-20358: syntax.c: check for syntax element inconsistencies * CVE-2018-20194, CVE-2018-19503, CVE-2018-20197, CVE-2018-20357, CVE-2018-20359, CVE-2018-20361: sbr_hfadj: sanitize frequency band borders [ Hugo Beauzée-Luyssen ] * CVE-2019-15296, CVE-2018-19502: Fix a couple buffer overflows [ Filip Roséen ] * Prevent crash on SCE followed by CPE [ Gianfranco Costamagna ] * Fix linking with GCC 9 and "-Wl,--as-needed" [ Fabian Greffrath ] * Enable the frontend to be built reproducibly 2.8.8: 2.8.7: - MSVC build fixes - fixed a coulple bugs 2.8.6: 2.8.5: - another package fix 2.8.4: - minor fix to released packages 2.8.3 - better autotools support 2.8.2 - PNS bug fixed - New MP4 input module - NeAACDecGetVersion: new api function to get version and copyright strings 2.8.1: - seeking support for MP4 files 2.8.0: - patches and fixed bugs 2009-02-02 - Version 2.7 * DAB+ support * Use public headers internally to prevent duplicate declarations * Explicitly typedef all types as signed * Made sure MAIN prediction can't be started after the first frame * Lot's of compilation issues solved * Bugfix in SBR envelope border calculation faad2-2.11.2/README000066400000000000000000000045011476153623600134470ustar00rootroot00000000000000 Freeware Advanced Audio (AAC) Decoder including SBR decoding FAAD2 is a HE, LC, MAIN and LTP profile, MPEG2 and MPEG-4 AAC decoder. FAAD2 includes code for SBR (HE AAC) decoding. FAAD2 is licensed under the GPL. __________ COPYRIGHTS For FAAD2 the following license applies: ****************************************************************************** ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ****************************************************************************** Please note that the use of this software may require the payment of patent royalties. You need to consider this issue before you start building derivative works. We are not warranting or indemnifying you in any way for patent royalities! YOU ARE SOLELY RESPONSIBLE FOR YOUR OWN ACTIONS! ___________________ DIRECTORY STRUCTURE faad2 - top level directory. docs - API documentation. frontend - command line frontend to the FAAD2 library, also supports MPEG-4 file decoding. include - inlude file for the FAAD2 library. libfaad - the FAAD2 AAC decoder library including SBR. codebook - Huffman codebooks. project/msvc - Visual Studio 2017 project files. faad2-2.11.2/WORKSPACE.bazel000066400000000000000000000013421476153623600151440ustar00rootroot00000000000000load(":workspace.bzl", "wrap_json_properties") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") wrap_json_properties(name = "properties", src = "@//:properties.json") http_archive( name = "rules_fuzzing", sha256 = "ff52ef4845ab00e95d29c02a9e32e9eff4e0a4c9c8a6bcf8407a2f19eb3f9190", strip_prefix = "rules_fuzzing-0.4.1", urls = ["https://github.com/bazelbuild/rules_fuzzing/releases/download/v0.4.1/rules_fuzzing-0.4.1.zip"], ) load("@rules_fuzzing//fuzzing:repositories.bzl", "rules_fuzzing_dependencies") rules_fuzzing_dependencies() load("@rules_fuzzing//fuzzing:init.bzl", "rules_fuzzing_init") rules_fuzzing_init() load("@fuzzing_py_deps//:requirements.bzl", "install_deps") install_deps() faad2-2.11.2/docs/000077500000000000000000000000001476153623600135175ustar00rootroot00000000000000faad2-2.11.2/docs/Ahead AAC Decoder library documentation.doc000066400000000000000000002730001476153623600233640ustar00rootroot00000000000000ࡱ> ` d*bjbj .PA""  3333D4L E^2X4n4n4n4n4M5M5M5]]]]]]]$w_ha] 5I5M555]n4n4]BBB5(xn4 n4]B5]BB[ X ]n4L4 lF3;H\]^0E^`\b?b0]b ]M5a5Bo5 {5SM5M5M5]]AM5M5M5E^5555 )$ )   Ahead AAC Decoder library documentation Version 1.0.2.1, Menno Bakker ( HYPERLINK "mailto:mbakker@nero.com" mbakker@nero.com)  API specification This chapter describes the Ahead AAC library API functions and explains how to use them and in which order. NeAACDecGetCapabilities unsigned long NEAACAPI NeAACDecGetCapabilities(void); This function returns the capabilities of the decoder in a 32 bit unsigned integer. The bits that are set in the 32 bit unsigned integer define with which capabilities the library has been compiled. The following capabilities are defined (../include/neaacdec.h) #define LC_DEC_CAP (1<<0) /* Can decode LC */ #define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */ #define LTP_DEC_CAP (1<<2) /* Can decode LTP */ #define LD_DEC_CAP (1<<3) /* Can decode LD */ #define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ #define FIXED_POINT_CAP (1<<5) /* Fixed point */ This function can be called anytime. NeAACDecOpen NeAACDecHandle NEAACAPI NeAACDecOpen(void); Returns a handle to a decoder context. NeAACDecClose void NEAACAPI NeAACDecClose(NeAACDecHandle hDecoder); Closes a decoder context that has been opened by NeAACDecOpen. NeAACDecGetCurrentConfiguration NeAACDecConfigurationPtr NEAACAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); Returns the current decoder library configuration. NeAACDecSetConfiguration unsigned char NEAACAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config); Sets a new configuration structure for the decoder library. Return values: 0 Error, invalid configuration. 1 OK NeAACDecInit long NEAACAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels); Initialises the decoder library using information from the AAC file. The buffer parameter should hold a small part of the AAC file, so that the initialization can be done based on the ADTS or ADIF header. Buffer can also be NULL, but then default initialization parameters will be used. Return values: < 0 Error >= 0 Number of bytes read. This amount of bytes should be skipped by the program using the decoder library. This function fills the samplerate and channels parameters with the detected values. NeAACDecInit2 char NEAACAPI NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); Initialises the decoder library based on an AudioSpecificConfig as found inside a MP4 file. Return values: < 0 Error 0 - OK This function fills the samplerate and channels parameters with the detected values. NeAACDecDecode void* NEAACAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); Decodes the AAC data passed in buffer. Returns a pointer to a sample buffer or NULL. Info about the decoded frame is filled in in the NeAACDecFrameInfo structure. This structure holds information about errors during decoding, number of sample, number of channels and samplerate. The returned buffer contains the channel interleaved samples of the frame. Structures NeAACDecConfiguration typedef struct NeAACDecConfiguration { unsigned char defObjectType; unsigned long defSampleRate; unsigned char outputFormat; unsigned char downMatrix; unsigned char useOldADTSFormat; } NeAACDecConfiguration, *NeAACDecConfigurationPtr; Members: defObjectType: determines the default object type assumed when the library is initialized without any data from the AAC file (eg: when NULL is passed as buffer in NeAACDecInit()). Can be any of the following values: #define MAIN 1 /* MAIN */ #define LC 2 /* Low Complexity (default) */ #define SSR 3 /* Scalable SampleRate */ #define LTP 4 /* Long Term Predition */ #define HE_AAC 5 /* High Efficiency (SBR) */ #define ER_LC 17 /* Error Resilient Low Complexity */ #define ER_LTP 19 /* Error Resilient Long Term Prediction */ #define LD 23 /* Low Delay */ defSampleRate: determines the default samplerate assumed when the library is initialized. Default value is 44100. outputFormat: determines the output format returned by the decoder library. Can be any of the following values: #define FAAD_FMT_16BIT 1 /* 16 bit integers */ #define FAAD_FMT_24BIT 2 /* 24 bit values packed in 32 bit integers */ #define FAAD_FMT_32BIT 3 /* 32 bit integers */ #define FAAD_FMT_FLOAT 4 /* single precision floating point */ #define FAAD_FMT_DOUBLE 5 /* double precision floating point */ downMatrix: determines whether a 5.1 channel AAC file should be downmatrixed to 2 channel output (value: 1) or whether the output should stay as 5.1 channels (value: 0). useOldADTSFormat: determines whether the decoder should assume the currently defined 56 bit ADTS header (value: 0) or the 58 bit ADTS header (value: 1) defined in previous versions of the AAC standard. This value should normally always stay at the value 0, it only exists to provide playback capabilities for people that have AAC files with the old header format. All current encoders should output the new ADTS format. NeAACDecFrameInfo This structure is returned after decoding a frame and provides info about the decoded frame. typedef struct NeAACDecFrameInfo { unsigned long bytesconsumed; unsigned long samples; unsigned char channels; unsigned char error; unsigned long samplerate; unsigned char sbr; unsigned char object_type; unsigned char header_type; unsigned char num_front_channels; unsigned char num_side_channels; unsigned char num_back_channels; unsigned char num_lfe_channels; unsigned char channel_position[64]; unsigned char ps; } NeAACDecFrameInfo; Members: bytesconsumed: the number of bytes consumed for decoding this frame. samples: the number of audio samples in this frame. Each channel is counted separately. So when a single channel has 1024 samples and the file has 2 channels, this value will be 2*1024 = 2048. channels: number of audio channels in this frame error: contains an error value if an error occurred, 0 otherwise. samplerate: the samplerate of the frame. sbr: tells wether sbr is used in this file or not. Can contain any of the following values: #define NO_SBR 0 /* no SBR used in this file */ #define SBR_UPSAMPLED 1 /* upsampled SBR used */ #define SBR_DOWNSAMPLED 2 /* downsampled SBR used */ #define NO_SBR_UPSAMPLED 3 /* no SBR used, but file is upsampled by a factor 2 anyway */ object_type: contains the object type of the AAC file. Can be any of the values as defined in 1.9.1. header_type: contains the header type of the file that is being decoded. Can contain any of the following values: #define RAW 0 /* No header */ #define ADIF 1 /* single ADIF header at the beginning of the file */ #define ADTS 2 /* ADTS header at the beginning of each frame */ num_front_channels, num_side_channels, num_back_channels, num_lfe_channels: each of these values contain the number of channels of a certain type. channel_position[64]: contains the position of each of the channels that is returned by the frame decode function. Can contain any of the following values: #define FRONT_CHANNEL_CENTER (1) #define FRONT_CHANNEL_LEFT (2) #define FRONT_CHANNEL_RIGHT (3) #define SIDE_CHANNEL_LEFT (4) #define SIDE_CHANNEL_RIGHT (5) #define BACK_CHANNEL_LEFT (6) #define BACK_CHANNEL_RIGHT (7) #define BACK_CHANNEL_CENTER (8) #define LFE_CHANNEL (9) #define UNKNOWN_CHANNEL (0) ps: PS not used (0) or used (1). API usage The following pseudo-code describes how and in which order to use the different library functions. unsigned long cap = NeAACDecGetCapabilities(); // Check if decoder has the needed capabilities // Open the library NeAACDecHandle hAac = NeAACDecOpen(); // Get the current config NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(hAac); // // If needed change some of the values in conf // // Set the new configuration NeAACDecSetConfiguration(hAac, conf); // Initialise the library using one of the initialization functions char err = NeAACDecInit2(hAac, asc, asc_size, &samplerate, &channels); if (err != 0) { // // Handle error // } // Loop until decoding finished do { // // Put next frame in buffer // // Decode the frame in buffer samplebuffer = NeAACDecDecode(hAac, &hInfo, buffer, buffer_size); if ((hInfo.error == 0) && (hInfo.samples > 0)) { // // do what you need to do with the decoded samples // } else if (hInfo.error != 0) { // // Some error occurred while decoding this frame // } } while (more data available); NeAACDecClose(hAac); ./;<=>NOtuv  " # 0 ȴ{sskssY"h:dCJOJQJ^JaJmH sH h {mH sH h+xumH sH h:dh?~mH sH jh?~h8h`UmH sH hcq h?~0JmH sH #jhcq h?~UmH sH jh?~UmH sH hRQmH sH h:dmH sH h!#mH sH h?~hp5CJ(aJ(mH sH h?~h+xu5CJ(aJ(mH sH h?~mH sH / # Y Z ! ` a D | gd:dgd?~gd+xugd?~$a$gd?~gd?~A*c*0 6 : ? X Y Z ! 8 \ ` a      9 > G Z c h | } ~ DzoDzo"h:dCJOJQJ^JaJmH sH h:dOJQJ^JmH sH hRQmH sH h:dmH sH h+xuh+xumH sH h+xumH sH (h:dh:dCJOJQJ^JaJmH sH "h+xuCJOJQJ^JaJmH sH (h:dh+xuCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH +   9 G } ~ 9 : m ./>`gt01gd1egd?~gd:d   $ 8 9 : m r glt~0'+09>$%ǿǿ}uuuhrmH sH hRQh1emH sH "h1eCJOJQJ^JaJmH sH (h1eh1eCJOJQJ^JaJmH sH h1emH sH hRQmH sH h:dmH sH (h:dh:dCJOJQJ^JaJmH sH "h:dCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH .1@L%&5AH01XY>gddgd?~gdrgd?~gd1e%/01XH`fɷqqqqi]iiqh#hd6mH sH hdmH sH (hdhdCJOJQJ^JaJmH sH hdhdmH sH hmH sH hwLmH sH hrhrmH sH hRQhrmH sH "hrCJOJQJ^JaJmH sH (hrhrCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH hRQmH sH hrmH sH #>\Hy*r"p#gd#gd?~gdd-G\x%q)Cq!",puٻh#h#mH sH hRQmH sH h#h#6mH sH h#mH sH hdmH sH h#hd6mH sH "h#CJOJQJ^JaJmH sH (hdhdCJOJQJ^JaJmH sH "hdCJOJQJ^JaJmH sH /#  P Z y | ~ !)!B!]!x!!!!6"7"B""Dz똌xpxphemH sH hwLhe6mH sH hwLmH sH hwLh#6mH sH h#mH sH "h\ CJOJQJ^JaJmH sH (h#h\ CJOJQJ^JaJmH sH "h#CJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH (h#h#CJOJQJ^JaJmH sH &#>Zs 1Vz P y !C!y!!7""gd\ gd#""""#-#^#_###$$%%%%%%%g&{&&&&'!'<'A'b'ٽr`r`r`r`K(hPUhPUCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH (hPUhrCJOJQJ^JaJmH sH hrmH sH (heh\ CJOJQJ^JaJmH sH "h\ CJOJQJ^JaJmH sH  h\ h\ h\ h\ 6hemH sH hwLhe6mH sH "heCJOJQJ^JaJmH sH (heheCJOJQJ^JaJmH sH ""#_##$$$$%3%T%u%%%%%&f&g&&&&&'''c'd'gdrgd?~gdeb'c'''"(2(h(i(((()3)5)+*0*@*A*B*W*Z*b*c*d*ֲynjfb^ZnhA,hhsh?~h+xuhhmH sH "hCJOJQJ^JaJmH sH (hPUh {CJOJQJ^JaJmH sH "h {CJOJQJ^JaJmH sH "hPUCJOJQJ^JaJmH sH "hRQCJOJQJ^JaJmH sH (hPUhPUCJOJQJ^JaJmH sH (hPUh1eCJOJQJ^JaJmH sH d'g'''''''"(i(w(y(}((((((((((((4)B)C) ^`gdgdrC)r)t)x)))))* * ***+*@*A*B*C*D*E*F*G*H*I*J*K*L*M* & Fgd>vgdr`gdPUM*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d* & Fgd>v,1h. A!"#$% DyK mbakker@nero.comyK 0mailto:mbakker@nero.comDd:$11T  C 0ANeroDigitalbf9xEPM  nf9xEPMPNG  IHDR2gAMAiCCPGray Gamma 1.8(c``$WR~  |B@TTd` 24\PTOJjq2H ;(Xd$e= vvH3+Iep/,L(QHT0TpLOJU,.I-VK/*/J,IMSpQ)/VJ-N-* 2@~JDC= PCXCa(v!ɥEepf<Å@ȦtPLTE  !!!"""###$$$%%%&&&'''((()))***+++,,,---...///000111222333444555666777888999:::;;;<<<===>>>???@@@AAABBBCCCDDDEEEFFFGGGHHHIIIJJJKKKLLLMMMNNNOOOPPPQQQRRRSSSTTTUUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^___```aaabbbcccdddeeefffggghhhiiijjjkkklllmmmnnnooopppqqqrrrssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~]} pHYs.#.#x?v1IDATx^m*; $  H@p$  H@8gYMtḭ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @q  ;\@#P Iq"z %@\*jcJ4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf b *jc 4 HRܩf lv'bػ{ 1r.O=;7qq`爱Nbz&bX6yG\!>[,:Zʛb1O!ׂ^. ax*;@K+踿JF^NM˫xp|ϫF&ˇCihJw_BYg]5yefyU󪈧3gӛKM'-b_dռ#y|ܮfy_ZAuU팋,/u\`ՓWĻIrxroa1a|wj>ԱiIzЮP.Ŏ<ŋf",}p=U}P-WY^@e}縵웭v!z?<]q.vd]:|=iK=H_?fmK$ j(CS[UzX#^p3W.pPw5쯦_dbG 3$8Onq rS!F<]8}HajnlŸWE躚8c'1[탾^cT؉Y^dJ2BAgۋ󟯩_)gJGkΩV<_Gep4}*1>k]/Ǎ)RL({1nKt]GL?_ҼٺCۺPHBa ݲ-_\%rNpoKlzol4]&8gm``rޤ4%GFW]W*y[W ػ&h˝ڔ[!a3R= `JQ똶w4/1wuڸyVzRn^&뉱'Sǔ7ː11-yxRtUQ.#r`&0Ϸwzc8hKiox_^zͨ_2Jsw9G˶\R_SLTĸӘ\f^rx3@X by3"]ȱ mf5n{ʝq׀Wo:du>b;K- ?;vzʟ^/'R\.^QxU.%=6b|o]H5vSeS?-ĸ!z ݰ ̯lF}WoL^Ft14ϔMKԟKw)c8n;]]"V muUci>IO+anfc/]Jqvy,% PŜէ̈XMUCcO;o4fqOgZInyhU&A $UvO_c8]cvT'!~nP*5KGy˱n b-Q zw[I;:z T-qg?d4E^O .`nL3.A%C"axݠ4$wƞA^e`RzVl1#Qު?25]"н ,٤>uEd1noLdT!ڃ~bMhTѱs1W RŸϐ3hevxjψø_qSsWsjb(Q+ I^R Dգdо+9iΫLN"~]zbܮ68܁Gƺ5z ;QxonJH$jdŤ1c1>7y\1,=F5Žˆ-1jIŗP2ָ+ǩ(a19+l}$<(C_KÞPcbRCp׬\CQ6XME3AW5[QͱW1n{f4pg+v⃪ Jn&cۖ苦GxW2<VTwB ߊqO}+E sĸ1uRU.ki5e?CSkcjn;9)s‰ 'nF=K1no߫ ĸyɈhBF6xZgŸ}q<&kZbB۷_վ0mC1ޛ/Ę@h%F ĺ3œަbP>1'^x.M+Y#%!o8m(rߪv'3_[{#0 =vKͳc8_V1G9Xqu5Eob|P0θe+ԄjӍx 1œRϼxc._Ql͉8bG'-+[+xUًa1^ί}۞O^ν #^ owpo2[_bbbů:XK SS꥛ccM&˕7v;_OHfC/f^eM.hszObHޤ{1>άW}Lv;H8wC:XN:EL~d&3Ę#p2隚=2w!ƎMS846"5#}+H?Tl}>xK D}UZTGIԸqR$_"_yUA{S]XwSԢdh^Xu$F]N4QBT1^X3j_Jуv3^ĸĘ^z^MτB1 ޴D^=?hև{9t3/MM G /6C^QMjOt"&^^͏9=o g]cY_Y1!~ *^nMqBC̗,c%I݇/K6j0wPu;1u쳮,'؅7v/%GKvv.b<`D7f;՞?k[eύ®[X S3_@CQ1WĈ5vw>eMگ[f811vwc>6}@(m1, hNdO$FgXqE ۺta I/ ƽD*O٭1Zqqa{13Jvkƅ1st4| ZAqa{1X-ؾ yPc_D:1$Pn "gS;q%f1剀4,zp'"hՃx>#ut7TM-*j]kƮp bK'1Zķ\gʻŜ# %vaX bO2=Md8i.Z^}tD`ۺLME? *ӴV bLM`mDQ6nFC:2c bo^B xc?w +G$2$5jAp)R^uU^I78 qަxhӗc#"jA1΀۔UH_>Cc@W B8ZoSΩaD:-Dc]BA1΀ݔsyZ,֛po,S﾿8@?;@@sUuD ΖW ~s~o\KcQ08<ֶpf R99-vH>pʭE+cШ( b\tuޜS:fF]ӟ@C]jlN M26UWz/V}P.wiw:"bܺ&BqڛDxyIp9:ȝnM_gHE&c6ݻKaATW"Ɲ0'vGV.: xjxCy.]>ݵ}2Agۇ)(Xo֍'?.Mud*ivX;ɲP+J/};_cRn?x+nzYoO9t8?@(~8rH=q뱗}#(b낛Hw?6敌-.)8%B>~Wմ-i!&nOc!yaV;0^o鰜9%uf?g8=: .|zfqbGիtPv#w 1iYv>O?$ISԂQ!=;vw&{c#4>ܮTԍyT`Eu1A_X7zPײn|ABU*?kwTl'r9NO!̓߁=Yk_?$K/OO~rq>[յ؃#n?!:py5?{ 7uBCO|w3?=g & ؃7A\$㚟79 n_n ґbR~ Ehoܓ$oyd_n<=NAU^XE4g'֑x8.R9~4vNܿiF}oc]OK2L/Atvӿǟz] 9^-m'D߯  `1^dsun|li]~j/Vs^Kjƍ壋t?xq3Ǐ!?c'տ r*̙ԯ_O{vkBWj\ָmuzp16{}W['7g]JkǶkϫ^opkc<۸˞X1vu*uEN'l? TZZKkZ",ƏC"bgvsy מ:i߽ϷǼ~`8s9tR}ـ|N$ Uk`1Y75}hܧin}lwwmv׻/ۑWXM"+>iC"DmavةJ|ݴiG+ W$ UkX1ŞG81^Tߞt)Ƌ2 kON'Rnol*!YE]Ϊ95:YN^)gT17"aT@d\9ĸ!eMy|8|l40/u&O[s .ݛ~Os[Z|yUGW>{g{l $E{ukOV7GS|6\!}\*_k)3sV-}LNs[g-8^[?Z.Ά]BxS?¿8f'fBQ!Y<ɉ5l$]l}NaJLjwqJ09<{*"0.ϖvoځ[csjg9݇; C,IIm vmB/.NN ْ.nϩ.VGv7Ɨgfl[\6cta-v΄ S;nn7ћ=_7\4FG-D/.N_|؞S;J~\ $oL?}1>a]F/skz-;\\ڶCυ8b[s2h`mO36ֲ2 ɑ8b1 sٞNC zHiuDꤞq`.~OAzKot6.^h; u\Q'Lֵ |JGDfOUpyB1nQ]JegVgGޗpvA]{_zwQ1}B=tFxHnHr(5z.~=yBޟ QAM7z~]J?t ן Qĸ)uj~_2?z9iU:mAٚ'ύ8ZsjC,wbz=<:k2Ȱ xx ZυʼE1^]ue~(Y|KUwɄ DTy[*C·bl˄.7t^mc+K`.Ce7Tk? o|<0Ho#<>ss(f?%0y `y2{ b p၀񩑃.,He Ư3bL%`]^oqqmhS,Θwf"D>wֲvb$?ӡSC/CA|8Yu/zWs NuA1OF}eKfǔ51⛿IJ3AG:6Lڎ {LK74fcy̯Sۋsg-]RK셪=`=&%+b>7cR j|YTS[q`q{({L*Z>x4)qK߭ =;Tm~ITX'wIfЬy2X7X U{*6*b>'SA[TDB AƔ L1G͘@WsAEb\PKq2f:O]li>zW+?ĸV Ħm^JX 4wXvپIv?NtNG]7VG+8#qo(hpUVcJ12X/o4FwEwŀ 2SAub*c͊[#W-tصOĸ} =@u*<'Pqj{1op rH$0~cz`kOZ_fi 7֡ b>x@op%b <@SJ88-%U@qF84'"Eib,!̔3;cu2 b\%}.ۧ3+T|7FCc("Zb,'P!˝,'wƥ71ВcŒ k!=:#ȎWFt#S _bg:8mKe&Xmߘ2)%P!|]f/1^<Ý!ٕ$  &px9u)]1xp1Ty2a[6OSXR8 1Cي@JA\X6ٮ0b\nҧ#+驛=~l'NA1/?+ ƎW|W-o7{I,~gz`mS#ĸ}*|I9{t/G:Oe b̝qF:2"94|fbCclk;c.b\2I:Vc!ƙ$|?ʽ4c>iF[m=@;!52Il9y{8xn:1JGwX\>4oq g՗MޢoW}]R`\DXN&/KaVej36 !jT\ U sBn=-־Zc]{6f:,S='r"ƋoRi6ڣ1{~kzT|8UQxپ):T*};1JG^, AͅKP@.43-{Dmɕ"fQ, Gc4{e,?u5[e{DqZXg;hU:xzZeE\LͧM9-1Qŗ!sޗFQk^1LK|ٓѢdXoԂ]/,|p|'j{bec-M-km`s[/p}UC5]-Fٝ?49~jJc, ;JMή⫅`0bAt Wlrݤ-js(7סqqU*vga= #xLY{XFubl'vb0b|q:pbXJa{j]9;bz8bl csSߖs>z'҈b(\v2üXX~~wzg|ZT1yÿ#R@6/C :s;c_ݫ<Ʀg9P"ӗ?cy%eΈ+LbcIWMO>Fw\@奔9#jӞIwY;;`. 5%Wm^/#C_4=e׷&yxw> Ʋ:*W-w MFA_ttE~bAs1֒Uxj.J=|4iy@'L?lK]@KJ47;+pp(1vq.k돢DqcQ vQXnsC?8ucsF}ej>sNfxK:5_.|@ I9ul1#\Nn}5+-#5j1[(֝sj>nfSFb_,Fl}%^-Z c16~;6kuA;L]O=σUV֞d.5b0ĸZ}c^h~L!%>όOGkDl1Zv4E^Ve>1qg\^bq˾jX(}/2&?QB T%b>5Lf&u׷8]"Z=bgY:Z-R>ߘ/^<k\G'LĸZKrSP d!/w,"a1a'n6<0T$ˣX1Uxĸ Ỡ钵Jv&N<6>NlvbY:q#Tx'?y1LkuvX3}ڹ<j;8rYqҪ0 vgqŕ[t"U8}_ l*yޤA)Ks߽jKֹ18'qFOɛҾ-Vy}DENՌcP/?y_WhqQ!w+a3p;LLr-WRk?jHk ^|UĸZKj߈.^; 0^~F;Z7S3bp^ ]WY_;9[:Z-I*-׺1Fs1֒HPk-98$o72v'wBe1vrk\"ݭM\141]mdRϝvE/^jj#s`1ݵR5O ;_p^b\M܈WhUOԯ.vYXȿ91*A;n%7,'7fb|Y:섓VSSltɾG1iWhu{5&{z0 ;tU|XíI _m;1~+4}cGg3={Y;ϊ?v8Zeg] ղԑ_<5 _]Z/cp}>ϧ?Ut0KOB*/c'1>zj7>n'ahp1v%SI=WESo*:7GW[>if?ȇMZYS{gZ$Wb|;KLK^0|\t1vaXoï۬OiWesu>A˒N0ۗzdP;g9Tבax1!?8TKj2k|]8?q4ޕ}7`͵'ƾ_hv7_a&E!YPIPsڿI580gZgR*ķ ,.7s#hTC]bzI6l+d0~[k91R~llFblOz f{x-ǐͲ_C/6Dpoۯ!25b[-;ìoc;"T-.s6 R"j !;j~"cG-~;>tb\%c kUWqgAP__6f"DeS1qpf/縺}W=Y-ώ!R֫sH|{<3D ۟v/oqg1b9afH 1K\TJC4G&#Ƽeb|_x+Za~מ.njIV*f~d*yB-엷x cJ`WBL$!ƿ G%I$0m"5oS "k(bm=덈w1j=Bc 1/ή}d?8%|>RK$Cq,-|dVOk 1~,Dj\>c@"ƈњSBo1~Vxqa:b8'1bCwhrj͜|"O 5.@/Z1F9ErΛ_@j\n1Ή"b@s՜B_A3Џ#9AD_4b3>D_jYM1Ή!b&N9u$ bP ňqNcjSH缻/ on7Չ@(+ӭZ;C&?JJ36X@sM8}i1w^' ƈUN*1Cj,3-Fe#O93gP9~_wyYbNj]cCi77"b$9rgxV^Gc&PO1NMq]h4,#Ng3ϟ3bll%v^̀\}ԪƲb<-oSm¼"Okp]q:a F$8ΐGqLM/T/+ 1N(<~n( B u=CSc^n7&qJiq:>Vy0ORZΘrR#cj i.i돊 rg\-Q{yfA,қ#bXx<8~Y<>sgĞP>K1\ڻI:ΫOaRI+날7'c |oަ GiE+{1N.<^$|~yf0B{B^ŘJBQt|D'5cAO(ڭ_ߪfWiBB%OU$oQ5N+TC$9VLS3: LcWOf>mD%jvP{b;XXxwȯ;.V! f17/XW iU3Fkzq'E]>&Ѭ'^zs̓guIJvfo$OtF"ODK.y~b|9-"6G8p9I=O?E g)rXb1Ϊo1ΐ)qVOș41懜Dg ľYglA<>wLܼ_.GΪRz-8iپ`q%`^ @ݯWԑz}kl`u.I8^f|^ fjX8qL_΁ ;Ģ1.)h 8]ΛNH56%[ƬrZi$_6f51."+W=Pĵn9b\$$W9VSA%dlwJa AgMo(i.V՞MbV2>4.1M.#Cĸb<:szTcreeL&ᮏ;{bfZi'XX poVv<_lȰEF`|Tro$ @GOFaY|DnG9~^y_.xR2ذ1I|8l7e.͞>awSeGP_p\a^*@7?\]V]owF3~<%[ז{I;19) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w*bO) UԂ#=6>B@$ŝx @q`q!P Iq"$8B@\E-9bCj# ~HRܩq? z WQ v@w+1^ A\E-+1.0T@@P 20ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@?mshoHKLCeA-##ȧA. 7i1q戠,\⌽~ه{KaY(7B Sfw8G񢸫)+K.p''nd ARu^dS?t,_VKrXw|3ui+#IUZ%'*\AWɣGʹ^ W봖~Yҗt= `]Htc?%tjr]_5CJYܡrC Htc?%tlRU#hp<~TLa r55FmXҗrw֠kaCr1]XOZ6t@!wa rUR*cvs%}9siD%#z:QrI.pn*5BjTo{+jry[[җ %ui.#IUZme{Y [4B*yTq{K䪬F*׵/L`OI.pn&܊ϛ nBw;$䪰Նʱ/V:ӿ#j /5TAŇ2+i[48+ٵ׏v{=LAJ{]jb܃#z.d/.&ۻa? 䪰ELkşŷ%蓍F(y˥\$A8VihBd3d4JU\^?*nR0Z<_TZҗkTL(\$A8VihBHӬw n{fvY{\ͩH9:7ǒ\! 7%%tiV.#IUZ}i'7 n{fvY{\Z^.sנ.Hi]ݔQO)eҩuyAM`.+`Sh4t]X3iguiR\$A8Vih߆n 7 n{fvY{\ͬIi;jI_6΂Y-]wHtcmXfD5A[,{{ea r5&5Xҗ`n՗sg[b!\|$p߶[X׏j=LAJ8nxeȰn`N$* -wM,ke${p}]a r5(5gXҗuۚMti(`)]ts"ǚ=^?|_;{\Gˡj,˪mlgƶ. b$ JC:ty5}oM뇇]V W+elXҗ~d]Htcu ,t"ÚeXw>^?t W+eNSM$̍3f =nys3lk)ºTnN1^*gJ<~$* -K 5A>^?P WKRq(I_Vξ/. A$* -Еw7 뇇]V W+e6fe'$l\$A8Vih_XJM7AK3({F0Z^d_Ne1KL\.F 4|/BL7/ Njx{@C{\ZҖ1;e8Z7J`b$ JC5ho#g\V$fK1NC:`$<{X>DTJD3U%X&b,P(X%[ͯOY*&ATVƠZaܸ,u˷A Dx6#;٩y4(V?,յm+o!; 5Ww@nq+,V?,؆9Йb,YS@%Apg_ ZOfDuuh} PŅ)ź/hJQ+nkWhPnG13CrҼ3[r}lň!<3V(b,ӧb|(OGƒW*<~g+Cn ɓsѽz؛ "ÔzW? "NՇPqkkm b\_ur"5b̝qqy|+ƒ+ucb,|@Zޭ 5#$Sւ]k1Fur- jl?!iK:A>PiOz#"PZږ<}aYKϛB`x\0=LAyf|Ǿn*ߘmI] M̷b ydz QV1Fwݖ)պ=,ƗT- XeH] M \N/KMeW{M`.+`Su{j(Ң;~Z/3&(zYuJQ48`^?<첒0ZzJN.ŸuGJ t1&x%`}|u^; 'g/# ~jݞ'C|9SBo&dbH[OJ&hba&XQK,]NLaWr6Njݞ'pZ5@wCM4#-b0uslb<\ GOr}TIG3aRWa rn8v~/w1@x%X2wd.lk;[ס5>oD$ۉvjݞ'pLb<uQ@eE-Zeoee?I?+GU_ WDcAT/;Y${Ƀ M̑SKs3 luYP]n~t$a{\Dew1;OJKA%,d^ S/<^ 8CҋbC2׏d{lS{K\.>.w'DAu]x|OA9cgMIu6^?:R=LAVy|1($߹+'XK,^cN2Z0H Vq:^?n-{\ݸo1^vʝ\sDb,iD>o4u5^?Q=LAVy";\ٗ{dE/D!^ •sDb,y›JYM ׏nP;jSX 'A;V) 4T"b$+*'xXP<5%g_9K7NǼ<ϲϻW W+uQ:V$W:JV.^ɺɮ$y%]ӿ$hpJ`Gv W+"!FE%+"ƈN%yX7Iछ?^?3P WgGA7.('ߩJCS 9` ϛdqt=^?\o_9{\d A7-Z~Duȝ1w*Y\^b7 |gw*blsgbz%`M0DpŝI7>~CIҍ2^?z!=LAVyjViBr 'z϶#o++'Xa#YnXT GU_ WoDDka|)U晱 WΕRkAuLp|MI,uyI%JK_=]mI7@'6\bp$XfblRPNMx%Kf!D;z[-/GmX{yzB%+:)`ᚉٷ5*ZDB}S/ŠzZZ>aF|Ah|,\313=)sz:tC+ۛ׏{=LbL.o|T"Zy v Đ),'v4xabOa t@JRkB|N-8,\11(('!>9t9"m7WGSTVLb<i &`hb5ˆqףi}$=:~a(:8^?]{BkAоn" ヌf(A$tNpܢUym-yGy4hi#͏Q)rUx֚CU&V`z9EA9fc#ͷ0&YMkMAA'Pk~ţ[{Q.e꘠v\Ԭջ8V& V.夗=i.K[fV\@y~FG?,=)HZ=Ot ٪Qd[F)(b,;.uiI"zmm Sbu) VpS1T )M2 b[k%fTYEHتhK5THZa j2;Ƶ UjɔEpLI3IS#qϏx^j^ :v׏|ߺiSPuzDrѽm#SYIf_ Iˀ{O&suU2vNmIU1A0ERMխ6bh>Dauj؍;Y)T7֪KghKu?ݍ@5iW4i>k: 2S# yC`\I%:߀8z߻?.4]xfKt],l5A9U3<5UA'9.F_/Q~$WFa ^u< $?C[N;!(zb,qJQڅVXƤQ^2X)(TK1fJ"o%Ƃ.ԚwōAPN #lv^:v]^ 뇗V@x gSxവtAzDPNXE,EWz8Ѓ]=VL{90âNNxz˦O7v81,lS51՗Eg)TI~o{ܔ\i!0|P'路CNxI"n(ɁC/Ih_گ̭=&t kbWִ5eIR^\|Z8A/z1P^C"gt.>L~crڤ[(9b<Jc>]}ޔ -j~hxى {="MXEȶ K;…n[&A ~hxى {ͫMxv[S.B/If`'uwQNe'6av,K JSd^vbfblUXdQiH)k %失[3ËCgM7J'`9i~hxى {!m 8?G/nY^o*}ۙF+$ Ɠ@ խ)'E)Tʮ -j~hxى {;xf|M9E3ԭ)ZZarRXkHv~,Mai:Xce'6aJG;XɆEz&+I?ѧ 뇆ذٝk1PukJЬ?Ee}.QMA_y9zx/#c؇ь)Z\˴uW4۰4UAS:Q;|8(b~hxى {šԸXoROVg v6ukJ'b^ts>Uig2G뇆ذٗ#ƓF^6CuC#1~@/{=jTkW_2q*wCNlJH'Sk82zI_*Ǐ"/>oLPcr /;a#16\aEoe2TE7z=B7ndz7]x'ȮVCAi^vbf?b\ڟOU֔"ƿы6'|EQ\r /;a1>/+LR5\nt. V%ǚG^hn2x5eH뇆ذ)\A֊71tss!A ƿZGeEoch~hxى {]qQ/^eH(=ܥ}x+|AQ־JCNl@O(ƓY7N~"-@dEifTU33uqe3^?4Ć=Lb|/\9֭)8$u~s}ٵޚ xh9e'6a:wŷ4YXi肍Hʩ`SekFe7}9W_ /;aS=Qg~Q?NnyZNR*u8yBї5/T84ie'6aj"JP߿֯=?zY9/uCeMϛEOE/ 2dFCNlÔUoIrIvm|AnM 1^.-U'cgYhr /;aӟYf/0|g$_ \M.FW[/"rg뇆ذ)t?żudHfpɺ$;KIT _ff.mm-֛]r6лe'6aM6b%"+>_>0 <KCVwkr*Yܥyڋ ئ~hxى `v(܄ `* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`S& "~(01@ C1T)@"LLADP 60ab @ bS@? LE l`* @`y @ D1gdS @%8 SĘ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb؂ 8 Sʁ Mb?@8 N!@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @  ˷.IENDB`@@@ NormalCJ_HaJmHsHtH b@b +xu Heading 1$ & F <@&5CJ KH OJQJ\^JaJ d@d +xu Heading 2$ & F <@& 56CJOJQJ\]^JaJ^@^ +xu Heading 3$ & F <@&5CJOJQJ\^JaJR@R ?~ Heading 4$ & F <@&5CJ\aJT@T ?~ Heading 5 & F <@&56CJ\]aJN@N ?~ Heading 6 & F <@&5CJ\aJ@@@ ?~ Heading 7 & F <@&F@F ?~ Heading 8 & F <@&6]T @T ?~ Heading 9 & F <@&CJOJQJ^JaJDA@D Default Paragraph FontVi@V  Table Normal :V 44 la (k@(No List <m@<?~1 / 1.1 / 1.1.1 F6U@6 ?~ Hyperlink >*B*ph  !d"        !  !$      d"P/ #YZ!`a D|9G}~9:m./>`gt01@L  % & 5 A H 0 1 X Y  > \ Hy*r"p#>Zs 1VzPyCy7_3Tufgcdg" i w y } 4!B!C!r!t!x!!!!!" " "*"+"@"A"B"C"D"E"F"G"H"I"J"K"L"M"N"O"P"Q"R"S"T"U"V"W"X"Y"Z"["\"]"^"_"`"a"b"e"000000@0@0000 00 00 0 0 0 0 0 0 0 0 0 0 0 0  0000 0090909 0000 00m0m0m0m0m0m0m 00g0g0g0g0g0g0g0g0g 00 0 0 0 0 0 0 0  00 0 0 0 0  0( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( 0 0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p0p 0 0000000000000000000000000000000000000000000000000@0@00`000000000000000000000@0@00@000000000/ #Z!`a D|9G}~:m  % & H  > \ Hy*r1VzCy7Tug" e" @0@0 00Y* 0YY00p0p0p0p0000000* 0YY00* 0YYK0000*A 0YYK00K00K00K00$K00K00K00K00K00K00K0#0$$K0$0%`K0$0K0$0K0$0@0K0)0 *쐚K0)0K0)0K0)0K0$0K0$0@0K000K000K0$0@0K0405HgK040K040K0809g@0K090K0$0K0<0=(hK0<0@0K0$0@0K0A0BhK0A0K0A0K0$0K0$0K0$0%$K0$0K0$0K00K0(0)p$K0(0K0(0K00K0,0K0,0K00K0203{P0 %"b'd* "$ 1>#"d'C)M*d*!#%&'c*Nud"X8]^@]0(  B S  ?d"e"e"9*urn:schemas-microsoft-com:office:smarttagsplace  FL ":QT^ 9FUbcqrz-.6mgs9 G H P a h x  ` j " - = G   0 < P Z n ~ <>am ;D%>H",bnp! /CThxPZ`jy|-6al7B_qs{4<[\`; ? A D F N Q [ ! !!!!"!%!*!4!?!H!S!^!k!!!+"8"9"="A"e" #+IK 8GK~:l->_txU ! $ 1 W Y  " * B J ` h % ;C",'/BJ^fw5=Zb~#PZy|O] 64:U[go<\" & i k ! !C!E!!!!!+"9"A"e"33333333333333333333333333333333333333333333333333333333333333333333333333333333333/ #9Gm`t1?@L  & H r8opggi x z } ~ 4!C!r!s!u!w!!!!!!!" "+"@"A"e"A"e" x8v2  ?C(L0SF&n@z+V1_$V%  [e dh , x k^`ko(0^`0o(.0^`0o(..88^8`o(... `^``o( .... `^``o( ..... ^`o( ...... ^`o(....... pp^p`o(........k^`ko(0^`0o(.0^`0o(..88^8`o(... `^``o( .... `^``o( ..... ^`o( ...... ^`o(....... pp^p`o(........^`OJPJQJ^Jo(-^`OJQJ^Jo(hHopp^p`OJQJo(hH@ @ ^@ `OJQJo(hH^`OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHoPP^P`OJQJo(hH^`OJPJQJ^Jo(-^`OJQJ^Jo(hHopp^p`OJQJo(hH@ @ ^@ `OJQJo(hH^`OJQJ^Jo(hHo^`OJQJo(hH^`OJQJo(hH^`OJQJ^Jo(hHoPP^P`OJQJo(hH^`o(. ^`hH. pLp^p`LhH. @ @ ^@ `hH. ^`hH. L^`LhH. ^`hH. ^`hH. PLP^P`LhH. P^`PhH @@^@`hH. 0^`0hH.. ``^``hH... ^`hH .... ^`hH ..... ^`hH ......  `^``hH.......  00^0`hH........ hh^h`hH. P8^`PhH.. ^`hH... xp^`xhH.... @ ^`hH .....  X ^ `XhH ......  x^ `hH.......  8H^`8hH........  `^``hH.........^`o(. \ ^ `\o(.808^8`0o(..808^8`0o(... ^`o( .... ^`o( ..... `^``o( ...... `^``o(....... pp^p`o(........ hh^h`hH. P8^`PhH.. ^`hH... xp^`xhH.... @ ^`hH .....  X ^ `XhH ......  x^ `hH.......  8H^`8hH........  `^``hH......... @z+Vdh0SF?C[exxv2 _$V xS        Lr                          )(\ m "d!#"'A,,1F2\9V>wL_N8h`=c:d1eW"h+xu {}e=jf#PULRQpA3l0?~rr>vsU>@ 8*##d"P@UnknownGz Times New Roman5Symbol3& z Arial?5 z Courier New;Wingdings"qhoz2%>!24d0"0" 2QHP)?+xu2'Ahead AAC Decoder library documentation Menno Bakker Menno Bakker0       Oh+'0 0< \ h t(Ahead AAC Decoder library documentationMenno Bakker Normal.dotMenno Bakker21Microsoft Office Word@"G,@Ҫ6@%՜.+,D՜.+,d  hp  Ahead Software AG>0" (Ahead AAC Decoder library documentation Title 8@ _PID_HLINKSAh*mailto:mbakker@nero.comg  !"#$%&'(*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqstuvwxyz{|}~Root Entry F'KData )P1TablerbWordDocument.PSummaryInformation(DocumentSummaryInformation8CompObjq  FMicrosoft Office Word Document MSWordDocWord.Document.89qfaad2-2.11.2/docs/Ahead AAC Decoder library documentation.pdf000066400000000000000000000720011476153623600233660ustar00rootroot00000000000000%PDF-1.3 % 29 0 obj<> endobj xref 29 19 0000000016 00000 n 0000000921 00000 n 0000000676 00000 n 0000001001 00000 n 0000001144 00000 n 0000001168 00000 n 0000001316 00000 n 0000001485 00000 n 0000001859 00000 n 0000001903 00000 n 0000001979 00000 n 0000002348 00000 n 0000002869 00000 n 0000003104 00000 n 0000003138 00000 n 0000005807 00000 n 0000006659 00000 n 0000006888 00000 n 0000014179 00000 n trailer <]>> startxref 0 %%EOF 31 0 obj<>stream xb```f``d(31 P9.000冰C@IF m)?OnT4f * WR  (&Cm `eS`=C[c${4.Y@&!/fbk"o(% endstream endobj 30 0 obj<> endobj 32 0 obj<> endobj 33 0 obj[34 0 R] endobj 34 0 obj<>/Subtype/Link/A 47 0 R>> endobj 35 0 obj<>/Font<>/XObject<>/ProcSet[/PDF/Text/ImageC/ImageI]/ExtGState<>>> endobj 36 0 obj<> endobj 37 0 obj[/Indexed 42 0 R 255 44 0 R] endobj 38 0 obj<> endobj 39 0 obj<>stream HlKO0{L$B q@X\(uK)ERi8 _Z|;;yd“aY1jXJTo =H),毱|U i{x?lm mN鐺ڿ hBX9EfS쇜 )rdp.93s]! lBG@U՟iI|ڢ65E]1W]/nl]պ.kJp41(586;Q9/G#kq y.3(| n!dv2X%@~ hw endstream endobj 40 0 obj<> endobj 41 0 obj<> endobj 42 0 obj[/ICCBased 43 0 R] endobj 43 0 obj<>stream HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 N')].uJr  wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 44 0 obj<>stream H""" Ƨ੩ooo^^^TTTPPPQQQ]]]fffwwwηqqqbbb[[[YYYaaalllů```XXXSSSvvvɔ000 !!!:::eeezzzMMM888}}}NNN@@@999===FFF\\\sss>>>&&& 222RRR~~~꭭ccc'''###͖+++666ggg((( CCC|||DDD ...)))---rrr111,,,iii555uuu***BBB777mmmWWWEEE䓓ppp<<<磣UUU%%% kkk{{{՝KKKAAA$$$hhhHHHZZZIIIjjjyyyVVV444腅nnn333dddJJJ???xxxOOO___ϲLLL///GGGttt;;; ~ endstream endobj 45 0 obj<> endobj 46 0 obj<>stream Hy\Ue/]LP%AEprP1eKp 5ƅ( TD(rGAPpG3-E\r4F\fƦ揁{A; |Y|9Q                     Dc̜0yYǎ-eFh5k}r`EvL A!;6d ؐ`Cvl A!;6d ؐ`Cvl A!;6d ؘھоMG[;;ێ:Хlٝu^.v\{ʽldǣR1;ۗ;2t^d7%;<|Fӭ?zX7K98"c3!.'ɲ #1&DM|˧Mi1zPf͞hXտqq?h<^`!8-\EmxۼWKw^X!.Ή#.|iOe 5eZ 'Бh;Vd8^넋Z Y+~6 QMM227j&\Cϒ̫;p:#?@nܼEn.ngA;fx$l xnΕkec!]I-ߎ~9YַhLL5gbrkp|ti}gWٱwS 6FvdQP@lĶ`ѩ븁c`E|+u(>kh%>¦R1`Ńl+kZȘ̿K8g}iGYضQ9FBiEYrcVֲeߏvElG~/?ƻkx3b'EaYpe8os#CfIE?۸ằBB:UH^Ym'x>&YR;/9yP;\Uv7ͱ`G2-x~ j9=Eb޺ 5Ў3Hv)ɑemL܎s =>}:WSE(w%6Kr.?W7a}U1n8xUVsrciqv ToYe>P$7n\y"n/Iy5|gjfcAvEH#Ae |~/"vjw{xk2v]U+YVaMչcZnGyUrSTƭz l_q[A9PZ'"*|NITԘL_1E:ȹC!dG3Q#I[|?XD?N;! ѳ-jdaήrVv=[ (,Wee cRCYJt ߘ`FNC)1O+az"<9 34%IYQcԅ{ݳZƢp>8Jr =YV塝 v<]4usMk75JP4>LS`'Z5BZVjb}ƓBvMs !$Fu,g_W$yr4z;5ﰭGmTp,]+=>t|% yq 3SǯN ~)B)4G*\IA塜}:܁2y5g,r wl 8N˛6:Z9C{:E,5Y?4;tOM\QUUs)Ñh?Bf35{w2z\8Iͤ;YISWl .Tk픘<;w5`+pwR1Y5e;Y)SOX.Vb{By<]\_fgE(tK%{T{pbOP_;{ZUw%w΋%vZ/8;;|yKvʹlİDTXm5u )%X@yw!J=ؗaz܁PFH(r@E>*N3ɮ;Е@*O^re(6SCZUur]i/xeerJThܿ$H-PujSԜ2j@hOTknt.svK̡̎=y}q+- 8QR,3Q,q״@F\m5;ͷsˤM=7'ܺ2wcRPxysfS:ť[)rl{wB߻YykF-q}y=A~>qQu~:ŭt>G|g]=7sFy迮y隸үL &I{Wѷ"wwwwwwwwwwwwwwwwwwwwwȨꎼ))))ǾXR_)wǎU T' 1Yib w,P%@u*;D* wHwȈE@FC@FC@F2b];d;d;dD! #! #Nb0ϑU8]7)vx.cWex;s#R}W v5 2;s%v;2I__5Ug+P̈mtNg g@D[&\(w*!<+JJo+-޺I(PGOa`+Je]*Sp`::9:YFnqMO?ǽ%X`:@\( d)=7\nES;_?n5M(厗`FۑsNX66'u0vѐvn m,YHR m3\at@0lMܱ v['jnN9yFE,@p,wtږuF;,/jD OV;q^.)fU!y؜Fܨ{<=xOպ;ܺ%yS;uk&a`@?\#'PNpV;p4)OLH['d+"khhowH\R-]#@ W3w[m2p#&+mo"X{ja]A7\Z';$,p=q,w 3|A{@MdZRunwH8YzXYM~1bDxV)pGF ;:`(SFf%ɖp=I#t4bpwH\Aj;n@G Cl/@H/>֕,ᗝf~ `YBR`fT>Y^Yg3 Dtӈp-°1ôuɊi*68V_ûcbh=6H$(|gٝBGqd DZwRLk0;J6,N$m_g &G5а[OyQQQc=;4=>:Lw6/z.t_5CԼܡq?Dv2Ÿ[܂ό|BMq:lw!&?eq( A",,](L<Ce(Rx0BBH,Cj!C^XRAAK芉`<3;swwwEa[_NN`ᓒrK,4vO*MtT(1K\-(.]l}i[in74} 2e/Y>fIk&9U{vkcQ@  qw \G,-k-JG2Jʹm1IsmKɒ%䉜dUlJ˳%Hۧciex;vܳC˙6(*Z-6'Kk>fpnݶ{ǥ9Q9f陗F7i;y4ܦkO]hKهT%~m0_l27ˁu}.Ϯo/1zEqW<ң";o4t[<Ѥ)1~ϫqo_gxGmCLڧQP#*L;#]м\r{m՞=D{Gh4?OZ$R܊b>ucE6ԇO_׶PSs59NauI~NL,q:ūh벳*OF϶> endobj 1 0 obj<> endobj 2 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj<>stream HWrF}+*/ed_`7lۅ%b@%JME! U6sN4/Ol`.n&+>:xnA2a;隮@u7ŀ9 rGbqT}җ*02i|cdv~PF3v>v`f7bbwӾ=Z]Bbx^̞wdơ8-W}c=M,=m"ќiGUD)[EU?~mk6aG=vpM_ϭ~ó"%ݦB|&$TVR<ְy,<΢9J!һXM4e,<< .-yy^2Ll^/kzY gߨX $ [)ߍkG;u[KXѲpuI4hv$vtɪImv_:x{0Q䴝t%)m.am*s "8[u5wo}ŧY_ ;-@˓b9XO俪dZfH3h\t<ڹcz ,:4(3Xeʪ3d\T1!NaUϤTG^|q(`3w~6!uE Amu-'L_~W]ff5w+]63Z]wcMpo@ˎ]s Wͦ">rhXF/ 䦞3ڞ,#i) 9 )7! endstream endobj 4 0 obj<> endobj 5 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 6 0 obj<>stream HVrF }Wq6S8qҦMlO>9J\ZLiR%:FݼDI?ܸpf/ً4 48or?r|Hg8lA>>n۪h QJ*h729xu&(U39^ X濦?ܐM/o@d!9BE]AA:?yQJ)~Zuy.0 ފF %ɽ].t u-#Euwdhe~|{tч%2bbB] V/^h!+A(^ ]7P7 lpxDV.y$e9EWd:=1јo'5d&DC:5k,R "<}_!!oؿu`<;O^vVs*PSzlJP ̙Zd 0{brV:9ۦ#(琢XH8FeDȟUǐwHsbl\[{)JU덨*G$6[Jtrb:$[Ҷ'Ke60NFC^'Z_F&.R.ڍG"XLe;~"(K`앆5pϯ"dR0} ]JjrtiRݘa'[l_UnQnr]뽃#. "gkgNLJq~f8CƄQ-nGUR7 6.+>Wuw P56UdX\5nDŽ~_Ȉ54Ũމx~D5Fza!3r 3C$醙88@VnAn]o2}Ppij?)!8IcuL6Ba>/O0<݄Wհd6E(*ptSS8j`[m"mM TM>VŤNCAj33ܓ& TX2;lt1 ^"loO1JUA54tpp >[mX5K!k81ոdIޡ]th-ZMfN܍&NoY.hc3r,֎%NRWh <.'Gi7}h@e[Y{gKޮ܋rPjDsLf"ts"BV<]$w]Xm L,Aq?6Z}ޚCal:M:DFl Cg+C^Mq?!\ʌ 289pry1&qp];%gs4LDt endstream endobj 7 0 obj<> endobj 8 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 9 0 obj<>stream HWMo6WEZԊm''竛",i0(%CE{gHJ,'YvL>g{3:!|tNqCt6&`jB#zdm6~K[K?Y"݆ON`MKkqJ&2 L jmN-+'bazUu.H}p!̱1*y`4lWxyW]jG2nUm؎,~ UY @3*kAh#K*(IrmN!/H*dxdx2YȓOU_BXdC9s('q"YY+#A,'ɴ-Hde*L}-\Ť0 6;HcatHcT٘6 M 3+؀/`6`Av$3Pضu,(pb⺬Tgv2ϟ3퓢A*HD]"N-)`%hp cWwGˢy2KؖICn dȊ 9]oLև7$ 0AhƝy D ۆ<4a|9$=j A?Zjq,}[6]' i4C5$uUAKw̚N!PD]@FVYmalUYКL|5M0>TD!~&%+kN^@ ޸J_,iCtn1)BF:Nji6 Ս;sOy o}^>1J .(ugLWs'`-φ}|!5-Eնw0ޏ9ڳ?qQr]dX`n N)UE^UY/s`UG]Ov}IܕWK'=ֿCFxO=];6w 23bdу}jJv}8|A:@D!Ý>!wU8+0 endstream endobj 10 0 obj<> endobj 11 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 12 0 obj<>stream HWnF}W З9Dȃ"ˉW6,y"STUݢ14s/,)(~y:.DHGۑNt߅pG^{Vh/aI |ח3Ci,FA%Dd%)O+lH"se M% *l+Y$`%Ƙj7n <(e;Iݳ~ObʳgLuRP)B HD'-0gCdG+ |kT1R0)$+d+TՅSo`&b836Ѵ =cy} Bi׭*TV#3-$DA'e%q&+Sv.°9>CޱF o&E, 5]vM/=D!JYp'[I\ 8௞Uw긺rfP@` ɹx"UE4'?@9tdpJ]giV4zC_y'ȳ>;e5t(-W gJ9k⩳[$eh^~~B?]_4Ci?*Nk~.kA ,?7r {#j &=yh` e H  hS2^Ƶ+ j8K( ^1fjfUgm~\kd_^4pj!y%*nt&o"VT~]cP.eECPzFÑcA5w}( C,y[p[R$~/5q"3NCPr0X# W?ڶIt>Mdt{<*+AC5ceY~o6IS 䔛w6ARq6 N)éӴè^9kl||$b#i7A`)I,J;6x':p"lڢ]fzL8NwLH&F~BK!m\ICV$eώ ?:gM`LKnt |xMwMHRkRex'Vq\YYy*ZJTa* ake:[A|׳b~ 0]ib~~V qWۘoKt{SÛ雟og0wl1'oEٳQ(o۵gS/-`鿽º||C&W|h =)ynab4Ppm/%lE\D<|IUwЉx> endobj 17 0 obj<> endobj 18 0 obj<> endobj 19 0 obj<> endobj 20 0 obj<> endobj 21 0 obj<> endobj 22 0 obj<> endobj 23 0 obj<> endobj 24 0 obj<> endobj 25 0 obj<> endobj 26 0 obj<> endobj 27 0 obj<>stream Menno BakkerAhead AAC Decoder library documentationAAC decoder library endstream endobj 28 0 obj<> endobj xref 0 29 0000000000 65535 f 0000014234 00000 n 0000014360 00000 n 0000014477 00000 n 0000015884 00000 n 0000016010 00000 n 0000016127 00000 n 0000017597 00000 n 0000017723 00000 n 0000017841 00000 n 0000019640 00000 n 0000019769 00000 n 0000019888 00000 n 0000021677 00000 n 0000021806 00000 n 0000021891 00000 n 0000022480 00000 n 0000022852 00000 n 0000023342 00000 n 0000023574 00000 n 0000023800 00000 n 0000024011 00000 n 0000024411 00000 n 0000024662 00000 n 0000025074 00000 n 0000025109 00000 n 0000025133 00000 n 0000025217 00000 n 0000028793 00000 n trailer <> startxref 116 %%EOF faad2-2.11.2/docs/libfaad.3000066400000000000000000000317531476153623600151760ustar00rootroot00000000000000.TH man 3 "15 Nov 2014" "The Debian Project" "libfaad Documentation" .SH "NAME" libfaad \- C library for AAC Decoding .SH "SYNOPSIS" .sp .ft B .nf #include .HP .BI "char NEAACDECAPI *NeAACDecGetErrorMessage(" "" "unsigned char " errcode ); .HP .B "unsigned long NEAACDECAPI NeAACDecGetCapabilities(void);" .HP .B "NeAACDecHandle NEAACDECAPI NeAACDecOpen(void);" .HP .B "NeAACDecConfigurationPtr NEAACDECAPI NeAACDecGetCurrentConfiguration(" .BI "NeAACDecHandle " hDecoder ");" .HP .B "unsigned char NEAACDECAPI NeAACDecSetConfiguration(" .BI "NeAACDecHandle " "hDecoder" ", NeAACDecConfigurationPtr " config ");" .HP /* Init the library based on info from the AAC file (ADTS/ADIF) */ .B "long NEAACDECAPI NeAACDecInit(" .BI "NeAACDecHandle " hDecoder ", unsigned char *" buffer ", unsigned long " "buffer_size" "," .BI "unsigned long *" "samplerate" ", unsigned char *" "channels" ");" .HP /* Init the library using a DecoderSpecificInfo */ .B "char NEAACDECAPI NeAACDecInit2(" .BI "NeAACDecHandle " "hDecoder" ", unsigned char *" "pBuffer" "," .BI "unsigned long " "SizeOfDecoderSpecificInfo" "," .BI "unsigned long *" "samplerate" ", unsigned char *"channels" ");" .HP /* Init the library for DRM */ .B "char NEAACDECAPI NeAACDecInitDRM(" .BI "NeAACDecHandle *" "hDecoder" ", unsigned long " "samplerate" ", unsigned char " "channels" ");" .HP .B "void NEAACDECAPI NeAACDecPostSeekReset(" .BI "NeAACDecHandle " "hDecoder" ", long "frame" ");" .HP .BI "void NEAACDECAPI NeAACDecClose(NeAACDecHandle " "hDecoder" ");" .HP .B "void NEAACDECAPI *NeAACDecDecode(" .BI "NeAACDecHandle " "hDecoder" ", NeAACDecFrameInfo *" "hInfo" "," .BI "unsigned char *" "buffer" "," .BI "unsigned long " "buffer_size" ");" .HP .B "void NEAACDECAPI *NeAACDecDecode2(" .BI "NeAACDecHandle " "hDecoder" ", NeAACDecFrameInfo *" "hInfo" "," .BI "unsigned char *" "buffer" ", unsigned long " "buffer_size" "," .BI "void **" "sample_buffer" ", unsigned long " "sample_buffer_size" ");" .HP .B "char NEAACDECAPI NeAACDecAudioSpecificConfig(" .BI "unsigned char *" "pBuffer" ", unsigned long " "buffer_size" "," .BI "mp4AudioSpecificConfig *" "mp4ASC" ");" .PP For normal use link it with the linker option \-lfaad\&. .PP For Digital Radio Mondiale link it with the linker option \-lfaad_drm\&. .sp .SH "DESCRIPTION" .PP .B NeAACDecGetErrorMessage .PP .B char NEAACDECAPI *NeAACDecGetErrorMessage(unsigned char errcode); .PP Convert an error code to text. .PP .B NeAACDecGetCapabilities .PP unsigned long NEAACAPI NeAACDecGetCapabilities(void); .PP .PP This function returns the capabilities of the decoder in a 32 bit unsigned integer. The bits that are set in the 32 bit unsigned integer define with which capabilities the library has been compiled. .PP The following capabilities are defined: .PP \ .PP #define LC_DEC_CAP \ \ \ \ \ (1<<0) /* Can decode LC */ .PP #define MAIN_DEC_CAP \ \ \ \ (1<<1) /* Can decode MAIN */ .PP #define LTP_DEC_CAP \ \ \ \ \ (1<<2) /* Can decode LTP */ .PP #define LD_DEC_CAP \ \ \ \ \ (1<<3) /* Can decode LD */ .PP #define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ .PP #define FIXED_POINT_CAP \ \ \ (1<<5) /* Fixed point */ .PP .PP This function can be called anytime. .PP .B NeAACDecOpen .PP NeAACDecHandle NEAACAPI NeAACDecOpen(void); .PP Returns a handle to a decoder context. .PP .B NeAACDecClose .PP void NEAACAPI NeAACDecClose(NeAACDecHandle hDecoder); .PP Closes a decoder context that has been opened by NeAACDecOpen. .PP .B NeAACDecGetCurrentConfiguration .PP NeAACDecConfigurationPtr NEAACAPI NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); .PP Returns the current decoder library configuration. .PP .B NeAACDecSetConfiguration .PP unsigned char NEAACAPI NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config); .PP .PP Sets a new configuration structure for the decoder library. .PP \ .PP Return values: .PP 0 \[en] Error, invalid configuration. .PP 1 \[en] OK .PP .B NeAACDecInit .PP long NEAACAPI NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels); .PP .PP .PP Initialises the decoder library using information from the AAC file. The buffer parameter should hold a small part of the AAC file, so that the initialization can be done based on the ADTS or ADIF header. Buffer can also be NULL, but then default initialization parameters will be used. .PP Return values: .PP < 0 \[en] Error .PP >= 0 \[en] Number of bytes read. This amount of bytes should be skipped by the program using the decoder library. .PP This function fills the samplerate and channels parameters with the detected values. .PP .B NeAACDecInit2 .PP char NEAACAPI NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); .PP Initialises the decoder library based on an AudioSpecificConfig as found inside a MP4 file. .PP Return values: .PP < 0 \[en] Error .PP 0 \- OK .PP This function fills the samplerate and channels parameters with the detected values. .PP .B NeAACDecInitDRM .PP char NEAACDECAPI NeAACDecInitDRM(NeAACDecHandle *hDecoder, unsigned long samplerate, unsigned char channels); .PP Initialises the decoder library for Digital Radio Mondiale using the specified sample rate and a DRM specific channel configuration. .PP Return values: .PP < 0 \[en] Error .PP 0 \- OK .PP Values for the channel configuration: .PP #define DRMCH_MONO 1 .PP #define DRMCH_STEREO 2 .PP #define DRMCH_SBR_MONO 3 .PP #define DRMCH_SBR_STEREO 4 .PP #define DRMCH_SBR_PS_STEREO 5 .PP .B NeAACDecDecode .PP void* NEAACAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); .PP .PP Decodes the AAC data passed in buffer. .PP Returns a pointer to a sample buffer or NULL. Info about the decoded frame is filled in in the NeAACDecFrameInfo structure. This structure holds information about errors during decoding, number of sample, number of channels and samplerate. The returned buffer contains the channel interleaved samples of the frame. .PP .B NeAACDecDecode2 .PP void NEAACDECAPI *NeAACDecDecode2(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer, unsigned long sample_buffer_size); .PP .B NeAACDecAudioSpecificConfig .PP char NEAACDECAPI NeAACDecAudioSpecificConfig(unsigned char *pBuffer, unsigned long buffer_size, mp4AudioSpecificConfig *mp4ASC); .PP .B Structures .RS 4 .PP NeAACDecConfiguration .RE .PP typedef struct NeAACDecConfiguration .PP { .PP \ \ unsigned char defObjectType; .PP \ \ unsigned long defSampleRate; .PP \ \ unsigned char outputFormat; .PP \ \ unsigned char downMatrix; .PP \ \ unsigned char useOldADTSFormat; .PP } NeAACDecConfiguration, *NeAACDecConfigurationPtr; .PP .PP Members: .PP defObjectType: determines the default object type assumed when the library is initialized without any data from the AAC file (eg: when NULL is passed as buffer in NeAACDecInit()). Can be any of the following values: .PP #define MAIN \ \ \ 1 /* MAIN */ .PP #define LC \ \ \ \ 2 /* Low Complexity (default) */ .PP #define SSR \ \ \ \ 3 /* Scalable SampleRate */ .PP #define LTP \ \ \ \ 4 /* Long Term Predition */ .PP #define HE_AAC \ \ 5 /* High Efficiency (SBR) */ .PP #define ER_LC \ \ 17 /* Error Resilient Low Complexity */ .PP #define ER_LTP \ \ 19 /* Error Resilient Long Term Prediction */ .PP #define LD \ \ \ \ 23 /* Low Delay */ .PP #define DRM_ER_LC 27 /* special object type for DRM only if linking with \-lfaad_drm */ .PP defSampleRate: determines the default samplerate assumed when the library is initialized. Default value is 44100. .PP outputFormat: determines the output format returned by the decoder library. Can be any of the following values: .PP #define FAAD_FMT_16BIT \ 1 /* 16 bit integers */ .PP #define FAAD_FMT_24BIT \ 2 /* 24 bit values packed in 32 bit integers */ .PP #define FAAD_FMT_32BIT \ 3 /* 32 bit integers */ .PP #define FAAD_FMT_FLOAT \ 4 /* single precision floating point */ .PP #define FAAD_FMT_DOUBLE 5 /* double precision floating point */ .PP downMatrix: determines whether a 5.1 channel AAC file should be downmatrixed to 2 channel output (value: 1) or whether the output should stay as 5.1 channels (value: 0). .PP useOldADTSFormat: determines whether the decoder should assume the currently defined 56 bit ADTS header (value: 0) or the 58 bit ADTS header (value: 1) defined in previous versions of the AAC standard. This value should normally always stay at the value 0, it only exists to provide playback capabilities for people that have AAC files with the old header format. All current encoders should output the new ADTS format. NeAACDecFrameInfo\ .PP This structure is returned after decoding a frame and provides info about the decoded frame. .PP typedef struct NeAACDecFrameInfo .PP { .PP \ \ unsigned long bytesconsumed; .PP \ \ unsigned long samples; .PP \ \ unsigned char channels; .PP \ \ unsigned char error; .PP \ \ unsigned long samplerate; .PP \ \ unsigned char sbr; .PP \ \ unsigned char object_type; .PP \ \ unsigned char header_type; .PP \ \ unsigned char num_front_channels; .PP \ \ unsigned char num_side_channels; .PP \ \ unsigned char num_back_channels; .PP \ \ unsigned char num_lfe_channels; .PP \ \ unsigned char channel_position[64]; .PP \ \ unsigned char ps; .PP } NeAACDecFrameInfo; .PP \ .PP Members: .PP bytesconsumed: the number of bytes consumed for decoding this frame. .PP samples: the number of audio samples in this frame. Each channel is counted separately. So when a single channel has 1024 samples and the file has 2 channels, this value will be 2*1024 = 2048. .PP channels: number of audio channels in this frame .PP error: contains an error value if an error occurred, 0 otherwise. .PP samplerate: the samplerate of the frame. .PP sbr: tells whether sbr is used in this file or not. Can contain any of the following values: .PP #define NO_SBR \ \ \ \ \ 0 /* no SBR used in this file */ .PP #define SBR_UPSAMPLED \ \ 1 /* upsampled SBR used */ .PP #define SBR_DOWNSAMPLED \ 2 /* downsampled SBR used */ .PP #define NO_SBR_UPSAMPLED 3 /* no SBR used, but file is upsampled by a factor 2 anyway */ .PP object_type: contains the object type of the AAC file. Can be any of the values as defined in 1.9.1. .PP header_type: contains the header type of the file that is being decoded. Can contain any of the following values: .PP #define RAW \ \ \ \ 0 /* No header */ .PP #define ADIF \ \ \ 1 /* single ADIF header at the beginning of the file */ .PP #define ADTS \ \ \ 2 /* ADTS header at the beginning of each frame */ .PP num_front_channels, num_side_channels, num_back_channels, num_lfe_channels: each of these values contain the number of channels of a certain type. .PP channel_position[64]: contains the position of each of the channels that is returned by the frame decode function. Can contain any of the following values: .PP #define FRONT_CHANNEL_CENTER (1) .PP #define FRONT_CHANNEL_LEFT \ (2) .PP #define FRONT_CHANNEL_RIGHT \ (3) .PP #define SIDE_CHANNEL_LEFT \ \ (4) .PP #define SIDE_CHANNEL_RIGHT \ (5) .PP #define BACK_CHANNEL_LEFT \ \ (6) .PP #define BACK_CHANNEL_RIGHT \ (7) .PP #define BACK_CHANNEL_CENTER \ (8) .PP #define LFE_CHANNEL \ \ \ \ \ (9) .PP #define UNKNOWN_CHANNEL \ \ \ (0) .PP ps: PS not used (0) or used (1). API usage\ .PP The following pseudo\-code describes how and in which order to use the different library functions. .PP \ .PP unsigned long cap = NeAACDecGetCapabilities(); .PP // Check if decoder has the needed capabilities .PP \ .PP // Open the library .PP NeAACDecHandle hAac = NeAACDecOpen(); .PP \ .PP // Get the current config .PP NeAACDecConfigurationPtr conf = NeAACDecGetCurrentConfiguration(hAac); .PP \ .PP // .PP // If needed change some of the values in conf .PP // .PP \ .PP // Set the new configuration .PP NeAACDecSetConfiguration(hAac, conf); .PP .PP // Initialise the library using one of the initialization functions .PP char err = NeAACDecInit2(hAac, asc, asc_size, &samplerate, &channels); .PP if (err != 0) .PP { .PP \ // .PP \ // Handle error .PP \ // .PP } .PP \ .PP // Loop until decoding finished .PP do { .PP \ // .PP \ // Put next frame in buffer .PP \ // .PP \ .PP \ // Decode the frame in buffer .PP \ \ \ \ samplebuffer = NeAACDecDecode(hAac, &hInfo, buffer, .PP buffer_size); .PP \ .PP if ((hInfo.error == 0) && (hInfo.samples > 0)) .PP { .PP \ // .PP \ // do what you need to do with the decoded samples .PP \ // .PP } else if (hInfo.error != 0) { .PP \ // .PP \ // Some error occurred while decoding this frame .PP \ // .PP } .PP } while (more data available); .PP \ .PP NeAACDecClose(hAac); .SH "SEE ALSO" .PP \fBlibfaad_drm\fR(3), \fBlibfaac\fR(3)\&. .SH "AUTHOR" .PP Menno Bakker .PP Man Page by Julian Cable faad2-2.11.2/frontend/000077500000000000000000000000001476153623600144065ustar00rootroot00000000000000faad2-2.11.2/frontend/audio.c000066400000000000000000000367741476153623600156740ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: audio.c,v 1.30 2015/01/22 09:40:52 knik Exp $ **/ #ifdef _WIN32 #include #endif #include #include #include #include #include #include #include "unicode_support.h" #include "audio.h" static size_t write_wav_header(audio_file *aufile); static size_t write_wav_extensible_header(audio_file *aufile, long channelMask); static size_t write_audio_16bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static size_t write_audio_24bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static size_t write_audio_32bit(audio_file *aufile, void *sample_buffer, unsigned int samples); static size_t write_audio_float(audio_file *aufile, void *sample_buffer, unsigned int samples); audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask) { audio_file *aufile = malloc(sizeof(audio_file)); aufile->outputFormat = outputFormat; aufile->samplerate = samplerate; aufile->channels = channels; aufile->total_samples = 0; aufile->fileType = fileType; aufile->channelMask = channelMask; switch (outputFormat) { case FAAD_FMT_16BIT: aufile->bits_per_sample = 16; break; case FAAD_FMT_24BIT: aufile->bits_per_sample = 24; break; case FAAD_FMT_32BIT: case FAAD_FMT_FLOAT: aufile->bits_per_sample = 32; break; default: if (aufile) free(aufile); return NULL; } if(infile[0] == '-') { #ifdef _WIN32 _setmode(_fileno(stdout), O_BINARY); #endif aufile->sndfile = stdout; aufile->toStdio = 1; } else { aufile->toStdio = 0; aufile->sndfile = faad_fopen(infile, "wb"); } if (aufile->sndfile == NULL) { if (aufile) free(aufile); return NULL; } if (aufile->fileType == OUTPUT_WAV) { if (aufile->channelMask) write_wav_extensible_header(aufile, aufile->channelMask); else write_wav_header(aufile); } return aufile; } size_t write_audio_file(audio_file *aufile, void *sample_buffer, int samples) { char *buf = (char *)sample_buffer; switch (aufile->outputFormat) { case FAAD_FMT_16BIT: return write_audio_16bit(aufile, buf, samples); case FAAD_FMT_24BIT: return write_audio_24bit(aufile, buf, samples); case FAAD_FMT_32BIT: return write_audio_32bit(aufile, buf, samples); case FAAD_FMT_FLOAT: return write_audio_float(aufile, buf, samples); default: return 0; } // return 0; } void close_audio_file(audio_file *aufile) { if ((aufile->fileType == OUTPUT_WAV) && (aufile->toStdio == 0)) { fseek(aufile->sndfile, 0, SEEK_SET); if (aufile->channelMask) write_wav_extensible_header(aufile, aufile->channelMask); else write_wav_header(aufile); } if (aufile->toStdio == 0) fclose(aufile->sndfile); if (aufile) free(aufile); } static size_t write_wav_header(audio_file *aufile) { unsigned char header[44]; unsigned char* p = header; unsigned int bytes = (aufile->bits_per_sample + 7) / 8; float data_size = (float)bytes * aufile->total_samples; unsigned long word32; *p++ = 'R'; *p++ = 'I'; *p++ = 'F'; *p++ = 'F'; word32 = (data_size + (44 - 8) < (float)MAXWAVESIZE) ? (unsigned long)data_size + (44 - 8) : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); *p++ = 'W'; *p++ = 'A'; *p++ = 'V'; *p++ = 'E'; *p++ = 'f'; *p++ = 'm'; *p++ = 't'; *p++ = ' '; *p++ = 0x10; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; if (aufile->outputFormat == FAAD_FMT_FLOAT) { *p++ = 0x03; *p++ = 0x00; } else { *p++ = 0x01; *p++ = 0x00; } *p++ = (unsigned char)(aufile->channels >> 0); *p++ = (unsigned char)(aufile->channels >> 8); word32 = (unsigned long)(aufile->samplerate + 0.5); *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = aufile->samplerate * bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); *p++ = 'd'; *p++ = 'a'; *p++ = 't'; *p++ = 'a'; word32 = data_size < MAXWAVESIZE ? (unsigned long)data_size : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); return fwrite(header, sizeof(header), 1, aufile->sndfile); } static size_t write_wav_extensible_header(audio_file *aufile, long channelMask) { unsigned char header[68]; unsigned char* p = header; unsigned int bytes = (aufile->bits_per_sample + 7) / 8; float data_size = (float)bytes * aufile->total_samples; unsigned long word32; *p++ = 'R'; *p++ = 'I'; *p++ = 'F'; *p++ = 'F'; word32 = (data_size + (68 - 8) < (float)MAXWAVESIZE) ? (unsigned long)data_size + (68 - 8) : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); *p++ = 'W'; *p++ = 'A'; *p++ = 'V'; *p++ = 'E'; *p++ = 'f'; *p++ = 'm'; *p++ = 't'; *p++ = ' '; *p++ = /*0x10*/0x28; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; /* WAVE_FORMAT_EXTENSIBLE */ *p++ = 0xFE; *p++ = 0xFF; *p++ = (unsigned char)(aufile->channels >> 0); *p++ = (unsigned char)(aufile->channels >> 8); word32 = (unsigned long)(aufile->samplerate + 0.5); *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = aufile->samplerate * bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); word32 = bytes * aufile->channels; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); /* cbSize */ *p++ = (unsigned char)(22); *p++ = (unsigned char)(0); /* WAVEFORMATEXTENSIBLE */ /* wValidBitsPerSample */ *p++ = (unsigned char)(aufile->bits_per_sample >> 0); *p++ = (unsigned char)(aufile->bits_per_sample >> 8); /* dwChannelMask */ word32 = channelMask; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); /* SubFormat */ if (aufile->outputFormat == FAAD_FMT_FLOAT) { /* KSDATAFORMAT_SUBTYPE_IEEE_FLOAT: 00000003-0000-0010-8000-00aa00389b71 */ *p++ = 0x03; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x10; *p++ = 0x00; *p++ = 0x80; *p++ = 0x00; *p++ = 0x00; *p++ = 0xaa; *p++ = 0x00; *p++ = 0x38; *p++ = 0x9b; *p++ = 0x71; } else { /* KSDATAFORMAT_SUBTYPE_PCM: 00000001-0000-0010-8000-00aa00389b71 */ *p++ = 0x01; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x10; *p++ = 0x00; *p++ = 0x80; *p++ = 0x00; *p++ = 0x00; *p++ = 0xaa; *p++ = 0x00; *p++ = 0x38; *p++ = 0x9b; *p++ = 0x71; } /* end WAVEFORMATEXTENSIBLE */ *p++ = 'd'; *p++ = 'a'; *p++ = 't'; *p++ = 'a'; word32 = data_size < MAXWAVESIZE ? (unsigned long)data_size : (unsigned long)MAXWAVESIZE; *p++ = (unsigned char)(word32 >> 0); *p++ = (unsigned char)(word32 >> 8); *p++ = (unsigned char)(word32 >> 16); *p++ = (unsigned char)(word32 >> 24); return fwrite(header, sizeof(header), 1, aufile->sndfile); } static size_t write_audio_16bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { size_t ret; unsigned int i; short *sample_buffer16 = (short*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i+6 <= samples; i += aufile->channels) { short r1, r2, r3, r4, r5, r6; r1 = sample_buffer16[i]; r2 = sample_buffer16[i+1]; r3 = sample_buffer16[i+2]; r4 = sample_buffer16[i+3]; r5 = sample_buffer16[i+4]; r6 = sample_buffer16[i+5]; sample_buffer16[i] = r2; sample_buffer16[i+1] = r3; sample_buffer16[i+2] = r1; sample_buffer16[i+3] = r6; sample_buffer16[i+4] = r4; sample_buffer16[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*2] = (char)(sample_buffer16[i] & 0xFF); data[i*2+1] = (char)((sample_buffer16[i] >> 8) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static size_t write_audio_24bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { size_t ret; unsigned int i; int32_t *sample_buffer24 = (int32_t*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i+6 <= samples; i += aufile->channels) { long r1, r2, r3, r4, r5, r6; r1 = sample_buffer24[i]; r2 = sample_buffer24[i+1]; r3 = sample_buffer24[i+2]; r4 = sample_buffer24[i+3]; r5 = sample_buffer24[i+4]; r6 = sample_buffer24[i+5]; sample_buffer24[i] = r2; sample_buffer24[i+1] = r3; sample_buffer24[i+2] = r1; sample_buffer24[i+3] = r6; sample_buffer24[i+4] = r4; sample_buffer24[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*3] = (char)(sample_buffer24[i] & 0xFF); data[i*3+1] = (char)((sample_buffer24[i] >> 8) & 0xFF); data[i*3+2] = (char)((sample_buffer24[i] >> 16) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static size_t write_audio_32bit(audio_file *aufile, void *sample_buffer, unsigned int samples) { size_t ret; unsigned int i; int32_t *sample_buffer32 = (int32_t*)sample_buffer; char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i+6 <= samples; i += aufile->channels) { long r1, r2, r3, r4, r5, r6; r1 = sample_buffer32[i]; r2 = sample_buffer32[i+1]; r3 = sample_buffer32[i+2]; r4 = sample_buffer32[i+3]; r5 = sample_buffer32[i+4]; r6 = sample_buffer32[i+5]; sample_buffer32[i] = r2; sample_buffer32[i+1] = r3; sample_buffer32[i+2] = r1; sample_buffer32[i+3] = r6; sample_buffer32[i+4] = r4; sample_buffer32[i+5] = r5; } } for (i = 0; i < samples; i++) { data[i*4] = (char)(sample_buffer32[i] & 0xFF); data[i*4+1] = (char)((sample_buffer32[i] >> 8) & 0xFF); data[i*4+2] = (char)((sample_buffer32[i] >> 16) & 0xFF); data[i*4+3] = (char)((sample_buffer32[i] >> 24) & 0xFF); } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } static size_t write_audio_float(audio_file *aufile, void *sample_buffer, unsigned int samples) { size_t ret; unsigned int i; float *sample_buffer_f = (float*)sample_buffer; unsigned char *data = malloc(samples*aufile->bits_per_sample*sizeof(char)/8); aufile->total_samples += samples; if (aufile->channels == 6 && aufile->channelMask) { for (i = 0; i+6 <= samples; i += aufile->channels) { float r1, r2, r3, r4, r5, r6; r1 = sample_buffer_f[i]; r2 = sample_buffer_f[i+1]; r3 = sample_buffer_f[i+2]; r4 = sample_buffer_f[i+3]; r5 = sample_buffer_f[i+4]; r6 = sample_buffer_f[i+5]; sample_buffer_f[i] = r2; sample_buffer_f[i+1] = r3; sample_buffer_f[i+2] = r1; sample_buffer_f[i+3] = r6; sample_buffer_f[i+4] = r4; sample_buffer_f[i+5] = r5; } } for (i = 0; i < samples; i++) { int exponent, mantissa, negative = 0 ; float in = sample_buffer_f[i]; data[i*4] = 0; data[i*4+1] = 0; data[i*4+2] = 0; data[i*4+3] = 0; if (in == 0.0) continue; if (in < 0.0) { in *= -1.0; negative = 1; } in = (float)frexp(in, &exponent); exponent += 126; in *= (float)0x1000000; mantissa = (((int)in) & 0x7FFFFF); if (negative) data[i*4+3] |= 0x80; if (exponent & 0x01) data[i*4+2] |= 0x80; data[i*4] = mantissa & 0xFF; data[i*4+1] = (mantissa >> 8) & 0xFF; data[i*4+2] |= (mantissa >> 16) & 0x7F; data[i*4+3] |= (exponent >> 1) & 0x7F; } ret = fwrite(data, samples, aufile->bits_per_sample/8, aufile->sndfile); if (data) free(data); return ret; } faad2-2.11.2/frontend/audio.h000066400000000000000000000037711476153623600156700ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: audio.h,v 1.19 2007/11/01 12:33:29 menno Exp $ **/ #ifndef AUDIO_H_INCLUDED #define AUDIO_H_INCLUDED #ifdef __cplusplus extern "C" { #endif #define MAXWAVESIZE 4294967040LU #define OUTPUT_WAV 1 #define OUTPUT_RAW 2 typedef struct { int toStdio; int outputFormat; FILE *sndfile; unsigned int fileType; unsigned long samplerate; unsigned int bits_per_sample; unsigned int channels; unsigned long total_samples; long channelMask; } audio_file; audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask); size_t write_audio_file(audio_file *aufile, void *sample_buffer, int samples); void close_audio_file(audio_file *aufile); #ifdef __cplusplus } #endif #endif faad2-2.11.2/frontend/faad.man000066400000000000000000000043071476153623600160020ustar00rootroot00000000000000.TH FAAD "1" "October 2006" "faad 2.5" "" .SH NAME faad \(em Process an Advanced Audio Codec stream .SH "SYNOPSIS" .B faad [options] [\-w | \-o | \-a ] input_filename .SH "DESCRIPTION" This utility provides a command line interface to libfaad2. This program reads in MPEG\(hy4 AAC files, processes, and outputs them in either Microsoft WAV, MPEG\(hy4 AAC ADTS, or standard PCM formats. .SH "OPTIONS" .TP .BI \-a " " ", \-\^\-adtsout" " " Sets the processing to output to the specified file in MPEG\(hy4 AAC ADTS format .TP .BI \-b " " ", \-\^\-bits" " " Set the output (individual) sample format. The number takes one of the following values: .RS .RS 1: 16\(hybit PCM data (default). .br 2: 24\(hybit PCM data. .br 3: 32\(hybit PCM data. .br 4: 32\(hybit floating\(hypoint data. .br 5: 64\(hybit floating\(hypoint data. .RE .RE .TP .B \-d ", \-\^\-downmix" Set the processing to downsample from 5.1 (surround sound and bass) channels to 2 channels (stereo). .TP .BI \-f " " ", \-\^\-format" " " Set the output file format. The number takes one of the following values: .RS .RS 1: Microsoft WAV format (default). .br 2: Raw PCM data. .RE .RE .TP .BI \-g Set the processing to not perform gapless decoding. .TP .B \-h ", \-\^\-help" Shows a usage summary. .TP .B \-i ", \-\^\-info" Shows information about the about the input file. .TP .BI \-l " " ", \-\^\-objecttype" " " Sets the MPEG\hy(4 profile and object type for the processing to use. The number takes one of the following values: .RS .RS 1: Main object type. .br 2: Low Complexity (LC) object type (default). .br 4: Long Term Prediction (LTP) object type. .br 23: Low Delay (LD) object type. .RE .RE .TP .BI \-o " " ", \-\^\-outfile" " " Sets the filename for processing output. .TP .B \-q ", \-\^\-quiet" Quiet \- Suppresses status messages during processing. .TP .B \-t ", \-\^\-oldformat" Sets the processing to use the old MPEG\(hy4 AAC ADTS format when outputting in said format. .TP .B \-w ", \-\^\-stdio" Sets the processing output to be sent to the standard out. .SH "AUTHOR" Matthew W. S. Bell .SH "SEE ALSO" \fBfaac\fP(1)faad2-2.11.2/frontend/getopt.c000066400000000000000000000535311476153623600160630ustar00rootroot00000000000000/* Getopt for GNU. NOTE: getopt is now part of the C library, so if you don't know what "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu before changing it! Copyright (C) 1987, 88, 89, 90, 91, 92, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef __STDC__ # ifndef const # define const # endif #endif /* This tells Alpha OSF/1 not to define a getopt prototype in . */ #ifndef _NO_PROTO #define _NO_PROTO #endif #include #include /* Comment out all this code if we are using the GNU C Library, and are not actually compiling the library itself. This code is part of the GNU C Library, but also included in many other GNU distributions. Compiling and linking in this code is a waste when using the GNU C library (especially if it is a shared library). Rather than having every GNU program understand `configure --with-gnu-libc' and omit the object files, it is simpler to just do this in the source for each such file. */ #if defined (_LIBC) || !defined (__GNU_LIBRARY__) || !__MacOSX__ /* This needs to come after some library #include to get __GNU_LIBRARY__ defined. */ #ifdef __GNU_LIBRARY__ /* Don't include stdlib.h for non-GNU C libraries because some of them contain conflicting prototypes for getopt. */ #include #endif /* GNU C library. */ /* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a long-named option. Because this is not POSIX.2 compliant, it is being phased out. */ /* #define GETOPT_COMPAT */ /* This version of `getopt' appears to the caller like standard Unix `getopt' but it behaves differently for the user, since it allows the user to intersperse the options with the other arguments. As `getopt' works, it permutes the elements of ARGV so that, when it is done, all the options precede everything else. Thus all application programs are extended to handle flexible argument order. Setting the environment variable POSIXLY_CORRECT disables permutation. Then the behavior is completely standard. GNU application programs can use a third alternative mode in which they can distinguish the relative order of options and other arguments. */ #include "getopt.h" /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ char *optarg = 0; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ /* XXX 1003.2 says this must be 1 before any call. */ int optind = 0; /* The next char to be scanned in the option-element in which the last option character we returned was found. This allows us to pick up the scan where we left off. If this is zero, or a null string, it means resume the scan by advancing to the next ARGV-element. */ static char *nextchar; /* Callers store zero here to inhibit the error message for unrecognized options. */ int opterr = 1; /* Set to an option character which was unrecognized. This must be initialized on some systems to avoid linking in the system's own getopt implementation. */ #define BAD_OPTION '\0' int optopt = BAD_OPTION; /* Describe how to deal with options that follow non-option ARGV-elements. If the caller did not specify anything, the default is REQUIRE_ORDER if the environment variable POSIXLY_CORRECT is defined, PERMUTE otherwise. REQUIRE_ORDER means don't recognize them as options; stop option processing when the first non-option is seen. This is what Unix does. This mode of operation is selected by either setting the environment variable POSIXLY_CORRECT, or using `+' as the first character of the list of option characters. PERMUTE is the default. We permute the contents of ARGV as we scan, so that eventually all the non-options are at the end. This allows options to be given in any order, even with programs that were not written to expect this. RETURN_IN_ORDER is an option available to programs that were written to expect options and other ARGV-elements in any order and that care about the ordering of the two. We describe each non-option ARGV-element as if it were the argument of an option with character code 1. Using `-' as the first character of the list of option characters selects this mode of operation. The special argument `--' forces an end of option-scanning regardless of the value of `ordering'. In the case of RETURN_IN_ORDER, only `--' can cause `getopt' to return EOF with `optind' != ARGC. */ static enum { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER } ordering; #ifdef __GNU_LIBRARY__ /* We want to avoid inclusion of string.h with non-GNU libraries because there are many ways it can cause trouble. On some systems, it contains special magic macros that don't work in GCC. */ #include #define my_index strchr #define my_strlen strlen #else /* Avoid depending on library functions or files whose names are inconsistent. */ #if __STDC__ || defined(PROTO) extern char *getenv(const char *name); extern int strcmp (const char *s1, const char *s2); static int my_strlen(const char *s); static char *my_index (const char *str, int chr); #else extern char *getenv (const char *name); #endif static int my_strlen(const char *str) { int n = 0; while (*str++) n++; return n; } static char *my_index(const char *str, int chr) { while (*str) { if (*str == chr) return (char *) str; str++; } return 0; } #endif /* GNU C library. */ /* Handle permutation of arguments. */ /* Describe the part of ARGV that contains non-options that have been skipped. `first_nonopt' is the index in ARGV of the first of them; `last_nonopt' is the index after the last of them. */ static int first_nonopt; static int last_nonopt; /* Exchange two adjacent subsequences of ARGV. One subsequence is elements [first_nonopt,last_nonopt) which contains all the non-options that have been skipped so far. The other is elements [last_nonopt,optind), which contains all the options processed since those non-options were skipped. `first_nonopt' and `last_nonopt' are relocated so that they describe the new indices of the non-options in ARGV after they are moved. To perform the swap, we first reverse the order of all elements. So all options now come before all non options, but they are in the wrong order. So we put back the options and non options in original order by reversing them again. For example: original input: a b c -x -y reverse all: -y -x c b a reverse options: -x -y c b a reverse non options: -x -y a b c */ #if __STDC__ || defined(PROTO) static void exchange (char **argv); #endif static void exchange (char **argv) { char *temp, **first, **last; /* Reverse all the elements [first_nonopt, optind) */ first = &argv[first_nonopt]; last = &argv[optind-1]; while (first < last) { temp = *first; *first = *last; *last = temp; first++; last--; } /* Put back the options in order */ first = &argv[first_nonopt]; first_nonopt += (optind - last_nonopt); last = &argv[first_nonopt - 1]; while (first < last) { temp = *first; *first = *last; *last = temp; first++; last--; } /* Put back the non options in order */ first = &argv[first_nonopt]; last_nonopt = optind; last = &argv[last_nonopt-1]; while (first < last) { temp = *first; *first = *last; *last = temp; first++; last--; } } /* Scan elements of ARGV (whose length is ARGC) for option characters given in OPTSTRING. If an element of ARGV starts with '-', and is not exactly "-" or "--", then it is an option element. The characters of this element (aside from the initial '-') are option characters. If `getopt' is called repeatedly, it returns successively each of the option characters from each of the option elements. If `getopt' finds another option character, it returns that character, updating `optind' and `nextchar' so that the next call to `getopt' can resume the scan with the following option character or ARGV-element. If there are no more option characters, `getopt' returns `EOF'. Then `optind' is the index in ARGV of the first ARGV-element that is not an option. (The ARGV-elements have been permuted so that those that are not options now come last.) OPTSTRING is a string containing the legitimate option characters. If an option character is seen that is not listed in OPTSTRING, return BAD_OPTION after printing an error message. If you set `opterr' to zero, the error message is suppressed but we still return BAD_OPTION. If a char in OPTSTRING is followed by a colon, that means it wants an arg, so the following text in the same ARGV-element, or the text of the following ARGV-element, is returned in `optarg'. Two colons mean an option that wants an optional arg; if there is text in the current ARGV-element, it is returned in `optarg', otherwise `optarg' is set to zero. If OPTSTRING starts with `-' or `+', it requests different methods of handling the non-option ARGV-elements. See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. Long-named options begin with `--' instead of `-'. Their names may be abbreviated as long as the abbreviation is unique or is an exact match for some defined option. If they have an argument, it follows the option name in the same ARGV-element, separated from the option name by a `=', or else the in next ARGV-element. When `getopt' finds a long-named option, it returns 0 if that option's `flag' field is nonzero, the value of the option's `val' field if the `flag' field is zero. The elements of ARGV aren't really const, because we permute them. But we pretend they're const in the prototype to be compatible with other systems. LONGOPTS is a vector of `struct option' terminated by an element containing a name which is zero. LONGIND returns the index in LONGOPT of the long-named option found. It is only valid when a long-named option has been found by the most recent call. If LONG_ONLY is nonzero, '-' as well as '--' can introduce long-named options. */ int _getopt_internal(int argc, char *const *argv, const char *optstring, const struct option *longopts, int *longind, int long_only) { int option_index; optarg = 0; /* Initialize the internal data when the first call is made. Start processing options with ARGV-element 1 (since ARGV-element 0 is the program name); the sequence of previously skipped non-option ARGV-elements is empty. */ if (optind == 0) { first_nonopt = last_nonopt = optind = 1; nextchar = NULL; /* Determine how to handle the ordering of options and nonoptions. */ if (optstring[0] == '-') { ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { ordering = REQUIRE_ORDER; ++optstring; } else if (getenv ("POSIXLY_CORRECT") != NULL) ordering = REQUIRE_ORDER; else ordering = PERMUTE; } if (nextchar == NULL || *nextchar == '\0') { if (ordering == PERMUTE) { /* If we have just processed some options following some non-options, exchange them so that the options come first. */ if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (last_nonopt != optind) first_nonopt = optind; /* Now skip any additional non-options and extend the range of non-options previously skipped. */ while (optind < argc && (argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) optind++; last_nonopt = optind; } /* Special ARGV-element `--' means premature end of options. Skip it like a null option, then exchange with previous non-options as if it were an option, then skip everything else like a non-option. */ if (optind != argc && !strcmp (argv[optind], "--")) { optind++; if (first_nonopt != last_nonopt && last_nonopt != optind) exchange ((char **) argv); else if (first_nonopt == last_nonopt) first_nonopt = optind; last_nonopt = argc; optind = argc; } /* If we have done all the ARGV-elements, stop the scan and back over any non-options that we skipped and permuted. */ if (optind == argc) { /* Set the next-arg-index to point at the non-options that we previously skipped, so the caller will digest them. */ if (first_nonopt != last_nonopt) optind = first_nonopt; return EOF; } /* If we have come to a non-option and did not permute it, either stop the scan or describe it to the caller and pass it by. */ if ((argv[optind][0] != '-' || argv[optind][1] == '\0') #ifdef GETOPT_COMPAT && (longopts == NULL || argv[optind][0] != '+' || argv[optind][1] == '\0') #endif /* GETOPT_COMPAT */ ) { if (ordering == REQUIRE_ORDER) return EOF; optarg = argv[optind++]; return 1; } /* We have found another option-ARGV-element. Start decoding its characters. */ nextchar = (argv[optind] + 1 + (longopts != NULL && argv[optind][1] == '-')); } if (longopts != NULL && ((argv[optind][0] == '-' && (argv[optind][1] == '-' || long_only)) #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ )) { const struct option *p; char *s = nextchar; int exact = 0; int ambig = 0; const struct option *pfound = NULL; int indfound = 0; while (*s && *s != '=') s++; /* Test all options for either exact match or abbreviated matches. */ for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp (p->name, nextchar, s - nextchar)) { if (s - nextchar == my_strlen (p->name)) { /* Exact match found. */ pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { /* First nonexact match found. */ pfound = p; indfound = option_index; } else /* Second nonexact match found. */ ambig = 1; } if (ambig && !exact) { if (opterr) fprintf (stderr, "%s: option `%s' is ambiguous\n", argv[0], argv[optind]); nextchar += my_strlen (nextchar); optind++; return BAD_OPTION; } if (pfound != NULL) { option_index = indfound; optind++; if (*s) { /* Don't test has_arg with >, because some C compilers don't allow it to be used on enums. */ if (pfound->has_arg) optarg = s + 1; else { if (opterr) { if (argv[optind - 1][1] == '-') /* --option */ fprintf (stderr, "%s: option `--%s' doesn't allow an argument\n", argv[0], pfound->name); else /* +option or -option */ fprintf (stderr, "%s: option `%c%s' doesn't allow an argument\n", argv[0], argv[optind - 1][0], pfound->name); } nextchar += my_strlen (nextchar); return BAD_OPTION; } } else if (pfound->has_arg == 1) { if (optind < argc) optarg = argv[optind++]; else { if (opterr) fprintf (stderr, "%s: option `%s' requires an argument\n", argv[0], argv[optind - 1]); nextchar += my_strlen (nextchar); return optstring[0] == ':' ? ':' : BAD_OPTION; } } nextchar += my_strlen (nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } /* Can't find it as a long option. If this is not getopt_long_only, or the option starts with '--' or is not a valid short option, then it's an error. Otherwise interpret it as a short option. */ if (!long_only || argv[optind][1] == '-' #ifdef GETOPT_COMPAT || argv[optind][0] == '+' #endif /* GETOPT_COMPAT */ || my_index (optstring, *nextchar) == NULL) { if (opterr) { if (argv[optind][1] == '-') /* --option */ fprintf (stderr, "%s: unrecognized option `--%s'\n", argv[0], nextchar); else /* +option or -option */ fprintf (stderr, "%s: unrecognized option `%c%s'\n", argv[0], argv[optind][0], nextchar); } nextchar = (char *) ""; optind++; return BAD_OPTION; } } /* Look at and handle the next option-character. */ { char c = *nextchar++; char *temp = my_index (optstring, c); /* Increment `optind' when we start to process its last character. */ if (*nextchar == '\0') ++optind; if (temp == NULL || c == ':') { if (opterr) { #if 0 if (c < 040 || c >= 0177) fprintf (stderr, "%s: unrecognized option, character code 0%o\n", argv[0], c); else fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c); #endif } optopt = c; return BAD_OPTION; } if (temp[1] == ':') { if (temp[2] == ':') { /* This is an option that accepts an argument optionally. */ if (*nextchar != '\0') { optarg = nextchar; optind++; } else optarg = 0; nextchar = NULL; } else { /* This is an option that requires an argument. */ if (*nextchar != '\0') { optarg = nextchar; /* If we end this ARGV-element by taking the rest as an arg, we must advance to the next element now. */ optind++; } else if (optind == argc) { if (opterr) { #if 0 fprintf (stderr, "%s: option `-%c' requires an argument\n", argv[0], c); #else /* 1003.2 specifies the format of this message. */ fprintf (stderr, "%s: option requires an argument -- %c\n", argv[0], c); #endif } optopt = c; if (optstring[0] == ':') c = ':'; else c = BAD_OPTION; } else /* We already incremented `optind' once; increment it again when taking next ARGV-elt as argument. */ optarg = argv[optind++]; nextchar = NULL; } } return c; } } int getopt (int argc, char *const *argv, const char *optstring) { return _getopt_internal (argc, argv, optstring, (const struct option *) 0, (int *) 0, 0); } int getopt_long(int argc, char *const *argv, const char *options, const struct option *long_options, int *opt_index) { return _getopt_internal (argc, argv, options, long_options, opt_index, 0); } #endif /* _LIBC or not __GNU_LIBRARY__. */ #ifdef TEST /* Compile with -DTEST to make an executable for use in testing the above definition of `getopt'. */ int main (argc, argv) int argc; char **argv; { int c; int digit_optind = 0; while (1) { int this_option_optind = optind ? optind : 1; c = getopt (argc, argv, "abc:d:0123456789"); if (c == EOF) break; switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (digit_optind != 0 && digit_optind != this_option_optind) printf ("digits occur in two different argv-elements.\n"); digit_optind = this_option_optind; printf ("option %c\n", c); break; case 'a': printf ("option a\n"); break; case 'b': printf ("option b\n"); break; case 'c': printf ("option c with value `%s'\n", optarg); break; case BAD_OPTION: break; default: printf ("?? getopt returned character code 0%o ??\n", c); } } if (optind < argc) { printf ("non-option ARGV-elements: "); while (optind < argc) printf ("%s ", argv[optind++]); printf ("\n"); } exit (0); } #endif /* TEST */ faad2-2.11.2/frontend/getopt.h000066400000000000000000000106601476153623600160640ustar00rootroot00000000000000/* Declarations for getopt. Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef _GETOPT_H #define _GETOPT_H 1 #ifdef __cplusplus extern "C" { #endif #ifndef __MacOSX__ /* For communication from `getopt' to the caller. When `getopt' finds an option that takes an argument, the argument value is returned here. Also, when `ordering' is RETURN_IN_ORDER, each non-option ARGV-element is returned here. */ extern char *optarg; /* Index in ARGV of the next element to be scanned. This is used for communication to and from the caller and for communication between successive calls to `getopt'. On entry to `getopt', zero means this is the first call; initialize. When `getopt' returns EOF, this is the index of the first of the non-option elements that the caller should itself scan. Otherwise, `optind' communicates from one call to the next how much of ARGV has been scanned so far. */ extern int optind; /* Callers store zero here to inhibit the error message `getopt' prints for unrecognized options. */ extern int opterr; /* Set to an option character which was unrecognized. */ extern int optopt; #endif /* Describe the long-named options requested by the application. The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector of `struct option' terminated by an element containing a name which is zero. The field `has_arg' is: no_argument (or 0) if the option does not take an argument, required_argument (or 1) if the option requires an argument, optional_argument (or 2) if the option takes an optional argument. If the field `flag' is not NULL, it points to a variable that is set to the value given in the field `val' when the option is found, but left unchanged if the option is not found. To have a long-named option do something other than set an `int' to a compiled-in constant, such as set a value from `optarg', set the option's `flag' field to zero and its `val' field to a nonzero value (the equivalent single-letter option character, if there is one). For long options that have a zero `flag' field, `getopt' returns the contents of the `val' field. */ struct option { #if __STDC__ const char *name; #else char *name; #endif /* has_arg can't be an enum because some compilers complain about type mismatches in all the code that assumes it is an int. */ int has_arg; int *flag; int val; }; /* Names for the values of the `has_arg' field of `struct option'. */ #define no_argument 0 #define required_argument 1 #define optional_argument 2 //#if __STDC__ || defined(PROTO) #if defined(__GNU_LIBRARY__) /* Many other libraries have conflicting prototypes for getopt, with differences in the consts, in stdlib.h. To avoid compilation errors, only prototype getopt for the GNU C library. */ extern int getopt (int argc, char *const *argv, const char *shortopts); #endif /* not __GNU_LIBRARY__ */ extern int getopt_long (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); extern int getopt_long_only (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind); /* Internal only. Users should not call this directly. */ extern int _getopt_internal (int argc, char *const *argv, const char *shortopts, const struct option *longopts, int *longind, int long_only); //#else /* not __STDC__ */ extern int getopt (int argc, char *const *argv, const char *shortopts); //extern int getopt_long (); //extern int getopt_long_only (); //extern int _getopt_internal (); //#endif /* not __STDC__ */ #ifdef __cplusplus } #endif #endif /* _GETOPT_H */ faad2-2.11.2/frontend/main.c000066400000000000000000001177511476153623600155120ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: main.c,v 1.89 2015/01/19 09:46:12 knik Exp $ **/ #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifdef _WIN32 #define _CRT_SECURE_NO_WARNINGS #define WIN32_LEAN_AND_MEAN #include #include #ifndef __MINGW32__ #define off_t __int64 #endif #else #include #endif #include #include #include #include #include #include #include #include "unicode_support.h" #include "audio.h" #include "mp4read.h" #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) #endif #define MAX_CHANNELS 6 /* make this higher to support files with more channels */ #define MAX_PERCENTS 384 static int quiet = 0; static void faad_fprintf(FILE *stream, const char *fmt, ...) { va_list ap; if (!quiet) { va_start(ap, fmt); vfprintf(stream, fmt, ap); va_end(ap); } #ifdef _WIN32 if (!_isatty(_fileno(stream))) { fflush(stream); /*ensure real-time progress output on Win32*/ } #endif } /* FAAD file buffering routines */ typedef struct { unsigned long bytes_into_buffer; unsigned long bytes_consumed; unsigned long file_offset; unsigned char *buffer; FILE *infile; int at_eof; } aac_buffer; static int fill_buffer(aac_buffer *b) { unsigned long bread; if (b->bytes_consumed > 0) { if (b->bytes_into_buffer) { memmove((void*)b->buffer, (void*)(b->buffer + b->bytes_consumed), b->bytes_into_buffer*sizeof(unsigned char)); } if (!b->at_eof) { bread = (unsigned long)fread((void*)(b->buffer + b->bytes_into_buffer), 1, b->bytes_consumed, b->infile); if (bread != b->bytes_consumed) b->at_eof = 1; b->bytes_into_buffer += bread; } b->bytes_consumed = 0; if (b->bytes_into_buffer > 3) { if (memcmp(b->buffer, "TAG", 3) == 0) b->bytes_into_buffer = 0; } if (b->bytes_into_buffer > 11) { if (memcmp(b->buffer, "LYRICSBEGIN", 11) == 0) b->bytes_into_buffer = 0; } if (b->bytes_into_buffer > 8) { if (memcmp(b->buffer, "APETAGEX", 8) == 0) b->bytes_into_buffer = 0; } } return 1; } static void advance_buffer(aac_buffer *b, unsigned int bytes) { while ((b->bytes_into_buffer > 0) && (bytes > 0)) { unsigned int chunk = bytes; if (b->bytes_into_buffer < chunk) chunk = (unsigned int)b->bytes_into_buffer; bytes -= chunk; b->file_offset += chunk; b->bytes_consumed = chunk; b->bytes_into_buffer -= chunk; if (b->bytes_into_buffer == 0) fill_buffer(b); } } static void lookforheader(aac_buffer *b) { int i = 0; while (!b->at_eof ) { if (b->bytes_into_buffer > 4) { if( ((b->buffer[0+i] == 0xff) && ((b->buffer[1+i] & 0xf6) == 0xf0)) || (b->buffer[0+i] == 'A' && b->buffer[1+i] == 'D' && b->buffer[2+i] == 'I' && b->buffer[3+i] == 'F')) { fill_buffer(b); break; } else { i++; b->file_offset += 1; b->bytes_consumed += 1; b->bytes_into_buffer -= 1; } } else { fill_buffer(b); i = 0; } } } static int adts_sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0}; static int adts_parse(aac_buffer *b, int *bitrate, float *length) { size_t frames; unsigned int frame_length; size_t t_framelength = 0; int samplerate = 0; float frames_per_sec, bytes_per_frame; /* Read all frames to ensure correct time and bitrate */ for (frames = 0; /* */; frames++) { fill_buffer(b); if (b->bytes_into_buffer > 7) { /* check syncword */ if (!((b->buffer[0] == 0xFF)&&((b->buffer[1] & 0xF6) == 0xF0))) break; if (frames == 0) samplerate = adts_sample_rates[(b->buffer[2]&0x3c)>>2]; frame_length = ((((unsigned int)b->buffer[3] & 0x3)) << 11) | (((unsigned int)b->buffer[4]) << 3) | (b->buffer[5] >> 5); if (frame_length == 0) break; t_framelength += frame_length; if (frame_length > b->bytes_into_buffer) break; advance_buffer(b, frame_length); } else { break; } } frames_per_sec = (float)samplerate/1024.0f; if (frames != 0) bytes_per_frame = (float)t_framelength/(float)(frames*1000); else bytes_per_frame = 0; *bitrate = (int)(8. * bytes_per_frame * frames_per_sec + 0.5); if (frames_per_sec != 0) *length = (float)frames/frames_per_sec; else *length = 1; return 1; } /* MicroSoft channel definitions */ #define SPEAKER_FRONT_LEFT 0x1 #define SPEAKER_FRONT_RIGHT 0x2 #define SPEAKER_FRONT_CENTER 0x4 #define SPEAKER_LOW_FREQUENCY 0x8 #define SPEAKER_BACK_LEFT 0x10 #define SPEAKER_BACK_RIGHT 0x20 #define SPEAKER_FRONT_LEFT_OF_CENTER 0x40 #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80 #define SPEAKER_BACK_CENTER 0x100 #define SPEAKER_SIDE_LEFT 0x200 #define SPEAKER_SIDE_RIGHT 0x400 #define SPEAKER_TOP_CENTER 0x800 #define SPEAKER_TOP_FRONT_LEFT 0x1000 #define SPEAKER_TOP_FRONT_CENTER 0x2000 #define SPEAKER_TOP_FRONT_RIGHT 0x4000 #define SPEAKER_TOP_BACK_LEFT 0x8000 #define SPEAKER_TOP_BACK_CENTER 0x10000 #define SPEAKER_TOP_BACK_RIGHT 0x20000 #define SPEAKER_RESERVED 0x80000000 static long aacChannelConfig2wavexChannelMask(NeAACDecFrameInfo *hInfo) { if (hInfo->channels == 6 && hInfo->num_lfe_channels) { return SPEAKER_FRONT_LEFT + SPEAKER_FRONT_RIGHT + SPEAKER_FRONT_CENTER + SPEAKER_LOW_FREQUENCY + SPEAKER_BACK_LEFT + SPEAKER_BACK_RIGHT; } else { return 0; } } static char *position2string(int position) { switch (position) { case FRONT_CHANNEL_CENTER: return "Center front"; case FRONT_CHANNEL_LEFT: return "Left front"; case FRONT_CHANNEL_RIGHT: return "Right front"; case SIDE_CHANNEL_LEFT: return "Left side"; case SIDE_CHANNEL_RIGHT: return "Right side"; case BACK_CHANNEL_LEFT: return "Left back"; case BACK_CHANNEL_RIGHT: return "Right back"; case BACK_CHANNEL_CENTER: return "Center back"; case LFE_CHANNEL: return "LFE"; case UNKNOWN_CHANNEL: return "Unknown"; default: return ""; } // return ""; } static void print_channel_info(NeAACDecFrameInfo *frameInfo) { /* print some channel info */ int i; long channelMask = aacChannelConfig2wavexChannelMask(frameInfo); faad_fprintf(stderr, " ---------------------\n"); if (frameInfo->num_lfe_channels > 0) { faad_fprintf(stderr, " | Config: %2d.%d Ch |", frameInfo->channels-frameInfo->num_lfe_channels, frameInfo->num_lfe_channels); } else { faad_fprintf(stderr, " | Config: %2d Ch |", frameInfo->channels); } if (channelMask) faad_fprintf(stderr, " WARNING: channels are reordered according to\n"); else faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " ---------------------"); if (channelMask) faad_fprintf(stderr, " MS defaults defined in WAVE_FORMAT_EXTENSIBLE\n"); else faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " | Ch | Position |\n"); faad_fprintf(stderr, " ---------------------\n"); for (i = 0; i < frameInfo->channels; i++) { faad_fprintf(stderr, " | %.2d | %-14s |\n", i, position2string((int)frameInfo->channel_position[i])); } faad_fprintf(stderr, " ---------------------\n"); faad_fprintf(stderr, "\n"); } static int FindAdtsSRIndex(int sr) { int i; for (i = 0; i < 16; i++) { if (sr == adts_sample_rates[i]) return i; } return 16 - 1; } static unsigned char *MakeAdtsHeader(int *dataSize, NeAACDecFrameInfo *hInfo, unsigned char old_format) { unsigned char *data; int profile = (hInfo->object_type - 1) & 0x3; int sr_index = ((hInfo->sbr == SBR_UPSAMPLED) || (hInfo->sbr == NO_SBR_UPSAMPLED)) ? FindAdtsSRIndex(hInfo->samplerate / 2) : FindAdtsSRIndex(hInfo->samplerate); int skip = (old_format) ? 8 : 7; int framesize = skip + hInfo->bytesconsumed; if (hInfo->header_type == ADTS) framesize -= skip; *dataSize = 7; data = malloc(*dataSize * sizeof(unsigned char)); memset(data, 0, *dataSize * sizeof(unsigned char)); data[0] += 0xFF; /* 8b: syncword */ data[1] += 0xF0; /* 4b: syncword */ /* 1b: mpeg id = 0 */ /* 2b: layer = 0 */ data[1] += 1; /* 1b: protection absent */ data[2] += ((profile << 6) & 0xC0); /* 2b: profile */ data[2] += ((sr_index << 2) & 0x3C); /* 4b: sampling_frequency_index */ /* 1b: private = 0 */ data[2] += ((hInfo->channels >> 2) & 0x1); /* 1b: channel_configuration */ data[3] += ((hInfo->channels << 6) & 0xC0); /* 2b: channel_configuration */ /* 1b: original */ /* 1b: home */ /* 1b: copyright_id */ /* 1b: copyright_id_start */ data[3] += ((framesize >> 11) & 0x3); /* 2b: aac_frame_length */ data[4] += ((framesize >> 3) & 0xFF); /* 8b: aac_frame_length */ data[5] += ((framesize << 5) & 0xE0); /* 3b: aac_frame_length */ data[5] += ((0x7FF >> 6) & 0x1F); /* 5b: adts_buffer_fullness */ data[6] += ((0x7FF << 2) & 0x3F); /* 6b: adts_buffer_fullness */ /* 2b: num_raw_data_blocks */ return data; } /* globals */ char *progName; static const char *file_ext[] = { NULL, ".wav", ".aif", ".au", ".au", ".pcm", NULL }; static void usage(void) { faad_fprintf(stdout, "\nUsage:\n"); faad_fprintf(stdout, "%s [options] infile.aac\n", progName); faad_fprintf(stdout, "Options:\n"); faad_fprintf(stdout, " -h Shows this help screen.\n"); faad_fprintf(stdout, " -i Shows info about the input file.\n"); faad_fprintf(stdout, " -a X Write MPEG-4 AAC ADTS output file.\n"); faad_fprintf(stdout, " -t Assume old ADTS format.\n"); faad_fprintf(stdout, " -o X Set output filename.\n"); faad_fprintf(stdout, " -f X Set output format. Valid values for X are:\n"); faad_fprintf(stdout, " 1: Microsoft WAV format (default).\n"); faad_fprintf(stdout, " 2: RAW PCM data.\n"); faad_fprintf(stdout, " -b X Set output sample format. Valid values for X are:\n"); faad_fprintf(stdout, " 1: 16 bit PCM data (default).\n"); faad_fprintf(stdout, " 2: 24 bit PCM data.\n"); faad_fprintf(stdout, " 3: 32 bit PCM data.\n"); faad_fprintf(stdout, " 4: 32 bit floating point data.\n"); faad_fprintf(stdout, " 5: 64 bit floating point data.\n"); faad_fprintf(stdout, " -s X Force the samplerate to X (for RAW files).\n"); faad_fprintf(stdout, " -l X Set object type. Supported object types:\n"); faad_fprintf(stdout, " 1: Main object type.\n"); faad_fprintf(stdout, " 2: LC (Low Complexity) object type.\n"); faad_fprintf(stdout, " 4: LTP (Long Term Prediction) object type.\n"); faad_fprintf(stdout, " 23: LD (Low Delay) object type.\n"); faad_fprintf(stdout, " -d Down matrix 5.1 to 2 channels\n"); faad_fprintf(stdout, " -w Write output to stdio instead of a file.\n"); faad_fprintf(stdout, " -g Disable gapless decoding.\n"); faad_fprintf(stdout, " -q Quiet - suppresses status messages.\n"); faad_fprintf(stdout, " -j X Jump - start output X seconds into track (MP4 files only).\n"); faad_fprintf(stdout, "Example:\n"); faad_fprintf(stdout, " %s infile.aac\n", progName); faad_fprintf(stdout, " %s infile.mp4\n", progName); faad_fprintf(stdout, " %s -o outfile.wav infile.aac\n", progName); faad_fprintf(stdout, " %s -w infile.aac > outfile.wav\n", progName); faad_fprintf(stdout, " %s -a outfile.aac infile.aac\n", progName); return; } static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_stdout, int def_srate, unsigned char object_type, unsigned char outputFormat, int fileType, unsigned char downMatrix, int infoOnly, int adts_out, unsigned char old_format, float *song_length) { int tagsize; unsigned long samplerate; unsigned char channels; void *sample_buffer; audio_file *aufile = NULL; FILE *adtsFile = NULL; unsigned char *adtsData; int adtsDataSize; NeAACDecHandle hDecoder; NeAACDecFrameInfo frameInfo; NeAACDecConfigurationPtr config; char percents[MAX_PERCENTS]; int percent, old_percent = -1; int fileread; unsigned long bread; long bused; int header_type = 0; int bitrate = 0; float length = 0; int first_time = 1; int retval; int streaminput = 0; aac_buffer b; memset(&b, 0, sizeof(aac_buffer)); if (adts_out) { adtsFile = faad_fopen(adts_fn, "wb"); if (adtsFile == NULL) { faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); return 1; } } if (0 == strcmp(aacfile, "-")) { b.infile = stdin; #ifdef _WIN32 _setmode(_fileno(stdin), O_BINARY); #endif } else { b.infile = faad_fopen(aacfile, "rb"); if (b.infile == NULL) { /* unable to open file */ faad_fprintf(stderr, "Error opening file: %s\n", aacfile); return 1; } } retval = fseek(b.infile, 0, SEEK_END); #ifdef _WIN32 if (0 == strcmp(aacfile, "-")) { retval = -1; } #endif if (retval ) { faad_fprintf(stderr, "Input not seekable %s\n", aacfile); fileread = -1; streaminput = 1; } else { fileread = ftell(b.infile); fseek(b.infile, 0, SEEK_SET); }; b.buffer = (unsigned char*)malloc(FAAD_MIN_STREAMSIZE*MAX_CHANNELS); if (!b.buffer) { faad_fprintf(stderr, "Memory allocation error\n"); return 0; } memset(b.buffer, 0, FAAD_MIN_STREAMSIZE*MAX_CHANNELS); bread = (unsigned long)fread(b.buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, b.infile); b.bytes_into_buffer = bread; b.bytes_consumed = 0; b.file_offset = 0; if (bread != FAAD_MIN_STREAMSIZE*MAX_CHANNELS) b.at_eof = 1; tagsize = 0; if (!memcmp(b.buffer, "ID3", 3)) { /* high bit is not used */ tagsize = (b.buffer[6] << 21) | (b.buffer[7] << 14) | (b.buffer[8] << 7) | (b.buffer[9] << 0); tagsize += 10; advance_buffer(&b, tagsize); fill_buffer(&b); } hDecoder = NeAACDecOpen(); /* Set the default object type and samplerate */ /* This is useful for RAW AAC files */ config = NeAACDecGetCurrentConfiguration(hDecoder); if (def_srate) config->defSampleRate = def_srate; config->defObjectType = object_type; config->outputFormat = outputFormat; config->downMatrix = downMatrix; config->useOldADTSFormat = old_format; //config->dontUpSampleImplicitSBR = 1; NeAACDecSetConfiguration(hDecoder, config); /* get AAC infos for printing */ header_type = 0; if (streaminput == 1) lookforheader(&b); if ((b.buffer[0] == 0xFF) && ((b.buffer[1] & 0xF6) == 0xF0)) { if (streaminput == 1) { int /*frames,*/ frame_length; float frames_per_sec, bytes_per_frame; channels = 2; samplerate = adts_sample_rates[(b.buffer[2]&0x3c)>>2]; frame_length = ((((unsigned int)b.buffer[3] & 0x3)) << 11) | (((unsigned int)b.buffer[4]) << 3) | (b.buffer[5] >> 5); frames_per_sec = (float)samplerate/1024.0f; bytes_per_frame = (float)frame_length/(float)(1000); bitrate = (int)(8. * bytes_per_frame * frames_per_sec + 0.5); length = 1; faad_fprintf(stderr, "Streamed input format samplerate %d channels %d.\n", samplerate, channels); } else { adts_parse(&b, &bitrate, &length); fseek(b.infile, tagsize, SEEK_SET); bread = (unsigned long)fread(b.buffer, 1, FAAD_MIN_STREAMSIZE*MAX_CHANNELS, b.infile); if (bread != FAAD_MIN_STREAMSIZE*MAX_CHANNELS) b.at_eof = 1; else b.at_eof = 0; b.bytes_into_buffer = bread; b.bytes_consumed = 0; b.file_offset = tagsize; } header_type = 1; } else if (memcmp(b.buffer, "ADIF", 4) == 0) { int skip_size = (b.buffer[4] & 0x80) ? 9 : 0; bitrate = ((unsigned int)(b.buffer[4 + skip_size] & 0x0F)<<19) | ((unsigned int)b.buffer[5 + skip_size]<<11) | ((unsigned int)b.buffer[6 + skip_size]<<3) | ((unsigned int)b.buffer[7 + skip_size] & 0xE0); length = (float)fileread; if (length != 0) { length = ((float)length*8.f)/((float)bitrate) + 0.5f; } bitrate = (int)((float)bitrate/1000.0f + 0.5f); header_type = 2; } *song_length = length; fill_buffer(&b); bused = NeAACDecInit(hDecoder, b.buffer, b.bytes_into_buffer, &samplerate, &channels); if (bused < 0) { /* If some error initializing occured, skip the file */ faad_fprintf(stderr, "Error initializing decoder library.\n"); if (b.buffer) free(b.buffer); NeAACDecClose(hDecoder); if (b.infile != stdin) fclose(b.infile); return 1; } advance_buffer(&b, bused); fill_buffer(&b); /* print AAC file info */ faad_fprintf(stderr, "%s file info:\n", aacfile); switch (header_type) { case 0: faad_fprintf(stderr, "RAW\n\n"); break; case 1: faad_fprintf(stderr, "ADTS, %.3f sec, %d kbps, %d Hz\n\n", length, bitrate, samplerate); break; case 2: faad_fprintf(stderr, "ADIF, %.3f sec, %d kbps, %d Hz\n\n", length, bitrate, samplerate); break; } // Override the logic of skipping 0-th output frame. NeAACDecPostSeekReset(hDecoder, 1); if (infoOnly) { NeAACDecClose(hDecoder); if (b.infile != stdin) fclose(b.infile); if (b.buffer) free(b.buffer); return 0; } do { sample_buffer = NeAACDecDecode(hDecoder, &frameInfo, b.buffer, b.bytes_into_buffer); if (adts_out == 1) { int skip = (old_format) ? 8 : 7; adtsData = MakeAdtsHeader(&adtsDataSize, &frameInfo, old_format); /* write the adts header */ fwrite(adtsData, 1, adtsDataSize, adtsFile); /* write the frame data */ if (frameInfo.header_type == ADTS) fwrite(b.buffer + skip, 1, frameInfo.bytesconsumed - skip, adtsFile); else fwrite(b.buffer, 1, frameInfo.bytesconsumed, adtsFile); } /* update buffer indices */ advance_buffer(&b, frameInfo.bytesconsumed); /* check if the inconsistent number of channels */ if (aufile != NULL && frameInfo.channels != aufile->channels) frameInfo.error = 12; if (frameInfo.error > 0) { faad_fprintf(stderr, "Error: %s\n", NeAACDecGetErrorMessage(frameInfo.error)); } /* open the sound file now that the number of channels are known */ if (first_time && !frameInfo.error) { /* print some channel info */ print_channel_info(&frameInfo); if (!adts_out) { /* open output file */ if (!to_stdout) { aufile = open_audio_file(sndfile, frameInfo.samplerate, frameInfo.channels, (int)outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } else { aufile = open_audio_file("-", frameInfo.samplerate, frameInfo.channels, (int)outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } if (aufile == NULL) { if (b.buffer) free(b.buffer); NeAACDecClose(hDecoder); if (b.infile != stdin) fclose(b.infile); return 0; } } else { faad_fprintf(stderr, "Writing output MPEG-4 AAC ADTS file.\n\n"); } first_time = 0; } percent = min((int)(b.file_offset*100)/fileread, 100); if (percent > old_percent) { old_percent = percent; snprintf(percents, MAX_PERCENTS, "%d%% decoding %s.", percent, aacfile); faad_fprintf(stderr, "%s\r", percents); #ifdef _WIN32 SetConsoleTitle(percents); #endif } if ((frameInfo.error == 0) && (frameInfo.samples > 0) && (!adts_out)) { if (write_audio_file(aufile, sample_buffer, frameInfo.samples) == 0) break; } /* fill buffer */ fill_buffer(&b); if (b.bytes_into_buffer == 0) sample_buffer = NULL; /* to make sure it stops now */ } while (sample_buffer != NULL); NeAACDecClose(hDecoder); if (adts_out == 1) { fclose(adtsFile); } if (b.infile != stdin) fclose(b.infile); if (!first_time && !adts_out) close_audio_file(aufile); if (b.buffer) free(b.buffer); return frameInfo.error; } static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_stdout, unsigned char outputFormat, int fileType, unsigned char downMatrix, int noGapless, int infoOnly, int adts_out, float *song_length, float seek_to) { /*int track;*/ unsigned long samplerate; unsigned char channels; void *sample_buffer; uint32_t sampleId, startSampleId; audio_file *aufile = NULL; FILE *adtsFile = NULL; unsigned char *adtsData; int adtsDataSize; NeAACDecHandle hDecoder; NeAACDecConfigurationPtr config; NeAACDecFrameInfo frameInfo = {0}; // should no-frames situation be flagged as an error? mp4AudioSpecificConfig mp4ASC = {0}; char percents[MAX_PERCENTS]; int percent, old_percent = -1; int first_time = 1; /* for gapless decoding */ unsigned int useAacLength = 1; unsigned int framesize; unsigned decoded; if (strcmp(mp4file, "-") == 0 ) { faad_fprintf(stderr, "Cannot open stdin for MP4 input \n"); return 1; } if (!quiet) { mp4config.verbose.header = 1; mp4config.verbose.tags = 1; } if (mp4read_open(mp4file)) { /* unable to open file */ faad_fprintf(stderr, "Error opening file: %s\n", mp4file); return 1; } hDecoder = NeAACDecOpen(); /* Set configuration */ config = NeAACDecGetCurrentConfiguration(hDecoder); config->outputFormat = outputFormat; config->downMatrix = downMatrix; //config->dontUpSampleImplicitSBR = 1; NeAACDecSetConfiguration(hDecoder, config); if (adts_out) { adtsFile = faad_fopen(adts_fn, "wb"); if (adtsFile == NULL) { faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); return 1; } } if(NeAACDecInit2(hDecoder, mp4config.asc.buf, mp4config.asc.size, &samplerate, &channels) < 0) { /* If some error initializing occured, skip the file */ faad_fprintf(stderr, "Error initializing decoder library.\n"); NeAACDecClose(hDecoder); mp4read_close(); return 1; } framesize = 1024; useAacLength = 0; decoded = 0; if (mp4config.asc.size) { if (NeAACDecAudioSpecificConfig(mp4config.asc.buf, mp4config.asc.size, &mp4ASC) >= 0) { if (mp4ASC.frameLengthFlag == 1) framesize = 960; if (mp4ASC.sbr_present_flag == 1 || mp4ASC.forceUpSampling) framesize *= 2; } } /* print some mp4 file info */ faad_fprintf(stderr, "%s file info:\n\n", mp4file); { /*int k, j;*/ char *ot[6] = { "NULL", "MAIN AAC", "LC AAC", "SSR AAC", "LTP AAC", "HE AAC" }; float seconds; seconds = (float)mp4config.samples/(float)mp4ASC.samplingFrequency; *song_length = seconds; faad_fprintf(stderr, "%s\t%.3f secs, %d ch, %d Hz\n\n", ot[(mp4ASC.objectTypeIndex > 5)?0:mp4ASC.objectTypeIndex], seconds, mp4ASC.channelsConfiguration, mp4ASC.samplingFrequency); } if (infoOnly) { NeAACDecClose(hDecoder); mp4read_close(); return 0; } startSampleId = 0; if (seek_to > 0.1) { int64_t sample = (int64_t)(seek_to * mp4config.samplerate / framesize); uint32_t limit = ~0u; startSampleId = sample < limit ? (uint32_t)sample : limit; } mp4read_seek(startSampleId); for (sampleId = startSampleId; sampleId < mp4config.frame.nsamples; sampleId++) { /*int rc;*/ unsigned long dur; unsigned int sample_count; if (mp4read_frame()) break; sample_buffer = NeAACDecDecode(hDecoder, &frameInfo, mp4config.bitbuf.data, mp4config.bitbuf.size); if (!sample_buffer) { /* unable to decode file, abort */ break; } if (adts_out == 1) { adtsData = MakeAdtsHeader(&adtsDataSize, &frameInfo, 0); /* write the adts header */ fwrite(adtsData, 1, adtsDataSize, adtsFile); fwrite(mp4config.bitbuf.data, 1, frameInfo.bytesconsumed, adtsFile); } dur = frameInfo.samples / frameInfo.channels; decoded += dur; if (decoded > mp4config.samples) dur -= decoded - mp4config.samples; if (dur > framesize) { faad_fprintf(stderr, "Warning: excess frame detected in MP4 file.\n"); dur = framesize; } if (!noGapless) { if (useAacLength || (mp4config.samplerate != samplerate)) { sample_count = frameInfo.samples; } else { sample_count = (unsigned int)(dur * frameInfo.channels); if (sample_count > frameInfo.samples) sample_count = frameInfo.samples; } } else { sample_count = frameInfo.samples; } /* open the sound file now that the number of channels are known */ if (first_time && !frameInfo.error) { /* print some channel info */ print_channel_info(&frameInfo); if (!adts_out) { /* open output file */ if(!to_stdout) { aufile = open_audio_file(sndfile, frameInfo.samplerate, frameInfo.channels, (int)outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } else { #ifdef _WIN32 _setmode(_fileno(stdout), O_BINARY); #endif aufile = open_audio_file("-", frameInfo.samplerate, frameInfo.channels, (int)outputFormat, fileType, aacChannelConfig2wavexChannelMask(&frameInfo)); } if (aufile == NULL) { NeAACDecClose(hDecoder); mp4read_close(); return 0; } } first_time = 0; } percent = min((int)(sampleId*100)/mp4config.frame.nsamples, 100); if (percent > old_percent) { old_percent = percent; snprintf(percents, MAX_PERCENTS, "%d%% decoding %s.", percent, mp4file); faad_fprintf(stderr, "%s\r", percents); #ifdef _WIN32 SetConsoleTitle(percents); #endif } if ((frameInfo.error == 0) && (sample_count > 0) && (!adts_out)) { if (write_audio_file(aufile, sample_buffer, sample_count) == 0) break; } if (frameInfo.error > 0) { faad_fprintf(stderr, "Warning: %s\n", NeAACDecGetErrorMessage(frameInfo.error)); } } NeAACDecClose(hDecoder); if (adts_out == 1) { fclose(adtsFile); } mp4read_close(); if (!first_time && !adts_out) close_audio_file(aufile); return frameInfo.error; } static int faad_main(int argc, char *argv[]) { int result; int infoOnly = 0; int writeToStdio = 0; int readFromStdin = 0; unsigned char object_type = LC; int def_srate = 0; unsigned char downMatrix = 0; int format = 1; unsigned char outputFormat = FAAD_FMT_16BIT; int outfile_set = 0; int adts_out = 0; unsigned char old_format = 0; int showHelp = 0; int mp4file = 0; int noGapless = 0; char *fnp; char *aacFileName = NULL; char *audioFileName = NULL; char *adtsFileName = NULL; float seekTo = 0; unsigned char header[8]; size_t bread; float length = 0; FILE *hMP4File; char *faad_id_string; char *faad_copyright_string; /* System dependant types */ #ifdef _WIN32 long begin; #else clock_t begin; #endif unsigned long cap = NeAACDecGetCapabilities(); /* begin process command line */ progName = argv[0]; while (1) { int c = -1; int option_index = 0; static struct option long_options[] = { { "quiet", 0, 0, 'q' }, { "outfile", 0, 0, 'o' }, { "adtsout", 0, 0, 'a' }, { "oldformat", 0, 0, 't' }, { "format", 0, 0, 'f' }, { "bits", 0, 0, 'b' }, { "samplerate", 0, 0, 's' }, { "objecttype", 0, 0, 'l' }, { "downmix", 0, 0, 'd' }, { "info", 0, 0, 'i' }, { "stdio", 0, 0, 'w' }, { "stdio", 0, 0, 'g' }, { "seek", 1, 0, 'j' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } }; c = getopt_long(argc, argv, "o:a:s:f:b:l:j:wgdhitq", long_options, &option_index); if (c == -1) break; switch (c) { case 'o': if (optarg) { outfile_set = 1; audioFileName = (char *) malloc(sizeof(char) * (strlen(optarg) + 1)); if (audioFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for audioFileName.\n"); return 1; } strcpy(audioFileName, optarg); } break; case 'a': if (optarg) { adts_out = 1; adtsFileName = (char *) malloc(sizeof(char) * (strlen(optarg) + 1)); if (adtsFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for adtsFileName.\n"); return 1; } strcpy(adtsFileName, optarg); } break; case 's': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { def_srate = 0; } else { def_srate = atoi(dr); } } break; case 'f': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { format = 1; } else { format = atoi(dr); if ((format < 1) || (format > 2)) showHelp = 1; } } break; case 'b': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { outputFormat = FAAD_FMT_16BIT; /* just use default */ } else { int val = atoi(dr); if ((val < 1) || (val > 5)) showHelp = 1; if (val == 5) // Not yet unsupported by "audio". showHelp = 1; outputFormat = (unsigned char)val; } } break; case 'l': if (optarg) { char dr[10]; if (sscanf(optarg, "%s", dr) < 1) { object_type = LC; /* default */ } else { int val = atoi(dr); if ((val != LC) && (val != MAIN) && (val != LTP) && (val != LD)) { showHelp = 1; } object_type = (unsigned char)val; } } break; case 'j': if (optarg) { seekTo = (float)atof(optarg); } break; case 't': old_format = 1; break; case 'd': downMatrix = 1; break; case 'w': writeToStdio = 1; break; case 'g': noGapless = 1; break; case 'i': infoOnly = 1; break; case 'h': showHelp = 1; break; case 'q': quiet = 1; break; default: break; } } NeAACDecGetVersion(&faad_id_string, &faad_copyright_string); faad_fprintf(stderr, " *********** Ahead Software MPEG-4 AAC Decoder V%s ******************\n\n", faad_id_string); #ifndef BUILD_DATE #define BUILD_DATE __DATE__ #endif faad_fprintf(stderr, " Build: %s\n", BUILD_DATE); #undef BUILD_DATE faad_fprintf(stderr, "%s", faad_copyright_string); if (cap & FIXED_POINT_CAP) faad_fprintf(stderr, " Fixed point version\n"); else faad_fprintf(stderr, " Floating point version\n"); faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " This program is free software; you can redistribute it and/or modify\n"); faad_fprintf(stderr, " it under the terms of the GNU General Public License.\n"); faad_fprintf(stderr, "\n"); faad_fprintf(stderr, " **************************************************************************\n\n"); /* check that we have at least two non-option arguments */ /* Print help if requested */ if (((argc - optind) < 1) || showHelp) { usage(); return 1; } #if 0 /* only allow raw data on stdio */ if (writeToStdio == 1) { format = 2; } #endif /* point to the specified file name */ aacFileName = (char *) malloc(sizeof(char) * (strlen(argv[optind]) + 1)); if (aacFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for aacFileName.\n"); return 1; } strcpy(aacFileName, argv[optind]); #ifdef _WIN32 begin = GetTickCount(); #else begin = clock(); #endif /* Only calculate the path and open the file for writing if we are not writing to stdout. */ if(!writeToStdio && !outfile_set) { audioFileName = (char *) malloc(sizeof(char) * (strlen(aacFileName) + strlen(file_ext[format]) + 1)); if (audioFileName == NULL) { faad_fprintf(stderr, "Error allocating memory for audioFileName.\n"); return 1; } strcpy(audioFileName, aacFileName); fnp = (char *)strrchr(audioFileName,'.'); if (fnp) fnp[0] = '\0'; strcat(audioFileName, file_ext[format]); } /* check for mp4 file */ if (0 == strcmp(aacFileName, "-")) { faad_fprintf(stderr, "Reading from stdin: %s\n", aacFileName); readFromStdin = 1; hMP4File = stdin; #ifdef _WIN32 _setmode(_fileno(stdin), O_BINARY); #endif } else { mp4file = 0; hMP4File = faad_fopen(aacFileName, "rb"); if (!hMP4File) { faad_fprintf(stderr, "Error opening file: %s\n", aacFileName); return 1; } } bread = fread(header, 1, 8, hMP4File); if (! readFromStdin ) fclose(hMP4File); if (bread != 8) { faad_fprintf(stderr, "Error reading file.\n"); return 1; } if (header[4] == 'f' && header[5] == 't' && header[6] == 'y' && header[7] == 'p') mp4file = 1; if (!mp4file && seekTo != 0) { faad_fprintf(stderr, "Warning: can only seek in MP4 files\n"); } if (mp4file) { result = decodeMP4file(aacFileName, audioFileName, adtsFileName, writeToStdio, outputFormat, format, downMatrix, noGapless, infoOnly, adts_out, &length, seekTo); } else { if (readFromStdin == 1) { ungetc(header[7],hMP4File); ungetc(header[6],hMP4File); ungetc(header[5],hMP4File); ungetc(header[4],hMP4File); ungetc(header[3],hMP4File); ungetc(header[2],hMP4File); ungetc(header[1],hMP4File); ungetc(header[0],hMP4File); } result = decodeAACfile(aacFileName, audioFileName, adtsFileName, writeToStdio, def_srate, object_type, outputFormat, format, downMatrix, infoOnly, adts_out, old_format, &length); } if (audioFileName != NULL) free (audioFileName); if (adtsFileName != NULL) free (adtsFileName); if (!result && !infoOnly) { #ifdef _WIN32 float dec_length = (float)(GetTickCount()-begin)/1000.0f; SetConsoleTitle("FAAD"); #else /* clock() grabs time since the start of the app but when we decode multiple files, each file has its own starttime (begin). */ float dec_length = (float)(clock() - begin)/(float)CLOCKS_PER_SEC; #endif faad_fprintf(stderr, "Decoding %s took: %5.2f sec. %5.2fx real-time.\n", aacFileName, dec_length, (dec_length > 0.01) ? (length/dec_length) : 0.); } free (aacFileName); return 0; } int main(int argc, char *argv[]) { #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 int argc_utf8, exit_code; char **argv_utf8; (void)argc; (void)argv; init_console_utf8(stderr); init_commandline_arguments_utf8(&argc_utf8, &argv_utf8); exit_code = faad_main(argc_utf8, argv_utf8); free_commandline_arguments_utf8(&argc_utf8, &argv_utf8); uninit_console_utf8(); return exit_code; #else return faad_main(argc, argv); #endif } faad2-2.11.2/frontend/mp4read.c000066400000000000000000000640321476153623600161130ustar00rootroot00000000000000/**************************************************************************** MP4 input module Copyright (C) 2017 Krzysztof Nikiel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ****************************************************************************/ #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include "unicode_support.h" #include "mp4read.h" enum ATOM_TYPE { ATOM_STOP = 0 /* end of atoms */ , ATOM_NAME /* plain atom */ , ATOM_DESCENT, /* starts group of children */ ATOM_ASCENT, /* ends group */ ATOM_DATA, }; typedef int (*parse_t)(int); typedef struct { uint16_t opcode; const char *name; parse_t parse; } creator_t; #define STOP() {ATOM_STOP, NULL, NULL} #define NAME(N) {ATOM_NAME, N, NULL} #define DESCENT() {ATOM_DESCENT, NULL, NULL} #define ASCENT() {ATOM_ASCENT, NULL, NULL} #define DATA(N, F) {ATOM_NAME, N, NULL}, {ATOM_DATA, NULL, F} mp4config_t mp4config = { 0 }; static FILE *g_fin = NULL; enum {ERR_OK = 0, ERR_FAIL = -1, ERR_UNSUPPORTED = -2}; #define freeMem(A) if (*(A)) {free(*(A)); *(A) = NULL;} static size_t datain(void *data, size_t size) { return fread(data, 1, size, g_fin); } static int stringin(char *txt, int sizemax) { int size; for (size = 0; size < sizemax; size++) { if (fread(txt + size, 1, 1, g_fin) != 1) return ERR_FAIL; if (!txt[size]) break; } txt[sizemax-1] = '\0'; return size; } static uint32_t u32in(void) { uint8_t u8[4]; datain(&u8, 4); return (uint32_t)u8[3] | ((uint32_t)u8[2] << 8) | ((uint32_t)u8[1] << 16) | ((uint32_t)u8[0] << 24); } static uint16_t u16in(void) { uint8_t u8[2]; datain(&u8, 2); return (uint16_t)u8[1] | ((uint16_t)u8[0] << 8); } static int u8in(void) { uint8_t u8; datain(&u8, 1); return u8; } static int ftypin(int size) { enum {BUFSIZE = 40}; char buf[BUFSIZE]; uint32_t u32; buf[4] = 0; datain(buf, 4); u32 = u32in(); if (mp4config.verbose.header) fprintf(stderr, "Brand:\t\t\t%s(version %d)\n", buf, u32); stringin(buf, BUFSIZE); if (mp4config.verbose.header) fprintf(stderr, "Compatible brands:\t%s\n", buf); return size; } enum { SECSINDAY = 24 * 60 * 60 }; static char *mp4time(time_t t) { int y; // subtract some seconds from the start of 1904 to the start of 1970 for (y = 1904; y < 1970; y++) { t -= 365 * SECSINDAY; if (!(y & 3)) t -= SECSINDAY; } return ctime(&t); } static int mdhdin(int size) { // version/flags u32in(); // Creation time mp4config.ctime = u32in(); // Modification time mp4config.mtime = u32in(); // Time scale mp4config.samplerate = u32in(); // Duration mp4config.samples = u32in(); // Language u16in(); // pre_defined u16in(); return size; } static int hdlr1in(int size) { uint8_t buf[5]; buf[4] = 0; // version/flags u32in(); // pre_defined u32in(); // Component subtype datain(buf, 4); if (mp4config.verbose.header) fprintf(stderr, "*track media type: '%s': ", buf); if (memcmp("soun", buf, 4)) { if (mp4config.verbose.header) fprintf(stderr, "unsupported, skipping\n"); return ERR_UNSUPPORTED; } else { if (mp4config.verbose.header) fprintf(stderr, "OK\n"); } // reserved u32in(); u32in(); u32in(); // name // null terminate u8in(); return size; } static int stsdin(int size) { // version/flags u32in(); // Number of entries(one 'mp4a') if (u32in() != 1) //fixme: error handling return ERR_FAIL; return size; } static int mp4ain(int size) { // Reserved (6 bytes) u32in(); u16in(); // Data reference index u16in(); // Version u16in(); // Revision level u16in(); // Vendor u32in(); // Number of channels mp4config.channels = u16in(); // Sample size (bits) mp4config.bits = u16in(); // Compression ID u16in(); // Packet size u16in(); // Sample rate (16.16) // fractional framerate, probably not for audio // rate integer part u16in(); // rate reminder part u16in(); return size; } static uint32_t getsize(void) { int cnt; uint32_t size = 0; for (cnt = 0; cnt < 4; cnt++) { int tmp = u8in(); size <<= 7; size |= (tmp & 0x7f); if (!(tmp & 0x80)) break; } return size; } static int esdsin(int size) { // descriptor tree: // MP4ES_Descriptor // MP4DecoderConfigDescriptor // MP4DecSpecificInfoDescriptor // MP4SLConfigDescriptor enum { TAG_ES = 3, TAG_DC = 4, TAG_DSI = 5, TAG_SLC = 6 }; // version/flags u32in(); if (u8in() != TAG_ES) return ERR_FAIL; getsize(); // ESID u16in(); // flags(url(bit 6); ocr(5); streamPriority (0-4)): u8in(); if (u8in() != TAG_DC) return ERR_FAIL; getsize(); if (u8in() != 0x40) /* not MPEG-4 audio */ return ERR_FAIL; // flags u8in(); // buffer size (24 bits) mp4config.buffersize = u16in() << 8; mp4config.buffersize |= u8in(); // bitrate mp4config.bitratemax = u32in(); mp4config.bitrateavg = u32in(); if (u8in() != TAG_DSI) return ERR_FAIL; mp4config.asc.size = getsize(); if (mp4config.asc.size > sizeof(mp4config.asc.buf)) return ERR_FAIL; // get AudioSpecificConfig datain(mp4config.asc.buf, mp4config.asc.size); if (u8in() != TAG_SLC) return ERR_FAIL; getsize(); // "predefined" (no idea) u8in(); return size; } /* stbl "Sample Table" layout: * - stts "Time-to-Sample" - useless * - stsc "Sample-to-Chunk" - condensed table chunk-to-num-samples * - stsz "Sample Size" - size table * - stco "Chunk Offset" - chunk starts * * When receiving stco we can combine stsc and stsz tables to produce final * sample offsets. */ static int sttsin(int size) { uint32_t ntts; if (size < 8) return ERR_FAIL; // version/flags u32in(); ntts = u32in(); if (ntts < 1) return ERR_FAIL; /* 2 x uint32_t per entry */ if (((size - 8u) / 8u) < ntts) return ERR_FAIL; return size; } static int stscin(int size) { uint32_t i, tmp, firstchunk, prevfirstchunk, samplesperchunk; if (size < 8) return ERR_FAIL; // version/flags u32in(); mp4config.frame.nsclices = u32in(); tmp = sizeof(slice_info_t) * mp4config.frame.nsclices; if (tmp < mp4config.frame.nsclices) return ERR_FAIL; mp4config.frame.map = malloc(tmp); if (!mp4config.frame.map) return ERR_FAIL; /* 3 x uint32_t per entry */ if (((size - 8u) / 12u) < mp4config.frame.nsclices) return ERR_FAIL; prevfirstchunk = 0; for (i = 0; i < mp4config.frame.nsclices; ++i) { firstchunk = u32in(); samplesperchunk = u32in(); // id - unused u32in(); if (firstchunk <= prevfirstchunk) return ERR_FAIL; if (samplesperchunk < 1) return ERR_FAIL; mp4config.frame.map[i].firstchunk = firstchunk; mp4config.frame.map[i].samplesperchunk = samplesperchunk; prevfirstchunk = firstchunk; } return size; } static int stszin(int size) { uint32_t i, tmp; if (size < 12) return ERR_FAIL; // version/flags u32in(); // (uniform) Sample size // TODO(eustas): add uniform sample size support? u32in(); mp4config.frame.nsamples = u32in(); if (!mp4config.frame.nsamples) return ERR_FAIL; tmp = sizeof(frame_info_t) * mp4config.frame.nsamples; if (tmp < mp4config.frame.nsamples) return ERR_FAIL; mp4config.frame.info = malloc(tmp); if (!mp4config.frame.info) return ERR_FAIL; if ((size - 12u) / 4u < mp4config.frame.nsamples) return ERR_FAIL; for (i = 0; i < mp4config.frame.nsamples; i++) { mp4config.frame.info[i].len = u32in(); mp4config.frame.info[i].offset = 0; if (mp4config.frame.maxsize < mp4config.frame.info[i].len) mp4config.frame.maxsize = mp4config.frame.info[i].len; } return size; } static int stcoin(int size) { uint32_t numchunks, chunkn, slicen, samplesleft, i, offset; uint32_t nextoffset; if (size < 8) return ERR_FAIL; // version/flags u32in(); // Number of entries numchunks = u32in(); if ((numchunks < 1) || ((numchunks + 1) == 0)) return ERR_FAIL; if ((size - 8u) / 4u < numchunks) return ERR_FAIL; chunkn = 0; samplesleft = 0; slicen = 0; offset = 0; for (i = 0; i < mp4config.frame.nsamples; ++i) { if (samplesleft == 0) { chunkn++; if (chunkn > numchunks) return ERR_FAIL; if (slicen < mp4config.frame.nsclices && (slicen + 1) < mp4config.frame.nsclices) { if (chunkn == mp4config.frame.map[slicen + 1].firstchunk) slicen++; } samplesleft = mp4config.frame.map[slicen].samplesperchunk; offset = u32in(); } mp4config.frame.info[i].offset = offset; nextoffset = offset + mp4config.frame.info[i].len; if (nextoffset < offset) return ERR_FAIL; offset = nextoffset; samplesleft--; } freeMem(&mp4config.frame.map); return size; } #if 0 static int tagtxt(char *tagname, const char *tagtxt) { //int txtsize = strlen(tagtxt); int size = 0; //int datasize = txtsize + 16; #if 0 size += u32out(datasize + 8); size += dataout(tagname, 4); size += u32out(datasize); size += dataout("data", 4); size += u32out(1); size += u32out(0); size += dataout(tagtxt, txtsize); #endif return size; } static int tagu32(char *tagname, int n /*number of stored fields*/) { //int numsize = n * 4; int size = 0; //int datasize = numsize + 16; #if 0 size += u32out(datasize + 8); size += dataout(tagname, 4); size += u32out(datasize); size += dataout("data", 4); size += u32out(0); size += u32out(0); #endif return size; } #endif static int metain(int size) { (void)size; /* why not used? */ // version/flags u32in(); return ERR_OK; } static int hdlr2in(int size) { uint8_t buf[4]; // version/flags u32in(); // Predefined u32in(); // Handler type datain(buf, 4); if (memcmp(buf, "mdir", 4)) return ERR_FAIL; datain(buf, 4); if (memcmp(buf, "appl", 4)) return ERR_FAIL; // Reserved u32in(); u32in(); // null terminator u8in(); return size; } static int ilstin(int size) { enum {NUMSET = 1, GENRE, EXTAG}; int read = 0; static struct { char *name; char *id; int flag; } tags[] = { {"Album ", "\xa9" "alb"}, {"Album Artist", "aART"}, {"Artist ", "\xa9" "ART"}, {"Comment ", "\xa9" "cmt"}, {"Cover image ", "covr"}, {"Compilation ", "cpil"}, {"Copyright ", "cprt"}, {"Date ", "\xa9" "day"}, {"Disc# ", "disk", NUMSET}, {"Genre ", "gnre", GENRE}, {"Grouping ", "\xa9" "grp"}, {"Lyrics ", "\xa9" "lyr"}, {"Title ", "\xa9" "nam"}, {"Rating ", "rtng"}, {"BPM ", "tmpo"}, {"Encoder ", "\xa9" "too"}, {"Track ", "trkn", NUMSET}, {"Composer ", "\xa9" "wrt"}, {0, "----", EXTAG}, {0}, }; static const char *genres[] = { "Blues", "Classic Rock", "Country", "Dance", "Disco", "Funk", "Grunge", "Hip-Hop", "Jazz", "Metal", "New Age", "Oldies", "Other", "Pop", "R&B", "Rap", "Reggae", "Rock", "Techno", "Industrial", "Alternative", "Ska", "Death Metal", "Pranks", "Soundtrack", "Euro-Techno", "Ambient", "Trip-Hop", "Vocal", "Jazz+Funk", "Fusion", "Trance", "Classical", "Instrumental", "Acid", "House", "Game", "Sound Clip", "Gospel", "Noise", "Alternative Rock", "Bass", "Soul", "Punk", "Space", "Meditative", "Instrumental Pop", "Instrumental Rock", "Ethnic", "Gothic", "Darkwave", "Techno-Industrial", "Electronic", "Pop-Folk", "Eurodance", "Dream", "Southern Rock", "Comedy", "Cult", "Gangsta", "Top 40", "Christian Rap", "Pop/Funk", "Jungle", "Native US", "Cabaret", "New Wave", "Psychadelic", "Rave", "Showtunes", "Trailer", "Lo-Fi", "Tribal", "Acid Punk", "Acid Jazz", "Polka", "Retro", "Musical", "Rock & Roll", "Hard Rock", "Folk", "Folk-Rock", "National Folk", "Swing", "Fast Fusion", "Bebob", "Latin", "Revival", "Celtic", "Bluegrass", "Avantgarde", "Gothic Rock", "Progressive Rock", "Psychedelic Rock", "Symphonic Rock", "Slow Rock", "Big Band", "Chorus", "Easy Listening", "Acoustic", "Humour", "Speech", "Chanson", "Opera", "Chamber Music", "Sonata", "Symphony", "Booty Bass", "Primus", "Porn Groove", "Satire", "Slow Jam", "Club", "Tango", "Samba", "Folklore", "Ballad", "Power Ballad", "Rhythmic Soul", "Freestyle", "Duet", "Punk Rock", "Drum Solo", "Acapella", "Euro-House", "Dance Hall", "Goa", "Drum & Bass", "Club - House", "Hardcore", "Terror", "Indie", "BritPop", "Negerpunk", "Polsk Punk", "Beat", "Christian Gangsta Rap", "Heavy Metal", "Black Metal", "Crossover", "Contemporary Christian", "Christian Rock", "Merengue", "Salsa", "Thrash Metal", "Anime", "JPop", "Synthpop", "Unknown", }; fprintf(stderr, "----------tag list-------------\n"); while(read < size) { int asize, dsize; uint8_t id[5]; int cnt; uint32_t type; id[4] = 0; asize = u32in(); read += asize; asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; for (cnt = 0; tags[cnt].id; cnt++) { if (!memcmp(id, tags[cnt].id, 4)) break; } if (tags[cnt].name) fprintf(stderr, "%s : ", tags[cnt].name); else { if (tags[cnt].flag != EXTAG) fprintf(stderr, "'%s' : ", id); } dsize = u32in(); asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; if (tags[cnt].flag != EXTAG) { if (memcmp(id, "data", 4)) return ERR_FAIL; } else { int spc; if (memcmp(id, "mean", 4)) goto skip; dsize -= 8; while (dsize > 0) { u8in(); asize--; dsize--; } if (asize >= 8) { dsize = u32in() - 8; asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; if (memcmp(id, "name", 4)) goto skip; u32in(); asize -= 4; dsize -= 4; } spc = 13 - dsize; if (spc < 0) spc = 0; while (dsize > 0) { fprintf(stderr, "%c",u8in()); asize--; dsize--; } while (spc--) fprintf(stderr, " "); fprintf(stderr, ": "); if (asize >= 8) { dsize = u32in() - 8; asize -= 4; if (datain(id, 4) < 4) return ERR_FAIL; asize -= 4; if (memcmp(id, "data", 4)) goto skip; u32in(); asize -= 4; dsize -= 4; } while (dsize > 0) { fprintf(stderr, "%c",u8in()); asize--; dsize--; } fprintf(stderr, "\n"); goto skip; } type = u32in(); asize -= 4; u32in(); asize -= 4; switch(type) { case 1: while (asize > 0) { fprintf(stderr, "%c",u8in()); asize--; } break; case 0: switch(tags[cnt].flag) { case NUMSET: u16in(); asize -= 2; fprintf(stderr, "%d", u16in()); asize -= 2; fprintf(stderr, "/%d", u16in()); asize -= 2; break; case GENRE: { uint16_t gnum = u16in(); asize -= 2; if (!gnum) goto skip; gnum--; if (gnum >= 147) gnum = 147; fprintf(stderr, "%s", genres[gnum]); } break; default: while(asize > 0) { fprintf(stderr, "%d/", u16in()); asize-=2; } } break; case 0x15: //fprintf(stderr, "(8bit data)"); while(asize > 0) { fprintf(stderr, "%d", u8in()); asize--; if (asize) fprintf(stderr, "/"); } break; case 0xd: fprintf(stderr, "(image data)"); break; default: fprintf(stderr, "(unknown data type)"); break; } fprintf(stderr, "\n"); skip: // skip to the end of atom while (asize > 0) { u8in(); asize--; } } fprintf(stderr, "-------------------------------\n"); return size; } static creator_t *g_atom = 0; static int parse(uint32_t *sizemax) { long apos = 0; long aposmax = ftell(g_fin) + *sizemax; uint32_t size; if (g_atom->opcode != ATOM_NAME) { fprintf(stderr, "parse error: root is not a 'name' opcode\n"); return ERR_FAIL; } //fprintf(stderr, "looking for '%s'\n", (char *)g_atom->name); // search for atom in the file while (1) { char name[4]; uint32_t tmp; apos = ftell(g_fin); if (apos >= (aposmax - 8)) { fprintf(stderr, "parse error: atom '%s' not found\n", g_atom->name); return ERR_FAIL; } if ((tmp = u32in()) < 8) { fprintf(stderr, "invalid atom size %x @%lx\n", tmp, ftell(g_fin)); return ERR_FAIL; } size = tmp; if (datain(name, 4) != 4) { // EOF fprintf(stderr, "can't read atom name @%lx\n", ftell(g_fin)); return ERR_FAIL; } //fprintf(stderr, "atom: '%c%c%c%c'(%x)", name[0],name[1],name[2],name[3], size); if (!memcmp(name, g_atom->name, 4)) { //fprintf(stderr, "OK\n"); break; } //fprintf(stderr, "\n"); fseek(g_fin, apos + size, SEEK_SET); } *sizemax = size; g_atom++; if (g_atom->opcode == ATOM_DATA) { int err = g_atom->parse(size - 8); if (err < ERR_OK) { fseek(g_fin, apos + size, SEEK_SET); return err; } g_atom++; } if (g_atom->opcode == ATOM_DESCENT) { long apos2 = ftell(g_fin); //fprintf(stderr, "descent\n"); g_atom++; while (g_atom->opcode != ATOM_STOP) { uint32_t subsize = size - 8; int ret; if (g_atom->opcode == ATOM_ASCENT) { g_atom++; break; } // TODO: does not feel well - we always return to the same point! fseek(g_fin, apos2, SEEK_SET); if ((ret = parse(&subsize)) < 0) return ret; } //fprintf(stderr, "ascent\n"); } fseek(g_fin, apos + size, SEEK_SET); return ERR_OK; } static int moovin(int sizemax) { long apos = ftell(g_fin); uint32_t atomsize; creator_t *old_atom = g_atom; int err, ret = sizemax; static creator_t mvhd[] = { NAME("mvhd"), STOP() }; static creator_t trak[] = { NAME("trak"), DESCENT(), NAME("tkhd"), NAME("mdia"), DESCENT(), DATA("mdhd", mdhdin), DATA("hdlr", hdlr1in), NAME("minf"), DESCENT(), NAME("smhd"), NAME("dinf"), NAME("stbl"), DESCENT(), DATA("stsd", stsdin), DESCENT(), DATA("mp4a", mp4ain), DESCENT(), DATA("esds", esdsin), ASCENT(), ASCENT(), DATA("stts", sttsin), DATA("stsc", stscin), DATA("stsz", stszin), DATA("stco", stcoin), STOP() }; g_atom = mvhd; atomsize = sizemax + apos - ftell(g_fin); if (parse(&atomsize) < 0) { g_atom = old_atom; return ERR_FAIL; } fseek(g_fin, apos, SEEK_SET); while (1) { //fprintf(stderr, "TRAK\n"); g_atom = trak; atomsize = sizemax + apos - ftell(g_fin); if (atomsize < 8) break; //fprintf(stderr, "PARSE(%x)\n", atomsize); err = parse(&atomsize); //fprintf(stderr, "SIZE: %x/%x\n", atomsize, sizemax); if (err >= 0) break; if (err != ERR_UNSUPPORTED) { ret = err; break; } //fprintf(stderr, "UNSUPP\n"); } g_atom = old_atom; return ret; } static creator_t g_head[] = { DATA("ftyp", ftypin), STOP() }; static creator_t g_moov[] = { DATA("moov", moovin), //DESCENT(), //NAME("mvhd"), STOP() }; static creator_t g_meta1[] = { NAME("moov"), DESCENT(), NAME("udta"), DESCENT(), DATA("meta", metain), DESCENT(), DATA("hdlr", hdlr2in), DATA("ilst", ilstin), STOP() }; static creator_t g_meta2[] = { DATA("meta", metain), DESCENT(), DATA("hdlr", hdlr2in), DATA("ilst", ilstin), STOP() }; int mp4read_frame(void) { if (mp4config.frame.current >= mp4config.frame.nsamples) return ERR_FAIL; // TODO(eustas): avoid no-op seeks mp4read_seek(mp4config.frame.current); mp4config.bitbuf.size = mp4config.frame.info[mp4config.frame.current].len; if (fread(mp4config.bitbuf.data, 1, mp4config.bitbuf.size, g_fin) != mp4config.bitbuf.size) { fprintf(stderr, "can't read frame data(frame %d@0x%x)\n", mp4config.frame.current, mp4config.frame.info[mp4config.frame.current].offset); return ERR_FAIL; } mp4config.frame.current++; return ERR_OK; } int mp4read_seek(uint32_t framenum) { if (framenum > mp4config.frame.nsamples) return ERR_FAIL; if (fseek(g_fin, mp4config.frame.info[framenum].offset, SEEK_SET)) return ERR_FAIL; mp4config.frame.current = framenum; return ERR_OK; } static void mp4info(void) { fprintf(stderr, "Modification Time:\t\t%s\n", mp4time(mp4config.mtime)); fprintf(stderr, "Samplerate:\t\t%d\n", mp4config.samplerate); fprintf(stderr, "Total samples:\t\t%d\n", mp4config.samples); fprintf(stderr, "Total channels:\t\t%d\n", mp4config.channels); fprintf(stderr, "Bits per sample:\t%d\n", mp4config.bits); fprintf(stderr, "Buffer size:\t\t%d\n", mp4config.buffersize); fprintf(stderr, "Max bitrate:\t\t%d\n", mp4config.bitratemax); fprintf(stderr, "Average bitrate:\t%d\n", mp4config.bitrateavg); fprintf(stderr, "Frames:\t\t\t%d\n", mp4config.frame.nsamples); fprintf(stderr, "ASC size:\t\t%d\n", mp4config.asc.size); fprintf(stderr, "Duration:\t\t%.1f sec\n", (float)mp4config.samples/mp4config.samplerate); if (mp4config.frame.nsamples) fprintf(stderr, "Data offset:\t%x\n", mp4config.frame.info[0].offset); } int mp4read_close(void) { freeMem(&mp4config.frame.info); freeMem(&mp4config.frame.map); freeMem(&mp4config.bitbuf.data); return ERR_OK; } int mp4read_open(char *name) { uint32_t atomsize; int ret; mp4read_close(); g_fin = faad_fopen(name, "rb"); if (!g_fin) return ERR_FAIL; if (mp4config.verbose.header) fprintf(stderr, "**** MP4 header ****\n"); g_atom = g_head; atomsize = INT_MAX; if (parse(&atomsize) < 0) goto err; g_atom = g_moov; atomsize = INT_MAX; rewind(g_fin); if ((ret = parse(&atomsize)) < 0) { fprintf(stderr, "parse:%d\n", ret); goto err; } // alloc frame buffer mp4config.bitbuf.data = malloc(mp4config.frame.maxsize); if (!mp4config.bitbuf.data) goto err; if (mp4config.verbose.header) { mp4info(); fprintf(stderr, "********************\n"); } if (mp4config.verbose.tags) { rewind(g_fin); g_atom = g_meta1; atomsize = INT_MAX; ret = parse(&atomsize); if (ret < 0) { rewind(g_fin); g_atom = g_meta2; atomsize = INT_MAX; ret = parse(&atomsize); } } return ERR_OK; err: mp4read_close(); return ERR_FAIL; } faad2-2.11.2/frontend/mp4read.h000066400000000000000000000036521476153623600161210ustar00rootroot00000000000000/**************************************************************************** MP4 input module Copyright (C) 2017 Krzysztof Nikiel This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ****************************************************************************/ #include typedef struct { uint32_t len; uint32_t offset; } frame_info_t; typedef struct { uint32_t firstchunk; uint32_t samplesperchunk; } slice_info_t; typedef struct { uint32_t ctime, mtime; uint32_t samplerate; // total sound samples uint32_t samples; uint32_t channels; // sample depth uint32_t bits; // buffer config uint32_t buffersize; uint32_t bitratemax; uint32_t bitrateavg; // frame size / offsets struct { frame_info_t *info; slice_info_t *map; uint32_t nsamples; uint32_t nsclices; uint32_t current; uint32_t maxsize; } frame; // AudioSpecificConfig data: struct { uint8_t buf[10]; uint32_t size; } asc; struct { uint32_t size; uint8_t *data; } bitbuf; struct { int header; int tags; } verbose; } mp4config_t; extern mp4config_t mp4config; int mp4read_open(char *name); int mp4read_seek(uint32_t framenum); int mp4read_frame(void); int mp4read_close(void); faad2-2.11.2/frontend/unicode_support.c000066400000000000000000000101561476153623600177770ustar00rootroot00000000000000/* Copyright (c) 2004-2012 LoRd_MuldeR File: unicode_support.c This file was originally part of a patch included with LameXP, released under the same license as the original audio tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define _CRT_SECURE_NO_WARNINGS #include #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 #include "unicode_support.h" #include #define WIN32_LEAN_AND_MEAN #include #include #include static UINT g_old_output_cp = ((UINT)-1); static char *utf16_to_utf8(const wchar_t *input) { char *Buffer; int BuffSize = 0, Result = 0; BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); Buffer = (char*) malloc(sizeof(char) * BuffSize); if(Buffer) { Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL); } return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; } static wchar_t *utf8_to_utf16(const char *input) { wchar_t *Buffer; int BuffSize = 0, Result = 0; BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize); if(Buffer) { Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize); } return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; } void init_commandline_arguments_utf8(int *argc, char ***argv) { int i, nArgs; LPWSTR *szArglist; szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); if(NULL == szArglist) { fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n"); exit(-1); } *argv = (char**) malloc(sizeof(char*) * nArgs); *argc = nArgs; if(NULL == *argv) { fprintf(stderr, "\nFATAL: Malloc failed\n\n"); exit(-1); } for(i = 0; i < nArgs; i++) { (*argv)[i] = utf16_to_utf8(szArglist[i]); if(NULL == (*argv)[i]) { fprintf(stderr, "\nFATAL: utf16_to_utf8 failed\n\n"); exit(-1); } } LocalFree(szArglist); } void free_commandline_arguments_utf8(int *argc, char ***argv) { int i = 0; if(*argv != NULL) { for(i = 0; i < *argc; i++) { if((*argv)[i] != NULL) { free((*argv)[i]); (*argv)[i] = NULL; } } free(*argv); *argv = NULL; } } FILE *faad_fopen(const char *filename, const char *mode) { FILE *ret = NULL; wchar_t *filename_utf16 = utf8_to_utf16(filename); wchar_t *mode_utf16 = utf8_to_utf16(mode); if(filename_utf16 && mode_utf16) { ret = _wfopen(filename_utf16, mode_utf16); } if(filename_utf16) free(filename_utf16); if(mode_utf16) free(mode_utf16); return ret; } void init_console_utf8(FILE *const stream) { if (_isatty(_fileno(stream))) { g_old_output_cp = GetConsoleOutputCP(); SetConsoleOutputCP(CP_UTF8); } } void uninit_console_utf8(void) { if(g_old_output_cp != ((UINT)-1)) { SetConsoleOutputCP(g_old_output_cp); } } #else FILE *faad_fopen(const char *filename, const char *mode) { return fopen(filename, mode); } #endif faad2-2.11.2/frontend/unicode_support.h000066400000000000000000000036651476153623600200130ustar00rootroot00000000000000/* Copyright (c) 2004-2012 LoRd_MuldeR File: unicode_support.h This file was originally part of a patch included with LameXP, released under the same license as the original audio tools. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UNICODE_SUPPORT_H_INCLUDED #define UNICODE_SUPPORT_H_INCLUDED #include #if defined WIN32 || defined _WIN32 || defined WIN64 || defined _WIN64 void init_commandline_arguments_utf8(int *argc, char ***argv); void free_commandline_arguments_utf8(int *argc, char ***argv); void init_console_utf8(FILE *const stream); void uninit_console_utf8(void); #endif FILE *faad_fopen(const char *filename, const char *mode); #endif //UNICODE_SUPPORT_H_INCLUDED faad2-2.11.2/fuzz/000077500000000000000000000000001476153623600135655ustar00rootroot00000000000000faad2-2.11.2/fuzz/fuzz_config.c000066400000000000000000000040401476153623600162520ustar00rootroot00000000000000/* ** 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. **/ #include #include #include #include #include "neaacdec.h" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { long sink = 0; if (size < 1) return 0; unsigned char error_code = *(data++); size -= 1; char* error_message = NeAACDecGetErrorMessage(error_code); if (error_message) sink += strlen(error_message); char* id = NULL; char* copyright = NULL; sink += NeAACDecGetVersion(&id, ©right); sink += strlen(id); sink += strlen(copyright); sink += (long)NeAACDecGetCapabilities(); unsigned char* non_const_data = (unsigned char *)malloc(size); memcpy(non_const_data, data, size); mp4AudioSpecificConfig mp4ASC; NeAACDecAudioSpecificConfig(non_const_data, (unsigned long) size, &mp4ASC); free(non_const_data); return (sink < 0) ? sink : 0; } faad2-2.11.2/fuzz/fuzz_decode.c000066400000000000000000000076031476153623600162400ustar00rootroot00000000000000/* ** 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. **/ #include #include #include #include #include #include "neaacdec.h" int feenableexcept(int excepts); int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { size_t preamble = 2 + 2 + 1 + sizeof(NeAACDecConfiguration); NeAACDecConfiguration config; uint64_t sample_rate; unsigned char num_channels; NeAACDecConfigurationPtr config_ptr; /* feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW); */ if (size < preamble) return 0; size_t len1 = data[0] | (data[1] << 8); data += 2; size_t len2 = data[0] | (data[1] << 8); data += 2; uint8_t flags = data[0]; data += 1; memcpy(&config, data, sizeof(NeAACDecConfiguration)); data += sizeof(NeAACDecConfiguration); size -= preamble; if (len1 + len2 > size) return 0; size_t len3 = size - len1 - len2; int use_init2 = flags & 1; int seek_before = flags & 2; int seek_between = flags & 4; size_t buffer_op = (flags >> 3) & 3; int use_drm = flags & 32; int drm_channels = (flags >> 5) & 7; unsigned long drm_sample_rate = config.defSampleRate; int res, ok; const size_t kBufferSize[4] = {0, 0, 16, 16384}; size_t buffer_size = kBufferSize[buffer_op]; void* buffer = buffer_size > 0 ? (unsigned char *)malloc(buffer_size) : NULL; unsigned char* part1 = (unsigned char *)malloc(len1); unsigned char* part2 = (unsigned char *)malloc(len2); unsigned char* part3 = (unsigned char *)malloc(len3); memcpy(part1, data, len1); data += len1; memcpy(part2, data, len2); data += len2; memcpy(part3, data, len3); data += len3; NeAACDecHandle decoder = NeAACDecOpen(); ok = NeAACDecSetConfiguration(decoder, &config); if (!ok) goto cleanup; config_ptr = NeAACDecGetCurrentConfiguration(decoder); if (!config_ptr) __builtin_trap(); if (use_init2) { res = NeAACDecInit2(decoder, part1, len1, &sample_rate, &num_channels); } else { res = NeAACDecInit(decoder, part1, len1, &sample_rate, &num_channels); } if (use_drm) { #ifdef DRM_SUPPORT NeAACDecInitDRM(&decoder, drm_channels, drm_sample_rate); #else (void)drm_channels; (void)drm_sample_rate; #endif } if (res != 0) goto cleanup; NeAACDecFrameInfo faad_info; if (seek_before) { NeAACDecPostSeekReset(decoder, 0x1234567); } NeAACDecDecode(decoder, &faad_info, part2, len2); if (seek_between) { NeAACDecPostSeekReset(decoder, -0x1234567); } if (buffer_op == 0) { NeAACDecDecode(decoder, &faad_info, part3, len3); } else { NeAACDecDecode2(decoder, &faad_info, part3, len3, &buffer, buffer_size); } cleanup: NeAACDecClose(decoder); free(part1); free(part2); free(part3); if (buffer) free(buffer); return 0; } faad2-2.11.2/include/000077500000000000000000000000001476153623600142125ustar00rootroot00000000000000faad2-2.11.2/include/faad.h.in000066400000000000000000000026351476153623600156710ustar00rootroot00000000000000/* ** 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. ** **/ /* warn people for update */ #pragma message("please update faad2 include filename and function names!") #define FAAD2_VERSION "@VERSION@" /* Backwards compatible link */ #include "neaacdec.h" faad2-2.11.2/include/neaacdec.h000066400000000000000000000210031476153623600161020ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: neaacdec.h,v 1.14 2012/03/02 15:29:47 knik Exp $ **/ #ifndef __NEAACDEC_H__ #define __NEAACDEC_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #if 1 /* MACROS FOR BACKWARDS COMPATIBILITY */ /* structs */ #define faacDecHandle NeAACDecHandle #define faacDecConfiguration NeAACDecConfiguration #define faacDecConfigurationPtr NeAACDecConfigurationPtr #define faacDecFrameInfo NeAACDecFrameInfo /* functions */ #define faacDecGetErrorMessage NeAACDecGetErrorMessage #define faacDecSetConfiguration NeAACDecSetConfiguration #define faacDecGetCurrentConfiguration NeAACDecGetCurrentConfiguration #define faacDecInit NeAACDecInit #define faacDecInit2 NeAACDecInit2 #define faacDecInitDRM NeAACDecInitDRM #define faacDecPostSeekReset NeAACDecPostSeekReset #define faacDecOpen NeAACDecOpen #define faacDecClose NeAACDecClose #define faacDecDecode NeAACDecDecode #define AudioSpecificConfig NeAACDecAudioSpecificConfig #endif #ifdef _WIN32 #pragma pack(push, 8) #define NEAACDECAPI __declspec(dllexport) #elif defined(__GNUC__) && __GNUC__ >= 4 #define NEAACDECAPI __attribute__((visibility("default"))) #else #define NEAACDECAPI #endif #ifndef FAAD2_VERSION #define FAAD2_VERSION "unknown" #endif /* object types for AAC */ #define MAIN 1 #define LC 2 #define SSR 3 #define LTP 4 #define HE_AAC 5 #define ER_LC 17 #define ER_LTP 19 #define LD 23 #define DRM_ER_LC 27 /* special object type for DRM */ /* header types */ #define RAW 0 #define ADIF 1 #define ADTS 2 #define LATM 3 /* SBR signalling */ #define NO_SBR 0 #define SBR_UPSAMPLED 1 #define SBR_DOWNSAMPLED 2 #define NO_SBR_UPSAMPLED 3 /* library output formats */ #define FAAD_FMT_16BIT 1 #define FAAD_FMT_24BIT 2 #define FAAD_FMT_32BIT 3 #define FAAD_FMT_FLOAT 4 #define FAAD_FMT_FIXED FAAD_FMT_FLOAT #define FAAD_FMT_DOUBLE 5 /* Capabilities */ #define LC_DEC_CAP (1<<0) /* Can decode LC */ #define MAIN_DEC_CAP (1<<1) /* Can decode MAIN */ #define LTP_DEC_CAP (1<<2) /* Can decode LTP */ #define LD_DEC_CAP (1<<3) /* Can decode LD */ #define ERROR_RESILIENCE_CAP (1<<4) /* Can decode ER */ #define FIXED_POINT_CAP (1<<5) /* Fixed point */ /* Channel definitions */ #define FRONT_CHANNEL_CENTER (1) #define FRONT_CHANNEL_LEFT (2) #define FRONT_CHANNEL_RIGHT (3) #define SIDE_CHANNEL_LEFT (4) #define SIDE_CHANNEL_RIGHT (5) #define BACK_CHANNEL_LEFT (6) #define BACK_CHANNEL_RIGHT (7) #define BACK_CHANNEL_CENTER (8) #define LFE_CHANNEL (9) #define UNKNOWN_CHANNEL (0) /* DRM channel definitions */ #define DRMCH_MONO 1 #define DRMCH_STEREO 2 #define DRMCH_SBR_MONO 3 #define DRMCH_SBR_STEREO 4 #define DRMCH_SBR_PS_STEREO 5 /* A decode call can eat up to FAAD_MIN_STREAMSIZE bytes per decoded channel, so at least so much bytes per channel should be available in this stream */ #define FAAD_MIN_STREAMSIZE 768 /* 6144 bits/channel */ typedef void *NeAACDecHandle; typedef struct mp4AudioSpecificConfig { /* Audio Specific Info */ unsigned char objectTypeIndex; unsigned char samplingFrequencyIndex; unsigned long samplingFrequency; unsigned char channelsConfiguration; /* GA Specific Info */ unsigned char frameLengthFlag; unsigned char dependsOnCoreCoder; unsigned short coreCoderDelay; unsigned char extensionFlag; unsigned char aacSectionDataResilienceFlag; unsigned char aacScalefactorDataResilienceFlag; unsigned char aacSpectralDataResilienceFlag; unsigned char epConfig; char sbr_present_flag; char forceUpSampling; char downSampledSBR; } mp4AudioSpecificConfig; typedef struct NeAACDecConfiguration { unsigned char defObjectType; unsigned long defSampleRate; unsigned char outputFormat; unsigned char downMatrix; unsigned char useOldADTSFormat; unsigned char dontUpSampleImplicitSBR; } NeAACDecConfiguration, *NeAACDecConfigurationPtr; typedef struct NeAACDecFrameInfo { unsigned long bytesconsumed; unsigned long samples; unsigned char channels; unsigned char error; unsigned long samplerate; /* SBR: 0: off, 1: on; upsample, 2: on; downsampled, 3: off; upsampled */ unsigned char sbr; /* MPEG-4 ObjectType */ unsigned char object_type; /* AAC header type; MP4 will be signalled as RAW also */ unsigned char header_type; /* multichannel configuration */ unsigned char num_front_channels; unsigned char num_side_channels; unsigned char num_back_channels; unsigned char num_lfe_channels; unsigned char channel_position[64]; /* PS: 0: off, 1: on */ unsigned char ps; } NeAACDecFrameInfo; NEAACDECAPI char* NeAACDecGetErrorMessage(unsigned char errcode); NEAACDECAPI unsigned long NeAACDecGetCapabilities(void); NEAACDECAPI NeAACDecHandle NeAACDecOpen(void); NEAACDECAPI NeAACDecConfigurationPtr NeAACDecGetCurrentConfiguration(NeAACDecHandle hDecoder); NEAACDECAPI unsigned char NeAACDecSetConfiguration(NeAACDecHandle hDecoder, NeAACDecConfigurationPtr config); /* Init the library based on info from the AAC file (ADTS/ADIF) */ NEAACDECAPI long NeAACDecInit(NeAACDecHandle hDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels); /* Init the library using a DecoderSpecificInfo */ NEAACDECAPI char NeAACDecInit2(NeAACDecHandle hDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels); /* Init the library for DRM */ NEAACDECAPI char NeAACDecInitDRM(NeAACDecHandle *hDecoder, unsigned long samplerate, unsigned char channels); NEAACDECAPI void NeAACDecPostSeekReset(NeAACDecHandle hDecoder, long frame); NEAACDECAPI void NeAACDecClose(NeAACDecHandle hDecoder); NEAACDECAPI void* NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); NEAACDECAPI void* NeAACDecDecode2(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer, unsigned long sample_buffer_size); NEAACDECAPI char NeAACDecAudioSpecificConfig(unsigned char *pBuffer, unsigned long buffer_size, mp4AudioSpecificConfig *mp4ASC); /* Get version and copyright strings */ NEAACDECAPI int NeAACDecGetVersion(char **faad_id_string, char **faad_copyright_string); #ifdef _WIN32 #pragma pack(pop) #endif #ifdef __cplusplus } #endif /* __cplusplus */ #endif faad2-2.11.2/libfaad/000077500000000000000000000000001476153623600141515ustar00rootroot00000000000000faad2-2.11.2/libfaad/analysis.h000066400000000000000000000031221476153623600161430ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: analysis.h,v 1.18 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __ANALYSIS_H__ #define __ANALYSIS_H__ #ifdef __cplusplus extern "C" { #endif #ifdef ANALYSIS #define DEBUGDEC ,uint8_t print,uint16_t var,uint8_t *dbg #define DEBUGVAR(A,B,C) ,A,B,C extern uint16_t dbg_count; #else #define DEBUGDEC #define DEBUGVAR(A,B,C) #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/bits.c000066400000000000000000000155311476153623600152630ustar00rootroot00000000000000/* ** 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" /* reads only n bytes from the stream instead of the standard 4 */ static /*INLINE*/ uint32_t getdword_n(void *mem, int n) { uint8_t* m8 = (uint8_t*)mem; switch (n) { case 3: return ((uint32_t)m8[2] << 8) | ((uint32_t)m8[1] << 16) | ((uint32_t)m8[0] << 24); case 2: return ((uint32_t)m8[1] << 16) | ((uint32_t)m8[0] << 24); case 1: return (uint32_t)m8[0] << 24; default: return 0; } } /* 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; 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)ld; } 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; } #ifdef DRM /* 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]; } #endif /* reset to a certain point */ void faad_resetbits(bitfile *ld, uint32_t bits) { uint32_t tmp; uint32_t words = bits >> 5; uint32_t remainder = bits & 0x1F; if (ld->buffer_size < words * 4) ld->bytes_left = 0; else ld->bytes_left = ld->buffer_size - words*4; if (ld->bytes_left >= 4) { tmp = getdword(&ld->start[words]); ld->bytes_left -= 4; } else { tmp = getdword_n(&ld->start[words], ld->bytes_left); ld->bytes_left = 0; } ld->bufa = tmp; if (ld->bytes_left >= 4) { tmp = getdword(&ld->start[words+1]); ld->bytes_left -= 4; } else { tmp = getdword_n(&ld->start[words+1], ld->bytes_left); ld->bytes_left = 0; } ld->bufb = tmp; ld->bits_left = 32 - remainder; ld->tail = &ld->start[words+2]; /* recheck for reading too many bytes */ ld->error = 0; // if (ld->bytes_left == 0) // ld->no_more_reading = 1; // if (ld->bytes_left < 0) // ld->error = 1; } uint8_t *faad_getbitbuffer(bitfile *ld, uint32_t bits DEBUGDEC) { int i; unsigned int temp; int bytes = bits >> 3; int remainder = bits & 0x7; uint8_t *buffer = (uint8_t*)faad_malloc((bytes+1)*sizeof(uint8_t)); for (i = 0; i < bytes; i++) { buffer[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(print,var,dbg)); } if (remainder) { temp = faad_getbits(ld, remainder DEBUGVAR(print,var,dbg)) << (8-remainder); buffer[bytes] = (uint8_t)temp; } return buffer; } #ifdef DRM /* return the original data buffer */ void *faad_origbitbuffer(bitfile *ld) { return (void*)ld->start; } /* return the original data buffer size */ uint32_t faad_origbitbuffer_size(bitfile *ld) { return ld->buffer_size; } #endif #if 0 /* 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; } #endif /* EOF */ faad2-2.11.2/libfaad/bits.h000066400000000000000000000267731476153623600153020ustar00rootroot00000000000000/* ** 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 { const void *buffer; uint32_t *tail; uint32_t *start; /* 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; } 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); #if 0 void faad_initbits_rev(bitfile *ld, void *buffer, uint32_t bits_in_buffer); #endif uint8_t faad_byte_align(bitfile *ld); uint32_t faad_get_processed_bits(bitfile *ld); void faad_flushbits_ex(bitfile *ld, uint32_t bits); #ifdef DRM void faad_rewindbits(bitfile *ld); #endif void faad_resetbits(bitfile *ld, uint32_t 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) { uint8_t* m8 = (uint8_t*)mem; return (uint32_t)m8[3] | ((uint32_t)m8[2] << 8) | ((uint32_t)m8[1] << 16) | ((uint32_t)m8[0] << 24); } 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 & ((1u<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; } #if 0 /* 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 & (1u << (i + (32 - ld->bits_left)))) B |= (1u << (bits - i - 1)); } return B; } else { for (i = 0; i < ld->bits_left; i++) { if (ld->bufa & (1u << (i + (32 - ld->bits_left)))) B |= (1u << (bits - i - 1)); } for (i = 0; i < bits - ld->bits_left; i++) { if (ld->bufb & (1u << (i + (32-ld->bits_left)))) B |= (1u << (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; } #endif #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 INLINE 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; } } #ifdef SBR_DEC 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 }; static INLINE uint8_t reverse_byte(uint8_t b) { return tabFlipbits[b]; } #endif #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; /* PRECONDITION: bits <= 32 */ static INLINE uint32_t showbits_hcr(bits_t *ld, uint8_t bits) { uint32_t mask; int8_t tail; if (bits == 0) return 0; if (ld->len == 0) return 0; tail = ld->len - bits; mask = 0xFFFFFFFF >> (32 - bits); if (ld->len <= 32) { /* huffman_spectral_data_2 might request more than available (tail < 0), pad with zeroes then. */ if (tail >= 0) return (ld->bufa >> tail) & mask; /* tail is 0..31 */ else return (ld->bufa << -tail) & mask; /* -tail is 1..31 */ } else { /* tail is 1..63 */ if (tail < 32) return ((ld->bufb << (32 - tail)) | (ld->bufa >> tail)) & mask; else return (ld->bufb >> (tail - 32)) & mask; } } /* return 1 if position is outside of buffer, 0 otherwise */ static INLINE int8_t flushbits_hcr( bits_t *ld, uint8_t bits) { ld->len -= bits; if (ld->len <0) { ld->len = 0; return 1; } else { return 0; } } static INLINE int8_t getbits_hcr(bits_t *ld, uint8_t n, uint32_t *result) { *result = showbits_hcr(ld, n); return flushbits_hcr(ld, n); } static INLINE int8_t get1bit_hcr(bits_t *ld, uint8_t *result) { uint32_t res; int8_t ret; ret = getbits_hcr(ld, 1, &res); *result = (int8_t)(res & 1); return ret; } #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/cfft.c000066400000000000000000001063711476153623600152470ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: cfft.c,v 1.35 2007/11/01 12:33:29 menno Exp $ **/ /* * Algorithmically based on Fortran-77 FFTPACK * by Paul N. Swarztrauber(Version 4, 1985). * * Does even sized fft only */ /* isign is +1 for backward and -1 for forward transforms */ #include "common.h" #include "structs.h" #include #include "cfft.h" #include "cfft_tab.h" /* static function declarations */ static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa); static void passf2neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa); static void passf3(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const int8_t isign); static void passf4pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); static void passf4neg(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3); static void passf5(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa1, const complex_t *wa2, const complex_t *wa3, const complex_t *wa4, const int8_t isign); static void cffti1(uint16_t n, complex_t *wa, uint16_t *ifac); /*---------------------------------------------------------------------- passf2, passf3, passf4, passf5. Complex FFT passes fwd and bwd. ----------------------------------------------------------------------*/ static void passf2pos(const uint16_t ido, const uint16_t l1, const complex_t *cc, complex_t *ch, const complex_t *wa) { uint16_t i, k, ah, ac; if (ido == 1) { #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION // TODO: remove this code once fuzzer proves it is totally unreahable // For supported frame lengths that have odd number of factor 2 it is // never the last factor; consequently `ido` should never be 1. __builtin_trap(); /* #endif 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]); } #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION */ #endif } 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) { #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION // TODO: remove this code once fuzzer proves it is totally unreahable // For supported frame lengths that have odd number of factor 2 it is // never the last factor; consequently `ido` should never be 1. __builtin_trap(); /* #endif 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]); } #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION */ #endif } 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) { #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION // TODO: remove this code once fuzzer proves it is totally unreahable // 3 is never the the biggest factor for supported frame lengths; // consequently `ido` should never be 1. __builtin_trap(); /* #endif 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); } } #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION */ #endif } 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 k, ac, ah; complex_t c2, c3, c4, c5, t2, t3, t4, t5; (void)wa1; (void)wa2; (void)wa3; (void)wa4; 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 { #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION // TODO: remove this code once fuzzer proves it is totally unreahable // 5 if the biggest factor and it never repeated for supported frame // lengths; consequently `ido` should always be 1. __builtin_trap(); /* #else uint16_t i; complex_t d3, d4, d5, d2; #endif 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 } } } #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION */ #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; 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; 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; 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; 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; } #else // FIXED_POINT (void)wa; /* whoa! does it work for FIXED_POINT? */ #endif } cfft_info *cffti(uint16_t n) { cfft_info *cfft = (cfft_info*)faad_malloc(sizeof(cfft_info)); cfft->n = n; cfft->work = (complex_t*)faad_malloc(n*sizeof(complex_t)); #ifndef FIXED_POINT cfft->tab = (complex_t*)faad_malloc(n*sizeof(complex_t)); cffti1(n, cfft->tab, cfft->ifac); #else cffti1(n, NULL, cfft->ifac); switch (n) { case 64: cfft->tab = (complex_t*)cfft_tab_64; break; case 512: cfft->tab = (complex_t*)cfft_tab_512; break; #ifdef LD_DEC case 256: cfft->tab = (complex_t*)cfft_tab_256; break; #endif #ifdef ALLOW_SMALL_FRAMELENGTH case 60: cfft->tab = (complex_t*)cfft_tab_60; break; case 480: cfft->tab = (complex_t*)cfft_tab_480; break; #ifdef LD_DEC case 240: cfft->tab = (complex_t*)cfft_tab_240; break; #endif #endif case 128: cfft->tab = (complex_t*)cfft_tab_128; break; } #endif return cfft; } void cfftu(cfft_info *cfft) { if (cfft->work) faad_free(cfft->work); #ifndef FIXED_POINT if (cfft->tab) faad_free(cfft->tab); #endif if (cfft) faad_free(cfft); } faad2-2.11.2/libfaad/cfft.h000066400000000000000000000032051476153623600152440ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: cfft.h,v 1.24 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __CFFT_H__ #define __CFFT_H__ #ifdef __cplusplus extern "C" { #endif typedef struct { uint16_t n; uint16_t ifac[15]; complex_t *work; complex_t *tab; } cfft_info; void cfftf(cfft_info *cfft, complex_t *c); void cfftb(cfft_info *cfft, complex_t *c); cfft_info *cffti(uint16_t n); void cfftu(cfft_info *cfft); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/cfft_tab.h000066400000000000000000003633011476153623600161000ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: cfft_tab.h,v 1.21 2007/11/01 12:33:29 menno Exp $ **/ #ifndef __CFFT_TAB_H__ #define __CFFT_TAB_H__ #ifdef __cplusplus extern "C" { #endif #ifdef FIXED_POINT ALIGN static const complex_t cfft_tab_512[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999924719333649), FRAC_CONST(0.012271538376808) }, { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, { FRAC_CONST(0.999322354793549), FRAC_CONST(0.036807224154472) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.998118102550507), FRAC_CONST(0.061320740729570) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.996312618255615), FRAC_CONST(0.085797317326069) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.993906974792480), FRAC_CONST(0.110222205519676) }, { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, { FRAC_CONST(0.990902662277222), FRAC_CONST(0.134580716490746) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.987301409244537), FRAC_CONST(0.158858150243759) }, { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, { FRAC_CONST(0.983105480670929), FRAC_CONST(0.183039888739586) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.978317379951477), FRAC_CONST(0.207111388444901) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.972939968109131), FRAC_CONST(0.231058120727539) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.966976463794708), FRAC_CONST(0.254865676164627) }, { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, { FRAC_CONST(0.960430502891541), FRAC_CONST(0.278519690036774) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.953306019306183), FRAC_CONST(0.302005946636200) }, { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, { FRAC_CONST(0.945607304573059), FRAC_CONST(0.325310319662094) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.937339007854462), FRAC_CONST(0.348418682813644) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.928506076335907), FRAC_CONST(0.371317207813263) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.919113874435425), FRAC_CONST(0.393992066383362) }, { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, { FRAC_CONST(0.909167945384979), FRAC_CONST(0.416429579257965) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.898674488067627), FRAC_CONST(0.438616245985031) }, { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, { FRAC_CONST(0.887639641761780), FRAC_CONST(0.460538715124130) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.876070082187653), FRAC_CONST(0.482183754444122) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.863972842693329), FRAC_CONST(0.503538370132446) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.851355195045471), FRAC_CONST(0.524589717388153) }, { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, { FRAC_CONST(0.838224709033966), FRAC_CONST(0.545324981212616) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.824589252471924), FRAC_CONST(0.565731823444366) }, { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, { FRAC_CONST(0.810457170009613), FRAC_CONST(0.585797905921936) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.795836925506592), FRAC_CONST(0.605511009693146) }, { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, { FRAC_CONST(0.780737221240997), FRAC_CONST(0.624859511852264) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.765167236328125), FRAC_CONST(0.643831551074982) }, { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(0.749136388301849), FRAC_CONST(0.662415802478790) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.732654273509979), FRAC_CONST(0.680601000785828) }, { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, { FRAC_CONST(0.715730786323547), FRAC_CONST(0.698376297950745) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.698376238346100), FRAC_CONST(0.715730845928192) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.680601000785828), FRAC_CONST(0.732654273509979) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.662415742874146), FRAC_CONST(0.749136388301849) }, { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, { FRAC_CONST(0.643831551074982), FRAC_CONST(0.765167295932770) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.624859452247620), FRAC_CONST(0.780737280845642) }, { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, { FRAC_CONST(0.605511009693146), FRAC_CONST(0.795836925506592) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.585797846317291), FRAC_CONST(0.810457170009613) }, { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.565731823444366), FRAC_CONST(0.824589312076569) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.545324981212616), FRAC_CONST(0.838224709033966) }, { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, { FRAC_CONST(0.524589657783508), FRAC_CONST(0.851355195045471) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.503538429737091), FRAC_CONST(0.863972842693329) }, { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, { FRAC_CONST(0.482183724641800), FRAC_CONST(0.876070141792297) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.460538715124130), FRAC_CONST(0.887639641761780) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.438616186380386), FRAC_CONST(0.898674488067627) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.416429549455643), FRAC_CONST(0.909168004989624) }, { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, { FRAC_CONST(0.393991947174072), FRAC_CONST(0.919113874435425) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.371317148208618), FRAC_CONST(0.928506076335907) }, { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(0.348418682813644), FRAC_CONST(0.937339007854462) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.325310230255127), FRAC_CONST(0.945607364177704) }, { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, { FRAC_CONST(0.302005946636200), FRAC_CONST(0.953306019306183) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.278519600629807), FRAC_CONST(0.960430562496185) }, { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(0.254865646362305), FRAC_CONST(0.966976463794708) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.231058135628700), FRAC_CONST(0.972939968109131) }, { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(0.207111328840256), FRAC_CONST(0.978317379951477) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.183039888739586), FRAC_CONST(0.983105480670929) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.158858075737953), FRAC_CONST(0.987301409244537) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.134580686688423), FRAC_CONST(0.990902662277222) }, { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, { FRAC_CONST(0.110222116112709), FRAC_CONST(0.993906974792480) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.085797272622585), FRAC_CONST(0.996312618255615) }, { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(0.061320748180151), FRAC_CONST(0.998118102550507) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(0.036807164549828), FRAC_CONST(0.999322414398193) }, { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(0.012271529063582), FRAC_CONST(0.999924719333649) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.012271616607904), FRAC_CONST(0.999924719333649) }, { FRAC_CONST(-0.024541223421693), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(-0.036807250231504), FRAC_CONST(0.999322354793549) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.061320833861828), FRAC_CONST(0.998118102550507) }, { FRAC_CONST(-0.073564574122429), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(-0.085797362029552), FRAC_CONST(0.996312618255615) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.110222205519676), FRAC_CONST(0.993906974792480) }, { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, { FRAC_CONST(-0.134580776095390), FRAC_CONST(0.990902602672577) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.158858165144920), FRAC_CONST(0.987301409244537) }, { FRAC_CONST(-0.170961946249008), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(-0.183039978146553), FRAC_CONST(0.983105480670929) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.207111418247223), FRAC_CONST(0.978317379951477) }, { FRAC_CONST(-0.219101309776306), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(-0.231058210134506), FRAC_CONST(0.972939908504486) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.254865705966949), FRAC_CONST(0.966976463794708) }, { FRAC_CONST(-0.266712844371796), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(-0.278519690036774), FRAC_CONST(0.960430502891541) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.302006036043167), FRAC_CONST(0.953306019306183) }, { FRAC_CONST(-0.313681721687317), FRAC_CONST(0.949528157711029) }, { FRAC_CONST(-0.325310319662094), FRAC_CONST(0.945607304573059) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.348418772220612), FRAC_CONST(0.937338948249817) }, { FRAC_CONST(-0.359895050525665), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(-0.371317237615585), FRAC_CONST(0.928506076335907) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.393992036581039), FRAC_CONST(0.919113874435425) }, { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, { FRAC_CONST(-0.416429519653320), FRAC_CONST(0.909168004989624) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.438616245985031), FRAC_CONST(0.898674428462982) }, { FRAC_CONST(-0.449611365795136), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(-0.460538804531097), FRAC_CONST(0.887639582157135) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.482183903455734), FRAC_CONST(0.876070022583008) }, { FRAC_CONST(-0.492898166179657), FRAC_CONST(0.870087027549744) }, { FRAC_CONST(-0.503538370132446), FRAC_CONST(0.863972842693329) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.524589717388153), FRAC_CONST(0.851355135440826) }, { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, { FRAC_CONST(-0.545325100421906), FRAC_CONST(0.838224649429321) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.565731763839722), FRAC_CONST(0.824589312076569) }, { FRAC_CONST(-0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(-0.585797905921936), FRAC_CONST(0.810457170009613) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.605511128902435), FRAC_CONST(0.795836865901947) }, { FRAC_CONST(-0.615231692790985), FRAC_CONST(0.788346350193024) }, { FRAC_CONST(-0.624859631061554), FRAC_CONST(0.780737102031708) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.643831551074982), FRAC_CONST(0.765167236328125) }, { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, { FRAC_CONST(-0.662415802478790), FRAC_CONST(0.749136328697205) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.680601119995117), FRAC_CONST(0.732654154300690) }, { FRAC_CONST(-0.689540684223175), FRAC_CONST(0.724246978759766) }, { FRAC_CONST(-0.698376238346100), FRAC_CONST(0.715730845928192) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.715730845928192), FRAC_CONST(0.698376238346100) }, { FRAC_CONST(-0.724247157573700), FRAC_CONST(0.689540505409241) }, { FRAC_CONST(-0.732654333114624), FRAC_CONST(0.680600941181183) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.749136507511139), FRAC_CONST(0.662415623664856) }, { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(-0.765167295932770), FRAC_CONST(0.643831551074982) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.780737280845642), FRAC_CONST(0.624859452247620) }, { FRAC_CONST(-0.788346469402313), FRAC_CONST(0.615231513977051) }, { FRAC_CONST(-0.795836985111237), FRAC_CONST(0.605510950088501) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.810457170009613), FRAC_CONST(0.585797846317291) }, { FRAC_CONST(-0.817584812641144), FRAC_CONST(0.575808167457581) }, { FRAC_CONST(-0.824589312076569), FRAC_CONST(0.565731763839722) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.838224768638611), FRAC_CONST(0.545324862003326) }, { FRAC_CONST(-0.844853639602661), FRAC_CONST(0.534997463226318) }, { FRAC_CONST(-0.851355314254761), FRAC_CONST(0.524589538574219) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.863972842693329), FRAC_CONST(0.503538370132446) }, { FRAC_CONST(-0.870087027549744), FRAC_CONST(0.492898136377335) }, { FRAC_CONST(-0.876070141792297), FRAC_CONST(0.482183694839478) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.887639701366425), FRAC_CONST(0.460538566112518) }, { FRAC_CONST(-0.893224298954010), FRAC_CONST(0.449611365795136) }, { FRAC_CONST(-0.898674488067627), FRAC_CONST(0.438616245985031) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.909168004989624), FRAC_CONST(0.416429489850998) }, { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, { FRAC_CONST(-0.919113874435425), FRAC_CONST(0.393991917371750) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.928506076335907), FRAC_CONST(0.371317237615585) }, { FRAC_CONST(-0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(-0.937339007854462), FRAC_CONST(0.348418653011322) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.945607364177704), FRAC_CONST(0.325310200452805) }, { FRAC_CONST(-0.949528217315674), FRAC_CONST(0.313681602478027) }, { FRAC_CONST(-0.953306078910828), FRAC_CONST(0.302005797624588) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.960430502891541), FRAC_CONST(0.278519690036774) }, { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, { FRAC_CONST(-0.966976463794708), FRAC_CONST(0.254865586757660) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.972939968109131), FRAC_CONST(0.231057971715927) }, { FRAC_CONST(-0.975702166557312), FRAC_CONST(0.219101071357727) }, { FRAC_CONST(-0.978317379951477), FRAC_CONST(0.207111403346062) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.983105480670929), FRAC_CONST(0.183039844036102) }, { FRAC_CONST(-0.985277652740479), FRAC_CONST(0.170961812138557) }, { FRAC_CONST(-0.987301409244537), FRAC_CONST(0.158858031034470) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.990902662277222), FRAC_CONST(0.134580522775650) }, { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, { FRAC_CONST(-0.993906974792480), FRAC_CONST(0.110222198069096) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.996312618255615), FRAC_CONST(0.085797227919102) }, { FRAC_CONST(-0.997290492057800), FRAC_CONST(0.073564447462559) }, { FRAC_CONST(-0.998118102550507), FRAC_CONST(0.061320584267378) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(-0.999322354793549), FRAC_CONST(0.036807239055634) }, { FRAC_CONST(-0.999698817729950), FRAC_CONST(0.024541210383177) }, { FRAC_CONST(-0.999924719333649), FRAC_CONST(0.012271485291421) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const complex_t cfft_tab_480[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999914348125458), FRAC_CONST(0.013089596293867) }, { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, { FRAC_CONST(0.999229013919830), FRAC_CONST(0.039259817451239) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.997858941555023), FRAC_CONST(0.065403133630753) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.995804905891418), FRAC_CONST(0.091501623392105) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.993068456649780), FRAC_CONST(0.117537401616573) }, { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, { FRAC_CONST(0.989651381969452), FRAC_CONST(0.143492624163628) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.985556066036224), FRAC_CONST(0.169349506497383) }, { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.975342333316803), FRAC_CONST(0.220697447657585) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.969230890274048), FRAC_CONST(0.246153295040131) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.962455213069916), FRAC_CONST(0.271440446376801) }, { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, { FRAC_CONST(0.955019950866699), FRAC_CONST(0.296541601419449) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.946930110454559), FRAC_CONST(0.321439445018768) }, { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, { FRAC_CONST(0.938191354274750), FRAC_CONST(0.346117079257965) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.928809583187103), FRAC_CONST(0.370557427406311) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.918791174888611), FRAC_CONST(0.394743889570236) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.908143162727356), FRAC_CONST(0.418659746646881) }, { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(0.896872758865356), FRAC_CONST(0.442288726568222) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.884987652301788), FRAC_CONST(0.465614527463913) }, { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, { FRAC_CONST(0.872496008872986), FRAC_CONST(0.488621264696121) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.859406411647797), FRAC_CONST(0.511293113231659) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.845727801322937), FRAC_CONST(0.533614516258240) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, { FRAC_CONST(0.816641509532928), FRAC_CONST(0.577145218849182) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.801253795623779), FRAC_CONST(0.598324596881866) }, { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(0.785316884517670), FRAC_CONST(0.619093954563141) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.768841803073883), FRAC_CONST(0.639438986778259) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.751839756965637), FRAC_CONST(0.659345865249634) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.734322488307953), FRAC_CONST(0.678800761699677) }, { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, { FRAC_CONST(0.716301918029785), FRAC_CONST(0.697790503501892) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.697790443897247), FRAC_CONST(0.716301977634430) }, { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, { FRAC_CONST(0.678800702095032), FRAC_CONST(0.734322547912598) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.659345805644989), FRAC_CONST(0.751839816570282) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.639438986778259), FRAC_CONST(0.768841862678528) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.619093954563141), FRAC_CONST(0.785316944122314) }, { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, { FRAC_CONST(0.598324596881866), FRAC_CONST(0.801253855228424) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.577145159244537), FRAC_CONST(0.816641569137573) }, { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.533614516258240), FRAC_CONST(0.845727801322937) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.511293113231659), FRAC_CONST(0.859406411647797) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.488621175289154), FRAC_CONST(0.872496068477631) }, { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(0.465614467859268), FRAC_CONST(0.884987652301788) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.442288666963577), FRAC_CONST(0.896872758865356) }, { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, { FRAC_CONST(0.418659746646881), FRAC_CONST(0.908143162727356) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.394743800163269), FRAC_CONST(0.918791234493256) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.370557397603989), FRAC_CONST(0.928809583187103) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.346117049455643), FRAC_CONST(0.938191354274750) }, { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(0.321439474821091), FRAC_CONST(0.946930110454559) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.296541512012482), FRAC_CONST(0.955019950866699) }, { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, { FRAC_CONST(0.271440386772156), FRAC_CONST(0.962455272674561) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.246153265237808), FRAC_CONST(0.969230890274048) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.220697447657585), FRAC_CONST(0.975342333316803) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(0.169349446892738), FRAC_CONST(0.985556066036224) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.143492594361305), FRAC_CONST(0.989651381969452) }, { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(0.117537401616573), FRAC_CONST(0.993068456649780) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.091501533985138), FRAC_CONST(0.995804905891418) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(0.065403074026108), FRAC_CONST(0.997858941555023) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(0.039259787648916), FRAC_CONST(0.999229013919830) }, { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(0.013089597225189), FRAC_CONST(0.999914348125458) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.013089684769511), FRAC_CONST(0.999914348125458) }, { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.039259877055883), FRAC_CONST(0.999229013919830) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.065403163433075), FRAC_CONST(0.997858941555023) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.091501623392105), FRAC_CONST(0.995804905891418) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.117537491023541), FRAC_CONST(0.993068456649780) }, { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(-0.143492683768272), FRAC_CONST(0.989651381969452) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.169349536299706), FRAC_CONST(0.985556066036224) }, { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.220697522163391), FRAC_CONST(0.975342273712158) }, { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(-0.246153354644775), FRAC_CONST(0.969230890274048) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.271440476179123), FRAC_CONST(0.962455213069916) }, { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, { FRAC_CONST(-0.296541571617126), FRAC_CONST(0.955019950866699) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.321439564228058), FRAC_CONST(0.946930110454559) }, { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(-0.346117109060287), FRAC_CONST(0.938191294670105) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.370557487010956), FRAC_CONST(0.928809523582459) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.394743859767914), FRAC_CONST(0.918791234493256) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.418659836053848), FRAC_CONST(0.908143103122711) }, { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, { FRAC_CONST(-0.442288637161255), FRAC_CONST(0.896872758865356) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.465614557266235), FRAC_CONST(0.884987592697144) }, { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(-0.488621354103088), FRAC_CONST(0.872495949268341) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.511293053627014), FRAC_CONST(0.859406411647797) }, { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, { FRAC_CONST(-0.533614575862885), FRAC_CONST(0.845727801322937) }, { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.566406309604645), FRAC_CONST(0.824126124382019) }, { FRAC_CONST(-0.577145218849182), FRAC_CONST(0.816641569137573) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.598324656486511), FRAC_CONST(0.801253736019135) }, { FRAC_CONST(-0.608761429786682), FRAC_CONST(0.793353319168091) }, { FRAC_CONST(-0.619093894958496), FRAC_CONST(0.785316944122314) }, { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, { FRAC_CONST(-0.639439046382904), FRAC_CONST(0.768841803073883) }, { FRAC_CONST(-0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(-0.659345924854279), FRAC_CONST(0.751839697360992) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.678800761699677), FRAC_CONST(0.734322488307953) }, { FRAC_CONST(-0.688354671001434), FRAC_CONST(0.725374281406403) }, { FRAC_CONST(-0.697790503501892), FRAC_CONST(0.716301858425140) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.716302037239075), FRAC_CONST(0.697790324687958) }, { FRAC_CONST(-0.725374460220337), FRAC_CONST(0.688354492187500) }, { FRAC_CONST(-0.734322547912598), FRAC_CONST(0.678800702095032) }, { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, { FRAC_CONST(-0.751839876174927), FRAC_CONST(0.659345746040344) }, { FRAC_CONST(-0.760406017303467), FRAC_CONST(0.649448037147522) }, { FRAC_CONST(-0.768841803073883), FRAC_CONST(0.639439046382904) }, { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, { FRAC_CONST(-0.785316944122314), FRAC_CONST(0.619093894958496) }, { FRAC_CONST(-0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(-0.801253914833069), FRAC_CONST(0.598324477672577) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.816641569137573), FRAC_CONST(0.577145218849182) }, { FRAC_CONST(-0.824126303195953), FRAC_CONST(0.566406130790710) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(-0.845727920532227), FRAC_CONST(0.533614337444305) }, { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, { FRAC_CONST(-0.859406411647797), FRAC_CONST(0.511293053627014) }, { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, { FRAC_CONST(-0.872496068477631), FRAC_CONST(0.488621145486832) }, { FRAC_CONST(-0.878817141056061), FRAC_CONST(0.477158725261688) }, { FRAC_CONST(-0.884987652301788), FRAC_CONST(0.465614557266235) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.896872758865356), FRAC_CONST(0.442288637161255) }, { FRAC_CONST(-0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(-0.908143222332001), FRAC_CONST(0.418659597635269) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.918791234493256), FRAC_CONST(0.394743859767914) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.928809583187103), FRAC_CONST(0.370557337999344) }, { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, { FRAC_CONST(-0.938191413879395), FRAC_CONST(0.346116900444031) }, { FRAC_CONST(-0.942641556262970), FRAC_CONST(0.333806753158569) }, { FRAC_CONST(-0.946930170059204), FRAC_CONST(0.321439445018768) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.955020010471344), FRAC_CONST(0.296541452407837) }, { FRAC_CONST(-0.958819746971130), FRAC_CONST(0.284015297889709) }, { FRAC_CONST(-0.962455213069916), FRAC_CONST(0.271440476179123) }, { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, { FRAC_CONST(-0.969230949878693), FRAC_CONST(0.246153235435486) }, { FRAC_CONST(-0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(-0.975342333316803), FRAC_CONST(0.220697283744812) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.983254909515381), FRAC_CONST(0.182235360145569) }, { FRAC_CONST(-0.985556066036224), FRAC_CONST(0.169349402189255) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(-0.989651441574097), FRAC_CONST(0.143492430448532) }, { FRAC_CONST(-0.991444885730743), FRAC_CONST(0.130526080727577) }, { FRAC_CONST(-0.993068456649780), FRAC_CONST(0.117537356913090) }, { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, { FRAC_CONST(-0.995804965496063), FRAC_CONST(0.091501489281654) }, { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, { FRAC_CONST(-0.997858941555023), FRAC_CONST(0.065403148531914) }, { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, { FRAC_CONST(-0.999229013919830), FRAC_CONST(0.039259742945433) }, { FRAC_CONST(-0.999657332897186), FRAC_CONST(0.026176951825619) }, { FRAC_CONST(-0.999914348125458), FRAC_CONST(0.013089434243739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } }; #endif ALIGN static const complex_t cfft_tab_64[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const complex_t cfft_tab_60[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } }; #endif #ifdef LD_DEC ALIGN static const complex_t cfft_tab_256[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999698817729950), FRAC_CONST(0.024541229009628) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.992479562759399), FRAC_CONST(0.122410677373409) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.985277652740479), FRAC_CONST(0.170961901545525) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.963776051998138), FRAC_CONST(0.266712784767151) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.949528157711029), FRAC_CONST(0.313681751489639) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.914209723472595), FRAC_CONST(0.405241340398788) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.893224298954010), FRAC_CONST(0.449611335992813) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.844853579998016), FRAC_CONST(0.534997642040253) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.817584812641144), FRAC_CONST(0.575808227062225) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.788346409797668), FRAC_CONST(0.615231633186340) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.724247097969055), FRAC_CONST(0.689540565013886) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.653172791004181), FRAC_CONST(0.757208883762360) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.615231573581696), FRAC_CONST(0.788346409797668) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.575808167457581), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.534997642040253), FRAC_CONST(0.844853579998016) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.492898195981979), FRAC_CONST(0.870086967945099) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.405241280794144), FRAC_CONST(0.914209783077240) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.359894961118698), FRAC_CONST(0.932992815971375) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.313681662082672), FRAC_CONST(0.949528217315674) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.266712754964828), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.219101220369339), FRAC_CONST(0.975702106952667) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.122410625219345), FRAC_CONST(0.992479562759399) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.073564492166042), FRAC_CONST(0.997290432453156) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(0.024541135877371), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.997290432453156), FRAC_CONST(0.073564566671848) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.975702106952667), FRAC_CONST(0.219101235270500) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.932992815971375), FRAC_CONST(0.359895050525665) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.870086967945099), FRAC_CONST(0.492898225784302) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.788346469402313), FRAC_CONST(0.615231573581696) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.689540505409241), FRAC_CONST(0.724247097969055) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.575808227062225), FRAC_CONST(0.817584812641144) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.449611306190491), FRAC_CONST(0.893224298954010) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.313681751489639), FRAC_CONST(0.949528157711029) }, { FRAC_CONST(0.242980241775513), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.170961856842041), FRAC_CONST(0.985277652740479) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.024541255086660), FRAC_CONST(0.999698817729950) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.122410707175732), FRAC_CONST(0.992479503154755) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.266712725162506), FRAC_CONST(0.963776051998138) }, { FRAC_CONST(-0.336889803409576), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.405241340398788), FRAC_CONST(0.914209723472595) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.534997701644897), FRAC_CONST(0.844853520393372) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.653172850608826), FRAC_CONST(0.757208824157715) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.757208824157715), FRAC_CONST(0.653172850608826) }, { FRAC_CONST(-0.803207516670227), FRAC_CONST(0.595699369907379) }, { FRAC_CONST(-0.844853520393372), FRAC_CONST(0.534997701644897) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.914209783077240), FRAC_CONST(0.405241221189499) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.963776051998138), FRAC_CONST(0.266712725162506) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.992479503154755), FRAC_CONST(0.122410699725151) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067724496126) }, { FRAC_CONST(-0.999698817729950), FRAC_CONST(-0.024541147053242) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.985277652740479), FRAC_CONST(-0.170961990952492) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(-0.242980241775513) }, { FRAC_CONST(-0.949528157711029), FRAC_CONST(-0.313681781291962) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.893224298954010), FRAC_CONST(-0.449611306190491) }, { FRAC_CONST(-0.857728660106659), FRAC_CONST(-0.514102697372437) }, { FRAC_CONST(-0.817584872245789), FRAC_CONST(-0.575808107852936) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.724247038364410), FRAC_CONST(-0.689540624618530) }, { FRAC_CONST(-0.671558916568756), FRAC_CONST(-0.740951180458069) }, { FRAC_CONST(-0.615231573581696), FRAC_CONST(-0.788346469402313) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.492898195981979), FRAC_CONST(-0.870086967945099) }, { FRAC_CONST(-0.427554935216904), FRAC_CONST(-0.903989374637604) }, { FRAC_CONST(-0.359895110130310), FRAC_CONST(-0.932992756366730) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(-0.219101369380951), FRAC_CONST(-0.975702106952667) }, { FRAC_CONST(-0.146730408072472), FRAC_CONST(-0.989176511764526) }, { FRAC_CONST(-0.073564760386944), FRAC_CONST(-0.997290432453156) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const complex_t cfft_tab_240[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.999657332897186), FRAC_CONST(0.026176949962974) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.991444885730743), FRAC_CONST(0.130526199936867) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.983254909515381), FRAC_CONST(0.182235524058342) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.958819746971130), FRAC_CONST(0.284015357494354) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.942641496658325), FRAC_CONST(0.333806872367859) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.902585268020630), FRAC_CONST(0.430511116981506) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.878817081451416), FRAC_CONST(0.477158784866333) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.824126183986664), FRAC_CONST(0.566406250000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.793353319168091), FRAC_CONST(0.608761429786682) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.725374400615692), FRAC_CONST(0.688354551792145) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.688354551792145), FRAC_CONST(0.725374400615692) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.608761370182037), FRAC_CONST(0.793353378772736) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.566406250000000), FRAC_CONST(0.824126183986664) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.477158755064011), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.430511027574539), FRAC_CONST(0.902585327625275) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.333806812763214), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.284015327692032), FRAC_CONST(0.958819746971130) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.182235524058342), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.130526125431061), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(0.026176875457168), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.026176963001490), FRAC_CONST(0.999657332897186) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.130526214838028), FRAC_CONST(0.991444885730743) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.182235598564148), FRAC_CONST(0.983254909515381) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.233445391058922), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.284015417098999), FRAC_CONST(0.958819687366486) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.333806872367859), FRAC_CONST(0.942641496658325) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.430511116981506), FRAC_CONST(0.902585268020630) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.477158725261688), FRAC_CONST(0.878817141056061) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998629510402679), FRAC_CONST(0.052335958927870) }, { FRAC_CONST(0.994521915912628), FRAC_CONST(0.104528464376926) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.978147625923157), FRAC_CONST(0.207911700010300) }, { FRAC_CONST(0.965925812721252), FRAC_CONST(0.258819043636322) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.933580398559570), FRAC_CONST(0.358367949724197) }, { FRAC_CONST(0.913545429706573), FRAC_CONST(0.406736642122269) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.866025388240814), FRAC_CONST(0.500000000000000) }, { FRAC_CONST(0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.777145922183990), FRAC_CONST(0.629320383071899) }, { FRAC_CONST(0.743144810199738), FRAC_CONST(0.669130623340607) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.669130563735962), FRAC_CONST(0.743144869804382) }, { FRAC_CONST(0.629320383071899), FRAC_CONST(0.777145981788635) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.544638991355896), FRAC_CONST(0.838670611381531) }, { FRAC_CONST(0.499999970197678), FRAC_CONST(0.866025447845459) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.406736612319946), FRAC_CONST(0.913545489311218) }, { FRAC_CONST(0.358367860317230), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.258819073438644), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(0.207911655306816), FRAC_CONST(0.978147625923157) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.104528419673443), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(0.052335973829031), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.052336059510708), FRAC_CONST(0.998629510402679) }, { FRAC_CONST(-0.104528509080410), FRAC_CONST(0.994521915912628) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.207911744713783), FRAC_CONST(0.978147566318512) }, { FRAC_CONST(-0.258819162845612), FRAC_CONST(0.965925812721252) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.358367949724197), FRAC_CONST(0.933580458164215) }, { FRAC_CONST(-0.406736701726913), FRAC_CONST(0.913545429706573) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.500000059604645), FRAC_CONST(0.866025388240814) }, { FRAC_CONST(-0.544639050960541), FRAC_CONST(0.838670551776886) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.629320502281189), FRAC_CONST(0.777145862579346) }, { FRAC_CONST(-0.669130682945251), FRAC_CONST(0.743144810199738) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.743144929409027), FRAC_CONST(0.669130444526672) }, { FRAC_CONST(-0.777146041393280), FRAC_CONST(0.629320263862610) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.838670551776886), FRAC_CONST(0.544639050960541) }, { FRAC_CONST(-0.866025388240814), FRAC_CONST(0.500000059604645) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.913545489311218), FRAC_CONST(0.406736582517624) }, { FRAC_CONST(-0.933580458164215), FRAC_CONST(0.358367919921875) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.965925872325897), FRAC_CONST(0.258818924427032) }, { FRAC_CONST(-0.978147625923157), FRAC_CONST(0.207911610603333) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(-0.994521915912628), FRAC_CONST(0.104528494179249) }, { FRAC_CONST(-0.998629570007324), FRAC_CONST(0.052335809916258) }, { FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.000000087422777) }, { FRAC_CONST(-0.998629510402679), FRAC_CONST(-0.052335985004902) }, { FRAC_CONST(-0.994521856307983), FRAC_CONST(-0.104528672993183) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.978147566318512), FRAC_CONST(-0.207911789417267) }, { FRAC_CONST(-0.965925812721252), FRAC_CONST(-0.258819073438644) }, { FRAC_CONST(-0.951056540012360), FRAC_CONST(-0.309016972780228) }, { FRAC_CONST(-0.933580398559570), FRAC_CONST(-0.358368098735809) }, { FRAC_CONST(-0.913545429706573), FRAC_CONST(-0.406736731529236) }, { FRAC_CONST(-0.891006529331207), FRAC_CONST(-0.453990548849106) }, { FRAC_CONST(-0.866025269031525), FRAC_CONST(-0.500000178813934) }, { FRAC_CONST(-0.838670492172241), FRAC_CONST(-0.544639170169830) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.777145922183990), FRAC_CONST(-0.629320442676544) }, { FRAC_CONST(-0.743144810199738), FRAC_CONST(-0.669130623340607) }, { FRAC_CONST(-0.707106649875641), FRAC_CONST(-0.707106888294220) }, { FRAC_CONST(-0.669130504131317), FRAC_CONST(-0.743144869804382) }, { FRAC_CONST(-0.629320323467255), FRAC_CONST(-0.777145981788635) }, { FRAC_CONST(-0.587785065174103), FRAC_CONST(-0.809017121791840) }, { FRAC_CONST(-0.544639110565186), FRAC_CONST(-0.838670551776886) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.996917307376862), FRAC_CONST(0.078459098935127) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.852640151977539), FRAC_CONST(0.522498548030853) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.649448037147522), FRAC_CONST(0.760405957698822) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.522498488426209), FRAC_CONST(0.852640211582184) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.233445301651955), FRAC_CONST(0.972369909286499) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(0.078459084033966), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.987688362598419), FRAC_CONST(0.156434476375580) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.453990519046783), FRAC_CONST(0.891006529331207) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.156434446573257), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.453990608453751), FRAC_CONST(0.891006469726563) }, { FRAC_CONST(-0.587785184383392), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(-0.891006588935852), FRAC_CONST(0.453990370035172) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.987688362598419), FRAC_CONST(0.156434446573257) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.972369909286499), FRAC_CONST(0.233445376157761) }, { FRAC_CONST(0.891006529331207), FRAC_CONST(0.453990519046783) }, { FRAC_CONST(0.760405957698822), FRAC_CONST(0.649448096752167) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.156434372067451), FRAC_CONST(0.987688362598419) }, { FRAC_CONST(-0.078459173440933), FRAC_CONST(0.996917307376862) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.522498667240143), FRAC_CONST(0.852640092372894) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.852640211582184), FRAC_CONST(0.522498488426209) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.996917366981506), FRAC_CONST(0.078459039330482) }, { FRAC_CONST(-0.987688302993774), FRAC_CONST(-0.156434610486031) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(-0.649447917938232), FRAC_CONST(-0.760406076908112) }, { FRAC_CONST(-0.453990221023560), FRAC_CONST(-0.891006648540497) }, { FRAC_CONST(-0.233445450663567), FRAC_CONST(-0.972369909286499) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.951056540012360), FRAC_CONST(0.309017002582550) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.809017002582550), FRAC_CONST(0.587785243988037) }, { FRAC_CONST(0.309016972780228), FRAC_CONST(0.951056540012360) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.809017062187195), FRAC_CONST(0.587785184383392) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.587785243988037), FRAC_CONST(0.809017002582550) }, { FRAC_CONST(-0.309017032384872), FRAC_CONST(0.951056480407715) }, { FRAC_CONST(-0.951056599617004), FRAC_CONST(0.309016793966293) }, { FRAC_CONST(-0.809016942977905), FRAC_CONST(-0.587785363197327) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.309017121791840), FRAC_CONST(-0.951056480407715) } }; #endif #endif ALIGN static const complex_t cfft_tab_128[] = { { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.998795449733734), FRAC_CONST(0.049067676067352) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.989176511764526), FRAC_CONST(0.146730467677116) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.970031261444092), FRAC_CONST(0.242980197072029) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.941544055938721), FRAC_CONST(0.336889863014221) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.903989315032959), FRAC_CONST(0.427555084228516) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.803207516670227), FRAC_CONST(0.595699310302734) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.740951120853424), FRAC_CONST(0.671558976173401) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.671558916568756), FRAC_CONST(0.740951180458069) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.595699310302734), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.514102697372437), FRAC_CONST(0.857728660106659) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.427555114030838), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.336889833211899), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.242980122566223), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.146730497479439), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(0.049067649990320), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.049067739397287), FRAC_CONST(0.998795449733734) }, { FRAC_CONST(-0.098017223179340), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.146730571985245), FRAC_CONST(0.989176511764526) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.242980197072029), FRAC_CONST(0.970031261444092) }, { FRAC_CONST(-0.290284723043442), FRAC_CONST(0.956940293312073) }, { FRAC_CONST(-0.336889922618866), FRAC_CONST(0.941544055938721) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.427555084228516), FRAC_CONST(0.903989315032959) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.514102756977081), FRAC_CONST(0.857728600502014) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.595699369907379), FRAC_CONST(0.803207516670227) }, { FRAC_CONST(-0.634393274784088), FRAC_CONST(0.773010492324829) }, { FRAC_CONST(-0.671559035778046), FRAC_CONST(0.740951061248779) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.740951240062714), FRAC_CONST(0.671558856964111) }, { FRAC_CONST(-0.773010492324829), FRAC_CONST(0.634393274784088) }, { FRAC_CONST(-0.803207635879517), FRAC_CONST(0.595699131488800) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.857728600502014), FRAC_CONST(0.514102756977081) }, { FRAC_CONST(-0.881921350955963), FRAC_CONST(0.471396625041962) }, { FRAC_CONST(-0.903989315032959), FRAC_CONST(0.427555054426193) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.941544115543365), FRAC_CONST(0.336889803409576) }, { FRAC_CONST(-0.956940352916718), FRAC_CONST(0.290284723043442) }, { FRAC_CONST(-0.970031261444092), FRAC_CONST(0.242980077862740) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.989176511764526), FRAC_CONST(0.146730333566666) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(0.098017096519470) }, { FRAC_CONST(-0.998795449733734), FRAC_CONST(0.049067486077547) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.995184719562531), FRAC_CONST(0.098017141222954) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.881921231746674), FRAC_CONST(0.471396744251251) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.773010432720184), FRAC_CONST(0.634393334388733) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.471396654844284), FRAC_CONST(0.881921291351318) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.290284633636475), FRAC_CONST(0.956940352916718) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.980785250663757), FRAC_CONST(0.195090323686600) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.555570185184479), FRAC_CONST(0.831469655036926) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.195090234279633), FRAC_CONST(0.980785310268402) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.382683515548706), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.555570363998413), FRAC_CONST(0.831469535827637) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.831469655036926), FRAC_CONST(0.555570185184479) }, { FRAC_CONST(-0.923879623413086), FRAC_CONST(0.382683277130127) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.956940352916718), FRAC_CONST(0.290284663438797) }, { FRAC_CONST(0.831469595432281), FRAC_CONST(0.555570244789124) }, { FRAC_CONST(0.634393274784088), FRAC_CONST(0.773010432720184) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(0.098017133772373), FRAC_CONST(0.995184719562531) }, { FRAC_CONST(-0.195090323686600), FRAC_CONST(0.980785250663757) }, { FRAC_CONST(-0.471396833658218), FRAC_CONST(0.881921231746674) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.881921231746674), FRAC_CONST(0.471396833658218) }, { FRAC_CONST(-0.980785310268402), FRAC_CONST(0.195090308785439) }, { FRAC_CONST(-0.995184719562531), FRAC_CONST(-0.098017267882824) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(-0.773010551929474), FRAC_CONST(-0.634393215179443) }, { FRAC_CONST(-0.555570006370544), FRAC_CONST(-0.831469774246216) }, { FRAC_CONST(-0.290284544229507), FRAC_CONST(-0.956940352916718) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.923879504203796), FRAC_CONST(0.382683455944061) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.000000043711388), FRAC_CONST(1.000000000000000) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.382683426141739), FRAC_CONST(0.923879504203796) }, { FRAC_CONST(-0.707106769084930), FRAC_CONST(0.707106769084930) }, { FRAC_CONST(-0.923879504203796), FRAC_CONST(-0.382683426141739) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(1.000000000000000), FRAC_CONST(0.000000000000000) }, { FRAC_CONST(0.000000011924881), FRAC_CONST(-1.000000000000000) } }; #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/codebook/000077500000000000000000000000001476153623600157365ustar00rootroot00000000000000faad2-2.11.2/libfaad/codebook/hcb.h000066400000000000000000000067311476153623600166520ustar00rootroot00000000000000/* ** 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 /* Maximal accessed codebook index. */ #define LAST_CB_IDX 11 /* 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; #include "codebook/hcb_1.h" #include "codebook/hcb_2.h" #include "codebook/hcb_3.h" #include "codebook/hcb_4.h" #include "codebook/hcb_5.h" #include "codebook/hcb_6.h" #include "codebook/hcb_7.h" #include "codebook/hcb_8.h" #include "codebook/hcb_9.h" #include "codebook/hcb_10.h" #include "codebook/hcb_11.h" #include "codebook/hcb_sf.h" #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/codebook/hcb_1.h000066400000000000000000000140161476153623600170650ustar00rootroot00000000000000/* ** 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 const hcb hcb1_1[32] = { /* 1 bit codeword */ { /* 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 }, /* 5 bit codewords */ { /* 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 } /* Size of second level table is 49 + 64 = 113 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static const hcb_2_quad hcb1_2[113] = { /* 1 bit codeword */ { 1, 0, 0, 0, 0 }, /* 5 bit codewords */ { 5, 1, 0, 0, 0 }, { 5, -1, 0, 0, 0 }, { 5, 0, 0, 0, -1 }, { 5, 0, 1, 0, 0 }, { 5, 0, 0, 0, 1 }, { 5, 0, 0, -1, 0 }, { 5, 0, 0, 1, 0 }, { 5, 0, -1, 0, 0 }, /* 7 bit codewords */ /* first 5 bits: 11000 */ { 7, 1, -1, 0, 0 }, { 7, -1, 1, 0, 0 }, { 7, 0, 0, -1, 1 }, { 7, 0, 1, -1, 0 }, /* first 5 bits: 11001 */ { 7, 0, -1, 1, 0 }, { 7, 0, 0, 1, -1 }, { 7, 1, 1, 0, 0 }, { 7, 0, 0, -1, -1 }, /* first 5 bits: 11010 */ { 7, -1, -1, 0, 0 }, { 7, 0, -1, -1, 0 }, { 7, 1, 0, -1, 0 }, { 7, 0, 1, 0, -1 }, /* first 5 bits: 11011 */ { 7, -1, 0, 1, 0 }, { 7, 0, 0, 1, 1 }, { 7, 1, 0, 1, 0 }, { 7, 0, -1, 0, 1 }, /* first 5 bits: 11100 */ { 7, 0, 1, 1, 0 }, { 7, 0, 1, 0, 1 }, { 7, -1, 0, -1, 0 }, { 7, 1, 0, 0, 1 }, /* first 5 bits: 11101 */ { 7, -1, 0, 0, -1 }, { 7, 1, 0, 0, -1 }, { 7, -1, 0, 0, 1 }, { 7, 0, -1, 0, -1 }, /* 9 bit codeword */ /* first 5 bits: 11110 */ { 9, 1, 1, -1, 0 }, { 9, -1, 1, -1, 0 }, { 9, 1, -1, 1, 0 }, { 9, 0, 1, 1, -1 }, { 9, 0, 1, -1, 1 }, { 9, 0, -1, 1, 1 }, { 9, 0, -1, 1, -1 }, { 9, 1, -1, -1, 0 }, { 9, 1, 0, -1, 1 }, { 9, 0, 1, -1, -1 }, { 9, -1, 1, 1, 0 }, { 9, -1, 0, 1, -1 }, { 9, -1, -1, 1, 0 }, { 9, 0, -1, -1, 1 }, { 9, 1, -1, 0, 1 }, { 9, 1, -1, 0, -1 }, /* 9/10/11 bit codewords */ /* first 5 bits: 11111 */ /* 9 bit: reading 11 bits -> 2 too much so 4 entries for each codeword */ { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, 1, 0, -1 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, -1, -1, -1, 0 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, -1, -1, -1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 0, 1, 1, 1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 0, 1, -1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, 1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, -1, 1, 0, 1 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, { 9, 1, 1, 1, 0 }, /* 10 bit: reading 11 bits -> 1 too much so 2 entries for each codeword */ { 10, -1, -1, 0, 1 }, { 10, -1, -1, 0, 1 }, { 10, -1, 0, -1, -1 }, { 10, -1, 0, -1, -1 }, { 10, 1, 1, 0, -1 }, { 10, 1, 1, 0, -1 }, { 10, 1, 0, -1, -1 }, { 10, 1, 0, -1, -1 }, { 10, -1, 0, -1, 1 }, { 10, -1, 0, -1, 1 }, { 10, -1, -1, 0, -1 }, { 10, -1, -1, 0, -1 }, { 10, -1, 0, 1, 1 }, { 10, -1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, { 10, 1, 0, 1, 1 }, /* 11 bit */ { 11, 1, -1, 1, -1 }, { 11, -1, 1, -1, 1 }, { 11, -1, 1, 1, -1 }, { 11, 1, -1, -1, 1 }, { 11, 1, 1, 1, 1 }, { 11, -1, -1, 1, 1 }, { 11, 1, 1, -1, -1 }, { 11, -1, -1, 1, -1 }, { 11, -1, -1, -1, -1 }, { 11, 1, 1, -1, 1 }, { 11, 1, -1, 1, 1 }, { 11, -1, 1, 1, 1 }, { 11, -1, 1, -1, -1 }, { 11, -1, -1, -1, 1 }, { 11, 1, -1, -1, -1 }, { 11, 1, 1, 1, -1 } }; faad2-2.11.2/libfaad/codebook/hcb_10.h000066400000000000000000000174431476153623600171540ustar00rootroot00000000000000/* ** 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 const hcb hcb10_1[64] = { /* 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 } /* Size of second level table is 145 + 64 = 209 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static const hcb_2_pair hcb10_2[209] = { /* 4 bit codewords */ { 4, 1, 1 }, { 4, 1, 2 }, { 4, 2, 1 }, /* 5 bit codewords */ { 5, 2, 2 }, { 5, 1, 0 }, { 5, 0, 1 }, { 5, 1, 3 }, { 5, 3, 2 }, { 5, 3, 1 }, { 5, 2, 3 }, { 5, 3, 3 }, /* 6 bit codewords */ { 6, 2, 0 }, { 6, 0, 2 }, { 6, 2, 4 }, { 6, 4, 2 }, { 6, 1, 4 }, { 6, 4, 1 }, { 6, 0, 0 }, { 6, 4, 3 }, { 6, 3, 4 }, { 6, 3, 0 }, { 6, 0, 3 }, { 6, 4, 4 }, { 6, 2, 5 }, { 6, 5, 2 }, /* 7 bit codewords */ { 7, 1, 5 }, { 7, 5, 1 }, { 7, 5, 3 }, { 7, 3, 5 }, { 7, 5, 4 }, { 7, 4, 5 }, { 7, 6, 2 }, { 7, 2, 6 }, { 7, 6, 3 }, { 7, 4, 0 }, { 7, 6, 1 }, { 7, 0, 4 }, { 7, 1, 6 }, { 7, 3, 6 }, { 7, 5, 5 }, { 7, 6, 4 }, /* 7/8 bit codewords */ { 7, 4, 6 }, { 7, 4, 6 }, { 8, 6, 5 }, { 8, 7, 2 }, /* 8 bit codewords */ { 8, 3, 7 }, { 8, 2, 7 }, { 8, 5, 6 }, { 8, 8, 2 }, { 8, 7, 3 }, { 8, 5, 0 }, { 8, 7, 1 }, { 8, 0, 5 }, { 8, 8, 1 }, { 8, 1, 7 }, { 8, 8, 3 }, { 8, 7, 4 }, { 8, 4, 7 }, { 8, 2, 8 }, { 8, 6, 6 }, { 8, 7, 5 }, { 8, 1, 8 }, { 8, 3, 8 }, { 8, 8, 4 }, { 8, 4, 8 }, /* 8/9 bit codewords */ { 8, 5, 7 }, { 8, 5, 7 }, { 8, 8, 5 }, { 8, 8, 5 }, { 8, 5, 8 }, { 8, 5, 8 }, { 9, 7, 6 }, { 9, 6, 7 }, /* 9 bit codewords */ { 9, 9, 2 }, { 9, 6, 0 }, { 9, 6, 8 }, { 9, 9, 3 }, { 9, 3, 9 }, { 9, 9, 1 }, { 9, 2, 9 }, { 9, 0, 6 }, { 9, 8, 6 }, { 9, 9, 4 }, { 9, 4, 9 }, { 9, 10, 2 }, { 9, 1, 9 }, { 9, 7, 7 }, { 9, 8, 7 }, { 9, 9, 5 }, { 9, 7, 8 }, { 9, 10, 3 }, { 9, 5, 9 }, { 9, 10, 4 }, { 9, 2, 10 }, { 9, 10, 1 }, { 9, 3, 10 }, { 9, 9, 6 }, /* 9/10 bit codewords */ { 9, 6, 9 }, { 9, 6, 9 }, { 9, 8, 0 }, { 9, 8, 0 }, { 9, 4, 10 }, { 9, 4, 10 }, { 9, 7, 0 }, { 9, 7, 0 }, { 9, 11, 2 }, { 9, 11, 2 }, { 10, 7, 9 }, { 10, 11, 3 }, { 10, 10, 6 }, { 10, 1, 10 }, { 10, 11, 1 }, { 10, 9, 7 }, /* 10 bit codewords */ { 10, 0, 7 }, { 10, 8, 8 }, { 10, 10, 5 }, { 10, 3, 11 }, { 10, 5, 10 }, { 10, 8, 9 }, { 10, 11, 5 }, { 10, 0, 8 }, { 10, 11, 4 }, { 10, 2, 11 }, { 10, 7, 10 }, { 10, 6, 10 }, { 10, 10, 7 }, { 10, 4, 11 }, { 10, 1, 11 }, { 10, 12, 2 }, { 10, 9, 8 }, { 10, 12, 3 }, { 10, 11, 6 }, { 10, 5, 11 }, { 10, 12, 4 }, { 10, 11, 7 }, { 10, 12, 5 }, { 10, 3, 12 }, { 10, 6, 11 }, { 10, 9, 0 }, { 10, 10, 8 }, { 10, 10, 0 }, { 10, 12, 1 }, { 10, 0, 9 }, { 10, 4, 12 }, { 10, 9, 9 }, /* 10/11/12 bit codewords */ { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 12, 6 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 2, 12 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 10, 8, 10 }, { 11, 9, 10 }, { 11, 9, 10 }, { 11, 1, 12 }, { 11, 1, 12 }, { 11, 11, 8 }, { 11, 11, 8 }, { 11, 12, 7 }, { 11, 12, 7 }, { 11, 7, 11 }, { 11, 7, 11 }, { 11, 5, 12 }, { 11, 5, 12 }, { 11, 6, 12 }, { 11, 6, 12 }, { 11, 10, 9 }, { 11, 10, 9 }, { 11, 8, 11 }, { 11, 8, 11 }, { 11, 12, 8 }, { 11, 12, 8 }, { 11, 0, 10 }, { 11, 0, 10 }, { 11, 7, 12 }, { 11, 7, 12 }, { 11, 11, 0 }, { 11, 11, 0 }, { 11, 10, 10 }, { 11, 10, 10 }, { 11, 11, 9 }, { 11, 11, 9 }, { 11, 11, 10 }, { 11, 11, 10 }, { 11, 0, 11 }, { 11, 0, 11 }, { 11, 11, 11 }, { 11, 11, 11 }, { 11, 9, 11 }, { 11, 9, 11 }, { 11, 10, 11 }, { 11, 10, 11 }, { 11, 12, 0 }, { 11, 12, 0 }, { 11, 8, 12 }, { 11, 8, 12 }, { 12, 12, 9 }, { 12, 10, 12 }, { 12, 9, 12 }, { 12, 11, 12 }, { 12, 12, 11 }, { 12, 0, 12 }, { 12, 12, 10 }, { 12, 12, 12 } }; faad2-2.11.2/libfaad/codebook/hcb_11.h000066400000000000000000000232771476153623600171570ustar00rootroot00000000000000/* ** 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 const hcb hcb11_1[32] = { /* 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 } /* Size of second level table is 246 + 128 = 374 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static hcb_2_pair hcb11_2[374] = { /* 4 */ { 4, 0, 0 }, { 4, 1, 1 }, /* 5 */ { 5, 16, 16 }, { 5, 1, 0 }, { 5, 0, 1 }, { 5, 2, 1 }, { 5, 1, 2 }, { 5, 2, 2 }, /* 6 */ { 6, 1, 3 }, { 6, 3, 1 }, { 6, 3, 2 }, { 6, 2, 0 }, { 6, 2, 3 }, { 6, 0, 2 }, /* 6/7 */ { 6, 3, 3 }, { 6, 3, 3 }, { 7, 4, 1 }, { 7, 1, 4 }, /* 7 */ { 7, 4, 2 }, { 7, 2, 4 }, { 7, 4, 3 }, { 7, 3, 4 }, { 7, 3, 0 }, { 7, 0, 3 }, { 7, 5, 1 }, { 7, 5, 2 }, { 7, 2, 5 }, { 7, 4, 4 }, { 7, 1, 5 }, { 7, 5, 3 }, /* 7/8 */ { 7, 3, 5 }, { 7, 3, 5 }, { 7, 5, 4 }, { 7, 5, 4 }, { 8, 4, 5 }, { 8, 6, 2 }, { 8, 2, 6 }, { 8, 6, 1 }, /* 8 */ { 8, 6, 3 }, { 8, 3, 6 }, { 8, 1, 6 }, { 8, 4, 16 }, { 8, 3, 16 }, { 8, 16, 5 }, { 8, 16, 3 }, { 8, 16, 4 }, { 8, 6, 4 }, { 8, 16, 6 }, { 8, 4, 0 }, { 8, 4, 6 }, { 8, 0, 4 }, { 8, 2, 16 }, { 8, 5, 5 }, { 8, 5, 16 }, { 8, 16, 7 }, { 8, 16, 2 }, { 8, 16, 8 }, { 8, 2, 7 }, { 8, 7, 2 }, { 8, 3, 7 }, { 8, 6, 5 }, { 8, 5, 6 }, { 8, 6, 16 }, { 8, 16, 10 }, { 8, 7, 3 }, { 8, 7, 1 }, { 8, 16, 9 }, { 8, 7, 16 }, { 8, 1, 16 }, { 8, 1, 7 }, { 8, 4, 7 }, { 8, 16, 11 }, { 8, 7, 4 }, { 8, 16, 12 }, { 8, 8, 16 }, { 8, 16, 1 }, { 8, 6, 6 }, { 8, 9, 16 }, { 8, 2, 8 }, { 8, 5, 7 }, { 8, 10, 16 }, { 8, 16, 13 }, { 8, 8, 3 }, { 8, 8, 2 }, { 8, 3, 8 }, { 8, 5, 0 }, /* 8/9 */ { 8, 16, 14 }, { 8, 16, 14 }, { 8, 11, 16 }, { 8, 11, 16 }, { 8, 7, 5 }, { 8, 7, 5 }, { 8, 4, 8 }, { 8, 4, 8 }, { 8, 6, 7 }, { 8, 6, 7 }, { 8, 7, 6 }, { 8, 7, 6 }, { 8, 0, 5 }, { 8, 0, 5 }, { 9, 8, 4 }, { 9, 16, 15 }, /* 9 */ { 9, 12, 16 }, { 9, 1, 8 }, { 9, 8, 1 }, { 9, 14, 16 }, { 9, 5, 8 }, { 9, 13, 16 }, { 9, 3, 9 }, { 9, 8, 5 }, { 9, 7, 7 }, { 9, 2, 9 }, { 9, 8, 6 }, { 9, 9, 2 }, { 9, 9, 3 }, { 9, 15, 16 }, { 9, 4, 9 }, { 9, 6, 8 }, { 9, 6, 0 }, { 9, 9, 4 }, { 9, 5, 9 }, { 9, 8, 7 }, { 9, 7, 8 }, { 9, 1, 9 }, { 9, 10, 3 }, { 9, 0, 6 }, { 9, 10, 2 }, { 9, 9, 1 }, { 9, 9, 5 }, { 9, 4, 10 }, { 9, 2, 10 }, { 9, 9, 6 }, { 9, 3, 10 }, { 9, 6, 9 }, { 9, 10, 4 }, { 9, 8, 8 }, { 9, 10, 5 }, { 9, 9, 7 }, { 9, 11, 3 }, { 9, 1, 10 }, { 9, 7, 0 }, { 9, 10, 6 }, { 9, 7, 9 }, { 9, 3, 11 }, { 9, 5, 10 }, { 9, 10, 1 }, { 9, 4, 11 }, { 9, 11, 2 }, { 9, 13, 2 }, { 9, 6, 10 }, /* 9/10 */ { 9, 13, 3 }, { 9, 13, 3 }, { 9, 2, 11 }, { 9, 2, 11 }, { 9, 16, 0 }, { 9, 16, 0 }, { 9, 5, 11 }, { 9, 5, 11 }, { 9, 11, 5 }, { 9, 11, 5 }, { 10, 11, 4 }, { 10, 9, 8 }, { 10, 7, 10 }, { 10, 8, 9 }, { 10, 0, 16 }, { 10, 4, 13 }, { 10, 0, 7 }, { 10, 3, 13 }, { 10, 11, 6 }, { 10, 13, 1 }, { 10, 13, 4 }, { 10, 12, 3 }, { 10, 2, 13 }, { 10, 13, 5 }, { 10, 8, 10 }, { 10, 6, 11 }, { 10, 10, 8 }, { 10, 10, 7 }, { 10, 14, 2 }, { 10, 12, 4 }, { 10, 1, 11 }, { 10, 4, 12 }, /* 10 */ { 10, 11, 1 }, { 10, 3, 12 }, { 10, 1, 13 }, { 10, 12, 2 }, { 10, 7, 11 }, { 10, 3, 14 }, { 10, 5, 12 }, { 10, 5, 13 }, { 10, 14, 4 }, { 10, 4, 14 }, { 10, 11, 7 }, { 10, 14, 3 }, { 10, 12, 5 }, { 10, 13, 6 }, { 10, 12, 6 }, { 10, 8, 0 }, { 10, 11, 8 }, { 10, 2, 12 }, { 10, 9, 9 }, { 10, 14, 5 }, { 10, 6, 13 }, { 10, 10, 10 }, { 10, 15, 2 }, { 10, 8, 11 }, { 10, 9, 10 }, { 10, 14, 6 }, { 10, 10, 9 }, { 10, 5, 14 }, { 10, 11, 9 }, { 10, 14, 1 }, { 10, 2, 14 }, { 10, 6, 12 }, { 10, 1, 12 }, { 10, 13, 8 }, { 10, 0, 8 }, { 10, 13, 7 }, { 10, 7, 12 }, { 10, 12, 7 }, { 10, 7, 13 }, { 10, 15, 3 }, { 10, 12, 1 }, { 10, 6, 14 }, { 10, 2, 15 }, { 10, 15, 5 }, { 10, 15, 4 }, { 10, 1, 14 }, { 10, 9, 11 }, { 10, 4, 15 }, { 10, 14, 7 }, { 10, 8, 13 }, { 10, 13, 9 }, { 10, 8, 12 }, { 10, 5, 15 }, { 10, 3, 15 }, { 10, 10, 11 }, { 10, 11, 10 }, { 10, 12, 8 }, { 10, 15, 6 }, { 10, 15, 7 }, { 10, 8, 14 }, { 10, 15, 1 }, { 10, 7, 14 }, { 10, 9, 0 }, { 10, 0, 9 }, /* 10/11/12 */ { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 13 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 9, 12 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 12, 9 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 14, 8 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 10, 13 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 14, 9 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 12, 10 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 6, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 10, 7, 15 }, { 11, 9, 14 }, { 11, 9, 14 }, { 11, 15, 8 }, { 11, 15, 8 }, { 11, 11, 11 }, { 11, 11, 11 }, { 11, 11, 14 }, { 11, 11, 14 }, { 11, 1, 15 }, { 11, 1, 15 }, { 11, 10, 12 }, { 11, 10, 12 }, { 11, 10, 14 }, { 11, 10, 14 }, { 11, 13, 11 }, { 11, 13, 11 }, { 11, 13, 10 }, { 11, 13, 10 }, { 11, 11, 13 }, { 11, 11, 13 }, { 11, 11, 12 }, { 11, 11, 12 }, { 11, 8, 15 }, { 11, 8, 15 }, { 11, 14, 11 }, { 11, 14, 11 }, { 11, 13, 12 }, { 11, 13, 12 }, { 11, 12, 13 }, { 11, 12, 13 }, { 11, 15, 9 }, { 11, 15, 9 }, { 11, 14, 10 }, { 11, 14, 10 }, { 11, 10, 0 }, { 11, 10, 0 }, { 11, 12, 11 }, { 11, 12, 11 }, { 11, 9, 15 }, { 11, 9, 15 }, { 11, 0, 10 }, { 11, 0, 10 }, { 11, 12, 12 }, { 11, 12, 12 }, { 11, 11, 0 }, { 11, 11, 0 }, { 11, 12, 14 }, { 11, 12, 14 }, { 11, 10, 15 }, { 11, 10, 15 }, { 11, 13, 13 }, { 11, 13, 13 }, { 11, 0, 13 }, { 11, 0, 13 }, { 11, 14, 12 }, { 11, 14, 12 }, { 11, 15, 10 }, { 11, 15, 10 }, { 11, 15, 11 }, { 11, 15, 11 }, { 11, 11, 15 }, { 11, 11, 15 }, { 11, 14, 13 }, { 11, 14, 13 }, { 11, 13, 0 }, { 11, 13, 0 }, { 11, 0, 11 }, { 11, 0, 11 }, { 11, 13, 14 }, { 11, 13, 14 }, { 11, 15, 12 }, { 11, 15, 12 }, { 11, 15, 13 }, { 11, 15, 13 }, { 11, 12, 15 }, { 11, 12, 15 }, { 11, 14, 0 }, { 11, 14, 0 }, { 11, 14, 14 }, { 11, 14, 14 }, { 11, 13, 15 }, { 11, 13, 15 }, { 11, 12, 0 }, { 11, 12, 0 }, { 11, 14, 15 }, { 11, 14, 15 }, { 12, 0, 14 }, { 12, 0, 12 }, { 12, 15, 14 }, { 12, 15, 0 }, { 12, 0, 15 }, { 12, 15, 15 } }; faad2-2.11.2/libfaad/codebook/hcb_2.h000066400000000000000000000121621476153623600170660ustar00rootroot00000000000000/* ** 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 const hcb hcb2_1[32] = { /* 3 bit codeword */ { /* 00000 */ 0, 0 }, { /* */ 0, 0 }, { /* */ 0, 0 }, { /* 00011 */ 0, 0 }, /* 4 bit codeword */ { /* 00100 */ 1, 0 }, { /* 00101 */ 1, 0 }, /* 5 bit codewords */ { /* 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 } /* Size of second level table is 69 + 16 = 85 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static const hcb_2_quad hcb2_2[85] = { /* 3 bit codeword */ { 3, 0, 0, 0, 0 }, /* 4 bit codeword */ { 4, 1, 0, 0, 0 }, /* 5 bit codewords */ { 5, -1, 0, 0, 0 }, { 5, 0, 0, 0, 1 }, { 5, 0, 0, -1, 0 }, { 5, 0, 0, 0, -1 }, { 5, 0, -1, 0, 0 }, { 5, 0, 0, 1, 0 }, { 5, 0, 1, 0, 0 }, /* 6 bit codewords */ { 6, 0, -1, 1, 0 }, { 6, -1, 1, 0, 0 }, { 6, 0, 1, -1, 0 }, { 6, 0, 0, 1, -1 }, { 6, 0, 1, 0, -1 }, { 6, 0, 0, -1, 1 }, { 6, -1, 0, 0, -1 }, { 6, 1, -1, 0, 0 }, { 6, 1, 0, -1, 0 }, { 6, -1, -1, 0, 0 }, { 6, 0, 0, -1, -1 }, { 6, 1, 0, 1, 0 }, { 6, 1, 0, 0, 1 }, { 6, 0, -1, 0, 1 }, { 6, -1, 0, 1, 0 }, { 6, 0, 1, 0, 1 }, { 6, 0, -1, -1, 0 }, { 6, -1, 0, 0, 1 }, { 6, 0, -1, 0, -1 }, { 6, -1, 0, -1, 0 }, { 6, 1, 1, 0, 0 }, { 6, 0, 1, 1, 0 }, { 6, 0, 0, 1, 1 }, { 6, 1, 0, 0, -1 }, /* 7 bit codewords */ { 7, 0, 1, -1, 1 }, { 7, 1, 0, -1, 1 }, { 7, -1, 1, -1, 0 }, { 7, 0, -1, 1, -1 }, { 7, 1, -1, 1, 0 }, { 7, 1, 1, 0, -1 }, { 7, 1, 0, 1, 1 }, { 7, -1, 1, 1, 0 }, { 7, 0, -1, -1, 1 }, { 7, 1, 1, 1, 0 }, { 7, -1, 0, 1, -1 }, { 7, -1, -1, -1, 0 }, /* 7/8 bit codewords */ { 7, -1, 0, -1, 1 }, { 7, -1, 0, -1, 1 }, { 7, 1, -1, -1, 0 }, { 7, 1, -1, -1, 0 }, { 7, 1, 1, -1, 0 }, { 7, 1, 1, -1, 0 }, { 8, 1, -1, 0, 1 }, { 8, -1, 1, 0, -1 }, /* 8 bit codewords */ { 8, -1, -1, 1, 0 }, { 8, -1, 0, 1, 1 }, { 8, -1, -1, 0, 1 }, { 8, -1, -1, 0, -1 }, { 8, 0, -1, -1, -1 }, { 8, 1, 0, 1, -1 }, { 8, 1, 0, -1, -1 }, { 8, 0, 1, -1, -1 }, { 8, 0, 1, 1, 1 }, { 8, -1, 1, 0, 1 }, { 8, -1, 0, -1, -1 }, { 8, 0, 1, 1, -1 }, { 8, 1, -1, 0, -1 }, { 8, 0, -1, 1, 1 }, { 8, 1, 1, 0, 1 }, { 8, 1, -1, 1, -1 }, /* 8/9 bit codewords */ { 8, -1, 1, -1, 1 }, { 8, -1, 1, -1, 1 }, { 9, 1, -1, -1, 1 }, { 9, -1, -1, -1, -1 }, { 9, -1, 1, 1, -1 }, { 9, -1, 1, 1, 1 }, { 9, 1, 1, 1, 1 }, { 9, -1, -1, 1, -1 }, { 9, 1, -1, 1, 1 }, { 9, -1, 1, -1, -1 }, { 9, -1, -1, 1, 1 }, { 9, 1, 1, -1, -1 }, { 9, 1, -1, -1, -1 }, { 9, -1, -1, -1, 1 }, { 9, 1, 1, -1, 1 }, { 9, 1, 1, 1, -1 } }; faad2-2.11.2/libfaad/codebook/hcb_3.h000066400000000000000000000212031476153623600170630ustar00rootroot00000000000000/* ** 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 const hcb_bin_quad hcb3[161] = { { /* 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 */ { /* 100 */ 1, { 1, 0, 1, 2 } }, /* 1111110001 */ { /* 101 */ 1, { 0, 0, 2, 2 } }, /* 1111110010 */ { /* 102 */ 1, { 0, 1, 2, 2 } }, /* 1111110011 */ { /* 103 */ 1, { 2, 2, 1, 0 } }, /* 1111110100 */ { /* 104 */ 1, { 1, 2, 2, 0 } }, /* 1111110101 */ { /* 105 */ 1, { 1, 0, 0, 2 } }, /* 1111110110 */ { /* 106 */ 1, { 2, 0, 0, 1 } }, /* 1111110111 */ { /* 107 */ 1, { 0, 2, 2, 1 } }, /* 1111111000 */ { /* 108 */ 0, { 7, 8, 0, 0 } }, { /* 109 */ 0, { 8, 9, 0, 0 } }, { /* 110 */ 0, { 9, 10, 0, 0 } }, { /* 111 */ 0, { 10, 11, 0, 0 } }, { /* 112 */ 0, { 11, 12, 0, 0 } }, { /* 113 */ 0, { 12, 13, 0, 0 } }, { /* 114 */ 0, { 13, 14, 0, 0 } }, { /* 115 */ 1, { 2, 2, 0, 0 } }, /* 11111110010 */ { /* 116 */ 1, { 1, 2, 2, 1 } }, /* 11111110011 */ { /* 117 */ 1, { 1, 1, 0, 2 } }, /* 11111110100 */ { /* 118 */ 1, { 2, 0, 1, 1 } }, /* 11111110101 */ { /* 119 */ 1, { 1, 1, 2, 2 } }, /* 11111110110 */ { /* 120 */ 1, { 2, 2, 1, 1 } }, /* 11111110111 */ { /* 121 */ 1, { 0, 2, 2, 0 } }, /* 11111111000 */ { /* 122 */ 1, { 0, 2, 1, 2 } }, /* 11111111001 */ { /* 123 */ 0, { 6, 7, 0, 0 } }, { /* 124 */ 0, { 7, 8, 0, 0 } }, { /* 125 */ 0, { 8, 9, 0, 0 } }, { /* 126 */ 0, { 9, 10, 0, 0 } }, { /* 127 */ 0, { 10, 11, 0, 0 } }, { /* 128 */ 0, { 11, 12, 0, 0 } }, { /* 129 */ 1, { 1, 0, 2, 2 } }, /* 111111110100 */ { /* 130 */ 1, { 2, 2, 0, 1 } }, /* 111111110101 */ { /* 131 */ 1, { 2, 1, 2, 0 } }, /* 111111110110 */ { /* 132 */ 1, { 2, 2, 2, 0 } }, /* 111111110111 */ { /* 133 */ 1, { 0, 2, 2, 2 } }, /* 111111111000 */ { /* 134 */ 1, { 2, 2, 2, 1 } }, /* 111111111001 */ { /* 135 */ 1, { 2, 1, 2, 1 } }, /* 111111111010 */ { /* 136 */ 1, { 1, 2, 1, 2 } }, /* 111111111011 */ { /* 137 */ 1, { 1, 2, 2, 2 } }, /* 111111111100 */ { /* 138 */ 0, { 3, 4, 0, 0 } }, { /* 139 */ 0, { 4, 5, 0, 0 } }, { /* 140 */ 0, { 5, 6, 0, 0 } }, { /* 141 */ 1, { 0, 2, 0, 2 } }, /* 1111111111010 */ { /* 142 */ 1, { 2, 0, 2, 0 } }, /* 1111111111011 */ { /* 143 */ 1, { 1, 2, 0, 2 } }, /* 1111111111100 */ { /* 144 */ 0, { 3, 4, 0, 0 } }, { /* 145 */ 0, { 4, 5, 0, 0 } }, { /* 146 */ 0, { 5, 6, 0, 0 } }, { /* 147 */ 1, { 2, 0, 2, 1 } }, /* 11111111111010 */ { /* 148 */ 1, { 2, 1, 1, 2 } }, /* 11111111111011 */ { /* 149 */ 1, { 2, 1, 0, 2 } }, /* 11111111111100 */ { /* 150 */ 0, { 3, 4, 0, 0 } }, { /* 151 */ 0, { 4, 5, 0, 0 } }, { /* 152 */ 0, { 5, 6, 0, 0 } }, { /* 153 */ 1, { 2, 2, 2, 2 } }, /* 111111111111010 */ { /* 154 */ 1, { 2, 2, 1, 2 } }, /* 111111111111011 */ { /* 155 */ 1, { 2, 1, 2, 2 } }, /* 111111111111100 */ { /* 156 */ 1, { 2, 0, 1, 2 } }, /* 111111111111101 */ { /* 157 */ 1, { 2, 0, 0, 2 } }, /* 111111111111110 */ { /* 158 */ 0, { 1, 2, 0, 0 } }, { /* 159 */ 1, { 2, 2, 0, 2 } }, /* 1111111111111110 */ { /* 160 */ 1, { 2, 0, 2, 2 } } /* 1111111111111111 */ }; faad2-2.11.2/libfaad/codebook/hcb_4.h000066400000000000000000000172431476153623600170750ustar00rootroot00000000000000/* ** 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 const hcb hcb4_1[32] = { /* 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 } /* Size of second level table is 56 + 128 = 184 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static const hcb_2_quad hcb4_2[184] = { /* 4 bit codewords */ { 4, 1, 1, 1, 1 }, { 4, 0, 1, 1, 1 }, { 4, 1, 1, 0, 1 }, { 4, 1, 1, 1, 0 }, { 4, 1, 0, 1, 1 }, { 4, 1, 0, 0, 0 }, { 4, 1, 1, 0, 0 }, { 4, 0, 0, 0, 0 }, { 4, 0, 0, 1, 1 }, { 4, 1, 0, 1, 0 }, /* 5 bit codewords */ { 5, 1, 0, 0, 1 }, { 5, 0, 1, 1, 0 }, { 5, 0, 0, 0, 1 }, { 5, 0, 1, 0, 1 }, { 5, 0, 0, 1, 0 }, { 5, 0, 1, 0, 0 }, /* 7 bit codewords */ /* first 5 bits: 11010 */ { 7, 2, 1, 1, 1 }, { 7, 1, 1, 2, 1 }, { 7, 1, 2, 1, 1 }, { 7, 1, 1, 1, 2 }, /* first 5 bits: 11011 */ { 7, 2, 1, 1, 0 }, { 7, 2, 1, 0, 1 }, { 7, 1, 2, 1, 0 }, { 7, 2, 0, 1, 1 }, /* 7/8 bit codewords */ /* first 5 bits: 11100 */ { 7, 0, 1, 2, 1 }, { 7, 0, 1, 2, 1 }, { 8, 0, 1, 1, 2 }, { 8, 1, 1, 2, 0 }, { 8, 0, 2, 1, 1 }, { 8, 1, 0, 1, 2 }, { 8, 1, 2, 0, 1 }, { 8, 1, 1, 0, 2 }, /* 8 bit codewords */ { 8, 1, 0, 2, 1 }, { 8, 2, 1, 0, 0 }, { 8, 2, 0, 1, 0 }, { 8, 1, 2, 0, 0 }, { 8, 2, 0, 0, 1 }, { 8, 0, 1, 0, 2 }, { 8, 0, 2, 1, 0 }, { 8, 0, 0, 1, 2 }, /* 8/9 bit codewords */ { 8, 0, 1, 2, 0 }, { 8, 0, 1, 2, 0 }, { 8, 0, 2, 0, 1 }, { 8, 0, 2, 0, 1 }, { 8, 1, 0, 0, 2 }, { 8, 1, 0, 0, 2 }, { 8, 0, 0, 2, 1 }, { 8, 0, 0, 2, 1 }, { 8, 1, 0, 2, 0 }, { 8, 1, 0, 2, 0 }, { 8, 2, 0, 0, 0 }, { 8, 2, 0, 0, 0 }, { 8, 0, 0, 0, 2 }, { 8, 0, 0, 0, 2 }, { 9, 0, 2, 0, 0 }, { 9, 0, 0, 2, 0 }, /* 9/10/11 bit codewords */ /* 9 bit codewords repeated 2^3 = 8 times */ { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 1, 2, 2, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 2, 1, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 2, 1, 2, 1 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 1, 2, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 1, 2, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, { 9, 2, 1, 1, 2 }, /* 10 bit codewords repeated 2^2 = 4 times */ { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 1, 2, 2, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 2, 1, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 2, 1, 2, 0 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 2, 2, 1 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 0, 1, 2, 2 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 2, 2, 0, 1 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 0, 2, 1, 2 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 2, 0, 2, 1 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 1, 0, 2, 2 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 2, 2, 2, 1 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 1, 2, 0, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 0, 1, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 2, 1, 0, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, { 10, 1, 2, 2, 2 }, /* 11 bit codewords repeated 2^1 = 2 times */ { 11, 2, 1, 2, 2 }, { 11, 2, 1, 2, 2 }, { 11, 2, 2, 1, 2 }, { 11, 2, 2, 1, 2 }, { 11, 0, 2, 2, 0 }, { 11, 0, 2, 2, 0 }, { 11, 2, 2, 0, 0 }, { 11, 2, 2, 0, 0 }, { 11, 0, 0, 2, 2 }, { 11, 0, 0, 2, 2 }, { 11, 2, 0, 2, 0 }, { 11, 2, 0, 2, 0 }, { 11, 0, 2, 0, 2 }, { 11, 0, 2, 0, 2 }, { 11, 2, 0, 0, 2 }, { 11, 2, 0, 0, 2 }, { 11, 2, 2, 2, 2 }, { 11, 2, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, { 11, 0, 2, 2, 2 }, { 11, 2, 2, 2, 0 }, { 11, 2, 2, 2, 0 }, /* 12 bit codewords */ { 12, 2, 2, 0, 2 }, { 12, 2, 0, 2, 2 }, }; faad2-2.11.2/libfaad/codebook/hcb_5.h000066400000000000000000000151161476153623600170730ustar00rootroot00000000000000/* ** 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 const hcb_bin_pair hcb5[161] = { { /* 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 } }, { /* 100 */ 1, { 2, -3 } }, { /* 101 */ 1, { 3, 2 } }, { /* 102 */ 1, { 2, 3 } }, { /* 103 */ 1, { -3, 2 } }, { /* 104 */ 1, { -2, -3 } }, { /* 105 */ 1, { 0, -4 } }, { /* 106 */ 1, { -4, 0 } }, { /* 107 */ 1, { 4, 1 } }, { /* 108 */ 1, { 4, 0 } }, { /* 109 */ 0, { 12, 13 } }, { /* 110 */ 0, { 13, 14 } }, { /* 111 */ 0, { 14, 15 } }, { /* 112 */ 0, { 15, 16 } }, { /* 113 */ 0, { 16, 17 } }, { /* 114 */ 0, { 17, 18 } }, { /* 115 */ 0, { 18, 19 } }, { /* 116 */ 0, { 19, 20 } }, { /* 117 */ 0, { 20, 21 } }, { /* 118 */ 0, { 21, 22 } }, { /* 119 */ 0, { 22, 23 } }, { /* 120 */ 0, { 23, 24 } }, { /* 121 */ 1, { -4, -1 } }, { /* 122 */ 1, { 0, 4 } }, { /* 123 */ 1, { 4, -1 } }, { /* 124 */ 1, { -1, -4 } }, { /* 125 */ 1, { 1, 4 } }, { /* 126 */ 1, { -1, 4 } }, { /* 127 */ 1, { -4, 1 } }, { /* 128 */ 1, { 1, -4 } }, { /* 129 */ 1, { 3, -3 } }, { /* 130 */ 1, { -3, -3 } }, { /* 131 */ 1, { -3, 3 } }, { /* 132 */ 1, { -2, 4 } }, { /* 133 */ 1, { -4, -2 } }, { /* 134 */ 1, { 4, 2 } }, { /* 135 */ 1, { 2, -4 } }, { /* 136 */ 1, { 2, 4 } }, { /* 137 */ 1, { 3, 3 } }, { /* 138 */ 1, { -4, 2 } }, { /* 139 */ 0, { 6, 7 } }, { /* 140 */ 0, { 7, 8 } }, { /* 141 */ 0, { 8, 9 } }, { /* 142 */ 0, { 9, 10 } }, { /* 143 */ 0, { 10, 11 } }, { /* 144 */ 0, { 11, 12 } }, { /* 145 */ 1, { -2, -4 } }, { /* 146 */ 1, { 4, -2 } }, { /* 147 */ 1, { 3, -4 } }, { /* 148 */ 1, { -4, -3 } }, { /* 149 */ 1, { -4, 3 } }, { /* 150 */ 1, { 3, 4 } }, { /* 151 */ 1, { -3, 4 } }, { /* 152 */ 1, { 4, 3 } }, { /* 153 */ 1, { 4, -3 } }, { /* 154 */ 1, { -3, -4 } }, { /* 155 */ 0, { 2, 3 } }, { /* 156 */ 0, { 3, 4 } }, { /* 157 */ 1, { 4, -4 } }, { /* 158 */ 1, { -4, 4 } }, { /* 159 */ 1, { 4, 4 } }, { /* 160 */ 1, { -4, -4 } } }; faad2-2.11.2/libfaad/codebook/hcb_6.h000066400000000000000000000117241476153623600170750ustar00rootroot00000000000000/* ** 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 const hcb hcb6_1[32] = { /* 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 } /* Size of second level table is 61 + 64 = 125 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static const hcb_2_pair hcb6_2[125] = { /* 4 bit codewords */ { 4, 0, 0 }, { 4, 1, 0 }, { 4, 0, -1 }, { 4, 0, 1 }, { 4, -1, 0 }, { 4, 1, 1 }, { 4, -1, 1 }, { 4, 1, -1 }, { 4, -1, -1 }, /* 6 bit codewords */ { 6, 2, -1 }, { 6, 2, 1 }, { 6, -2, 1 }, { 6, -2, -1 }, { 6, -2, 0 }, { 6, -1, 2 }, { 6, 2, 0 }, { 6, 1, -2 }, { 6, 1, 2 }, { 6, 0, -2 }, { 6, -1, -2 }, { 6, 0, 2 }, { 6, 2, -2 }, { 6, -2, 2 }, { 6, -2, -2 }, { 6, 2, 2 }, /* 7 bit codewords */ { 7, -3, 1 }, { 7, 3, 1 }, { 7, 3, -1 }, { 7, -1, 3 }, { 7, -3, -1 }, { 7, 1, 3 }, { 7, 1, -3 }, { 7, -1, -3 }, { 7, 3, 0 }, { 7, -3, 0 }, { 7, 0, -3 }, { 7, 0, 3 }, /* 7/8 bit codewords */ { 7, 3, 2 }, { 7, 3, 2 }, { 8, -3, -2 }, { 8, -2, 3 }, { 8, 2, 3 }, { 8, 3, -2 }, { 8, 2, -3 }, { 8, -2, -3 }, /* 8 bit codewords */ { 8, -3, 2 }, { 8, -3, 2 }, { 8, 3, 3 }, { 8, 3, 3 }, { 9, 3, -3 }, { 9, -3, -3 }, { 9, -3, 3 }, { 9, 1, -4 }, { 9, -1, -4 }, { 9, 4, 1 }, { 9, -4, 1 }, { 9, -4, -1 }, { 9, 1, 4 }, { 9, 4, -1 }, { 9, -1, 4 }, { 9, 0, -4 }, /* 9/10/11 bit codewords */ { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, 2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, -4, -2 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, 2, 4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -2, -4 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, -4, 0 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, 2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, 4, -2 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, -2, 4 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 4, 0 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 2, -4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 9, 0, 4 }, { 10, -3, -4 }, { 10, -3, -4 }, { 10, -3, 4 }, { 10, -3, 4 }, { 10, 3, -4 }, { 10, 3, -4 }, { 10, 4, -3 }, { 10, 4, -3 }, { 10, 3, 4 }, { 10, 3, 4 }, { 10, 4, 3 }, { 10, 4, 3 }, { 10, -4, 3 }, { 10, -4, 3 }, { 10, -4, -3 }, { 10, -4, -3 }, { 11, 4, 4 }, { 11, -4, 4 }, { 11, -4, -4 }, { 11, 4, -4 } }; faad2-2.11.2/libfaad/codebook/hcb_7.h000066400000000000000000000125261476153623600170770ustar00rootroot00000000000000/* ** 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 const hcb_bin_pair hcb7[127] = { { /* 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 } }, { /* 100 */ 1, { 5, 4 } }, { /* 101 */ 1, { 6, 3 } }, { /* 102 */ 1, { 2, 7 } }, { /* 103 */ 1, { 7, 3 } }, { /* 104 */ 1, { 6, 4 } }, { /* 105 */ 1, { 5, 5 } }, { /* 106 */ 1, { 4, 6 } }, { /* 107 */ 1, { 3, 7 } }, { /* 108 */ 0, { 5, 6 } }, { /* 109 */ 0, { 6, 7 } }, { /* 110 */ 0, { 7, 8 } }, { /* 111 */ 0, { 8, 9 } }, { /* 112 */ 0, { 9, 10 } }, { /* 113 */ 1, { 7, 0 } }, { /* 114 */ 1, { 0, 7 } }, { /* 115 */ 1, { 6, 5 } }, { /* 116 */ 1, { 5, 6 } }, { /* 117 */ 1, { 7, 4 } }, { /* 118 */ 1, { 4, 7 } }, { /* 119 */ 1, { 5, 7 } }, { /* 120 */ 1, { 7, 5 } }, { /* 121 */ 0, { 2, 3 } }, { /* 122 */ 0, { 3, 4 } }, { /* 123 */ 1, { 7, 6 } }, { /* 124 */ 1, { 6, 6 } }, { /* 125 */ 1, { 6, 7 } }, { /* 126 */ 1, { 7, 7 } } }; faad2-2.11.2/libfaad/codebook/hcb_8.h000066400000000000000000000105571476153623600171020ustar00rootroot00000000000000/* ** 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 const hcb hcb8_1[32] = { /* 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 } /* Size of second level table is 51 + 32 = 83 */ }; /* 2nd step table * * Gives size of codeword and actual data (x,y,v,w) */ static const hcb_2_pair hcb8_2[83] = { /* 3 bit codeword */ { 3, 1, 1 }, /* 4 bit codewords */ { 4, 2, 1 }, { 4, 1, 0 }, { 4, 1, 2 }, { 4, 0, 1 }, { 4, 2, 2 }, /* 5 bit codewords */ { 5, 0, 0 }, { 5, 2, 0 }, { 5, 0, 2 }, { 5, 3, 1 }, { 5, 1, 3 }, { 5, 3, 2 }, { 5, 2, 3 }, /* 6 bit codewords */ { 6, 3, 3 }, { 6, 4, 1 }, { 6, 1, 4 }, { 6, 4, 2 }, { 6, 2, 4 }, { 6, 3, 0 }, { 6, 0, 3 }, { 6, 4, 3 }, { 6, 3, 4 }, { 6, 5, 2 }, /* 7 bit codewords */ { 7, 5, 1 }, { 7, 2, 5 }, { 7, 1, 5 }, { 7, 5, 3 }, { 7, 3, 5 }, { 7, 4, 4 }, { 7, 5, 4 }, { 7, 0, 4 }, { 7, 4, 5 }, { 7, 4, 0 }, { 7, 2, 6 }, { 7, 6, 2 }, /* 7/8 bit codewords */ { 7, 6, 1 }, { 7, 6, 1 }, { 7, 1, 6 }, { 7, 1, 6 }, { 8, 3, 6 }, { 8, 6, 3 }, { 8, 5, 5 }, { 8, 5, 0 }, /* 8 bit codewords */ { 8, 6, 4 }, { 8, 0, 5 }, { 8, 4, 6 }, { 8, 7, 1 }, { 8, 7, 2 }, { 8, 2, 7 }, { 8, 6, 5 }, { 8, 7, 3 }, /* 8/9/10 bit codewords */ { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 1, 7 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 5, 6 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 8, 3, 7 }, { 9, 6, 6 }, { 9, 6, 6 }, { 9, 7, 4 }, { 9, 7, 4 }, { 9, 6, 0 }, { 9, 6, 0 }, { 9, 4, 7 }, { 9, 4, 7 }, { 9, 0, 6 }, { 9, 0, 6 }, { 9, 7, 5 }, { 9, 7, 5 }, { 9, 7, 6 }, { 9, 7, 6 }, { 9, 6, 7 }, { 9, 6, 7 }, { 10, 5, 7 }, { 10, 7, 0 }, { 10, 0, 7 }, { 10, 7, 7 } }; faad2-2.11.2/libfaad/codebook/hcb_9.h000066400000000000000000000301771476153623600171030ustar00rootroot00000000000000/* ** 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 const hcb_bin_pair hcb9[337] = { { /* 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 } }, { /* 100 */ 0, { 41, 42 } }, { /* 101 */ 0, { 42, 43 } }, { /* 102 */ 0, { 43, 44 } }, { /* 103 */ 0, { 44, 45 } }, { /* 104 */ 0, { 45, 46 } }, { /* 105 */ 0, { 46, 47 } }, { /* 106 */ 0, { 47, 48 } }, { /* 107 */ 0, { 48, 49 } }, { /* 108 */ 0, { 49, 50 } }, { /* 109 */ 1, { 0, 5 } }, { /* 110 */ 1, { 2, 6 } }, { /* 111 */ 1, { 5, 0 } }, { /* 112 */ 1, { 1, 7 } }, { /* 113 */ 1, { 3, 5 } }, { /* 114 */ 1, { 1, 8 } }, { /* 115 */ 1, { 8, 1 } }, { /* 116 */ 1, { 4, 4 } }, { /* 117 */ 1, { 5, 3 } }, { /* 118 */ 1, { 6, 2 } }, { /* 119 */ 1, { 7, 1 } }, { /* 120 */ 1, { 0, 6 } }, { /* 121 */ 1, { 8, 2 } }, { /* 122 */ 1, { 2, 8 } }, { /* 123 */ 1, { 3, 6 } }, { /* 124 */ 1, { 2, 7 } }, { /* 125 */ 1, { 4, 5 } }, { /* 126 */ 1, { 9, 1 } }, { /* 127 */ 1, { 1, 9 } }, { /* 128 */ 1, { 7, 2 } }, { /* 129 */ 0, { 30, 31 } }, { /* 130 */ 0, { 31, 32 } }, { /* 131 */ 0, { 32, 33 } }, { /* 132 */ 0, { 33, 34 } }, { /* 133 */ 0, { 34, 35 } }, { /* 134 */ 0, { 35, 36 } }, { /* 135 */ 0, { 36, 37 } }, { /* 136 */ 0, { 37, 38 } }, { /* 137 */ 0, { 38, 39 } }, { /* 138 */ 0, { 39, 40 } }, { /* 139 */ 0, { 40, 41 } }, { /* 140 */ 0, { 41, 42 } }, { /* 141 */ 0, { 42, 43 } }, { /* 142 */ 0, { 43, 44 } }, { /* 143 */ 0, { 44, 45 } }, { /* 144 */ 0, { 45, 46 } }, { /* 145 */ 0, { 46, 47 } }, { /* 146 */ 0, { 47, 48 } }, { /* 147 */ 0, { 48, 49 } }, { /* 148 */ 0, { 49, 50 } }, { /* 149 */ 0, { 50, 51 } }, { /* 150 */ 0, { 51, 52 } }, { /* 151 */ 0, { 52, 53 } }, { /* 152 */ 0, { 53, 54 } }, { /* 153 */ 0, { 54, 55 } }, { /* 154 */ 0, { 55, 56 } }, { /* 155 */ 0, { 56, 57 } }, { /* 156 */ 0, { 57, 58 } }, { /* 157 */ 0, { 58, 59 } }, { /* 158 */ 0, { 59, 60 } }, { /* 159 */ 1, { 6, 0 } }, { /* 160 */ 1, { 5, 4 } }, { /* 161 */ 1, { 6, 3 } }, { /* 162 */ 1, { 8, 3 } }, { /* 163 */ 1, { 0, 7 } }, { /* 164 */ 1, { 9, 2 } }, { /* 165 */ 1, { 3, 8 } }, { /* 166 */ 1, { 4, 6 } }, { /* 167 */ 1, { 3, 7 } }, { /* 168 */ 1, { 0, 8 } }, { /* 169 */ 1, { 10, 1 } }, { /* 170 */ 1, { 6, 4 } }, { /* 171 */ 1, { 2, 9 } }, { /* 172 */ 1, { 5, 5 } }, { /* 173 */ 1, { 8, 0 } }, { /* 174 */ 1, { 7, 0 } }, { /* 175 */ 1, { 7, 3 } }, { /* 176 */ 1, { 10, 2 } }, { /* 177 */ 1, { 9, 3 } }, { /* 178 */ 1, { 8, 4 } }, { /* 179 */ 1, { 1, 10 } }, { /* 180 */ 1, { 7, 4 } }, { /* 181 */ 1, { 6, 5 } }, { /* 182 */ 1, { 5, 6 } }, { /* 183 */ 1, { 4, 8 } }, { /* 184 */ 1, { 4, 7 } }, { /* 185 */ 1, { 3, 9 } }, { /* 186 */ 1, { 11, 1 } }, { /* 187 */ 1, { 5, 8 } }, { /* 188 */ 1, { 9, 0 } }, { /* 189 */ 1, { 8, 5 } }, { /* 190 */ 0, { 29, 30 } }, { /* 191 */ 0, { 30, 31 } }, { /* 192 */ 0, { 31, 32 } }, { /* 193 */ 0, { 32, 33 } }, { /* 194 */ 0, { 33, 34 } }, { /* 195 */ 0, { 34, 35 } }, { /* 196 */ 0, { 35, 36 } }, { /* 197 */ 0, { 36, 37 } }, { /* 198 */ 0, { 37, 38 } }, { /* 199 */ 0, { 38, 39 } }, { /* 200 */ 0, { 39, 40 } }, { /* 201 */ 0, { 40, 41 } }, { /* 202 */ 0, { 41, 42 } }, { /* 203 */ 0, { 42, 43 } }, { /* 204 */ 0, { 43, 44 } }, { /* 205 */ 0, { 44, 45 } }, { /* 206 */ 0, { 45, 46 } }, { /* 207 */ 0, { 46, 47 } }, { /* 208 */ 0, { 47, 48 } }, { /* 209 */ 0, { 48, 49 } }, { /* 210 */ 0, { 49, 50 } }, { /* 211 */ 0, { 50, 51 } }, { /* 212 */ 0, { 51, 52 } }, { /* 213 */ 0, { 52, 53 } }, { /* 214 */ 0, { 53, 54 } }, { /* 215 */ 0, { 54, 55 } }, { /* 216 */ 0, { 55, 56 } }, { /* 217 */ 0, { 56, 57 } }, { /* 218 */ 0, { 57, 58 } }, { /* 219 */ 1, { 10, 3 } }, { /* 220 */ 1, { 2, 10 } }, { /* 221 */ 1, { 0, 9 } }, { /* 222 */ 1, { 11, 2 } }, { /* 223 */ 1, { 9, 4 } }, { /* 224 */ 1, { 6, 6 } }, { /* 225 */ 1, { 12, 1 } }, { /* 226 */ 1, { 4, 9 } }, { /* 227 */ 1, { 8, 6 } }, { /* 228 */ 1, { 1, 11 } }, { /* 229 */ 1, { 9, 5 } }, { /* 230 */ 1, { 10, 4 } }, { /* 231 */ 1, { 5, 7 } }, { /* 232 */ 1, { 7, 5 } }, { /* 233 */ 1, { 2, 11 } }, { /* 234 */ 1, { 1, 12 } }, { /* 235 */ 1, { 12, 2 } }, { /* 236 */ 1, { 11, 3 } }, { /* 237 */ 1, { 3, 10 } }, { /* 238 */ 1, { 5, 9 } }, { /* 239 */ 1, { 6, 7 } }, { /* 240 */ 1, { 8, 7 } }, { /* 241 */ 1, { 11, 4 } }, { /* 242 */ 1, { 0, 10 } }, { /* 243 */ 1, { 7, 6 } }, { /* 244 */ 1, { 12, 3 } }, { /* 245 */ 1, { 10, 0 } }, { /* 246 */ 1, { 10, 5 } }, { /* 247 */ 1, { 4, 10 } }, { /* 248 */ 1, { 6, 8 } }, { /* 249 */ 1, { 2, 12 } }, { /* 250 */ 1, { 9, 6 } }, { /* 251 */ 1, { 9, 7 } }, { /* 252 */ 1, { 4, 11 } }, { /* 253 */ 1, { 11, 0 } }, { /* 254 */ 1, { 6, 9 } }, { /* 255 */ 1, { 3, 11 } }, { /* 256 */ 1, { 5, 10 } }, { /* 257 */ 0, { 20, 21 } }, { /* 258 */ 0, { 21, 22 } }, { /* 259 */ 0, { 22, 23 } }, { /* 260 */ 0, { 23, 24 } }, { /* 261 */ 0, { 24, 25 } }, { /* 262 */ 0, { 25, 26 } }, { /* 263 */ 0, { 26, 27 } }, { /* 264 */ 0, { 27, 28 } }, { /* 265 */ 0, { 28, 29 } }, { /* 266 */ 0, { 29, 30 } }, { /* 267 */ 0, { 30, 31 } }, { /* 268 */ 0, { 31, 32 } }, { /* 269 */ 0, { 32, 33 } }, { /* 270 */ 0, { 33, 34 } }, { /* 271 */ 0, { 34, 35 } }, { /* 272 */ 0, { 35, 36 } }, { /* 273 */ 0, { 36, 37 } }, { /* 274 */ 0, { 37, 38 } }, { /* 275 */ 0, { 38, 39 } }, { /* 276 */ 0, { 39, 40 } }, { /* 277 */ 1, { 8, 8 } }, { /* 278 */ 1, { 7, 8 } }, { /* 279 */ 1, { 12, 5 } }, { /* 280 */ 1, { 3, 12 } }, { /* 281 */ 1, { 11, 5 } }, { /* 282 */ 1, { 7, 7 } }, { /* 283 */ 1, { 12, 4 } }, { /* 284 */ 1, { 11, 6 } }, { /* 285 */ 1, { 10, 6 } }, { /* 286 */ 1, { 4, 12 } }, { /* 287 */ 1, { 7, 9 } }, { /* 288 */ 1, { 5, 11 } }, { /* 289 */ 1, { 0, 11 } }, { /* 290 */ 1, { 12, 6 } }, { /* 291 */ 1, { 6, 10 } }, { /* 292 */ 1, { 12, 0 } }, { /* 293 */ 1, { 10, 7 } }, { /* 294 */ 1, { 5, 12 } }, { /* 295 */ 1, { 7, 10 } }, { /* 296 */ 1, { 9, 8 } }, { /* 297 */ 1, { 0, 12 } }, { /* 298 */ 1, { 11, 7 } }, { /* 299 */ 1, { 8, 9 } }, { /* 300 */ 1, { 9, 9 } }, { /* 301 */ 1, { 10, 8 } }, { /* 302 */ 1, { 7, 11 } }, { /* 303 */ 1, { 12, 7 } }, { /* 304 */ 1, { 6, 11 } }, { /* 305 */ 1, { 8, 11 } }, { /* 306 */ 1, { 11, 8 } }, { /* 307 */ 1, { 7, 12 } }, { /* 308 */ 1, { 6, 12 } }, { /* 309 */ 0, { 8, 9 } }, { /* 310 */ 0, { 9, 10 } }, { /* 311 */ 0, { 10, 11 } }, { /* 312 */ 0, { 11, 12 } }, { /* 313 */ 0, { 12, 13 } }, { /* 314 */ 0, { 13, 14 } }, { /* 315 */ 0, { 14, 15 } }, { /* 316 */ 0, { 15, 16 } }, { /* 317 */ 1, { 8, 10 } }, { /* 318 */ 1, { 10, 9 } }, { /* 319 */ 1, { 8, 12 } }, { /* 320 */ 1, { 9, 10 } }, { /* 321 */ 1, { 9, 11 } }, { /* 322 */ 1, { 9, 12 } }, { /* 323 */ 1, { 10, 11 } }, { /* 324 */ 1, { 12, 9 } }, { /* 325 */ 1, { 10, 10 } }, { /* 326 */ 1, { 11, 9 } }, { /* 327 */ 1, { 12, 8 } }, { /* 328 */ 1, { 11, 10 } }, { /* 329 */ 1, { 12, 10 } }, { /* 330 */ 1, { 12, 11 } }, { /* 331 */ 0, { 2, 3 } }, { /* 332 */ 0, { 3, 4 } }, { /* 333 */ 1, { 10, 12 } }, { /* 334 */ 1, { 11, 11 } }, { /* 335 */ 1, { 11, 12 } }, { /* 336 */ 1, { 12, 12 } } }; faad2-2.11.2/libfaad/codebook/hcb_sf.h000066400000000000000000000170361476153623600173420ustar00rootroot00000000000000/* ** 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[241][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 }, { /* 100 */ 9, 10 }, { /* 101 */ 10, 11 }, { /* 102 */ 11, 12 }, { /* 103 */ 12, 13 }, { /* 104 */ 13, 14 }, { /* 105 */ 37, 0 }, { /* 106 */ 35, 0 }, { /* 107 */ 85, 0 }, { /* 108 */ 33, 0 }, { /* 109 */ 36, 0 }, { /* 110 */ 34, 0 }, { /* 111 */ 84, 0 }, { /* 112 */ 32, 0 }, { /* 113 */ 6, 7 }, { /* 114 */ 7, 8 }, { /* 115 */ 8, 9 }, { /* 116 */ 9, 10 }, { /* 117 */ 10, 11 }, { /* 118 */ 11, 12 }, { /* 119 */ 87, 0 }, { /* 120 */ 89, 0 }, { /* 121 */ 30, 0 }, { /* 122 */ 31, 0 }, { /* 123 */ 8, 9 }, { /* 124 */ 9, 10 }, { /* 125 */ 10, 11 }, { /* 126 */ 11, 12 }, { /* 127 */ 12, 13 }, { /* 128 */ 13, 14 }, { /* 129 */ 14, 15 }, { /* 130 */ 15, 16 }, { /* 131 */ 86, 0 }, { /* 132 */ 29, 0 }, { /* 133 */ 26, 0 }, { /* 134 */ 27, 0 }, { /* 135 */ 28, 0 }, { /* 136 */ 24, 0 }, { /* 137 */ 88, 0 }, { /* 138 */ 9, 10 }, { /* 139 */ 10, 11 }, { /* 140 */ 11, 12 }, { /* 141 */ 12, 13 }, { /* 142 */ 13, 14 }, { /* 143 */ 14, 15 }, { /* 144 */ 15, 16 }, { /* 145 */ 16, 17 }, { /* 146 */ 17, 18 }, { /* 147 */ 25, 0 }, { /* 148 */ 22, 0 }, { /* 149 */ 23, 0 }, { /* 150 */ 15, 16 }, { /* 151 */ 16, 17 }, { /* 152 */ 17, 18 }, { /* 153 */ 18, 19 }, { /* 154 */ 19, 20 }, { /* 155 */ 20, 21 }, { /* 156 */ 21, 22 }, { /* 157 */ 22, 23 }, { /* 158 */ 23, 24 }, { /* 159 */ 24, 25 }, { /* 160 */ 25, 26 }, { /* 161 */ 26, 27 }, { /* 162 */ 27, 28 }, { /* 163 */ 28, 29 }, { /* 164 */ 29, 30 }, { /* 165 */ 90, 0 }, { /* 166 */ 21, 0 }, { /* 167 */ 19, 0 }, { /* 168 */ 3, 0 }, { /* 169 */ 1, 0 }, { /* 170 */ 2, 0 }, { /* 171 */ 0, 0 }, { /* 172 */ 23, 24 }, { /* 173 */ 24, 25 }, { /* 174 */ 25, 26 }, { /* 175 */ 26, 27 }, { /* 176 */ 27, 28 }, { /* 177 */ 28, 29 }, { /* 178 */ 29, 30 }, { /* 179 */ 30, 31 }, { /* 180 */ 31, 32 }, { /* 181 */ 32, 33 }, { /* 182 */ 33, 34 }, { /* 183 */ 34, 35 }, { /* 184 */ 35, 36 }, { /* 185 */ 36, 37 }, { /* 186 */ 37, 38 }, { /* 187 */ 38, 39 }, { /* 188 */ 39, 40 }, { /* 189 */ 40, 41 }, { /* 190 */ 41, 42 }, { /* 191 */ 42, 43 }, { /* 192 */ 43, 44 }, { /* 193 */ 44, 45 }, { /* 194 */ 45, 46 }, { /* 195 */ 98, 0 }, { /* 196 */ 99, 0 }, { /* 197 */ 100, 0 }, { /* 198 */ 101, 0 }, { /* 199 */ 102, 0 }, { /* 200 */ 117, 0 }, { /* 201 */ 97, 0 }, { /* 202 */ 91, 0 }, { /* 203 */ 92, 0 }, { /* 204 */ 93, 0 }, { /* 205 */ 94, 0 }, { /* 206 */ 95, 0 }, { /* 207 */ 96, 0 }, { /* 208 */ 104, 0 }, { /* 209 */ 111, 0 }, { /* 210 */ 112, 0 }, { /* 211 */ 113, 0 }, { /* 212 */ 114, 0 }, { /* 213 */ 115, 0 }, { /* 214 */ 116, 0 }, { /* 215 */ 110, 0 }, { /* 216 */ 105, 0 }, { /* 217 */ 106, 0 }, { /* 218 */ 107, 0 }, { /* 219 */ 108, 0 }, { /* 220 */ 109, 0 }, { /* 221 */ 118, 0 }, { /* 222 */ 6, 0 }, { /* 223 */ 8, 0 }, { /* 224 */ 9, 0 }, { /* 225 */ 10, 0 }, { /* 226 */ 5, 0 }, { /* 227 */ 103, 0 }, { /* 228 */ 120, 0 }, { /* 229 */ 119, 0 }, { /* 230 */ 4, 0 }, { /* 231 */ 7, 0 }, { /* 232 */ 15, 0 }, { /* 233 */ 16, 0 }, { /* 234 */ 18, 0 }, { /* 235 */ 20, 0 }, { /* 236 */ 17, 0 }, { /* 237 */ 11, 0 }, { /* 238 */ 12, 0 }, { /* 239 */ 14, 0 }, { /* 240 */ 13, 0 } }; faad2-2.11.2/libfaad/common.c000066400000000000000000000376641476153623600156250ustar00rootroot00000000000000/* ** 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; 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 }; /* * 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 ); } #ifdef FIXED_POINT 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 ones64(uint64_t x) { return ones32((uint32_t)x) + ones32(x >> 32); } static uint32_t floor_log2(uint64_t x) { #if 1 x |= (x >> 1); x |= (x >> 2); x |= (x >> 4); x |= (x >> 8); x |= (x >> 16); x |= (x >> 32); return (ones64(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 } #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); #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION if (whole >= 17) __builtin_trap(); #endif /* rest = [0..1] */ int32_t rest = val & ((1 << REAL_BITS) - 1); /* 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; } uint64_t pow2_int(real_t val) { uint32_t x1, x2; uint32_t errcorr; uint32_t index_frac; uint64_t retval; int32_t whole = (val >> REAL_BITS); int32_t exp = 0; /* rest = [0..1] */ int32_t rest = val & ((1 << REAL_BITS) - 1); /* index into pow2_tab */ int32_t index = rest >> (REAL_BITS-TABLE_BITS); if (val < 0) return 0; if (val == 0) return 1; if (whole > COEF_BITS) { exp = whole - COEF_BITS; whole = COEF_BITS; } /* leave INTERP_BITS bits */ index_frac = rest >> (REAL_BITS-TABLE_BITS-INTERP_BITS); index_frac = index_frac & ((1<= 0) retval = (uint32_t)(1 << whole); else retval = 0; x1 = pow2_tab[index & ((1<> INTERP_BITS; retval = MUL_R(retval, (errcorr + x1)); return retval << exp; } /* ld(x) = ld(x*y/y) = ld(x/y) + ld(y), with y=2^N and [1 <= (x/y) < 2] */ int32_t log2_int(uint64_t val) { uint32_t frac; int32_t exp = 0; uint32_t index; uint32_t index_frac; uint32_t x1, x2; uint32_t errcorr; #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION if (val == 0) __builtin_trap(); #endif exp = floor_log2(val); exp -= REAL_BITS; /* frac = [1..2] */ if (exp >= 0) frac = (uint32_t)(val >> exp); else frac = (uint32_t)(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; } #endif faad2-2.11.2/libfaad/common.h000066400000000000000000000220361476153623600156150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: common.h,v 1.79 2015/01/26 17:48:53 knik Exp $ **/ #ifndef __COMMON_H__ #define __COMMON_H__ #ifdef __cplusplus extern "C" { #endif #ifdef HAVE_CONFIG_H # include "../config.h" #endif #include "neaacdec.h" #if 1 #define INLINE __inline #else #define INLINE inline #endif #if 0 //defined(_WIN32) && !defined(_WIN32_WCE) #define ALIGN __declspec(align(16)) #else #define ALIGN #endif #ifndef max #define max(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a, b) (((a) < (b)) ? (a) : (b)) #endif /* COMPILE TIME DEFINITIONS */ /* use double precision */ /* #define USE_DOUBLE_PRECISION */ /* use fixed point reals */ //#define FIXED_POINT //#define BIG_IQ_TABLE /* Use if target platform has address generators with autoincrement */ //#define PREFER_POINTERS #ifdef _WIN32_WCE #define FIXED_POINT #endif #ifdef __BFIN__ #define FIXED_POINT #endif #define ERROR_RESILIENCE /* Allow decoding of MAIN profile AAC */ #define MAIN_DEC /* Allow decoding of SSR profile AAC */ //#define SSR_DEC /* Allow decoding of LTP profile AAC */ #define LTP_DEC /* Allow decoding of LD profile AAC */ #define LD_DEC /* Allow decoding of Digital Radio Mondiale (DRM) */ #ifdef DRM_SUPPORT #define DRM #define DRM_PS #endif /* LD can't do without LTP */ #ifdef LD_DEC #ifndef ERROR_RESILIENCE #define ERROR_RESILIENCE #endif #ifndef LTP_DEC #define LTP_DEC #endif #endif #define ALLOW_SMALL_FRAMELENGTH // Define LC_ONLY_DECODER if you want a pure AAC LC decoder (independant of SBR_DEC and PS_DEC) //#define LC_ONLY_DECODER #ifdef LC_ONLY_DECODER #undef LD_DEC #undef LTP_DEC #undef MAIN_DEC #undef SSR_DEC #undef DRM #undef DRM_PS #undef ALLOW_SMALL_FRAMELENGTH #undef ERROR_RESILIENCE #endif // Define DISABLE_SBR if you want to disable SBR decoding. //#define DISABLE_SBR // Define SBR_LOW_POWER if you want only low power SBR decoding without PS. //#define SBR_LOW_POWER #ifndef DISABLE_SBR # define SBR_DEC # ifndef SBR_LOW_POWER # define PS_DEC # endif // SBR_LOW_POWER #endif // DISABLE_SBR /* 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_PRECISION)/B) #define DIV_C(A, B) (((int64_t)A * COEF_PRECISION)/B) #define DIV_F(A, B) (((int64_t)A * FRAC_PRECISION)/B) #else #define DIV_R(A, B) ((A)/(B)) #define DIV_C(A, B) ((A)/(B)) #define DIV_F(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 /* WIN */ #include #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #include #include #if HAVE_STRING_H # 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 #include #endif /* WIN */ /* FIXED_POINT doesn't work with MAIN and SSR yet */ #ifdef FIXED_POINT #undef MAIN_DEC #undef SSR_DEC #endif #if defined(FIXED_POINT) #include "fixed.h" #elif defined(USE_DOUBLE_PRECISION) typedef double real_t; #include #define MUL_R(A,B) ((A)*(B)) #define MUL_C(A,B) ((A)*(B)) #define MUL_F(A,B) ((A)*(B)) /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } #define REAL_CONST(A) ((real_t)(A)) #define COEF_CONST(A) ((real_t)(A)) #define Q2_CONST(A) ((real_t)(A)) #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ #else /* Normal floating point operation */ typedef float real_t; #define MUL_R(A,B) ((A)*(B)) #define MUL_C(A,B) ((A)*(B)) #define MUL_F(A,B) ((A)*(B)) #define REAL_CONST(A) ((real_t)(A)) #define COEF_CONST(A) ((real_t)(A)) #define Q2_CONST(A) ((real_t)(A)) #define FRAC_CONST(A) ((real_t)(A)) /* pure fractional part */ /* Complex multiplication */ static INLINE void ComplexMult(real_t *y1, real_t *y2, real_t x1, real_t x2, real_t c1, real_t c2) { *y1 = MUL_F(x1, c1) + MUL_F(x2, c2); *y2 = MUL_F(x2, c1) - MUL_F(x1, c2); } #if defined(_WIN32) && defined(_M_IX86) && !defined(__MINGW32__) #ifndef HAVE_LRINTF #define HAS_LRINTF static INLINE long lrintf(float f) { int i; __asm { fld f fistp i } return i; } #endif /* HAVE_LRINTF */ #elif (defined(__i386__) && defined(__GNUC__) && \ !defined(__CYGWIN__) && !defined(__MINGW32__)) #ifndef HAVE_LRINTF #define HAS_LRINTF // from http://www.stereopsis.com/FPU.html static INLINE long 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) ((long)(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); #ifdef FIXED_POINT uint32_t wl_min_lzc(uint32_t x); #define LOG2_MIN_INF REAL_CONST(-10000) int32_t log2_int(uint64_t val); uint64_t pow2_int(real_t val); real_t pow2_fix(real_t val); #endif uint8_t get_sr_index(const uint32_t samplerate); uint8_t max_pred_sfb(const uint8_t sr_index); uint8_t max_tns_sfb(const uint8_t sr_index, const uint8_t object_type, const uint8_t is_short); uint32_t get_sample_rate(const uint8_t sr_index); int8_t can_decode_ot(const uint8_t object_type); void *faad_malloc(size_t size); void faad_free(void *b); //#define PROFILE #ifdef PROFILE static int64_t faad_get_ts() { __asm { rdtsc } } #endif #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef M_PI_2 /* PI/2 */ #define M_PI_2 1.57079632679489661923 #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/decoder.c000066400000000000000000001116671476153623600157360ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: decoder.c,v 1.119 2015/01/24 14:21:05 knik Exp $ **/ #include "common.h" #include "structs.h" #include #include #include #include "mp4.h" #include "syntax.h" #include "error.h" #include "output.h" #include "filtbank.h" #include "drc.h" #ifdef SBR_DEC #include "sbr_dec.h" #include "sbr_syntax.h" #endif #ifdef SSR_DEC #include "ssr.h" #endif #ifdef ANALYSIS uint16_t dbg_count; #endif #if !defined(PACKAGE_VERSION) #error "PACKAGE_VERSION must be defined" #endif /* static function declarations */ static void* aac_frame_decode(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer2, unsigned long sample_buffer_size); static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo); int NeAACDecGetVersion(char **faad_id_string, char **faad_copyright_string) { static char *libfaadName = PACKAGE_VERSION; static char *libCopyright = " Copyright 2002-2004: Ahead Software AG\n" " http://www.audiocoding.com\n" " bug tracking: https://sourceforge.net/p/faac/bugs/\n"; if (faad_id_string) *faad_id_string = libfaadName; if (faad_copyright_string) *faad_copyright_string = libCopyright; return 0; } char* NeAACDecGetErrorMessage(unsigned char errcode) { if (errcode >= NUM_ERROR_MESSAGES) return NULL; return err_msg[errcode]; } unsigned long NeAACDecGetCapabilities(void) { uint32_t cap = 0; /* can't do without it */ cap += LC_DEC_CAP; #ifdef MAIN_DEC cap += MAIN_DEC_CAP; #endif #ifdef LTP_DEC cap += LTP_DEC_CAP; #endif #ifdef LD_DEC cap += LD_DEC_CAP; #endif #ifdef ERROR_RESILIENCE cap += ERROR_RESILIENCE_CAP; #endif #ifdef FIXED_POINT cap += FIXED_POINT_CAP; #endif return cap; } const unsigned char mes[] = { 0x67,0x20,0x61,0x20,0x20,0x20,0x6f,0x20,0x72,0x20,0x65,0x20,0x6e,0x20,0x20,0x20,0x74,0x20,0x68,0x20,0x67,0x20,0x69,0x20,0x72,0x20,0x79,0x20,0x70,0x20,0x6f,0x20,0x63 }; NeAACDecHandle NeAACDecOpen(void) { uint8_t i; NeAACDecStruct *hDecoder = NULL; if ((hDecoder = (NeAACDecStruct*)faad_malloc(sizeof(NeAACDecStruct))) == NULL) return NULL; memset(hDecoder, 0, sizeof(NeAACDecStruct)); hDecoder->cmes = mes; hDecoder->config.outputFormat = FAAD_FMT_16BIT; hDecoder->config.defObjectType = MAIN; hDecoder->config.defSampleRate = 44100; /* Default: 44.1kHz */ hDecoder->config.downMatrix = 0; hDecoder->adts_header_present = 0; hDecoder->adif_header_present = 0; hDecoder->latm_header_present = 0; #ifdef ERROR_RESILIENCE hDecoder->aacSectionDataResilienceFlag = 0; hDecoder->aacScalefactorDataResilienceFlag = 0; hDecoder->aacSpectralDataResilienceFlag = 0; #endif hDecoder->frameLength = 1024; hDecoder->frame = 0; hDecoder->sample_buffer = NULL; // Same as (1, 1) after 1024 iterations; otherwise first values does not look random at all. hDecoder->__r1 = 0x2bb431ea; hDecoder->__r2 = 0x206155b7; for (i = 0; i < MAX_CHANNELS; i++) { hDecoder->element_id[i] = INVALID_ELEMENT_ID; hDecoder->window_shape_prev[i] = 0; hDecoder->time_out[i] = NULL; hDecoder->fb_intermed[i] = NULL; #ifdef SSR_DEC hDecoder->ssr_overlap[i] = NULL; hDecoder->prev_fmd[i] = NULL; #endif #ifdef MAIN_DEC hDecoder->pred_stat[i] = NULL; #endif #ifdef LTP_DEC hDecoder->ltp_lag[i] = 0; hDecoder->lt_pred_stat[i] = NULL; #endif } #ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { hDecoder->sbr[i] = NULL; } #endif hDecoder->drc = drc_init(REAL_CONST(1.0), REAL_CONST(1.0)); return hDecoder; } NeAACDecConfigurationPtr NeAACDecGetCurrentConfiguration(NeAACDecHandle hpDecoder) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder) { NeAACDecConfigurationPtr config = &(hDecoder->config); return config; } return NULL; } unsigned char NeAACDecSetConfiguration(NeAACDecHandle hpDecoder, NeAACDecConfigurationPtr config) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder && config) { /* check if we can decode this object type */ if (can_decode_ot(config->defObjectType) < 0) return 0; hDecoder->config.defObjectType = config->defObjectType; /* samplerate: anything but 0 should be possible */ if (config->defSampleRate == 0) return 0; hDecoder->config.defSampleRate = config->defSampleRate; /* check output format */ #ifdef FIXED_POINT if ((config->outputFormat < 1) || (config->outputFormat > 4)) return 0; #else if ((config->outputFormat < 1) || (config->outputFormat > 5)) return 0; #endif hDecoder->config.outputFormat = config->outputFormat; if (config->downMatrix > 1) return 0; hDecoder->config.downMatrix = config->downMatrix; /* OK */ return 1; } return 0; } #if 0 static int latmCheck(latm_header *latm, bitfile *ld) { uint32_t good=0, bad=0, bits, m; while (ld->bytes_left) { bits = faad_latm_frame(latm, ld); if(bits==0xFFFFFFFF) bad++; else { good++; while(bits>0) { m = min(bits, 8); faad_getbits(ld, m); bits -= m; } } } return (good>0); } #endif long NeAACDecInit(NeAACDecHandle hpDecoder, unsigned char *buffer, unsigned long buffer_size, unsigned long *samplerate, unsigned char *channels) { uint32_t bits = 0; bitfile ld; adif_header adif; adts_header adts; NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL) || (buffer_size == 0)) return -1; adts.old_format = hDecoder->config.useOldADTSFormat; 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_size >= 8) && (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 (adts_frame(&adts, &ld) == 0) { hDecoder->adts_header_present = 1; hDecoder->sf_index = adts.sf_index; hDecoder->object_type = adts.profile + 1; *samplerate = get_sample_rate(hDecoder->sf_index); *channels = (adts.channel_configuration > 6) ? 2 : adts.channel_configuration; } if (ld.error) { faad_endbits(&ld); return -1; } faad_endbits(&ld); } if (!*samplerate) return -1; #if (defined(PS_DEC) || defined(DRM_PS)) /* check if we have a mono file */ if (*channels == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ *channels = 2; } #endif hDecoder->channelConfiguration = *channels; #ifdef SBR_DEC /* implicit signalling */ if (*samplerate <= 24000 && (hDecoder->config.dontUpSampleImplicitSBR == 0)) { *samplerate *= 2; hDecoder->forceUpSampling = 1; } else if (*samplerate > 24000 && (hDecoder->config.dontUpSampleImplicitSBR == 0)) { hDecoder->downSampledSBR = 1; } #endif /* must be done before frameLength is divided by 2 for LD */ #ifdef SSR_DEC if (hDecoder->object_type == SSR) hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); else #endif hDecoder->fb = filter_bank_init(hDecoder->frameLength); #ifdef LD_DEC if (hDecoder->object_type == LD) hDecoder->frameLength >>= 1; #endif if (can_decode_ot(hDecoder->object_type) < 0) return -1; return bits; } /* Init the library using a DecoderSpecificInfo */ char NeAACDecInit2(NeAACDecHandle hpDecoder, unsigned char *pBuffer, unsigned long SizeOfDecoderSpecificInfo, unsigned long *samplerate, unsigned char *channels) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; int8_t rc; mp4AudioSpecificConfig mp4ASC; if((hDecoder == NULL) || (pBuffer == NULL) || (SizeOfDecoderSpecificInfo < 2) || (samplerate == NULL) || (channels == NULL)) { return -1; } hDecoder->adif_header_present = 0; hDecoder->adts_header_present = 0; /* decode the audio specific config */ rc = AudioSpecificConfig2(pBuffer, SizeOfDecoderSpecificInfo, &mp4ASC, &(hDecoder->pce), hDecoder->latm_header_present); /* copy the relevant info to the decoder handle */ *samplerate = mp4ASC.samplingFrequency; if (mp4ASC.channelsConfiguration) { *channels = mp4ASC.channelsConfiguration; } else { *channels = hDecoder->pce.channels; hDecoder->pce_set = 1; } #if (defined(PS_DEC) || defined(DRM_PS)) /* check if we have a mono file */ if (*channels == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ *channels = 2; } #endif hDecoder->sf_index = mp4ASC.samplingFrequencyIndex; hDecoder->object_type = mp4ASC.objectTypeIndex; #ifdef ERROR_RESILIENCE hDecoder->aacSectionDataResilienceFlag = mp4ASC.aacSectionDataResilienceFlag; hDecoder->aacScalefactorDataResilienceFlag = mp4ASC.aacScalefactorDataResilienceFlag; hDecoder->aacSpectralDataResilienceFlag = mp4ASC.aacSpectralDataResilienceFlag; #endif #ifdef SBR_DEC hDecoder->sbr_present_flag = mp4ASC.sbr_present_flag; hDecoder->downSampledSBR = mp4ASC.downSampledSBR; if (hDecoder->config.dontUpSampleImplicitSBR == 0) hDecoder->forceUpSampling = mp4ASC.forceUpSampling; else hDecoder->forceUpSampling = 0; /* AAC core decoder samplerate is 2 times as low */ if (((hDecoder->sbr_present_flag == 1)&&(!hDecoder->downSampledSBR)) || hDecoder->forceUpSampling == 1) { hDecoder->sf_index = get_sr_index(mp4ASC.samplingFrequency / 2); } #endif if (rc != 0) { return rc; } hDecoder->channelConfiguration = mp4ASC.channelsConfiguration; if (mp4ASC.frameLengthFlag) #ifdef ALLOW_SMALL_FRAMELENGTH hDecoder->frameLength = 960; #else return -1; #endif /* must be done before frameLength is divided by 2 for LD */ #ifdef SSR_DEC if (hDecoder->object_type == SSR) hDecoder->fb = ssr_filter_bank_init(hDecoder->frameLength/SSR_BANDS); else #endif hDecoder->fb = filter_bank_init(hDecoder->frameLength); #ifdef LD_DEC if (hDecoder->object_type == LD) hDecoder->frameLength >>= 1; #endif return 0; } #ifdef DRM char NeAACDecInitDRM(NeAACDecHandle *hpDecoder, unsigned long samplerate, unsigned char channels) { NeAACDecStruct** hDecoder = (NeAACDecStruct**)hpDecoder; if (hDecoder == NULL) return 1; /* error */ NeAACDecClose(*hDecoder); *hDecoder = NeAACDecOpen(); /* Special object type defined for DRM */ (*hDecoder)->config.defObjectType = DRM_ER_LC; (*hDecoder)->config.defSampleRate = samplerate; #ifdef ERROR_RESILIENCE // This shoudl always be defined for DRM (*hDecoder)->aacSectionDataResilienceFlag = 1; /* VCB11 */ (*hDecoder)->aacScalefactorDataResilienceFlag = 0; /* no RVLC */ (*hDecoder)->aacSpectralDataResilienceFlag = 1; /* HCR */ #endif (*hDecoder)->frameLength = 960; (*hDecoder)->sf_index = get_sr_index((*hDecoder)->config.defSampleRate); (*hDecoder)->object_type = (*hDecoder)->config.defObjectType; if ((channels == DRMCH_STEREO) || (channels == DRMCH_SBR_STEREO)) (*hDecoder)->channelConfiguration = 2; else (*hDecoder)->channelConfiguration = 1; #ifdef SBR_DEC if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) (*hDecoder)->sbr_present_flag = 0; else (*hDecoder)->sbr_present_flag = 1; #endif (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); return 0; } #endif void NeAACDecClose(NeAACDecHandle hpDecoder) { uint8_t i; NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder == NULL) return; #ifdef PROFILE printf("AAC decoder total: %I64d cycles\n", hDecoder->cycles); printf("requant: %I64d cycles\n", hDecoder->requant_cycles); printf("spectral_data: %I64d cycles\n", hDecoder->spectral_cycles); printf("scalefactors: %I64d cycles\n", hDecoder->scalefac_cycles); printf("output: %I64d cycles\n", hDecoder->output_cycles); #endif for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->time_out[i]) faad_free(hDecoder->time_out[i]); if (hDecoder->fb_intermed[i]) faad_free(hDecoder->fb_intermed[i]); #ifdef SSR_DEC if (hDecoder->ssr_overlap[i]) faad_free(hDecoder->ssr_overlap[i]); if (hDecoder->prev_fmd[i]) faad_free(hDecoder->prev_fmd[i]); #endif #ifdef MAIN_DEC if (hDecoder->pred_stat[i]) faad_free(hDecoder->pred_stat[i]); #endif #ifdef LTP_DEC if (hDecoder->lt_pred_stat[i]) faad_free(hDecoder->lt_pred_stat[i]); #endif } #ifdef SSR_DEC if (hDecoder->object_type == SSR) ssr_filter_bank_end(hDecoder->fb); else #endif filter_bank_end(hDecoder->fb); drc_end(hDecoder->drc); if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); #ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { if (hDecoder->sbr[i]) sbrDecodeEnd(hDecoder->sbr[i]); } #endif if (hDecoder) faad_free(hDecoder); } void NeAACDecPostSeekReset(NeAACDecHandle hpDecoder, long frame) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if (hDecoder) { hDecoder->postSeekResetFlag = 1; if (frame != -1) hDecoder->frame = frame; } } static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo) { hInfo->num_front_channels = 0; hInfo->num_side_channels = 0; hInfo->num_back_channels = 0; hInfo->num_lfe_channels = 0; memset(hInfo->channel_position, 0, MAX_CHANNELS*sizeof(uint8_t)); if (hDecoder->downMatrix) { hInfo->num_front_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; return; } /* check if there is a PCE */ /* TODO: why CPE flag is ignored? */ 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)) if (hInfo->num_front_channels == 1 && hInfo->num_side_channels == 0 && hInfo->num_back_channels == 0 && hInfo->num_lfe_channels == 0) { /* When PS is enabled output is always stereo */ hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; } else #endif hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; chdir--; } for (i = 0; i < chdir; i++) { hInfo->channel_position[chpos++] = (i & 1) ? FRONT_CHANNEL_RIGHT : FRONT_CHANNEL_LEFT; } for (i = 0; i < hInfo->num_side_channels; i++) { hInfo->channel_position[chpos++] = (i & 1) ? SIDE_CHANNEL_RIGHT : SIDE_CHANNEL_LEFT; } chdir = hInfo->num_back_channels; if (chdir & 1) { back_center = 1; chdir--; } for (i = 0; i < chdir; i++) { hInfo->channel_position[chpos++] = (i & 1) ? BACK_CHANNEL_RIGHT : BACK_CHANNEL_LEFT; } if (back_center) { hInfo->channel_position[chpos++] = BACK_CHANNEL_CENTER; } for (i = 0; i < hInfo->num_lfe_channels; i++) { hInfo->channel_position[chpos++] = LFE_CHANNEL; } } else { switch (hDecoder->channelConfiguration) { case 1: #if (defined(PS_DEC) || defined(DRM_PS)) /* When PS is enabled output is always stereo */ hInfo->num_front_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; #else hInfo->num_front_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; #endif break; case 2: hInfo->num_front_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; break; case 3: hInfo->num_front_channels = 3; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; break; case 4: hInfo->num_front_channels = 3; hInfo->num_back_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = BACK_CHANNEL_CENTER; break; case 5: hInfo->num_front_channels = 3; hInfo->num_back_channels = 2; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = BACK_CHANNEL_LEFT; hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; break; case 6: hInfo->num_front_channels = 3; hInfo->num_back_channels = 2; hInfo->num_lfe_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = BACK_CHANNEL_LEFT; hInfo->channel_position[4] = BACK_CHANNEL_RIGHT; hInfo->channel_position[5] = LFE_CHANNEL; break; case 7: hInfo->num_front_channels = 3; hInfo->num_side_channels = 2; hInfo->num_back_channels = 2; hInfo->num_lfe_channels = 1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; hInfo->channel_position[1] = FRONT_CHANNEL_LEFT; hInfo->channel_position[2] = FRONT_CHANNEL_RIGHT; hInfo->channel_position[3] = SIDE_CHANNEL_LEFT; hInfo->channel_position[4] = SIDE_CHANNEL_RIGHT; hInfo->channel_position[5] = BACK_CHANNEL_LEFT; hInfo->channel_position[6] = BACK_CHANNEL_RIGHT; hInfo->channel_position[7] = LFE_CHANNEL; break; default: /* channelConfiguration == 0 || channelConfiguration > 7 */ { uint8_t i; uint8_t ch = hDecoder->fr_channels - hDecoder->has_lfe; if (ch & 1) /* there's either a center front or a center back channel */ { uint8_t ch1 = (ch-1)/2; if (hDecoder->first_syn_ele == ID_SCE) { hInfo->num_front_channels = ch1 + 1; hInfo->num_back_channels = ch1; hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; for (i = 1; i <= ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1+1; i < ch; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } } else { hInfo->num_front_channels = ch1; hInfo->num_back_channels = ch1 + 1; for (i = 0; i < ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1; i < ch-1; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; } } else { uint8_t ch1 = (ch)/2; hInfo->num_front_channels = ch1; hInfo->num_back_channels = ch1; if (ch1 & 1) { hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; for (i = 1; i <= ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1+1; i < ch-1; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } hInfo->channel_position[ch-1] = BACK_CHANNEL_CENTER; } else { for (i = 0; i < ch1; i+=2) { hInfo->channel_position[i] = FRONT_CHANNEL_LEFT; hInfo->channel_position[i+1] = FRONT_CHANNEL_RIGHT; } for (i = ch1; i < ch; i+=2) { hInfo->channel_position[i] = BACK_CHANNEL_LEFT; hInfo->channel_position[i+1] = BACK_CHANNEL_RIGHT; } } } hInfo->num_lfe_channels = hDecoder->has_lfe; for (i = ch; i < hDecoder->fr_channels; i++) { hInfo->channel_position[i] = LFE_CHANNEL; } } break; } } } void* NeAACDecDecode(NeAACDecHandle hpDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); } void* NeAACDecDecode2(NeAACDecHandle hpDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, void **sample_buffer, unsigned long sample_buffer_size) { NeAACDecStruct* hDecoder = (NeAACDecStruct*)hpDecoder; if ((sample_buffer_size == 0) || (sample_buffer == NULL) || (*sample_buffer == NULL)) { hInfo->error = 27; return NULL; } return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, sample_buffer, sample_buffer_size); } 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; uint32_t bitsconsumed; uint16_t frame_len; void *sample_buffer; #if 0 uint32_t startbit=0, endbit=0, payload_bits=0; #endif uint32_t required_buffer_size=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 (ld.error != 0) return NULL; #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 */ if (!hDecoder->downMatrix && hDecoder->pce_set) { /* In some codepath program_config_element result is ignored. */ if (hDecoder->pce.channels > MAX_CHANNELS) { hInfo->error = 22; return NULL; } } 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; } { 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 required_buffer_size = frame_len*output_channels*stride; } /* check if we want to use internal sample_buffer */ if (sample_buffer_size == 0) { /* allocate the buffer for the final samples */ if (hDecoder->sample_buffer_size != required_buffer_size) { if (hDecoder->sample_buffer) faad_free(hDecoder->sample_buffer); hDecoder->sample_buffer = NULL; hDecoder->sample_buffer = faad_malloc(required_buffer_size); hDecoder->sample_buffer_size = required_buffer_size; } } else if (sample_buffer_size < required_buffer_size) { /* provided sample buffer is not big enough */ hInfo->error = 27; return NULL; } 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: /* reset filterbank state */ for (i = 0; i < MAX_CHANNELS; i++) { if (hDecoder->fb_intermed[i] != NULL) { memset(hDecoder->fb_intermed[i], 0, hDecoder->frameLength*sizeof(real_t)); } } #ifdef SBR_DEC for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) { if (hDecoder->sbr[i] != NULL) { sbrReset(hDecoder->sbr[i]); } } #endif faad_endbits(&ld); /* cleanup */ #ifdef ANALYSIS fflush(stdout); #endif return NULL; } faad2-2.11.2/libfaad/drc.c000066400000000000000000000120601476153623600150640ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: drc.c,v 1.29 2015/02/22 10:09:29 knik Exp $ **/ #include "common.h" #include "structs.h" #include #include "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] = (int32_t)(((uint32_t)spec[i]) << exp); if (frac) spec[i] = MUL_R(spec[i],drc_pow2_table[frac+23]); } } #endif bottom = top; } } faad2-2.11.2/libfaad/drc.h000066400000000000000000000030441476153623600150730ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: drc.h,v 1.22 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __DRC_H__ #define __DRC_H__ #ifdef __cplusplus extern "C" { #endif #define DRC_REF_LEVEL 20*4 /* -20 dB */ drc_info *drc_init(real_t cut, real_t boost); void drc_end(drc_info *drc); void drc_decode(drc_info *drc, real_t *spec); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/drm_dec.c000066400000000000000000001360071476153623600157210ustar00rootroot00000000000000/* ** 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; int8_t index = 0; while (index >= 0) { bit = (uint8_t)faad_get1bit(ld); index = huff[index][bit]; } return index + 15; } static int8_t sa_delta_clip(drm_ps_info *ps, int8_t i) { if (i < 0) { /* printf(" SAminclip %d", i); */ ps->sa_decode_error = 1; return 0; } else if (i > 7) { /* printf(" SAmaxclip %d", i); */ ps->sa_decode_error = 1; return 7; } else return i; } static int8_t pan_delta_clip(drm_ps_info *ps, int8_t i) { if (i < -7) { /* printf(" PANminclip %d", i); */ ps->pan_decode_error = 1; return -7; } else if (i > 7) { /* printf(" PANmaxclip %d", i); */ ps->pan_decode_error = 1; return 7; } else return i; } static void drm_ps_delta_decode(drm_ps_info *ps) { uint8_t band; if (ps->bs_enable_sa) { if (ps->bs_sa_dt_flag && !ps->g_last_had_sa) { /* wait until we get a DT frame */ ps->bs_enable_sa = 0; } else if (ps->bs_sa_dt_flag) { /* DT frame, we have a last frame, so we can decode */ ps->g_sa_index[0] = sa_delta_clip(ps, ps->g_prev_sa_index[0]+ps->bs_sa_data[0]); } else { /* DF always decodable */ ps->g_sa_index[0] = sa_delta_clip(ps,ps->bs_sa_data[0]); } for (band = 1; band < DRM_NUM_SA_BANDS; band++) { if (ps->bs_sa_dt_flag && ps->g_last_had_sa) { ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_prev_sa_index[band] + ps->bs_sa_data[band]); } else if (!ps->bs_sa_dt_flag) { ps->g_sa_index[band] = sa_delta_clip(ps, ps->g_sa_index[band-1] + ps->bs_sa_data[band]); } } } /* An error during SA decoding implies PAN data will be undecodable, too */ /* Also, we don't like on/off switching in PS, so we force to last settings */ if (ps->sa_decode_error) { ps->pan_decode_error = 1; ps->bs_enable_pan = ps->g_last_had_pan; ps->bs_enable_sa = ps->g_last_had_sa; } if (ps->bs_enable_sa) { if (ps->sa_decode_error) { for (band = 0; band < DRM_NUM_SA_BANDS; band++) { ps->g_sa_index[band] = ps->g_last_good_sa_index[band]; } } else { for (band = 0; band < DRM_NUM_SA_BANDS; band++) { ps->g_last_good_sa_index[band] = ps->g_sa_index[band]; } } } if (ps->bs_enable_pan) { if (ps->bs_pan_dt_flag && !ps->g_last_had_pan) { ps->bs_enable_pan = 0; } else if (ps->bs_pan_dt_flag) { ps->g_pan_index[0] = pan_delta_clip(ps, ps->g_prev_pan_index[0]+ps->bs_pan_data[0]); } else { ps->g_pan_index[0] = pan_delta_clip(ps, ps->bs_pan_data[0]); } for (band = 1; band < DRM_NUM_PAN_BANDS; band++) { if (ps->bs_pan_dt_flag && ps->g_last_had_pan) { ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_prev_pan_index[band] + ps->bs_pan_data[band]); } else if (!ps->bs_pan_dt_flag) { ps->g_pan_index[band] = pan_delta_clip(ps, ps->g_pan_index[band-1] + ps->bs_pan_data[band]); } } if (ps->pan_decode_error) { for (band = 0; band < DRM_NUM_PAN_BANDS; band++) { ps->g_pan_index[band] = ps->g_last_good_pan_index[band]; } } else { for (band = 0; band < DRM_NUM_PAN_BANDS; band++) { ps->g_last_good_pan_index[band] = ps->g_pan_index[band]; } } } } static void drm_calc_sa_side_signal(drm_ps_info *ps, qmf_t X[38][64]) { uint8_t s, b, k; complex_t qfrac, tmp0, tmp, in, R0; real_t peakdiff; real_t nrg; real_t power; real_t transratio; real_t new_delay_slopes[NUM_OF_LINKS]; uint8_t temp_delay_ser[NUM_OF_LINKS]; complex_t Phi_Fract; #ifdef FIXED_POINT uint32_t in_re, in_im; #endif for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) { /* set delay indices */ for (k = 0; k < NUM_OF_LINKS; k++) temp_delay_ser[k] = ps->delay_buf_index_ser[k]; RE(Phi_Fract) = RE(Phi_Fract_Qmf[b]); IM(Phi_Fract) = IM(Phi_Fract_Qmf[b]); for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { const real_t gamma = REAL_CONST(1.5); const real_t sigma = REAL_CONST(1.5625); RE(in) = QMF_RE(X[s][b]); IM(in) = QMF_IM(X[s][b]); #ifdef FIXED_POINT /* NOTE: all input is scaled by 2^(-5) because of fixed point QMF * meaning that P will be scaled by 2^(-10) compared to floating point version */ in_re = ((abs(RE(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); in_im = ((abs(IM(in))+(1<<(REAL_BITS-1)))>>REAL_BITS); power = in_re*in_re + in_im*in_im; #else power = MUL_R(RE(in),RE(in)) + MUL_R(IM(in),IM(in)); #endif ps->peakdecay_fast[b] = MUL_F(ps->peakdecay_fast[b], peak_decay); if (ps->peakdecay_fast[b] < power) ps->peakdecay_fast[b] = power; peakdiff = ps->prev_peakdiff[b]; peakdiff += MUL_F((ps->peakdecay_fast[b] - power - ps->prev_peakdiff[b]), smooth_coeff); ps->prev_peakdiff[b] = peakdiff; nrg = ps->prev_nrg[b]; nrg += MUL_F((power - ps->prev_nrg[b]), smooth_coeff); ps->prev_nrg[b] = nrg; if (MUL_R(peakdiff, gamma) <= nrg) { transratio = sigma; } else { transratio = MUL_R(DIV_R(nrg, MUL_R(peakdiff, gamma)), sigma); } for (k = 0; k < NUM_OF_LINKS; k++) { new_delay_slopes[k] = MUL_F(g_decayslope[b], filter_coeff[k]); } RE(tmp0) = RE(ps->d_buff[0][b]); IM(tmp0) = IM(ps->d_buff[0][b]); RE(ps->d_buff[0][b]) = RE(ps->d_buff[1][b]); IM(ps->d_buff[0][b]) = IM(ps->d_buff[1][b]); RE(ps->d_buff[1][b]) = RE(in); IM(ps->d_buff[1][b]) = IM(in); ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(Phi_Fract), IM(Phi_Fract)); RE(R0) = RE(tmp); IM(R0) = IM(tmp); for (k = 0; k < NUM_OF_LINKS; k++) { RE(qfrac) = RE(Q_Fract_allpass_Qmf[b][k]); IM(qfrac) = IM(Q_Fract_allpass_Qmf[b][k]); RE(tmp0) = RE(ps->d2_buff[k][temp_delay_ser[k]][b]); IM(tmp0) = IM(ps->d2_buff[k][temp_delay_ser[k]][b]); ComplexMult(&RE(tmp), &IM(tmp), RE(tmp0), IM(tmp0), RE(qfrac), IM(qfrac)); RE(tmp) += -MUL_F(new_delay_slopes[k], RE(R0)); IM(tmp) += -MUL_F(new_delay_slopes[k], IM(R0)); RE(ps->d2_buff[k][temp_delay_ser[k]][b]) = RE(R0) + MUL_F(new_delay_slopes[k], RE(tmp)); IM(ps->d2_buff[k][temp_delay_ser[k]][b]) = IM(R0) + MUL_F(new_delay_slopes[k], IM(tmp)); RE(R0) = RE(tmp); IM(R0) = IM(tmp); } QMF_RE(ps->SA[s][b]) = MUL_R(RE(R0), transratio); QMF_IM(ps->SA[s][b]) = MUL_R(IM(R0), transratio); for (k = 0; k < NUM_OF_LINKS; k++) { if (++temp_delay_ser[k] >= delay_length[k]) temp_delay_ser[k] = 0; } } } for (k = 0; k < NUM_OF_LINKS; k++) ps->delay_buf_index_ser[k] = temp_delay_ser[k]; } static void drm_add_ambiance(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { uint8_t s, b, ifreq, qclass; real_t sa_map[MAX_SA_BAND], sa_dir_map[MAX_SA_BAND], k_sa_map[MAX_SA_BAND], k_sa_dir_map[MAX_SA_BAND]; real_t new_dir_map, new_sa_map; if (ps->bs_enable_sa) { /* Instead of dequantization and mapping, we use an inverse mapping to look up all the values we need */ for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) { const real_t inv_f_num_of_subsamples = FRAC_CONST(0.03333333333); ifreq = sa_inv_freq[b]; qclass = (b != 0); sa_map[b] = sa_quant[ps->g_prev_sa_index[ifreq]][qclass]; new_sa_map = sa_quant[ps->g_sa_index[ifreq]][qclass]; k_sa_map[b] = MUL_F(inv_f_num_of_subsamples, (new_sa_map - sa_map[b])); sa_dir_map[b] = sa_sqrt_1_minus[ps->g_prev_sa_index[ifreq]][qclass]; new_dir_map = sa_sqrt_1_minus[ps->g_sa_index[ifreq]][qclass]; k_sa_dir_map[b] = MUL_F(inv_f_num_of_subsamples, (new_dir_map - sa_dir_map[b])); } for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { for (b = 0; b < sa_freq_scale[DRM_NUM_SA_BANDS]; b++) { QMF_RE(X_right[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); QMF_IM(X_right[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) - MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); QMF_RE(X_left[s][b]) = MUL_F(QMF_RE(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_RE(ps->SA[s][b]), sa_map[b]); QMF_IM(X_left[s][b]) = MUL_F(QMF_IM(X_left[s][b]), sa_dir_map[b]) + MUL_F(QMF_IM(ps->SA[s][b]), sa_map[b]); sa_map[b] += k_sa_map[b]; sa_dir_map[b] += k_sa_dir_map[b]; } for (b = sa_freq_scale[DRM_NUM_SA_BANDS]; b < NUM_OF_QMF_CHANNELS; b++) { QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); } } } else { for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) { QMF_RE(X_right[s][b]) = QMF_RE(X_left[s][b]); QMF_IM(X_right[s][b]) = QMF_IM(X_left[s][b]); } } } } static void drm_add_pan(drm_ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { uint8_t s, b, qclass, ifreq; real_t tmp, coeff1, coeff2; real_t pan_base[MAX_PAN_BAND]; real_t pan_delta[MAX_PAN_BAND]; qmf_t temp_l, temp_r; if (ps->bs_enable_pan) { for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) { /* Instead of dequantization, 20->64 mapping and 2^G(x,y) we do an inverse mapping 64->20 and look up the 2^G(x,y) values directly */ ifreq = pan_inv_freq[b]; qclass = pan_quant_class[ifreq]; if (ps->g_prev_pan_index[ifreq] >= 0) { pan_base[b] = pan_pow_2_pos[ps->g_prev_pan_index[ifreq]][qclass]; } else { pan_base[b] = pan_pow_2_neg[-ps->g_prev_pan_index[ifreq]][qclass]; } /* 2^((a-b)/30) = 2^(a/30) * 1/(2^(b/30)) */ /* a en b can be negative so we may need to inverse parts */ if (ps->g_pan_index[ifreq] >= 0) { if (ps->g_prev_pan_index[ifreq] >= 0) { pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); } else { pan_delta[b] = MUL_C(pan_pow_2_30_pos[ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); } } else { if (ps->g_prev_pan_index[ifreq] >= 0) { pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_neg[ps->g_prev_pan_index[ifreq]][qclass]); } else { pan_delta[b] = MUL_C(pan_pow_2_30_neg[-ps->g_pan_index[ifreq]][qclass], pan_pow_2_30_pos[-ps->g_prev_pan_index[ifreq]][qclass]); } } } for (s = 0; s < NUM_OF_SUBSAMPLES; s++) { /* PAN always uses all 64 channels */ for (b = 0; b < NUM_OF_QMF_CHANNELS; b++) { tmp = pan_base[b]; coeff2 = DIV_R(REAL_CONST(2.0), (REAL_CONST(1.0) + tmp)); coeff1 = MUL_R(coeff2, tmp); QMF_RE(temp_l) = QMF_RE(X_left[s][b]); QMF_IM(temp_l) = QMF_IM(X_left[s][b]); QMF_RE(temp_r) = QMF_RE(X_right[s][b]); QMF_IM(temp_r) = QMF_IM(X_right[s][b]); QMF_RE(X_left[s][b]) = MUL_R(QMF_RE(temp_l), coeff1); QMF_IM(X_left[s][b]) = MUL_R(QMF_IM(temp_l), coeff1); QMF_RE(X_right[s][b]) = MUL_R(QMF_RE(temp_r), coeff2); QMF_IM(X_right[s][b]) = MUL_R(QMF_IM(temp_r), coeff2); /* 2^(a+k*b) = 2^a * 2^b * ... * 2^b */ /* ^^^^^^^^^^^^^^^ k times */ pan_base[b] = MUL_C(pan_base[b], pan_delta[b]); } } } } drm_ps_info *drm_ps_init(void) { drm_ps_info *ps = (drm_ps_info*)faad_malloc(sizeof(drm_ps_info)); memset(ps, 0, sizeof(drm_ps_info)); return ps; } void drm_ps_free(drm_ps_info *ps) { faad_free(ps); } /* main DRM PS decoding function */ uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]) { if (ps == NULL) { memcpy(X_right, X_left, sizeof(qmf_t)*30*64); return 0; } if (!ps->drm_ps_data_available && !guess) { memcpy(X_right, X_left, sizeof(qmf_t)*30*64); memset(ps->g_prev_sa_index, 0, sizeof(ps->g_prev_sa_index)); memset(ps->g_prev_pan_index, 0, sizeof(ps->g_prev_pan_index)); return 0; } /* if SBR CRC doesn't match out, we can assume decode errors to start with, and we'll guess what the parameters should be */ if (!guess) { ps->sa_decode_error = 0; ps->pan_decode_error = 0; drm_ps_delta_decode(ps); } else { ps->sa_decode_error = 1; ps->pan_decode_error = 1; /* don't even bother decoding */ } ps->drm_ps_data_available = 0; drm_calc_sa_side_signal(ps, X_left); drm_add_ambiance(ps, X_left, X_right); if (ps->bs_enable_sa) { ps->g_last_had_sa = 1; memcpy(ps->g_prev_sa_index, ps->g_sa_index, sizeof(int8_t) * DRM_NUM_SA_BANDS); } else { ps->g_last_had_sa = 0; } if (ps->bs_enable_pan) { drm_add_pan(ps, X_left, X_right); ps->g_last_had_pan = 1; memcpy(ps->g_prev_pan_index, ps->g_pan_index, sizeof(int8_t) * DRM_NUM_PAN_BANDS); } else { ps->g_last_had_pan = 0; } return 0; } #endif faad2-2.11.2/libfaad/drm_dec.h000066400000000000000000000056021476153623600157220ustar00rootroot00000000000000/* ** 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]; uint8_t delay_buf_index_ser[NUM_OF_LINKS]; 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]; real_t prev_nrg[MAX_SA_BAND]; real_t prev_peakdiff[MAX_SA_BAND]; real_t peakdecay_fast[MAX_SA_BAND]; } drm_ps_info; uint16_t drm_ps_data(drm_ps_info *ps, bitfile *ld); drm_ps_info *drm_ps_init(void); void drm_ps_free(drm_ps_info *ps); uint8_t drm_ps_decode(drm_ps_info *ps, uint8_t guess, qmf_t X_left[38][64], qmf_t X_right[38][64]); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/error.c000066400000000000000000000054041476153623600154510ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: error.c,v 1.33 2008/09/19 23:31:39 menno Exp $ **/ #include "common.h" #include "error.h" char *err_msg[] = { "No error", "Gain control not yet implemented", "Pulse coding not allowed in short blocks", "Invalid huffman codebook", "Scalefactor out of range", "Unable to find ADTS syncword", "Channel coupling not yet implemented", "Channel configuration not allowed in error resilient frame", "Bit error in error resilient scalefactor decoding", "Error decoding huffman scalefactor (bitstream error)", "Error decoding huffman codeword (bitstream error)", "Non existent huffman codebook number found", "Invalid number of channels", "Maximum number of bitstream elements exceeded", "Input data buffer too small", "Array index out of range", "Maximum number of scalefactor bands exceeded", "Quantised value out of range", "LTP lag out of range", "Invalid SBR parameter decoded", "SBR called without being initialised", "Unexpected channel configuration change", "Error in program_config_element", "First SBR frame is not the same as first AAC frame", "Unexpected fill element with SBR data", "Not all elements were provided with SBR data", "LTP decoding not available", "Output data buffer too small", "CRC error in DRM data", "PNS not allowed in DRM data stream", "No standard extension payload allowed in DRM", "PCE shall be the first element in a frame", "Bitstream value not allowed by specification", "MAIN prediction not initialised" }; faad2-2.11.2/libfaad/error.h000066400000000000000000000026741476153623600154640ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: error.h,v 1.27 2008/09/19 23:31:40 menno Exp $ **/ #ifndef __ERROR_H__ #define __ERROR_H__ #ifdef __cplusplus extern "C" { #endif #define NUM_ERROR_MESSAGES 34 extern char *err_msg[]; #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/faad2.pc.in000066400000000000000000000003501476153623600160550ustar00rootroot00000000000000prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: FAAD2 Description: Freeware Advanced Audio (AAC) Decoder Version: @VERSION@ Libs: -L${libdir} -lfaad Libs.private: -lm Cflags: -I${includedir} faad2-2.11.2/libfaad/filtbank.c000066400000000000000000000331141476153623600161110ustar00rootroot00000000000000/* ** 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 #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 (void)len; 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 { #else (void)object_type; #endif window_long = fb->long_window[window_shape]; window_long_prev = fb->long_window[window_shape_prev]; window_short = fb->short_window[window_shape]; window_short_prev = fb->short_window[window_shape_prev]; #ifdef LD_DEC } #endif #if 0 for (i = 0; i < 1024; i++) { printf("%d\n", freq_in[i]); } #endif #if 0 printf("%d %d\n", window_sequence, window_shape); #endif switch (window_sequence) { case ONLY_LONG_SEQUENCE: /* perform iMDCT */ imdct_long(fb, freq_in, transf_buf, 2*nlong); /* add second half output of previous frame to windowed output of current frame */ for (i = 0; i < nlong; i+=4) { time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); } /* window the second half and save as overlap for next frame */ for (i = 0; i < nlong; i+=4) { overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); overlap[i+1] = MUL_F(transf_buf[nlong+i+1],window_long[nlong-2-i]); overlap[i+2] = MUL_F(transf_buf[nlong+i+2],window_long[nlong-3-i]); overlap[i+3] = MUL_F(transf_buf[nlong+i+3],window_long[nlong-4-i]); } break; case LONG_START_SEQUENCE: /* perform iMDCT */ imdct_long(fb, freq_in, transf_buf, 2*nlong); /* add second half output of previous frame to windowed output of current frame */ for (i = 0; i < nlong; i+=4) { time_out[i] = overlap[i] + MUL_F(transf_buf[i],window_long_prev[i]); time_out[i+1] = overlap[i+1] + MUL_F(transf_buf[i+1],window_long_prev[i+1]); time_out[i+2] = overlap[i+2] + MUL_F(transf_buf[i+2],window_long_prev[i+2]); time_out[i+3] = overlap[i+3] + MUL_F(transf_buf[i+3],window_long_prev[i+3]); } /* window the second half and save as overlap for next frame */ /* construct second half window using padding with 1's and 0's */ for (i = 0; i < nflat_ls; i++) overlap[i] = transf_buf[nlong+i]; for (i = 0; i < nshort; i++) overlap[nflat_ls+i] = MUL_F(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); for (i = 0; i < nflat_ls; i++) overlap[nflat_ls+nshort+i] = 0; break; case EIGHT_SHORT_SEQUENCE: /* perform iMDCT for each short block */ faad_imdct(fb->mdct256, freq_in+0*nshort, transf_buf+2*nshort*0); faad_imdct(fb->mdct256, freq_in+1*nshort, transf_buf+2*nshort*1); faad_imdct(fb->mdct256, freq_in+2*nshort, transf_buf+2*nshort*2); faad_imdct(fb->mdct256, freq_in+3*nshort, transf_buf+2*nshort*3); faad_imdct(fb->mdct256, freq_in+4*nshort, transf_buf+2*nshort*4); faad_imdct(fb->mdct256, freq_in+5*nshort, transf_buf+2*nshort*5); faad_imdct(fb->mdct256, freq_in+6*nshort, transf_buf+2*nshort*6); faad_imdct(fb->mdct256, freq_in+7*nshort, transf_buf+2*nshort*7); /* add second half output of previous frame to windowed output of current frame */ for (i = 0; i < nflat_ls; i++) time_out[i] = overlap[i]; for(i = 0; i < nshort; i++) { time_out[nflat_ls+ i] = overlap[nflat_ls+ i] + MUL_F(transf_buf[nshort*0+i],window_short_prev[i]); time_out[nflat_ls+1*nshort+i] = overlap[nflat_ls+nshort*1+i] + MUL_F(transf_buf[nshort*1+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*2+i],window_short[i]); time_out[nflat_ls+2*nshort+i] = overlap[nflat_ls+nshort*2+i] + MUL_F(transf_buf[nshort*3+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*4+i],window_short[i]); time_out[nflat_ls+3*nshort+i] = overlap[nflat_ls+nshort*3+i] + MUL_F(transf_buf[nshort*5+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*6+i],window_short[i]); if (i < trans) time_out[nflat_ls+4*nshort+i] = overlap[nflat_ls+nshort*4+i] + MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); } /* window the second half and save as overlap for next frame */ for(i = 0; i < nshort; i++) { if (i >= trans) overlap[nflat_ls+4*nshort+i-nlong] = MUL_F(transf_buf[nshort*7+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*8+i],window_short[i]); overlap[nflat_ls+5*nshort+i-nlong] = MUL_F(transf_buf[nshort*9+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*10+i],window_short[i]); overlap[nflat_ls+6*nshort+i-nlong] = MUL_F(transf_buf[nshort*11+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*12+i],window_short[i]); overlap[nflat_ls+7*nshort+i-nlong] = MUL_F(transf_buf[nshort*13+i],window_short[nshort-1-i]) + MUL_F(transf_buf[nshort*14+i],window_short[i]); overlap[nflat_ls+8*nshort+i-nlong] = MUL_F(transf_buf[nshort*15+i],window_short[nshort-1-i]); } for (i = 0; i < nflat_ls; i++) overlap[nflat_ls+nshort+i] = 0; break; case LONG_STOP_SEQUENCE: /* perform iMDCT */ imdct_long(fb, freq_in, transf_buf, 2*nlong); /* add second half output of previous frame to windowed output of current frame */ /* construct first half window using padding with 1's and 0's */ for (i = 0; i < nflat_ls; i++) time_out[i] = overlap[i]; for (i = 0; i < nshort; i++) time_out[nflat_ls+i] = overlap[nflat_ls+i] + MUL_F(transf_buf[nflat_ls+i],window_short_prev[i]); for (i = 0; i < nflat_ls; i++) time_out[nflat_ls+nshort+i] = overlap[nflat_ls+nshort+i] + transf_buf[nflat_ls+nshort+i]; /* window the second half and save as overlap for next frame */ for (i = 0; i < nlong; i++) overlap[i] = MUL_F(transf_buf[nlong+i],window_long[nlong-1-i]); break; } #if 0 for (i = 0; i < 1024; i++) { printf("%d\n", time_out[i]); //printf("0x%.8X\n", time_out[i]); } #endif #ifdef PROFILE count = faad_get_ts() - count; fb->cycles += count; #endif } #ifdef LTP_DEC /* only works for LTP -> no overlapping, no short blocks */ void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, uint8_t object_type, uint16_t frame_len) { int16_t i; ALIGN real_t windowed_buf[2*1024] = {0}; const real_t *window_long = NULL; const real_t *window_long_prev = NULL; const real_t *window_short = NULL; const real_t *window_short_prev = NULL; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; uint16_t nflat_ls = (nlong-nshort)/2; assert(window_sequence != EIGHT_SHORT_SEQUENCE); #ifdef LD_DEC if (object_type == LD) { window_long = fb->ld_window[window_shape]; window_long_prev = fb->ld_window[window_shape_prev]; } else { #endif window_long = fb->long_window[window_shape]; window_long_prev = fb->long_window[window_shape_prev]; window_short = fb->short_window[window_shape]; window_short_prev = fb->short_window[window_shape_prev]; #ifdef LD_DEC } #endif switch(window_sequence) { case ONLY_LONG_SEQUENCE: for (i = nlong-1; i >= 0; i--) { windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); } mdct(fb, windowed_buf, out_mdct, 2*nlong); break; case LONG_START_SEQUENCE: for (i = 0; i < nlong; i++) windowed_buf[i] = MUL_F(in_data[i], window_long_prev[i]); for (i = 0; i < nflat_ls; i++) windowed_buf[i+nlong] = in_data[i+nlong]; for (i = 0; i < nshort; i++) windowed_buf[i+nlong+nflat_ls] = MUL_F(in_data[i+nlong+nflat_ls], window_short[nshort-1-i]); for (i = 0; i < nflat_ls; i++) windowed_buf[i+nlong+nflat_ls+nshort] = 0; mdct(fb, windowed_buf, out_mdct, 2*nlong); break; case LONG_STOP_SEQUENCE: for (i = 0; i < nflat_ls; i++) windowed_buf[i] = 0; for (i = 0; i < nshort; i++) windowed_buf[i+nflat_ls] = MUL_F(in_data[i+nflat_ls], window_short_prev[i]); for (i = 0; i < nflat_ls; i++) windowed_buf[i+nflat_ls+nshort] = in_data[i+nflat_ls+nshort]; for (i = 0; i < nlong; i++) windowed_buf[i+nlong] = MUL_F(in_data[i+nlong], window_long[nlong-1-i]); mdct(fb, windowed_buf, out_mdct, 2*nlong); break; } } #endif faad2-2.11.2/libfaad/filtbank.h000066400000000000000000000041031476153623600161120ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: filtbank.h,v 1.27 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __FILTBANK_H__ #define __FILTBANK_H__ #ifdef __cplusplus extern "C" { #endif fb_info *filter_bank_init(uint16_t frame_len); void filter_bank_end(fb_info *fb); #ifdef LTP_DEC void filter_bank_ltp(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *in_data, real_t *out_mdct, uint8_t object_type, uint16_t frame_len); #endif void ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, uint8_t object_type, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/fixed.h000066400000000000000000000205521476153623600154250ustar00rootroot00000000000000/* ** 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 /* Multiplication by power of 2 will be compiled to left-shift */ #define FRAC_MUL (1u << (FRAC_SIZE - FRAC_BITS)) #define FRAC_PRECISION ((uint32_t)(1u << 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) && !defined(__GNUC__) && !defined(_WIN64) /* 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)+(1u << (FRAC_SIZE-1))) >> FRAC_SIZE) #define MUL_F(A,B) (real_t)(((int64_t)(A)*(int64_t)(B)+(1u << (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_MUL; *y2 = (_MulHigh(x2, c1) - _MulHigh(x1, c2)) * FRAC_MUL; } #endif /* Saturated left shift */ #define SAT_SHIFT_MASK(E) (~0u << (31u - (E))) #define SAT_SHIFT(V,E,M) (((((V) >> ((E) + 1)) ^ (V)) & (M)) \ ? (((V) < 0) ? (int32_t)0x80000000 : 0x7FFFFFFF) \ : ((int32_t)((uint32_t)(V) << (E)))) #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/hcr.c000066400000000000000000000367531476153623600151070ustar00rootroot00000000000000/* ** 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 "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; static uint32_t reverse_word(uint32_t v) { 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]); return v; } /* bits_t version */ static void rewrev_bits(bits_t *bits) { if (bits->len == 0) return; if (bits->len <= 32) { bits->bufb = 0; bits->bufa = reverse_word(bits->bufa) >> (32 - bits->len); } else { /* last 32<>32 bit swap via rename */ uint32_t lo = reverse_word(bits->bufb); uint32_t hi = reverse_word(bits->bufa); if (bits->len == 64) { bits->bufb = hi; bits->bufa = lo; } else { /* shift off low bits (this is really only one 64 bit shift) */ bits->bufb = hi >> (64 - bits->len); bits->bufa = (lo >> (64 - bits->len)) | (hi << (bits->len - 32)); } } } /* merge bits of a to b */ /* precondition: a->len + b->len <= 64 */ static void concat_bits(bits_t *b, bits_t *a) { uint32_t bl, bh, al, ah; /* empty addend */ if (a->len == 0) return; /* addend becomes result */ if (b->len == 0) { *b = *a; return; } al = a->bufa; ah = a->bufb; if (b->len > 32) { /* (b->len - 32) is 1..31 */ /* maskoff superfluous high b bits */ bl = b->bufa; bh = b->bufb & ((1u << (b->len-32)) - 1); /* left shift a b->len bits */ ah = al << (b->len - 32); al = 0; } else if (b->len == 32) { bl = b->bufa; bh = 0; ah = al; al = 0; } else { /* b->len is 1..31, (32 - b->len) is 1..31 */ bl = b->bufa & ((1u << (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->bufb = 0; segment->bufa = faad_getbits(ld, segwidth); } } 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 { // sp_data_len - bitsread < segwidth /* 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 should fit */ if (bitsread < sp_data_len) { const uint8_t additional_bits = (uint8_t)(sp_data_len - bitsread); read_segment(&segment[numberOfSegments], additional_bits, ld); segment[numberOfSegments].len += segment[numberOfSegments-1].len; if (segment[numberOfSegments].len > 64) return 10; 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 = segment[segment_idx].len + codeword[codeword_idx].bits.len; if (tmplen > 64) { // Drop bits that do not fit concatenation result. flushbits_hcr(&codeword[codeword_idx].bits, tmplen - 64); } if (codeword[codeword_idx].bits.len != 0) concat_bits(&segment[segment_idx], &codeword[codeword_idx].bits); tmplen = segment[segment_idx].len; if (huffman_spectral_data_2(codeword[codeword_idx].cb, &segment[segment_idx], &spectral_data[codeword[codeword_idx].sp_offset]) >= 0) { codeword[codeword_idx].decoded = 1; } else { codeword[codeword_idx].bits = segment[segment_idx]; codeword[codeword_idx].bits.len = tmplen; } } } } for (i = 0; i < numberOfSegments; i++) rewrev_bits(&segment[i]); } #if 0 // Seems to give false errors bitsleft = 0; for (i = 0; i < numberOfSegments && !bitsleft; i++) bitsleft += segment[i].len; if (bitsleft) return 10; codewordsleft = 0; for (i = 0; (i < numberOfCodewords - numberOfSegments) && (!codewordsleft); i++) if (!codeword[i].decoded) codewordsleft++; if (codewordsleft) return 10; #endif return 0; } #endif faad2-2.11.2/libfaad/huffman.c000066400000000000000000000407111476153623600157440ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: huffman.c,v 1.26 2007/11/01 12:33:30 menno Exp $ **/ #include "common.h" #include "structs.h" #include #ifdef ANALYSIS #include #endif #include "bits.h" #include "huffman.h" #include "codebook/hcb.h" /* static function declarations */ static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len); static INLINE uint8_t huffman_getescape(bitfile *ld, int16_t *sp); static uint8_t huffman_2step_quad(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_2step_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_2step_pair(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_2step_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_quad(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_quad_sign(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_pair(uint8_t cb, bitfile *ld, int16_t *sp); static uint8_t huffman_binary_pair_sign(uint8_t cb, bitfile *ld, int16_t *sp); #if 0 static int16_t huffman_codebook(uint8_t i); #endif 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]; } return hcb_sf[offset][0]; } static const uint8_t hcbN[LAST_CB_IDX + 1] = { 0, 5, 5, 0, 5, 0, 5, 0, 5, 0, 6, 5}; static const hcb* hcb_table[LAST_CB_IDX + 1] = {NULL, hcb1_1, hcb2_1, NULL, hcb4_1, NULL, hcb6_1, NULL, hcb8_1, NULL, hcb10_1, hcb11_1}; static const hcb_2_quad* hcb_2_quad_table[LAST_CB_IDX + 1] = {NULL, hcb1_2, hcb2_2, NULL, hcb4_2, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; static const hcb_2_pair* hcb_2_pair_table[LAST_CB_IDX + 1] = {NULL, NULL, NULL, NULL, NULL, NULL, hcb6_2, NULL, hcb8_2, NULL, hcb10_2, hcb11_2}; static const hcb_bin_pair* hcb_bin_table[LAST_CB_IDX + 1] = {NULL, NULL, NULL, NULL, NULL, hcb5, NULL, hcb7, NULL, hcb9, NULL, NULL}; /* hcb3 is the unique case */ /* defines whether a huffman codebook is unsigned or not */ /* Table 4.6.2 */ static uint8_t unsigned_cb[32] = { 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 }; static INLINE void huffman_sign_bits(bitfile *ld, int16_t *sp, uint8_t len) { uint8_t i; for (i = 0; i < len; i++) { if(sp[i]) { if(faad_get1bit(ld DEBUGVAR(1,5,"huffman_sign_bits(): sign bit")) & 1) { sp[i] = -sp[i]; } } } } static INLINE uint8_t huffman_getescape(bitfile *ld, int16_t *sp) { uint8_t neg, i; int16_t j; int16_t off; int16_t x = *sp; if (x < 0) { if (x != -16) return 0; neg = 1; } else { if (x != 16) return 0; neg = 0; } for (i = 4; i < 16; i++) { if (faad_get1bit(ld DEBUGVAR(1,6,"huffman_getescape(): escape size")) == 0) { break; } } if (i >= 16) return 10; off = (int16_t)faad_getbits(ld, i DEBUGVAR(1,9,"huffman_getescape(): escape")); j = off | (1<> 16) & 0xFFFF; else return (int16_t)data & 0xFFFF; } #endif 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); /* Codebook 12 is disallowed, see `section_data` */ #if 0 case 12: { uint8_t err = huffman_2step_pair(11, ld, sp); sp[0] = huffman_codebook(0); sp[1] = huffman_codebook(1); return err; } #endif case 11: { uint8_t err = huffman_2step_pair_sign(11, ld, sp); if (!err) err = huffman_getescape(ld, &sp[0]); if (!err) err = huffman_getescape(ld, &sp[1]); return err; } #ifdef ERROR_RESILIENCE /* VCB11 uses codebook 11 */ case 16: case 17: case 18: case 19: case 20: case 21: case 22: case 23: case 24: case 25: case 26: case 27: case 28: case 29: case 30: case 31: { uint8_t err = huffman_2step_pair_sign(11, ld, sp); if (!err) err = huffman_getescape(ld, &sp[0]); if (!err) err = huffman_getescape(ld, &sp[1]); /* check LAV (Largest Absolute Value) */ /* this finds errors in the ESCAPE signal */ vcb11_check_LAV(cb, sp); return err; } #endif default: /* Non existent codebook number, something went wrong */ return 11; } /* return 0; */ } #ifdef ERROR_RESILIENCE /* Special version of huffman_spectral_data Will not read from a bitfile but a bits_t structure. Will keep track of the bits decoded and return the number of bits remaining. Do not read more than ld->len, return -1 if codeword would be longer */ int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp) { uint32_t cw; uint16_t offset = 0; uint8_t extra_bits; uint8_t vcb11 = 0; switch (cb) { case 1: /* 2-step method for data quadruples */ case 2: case 4: { const hcb* root; uint8_t root_bits; const hcb_2_quad* table; #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION if (hcbN[cb] == 0) __builtin_trap(); if (hcb_table[cb] == NULL) __builtin_trap(); if (hcb_2_quad_table[cb] == NULL) __builtin_trap(); // In other words, `cb` is one of [1, 2, 4]. #endif root = hcb_table[cb]; root_bits = hcbN[cb]; table = hcb_2_quad_table[cb]; cw = showbits_hcr(ld, root_bits); offset = root[cw].offset; extra_bits = root[cw].extra_bits; if (extra_bits) { /* We know for sure it's more than root_bits bits long. */ if (flushbits_hcr(ld, root_bits)) return -1; offset += (uint16_t)showbits_hcr(ld, extra_bits); if (flushbits_hcr(ld, table[offset].bits - root_bits)) return -1; } else { if (flushbits_hcr(ld, table[offset].bits)) return -1; } sp[0] = table[offset].x; sp[1] = table[offset].y; sp[2] = table[offset].v; sp[3] = table[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: { const hcb* root; uint8_t root_bits; const hcb_2_pair* table; if (cb >= 16) { /* store the virtual codebook */ vcb11 = cb; cb = 11; } #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION if (hcbN[cb] == 0) __builtin_trap(); if (hcb_table[cb] == NULL) __builtin_trap(); if (hcb_2_pair_table[cb] == NULL) __builtin_trap(); // In other words, `cb` is one of [6, 8, 10, 11]. #endif root = hcb_table[cb]; root_bits = hcbN[cb]; table = hcb_2_pair_table[cb]; cw = showbits_hcr(ld, root_bits); offset = root[cw].offset; extra_bits = root[cw].extra_bits; if (extra_bits) { /* we know for sure it's more than hcbN[cb] bits long */ if (flushbits_hcr(ld, root_bits)) return -1; offset += (uint16_t)showbits_hcr(ld, extra_bits); if (flushbits_hcr(ld, table[offset].bits - root_bits)) return -1; } else { if ( flushbits_hcr(ld, table[offset].bits)) return -1; } sp[0] = table[offset].x; sp[1] = table[offset].y; break; } case 3: { /* binary search for data quadruples */ const hcb_bin_quad* table = hcb3; while (!table[offset].is_leaf) { uint8_t b; if (get1bit_hcr(ld, &b)) return -1; offset += table[offset].data[b]; } sp[0] = table[offset].data[0]; sp[1] = table[offset].data[1]; sp[2] = table[offset].data[2]; sp[3] = table[offset].data[3]; break; } case 5: /* binary search for data pairs */ case 7: case 9: { const hcb_bin_pair* table = hcb_bin_table[cb]; while (!table[offset].is_leaf) { uint8_t b; if (get1bit_hcr(ld, &b) ) return -1; offset += table[offset].data[b]; } sp[0] = table[offset].data[0]; sp[1] = table[offset].data[1]; break; }} /* decode sign bits */ if (unsigned_cb[cb]) { uint8_t i; 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 (i > 32) return -1; if (getbits_hcr(ld, i, &off)) return -1; j = off + (1<len; } #endif faad2-2.11.2/libfaad/huffman.h000066400000000000000000000031371476153623600157520ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: huffman.h,v 1.28 2007/11/01 12:33:30 menno Exp $ **/ #ifndef __HUFFMAN_H__ #define __HUFFMAN_H__ #ifdef __cplusplus extern "C" { #endif int8_t huffman_scale_factor(bitfile *ld); uint8_t huffman_spectral_data(uint8_t cb, bitfile *ld, int16_t *sp); #ifdef ERROR_RESILIENCE int8_t huffman_spectral_data_2(uint8_t cb, bits_t *ld, int16_t *sp); #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ic_predict.c000066400000000000000000000160651476153623600164320ustar00rootroot00000000000000/* ** 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 uint32_t float_to_bits(float32_t f32) { uint32_t u32; memcpy(&u32, &f32, 4); return u32; } static float32_t bits_to_float(uint32_t u32) { float32_t f32; memcpy(&f32, &u32, 4); return f32; } static float32_t flt_round(float32_t pf) { int32_t flg; uint32_t tmp, tmp1, tmp2; tmp = float_to_bits(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 */ return bits_to_float(tmp1) + bits_to_float(tmp2) - bits_to_float(tmp); } else { return bits_to_float(tmp); } } static int16_t quant_pred(float32_t x) { return (int16_t)(float_to_bits(x) >> 16); } static float32_t inv_quant_pred(int16_t q) { uint16_t u16 = (uint16_t)q; return bits_to_float((uint32_t)u16 << 16); } static void ic_predict(pred_state *state, real_t input, real_t *output, uint8_t pred) { #ifdef FIXED_POINT // main codepath is simply not ready for FIXED_POINT, better not to run it at all. if (pred) *output = input; #else 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]; predictedvalue = 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]); #endif } static void reset_pred_state(pred_state *state) { state->r[0] = 0; state->r[1] = 0; state->COR[0] = 0; state->COR[1] = 0; state->VAR[0] = 0x3F80; state->VAR[1] = 0x3F80; } void pns_reset_pred_state(ic_stream *ics, pred_state *state) { uint8_t sfb, g, b; uint16_t i, offs, offs2; /* prediction only for long blocks */ if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) return; for (g = 0; g < ics->num_window_groups; g++) { for (b = 0; b < ics->window_group_length[g]; b++) { for (sfb = 0; sfb < ics->max_sfb; sfb++) { if (is_noise(ics, g, sfb)) { offs = ics->swb_offset[sfb]; offs2 = min(ics->swb_offset[sfb+1], ics->swb_offset_max); for (i = offs; i < offs2; i++) reset_pred_state(&state[i]); } } } } } void reset_all_predictors(pred_state *state, uint16_t frame_len) { uint16_t i; for (i = 0; i < frame_len; i++) reset_pred_state(&state[i]); } /* intra channel prediction */ void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, uint16_t frame_len, uint8_t sf_index) { uint8_t sfb; uint16_t bin; if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { reset_all_predictors(state, frame_len); } else { for (sfb = 0; sfb < max_pred_sfb(sf_index); sfb++) { uint16_t low = ics->swb_offset[sfb]; uint16_t high = min(ics->swb_offset[sfb+1], ics->swb_offset_max); for (bin = low; bin < high; bin++) { ic_predict(&state[bin], spec[bin], &spec[bin], (ics->predictor_data_present && ics->pred.prediction_used[sfb])); } } if (ics->predictor_data_present) { if (ics->pred.predictor_reset) { for (bin = ics->pred.predictor_reset_group_number - 1; bin < frame_len; bin += 30) { reset_pred_state(&state[bin]); } } } } } #endif faad2-2.11.2/libfaad/ic_predict.h000066400000000000000000000341161476153623600164340ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ic_predict.h,v 1.23 2007/11/01 12:33:31 menno Exp $ **/ #ifdef MAIN_DEC #ifndef __IC_PREDICT_H__ #define __IC_PREDICT_H__ #ifdef __cplusplus extern "C" { #endif #define ALPHA REAL_CONST(0.90625) #define A REAL_CONST(0.953125) void pns_reset_pred_state(ic_stream *ics, pred_state *state); void reset_all_predictors(pred_state *state, uint16_t frame_len); void ic_prediction(ic_stream *ics, real_t *spec, pred_state *state, uint16_t frame_len, uint8_t sf_index); ALIGN static const real_t mnt_table[128] = { COEF_CONST(0.9531250000), COEF_CONST(0.9453125000), COEF_CONST(0.9375000000), COEF_CONST(0.9296875000), COEF_CONST(0.9257812500), COEF_CONST(0.9179687500), COEF_CONST(0.9101562500), COEF_CONST(0.9023437500), COEF_CONST(0.8984375000), COEF_CONST(0.8906250000), COEF_CONST(0.8828125000), COEF_CONST(0.8789062500), COEF_CONST(0.8710937500), COEF_CONST(0.8671875000), COEF_CONST(0.8593750000), COEF_CONST(0.8515625000), COEF_CONST(0.8476562500), COEF_CONST(0.8398437500), COEF_CONST(0.8359375000), COEF_CONST(0.8281250000), COEF_CONST(0.8242187500), COEF_CONST(0.8203125000), COEF_CONST(0.8125000000), COEF_CONST(0.8085937500), COEF_CONST(0.8007812500), COEF_CONST(0.7968750000), COEF_CONST(0.7929687500), COEF_CONST(0.7851562500), COEF_CONST(0.7812500000), COEF_CONST(0.7773437500), COEF_CONST(0.7734375000), COEF_CONST(0.7656250000), COEF_CONST(0.7617187500), COEF_CONST(0.7578125000), COEF_CONST(0.7539062500), COEF_CONST(0.7500000000), COEF_CONST(0.7421875000), COEF_CONST(0.7382812500), COEF_CONST(0.7343750000), COEF_CONST(0.7304687500), COEF_CONST(0.7265625000), COEF_CONST(0.7226562500), COEF_CONST(0.7187500000), COEF_CONST(0.7148437500), COEF_CONST(0.7109375000), COEF_CONST(0.7070312500), COEF_CONST(0.6992187500), COEF_CONST(0.6953125000), COEF_CONST(0.6914062500), COEF_CONST(0.6875000000), COEF_CONST(0.6835937500), COEF_CONST(0.6796875000), COEF_CONST(0.6796875000), COEF_CONST(0.6757812500), COEF_CONST(0.6718750000), COEF_CONST(0.6679687500), COEF_CONST(0.6640625000), COEF_CONST(0.6601562500), COEF_CONST(0.6562500000), COEF_CONST(0.6523437500), COEF_CONST(0.6484375000), COEF_CONST(0.6445312500), COEF_CONST(0.6406250000), COEF_CONST(0.6406250000), COEF_CONST(0.6367187500), COEF_CONST(0.6328125000), COEF_CONST(0.6289062500), COEF_CONST(0.6250000000), COEF_CONST(0.6210937500), COEF_CONST(0.6210937500), COEF_CONST(0.6171875000), COEF_CONST(0.6132812500), COEF_CONST(0.6093750000), COEF_CONST(0.6054687500), COEF_CONST(0.6054687500), COEF_CONST(0.6015625000), COEF_CONST(0.5976562500), COEF_CONST(0.5937500000), COEF_CONST(0.5937500000), COEF_CONST(0.5898437500), COEF_CONST(0.5859375000), COEF_CONST(0.5820312500), COEF_CONST(0.5820312500), COEF_CONST(0.5781250000), COEF_CONST(0.5742187500), COEF_CONST(0.5742187500), COEF_CONST(0.5703125000), COEF_CONST(0.5664062500), COEF_CONST(0.5664062500), COEF_CONST(0.5625000000), COEF_CONST(0.5585937500), COEF_CONST(0.5585937500), COEF_CONST(0.5546875000), COEF_CONST(0.5507812500), COEF_CONST(0.5507812500), COEF_CONST(0.5468750000), COEF_CONST(0.5429687500), COEF_CONST(0.5429687500), COEF_CONST(0.5390625000), COEF_CONST(0.5390625000), COEF_CONST(0.5351562500), COEF_CONST(0.5312500000), COEF_CONST(0.5312500000), COEF_CONST(0.5273437500), COEF_CONST(0.5273437500), COEF_CONST(0.5234375000), COEF_CONST(0.5195312500), COEF_CONST(0.5195312500), COEF_CONST(0.5156250000), COEF_CONST(0.5156250000), COEF_CONST(0.5117187500), COEF_CONST(0.5117187500), COEF_CONST(0.5078125000), COEF_CONST(0.5078125000), COEF_CONST(0.5039062500), COEF_CONST(0.5039062500), COEF_CONST(0.5000000000), COEF_CONST(0.4980468750), COEF_CONST(0.4960937500), COEF_CONST(0.4941406250), COEF_CONST(0.4921875000), COEF_CONST(0.4902343750), COEF_CONST(0.4882812500), COEF_CONST(0.4863281250), COEF_CONST(0.4843750000), COEF_CONST(0.4824218750), COEF_CONST(0.4804687500), COEF_CONST(0.4785156250) }; ALIGN static const real_t exp_table[128] = { COEF_CONST(0.50000000000000000000000000000000000000000000000000), COEF_CONST(0.25000000000000000000000000000000000000000000000000), COEF_CONST(0.12500000000000000000000000000000000000000000000000), COEF_CONST(0.06250000000000000000000000000000000000000000000000), COEF_CONST(0.03125000000000000000000000000000000000000000000000), COEF_CONST(0.01562500000000000000000000000000000000000000000000), COEF_CONST(0.00781250000000000000000000000000000000000000000000), COEF_CONST(0.00390625000000000000000000000000000000000000000000), COEF_CONST(0.00195312500000000000000000000000000000000000000000), COEF_CONST(0.00097656250000000000000000000000000000000000000000), COEF_CONST(0.00048828125000000000000000000000000000000000000000), COEF_CONST(0.00024414062500000000000000000000000000000000000000), COEF_CONST(0.00012207031250000000000000000000000000000000000000), COEF_CONST(0.00006103515625000000000000000000000000000000000000), COEF_CONST(0.00003051757812500000000000000000000000000000000000), COEF_CONST(0.00001525878906250000000000000000000000000000000000), COEF_CONST(0.00000762939453125000000000000000000000000000000000), COEF_CONST(0.00000381469726562500000000000000000000000000000000), COEF_CONST(0.00000190734863281250000000000000000000000000000000), COEF_CONST(0.00000095367431640625000000000000000000000000000000), COEF_CONST(0.00000047683715820312500000000000000000000000000000), COEF_CONST(0.00000023841857910156250000000000000000000000000000), COEF_CONST(0.00000011920928955078125000000000000000000000000000), COEF_CONST(0.00000005960464477539062500000000000000000000000000), COEF_CONST(0.00000002980232238769531300000000000000000000000000), COEF_CONST(0.00000001490116119384765600000000000000000000000000), COEF_CONST(0.00000000745058059692382810000000000000000000000000), COEF_CONST(0.00000000372529029846191410000000000000000000000000), COEF_CONST(0.00000000186264514923095700000000000000000000000000), COEF_CONST(0.00000000093132257461547852000000000000000000000000), COEF_CONST(0.00000000046566128730773926000000000000000000000000), COEF_CONST(0.00000000023283064365386963000000000000000000000000), COEF_CONST(0.00000000011641532182693481000000000000000000000000), COEF_CONST(0.00000000005820766091346740700000000000000000000000), COEF_CONST(0.00000000002910383045673370400000000000000000000000), COEF_CONST(0.00000000001455191522836685200000000000000000000000), COEF_CONST(0.00000000000727595761418342590000000000000000000000), COEF_CONST(0.00000000000363797880709171300000000000000000000000), COEF_CONST(0.00000000000181898940354585650000000000000000000000), COEF_CONST(0.00000000000090949470177292824000000000000000000000), COEF_CONST(0.00000000000045474735088646412000000000000000000000), COEF_CONST(0.00000000000022737367544323206000000000000000000000), COEF_CONST(0.00000000000011368683772161603000000000000000000000), COEF_CONST(0.00000000000005684341886080801500000000000000000000), COEF_CONST(0.00000000000002842170943040400700000000000000000000), COEF_CONST(0.00000000000001421085471520200400000000000000000000), COEF_CONST(0.00000000000000710542735760100190000000000000000000), COEF_CONST(0.00000000000000355271367880050090000000000000000000), COEF_CONST(0.00000000000000177635683940025050000000000000000000), COEF_CONST(0.00000000000000088817841970012523000000000000000000), COEF_CONST(0.00000000000000044408920985006262000000000000000000), COEF_CONST(0.00000000000000022204460492503131000000000000000000), COEF_CONST(0.00000000000000011102230246251565000000000000000000), COEF_CONST(0.00000000000000005551115123125782700000000000000000), COEF_CONST(0.00000000000000002775557561562891400000000000000000), COEF_CONST(0.00000000000000001387778780781445700000000000000000), COEF_CONST(0.00000000000000000693889390390722840000000000000000), COEF_CONST(0.00000000000000000346944695195361420000000000000000), COEF_CONST(0.00000000000000000173472347597680710000000000000000), COEF_CONST(0.00000000000000000086736173798840355000000000000000), COEF_CONST(0.00000000000000000043368086899420177000000000000000), COEF_CONST(0.00000000000000000021684043449710089000000000000000), COEF_CONST(0.00000000000000000010842021724855044000000000000000), COEF_CONST(0.00000000000000000005421010862427522200000000000000), COEF_CONST(0.00000000000000000002710505431213761100000000000000), COEF_CONST(0.00000000000000000001355252715606880500000000000000), COEF_CONST(0.00000000000000000000677626357803440270000000000000), COEF_CONST(0.00000000000000000000338813178901720140000000000000), COEF_CONST(0.00000000000000000000169406589450860070000000000000), COEF_CONST(0.00000000000000000000084703294725430034000000000000), COEF_CONST(0.00000000000000000000042351647362715017000000000000), COEF_CONST(0.00000000000000000000021175823681357508000000000000), COEF_CONST(0.00000000000000000000010587911840678754000000000000), COEF_CONST(0.00000000000000000000005293955920339377100000000000), COEF_CONST(0.00000000000000000000002646977960169688600000000000), COEF_CONST(0.00000000000000000000001323488980084844300000000000), COEF_CONST(0.00000000000000000000000661744490042422140000000000), COEF_CONST(0.00000000000000000000000330872245021211070000000000), COEF_CONST(0.00000000000000000000000165436122510605530000000000), COEF_CONST(0.00000000000000000000000082718061255302767000000000), COEF_CONST(0.00000000000000000000000041359030627651384000000000), COEF_CONST(0.00000000000000000000000020679515313825692000000000), COEF_CONST(0.00000000000000000000000010339757656912846000000000), COEF_CONST(0.00000000000000000000000005169878828456423000000000), COEF_CONST(0.00000000000000000000000002584939414228211500000000), COEF_CONST(0.00000000000000000000000001292469707114105700000000), COEF_CONST(0.00000000000000000000000000646234853557052870000000), COEF_CONST(0.00000000000000000000000000323117426778526440000000), COEF_CONST(0.00000000000000000000000000161558713389263220000000), COEF_CONST(0.00000000000000000000000000080779356694631609000000), COEF_CONST(0.00000000000000000000000000040389678347315804000000), COEF_CONST(0.00000000000000000000000000020194839173657902000000), COEF_CONST(0.00000000000000000000000000010097419586828951000000), COEF_CONST(0.00000000000000000000000000005048709793414475600000), COEF_CONST(0.00000000000000000000000000002524354896707237800000), COEF_CONST(0.00000000000000000000000000001262177448353618900000), COEF_CONST(0.00000000000000000000000000000631088724176809440000), COEF_CONST(0.00000000000000000000000000000315544362088404720000), COEF_CONST(0.00000000000000000000000000000157772181044202360000), COEF_CONST(0.00000000000000000000000000000078886090522101181000), COEF_CONST(0.00000000000000000000000000000039443045261050590000), COEF_CONST(0.00000000000000000000000000000019721522630525295000), COEF_CONST(0.00000000000000000000000000000009860761315262647600), COEF_CONST(0.00000000000000000000000000000004930380657631323800), COEF_CONST(0.00000000000000000000000000000002465190328815661900), COEF_CONST(0.00000000000000000000000000000001232595164407830900), COEF_CONST(0.00000000000000000000000000000000616297582203915470), COEF_CONST(0.00000000000000000000000000000000308148791101957740), COEF_CONST(0.00000000000000000000000000000000154074395550978870), COEF_CONST(0.00000000000000000000000000000000077037197775489434), COEF_CONST(0.00000000000000000000000000000000038518598887744717), COEF_CONST(0.00000000000000000000000000000000019259299443872359), COEF_CONST(0.00000000000000000000000000000000009629649721936179), COEF_CONST(0.00000000000000000000000000000000004814824860968090), COEF_CONST(0.00000000000000000000000000000000002407412430484045), COEF_CONST(0.00000000000000000000000000000000001203706215242022), COEF_CONST(0.00000000000000000000000000000000000601853107621011), COEF_CONST(0.00000000000000000000000000000000000300926553810506), COEF_CONST(0.00000000000000000000000000000000000150463276905253), COEF_CONST(0.00000000000000000000000000000000000075231638452626), COEF_CONST(0.00000000000000000000000000000000000037615819226313), COEF_CONST(0.00000000000000000000000000000000000018807909613157), COEF_CONST(0.00000000000000000000000000000000000009403954806578), COEF_CONST(0.00000000000000000000000000000000000004701977403289), COEF_CONST(0.00000000000000000000000000000000000002350988701645), COEF_CONST(0.00000000000000000000000000000000000001175494350822), COEF_CONST(0.0 /* 0000000000000000000000000000000000000587747175411 "floating point underflow" */), COEF_CONST(0.0) }; #ifdef __cplusplus } #endif #endif #endif faad2-2.11.2/libfaad/iq_table.h000066400000000000000000020001121476153623600160760ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: iq_table.h,v 1.20 2007/11/01 12:33:31 menno Exp $ **/ #ifndef IQ_TABLE_H__ #define IQ_TABLE_H__ #ifdef __cplusplus extern "C" { #endif /* !!!DON'T CHANGE IQ_TABLE_SIZE!!! */ #ifndef FIXED_POINT #define IQ_TABLE_SIZE 8192 #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = { 0, 1, 2.5198420997897464, 4.3267487109222245, 6.3496042078727974, 8.5498797333834844, 10.902723556992836, 13.390518279406722, 15.999999999999998, 18.720754407467133, 21.544346900318832, 24.463780996262464, 27.47314182127996, 30.567350940369842, 33.741991698453212, 36.993181114957046, 40.317473596635935, 43.711787041189993, 47.173345095760126, 50.699631325716943, 54.288352331898118, 57.937407704003519, 61.6448652744185, 65.408940536585988, 69.227979374755591, 73.100443455321638, 77.024897778591622, 80.999999999999986, 85.024491212518527, 89.097187944889555, 93.216975178615741, 97.382800224133163, 101.59366732596474, 105.84863288986224, 110.14680124343441, 114.4873208566006, 118.86938096020653, 123.29220851090024, 127.75506545836058, 132.25724627755247, 136.79807573413572, 141.37690685569191, 145.99311908523086, 150.6461165966291, 155.33532675434674, 160.06019870205279, 164.82020206673349, 169.61482576651861, 174.44357691188537, 179.30597979112557, 184.20157493201927, 189.12991823257562, 194.09058015449685, 199.08314497371677, 204.1072100829694, 209.16238534187647, 214.24829247050752, 219.36456448277784, 224.51084515641216, 229.6867885365223, 234.89205847013176, 240.12632816923249, 245.38927980018505, 250.68060409747261, 255.99999999999991, 261.34717430828869, 266.72184136106449, 272.12372272986045, 277.55254693037961, 283.0080491494619, 288.48997098659891, 293.99806020902247, 299.53207051947408, 305.0917613358298, 310.67689758182206, 316.28724948815585, 321.92259240337177, 327.58270661385535, 333.26737717243742, 338.97639373507025, 344.70955040510125, 350.46664558470013, 356.24748183302603, 362.05186573075139, 367.87960775058258, 373.73052213344511, 379.60442677002078, 385.50114308734607, 391.42049594019937, 397.36231350702371, 403.32642719014467, 409.31267152006262, 415.32088406360799, 421.35090533576471, 427.40257871497619, 433.4757503617617, 439.5702691404793, 445.68598654408271, 451.82275662172759, 457.98043590909128, 464.15888336127773, 470.35796028818726, 476.5775302922363, 482.81745920832043, 489.07761504591741, 495.35786793323581, 501.65809006331688, 507.97815564200368, 514.31794083769648, 520.67732373281672, 527.05618427690604, 533.45440424129174, 539.87186717525128, 546.30845836361505, 552.76406478574609, 559.23857507584194, 565.73187948450413, 572.24386984152341, 578.77443951983378, 585.32348340058843, 591.89089783931263, 598.47658063309257, 605.08043098876044, 611.70234949203643, 618.3422380775919, 624.99999999999977, 631.67553980553748, 638.36876330481164, 645.07957754617485, 651.80789078990415, 658.55361248311499, 665.31665323538357, 672.09692479505225, 678.8943400261943, 685.70881288621433, 692.540258404062, 699.38859265903977, 706.25373276018058, 713.13559682617972, 720.03410396586037, 726.94917425915435, 733.88072873858209, 740.82868937121543, 747.79297904110535, 754.77352153216191, 761.77024151147043, 768.78306451302956, 775.81191692189896, 782.85672595874246, 789.91741966475445, 796.99392688695798, 804.08617726386274, 811.19410121147098, 818.31762990962227, 825.45669528866563, 832.61123001644864, 839.78116748561604, 846.96644180120552, 854.16698776853514, 861.38274088137143, 868.61363731036977, 875.85961389178203, 883.12060811641959, 890.39655811886757, 897.68740266694181, 904.99308115138172, 912.31353357577188, 919.64870054668756, 926.99852326405619, 934.36294351172899, 941.74190364825859, 949.13534659787422, 956.54321584165211, 963.96545540887348, 971.40200986856541, 978.85282432122176, 986.31784439069588, 993.7970162162635, 1001.29028644485, 1008.797602223418, 1016.3189111915103, 1023.8541614739464, 1031.4033016736653, 1038.9662808647138, 1046.5430485853758, 1054.1335548314366, 1061.7377500495838, 1069.3555851309357, 1076.9870114046978, 1084.6319806319441, 1092.2904449995174, 1099.9623571140482, 1107.6476699960892, 1115.3463370743607, 1123.058312180106, 1130.7835495415541, 1138.5220037784854, 1146.273629896901, 1154.0383832837879, 1161.816219701986, 1169.607095285146, 1177.4109665327808, 1185.2277903054078, 1193.0575238197798, 1200.9001246442001, 1208.7555506939248, 1216.6237602266442, 1224.5047118380478, 1232.3983644574657, 1240.3046773435874, 1248.2236100802568, 1256.1551225723395, 1264.099175041662, 1272.0557280230228, 1280.0247423602691, 1288.0061792024444, 1295.9999999999995, 1304.006166501068, 1312.0246407478062, 1320.0553850727929, 1328.0983620954903, 1336.1535347187651, 1344.2208661254647, 1352.3003197750522, 1360.3918594002962, 1368.4954490040145, 1376.6110528558709, 1384.7386354892244, 1392.8781616980295, 1401.0295965337855, 1409.1929053025353, 1417.3680535619119, 1425.5550071182327, 1433.7537320236374, 1441.9641945732744, 1450.1863613025282, 1458.4201989842913, 1466.6656746262797, 1474.9227554683875, 1483.1914089800841, 1491.4716028578516, 1499.7633050226596, 1508.0664836174794, 1516.3811070048375, 1524.7071437644029, 1533.0445626906128, 1541.3933327903342, 1549.7534232805581, 1558.1248035861302, 1566.507443337515, 1574.9013123685909, 1583.3063807144795, 1591.7226186094069, 1600.1499964845941, 1608.58848496618, 1617.0380548731737, 1625.4986772154357, 1633.9703231916887, 1642.4529641875577, 1650.9465717736346, 1659.4511177035752, 1667.9665739122186, 1676.4929125137353, 1685.030105799801, 1693.5781262377957, 1702.136946469027, 1710.7065393069795, 1719.2868777355877, 1727.8779349075323, 1736.4796841425596, 1745.092098925825, 1753.7151529062583, 1762.3488198949503, 1770.9930738635628, 1779.6478889427597, 1788.3132394206564, 1796.9890997412947, 1805.6754445031333, 1814.3722484575621, 1823.0794865074322, 1831.7971337056094, 1840.5251652535437, 1849.2635564998579, 1858.0122829389563, 1866.7713202096493, 1875.5406440937966, 1884.3202305149687, 1893.110055537124, 1901.9100953633042, 1910.7203263343454, 1919.5407249276057, 1928.3712677557098, 1937.2119315653083, 1946.0626932358525, 1954.923529778386, 1963.79441833435, 1972.6753361744036, 1981.5662606972594, 1990.467169428533, 1999.3780400196069, 2008.2988502465078, 2017.2295780087982, 2026.1702013284819, 2035.1206983489212, 2044.0810473337688, 2053.0512266659125, 2062.0312148464309, 2071.0209904935646, 2080.0205323416958, 2089.0298192403443, 2098.0488301531714, 2107.0775441569995, 2116.115940440839, 2125.1639983049317, 2134.2216971597995, 2143.2890165253098, 2152.3659360297484, 2161.4524354089031, 2170.5484945051617, 2179.6540932666144, 2188.7692117461711, 2197.8938301006888, 2207.0279285901042, 2216.1714875765838, 2225.324487523676, 2234.4869089954782, 2243.6587326558101, 2252.8399392673982, 2262.0305096910702, 2271.2304248849537, 2280.4396659036897, 2289.6582138976523, 2298.8860501121762, 2308.1231558867926, 2317.3695126544767, 2326.6251019409005, 2335.8899053636933, 2345.1639046317132, 2354.4470815443233, 2363.7394179906792, 2373.0408959490205, 2382.3514974859731, 2391.6712047558558, 2400.9999999999991, 2410.3378655460651, 2419.6847838073813, 2429.0407372822747, 2438.4057085534191, 2447.7796802871858, 2457.1626352330004, 2466.5545562227112, 2475.9554261699564, 2485.3652280695474, 2494.7839449968492, 2504.2115601071737, 2513.6480566351788, 2523.0934178942675, 2532.5476272760025, 2542.0106682495189, 2551.482524360948, 2560.9631792328441, 2570.4526165636184, 2579.9508201269791, 2589.4577737713744, 2598.9734614194458, 2608.4978670674823, 2618.0309747848837, 2627.5727687136259, 2637.1232330677353, 2646.6823521327647, 2656.2501102652768, 2665.8264918923328, 2675.4114815109842, 2685.0050636877722, 2694.6072230582295, 2704.2179443263894, 2713.8372122642972, 2723.4650117115279, 2733.1013275747096, 2742.7461448270483, 2752.3994485078601, 2762.0612237221085, 2771.7314556399419, 2781.4101294962406, 2791.0972305901655, 2800.7927442847094, 2810.4966560062589, 2820.2089512441521, 2829.9296155502466, 2839.6586345384894, 2849.3959938844923, 2859.1416793251065, 2868.8956766580086, 2878.6579717412847, 2888.4285504930212, 2898.2073988908974, 2907.9945029717837, 2917.789848831344, 2927.5934226236377, 2937.4052105607311, 2947.2251989123079, 2957.0533740052865, 2966.8897222234368, 2976.734230007005, 2986.5868838523397, 2996.4476703115197, 3006.3165759919889, 3016.1935875561908, 3026.0786917212095, 3035.9718752584108, 3045.8731249930906, 3055.7824278041207, 3065.6997706236039, 3075.625140436528, 3085.5585242804245, 3095.4999092450298, 3105.4492824719491, 3115.4066311543256, 3125.3719425365089, 3135.3452039137287, 3145.3264026317715, 3155.3155260866592, 3165.3125617243295, 3175.3174970403229, 3185.3303195794679, 3195.35101693557, 3205.3795767511078, 3215.4159867169251, 3225.460234571929, 3235.5123081027928, 3245.5721951436558, 3255.63988357583, 3265.7153613275095, 3275.7986163734795, 3285.8896367348289, 3295.9884104786665, 3306.0949257178395, 3316.2091706106517, 3326.331133360588, 3336.4608022160378, 3346.5981654700231, 3356.7432114599264, 3366.8959285672249, 3377.0563052172211, 3387.2243298787821, 3397.3999910640764, 3407.5832773283128, 3417.7741772694862, 3427.9726795281199, 3438.1787727870123, 3448.3924457709873, 3458.6136872466445, 3468.8424860221107, 3479.0788309467976, 3489.3227109111554, 3499.5741148464344, 3509.8330317244445, 3520.0994505573185, 3530.3733603972751, 3540.6547503363886, 3550.9436095063534, 3561.239927078258, 3571.5436922623535, 3581.8548943078308, 3592.1735225025936, 3602.4995661730372, 3612.8330146838275, 3623.1738574376814, 3633.5220838751502, 3643.8776834744031, 3654.2406457510142, 3664.6109602577494, 3674.9886165843564, 3685.3736043573545, 3695.7659132398294, 3706.1655329312248, 3716.5724531671399, 3726.9866637191262, 3737.4081543944876, 3747.8369150360782, 3758.2729355221072, 3768.7162057659411, 3779.1667157159077, 3789.6244553551055, 3800.0894147012082, 3810.5615838062768, 3821.0409527565694, 3831.5275116723533, 3842.0212507077194, 3852.522160050396, 3863.0302299215673, 3873.5454505756893, 3884.0678123003108, 3894.5973054158922, 3905.1339202756285, 3915.6776472652732, 3926.2284768029604, 3936.7863993390338, 3947.3514053558706, 3957.9234853677135, 3968.5026299204969, 3979.0888295916798, 3989.6820749900776, 4000.2823567556948, 4010.8896655595613, 4021.5039921035655, 4032.1253271202945, 4042.7536613728694, 4053.3889856547858, 4064.0312907897551, 4074.6805676315448, 4085.3368070638221, 4095.9999999999982, 4106.6701373830711, 4117.347210185475, 4128.0312094089259, 4138.722126084268, 4149.4199512713267, 4160.1246760587583, 4170.8362915638982, 4181.5547889326181, 4192.2801593391769, 4203.0123939860741, 4213.7514841039101, 4224.4974209512384, 4235.2501958144258, 4246.0098000075095, 4256.7762248720574, 4267.549461777031, 4278.3295021186423, 4289.1163373202198, 4299.9099588320714, 4310.7103581313495, 4321.5175267219138, 4332.3314561342004, 4343.152137925088, 4353.9795636777671, 4364.8137250016052, 4375.6546135320223, 4386.5022209303588, 4397.3565388837469, 4408.2175591049827, 4419.0852733324018, 4429.9596733297531, 4440.8407508860728, 4451.7284978155603, 4462.6229059574571, 4473.5239671759227, 4484.4316733599126, 4495.3460164230582, 4506.2669883035496, 4517.1945809640119, 4528.1287863913894, 4539.069596596828, 4550.0170036155587, 4560.9709995067806, 4571.931576353546, 4582.898726262647, 4593.8724413645004, 4604.8527138130348, 4615.8395357855816, 4626.8328994827571, 4637.8327971283588, 4648.8392209692511, 4659.8521632752563, 4670.8716163390473, 4681.8975724760394, 4692.9300240242837, 4703.9689633443595, 4715.0143828192668, 4726.0662748543255, 4737.1246318770682, 4748.1894463371373, 4759.2607107061804, 4770.3384174777493, 4781.4225591671993, 4792.5131283115852, 4803.6101174695614, 4814.7135192212854, 4825.8233261683154, 4836.9395309335096, 4848.0621261609349, 4859.1911045157631, 4870.3264586841779, 4881.4681813732768, 4892.6162653109768, 4903.7707032459193, 4914.931487947375, 4926.0986122051509, 4937.2720688294967, 4948.4518506510112, 4959.637950520555, 4970.8303613091521, 4982.0290759079044, 4993.2340872278974, 5004.4453882001153, 5015.6629717753467, 5026.8868309241007, 5038.1169586365131, 5049.353347922266, 5060.5959918104927, 5071.8448833496996, 5083.1000156076734, 5094.3613816713996, 5105.6289746469747, 5116.9027876595246, 5128.18281385312, 5139.4690463906918, 5150.7614784539473, 5162.0601032432933, 5173.3649139777472, 5184.6759038948594, 5195.9930662506322, 5207.3163943194386, 5218.6458813939435, 5229.9815207850224, 5241.3233058216847, 5252.6712298509919, 5264.025286237983, 5275.3854683655954, 5286.7517696345885, 5298.1241834634639, 5309.5027032883945, 5320.887322563146, 5332.2780347589978, 5343.6748333646756, 5355.0777118862716, 5366.4866638471722, 5377.901682787985, 5389.3227622664635, 5400.749895857437, 5412.1830771527357, 5423.622299761123, 5435.067557308219, 5446.5188434364318, 5457.9761518048872, 5469.4394760893592, 5480.9088099821975, 5492.3841471922606, 5503.8654814448455, 5515.3528064816201, 5526.846116060552, 5538.3454039558474, 5549.8506639578736, 5561.3618898731029, 5572.8790755240361, 5584.4022147491451, 5595.9313014027975, 5607.4663293552012, 5619.0072924923297, 5630.5541847158656, 5642.1069999431284, 5653.665732107017, 5665.230375155943, 5676.8009230537655, 5688.3773697797333, 5699.9597093284156, 5711.5479357096474, 5723.1420429484588, 5734.7420250850209, 5746.347876174581, 5757.9595902874016, 5769.5771615087006, 5781.2005839385911, 5792.8298516920213, 5804.4649588987149, 5816.1058997031105, 5827.7526682643065, 5839.4052587559972, 5851.0636653664196, 5862.7278822982908, 5874.3979037687541, 5886.0737240093204, 5897.7553372658094, 5909.4427377982956, 5921.1359198810505, 5932.8348778024874, 5944.5396058651031, 5956.2500983854261, 5967.9663496939575, 5979.6883541351208, 5991.4161060672022, 6003.1495998623004, 6014.8888299062692, 6026.6337905986684, 6038.3844763527022, 6050.1408815951781, 6061.9030007664414, 6073.6708283203316, 6085.4443587241267, 6097.2235864584891, 6109.0085060174197, 6120.7991119081998, 6132.595398651345, 6144.3973607805519, 6156.2049928426459, 6168.0182893975361, 6179.8372450181578, 6191.6618542904307, 6203.4921118132024, 6215.3280121982016, 6227.1695500699925, 6239.0167200659189, 6250.8695168360628, 6262.7279350431891, 6274.5919693627056, 6286.4616144826068, 6298.3368651034316, 6310.2177159382172, 6322.1041617124456, 6333.9961971640032, 6345.8938170431311, 6357.7970161123785, 6369.7057891465583, 6381.6201309327007, 6393.5400362700075, 6405.4654999698032, 6417.3965168554978, 6429.3330817625329, 6441.2751895383453, 6453.2228350423138, 6465.176013145724, 6477.134718731716, 6489.0989466952469, 6501.0686919430445, 6513.0439493935628, 6525.0247139769417, 6537.010980634961, 6549.002744321001, 6560.9999999999973, 6573.0027426483985, 6585.0109672541284, 6597.0246688165371, 6609.0438423463656, 6621.0684828657004, 6633.0985854079354, 6645.134145017727, 6657.1751567509573, 6669.2216156746908, 6681.2735168671343, 6693.3308554176001, 6705.3936264264594, 6717.461825005108, 6729.535446275926, 6741.6144853722335, 6753.6989374382601, 6765.7887976290967, 6777.8840611106634, 6789.9847230596661, 6802.0907786635626, 6814.2022231205201, 6826.3190516393797, 6838.4412594396181, 6850.5688417513074, 6862.701793815083, 6874.840110882099, 6886.9837882139991, 6899.1328210828724, 6911.2872047712199, 6923.4469345719199, 6935.6120057881863, 6947.7824137335365, 6959.9581537317536, 6972.1392211168532, 6984.3256112330409, 6996.5173194346862, 7008.7143410862773, 7020.9166715623942, 7033.1243062476678, 7045.3372405367481, 7057.5554698342685, 7069.7789895548103, 7082.0077951228714, 7094.2418819728273, 7106.4812455489018, 7118.7258813051285, 7130.9757847053224, 7143.2309512230404, 7155.4913763415516, 7167.7570555538041, 7180.0279843623894, 7192.3041582795131, 7204.5855728269571, 7216.8722235360519, 7229.1641059476406, 7241.4612156120484, 7253.7635480890503, 7266.0710989478375, 7278.3838637669869, 7290.7018381344296, 7303.0250176474174, 7315.3533979124932, 7327.6869745454596, 7340.0257431713462, 7352.3696994243801, 7364.7188389479543, 7377.0731573945968, 7389.4326504259407, 7401.7973137126937, 7414.1671429346061, 7426.5421337804428, 7438.922281947951, 7451.3075831438346, 7463.6980330837177, 7476.0936274921214, 7488.4943621024304, 7500.9002326568652, 7513.3112349064522, 7525.7273646109943, 7538.1486175390446, 7550.5749894678729, 7563.0064761834419, 7575.4430734803736, 7587.8847771619248, 7600.3315830399597, 7612.7834869349153, 7625.24048467578, 7637.7025721000637, 7650.1697450537677, 7662.6419993913596, 7675.1193309757446, 7687.6017356782404, 7700.0892093785433, 7712.5817479647112, 7725.079347333125, 7737.5820033884729, 7750.0897120437139, 7762.6024692200581, 7775.1202708469355, 7787.6431128619733, 7800.1709912109645, 7812.7039018478481, 7825.2418407346768, 7837.7848038415968, 7850.3327871468155, 7862.8857866365806, 7875.4437983051539, 7888.006818154784, 7900.5748421956796, 7913.1478664459901, 7925.725886931772, 7938.3088996869719, 7950.8969007533951, 7963.4898861806851, 7976.0878520262959, 7988.6907943554688, 8001.2987092412086, 8013.911592764257, 8026.5294410130691, 8039.1522500837891, 8051.7800160802271, 8064.412735113835, 8077.0504033036796, 8089.6930167764222, 8102.3405716662946, 8114.9930641150731, 8127.6504902720571, 8140.3128462940449, 8152.9801283453098, 8165.6523325975786, 8178.3294552300049, 8191.0114924291529, 8203.6984403889655, 8216.3902953107463, 8229.0870534031419, 8241.7887108821069, 8254.4952639708936, 8267.2067089000211, 8279.9230419072574, 8292.6442592375952, 8305.3703571432306, 8318.101331883543, 8330.8371797250657, 8343.577896941475, 8356.3234798135582, 8369.0739246291978, 8381.8292276833508, 8394.5893852780209, 8407.3543937222421, 8420.1242493320569, 8432.8989484304948, 8445.6784873475499, 8458.4628624201578, 8471.2520699921806, 8484.0461064143838, 8496.8449680444082, 8509.6486512467636, 8522.4571523927953, 8535.270467860666, 8548.0885940353437, 8560.9115273085663, 8573.7392640788403, 8586.5718007514006, 8599.4091337382069, 8612.2512594579148, 8625.0981743358552, 8637.9498748040205, 8650.8063573010386, 8663.6676182721567, 8676.533654169225, 8689.4044614506638, 8702.2800365814601, 8715.1603760331418, 8728.0454762837508, 8740.9353338178389, 8753.8299451264356, 8766.7293067070332, 8779.6334150635721, 8792.5422667064158, 8805.4558581523324, 8818.3741859244819, 8831.2972465523908, 8844.2250365719356, 8857.1575525253265, 8870.0947909610859, 8883.0367484340295, 8895.9834215052524, 8908.934806742107, 8921.8909007181846, 8934.8517000132997, 8947.817201213471, 8960.7874009109, 8973.7622957039603, 8986.7418821971733, 8999.7261570011924, 9012.7151167327884, 9025.7087580148236, 9038.7070774762469, 9051.7100717520643, 9064.7177374833282, 9077.7300713171153, 9090.7470699065179, 9103.7687299106146, 9116.7950479944648, 9129.8260208290812, 9142.8616450914233, 9155.9019174643727, 9168.9468346367157, 9181.9963933031358, 9195.0505901641845, 9208.1094219262741, 9221.1728853016557, 9234.240977008405, 9247.3136937704076, 9260.3910323173386, 9273.472989384647, 9286.5595617135423, 9299.6507460509747, 9312.7465391496207, 9325.8469377678684, 9338.9519386698012, 9352.0615386251757, 9365.1757344094131, 9378.2945228035842, 9391.4179005943843, 9404.5458645741273, 9417.6784115407263, 9430.8155382976747, 9443.9572416540359, 9457.1035184244265, 9470.2543654290002, 9483.4097794934296, 9496.5697574488931, 9509.7342961320664, 9522.9033923850911, 9536.0770430555804, 9549.2552449965824, 9562.4379950665825, 9575.6252901294793, 9588.8171270545736, 9602.0135027165488, 9615.2144139954635, 9628.4198577767274, 9641.629830951093, 9654.844330414644, 9668.0633530687719, 9681.286895820167, 9694.5149555808002, 9707.7475292679192, 9720.9846138040157, 9734.2262061168276, 9747.4723031393187, 9760.7229018096641, 9773.9779990712323, 9787.2375918725811, 9800.5016771674327, 9813.7702519146696, 9827.0433130783094, 9840.3208576275028, 9853.602882536512, 9866.8893847846994, 9880.1803613565116, 9893.4758092414686, 9906.7757254341523, 9920.0801069341851, 9933.3889507462245, 9946.7022538799429, 9960.0200133500221, 9973.3422261761298, 9986.6688893829159, 9999.9999999999945, 10013.335555061929, 10026.675551608221, 10040.019986683301, 10053.368857336509, 10066.722160622081, 10080.079893599144, 10093.442053331697, 10106.808636888598, 10120.179641343551, 10133.555063775095, 10146.934901266595, 10160.31915090622, 10173.707809786936, 10187.100875006496, 10200.498343667417, 10213.900212876984, 10227.306479747222, 10240.717141394889, 10254.132194941467, 10267.551637513146, 10280.975466240814, 10294.40367826004, 10307.836270711066, 10321.273240738796, 10334.71458549278, 10348.160302127204, 10361.610387800878, 10375.064839677221, 10388.523654924258, 10401.986830714593, 10415.454364225412, 10428.926252638465, 10442.402493140049, 10455.883082921007, 10469.368019176709, 10482.85729910704, 10496.350919916393, 10509.848878813653, 10523.351173012188, 10536.857799729838, 10550.3687561889, 10563.884039616123, 10577.403647242685, 10590.927576304197, 10604.455824040679, 10617.988387696556, 10631.525264520642, 10645.066451766135, 10658.611946690598, 10672.161746555956, 10685.715848628475, 10699.274250178762, 10712.836948481747, 10726.403940816675, 10739.975224467091, 10753.550796720834, 10767.130654870027, 10780.714796211059, 10794.303218044579, 10807.895917675487, 10821.492892412922, 10835.094139570248, 10848.699656465047, 10862.309440419107, 10875.923488758415, 10889.541798813138, 10903.16436791762, 10916.791193410372, 10930.422272634056, 10944.05760293548, 10957.697181665582, 10971.341006179427, 10984.98907383619, 10998.641381999149, 11012.297928035676, 11025.958709317223, 11039.623723219316, 11053.292967121541, 11066.966438407539, 11080.64413446499, 11094.326052685608, 11108.012190465128, 11121.702545203296, 11135.397114303863, 11149.095895174571, 11162.798885227143, 11176.506081877278, 11190.217482544635, 11203.933084652828, 11217.652885629415, 11231.376882905886, 11245.105073917659, 11258.837456104062, 11272.574026908333, 11286.314783777601, 11300.059724162888, 11313.808845519083, 11327.562145304952, 11341.319620983111, 11355.081270020033, 11368.847089886023, 11382.617078055218, 11396.391232005579, 11410.169549218874, 11423.952027180676, 11437.738663380349, 11451.529455311042, 11465.324400469679, 11479.123496356951, 11492.926740477304, 11506.734130338931, 11520.545663453764, 11534.361337337466, 11548.181149509423, 11562.005097492724, 11575.83317881417, 11589.665391004253, 11603.501731597149, 11617.342198130715, 11631.186788146468, 11645.035499189589, 11658.888328808911, 11672.745274556904, 11686.606333989675, 11700.471504666955, 11714.340784152086, 11728.214170012021, 11742.091659817312, 11755.973251142101, 11769.858941564111, 11783.748728664636, 11797.642610028539, 11811.540583244237, 11825.442645903697, 11839.34879560242, 11853.259029939445, 11867.173346517333, 11881.091742942155, 11895.014216823492, 11908.940765774427, 11922.871387411526, 11936.806079354839, 11950.744839227897, 11964.687664657684, 11978.634553274653, 11992.585502712702, 12006.540510609168, 12020.499574604828, 12034.462692343877, 12048.429861473938, 12062.401079646032, 12076.376344514589, 12090.355653737433, 12104.339004975769, 12118.326395894188, 12132.317824160644, 12146.313287446457, 12160.312783426305, 12174.316309778205, 12188.323864183525, 12202.335444326955, 12216.351047896511, 12230.370672583531, 12244.394316082657, 12258.421976091831, 12272.453650312296, 12286.489336448574, 12300.529032208471, 12314.572735303058, 12328.620443446678, 12342.672154356922, 12356.727865754638, 12370.787575363909, 12384.851280912055, 12398.918980129623, 12412.990670750381, 12427.066350511306, 12441.146017152583, 12455.229668417589, 12469.317302052901, 12483.40891580827, 12497.50450743663, 12511.604074694078, 12525.707615339878, 12539.815127136444, 12553.926607849342, 12568.042055247275, 12582.161467102082, 12596.284841188726, 12610.41217528529, 12624.543467172971, 12638.678714636069, 12652.817915461985, 12666.961067441209, 12681.108168367316, 12695.259216036962, 12709.414208249869, 12723.573142808827, 12737.736017519681, 12751.902830191326, 12766.073578635704, 12780.248260667788, 12794.426874105588, 12808.609416770132, 12822.795886485468, 12836.986281078653, 12851.180598379744, 12865.378836221802, 12879.580992440871, 12893.787064875984, 12907.997051369144, 12922.210949765335, 12936.428757912496, 12950.650473661524, 12964.876094866273, 12979.105619383534, 12993.339045073039, 13007.576369797454, 13021.817591422368, 13036.062707816285, 13050.311716850629, 13064.564616399723, 13078.821404340792, 13093.082078553954, 13107.346636922217, 13121.615077331464, 13135.887397670458, 13150.163595830827, 13164.44366970706, 13178.727617196502, 13193.015436199352, 13207.307124618648, 13221.602680360265, 13235.902101332911, 13250.205385448118, 13264.512530620239, 13278.823534766434, 13293.138395806676, 13307.457111663734, 13321.779680263176, 13336.106099533356, 13350.436367405409, 13364.77048181325, 13379.108440693562, 13393.450241985796, 13407.795883632158, 13422.145363577607, 13436.498679769853, 13450.855830159346, 13465.216812699266, 13479.581625345529, 13493.950266056772, 13508.32273279435, 13522.699023522329, 13537.079136207483, 13551.463068819286, 13565.850819329906, 13580.2423857142, 13594.63776594971, 13609.036958016657, 13623.439959897927, 13637.846769579081, 13652.257385048335, 13666.67180429656, 13681.090025317284, 13695.512046106669, 13709.937864663521, 13724.367478989278, 13738.800887088004, 13753.238086966385, 13767.679076633727, 13782.123854101939, 13796.572417385545, 13811.024764501659, 13825.480893469998, 13839.94080231286, 13854.404489055134, 13868.871951724283, 13883.34318835034, 13897.818196965914, 13912.296975606168, 13926.779522308825, 13941.26583511416, 13955.755912064991, 13970.249751206682, 13984.747350587126, 13999.248708256751, 14013.753822268511, 14028.262690677873, 14042.775311542828, 14057.291682923867, 14071.811802883994, 14086.335669488704, 14100.863280805994, 14115.394634906341, 14129.92972986271, 14144.468563750548, 14159.01113464777, 14173.55744063476, 14188.107479794369, 14202.661250211901, 14217.218749975118, 14231.779977174227, 14246.344929901879, 14260.913606253163, 14275.486004325601, 14290.062122219146, 14304.641958036171, 14319.225509881464, 14333.812775862236, 14348.403754088098, 14362.998442671067, 14377.59683972556, 14392.198943368388, 14406.804751718748, 14421.414262898223, 14436.027475030774, 14450.64438624274, 14465.264994662828, 14479.889298422106, 14494.517295654005, 14509.148984494313, 14523.784363081166, 14538.423429555049, 14553.066182058781, 14567.712618737527, 14582.362737738777, 14597.016537212348, 14611.674015310382, 14626.33517018734, 14640.999999999993, 14655.668502907418, 14670.340677071003, 14685.016520654426, 14699.696031823671, 14714.379208746999, 14729.066049594967, 14743.756552540408, 14758.45071575843, 14773.148537426418, 14787.850015724018, 14802.555148833142, 14817.263934937961, 14831.976372224897, 14846.692458882624, 14861.41219310206, 14876.135573076363, 14890.862597000923, 14905.593263073371, 14920.327569493558, 14935.065514463557, 14949.807096187662, 14964.552312872382, 14979.301162726431, 14994.053643960735, 15008.809754788414, 15023.569493424788, 15038.332858087369, 15053.099846995858, 15067.870458372134, 15082.644690440264, 15097.422541426484, 15112.204009559202, 15126.989093068994, 15141.777790188597, 15156.570099152905, 15171.366018198967, 15186.165545565986, 15200.968679495301, 15215.775418230402, 15230.585760016909, 15245.399703102579, 15260.217245737298, 15275.038386173073, 15289.863122664035, 15304.691453466432, 15319.523376838621, 15334.358891041069, 15349.197994336346, 15364.040684989128, 15378.886961266177, 15393.736821436356, 15408.590263770609, 15423.447286541972, 15438.307888025554, 15453.172066498542, 15468.039820240196, 15482.91114753184, 15497.786046656869, 15512.664515900733, 15527.546553550939, 15542.432157897045, 15557.32132723066, 15572.214059845435, 15587.110354037064, 15602.010208103273, 15616.913620343823, 15631.820589060506, 15646.731112557136, 15661.645189139546, 15676.562817115593, 15691.483994795139, 15706.408720490062, 15721.336992514242, 15736.268809183561, 15751.204168815901, 15766.143069731135, 15781.085510251132, 15796.03148869974, 15810.981003402798, 15825.934052688119, 15840.890634885489, 15855.850748326673, 15870.814391345401, 15885.781562277361, 15900.752259460214, 15915.726481233565, 15930.704225938984, 15945.685491919978, 15960.670277522009, 15975.658581092481, 15990.65040098073, 16005.645735538035, 16020.644583117599, 16035.646942074556, 16050.652810765967, 16065.662187550806, 16080.675070789974, 16095.691458846273, 16110.711350084424, 16125.734742871053, 16140.761635574685, 16155.792026565747, 16170.825914216561, 16185.863296901338, 16200.904172996183, 16215.948540879079, 16230.996398929899, 16246.047745530386, 16261.102579064163, 16276.160897916721, 16291.22270047542, 16306.287985129484, 16321.356750269995, 16336.428994289896, 16351.504715583982, 16366.5839125489, 16381.666583583141, 16396.752727087041, 16411.842341462776, 16426.935425114363, 16442.031976447644, 16457.131993870298, 16472.235475791829, 16487.342420623561, 16502.452826778641, 16517.566692672033, 16532.684016720516, 16547.804797342676, 16562.929032958902, 16578.056721991394, 16593.18786286415, 16608.322454002962, 16623.460493835417, 16638.601980790896, 16653.746913300558, 16668.895289797354, 16684.047108716015, 16699.202368493046, 16714.361067566726, 16729.523204377107, 16744.688777366009, 16759.857784977012, 16775.030225655464, 16790.206097848466, 16805.385400004874, 16820.568130575302, 16835.754288012104, 16850.943870769381, 16866.136877302983, 16881.333306070494, 16896.53315553123, 16911.736424146249, 16926.943110378332, 16942.153212691992, 16957.366729553454, 16972.583659430682, 16987.804000793338, 17003.027752112816, 17018.254911862205, 17033.485478516312, 17048.719450551645, 17063.956826446421, 17079.197604680547, 17094.44178373563, 17109.689362094967, 17124.940338243552, 17140.194710668064, 17155.452477856852, 17170.713638299967, 17185.978190489128, 17201.246132917724, 17216.517464080825, 17231.792182475165, 17247.070286599141, 17262.351774952826, 17277.636646037936, 17292.924898357855, 17308.216530417623, 17323.511540723921, 17338.809927785089, 17354.111690111105, 17369.416826213594, 17384.725334605821, 17400.037213802683, 17415.352462320716, 17430.67107867809, 17445.993061394587, 17461.318408991636, 17476.647119992274, 17491.979192921168, 17507.314626304586, 17522.653418670423, 17537.995568548187, 17553.341074468986, 17568.689934965536, 17584.042148572156, 17599.397713824768, 17614.75662926089, 17630.118893419625, 17645.484504841683, 17660.853462069354, 17676.225763646511, 17691.601408118619, 17706.980394032718, 17722.362719937424, 17737.748384382936, 17753.137385921014, 17768.529723104999, 17783.92539448979, 17799.324398631856, 17814.726734089225, 17830.13239942148, 17845.541393189767, 17860.95371395678, 17876.369360286772, 17891.788330745527, 17907.210623900395, 17922.636238320254, 17938.065172575527, 17953.497425238176, 17968.932994881692, 17984.371880081104, 17999.814079412972, 18015.259591455371, 18030.708414787914, 18046.160547991731, 18061.615989649465, 18077.074738345284, 18092.536792664861, 18108.002151195393, 18123.470812525571, 18138.942775245599, 18154.418037947191, 18169.896599223546, 18185.37845766938, 18200.863611880886, 18216.352060455767, 18231.843801993204, 18247.338835093873, 18262.837158359936, 18278.338770395032, 18293.84366980429, 18309.351855194309, 18324.863325173166, 18340.378078350412, 18355.896113337069, 18371.417428745623, 18386.942023190033, 18402.469895285718, 18418.00104364955, 18433.53546689987, 18449.073163656474, 18464.614132540602, 18480.158372174956, 18495.705881183676, 18511.256658192357, 18526.810701828035, 18542.368010719183, 18557.928583495715, 18573.492418788985, 18589.059515231773, 18604.629871458303, 18620.203486104212, 18635.78035780658, 18651.360485203899, 18666.943866936086, 18682.53050164448, 18698.120387971841, 18713.713524562332, 18729.30991006154, 18744.909543116457, 18760.512422375479, 18776.118546488418, 18791.727914106479, 18807.340523882274, 18822.95637446981, 18838.575464524489, 18854.197792703111, 18869.823357663863, 18885.452158066328, 18901.08419257147, 18916.719459841639, 18932.357958540564, 18947.999687333362, 18963.644644886521, 18979.292829867907, 18994.944240946759, 19010.598876793687, 19026.256736080668, 19041.917817481048, 19057.582119669532, 19073.2496413222, 19088.920381116473, 19104.594337731145, 19120.271509846356, 19135.951896143604, 19151.635495305738, 19167.322306016948, 19183.012326962784, 19198.705556830122, 19214.401994307198, 19230.101638083579, 19245.804486850167, 19261.510539299208, 19277.219794124274, 19292.932250020265, 19308.647905683421, 19324.366759811302, 19340.088811102793, 19355.8140582581, 19371.542499978754, 19387.2741349676, 19403.008961928797, 19418.746979567823, 19434.488186591469, 19450.232581707827, 19465.980163626304, 19481.730931057613, 19497.484882713761, 19513.242017308068, 19529.002333555141, 19544.765830170898, 19560.532505872539, 19576.302359378566, 19592.075389408761, 19607.851594684209, 19623.630973927269, 19639.41352586159, 19655.199249212103, 19670.988142705017, 19686.780205067826, 19702.575435029288, 19718.373831319448, 19734.175392669615, 19749.980117812371, 19765.788005481569, 19781.599054412323, 19797.413263341008, 19813.230631005274, 19829.051156144014, 19844.874837497395, 19860.701673806827, 19876.531663814985, 19892.364806265789, 19908.201099904403, 19924.040543477258, 19939.883135732012, 19955.728875417579, 19971.577761284105, 19987.429792082985, 20003.284966566847, 20019.14328348956, 20035.004741606219, 20050.869339673161, 20066.737076447946, 20082.607950689362, 20098.481961157428, 20114.359106613385, 20130.239385819699, 20146.122797540058, 20162.009340539353, 20177.899013583716, 20193.791815440476, 20209.687744878182, 20225.586800666591, 20241.488981576669, 20257.394286380597, 20273.302713851754, 20289.214262764715, 20305.128931895277, 20321.046720020415, 20336.967625918318, 20352.891648368361, 20368.818786151114, 20384.749038048347, 20400.682402843009, 20416.618879319249, 20432.558466262391, 20448.501162458953, 20464.446966696629, 20480.395877764302, 20496.347894452025, 20512.303015551031, 20528.261239853735, 20544.22256615372, 20560.186993245738, 20576.15451992572, 20592.125144990758, 20608.098867239107, 20624.075685470198, 20640.055598484618, 20656.038605084115, 20672.024704071595, 20688.013894251126, 20704.006174427926, 20720.001543408373, 20735.999999999989, 20752.001543011454, 20768.006171252597, 20784.013883534382, 20800.024678668931, 20816.038555469506, 20832.055512750507, 20848.075549327474, 20864.098664017085, 20880.124855637161, 20896.154123006647, 20912.186464945626, 20928.221880275312, 20944.260367818049, 20960.301926397311, 20976.346554837684, 20992.394251964895, 21008.445016605787, 21024.498847588318, 21040.555743741574, 21056.615703895754, 21072.678726882168, 21088.744811533252, 21104.813956682538, 21120.886161164683, 21136.961423815443, 21153.039743471683, 21169.121118971379, 21185.205549153605, 21201.293032858535, 21217.383568927453, 21233.477156202731, 21249.573793527841, 21265.673479747358, 21281.776213706937, 21297.881994253334, 21313.990820234398, 21330.102690499054, 21346.21760389733, 21362.335559280327, 21378.456555500241, 21394.580591410333, 21410.707665864964, 21426.83777771956, 21442.970925830628, 21459.107109055756, 21475.246326253604, 21491.388576283895, 21507.533858007431, 21523.682170286087, 21539.833511982797, 21555.987881961566, 21572.145279087465, 21588.305702226615, 21604.469150246216, 21620.635622014521, 21636.805116400832, 21652.977632275521, 21669.153168510009, 21685.331723976764, 21701.513297549318, 21717.697888102244, 21733.885494511167, 21750.076115652759, 21766.269750404736, 21782.466397645861, 21798.666056255934, 21814.868725115801, 21831.074403107345, 21847.283089113484, 21863.494782018177, 21879.709480706417, 21895.927184064229, 21912.147890978667, 21928.371600337818, 21944.598311030797, 21960.828021947746, 21977.060731979829, 21993.296440019243, 22009.535144959198, 22025.77684569393, 22042.021541118691, 22058.269230129757, 22074.519911624411, 22090.773584500959, 22107.030247658717, 22123.289899998013, 22139.552540420187, 22155.818167827587, 22172.086781123569, 22188.358379212495, 22204.632960999726, 22220.910525391639, 22237.191071295601, 22253.474597619981, 22269.761103274148, 22286.050587168469, 22302.343048214312, 22318.638485324027, 22334.936897410968, 22351.23828338947, 22367.542642174871, 22383.849972683485, 22400.160273832618, 22416.473544540564, 22432.789783726603, 22449.108990310986, 22465.431163214958, 22481.75630136074, 22498.084403671528, 22514.415469071497, 22530.749496485802, 22547.086484840562, 22563.426433062879, 22579.769340080824, 22596.115204823436, 22612.464026220721, 22628.815803203655, 22645.170534704179, 22661.5282196552, 22677.888856990587, 22694.252445645168, 22710.618984554734, 22726.988472656034, 22743.360908886778, 22759.736292185622, 22776.114621492186, 22792.495895747044, 22808.880113891719, 22825.267274868678, 22841.657377621348, 22858.050421094096, 22874.446404232243, 22890.845325982053, 22907.247185290722, 22923.651981106406, 22940.059712378195, 22956.470378056114, 22972.883977091129, 22989.300508435153, 23005.719971041017, 23022.142363862498, 23038.567685854305, 23054.995935972078, 23071.427113172387, 23087.86121641273, 23104.298244651531, 23120.738196848146, 23137.181071962848, 23153.626868956846, 23170.075586792263, 23186.527224432142, 23202.981780840448, 23219.439254982066, 23235.899645822796, 23252.362952329357, 23268.829173469378, 23285.298308211408, 23301.770355524899, 23318.245314380223, 23334.723183748658, 23351.203962602387, 23367.687649914504, 23384.174244659007, 23400.663745810798, 23417.15615234568, 23433.651463240367, 23450.149677472462, 23466.650794020472, 23483.154811863806, 23499.661729982763, 23516.171547358543, 23532.684262973235, 23549.199875809823, 23565.718384852185, 23582.239789085092, 23598.764087494197, 23615.291279066041, 23631.821362788058, 23648.354337648565, 23664.890202636761, 23681.428956742733, 23697.970598957443, 23714.515128272738, 23731.062543681343, 23747.612844176863, 23764.166028753778, 23780.72209640744, 23797.281046134085, 23813.842876930816, 23830.407587795606, 23846.975177727301, 23863.545645725622, 23880.11899079115, 23896.695211925336, 23913.274308130498, 23929.856278409821, 23946.441121767348, 23963.028837207989, 23979.619423737513, 23996.212880362549, 24012.809206090584, 24029.408399929966, 24046.010460889898, 24062.615387980433, 24079.223180212492, 24095.833836597827, 24112.447356149063, 24129.063737879667, 24145.682980803951, 24162.305083937081, 24178.930046295067, 24195.557866894767, 24212.188544753884, 24228.822078890964, 24245.458468325389, 24262.097712077397, 24278.739809168052, 24295.384758619261, 24312.032559453768, 24328.683210695162, 24345.336711367858, 24361.993060497109, 24378.652257108995, 24395.314300230442, 24411.979188889192, 24428.646922113825, 24445.317498933746, 24461.990918379193, 24478.667179481225, 24495.346281271726, 24512.028222783407, 24528.713003049801, 24545.400621105266, 24562.091075984976, 24578.784366724925, 24595.480492361927, 24612.179451933614, 24628.881244478438, 24645.585869035654, 24662.293324645343, 24679.003610348394, 24695.716725186514, 24712.432668202211, 24729.151438438807, 24745.873034940436, 24762.597456752032, 24779.324702919344, 24796.054772488926, 24812.787664508123, 24829.5233780251, 24846.261912088819, 24863.003265749034, 24879.747438056307, 24896.494428062004, 24913.244234818278, 24929.996857378079, 24946.752294795166, 24963.510546124078, 24980.271610420157, 24997.035486739525, 25013.802174139113, 25030.571671676629, 25047.343978410572, 25064.119093400237, 25080.897015705697, 25097.677744387816, 25114.461278508239, 25131.2476171294, 25148.036759314517, 25164.828704127583, 25181.623450633375, 25198.42099789745, 25215.221344986145, 25232.024490966574, 25248.830434906627, 25265.639175874974, 25282.450712941049, 25299.265045175071, 25316.082171648024, 25332.902091431668, 25349.724803598532, 25366.550307221914, 25383.378601375884, 25400.209685135269, 25417.043557575678, 25433.880217773472, 25450.719664805783, 25467.561897750507, 25484.406915686297, 25501.254717692573, 25518.105302849512, 25534.958670238051, 25551.814818939893, 25568.67374803748, 25585.535456614027, 25602.399943753502, 25619.267208540619, 25636.137250060852, 25653.010067400432, 25669.885659646327, 25686.76402588627, 25703.645165208734, 25720.529076702944, 25737.415759458876, 25754.305212567244, 25771.197435119517, 25788.092426207899, 25804.990184925344, 25821.890710365547, 25838.794001622944, 25855.700057792714, 25872.608877970775, 25889.520461253778, 25906.434806739118, 25923.351913524923, 25940.271780710063, 25957.194407394138, 25974.11979267748, 25991.047935661154, 26007.978835446964, 26024.912491137442, 26041.848901835841, 26058.788066646157, 26075.729984673108, 26092.674655022136, 26109.622076799409, 26126.572249111829, 26143.525171067016, 26160.480841773315, 26177.43926033979, 26194.400425876229, 26211.364337493149, 26228.330994301767, 26245.30039541404, 26262.272539942627, 26279.247427000919, 26296.225055703002, 26313.205425163702, 26330.188534498539, 26347.174382823756, 26364.162969256304, 26381.154292913852, 26398.148352914774, 26415.145148378149, 26432.144678423778, 26449.146942172156, 26466.151938744493, 26483.159667262702, 26500.170126849403, 26517.183316627921, 26534.199235722277, 26551.217883257199, 26568.239258358124, 26585.263360151173, 26602.290187763181, 26619.319740321676, 26636.352016954883, 26653.387016791727, 26670.424738961825, 26687.465182595493, 26704.508346823739, 26721.554230778267, 26738.602833591467, 26755.65415439643, 26772.708192326929, 26789.764946517433, 26806.824416103096, 26823.886600219761, 26840.95149800396, 26858.019108592915, 26875.089431124517, 26892.162464737365, 26909.238208570721, 26926.316661764544, 26943.397823459472, 26960.481692796813, 26977.568268918571, 26994.657550967422, 27011.749538086722, 27028.844229420498, 27045.941624113464, 27063.041721311005, 27080.144520159181, 27097.250019804727, 27114.35821939505, 27131.469118078236, 27148.582715003027, 27165.699009318858, 27182.818000175819, 27199.939686724665, 27217.064068116837, 27234.191143504428, 27251.320912040203, 27268.453372877593, 27285.588525170693, 27302.726368074269, 27319.866900743735, 27337.010122335181, 27354.156032005358, 27371.304628911668, 27388.455912212183, 27405.609881065626, 27422.766534631384, 27439.925872069507, 27457.087892540683, 27474.252595206275, 27491.419979228293, 27508.5900437694, 27525.762787992917, 27542.93821106281, 27560.116312143706, 27577.297090400876, 27594.480545000242, 27611.666675108383, 27628.855479892518, 27646.046958520514, 27663.241110160889, 27680.437933982801, 27697.637429156068, 27714.839594851132, 27732.04443023909, 27749.251934491687, 27766.462106781299, 27783.674946280949, 27800.890452164302, 27818.108623605654, 27835.329459779954, 27852.55295986278, 27869.779123030345, 27887.007948459504, 27904.239435327745, 27921.473582813196, 27938.710390094613, 27955.949856351392, 27973.19198076355, 27990.436762511745, 28007.684200777272, 28024.934294742041, 28042.187043588601, 28059.442446500128, 28076.700502660427, 28093.961211253929, 28111.224571465693, 28128.490582481401, 28145.759243487362, 28163.030553670509, 28180.304512218394, 28197.581118319198, 28214.860371161725, 28232.14226993539, 28249.42681383024, 28266.71400203693, 28284.003833746745, 28301.296308151585, 28318.591424443959, 28335.889181817001, 28353.189579464462, 28370.492616580705, 28387.798292360701, 28405.106606000048, 28422.417556694945, 28439.731143642206, 28457.047366039264, 28474.366223084147, 28491.687713975512, 28509.011837912611, 28526.338594095305, 28543.667981724069, 28560.999999999982, 28578.334648124732, 28595.671925300605, 28613.011830730498, 28630.354363617909, 28647.699523166943, 28665.0473085823, 28682.397719069289, 28699.750753833818, 28717.10641208239, 28734.464693022121, 28751.825595860708, 28769.189119806462, 28786.55526406828, 28803.924027855664, 28821.295410378701, 28838.669410848088, 28856.046028475103, 28873.425262471628, 28890.80711205013, 28908.191576423673, 28925.578654805915, 28942.968346411097, 28960.360650454055, 28977.755566150216, 28995.153092715591, 29012.553229366786, 29029.955975320987, 29047.361329795975, 29064.769292010107, 29082.179861182336, 29099.593036532187, 29117.00881727978, 29134.427202645813, 29151.848191851568, 29169.271784118911, 29186.697978670283, 29204.126774728706, 29221.55817151779, 29238.992168261717, 29256.42876418525, 29273.867958513725, 29291.309750473058, 29308.754139289747, 29326.201124190855, 29343.65070440403, 29361.102879157483, 29378.557647680012, 29396.015009200975, 29413.474962950309, 29430.937508158524, 29448.402644056692, 29465.870369876469, 29483.340684850071, 29500.81358821028, 29518.289079190454, 29535.767157024511, 29553.247820946945, 29570.731070192807, 29588.216903997723, 29605.70532159787, 29623.19632223, 29640.689905131429, 29658.186069540028, 29675.684814694236, 29693.186139833047, 29710.690044196028, 29728.196527023298, 29745.705587555527, 29763.217225033964, 29780.731438700397, 29798.248227797183, 29815.76759156723, 29833.289529254005, 29850.81404010153, 29868.341123354381, 29885.870778257693, 29903.403004057145, 29920.937799998974, 29938.475165329975, 29956.015099297485, 29973.557601149394, 29991.102670134147, 30008.650305500738, 30026.200506498706, 30043.753272378144, 30061.308602389683, 30078.866495784507, 30096.426951814352, 30113.989969731494, 30131.55554878875, 30149.123688239491, 30166.694387337629, 30184.267645337608, 30201.843461494434, 30219.42183506364, 30237.002765301309, 30254.586251464058, 30272.172292809046, 30289.760888593977, 30307.35203807709, 30324.94574051716, 30342.541995173502, 30360.140801305966, 30377.742158174944, 30395.346065041358, 30412.952521166666, 30430.561525812864, 30448.173078242475, 30465.787177718561, 30483.403823504719, 30501.02301486507, 30518.644751064272, 30536.269031367516, 30553.895855040515, 30571.525221349519, 30589.157129561307, 30606.791578943175, 30624.428568762964, 30642.06809828903, 30659.710166790261, 30677.35477353607, 30695.001917796391, 30712.651598841687, 30730.303815942945, 30747.958568371676, 30765.615855399912, 30783.275676300211, 30800.938030345646, 30818.602916809814, 30836.270334966837, 30853.940284091354, 30871.612763458521, 30889.287772344011, 30906.965310024025, 30924.645375775272, 30942.327968874983, 30960.013088600903, 30977.700734231294, 30995.390905044929, 31013.083600321101, 31030.778819339619, 31048.476561380798, 31066.17682572547, 31083.879611654978, 31101.584918451179, 31119.29274539644, 31137.003091773637, 31154.715956866155, 31172.431339957893, 31190.14924033326, 31207.869657277162, 31225.592590075023, 31243.318038012771, 31261.046000376838, 31278.776476454172, 31296.50946553221, 31314.24496689891, 31331.98297984272, 31349.7235036526, 31367.466537618013, 31385.212081028923, 31402.960133175795, 31420.710693349596, 31438.463760841791, 31456.219334944351, 31473.977414949743, 31491.738000150934, 31509.501089841389, 31527.266683315069, 31545.034779866437, 31562.80537879045, 31580.578479382562, 31598.35408093872, 31616.132182755369, 31633.91278412945, 31651.695884358396, 31669.481482740131, 31687.269578573076, 31705.060171156143, 31722.853259788735, 31740.648843770748, 31758.446922402567, 31776.247494985066, 31794.050560819614, 31811.85611920806, 31829.664169452753, 31847.474710856521, 31865.287742722685, 31883.103264355046, 31900.921275057899, 31918.741774136019, 31936.564760894671, 31954.390234639599, 31972.21819467704, 31990.048640313704, 32007.881570856793, 32025.716985613984, 32043.554883893445, 32061.395265003815, 32079.238128254223, 32097.083472954269, 32114.931298414049, 32132.781603944117, 32150.634388855524, 32168.48965245979, 32186.347394068915, 32204.207612995371, 32222.07030855212, 32239.935480052583, 32257.803126810672, 32275.673248140767, 32293.545843357719, 32311.420911776862, 32329.298452713996, 32347.178465485395, 32365.060949407813, 32382.945903798463, 32400.83332797504, 32418.723221255706, 32436.615582959093, 32454.510412404306, 32472.407708910916, 32490.307471798966, 32508.209700388961, 32526.114394001877, 32544.021551959166, 32561.931173582732, 32579.843258194956, 32597.757805118679, 32615.674813677211, 32633.594283194328, 32651.516212994258, 32669.440602401712, 32687.367450741847, 32705.296757340297, 32723.228521523146, 32741.162742616943, 32759.099419948703, 32777.038552845901, 32794.980140636464, 32812.924182648792, 32830.87067821173, 32848.819626654593, 32866.77102730715, 32884.724879499619, 32902.681182562686, 32920.639935827494, 32938.601138625643, 32956.56479028918, 32974.530890150607, 32992.499437542894, 33010.470431799447, 33028.443872254145, 33046.419758241311, 33064.39808909571, 33082.378864152583, 33100.36208274759, 33118.347744216881, 33136.335847897026, 33154.326393125062, 33172.31937923847, 33190.314805575174, 33208.312671473555, 33226.312976272442, 33244.315719311111, 33262.320899929284, 33280.328517467125, 33298.33857126526, 33316.351060664747, 33334.365985007091, 33352.383343634239, 33370.403135888591, 33388.42536111299, 33406.450018650721, 33424.477107845501, 33442.506628041512, 33460.53857858335, 33478.572958816083, 33496.609768085189, 33514.649005736617, 33532.690671116739, 33550.734763572356, 33568.781282450735, 33586.830227099563, 33604.881596866973, 33622.935391101528, 33640.991609152239, 33659.050250368542, 33677.111314100322, 33695.174799697881, 33713.240706511984, 33731.309033893805, 33749.37978119497, 33767.452947767531, 33785.528532963974, 33803.606536137209, 33821.686956640602, 33839.769793827938, 33857.855047053425, 33875.942715671707, 33894.032799037872, 33912.125296507431, 33930.220207436316, 33948.317531180888, 33966.417267097961, 33984.519414544746, 34002.623972878901, 34020.730941458511, 34038.840319642077, 34056.952106788536, 34075.066302257255, 34093.182905408015, 34111.301915601027, 34129.42333219693, 34147.547154556785, 34165.673382042078, 34183.80201401472, 34201.933049837033, 34220.06648887178, 34238.202330482141, 34256.340574031703, 34274.481218884495, 34292.624264404949, 34310.769709957938, 34328.91755490873, 34347.067798623029, 34365.220440466954, 34383.375479807051, 34401.532916010263, 34419.692748443973, 34437.854976475966, 34456.01959947445, 34474.18661680806, 34492.356027845817, 34510.527831957188, 34528.702028512052, 34546.878616880676, 34565.05759643377, 34583.238966542449, 34601.422726578232, 34619.608875913065, 34637.797413919296, 34655.988339969692, 34674.181653437423, 34692.37735369608, 34710.575440119668, 34728.775912082579, 34746.978768959649, 34765.184010126082, 34783.391634957537, 34801.60164283005, 34819.814033120063, 34838.028805204456, 34856.24595846048, 34874.465492265823, 34892.687405998557, 34910.911699037177, 34929.138370760564, 34947.367420548027, 34965.598847779271, 34983.832651834389, 35002.068832093908, 35020.307387938738, 35038.548318750189, 35056.79162390998, 35075.03730280025, 35093.285354803513, 35111.535779302685, 35129.788575681116, 35148.043743322516, 35166.301281611013, 35184.561189931141, 35202.823467667826, 35221.088114206388, 35239.355128932555, 35257.624511232447, 35275.896260492584, 35294.170376099886, 35312.446857441668, 35330.725703905628, 35349.006914879887, 35367.290489752944, 35385.576427913686, 35403.864728751418, 35422.155391655811, 35440.448416016967, 35458.743801225341, 35477.041546671804, 35495.341651747622, 35513.644115844436, 35531.948938354304, 35550.256118669655, 35568.565656183309, 35586.877550288496, 35605.191800378816, 35623.508405848268, 35641.827366091238, 35660.148680502505, 35678.472348477233, 35696.798369410979, 35715.126742699678, 35733.457467739659, 35751.790543927644, 35770.125970660738, 35788.46374733642, 35806.803873352568, 35825.146348107453, 35843.49117099971, 35861.838341428367, 35880.187858792851, 35898.539722492955, 35916.893931928862, 35935.250486501129, 35953.609385610718, 35971.970628658957, 35990.334215047558, 36008.700144178612, 36027.068415454596, 36045.439028278372, 36063.811982053165, 36082.187276182609, 36100.564910070694, 36118.944883121789, 36137.327194740654, 36155.711844332429, 36174.098831302617, 36192.488155057115, 36210.87981500219, 36229.273810544473, 36247.670141091003, 36266.068806049167, 36284.469804826738, 36302.873136831862, 36321.278801473069, 36339.686798159251, 36358.097126299683, 36376.509785304013, 36394.924774582258, 36413.342093544816, 36431.761741602444, 36450.183718166292, 36468.608022647859, 36487.034654459028, 36505.463613012063, 36523.894897719583, 36542.328507994578, 36560.764443250409, 36579.202702900831, 36597.643286359926, 36616.086193042182, 36634.531422362437, 36652.978973735895, 36671.428846578143, 36689.881040305125, 36708.335554333149, 36726.792388078902, 36745.251540959427, 36763.713012392138, 36782.176801794812, 36800.642908585593, 36819.111332182983, 36837.582072005869, 36856.055127473483, 36874.530498005421, 36893.008183021651, 36911.488181942506, 36929.970494188674, 36948.455119181206, 36966.942056341519, 36985.431305091392, 37003.922864852961, 37022.416735048733, 37040.912915101559, 37059.411404434657, 37077.91220247162, 37096.415308636388, 37114.920722353243, 37133.428443046862, 37151.938470142253, 37170.450803064785, 37188.965441240209, 37207.482384094597, 37226.001631054402, 37244.523181546429, 37263.047034997842, 37281.573190836149, 37300.101648489224, 37318.632407385296, 37337.165466952945, 37355.700826621112, 37374.238485819085, 37392.778443976509, 37411.320700523385, 37429.865254890057, 37448.412106507232, 37466.961254805974, 37485.512699217681, 37504.066439174116, 37522.622474107404, 37541.180803449992, 37559.741426634704, 37578.304343094693, 37596.869552263488, 37615.43705357494, 37634.006846463279, 37652.578930363044, 37671.153304709165, 37689.729968936896, 37708.308922481847, 37726.890164779965, 37745.473695267559, 37764.059513381275, 37782.647618558112, 37801.238010235415, 37819.830687850859, 37838.425650842495, 37857.022898648691, 37875.622430708172, 37894.224246460013, 37912.828345343616, 37931.434726798747, 37950.043390265506, 37968.654335184328, 37987.267560995999, 38005.883067141665, 38024.500853062775, 38043.120918201159, 38061.743261998963, 38080.367883898682, 38098.994783343158, 38117.623959775563, 38136.255412639417, 38154.889141378575, 38173.525145437234, 38192.163424259939, 38210.803977291551, 38229.446803977284, 38248.091903762703, 38266.739276093685, 38285.388920416466, 38304.040836177606, 38322.695022824002, 38341.351479802899, 38360.010206561863, 38378.671202548816, 38397.334467211993, 38415.999999999978, 38434.667800361683, 38453.33786774637, 38472.010201603611, 38490.684801383337, 38509.361666535784, 38528.040796511552, 38546.722190761553, 38565.405848737035, 38584.091769889594, 38602.779953671132, 38621.470399533908, 38640.163106930493, 38658.858075313794, 38677.555304137059, 38696.254792853862, 38714.956540918094, 38733.660547783991, 38752.366812906112, 38771.075335739348, 38789.78611573892, 38808.499152360368, 38827.214445059573, 38845.931993292739, 38864.651796516388, 38883.373854187383, 38902.098165762916, 38920.824730700486, 38939.553548457938, 38958.284618493431, 38977.017940265461, 38995.753513232834, 39014.491336854699, 39033.231410590517, 39051.973733900079, 39070.718306243485, 39089.465127081188, 39108.214195873945, 39126.965512082832, 39145.719075169261, 39164.474884594965, 39183.232939821988, 39201.99324031271, 39220.755785529815, 39239.52057493633, 39258.287607995589, 39277.056884171245, 39295.828402927284, 39314.602163728006, 39333.378166038019, 39352.15640932227, 39370.936893046004, 39389.719616674811, 39408.504579674584, 39427.291781511522, 39446.081221652174, 39464.872899563372, 39483.666814712291, 39502.462966566411, 39521.261354593538, 39540.06197826178, 39558.864837039568, 39577.669930395656, 39596.47725779911, 39615.286818719302, 39634.098612625923, 39652.912638988993, 39671.728897278823, 39690.547386966064, 39709.368107521652, 39728.191058416858, 39747.016239123259, 39765.84364911275, 39784.673287857528, 39803.505154830105, 39822.339249503319, 39841.175571350293, 39860.014119844491, 39878.854894459677, 39897.697894669909, 39916.54311994958, 39935.390569773372, 39954.240243616303, 39973.092140953675, 39991.946261261117, 40010.802604014549, 40029.661168690225, 40048.521954764678, 40067.384961714779, 40086.250189017679, 40105.117636150855, 40123.98730259209, 40142.859187819471, 40161.733291311379, 40180.609612546526, 40199.488151003912, 40218.368906162854, 40237.25187750296, 40256.137064504153, 40275.024466646668, 40293.914083411029, 40312.805914278084, 40331.699958728961, 40350.596216245103, 40369.494686308273, 40388.39536840051, 40407.298262004173, 40426.20336660192, 40445.110681676706, 40464.020206711793, 40482.931941190756, 40501.845884597446, 40520.762036416032, 40539.680396130985, 40558.600963227072, 40577.523737189367, 40596.448717503234, 40615.375903654342, 40634.305295128659, 40653.236891412453, 40672.170691992294, 40691.106696355047, 40710.044903987873, 40728.985314378238, 40747.927927013901, 40766.872741382918, 40785.819756973651, 40804.768973274746, 40823.720389775161, 40842.674005964131, 40861.629821331211, 40880.587835366234, 40899.548047559321, 40918.510457400931, 40937.475064381761, 40956.441867992849, 40975.410867725499, 40994.382063071331, 41013.355453522236, 41032.331038570417, 41051.308817708363, 41070.288790428858, 41089.270956224987, 41108.255314590111, 41127.241865017888, 41146.23060700229, 41165.221540037543, 41184.214663618193, 41203.209977239079, 41222.207480395307, 41241.207172582297, 41260.209053295752, 41279.213122031659, 41298.219378286303, 41317.227821556255, 41336.23845133838, 41355.251267129832, 41374.266268428037, 41393.283454730743, 41412.302825535953, 41431.324380341983, 41450.348118647416, 41469.374039951144, 41488.402143752326, 41507.432429550427, 41526.464896845187, 41545.499545136627, 41564.536373925075, 41583.575382711126, 41602.616570995662, 41621.659938279874, 41640.705484065205, 41659.753207853406, 41678.803109146495, 41697.855187446803, 41716.909442256911, 41735.965873079709, 41755.02447941836, 41774.085260776315, 41793.148216657297, 41812.213346565331, 41831.280650004708, 41850.350126480014, 41869.421775496106, 41888.495596558132, 41907.571589171515, 41926.649752841957, 41945.730087075463, 41964.812591378286, 41983.897265256979, 42002.984108218378, 42022.073119769593, 42041.164299418015, 42060.257646671307, 42079.353161037419, 42098.450842024591, 42117.550689141324, 42136.652701896404, 42155.756879798893, 42174.863222358137, 42193.971729083758, 42213.082399485655, 42232.195233074002, 42251.310229359246, 42270.427387852127, 42289.546708063644, 42308.668189505079, 42327.791831687995, 42346.917634124227, 42366.045596325886, 42385.175717805352, 42404.307998075295, 42423.442436648642, 42442.579033038608, 42461.717786758672, 42480.858697322597, 42500.001764244422, 42519.146987038446, 42538.294365219248, 42557.443898301688, 42576.595585800882, 42595.749427232236, 42614.90542211142, 42634.063569954378, 42653.223870277317, 42672.386322596729, 42691.55092642938, 42710.717681292292, 42729.886586702756, 42749.057642178363, 42768.23084723694, 42787.406201396603, 42806.58370417574, 42825.76335509299, 42844.945153667286, 42864.129099417805, 42883.315191864014, 42902.503430525649, 42921.693814922692, 42940.88634457541, 42960.081019004348, 42979.277837730297, 42998.476800274322, 43017.677906157769, 43036.881154902228, 43056.086546029583, 43075.294079061961, 43094.503753521763, 43113.715568931671, 43132.929524814601, 43152.145620693766, 43171.363856092619, 43190.584230534907, 43209.806743544621, 43229.031394646016, 43248.258183363621, 43267.487109222224, 43286.718171746885, 43305.951370462906, 43325.186704895881, 43344.42417457165, 43363.663779016322, 43382.905517756262, 43402.149390318104, 43421.395396228749, 43440.643535015348, 43459.89380620532, 43479.146209326354, 43498.400743906379, 43517.657409473606, 43536.916205556496, 43556.177131683784, 43575.44018738444, 43594.705372187724, 43613.972685623135, 43633.242127220445, 43652.513696509668, 43671.787393021099, 43691.063216285271, 43710.341165833001, 43729.621241195346, 43748.903441903625, 43768.187767489413, 43787.474217484552, 43806.762791421126, 43826.053488831501, 43845.346309248278, 43864.641252204325, 43883.938317232765, 43903.237503866971, 43922.538811640596, 43941.842240087513, 43961.147788741881, 43980.455457138101, 43999.765244810835, 44019.077151295001, 44038.391176125755, 44057.70731883854, 44077.02557896902, 44096.345956053141, 44115.668449627083, 44134.993059227287, 44154.319784390456, 44173.648624653535, 44192.979579553728, 44212.312648628489, 44231.647831415532, 44250.985127452805, 44270.324536278538, 44289.666057431183, 44309.009690449464, 44328.355434872348, 44347.703290239064, 44367.053256089079, 44386.405331962109, 44405.759517398139, 44425.115811937387, 44444.474215120332, 44463.834726487694, 44483.197345580462, 44502.562071939843, 44521.928905107328, 44541.297844624634, 44560.668890033732, 44580.042040876848, 44599.417296696454, 44618.794657035272, 44638.174121436256, 44657.555689442641, 44676.939360597877, 44696.325134445673, 44715.713010530002, 44735.102988395054, 44754.495067585296, 44773.88924764542, 44793.285528120374, 44812.683908555344, 44832.084388495779, 44851.486967487363, 44870.891645076015, 44890.298420807922, 44909.707294229491, 44929.118264887409, 44948.531332328566, 44967.946496100136, 44987.363755749502, 45006.783110824319, 45026.204560872473, 45045.628105442098, 45065.053744081561, 45084.48147633949, 45103.911301764747, 45123.343219906426, 45142.777230313885, 45162.21333253671, 45181.651526124733, 45201.091810628037, 45220.534185596924, 45239.978650581965, 45259.425205133957, 45278.873848803938, 45298.324581143192, 45317.777401703235, 45337.232310035848, 45356.68930569302, 45376.148388226997, 45395.60955719027, 45415.072812135557, 45434.538152615823, 45454.005578184282, 45473.475088394356, 45492.946682799746, 45512.420360954362, 45531.896122412363, 45551.373966728155, 45570.853893456362, 45590.33590215187, 45609.819992369776, 45629.306163665438, 45648.794415594442, 45668.284747712612, 45687.777159576006, 45707.27165074092, 45726.768220763894, 45746.266869201696, 45765.767595611323, 45785.270399550034, 45804.775280575297, 45824.282238244828, 45843.79127211657, 45863.302381748719, 45882.815566699683, 45902.33082652813, 45921.848160792935, 45941.367569053225, 45960.889050868354, 45980.41260579793, 45999.938233401757, 46019.465933239902, 46038.995704872657, 46058.527547860547, 46078.06146176433, 46097.597446144995, 46117.135500563774, 46136.675624582109, 46156.217817761702, 46175.762079664462, 46195.308409852543, 46214.856807888333, 46234.407273334444, 46253.959805753715, 46273.51440470924, 46293.071069764315, 46312.629800482478, 46332.190596427499, 46351.753457163381, 46371.318382254351, 46390.885371264863, 46410.45442375962, 46430.025539303526, 46449.598717461733, 46469.17395779962, 46488.751259882782, 46508.33062327707, 46527.912047548532, 46547.495532263471, 46567.081076988397, 46586.668681290059, 46606.258344735434, 46625.850066891719, 46645.443847326351, 46665.039685606986, 46684.637581301497, 46704.237533978005, 46723.839543204842, 46743.443608550573, 46763.049729583989, 46782.657905874104, 46802.268136990162, 46821.880422501628, 46841.494761978196, 46861.111154989776, 46880.729601106526, 46900.350099898795, 46919.97265093719, 46939.597253792526, 46959.223908035841, 46978.852613238392, 46998.483368971691, 47018.11617480743, 47037.751030317551, 47057.387935074221, 47077.026888649809, 47096.66789061694, 47116.310940548428, 47135.956038017328, 47155.603182596918, 47175.252373860698, 47194.903611382375, 47214.556894735892, 47234.212223495422, 47253.869597235338, 47273.52901553025, 47293.19047795498, 47312.853984084577, 47332.519533494306, 47352.187125759658, 47371.856760456343, 47391.528437160297, 47411.202155447652, 47430.877914894787, 47450.555715078299, 47470.235555574982, 47489.917435961863, 47509.601355816201, 47529.287314715453, 47548.975312237308, 47568.665347959672, 47588.357421460656, 47608.051532318605, 47627.747680112072, 47647.445864419846, 47667.14608482091, 47686.848340894474, 47706.552632219973, 47726.258958377046, 47745.967318945557, 47765.677713505589, 47785.390141637428, 47805.104602921601, 47824.821096938824, 47844.539623270044, 47864.260181496429, 47883.982771199349, 47903.707391960394, 47923.434043361369, 47943.162724984308, 47962.893436411439, 47982.626177225218, 48002.36094700831, 48022.097745343599, 48041.836571814172, 48061.57742600335, 48081.32030749465, 48101.065215871815, 48120.81215071879, 48140.56111161974, 48160.312098159047, 48180.065109921306, 48199.820146491307, 48219.577207454073, 48239.336292394844, 48259.097400899045, 48278.860532552339, 48298.625686940592, 48318.392863649875, 48338.162062266485, 48357.933282376915, 48377.706523567889, 48397.481785426316, 48417.259067539344, 48437.038369494308, 48456.819690878765, 48476.603031280487, 48496.388390287451, 48516.175767487839, 48535.965162470042, 48555.756574822684, 48575.550004134566, 48595.345449994718, 48615.142911992378, 48634.942389716991, 48654.743882758201, 48674.547390705877, 48694.352913150084, 48714.160449681112, 48733.969999889443, 48753.781563365759, 48773.595139700978, 48793.410728486211, 48813.228329312769, 48833.047941772187, 48852.869565456189, 48872.693199956717, 48892.518844865925, 48912.346499776155, 48932.176164279976, 48952.007837970152, 48971.841520439666, 48991.677211281676, 49011.514910089587, 49031.354616456978, 49051.196329977654, 49071.04005024561, 49090.885776855059, 49110.733509400408, 49130.583247476279, 49150.434990677488, 49170.288738599062, 49190.144490836232, 49210.002246984441, 49229.86200663932, 49249.723769396718, 49269.587534852675, 49289.453302603448, 49309.32107224549, 49329.190843375451, 49349.062615590192, 49368.936388486785, 49388.812161662492, 49408.689934714785, 49428.569707241324, 49448.45147883999, 49468.335249108866, 49488.22101764621, 49508.108784050521, 49527.99854792047, 49547.890308854934, 49567.784066453009, 49587.679820313977, 49607.57757003732, 49627.477315222721, 49647.379055470075, 49667.28279037946, 49687.188519551179, 49707.096242585707, 49727.005959083741, 49746.917668646165, 49766.831370874068, 49786.747065368734, 49806.66475173166, 49826.584429564515, 49846.506098469203, 49866.429758047794, 49886.355407902578, 49906.283047636032, 49926.212676850846, 49946.144295149883, 49966.077902136225, 49986.013497413151, 50005.951080584135, 50025.890651252834, 50045.832209023123, 50065.775753499074, 50085.721284284933, 50105.668800985164, 50125.618303204428, 50145.569790547575, 50165.523262619652, 50185.478719025901, 50205.436159371769, 50225.395583262893, 50245.356990305103, 50265.320380104429, 50285.285752267104, 50305.253106399534, 50325.222442108337, 50345.193759000336, 50365.16705668252, 50385.142334762102, 50405.119592846473, 50425.098830543218, 50445.080047460127, 50465.063243205179, 50485.048417386541, 50505.035569612577, 50525.024699491856, 50545.015806633128, 50565.008890645338, 50585.003951137631, 50605.00098771933, 50624.999999999971, 50645.000987589265, 50665.003950097132, 50685.008887133677, 50705.015798309192, 50725.024683234165, 50745.035541519283, 50765.048372775411, 50785.063176613621, 50805.079952645159, 50825.098700481489, 50845.119419734241, 50865.142110015244, 50885.166770936521, 50905.193402110279, 50925.222003148934, 50945.252573665071, 50965.285113271471, 50985.319621581119, 51005.356098207172, 51025.394542762981, 51045.434954862096, 51065.477334118244, 51085.521680145357, 51105.567992557546, 51125.616270969113, 51145.66651499454, 51165.718724248516, 51185.772898345916, 51205.829036901778, 51225.887139531362, 51245.947205850105, 51266.009235473619, 51286.073228017718, 51306.139183098399, 51326.207100331856, 51346.276979334456, 51366.348819722756, 51386.42262111351, 51406.498383123653, 51426.57610537031, 51446.655787470787, 51466.737429042587, 51486.82102970338, 51506.906589071048, 51526.994106763632, 51547.083582399391, 51567.175015596738, 51587.268405974297, 51607.363753150858, 51627.461056745415, 51647.56031637713, 51667.661531665362, 51687.764702229651, 51707.869827689727, 51727.976907665499, 51748.085941777055, 51768.196929644677, 51788.309870888836, 51808.42476513017, 51828.541611989524, 51848.660411087905, 51868.781162046515, 51888.90386448674, 51909.028518030143, 51929.155122298485, 51949.283676913685, 51969.414181497872, 51989.546635673345, 52009.681039062583, 52029.817391288263, 52049.955691973213, 52070.095940740481, 52090.238137213273, 52110.382281014987, 52130.5283717692, 52150.676409099666, 52170.826392630333, 52190.97832198532, 52211.132196788931, 52231.288016665654, 52251.445781240145, 52271.60549013727, 52291.76714298204, 52311.930739399664, 52332.096279015546, 52352.263761455244, 52372.433186344519, 52392.604553309284, 52412.777861975665, 52432.953111969946, 52453.130302918595, 52473.309434448267, 52493.490506185793, 52513.67351775818, 52533.858468792605, 52554.045358916446, 52574.234187757254, 52594.42495494274, 52614.617660100812, 52634.812302859558, 52655.008882847229, 52675.20739969227, 52695.407853023295, 52715.610242469098, 52735.814567658657, 52756.02082822111, 52776.229023785803, 52796.439153982225, 52816.651218440056, 52836.865216789171, 52857.081148659599, 52877.29901368155, 52897.518811485425, 52917.740541701773, 52937.964203961354, 52958.18979789508, 52978.417323134046, 52998.646779309529, 53018.878166052978, 53039.111482996006, 53059.346729770419, 53079.583906008193, 53099.823011341483, 53120.0640454026, 53140.307007824063, 53160.551898238533, 53180.79871627887, 53201.047461578091, 53221.2981337694, 53241.550732486176, 53261.805257361964, 53282.061708030487, 53302.32008412564, 53322.580385281493, 53342.842611132299, 53363.106761312469, 53383.372835456597, 53403.640833199453, 53423.910754175973, 53444.18259802126, 53464.456364370613, 53484.732052859479, 53505.009663123499, 53525.289194798468, 53545.570647520362, 53565.854020925333, 53586.139314649699, 53606.426528329954, 53626.715661602764, 53647.006714104959, 53667.299685473547, 53687.59457534572, 53707.891383358816, 53728.190109150361, 53748.490752358055, 53768.793312619753, 53789.09778957349, 53809.404182857485, 53829.712492110106, 53850.022716969899, 53870.334857075584, 53890.648912066055, 53910.964881580367, 53931.28276525774, 53951.602562737586, 53971.924273659461, 53992.24789766311, 54012.57343438844, 54032.90088347553, 54053.23024456462, 54073.561517296133, 54093.894701310644, 54114.22979624891, 54134.566801751855, 54154.90571746057, 54175.246543016314, 54195.589278060506, 54215.933922234755, 54236.280475180814, 54256.628936540626, 54276.97930595628, 54297.331583070045, 54317.685767524359, 54338.041858961828, 54358.399857025215, 54378.759761357462, 54399.121571601667, 54419.485287401105, 54439.850908399218, 54460.218434239614, 54480.587864566056, 54500.95919902248, 54521.332437252997, 54541.707578901878, 54562.084623613555, 54582.46357103264, 54602.844420803893, 54623.227172572246, 54643.611825982807, 54663.998380680838, 54684.386836311773, 54704.777192521207, 54725.169448954897, 54745.563605258772, 54765.959661078923, 54786.357616061614, 54806.757469853255, 54827.159222100439, 54847.562872449904, 54867.968420548583, 54888.375866043534, 54908.785208582012, 54929.196447811417, 54949.609583379322, 54970.024614933463, 54990.441542121727, 55010.86036459219, 55031.28108199306, 55051.703693972733, 55072.128200179759, 55092.554600262847, 55112.982893870874, 55133.413080652877, 55153.845160258061, 55174.279132335789, 55194.714996535586, 55215.152752507143, 55235.592399900306, 55256.033938365079, 55276.477367551655, 55296.92268711036, 55317.369896691685, 55337.818995946305, 55358.269984525024, 55378.72286207883, 55399.177628258869, 55419.634282716441, 55440.092825103013, 55460.553255070205, 55481.015572269804, 55501.479776353764, 55521.945866974187, 55542.413843783339, 55562.883706433655, 55583.355454577715, 55603.82908786826, 55624.304605958219, 55644.782008500639, 55665.261295148754, 55685.742465555952, 55706.225519375774, 55726.710456261928, 55747.197275868275, 55767.685977848843, 55788.176561857814, 55808.669027549528, 55829.163374578478, 55849.659602599328, 55870.157711266889, 55890.657700236145, 55911.159569162221, 55931.663317700411, 55952.168945506164, 55972.676452235086, 55993.185837542944, 56013.697101085651, 56034.210242519301, 56054.72526150012, 56075.242157684508, 56095.760930729011, 56116.281580290342, 56136.804106025367, 56157.328507591104, 56177.85478464474, 56198.382936843598, 56218.912963845185, 56239.444865307138, 56259.978640887268, 56280.514290243525, 56301.051813034042, 56321.591208917082, 56342.13247755108, 56362.675618594607, 56383.220631706419, 56403.767516545398, 56424.316272770608, 56444.866900041241, 56465.419398016667, 56485.973766356394, 56506.530004720102, 56527.088112767611, 56547.648090158902, 56568.209936554107, 56588.773651613519, 56609.339234997584, 56629.9066863669, 56650.47600538221, 56671.04719170442, 56691.620244994599, 56712.195164913959, 56732.771951123868, 56753.350603285835, 56773.931121061541, 56794.513504112823, 56815.097752101647, 56835.683864690152, 56856.271841540627, 56876.86168231551, 56897.453386677393, 56918.046954289028, 56938.642384813298, 56959.239677913261, 56979.838833252121, 57000.439850493225, 57021.04272930009, 57041.647469336371, 57062.254070265873, 57082.862531752558, 57103.472853460553, 57124.085035054108, 57144.699076197649, 57165.314976555739, 57185.932735793103, 57206.552353574611, 57227.173829565276, 57247.797163430281, 57268.42235483494, 57289.049403444733, 57309.678308925286, 57330.30907094237, 57350.941689161911, 57371.576163249985, 57392.212492872815, 57412.850677696784, 57433.490717388406, 57454.132611614368, 57474.776360041491, 57495.421962336746, 57516.069418167266, 57536.718727200314, 57557.36988910332, 57578.022903543861, 57598.677770189643, 57619.334488708548, 57639.993058768589, 57660.653480037938, 57681.315752184906, 57701.979874877965, 57722.64584778573, 57743.31367057695, 57763.983342920546, 57784.654864485572, 57805.328234941233, 57826.003453956881, 57846.680521202026, 57867.359436346305, 57888.040199059527, 57908.722809011633, 57929.407265872709, 57950.093569313001, 57970.781719002895, 57991.471714612911, 58012.16355581375, 58032.857242276223, 58053.552773671312, 58074.25014967013, 58094.949369943948, 58115.650434164185, 58136.353342002389, 58157.058093130276, 58177.764687219693, 58198.47312394264, 58219.183402971255, 58239.895523977837, 58260.609486634821, 58281.325290614775, 58302.042935590434, 58322.762421234678, 58343.483747220511, 58364.206913221096, 58384.931918909751, 58405.658763959924, 58426.3874480452, 58447.117970839339, 58467.85033201622, 58488.584531249864, 58509.320568214462, 58530.058442584334, 58550.798154033931, 58571.539702237875, 58592.283086870906, 58613.028307607929, 58633.775364123983, 58654.52425609425, 58675.274983194053, 58696.027545098877, 58716.781941484325, 58737.538172026158, 58758.296236400274, 58779.056134282728, 58799.817865349694, 58820.581429277503, 58841.346825742643, 58862.114054421712, 58882.883114991484, 58903.654007128847, 58924.426730510851, 58945.201284814684, 58965.977669717664, 58986.755884897269, 59007.535930031117, 59028.317804796949, 59049.101508872664, 59069.887041936301, 59090.674403666046, 59111.463593740213, 59132.254611837263, 59153.047457635803, 59173.84213081457, 59194.638631052461, 59215.436958028506, 59236.237111421855, 59257.039090911829, 59277.842896177877, 59298.648526899589, 59319.455982756685, 59340.26526342905, 59361.076368596696, 59381.889297939757, 59402.704051138542, 59423.520627873484, 59444.339027825139, 59465.159250674224, 59485.9812961016, 59506.805163788253, 59527.630853415307, 59548.458364664046, 59569.287697215863, 59590.118850752311, 59610.951824955089, 59631.786619506012, 59652.623234087048, 59673.461668380311, 59694.301922068029, 59715.143994832593, 59735.987886356525, 59756.833596322482, 59777.681124413255, 59798.530470311794, 59819.381633701159, 59840.234614264569, 59861.089411685381, 59881.94602564707, 59902.804455833269, 59923.664701927737, 59944.526763614384, 59965.390640577243, 59986.256332500488, 60007.123839068438, 60027.993159965539, 60048.864294876381, 60069.737243485688, 60090.612005478324, 60111.488580539284, 60132.366968353708, 60153.247168606867, 60174.129180984164, 60195.013005171153, 60215.898640853513, 60236.786087717061, 60257.675345447751, 60278.566413731671, 60299.459292255044, 60320.353980704247, 60341.25047876576, 60362.148786126229, 60383.048902472423, 60403.950827491237, 60424.854560869717, 60445.76010229504, 60466.667451454516, 60487.57660803559, 60508.487571725847, 60529.400342212997, 60550.314919184893, 60571.231302329521, 60592.149491335003, 60613.069485889588, 60633.991285681674, 60654.914890399785, 60675.840299732568, 60696.767513368832, 60717.696530997484, 60738.627352307602, 60759.55997698837, 60780.494404729128, 60801.430635219323, 60822.368668148556, 60843.308503206565, 60864.250140083204, 60885.193578468468, 60906.138818052495, 60927.085858525541, 60948.034699578006, 60968.985340900421, 60989.937782183442, 61010.892023117864, 61031.848063394616, 61052.805902704764, 61073.765540739492, 61094.726977190134, 61115.690211748137, 61136.655244105103, 61157.622073952742, 61178.590700982917, 61199.561124887616, 61220.533345358948, 61241.507362089171, 61262.483174770663, 61283.460783095943, 61304.440186757645, 61325.421385448557, 61346.404378861582, 61367.389166689762, 61388.375748626262, 61409.364124364387, 61430.354293597571, 61451.346256019373, 61472.340011323497, 61493.335559203762, 61514.332899354122, 61535.332031468672, 61556.332955241618, 61577.335670367313, 61598.340176540238, 61619.346473454993, 61640.354560806329, 61661.3644382891, 61682.376105598312, 61703.389562429089, 61724.404808476691, 61745.42184343651, 61766.440667004063, 61787.461278874987, 61808.483678745069, 61829.507866310203, 61850.533841266435, 61871.561603309929, 61892.591152136971, 61913.622487443987, 61934.655608927525, 61955.690516284267, 61976.727209211022, 61997.765687404724, 62018.805950562448, 62039.847998381381, 62060.891830558845, 62081.93744679229, 62102.984846779298, 62124.034030217575, 62145.084996804966, 62166.137746239416, 62187.19227821903, 62208.248592442025, 62229.306688606739, 62250.366566411656, 62271.428225555377, 62292.491665736627, 62313.556886654267, 62334.623888007271, 62355.692669494762, 62376.763230815974, 62397.835571670272, 62418.909691757144, 62439.98559077621, 62461.063268427228, 62482.142724410049, 62503.223958424685, 62524.306970171267, 62545.39175935003, 62566.478325661366, 62587.566668805768, 62608.656788483881, 62629.748684396451, 62650.842356244357, 62671.937803728622, 62693.035026550366, 62714.134024410858, 62735.234797011479, 62756.337344053733, 62777.441665239276, 62798.547760269852, 62819.655628847358, 62840.765270673801, 62861.876685451323, 62882.989872882186, 62904.104832668774, 62925.221564513602, 62946.340068119309, 62967.460343188657, 62988.582389424526, 63009.70620652994, 63030.831794208025, 63051.959152162039, 63073.08828009537, 63094.219177711529, 63115.351844714154, 63136.486280806988, 63157.622485693922, 63178.760459078956, 63199.900200666219, 63221.041710159967, 63242.184987264569, 63263.330031684534, 63284.476843124474, 63305.625421289144, 63326.775765883409, 63347.927876612259, 63369.081753180813, 63390.237395294316, 63411.39480265812, 63432.553974977716, 63453.714911958712, 63474.877613306839, 63496.042078727944, 63517.208307927998, 63538.376300613119, 63559.546056489504, 63580.717575263516, 63601.890856641607, 63623.065900330374, 63644.242706036515, 63665.421273466869, 63686.601602328381, 63707.783692328136, 63728.967543173334, 63750.153154571279, 63771.340526229418, 63792.529657855317, 63813.720549156649, 63834.913199841227, 63856.107609616978, 63877.303778191941, 63898.501705274284, 63919.7013905723, 63940.902833794404, 63962.106034649114, 63983.310992845094, 64004.517708091109, 64025.726180096048, 64046.936408568938, 64068.1483932189, 64089.362133755196, 64110.577629887193, 64131.794881324393, 64153.013887776404, 64174.234648952966, 64195.457164563937, 64216.681434319289, 64237.907457929112, 64259.135235103626, 64280.36476555316, 64301.596048988169, 64322.829085119236, 64344.06387365704, 64365.300414312398, 64386.538706796251, 64407.778750819634, 64429.020546093721, 64450.26409232981, 64471.509389239291, 64492.756436533709, 64514.005233924705, 64535.255781124033, 64556.50807784358, 64577.762123795357, 64599.017918691468, 64620.275462244172, 64641.534754165805, 64662.795794168844, 64684.058581965895, 64705.323117269661, 64726.589399792974, 64747.857429248776, 64769.127205350138, 64790.398727810236, 64811.671996342375, 64832.947010659969, 64854.223770476558, 64875.502275505794, 64896.782525461451, 64918.064520057414, 64939.348259007682, 64960.633742026388, 64981.920968827762, 65003.209939126165, 65024.500652636067, 65045.793109072067, 65067.087308148861, 65088.383249581282, 65109.680933084259, 65130.980358372864, 65152.28152516226, 65173.584433167736, 65194.889082104703, 65216.195471688683, 65237.503601635319, 65258.813471660353, 65280.125081479666, 65301.438430809241, 65322.753519365178, 65344.070346863708, 65365.388913021146, 65386.709217553958, 65408.031260178701, 65429.355040612056, 65450.680558570821, 65472.00781377191, 65493.336805932355, 65514.66753476928, 65535.999999999956, 65557.334201341757, 65578.670138512171, 65600.007811228788, 65621.347219209332, 65642.688362171626, 65664.031239833639, 65685.375851913413, 65706.722198129137, 65728.070278199084, 65749.420091841661, 65770.771638775404, 65792.124918718939, 65813.479931391004, 65834.836676510458, 65856.195153796303, 65877.5553629676, 65898.917303743554, 65920.280975843489, 65941.646378986843, 65963.013512893158, 65984.382377282076, 66005.752971873386, 66027.125296386963, 66048.499350542799, 66069.875134061018, 66091.252646661844, 66112.631888065618, 66134.01285799277, 66155.395556163887, 66176.779982299631, 66198.166136120795, 66219.554017348273, 66240.943625703105, 66262.334960906388, 66283.728022679396, 66305.122810743444, 66326.519324820023, 66347.917564630698, 66369.317529897162, 66390.719220341227, 66412.122635684791, 66433.527775649884, 66454.934639958636, 66476.343228333324, 66497.753540496284, 66519.165576169995, 66540.57933507704, 66561.994816940118, 66583.412021482043, 66604.830948425733, 66626.251597494222, 66647.673968410629, 66669.098060898235, 66690.523874680381, 66711.951409480564, 66733.380665022371, 66754.811641029475, 66776.244337225711, 66797.678753334985, 66819.11488908132, 66840.552744188884, 66861.992318381905, 66883.433611384738, 66904.876622921889, 66926.321352717903, 66947.767800497502, 66969.215965985466, 66990.665848906734, 67012.117448986304, 67033.570765949335, 67055.025799521056, 67076.482549426815, 67097.941015392076, 67119.401197142433, 67140.863094403554, 67162.326706901222, 67183.792034361351, 67205.259076509959, 67226.72783307315, 67248.198303777172, 67269.670488348347, 67291.144386513144, 67312.619997998088, 67334.09732252988, 67355.576359835293, 67377.057109641188, 67398.53957167457, 67420.023745662547, 67441.50963133233, 67462.99722841123, 67484.486536626689, 67505.977555706224, 67527.470285377494, 67548.964725368263, 67570.460875406367, 67591.9587352198, 67613.458304536631, 67634.95958308503, 67656.462570593329, 67677.967266789899, 67699.473671403248, 67720.981784162024, 67742.491604794923, 67764.003133030797, 67785.516368598575, 67807.031311227314, 67828.547960646174, 67850.066316584402, 67871.58637877139, 67893.108146936589, 67914.63162080961, 67936.156800120138, 67957.683684597971, 67979.212273973011, 68000.742567975263, 68022.274566334876, 68043.808268782057, 68065.343675047145, 68086.880784860579, 68108.419597952918, 68129.960114054789, 68151.502332896969, 68173.04625421032, 68194.591877725834, 68216.139203174564, 68237.688230287706, 68259.238958796544, 68280.791388432481, 68302.345518927032, 68323.901350011787, 68345.458881418483, 68367.018112878912, 68388.579044125028, 68410.141674888844, 68431.706004902502, 68453.272033898262, 68474.839761608455, 68496.409187765545, 68517.980312102081, 68539.553134350732, 68561.127654244279, 68582.70387151558, 68604.281785897634, 68625.861397123503, 68647.44270492639, 68669.025709039604, 68690.610409196524, 68712.196805130661, 68733.784896575627, 68755.374683265123, 68776.966164932994, 68798.559341313128, 68820.154212139591, 68841.750777146473, 68863.349036068044, 68884.948988638629, 68906.550634592684, 68928.153973664739, 68949.75900558944, 68971.365730101577, 68992.974146935987, 69014.584255827634, 69036.196056511588, 69057.809548723017, 69079.424732197207, 69101.041606669532, 69122.660171875468, 69144.280427550606, 69165.902373430625, 69187.526009251334, 69209.151334748618, 69230.778349658474, 69252.40705371699, 69274.037446660412, 69295.669528225, 69317.303298147192, 69338.938756163494, 69360.575902010532, 69382.214735425005, 69403.855256143754, 69425.497463903681, 69447.141358441833, 69468.78693949533, 69490.434206801394, 69512.083160097391, 69533.733799120717, 69555.386123608929, 69577.04013329967, 69598.695827930685, 69620.353207239794, 69642.012270964973, 69663.67301884426, 69685.335450615792, 69706.999566017839, 69728.665364788743, 69750.332846666963, 69772.002011391058, 69793.672858699691, 69815.345388331611, 69837.019600025669, 69858.695493520849, 69880.373068556204, 69902.052324870907, 69923.733262204216, 69945.415880295492, 69967.100178884211, 69988.786157709939, 70010.473816512356, 70032.163155031216, 70053.854173006403, 70075.546870177874, 70097.241246285717, 70118.937301070109, 70140.635034271298, 70162.334445629691, 70184.035534885741, 70205.738301780017, 70227.442746053217, 70249.1488674461, 70270.856665699539, 70292.566140554511, 70314.277291752107, 70335.990119033493, 70357.704622139936, 70379.420800812819, 70401.138654793613, 70422.85818382389, 70444.579387645339, 70466.302265999722, 70488.026818628918, 70509.753045274876, 70531.480945679708, 70553.210519585555, 70574.941766734701, 70596.674686869505, 70618.409279732456, 70640.145545066101, 70661.883482613106, 70683.623092116264, 70705.364373318414, 70727.107325962526, 70748.851949791671, 70770.598244549008, 70792.346209977783, 70814.095845821372, 70835.847151823225, 70857.600127726895, 70879.354773276034, 70901.111088214413, 70922.869072285859, 70944.628725234332, 70966.390046803877, 70988.153036738629, 71009.917694782853, 71031.684020680885, 71053.45201417715, 71075.221675016204, 71096.993002942661, 71118.765997701266, 71140.540659036851, 71162.316986694335, 71184.09498041874, 71205.874639955218, 71227.655965048951, 71249.438955445294, 71271.223610889632, 71293.009931127483, 71314.797915904477, 71336.587564966307, 71358.378878058764, 71380.171854927772, 71401.966495319313, 71423.762798979486, 71445.560765654489, 71467.360395090596, 71489.161687034211, 71510.964641231811, 71532.769257429973, 71554.575535375348, 71576.383474814749, 71598.19307549503, 71620.004337163133, 71641.817259566145, 71663.631842451214, 71685.4480855656, 71707.26598865664, 71729.085551471784, 71750.906773758586, 71772.729655264673, 71794.554195737772, 71816.380394925713, 71838.208252576442, 71860.037768437964, 71881.868942258385, 71903.701773785942, 71925.536262768932, 71947.372408955751, 71969.210212094898, 71991.049671934976, 72012.890788224686, 72034.73356071279, 72056.577989148165, 72078.424073279821, 72100.271812856794, 72122.121207628254, 72143.97225734347, 72165.824961751801, 72187.679320602692, 72209.53533364569, 72231.393000630429, 72253.252321306645, 72275.113295424177, 72296.975922732949, 72318.840202982959, 72340.706135924338, 72362.573721307272, 72384.442958882093, 72406.313848399179, 72428.186389609036, 72450.060582262216, 72471.936426109431, 72493.813920901433, 72515.693066389096, 72537.573862323392, 72559.456308455352, 72581.340404536139, 72603.226150316987, 72625.113545549248, 72647.002589984331, 72668.893283373764, 72690.785625469172, 72712.679616022273, 72734.575254784853, 72756.472541508803, 72778.371475946144, 72800.272057848939, 72822.174286969355, 72844.07816305969, 72865.983685872285, 72887.890855159596, 72909.799670674183, 72931.710132168693, 72953.622239395845, 72975.535992108475, 72997.451390059519, 73019.368433001961, 73041.287120688925, 73063.207452873612, 73085.129429309294, 73107.053049749389, 73128.978313947344, 73150.905221656736, 73172.833772631217, 73194.763966624567, 73216.695803390612, 73238.62928268328, 73260.564404256627, 73282.501167864757, 73304.439573261901, 73326.379620202337, 73348.321308440485, 73370.264637730841, 73392.209607827957, 73414.156218486532, 73436.104469461323, 73458.054360507173, 73480.005891379056, 73501.959061831993, 73523.913871621116, 73545.870320501665, 73567.828408228932, 73589.78813455833, 73611.749499245358, 73633.712502045615, 73655.677142714747, 73677.643421008557, 73699.611336682879, 73721.580889493693, 73743.552079197019, 73765.524905548999, 73787.499368305856, 73809.475467223907, 73831.453202059551, 73853.432572569291, 73875.413578509717, 73897.396219637507, 73919.380495709411, 73941.36640648231, 73963.353951713143, 73985.343131158952, 74007.333944576865, 74029.326391724098, 74051.320472357969, 74073.316186235883, 74095.313533115303, 74117.312512753837, 74139.313124909138, 74161.315369338976, 74183.319245801191, 74205.324754053727, 74227.331893854629, 74249.340664961986, 74271.351067134034, 74293.363100129049, 74315.376763705441, 74337.392057621662, 74359.408981636298, 74381.427535508003, 74403.447718995507, 74425.469531857671, 74447.492973853383, 74469.518044741693, 74491.54474428168, 74513.573072232539, 74535.603028353551, 74557.634612404087, 74579.667824143602, 74601.702663331642, 74623.739129727837, 74645.777223091936, 74667.816943183716, 74689.858289763113, 74711.901262590094, 74733.945861424741, 74755.992086027225, 74778.039936157802, 74800.089411576817, 74822.140512044702, 74844.193237321961, 74866.24758716923, 74888.303561347187, 74910.36115961663, 74932.420381738411, 74954.481227473516, 74976.543696582972, 74998.607788827925, 75020.673503969607, 75042.740841769322, 75064.809801988464, 75086.88038438854, 75108.952588731103, 75131.026414777836, 75153.101862290467, 75175.178931030852, 75197.257620760924, 75219.33793124267, 75241.419862238225, 75263.503413509738, 75285.588584819503, 75307.675375929874, 75329.763786603318, 75351.853816602365, 75373.945465689612, 75396.038733627807, 75418.133620179724, 75440.230125108254, 75462.32824817636, 75484.427989147109, 75506.529347783653, 75528.63232384919, 75550.736917107075, 75572.843127320695, 75594.950954253538, 75617.060397669193, 75639.171457331307, 75661.284133003646, 75683.398424450032, 75705.514331434402, 75727.631853720741, 75749.750991073175, 75771.871743255862, 75793.994110033076, 75816.118091169177, 75838.243686428585, 75860.370895575848, 75882.499718375562, 75904.630154592422, 75926.762203991224, 75948.895866336825, 75971.031141394182, 75993.168028928325, 76015.306528704401, 76037.4466404876, 76059.588364043215, 76081.731699136653, 76103.876645533353, 76126.023202998884, 76148.171371298871, 76170.321150199044, 76192.472539465205, 76214.625538863256, 76236.780148159174, 76258.936367119008, 76281.094195508922, 76303.253633095141, 76325.414679643975, 76347.577334921851, 76369.741598695226, 76391.907470730686, 76414.074950794879, 76436.244038654564, 76458.414734076548, 76480.587036827754, 76502.760946675175, 76524.936463385893, 76547.11358672705, 76569.292316465915, 76591.472652369819, 76613.654594206164, 76635.838141742468, 76658.023294746308, 76680.210052985349, 76702.398416227341, 76724.588384240138, 76746.779956791637, 76768.973133649866, 76791.167914582897, 76813.364299358902, 76835.562287746157, 76857.761879512967, 76879.963074427797, 76902.165872259109, 76924.37027277553, 76946.576275745727, 76968.783880938441, 76990.993088122515, 77013.203897066895, 77035.416307540567, 77057.630319312622, 77079.845932152239, 77102.063145828695, 77124.281960111301, 77146.50237476948, 77168.724389572759, 77190.948004290723, 77213.173218693031, 77235.400032549442, 77257.628445629802, 77279.858457704031, 77302.090068542122, 77324.323277914169, 77346.558085590339, 77368.794491340886, 77391.032494936138, 77413.272096146524, 77435.51329474253, 77457.756090494731, 77480.000483173804, 77502.246472550498, 77524.494058395634, 77546.743240480107, 77568.994018574944, 77591.246392451198, 77613.500361880026, 77635.755926632657, 77658.013086480438, 77680.271841194757, 77702.532190547092, 77724.794134309021, 77747.057672252195, 77769.322804148323, 77791.589529769248, 77813.857848886837, 77836.127761273063, 77858.399266699998, 77880.67236493979, 77902.947055764627, 77925.223338946831, 77947.50121425878, 77969.780681472927, 77992.061740361838, 78014.344390698127, 78036.628632254491, 78058.914464803747, 78081.201888118725, 78103.490901972415, 78125.781506137821, 78148.073700388064, 78170.367484496339, 78192.662858235926, 78214.959821380166, 78237.258373702498, 78259.558514976452, 78281.860244975614, 78304.163563473659, 78326.468470244363, 78348.77496506153, 78371.083047699125, 78393.392717931114, 78415.703975531578, 78438.016820274701, 78460.331251934695, 78482.647270285903, 78504.964875102727, 78527.284066159627, 78549.604843231195, 78571.927206092048, 78594.251154516911, 78616.576688280606, 78638.903807157985, 78661.232510924034, 78683.562799353778, 78705.894672222363, 78728.228129304945, 78750.563170376859, 78772.899795213423, 78795.238003590101, 78817.577795282399, 78839.919170065928, 78862.262127716356, 78884.606668009452, 78906.952790721043, 78929.300495627045, 78951.64978250346, 78974.000651126378, 78996.353101271932, 79018.707132716358, 79041.062745235977, 79063.41993860717, 79085.778712606436, 79108.139067010285, 79130.501001595389, 79152.864516138419, 79175.22961041618, 79197.596284205531, 79219.96453728342, 79242.33436942687, 79264.705780412987, 79287.078770018954, 79309.453338022009, 79331.829484199508, 79354.207208328866, 79376.586510187582, 79398.967389553218, 79421.349846203433, 79443.733879915948, 79466.119490468584, 79488.50667763922, 79510.895441205823, 79533.285780946433, 79555.677696639163, 79578.071188062226, 79600.466254993895, 79622.862897212515, 79645.261114496549, 79667.660906624471, 79690.062273374875, 79712.465214526455, 79734.869729857935, 79757.275819148126, 79779.683482175955, 79802.092718720378, 79824.503528560454, 79846.915911475327, 79869.329867244203, 79891.745395646343, 79914.162496461155, 79936.581169468045, 79959.001414446553, 79981.423231176261, 80003.846619436852, 80026.271579008084, 80048.698109669771, 80071.12621120183, 80093.555883384237, 80115.987125997053, 80138.419938820414, 80160.854321634528, 80183.290274219689, 80205.727796356281, 80228.166887824715, 80250.607548405547, 80273.049777879336, 80295.493576026798, 80317.938942628651, 80340.385877465727, 80362.834380318949, 80385.28445096928, 80407.736089197788, 80430.189294785596, 80452.644067513917, 80475.100407164035, 80497.558313517322, 80520.017786355209, 80542.478825459213, 80564.941430610925, 80587.405601592007, 80609.871338184195, 80632.338640169342, 80654.8075073293, 80677.277939446067, 80699.749936301683, 80722.223497678278, 80744.698623358039, 80767.17531312324, 80789.653566756242, 80812.133384039465, 80834.614764755403, 80857.097708686648, 80879.582215615854, 80902.068285325731, 80924.555917599093, 80947.045112218824, 80969.535868967869, 80992.028187629272, 81014.522067986123, 81037.017509821613, 81059.514512919006, 81082.013077061609, 81104.513202032831, 81127.014887616184, 81149.518133595193, 81172.022939753486, 81194.529305874807, 81217.037231742899, 81239.546717141639, 81262.057761854958, 81284.570365666848, 81307.084528361403, 81329.600249722775, 81352.117529535186, 81374.636367582949, 81397.156763650448, 81419.678717522125, 81442.202228982511, 81464.727297816222, 81487.253923807933, 81509.782106742379, 81532.311846404409, 81554.843142578902, 81577.375995050839, 81599.910403605274, 81622.446368027333, 81644.983888102215, 81667.522963615178, 81690.063594351581, 81712.605780096841, 81735.149520636449, 81757.694815755967, 81780.241665241047, 81802.79006887741, 81825.340026450824, 81847.891537747171, 81870.444602552379, 81892.999220652477, 81915.555391833506, 81938.113115881672, 81960.672392583176, 81983.233221724338, 82005.795603091537, 82028.359536471224, 82050.925021649906, 82073.492058414209, 82096.060646550788, 82118.630785846399, 82141.202476087841, 82163.775717062032, 82186.35050855593, 82208.926850356569, 82231.504742251054, 82254.084184026578, 82276.665175470393, 82299.24771636985, 82321.831806512317, 82344.417445685307, 82367.004633676348, 82389.593370273054, 82412.183655263143, 82434.775488434374, 82457.368869574595, 82479.963798471697, 82502.560274913689, 82525.158298688606, 82547.757869584602, 82570.35898738986, 82592.961651892678, 82615.565862881398, 82638.171620144421, 82660.778923470265, 82683.387772647475, 82705.998167464713, 82728.610107710658, 82751.223593174116, 82773.83862364394, 82796.45519890904, 82819.073318758441, 82841.692982981185, 82864.314191366429, 82886.936943703375, 82909.561239781324, 82932.187079389638, 82954.814462317736, 82977.443388355125, 83000.073857291369, 83022.70586891612, 83045.339423019104, 83067.974519390089, 83090.611157818959, 83113.249338095629, 83135.8890600101, 83158.530323352461, 83181.173127912858, 83203.817473481497, 83226.463359848669, 83249.11078680474, 83271.759754140134, 83294.410261645375, 83317.062309111003, 83339.715896327703, 83362.371023086147, 83385.027689177165, 83407.685894391587, 83430.345638520361, 83453.006921354478, 83475.669742685001, 83498.334102303095, 83520.999999999942, 83543.667435566866, 83566.336408795192, 83589.006919476349, 83611.678967401851, 83634.352552363242, 83657.027674152167, 83679.704332560359, 83702.382527379552, 83725.062258401638, 83747.743525418511, 83770.42632822218, 83793.110666604684, 83815.796540358162, 83838.483949274829, 83861.172893146941, 83883.863371766842, 83906.555384926964, 83929.248932419752, 83951.944014037799, 83974.640629573696, 83997.338778820151, 84020.038461569929, 84042.739677615857, 84065.442426750829, 84088.146708767847, 84110.852523459922, 84133.559870620171, 84156.268750041796, 84178.979161518029, 84201.691104842204, 84224.404579807713, 84247.119586208006, 84269.83612383662, 84292.55419248715, 84315.273791953281, 84337.994922028738, 84360.717582507335, 84383.441773182945, 84406.167493849513, 84428.894744301069, 84451.623524331691, 84474.353833735542, 84497.085672306828, 84519.819039839858, 84542.553936128999, 84565.290360968676, 84588.028314153402, 84610.767795477717, 84633.508804736295, 84656.251341723822, 84678.995406235073, 84701.740998064924, 84724.488117008252, 84747.236762860062, 84769.986935415407, 84792.73863446941, 84815.491859817252, 84838.246611254188, 84861.002888575575, 84883.760691576768, 84906.520020053256, 84929.28087380057, 84952.043252614312, 84974.807156290146, 84997.572584623806, 85020.339537411113, 85043.108014447949, 85065.878015530237, 85088.649540453989, 85111.422589015303, 85134.197161010321, 85156.973256235244, 85179.750874486374, 85202.530015560071, 85225.310679252725, 85248.092865360857, 85270.876573681016, 85293.661804009811, 85316.448556143951, 85339.236829880188, 85362.026625015351, 85384.817941346351, 85407.610778670132, 85430.405136783724, 85453.201015484257, 85475.998414568865, 85498.797333834795, 85521.597773079353, 85544.399732099904, 85567.203210693886, 85590.008208658808, 85612.814725792239, 85635.62276189182, 85658.432316755265, 85681.243390180331, 85704.055981964877, 85726.870091906807, 85749.685719804082, 85772.502865454764, 85795.321528656961, 85818.141709208852, 85840.963406908675, 85863.78662155474, 85886.611352945445, 85909.437600879217, 85932.26536515457, 85955.094645570091, 85977.92544192441, 86000.757754016275, 86023.591581644432, 86046.426924607746, 86069.263782705122, 86092.102155735556, 86114.942043498071, 86137.783445791807, 86160.626362415918, 86183.470793169676, 86206.316737852379, 86229.164196263402, 86252.013168202204, 86274.863653468303, 86297.715651861261, 86320.569163180728, 86343.424187226425, 86366.280723798132, 86389.138772695675, 86411.998333718977, 86434.859406668009, 86457.721991342827, 86480.586087543532, 86503.451695070296, 86526.318813723352, 86549.187443303032, 86572.057583609683, 86594.929234443756, 86617.802395605773, 86640.677066896271, 86663.553248115903, 86686.43093906538, 86709.310139545443, 86732.190849356964, 86755.073068300815, 86777.956796177954, 86800.842032789442, 86823.728777936354, 86846.617031419853, 86869.506793041175, 86892.398062601613, 86915.290839902518, 86938.185124745316, 86961.080916931489, 86983.978216262592, 87006.87702254027, 87029.777335566177, 87052.67915514209, 87075.582481069796, 87098.487313151185, 87121.39365118822, 87144.301494982894, 87167.210844337285, 87190.121699053532, 87213.034058933845, 87235.947923780506, 87258.863293395829, 87281.780167582241, 87304.698546142172, 87327.618428878181, 87350.539815592856, 87373.462706088845, 87396.387100168897, 87419.312997635774, 87442.240398292357, 87465.16930194154, 87488.099708386319, 87511.031617429733, 87533.965028874911, 87556.899942525008, 87579.836358183282, 87602.774275653021, 87625.713694737613, 87648.654615240492, 87671.597036965148, 87694.540959715145, 87717.486383294105, 87740.433307505737, 87763.381732153779, 87786.331657042057, 87809.283081974456, 87832.236006754916, 87855.190431187453, 87878.146355076155, 87901.103778225151, 87924.062700438633, 87947.023121520891, 87969.985041276246, 87992.948459509105, 88015.913376023906, 88038.879790625171, 88061.847703117513, 88084.817113305573, 88107.788020994049, 88130.760425987726, 88153.734328091465, 88176.709727110137, 88199.686622848749, 88222.665015112303, 88245.644903705906, 88268.626288434709, 88291.609169103947, 88314.593545518903, 88337.579417484914, 88360.566784807408, 88383.555647291854, 88406.546004743795, 88429.537856968818, 88452.531203772611, 88475.52604496089, 88498.522380339447, 88521.52020971413, 88544.519532890874, 88567.520349675644, 88590.522659874507, 88613.526463293543, 88636.531759738922, 88659.538549016899, 88682.546830933745, 88705.556605295846, 88728.567871909589, 88751.580630581491, 88774.594881118086, 88797.610623325963, 88820.62785701183, 88843.646581982393, 88866.666798044462, 88889.688505004888, 88912.711702670611, 88935.7363908486, 88958.762569345898, 88981.790237969632, 89004.81939652696, 89027.850044825114, 89050.882182671412, 89073.9158098732, 89096.950926237885, 89119.987531572973, 89143.025625686001, 89166.065208384563, 89189.106279476357, 89212.148838769106, 89235.192886070581, 89258.238421188667, 89281.285443931265, 89304.333954106376, 89327.383951522017, 89350.435435986306, 89373.488407307406, 89396.542865293537, 89419.598809753006, 89442.656240494165, 89465.715157325409, 89488.775560055219, 89511.837448492137, 89534.900822444746, 89557.965681721733, 89581.032026131812, 89604.099855483742, 89627.169169586399, 89650.239968248672, 89673.312251279538, 89696.386018488018, 89719.461269683205, 89742.53800467425, 89765.616223270365, 89788.69592528083, 89811.777110514988, 89834.859778782207, 89857.943929891975, 89881.029563653807, 89904.116679877261, 89927.205278372014, 89950.29535894774, 89973.386921414218, 89996.479965581268, 90019.574491258769, 90042.670498256688, 90065.767986385021, 90088.866955453836, 90111.967405273259, 90135.069335653476, 90158.172746404758, 90181.277637337407, 90204.384008261797, 90227.49185898836, 90250.601189327586, 90273.711999090039, 90296.824288086325, 90319.938056127125, 90343.053303023189, 90366.170028585286, 90389.288232624298, 90412.407914951138, 90435.529075376777, 90458.651713712257, 90481.775829768681, 90504.901423357209, 90528.028494289058, 90551.157042375504, 90574.287067427911, 90597.418569257643, 90620.551547676194, 90643.686002495073, 90666.821933525847, 90689.959340580186, 90713.098223469773, 90736.238582006365, 90759.380416001804, 90782.523725267951, 90805.668509616764, 90828.814768860233, 90851.962502810435, 90875.11171127946, 90898.262394079517, 90921.414551022855, 90944.568181921743, 90967.72328658856, 90990.879864835719, 91014.037916475718, 91037.19744132107, 91060.358439184391, 91083.520909878338, 91106.684853215629, 91129.850269009039, 91153.017157071401, 91176.185517215621, 91199.355349254649, 91222.526653001492, 91245.699428269247, 91268.873674871036, 91292.049392620058, 91315.226581329553, 91338.405240812834, 91361.585370883287, 91384.766971354344, 91407.950042039476, 91431.134582752245, 91454.320593306256, 91477.508073515171, 91500.697023192712, 91523.887442152685, 91547.07933020893, 91570.272687175326, 91593.467512865856, 91616.663807094534, 91639.861569675442, 91663.060800422725, 91686.261499150554, 91709.463665673218, 91732.66729980502, 91755.872401360321, 91779.078970153569, 91802.287005999257, 91825.49650871192, 91848.707478106167, 91871.91991399668, 91895.133816198169, 91918.349184525418, 91941.566018793281, 91964.784318816659, 91988.004084410495, 92011.22531538982, 92034.448011569708, 92057.672172765277, 92080.897798791746, 92104.124889464365, 92127.353444598411, 92150.58346400928, 92173.814947512379, 92197.04789492322, 92220.282306057314, 92243.518180730272, 92266.755518757753, 92289.994319955469, 92313.234584139194, 92336.476311124774, 92359.719500728082, 92382.964152765067, 92406.210267051734, 92429.457843404161, 92452.706881638471, 92475.957381570814, 92499.209343017443, 92522.462765794655, 92545.717649718805, 92568.973994606305, 92592.231800273614, 92615.491066537259, 92638.751793213814, 92662.01398011994, 92685.277627072326, 92708.54273388772, 92731.809300382942, 92755.077326374871, 92778.346811680414, 92801.617756116568, 92824.890159500384, 92848.164021648947, 92871.439342379424, 92894.716121509016, 92917.994358855023, 92941.274054234746, 92964.555207465572, 92987.837818364962, 93011.121886750407, 93034.407412439468, 93057.694395249753, 93080.982834998955, 93104.272731504767, 93127.564084584999, 93150.856894057491, 93174.15115974014, 93197.446881450916, 93220.744059007804, 93244.04269222889, 93267.342780932304, 93290.644324936235, 93313.947324058914, 93337.251778118633, 93360.557686933767, 93383.865050322696, 93407.173868103928, 93430.484140095941, 93453.795866117362, 93477.109045986799, 93500.423679522952, 93523.739766544561, 93547.057306870454, 93570.376300319491, 93593.696746710571, 93617.018645862699, 93640.341997594893, 93663.666801726242, 93686.993058075881, 93710.320766463032, 93733.64992670693, 93756.980538626914, 93780.312602042337, 93803.646116772637, 93826.981082637285, 93850.317499455836, 93873.655367047861, 93896.994685233032, 93920.335453831038, 93943.677672661666, 93967.021341544707, 93990.366460300051, 94013.713028747632, 94037.061046707429, 94060.410513999494, 94083.761430443905, 94107.113795860845, 94130.467610070496, 94153.822872893157, 94177.179584149111, 94200.537743658759, 94223.897351242529, 94247.25840672091, 94270.620909914433, 94293.98486064373, 94317.350258729421, 94340.71710399224, 94364.085396252936, 94387.455135332348, 94410.82632105134, 94434.198953230851, 94457.573031691878, 94480.948556255447, 94504.325526742658, 94527.70394297468, 94551.083804772716, 94574.465111958023, 94597.847864351934, 94621.232061775823, 94644.617704051096, 94668.004790999272, 94691.393322441872, 94714.783298200506, 94738.174718096794, 94761.567581952477, 94784.961889589307, 94808.357640829097, 94831.754835493703, 94855.153473405066, 94878.553554385173, 94901.955078256055, 94925.358044839784, 94948.762453958523, 94972.168305434476, 94995.575599089891, 95018.984334747074, 95042.394512228391, 95065.806131356265, 95089.219191953176, 95112.633693841635, 95136.04963684424, 95159.467020783617, 95182.885845482466, 95206.306110763529, 95229.727816449609, 95253.150962363579, 95276.575548328314, 95300.001574166803, 95323.429039702052, 95346.857944757154, 95370.288289155214, 95393.720072719429, 95417.153295273019, 95440.587956639298, 95464.024056641589, 95487.461595103305, 95510.900571847902, 95534.340986698866, 95557.782839479783, 95581.226130014256, 95604.670858125959, 95628.117023638595, 95651.564626375985, 95675.013666161918, 95698.464142820303, 95721.916056175076, 95745.369406050231, 95768.824192269807, 95792.280414657915, 95815.738073038709, 95839.197167236387, 95862.657697075221, 95886.11966237954, 95909.583062973688, 95933.047898682111, 95956.514169329268, 95979.981874739708, 96003.451014738006, 96026.921589148798, 96050.393597796792, 96073.867040506724, 96097.341917103375, 96120.818227411626, 96144.295971256375, 96167.775148462577, 96191.255758855244, 96214.737802259449, 96238.221278500292, 96261.70618740299, 96285.192528792715, 96308.680302494788, 96332.169508334526, 96355.660146137321, 96379.152215728609, 96402.645716933868, 96426.14064957868, 96449.637013488609, 96473.134808489311, 96496.63403440651, 96520.134691065963, 96543.636778293469, 96567.140295914898, 96590.645243756153, 96614.151621643221, 96637.659429402134, 96661.168666858954, 96684.679333839798, 96708.191430170875, 96731.70495567839, 96755.219910188665, 96778.736293528011, 96802.254105522836, 96825.77334599958, 96849.29401478474, 96872.816111704873, 96896.339636586577, 96919.864589256511, 96943.390969541389, 96966.918777267958, 96990.448012263048, 97013.978674353522, 97037.510763366285, 97061.044279128328, 97084.579221466673, 97108.115590208385, 97131.653385180587, 97155.19260621049, 97178.733253125291, 97202.2753257523, 97225.81882391886, 97249.363747452342, 97272.910096180189, 97296.457869929916, 97320.007068529041, 97343.557691805196, 97367.109739586012, 97390.663211699197, 97414.218107972498, 97437.774428233737, 97461.332172310766, 97484.891340031507, 97508.451931223899, 97532.013945715982, 97555.577383335811, 97579.142243911512, 97602.708527271257, 97626.276233243261, 97649.845361655811, 97673.415912337223, 97696.987885115886, 97720.561279820206, 97744.1360962787, 97767.712334319876, 97791.289993772341, 97814.869074464703, 97838.449576225685, 97862.031498883996, 97885.614842268449, 97909.199606207883, 97932.785790531183, 97956.37339506732, 97979.962419645264, 98003.552864094076, 98027.144728242856, 98050.738011920766, 98074.332714956996, 98097.928837180807, 98121.526378421506, 98145.125338508456, 98168.725717271067, 98192.327514538789, 98215.930730141132, 98239.535363907664, 98263.141415668011, 98286.748885251814, 98310.357772488816, 98333.968077208759, 98357.579799241488, 98381.192938416847, 98404.807494564782, 98428.42346751524, 98452.040857098269, 98475.659663143917, 98499.27988548232, 98522.901523943656, 98546.524578358163, 98570.149048556093, 98593.774934367786, 98617.402235623624, 98641.030952154048, 98664.661083789513, 98688.292630360564, 98711.925591697771, 98735.559967631794, 98759.195757993293, 98782.832962613014, 98806.471581321734, 98830.111613950285, 98853.753060329575, 98877.39592029051, 98901.040193664099, 98924.68588028138, 98948.33297997342, 98971.981492571387, 98995.63141790645, 99019.282755809851, 99042.935506112874, 99066.589668646877, 99090.245243243233, 99113.902229733401, 99137.560627948857, 99161.220437721131, 99184.881658881859, 99208.544291262631, 99232.208334695169, 99255.87378901121, 99279.540654042547, 99303.208929621018, 99326.878615578535, 99350.549711746993, 99374.222217958435, 99397.896134044888, 99421.571459838422, 99445.248195171211, 99468.926339875441, 99492.605893783344, 99516.286856727209, 99539.969228539398, 99563.653009052287, 99587.338198098325, 99611.024795510006, 99634.712801119866, 99658.402214760499, 99682.093036264545, 99705.785265464699, 99729.478902193689, 99753.173946284325, 99776.870397569437, 99800.56825588191, 99824.267521054688, 99847.968192920773, 99871.670271313182, 99895.373756065004, 99919.078647009388, 99942.78494397951, 99966.492646808634, 99990.20175533001, 100013.91226937699, 100037.62418878295, 100061.33751338134, 100085.05224300563, 100108.76837748935, 100132.4859166661, 100156.2048603695, 100179.92520843323, 100203.64696069101, 100227.37011697664, 100251.09467712394, 100274.82064096678, 100298.54800833909, 100322.27677907483, 100346.00695300807, 100369.73852997283, 100393.47150980328, 100417.20589233354, 100440.94167739789, 100464.67886483055, 100488.41745446586, 100512.1574461382, 100535.89883968196, 100559.64163493161, 100583.38583172169, 100607.13142988674, 100630.87842926137, 100654.62682968024, 100678.37663097809, 100702.12783298964, 100725.88043554971, 100749.63443849317, 100773.38984165489, 100797.14664486986, 100820.90484797307, 100844.66445079957, 100868.42545318443, 100892.18785496285, 100915.95165596998, 100939.71685604109, 100963.48345501146, 100987.25145271645, 101011.02084899142, 101034.79164367182, 101058.56383659317, 101082.33742759094, 101106.11241650078, 101129.88880315828, 101153.66658739912, 101177.44576905905, 101201.22634797383, 101225.00832397929, 101248.7916969113, 101272.57646660579, 101296.36263289873, 101320.15019562612, 101343.93915462404, 101367.7295097286, 101391.52126077596, 101415.31440760233, 101439.10895004397, 101462.9048879372, 101486.70222111834, 101510.50094942382, 101534.30107269008, 101558.10259075361, 101581.90550345098, 101605.70981061876, 101629.5155120936, 101653.32260771218, 101677.13109731126, 101700.9409807276, 101724.75225779804, 101748.56492835947, 101772.37899224881, 101796.19444930303, 101820.01129935916, 101843.82954225427, 101867.64917782549, 101891.47020590997, 101915.29262634492, 101939.11643896763, 101962.94164361537, 101986.76824012553, 102010.59622833549, 102034.42560808272, 102058.25637920471, 102082.08854153901, 102105.9220949232, 102129.75703919494, 102153.59337419191, 102177.43109975185, 102201.27021571253, 102225.1107219118, 102248.95261818753, 102272.79590437764, 102296.64058032009, 102320.48664585294, 102344.33410081422, 102368.18294504205, 102392.03317837461, 102415.88480065008, 102439.73781170673, 102463.59221138287, 102487.44799951684, 102511.30517594704, 102535.1637405119, 102559.02369304992, 102582.88503339965, 102606.74776139967, 102630.61187688859, 102654.4773797051, 102678.34426968795, 102702.21254667587, 102726.08221050771, 102749.95326102231, 102773.8256980586, 102797.69952145554, 102821.57473105213, 102845.45132668741, 102869.32930820051, 102893.20867543056, 102917.08942821674, 102940.97156639832, 102964.85508981455, 102988.73999830478, 103012.6262917084, 103036.51396986481, 103060.40303261351, 103084.293479794, 103108.18531124585, 103132.07852680866, 103155.97312632212, 103179.8691096259, 103203.76647655977, 103227.66522696352, 103251.56536067701, 103275.46687754011, 103299.36977739276, 103323.27406007495, 103347.1797254267, 103371.0867732881, 103394.99520349925, 103418.90501590034, 103442.81621033157, 103466.72878663319, 103490.64274464553, 103514.55808420894, 103538.4748051638, 103562.39290735057, 103586.31239060973, 103610.23325478184, 103634.15549970744, 103658.07912522719, 103682.00413118176, 103705.93051741188, 103729.85828375829, 103753.78743006183, 103777.71795616332, 103801.64986190372, 103825.58314712394, 103849.51781166498, 103873.4538553679, 103897.39127807376, 103921.33007962372, 103945.27025985894, 103969.21181862066, 103993.15475575015, 104017.0990710887, 104041.0447644777, 104064.99183575854, 104088.94028477269, 104112.89011136163, 104136.84131536692, 104160.79389663014, 104184.74785499295, 104208.70319029699, 104232.65990238401, 104256.61799109577, 104280.57745627411, 104304.53829776087, 104328.50051539797, 104352.46410902737, 104376.42907849104, 104400.39542363105, 104424.36314428948, 104448.33224030846, 104472.3027115302, 104496.27455779689, 104520.24777895081, 104544.22237483428, 104568.19834528965, 104592.17569015936, 104616.15440928582, 104640.13450251156, 104664.1159696791, 104688.09881063103, 104712.08302520998, 104736.06861325864, 104760.05557461972, 104784.043909136, 104808.03361665027, 104832.0246970054, 104856.01715004431, 104880.01097560991, 104904.00617354522, 104928.00274369326, 104952.00068589712, 104975.99999999993, 105000.00068584486, 105024.00274327511, 105048.00617213396, 105072.0109722647, 105096.0171435107, 105120.02468571534, 105144.03359872208, 105168.04388237436, 105192.05553651576, 105216.06856098982, 105240.08295564017, 105264.09872031047, 105288.11585484444, 105312.13435908582, 105336.1542328784, 105360.17547606604, 105384.19808849262, 105408.22207000206, 105432.24742043833, 105456.27413964548, 105480.30222746753, 105504.33168374863, 105528.36250833291, 105552.39470106458, 105576.42826178786, 105600.46319034706, 105624.49948658649, 105648.53715035053, 105672.5761814836, 105696.61657983017, 105720.65834523473, 105744.70147754184, 105768.7459765961, 105792.79184224214, 105816.83907432464, 105840.88767268835, 105864.93763717801, 105888.98896763846, 105913.04166391456, 105937.09572585119, 105961.15115329332, 105985.20794608595, 106009.26610407409, 106033.32562710284, 106057.38651501729, 106081.44876766266, 106105.51238488412, 106129.57736652695, 106153.64371243643, 106177.71142245791, 106201.78049643678, 106225.85093421848, 106249.92273564848, 106273.99590057228, 106298.07042883546, 106322.14632028362, 106346.22357476239, 106370.30219211751, 106394.38217219469, 106418.46351483969, 106442.54621989837, 106466.63028721658, 106490.71571664025, 106514.80250801529, 106538.89066118775, 106562.98017600364, 106587.07105230905, 106611.16328995011, 106635.25688877302, 106659.35184862395, 106683.44816934918, 106707.54585079502, 106731.64489280782, 106755.74529523395, 106779.84705791986, 106803.95018071201, 106828.05466345693, 106852.16050600118, 106876.26770819137, 106900.37626987413, 106924.48619089619, 106948.59747110425, 106972.71011034511, 106996.82410846559, 107020.93946531253, 107045.05618073288, 107069.17425457356, 107093.29368668159, 107117.41447690397, 107141.53662508781, 107165.66013108024, 107189.7849947284, 107213.91121587952, 107238.03879438085, 107262.16773007967, 107286.29802282334, 107310.42967245923, 107334.56267883476, 107358.69704179741, 107382.83276119467, 107406.96983687414, 107431.10826868335, 107455.24805646999, 107479.38920008171, 107503.53169936626, 107527.67555417139, 107551.82076434491, 107575.96732973469, 107600.11525018861, 107624.26452555459, 107648.41515568066, 107672.56714041479, 107696.72047960508, 107720.87517309963, 107745.03122074658, 107769.18862239413, 107793.34737789053, 107817.50748708403, 107841.66894982298, 107865.83176595572, 107889.99593533068, 107914.16145779629, 107938.32833320105, 107962.49656139348, 107986.66614222217, 108010.83707553572, 108035.00936118282, 108059.18299901215, 108083.35798887245, 108107.53433061253, 108131.71202408121, 108155.89106912735, 108180.07146559987, 108204.25321334775, 108228.43631221994, 108252.62076206553, 108276.80656273357, 108300.99371407321, 108325.18221593359, 108349.37206816394, 108373.56327061349, 108397.75582313156, 108421.94972556747, 108446.1449777706, 108470.34157959036, 108494.53953087622, 108518.73883147769, 108542.93948124432, 108567.14148002568, 108591.34482767139, 108615.54952403114, 108639.75556895464, 108663.96296229165, 108688.17170389196, 108712.38179360541, 108736.59323128188, 108760.80601677128, 108785.02014992358, 108809.23563058881, 108833.45245861699, 108857.67063385822, 108881.89015616261, 108906.11102538036, 108930.33324136167, 108954.55680395682, 108978.78171301607, 109003.00796838976, 109027.23556992831, 109051.46451748211, 109075.69481090162, 109099.92645003737, 109124.15943473989, 109148.39376485976, 109172.62944024763, 109196.86646075416, 109221.10482623006, 109245.34453652608, 109269.58559149304, 109293.82799098175, 109318.07173484311, 109342.31682292801, 109366.56325508743, 109390.81103117237, 109415.06015103387, 109439.31061452301, 109463.56242149093, 109487.8155717888, 109512.07006526781, 109536.3259017792, 109560.58308117429, 109584.8416033044, 109609.1014680209, 109633.36267517522, 109657.62522461878, 109681.88911620311, 109706.15434977971, 109730.4209252002, 109754.68884231619, 109778.95810097932, 109803.22870104131, 109827.50064235389, 109851.77392476884, 109876.04854813802, 109900.32451231324, 109924.60181714644, 109948.88046248957, 109973.1604481946, 109997.44177411357, 110021.72444009855, 110046.00844600165, 110070.29379167501, 110094.58047697082, 110118.86850174134, 110143.15786583882, 110167.44856911557, 110191.74061142397, 110216.03399261639, 110240.32871254528, 110264.62477106311, 110288.9221680224, 110313.22090327571, 110337.52097667565, 110361.82238807483, 110386.12513732594, 110410.42922428172, 110434.73464879491, 110459.04141071832, 110483.34950990479, 110507.6589462072, 110531.96971947847, 110556.28182957157, 110580.5952763395, 110604.91005963532, 110629.22617931209, 110653.54363522294, 110677.86242722106, 110702.18255515963, 110726.50401889188, 110750.82681827113, 110775.1509531507, 110799.47642338395, 110823.80322882428, 110848.13136932514, 110872.46084474004, 110896.79165492248, 110921.12379972603, 110945.4572790043, 110969.79209261097, 110994.12824039967, 111018.46572222417, 111042.80453793822, 111067.14468739564, 111091.48617045028, 111115.82898695602, 111140.1731367668, 111164.51861973655, 111188.86543571933, 111213.21358456917, 111237.56306614014, 111261.91388028639, 111286.26602686207, 111310.61950572141, 111334.97431671864, 111359.33045970804, 111383.68793454397, 111408.04674108078, 111432.40687917286, 111456.76834867468, 111481.13114944073, 111505.49528132551, 111529.86074418361, 111554.22753786964, 111578.59566223821, 111602.96511714405, 111627.33590244185, 111651.7080179864, 111676.08146363248, 111700.45623923496, 111724.8323446487, 111749.20977972864, 111773.58854432974, 111797.96863830699, 111822.35006151545, 111846.73281381019, 111871.11689504632, 111895.50230507903, 111919.8890437635, 111944.27711095495, 111968.6665065087, 111993.05723028004, 112017.44928212435, 112041.842661897, 112066.23736945343, 112090.63340464912, 112115.03076733962, 112139.42945738042, 112163.82947462716, 112188.23081893545, 112212.63349016097, 112237.03748815943, 112261.44281278658, 112285.84946389822, 112310.25744135017, 112334.66674499828, 112359.07737469849, 112383.48933030672, 112407.90261167898, 112432.31721867126, 112456.73315113965, 112481.15040894024, 112505.56899192919, 112529.98889996267, 112554.41013289688, 112578.8326905881, 112603.25657289263, 112627.68177966679, 112652.10831076698, 112676.53616604958, 112700.96534537108, 112725.39584858794, 112749.82767555672, 112774.26082613398, 112798.6953001763, 112823.13109754038, 112847.56821808286, 112872.00666166049, 112896.44642813003, 112920.88751734827, 112945.32992917208, 112969.77366345831, 112994.21872006389, 113018.66509884578, 113043.11279966099, 113067.56182236652, 113092.01216681948, 113116.46383287695, 113140.9168203961, 113165.37112923413, 113189.82675924824, 113214.28371029573, 113238.74198223387, 113263.20157492002, 113287.66248821157, 113312.12472196593, 113336.58827604055, 113361.05315029295, 113385.51934458067, 113409.98685876124, 113434.45569269233, 113458.92584623155, 113483.39731923661, 113507.87011156522, 113532.34422307517, 113556.81965362425, 113581.2964030703, 113605.77447127122, 113630.25385808491, 113654.73456336933, 113679.2165869825, 113703.69992878241, 113728.18458862718, 113752.67056637487, 113777.15786188368, 113801.64647501177, 113826.13640561736, 113850.62765355874, 113875.12021869418, 113899.61410088204, 113924.1092999807, 113948.60581584855, 113973.10364834407, 113997.60279732574, 114022.1032626521, 114046.60504418171, 114071.10814177318, 114095.61255528514, 114120.11828457628, 114144.62532950533, 114169.13368993104, 114193.6433657122, 114218.15435670764, 114242.66666277625, 114267.18028377694, 114291.69521956862, 114316.21147001031, 114340.72903496103, 114365.24791427983, 114389.7681078258, 114414.2896154581, 114438.81243703589, 114463.33657241837, 114487.8620214648, 114512.38878403447, 114536.91685998671, 114561.44624918087, 114585.97695147636, 114610.5089667326, 114635.04229480909, 114659.57693556532, 114684.11288886084, 114708.65015455526, 114733.18873250818, 114757.72862257928, 114782.26982462825, 114806.81233851484, 114831.35616409882, 114855.90130123998, 114880.44774979822, 114904.99550963337, 114929.5445806054, 114954.09496257425, 114978.64665539992, 115003.19965894247, 115027.75397306195, 115052.30959761847, 115076.86653247218, 115101.42477748329, 115125.984332512, 115150.54519741859, 115175.10737206334, 115199.67085630659, 115224.23565000873, 115248.80175303014, 115273.3691652313, 115297.93788647266, 115322.50791661476, 115347.07925551817, 115371.65190304347, 115396.22585905129, 115420.80112340231, 115445.37769595724, 115469.95557657682, 115494.53476512182, 115519.11526145306, 115543.69706543141, 115568.28017691776, 115592.86459577303, 115617.4503218582, 115642.03735503425, 115666.62569516223, 115691.21534210323, 115715.80629571836, 115740.39855586876, 115764.99212241563, 115789.58699522018, 115814.18317414368, 115838.78065904744, 115863.37944979276, 115887.97954624105, 115912.5809482537, 115937.18365569216, 115961.78766841792, 115986.39298629249, 116010.99960917742, 116035.60753693432, 116060.21676942479, 116084.82730651053, 116109.43914805322, 116134.0522939146, 116158.66674395646, 116183.2824980406, 116207.89955602887, 116232.51791778316, 116257.13758316539, 116281.75855203751, 116306.38082426153, 116331.00439969949, 116355.62927821343, 116380.25545966547, 116404.88294391775, 116429.51173083246, 116454.14182027178, 116478.77321209799, 116503.40590617337, 116528.03990236025, 116552.67520052097, 116577.31180051794, 116601.94970221359, 116626.5889054704, 116651.22941015086, 116675.87121611751, 116700.51432323294, 116725.15873135976, 116749.8044403606, 116774.45145009817, 116799.0997604352, 116823.74937123443, 116848.40028235866, 116873.05249367072, 116897.70600503348, 116922.36081630984, 116947.01692736275, 116971.67433805518, 116996.33304825013, 117020.99305781067, 117045.65436659988, 117070.31697448085, 117094.98088131678, 117119.64608697082, 117144.31259130624, 117168.98039418629, 117193.64949547425, 117218.31989503348, 117242.99159272734, 117267.66458841923, 117292.33888197262, 117317.01447325097, 117341.6913621178, 117366.36954843666, 117391.04903207115, 117415.72981288488, 117440.41189074152, 117465.09526550474, 117489.77993703831, 117514.46590520597, 117539.15316987153, 117563.84173089883, 117588.53158815173, 117613.22274149416, 117637.91519079007, 117662.60893590341, 117687.30397669821, 117712.00031303853, 117736.69794478847, 117761.39687181212, 117786.09709397367, 117810.7986111373, 117835.50142316725, 117860.20552992777, 117884.91093128319, 117909.6176270978, 117934.32561723603, 117959.03490156225, 117983.74547994092, 118008.45735223651, 118033.17051831353, 118057.88497803656, 118082.60073127014, 118107.31777787894, 118132.03611772758, 118156.75575068076, 118181.47667660323, 118206.19889535972, 118230.92240681504, 118255.64721083404, 118280.37330728157, 118305.10069602253, 118329.82937692189, 118354.55934984458, 118379.29061465565, 118404.02317122012, 118428.75701940308, 118453.49215906965, 118478.22859008498, 118502.96631231424, 118527.70532562268, 118552.44562987552, 118577.18722493808, 118601.93011067568, 118626.67428695368, 118651.41975363747, 118676.16651059251, 118700.91455768423, 118725.66389477813, 118750.41452173979, 118775.16643843475, 118799.91964472862, 118824.67414048707, 118849.42992557574, 118874.18699986035, 118898.94536320666, 118923.70501548045, 118948.46595654752, 118973.22818627374, 118997.99170452499, 119022.7565111672, 119047.52260606633, 119072.28998908834, 119097.0586600993, 119121.82861896523, 119146.59986555226, 119171.3723997265, 119196.14622135412, 119220.92133030134, 119245.69772643436, 119270.47540961947, 119295.25437972297, 119320.03463661121, 119344.81618015055, 119369.5990102074, 119394.38312664822, 119419.16852933947, 119443.95521814766, 119468.74319293935, 119493.53245358112, 119518.32299993958, 119543.11483188139, 119567.90794927324, 119592.70235198183, 119617.49803987393, 119642.29501281632, 119667.09327067583, 119691.89281331931, 119716.69364061367, 119741.49575242582, 119766.29914862274, 119791.10382907141, 119815.90979363887, 119840.71704219218, 119865.52557459843, 119890.33539072477, 119915.14649043836, 119939.95887360642, 119964.77254009615, 119989.58748977486, 120014.40372250983, 120039.22123816841, 120064.04003661797, 120088.86011772591, 120113.6814813597, 120138.5041273868, 120163.3280556747, 120188.15326609099, 120212.97975850321, 120237.807532779, 120262.63658878599, 120287.46692639188, 120312.29854546436, 120337.13144587121, 120361.9656274802, 120386.80109015915, 120411.63783377589, 120436.47585819835, 120461.31516329442, 120486.15574893207, 120510.99761497928, 120535.84076130406, 120560.68518777451, 120585.53089425867, 120610.3778806247, 120635.22614674074, 120660.07569247499, 120684.92651769568, 120709.77862227106, 120734.63200606944, 120759.48666895913, 120784.3426108085, 120809.19983148595, 120834.05833085992, 120858.91810879884, 120883.77916517125, 120908.64149984565, 120933.5051126906, 120958.37000357473, 120983.23617236665, 121008.10361893504, 121032.97234314861, 121057.84234487606, 121082.71362398617, 121107.58618034775, 121132.46001382964, 121157.33512430069, 121182.21151162982, 121207.08917568595, 121231.96811633807, 121256.84833345517, 121281.72982690629, 121306.61259656049, 121331.49664228689, 121356.38196395461, 121381.26856143285, 121406.15643459078, 121431.04558329767, 121455.93600742276, 121480.82770683538, 121505.72068140487, 121530.61493100057, 121555.51045549192, 121580.40725474835, 121605.30532863933, 121630.20467703436, 121655.10529980299, 121680.00719681478, 121704.91036793934, 121729.81481304632, 121754.72053200539, 121779.62752468624, 121804.53579095862, 121829.44533069231, 121854.3561437571, 121879.26823002285, 121904.1815893594, 121929.09622163669, 121954.01212672464, 121978.92930449323, 122003.84775481246, 122028.76747755238, 122053.68847258303, 122078.61073977455, 122103.53427899707, 122128.45909012076, 122153.38517301581, 122178.31252755247, 122203.24115360099, 122228.17105103172, 122253.10221971494, 122278.03465952107, 122302.96837032049, 122327.90335198362, 122352.83960438096, 122377.777127383, 122402.71592086025, 122427.65598468333, 122452.59731872278, 122477.53992284928, 122502.48379693348, 122527.42894084606, 122552.37535445779, 122577.32303763942, 122602.27199026172, 122627.22221219557, 122652.17370331181, 122677.12646348133, 122702.08049257506, 122727.03579046397, 122751.99235701906, 122776.95019211136, 122801.9092956119, 122826.8696673918, 122851.83130732219, 122876.79421527422, 122901.75839111909, 122926.72383472799, 122951.69054597223, 122976.65852472307, 123001.62777085182, 123026.59828422987, 123051.57006472857, 123076.54311221937, 123101.5174265737, 123126.49300766307, 123151.46985535898, 123176.44796953299, 123201.42735005668, 123226.40799680166, 123251.38990963959, 123276.37308844214, 123301.35753308103, 123326.343243428, 123351.33021935483, 123376.31846073334, 123401.30796743535, 123426.29873933276, 123451.29077629748, 123476.28407820144, 123501.2786449166, 123526.27447631498, 123551.27157226863, 123576.26993264959, 123601.26955732999, 123626.27044618195, 123651.27259907764, 123676.27601588926, 123701.28069648903, 123726.28664074924, 123751.29384854218, 123776.30231974016, 123801.31205421555, 123826.32305184075, 123851.33531248817, 123876.34883603029, 123901.36362233957, 123926.37967128855, 123951.39698274979, 123976.41555659588, 124001.43539269941, 124026.45649093305, 124051.47885116948, 124076.50247328142, 124101.5273571416, 124126.55350262282, 124151.58090959788, 124176.60957793961, 124201.63950752091, 124226.67069821467, 124251.70314989384, 124276.73686243138, 124301.7718357003, 124326.80806957364, 124351.84556392446, 124376.88431862585, 124401.92433355095, 124426.96560857294, 124452.00814356498, 124477.05193840031, 124502.0969929522, 124527.14330709392, 124552.19088069882, 124577.23971364023, 124602.28980579154, 124627.34115702618, 124652.3937672176, 124677.44763623926, 124702.50276396469, 124727.55915026742, 124752.61679502104, 124777.67569809916, 124802.73585937542, 124827.79727872348, 124852.85995601704, 124877.92389112986, 124902.98908393568, 124928.05553430831, 124953.1232421216, 124978.19220724938, 125003.26242956554, 125028.33390894404, 125053.40664525882, 125078.48063838384, 125103.55588819318, 125128.63239456083, 125153.71015736091, 125178.78917646752, 125203.86945175481, 125228.95098309696, 125254.03377036817, 125279.1178134427, 125304.20311219479, 125329.28966649878, 125354.37747622898, 125379.46654125977, 125404.55686146552, 125429.6484367207, 125454.74126689974, 125479.83535187715, 125504.93069152744, 125530.02728572517, 125555.12513434493, 125580.22423726133, 125605.32459434902, 125630.4262054827, 125655.52907053704, 125680.63318938682, 125705.73856190679, 125730.84518797178, 125755.9530674566, 125781.06220023613, 125806.17258618528, 125831.28422517896, 125856.39711709213, 125881.51126179981, 125906.62665917698, 125931.74330909875, 125956.86121144016, 125981.98036607634, 126007.10077288245, 126032.22243173365, 126057.34534250517, 126082.46950507225, 126107.59491931014, 126132.72158509417, 126157.84950229966, 126182.97867080198, 126208.10909047653, 126233.24076119871, 126258.37368284403, 126283.50785528794, 126308.64327840599, 126333.77995207369, 126358.91787616667, 126384.0570505605, 126409.19747513086, 126434.3391497534, 126459.48207430386, 126484.62624865794, 126509.77167269142, 126534.9183462801, 126560.06626929982, 126585.21544162642, 126610.36586313581, 126635.51753370393, 126660.67045320668, 126685.82462152008, 126710.98003852014, 126736.13670408291, 126761.29461808444, 126786.45378040087, 126811.61419090834, 126836.77584948298, 126861.93875600102, 126887.10291033868, 126912.26831237224, 126937.43496197795, 126962.60285903217, 126987.77200341123, 127012.94239499152, 127038.11403364947, 127063.2869192615, 127088.46105170409, 127113.63643085376, 127138.81305658702, 127163.99092878048, 127189.17004731069, 127214.35041205429, 127239.53202288797, 127264.71487968838, 127289.89898233226, 127315.08433069635, 127340.27092465744, 127365.45876409234, 127390.64784887788, 127415.83817889093, 127441.02975400841, 127466.22257410725, 127491.41663906439, 127516.61194875685, 127541.80850306165, 127567.00630185583, 127592.20534501647, 127617.4056324207, 127642.60716394568, 127667.80993946856, 127693.01395886653, 127718.21922201688, 127743.42572879682, 127768.63347908368, 127793.84247275478, 127819.05270968749, 127844.26418975917, 127869.47691284724, 127894.69087882918, 127919.90608758242, 127945.12253898452, 127970.34023291297, 127995.55916924537, 128020.77934785932, 128046.00076863244, 128071.22343144237, 128096.44733616684, 128121.67248268353, 128146.89887087021, 128172.12650060465, 128197.35537176467, 128222.5854842281, 128247.81683787282, 128273.04943257671, 128298.28326821771, 128323.51834467379, 128348.75466182294, 128373.99221954317, 128399.23101771252, 128424.47105620909, 128449.71233491098, 128474.95485369631, 128500.19861244329, 128525.44361103009, 128550.68984933494, 128575.93732723613, 128601.18604461191, 128626.43600134061, 128651.68719730059, 128676.93963237021, 128702.1933064279, 128727.44821935208, 128752.70437102125, 128777.96176131385, 128803.22039010846, 128828.48025728362, 128853.74136271792, 128879.00370628996, 128904.26728787841, 128929.53210736193, 128954.79816461923, 128980.06545952905, 129005.33399197015, 129030.60376182134, 129055.87476896142, 129081.14701326926, 129106.42049462376, 129131.6952129038, 129156.97116798835, 129182.24835975636, 129207.52678808685, 129232.80645285884, 129258.08735395141, 129283.36949124365, 129308.65286461466, 129333.9374739436, 129359.22331910966, 129384.51039999202, 129409.79871646997, 129435.08826842274, 129460.37905572963, 129485.67107826998, 129510.96433592314, 129536.25882856851, 129561.55455608548, 129586.85151835352, 129612.14971525209, 129637.4491466607, 129662.74981245887, 129688.0517125262, 129713.35484674224, 129738.65921498663, 129763.96481713903, 129789.27165307909, 129814.57972268655, 129839.88902584116, 129865.19956242264, 129890.51133231082, 129915.82433538554, 129941.13857152662, 129966.45404061397, 129991.7707425275, 130017.08867714716, 130042.4078443529, 130067.72824402474, 130093.04987604271, 130118.37274028687, 130143.69683663732, 130169.02216497416, 130194.34872517755, 130219.67651712766, 130245.0055407047, 130270.33579578891, 130295.66728226055, 130320.99999999991, 130346.33394888733, 130371.66912880314, 130397.00553962773, 130422.34318124152, 130447.68205352494, 130473.02215635845, 130498.36348962256, 130523.70605319779, 130549.0498469647, 130574.39487080388, 130599.74112459592, 130625.08860822149, 130650.43732156123, 130675.78726449587, 130701.13843690613, 130726.49083867275, 130751.84446967654, 130777.19932979831, 130802.5554189189, 130827.91273691918, 130853.27128368006, 130878.63105908247, 130903.99206300738, 130929.35429533575, 130954.71775594862, 130980.08244472703, 131005.44836155206, 131030.81550630482, 131056.18387886642, 131081.55347911804, 131106.92430694087, 131132.29636221612, 131157.66964482504, 131183.0441546489, 131208.41989156904, 131233.79685546676, 131259.17504622342, 131284.55446372041, 131309.93510783918, 131335.31697846117, 131360.70007546784, 131386.0843987407, 131411.46994816128, 131436.85672361116, 131462.24472497194, 131487.63395212521, 131513.02440495262, 131538.41608333588, 131563.80898715663, 131589.2031162967, 131614.59847063778, 131639.9950500617, 131665.39285445024, 131690.79188368531, 131716.19213764873, 131741.59361622241, 131766.99631928833, 131792.40024672839, 131817.80539842462, 131843.21177425905, 131868.61937411371, 131894.02819787065, 131919.43824541202, 131944.84951661993, 131970.26201137656, 131995.67572956407, 132021.09067106468, 132046.50683576067, 132071.9242235343, 132097.34283426782, 132122.76266784366, 132148.1837241441, 132173.60600305157, 132199.02950444847, 132224.45422821722, 132249.88017424036, 132275.30734240031, 132300.73573257966, 132326.16534466096, 132351.59617852676, 132377.02823405969, 132402.46151114244, 132427.89600965759, 132453.33172948789, 132478.76867051609, 132504.20683262491, 132529.64621569714, 132555.08681961559, 132580.5286442631, 132605.97168952253, 132631.41595527678, 132656.86144140881, 132682.30814780149, 132707.75607433787, 132733.20522090094, 132758.65558737374, 132784.10717363929, 132809.55997958075, 132835.01400508118, 132860.46925002377, 132885.92571429166, 132911.38339776811, 132936.84230033628, 132962.30242187946, 132987.76376228096, 133013.22632142407, 133038.69009919214, 133064.15509546854, 133089.62131013666, 133115.08874307995, 133140.55739418184, 133166.02726332581, 133191.49835039541, 133216.97065527414, 133242.44417784561, 133267.91891799335, 133293.39487560102, 133318.87205055228, 133344.35044273079, 133369.83005202023, 133395.31087830439, 133420.79292146701, 133446.27618139185, 133471.76065796276, 133497.24635106357, 133522.73326057816, 133548.22138639039, 133573.71072838426, 133599.20128644365, 133624.69306045261, 133650.1860502951, 133675.68025585517, 133701.1756770169, 133726.67231366437, 133752.17016568172, 133777.66923295305, 133803.16951536259, 133828.67101279454, 133854.17372513309, 133879.67765226253, 133905.18279406714, 133930.68915043125, 133956.19672123916, 133981.70550637526, 134007.21550572399, 134032.7267191697, 134058.23914659687, 134083.75278789, 134109.26764293358, 134134.78371161217, 134160.30099381026, 134185.8194894125, 134211.33919830353, 134236.8601203679, 134262.38225549037, 134287.90560355558, 134313.43016444831, 134338.95593805326, 134364.48292425525, 134390.01112293909, 134415.54053398955, 134441.07115729159, 134466.60299273001, 134492.1360401898, 134517.67029955584, 134543.20577071316, 134568.74245354676, 134594.28034794159, 134619.81945378278, 134645.35977095537, 134670.90129934452, 134696.4440388353, 134721.98798931291, 134747.53315066252, 134773.07952276937, 134798.62710551871, 134824.17589879577, 134849.72590248589, 134875.27711647438, 134900.82954064661, 134926.38317488792, 134951.93801908373, 134977.49407311951, 135003.05133688069, 135028.60981025276, 135054.16949312127, 135079.73038537172, 135105.29248688967, 135130.85579756077, 135156.42031727062, 135181.98604590484, 135207.55298334916, 135233.12112948924, 135258.69048421088, 135284.26104739975, 135309.83281894168, 135335.4057987225, 135360.97998662802, 135386.55538254412, 135412.13198635669, 135437.70979795168, 135463.28881721498, 135488.86904403262, 135514.45047829056, 135540.03311987486, 135565.61696867159, 135591.20202456677, 135616.78828744654, 135642.37575719706, 135667.96443370447, 135693.55431685498, 135719.14540653475, 135744.73770263011, 135770.33120502727, 135795.92591361253, 135821.52182827223, 135847.11894889272, 135872.7172753604, 135898.31680756161, 135923.91754538284, 135949.51948871053, 135975.12263743114, 136000.72699143123, 136026.33255059729, 136051.93931481591, 136077.54728397369, 136103.15645795723, 136128.76683665317, 136154.37841994822, 136179.99120772901, 136205.60519988232, 136231.2203962949, 136256.83679685349, 136282.45440144493, 136308.07320995603, 136333.69322227367, 136359.31443828469, 136384.93685787608, 136410.56048093468, 136436.18530734754, 136461.81133700156, 136487.43856978384, 136513.06700558143, 136538.6966442813, 136564.32748577066, 136589.95952993655, 136615.59277666616, 136641.22722584667, 136666.86287736523, 136692.49973110916, 136718.13778696564, 136743.77704482197, 136769.41750456547, 136795.05916608346, 136820.70202926331, 136846.34609399244, 136871.99136015819, 136897.63782764805, 136923.28549634948, 136948.93436614997, 136974.58443693706, 137000.23570859825, 137025.88818102115, 137051.54185409332, 137077.19672770242, 137102.85280173609, 137128.51007608202, 137154.16855062786, 137179.82822526142, 137205.48909987041, 137231.15117434258, 137256.8144485658, 137282.47892242789, 137308.14459581667, 137333.81146862009, 137359.47954072602, 137385.14881202241, 137410.81928239719, 137436.49095173844, 137462.16381993407, 137487.83788687221, 137513.51315244089, 137539.18961652822, 137564.86727902229, 137590.54613981131, 137616.22619878338, 137641.90745582676, 137667.58991082967, 137693.27356368033, 137718.95841426702, 137744.64446247809, 137770.33170820182, 137796.02015132661, 137821.70979174081, 137847.40062933284, 137873.09266399115, 137898.78589560417, 137924.48032406042, 137950.17594924837, 137975.8727710566, 138001.57078937365, 138027.27000408815, 138052.97041508864, 138078.67202226384, 138104.3748255024, 138130.07882469296, 138155.78401972432, 138181.49041048516, 138207.1979968643, 138232.9067787505, 138258.61675603263, 138284.32792859949, 138310.04029633995, 138335.75385914298, 138361.46861689744, 138387.18456949232, 138412.90171681659, 138438.62005875923, 138464.33959520931, 138490.06032605586, 138515.78225118798, 138541.50537049473, 138567.2296838653, 138592.95519118884, 138618.68189235451, 138644.40978725153, 138670.13887576913, 138695.86915779658, 138721.60063322316, 138747.33330193823, 138773.06716383106, 138798.80221879104, 138824.53846670757, 138850.27590747006, 138876.01454096794, 138901.7543670907, 138927.49538572782, 138953.2375967688, 138978.9810001032, 139004.72559562061, 139030.47138321059, 139056.2183627628, 139081.96653416683, 139107.71589731239, 139133.46645208917, 139159.21819838689, 139184.97113609532, 139210.72526510421, 139236.48058530336, 139262.23709658257, 139287.99479883176, 139313.75369194071, 139339.51377579942, 139365.27505029776, 139391.03751532568, 139416.80117077316, 139442.56601653024, 139468.33205248689, 139494.09927853322, 139519.86769455927, 139545.63730045516, 139571.408096111, 139597.18008141697, 139622.95325626322, 139648.72762054001, 139674.5031741375, 139700.27991694602, 139726.05784885579, 139751.83696975713, 139777.61727954043, 139803.39877809596, 139829.18146531415, 139854.96534108539, 139880.75040530015, 139906.53665784886, 139932.32409862199, 139958.11272751007, 139983.90254440365, 140009.69354919327, 140035.48574176949, 140061.27912202294, 140087.07368984428, 140112.86944512415, 140138.66638775321, 140164.4645176222, 140190.26383462184, 140216.06433864293, 140241.86602957622, 140267.66890731253, 140293.47297174268, 140319.27822275754, 140345.08466024802, 140370.89228410498, 140396.70109421943, 140422.51109048226, 140448.32227278448, 140474.13464101712, 140499.94819507122, 140525.76293483781, 140551.57886020801, 140577.3959710729, 140603.21426732364, 140629.03374885136, 140654.85441554731, 140680.67626730262, 140706.49930400858, 140732.32352555645, 140758.1489318375, 140783.97552274304, 140809.80329816442, 140835.63225799298, 140861.46240212015, 140887.29373043729, 140913.12624283586, 140938.95993920733, 140964.79481944317, 140990.63088343487, 141016.46813107401, 141042.30656225214, 141068.14617686081, 141093.98697479168, 141119.82895593636, 141145.6721201865, 141171.51646743377, 141197.36199756994, 141223.20871048668, 141249.05660607578, 141274.90568422904, 141300.75594483822, 141326.6073877952, 141352.4600129918, 141378.31382031992, 141404.16880967148, 141430.02498093838, 141455.8823340126, 141481.74086878612, 141507.60058515094, 141533.46148299909, 141559.32356222265, 141585.18682271364, 141611.05126436421, 141636.9168870665, 141662.78369071262, 141688.65167519479, 141714.5208404052, 141740.39118623605, 141766.26271257963, 141792.1354193282, 141818.00930637406, 141843.88437360956, 141869.760620927, 141895.6380482188, 141921.51665537735, 141947.39644229505, 141973.27740886438, 141999.15955497778, 142025.04288052776, 142050.92738540689, 142076.81306950765, 142102.69993272264, 142128.58797494444, 142154.47719606571, 142180.36759597904, 142206.25917457714, 142232.15193175265, 142258.04586739838, 142283.94098140698, 142309.83727367126, 142335.73474408401, 142361.63339253806, 142387.5332189262, 142413.43422314132, 142439.33640507635, 142465.23976462413, 142491.14430167765, 142517.05001612983, 142542.95690787368, 142568.86497680223, 142594.77422280848, 142620.68464578551, 142646.5962456264, 142672.50902222423, 142698.42297547215, 142724.33810526333, 142750.25441149093, 142776.17189404817, 142802.09055282827, 142828.01038772447, 142853.93139863008, 142879.85358543837, 142905.77694804268, 142931.70148633636, 142957.62720021277, 142983.55408956532, 143009.48215428743, 143035.41139427255, 143061.34180941415, 143087.27339960571, 143113.20616474075, 143139.14010471283, 143165.07521941551, 143191.01150874238, 143216.94897258704, 143242.88761084314, 143268.82742340435, 143294.76841016437, 143320.71057101688, 143346.65390585564, 143372.59841457437, 143398.54409706692, 143424.49095322701, 143450.43898294857, 143476.38818612538, 143502.33856265133, 143528.29011242036, 143554.24283532638, 143580.19673126334, 143606.1518001252, 143632.10804180597, 143658.06545619969, 143684.02404320039, 143709.98380270213, 143735.944734599, 143761.90683878519, 143787.87011515474, 143813.83456360188, 143839.8001840208, 143865.76697630569, 143891.73494035081, 143917.7040760504, 143943.67438329876, 143969.6458619902, 143995.61851201905, 144021.59233327967, 144047.56732566646, 144073.54348907378, 144099.52082339607, 144125.49932852783, 144151.4790043635, 144177.45985079758, 144203.44186772458, 144229.42505503909, 144255.40941263564, 144281.39494040885, 144307.38163825331, 144333.36950606373, 144359.35854373468, 144385.34875116093, 144411.34012823718, 144437.33267485813, 144463.32639091855, 144489.32127631325, 144515.31733093705, 144541.31455468474, 144567.3129474512, 144593.3125091313, 144619.31323961995, 144645.31513881206, 144671.31820660262, 144697.32244288657, 144723.32784755889, 144749.33442051467, 144775.34216164888, 144801.35107085665, 144827.36114803303, 144853.37239307314, 144879.38480587213, 144905.39838632516, 144931.41313432742, 144957.4290497741, 144983.44613256046, 145009.46438258173, 145035.48379973322, 145061.50438391021, 145087.52613500805, 145113.54905292206, 145139.57313754765, 145165.59838878017, 145191.62480651509, 145217.65239064783, 145243.68114107384, 145269.71105768863, 145295.74214038774, 145321.77438906668, 145347.80780362099, 145373.84238394629, 145399.87812993818, 145425.91504149229, 145451.95311850426, 145477.9923608698, 145504.03276848458, 145530.07434124436, 145556.11707904484, 145582.16098178181, 145608.20604935108, 145634.25228164849, 145660.29967856981, 145686.34824001096, 145712.39796586783, 145738.4488560363, 145764.50091041232, 145790.55412889185, 145816.60851137087, 145842.66405774537, 145868.72076791141, 145894.77864176501, 145920.83767920226, 145946.89788011924, 145972.95924441208, 145999.02177197693, 146025.08546270995, 146051.15031650732, 146077.21633326527, 146103.28351288004, 146129.35185524789, 146155.42136026506, 146181.49202782792, 146207.56385783272, 146233.63685017588, 146259.71100475377, 146285.78632146274, 146311.86280019928, 146337.94044085976, 146364.01924334071, 146390.09920753856, 146416.18033334985, 146442.26262067116, 146468.34606939898, 146494.43067942993, 146520.51645066062, 146546.60338298764, 146572.69147630769, 146598.78073051744, 146624.87114551352, 146650.96272119274, 146677.05545745179, 146703.14935418745, 146729.2444112965, 146755.34062867577, 146781.43800622207, 146807.53654383228, 146833.63624140329, 146859.73709883197, 146885.83911601527, 146911.94229285014, 146938.04662923355, 146964.15212506248, 146990.25878023397, 147016.36659464505, 147042.47556819281, 147068.58570077427, 147094.6969922866, 147120.80944262692, 147146.92305169237, 147173.03781938017, 147199.15374558745, 147225.27083021149, 147251.38907314953, 147277.50847429881, 147303.62903355664, 147329.75075082036, 147355.87362598727, 147381.99765895473, 147408.12284962015, 147434.24919788091, 147460.37670363448, 147486.50536677826, 147512.63518720976, 147538.76616482646, 147564.89829952587, 147591.03159120557, 147617.16603976308, 147643.30164509601, 147669.43840710199, 147695.57632567859, 147721.71540072354, 147747.85563213445, 147773.99701980909, 147800.13956364512, 147826.28326354033, 147852.42811939248, 147878.57413109933, 147904.72129855872, 147930.86962166851, 147957.01910032652, 147983.16973443062, 148009.32152387875, 148035.47446856883, 148061.62856839882, 148087.78382326665, 148113.94023307035, 148140.09779770792, 148166.25651707739, 148192.41639107687, 148218.57741960438, 148244.73960255808, 148270.90293983606, 148297.0674313365, 148323.23307695755, 148349.39987659742, 148375.56783015432, 148401.73693752653, 148427.90719861226, 148454.07861330983, 148480.25118151752, 148506.42490313368, 148532.59977805667, 148558.77580618486, 148584.95298741665, 148611.13132165043, 148637.31080878471, 148663.49144871789, 148689.6732413485, 148715.85618657502, 148742.040284296, 148768.22553440998, 148794.41193681557, 148820.59949141133, 148846.78819809589, 148872.97805676793, 148899.16906732606, 148925.36122966901, 148951.55454369547, 148977.74900930419, 149003.9446263939, 149030.1413948634, 149056.33931461151, 149082.53838553699, 149108.73860753875, 149134.9399805156, 149161.14250436646, 149187.34617899026, 149213.5510042859, 149239.75698015234, 149265.96410648854, 149292.17238319354, 149318.38181016635, 149344.59238730598, 149370.80411451156, 149397.01699168212, 149423.23101871679, 149449.44619551473, 149475.66252197503, 149501.87999799693, 149528.0986234796, 149554.31839832227, 149580.53932242419, 149606.76139568459, 149632.98461800278, 149659.20898927809, 149685.43450940982, 149711.66117829733, 149737.88899584001, 149764.11796193724, 149790.34807648844, 149816.57933939309, 149842.81175055061, 149869.04530986046, 149895.28001722222, 149921.51587253538, 149947.75287569952, 149973.99102661415, 150000.23032517891, 150026.47077129342, 150052.71236485732, 150078.95510577026, 150105.1989939319, 150131.444029242, 150157.69021160025, 150183.93754090639, 150210.18601706024, 150236.43563996154, 150262.68640951012, 150288.93832560582, 150315.19138814852, 150341.44559703805, 150367.70095217437, 150393.95745345735, 150420.21510078697, 150446.47389406321, 150472.73383318601, 150498.99491805542, 150525.25714857146, 150551.52052463419, 150577.78504614369, 150604.05071300003, 150630.31752510337, 150656.58548235384, 150682.85458465159, 150709.1248318968, 150735.39622398972, 150761.66876083051, 150787.9424423195, 150814.21726835691, 150840.49323884305, 150866.77035367821, 150893.04861276277, 150919.32801599705, 150945.60856328148, 150971.89025451642, 150998.17308960229, 151024.45706843957, 151050.74219092872, 151077.02845697021, 151103.31586646455, 151129.60441931229, 151155.894115414, 151182.1849546702, 151208.47693698155, 151234.77006224863, 151261.06433037209, 151287.35974125259, 151313.65629479082, 151339.95399088747, 151366.25282944329, 151392.55281035902, 151418.85393353543, 151445.1561988733, 151471.45960627345, 151497.76415563675, 151524.06984686397, 151550.37667985607, 151576.68465451393, 151602.99377073845, 151629.30402843058, 151655.61542749128, 151681.92796782157, 151708.24164932242, 151734.55647189484, 151760.87243543993, 151787.18953985872, 151813.50778505235, 151839.82717092187, 151866.14769736846, 151892.46936429327, 151918.79217159748, 151945.11611918229, 151971.44120694889, 151997.76743479856, 152024.09480263255, 152050.42331035214, 152076.75295785864, 152103.08374505339, 152129.41567183775, 152155.74873811303, 152182.08294378067, 152208.41828874208, 152234.75477289871, 152261.09239615197, 152287.43115840337, 152313.77105955439, 152340.11209950657, 152366.45427816146, 152392.79759542056, 152419.14205118554, 152445.48764535793, 152471.8343778394, 152498.18224853161, 152524.53125733617, 152550.88140415482, 152577.23268888926, 152603.58511144121, 152629.93867171241, 152656.29336960468, 152682.64920501978, 152709.00617785956, 152735.36428802583, 152761.72353542043, 152788.08391994529, 152814.44544150229, 152840.80809999333, 152867.17189532038, 152893.53682738543, 152919.90289609041, 152946.27010133737, 152972.63844302832, 152999.00792106529, 153025.37853535041, 153051.7502857857, 153078.12317227334, 153104.4971947154, 153130.8723530141, 153157.24864707157, 153183.62607679001, 153210.00464207167, 153236.38434281875, 153262.76517893354, 153289.14715031831, 153315.53025687535, 153341.91449850702, 153368.2998751156, 153394.68638660354, 153421.07403287315, 153447.46281382689, 153473.85272936718, 153500.24377939643, 153526.63596381716, 153553.02928253182, 153579.42373544298, 153605.81932245308, 153632.21604346478, 153658.61389838057, 153685.0128871031, 153711.41300953497, 153737.81426557881, 153764.21665513728, 153790.62017811305, 153817.02483440886, 153843.43062392739, 153869.83754657139, 153896.24560224367, 153922.65479084692, 153949.06511228404, 153975.4765664578, 154001.88915327107, 154028.30287262669, 154054.71772442761, 154081.13370857667, 154107.55082497682, 154133.96907353101, 154160.38845414223, 154186.80896671346, 154213.23061114774, 154239.65338734805, 154266.07729521746, 154292.50233465908, 154318.92850557598, 154345.35580787127, 154371.7842414481, 154398.21380620965, 154424.64450205903, 154451.07632889951, 154477.50928663427, 154503.94337516659, 154530.37859439969, 154556.81494423689, 154583.25242458144, 154609.69103533673, 154636.13077640603, 154662.57164769279, 154689.01364910032, 154715.45678053208, 154741.90104189145, 154768.34643308193, 154794.79295400696, 154821.24060457002, 154847.68938467462, 154874.13929422433, 154900.59033312264, 154927.04250127316, 154953.49579857948, 154979.95022494521, 155006.40578027396, 155032.86246446942, 155059.32027743524, 155085.77921907514, 155112.2392892928, 155138.70048799197, 155165.16281507642, 155191.62627044989, 155218.09085401625, 155244.55656567923, 155271.02340534274, 155297.49137291059, 155323.96046828668, 155350.4306913749, 155376.90204207919, 155403.37452030348, 155429.84812595171, 155456.32285892789, 155482.79871913602, 155509.27570648011, 155535.75382086422, 155562.23306219239, 155588.71343036872, 155615.19492529731, 155641.67754688227, 155668.16129502779, 155694.64616963797, 155721.13217061706, 155747.61929786921, 155774.10755129869, 155800.59693080973, 155827.08743630661, 155853.57906769359, 155880.07182487496, 155906.56570775513, 155933.06071623837, 155959.55685022907, 155986.05410963166, 156012.5524943505, 156039.05200429002, 156065.55263935472, 156092.054399449, 156118.5572844774, 156145.06129434443, 156171.5664289546, 156198.07268821247, 156224.5800720226, 156251.08858028959, 156277.59821291809, 156304.10896981266, 156330.62085087801, 156357.1338560188, 156383.64798513969, 156410.16323814544, 156436.67961494075, 156463.1971154304, 156489.71573951913, 156516.23548711176, 156542.75635811311, 156569.27835242799, 156595.80146996127, 156622.32571061782, 156648.85107430254, 156675.37756092031, 156701.90517037612, 156728.43390257491, 156754.96375742162, 156781.49473482129, 156808.02683467892, 156834.5600568995, 156861.09440138817, 156887.62986804993, 156914.16645678994, 156940.70416751326, 156967.24300012505, 156993.78295453047, 157020.32403063469, 157046.8662283429, 157073.40954756032, 157099.9539881922, 157126.49955014378, 157153.04623332032, 157179.59403762716, 157206.14296296958, 157232.69300925292, 157259.24417638258, 157285.79646426387, 157312.34987280221, 157338.90440190304, 157365.46005147175, 157392.01682141385, 157418.57471163478, 157445.13372204005, 157471.69385253513, 157498.25510302564, 157524.81747341706, 157551.38096361503, 157577.9455735251, 157604.51130305286, 157631.07815210402, 157657.64612058419, 157684.21520839902, 157710.78541545427, 157737.35674165559, 157763.92918690876, 157790.50275111952, 157817.07743419363, 157843.65323603692, 157870.23015655516, 157896.80819565422, 157923.3873532399, 157949.96762921812, 157976.54902349479, 158003.13153597576, 158029.71516656701, 158056.29991517449, 158082.88578170416, 158109.47276606198, 158136.06086815402, 158162.65008788629, 158189.24042516484, 158215.83187989573, 158242.42445198505, 158269.01814133892, 158295.61294786347, 158322.20887146486, 158348.80591204923, 158375.4040695228, 158402.00334379176, 158428.60373476235, 158455.2052423408, 158481.80786643337, 158508.41160694641, 158535.01646378616, 158561.62243685898, 158588.2295260712, 158614.8377313292, 158641.44705253936, 158668.05748960807, 158694.66904244179, 158721.28171094693, 158747.89549502998, 158774.5103945974, 158801.12640955573, 158827.74353981143, 158854.36178527112, 158880.9811458413, 158907.60162142856, 158934.22321193956, 158960.84591728085, 158987.46973735912, 159014.09467208097, 159040.72072135314, 159067.3478850823, 159093.97616317519, 159120.60555553852, 159147.23606207906, 159173.8676827036, 159200.50041731889, 159227.13426583182, 159253.76922814918, 159280.40530417781, 159307.04249382461, 159333.68079699649, 159360.32021360032, 159386.96074354305, 159413.60238673165, 159440.24514307309, 159466.88901247433, 159493.53399484244, 159520.18009008438, 159546.82729810724, 159573.47561881805, 159600.12505212394, 159626.77559793202, 159653.42725614941, 159680.08002668325, 159706.73390944069, 159733.38890432892, 159760.04501125516, 159786.70223012666, 159813.36056085059, 159840.02000333427, 159866.68055748497, 159893.34222320997, 159920.00500041663, 159946.66888901225, 159973.33388890422, 159999.99999999988, 160026.66722220668, 160053.33555543202, 160080.0049995833, 160106.67555456801, 160133.3472202936, 160160.0199966676, 160186.6938835975, 160213.36888099083, 160240.04498875517, 160266.72220679806, 160293.40053502709, 160320.07997334987, 160346.76052167406, 160373.44217990729, 160400.1249479572, 160426.80882573154, 160453.49381313793, 160480.17991008417, 160506.86711647795, 160533.55543222709, 160560.24485723933, 160586.93539142248, 160613.62703468435, 160640.31978693281, 160667.01364807569, 160693.70861802087, 160720.40469667627, 160747.1018839498, 160773.80017974938, 160800.49958398298, 160827.20009655855, 160853.90171738411, 160880.60444636765, 160907.30828341722, 160934.01322844089, 160960.71928134665, 160987.42644204266, 161014.13471043704, 161040.84408643784, 161067.55456995327, 161094.26616089148, 161120.97885916062, 161147.69266466892, 161174.40757732463, 161201.12359703594, 161227.84072371112, 161254.55895725847, 161281.27829758628, 161307.99874460287, 161334.72029821656, 161361.44295833571, 161388.1667248687, 161414.89159772391, 161441.61757680977, 161468.34466203468, 161495.07285330712, 161521.80215053557, 161548.53255362847, 161575.26406249436, 161601.99667704175, 161628.7303971792, 161655.46522281526, 161682.20115385848, 161708.93819021754, 161735.67633180099, 161762.41557851751, 161789.15593027571, 161815.89738698432, 161842.63994855201, 161869.38361488748, 161896.1283858995, 161922.87426149679, 161949.62124158812, 161976.36932608229, 162003.1185148881, 162029.8688079144, 162056.62020507001, 162083.37270626382, 162110.12631140469, 162136.88102040152, 162163.63683316324, 162190.39374959879, 162217.15176961714, 162243.91089312723, 162270.67112003808, 162297.43245025873, 162324.19488369819, 162350.9584202655, 162377.72305986975, 162404.48880242003, 162431.25564782543, 162458.02359599507, 162484.79264683815, 162511.56280026378, 162538.33405618116, 162565.10641449949, 162591.87987512801, 162618.65443797593, 162645.43010295252, 162672.20686996708, 162698.98473892888, 162725.76370974723, 162752.54378233149, 162779.32495659095, 162806.10723243505, 162832.89060977317, 162859.67508851466, 162886.46066856899, 162913.24734984562, 162940.03513225398, 162966.82401570358, 162993.6140001039, 163020.40508536444, 163047.19727139481, 163073.99055810447, 163100.78494540305, 163127.58043320014, 163154.37702140535, 163181.17470992831, 163207.97349867865, 163234.77338756606, 163261.57437650024, 163288.37646539087, 163315.17965414765, 163341.98394268038, 163368.78933089875, 163395.59581871261, 163422.40340603172, 163449.2120927659, 163476.02187882498, 163502.83276411882, 163529.6447485573, 163556.45783205028, 163583.2720145077, 163610.08729583945, 163636.90367595552, 163663.72115476584, 163690.53973218042, 163717.35940810922, 163744.18018246227, 163771.00205514964, 163797.82502608138, 163824.64909516752, 163851.4742623182, 163878.3005274435, 163905.12789045356, 163931.95635125853, 163958.78590976857, 163985.61656589387, 164012.44831954464, 164039.28117063109, 164066.11511906344, 164092.95016475199, 164119.78630760699, 164146.62354753874, 164173.46188445756, 164200.30131827376, 164227.14184889771, 164253.98347623978, 164280.82620021031, 164307.67002071979, 164334.51493767856, 164361.3609509971, 164388.20806058586, 164415.05626635533, 164441.905568216, 164468.75596607837, 164495.607459853, 164522.4600494504, 164549.31373478117, 164576.16851575591, 164603.02439228518, 164629.88136427966, 164656.73943164994, 164683.59859430668, 164710.45885216061, 164737.32020512238, 164764.1826531027, 164791.04619601235, 164817.91083376206, 164844.77656626256, 164871.64339342469, 164898.51131515924, 164925.38033137703, 164952.25044198887, 164979.1216469057, 165005.9939460383, 165032.86733929763, 165059.7418265946, 165086.61740784015, 165113.4940829452 }; #else #ifdef BIG_IQ_TABLE #define IQ_TABLE_SIZE 8192 #else #define IQ_TABLE_SIZE 1026 #endif ALIGN static const real_t iq_table[IQ_TABLE_SIZE] = { REAL_CONST(0.0), REAL_CONST(1.0/8.0), REAL_CONST(2.5198420997897464/8.0), REAL_CONST(4.3267487109222245/8.0), REAL_CONST(6.3496042078727974/8.0), REAL_CONST(8.5498797333834844/8.0), REAL_CONST(10.902723556992836/8.0), REAL_CONST(13.390518279406722/8.0), REAL_CONST(15.999999999999998/8.0), REAL_CONST(18.720754407467133/8.0), REAL_CONST(21.544346900318832/8.0), REAL_CONST(24.463780996262464/8.0), REAL_CONST(27.47314182127996/8.0), REAL_CONST(30.567350940369842/8.0), REAL_CONST(33.741991698453212/8.0), REAL_CONST(36.993181114957046/8.0), REAL_CONST(40.317473596635935/8.0), REAL_CONST(43.711787041189993/8.0), REAL_CONST(47.173345095760126/8.0), REAL_CONST(50.699631325716943/8.0), REAL_CONST(54.288352331898118/8.0), REAL_CONST(57.937407704003519/8.0), REAL_CONST(61.6448652744185/8.0), REAL_CONST(65.408940536585988/8.0), REAL_CONST(69.227979374755591/8.0), REAL_CONST(73.100443455321638/8.0), REAL_CONST(77.024897778591622/8.0), REAL_CONST(80.999999999999986/8.0), REAL_CONST(85.024491212518527/8.0), REAL_CONST(89.097187944889555/8.0), REAL_CONST(93.216975178615741/8.0), REAL_CONST(97.382800224133163/8.0), REAL_CONST(101.59366732596474/8.0), REAL_CONST(105.84863288986224/8.0), REAL_CONST(110.14680124343441/8.0), REAL_CONST(114.4873208566006/8.0), REAL_CONST(118.86938096020653/8.0), REAL_CONST(123.29220851090024/8.0), REAL_CONST(127.75506545836058/8.0), REAL_CONST(132.25724627755247/8.0), REAL_CONST(136.79807573413572/8.0), REAL_CONST(141.37690685569191/8.0), REAL_CONST(145.99311908523086/8.0), REAL_CONST(150.6461165966291/8.0), REAL_CONST(155.33532675434674/8.0), REAL_CONST(160.06019870205279/8.0), REAL_CONST(164.82020206673349/8.0), REAL_CONST(169.61482576651861/8.0), REAL_CONST(174.44357691188537/8.0), REAL_CONST(179.30597979112557/8.0), REAL_CONST(184.20157493201927/8.0), REAL_CONST(189.12991823257562/8.0), REAL_CONST(194.09058015449685/8.0), REAL_CONST(199.08314497371677/8.0), REAL_CONST(204.1072100829694/8.0), REAL_CONST(209.16238534187647/8.0), REAL_CONST(214.24829247050752/8.0), REAL_CONST(219.36456448277784/8.0), REAL_CONST(224.51084515641216/8.0), REAL_CONST(229.6867885365223/8.0), REAL_CONST(234.89205847013176/8.0), REAL_CONST(240.12632816923249/8.0), REAL_CONST(245.38927980018505/8.0), REAL_CONST(250.68060409747261/8.0), REAL_CONST(255.99999999999991/8.0), REAL_CONST(261.34717430828869/8.0), REAL_CONST(266.72184136106449/8.0), REAL_CONST(272.12372272986045/8.0), REAL_CONST(277.55254693037961/8.0), REAL_CONST(283.0080491494619/8.0), REAL_CONST(288.48997098659891/8.0), REAL_CONST(293.99806020902247/8.0), REAL_CONST(299.53207051947408/8.0), REAL_CONST(305.0917613358298/8.0), REAL_CONST(310.67689758182206/8.0), REAL_CONST(316.28724948815585/8.0), REAL_CONST(321.92259240337177/8.0), REAL_CONST(327.58270661385535/8.0), REAL_CONST(333.26737717243742/8.0), REAL_CONST(338.97639373507025/8.0), REAL_CONST(344.70955040510125/8.0), REAL_CONST(350.46664558470013/8.0), REAL_CONST(356.24748183302603/8.0), REAL_CONST(362.05186573075139/8.0), REAL_CONST(367.87960775058258/8.0), REAL_CONST(373.73052213344511/8.0), REAL_CONST(379.60442677002078/8.0), REAL_CONST(385.50114308734607/8.0), REAL_CONST(391.42049594019937/8.0), REAL_CONST(397.36231350702371/8.0), REAL_CONST(403.32642719014467/8.0), REAL_CONST(409.31267152006262/8.0), REAL_CONST(415.32088406360799/8.0), REAL_CONST(421.35090533576471/8.0), REAL_CONST(427.40257871497619/8.0), REAL_CONST(433.4757503617617/8.0), REAL_CONST(439.5702691404793/8.0), REAL_CONST(445.68598654408271/8.0), REAL_CONST(451.82275662172759/8.0), REAL_CONST(457.98043590909128/8.0), REAL_CONST(464.15888336127773/8.0), REAL_CONST(470.35796028818726/8.0), REAL_CONST(476.5775302922363/8.0), REAL_CONST(482.81745920832043/8.0), REAL_CONST(489.07761504591741/8.0), REAL_CONST(495.35786793323581/8.0), REAL_CONST(501.65809006331688/8.0), REAL_CONST(507.97815564200368/8.0), REAL_CONST(514.31794083769648/8.0), REAL_CONST(520.67732373281672/8.0), REAL_CONST(527.05618427690604/8.0), REAL_CONST(533.45440424129174/8.0), REAL_CONST(539.87186717525128/8.0), REAL_CONST(546.30845836361505/8.0), REAL_CONST(552.76406478574609/8.0), REAL_CONST(559.23857507584194/8.0), REAL_CONST(565.73187948450413/8.0), REAL_CONST(572.24386984152341/8.0), REAL_CONST(578.77443951983378/8.0), REAL_CONST(585.32348340058843/8.0), REAL_CONST(591.89089783931263/8.0), REAL_CONST(598.47658063309257/8.0), REAL_CONST(605.08043098876044/8.0), REAL_CONST(611.70234949203643/8.0), REAL_CONST(618.3422380775919/8.0), REAL_CONST(624.99999999999977/8.0), REAL_CONST(631.67553980553748/8.0), REAL_CONST(638.36876330481164/8.0), REAL_CONST(645.07957754617485/8.0), REAL_CONST(651.80789078990415/8.0), REAL_CONST(658.55361248311499/8.0), REAL_CONST(665.31665323538357/8.0), REAL_CONST(672.09692479505225/8.0), REAL_CONST(678.8943400261943/8.0), REAL_CONST(685.70881288621433/8.0), REAL_CONST(692.540258404062/8.0), REAL_CONST(699.38859265903977/8.0), REAL_CONST(706.25373276018058/8.0), REAL_CONST(713.13559682617972/8.0), REAL_CONST(720.03410396586037/8.0), REAL_CONST(726.94917425915435/8.0), REAL_CONST(733.88072873858209/8.0), REAL_CONST(740.82868937121543/8.0), REAL_CONST(747.79297904110535/8.0), REAL_CONST(754.77352153216191/8.0), REAL_CONST(761.77024151147043/8.0), REAL_CONST(768.78306451302956/8.0), REAL_CONST(775.81191692189896/8.0), REAL_CONST(782.85672595874246/8.0), REAL_CONST(789.91741966475445/8.0), REAL_CONST(796.99392688695798/8.0), REAL_CONST(804.08617726386274/8.0), REAL_CONST(811.19410121147098/8.0), REAL_CONST(818.31762990962227/8.0), REAL_CONST(825.45669528866563/8.0), REAL_CONST(832.61123001644864/8.0), REAL_CONST(839.78116748561604/8.0), REAL_CONST(846.96644180120552/8.0), REAL_CONST(854.16698776853514/8.0), REAL_CONST(861.38274088137143/8.0), REAL_CONST(868.61363731036977/8.0), REAL_CONST(875.85961389178203/8.0), REAL_CONST(883.12060811641959/8.0), REAL_CONST(890.39655811886757/8.0), REAL_CONST(897.68740266694181/8.0), REAL_CONST(904.99308115138172/8.0), REAL_CONST(912.31353357577188/8.0), REAL_CONST(919.64870054668756/8.0), REAL_CONST(926.99852326405619/8.0), REAL_CONST(934.36294351172899/8.0), REAL_CONST(941.74190364825859/8.0), REAL_CONST(949.13534659787422/8.0), REAL_CONST(956.54321584165211/8.0), REAL_CONST(963.96545540887348/8.0), REAL_CONST(971.40200986856541/8.0), REAL_CONST(978.85282432122176/8.0), REAL_CONST(986.31784439069588/8.0), REAL_CONST(993.7970162162635/8.0), REAL_CONST(1001.29028644485/8.0), REAL_CONST(1008.797602223418/8.0), REAL_CONST(1016.3189111915103/8.0), REAL_CONST(1023.8541614739464/8.0), REAL_CONST(1031.4033016736653/8.0), REAL_CONST(1038.9662808647138/8.0), REAL_CONST(1046.5430485853758/8.0), REAL_CONST(1054.1335548314366/8.0), REAL_CONST(1061.7377500495838/8.0), REAL_CONST(1069.3555851309357/8.0), REAL_CONST(1076.9870114046978/8.0), REAL_CONST(1084.6319806319441/8.0), REAL_CONST(1092.2904449995174/8.0), REAL_CONST(1099.9623571140482/8.0), REAL_CONST(1107.6476699960892/8.0), REAL_CONST(1115.3463370743607/8.0), REAL_CONST(1123.058312180106/8.0), REAL_CONST(1130.7835495415541/8.0), REAL_CONST(1138.5220037784854/8.0), REAL_CONST(1146.273629896901/8.0), REAL_CONST(1154.0383832837879/8.0), REAL_CONST(1161.816219701986/8.0), REAL_CONST(1169.607095285146/8.0), REAL_CONST(1177.4109665327808/8.0), REAL_CONST(1185.2277903054078/8.0), REAL_CONST(1193.0575238197798/8.0), REAL_CONST(1200.9001246442001/8.0), REAL_CONST(1208.7555506939248/8.0), REAL_CONST(1216.6237602266442/8.0), REAL_CONST(1224.5047118380478/8.0), REAL_CONST(1232.3983644574657/8.0), REAL_CONST(1240.3046773435874/8.0), REAL_CONST(1248.2236100802568/8.0), REAL_CONST(1256.1551225723395/8.0), REAL_CONST(1264.099175041662/8.0), REAL_CONST(1272.0557280230228/8.0), REAL_CONST(1280.0247423602691/8.0), REAL_CONST(1288.0061792024444/8.0), REAL_CONST(1295.9999999999995/8.0), REAL_CONST(1304.006166501068/8.0), REAL_CONST(1312.0246407478062/8.0), REAL_CONST(1320.0553850727929/8.0), REAL_CONST(1328.0983620954903/8.0), REAL_CONST(1336.1535347187651/8.0), REAL_CONST(1344.2208661254647/8.0), REAL_CONST(1352.3003197750522/8.0), REAL_CONST(1360.3918594002962/8.0), REAL_CONST(1368.4954490040145/8.0), REAL_CONST(1376.6110528558709/8.0), REAL_CONST(1384.7386354892244/8.0), REAL_CONST(1392.8781616980295/8.0), REAL_CONST(1401.0295965337855/8.0), REAL_CONST(1409.1929053025353/8.0), REAL_CONST(1417.3680535619119/8.0), REAL_CONST(1425.5550071182327/8.0), REAL_CONST(1433.7537320236374/8.0), REAL_CONST(1441.9641945732744/8.0), REAL_CONST(1450.1863613025282/8.0), REAL_CONST(1458.4201989842913/8.0), REAL_CONST(1466.6656746262797/8.0), REAL_CONST(1474.9227554683875/8.0), REAL_CONST(1483.1914089800841/8.0), REAL_CONST(1491.4716028578516/8.0), REAL_CONST(1499.7633050226596/8.0), REAL_CONST(1508.0664836174794/8.0), REAL_CONST(1516.3811070048375/8.0), REAL_CONST(1524.7071437644029/8.0), REAL_CONST(1533.0445626906128/8.0), REAL_CONST(1541.3933327903342/8.0), REAL_CONST(1549.7534232805581/8.0), REAL_CONST(1558.1248035861302/8.0), REAL_CONST(1566.507443337515/8.0), REAL_CONST(1574.9013123685909/8.0), REAL_CONST(1583.3063807144795/8.0), REAL_CONST(1591.7226186094069/8.0), REAL_CONST(1600.1499964845941/8.0), REAL_CONST(1608.58848496618/8.0), REAL_CONST(1617.0380548731737/8.0), REAL_CONST(1625.4986772154357/8.0), REAL_CONST(1633.9703231916887/8.0), REAL_CONST(1642.4529641875577/8.0), REAL_CONST(1650.9465717736346/8.0), REAL_CONST(1659.4511177035752/8.0), REAL_CONST(1667.9665739122186/8.0), REAL_CONST(1676.4929125137353/8.0), REAL_CONST(1685.030105799801/8.0), REAL_CONST(1693.5781262377957/8.0), REAL_CONST(1702.136946469027/8.0), REAL_CONST(1710.7065393069795/8.0), REAL_CONST(1719.2868777355877/8.0), REAL_CONST(1727.8779349075323/8.0), REAL_CONST(1736.4796841425596/8.0), REAL_CONST(1745.092098925825/8.0), REAL_CONST(1753.7151529062583/8.0), REAL_CONST(1762.3488198949503/8.0), REAL_CONST(1770.9930738635628/8.0), REAL_CONST(1779.6478889427597/8.0), REAL_CONST(1788.3132394206564/8.0), REAL_CONST(1796.9890997412947/8.0), REAL_CONST(1805.6754445031333/8.0), REAL_CONST(1814.3722484575621/8.0), REAL_CONST(1823.0794865074322/8.0), REAL_CONST(1831.7971337056094/8.0), REAL_CONST(1840.5251652535437/8.0), REAL_CONST(1849.2635564998579/8.0), REAL_CONST(1858.0122829389563/8.0), REAL_CONST(1866.7713202096493/8.0), REAL_CONST(1875.5406440937966/8.0), REAL_CONST(1884.3202305149687/8.0), REAL_CONST(1893.110055537124/8.0), REAL_CONST(1901.9100953633042/8.0), REAL_CONST(1910.7203263343454/8.0), REAL_CONST(1919.5407249276057/8.0), REAL_CONST(1928.3712677557098/8.0), REAL_CONST(1937.2119315653083/8.0), REAL_CONST(1946.0626932358525/8.0), REAL_CONST(1954.923529778386/8.0), REAL_CONST(1963.79441833435/8.0), REAL_CONST(1972.6753361744036/8.0), REAL_CONST(1981.5662606972594/8.0), REAL_CONST(1990.467169428533/8.0), REAL_CONST(1999.3780400196069/8.0), REAL_CONST(2008.2988502465078/8.0), REAL_CONST(2017.2295780087982/8.0), REAL_CONST(2026.1702013284819/8.0), REAL_CONST(2035.1206983489212/8.0), REAL_CONST(2044.0810473337688/8.0), REAL_CONST(2053.0512266659125/8.0), REAL_CONST(2062.0312148464309/8.0), REAL_CONST(2071.0209904935646/8.0), REAL_CONST(2080.0205323416958/8.0), REAL_CONST(2089.0298192403443/8.0), REAL_CONST(2098.0488301531714/8.0), REAL_CONST(2107.0775441569995/8.0), REAL_CONST(2116.115940440839/8.0), REAL_CONST(2125.1639983049317/8.0), REAL_CONST(2134.2216971597995/8.0), REAL_CONST(2143.2890165253098/8.0), REAL_CONST(2152.3659360297484/8.0), REAL_CONST(2161.4524354089031/8.0), REAL_CONST(2170.5484945051617/8.0), REAL_CONST(2179.6540932666144/8.0), REAL_CONST(2188.7692117461711/8.0), REAL_CONST(2197.8938301006888/8.0), REAL_CONST(2207.0279285901042/8.0), REAL_CONST(2216.1714875765838/8.0), REAL_CONST(2225.324487523676/8.0), REAL_CONST(2234.4869089954782/8.0), REAL_CONST(2243.6587326558101/8.0), REAL_CONST(2252.8399392673982/8.0), REAL_CONST(2262.0305096910702/8.0), REAL_CONST(2271.2304248849537/8.0), REAL_CONST(2280.4396659036897/8.0), REAL_CONST(2289.6582138976523/8.0), REAL_CONST(2298.8860501121762/8.0), REAL_CONST(2308.1231558867926/8.0), REAL_CONST(2317.3695126544767/8.0), REAL_CONST(2326.6251019409005/8.0), REAL_CONST(2335.8899053636933/8.0), REAL_CONST(2345.1639046317132/8.0), REAL_CONST(2354.4470815443233/8.0), REAL_CONST(2363.7394179906792/8.0), REAL_CONST(2373.0408959490205/8.0), REAL_CONST(2382.3514974859731/8.0), REAL_CONST(2391.6712047558558/8.0), REAL_CONST(2400.9999999999991/8.0), REAL_CONST(2410.3378655460651/8.0), REAL_CONST(2419.6847838073813/8.0), REAL_CONST(2429.0407372822747/8.0), REAL_CONST(2438.4057085534191/8.0), REAL_CONST(2447.7796802871858/8.0), REAL_CONST(2457.1626352330004/8.0), REAL_CONST(2466.5545562227112/8.0), REAL_CONST(2475.9554261699564/8.0), REAL_CONST(2485.3652280695474/8.0), REAL_CONST(2494.7839449968492/8.0), REAL_CONST(2504.2115601071737/8.0), REAL_CONST(2513.6480566351788/8.0), REAL_CONST(2523.0934178942675/8.0), REAL_CONST(2532.5476272760025/8.0), REAL_CONST(2542.0106682495189/8.0), REAL_CONST(2551.482524360948/8.0), REAL_CONST(2560.9631792328441/8.0), REAL_CONST(2570.4526165636184/8.0), REAL_CONST(2579.9508201269791/8.0), REAL_CONST(2589.4577737713744/8.0), REAL_CONST(2598.9734614194458/8.0), REAL_CONST(2608.4978670674823/8.0), REAL_CONST(2618.0309747848837/8.0), REAL_CONST(2627.5727687136259/8.0), REAL_CONST(2637.1232330677353/8.0), REAL_CONST(2646.6823521327647/8.0), REAL_CONST(2656.2501102652768/8.0), REAL_CONST(2665.8264918923328/8.0), REAL_CONST(2675.4114815109842/8.0), REAL_CONST(2685.0050636877722/8.0), REAL_CONST(2694.6072230582295/8.0), REAL_CONST(2704.2179443263894/8.0), REAL_CONST(2713.8372122642972/8.0), REAL_CONST(2723.4650117115279/8.0), REAL_CONST(2733.1013275747096/8.0), REAL_CONST(2742.7461448270483/8.0), REAL_CONST(2752.3994485078601/8.0), REAL_CONST(2762.0612237221085/8.0), REAL_CONST(2771.7314556399419/8.0), REAL_CONST(2781.4101294962406/8.0), REAL_CONST(2791.0972305901655/8.0), REAL_CONST(2800.7927442847094/8.0), REAL_CONST(2810.4966560062589/8.0), REAL_CONST(2820.2089512441521/8.0), REAL_CONST(2829.9296155502466/8.0), REAL_CONST(2839.6586345384894/8.0), REAL_CONST(2849.3959938844923/8.0), REAL_CONST(2859.1416793251065/8.0), REAL_CONST(2868.8956766580086/8.0), REAL_CONST(2878.6579717412847/8.0), REAL_CONST(2888.4285504930212/8.0), REAL_CONST(2898.2073988908974/8.0), REAL_CONST(2907.9945029717837/8.0), REAL_CONST(2917.789848831344/8.0), REAL_CONST(2927.5934226236377/8.0), REAL_CONST(2937.4052105607311/8.0), REAL_CONST(2947.2251989123079/8.0), REAL_CONST(2957.0533740052865/8.0), REAL_CONST(2966.8897222234368/8.0), REAL_CONST(2976.734230007005/8.0), REAL_CONST(2986.5868838523397/8.0), REAL_CONST(2996.4476703115197/8.0), REAL_CONST(3006.3165759919889/8.0), REAL_CONST(3016.1935875561908/8.0), REAL_CONST(3026.0786917212095/8.0), REAL_CONST(3035.9718752584108/8.0), REAL_CONST(3045.8731249930906/8.0), REAL_CONST(3055.7824278041207/8.0), REAL_CONST(3065.6997706236039/8.0), REAL_CONST(3075.625140436528/8.0), REAL_CONST(3085.5585242804245/8.0), REAL_CONST(3095.4999092450298/8.0), REAL_CONST(3105.4492824719491/8.0), REAL_CONST(3115.4066311543256/8.0), REAL_CONST(3125.3719425365089/8.0), REAL_CONST(3135.3452039137287/8.0), REAL_CONST(3145.3264026317715/8.0), REAL_CONST(3155.3155260866592/8.0), REAL_CONST(3165.3125617243295/8.0), REAL_CONST(3175.3174970403229/8.0), REAL_CONST(3185.3303195794679/8.0), REAL_CONST(3195.35101693557/8.0), REAL_CONST(3205.3795767511078/8.0), REAL_CONST(3215.4159867169251/8.0), REAL_CONST(3225.460234571929/8.0), REAL_CONST(3235.5123081027928/8.0), REAL_CONST(3245.5721951436558/8.0), REAL_CONST(3255.63988357583/8.0), REAL_CONST(3265.7153613275095/8.0), REAL_CONST(3275.7986163734795/8.0), REAL_CONST(3285.8896367348289/8.0), REAL_CONST(3295.9884104786665/8.0), REAL_CONST(3306.0949257178395/8.0), REAL_CONST(3316.2091706106517/8.0), REAL_CONST(3326.331133360588/8.0), REAL_CONST(3336.4608022160378/8.0), REAL_CONST(3346.5981654700231/8.0), REAL_CONST(3356.7432114599264/8.0), REAL_CONST(3366.8959285672249/8.0), REAL_CONST(3377.0563052172211/8.0), REAL_CONST(3387.2243298787821/8.0), REAL_CONST(3397.3999910640764/8.0), REAL_CONST(3407.5832773283128/8.0), REAL_CONST(3417.7741772694862/8.0), REAL_CONST(3427.9726795281199/8.0), REAL_CONST(3438.1787727870123/8.0), REAL_CONST(3448.3924457709873/8.0), REAL_CONST(3458.6136872466445/8.0), REAL_CONST(3468.8424860221107/8.0), REAL_CONST(3479.0788309467976/8.0), REAL_CONST(3489.3227109111554/8.0), REAL_CONST(3499.5741148464344/8.0), REAL_CONST(3509.8330317244445/8.0), REAL_CONST(3520.0994505573185/8.0), REAL_CONST(3530.3733603972751/8.0), REAL_CONST(3540.6547503363886/8.0), REAL_CONST(3550.9436095063534/8.0), REAL_CONST(3561.239927078258/8.0), REAL_CONST(3571.5436922623535/8.0), REAL_CONST(3581.8548943078308/8.0), REAL_CONST(3592.1735225025936/8.0), REAL_CONST(3602.4995661730372/8.0), REAL_CONST(3612.8330146838275/8.0), REAL_CONST(3623.1738574376814/8.0), REAL_CONST(3633.5220838751502/8.0), REAL_CONST(3643.8776834744031/8.0), REAL_CONST(3654.2406457510142/8.0), REAL_CONST(3664.6109602577494/8.0), REAL_CONST(3674.9886165843564/8.0), REAL_CONST(3685.3736043573545/8.0), REAL_CONST(3695.7659132398294/8.0), REAL_CONST(3706.1655329312248/8.0), REAL_CONST(3716.5724531671399/8.0), REAL_CONST(3726.9866637191262/8.0), REAL_CONST(3737.4081543944876/8.0), REAL_CONST(3747.8369150360782/8.0), REAL_CONST(3758.2729355221072/8.0), REAL_CONST(3768.7162057659411/8.0), REAL_CONST(3779.1667157159077/8.0), REAL_CONST(3789.6244553551055/8.0), REAL_CONST(3800.0894147012082/8.0), REAL_CONST(3810.5615838062768/8.0), REAL_CONST(3821.0409527565694/8.0), REAL_CONST(3831.5275116723533/8.0), REAL_CONST(3842.0212507077194/8.0), REAL_CONST(3852.522160050396/8.0), REAL_CONST(3863.0302299215673/8.0), REAL_CONST(3873.5454505756893/8.0), REAL_CONST(3884.0678123003108/8.0), REAL_CONST(3894.5973054158922/8.0), REAL_CONST(3905.1339202756285/8.0), REAL_CONST(3915.6776472652732/8.0), REAL_CONST(3926.2284768029604/8.0), REAL_CONST(3936.7863993390338/8.0), REAL_CONST(3947.3514053558706/8.0), REAL_CONST(3957.9234853677135/8.0), REAL_CONST(3968.5026299204969/8.0), REAL_CONST(3979.0888295916798/8.0), REAL_CONST(3989.6820749900776/8.0), REAL_CONST(4000.2823567556948/8.0), REAL_CONST(4010.8896655595613/8.0), REAL_CONST(4021.5039921035655/8.0), REAL_CONST(4032.1253271202945/8.0), REAL_CONST(4042.7536613728694/8.0), REAL_CONST(4053.3889856547858/8.0), REAL_CONST(4064.0312907897551/8.0), REAL_CONST(4074.6805676315448/8.0), REAL_CONST(4085.3368070638221/8.0), REAL_CONST(4095.9999999999982/8.0), REAL_CONST(4106.6701373830711/8.0), REAL_CONST(4117.347210185475/8.0), REAL_CONST(4128.0312094089259/8.0), REAL_CONST(4138.722126084268/8.0), REAL_CONST(4149.4199512713267/8.0), REAL_CONST(4160.1246760587583/8.0), REAL_CONST(4170.8362915638982/8.0), REAL_CONST(4181.5547889326181/8.0), REAL_CONST(4192.2801593391769/8.0), REAL_CONST(4203.0123939860741/8.0), REAL_CONST(4213.7514841039101/8.0), REAL_CONST(4224.4974209512384/8.0), REAL_CONST(4235.2501958144258/8.0), REAL_CONST(4246.0098000075095/8.0), REAL_CONST(4256.7762248720574/8.0), REAL_CONST(4267.549461777031/8.0), REAL_CONST(4278.3295021186423/8.0), REAL_CONST(4289.1163373202198/8.0), REAL_CONST(4299.9099588320714/8.0), REAL_CONST(4310.7103581313495/8.0), REAL_CONST(4321.5175267219138/8.0), REAL_CONST(4332.3314561342004/8.0), REAL_CONST(4343.152137925088/8.0), REAL_CONST(4353.9795636777671/8.0), REAL_CONST(4364.8137250016052/8.0), REAL_CONST(4375.6546135320223/8.0), REAL_CONST(4386.5022209303588/8.0), REAL_CONST(4397.3565388837469/8.0), REAL_CONST(4408.2175591049827/8.0), REAL_CONST(4419.0852733324018/8.0), REAL_CONST(4429.9596733297531/8.0), REAL_CONST(4440.8407508860728/8.0), REAL_CONST(4451.7284978155603/8.0), REAL_CONST(4462.6229059574571/8.0), REAL_CONST(4473.5239671759227/8.0), REAL_CONST(4484.4316733599126/8.0), REAL_CONST(4495.3460164230582/8.0), REAL_CONST(4506.2669883035496/8.0), REAL_CONST(4517.1945809640119/8.0), REAL_CONST(4528.1287863913894/8.0), REAL_CONST(4539.069596596828/8.0), REAL_CONST(4550.0170036155587/8.0), REAL_CONST(4560.9709995067806/8.0), REAL_CONST(4571.931576353546/8.0), REAL_CONST(4582.898726262647/8.0), REAL_CONST(4593.8724413645004/8.0), REAL_CONST(4604.8527138130348/8.0), REAL_CONST(4615.8395357855816/8.0), REAL_CONST(4626.8328994827571/8.0), REAL_CONST(4637.8327971283588/8.0), REAL_CONST(4648.8392209692511/8.0), REAL_CONST(4659.8521632752563/8.0), REAL_CONST(4670.8716163390473/8.0), REAL_CONST(4681.8975724760394/8.0), REAL_CONST(4692.9300240242837/8.0), REAL_CONST(4703.9689633443595/8.0), REAL_CONST(4715.0143828192668/8.0), REAL_CONST(4726.0662748543255/8.0), REAL_CONST(4737.1246318770682/8.0), REAL_CONST(4748.1894463371373/8.0), REAL_CONST(4759.2607107061804/8.0), REAL_CONST(4770.3384174777493/8.0), REAL_CONST(4781.4225591671993/8.0), REAL_CONST(4792.5131283115852/8.0), REAL_CONST(4803.6101174695614/8.0), REAL_CONST(4814.7135192212854/8.0), REAL_CONST(4825.8233261683154/8.0), REAL_CONST(4836.9395309335096/8.0), REAL_CONST(4848.0621261609349/8.0), REAL_CONST(4859.1911045157631/8.0), REAL_CONST(4870.3264586841779/8.0), REAL_CONST(4881.4681813732768/8.0), REAL_CONST(4892.6162653109768/8.0), REAL_CONST(4903.7707032459193/8.0), REAL_CONST(4914.931487947375/8.0), REAL_CONST(4926.0986122051509/8.0), REAL_CONST(4937.2720688294967/8.0), REAL_CONST(4948.4518506510112/8.0), REAL_CONST(4959.637950520555/8.0), REAL_CONST(4970.8303613091521/8.0), REAL_CONST(4982.0290759079044/8.0), REAL_CONST(4993.2340872278974/8.0), REAL_CONST(5004.4453882001153/8.0), REAL_CONST(5015.6629717753467/8.0), REAL_CONST(5026.8868309241007/8.0), REAL_CONST(5038.1169586365131/8.0), REAL_CONST(5049.353347922266/8.0), REAL_CONST(5060.5959918104927/8.0), REAL_CONST(5071.8448833496996/8.0), REAL_CONST(5083.1000156076734/8.0), REAL_CONST(5094.3613816713996/8.0), REAL_CONST(5105.6289746469747/8.0), REAL_CONST(5116.9027876595246/8.0), REAL_CONST(5128.18281385312/8.0), REAL_CONST(5139.4690463906918/8.0), REAL_CONST(5150.7614784539473/8.0), REAL_CONST(5162.0601032432933/8.0), REAL_CONST(5173.3649139777472/8.0), REAL_CONST(5184.6759038948594/8.0), REAL_CONST(5195.9930662506322/8.0), REAL_CONST(5207.3163943194386/8.0), REAL_CONST(5218.6458813939435/8.0), REAL_CONST(5229.9815207850224/8.0), REAL_CONST(5241.3233058216847/8.0), REAL_CONST(5252.6712298509919/8.0), REAL_CONST(5264.025286237983/8.0), REAL_CONST(5275.3854683655954/8.0), REAL_CONST(5286.7517696345885/8.0), REAL_CONST(5298.1241834634639/8.0), REAL_CONST(5309.5027032883945/8.0), REAL_CONST(5320.887322563146/8.0), REAL_CONST(5332.2780347589978/8.0), REAL_CONST(5343.6748333646756/8.0), REAL_CONST(5355.0777118862716/8.0), REAL_CONST(5366.4866638471722/8.0), REAL_CONST(5377.901682787985/8.0), REAL_CONST(5389.3227622664635/8.0), REAL_CONST(5400.749895857437/8.0), REAL_CONST(5412.1830771527357/8.0), REAL_CONST(5423.622299761123/8.0), REAL_CONST(5435.067557308219/8.0), REAL_CONST(5446.5188434364318/8.0), REAL_CONST(5457.9761518048872/8.0), REAL_CONST(5469.4394760893592/8.0), REAL_CONST(5480.9088099821975/8.0), REAL_CONST(5492.3841471922606/8.0), REAL_CONST(5503.8654814448455/8.0), REAL_CONST(5515.3528064816201/8.0), REAL_CONST(5526.846116060552/8.0), REAL_CONST(5538.3454039558474/8.0), REAL_CONST(5549.8506639578736/8.0), REAL_CONST(5561.3618898731029/8.0), REAL_CONST(5572.8790755240361/8.0), REAL_CONST(5584.4022147491451/8.0), REAL_CONST(5595.9313014027975/8.0), REAL_CONST(5607.4663293552012/8.0), REAL_CONST(5619.0072924923297/8.0), REAL_CONST(5630.5541847158656/8.0), REAL_CONST(5642.1069999431284/8.0), REAL_CONST(5653.665732107017/8.0), REAL_CONST(5665.230375155943/8.0), REAL_CONST(5676.8009230537655/8.0), REAL_CONST(5688.3773697797333/8.0), REAL_CONST(5699.9597093284156/8.0), REAL_CONST(5711.5479357096474/8.0), REAL_CONST(5723.1420429484588/8.0), REAL_CONST(5734.7420250850209/8.0), REAL_CONST(5746.347876174581/8.0), REAL_CONST(5757.9595902874016/8.0), REAL_CONST(5769.5771615087006/8.0), REAL_CONST(5781.2005839385911/8.0), REAL_CONST(5792.8298516920213/8.0), REAL_CONST(5804.4649588987149/8.0), REAL_CONST(5816.1058997031105/8.0), REAL_CONST(5827.7526682643065/8.0), REAL_CONST(5839.4052587559972/8.0), REAL_CONST(5851.0636653664196/8.0), REAL_CONST(5862.7278822982908/8.0), REAL_CONST(5874.3979037687541/8.0), REAL_CONST(5886.0737240093204/8.0), REAL_CONST(5897.7553372658094/8.0), REAL_CONST(5909.4427377982956/8.0), REAL_CONST(5921.1359198810505/8.0), REAL_CONST(5932.8348778024874/8.0), REAL_CONST(5944.5396058651031/8.0), REAL_CONST(5956.2500983854261/8.0), REAL_CONST(5967.9663496939575/8.0), REAL_CONST(5979.6883541351208/8.0), REAL_CONST(5991.4161060672022/8.0), REAL_CONST(6003.1495998623004/8.0), REAL_CONST(6014.8888299062692/8.0), REAL_CONST(6026.6337905986684/8.0), REAL_CONST(6038.3844763527022/8.0), REAL_CONST(6050.1408815951781/8.0), REAL_CONST(6061.9030007664414/8.0), REAL_CONST(6073.6708283203316/8.0), REAL_CONST(6085.4443587241267/8.0), REAL_CONST(6097.2235864584891/8.0), REAL_CONST(6109.0085060174197/8.0), REAL_CONST(6120.7991119081998/8.0), REAL_CONST(6132.595398651345/8.0), REAL_CONST(6144.3973607805519/8.0), REAL_CONST(6156.2049928426459/8.0), REAL_CONST(6168.0182893975361/8.0), REAL_CONST(6179.8372450181578/8.0), REAL_CONST(6191.6618542904307/8.0), REAL_CONST(6203.4921118132024/8.0), REAL_CONST(6215.3280121982016/8.0), REAL_CONST(6227.1695500699925/8.0), REAL_CONST(6239.0167200659189/8.0), REAL_CONST(6250.8695168360628/8.0), REAL_CONST(6262.7279350431891/8.0), REAL_CONST(6274.5919693627056/8.0), REAL_CONST(6286.4616144826068/8.0), REAL_CONST(6298.3368651034316/8.0), REAL_CONST(6310.2177159382172/8.0), REAL_CONST(6322.1041617124456/8.0), REAL_CONST(6333.9961971640032/8.0), REAL_CONST(6345.8938170431311/8.0), REAL_CONST(6357.7970161123785/8.0), REAL_CONST(6369.7057891465583/8.0), REAL_CONST(6381.6201309327007/8.0), REAL_CONST(6393.5400362700075/8.0), REAL_CONST(6405.4654999698032/8.0), REAL_CONST(6417.3965168554978/8.0), REAL_CONST(6429.3330817625329/8.0), REAL_CONST(6441.2751895383453/8.0), REAL_CONST(6453.2228350423138/8.0), REAL_CONST(6465.176013145724/8.0), REAL_CONST(6477.134718731716/8.0), REAL_CONST(6489.0989466952469/8.0), REAL_CONST(6501.0686919430445/8.0), REAL_CONST(6513.0439493935628/8.0), REAL_CONST(6525.0247139769417/8.0), REAL_CONST(6537.010980634961/8.0), REAL_CONST(6549.002744321001/8.0), REAL_CONST(6560.9999999999973/8.0), REAL_CONST(6573.0027426483985/8.0), REAL_CONST(6585.0109672541284/8.0), REAL_CONST(6597.0246688165371/8.0), REAL_CONST(6609.0438423463656/8.0), REAL_CONST(6621.0684828657004/8.0), REAL_CONST(6633.0985854079354/8.0), REAL_CONST(6645.134145017727/8.0), REAL_CONST(6657.1751567509573/8.0), REAL_CONST(6669.2216156746908/8.0), REAL_CONST(6681.2735168671343/8.0), REAL_CONST(6693.3308554176001/8.0), REAL_CONST(6705.3936264264594/8.0), REAL_CONST(6717.461825005108/8.0), REAL_CONST(6729.535446275926/8.0), REAL_CONST(6741.6144853722335/8.0), REAL_CONST(6753.6989374382601/8.0), REAL_CONST(6765.7887976290967/8.0), REAL_CONST(6777.8840611106634/8.0), REAL_CONST(6789.9847230596661/8.0), REAL_CONST(6802.0907786635626/8.0), REAL_CONST(6814.2022231205201/8.0), REAL_CONST(6826.3190516393797/8.0), REAL_CONST(6838.4412594396181/8.0), REAL_CONST(6850.5688417513074/8.0), REAL_CONST(6862.701793815083/8.0), REAL_CONST(6874.840110882099/8.0), REAL_CONST(6886.9837882139991/8.0), REAL_CONST(6899.1328210828724/8.0), REAL_CONST(6911.2872047712199/8.0), REAL_CONST(6923.4469345719199/8.0), REAL_CONST(6935.6120057881863/8.0), REAL_CONST(6947.7824137335365/8.0), REAL_CONST(6959.9581537317536/8.0), REAL_CONST(6972.1392211168532/8.0), REAL_CONST(6984.3256112330409/8.0), REAL_CONST(6996.5173194346862/8.0), REAL_CONST(7008.7143410862773/8.0), REAL_CONST(7020.9166715623942/8.0), REAL_CONST(7033.1243062476678/8.0), REAL_CONST(7045.3372405367481/8.0), REAL_CONST(7057.5554698342685/8.0), REAL_CONST(7069.7789895548103/8.0), REAL_CONST(7082.0077951228714/8.0), REAL_CONST(7094.2418819728273/8.0), REAL_CONST(7106.4812455489018/8.0), REAL_CONST(7118.7258813051285/8.0), REAL_CONST(7130.9757847053224/8.0), REAL_CONST(7143.2309512230404/8.0), REAL_CONST(7155.4913763415516/8.0), REAL_CONST(7167.7570555538041/8.0), REAL_CONST(7180.0279843623894/8.0), REAL_CONST(7192.3041582795131/8.0), REAL_CONST(7204.5855728269571/8.0), REAL_CONST(7216.8722235360519/8.0), REAL_CONST(7229.1641059476406/8.0), REAL_CONST(7241.4612156120484/8.0), REAL_CONST(7253.7635480890503/8.0), REAL_CONST(7266.0710989478375/8.0), REAL_CONST(7278.3838637669869/8.0), REAL_CONST(7290.7018381344296/8.0), REAL_CONST(7303.0250176474174/8.0), REAL_CONST(7315.3533979124932/8.0), REAL_CONST(7327.6869745454596/8.0), REAL_CONST(7340.0257431713462/8.0), REAL_CONST(7352.3696994243801/8.0), REAL_CONST(7364.7188389479543/8.0), REAL_CONST(7377.0731573945968/8.0), REAL_CONST(7389.4326504259407/8.0), REAL_CONST(7401.7973137126937/8.0), REAL_CONST(7414.1671429346061/8.0), REAL_CONST(7426.5421337804428/8.0), REAL_CONST(7438.922281947951/8.0), REAL_CONST(7451.3075831438346/8.0), REAL_CONST(7463.6980330837177/8.0), REAL_CONST(7476.0936274921214/8.0), REAL_CONST(7488.4943621024304/8.0), REAL_CONST(7500.9002326568652/8.0), REAL_CONST(7513.3112349064522/8.0), REAL_CONST(7525.7273646109943/8.0), REAL_CONST(7538.1486175390446/8.0), REAL_CONST(7550.5749894678729/8.0), REAL_CONST(7563.0064761834419/8.0), REAL_CONST(7575.4430734803736/8.0), REAL_CONST(7587.8847771619248/8.0), REAL_CONST(7600.3315830399597/8.0), REAL_CONST(7612.7834869349153/8.0), REAL_CONST(7625.24048467578/8.0), REAL_CONST(7637.7025721000637/8.0), REAL_CONST(7650.1697450537677/8.0), REAL_CONST(7662.6419993913596/8.0), REAL_CONST(7675.1193309757446/8.0), REAL_CONST(7687.6017356782404/8.0), REAL_CONST(7700.0892093785433/8.0), REAL_CONST(7712.5817479647112/8.0), REAL_CONST(7725.079347333125/8.0), REAL_CONST(7737.5820033884729/8.0), REAL_CONST(7750.0897120437139/8.0), REAL_CONST(7762.6024692200581/8.0), REAL_CONST(7775.1202708469355/8.0), REAL_CONST(7787.6431128619733/8.0), REAL_CONST(7800.1709912109645/8.0), REAL_CONST(7812.7039018478481/8.0), REAL_CONST(7825.2418407346768/8.0), REAL_CONST(7837.7848038415968/8.0), REAL_CONST(7850.3327871468155/8.0), REAL_CONST(7862.8857866365806/8.0), REAL_CONST(7875.4437983051539/8.0), REAL_CONST(7888.006818154784/8.0), REAL_CONST(7900.5748421956796/8.0), REAL_CONST(7913.1478664459901/8.0), REAL_CONST(7925.725886931772/8.0), REAL_CONST(7938.3088996869719/8.0), REAL_CONST(7950.8969007533951/8.0), REAL_CONST(7963.4898861806851/8.0), REAL_CONST(7976.0878520262959/8.0), REAL_CONST(7988.6907943554688/8.0), REAL_CONST(8001.2987092412086/8.0), REAL_CONST(8013.911592764257/8.0), REAL_CONST(8026.5294410130691/8.0), REAL_CONST(8039.1522500837891/8.0), REAL_CONST(8051.7800160802271/8.0), REAL_CONST(8064.412735113835/8.0), REAL_CONST(8077.0504033036796/8.0), REAL_CONST(8089.6930167764222/8.0), REAL_CONST(8102.3405716662946/8.0), REAL_CONST(8114.9930641150731/8.0), REAL_CONST(8127.6504902720571/8.0), REAL_CONST(8140.3128462940449/8.0), REAL_CONST(8152.9801283453098/8.0), REAL_CONST(8165.6523325975786/8.0), REAL_CONST(8178.3294552300049/8.0), REAL_CONST(8191.0114924291529/8.0), REAL_CONST(8203.6984403889655/8.0), REAL_CONST(8216.3902953107463/8.0), REAL_CONST(8229.0870534031419/8.0), REAL_CONST(8241.7887108821069/8.0), REAL_CONST(8254.4952639708936/8.0), REAL_CONST(8267.2067089000211/8.0), REAL_CONST(8279.9230419072574/8.0), REAL_CONST(8292.6442592375952/8.0), REAL_CONST(8305.3703571432306/8.0), REAL_CONST(8318.101331883543/8.0), REAL_CONST(8330.8371797250657/8.0), REAL_CONST(8343.577896941475/8.0), REAL_CONST(8356.3234798135582/8.0), REAL_CONST(8369.0739246291978/8.0), REAL_CONST(8381.8292276833508/8.0), REAL_CONST(8394.5893852780209/8.0), REAL_CONST(8407.3543937222421/8.0), REAL_CONST(8420.1242493320569/8.0), REAL_CONST(8432.8989484304948/8.0), REAL_CONST(8445.6784873475499/8.0), REAL_CONST(8458.4628624201578/8.0), REAL_CONST(8471.2520699921806/8.0), REAL_CONST(8484.0461064143838/8.0), REAL_CONST(8496.8449680444082/8.0), REAL_CONST(8509.6486512467636/8.0), REAL_CONST(8522.4571523927953/8.0), REAL_CONST(8535.270467860666/8.0), REAL_CONST(8548.0885940353437/8.0), REAL_CONST(8560.9115273085663/8.0), REAL_CONST(8573.7392640788403/8.0), REAL_CONST(8586.5718007514006/8.0), REAL_CONST(8599.4091337382069/8.0), REAL_CONST(8612.2512594579148/8.0), REAL_CONST(8625.0981743358552/8.0), REAL_CONST(8637.9498748040205/8.0), REAL_CONST(8650.8063573010386/8.0), REAL_CONST(8663.6676182721567/8.0), REAL_CONST(8676.533654169225/8.0), REAL_CONST(8689.4044614506638/8.0), REAL_CONST(8702.2800365814601/8.0), REAL_CONST(8715.1603760331418/8.0), REAL_CONST(8728.0454762837508/8.0), REAL_CONST(8740.9353338178389/8.0), REAL_CONST(8753.8299451264356/8.0), REAL_CONST(8766.7293067070332/8.0), REAL_CONST(8779.6334150635721/8.0), REAL_CONST(8792.5422667064158/8.0), REAL_CONST(8805.4558581523324/8.0), REAL_CONST(8818.3741859244819/8.0), REAL_CONST(8831.2972465523908/8.0), REAL_CONST(8844.2250365719356/8.0), REAL_CONST(8857.1575525253265/8.0), REAL_CONST(8870.0947909610859/8.0), REAL_CONST(8883.0367484340295/8.0), REAL_CONST(8895.9834215052524/8.0), REAL_CONST(8908.934806742107/8.0), REAL_CONST(8921.8909007181846/8.0), REAL_CONST(8934.8517000132997/8.0), REAL_CONST(8947.817201213471/8.0), REAL_CONST(8960.7874009109/8.0), REAL_CONST(8973.7622957039603/8.0), REAL_CONST(8986.7418821971733/8.0), REAL_CONST(8999.7261570011924/8.0), REAL_CONST(9012.7151167327884/8.0), REAL_CONST(9025.7087580148236/8.0), REAL_CONST(9038.7070774762469/8.0), REAL_CONST(9051.7100717520643/8.0), REAL_CONST(9064.7177374833282/8.0), REAL_CONST(9077.7300713171153/8.0), REAL_CONST(9090.7470699065179/8.0), REAL_CONST(9103.7687299106146/8.0), REAL_CONST(9116.7950479944648/8.0), REAL_CONST(9129.8260208290812/8.0), REAL_CONST(9142.8616450914233/8.0), REAL_CONST(9155.9019174643727/8.0), REAL_CONST(9168.9468346367157/8.0), REAL_CONST(9181.9963933031358/8.0), REAL_CONST(9195.0505901641845/8.0), REAL_CONST(9208.1094219262741/8.0), REAL_CONST(9221.1728853016557/8.0), REAL_CONST(9234.240977008405/8.0), REAL_CONST(9247.3136937704076/8.0), REAL_CONST(9260.3910323173386/8.0), REAL_CONST(9273.472989384647/8.0), REAL_CONST(9286.5595617135423/8.0), REAL_CONST(9299.6507460509747/8.0), REAL_CONST(9312.7465391496207/8.0), REAL_CONST(9325.8469377678684/8.0), REAL_CONST(9338.9519386698012/8.0), REAL_CONST(9352.0615386251757/8.0), REAL_CONST(9365.1757344094131/8.0), REAL_CONST(9378.2945228035842/8.0), REAL_CONST(9391.4179005943843/8.0), REAL_CONST(9404.5458645741273/8.0), REAL_CONST(9417.6784115407263/8.0), REAL_CONST(9430.8155382976747/8.0), REAL_CONST(9443.9572416540359/8.0), REAL_CONST(9457.1035184244265/8.0), REAL_CONST(9470.2543654290002/8.0), REAL_CONST(9483.4097794934296/8.0), REAL_CONST(9496.5697574488931/8.0), REAL_CONST(9509.7342961320664/8.0), REAL_CONST(9522.9033923850911/8.0), REAL_CONST(9536.0770430555804/8.0), REAL_CONST(9549.2552449965824/8.0), REAL_CONST(9562.4379950665825/8.0), REAL_CONST(9575.6252901294793/8.0), REAL_CONST(9588.8171270545736/8.0), REAL_CONST(9602.0135027165488/8.0), REAL_CONST(9615.2144139954635/8.0), REAL_CONST(9628.4198577767274/8.0), REAL_CONST(9641.629830951093/8.0), REAL_CONST(9654.844330414644/8.0), REAL_CONST(9668.0633530687719/8.0), REAL_CONST(9681.286895820167/8.0), REAL_CONST(9694.5149555808002/8.0), REAL_CONST(9707.7475292679192/8.0), REAL_CONST(9720.9846138040157/8.0), REAL_CONST(9734.2262061168276/8.0), REAL_CONST(9747.4723031393187/8.0), REAL_CONST(9760.7229018096641/8.0), REAL_CONST(9773.9779990712323/8.0), REAL_CONST(9787.2375918725811/8.0), REAL_CONST(9800.5016771674327/8.0), REAL_CONST(9813.7702519146696/8.0), REAL_CONST(9827.0433130783094/8.0), REAL_CONST(9840.3208576275028/8.0), REAL_CONST(9853.602882536512/8.0), REAL_CONST(9866.8893847846994/8.0), REAL_CONST(9880.1803613565116/8.0), REAL_CONST(9893.4758092414686/8.0), REAL_CONST(9906.7757254341523/8.0), REAL_CONST(9920.0801069341851/8.0), REAL_CONST(9933.3889507462245/8.0), REAL_CONST(9946.7022538799429/8.0), REAL_CONST(9960.0200133500221/8.0), REAL_CONST(9973.3422261761298/8.0), REAL_CONST(9986.6688893829159/8.0), REAL_CONST(9999.9999999999945/8.0), REAL_CONST(10013.335555061929/8.0), REAL_CONST(10026.675551608221/8.0), REAL_CONST(10040.019986683301/8.0), REAL_CONST(10053.368857336509/8.0), REAL_CONST(10066.722160622081/8.0), REAL_CONST(10080.079893599144/8.0), REAL_CONST(10093.442053331697/8.0), REAL_CONST(10106.808636888598/8.0), REAL_CONST(10120.179641343551/8.0), REAL_CONST(10133.555063775095/8.0), REAL_CONST(10146.934901266595/8.0), REAL_CONST(10160.31915090622/8.0), REAL_CONST(10173.707809786936/8.0), REAL_CONST(10187.100875006496/8.0), REAL_CONST(10200.498343667417/8.0), REAL_CONST(10213.900212876984/8.0), REAL_CONST(10227.306479747222/8.0), REAL_CONST(10240.717141394889/8.0), REAL_CONST(10254.132194941467/8.0), REAL_CONST(10267.551637513146/8.0), REAL_CONST(10280.975466240814/8.0), REAL_CONST(10294.40367826004/8.0), REAL_CONST(10307.836270711066/8.0), REAL_CONST(10321.273240738796/8.0), REAL_CONST(10334.71458549278/8.0) #ifdef BIG_IQ_TABLE ,REAL_CONST(10348.160302127204/8.0), REAL_CONST(10361.610387800878/8.0), REAL_CONST(10375.064839677221/8.0), REAL_CONST(10388.523654924258/8.0), REAL_CONST(10401.986830714593/8.0), REAL_CONST(10415.454364225412/8.0), REAL_CONST(10428.926252638465/8.0), REAL_CONST(10442.402493140049/8.0), REAL_CONST(10455.883082921007/8.0), REAL_CONST(10469.368019176709/8.0), REAL_CONST(10482.85729910704/8.0), REAL_CONST(10496.350919916393/8.0), REAL_CONST(10509.848878813653/8.0), REAL_CONST(10523.351173012188/8.0), REAL_CONST(10536.857799729838/8.0), REAL_CONST(10550.3687561889/8.0), REAL_CONST(10563.884039616123/8.0), REAL_CONST(10577.403647242685/8.0), REAL_CONST(10590.927576304197/8.0), REAL_CONST(10604.455824040679/8.0), REAL_CONST(10617.988387696556/8.0), REAL_CONST(10631.525264520642/8.0), REAL_CONST(10645.066451766135/8.0), REAL_CONST(10658.611946690598/8.0), REAL_CONST(10672.161746555956/8.0), REAL_CONST(10685.715848628475/8.0), REAL_CONST(10699.274250178762/8.0), REAL_CONST(10712.836948481747/8.0), REAL_CONST(10726.403940816675/8.0), REAL_CONST(10739.975224467091/8.0), REAL_CONST(10753.550796720834/8.0), REAL_CONST(10767.130654870027/8.0), REAL_CONST(10780.714796211059/8.0), REAL_CONST(10794.303218044579/8.0), REAL_CONST(10807.895917675487/8.0), REAL_CONST(10821.492892412922/8.0), REAL_CONST(10835.094139570248/8.0), REAL_CONST(10848.699656465047/8.0), REAL_CONST(10862.309440419107/8.0), REAL_CONST(10875.923488758415/8.0), REAL_CONST(10889.541798813138/8.0), REAL_CONST(10903.16436791762/8.0), REAL_CONST(10916.791193410372/8.0), REAL_CONST(10930.422272634056/8.0), REAL_CONST(10944.05760293548/8.0), REAL_CONST(10957.697181665582/8.0), REAL_CONST(10971.341006179427/8.0), REAL_CONST(10984.98907383619/8.0), REAL_CONST(10998.641381999149/8.0), REAL_CONST(11012.297928035676/8.0), REAL_CONST(11025.958709317223/8.0), REAL_CONST(11039.623723219316/8.0), REAL_CONST(11053.292967121541/8.0), REAL_CONST(11066.966438407539/8.0), REAL_CONST(11080.64413446499/8.0), REAL_CONST(11094.326052685608/8.0), REAL_CONST(11108.012190465128/8.0), REAL_CONST(11121.702545203296/8.0), REAL_CONST(11135.397114303863/8.0), REAL_CONST(11149.095895174571/8.0), REAL_CONST(11162.798885227143/8.0), REAL_CONST(11176.506081877278/8.0), REAL_CONST(11190.217482544635/8.0), REAL_CONST(11203.933084652828/8.0), REAL_CONST(11217.652885629415/8.0), REAL_CONST(11231.376882905886/8.0), REAL_CONST(11245.105073917659/8.0), REAL_CONST(11258.837456104062/8.0), REAL_CONST(11272.574026908333/8.0), REAL_CONST(11286.314783777601/8.0), REAL_CONST(11300.059724162888/8.0), REAL_CONST(11313.808845519083/8.0), REAL_CONST(11327.562145304952/8.0), REAL_CONST(11341.319620983111/8.0), REAL_CONST(11355.081270020033/8.0), REAL_CONST(11368.847089886023/8.0), REAL_CONST(11382.617078055218/8.0), REAL_CONST(11396.391232005579/8.0), REAL_CONST(11410.169549218874/8.0), REAL_CONST(11423.952027180676/8.0), REAL_CONST(11437.738663380349/8.0), REAL_CONST(11451.529455311042/8.0), REAL_CONST(11465.324400469679/8.0), REAL_CONST(11479.123496356951/8.0), REAL_CONST(11492.926740477304/8.0), REAL_CONST(11506.734130338931/8.0), REAL_CONST(11520.545663453764/8.0), REAL_CONST(11534.361337337466/8.0), REAL_CONST(11548.181149509423/8.0), REAL_CONST(11562.005097492724/8.0), REAL_CONST(11575.83317881417/8.0), REAL_CONST(11589.665391004253/8.0), REAL_CONST(11603.501731597149/8.0), REAL_CONST(11617.342198130715/8.0), REAL_CONST(11631.186788146468/8.0), REAL_CONST(11645.035499189589/8.0), REAL_CONST(11658.888328808911/8.0), REAL_CONST(11672.745274556904/8.0), REAL_CONST(11686.606333989675/8.0), REAL_CONST(11700.471504666955/8.0), REAL_CONST(11714.340784152086/8.0), REAL_CONST(11728.214170012021/8.0), REAL_CONST(11742.091659817312/8.0), REAL_CONST(11755.973251142101/8.0), REAL_CONST(11769.858941564111/8.0), REAL_CONST(11783.748728664636/8.0), REAL_CONST(11797.642610028539/8.0), REAL_CONST(11811.540583244237/8.0), REAL_CONST(11825.442645903697/8.0), REAL_CONST(11839.34879560242/8.0), REAL_CONST(11853.259029939445/8.0), REAL_CONST(11867.173346517333/8.0), REAL_CONST(11881.091742942155/8.0), REAL_CONST(11895.014216823492/8.0), REAL_CONST(11908.940765774427/8.0), REAL_CONST(11922.871387411526/8.0), REAL_CONST(11936.806079354839/8.0), REAL_CONST(11950.744839227897/8.0), REAL_CONST(11964.687664657684/8.0), REAL_CONST(11978.634553274653/8.0), REAL_CONST(11992.585502712702/8.0), REAL_CONST(12006.540510609168/8.0), REAL_CONST(12020.499574604828/8.0), REAL_CONST(12034.462692343877/8.0), REAL_CONST(12048.429861473938/8.0), REAL_CONST(12062.401079646032/8.0), REAL_CONST(12076.376344514589/8.0), REAL_CONST(12090.355653737433/8.0), REAL_CONST(12104.339004975769/8.0), REAL_CONST(12118.326395894188/8.0), REAL_CONST(12132.317824160644/8.0), REAL_CONST(12146.313287446457/8.0), REAL_CONST(12160.312783426305/8.0), REAL_CONST(12174.316309778205/8.0), REAL_CONST(12188.323864183525/8.0), REAL_CONST(12202.335444326955/8.0), REAL_CONST(12216.351047896511/8.0), REAL_CONST(12230.370672583531/8.0), REAL_CONST(12244.394316082657/8.0), REAL_CONST(12258.421976091831/8.0), REAL_CONST(12272.453650312296/8.0), REAL_CONST(12286.489336448574/8.0), REAL_CONST(12300.529032208471/8.0), REAL_CONST(12314.572735303058/8.0), REAL_CONST(12328.620443446678/8.0), REAL_CONST(12342.672154356922/8.0), REAL_CONST(12356.727865754638/8.0), REAL_CONST(12370.787575363909/8.0), REAL_CONST(12384.851280912055/8.0), REAL_CONST(12398.918980129623/8.0), REAL_CONST(12412.990670750381/8.0), REAL_CONST(12427.066350511306/8.0), REAL_CONST(12441.146017152583/8.0), REAL_CONST(12455.229668417589/8.0), REAL_CONST(12469.317302052901/8.0), REAL_CONST(12483.40891580827/8.0), REAL_CONST(12497.50450743663/8.0), REAL_CONST(12511.604074694078/8.0), REAL_CONST(12525.707615339878/8.0), REAL_CONST(12539.815127136444/8.0), REAL_CONST(12553.926607849342/8.0), REAL_CONST(12568.042055247275/8.0), REAL_CONST(12582.161467102082/8.0), REAL_CONST(12596.284841188726/8.0), REAL_CONST(12610.41217528529/8.0), REAL_CONST(12624.543467172971/8.0), REAL_CONST(12638.678714636069/8.0), REAL_CONST(12652.817915461985/8.0), REAL_CONST(12666.961067441209/8.0), REAL_CONST(12681.108168367316/8.0), REAL_CONST(12695.259216036962/8.0), REAL_CONST(12709.414208249869/8.0), REAL_CONST(12723.573142808827/8.0), REAL_CONST(12737.736017519681/8.0), REAL_CONST(12751.902830191326/8.0), REAL_CONST(12766.073578635704/8.0), REAL_CONST(12780.248260667788/8.0), REAL_CONST(12794.426874105588/8.0), REAL_CONST(12808.609416770132/8.0), REAL_CONST(12822.795886485468/8.0), REAL_CONST(12836.986281078653/8.0), REAL_CONST(12851.180598379744/8.0), REAL_CONST(12865.378836221802/8.0), REAL_CONST(12879.580992440871/8.0), REAL_CONST(12893.787064875984/8.0), REAL_CONST(12907.997051369144/8.0), REAL_CONST(12922.210949765335/8.0), REAL_CONST(12936.428757912496/8.0), REAL_CONST(12950.650473661524/8.0), REAL_CONST(12964.876094866273/8.0), REAL_CONST(12979.105619383534/8.0), REAL_CONST(12993.339045073039/8.0), REAL_CONST(13007.576369797454/8.0), REAL_CONST(13021.817591422368/8.0), REAL_CONST(13036.062707816285/8.0), REAL_CONST(13050.311716850629/8.0), REAL_CONST(13064.564616399723/8.0), REAL_CONST(13078.821404340792/8.0), REAL_CONST(13093.082078553954/8.0), REAL_CONST(13107.346636922217/8.0), REAL_CONST(13121.615077331464/8.0), REAL_CONST(13135.887397670458/8.0), REAL_CONST(13150.163595830827/8.0), REAL_CONST(13164.44366970706/8.0), REAL_CONST(13178.727617196502/8.0), REAL_CONST(13193.015436199352/8.0), REAL_CONST(13207.307124618648/8.0), REAL_CONST(13221.602680360265/8.0), REAL_CONST(13235.902101332911/8.0), REAL_CONST(13250.205385448118/8.0), REAL_CONST(13264.512530620239/8.0), REAL_CONST(13278.823534766434/8.0), REAL_CONST(13293.138395806676/8.0), REAL_CONST(13307.457111663734/8.0), REAL_CONST(13321.779680263176/8.0), REAL_CONST(13336.106099533356/8.0), REAL_CONST(13350.436367405409/8.0), REAL_CONST(13364.77048181325/8.0), REAL_CONST(13379.108440693562/8.0), REAL_CONST(13393.450241985796/8.0), REAL_CONST(13407.795883632158/8.0), REAL_CONST(13422.145363577607/8.0), REAL_CONST(13436.498679769853/8.0), REAL_CONST(13450.855830159346/8.0), REAL_CONST(13465.216812699266/8.0), REAL_CONST(13479.581625345529/8.0), REAL_CONST(13493.950266056772/8.0), REAL_CONST(13508.32273279435/8.0), REAL_CONST(13522.699023522329/8.0), REAL_CONST(13537.079136207483/8.0), REAL_CONST(13551.463068819286/8.0), REAL_CONST(13565.850819329906/8.0), REAL_CONST(13580.2423857142/8.0), REAL_CONST(13594.63776594971/8.0), REAL_CONST(13609.036958016657/8.0), REAL_CONST(13623.439959897927/8.0), REAL_CONST(13637.846769579081/8.0), REAL_CONST(13652.257385048335/8.0), REAL_CONST(13666.67180429656/8.0), REAL_CONST(13681.090025317284/8.0), REAL_CONST(13695.512046106669/8.0), REAL_CONST(13709.937864663521/8.0), REAL_CONST(13724.367478989278/8.0), REAL_CONST(13738.800887088004/8.0), REAL_CONST(13753.238086966385/8.0), REAL_CONST(13767.679076633727/8.0), REAL_CONST(13782.123854101939/8.0), REAL_CONST(13796.572417385545/8.0), REAL_CONST(13811.024764501659/8.0), REAL_CONST(13825.480893469998/8.0), REAL_CONST(13839.94080231286/8.0), REAL_CONST(13854.404489055134/8.0), REAL_CONST(13868.871951724283/8.0), REAL_CONST(13883.34318835034/8.0), REAL_CONST(13897.818196965914/8.0), REAL_CONST(13912.296975606168/8.0), REAL_CONST(13926.779522308825/8.0), REAL_CONST(13941.26583511416/8.0), REAL_CONST(13955.755912064991/8.0), REAL_CONST(13970.249751206682/8.0), REAL_CONST(13984.747350587126/8.0), REAL_CONST(13999.248708256751/8.0), REAL_CONST(14013.753822268511/8.0), REAL_CONST(14028.262690677873/8.0), REAL_CONST(14042.775311542828/8.0), REAL_CONST(14057.291682923867/8.0), REAL_CONST(14071.811802883994/8.0), REAL_CONST(14086.335669488704/8.0), REAL_CONST(14100.863280805994/8.0), REAL_CONST(14115.394634906341/8.0), REAL_CONST(14129.92972986271/8.0), REAL_CONST(14144.468563750548/8.0), REAL_CONST(14159.01113464777/8.0), REAL_CONST(14173.55744063476/8.0), REAL_CONST(14188.107479794369/8.0), REAL_CONST(14202.661250211901/8.0), REAL_CONST(14217.218749975118/8.0), REAL_CONST(14231.779977174227/8.0), REAL_CONST(14246.344929901879/8.0), REAL_CONST(14260.913606253163/8.0), REAL_CONST(14275.486004325601/8.0), REAL_CONST(14290.062122219146/8.0), REAL_CONST(14304.641958036171/8.0), REAL_CONST(14319.225509881464/8.0), REAL_CONST(14333.812775862236/8.0), REAL_CONST(14348.403754088098/8.0), REAL_CONST(14362.998442671067/8.0), REAL_CONST(14377.59683972556/8.0), REAL_CONST(14392.198943368388/8.0), REAL_CONST(14406.804751718748/8.0), REAL_CONST(14421.414262898223/8.0), REAL_CONST(14436.027475030774/8.0), REAL_CONST(14450.64438624274/8.0), REAL_CONST(14465.264994662828/8.0), REAL_CONST(14479.889298422106/8.0), REAL_CONST(14494.517295654005/8.0), REAL_CONST(14509.148984494313/8.0), REAL_CONST(14523.784363081166/8.0), REAL_CONST(14538.423429555049/8.0), REAL_CONST(14553.066182058781/8.0), REAL_CONST(14567.712618737527/8.0), REAL_CONST(14582.362737738777/8.0), REAL_CONST(14597.016537212348/8.0), REAL_CONST(14611.674015310382/8.0), REAL_CONST(14626.33517018734/8.0), REAL_CONST(14640.999999999993/8.0), REAL_CONST(14655.668502907418/8.0), REAL_CONST(14670.340677071003/8.0), REAL_CONST(14685.016520654426/8.0), REAL_CONST(14699.696031823671/8.0), REAL_CONST(14714.379208746999/8.0), REAL_CONST(14729.066049594967/8.0), REAL_CONST(14743.756552540408/8.0), REAL_CONST(14758.45071575843/8.0), REAL_CONST(14773.148537426418/8.0), REAL_CONST(14787.850015724018/8.0), REAL_CONST(14802.555148833142/8.0), REAL_CONST(14817.263934937961/8.0), REAL_CONST(14831.976372224897/8.0), REAL_CONST(14846.692458882624/8.0), REAL_CONST(14861.41219310206/8.0), REAL_CONST(14876.135573076363/8.0), REAL_CONST(14890.862597000923/8.0), REAL_CONST(14905.593263073371/8.0), REAL_CONST(14920.327569493558/8.0), REAL_CONST(14935.065514463557/8.0), REAL_CONST(14949.807096187662/8.0), REAL_CONST(14964.552312872382/8.0), REAL_CONST(14979.301162726431/8.0), REAL_CONST(14994.053643960735/8.0), REAL_CONST(15008.809754788414/8.0), REAL_CONST(15023.569493424788/8.0), REAL_CONST(15038.332858087369/8.0), REAL_CONST(15053.099846995858/8.0), REAL_CONST(15067.870458372134/8.0), REAL_CONST(15082.644690440264/8.0), REAL_CONST(15097.422541426484/8.0), REAL_CONST(15112.204009559202/8.0), REAL_CONST(15126.989093068994/8.0), REAL_CONST(15141.777790188597/8.0), REAL_CONST(15156.570099152905/8.0), REAL_CONST(15171.366018198967/8.0), REAL_CONST(15186.165545565986/8.0), REAL_CONST(15200.968679495301/8.0), REAL_CONST(15215.775418230402/8.0), REAL_CONST(15230.585760016909/8.0), REAL_CONST(15245.399703102579/8.0), REAL_CONST(15260.217245737298/8.0), REAL_CONST(15275.038386173073/8.0), REAL_CONST(15289.863122664035/8.0), REAL_CONST(15304.691453466432/8.0), REAL_CONST(15319.523376838621/8.0), REAL_CONST(15334.358891041069/8.0), REAL_CONST(15349.197994336346/8.0), REAL_CONST(15364.040684989128/8.0), REAL_CONST(15378.886961266177/8.0), REAL_CONST(15393.736821436356/8.0), REAL_CONST(15408.590263770609/8.0), REAL_CONST(15423.447286541972/8.0), REAL_CONST(15438.307888025554/8.0), REAL_CONST(15453.172066498542/8.0), REAL_CONST(15468.039820240196/8.0), REAL_CONST(15482.91114753184/8.0), REAL_CONST(15497.786046656869/8.0), REAL_CONST(15512.664515900733/8.0), REAL_CONST(15527.546553550939/8.0), REAL_CONST(15542.432157897045/8.0), REAL_CONST(15557.32132723066/8.0), REAL_CONST(15572.214059845435/8.0), REAL_CONST(15587.110354037064/8.0), REAL_CONST(15602.010208103273/8.0), REAL_CONST(15616.913620343823/8.0), REAL_CONST(15631.820589060506/8.0), REAL_CONST(15646.731112557136/8.0), REAL_CONST(15661.645189139546/8.0), REAL_CONST(15676.562817115593/8.0), REAL_CONST(15691.483994795139/8.0), REAL_CONST(15706.408720490062/8.0), REAL_CONST(15721.336992514242/8.0), REAL_CONST(15736.268809183561/8.0), REAL_CONST(15751.204168815901/8.0), REAL_CONST(15766.143069731135/8.0), REAL_CONST(15781.085510251132/8.0), REAL_CONST(15796.03148869974/8.0), REAL_CONST(15810.981003402798/8.0), REAL_CONST(15825.934052688119/8.0), REAL_CONST(15840.890634885489/8.0), REAL_CONST(15855.850748326673/8.0), REAL_CONST(15870.814391345401/8.0), REAL_CONST(15885.781562277361/8.0), REAL_CONST(15900.752259460214/8.0), REAL_CONST(15915.726481233565/8.0), REAL_CONST(15930.704225938984/8.0), REAL_CONST(15945.685491919978/8.0), REAL_CONST(15960.670277522009/8.0), REAL_CONST(15975.658581092481/8.0), REAL_CONST(15990.65040098073/8.0), REAL_CONST(16005.645735538035/8.0), REAL_CONST(16020.644583117599/8.0), REAL_CONST(16035.646942074556/8.0), REAL_CONST(16050.652810765967/8.0), REAL_CONST(16065.662187550806/8.0), REAL_CONST(16080.675070789974/8.0), REAL_CONST(16095.691458846273/8.0), REAL_CONST(16110.711350084424/8.0), REAL_CONST(16125.734742871053/8.0), REAL_CONST(16140.761635574685/8.0), REAL_CONST(16155.792026565747/8.0), REAL_CONST(16170.825914216561/8.0), REAL_CONST(16185.863296901338/8.0), REAL_CONST(16200.904172996183/8.0), REAL_CONST(16215.948540879079/8.0), REAL_CONST(16230.996398929899/8.0), REAL_CONST(16246.047745530386/8.0), REAL_CONST(16261.102579064163/8.0), REAL_CONST(16276.160897916721/8.0), REAL_CONST(16291.22270047542/8.0), REAL_CONST(16306.287985129484/8.0), REAL_CONST(16321.356750269995/8.0), REAL_CONST(16336.428994289896/8.0), REAL_CONST(16351.504715583982/8.0), REAL_CONST(16366.5839125489/8.0), REAL_CONST(16381.666583583141/8.0), REAL_CONST(16396.752727087041/8.0), REAL_CONST(16411.842341462776/8.0), REAL_CONST(16426.935425114363/8.0), REAL_CONST(16442.031976447644/8.0), REAL_CONST(16457.131993870298/8.0), REAL_CONST(16472.235475791829/8.0), REAL_CONST(16487.342420623561/8.0), REAL_CONST(16502.452826778641/8.0), REAL_CONST(16517.566692672033/8.0), REAL_CONST(16532.684016720516/8.0), REAL_CONST(16547.804797342676/8.0), REAL_CONST(16562.929032958902/8.0), REAL_CONST(16578.056721991394/8.0), REAL_CONST(16593.18786286415/8.0), REAL_CONST(16608.322454002962/8.0), REAL_CONST(16623.460493835417/8.0), REAL_CONST(16638.601980790896/8.0), REAL_CONST(16653.746913300558/8.0), REAL_CONST(16668.895289797354/8.0), REAL_CONST(16684.047108716015/8.0), REAL_CONST(16699.202368493046/8.0), REAL_CONST(16714.361067566726/8.0), REAL_CONST(16729.523204377107/8.0), REAL_CONST(16744.688777366009/8.0), REAL_CONST(16759.857784977012/8.0), REAL_CONST(16775.030225655464/8.0), REAL_CONST(16790.206097848466/8.0), REAL_CONST(16805.385400004874/8.0), REAL_CONST(16820.568130575302/8.0), REAL_CONST(16835.754288012104/8.0), REAL_CONST(16850.943870769381/8.0), REAL_CONST(16866.136877302983/8.0), REAL_CONST(16881.333306070494/8.0), REAL_CONST(16896.53315553123/8.0), REAL_CONST(16911.736424146249/8.0), REAL_CONST(16926.943110378332/8.0), REAL_CONST(16942.153212691992/8.0), REAL_CONST(16957.366729553454/8.0), REAL_CONST(16972.583659430682/8.0), REAL_CONST(16987.804000793338/8.0), REAL_CONST(17003.027752112816/8.0), REAL_CONST(17018.254911862205/8.0), REAL_CONST(17033.485478516312/8.0), REAL_CONST(17048.719450551645/8.0), REAL_CONST(17063.956826446421/8.0), REAL_CONST(17079.197604680547/8.0), REAL_CONST(17094.44178373563/8.0), REAL_CONST(17109.689362094967/8.0), REAL_CONST(17124.940338243552/8.0), REAL_CONST(17140.194710668064/8.0), REAL_CONST(17155.452477856852/8.0), REAL_CONST(17170.713638299967/8.0), REAL_CONST(17185.978190489128/8.0), REAL_CONST(17201.246132917724/8.0), REAL_CONST(17216.517464080825/8.0), REAL_CONST(17231.792182475165/8.0), REAL_CONST(17247.070286599141/8.0), REAL_CONST(17262.351774952826/8.0), REAL_CONST(17277.636646037936/8.0), REAL_CONST(17292.924898357855/8.0), REAL_CONST(17308.216530417623/8.0), REAL_CONST(17323.511540723921/8.0), REAL_CONST(17338.809927785089/8.0), REAL_CONST(17354.111690111105/8.0), REAL_CONST(17369.416826213594/8.0), REAL_CONST(17384.725334605821/8.0), REAL_CONST(17400.037213802683/8.0), REAL_CONST(17415.352462320716/8.0), REAL_CONST(17430.67107867809/8.0), REAL_CONST(17445.993061394587/8.0), REAL_CONST(17461.318408991636/8.0), REAL_CONST(17476.647119992274/8.0), REAL_CONST(17491.979192921168/8.0), REAL_CONST(17507.314626304586/8.0), REAL_CONST(17522.653418670423/8.0), REAL_CONST(17537.995568548187/8.0), REAL_CONST(17553.341074468986/8.0), REAL_CONST(17568.689934965536/8.0), REAL_CONST(17584.042148572156/8.0), REAL_CONST(17599.397713824768/8.0), REAL_CONST(17614.75662926089/8.0), REAL_CONST(17630.118893419625/8.0), REAL_CONST(17645.484504841683/8.0), REAL_CONST(17660.853462069354/8.0), REAL_CONST(17676.225763646511/8.0), REAL_CONST(17691.601408118619/8.0), REAL_CONST(17706.980394032718/8.0), REAL_CONST(17722.362719937424/8.0), REAL_CONST(17737.748384382936/8.0), REAL_CONST(17753.137385921014/8.0), REAL_CONST(17768.529723104999/8.0), REAL_CONST(17783.92539448979/8.0), REAL_CONST(17799.324398631856/8.0), REAL_CONST(17814.726734089225/8.0), REAL_CONST(17830.13239942148/8.0), REAL_CONST(17845.541393189767/8.0), REAL_CONST(17860.95371395678/8.0), REAL_CONST(17876.369360286772/8.0), REAL_CONST(17891.788330745527/8.0), REAL_CONST(17907.210623900395/8.0), REAL_CONST(17922.636238320254/8.0), REAL_CONST(17938.065172575527/8.0), REAL_CONST(17953.497425238176/8.0), REAL_CONST(17968.932994881692/8.0), REAL_CONST(17984.371880081104/8.0), REAL_CONST(17999.814079412972/8.0), REAL_CONST(18015.259591455371/8.0), REAL_CONST(18030.708414787914/8.0), REAL_CONST(18046.160547991731/8.0), REAL_CONST(18061.615989649465/8.0), REAL_CONST(18077.074738345284/8.0), REAL_CONST(18092.536792664861/8.0), REAL_CONST(18108.002151195393/8.0), REAL_CONST(18123.470812525571/8.0), REAL_CONST(18138.942775245599/8.0), REAL_CONST(18154.418037947191/8.0), REAL_CONST(18169.896599223546/8.0), REAL_CONST(18185.37845766938/8.0), REAL_CONST(18200.863611880886/8.0), REAL_CONST(18216.352060455767/8.0), REAL_CONST(18231.843801993204/8.0), REAL_CONST(18247.338835093873/8.0), REAL_CONST(18262.837158359936/8.0), REAL_CONST(18278.338770395032/8.0), REAL_CONST(18293.84366980429/8.0), REAL_CONST(18309.351855194309/8.0), REAL_CONST(18324.863325173166/8.0), REAL_CONST(18340.378078350412/8.0), REAL_CONST(18355.896113337069/8.0), REAL_CONST(18371.417428745623/8.0), REAL_CONST(18386.942023190033/8.0), REAL_CONST(18402.469895285718/8.0), REAL_CONST(18418.00104364955/8.0), REAL_CONST(18433.53546689987/8.0), REAL_CONST(18449.073163656474/8.0), REAL_CONST(18464.614132540602/8.0), REAL_CONST(18480.158372174956/8.0), REAL_CONST(18495.705881183676/8.0), REAL_CONST(18511.256658192357/8.0), REAL_CONST(18526.810701828035/8.0), REAL_CONST(18542.368010719183/8.0), REAL_CONST(18557.928583495715/8.0), REAL_CONST(18573.492418788985/8.0), REAL_CONST(18589.059515231773/8.0), REAL_CONST(18604.629871458303/8.0), REAL_CONST(18620.203486104212/8.0), REAL_CONST(18635.78035780658/8.0), REAL_CONST(18651.360485203899/8.0), REAL_CONST(18666.943866936086/8.0), REAL_CONST(18682.53050164448/8.0), REAL_CONST(18698.120387971841/8.0), REAL_CONST(18713.713524562332/8.0), REAL_CONST(18729.30991006154/8.0), REAL_CONST(18744.909543116457/8.0), REAL_CONST(18760.512422375479/8.0), REAL_CONST(18776.118546488418/8.0), REAL_CONST(18791.727914106479/8.0), REAL_CONST(18807.340523882274/8.0), REAL_CONST(18822.95637446981/8.0), REAL_CONST(18838.575464524489/8.0), REAL_CONST(18854.197792703111/8.0), REAL_CONST(18869.823357663863/8.0), REAL_CONST(18885.452158066328/8.0), REAL_CONST(18901.08419257147/8.0), REAL_CONST(18916.719459841639/8.0), REAL_CONST(18932.357958540564/8.0), REAL_CONST(18947.999687333362/8.0), REAL_CONST(18963.644644886521/8.0), REAL_CONST(18979.292829867907/8.0), REAL_CONST(18994.944240946759/8.0), REAL_CONST(19010.598876793687/8.0), REAL_CONST(19026.256736080668/8.0), REAL_CONST(19041.917817481048/8.0), REAL_CONST(19057.582119669532/8.0), REAL_CONST(19073.2496413222/8.0), REAL_CONST(19088.920381116473/8.0), REAL_CONST(19104.594337731145/8.0), REAL_CONST(19120.271509846356/8.0), REAL_CONST(19135.951896143604/8.0), REAL_CONST(19151.635495305738/8.0), REAL_CONST(19167.322306016948/8.0), REAL_CONST(19183.012326962784/8.0), REAL_CONST(19198.705556830122/8.0), REAL_CONST(19214.401994307198/8.0), REAL_CONST(19230.101638083579/8.0), REAL_CONST(19245.804486850167/8.0), REAL_CONST(19261.510539299208/8.0), REAL_CONST(19277.219794124274/8.0), REAL_CONST(19292.932250020265/8.0), REAL_CONST(19308.647905683421/8.0), REAL_CONST(19324.366759811302/8.0), REAL_CONST(19340.088811102793/8.0), REAL_CONST(19355.8140582581/8.0), REAL_CONST(19371.542499978754/8.0), REAL_CONST(19387.2741349676/8.0), REAL_CONST(19403.008961928797/8.0), REAL_CONST(19418.746979567823/8.0), REAL_CONST(19434.488186591469/8.0), REAL_CONST(19450.232581707827/8.0), REAL_CONST(19465.980163626304/8.0), REAL_CONST(19481.730931057613/8.0), REAL_CONST(19497.484882713761/8.0), REAL_CONST(19513.242017308068/8.0), REAL_CONST(19529.002333555141/8.0), REAL_CONST(19544.765830170898/8.0), REAL_CONST(19560.532505872539/8.0), REAL_CONST(19576.302359378566/8.0), REAL_CONST(19592.075389408761/8.0), REAL_CONST(19607.851594684209/8.0), REAL_CONST(19623.630973927269/8.0), REAL_CONST(19639.41352586159/8.0), REAL_CONST(19655.199249212103/8.0), REAL_CONST(19670.988142705017/8.0), REAL_CONST(19686.780205067826/8.0), REAL_CONST(19702.575435029288/8.0), REAL_CONST(19718.373831319448/8.0), REAL_CONST(19734.175392669615/8.0), REAL_CONST(19749.980117812371/8.0), REAL_CONST(19765.788005481569/8.0), REAL_CONST(19781.599054412323/8.0), REAL_CONST(19797.413263341008/8.0), REAL_CONST(19813.230631005274/8.0), REAL_CONST(19829.051156144014/8.0), REAL_CONST(19844.874837497395/8.0), REAL_CONST(19860.701673806827/8.0), REAL_CONST(19876.531663814985/8.0), REAL_CONST(19892.364806265789/8.0), REAL_CONST(19908.201099904403/8.0), REAL_CONST(19924.040543477258/8.0), REAL_CONST(19939.883135732012/8.0), REAL_CONST(19955.728875417579/8.0), REAL_CONST(19971.577761284105/8.0), REAL_CONST(19987.429792082985/8.0), REAL_CONST(20003.284966566847/8.0), REAL_CONST(20019.14328348956/8.0), REAL_CONST(20035.004741606219/8.0), REAL_CONST(20050.869339673161/8.0), REAL_CONST(20066.737076447946/8.0), REAL_CONST(20082.607950689362/8.0), REAL_CONST(20098.481961157428/8.0), REAL_CONST(20114.359106613385/8.0), REAL_CONST(20130.239385819699/8.0), REAL_CONST(20146.122797540058/8.0), REAL_CONST(20162.009340539353/8.0), REAL_CONST(20177.899013583716/8.0), REAL_CONST(20193.791815440476/8.0), REAL_CONST(20209.687744878182/8.0), REAL_CONST(20225.586800666591/8.0), REAL_CONST(20241.488981576669/8.0), REAL_CONST(20257.394286380597/8.0), REAL_CONST(20273.302713851754/8.0), REAL_CONST(20289.214262764715/8.0), REAL_CONST(20305.128931895277/8.0), REAL_CONST(20321.046720020415/8.0), REAL_CONST(20336.967625918318/8.0), REAL_CONST(20352.891648368361/8.0), REAL_CONST(20368.818786151114/8.0), REAL_CONST(20384.749038048347/8.0), REAL_CONST(20400.682402843009/8.0), REAL_CONST(20416.618879319249/8.0), REAL_CONST(20432.558466262391/8.0), REAL_CONST(20448.501162458953/8.0), REAL_CONST(20464.446966696629/8.0), REAL_CONST(20480.395877764302/8.0), REAL_CONST(20496.347894452025/8.0), REAL_CONST(20512.303015551031/8.0), REAL_CONST(20528.261239853735/8.0), REAL_CONST(20544.22256615372/8.0), REAL_CONST(20560.186993245738/8.0), REAL_CONST(20576.15451992572/8.0), REAL_CONST(20592.125144990758/8.0), REAL_CONST(20608.098867239107/8.0), REAL_CONST(20624.075685470198/8.0), REAL_CONST(20640.055598484618/8.0), REAL_CONST(20656.038605084115/8.0), REAL_CONST(20672.024704071595/8.0), REAL_CONST(20688.013894251126/8.0), REAL_CONST(20704.006174427926/8.0), REAL_CONST(20720.001543408373/8.0), REAL_CONST(20735.999999999989/8.0), REAL_CONST(20752.001543011454/8.0), REAL_CONST(20768.006171252597/8.0), REAL_CONST(20784.013883534382/8.0), REAL_CONST(20800.024678668931/8.0), REAL_CONST(20816.038555469506/8.0), REAL_CONST(20832.055512750507/8.0), REAL_CONST(20848.075549327474/8.0), REAL_CONST(20864.098664017085/8.0), REAL_CONST(20880.124855637161/8.0), REAL_CONST(20896.154123006647/8.0), REAL_CONST(20912.186464945626/8.0), REAL_CONST(20928.221880275312/8.0), REAL_CONST(20944.260367818049/8.0), REAL_CONST(20960.301926397311/8.0), REAL_CONST(20976.346554837684/8.0), REAL_CONST(20992.394251964895/8.0), REAL_CONST(21008.445016605787/8.0), REAL_CONST(21024.498847588318/8.0), REAL_CONST(21040.555743741574/8.0), REAL_CONST(21056.615703895754/8.0), REAL_CONST(21072.678726882168/8.0), REAL_CONST(21088.744811533252/8.0), REAL_CONST(21104.813956682538/8.0), REAL_CONST(21120.886161164683/8.0), REAL_CONST(21136.961423815443/8.0), REAL_CONST(21153.039743471683/8.0), REAL_CONST(21169.121118971379/8.0), REAL_CONST(21185.205549153605/8.0), REAL_CONST(21201.293032858535/8.0), REAL_CONST(21217.383568927453/8.0), REAL_CONST(21233.477156202731/8.0), REAL_CONST(21249.573793527841/8.0), REAL_CONST(21265.673479747358/8.0), REAL_CONST(21281.776213706937/8.0), REAL_CONST(21297.881994253334/8.0), REAL_CONST(21313.990820234398/8.0), REAL_CONST(21330.102690499054/8.0), REAL_CONST(21346.21760389733/8.0), REAL_CONST(21362.335559280327/8.0), REAL_CONST(21378.456555500241/8.0), REAL_CONST(21394.580591410333/8.0), REAL_CONST(21410.707665864964/8.0), REAL_CONST(21426.83777771956/8.0), REAL_CONST(21442.970925830628/8.0), REAL_CONST(21459.107109055756/8.0), REAL_CONST(21475.246326253604/8.0), REAL_CONST(21491.388576283895/8.0), REAL_CONST(21507.533858007431/8.0), REAL_CONST(21523.682170286087/8.0), REAL_CONST(21539.833511982797/8.0), REAL_CONST(21555.987881961566/8.0), REAL_CONST(21572.145279087465/8.0), REAL_CONST(21588.305702226615/8.0), REAL_CONST(21604.469150246216/8.0), REAL_CONST(21620.635622014521/8.0), REAL_CONST(21636.805116400832/8.0), REAL_CONST(21652.977632275521/8.0), REAL_CONST(21669.153168510009/8.0), REAL_CONST(21685.331723976764/8.0), REAL_CONST(21701.513297549318/8.0), REAL_CONST(21717.697888102244/8.0), REAL_CONST(21733.885494511167/8.0), REAL_CONST(21750.076115652759/8.0), REAL_CONST(21766.269750404736/8.0), REAL_CONST(21782.466397645861/8.0), REAL_CONST(21798.666056255934/8.0), REAL_CONST(21814.868725115801/8.0), REAL_CONST(21831.074403107345/8.0), REAL_CONST(21847.283089113484/8.0), REAL_CONST(21863.494782018177/8.0), REAL_CONST(21879.709480706417/8.0), REAL_CONST(21895.927184064229/8.0), REAL_CONST(21912.147890978667/8.0), REAL_CONST(21928.371600337818/8.0), REAL_CONST(21944.598311030797/8.0), REAL_CONST(21960.828021947746/8.0), REAL_CONST(21977.060731979829/8.0), REAL_CONST(21993.296440019243/8.0), REAL_CONST(22009.535144959198/8.0), REAL_CONST(22025.77684569393/8.0), REAL_CONST(22042.021541118691/8.0), REAL_CONST(22058.269230129757/8.0), REAL_CONST(22074.519911624411/8.0), REAL_CONST(22090.773584500959/8.0), REAL_CONST(22107.030247658717/8.0), REAL_CONST(22123.289899998013/8.0), REAL_CONST(22139.552540420187/8.0), REAL_CONST(22155.818167827587/8.0), REAL_CONST(22172.086781123569/8.0), REAL_CONST(22188.358379212495/8.0), REAL_CONST(22204.632960999726/8.0), REAL_CONST(22220.910525391639/8.0), REAL_CONST(22237.191071295601/8.0), REAL_CONST(22253.474597619981/8.0), REAL_CONST(22269.761103274148/8.0), REAL_CONST(22286.050587168469/8.0), REAL_CONST(22302.343048214312/8.0), REAL_CONST(22318.638485324027/8.0), REAL_CONST(22334.936897410968/8.0), REAL_CONST(22351.23828338947/8.0), REAL_CONST(22367.542642174871/8.0), REAL_CONST(22383.849972683485/8.0), REAL_CONST(22400.160273832618/8.0), REAL_CONST(22416.473544540564/8.0), REAL_CONST(22432.789783726603/8.0), REAL_CONST(22449.108990310986/8.0), REAL_CONST(22465.431163214958/8.0), REAL_CONST(22481.75630136074/8.0), REAL_CONST(22498.084403671528/8.0), REAL_CONST(22514.415469071497/8.0), REAL_CONST(22530.749496485802/8.0), REAL_CONST(22547.086484840562/8.0), REAL_CONST(22563.426433062879/8.0), REAL_CONST(22579.769340080824/8.0), REAL_CONST(22596.115204823436/8.0), REAL_CONST(22612.464026220721/8.0), REAL_CONST(22628.815803203655/8.0), REAL_CONST(22645.170534704179/8.0), REAL_CONST(22661.5282196552/8.0), REAL_CONST(22677.888856990587/8.0), REAL_CONST(22694.252445645168/8.0), REAL_CONST(22710.618984554734/8.0), REAL_CONST(22726.988472656034/8.0), REAL_CONST(22743.360908886778/8.0), REAL_CONST(22759.736292185622/8.0), REAL_CONST(22776.114621492186/8.0), REAL_CONST(22792.495895747044/8.0), REAL_CONST(22808.880113891719/8.0), REAL_CONST(22825.267274868678/8.0), REAL_CONST(22841.657377621348/8.0), REAL_CONST(22858.050421094096/8.0), REAL_CONST(22874.446404232243/8.0), REAL_CONST(22890.845325982053/8.0), REAL_CONST(22907.247185290722/8.0), REAL_CONST(22923.651981106406/8.0), REAL_CONST(22940.059712378195/8.0), REAL_CONST(22956.470378056114/8.0), REAL_CONST(22972.883977091129/8.0), REAL_CONST(22989.300508435153/8.0), REAL_CONST(23005.719971041017/8.0), REAL_CONST(23022.142363862498/8.0), REAL_CONST(23038.567685854305/8.0), REAL_CONST(23054.995935972078/8.0), REAL_CONST(23071.427113172387/8.0), REAL_CONST(23087.86121641273/8.0), REAL_CONST(23104.298244651531/8.0), REAL_CONST(23120.738196848146/8.0), REAL_CONST(23137.181071962848/8.0), REAL_CONST(23153.626868956846/8.0), REAL_CONST(23170.075586792263/8.0), REAL_CONST(23186.527224432142/8.0), REAL_CONST(23202.981780840448/8.0), REAL_CONST(23219.439254982066/8.0), REAL_CONST(23235.899645822796/8.0), REAL_CONST(23252.362952329357/8.0), REAL_CONST(23268.829173469378/8.0), REAL_CONST(23285.298308211408/8.0), REAL_CONST(23301.770355524899/8.0), REAL_CONST(23318.245314380223/8.0), REAL_CONST(23334.723183748658/8.0), REAL_CONST(23351.203962602387/8.0), REAL_CONST(23367.687649914504/8.0), REAL_CONST(23384.174244659007/8.0), REAL_CONST(23400.663745810798/8.0), REAL_CONST(23417.15615234568/8.0), REAL_CONST(23433.651463240367/8.0), REAL_CONST(23450.149677472462/8.0), REAL_CONST(23466.650794020472/8.0), REAL_CONST(23483.154811863806/8.0), REAL_CONST(23499.661729982763/8.0), REAL_CONST(23516.171547358543/8.0), REAL_CONST(23532.684262973235/8.0), REAL_CONST(23549.199875809823/8.0), REAL_CONST(23565.718384852185/8.0), REAL_CONST(23582.239789085092/8.0), REAL_CONST(23598.764087494197/8.0), REAL_CONST(23615.291279066041/8.0), REAL_CONST(23631.821362788058/8.0), REAL_CONST(23648.354337648565/8.0), REAL_CONST(23664.890202636761/8.0), REAL_CONST(23681.428956742733/8.0), REAL_CONST(23697.970598957443/8.0), REAL_CONST(23714.515128272738/8.0), REAL_CONST(23731.062543681343/8.0), REAL_CONST(23747.612844176863/8.0), REAL_CONST(23764.166028753778/8.0), REAL_CONST(23780.72209640744/8.0), REAL_CONST(23797.281046134085/8.0), REAL_CONST(23813.842876930816/8.0), REAL_CONST(23830.407587795606/8.0), REAL_CONST(23846.975177727301/8.0), REAL_CONST(23863.545645725622/8.0), REAL_CONST(23880.11899079115/8.0), REAL_CONST(23896.695211925336/8.0), REAL_CONST(23913.274308130498/8.0), REAL_CONST(23929.856278409821/8.0), REAL_CONST(23946.441121767348/8.0), REAL_CONST(23963.028837207989/8.0), REAL_CONST(23979.619423737513/8.0), REAL_CONST(23996.212880362549/8.0), REAL_CONST(24012.809206090584/8.0), REAL_CONST(24029.408399929966/8.0), REAL_CONST(24046.010460889898/8.0), REAL_CONST(24062.615387980433/8.0), REAL_CONST(24079.223180212492/8.0), REAL_CONST(24095.833836597827/8.0), REAL_CONST(24112.447356149063/8.0), REAL_CONST(24129.063737879667/8.0), REAL_CONST(24145.682980803951/8.0), REAL_CONST(24162.305083937081/8.0), REAL_CONST(24178.930046295067/8.0), REAL_CONST(24195.557866894767/8.0), REAL_CONST(24212.188544753884/8.0), REAL_CONST(24228.822078890964/8.0), REAL_CONST(24245.458468325389/8.0), REAL_CONST(24262.097712077397/8.0), REAL_CONST(24278.739809168052/8.0), REAL_CONST(24295.384758619261/8.0), REAL_CONST(24312.032559453768/8.0), REAL_CONST(24328.683210695162/8.0), REAL_CONST(24345.336711367858/8.0), REAL_CONST(24361.993060497109/8.0), REAL_CONST(24378.652257108995/8.0), REAL_CONST(24395.314300230442/8.0), REAL_CONST(24411.979188889192/8.0), REAL_CONST(24428.646922113825/8.0), REAL_CONST(24445.317498933746/8.0), REAL_CONST(24461.990918379193/8.0), REAL_CONST(24478.667179481225/8.0), REAL_CONST(24495.346281271726/8.0), REAL_CONST(24512.028222783407/8.0), REAL_CONST(24528.713003049801/8.0), REAL_CONST(24545.400621105266/8.0), REAL_CONST(24562.091075984976/8.0), REAL_CONST(24578.784366724925/8.0), REAL_CONST(24595.480492361927/8.0), REAL_CONST(24612.179451933614/8.0), REAL_CONST(24628.881244478438/8.0), REAL_CONST(24645.585869035654/8.0), REAL_CONST(24662.293324645343/8.0), REAL_CONST(24679.003610348394/8.0), REAL_CONST(24695.716725186514/8.0), REAL_CONST(24712.432668202211/8.0), REAL_CONST(24729.151438438807/8.0), REAL_CONST(24745.873034940436/8.0), REAL_CONST(24762.597456752032/8.0), REAL_CONST(24779.324702919344/8.0), REAL_CONST(24796.054772488926/8.0), REAL_CONST(24812.787664508123/8.0), REAL_CONST(24829.5233780251/8.0), REAL_CONST(24846.261912088819/8.0), REAL_CONST(24863.003265749034/8.0), REAL_CONST(24879.747438056307/8.0), REAL_CONST(24896.494428062004/8.0), REAL_CONST(24913.244234818278/8.0), REAL_CONST(24929.996857378079/8.0), REAL_CONST(24946.752294795166/8.0), REAL_CONST(24963.510546124078/8.0), REAL_CONST(24980.271610420157/8.0), REAL_CONST(24997.035486739525/8.0), REAL_CONST(25013.802174139113/8.0), REAL_CONST(25030.571671676629/8.0), REAL_CONST(25047.343978410572/8.0), REAL_CONST(25064.119093400237/8.0), REAL_CONST(25080.897015705697/8.0), REAL_CONST(25097.677744387816/8.0), REAL_CONST(25114.461278508239/8.0), REAL_CONST(25131.2476171294/8.0), REAL_CONST(25148.036759314517/8.0), REAL_CONST(25164.828704127583/8.0), REAL_CONST(25181.623450633375/8.0), REAL_CONST(25198.42099789745/8.0), REAL_CONST(25215.221344986145/8.0), REAL_CONST(25232.024490966574/8.0), REAL_CONST(25248.830434906627/8.0), REAL_CONST(25265.639175874974/8.0), REAL_CONST(25282.450712941049/8.0), REAL_CONST(25299.265045175071/8.0), REAL_CONST(25316.082171648024/8.0), REAL_CONST(25332.902091431668/8.0), REAL_CONST(25349.724803598532/8.0), REAL_CONST(25366.550307221914/8.0), REAL_CONST(25383.378601375884/8.0), REAL_CONST(25400.209685135269/8.0), REAL_CONST(25417.043557575678/8.0), REAL_CONST(25433.880217773472/8.0), REAL_CONST(25450.719664805783/8.0), REAL_CONST(25467.561897750507/8.0), REAL_CONST(25484.406915686297/8.0), REAL_CONST(25501.254717692573/8.0), REAL_CONST(25518.105302849512/8.0), REAL_CONST(25534.958670238051/8.0), REAL_CONST(25551.814818939893/8.0), REAL_CONST(25568.67374803748/8.0), REAL_CONST(25585.535456614027/8.0), REAL_CONST(25602.399943753502/8.0), REAL_CONST(25619.267208540619/8.0), REAL_CONST(25636.137250060852/8.0), REAL_CONST(25653.010067400432/8.0), REAL_CONST(25669.885659646327/8.0), REAL_CONST(25686.76402588627/8.0), REAL_CONST(25703.645165208734/8.0), REAL_CONST(25720.529076702944/8.0), REAL_CONST(25737.415759458876/8.0), REAL_CONST(25754.305212567244/8.0), REAL_CONST(25771.197435119517/8.0), REAL_CONST(25788.092426207899/8.0), REAL_CONST(25804.990184925344/8.0), REAL_CONST(25821.890710365547/8.0), REAL_CONST(25838.794001622944/8.0), REAL_CONST(25855.700057792714/8.0), REAL_CONST(25872.608877970775/8.0), REAL_CONST(25889.520461253778/8.0), REAL_CONST(25906.434806739118/8.0), REAL_CONST(25923.351913524923/8.0), REAL_CONST(25940.271780710063/8.0), REAL_CONST(25957.194407394138/8.0), REAL_CONST(25974.11979267748/8.0), REAL_CONST(25991.047935661154/8.0), REAL_CONST(26007.978835446964/8.0), REAL_CONST(26024.912491137442/8.0), REAL_CONST(26041.848901835841/8.0), REAL_CONST(26058.788066646157/8.0), REAL_CONST(26075.729984673108/8.0), REAL_CONST(26092.674655022136/8.0), REAL_CONST(26109.622076799409/8.0), REAL_CONST(26126.572249111829/8.0), REAL_CONST(26143.525171067016/8.0), REAL_CONST(26160.480841773315/8.0), REAL_CONST(26177.43926033979/8.0), REAL_CONST(26194.400425876229/8.0), REAL_CONST(26211.364337493149/8.0), REAL_CONST(26228.330994301767/8.0), REAL_CONST(26245.30039541404/8.0), REAL_CONST(26262.272539942627/8.0), REAL_CONST(26279.247427000919/8.0), REAL_CONST(26296.225055703002/8.0), REAL_CONST(26313.205425163702/8.0), REAL_CONST(26330.188534498539/8.0), REAL_CONST(26347.174382823756/8.0), REAL_CONST(26364.162969256304/8.0), REAL_CONST(26381.154292913852/8.0), REAL_CONST(26398.148352914774/8.0), REAL_CONST(26415.145148378149/8.0), REAL_CONST(26432.144678423778/8.0), REAL_CONST(26449.146942172156/8.0), REAL_CONST(26466.151938744493/8.0), REAL_CONST(26483.159667262702/8.0), REAL_CONST(26500.170126849403/8.0), REAL_CONST(26517.183316627921/8.0), REAL_CONST(26534.199235722277/8.0), REAL_CONST(26551.217883257199/8.0), REAL_CONST(26568.239258358124/8.0), REAL_CONST(26585.263360151173/8.0), REAL_CONST(26602.290187763181/8.0), REAL_CONST(26619.319740321676/8.0), REAL_CONST(26636.352016954883/8.0), REAL_CONST(26653.387016791727/8.0), REAL_CONST(26670.424738961825/8.0), REAL_CONST(26687.465182595493/8.0), REAL_CONST(26704.508346823739/8.0), REAL_CONST(26721.554230778267/8.0), REAL_CONST(26738.602833591467/8.0), REAL_CONST(26755.65415439643/8.0), REAL_CONST(26772.708192326929/8.0), REAL_CONST(26789.764946517433/8.0), REAL_CONST(26806.824416103096/8.0), REAL_CONST(26823.886600219761/8.0), REAL_CONST(26840.95149800396/8.0), REAL_CONST(26858.019108592915/8.0), REAL_CONST(26875.089431124517/8.0), REAL_CONST(26892.162464737365/8.0), REAL_CONST(26909.238208570721/8.0), REAL_CONST(26926.316661764544/8.0), REAL_CONST(26943.397823459472/8.0), REAL_CONST(26960.481692796813/8.0), REAL_CONST(26977.568268918571/8.0), REAL_CONST(26994.657550967422/8.0), REAL_CONST(27011.749538086722/8.0), REAL_CONST(27028.844229420498/8.0), REAL_CONST(27045.941624113464/8.0), REAL_CONST(27063.041721311005/8.0), REAL_CONST(27080.144520159181/8.0), REAL_CONST(27097.250019804727/8.0), REAL_CONST(27114.35821939505/8.0), REAL_CONST(27131.469118078236/8.0), REAL_CONST(27148.582715003027/8.0), REAL_CONST(27165.699009318858/8.0), REAL_CONST(27182.818000175819/8.0), REAL_CONST(27199.939686724665/8.0), REAL_CONST(27217.064068116837/8.0), REAL_CONST(27234.191143504428/8.0), REAL_CONST(27251.320912040203/8.0), REAL_CONST(27268.453372877593/8.0), REAL_CONST(27285.588525170693/8.0), REAL_CONST(27302.726368074269/8.0), REAL_CONST(27319.866900743735/8.0), REAL_CONST(27337.010122335181/8.0), REAL_CONST(27354.156032005358/8.0), REAL_CONST(27371.304628911668/8.0), REAL_CONST(27388.455912212183/8.0), REAL_CONST(27405.609881065626/8.0), REAL_CONST(27422.766534631384/8.0), REAL_CONST(27439.925872069507/8.0), REAL_CONST(27457.087892540683/8.0), REAL_CONST(27474.252595206275/8.0), REAL_CONST(27491.419979228293/8.0), REAL_CONST(27508.5900437694/8.0), REAL_CONST(27525.762787992917/8.0), REAL_CONST(27542.93821106281/8.0), REAL_CONST(27560.116312143706/8.0), REAL_CONST(27577.297090400876/8.0), REAL_CONST(27594.480545000242/8.0), REAL_CONST(27611.666675108383/8.0), REAL_CONST(27628.855479892518/8.0), REAL_CONST(27646.046958520514/8.0), REAL_CONST(27663.241110160889/8.0), REAL_CONST(27680.437933982801/8.0), REAL_CONST(27697.637429156068/8.0), REAL_CONST(27714.839594851132/8.0), REAL_CONST(27732.04443023909/8.0), REAL_CONST(27749.251934491687/8.0), REAL_CONST(27766.462106781299/8.0), REAL_CONST(27783.674946280949/8.0), REAL_CONST(27800.890452164302/8.0), REAL_CONST(27818.108623605654/8.0), REAL_CONST(27835.329459779954/8.0), REAL_CONST(27852.55295986278/8.0), REAL_CONST(27869.779123030345/8.0), REAL_CONST(27887.007948459504/8.0), REAL_CONST(27904.239435327745/8.0), REAL_CONST(27921.473582813196/8.0), REAL_CONST(27938.710390094613/8.0), REAL_CONST(27955.949856351392/8.0), REAL_CONST(27973.19198076355/8.0), REAL_CONST(27990.436762511745/8.0), REAL_CONST(28007.684200777272/8.0), REAL_CONST(28024.934294742041/8.0), REAL_CONST(28042.187043588601/8.0), REAL_CONST(28059.442446500128/8.0), REAL_CONST(28076.700502660427/8.0), REAL_CONST(28093.961211253929/8.0), REAL_CONST(28111.224571465693/8.0), REAL_CONST(28128.490582481401/8.0), REAL_CONST(28145.759243487362/8.0), REAL_CONST(28163.030553670509/8.0), REAL_CONST(28180.304512218394/8.0), REAL_CONST(28197.581118319198/8.0), REAL_CONST(28214.860371161725/8.0), REAL_CONST(28232.14226993539/8.0), REAL_CONST(28249.42681383024/8.0), REAL_CONST(28266.71400203693/8.0), REAL_CONST(28284.003833746745/8.0), REAL_CONST(28301.296308151585/8.0), REAL_CONST(28318.591424443959/8.0), REAL_CONST(28335.889181817001/8.0), REAL_CONST(28353.189579464462/8.0), REAL_CONST(28370.492616580705/8.0), REAL_CONST(28387.798292360701/8.0), REAL_CONST(28405.106606000048/8.0), REAL_CONST(28422.417556694945/8.0), REAL_CONST(28439.731143642206/8.0), REAL_CONST(28457.047366039264/8.0), REAL_CONST(28474.366223084147/8.0), REAL_CONST(28491.687713975512/8.0), REAL_CONST(28509.011837912611/8.0), REAL_CONST(28526.338594095305/8.0), REAL_CONST(28543.667981724069/8.0), REAL_CONST(28560.999999999982/8.0), REAL_CONST(28578.334648124732/8.0), REAL_CONST(28595.671925300605/8.0), REAL_CONST(28613.011830730498/8.0), REAL_CONST(28630.354363617909/8.0), REAL_CONST(28647.699523166943/8.0), REAL_CONST(28665.0473085823/8.0), REAL_CONST(28682.397719069289/8.0), REAL_CONST(28699.750753833818/8.0), REAL_CONST(28717.10641208239/8.0), REAL_CONST(28734.464693022121/8.0), REAL_CONST(28751.825595860708/8.0), REAL_CONST(28769.189119806462/8.0), REAL_CONST(28786.55526406828/8.0), REAL_CONST(28803.924027855664/8.0), REAL_CONST(28821.295410378701/8.0), REAL_CONST(28838.669410848088/8.0), REAL_CONST(28856.046028475103/8.0), REAL_CONST(28873.425262471628/8.0), REAL_CONST(28890.80711205013/8.0), REAL_CONST(28908.191576423673/8.0), REAL_CONST(28925.578654805915/8.0), REAL_CONST(28942.968346411097/8.0), REAL_CONST(28960.360650454055/8.0), REAL_CONST(28977.755566150216/8.0), REAL_CONST(28995.153092715591/8.0), REAL_CONST(29012.553229366786/8.0), REAL_CONST(29029.955975320987/8.0), REAL_CONST(29047.361329795975/8.0), REAL_CONST(29064.769292010107/8.0), REAL_CONST(29082.179861182336/8.0), REAL_CONST(29099.593036532187/8.0), REAL_CONST(29117.00881727978/8.0), REAL_CONST(29134.427202645813/8.0), REAL_CONST(29151.848191851568/8.0), REAL_CONST(29169.271784118911/8.0), REAL_CONST(29186.697978670283/8.0), REAL_CONST(29204.126774728706/8.0), REAL_CONST(29221.55817151779/8.0), REAL_CONST(29238.992168261717/8.0), REAL_CONST(29256.42876418525/8.0), REAL_CONST(29273.867958513725/8.0), REAL_CONST(29291.309750473058/8.0), REAL_CONST(29308.754139289747/8.0), REAL_CONST(29326.201124190855/8.0), REAL_CONST(29343.65070440403/8.0), REAL_CONST(29361.102879157483/8.0), REAL_CONST(29378.557647680012/8.0), REAL_CONST(29396.015009200975/8.0), REAL_CONST(29413.474962950309/8.0), REAL_CONST(29430.937508158524/8.0), REAL_CONST(29448.402644056692/8.0), REAL_CONST(29465.870369876469/8.0), REAL_CONST(29483.340684850071/8.0), REAL_CONST(29500.81358821028/8.0), REAL_CONST(29518.289079190454/8.0), REAL_CONST(29535.767157024511/8.0), REAL_CONST(29553.247820946945/8.0), REAL_CONST(29570.731070192807/8.0), REAL_CONST(29588.216903997723/8.0), REAL_CONST(29605.70532159787/8.0), REAL_CONST(29623.19632223/8.0), REAL_CONST(29640.689905131429/8.0), REAL_CONST(29658.186069540028/8.0), REAL_CONST(29675.684814694236/8.0), REAL_CONST(29693.186139833047/8.0), REAL_CONST(29710.690044196028/8.0), REAL_CONST(29728.196527023298/8.0), REAL_CONST(29745.705587555527/8.0), REAL_CONST(29763.217225033964/8.0), REAL_CONST(29780.731438700397/8.0), REAL_CONST(29798.248227797183/8.0), REAL_CONST(29815.76759156723/8.0), REAL_CONST(29833.289529254005/8.0), REAL_CONST(29850.81404010153/8.0), REAL_CONST(29868.341123354381/8.0), REAL_CONST(29885.870778257693/8.0), REAL_CONST(29903.403004057145/8.0), REAL_CONST(29920.937799998974/8.0), REAL_CONST(29938.475165329975/8.0), REAL_CONST(29956.015099297485/8.0), REAL_CONST(29973.557601149394/8.0), REAL_CONST(29991.102670134147/8.0), REAL_CONST(30008.650305500738/8.0), REAL_CONST(30026.200506498706/8.0), REAL_CONST(30043.753272378144/8.0), REAL_CONST(30061.308602389683/8.0), REAL_CONST(30078.866495784507/8.0), REAL_CONST(30096.426951814352/8.0), REAL_CONST(30113.989969731494/8.0), REAL_CONST(30131.55554878875/8.0), REAL_CONST(30149.123688239491/8.0), REAL_CONST(30166.694387337629/8.0), REAL_CONST(30184.267645337608/8.0), REAL_CONST(30201.843461494434/8.0), REAL_CONST(30219.42183506364/8.0), REAL_CONST(30237.002765301309/8.0), REAL_CONST(30254.586251464058/8.0), REAL_CONST(30272.172292809046/8.0), REAL_CONST(30289.760888593977/8.0), REAL_CONST(30307.35203807709/8.0), REAL_CONST(30324.94574051716/8.0), REAL_CONST(30342.541995173502/8.0), REAL_CONST(30360.140801305966/8.0), REAL_CONST(30377.742158174944/8.0), REAL_CONST(30395.346065041358/8.0), REAL_CONST(30412.952521166666/8.0), REAL_CONST(30430.561525812864/8.0), REAL_CONST(30448.173078242475/8.0), REAL_CONST(30465.787177718561/8.0), REAL_CONST(30483.403823504719/8.0), REAL_CONST(30501.02301486507/8.0), REAL_CONST(30518.644751064272/8.0), REAL_CONST(30536.269031367516/8.0), REAL_CONST(30553.895855040515/8.0), REAL_CONST(30571.525221349519/8.0), REAL_CONST(30589.157129561307/8.0), REAL_CONST(30606.791578943175/8.0), REAL_CONST(30624.428568762964/8.0), REAL_CONST(30642.06809828903/8.0), REAL_CONST(30659.710166790261/8.0), REAL_CONST(30677.35477353607/8.0), REAL_CONST(30695.001917796391/8.0), REAL_CONST(30712.651598841687/8.0), REAL_CONST(30730.303815942945/8.0), REAL_CONST(30747.958568371676/8.0), REAL_CONST(30765.615855399912/8.0), REAL_CONST(30783.275676300211/8.0), REAL_CONST(30800.938030345646/8.0), REAL_CONST(30818.602916809814/8.0), REAL_CONST(30836.270334966837/8.0), REAL_CONST(30853.940284091354/8.0), REAL_CONST(30871.612763458521/8.0), REAL_CONST(30889.287772344011/8.0), REAL_CONST(30906.965310024025/8.0), REAL_CONST(30924.645375775272/8.0), REAL_CONST(30942.327968874983/8.0), REAL_CONST(30960.013088600903/8.0), REAL_CONST(30977.700734231294/8.0), REAL_CONST(30995.390905044929/8.0), REAL_CONST(31013.083600321101/8.0), REAL_CONST(31030.778819339619/8.0), REAL_CONST(31048.476561380798/8.0), REAL_CONST(31066.17682572547/8.0), REAL_CONST(31083.879611654978/8.0), REAL_CONST(31101.584918451179/8.0), REAL_CONST(31119.29274539644/8.0), REAL_CONST(31137.003091773637/8.0), REAL_CONST(31154.715956866155/8.0), REAL_CONST(31172.431339957893/8.0), REAL_CONST(31190.14924033326/8.0), REAL_CONST(31207.869657277162/8.0), REAL_CONST(31225.592590075023/8.0), REAL_CONST(31243.318038012771/8.0), REAL_CONST(31261.046000376838/8.0), REAL_CONST(31278.776476454172/8.0), REAL_CONST(31296.50946553221/8.0), REAL_CONST(31314.24496689891/8.0), REAL_CONST(31331.98297984272/8.0), REAL_CONST(31349.7235036526/8.0), REAL_CONST(31367.466537618013/8.0), REAL_CONST(31385.212081028923/8.0), REAL_CONST(31402.960133175795/8.0), REAL_CONST(31420.710693349596/8.0), REAL_CONST(31438.463760841791/8.0), REAL_CONST(31456.219334944351/8.0), REAL_CONST(31473.977414949743/8.0), REAL_CONST(31491.738000150934/8.0), REAL_CONST(31509.501089841389/8.0), REAL_CONST(31527.266683315069/8.0), REAL_CONST(31545.034779866437/8.0), REAL_CONST(31562.80537879045/8.0), REAL_CONST(31580.578479382562/8.0), REAL_CONST(31598.35408093872/8.0), REAL_CONST(31616.132182755369/8.0), REAL_CONST(31633.91278412945/8.0), REAL_CONST(31651.695884358396/8.0), REAL_CONST(31669.481482740131/8.0), REAL_CONST(31687.269578573076/8.0), REAL_CONST(31705.060171156143/8.0), REAL_CONST(31722.853259788735/8.0), REAL_CONST(31740.648843770748/8.0), REAL_CONST(31758.446922402567/8.0), REAL_CONST(31776.247494985066/8.0), REAL_CONST(31794.050560819614/8.0), REAL_CONST(31811.85611920806/8.0), REAL_CONST(31829.664169452753/8.0), REAL_CONST(31847.474710856521/8.0), REAL_CONST(31865.287742722685/8.0), REAL_CONST(31883.103264355046/8.0), REAL_CONST(31900.921275057899/8.0), REAL_CONST(31918.741774136019/8.0), REAL_CONST(31936.564760894671/8.0), REAL_CONST(31954.390234639599/8.0), REAL_CONST(31972.21819467704/8.0), REAL_CONST(31990.048640313704/8.0), REAL_CONST(32007.881570856793/8.0), REAL_CONST(32025.716985613984/8.0), REAL_CONST(32043.554883893445/8.0), REAL_CONST(32061.395265003815/8.0), REAL_CONST(32079.238128254223/8.0), REAL_CONST(32097.083472954269/8.0), REAL_CONST(32114.931298414049/8.0), REAL_CONST(32132.781603944117/8.0), REAL_CONST(32150.634388855524/8.0), REAL_CONST(32168.48965245979/8.0), REAL_CONST(32186.347394068915/8.0), REAL_CONST(32204.207612995371/8.0), REAL_CONST(32222.07030855212/8.0), REAL_CONST(32239.935480052583/8.0), REAL_CONST(32257.803126810672/8.0), REAL_CONST(32275.673248140767/8.0), REAL_CONST(32293.545843357719/8.0), REAL_CONST(32311.420911776862/8.0), REAL_CONST(32329.298452713996/8.0), REAL_CONST(32347.178465485395/8.0), REAL_CONST(32365.060949407813/8.0), REAL_CONST(32382.945903798463/8.0), REAL_CONST(32400.83332797504/8.0), REAL_CONST(32418.723221255706/8.0), REAL_CONST(32436.615582959093/8.0), REAL_CONST(32454.510412404306/8.0), REAL_CONST(32472.407708910916/8.0), REAL_CONST(32490.307471798966/8.0), REAL_CONST(32508.209700388961/8.0), REAL_CONST(32526.114394001877/8.0), REAL_CONST(32544.021551959166/8.0), REAL_CONST(32561.931173582732/8.0), REAL_CONST(32579.843258194956/8.0), REAL_CONST(32597.757805118679/8.0), REAL_CONST(32615.674813677211/8.0), REAL_CONST(32633.594283194328/8.0), REAL_CONST(32651.516212994258/8.0), REAL_CONST(32669.440602401712/8.0), REAL_CONST(32687.367450741847/8.0), REAL_CONST(32705.296757340297/8.0), REAL_CONST(32723.228521523146/8.0), REAL_CONST(32741.162742616943/8.0), REAL_CONST(32759.099419948703/8.0), REAL_CONST(32777.038552845901/8.0), REAL_CONST(32794.980140636464/8.0), REAL_CONST(32812.924182648792/8.0), REAL_CONST(32830.87067821173/8.0), REAL_CONST(32848.819626654593/8.0), REAL_CONST(32866.77102730715/8.0), REAL_CONST(32884.724879499619/8.0), REAL_CONST(32902.681182562686/8.0), REAL_CONST(32920.639935827494/8.0), REAL_CONST(32938.601138625643/8.0), REAL_CONST(32956.56479028918/8.0), REAL_CONST(32974.530890150607/8.0), REAL_CONST(32992.499437542894/8.0), REAL_CONST(33010.470431799447/8.0), REAL_CONST(33028.443872254145/8.0), REAL_CONST(33046.419758241311/8.0), REAL_CONST(33064.39808909571/8.0), REAL_CONST(33082.378864152583/8.0), REAL_CONST(33100.36208274759/8.0), REAL_CONST(33118.347744216881/8.0), REAL_CONST(33136.335847897026/8.0), REAL_CONST(33154.326393125062/8.0), REAL_CONST(33172.31937923847/8.0), REAL_CONST(33190.314805575174/8.0), REAL_CONST(33208.312671473555/8.0), REAL_CONST(33226.312976272442/8.0), REAL_CONST(33244.315719311111/8.0), REAL_CONST(33262.320899929284/8.0), REAL_CONST(33280.328517467125/8.0), REAL_CONST(33298.33857126526/8.0), REAL_CONST(33316.351060664747/8.0), REAL_CONST(33334.365985007091/8.0), REAL_CONST(33352.383343634239/8.0), REAL_CONST(33370.403135888591/8.0), REAL_CONST(33388.42536111299/8.0), REAL_CONST(33406.450018650721/8.0), REAL_CONST(33424.477107845501/8.0), REAL_CONST(33442.506628041512/8.0), REAL_CONST(33460.53857858335/8.0), REAL_CONST(33478.572958816083/8.0), REAL_CONST(33496.609768085189/8.0), REAL_CONST(33514.649005736617/8.0), REAL_CONST(33532.690671116739/8.0), REAL_CONST(33550.734763572356/8.0), REAL_CONST(33568.781282450735/8.0), REAL_CONST(33586.830227099563/8.0), REAL_CONST(33604.881596866973/8.0), REAL_CONST(33622.935391101528/8.0), REAL_CONST(33640.991609152239/8.0), REAL_CONST(33659.050250368542/8.0), REAL_CONST(33677.111314100322/8.0), REAL_CONST(33695.174799697881/8.0), REAL_CONST(33713.240706511984/8.0), REAL_CONST(33731.309033893805/8.0), REAL_CONST(33749.37978119497/8.0), REAL_CONST(33767.452947767531/8.0), REAL_CONST(33785.528532963974/8.0), REAL_CONST(33803.606536137209/8.0), REAL_CONST(33821.686956640602/8.0), REAL_CONST(33839.769793827938/8.0), REAL_CONST(33857.855047053425/8.0), REAL_CONST(33875.942715671707/8.0), REAL_CONST(33894.032799037872/8.0), REAL_CONST(33912.125296507431/8.0), REAL_CONST(33930.220207436316/8.0), REAL_CONST(33948.317531180888/8.0), REAL_CONST(33966.417267097961/8.0), REAL_CONST(33984.519414544746/8.0), REAL_CONST(34002.623972878901/8.0), REAL_CONST(34020.730941458511/8.0), REAL_CONST(34038.840319642077/8.0), REAL_CONST(34056.952106788536/8.0), REAL_CONST(34075.066302257255/8.0), REAL_CONST(34093.182905408015/8.0), REAL_CONST(34111.301915601027/8.0), REAL_CONST(34129.42333219693/8.0), REAL_CONST(34147.547154556785/8.0), REAL_CONST(34165.673382042078/8.0), REAL_CONST(34183.80201401472/8.0), REAL_CONST(34201.933049837033/8.0), REAL_CONST(34220.06648887178/8.0), REAL_CONST(34238.202330482141/8.0), REAL_CONST(34256.340574031703/8.0), REAL_CONST(34274.481218884495/8.0), REAL_CONST(34292.624264404949/8.0), REAL_CONST(34310.769709957938/8.0), REAL_CONST(34328.91755490873/8.0), REAL_CONST(34347.067798623029/8.0), REAL_CONST(34365.220440466954/8.0), REAL_CONST(34383.375479807051/8.0), REAL_CONST(34401.532916010263/8.0), REAL_CONST(34419.692748443973/8.0), REAL_CONST(34437.854976475966/8.0), REAL_CONST(34456.01959947445/8.0), REAL_CONST(34474.18661680806/8.0), REAL_CONST(34492.356027845817/8.0), REAL_CONST(34510.527831957188/8.0), REAL_CONST(34528.702028512052/8.0), REAL_CONST(34546.878616880676/8.0), REAL_CONST(34565.05759643377/8.0), REAL_CONST(34583.238966542449/8.0), REAL_CONST(34601.422726578232/8.0), REAL_CONST(34619.608875913065/8.0), REAL_CONST(34637.797413919296/8.0), REAL_CONST(34655.988339969692/8.0), REAL_CONST(34674.181653437423/8.0), REAL_CONST(34692.37735369608/8.0), REAL_CONST(34710.575440119668/8.0), REAL_CONST(34728.775912082579/8.0), REAL_CONST(34746.978768959649/8.0), REAL_CONST(34765.184010126082/8.0), REAL_CONST(34783.391634957537/8.0), REAL_CONST(34801.60164283005/8.0), REAL_CONST(34819.814033120063/8.0), REAL_CONST(34838.028805204456/8.0), REAL_CONST(34856.24595846048/8.0), REAL_CONST(34874.465492265823/8.0), REAL_CONST(34892.687405998557/8.0), REAL_CONST(34910.911699037177/8.0), REAL_CONST(34929.138370760564/8.0), REAL_CONST(34947.367420548027/8.0), REAL_CONST(34965.598847779271/8.0), REAL_CONST(34983.832651834389/8.0), REAL_CONST(35002.068832093908/8.0), REAL_CONST(35020.307387938738/8.0), REAL_CONST(35038.548318750189/8.0), REAL_CONST(35056.79162390998/8.0), REAL_CONST(35075.03730280025/8.0), REAL_CONST(35093.285354803513/8.0), REAL_CONST(35111.535779302685/8.0), REAL_CONST(35129.788575681116/8.0), REAL_CONST(35148.043743322516/8.0), REAL_CONST(35166.301281611013/8.0), REAL_CONST(35184.561189931141/8.0), REAL_CONST(35202.823467667826/8.0), REAL_CONST(35221.088114206388/8.0), REAL_CONST(35239.355128932555/8.0), REAL_CONST(35257.624511232447/8.0), REAL_CONST(35275.896260492584/8.0), REAL_CONST(35294.170376099886/8.0), REAL_CONST(35312.446857441668/8.0), REAL_CONST(35330.725703905628/8.0), REAL_CONST(35349.006914879887/8.0), REAL_CONST(35367.290489752944/8.0), REAL_CONST(35385.576427913686/8.0), REAL_CONST(35403.864728751418/8.0), REAL_CONST(35422.155391655811/8.0), REAL_CONST(35440.448416016967/8.0), REAL_CONST(35458.743801225341/8.0), REAL_CONST(35477.041546671804/8.0), REAL_CONST(35495.341651747622/8.0), REAL_CONST(35513.644115844436/8.0), REAL_CONST(35531.948938354304/8.0), REAL_CONST(35550.256118669655/8.0), REAL_CONST(35568.565656183309/8.0), REAL_CONST(35586.877550288496/8.0), REAL_CONST(35605.191800378816/8.0), REAL_CONST(35623.508405848268/8.0), REAL_CONST(35641.827366091238/8.0), REAL_CONST(35660.148680502505/8.0), REAL_CONST(35678.472348477233/8.0), REAL_CONST(35696.798369410979/8.0), REAL_CONST(35715.126742699678/8.0), REAL_CONST(35733.457467739659/8.0), REAL_CONST(35751.790543927644/8.0), REAL_CONST(35770.125970660738/8.0), REAL_CONST(35788.46374733642/8.0), REAL_CONST(35806.803873352568/8.0), REAL_CONST(35825.146348107453/8.0), REAL_CONST(35843.49117099971/8.0), REAL_CONST(35861.838341428367/8.0), REAL_CONST(35880.187858792851/8.0), REAL_CONST(35898.539722492955/8.0), REAL_CONST(35916.893931928862/8.0), REAL_CONST(35935.250486501129/8.0), REAL_CONST(35953.609385610718/8.0), REAL_CONST(35971.970628658957/8.0), REAL_CONST(35990.334215047558/8.0), REAL_CONST(36008.700144178612/8.0), REAL_CONST(36027.068415454596/8.0), REAL_CONST(36045.439028278372/8.0), REAL_CONST(36063.811982053165/8.0), REAL_CONST(36082.187276182609/8.0), REAL_CONST(36100.564910070694/8.0), REAL_CONST(36118.944883121789/8.0), REAL_CONST(36137.327194740654/8.0), REAL_CONST(36155.711844332429/8.0), REAL_CONST(36174.098831302617/8.0), REAL_CONST(36192.488155057115/8.0), REAL_CONST(36210.87981500219/8.0), REAL_CONST(36229.273810544473/8.0), REAL_CONST(36247.670141091003/8.0), REAL_CONST(36266.068806049167/8.0), REAL_CONST(36284.469804826738/8.0), REAL_CONST(36302.873136831862/8.0), REAL_CONST(36321.278801473069/8.0), REAL_CONST(36339.686798159251/8.0), REAL_CONST(36358.097126299683/8.0), REAL_CONST(36376.509785304013/8.0), REAL_CONST(36394.924774582258/8.0), REAL_CONST(36413.342093544816/8.0), REAL_CONST(36431.761741602444/8.0), REAL_CONST(36450.183718166292/8.0), REAL_CONST(36468.608022647859/8.0), REAL_CONST(36487.034654459028/8.0), REAL_CONST(36505.463613012063/8.0), REAL_CONST(36523.894897719583/8.0), REAL_CONST(36542.328507994578/8.0), REAL_CONST(36560.764443250409/8.0), REAL_CONST(36579.202702900831/8.0), REAL_CONST(36597.643286359926/8.0), REAL_CONST(36616.086193042182/8.0), REAL_CONST(36634.531422362437/8.0), REAL_CONST(36652.978973735895/8.0), REAL_CONST(36671.428846578143/8.0), REAL_CONST(36689.881040305125/8.0), REAL_CONST(36708.335554333149/8.0), REAL_CONST(36726.792388078902/8.0), REAL_CONST(36745.251540959427/8.0), REAL_CONST(36763.713012392138/8.0), REAL_CONST(36782.176801794812/8.0), REAL_CONST(36800.642908585593/8.0), REAL_CONST(36819.111332182983/8.0), REAL_CONST(36837.582072005869/8.0), REAL_CONST(36856.055127473483/8.0), REAL_CONST(36874.530498005421/8.0), REAL_CONST(36893.008183021651/8.0), REAL_CONST(36911.488181942506/8.0), REAL_CONST(36929.970494188674/8.0), REAL_CONST(36948.455119181206/8.0), REAL_CONST(36966.942056341519/8.0), REAL_CONST(36985.431305091392/8.0), REAL_CONST(37003.922864852961/8.0), REAL_CONST(37022.416735048733/8.0), REAL_CONST(37040.912915101559/8.0), REAL_CONST(37059.411404434657/8.0), REAL_CONST(37077.91220247162/8.0), REAL_CONST(37096.415308636388/8.0), REAL_CONST(37114.920722353243/8.0), REAL_CONST(37133.428443046862/8.0), REAL_CONST(37151.938470142253/8.0), REAL_CONST(37170.450803064785/8.0), REAL_CONST(37188.965441240209/8.0), REAL_CONST(37207.482384094597/8.0), REAL_CONST(37226.001631054402/8.0), REAL_CONST(37244.523181546429/8.0), REAL_CONST(37263.047034997842/8.0), REAL_CONST(37281.573190836149/8.0), REAL_CONST(37300.101648489224/8.0), REAL_CONST(37318.632407385296/8.0), REAL_CONST(37337.165466952945/8.0), REAL_CONST(37355.700826621112/8.0), REAL_CONST(37374.238485819085/8.0), REAL_CONST(37392.778443976509/8.0), REAL_CONST(37411.320700523385/8.0), REAL_CONST(37429.865254890057/8.0), REAL_CONST(37448.412106507232/8.0), REAL_CONST(37466.961254805974/8.0), REAL_CONST(37485.512699217681/8.0), REAL_CONST(37504.066439174116/8.0), REAL_CONST(37522.622474107404/8.0), REAL_CONST(37541.180803449992/8.0), REAL_CONST(37559.741426634704/8.0), REAL_CONST(37578.304343094693/8.0), REAL_CONST(37596.869552263488/8.0), REAL_CONST(37615.43705357494/8.0), REAL_CONST(37634.006846463279/8.0), REAL_CONST(37652.578930363044/8.0), REAL_CONST(37671.153304709165/8.0), REAL_CONST(37689.729968936896/8.0), REAL_CONST(37708.308922481847/8.0), REAL_CONST(37726.890164779965/8.0), REAL_CONST(37745.473695267559/8.0), REAL_CONST(37764.059513381275/8.0), REAL_CONST(37782.647618558112/8.0), REAL_CONST(37801.238010235415/8.0), REAL_CONST(37819.830687850859/8.0), REAL_CONST(37838.425650842495/8.0), REAL_CONST(37857.022898648691/8.0), REAL_CONST(37875.622430708172/8.0), REAL_CONST(37894.224246460013/8.0), REAL_CONST(37912.828345343616/8.0), REAL_CONST(37931.434726798747/8.0), REAL_CONST(37950.043390265506/8.0), REAL_CONST(37968.654335184328/8.0), REAL_CONST(37987.267560995999/8.0), REAL_CONST(38005.883067141665/8.0), REAL_CONST(38024.500853062775/8.0), REAL_CONST(38043.120918201159/8.0), REAL_CONST(38061.743261998963/8.0), REAL_CONST(38080.367883898682/8.0), REAL_CONST(38098.994783343158/8.0), REAL_CONST(38117.623959775563/8.0), REAL_CONST(38136.255412639417/8.0), REAL_CONST(38154.889141378575/8.0), REAL_CONST(38173.525145437234/8.0), REAL_CONST(38192.163424259939/8.0), REAL_CONST(38210.803977291551/8.0), REAL_CONST(38229.446803977284/8.0), REAL_CONST(38248.091903762703/8.0), REAL_CONST(38266.739276093685/8.0), REAL_CONST(38285.388920416466/8.0), REAL_CONST(38304.040836177606/8.0), REAL_CONST(38322.695022824002/8.0), REAL_CONST(38341.351479802899/8.0), REAL_CONST(38360.010206561863/8.0), REAL_CONST(38378.671202548816/8.0), REAL_CONST(38397.334467211993/8.0), REAL_CONST(38415.999999999978/8.0), REAL_CONST(38434.667800361683/8.0), REAL_CONST(38453.33786774637/8.0), REAL_CONST(38472.010201603611/8.0), REAL_CONST(38490.684801383337/8.0), REAL_CONST(38509.361666535784/8.0), REAL_CONST(38528.040796511552/8.0), REAL_CONST(38546.722190761553/8.0), REAL_CONST(38565.405848737035/8.0), REAL_CONST(38584.091769889594/8.0), REAL_CONST(38602.779953671132/8.0), REAL_CONST(38621.470399533908/8.0), REAL_CONST(38640.163106930493/8.0), REAL_CONST(38658.858075313794/8.0), REAL_CONST(38677.555304137059/8.0), REAL_CONST(38696.254792853862/8.0), REAL_CONST(38714.956540918094/8.0), REAL_CONST(38733.660547783991/8.0), REAL_CONST(38752.366812906112/8.0), REAL_CONST(38771.075335739348/8.0), REAL_CONST(38789.78611573892/8.0), REAL_CONST(38808.499152360368/8.0), REAL_CONST(38827.214445059573/8.0), REAL_CONST(38845.931993292739/8.0), REAL_CONST(38864.651796516388/8.0), REAL_CONST(38883.373854187383/8.0), REAL_CONST(38902.098165762916/8.0), REAL_CONST(38920.824730700486/8.0), REAL_CONST(38939.553548457938/8.0), REAL_CONST(38958.284618493431/8.0), REAL_CONST(38977.017940265461/8.0), REAL_CONST(38995.753513232834/8.0), REAL_CONST(39014.491336854699/8.0), REAL_CONST(39033.231410590517/8.0), REAL_CONST(39051.973733900079/8.0), REAL_CONST(39070.718306243485/8.0), REAL_CONST(39089.465127081188/8.0), REAL_CONST(39108.214195873945/8.0), REAL_CONST(39126.965512082832/8.0), REAL_CONST(39145.719075169261/8.0), REAL_CONST(39164.474884594965/8.0), REAL_CONST(39183.232939821988/8.0), REAL_CONST(39201.99324031271/8.0), REAL_CONST(39220.755785529815/8.0), REAL_CONST(39239.52057493633/8.0), REAL_CONST(39258.287607995589/8.0), REAL_CONST(39277.056884171245/8.0), REAL_CONST(39295.828402927284/8.0), REAL_CONST(39314.602163728006/8.0), REAL_CONST(39333.378166038019/8.0), REAL_CONST(39352.15640932227/8.0), REAL_CONST(39370.936893046004/8.0), REAL_CONST(39389.719616674811/8.0), REAL_CONST(39408.504579674584/8.0), REAL_CONST(39427.291781511522/8.0), REAL_CONST(39446.081221652174/8.0), REAL_CONST(39464.872899563372/8.0), REAL_CONST(39483.666814712291/8.0), REAL_CONST(39502.462966566411/8.0), REAL_CONST(39521.261354593538/8.0), REAL_CONST(39540.06197826178/8.0), REAL_CONST(39558.864837039568/8.0), REAL_CONST(39577.669930395656/8.0), REAL_CONST(39596.47725779911/8.0), REAL_CONST(39615.286818719302/8.0), REAL_CONST(39634.098612625923/8.0), REAL_CONST(39652.912638988993/8.0), REAL_CONST(39671.728897278823/8.0), REAL_CONST(39690.547386966064/8.0), REAL_CONST(39709.368107521652/8.0), REAL_CONST(39728.191058416858/8.0), REAL_CONST(39747.016239123259/8.0), REAL_CONST(39765.84364911275/8.0), REAL_CONST(39784.673287857528/8.0), REAL_CONST(39803.505154830105/8.0), REAL_CONST(39822.339249503319/8.0), REAL_CONST(39841.175571350293/8.0), REAL_CONST(39860.014119844491/8.0), REAL_CONST(39878.854894459677/8.0), REAL_CONST(39897.697894669909/8.0), REAL_CONST(39916.54311994958/8.0), REAL_CONST(39935.390569773372/8.0), REAL_CONST(39954.240243616303/8.0), REAL_CONST(39973.092140953675/8.0), REAL_CONST(39991.946261261117/8.0), REAL_CONST(40010.802604014549/8.0), REAL_CONST(40029.661168690225/8.0), REAL_CONST(40048.521954764678/8.0), REAL_CONST(40067.384961714779/8.0), REAL_CONST(40086.250189017679/8.0), REAL_CONST(40105.117636150855/8.0), REAL_CONST(40123.98730259209/8.0), REAL_CONST(40142.859187819471/8.0), REAL_CONST(40161.733291311379/8.0), REAL_CONST(40180.609612546526/8.0), REAL_CONST(40199.488151003912/8.0), REAL_CONST(40218.368906162854/8.0), REAL_CONST(40237.25187750296/8.0), REAL_CONST(40256.137064504153/8.0), REAL_CONST(40275.024466646668/8.0), REAL_CONST(40293.914083411029/8.0), REAL_CONST(40312.805914278084/8.0), REAL_CONST(40331.699958728961/8.0), REAL_CONST(40350.596216245103/8.0), REAL_CONST(40369.494686308273/8.0), REAL_CONST(40388.39536840051/8.0), REAL_CONST(40407.298262004173/8.0), REAL_CONST(40426.20336660192/8.0), REAL_CONST(40445.110681676706/8.0), REAL_CONST(40464.020206711793/8.0), REAL_CONST(40482.931941190756/8.0), REAL_CONST(40501.845884597446/8.0), REAL_CONST(40520.762036416032/8.0), REAL_CONST(40539.680396130985/8.0), REAL_CONST(40558.600963227072/8.0), REAL_CONST(40577.523737189367/8.0), REAL_CONST(40596.448717503234/8.0), REAL_CONST(40615.375903654342/8.0), REAL_CONST(40634.305295128659/8.0), REAL_CONST(40653.236891412453/8.0), REAL_CONST(40672.170691992294/8.0), REAL_CONST(40691.106696355047/8.0), REAL_CONST(40710.044903987873/8.0), REAL_CONST(40728.985314378238/8.0), REAL_CONST(40747.927927013901/8.0), REAL_CONST(40766.872741382918/8.0), REAL_CONST(40785.819756973651/8.0), REAL_CONST(40804.768973274746/8.0), REAL_CONST(40823.720389775161/8.0), REAL_CONST(40842.674005964131/8.0), REAL_CONST(40861.629821331211/8.0), REAL_CONST(40880.587835366234/8.0), REAL_CONST(40899.548047559321/8.0), REAL_CONST(40918.510457400931/8.0), REAL_CONST(40937.475064381761/8.0), REAL_CONST(40956.441867992849/8.0), REAL_CONST(40975.410867725499/8.0), REAL_CONST(40994.382063071331/8.0), REAL_CONST(41013.355453522236/8.0), REAL_CONST(41032.331038570417/8.0), REAL_CONST(41051.308817708363/8.0), REAL_CONST(41070.288790428858/8.0), REAL_CONST(41089.270956224987/8.0), REAL_CONST(41108.255314590111/8.0), REAL_CONST(41127.241865017888/8.0), REAL_CONST(41146.23060700229/8.0), REAL_CONST(41165.221540037543/8.0), REAL_CONST(41184.214663618193/8.0), REAL_CONST(41203.209977239079/8.0), REAL_CONST(41222.207480395307/8.0), REAL_CONST(41241.207172582297/8.0), REAL_CONST(41260.209053295752/8.0), REAL_CONST(41279.213122031659/8.0), REAL_CONST(41298.219378286303/8.0), REAL_CONST(41317.227821556255/8.0), REAL_CONST(41336.23845133838/8.0), REAL_CONST(41355.251267129832/8.0), REAL_CONST(41374.266268428037/8.0), REAL_CONST(41393.283454730743/8.0), REAL_CONST(41412.302825535953/8.0), REAL_CONST(41431.324380341983/8.0), REAL_CONST(41450.348118647416/8.0), REAL_CONST(41469.374039951144/8.0), REAL_CONST(41488.402143752326/8.0), REAL_CONST(41507.432429550427/8.0), REAL_CONST(41526.464896845187/8.0), REAL_CONST(41545.499545136627/8.0), REAL_CONST(41564.536373925075/8.0), REAL_CONST(41583.575382711126/8.0), REAL_CONST(41602.616570995662/8.0), REAL_CONST(41621.659938279874/8.0), REAL_CONST(41640.705484065205/8.0), REAL_CONST(41659.753207853406/8.0), REAL_CONST(41678.803109146495/8.0), REAL_CONST(41697.855187446803/8.0), REAL_CONST(41716.909442256911/8.0), REAL_CONST(41735.965873079709/8.0), REAL_CONST(41755.02447941836/8.0), REAL_CONST(41774.085260776315/8.0), REAL_CONST(41793.148216657297/8.0), REAL_CONST(41812.213346565331/8.0), REAL_CONST(41831.280650004708/8.0), REAL_CONST(41850.350126480014/8.0), REAL_CONST(41869.421775496106/8.0), REAL_CONST(41888.495596558132/8.0), REAL_CONST(41907.571589171515/8.0), REAL_CONST(41926.649752841957/8.0), REAL_CONST(41945.730087075463/8.0), REAL_CONST(41964.812591378286/8.0), REAL_CONST(41983.897265256979/8.0), REAL_CONST(42002.984108218378/8.0), REAL_CONST(42022.073119769593/8.0), REAL_CONST(42041.164299418015/8.0), REAL_CONST(42060.257646671307/8.0), REAL_CONST(42079.353161037419/8.0), REAL_CONST(42098.450842024591/8.0), REAL_CONST(42117.550689141324/8.0), REAL_CONST(42136.652701896404/8.0), REAL_CONST(42155.756879798893/8.0), REAL_CONST(42174.863222358137/8.0), REAL_CONST(42193.971729083758/8.0), REAL_CONST(42213.082399485655/8.0), REAL_CONST(42232.195233074002/8.0), REAL_CONST(42251.310229359246/8.0), REAL_CONST(42270.427387852127/8.0), REAL_CONST(42289.546708063644/8.0), REAL_CONST(42308.668189505079/8.0), REAL_CONST(42327.791831687995/8.0), REAL_CONST(42346.917634124227/8.0), REAL_CONST(42366.045596325886/8.0), REAL_CONST(42385.175717805352/8.0), REAL_CONST(42404.307998075295/8.0), REAL_CONST(42423.442436648642/8.0), REAL_CONST(42442.579033038608/8.0), REAL_CONST(42461.717786758672/8.0), REAL_CONST(42480.858697322597/8.0), REAL_CONST(42500.001764244422/8.0), REAL_CONST(42519.146987038446/8.0), REAL_CONST(42538.294365219248/8.0), REAL_CONST(42557.443898301688/8.0), REAL_CONST(42576.595585800882/8.0), REAL_CONST(42595.749427232236/8.0), REAL_CONST(42614.90542211142/8.0), REAL_CONST(42634.063569954378/8.0), REAL_CONST(42653.223870277317/8.0), REAL_CONST(42672.386322596729/8.0), REAL_CONST(42691.55092642938/8.0), REAL_CONST(42710.717681292292/8.0), REAL_CONST(42729.886586702756/8.0), REAL_CONST(42749.057642178363/8.0), REAL_CONST(42768.23084723694/8.0), REAL_CONST(42787.406201396603/8.0), REAL_CONST(42806.58370417574/8.0), REAL_CONST(42825.76335509299/8.0), REAL_CONST(42844.945153667286/8.0), REAL_CONST(42864.129099417805/8.0), REAL_CONST(42883.315191864014/8.0), REAL_CONST(42902.503430525649/8.0), REAL_CONST(42921.693814922692/8.0), REAL_CONST(42940.88634457541/8.0), REAL_CONST(42960.081019004348/8.0), REAL_CONST(42979.277837730297/8.0), REAL_CONST(42998.476800274322/8.0), REAL_CONST(43017.677906157769/8.0), REAL_CONST(43036.881154902228/8.0), REAL_CONST(43056.086546029583/8.0), REAL_CONST(43075.294079061961/8.0), REAL_CONST(43094.503753521763/8.0), REAL_CONST(43113.715568931671/8.0), REAL_CONST(43132.929524814601/8.0), REAL_CONST(43152.145620693766/8.0), REAL_CONST(43171.363856092619/8.0), REAL_CONST(43190.584230534907/8.0), REAL_CONST(43209.806743544621/8.0), REAL_CONST(43229.031394646016/8.0), REAL_CONST(43248.258183363621/8.0), REAL_CONST(43267.487109222224/8.0), REAL_CONST(43286.718171746885/8.0), REAL_CONST(43305.951370462906/8.0), REAL_CONST(43325.186704895881/8.0), REAL_CONST(43344.42417457165/8.0), REAL_CONST(43363.663779016322/8.0), REAL_CONST(43382.905517756262/8.0), REAL_CONST(43402.149390318104/8.0), REAL_CONST(43421.395396228749/8.0), REAL_CONST(43440.643535015348/8.0), REAL_CONST(43459.89380620532/8.0), REAL_CONST(43479.146209326354/8.0), REAL_CONST(43498.400743906379/8.0), REAL_CONST(43517.657409473606/8.0), REAL_CONST(43536.916205556496/8.0), REAL_CONST(43556.177131683784/8.0), REAL_CONST(43575.44018738444/8.0), REAL_CONST(43594.705372187724/8.0), REAL_CONST(43613.972685623135/8.0), REAL_CONST(43633.242127220445/8.0), REAL_CONST(43652.513696509668/8.0), REAL_CONST(43671.787393021099/8.0), REAL_CONST(43691.063216285271/8.0), REAL_CONST(43710.341165833001/8.0), REAL_CONST(43729.621241195346/8.0), REAL_CONST(43748.903441903625/8.0), REAL_CONST(43768.187767489413/8.0), REAL_CONST(43787.474217484552/8.0), REAL_CONST(43806.762791421126/8.0), REAL_CONST(43826.053488831501/8.0), REAL_CONST(43845.346309248278/8.0), REAL_CONST(43864.641252204325/8.0), REAL_CONST(43883.938317232765/8.0), REAL_CONST(43903.237503866971/8.0), REAL_CONST(43922.538811640596/8.0), REAL_CONST(43941.842240087513/8.0), REAL_CONST(43961.147788741881/8.0), REAL_CONST(43980.455457138101/8.0), REAL_CONST(43999.765244810835/8.0), REAL_CONST(44019.077151295001/8.0), REAL_CONST(44038.391176125755/8.0), REAL_CONST(44057.70731883854/8.0), REAL_CONST(44077.02557896902/8.0), REAL_CONST(44096.345956053141/8.0), REAL_CONST(44115.668449627083/8.0), REAL_CONST(44134.993059227287/8.0), REAL_CONST(44154.319784390456/8.0), REAL_CONST(44173.648624653535/8.0), REAL_CONST(44192.979579553728/8.0), REAL_CONST(44212.312648628489/8.0), REAL_CONST(44231.647831415532/8.0), REAL_CONST(44250.985127452805/8.0), REAL_CONST(44270.324536278538/8.0), REAL_CONST(44289.666057431183/8.0), REAL_CONST(44309.009690449464/8.0), REAL_CONST(44328.355434872348/8.0), REAL_CONST(44347.703290239064/8.0), REAL_CONST(44367.053256089079/8.0), REAL_CONST(44386.405331962109/8.0), REAL_CONST(44405.759517398139/8.0), REAL_CONST(44425.115811937387/8.0), REAL_CONST(44444.474215120332/8.0), REAL_CONST(44463.834726487694/8.0), REAL_CONST(44483.197345580462/8.0), REAL_CONST(44502.562071939843/8.0), REAL_CONST(44521.928905107328/8.0), REAL_CONST(44541.297844624634/8.0), REAL_CONST(44560.668890033732/8.0), REAL_CONST(44580.042040876848/8.0), REAL_CONST(44599.417296696454/8.0), REAL_CONST(44618.794657035272/8.0), REAL_CONST(44638.174121436256/8.0), REAL_CONST(44657.555689442641/8.0), REAL_CONST(44676.939360597877/8.0), REAL_CONST(44696.325134445673/8.0), REAL_CONST(44715.713010530002/8.0), REAL_CONST(44735.102988395054/8.0), REAL_CONST(44754.495067585296/8.0), REAL_CONST(44773.88924764542/8.0), REAL_CONST(44793.285528120374/8.0), REAL_CONST(44812.683908555344/8.0), REAL_CONST(44832.084388495779/8.0), REAL_CONST(44851.486967487363/8.0), REAL_CONST(44870.891645076015/8.0), REAL_CONST(44890.298420807922/8.0), REAL_CONST(44909.707294229491/8.0), REAL_CONST(44929.118264887409/8.0), REAL_CONST(44948.531332328566/8.0), REAL_CONST(44967.946496100136/8.0), REAL_CONST(44987.363755749502/8.0), REAL_CONST(45006.783110824319/8.0), REAL_CONST(45026.204560872473/8.0), REAL_CONST(45045.628105442098/8.0), REAL_CONST(45065.053744081561/8.0), REAL_CONST(45084.48147633949/8.0), REAL_CONST(45103.911301764747/8.0), REAL_CONST(45123.343219906426/8.0), REAL_CONST(45142.777230313885/8.0), REAL_CONST(45162.21333253671/8.0), REAL_CONST(45181.651526124733/8.0), REAL_CONST(45201.091810628037/8.0), REAL_CONST(45220.534185596924/8.0), REAL_CONST(45239.978650581965/8.0), REAL_CONST(45259.425205133957/8.0), REAL_CONST(45278.873848803938/8.0), REAL_CONST(45298.324581143192/8.0), REAL_CONST(45317.777401703235/8.0), REAL_CONST(45337.232310035848/8.0), REAL_CONST(45356.68930569302/8.0), REAL_CONST(45376.148388226997/8.0), REAL_CONST(45395.60955719027/8.0), REAL_CONST(45415.072812135557/8.0), REAL_CONST(45434.538152615823/8.0), REAL_CONST(45454.005578184282/8.0), REAL_CONST(45473.475088394356/8.0), REAL_CONST(45492.946682799746/8.0), REAL_CONST(45512.420360954362/8.0), REAL_CONST(45531.896122412363/8.0), REAL_CONST(45551.373966728155/8.0), REAL_CONST(45570.853893456362/8.0), REAL_CONST(45590.33590215187/8.0), REAL_CONST(45609.819992369776/8.0), REAL_CONST(45629.306163665438/8.0), REAL_CONST(45648.794415594442/8.0), REAL_CONST(45668.284747712612/8.0), REAL_CONST(45687.777159576006/8.0), REAL_CONST(45707.27165074092/8.0), REAL_CONST(45726.768220763894/8.0), REAL_CONST(45746.266869201696/8.0), REAL_CONST(45765.767595611323/8.0), REAL_CONST(45785.270399550034/8.0), REAL_CONST(45804.775280575297/8.0), REAL_CONST(45824.282238244828/8.0), REAL_CONST(45843.79127211657/8.0), REAL_CONST(45863.302381748719/8.0), REAL_CONST(45882.815566699683/8.0), REAL_CONST(45902.33082652813/8.0), REAL_CONST(45921.848160792935/8.0), REAL_CONST(45941.367569053225/8.0), REAL_CONST(45960.889050868354/8.0), REAL_CONST(45980.41260579793/8.0), REAL_CONST(45999.938233401757/8.0), REAL_CONST(46019.465933239902/8.0), REAL_CONST(46038.995704872657/8.0), REAL_CONST(46058.527547860547/8.0), REAL_CONST(46078.06146176433/8.0), REAL_CONST(46097.597446144995/8.0), REAL_CONST(46117.135500563774/8.0), REAL_CONST(46136.675624582109/8.0), REAL_CONST(46156.217817761702/8.0), REAL_CONST(46175.762079664462/8.0), REAL_CONST(46195.308409852543/8.0), REAL_CONST(46214.856807888333/8.0), REAL_CONST(46234.407273334444/8.0), REAL_CONST(46253.959805753715/8.0), REAL_CONST(46273.51440470924/8.0), REAL_CONST(46293.071069764315/8.0), REAL_CONST(46312.629800482478/8.0), REAL_CONST(46332.190596427499/8.0), REAL_CONST(46351.753457163381/8.0), REAL_CONST(46371.318382254351/8.0), REAL_CONST(46390.885371264863/8.0), REAL_CONST(46410.45442375962/8.0), REAL_CONST(46430.025539303526/8.0), REAL_CONST(46449.598717461733/8.0), REAL_CONST(46469.17395779962/8.0), REAL_CONST(46488.751259882782/8.0), REAL_CONST(46508.33062327707/8.0), REAL_CONST(46527.912047548532/8.0), REAL_CONST(46547.495532263471/8.0), REAL_CONST(46567.081076988397/8.0), REAL_CONST(46586.668681290059/8.0), REAL_CONST(46606.258344735434/8.0), REAL_CONST(46625.850066891719/8.0), REAL_CONST(46645.443847326351/8.0), REAL_CONST(46665.039685606986/8.0), REAL_CONST(46684.637581301497/8.0), REAL_CONST(46704.237533978005/8.0), REAL_CONST(46723.839543204842/8.0), REAL_CONST(46743.443608550573/8.0), REAL_CONST(46763.049729583989/8.0), REAL_CONST(46782.657905874104/8.0), REAL_CONST(46802.268136990162/8.0), REAL_CONST(46821.880422501628/8.0), REAL_CONST(46841.494761978196/8.0), REAL_CONST(46861.111154989776/8.0), REAL_CONST(46880.729601106526/8.0), REAL_CONST(46900.350099898795/8.0), REAL_CONST(46919.97265093719/8.0), REAL_CONST(46939.597253792526/8.0), REAL_CONST(46959.223908035841/8.0), REAL_CONST(46978.852613238392/8.0), REAL_CONST(46998.483368971691/8.0), REAL_CONST(47018.11617480743/8.0), REAL_CONST(47037.751030317551/8.0), REAL_CONST(47057.387935074221/8.0), REAL_CONST(47077.026888649809/8.0), REAL_CONST(47096.66789061694/8.0), REAL_CONST(47116.310940548428/8.0), REAL_CONST(47135.956038017328/8.0), REAL_CONST(47155.603182596918/8.0), REAL_CONST(47175.252373860698/8.0), REAL_CONST(47194.903611382375/8.0), REAL_CONST(47214.556894735892/8.0), REAL_CONST(47234.212223495422/8.0), REAL_CONST(47253.869597235338/8.0), REAL_CONST(47273.52901553025/8.0), REAL_CONST(47293.19047795498/8.0), REAL_CONST(47312.853984084577/8.0), REAL_CONST(47332.519533494306/8.0), REAL_CONST(47352.187125759658/8.0), REAL_CONST(47371.856760456343/8.0), REAL_CONST(47391.528437160297/8.0), REAL_CONST(47411.202155447652/8.0), REAL_CONST(47430.877914894787/8.0), REAL_CONST(47450.555715078299/8.0), REAL_CONST(47470.235555574982/8.0), REAL_CONST(47489.917435961863/8.0), REAL_CONST(47509.601355816201/8.0), REAL_CONST(47529.287314715453/8.0), REAL_CONST(47548.975312237308/8.0), REAL_CONST(47568.665347959672/8.0), REAL_CONST(47588.357421460656/8.0), REAL_CONST(47608.051532318605/8.0), REAL_CONST(47627.747680112072/8.0), REAL_CONST(47647.445864419846/8.0), REAL_CONST(47667.14608482091/8.0), REAL_CONST(47686.848340894474/8.0), REAL_CONST(47706.552632219973/8.0), REAL_CONST(47726.258958377046/8.0), REAL_CONST(47745.967318945557/8.0), REAL_CONST(47765.677713505589/8.0), REAL_CONST(47785.390141637428/8.0), REAL_CONST(47805.104602921601/8.0), REAL_CONST(47824.821096938824/8.0), REAL_CONST(47844.539623270044/8.0), REAL_CONST(47864.260181496429/8.0), REAL_CONST(47883.982771199349/8.0), REAL_CONST(47903.707391960394/8.0), REAL_CONST(47923.434043361369/8.0), REAL_CONST(47943.162724984308/8.0), REAL_CONST(47962.893436411439/8.0), REAL_CONST(47982.626177225218/8.0), REAL_CONST(48002.36094700831/8.0), REAL_CONST(48022.097745343599/8.0), REAL_CONST(48041.836571814172/8.0), REAL_CONST(48061.57742600335/8.0), REAL_CONST(48081.32030749465/8.0), REAL_CONST(48101.065215871815/8.0), REAL_CONST(48120.81215071879/8.0), REAL_CONST(48140.56111161974/8.0), REAL_CONST(48160.312098159047/8.0), REAL_CONST(48180.065109921306/8.0), REAL_CONST(48199.820146491307/8.0), REAL_CONST(48219.577207454073/8.0), REAL_CONST(48239.336292394844/8.0), REAL_CONST(48259.097400899045/8.0), REAL_CONST(48278.860532552339/8.0), REAL_CONST(48298.625686940592/8.0), REAL_CONST(48318.392863649875/8.0), REAL_CONST(48338.162062266485/8.0), REAL_CONST(48357.933282376915/8.0), REAL_CONST(48377.706523567889/8.0), REAL_CONST(48397.481785426316/8.0), REAL_CONST(48417.259067539344/8.0), REAL_CONST(48437.038369494308/8.0), REAL_CONST(48456.819690878765/8.0), REAL_CONST(48476.603031280487/8.0), REAL_CONST(48496.388390287451/8.0), REAL_CONST(48516.175767487839/8.0), REAL_CONST(48535.965162470042/8.0), REAL_CONST(48555.756574822684/8.0), REAL_CONST(48575.550004134566/8.0), REAL_CONST(48595.345449994718/8.0), REAL_CONST(48615.142911992378/8.0), REAL_CONST(48634.942389716991/8.0), REAL_CONST(48654.743882758201/8.0), REAL_CONST(48674.547390705877/8.0), REAL_CONST(48694.352913150084/8.0), REAL_CONST(48714.160449681112/8.0), REAL_CONST(48733.969999889443/8.0), REAL_CONST(48753.781563365759/8.0), REAL_CONST(48773.595139700978/8.0), REAL_CONST(48793.410728486211/8.0), REAL_CONST(48813.228329312769/8.0), REAL_CONST(48833.047941772187/8.0), REAL_CONST(48852.869565456189/8.0), REAL_CONST(48872.693199956717/8.0), REAL_CONST(48892.518844865925/8.0), REAL_CONST(48912.346499776155/8.0), REAL_CONST(48932.176164279976/8.0), REAL_CONST(48952.007837970152/8.0), REAL_CONST(48971.841520439666/8.0), REAL_CONST(48991.677211281676/8.0), REAL_CONST(49011.514910089587/8.0), REAL_CONST(49031.354616456978/8.0), REAL_CONST(49051.196329977654/8.0), REAL_CONST(49071.04005024561/8.0), REAL_CONST(49090.885776855059/8.0), REAL_CONST(49110.733509400408/8.0), REAL_CONST(49130.583247476279/8.0), REAL_CONST(49150.434990677488/8.0), REAL_CONST(49170.288738599062/8.0), REAL_CONST(49190.144490836232/8.0), REAL_CONST(49210.002246984441/8.0), REAL_CONST(49229.86200663932/8.0), REAL_CONST(49249.723769396718/8.0), REAL_CONST(49269.587534852675/8.0), REAL_CONST(49289.453302603448/8.0), REAL_CONST(49309.32107224549/8.0), REAL_CONST(49329.190843375451/8.0), REAL_CONST(49349.062615590192/8.0), REAL_CONST(49368.936388486785/8.0), REAL_CONST(49388.812161662492/8.0), REAL_CONST(49408.689934714785/8.0), REAL_CONST(49428.569707241324/8.0), REAL_CONST(49448.45147883999/8.0), REAL_CONST(49468.335249108866/8.0), REAL_CONST(49488.22101764621/8.0), REAL_CONST(49508.108784050521/8.0), REAL_CONST(49527.99854792047/8.0), REAL_CONST(49547.890308854934/8.0), REAL_CONST(49567.784066453009/8.0), REAL_CONST(49587.679820313977/8.0), REAL_CONST(49607.57757003732/8.0), REAL_CONST(49627.477315222721/8.0), REAL_CONST(49647.379055470075/8.0), REAL_CONST(49667.28279037946/8.0), REAL_CONST(49687.188519551179/8.0), REAL_CONST(49707.096242585707/8.0), REAL_CONST(49727.005959083741/8.0), REAL_CONST(49746.917668646165/8.0), REAL_CONST(49766.831370874068/8.0), REAL_CONST(49786.747065368734/8.0), REAL_CONST(49806.66475173166/8.0), REAL_CONST(49826.584429564515/8.0), REAL_CONST(49846.506098469203/8.0), REAL_CONST(49866.429758047794/8.0), REAL_CONST(49886.355407902578/8.0), REAL_CONST(49906.283047636032/8.0), REAL_CONST(49926.212676850846/8.0), REAL_CONST(49946.144295149883/8.0), REAL_CONST(49966.077902136225/8.0), REAL_CONST(49986.013497413151/8.0), REAL_CONST(50005.951080584135/8.0), REAL_CONST(50025.890651252834/8.0), REAL_CONST(50045.832209023123/8.0), REAL_CONST(50065.775753499074/8.0), REAL_CONST(50085.721284284933/8.0), REAL_CONST(50105.668800985164/8.0), REAL_CONST(50125.618303204428/8.0), REAL_CONST(50145.569790547575/8.0), REAL_CONST(50165.523262619652/8.0), REAL_CONST(50185.478719025901/8.0), REAL_CONST(50205.436159371769/8.0), REAL_CONST(50225.395583262893/8.0), REAL_CONST(50245.356990305103/8.0), REAL_CONST(50265.320380104429/8.0), REAL_CONST(50285.285752267104/8.0), REAL_CONST(50305.253106399534/8.0), REAL_CONST(50325.222442108337/8.0), REAL_CONST(50345.193759000336/8.0), REAL_CONST(50365.16705668252/8.0), REAL_CONST(50385.142334762102/8.0), REAL_CONST(50405.119592846473/8.0), REAL_CONST(50425.098830543218/8.0), REAL_CONST(50445.080047460127/8.0), REAL_CONST(50465.063243205179/8.0), REAL_CONST(50485.048417386541/8.0), REAL_CONST(50505.035569612577/8.0), REAL_CONST(50525.024699491856/8.0), REAL_CONST(50545.015806633128/8.0), REAL_CONST(50565.008890645338/8.0), REAL_CONST(50585.003951137631/8.0), REAL_CONST(50605.00098771933/8.0), REAL_CONST(50624.999999999971/8.0), REAL_CONST(50645.000987589265/8.0), REAL_CONST(50665.003950097132/8.0), REAL_CONST(50685.008887133677/8.0), REAL_CONST(50705.015798309192/8.0), REAL_CONST(50725.024683234165/8.0), REAL_CONST(50745.035541519283/8.0), REAL_CONST(50765.048372775411/8.0), REAL_CONST(50785.063176613621/8.0), REAL_CONST(50805.079952645159/8.0), REAL_CONST(50825.098700481489/8.0), REAL_CONST(50845.119419734241/8.0), REAL_CONST(50865.142110015244/8.0), REAL_CONST(50885.166770936521/8.0), REAL_CONST(50905.193402110279/8.0), REAL_CONST(50925.222003148934/8.0), REAL_CONST(50945.252573665071/8.0), REAL_CONST(50965.285113271471/8.0), REAL_CONST(50985.319621581119/8.0), REAL_CONST(51005.356098207172/8.0), REAL_CONST(51025.394542762981/8.0), REAL_CONST(51045.434954862096/8.0), REAL_CONST(51065.477334118244/8.0), REAL_CONST(51085.521680145357/8.0), REAL_CONST(51105.567992557546/8.0), REAL_CONST(51125.616270969113/8.0), REAL_CONST(51145.66651499454/8.0), REAL_CONST(51165.718724248516/8.0), REAL_CONST(51185.772898345916/8.0), REAL_CONST(51205.829036901778/8.0), REAL_CONST(51225.887139531362/8.0), REAL_CONST(51245.947205850105/8.0), REAL_CONST(51266.009235473619/8.0), REAL_CONST(51286.073228017718/8.0), REAL_CONST(51306.139183098399/8.0), REAL_CONST(51326.207100331856/8.0), REAL_CONST(51346.276979334456/8.0), REAL_CONST(51366.348819722756/8.0), REAL_CONST(51386.42262111351/8.0), REAL_CONST(51406.498383123653/8.0), REAL_CONST(51426.57610537031/8.0), REAL_CONST(51446.655787470787/8.0), REAL_CONST(51466.737429042587/8.0), REAL_CONST(51486.82102970338/8.0), REAL_CONST(51506.906589071048/8.0), REAL_CONST(51526.994106763632/8.0), REAL_CONST(51547.083582399391/8.0), REAL_CONST(51567.175015596738/8.0), REAL_CONST(51587.268405974297/8.0), REAL_CONST(51607.363753150858/8.0), REAL_CONST(51627.461056745415/8.0), REAL_CONST(51647.56031637713/8.0), REAL_CONST(51667.661531665362/8.0), REAL_CONST(51687.764702229651/8.0), REAL_CONST(51707.869827689727/8.0), REAL_CONST(51727.976907665499/8.0), REAL_CONST(51748.085941777055/8.0), REAL_CONST(51768.196929644677/8.0), REAL_CONST(51788.309870888836/8.0), REAL_CONST(51808.42476513017/8.0), REAL_CONST(51828.541611989524/8.0), REAL_CONST(51848.660411087905/8.0), REAL_CONST(51868.781162046515/8.0), REAL_CONST(51888.90386448674/8.0), REAL_CONST(51909.028518030143/8.0), REAL_CONST(51929.155122298485/8.0), REAL_CONST(51949.283676913685/8.0), REAL_CONST(51969.414181497872/8.0), REAL_CONST(51989.546635673345/8.0), REAL_CONST(52009.681039062583/8.0), REAL_CONST(52029.817391288263/8.0), REAL_CONST(52049.955691973213/8.0), REAL_CONST(52070.095940740481/8.0), REAL_CONST(52090.238137213273/8.0), REAL_CONST(52110.382281014987/8.0), REAL_CONST(52130.5283717692/8.0), REAL_CONST(52150.676409099666/8.0), REAL_CONST(52170.826392630333/8.0), REAL_CONST(52190.97832198532/8.0), REAL_CONST(52211.132196788931/8.0), REAL_CONST(52231.288016665654/8.0), REAL_CONST(52251.445781240145/8.0), REAL_CONST(52271.60549013727/8.0), REAL_CONST(52291.76714298204/8.0), REAL_CONST(52311.930739399664/8.0), REAL_CONST(52332.096279015546/8.0), REAL_CONST(52352.263761455244/8.0), REAL_CONST(52372.433186344519/8.0), REAL_CONST(52392.604553309284/8.0), REAL_CONST(52412.777861975665/8.0), REAL_CONST(52432.953111969946/8.0), REAL_CONST(52453.130302918595/8.0), REAL_CONST(52473.309434448267/8.0), REAL_CONST(52493.490506185793/8.0), REAL_CONST(52513.67351775818/8.0), REAL_CONST(52533.858468792605/8.0), REAL_CONST(52554.045358916446/8.0), REAL_CONST(52574.234187757254/8.0), REAL_CONST(52594.42495494274/8.0), REAL_CONST(52614.617660100812/8.0), REAL_CONST(52634.812302859558/8.0), REAL_CONST(52655.008882847229/8.0), REAL_CONST(52675.20739969227/8.0), REAL_CONST(52695.407853023295/8.0), REAL_CONST(52715.610242469098/8.0), REAL_CONST(52735.814567658657/8.0), REAL_CONST(52756.02082822111/8.0), REAL_CONST(52776.229023785803/8.0), REAL_CONST(52796.439153982225/8.0), REAL_CONST(52816.651218440056/8.0), REAL_CONST(52836.865216789171/8.0), REAL_CONST(52857.081148659599/8.0), REAL_CONST(52877.29901368155/8.0), REAL_CONST(52897.518811485425/8.0), REAL_CONST(52917.740541701773/8.0), REAL_CONST(52937.964203961354/8.0), REAL_CONST(52958.18979789508/8.0), REAL_CONST(52978.417323134046/8.0), REAL_CONST(52998.646779309529/8.0), REAL_CONST(53018.878166052978/8.0), REAL_CONST(53039.111482996006/8.0), REAL_CONST(53059.346729770419/8.0), REAL_CONST(53079.583906008193/8.0), REAL_CONST(53099.823011341483/8.0), REAL_CONST(53120.0640454026/8.0), REAL_CONST(53140.307007824063/8.0), REAL_CONST(53160.551898238533/8.0), REAL_CONST(53180.79871627887/8.0), REAL_CONST(53201.047461578091/8.0), REAL_CONST(53221.2981337694/8.0), REAL_CONST(53241.550732486176/8.0), REAL_CONST(53261.805257361964/8.0), REAL_CONST(53282.061708030487/8.0), REAL_CONST(53302.32008412564/8.0), REAL_CONST(53322.580385281493/8.0), REAL_CONST(53342.842611132299/8.0), REAL_CONST(53363.106761312469/8.0), REAL_CONST(53383.372835456597/8.0), REAL_CONST(53403.640833199453/8.0), REAL_CONST(53423.910754175973/8.0), REAL_CONST(53444.18259802126/8.0), REAL_CONST(53464.456364370613/8.0), REAL_CONST(53484.732052859479/8.0), REAL_CONST(53505.009663123499/8.0), REAL_CONST(53525.289194798468/8.0), REAL_CONST(53545.570647520362/8.0), REAL_CONST(53565.854020925333/8.0), REAL_CONST(53586.139314649699/8.0), REAL_CONST(53606.426528329954/8.0), REAL_CONST(53626.715661602764/8.0), REAL_CONST(53647.006714104959/8.0), REAL_CONST(53667.299685473547/8.0), REAL_CONST(53687.59457534572/8.0), REAL_CONST(53707.891383358816/8.0), REAL_CONST(53728.190109150361/8.0), REAL_CONST(53748.490752358055/8.0), REAL_CONST(53768.793312619753/8.0), REAL_CONST(53789.09778957349/8.0), REAL_CONST(53809.404182857485/8.0), REAL_CONST(53829.712492110106/8.0), REAL_CONST(53850.022716969899/8.0), REAL_CONST(53870.334857075584/8.0), REAL_CONST(53890.648912066055/8.0), REAL_CONST(53910.964881580367/8.0), REAL_CONST(53931.28276525774/8.0), REAL_CONST(53951.602562737586/8.0), REAL_CONST(53971.924273659461/8.0), REAL_CONST(53992.24789766311/8.0), REAL_CONST(54012.57343438844/8.0), REAL_CONST(54032.90088347553/8.0), REAL_CONST(54053.23024456462/8.0), REAL_CONST(54073.561517296133/8.0), REAL_CONST(54093.894701310644/8.0), REAL_CONST(54114.22979624891/8.0), REAL_CONST(54134.566801751855/8.0), REAL_CONST(54154.90571746057/8.0), REAL_CONST(54175.246543016314/8.0), REAL_CONST(54195.589278060506/8.0), REAL_CONST(54215.933922234755/8.0), REAL_CONST(54236.280475180814/8.0), REAL_CONST(54256.628936540626/8.0), REAL_CONST(54276.97930595628/8.0), REAL_CONST(54297.331583070045/8.0), REAL_CONST(54317.685767524359/8.0), REAL_CONST(54338.041858961828/8.0), REAL_CONST(54358.399857025215/8.0), REAL_CONST(54378.759761357462/8.0), REAL_CONST(54399.121571601667/8.0), REAL_CONST(54419.485287401105/8.0), REAL_CONST(54439.850908399218/8.0), REAL_CONST(54460.218434239614/8.0), REAL_CONST(54480.587864566056/8.0), REAL_CONST(54500.95919902248/8.0), REAL_CONST(54521.332437252997/8.0), REAL_CONST(54541.707578901878/8.0), REAL_CONST(54562.084623613555/8.0), REAL_CONST(54582.46357103264/8.0), REAL_CONST(54602.844420803893/8.0), REAL_CONST(54623.227172572246/8.0), REAL_CONST(54643.611825982807/8.0), REAL_CONST(54663.998380680838/8.0), REAL_CONST(54684.386836311773/8.0), REAL_CONST(54704.777192521207/8.0), REAL_CONST(54725.169448954897/8.0), REAL_CONST(54745.563605258772/8.0), REAL_CONST(54765.959661078923/8.0), REAL_CONST(54786.357616061614/8.0), REAL_CONST(54806.757469853255/8.0), REAL_CONST(54827.159222100439/8.0), REAL_CONST(54847.562872449904/8.0), REAL_CONST(54867.968420548583/8.0), REAL_CONST(54888.375866043534/8.0), REAL_CONST(54908.785208582012/8.0), REAL_CONST(54929.196447811417/8.0), REAL_CONST(54949.609583379322/8.0), REAL_CONST(54970.024614933463/8.0), REAL_CONST(54990.441542121727/8.0), REAL_CONST(55010.86036459219/8.0), REAL_CONST(55031.28108199306/8.0), REAL_CONST(55051.703693972733/8.0), REAL_CONST(55072.128200179759/8.0), REAL_CONST(55092.554600262847/8.0), REAL_CONST(55112.982893870874/8.0), REAL_CONST(55133.413080652877/8.0), REAL_CONST(55153.845160258061/8.0), REAL_CONST(55174.279132335789/8.0), REAL_CONST(55194.714996535586/8.0), REAL_CONST(55215.152752507143/8.0), REAL_CONST(55235.592399900306/8.0), REAL_CONST(55256.033938365079/8.0), REAL_CONST(55276.477367551655/8.0), REAL_CONST(55296.92268711036/8.0), REAL_CONST(55317.369896691685/8.0), REAL_CONST(55337.818995946305/8.0), REAL_CONST(55358.269984525024/8.0), REAL_CONST(55378.72286207883/8.0), REAL_CONST(55399.177628258869/8.0), REAL_CONST(55419.634282716441/8.0), REAL_CONST(55440.092825103013/8.0), REAL_CONST(55460.553255070205/8.0), REAL_CONST(55481.015572269804/8.0), REAL_CONST(55501.479776353764/8.0), REAL_CONST(55521.945866974187/8.0), REAL_CONST(55542.413843783339/8.0), REAL_CONST(55562.883706433655/8.0), REAL_CONST(55583.355454577715/8.0), REAL_CONST(55603.82908786826/8.0), REAL_CONST(55624.304605958219/8.0), REAL_CONST(55644.782008500639/8.0), REAL_CONST(55665.261295148754/8.0), REAL_CONST(55685.742465555952/8.0), REAL_CONST(55706.225519375774/8.0), REAL_CONST(55726.710456261928/8.0), REAL_CONST(55747.197275868275/8.0), REAL_CONST(55767.685977848843/8.0), REAL_CONST(55788.176561857814/8.0), REAL_CONST(55808.669027549528/8.0), REAL_CONST(55829.163374578478/8.0), REAL_CONST(55849.659602599328/8.0), REAL_CONST(55870.157711266889/8.0), REAL_CONST(55890.657700236145/8.0), REAL_CONST(55911.159569162221/8.0), REAL_CONST(55931.663317700411/8.0), REAL_CONST(55952.168945506164/8.0), REAL_CONST(55972.676452235086/8.0), REAL_CONST(55993.185837542944/8.0), REAL_CONST(56013.697101085651/8.0), REAL_CONST(56034.210242519301/8.0), REAL_CONST(56054.72526150012/8.0), REAL_CONST(56075.242157684508/8.0), REAL_CONST(56095.760930729011/8.0), REAL_CONST(56116.281580290342/8.0), REAL_CONST(56136.804106025367/8.0), REAL_CONST(56157.328507591104/8.0), REAL_CONST(56177.85478464474/8.0), REAL_CONST(56198.382936843598/8.0), REAL_CONST(56218.912963845185/8.0), REAL_CONST(56239.444865307138/8.0), REAL_CONST(56259.978640887268/8.0), REAL_CONST(56280.514290243525/8.0), REAL_CONST(56301.051813034042/8.0), REAL_CONST(56321.591208917082/8.0), REAL_CONST(56342.13247755108/8.0), REAL_CONST(56362.675618594607/8.0), REAL_CONST(56383.220631706419/8.0), REAL_CONST(56403.767516545398/8.0), REAL_CONST(56424.316272770608/8.0), REAL_CONST(56444.866900041241/8.0), REAL_CONST(56465.419398016667/8.0), REAL_CONST(56485.973766356394/8.0), REAL_CONST(56506.530004720102/8.0), REAL_CONST(56527.088112767611/8.0), REAL_CONST(56547.648090158902/8.0), REAL_CONST(56568.209936554107/8.0), REAL_CONST(56588.773651613519/8.0), REAL_CONST(56609.339234997584/8.0), REAL_CONST(56629.9066863669/8.0), REAL_CONST(56650.47600538221/8.0), REAL_CONST(56671.04719170442/8.0), REAL_CONST(56691.620244994599/8.0), REAL_CONST(56712.195164913959/8.0), REAL_CONST(56732.771951123868/8.0), REAL_CONST(56753.350603285835/8.0), REAL_CONST(56773.931121061541/8.0), REAL_CONST(56794.513504112823/8.0), REAL_CONST(56815.097752101647/8.0), REAL_CONST(56835.683864690152/8.0), REAL_CONST(56856.271841540627/8.0), REAL_CONST(56876.86168231551/8.0), REAL_CONST(56897.453386677393/8.0), REAL_CONST(56918.046954289028/8.0), REAL_CONST(56938.642384813298/8.0), REAL_CONST(56959.239677913261/8.0), REAL_CONST(56979.838833252121/8.0), REAL_CONST(57000.439850493225/8.0), REAL_CONST(57021.04272930009/8.0), REAL_CONST(57041.647469336371/8.0), REAL_CONST(57062.254070265873/8.0), REAL_CONST(57082.862531752558/8.0), REAL_CONST(57103.472853460553/8.0), REAL_CONST(57124.085035054108/8.0), REAL_CONST(57144.699076197649/8.0), REAL_CONST(57165.314976555739/8.0), REAL_CONST(57185.932735793103/8.0), REAL_CONST(57206.552353574611/8.0), REAL_CONST(57227.173829565276/8.0), REAL_CONST(57247.797163430281/8.0), REAL_CONST(57268.42235483494/8.0), REAL_CONST(57289.049403444733/8.0), REAL_CONST(57309.678308925286/8.0), REAL_CONST(57330.30907094237/8.0), REAL_CONST(57350.941689161911/8.0), REAL_CONST(57371.576163249985/8.0), REAL_CONST(57392.212492872815/8.0), REAL_CONST(57412.850677696784/8.0), REAL_CONST(57433.490717388406/8.0), REAL_CONST(57454.132611614368/8.0), REAL_CONST(57474.776360041491/8.0), REAL_CONST(57495.421962336746/8.0), REAL_CONST(57516.069418167266/8.0), REAL_CONST(57536.718727200314/8.0), REAL_CONST(57557.36988910332/8.0), REAL_CONST(57578.022903543861/8.0), REAL_CONST(57598.677770189643/8.0), REAL_CONST(57619.334488708548/8.0), REAL_CONST(57639.993058768589/8.0), REAL_CONST(57660.653480037938/8.0), REAL_CONST(57681.315752184906/8.0), REAL_CONST(57701.979874877965/8.0), REAL_CONST(57722.64584778573/8.0), REAL_CONST(57743.31367057695/8.0), REAL_CONST(57763.983342920546/8.0), REAL_CONST(57784.654864485572/8.0), REAL_CONST(57805.328234941233/8.0), REAL_CONST(57826.003453956881/8.0), REAL_CONST(57846.680521202026/8.0), REAL_CONST(57867.359436346305/8.0), REAL_CONST(57888.040199059527/8.0), REAL_CONST(57908.722809011633/8.0), REAL_CONST(57929.407265872709/8.0), REAL_CONST(57950.093569313001/8.0), REAL_CONST(57970.781719002895/8.0), REAL_CONST(57991.471714612911/8.0), REAL_CONST(58012.16355581375/8.0), REAL_CONST(58032.857242276223/8.0), REAL_CONST(58053.552773671312/8.0), REAL_CONST(58074.25014967013/8.0), REAL_CONST(58094.949369943948/8.0), REAL_CONST(58115.650434164185/8.0), REAL_CONST(58136.353342002389/8.0), REAL_CONST(58157.058093130276/8.0), REAL_CONST(58177.764687219693/8.0), REAL_CONST(58198.47312394264/8.0), REAL_CONST(58219.183402971255/8.0), REAL_CONST(58239.895523977837/8.0), REAL_CONST(58260.609486634821/8.0), REAL_CONST(58281.325290614775/8.0), REAL_CONST(58302.042935590434/8.0), REAL_CONST(58322.762421234678/8.0), REAL_CONST(58343.483747220511/8.0), REAL_CONST(58364.206913221096/8.0), REAL_CONST(58384.931918909751/8.0), REAL_CONST(58405.658763959924/8.0), REAL_CONST(58426.3874480452/8.0), REAL_CONST(58447.117970839339/8.0), REAL_CONST(58467.85033201622/8.0), REAL_CONST(58488.584531249864/8.0), REAL_CONST(58509.320568214462/8.0), REAL_CONST(58530.058442584334/8.0), REAL_CONST(58550.798154033931/8.0), REAL_CONST(58571.539702237875/8.0), REAL_CONST(58592.283086870906/8.0), REAL_CONST(58613.028307607929/8.0), REAL_CONST(58633.775364123983/8.0), REAL_CONST(58654.52425609425/8.0), REAL_CONST(58675.274983194053/8.0), REAL_CONST(58696.027545098877/8.0), REAL_CONST(58716.781941484325/8.0), REAL_CONST(58737.538172026158/8.0), REAL_CONST(58758.296236400274/8.0), REAL_CONST(58779.056134282728/8.0), REAL_CONST(58799.817865349694/8.0), REAL_CONST(58820.581429277503/8.0), REAL_CONST(58841.346825742643/8.0), REAL_CONST(58862.114054421712/8.0), REAL_CONST(58882.883114991484/8.0), REAL_CONST(58903.654007128847/8.0), REAL_CONST(58924.426730510851/8.0), REAL_CONST(58945.201284814684/8.0), REAL_CONST(58965.977669717664/8.0), REAL_CONST(58986.755884897269/8.0), REAL_CONST(59007.535930031117/8.0), REAL_CONST(59028.317804796949/8.0), REAL_CONST(59049.101508872664/8.0), REAL_CONST(59069.887041936301/8.0), REAL_CONST(59090.674403666046/8.0), REAL_CONST(59111.463593740213/8.0), REAL_CONST(59132.254611837263/8.0), REAL_CONST(59153.047457635803/8.0), REAL_CONST(59173.84213081457/8.0), REAL_CONST(59194.638631052461/8.0), REAL_CONST(59215.436958028506/8.0), REAL_CONST(59236.237111421855/8.0), REAL_CONST(59257.039090911829/8.0), REAL_CONST(59277.842896177877/8.0), REAL_CONST(59298.648526899589/8.0), REAL_CONST(59319.455982756685/8.0), REAL_CONST(59340.26526342905/8.0), REAL_CONST(59361.076368596696/8.0), REAL_CONST(59381.889297939757/8.0), REAL_CONST(59402.704051138542/8.0), REAL_CONST(59423.520627873484/8.0), REAL_CONST(59444.339027825139/8.0), REAL_CONST(59465.159250674224/8.0), REAL_CONST(59485.9812961016/8.0), REAL_CONST(59506.805163788253/8.0), REAL_CONST(59527.630853415307/8.0), REAL_CONST(59548.458364664046/8.0), REAL_CONST(59569.287697215863/8.0), REAL_CONST(59590.118850752311/8.0), REAL_CONST(59610.951824955089/8.0), REAL_CONST(59631.786619506012/8.0), REAL_CONST(59652.623234087048/8.0), REAL_CONST(59673.461668380311/8.0), REAL_CONST(59694.301922068029/8.0), REAL_CONST(59715.143994832593/8.0), REAL_CONST(59735.987886356525/8.0), REAL_CONST(59756.833596322482/8.0), REAL_CONST(59777.681124413255/8.0), REAL_CONST(59798.530470311794/8.0), REAL_CONST(59819.381633701159/8.0), REAL_CONST(59840.234614264569/8.0), REAL_CONST(59861.089411685381/8.0), REAL_CONST(59881.94602564707/8.0), REAL_CONST(59902.804455833269/8.0), REAL_CONST(59923.664701927737/8.0), REAL_CONST(59944.526763614384/8.0), REAL_CONST(59965.390640577243/8.0), REAL_CONST(59986.256332500488/8.0), REAL_CONST(60007.123839068438/8.0), REAL_CONST(60027.993159965539/8.0), REAL_CONST(60048.864294876381/8.0), REAL_CONST(60069.737243485688/8.0), REAL_CONST(60090.612005478324/8.0), REAL_CONST(60111.488580539284/8.0), REAL_CONST(60132.366968353708/8.0), REAL_CONST(60153.247168606867/8.0), REAL_CONST(60174.129180984164/8.0), REAL_CONST(60195.013005171153/8.0), REAL_CONST(60215.898640853513/8.0), REAL_CONST(60236.786087717061/8.0), REAL_CONST(60257.675345447751/8.0), REAL_CONST(60278.566413731671/8.0), REAL_CONST(60299.459292255044/8.0), REAL_CONST(60320.353980704247/8.0), REAL_CONST(60341.25047876576/8.0), REAL_CONST(60362.148786126229/8.0), REAL_CONST(60383.048902472423/8.0), REAL_CONST(60403.950827491237/8.0), REAL_CONST(60424.854560869717/8.0), REAL_CONST(60445.76010229504/8.0), REAL_CONST(60466.667451454516/8.0), REAL_CONST(60487.57660803559/8.0), REAL_CONST(60508.487571725847/8.0), REAL_CONST(60529.400342212997/8.0), REAL_CONST(60550.314919184893/8.0), REAL_CONST(60571.231302329521/8.0), REAL_CONST(60592.149491335003/8.0), REAL_CONST(60613.069485889588/8.0), REAL_CONST(60633.991285681674/8.0), REAL_CONST(60654.914890399785/8.0), REAL_CONST(60675.840299732568/8.0), REAL_CONST(60696.767513368832/8.0), REAL_CONST(60717.696530997484/8.0), REAL_CONST(60738.627352307602/8.0), REAL_CONST(60759.55997698837/8.0), REAL_CONST(60780.494404729128/8.0), REAL_CONST(60801.430635219323/8.0), REAL_CONST(60822.368668148556/8.0), REAL_CONST(60843.308503206565/8.0), REAL_CONST(60864.250140083204/8.0), REAL_CONST(60885.193578468468/8.0), REAL_CONST(60906.138818052495/8.0), REAL_CONST(60927.085858525541/8.0), REAL_CONST(60948.034699578006/8.0), REAL_CONST(60968.985340900421/8.0), REAL_CONST(60989.937782183442/8.0), REAL_CONST(61010.892023117864/8.0), REAL_CONST(61031.848063394616/8.0), REAL_CONST(61052.805902704764/8.0), REAL_CONST(61073.765540739492/8.0), REAL_CONST(61094.726977190134/8.0), REAL_CONST(61115.690211748137/8.0), REAL_CONST(61136.655244105103/8.0), REAL_CONST(61157.622073952742/8.0), REAL_CONST(61178.590700982917/8.0), REAL_CONST(61199.561124887616/8.0), REAL_CONST(61220.533345358948/8.0), REAL_CONST(61241.507362089171/8.0), REAL_CONST(61262.483174770663/8.0), REAL_CONST(61283.460783095943/8.0), REAL_CONST(61304.440186757645/8.0), REAL_CONST(61325.421385448557/8.0), REAL_CONST(61346.404378861582/8.0), REAL_CONST(61367.389166689762/8.0), REAL_CONST(61388.375748626262/8.0), REAL_CONST(61409.364124364387/8.0), REAL_CONST(61430.354293597571/8.0), REAL_CONST(61451.346256019373/8.0), REAL_CONST(61472.340011323497/8.0), REAL_CONST(61493.335559203762/8.0), REAL_CONST(61514.332899354122/8.0), REAL_CONST(61535.332031468672/8.0), REAL_CONST(61556.332955241618/8.0), REAL_CONST(61577.335670367313/8.0), REAL_CONST(61598.340176540238/8.0), REAL_CONST(61619.346473454993/8.0), REAL_CONST(61640.354560806329/8.0), REAL_CONST(61661.3644382891/8.0), REAL_CONST(61682.376105598312/8.0), REAL_CONST(61703.389562429089/8.0), REAL_CONST(61724.404808476691/8.0), REAL_CONST(61745.42184343651/8.0), REAL_CONST(61766.440667004063/8.0), REAL_CONST(61787.461278874987/8.0), REAL_CONST(61808.483678745069/8.0), REAL_CONST(61829.507866310203/8.0), REAL_CONST(61850.533841266435/8.0), REAL_CONST(61871.561603309929/8.0), REAL_CONST(61892.591152136971/8.0), REAL_CONST(61913.622487443987/8.0), REAL_CONST(61934.655608927525/8.0), REAL_CONST(61955.690516284267/8.0), REAL_CONST(61976.727209211022/8.0), REAL_CONST(61997.765687404724/8.0), REAL_CONST(62018.805950562448/8.0), REAL_CONST(62039.847998381381/8.0), REAL_CONST(62060.891830558845/8.0), REAL_CONST(62081.93744679229/8.0), REAL_CONST(62102.984846779298/8.0), REAL_CONST(62124.034030217575/8.0), REAL_CONST(62145.084996804966/8.0), REAL_CONST(62166.137746239416/8.0), REAL_CONST(62187.19227821903/8.0), REAL_CONST(62208.248592442025/8.0), REAL_CONST(62229.306688606739/8.0), REAL_CONST(62250.366566411656/8.0), REAL_CONST(62271.428225555377/8.0), REAL_CONST(62292.491665736627/8.0), REAL_CONST(62313.556886654267/8.0), REAL_CONST(62334.623888007271/8.0), REAL_CONST(62355.692669494762/8.0), REAL_CONST(62376.763230815974/8.0), REAL_CONST(62397.835571670272/8.0), REAL_CONST(62418.909691757144/8.0), REAL_CONST(62439.98559077621/8.0), REAL_CONST(62461.063268427228/8.0), REAL_CONST(62482.142724410049/8.0), REAL_CONST(62503.223958424685/8.0), REAL_CONST(62524.306970171267/8.0), REAL_CONST(62545.39175935003/8.0), REAL_CONST(62566.478325661366/8.0), REAL_CONST(62587.566668805768/8.0), REAL_CONST(62608.656788483881/8.0), REAL_CONST(62629.748684396451/8.0), REAL_CONST(62650.842356244357/8.0), REAL_CONST(62671.937803728622/8.0), REAL_CONST(62693.035026550366/8.0), REAL_CONST(62714.134024410858/8.0), REAL_CONST(62735.234797011479/8.0), REAL_CONST(62756.337344053733/8.0), REAL_CONST(62777.441665239276/8.0), REAL_CONST(62798.547760269852/8.0), REAL_CONST(62819.655628847358/8.0), REAL_CONST(62840.765270673801/8.0), REAL_CONST(62861.876685451323/8.0), REAL_CONST(62882.989872882186/8.0), REAL_CONST(62904.104832668774/8.0), REAL_CONST(62925.221564513602/8.0), REAL_CONST(62946.340068119309/8.0), REAL_CONST(62967.460343188657/8.0), REAL_CONST(62988.582389424526/8.0), REAL_CONST(63009.70620652994/8.0), REAL_CONST(63030.831794208025/8.0), REAL_CONST(63051.959152162039/8.0), REAL_CONST(63073.08828009537/8.0), REAL_CONST(63094.219177711529/8.0), REAL_CONST(63115.351844714154/8.0), REAL_CONST(63136.486280806988/8.0), REAL_CONST(63157.622485693922/8.0), REAL_CONST(63178.760459078956/8.0), REAL_CONST(63199.900200666219/8.0), REAL_CONST(63221.041710159967/8.0), REAL_CONST(63242.184987264569/8.0), REAL_CONST(63263.330031684534/8.0), REAL_CONST(63284.476843124474/8.0), REAL_CONST(63305.625421289144/8.0), REAL_CONST(63326.775765883409/8.0), REAL_CONST(63347.927876612259/8.0), REAL_CONST(63369.081753180813/8.0), REAL_CONST(63390.237395294316/8.0), REAL_CONST(63411.39480265812/8.0), REAL_CONST(63432.553974977716/8.0), REAL_CONST(63453.714911958712/8.0), REAL_CONST(63474.877613306839/8.0), REAL_CONST(63496.042078727944/8.0), REAL_CONST(63517.208307927998/8.0), REAL_CONST(63538.376300613119/8.0), REAL_CONST(63559.546056489504/8.0), REAL_CONST(63580.717575263516/8.0), REAL_CONST(63601.890856641607/8.0), REAL_CONST(63623.065900330374/8.0), REAL_CONST(63644.242706036515/8.0), REAL_CONST(63665.421273466869/8.0), REAL_CONST(63686.601602328381/8.0), REAL_CONST(63707.783692328136/8.0), REAL_CONST(63728.967543173334/8.0), REAL_CONST(63750.153154571279/8.0), REAL_CONST(63771.340526229418/8.0), REAL_CONST(63792.529657855317/8.0), REAL_CONST(63813.720549156649/8.0), REAL_CONST(63834.913199841227/8.0), REAL_CONST(63856.107609616978/8.0), REAL_CONST(63877.303778191941/8.0), REAL_CONST(63898.501705274284/8.0), REAL_CONST(63919.7013905723/8.0), REAL_CONST(63940.902833794404/8.0), REAL_CONST(63962.106034649114/8.0), REAL_CONST(63983.310992845094/8.0), REAL_CONST(64004.517708091109/8.0), REAL_CONST(64025.726180096048/8.0), REAL_CONST(64046.936408568938/8.0), REAL_CONST(64068.1483932189/8.0), REAL_CONST(64089.362133755196/8.0), REAL_CONST(64110.577629887193/8.0), REAL_CONST(64131.794881324393/8.0), REAL_CONST(64153.013887776404/8.0), REAL_CONST(64174.234648952966/8.0), REAL_CONST(64195.457164563937/8.0), REAL_CONST(64216.681434319289/8.0), REAL_CONST(64237.907457929112/8.0), REAL_CONST(64259.135235103626/8.0), REAL_CONST(64280.36476555316/8.0), REAL_CONST(64301.596048988169/8.0), REAL_CONST(64322.829085119236/8.0), REAL_CONST(64344.06387365704/8.0), REAL_CONST(64365.300414312398/8.0), REAL_CONST(64386.538706796251/8.0), REAL_CONST(64407.778750819634/8.0), REAL_CONST(64429.020546093721/8.0), REAL_CONST(64450.26409232981/8.0), REAL_CONST(64471.509389239291/8.0), REAL_CONST(64492.756436533709/8.0), REAL_CONST(64514.005233924705/8.0), REAL_CONST(64535.255781124033/8.0), REAL_CONST(64556.50807784358/8.0), REAL_CONST(64577.762123795357/8.0), REAL_CONST(64599.017918691468/8.0), REAL_CONST(64620.275462244172/8.0), REAL_CONST(64641.534754165805/8.0), REAL_CONST(64662.795794168844/8.0), REAL_CONST(64684.058581965895/8.0), REAL_CONST(64705.323117269661/8.0), REAL_CONST(64726.589399792974/8.0), REAL_CONST(64747.857429248776/8.0), REAL_CONST(64769.127205350138/8.0), REAL_CONST(64790.398727810236/8.0), REAL_CONST(64811.671996342375/8.0), REAL_CONST(64832.947010659969/8.0), REAL_CONST(64854.223770476558/8.0), REAL_CONST(64875.502275505794/8.0), REAL_CONST(64896.782525461451/8.0), REAL_CONST(64918.064520057414/8.0), REAL_CONST(64939.348259007682/8.0), REAL_CONST(64960.633742026388/8.0), REAL_CONST(64981.920968827762/8.0), REAL_CONST(65003.209939126165/8.0), REAL_CONST(65024.500652636067/8.0), REAL_CONST(65045.793109072067/8.0), REAL_CONST(65067.087308148861/8.0), REAL_CONST(65088.383249581282/8.0), REAL_CONST(65109.680933084259/8.0), REAL_CONST(65130.980358372864/8.0), REAL_CONST(65152.28152516226/8.0), REAL_CONST(65173.584433167736/8.0), REAL_CONST(65194.889082104703/8.0), REAL_CONST(65216.195471688683/8.0), REAL_CONST(65237.503601635319/8.0), REAL_CONST(65258.813471660353/8.0), REAL_CONST(65280.125081479666/8.0), REAL_CONST(65301.438430809241/8.0), REAL_CONST(65322.753519365178/8.0), REAL_CONST(65344.070346863708/8.0), REAL_CONST(65365.388913021146/8.0), REAL_CONST(65386.709217553958/8.0), REAL_CONST(65408.031260178701/8.0), REAL_CONST(65429.355040612056/8.0), REAL_CONST(65450.680558570821/8.0), REAL_CONST(65472.00781377191/8.0), REAL_CONST(65493.336805932355/8.0), REAL_CONST(65514.66753476928/8.0), REAL_CONST(65535.999999999956/8.0), REAL_CONST(65557.334201341757/8.0), REAL_CONST(65578.670138512171/8.0), REAL_CONST(65600.007811228788/8.0), REAL_CONST(65621.347219209332/8.0), REAL_CONST(65642.688362171626/8.0), REAL_CONST(65664.031239833639/8.0), REAL_CONST(65685.375851913413/8.0), REAL_CONST(65706.722198129137/8.0), REAL_CONST(65728.070278199084/8.0), REAL_CONST(65749.420091841661/8.0), REAL_CONST(65770.771638775404/8.0), REAL_CONST(65792.124918718939/8.0), REAL_CONST(65813.479931391004/8.0), REAL_CONST(65834.836676510458/8.0), REAL_CONST(65856.195153796303/8.0), REAL_CONST(65877.5553629676/8.0), REAL_CONST(65898.917303743554/8.0), REAL_CONST(65920.280975843489/8.0), REAL_CONST(65941.646378986843/8.0), REAL_CONST(65963.013512893158/8.0), REAL_CONST(65984.382377282076/8.0), REAL_CONST(66005.752971873386/8.0), REAL_CONST(66027.125296386963/8.0), REAL_CONST(66048.499350542799/8.0), REAL_CONST(66069.875134061018/8.0), REAL_CONST(66091.252646661844/8.0), REAL_CONST(66112.631888065618/8.0), REAL_CONST(66134.01285799277/8.0), REAL_CONST(66155.395556163887/8.0), REAL_CONST(66176.779982299631/8.0), REAL_CONST(66198.166136120795/8.0), REAL_CONST(66219.554017348273/8.0), REAL_CONST(66240.943625703105/8.0), REAL_CONST(66262.334960906388/8.0), REAL_CONST(66283.728022679396/8.0), REAL_CONST(66305.122810743444/8.0), REAL_CONST(66326.519324820023/8.0), REAL_CONST(66347.917564630698/8.0), REAL_CONST(66369.317529897162/8.0), REAL_CONST(66390.719220341227/8.0), REAL_CONST(66412.122635684791/8.0), REAL_CONST(66433.527775649884/8.0), REAL_CONST(66454.934639958636/8.0), REAL_CONST(66476.343228333324/8.0), REAL_CONST(66497.753540496284/8.0), REAL_CONST(66519.165576169995/8.0), REAL_CONST(66540.57933507704/8.0), REAL_CONST(66561.994816940118/8.0), REAL_CONST(66583.412021482043/8.0), REAL_CONST(66604.830948425733/8.0), REAL_CONST(66626.251597494222/8.0), REAL_CONST(66647.673968410629/8.0), REAL_CONST(66669.098060898235/8.0), REAL_CONST(66690.523874680381/8.0), REAL_CONST(66711.951409480564/8.0), REAL_CONST(66733.380665022371/8.0), REAL_CONST(66754.811641029475/8.0), REAL_CONST(66776.244337225711/8.0), REAL_CONST(66797.678753334985/8.0), REAL_CONST(66819.11488908132/8.0), REAL_CONST(66840.552744188884/8.0), REAL_CONST(66861.992318381905/8.0), REAL_CONST(66883.433611384738/8.0), REAL_CONST(66904.876622921889/8.0), REAL_CONST(66926.321352717903/8.0), REAL_CONST(66947.767800497502/8.0), REAL_CONST(66969.215965985466/8.0), REAL_CONST(66990.665848906734/8.0), REAL_CONST(67012.117448986304/8.0), REAL_CONST(67033.570765949335/8.0), REAL_CONST(67055.025799521056/8.0), REAL_CONST(67076.482549426815/8.0), REAL_CONST(67097.941015392076/8.0), REAL_CONST(67119.401197142433/8.0), REAL_CONST(67140.863094403554/8.0), REAL_CONST(67162.326706901222/8.0), REAL_CONST(67183.792034361351/8.0), REAL_CONST(67205.259076509959/8.0), REAL_CONST(67226.72783307315/8.0), REAL_CONST(67248.198303777172/8.0), REAL_CONST(67269.670488348347/8.0), REAL_CONST(67291.144386513144/8.0), REAL_CONST(67312.619997998088/8.0), REAL_CONST(67334.09732252988/8.0), REAL_CONST(67355.576359835293/8.0), REAL_CONST(67377.057109641188/8.0), REAL_CONST(67398.53957167457/8.0), REAL_CONST(67420.023745662547/8.0), REAL_CONST(67441.50963133233/8.0), REAL_CONST(67462.99722841123/8.0), REAL_CONST(67484.486536626689/8.0), REAL_CONST(67505.977555706224/8.0), REAL_CONST(67527.470285377494/8.0), REAL_CONST(67548.964725368263/8.0), REAL_CONST(67570.460875406367/8.0), REAL_CONST(67591.9587352198/8.0), REAL_CONST(67613.458304536631/8.0), REAL_CONST(67634.95958308503/8.0), REAL_CONST(67656.462570593329/8.0), REAL_CONST(67677.967266789899/8.0), REAL_CONST(67699.473671403248/8.0), REAL_CONST(67720.981784162024/8.0), REAL_CONST(67742.491604794923/8.0), REAL_CONST(67764.003133030797/8.0), REAL_CONST(67785.516368598575/8.0), REAL_CONST(67807.031311227314/8.0), REAL_CONST(67828.547960646174/8.0), REAL_CONST(67850.066316584402/8.0), REAL_CONST(67871.58637877139/8.0), REAL_CONST(67893.108146936589/8.0), REAL_CONST(67914.63162080961/8.0), REAL_CONST(67936.156800120138/8.0), REAL_CONST(67957.683684597971/8.0), REAL_CONST(67979.212273973011/8.0), REAL_CONST(68000.742567975263/8.0), REAL_CONST(68022.274566334876/8.0), REAL_CONST(68043.808268782057/8.0), REAL_CONST(68065.343675047145/8.0), REAL_CONST(68086.880784860579/8.0), REAL_CONST(68108.419597952918/8.0), REAL_CONST(68129.960114054789/8.0), REAL_CONST(68151.502332896969/8.0), REAL_CONST(68173.04625421032/8.0), REAL_CONST(68194.591877725834/8.0), REAL_CONST(68216.139203174564/8.0), REAL_CONST(68237.688230287706/8.0), REAL_CONST(68259.238958796544/8.0), REAL_CONST(68280.791388432481/8.0), REAL_CONST(68302.345518927032/8.0), REAL_CONST(68323.901350011787/8.0), REAL_CONST(68345.458881418483/8.0), REAL_CONST(68367.018112878912/8.0), REAL_CONST(68388.579044125028/8.0), REAL_CONST(68410.141674888844/8.0), REAL_CONST(68431.706004902502/8.0), REAL_CONST(68453.272033898262/8.0), REAL_CONST(68474.839761608455/8.0), REAL_CONST(68496.409187765545/8.0), REAL_CONST(68517.980312102081/8.0), REAL_CONST(68539.553134350732/8.0), REAL_CONST(68561.127654244279/8.0), REAL_CONST(68582.70387151558/8.0), REAL_CONST(68604.281785897634/8.0), REAL_CONST(68625.861397123503/8.0), REAL_CONST(68647.44270492639/8.0), REAL_CONST(68669.025709039604/8.0), REAL_CONST(68690.610409196524/8.0), REAL_CONST(68712.196805130661/8.0), REAL_CONST(68733.784896575627/8.0), REAL_CONST(68755.374683265123/8.0), REAL_CONST(68776.966164932994/8.0), REAL_CONST(68798.559341313128/8.0), REAL_CONST(68820.154212139591/8.0), REAL_CONST(68841.750777146473/8.0), REAL_CONST(68863.349036068044/8.0), REAL_CONST(68884.948988638629/8.0), REAL_CONST(68906.550634592684/8.0), REAL_CONST(68928.153973664739/8.0), REAL_CONST(68949.75900558944/8.0), REAL_CONST(68971.365730101577/8.0), REAL_CONST(68992.974146935987/8.0), REAL_CONST(69014.584255827634/8.0), REAL_CONST(69036.196056511588/8.0), REAL_CONST(69057.809548723017/8.0), REAL_CONST(69079.424732197207/8.0), REAL_CONST(69101.041606669532/8.0), REAL_CONST(69122.660171875468/8.0), REAL_CONST(69144.280427550606/8.0), REAL_CONST(69165.902373430625/8.0), REAL_CONST(69187.526009251334/8.0), REAL_CONST(69209.151334748618/8.0), REAL_CONST(69230.778349658474/8.0), REAL_CONST(69252.40705371699/8.0), REAL_CONST(69274.037446660412/8.0), REAL_CONST(69295.669528225/8.0), REAL_CONST(69317.303298147192/8.0), REAL_CONST(69338.938756163494/8.0), REAL_CONST(69360.575902010532/8.0), REAL_CONST(69382.214735425005/8.0), REAL_CONST(69403.855256143754/8.0), REAL_CONST(69425.497463903681/8.0), REAL_CONST(69447.141358441833/8.0), REAL_CONST(69468.78693949533/8.0), REAL_CONST(69490.434206801394/8.0), REAL_CONST(69512.083160097391/8.0), REAL_CONST(69533.733799120717/8.0), REAL_CONST(69555.386123608929/8.0), REAL_CONST(69577.04013329967/8.0), REAL_CONST(69598.695827930685/8.0), REAL_CONST(69620.353207239794/8.0), REAL_CONST(69642.012270964973/8.0), REAL_CONST(69663.67301884426/8.0), REAL_CONST(69685.335450615792/8.0), REAL_CONST(69706.999566017839/8.0), REAL_CONST(69728.665364788743/8.0), REAL_CONST(69750.332846666963/8.0), REAL_CONST(69772.002011391058/8.0), REAL_CONST(69793.672858699691/8.0), REAL_CONST(69815.345388331611/8.0), REAL_CONST(69837.019600025669/8.0), REAL_CONST(69858.695493520849/8.0), REAL_CONST(69880.373068556204/8.0), REAL_CONST(69902.052324870907/8.0), REAL_CONST(69923.733262204216/8.0), REAL_CONST(69945.415880295492/8.0), REAL_CONST(69967.100178884211/8.0), REAL_CONST(69988.786157709939/8.0), REAL_CONST(70010.473816512356/8.0), REAL_CONST(70032.163155031216/8.0), REAL_CONST(70053.854173006403/8.0), REAL_CONST(70075.546870177874/8.0), REAL_CONST(70097.241246285717/8.0), REAL_CONST(70118.937301070109/8.0), REAL_CONST(70140.635034271298/8.0), REAL_CONST(70162.334445629691/8.0), REAL_CONST(70184.035534885741/8.0), REAL_CONST(70205.738301780017/8.0), REAL_CONST(70227.442746053217/8.0), REAL_CONST(70249.1488674461/8.0), REAL_CONST(70270.856665699539/8.0), REAL_CONST(70292.566140554511/8.0), REAL_CONST(70314.277291752107/8.0), REAL_CONST(70335.990119033493/8.0), REAL_CONST(70357.704622139936/8.0), REAL_CONST(70379.420800812819/8.0), REAL_CONST(70401.138654793613/8.0), REAL_CONST(70422.85818382389/8.0), REAL_CONST(70444.579387645339/8.0), REAL_CONST(70466.302265999722/8.0), REAL_CONST(70488.026818628918/8.0), REAL_CONST(70509.753045274876/8.0), REAL_CONST(70531.480945679708/8.0), REAL_CONST(70553.210519585555/8.0), REAL_CONST(70574.941766734701/8.0), REAL_CONST(70596.674686869505/8.0), REAL_CONST(70618.409279732456/8.0), REAL_CONST(70640.145545066101/8.0), REAL_CONST(70661.883482613106/8.0), REAL_CONST(70683.623092116264/8.0), REAL_CONST(70705.364373318414/8.0), REAL_CONST(70727.107325962526/8.0), REAL_CONST(70748.851949791671/8.0), REAL_CONST(70770.598244549008/8.0), REAL_CONST(70792.346209977783/8.0), REAL_CONST(70814.095845821372/8.0), REAL_CONST(70835.847151823225/8.0), REAL_CONST(70857.600127726895/8.0), REAL_CONST(70879.354773276034/8.0), REAL_CONST(70901.111088214413/8.0), REAL_CONST(70922.869072285859/8.0), REAL_CONST(70944.628725234332/8.0), REAL_CONST(70966.390046803877/8.0), REAL_CONST(70988.153036738629/8.0), REAL_CONST(71009.917694782853/8.0), REAL_CONST(71031.684020680885/8.0), REAL_CONST(71053.45201417715/8.0), REAL_CONST(71075.221675016204/8.0), REAL_CONST(71096.993002942661/8.0), REAL_CONST(71118.765997701266/8.0), REAL_CONST(71140.540659036851/8.0), REAL_CONST(71162.316986694335/8.0), REAL_CONST(71184.09498041874/8.0), REAL_CONST(71205.874639955218/8.0), REAL_CONST(71227.655965048951/8.0), REAL_CONST(71249.438955445294/8.0), REAL_CONST(71271.223610889632/8.0), REAL_CONST(71293.009931127483/8.0), REAL_CONST(71314.797915904477/8.0), REAL_CONST(71336.587564966307/8.0), REAL_CONST(71358.378878058764/8.0), REAL_CONST(71380.171854927772/8.0), REAL_CONST(71401.966495319313/8.0), REAL_CONST(71423.762798979486/8.0), REAL_CONST(71445.560765654489/8.0), REAL_CONST(71467.360395090596/8.0), REAL_CONST(71489.161687034211/8.0), REAL_CONST(71510.964641231811/8.0), REAL_CONST(71532.769257429973/8.0), REAL_CONST(71554.575535375348/8.0), REAL_CONST(71576.383474814749/8.0), REAL_CONST(71598.19307549503/8.0), REAL_CONST(71620.004337163133/8.0), REAL_CONST(71641.817259566145/8.0), REAL_CONST(71663.631842451214/8.0), REAL_CONST(71685.4480855656/8.0), REAL_CONST(71707.26598865664/8.0), REAL_CONST(71729.085551471784/8.0), REAL_CONST(71750.906773758586/8.0), REAL_CONST(71772.729655264673/8.0), REAL_CONST(71794.554195737772/8.0), REAL_CONST(71816.380394925713/8.0), REAL_CONST(71838.208252576442/8.0), REAL_CONST(71860.037768437964/8.0), REAL_CONST(71881.868942258385/8.0), REAL_CONST(71903.701773785942/8.0), REAL_CONST(71925.536262768932/8.0), REAL_CONST(71947.372408955751/8.0), REAL_CONST(71969.210212094898/8.0), REAL_CONST(71991.049671934976/8.0), REAL_CONST(72012.890788224686/8.0), REAL_CONST(72034.73356071279/8.0), REAL_CONST(72056.577989148165/8.0), REAL_CONST(72078.424073279821/8.0), REAL_CONST(72100.271812856794/8.0), REAL_CONST(72122.121207628254/8.0), REAL_CONST(72143.97225734347/8.0), REAL_CONST(72165.824961751801/8.0), REAL_CONST(72187.679320602692/8.0), REAL_CONST(72209.53533364569/8.0), REAL_CONST(72231.393000630429/8.0), REAL_CONST(72253.252321306645/8.0), REAL_CONST(72275.113295424177/8.0), REAL_CONST(72296.975922732949/8.0), REAL_CONST(72318.840202982959/8.0), REAL_CONST(72340.706135924338/8.0), REAL_CONST(72362.573721307272/8.0), REAL_CONST(72384.442958882093/8.0), REAL_CONST(72406.313848399179/8.0), REAL_CONST(72428.186389609036/8.0), REAL_CONST(72450.060582262216/8.0), REAL_CONST(72471.936426109431/8.0), REAL_CONST(72493.813920901433/8.0), REAL_CONST(72515.693066389096/8.0), REAL_CONST(72537.573862323392/8.0), REAL_CONST(72559.456308455352/8.0), REAL_CONST(72581.340404536139/8.0), REAL_CONST(72603.226150316987/8.0), REAL_CONST(72625.113545549248/8.0), REAL_CONST(72647.002589984331/8.0), REAL_CONST(72668.893283373764/8.0), REAL_CONST(72690.785625469172/8.0), REAL_CONST(72712.679616022273/8.0), REAL_CONST(72734.575254784853/8.0), REAL_CONST(72756.472541508803/8.0), REAL_CONST(72778.371475946144/8.0), REAL_CONST(72800.272057848939/8.0), REAL_CONST(72822.174286969355/8.0), REAL_CONST(72844.07816305969/8.0), REAL_CONST(72865.983685872285/8.0), REAL_CONST(72887.890855159596/8.0), REAL_CONST(72909.799670674183/8.0), REAL_CONST(72931.710132168693/8.0), REAL_CONST(72953.622239395845/8.0), REAL_CONST(72975.535992108475/8.0), REAL_CONST(72997.451390059519/8.0), REAL_CONST(73019.368433001961/8.0), REAL_CONST(73041.287120688925/8.0), REAL_CONST(73063.207452873612/8.0), REAL_CONST(73085.129429309294/8.0), REAL_CONST(73107.053049749389/8.0), REAL_CONST(73128.978313947344/8.0), REAL_CONST(73150.905221656736/8.0), REAL_CONST(73172.833772631217/8.0), REAL_CONST(73194.763966624567/8.0), REAL_CONST(73216.695803390612/8.0), REAL_CONST(73238.62928268328/8.0), REAL_CONST(73260.564404256627/8.0), REAL_CONST(73282.501167864757/8.0), REAL_CONST(73304.439573261901/8.0), REAL_CONST(73326.379620202337/8.0), REAL_CONST(73348.321308440485/8.0), REAL_CONST(73370.264637730841/8.0), REAL_CONST(73392.209607827957/8.0), REAL_CONST(73414.156218486532/8.0), REAL_CONST(73436.104469461323/8.0), REAL_CONST(73458.054360507173/8.0), REAL_CONST(73480.005891379056/8.0), REAL_CONST(73501.959061831993/8.0), REAL_CONST(73523.913871621116/8.0), REAL_CONST(73545.870320501665/8.0), REAL_CONST(73567.828408228932/8.0), REAL_CONST(73589.78813455833/8.0), REAL_CONST(73611.749499245358/8.0), REAL_CONST(73633.712502045615/8.0), REAL_CONST(73655.677142714747/8.0), REAL_CONST(73677.643421008557/8.0), REAL_CONST(73699.611336682879/8.0), REAL_CONST(73721.580889493693/8.0), REAL_CONST(73743.552079197019/8.0), REAL_CONST(73765.524905548999/8.0), REAL_CONST(73787.499368305856/8.0), REAL_CONST(73809.475467223907/8.0), REAL_CONST(73831.453202059551/8.0), REAL_CONST(73853.432572569291/8.0), REAL_CONST(73875.413578509717/8.0), REAL_CONST(73897.396219637507/8.0), REAL_CONST(73919.380495709411/8.0), REAL_CONST(73941.36640648231/8.0), REAL_CONST(73963.353951713143/8.0), REAL_CONST(73985.343131158952/8.0), REAL_CONST(74007.333944576865/8.0), REAL_CONST(74029.326391724098/8.0), REAL_CONST(74051.320472357969/8.0), REAL_CONST(74073.316186235883/8.0), REAL_CONST(74095.313533115303/8.0), REAL_CONST(74117.312512753837/8.0), REAL_CONST(74139.313124909138/8.0), REAL_CONST(74161.315369338976/8.0), REAL_CONST(74183.319245801191/8.0), REAL_CONST(74205.324754053727/8.0), REAL_CONST(74227.331893854629/8.0), REAL_CONST(74249.340664961986/8.0), REAL_CONST(74271.351067134034/8.0), REAL_CONST(74293.363100129049/8.0), REAL_CONST(74315.376763705441/8.0), REAL_CONST(74337.392057621662/8.0), REAL_CONST(74359.408981636298/8.0), REAL_CONST(74381.427535508003/8.0), REAL_CONST(74403.447718995507/8.0), REAL_CONST(74425.469531857671/8.0), REAL_CONST(74447.492973853383/8.0), REAL_CONST(74469.518044741693/8.0), REAL_CONST(74491.54474428168/8.0), REAL_CONST(74513.573072232539/8.0), REAL_CONST(74535.603028353551/8.0), REAL_CONST(74557.634612404087/8.0), REAL_CONST(74579.667824143602/8.0), REAL_CONST(74601.702663331642/8.0), REAL_CONST(74623.739129727837/8.0), REAL_CONST(74645.777223091936/8.0), REAL_CONST(74667.816943183716/8.0), REAL_CONST(74689.858289763113/8.0), REAL_CONST(74711.901262590094/8.0), REAL_CONST(74733.945861424741/8.0), REAL_CONST(74755.992086027225/8.0), REAL_CONST(74778.039936157802/8.0), REAL_CONST(74800.089411576817/8.0), REAL_CONST(74822.140512044702/8.0), REAL_CONST(74844.193237321961/8.0), REAL_CONST(74866.24758716923/8.0), REAL_CONST(74888.303561347187/8.0), REAL_CONST(74910.36115961663/8.0), REAL_CONST(74932.420381738411/8.0), REAL_CONST(74954.481227473516/8.0), REAL_CONST(74976.543696582972/8.0), REAL_CONST(74998.607788827925/8.0), REAL_CONST(75020.673503969607/8.0), REAL_CONST(75042.740841769322/8.0), REAL_CONST(75064.809801988464/8.0), REAL_CONST(75086.88038438854/8.0), REAL_CONST(75108.952588731103/8.0), REAL_CONST(75131.026414777836/8.0), REAL_CONST(75153.101862290467/8.0), REAL_CONST(75175.178931030852/8.0), REAL_CONST(75197.257620760924/8.0), REAL_CONST(75219.33793124267/8.0), REAL_CONST(75241.419862238225/8.0), REAL_CONST(75263.503413509738/8.0), REAL_CONST(75285.588584819503/8.0), REAL_CONST(75307.675375929874/8.0), REAL_CONST(75329.763786603318/8.0), REAL_CONST(75351.853816602365/8.0), REAL_CONST(75373.945465689612/8.0), REAL_CONST(75396.038733627807/8.0), REAL_CONST(75418.133620179724/8.0), REAL_CONST(75440.230125108254/8.0), REAL_CONST(75462.32824817636/8.0), REAL_CONST(75484.427989147109/8.0), REAL_CONST(75506.529347783653/8.0), REAL_CONST(75528.63232384919/8.0), REAL_CONST(75550.736917107075/8.0), REAL_CONST(75572.843127320695/8.0), REAL_CONST(75594.950954253538/8.0), REAL_CONST(75617.060397669193/8.0), REAL_CONST(75639.171457331307/8.0), REAL_CONST(75661.284133003646/8.0), REAL_CONST(75683.398424450032/8.0), REAL_CONST(75705.514331434402/8.0), REAL_CONST(75727.631853720741/8.0), REAL_CONST(75749.750991073175/8.0), REAL_CONST(75771.871743255862/8.0), REAL_CONST(75793.994110033076/8.0), REAL_CONST(75816.118091169177/8.0), REAL_CONST(75838.243686428585/8.0), REAL_CONST(75860.370895575848/8.0), REAL_CONST(75882.499718375562/8.0), REAL_CONST(75904.630154592422/8.0), REAL_CONST(75926.762203991224/8.0), REAL_CONST(75948.895866336825/8.0), REAL_CONST(75971.031141394182/8.0), REAL_CONST(75993.168028928325/8.0), REAL_CONST(76015.306528704401/8.0), REAL_CONST(76037.4466404876/8.0), REAL_CONST(76059.588364043215/8.0), REAL_CONST(76081.731699136653/8.0), REAL_CONST(76103.876645533353/8.0), REAL_CONST(76126.023202998884/8.0), REAL_CONST(76148.171371298871/8.0), REAL_CONST(76170.321150199044/8.0), REAL_CONST(76192.472539465205/8.0), REAL_CONST(76214.625538863256/8.0), REAL_CONST(76236.780148159174/8.0), REAL_CONST(76258.936367119008/8.0), REAL_CONST(76281.094195508922/8.0), REAL_CONST(76303.253633095141/8.0), REAL_CONST(76325.414679643975/8.0), REAL_CONST(76347.577334921851/8.0), REAL_CONST(76369.741598695226/8.0), REAL_CONST(76391.907470730686/8.0), REAL_CONST(76414.074950794879/8.0), REAL_CONST(76436.244038654564/8.0), REAL_CONST(76458.414734076548/8.0), REAL_CONST(76480.587036827754/8.0), REAL_CONST(76502.760946675175/8.0), REAL_CONST(76524.936463385893/8.0), REAL_CONST(76547.11358672705/8.0), REAL_CONST(76569.292316465915/8.0), REAL_CONST(76591.472652369819/8.0), REAL_CONST(76613.654594206164/8.0), REAL_CONST(76635.838141742468/8.0), REAL_CONST(76658.023294746308/8.0), REAL_CONST(76680.210052985349/8.0), REAL_CONST(76702.398416227341/8.0), REAL_CONST(76724.588384240138/8.0), REAL_CONST(76746.779956791637/8.0), REAL_CONST(76768.973133649866/8.0), REAL_CONST(76791.167914582897/8.0), REAL_CONST(76813.364299358902/8.0), REAL_CONST(76835.562287746157/8.0), REAL_CONST(76857.761879512967/8.0), REAL_CONST(76879.963074427797/8.0), REAL_CONST(76902.165872259109/8.0), REAL_CONST(76924.37027277553/8.0), REAL_CONST(76946.576275745727/8.0), REAL_CONST(76968.783880938441/8.0), REAL_CONST(76990.993088122515/8.0), REAL_CONST(77013.203897066895/8.0), REAL_CONST(77035.416307540567/8.0), REAL_CONST(77057.630319312622/8.0), REAL_CONST(77079.845932152239/8.0), REAL_CONST(77102.063145828695/8.0), REAL_CONST(77124.281960111301/8.0), REAL_CONST(77146.50237476948/8.0), REAL_CONST(77168.724389572759/8.0), REAL_CONST(77190.948004290723/8.0), REAL_CONST(77213.173218693031/8.0), REAL_CONST(77235.400032549442/8.0), REAL_CONST(77257.628445629802/8.0), REAL_CONST(77279.858457704031/8.0), REAL_CONST(77302.090068542122/8.0), REAL_CONST(77324.323277914169/8.0), REAL_CONST(77346.558085590339/8.0), REAL_CONST(77368.794491340886/8.0), REAL_CONST(77391.032494936138/8.0), REAL_CONST(77413.272096146524/8.0), REAL_CONST(77435.51329474253/8.0), REAL_CONST(77457.756090494731/8.0), REAL_CONST(77480.000483173804/8.0), REAL_CONST(77502.246472550498/8.0), REAL_CONST(77524.494058395634/8.0), REAL_CONST(77546.743240480107/8.0), REAL_CONST(77568.994018574944/8.0), REAL_CONST(77591.246392451198/8.0), REAL_CONST(77613.500361880026/8.0), REAL_CONST(77635.755926632657/8.0), REAL_CONST(77658.013086480438/8.0), REAL_CONST(77680.271841194757/8.0), REAL_CONST(77702.532190547092/8.0), REAL_CONST(77724.794134309021/8.0), REAL_CONST(77747.057672252195/8.0), REAL_CONST(77769.322804148323/8.0), REAL_CONST(77791.589529769248/8.0), REAL_CONST(77813.857848886837/8.0), REAL_CONST(77836.127761273063/8.0), REAL_CONST(77858.399266699998/8.0), REAL_CONST(77880.67236493979/8.0), REAL_CONST(77902.947055764627/8.0), REAL_CONST(77925.223338946831/8.0), REAL_CONST(77947.50121425878/8.0), REAL_CONST(77969.780681472927/8.0), REAL_CONST(77992.061740361838/8.0), REAL_CONST(78014.344390698127/8.0), REAL_CONST(78036.628632254491/8.0), REAL_CONST(78058.914464803747/8.0), REAL_CONST(78081.201888118725/8.0), REAL_CONST(78103.490901972415/8.0), REAL_CONST(78125.781506137821/8.0), REAL_CONST(78148.073700388064/8.0), REAL_CONST(78170.367484496339/8.0), REAL_CONST(78192.662858235926/8.0), REAL_CONST(78214.959821380166/8.0), REAL_CONST(78237.258373702498/8.0), REAL_CONST(78259.558514976452/8.0), REAL_CONST(78281.860244975614/8.0), REAL_CONST(78304.163563473659/8.0), REAL_CONST(78326.468470244363/8.0), REAL_CONST(78348.77496506153/8.0), REAL_CONST(78371.083047699125/8.0), REAL_CONST(78393.392717931114/8.0), REAL_CONST(78415.703975531578/8.0), REAL_CONST(78438.016820274701/8.0), REAL_CONST(78460.331251934695/8.0), REAL_CONST(78482.647270285903/8.0), REAL_CONST(78504.964875102727/8.0), REAL_CONST(78527.284066159627/8.0), REAL_CONST(78549.604843231195/8.0), REAL_CONST(78571.927206092048/8.0), REAL_CONST(78594.251154516911/8.0), REAL_CONST(78616.576688280606/8.0), REAL_CONST(78638.903807157985/8.0), REAL_CONST(78661.232510924034/8.0), REAL_CONST(78683.562799353778/8.0), REAL_CONST(78705.894672222363/8.0), REAL_CONST(78728.228129304945/8.0), REAL_CONST(78750.563170376859/8.0), REAL_CONST(78772.899795213423/8.0), REAL_CONST(78795.238003590101/8.0), REAL_CONST(78817.577795282399/8.0), REAL_CONST(78839.919170065928/8.0), REAL_CONST(78862.262127716356/8.0), REAL_CONST(78884.606668009452/8.0), REAL_CONST(78906.952790721043/8.0), REAL_CONST(78929.300495627045/8.0), REAL_CONST(78951.64978250346/8.0), REAL_CONST(78974.000651126378/8.0), REAL_CONST(78996.353101271932/8.0), REAL_CONST(79018.707132716358/8.0), REAL_CONST(79041.062745235977/8.0), REAL_CONST(79063.41993860717/8.0), REAL_CONST(79085.778712606436/8.0), REAL_CONST(79108.139067010285/8.0), REAL_CONST(79130.501001595389/8.0), REAL_CONST(79152.864516138419/8.0), REAL_CONST(79175.22961041618/8.0), REAL_CONST(79197.596284205531/8.0), REAL_CONST(79219.96453728342/8.0), REAL_CONST(79242.33436942687/8.0), REAL_CONST(79264.705780412987/8.0), REAL_CONST(79287.078770018954/8.0), REAL_CONST(79309.453338022009/8.0), REAL_CONST(79331.829484199508/8.0), REAL_CONST(79354.207208328866/8.0), REAL_CONST(79376.586510187582/8.0), REAL_CONST(79398.967389553218/8.0), REAL_CONST(79421.349846203433/8.0), REAL_CONST(79443.733879915948/8.0), REAL_CONST(79466.119490468584/8.0), REAL_CONST(79488.50667763922/8.0), REAL_CONST(79510.895441205823/8.0), REAL_CONST(79533.285780946433/8.0), REAL_CONST(79555.677696639163/8.0), REAL_CONST(79578.071188062226/8.0), REAL_CONST(79600.466254993895/8.0), REAL_CONST(79622.862897212515/8.0), REAL_CONST(79645.261114496549/8.0), REAL_CONST(79667.660906624471/8.0), REAL_CONST(79690.062273374875/8.0), REAL_CONST(79712.465214526455/8.0), REAL_CONST(79734.869729857935/8.0), REAL_CONST(79757.275819148126/8.0), REAL_CONST(79779.683482175955/8.0), REAL_CONST(79802.092718720378/8.0), REAL_CONST(79824.503528560454/8.0), REAL_CONST(79846.915911475327/8.0), REAL_CONST(79869.329867244203/8.0), REAL_CONST(79891.745395646343/8.0), REAL_CONST(79914.162496461155/8.0), REAL_CONST(79936.581169468045/8.0), REAL_CONST(79959.001414446553/8.0), REAL_CONST(79981.423231176261/8.0), REAL_CONST(80003.846619436852/8.0), REAL_CONST(80026.271579008084/8.0), REAL_CONST(80048.698109669771/8.0), REAL_CONST(80071.12621120183/8.0), REAL_CONST(80093.555883384237/8.0), REAL_CONST(80115.987125997053/8.0), REAL_CONST(80138.419938820414/8.0), REAL_CONST(80160.854321634528/8.0), REAL_CONST(80183.290274219689/8.0), REAL_CONST(80205.727796356281/8.0), REAL_CONST(80228.166887824715/8.0), REAL_CONST(80250.607548405547/8.0), REAL_CONST(80273.049777879336/8.0), REAL_CONST(80295.493576026798/8.0), REAL_CONST(80317.938942628651/8.0), REAL_CONST(80340.385877465727/8.0), REAL_CONST(80362.834380318949/8.0), REAL_CONST(80385.28445096928/8.0), REAL_CONST(80407.736089197788/8.0), REAL_CONST(80430.189294785596/8.0), REAL_CONST(80452.644067513917/8.0), REAL_CONST(80475.100407164035/8.0), REAL_CONST(80497.558313517322/8.0), REAL_CONST(80520.017786355209/8.0), REAL_CONST(80542.478825459213/8.0), REAL_CONST(80564.941430610925/8.0), REAL_CONST(80587.405601592007/8.0), REAL_CONST(80609.871338184195/8.0), REAL_CONST(80632.338640169342/8.0), REAL_CONST(80654.8075073293/8.0), REAL_CONST(80677.277939446067/8.0), REAL_CONST(80699.749936301683/8.0), REAL_CONST(80722.223497678278/8.0), REAL_CONST(80744.698623358039/8.0), REAL_CONST(80767.17531312324/8.0), REAL_CONST(80789.653566756242/8.0), REAL_CONST(80812.133384039465/8.0), REAL_CONST(80834.614764755403/8.0), REAL_CONST(80857.097708686648/8.0), REAL_CONST(80879.582215615854/8.0), REAL_CONST(80902.068285325731/8.0), REAL_CONST(80924.555917599093/8.0), REAL_CONST(80947.045112218824/8.0), REAL_CONST(80969.535868967869/8.0), REAL_CONST(80992.028187629272/8.0), REAL_CONST(81014.522067986123/8.0), REAL_CONST(81037.017509821613/8.0), REAL_CONST(81059.514512919006/8.0), REAL_CONST(81082.013077061609/8.0), REAL_CONST(81104.513202032831/8.0), REAL_CONST(81127.014887616184/8.0), REAL_CONST(81149.518133595193/8.0), REAL_CONST(81172.022939753486/8.0), REAL_CONST(81194.529305874807/8.0), REAL_CONST(81217.037231742899/8.0), REAL_CONST(81239.546717141639/8.0), REAL_CONST(81262.057761854958/8.0), REAL_CONST(81284.570365666848/8.0), REAL_CONST(81307.084528361403/8.0), REAL_CONST(81329.600249722775/8.0), REAL_CONST(81352.117529535186/8.0), REAL_CONST(81374.636367582949/8.0), REAL_CONST(81397.156763650448/8.0), REAL_CONST(81419.678717522125/8.0), REAL_CONST(81442.202228982511/8.0), REAL_CONST(81464.727297816222/8.0), REAL_CONST(81487.253923807933/8.0), REAL_CONST(81509.782106742379/8.0), REAL_CONST(81532.311846404409/8.0), REAL_CONST(81554.843142578902/8.0), REAL_CONST(81577.375995050839/8.0), REAL_CONST(81599.910403605274/8.0), REAL_CONST(81622.446368027333/8.0), REAL_CONST(81644.983888102215/8.0), REAL_CONST(81667.522963615178/8.0), REAL_CONST(81690.063594351581/8.0), REAL_CONST(81712.605780096841/8.0), REAL_CONST(81735.149520636449/8.0), REAL_CONST(81757.694815755967/8.0), REAL_CONST(81780.241665241047/8.0), REAL_CONST(81802.79006887741/8.0), REAL_CONST(81825.340026450824/8.0), REAL_CONST(81847.891537747171/8.0), REAL_CONST(81870.444602552379/8.0), REAL_CONST(81892.999220652477/8.0), REAL_CONST(81915.555391833506/8.0), REAL_CONST(81938.113115881672/8.0), REAL_CONST(81960.672392583176/8.0), REAL_CONST(81983.233221724338/8.0), REAL_CONST(82005.795603091537/8.0), REAL_CONST(82028.359536471224/8.0), REAL_CONST(82050.925021649906/8.0), REAL_CONST(82073.492058414209/8.0), REAL_CONST(82096.060646550788/8.0), REAL_CONST(82118.630785846399/8.0), REAL_CONST(82141.202476087841/8.0), REAL_CONST(82163.775717062032/8.0), REAL_CONST(82186.35050855593/8.0), REAL_CONST(82208.926850356569/8.0), REAL_CONST(82231.504742251054/8.0), REAL_CONST(82254.084184026578/8.0), REAL_CONST(82276.665175470393/8.0), REAL_CONST(82299.24771636985/8.0), REAL_CONST(82321.831806512317/8.0), REAL_CONST(82344.417445685307/8.0), REAL_CONST(82367.004633676348/8.0), REAL_CONST(82389.593370273054/8.0), REAL_CONST(82412.183655263143/8.0), REAL_CONST(82434.775488434374/8.0), REAL_CONST(82457.368869574595/8.0), REAL_CONST(82479.963798471697/8.0), REAL_CONST(82502.560274913689/8.0), REAL_CONST(82525.158298688606/8.0), REAL_CONST(82547.757869584602/8.0), REAL_CONST(82570.35898738986/8.0), REAL_CONST(82592.961651892678/8.0), REAL_CONST(82615.565862881398/8.0), REAL_CONST(82638.171620144421/8.0), REAL_CONST(82660.778923470265/8.0), REAL_CONST(82683.387772647475/8.0), REAL_CONST(82705.998167464713/8.0), REAL_CONST(82728.610107710658/8.0), REAL_CONST(82751.223593174116/8.0), REAL_CONST(82773.83862364394/8.0), REAL_CONST(82796.45519890904/8.0), REAL_CONST(82819.073318758441/8.0), REAL_CONST(82841.692982981185/8.0), REAL_CONST(82864.314191366429/8.0), REAL_CONST(82886.936943703375/8.0), REAL_CONST(82909.561239781324/8.0), REAL_CONST(82932.187079389638/8.0), REAL_CONST(82954.814462317736/8.0), REAL_CONST(82977.443388355125/8.0), REAL_CONST(83000.073857291369/8.0), REAL_CONST(83022.70586891612/8.0), REAL_CONST(83045.339423019104/8.0), REAL_CONST(83067.974519390089/8.0), REAL_CONST(83090.611157818959/8.0), REAL_CONST(83113.249338095629/8.0), REAL_CONST(83135.8890600101/8.0), REAL_CONST(83158.530323352461/8.0), REAL_CONST(83181.173127912858/8.0), REAL_CONST(83203.817473481497/8.0), REAL_CONST(83226.463359848669/8.0), REAL_CONST(83249.11078680474/8.0), REAL_CONST(83271.759754140134/8.0), REAL_CONST(83294.410261645375/8.0), REAL_CONST(83317.062309111003/8.0), REAL_CONST(83339.715896327703/8.0), REAL_CONST(83362.371023086147/8.0), REAL_CONST(83385.027689177165/8.0), REAL_CONST(83407.685894391587/8.0), REAL_CONST(83430.345638520361/8.0), REAL_CONST(83453.006921354478/8.0), REAL_CONST(83475.669742685001/8.0), REAL_CONST(83498.334102303095/8.0), REAL_CONST(83520.999999999942/8.0), REAL_CONST(83543.667435566866/8.0), REAL_CONST(83566.336408795192/8.0), REAL_CONST(83589.006919476349/8.0), REAL_CONST(83611.678967401851/8.0), REAL_CONST(83634.352552363242/8.0), REAL_CONST(83657.027674152167/8.0), REAL_CONST(83679.704332560359/8.0), REAL_CONST(83702.382527379552/8.0), REAL_CONST(83725.062258401638/8.0), REAL_CONST(83747.743525418511/8.0), REAL_CONST(83770.42632822218/8.0), REAL_CONST(83793.110666604684/8.0), REAL_CONST(83815.796540358162/8.0), REAL_CONST(83838.483949274829/8.0), REAL_CONST(83861.172893146941/8.0), REAL_CONST(83883.863371766842/8.0), REAL_CONST(83906.555384926964/8.0), REAL_CONST(83929.248932419752/8.0), REAL_CONST(83951.944014037799/8.0), REAL_CONST(83974.640629573696/8.0), REAL_CONST(83997.338778820151/8.0), REAL_CONST(84020.038461569929/8.0), REAL_CONST(84042.739677615857/8.0), REAL_CONST(84065.442426750829/8.0), REAL_CONST(84088.146708767847/8.0), REAL_CONST(84110.852523459922/8.0), REAL_CONST(84133.559870620171/8.0), REAL_CONST(84156.268750041796/8.0), REAL_CONST(84178.979161518029/8.0), REAL_CONST(84201.691104842204/8.0), REAL_CONST(84224.404579807713/8.0), REAL_CONST(84247.119586208006/8.0), REAL_CONST(84269.83612383662/8.0), REAL_CONST(84292.55419248715/8.0), REAL_CONST(84315.273791953281/8.0), REAL_CONST(84337.994922028738/8.0), REAL_CONST(84360.717582507335/8.0), REAL_CONST(84383.441773182945/8.0), REAL_CONST(84406.167493849513/8.0), REAL_CONST(84428.894744301069/8.0), REAL_CONST(84451.623524331691/8.0), REAL_CONST(84474.353833735542/8.0), REAL_CONST(84497.085672306828/8.0), REAL_CONST(84519.819039839858/8.0), REAL_CONST(84542.553936128999/8.0), REAL_CONST(84565.290360968676/8.0), REAL_CONST(84588.028314153402/8.0), REAL_CONST(84610.767795477717/8.0), REAL_CONST(84633.508804736295/8.0), REAL_CONST(84656.251341723822/8.0), REAL_CONST(84678.995406235073/8.0), REAL_CONST(84701.740998064924/8.0), REAL_CONST(84724.488117008252/8.0), REAL_CONST(84747.236762860062/8.0), REAL_CONST(84769.986935415407/8.0), REAL_CONST(84792.73863446941/8.0), REAL_CONST(84815.491859817252/8.0), REAL_CONST(84838.246611254188/8.0), REAL_CONST(84861.002888575575/8.0), REAL_CONST(84883.760691576768/8.0), REAL_CONST(84906.520020053256/8.0), REAL_CONST(84929.28087380057/8.0), REAL_CONST(84952.043252614312/8.0), REAL_CONST(84974.807156290146/8.0), REAL_CONST(84997.572584623806/8.0), REAL_CONST(85020.339537411113/8.0), REAL_CONST(85043.108014447949/8.0), REAL_CONST(85065.878015530237/8.0), REAL_CONST(85088.649540453989/8.0), REAL_CONST(85111.422589015303/8.0), REAL_CONST(85134.197161010321/8.0), REAL_CONST(85156.973256235244/8.0), REAL_CONST(85179.750874486374/8.0), REAL_CONST(85202.530015560071/8.0), REAL_CONST(85225.310679252725/8.0), REAL_CONST(85248.092865360857/8.0), REAL_CONST(85270.876573681016/8.0), REAL_CONST(85293.661804009811/8.0), REAL_CONST(85316.448556143951/8.0), REAL_CONST(85339.236829880188/8.0), REAL_CONST(85362.026625015351/8.0), REAL_CONST(85384.817941346351/8.0), REAL_CONST(85407.610778670132/8.0), REAL_CONST(85430.405136783724/8.0), REAL_CONST(85453.201015484257/8.0), REAL_CONST(85475.998414568865/8.0), REAL_CONST(85498.797333834795/8.0), REAL_CONST(85521.597773079353/8.0), REAL_CONST(85544.399732099904/8.0), REAL_CONST(85567.203210693886/8.0), REAL_CONST(85590.008208658808/8.0), REAL_CONST(85612.814725792239/8.0), REAL_CONST(85635.62276189182/8.0), REAL_CONST(85658.432316755265/8.0), REAL_CONST(85681.243390180331/8.0), REAL_CONST(85704.055981964877/8.0), REAL_CONST(85726.870091906807/8.0), REAL_CONST(85749.685719804082/8.0), REAL_CONST(85772.502865454764/8.0), REAL_CONST(85795.321528656961/8.0), REAL_CONST(85818.141709208852/8.0), REAL_CONST(85840.963406908675/8.0), REAL_CONST(85863.78662155474/8.0), REAL_CONST(85886.611352945445/8.0), REAL_CONST(85909.437600879217/8.0), REAL_CONST(85932.26536515457/8.0), REAL_CONST(85955.094645570091/8.0), REAL_CONST(85977.92544192441/8.0), REAL_CONST(86000.757754016275/8.0), REAL_CONST(86023.591581644432/8.0), REAL_CONST(86046.426924607746/8.0), REAL_CONST(86069.263782705122/8.0), REAL_CONST(86092.102155735556/8.0), REAL_CONST(86114.942043498071/8.0), REAL_CONST(86137.783445791807/8.0), REAL_CONST(86160.626362415918/8.0), REAL_CONST(86183.470793169676/8.0), REAL_CONST(86206.316737852379/8.0), REAL_CONST(86229.164196263402/8.0), REAL_CONST(86252.013168202204/8.0), REAL_CONST(86274.863653468303/8.0), REAL_CONST(86297.715651861261/8.0), REAL_CONST(86320.569163180728/8.0), REAL_CONST(86343.424187226425/8.0), REAL_CONST(86366.280723798132/8.0), REAL_CONST(86389.138772695675/8.0), REAL_CONST(86411.998333718977/8.0), REAL_CONST(86434.859406668009/8.0), REAL_CONST(86457.721991342827/8.0), REAL_CONST(86480.586087543532/8.0), REAL_CONST(86503.451695070296/8.0), REAL_CONST(86526.318813723352/8.0), REAL_CONST(86549.187443303032/8.0), REAL_CONST(86572.057583609683/8.0), REAL_CONST(86594.929234443756/8.0), REAL_CONST(86617.802395605773/8.0), REAL_CONST(86640.677066896271/8.0), REAL_CONST(86663.553248115903/8.0), REAL_CONST(86686.43093906538/8.0), REAL_CONST(86709.310139545443/8.0), REAL_CONST(86732.190849356964/8.0), REAL_CONST(86755.073068300815/8.0), REAL_CONST(86777.956796177954/8.0), REAL_CONST(86800.842032789442/8.0), REAL_CONST(86823.728777936354/8.0), REAL_CONST(86846.617031419853/8.0), REAL_CONST(86869.506793041175/8.0), REAL_CONST(86892.398062601613/8.0), REAL_CONST(86915.290839902518/8.0), REAL_CONST(86938.185124745316/8.0), REAL_CONST(86961.080916931489/8.0), REAL_CONST(86983.978216262592/8.0), REAL_CONST(87006.87702254027/8.0), REAL_CONST(87029.777335566177/8.0), REAL_CONST(87052.67915514209/8.0), REAL_CONST(87075.582481069796/8.0), REAL_CONST(87098.487313151185/8.0), REAL_CONST(87121.39365118822/8.0), REAL_CONST(87144.301494982894/8.0), REAL_CONST(87167.210844337285/8.0), REAL_CONST(87190.121699053532/8.0), REAL_CONST(87213.034058933845/8.0), REAL_CONST(87235.947923780506/8.0), REAL_CONST(87258.863293395829/8.0), REAL_CONST(87281.780167582241/8.0), REAL_CONST(87304.698546142172/8.0), REAL_CONST(87327.618428878181/8.0), REAL_CONST(87350.539815592856/8.0), REAL_CONST(87373.462706088845/8.0), REAL_CONST(87396.387100168897/8.0), REAL_CONST(87419.312997635774/8.0), REAL_CONST(87442.240398292357/8.0), REAL_CONST(87465.16930194154/8.0), REAL_CONST(87488.099708386319/8.0), REAL_CONST(87511.031617429733/8.0), REAL_CONST(87533.965028874911/8.0), REAL_CONST(87556.899942525008/8.0), REAL_CONST(87579.836358183282/8.0), REAL_CONST(87602.774275653021/8.0), REAL_CONST(87625.713694737613/8.0), REAL_CONST(87648.654615240492/8.0), REAL_CONST(87671.597036965148/8.0), REAL_CONST(87694.540959715145/8.0), REAL_CONST(87717.486383294105/8.0), REAL_CONST(87740.433307505737/8.0), REAL_CONST(87763.381732153779/8.0), REAL_CONST(87786.331657042057/8.0), REAL_CONST(87809.283081974456/8.0), REAL_CONST(87832.236006754916/8.0), REAL_CONST(87855.190431187453/8.0), REAL_CONST(87878.146355076155/8.0), REAL_CONST(87901.103778225151/8.0), REAL_CONST(87924.062700438633/8.0), REAL_CONST(87947.023121520891/8.0), REAL_CONST(87969.985041276246/8.0), REAL_CONST(87992.948459509105/8.0), REAL_CONST(88015.913376023906/8.0), REAL_CONST(88038.879790625171/8.0), REAL_CONST(88061.847703117513/8.0), REAL_CONST(88084.817113305573/8.0), REAL_CONST(88107.788020994049/8.0), REAL_CONST(88130.760425987726/8.0), REAL_CONST(88153.734328091465/8.0), REAL_CONST(88176.709727110137/8.0), REAL_CONST(88199.686622848749/8.0), REAL_CONST(88222.665015112303/8.0), REAL_CONST(88245.644903705906/8.0), REAL_CONST(88268.626288434709/8.0), REAL_CONST(88291.609169103947/8.0), REAL_CONST(88314.593545518903/8.0), REAL_CONST(88337.579417484914/8.0), REAL_CONST(88360.566784807408/8.0), REAL_CONST(88383.555647291854/8.0), REAL_CONST(88406.546004743795/8.0), REAL_CONST(88429.537856968818/8.0), REAL_CONST(88452.531203772611/8.0), REAL_CONST(88475.52604496089/8.0), REAL_CONST(88498.522380339447/8.0), REAL_CONST(88521.52020971413/8.0), REAL_CONST(88544.519532890874/8.0), REAL_CONST(88567.520349675644/8.0), REAL_CONST(88590.522659874507/8.0), REAL_CONST(88613.526463293543/8.0), REAL_CONST(88636.531759738922/8.0), REAL_CONST(88659.538549016899/8.0), REAL_CONST(88682.546830933745/8.0), REAL_CONST(88705.556605295846/8.0), REAL_CONST(88728.567871909589/8.0), REAL_CONST(88751.580630581491/8.0), REAL_CONST(88774.594881118086/8.0), REAL_CONST(88797.610623325963/8.0), REAL_CONST(88820.62785701183/8.0), REAL_CONST(88843.646581982393/8.0), REAL_CONST(88866.666798044462/8.0), REAL_CONST(88889.688505004888/8.0), REAL_CONST(88912.711702670611/8.0), REAL_CONST(88935.7363908486/8.0), REAL_CONST(88958.762569345898/8.0), REAL_CONST(88981.790237969632/8.0), REAL_CONST(89004.81939652696/8.0), REAL_CONST(89027.850044825114/8.0), REAL_CONST(89050.882182671412/8.0), REAL_CONST(89073.9158098732/8.0), REAL_CONST(89096.950926237885/8.0), REAL_CONST(89119.987531572973/8.0), REAL_CONST(89143.025625686001/8.0), REAL_CONST(89166.065208384563/8.0), REAL_CONST(89189.106279476357/8.0), REAL_CONST(89212.148838769106/8.0), REAL_CONST(89235.192886070581/8.0), REAL_CONST(89258.238421188667/8.0), REAL_CONST(89281.285443931265/8.0), REAL_CONST(89304.333954106376/8.0), REAL_CONST(89327.383951522017/8.0), REAL_CONST(89350.435435986306/8.0), REAL_CONST(89373.488407307406/8.0), REAL_CONST(89396.542865293537/8.0), REAL_CONST(89419.598809753006/8.0), REAL_CONST(89442.656240494165/8.0), REAL_CONST(89465.715157325409/8.0), REAL_CONST(89488.775560055219/8.0), REAL_CONST(89511.837448492137/8.0), REAL_CONST(89534.900822444746/8.0), REAL_CONST(89557.965681721733/8.0), REAL_CONST(89581.032026131812/8.0), REAL_CONST(89604.099855483742/8.0), REAL_CONST(89627.169169586399/8.0), REAL_CONST(89650.239968248672/8.0), REAL_CONST(89673.312251279538/8.0), REAL_CONST(89696.386018488018/8.0), REAL_CONST(89719.461269683205/8.0), REAL_CONST(89742.53800467425/8.0), REAL_CONST(89765.616223270365/8.0), REAL_CONST(89788.69592528083/8.0), REAL_CONST(89811.777110514988/8.0), REAL_CONST(89834.859778782207/8.0), REAL_CONST(89857.943929891975/8.0), REAL_CONST(89881.029563653807/8.0), REAL_CONST(89904.116679877261/8.0), REAL_CONST(89927.205278372014/8.0), REAL_CONST(89950.29535894774/8.0), REAL_CONST(89973.386921414218/8.0), REAL_CONST(89996.479965581268/8.0), REAL_CONST(90019.574491258769/8.0), REAL_CONST(90042.670498256688/8.0), REAL_CONST(90065.767986385021/8.0), REAL_CONST(90088.866955453836/8.0), REAL_CONST(90111.967405273259/8.0), REAL_CONST(90135.069335653476/8.0), REAL_CONST(90158.172746404758/8.0), REAL_CONST(90181.277637337407/8.0), REAL_CONST(90204.384008261797/8.0), REAL_CONST(90227.49185898836/8.0), REAL_CONST(90250.601189327586/8.0), REAL_CONST(90273.711999090039/8.0), REAL_CONST(90296.824288086325/8.0), REAL_CONST(90319.938056127125/8.0), REAL_CONST(90343.053303023189/8.0), REAL_CONST(90366.170028585286/8.0), REAL_CONST(90389.288232624298/8.0), REAL_CONST(90412.407914951138/8.0), REAL_CONST(90435.529075376777/8.0), REAL_CONST(90458.651713712257/8.0), REAL_CONST(90481.775829768681/8.0), REAL_CONST(90504.901423357209/8.0), REAL_CONST(90528.028494289058/8.0), REAL_CONST(90551.157042375504/8.0), REAL_CONST(90574.287067427911/8.0), REAL_CONST(90597.418569257643/8.0), REAL_CONST(90620.551547676194/8.0), REAL_CONST(90643.686002495073/8.0), REAL_CONST(90666.821933525847/8.0), REAL_CONST(90689.959340580186/8.0), REAL_CONST(90713.098223469773/8.0), REAL_CONST(90736.238582006365/8.0), REAL_CONST(90759.380416001804/8.0), REAL_CONST(90782.523725267951/8.0), REAL_CONST(90805.668509616764/8.0), REAL_CONST(90828.814768860233/8.0), REAL_CONST(90851.962502810435/8.0), REAL_CONST(90875.11171127946/8.0), REAL_CONST(90898.262394079517/8.0), REAL_CONST(90921.414551022855/8.0), REAL_CONST(90944.568181921743/8.0), REAL_CONST(90967.72328658856/8.0), REAL_CONST(90990.879864835719/8.0), REAL_CONST(91014.037916475718/8.0), REAL_CONST(91037.19744132107/8.0), REAL_CONST(91060.358439184391/8.0), REAL_CONST(91083.520909878338/8.0), REAL_CONST(91106.684853215629/8.0), REAL_CONST(91129.850269009039/8.0), REAL_CONST(91153.017157071401/8.0), REAL_CONST(91176.185517215621/8.0), REAL_CONST(91199.355349254649/8.0), REAL_CONST(91222.526653001492/8.0), REAL_CONST(91245.699428269247/8.0), REAL_CONST(91268.873674871036/8.0), REAL_CONST(91292.049392620058/8.0), REAL_CONST(91315.226581329553/8.0), REAL_CONST(91338.405240812834/8.0), REAL_CONST(91361.585370883287/8.0), REAL_CONST(91384.766971354344/8.0), REAL_CONST(91407.950042039476/8.0), REAL_CONST(91431.134582752245/8.0), REAL_CONST(91454.320593306256/8.0), REAL_CONST(91477.508073515171/8.0), REAL_CONST(91500.697023192712/8.0), REAL_CONST(91523.887442152685/8.0), REAL_CONST(91547.07933020893/8.0), REAL_CONST(91570.272687175326/8.0), REAL_CONST(91593.467512865856/8.0), REAL_CONST(91616.663807094534/8.0), REAL_CONST(91639.861569675442/8.0), REAL_CONST(91663.060800422725/8.0), REAL_CONST(91686.261499150554/8.0), REAL_CONST(91709.463665673218/8.0), REAL_CONST(91732.66729980502/8.0), REAL_CONST(91755.872401360321/8.0), REAL_CONST(91779.078970153569/8.0), REAL_CONST(91802.287005999257/8.0), REAL_CONST(91825.49650871192/8.0), REAL_CONST(91848.707478106167/8.0), REAL_CONST(91871.91991399668/8.0), REAL_CONST(91895.133816198169/8.0), REAL_CONST(91918.349184525418/8.0), REAL_CONST(91941.566018793281/8.0), REAL_CONST(91964.784318816659/8.0), REAL_CONST(91988.004084410495/8.0), REAL_CONST(92011.22531538982/8.0), REAL_CONST(92034.448011569708/8.0), REAL_CONST(92057.672172765277/8.0), REAL_CONST(92080.897798791746/8.0), REAL_CONST(92104.124889464365/8.0), REAL_CONST(92127.353444598411/8.0), REAL_CONST(92150.58346400928/8.0), REAL_CONST(92173.814947512379/8.0), REAL_CONST(92197.04789492322/8.0), REAL_CONST(92220.282306057314/8.0), REAL_CONST(92243.518180730272/8.0), REAL_CONST(92266.755518757753/8.0), REAL_CONST(92289.994319955469/8.0), REAL_CONST(92313.234584139194/8.0), REAL_CONST(92336.476311124774/8.0), REAL_CONST(92359.719500728082/8.0), REAL_CONST(92382.964152765067/8.0), REAL_CONST(92406.210267051734/8.0), REAL_CONST(92429.457843404161/8.0), REAL_CONST(92452.706881638471/8.0), REAL_CONST(92475.957381570814/8.0), REAL_CONST(92499.209343017443/8.0), REAL_CONST(92522.462765794655/8.0), REAL_CONST(92545.717649718805/8.0), REAL_CONST(92568.973994606305/8.0), REAL_CONST(92592.231800273614/8.0), REAL_CONST(92615.491066537259/8.0), REAL_CONST(92638.751793213814/8.0), REAL_CONST(92662.01398011994/8.0), REAL_CONST(92685.277627072326/8.0), REAL_CONST(92708.54273388772/8.0), REAL_CONST(92731.809300382942/8.0), REAL_CONST(92755.077326374871/8.0), REAL_CONST(92778.346811680414/8.0), REAL_CONST(92801.617756116568/8.0), REAL_CONST(92824.890159500384/8.0), REAL_CONST(92848.164021648947/8.0), REAL_CONST(92871.439342379424/8.0), REAL_CONST(92894.716121509016/8.0), REAL_CONST(92917.994358855023/8.0), REAL_CONST(92941.274054234746/8.0), REAL_CONST(92964.555207465572/8.0), REAL_CONST(92987.837818364962/8.0), REAL_CONST(93011.121886750407/8.0), REAL_CONST(93034.407412439468/8.0), REAL_CONST(93057.694395249753/8.0), REAL_CONST(93080.982834998955/8.0), REAL_CONST(93104.272731504767/8.0), REAL_CONST(93127.564084584999/8.0), REAL_CONST(93150.856894057491/8.0), REAL_CONST(93174.15115974014/8.0), REAL_CONST(93197.446881450916/8.0), REAL_CONST(93220.744059007804/8.0), REAL_CONST(93244.04269222889/8.0), REAL_CONST(93267.342780932304/8.0), REAL_CONST(93290.644324936235/8.0), REAL_CONST(93313.947324058914/8.0), REAL_CONST(93337.251778118633/8.0), REAL_CONST(93360.557686933767/8.0), REAL_CONST(93383.865050322696/8.0), REAL_CONST(93407.173868103928/8.0), REAL_CONST(93430.484140095941/8.0), REAL_CONST(93453.795866117362/8.0), REAL_CONST(93477.109045986799/8.0), REAL_CONST(93500.423679522952/8.0), REAL_CONST(93523.739766544561/8.0), REAL_CONST(93547.057306870454/8.0), REAL_CONST(93570.376300319491/8.0), REAL_CONST(93593.696746710571/8.0), REAL_CONST(93617.018645862699/8.0), REAL_CONST(93640.341997594893/8.0), REAL_CONST(93663.666801726242/8.0), REAL_CONST(93686.993058075881/8.0), REAL_CONST(93710.320766463032/8.0), REAL_CONST(93733.64992670693/8.0), REAL_CONST(93756.980538626914/8.0), REAL_CONST(93780.312602042337/8.0), REAL_CONST(93803.646116772637/8.0), REAL_CONST(93826.981082637285/8.0), REAL_CONST(93850.317499455836/8.0), REAL_CONST(93873.655367047861/8.0), REAL_CONST(93896.994685233032/8.0), REAL_CONST(93920.335453831038/8.0), REAL_CONST(93943.677672661666/8.0), REAL_CONST(93967.021341544707/8.0), REAL_CONST(93990.366460300051/8.0), REAL_CONST(94013.713028747632/8.0), REAL_CONST(94037.061046707429/8.0), REAL_CONST(94060.410513999494/8.0), REAL_CONST(94083.761430443905/8.0), REAL_CONST(94107.113795860845/8.0), REAL_CONST(94130.467610070496/8.0), REAL_CONST(94153.822872893157/8.0), REAL_CONST(94177.179584149111/8.0), REAL_CONST(94200.537743658759/8.0), REAL_CONST(94223.897351242529/8.0), REAL_CONST(94247.25840672091/8.0), REAL_CONST(94270.620909914433/8.0), REAL_CONST(94293.98486064373/8.0), REAL_CONST(94317.350258729421/8.0), REAL_CONST(94340.71710399224/8.0), REAL_CONST(94364.085396252936/8.0), REAL_CONST(94387.455135332348/8.0), REAL_CONST(94410.82632105134/8.0), REAL_CONST(94434.198953230851/8.0), REAL_CONST(94457.573031691878/8.0), REAL_CONST(94480.948556255447/8.0), REAL_CONST(94504.325526742658/8.0), REAL_CONST(94527.70394297468/8.0), REAL_CONST(94551.083804772716/8.0), REAL_CONST(94574.465111958023/8.0), REAL_CONST(94597.847864351934/8.0), REAL_CONST(94621.232061775823/8.0), REAL_CONST(94644.617704051096/8.0), REAL_CONST(94668.004790999272/8.0), REAL_CONST(94691.393322441872/8.0), REAL_CONST(94714.783298200506/8.0), REAL_CONST(94738.174718096794/8.0), REAL_CONST(94761.567581952477/8.0), REAL_CONST(94784.961889589307/8.0), REAL_CONST(94808.357640829097/8.0), REAL_CONST(94831.754835493703/8.0), REAL_CONST(94855.153473405066/8.0), REAL_CONST(94878.553554385173/8.0), REAL_CONST(94901.955078256055/8.0), REAL_CONST(94925.358044839784/8.0), REAL_CONST(94948.762453958523/8.0), REAL_CONST(94972.168305434476/8.0), REAL_CONST(94995.575599089891/8.0), REAL_CONST(95018.984334747074/8.0), REAL_CONST(95042.394512228391/8.0), REAL_CONST(95065.806131356265/8.0), REAL_CONST(95089.219191953176/8.0), REAL_CONST(95112.633693841635/8.0), REAL_CONST(95136.04963684424/8.0), REAL_CONST(95159.467020783617/8.0), REAL_CONST(95182.885845482466/8.0), REAL_CONST(95206.306110763529/8.0), REAL_CONST(95229.727816449609/8.0), REAL_CONST(95253.150962363579/8.0), REAL_CONST(95276.575548328314/8.0), REAL_CONST(95300.001574166803/8.0), REAL_CONST(95323.429039702052/8.0), REAL_CONST(95346.857944757154/8.0), REAL_CONST(95370.288289155214/8.0), REAL_CONST(95393.720072719429/8.0), REAL_CONST(95417.153295273019/8.0), REAL_CONST(95440.587956639298/8.0), REAL_CONST(95464.024056641589/8.0), REAL_CONST(95487.461595103305/8.0), REAL_CONST(95510.900571847902/8.0), REAL_CONST(95534.340986698866/8.0), REAL_CONST(95557.782839479783/8.0), REAL_CONST(95581.226130014256/8.0), REAL_CONST(95604.670858125959/8.0), REAL_CONST(95628.117023638595/8.0), REAL_CONST(95651.564626375985/8.0), REAL_CONST(95675.013666161918/8.0), REAL_CONST(95698.464142820303/8.0), REAL_CONST(95721.916056175076/8.0), REAL_CONST(95745.369406050231/8.0), REAL_CONST(95768.824192269807/8.0), REAL_CONST(95792.280414657915/8.0), REAL_CONST(95815.738073038709/8.0), REAL_CONST(95839.197167236387/8.0), REAL_CONST(95862.657697075221/8.0), REAL_CONST(95886.11966237954/8.0), REAL_CONST(95909.583062973688/8.0), REAL_CONST(95933.047898682111/8.0), REAL_CONST(95956.514169329268/8.0), REAL_CONST(95979.981874739708/8.0), REAL_CONST(96003.451014738006/8.0), REAL_CONST(96026.921589148798/8.0), REAL_CONST(96050.393597796792/8.0), REAL_CONST(96073.867040506724/8.0), REAL_CONST(96097.341917103375/8.0), REAL_CONST(96120.818227411626/8.0), REAL_CONST(96144.295971256375/8.0), REAL_CONST(96167.775148462577/8.0), REAL_CONST(96191.255758855244/8.0), REAL_CONST(96214.737802259449/8.0), REAL_CONST(96238.221278500292/8.0), REAL_CONST(96261.70618740299/8.0), REAL_CONST(96285.192528792715/8.0), REAL_CONST(96308.680302494788/8.0), REAL_CONST(96332.169508334526/8.0), REAL_CONST(96355.660146137321/8.0), REAL_CONST(96379.152215728609/8.0), REAL_CONST(96402.645716933868/8.0), REAL_CONST(96426.14064957868/8.0), REAL_CONST(96449.637013488609/8.0), REAL_CONST(96473.134808489311/8.0), REAL_CONST(96496.63403440651/8.0), REAL_CONST(96520.134691065963/8.0), REAL_CONST(96543.636778293469/8.0), REAL_CONST(96567.140295914898/8.0), REAL_CONST(96590.645243756153/8.0), REAL_CONST(96614.151621643221/8.0), REAL_CONST(96637.659429402134/8.0), REAL_CONST(96661.168666858954/8.0), REAL_CONST(96684.679333839798/8.0), REAL_CONST(96708.191430170875/8.0), REAL_CONST(96731.70495567839/8.0), REAL_CONST(96755.219910188665/8.0), REAL_CONST(96778.736293528011/8.0), REAL_CONST(96802.254105522836/8.0), REAL_CONST(96825.77334599958/8.0), REAL_CONST(96849.29401478474/8.0), REAL_CONST(96872.816111704873/8.0), REAL_CONST(96896.339636586577/8.0), REAL_CONST(96919.864589256511/8.0), REAL_CONST(96943.390969541389/8.0), REAL_CONST(96966.918777267958/8.0), REAL_CONST(96990.448012263048/8.0), REAL_CONST(97013.978674353522/8.0), REAL_CONST(97037.510763366285/8.0), REAL_CONST(97061.044279128328/8.0), REAL_CONST(97084.579221466673/8.0), REAL_CONST(97108.115590208385/8.0), REAL_CONST(97131.653385180587/8.0), REAL_CONST(97155.19260621049/8.0), REAL_CONST(97178.733253125291/8.0), REAL_CONST(97202.2753257523/8.0), REAL_CONST(97225.81882391886/8.0), REAL_CONST(97249.363747452342/8.0), REAL_CONST(97272.910096180189/8.0), REAL_CONST(97296.457869929916/8.0), REAL_CONST(97320.007068529041/8.0), REAL_CONST(97343.557691805196/8.0), REAL_CONST(97367.109739586012/8.0), REAL_CONST(97390.663211699197/8.0), REAL_CONST(97414.218107972498/8.0), REAL_CONST(97437.774428233737/8.0), REAL_CONST(97461.332172310766/8.0), REAL_CONST(97484.891340031507/8.0), REAL_CONST(97508.451931223899/8.0), REAL_CONST(97532.013945715982/8.0), REAL_CONST(97555.577383335811/8.0), REAL_CONST(97579.142243911512/8.0), REAL_CONST(97602.708527271257/8.0), REAL_CONST(97626.276233243261/8.0), REAL_CONST(97649.845361655811/8.0), REAL_CONST(97673.415912337223/8.0), REAL_CONST(97696.987885115886/8.0), REAL_CONST(97720.561279820206/8.0), REAL_CONST(97744.1360962787/8.0), REAL_CONST(97767.712334319876/8.0), REAL_CONST(97791.289993772341/8.0), REAL_CONST(97814.869074464703/8.0), REAL_CONST(97838.449576225685/8.0), REAL_CONST(97862.031498883996/8.0), REAL_CONST(97885.614842268449/8.0), REAL_CONST(97909.199606207883/8.0), REAL_CONST(97932.785790531183/8.0), REAL_CONST(97956.37339506732/8.0), REAL_CONST(97979.962419645264/8.0), REAL_CONST(98003.552864094076/8.0), REAL_CONST(98027.144728242856/8.0), REAL_CONST(98050.738011920766/8.0), REAL_CONST(98074.332714956996/8.0), REAL_CONST(98097.928837180807/8.0), REAL_CONST(98121.526378421506/8.0), REAL_CONST(98145.125338508456/8.0), REAL_CONST(98168.725717271067/8.0), REAL_CONST(98192.327514538789/8.0), REAL_CONST(98215.930730141132/8.0), REAL_CONST(98239.535363907664/8.0), REAL_CONST(98263.141415668011/8.0), REAL_CONST(98286.748885251814/8.0), REAL_CONST(98310.357772488816/8.0), REAL_CONST(98333.968077208759/8.0), REAL_CONST(98357.579799241488/8.0), REAL_CONST(98381.192938416847/8.0), REAL_CONST(98404.807494564782/8.0), REAL_CONST(98428.42346751524/8.0), REAL_CONST(98452.040857098269/8.0), REAL_CONST(98475.659663143917/8.0), REAL_CONST(98499.27988548232/8.0), REAL_CONST(98522.901523943656/8.0), REAL_CONST(98546.524578358163/8.0), REAL_CONST(98570.149048556093/8.0), REAL_CONST(98593.774934367786/8.0), REAL_CONST(98617.402235623624/8.0), REAL_CONST(98641.030952154048/8.0), REAL_CONST(98664.661083789513/8.0), REAL_CONST(98688.292630360564/8.0), REAL_CONST(98711.925591697771/8.0), REAL_CONST(98735.559967631794/8.0), REAL_CONST(98759.195757993293/8.0), REAL_CONST(98782.832962613014/8.0), REAL_CONST(98806.471581321734/8.0), REAL_CONST(98830.111613950285/8.0), REAL_CONST(98853.753060329575/8.0), REAL_CONST(98877.39592029051/8.0), REAL_CONST(98901.040193664099/8.0), REAL_CONST(98924.68588028138/8.0), REAL_CONST(98948.33297997342/8.0), REAL_CONST(98971.981492571387/8.0), REAL_CONST(98995.63141790645/8.0), REAL_CONST(99019.282755809851/8.0), REAL_CONST(99042.935506112874/8.0), REAL_CONST(99066.589668646877/8.0), REAL_CONST(99090.245243243233/8.0), REAL_CONST(99113.902229733401/8.0), REAL_CONST(99137.560627948857/8.0), REAL_CONST(99161.220437721131/8.0), REAL_CONST(99184.881658881859/8.0), REAL_CONST(99208.544291262631/8.0), REAL_CONST(99232.208334695169/8.0), REAL_CONST(99255.87378901121/8.0), REAL_CONST(99279.540654042547/8.0), REAL_CONST(99303.208929621018/8.0), REAL_CONST(99326.878615578535/8.0), REAL_CONST(99350.549711746993/8.0), REAL_CONST(99374.222217958435/8.0), REAL_CONST(99397.896134044888/8.0), REAL_CONST(99421.571459838422/8.0), REAL_CONST(99445.248195171211/8.0), REAL_CONST(99468.926339875441/8.0), REAL_CONST(99492.605893783344/8.0), REAL_CONST(99516.286856727209/8.0), REAL_CONST(99539.969228539398/8.0), REAL_CONST(99563.653009052287/8.0), REAL_CONST(99587.338198098325/8.0), REAL_CONST(99611.024795510006/8.0), REAL_CONST(99634.712801119866/8.0), REAL_CONST(99658.402214760499/8.0), REAL_CONST(99682.093036264545/8.0), REAL_CONST(99705.785265464699/8.0), REAL_CONST(99729.478902193689/8.0), REAL_CONST(99753.173946284325/8.0), REAL_CONST(99776.870397569437/8.0), REAL_CONST(99800.56825588191/8.0), REAL_CONST(99824.267521054688/8.0), REAL_CONST(99847.968192920773/8.0), REAL_CONST(99871.670271313182/8.0), REAL_CONST(99895.373756065004/8.0), REAL_CONST(99919.078647009388/8.0), REAL_CONST(99942.78494397951/8.0), REAL_CONST(99966.492646808634/8.0), REAL_CONST(99990.20175533001/8.0), REAL_CONST(100013.91226937699/8.0), REAL_CONST(100037.62418878295/8.0), REAL_CONST(100061.33751338134/8.0), REAL_CONST(100085.05224300563/8.0), REAL_CONST(100108.76837748935/8.0), REAL_CONST(100132.4859166661/8.0), REAL_CONST(100156.2048603695/8.0), REAL_CONST(100179.92520843323/8.0), REAL_CONST(100203.64696069101/8.0), REAL_CONST(100227.37011697664/8.0), REAL_CONST(100251.09467712394/8.0), REAL_CONST(100274.82064096678/8.0), REAL_CONST(100298.54800833909/8.0), REAL_CONST(100322.27677907483/8.0), REAL_CONST(100346.00695300807/8.0), REAL_CONST(100369.73852997283/8.0), REAL_CONST(100393.47150980328/8.0), REAL_CONST(100417.20589233354/8.0), REAL_CONST(100440.94167739789/8.0), REAL_CONST(100464.67886483055/8.0), REAL_CONST(100488.41745446586/8.0), REAL_CONST(100512.1574461382/8.0), REAL_CONST(100535.89883968196/8.0), REAL_CONST(100559.64163493161/8.0), REAL_CONST(100583.38583172169/8.0), REAL_CONST(100607.13142988674/8.0), REAL_CONST(100630.87842926137/8.0), REAL_CONST(100654.62682968024/8.0), REAL_CONST(100678.37663097809/8.0), REAL_CONST(100702.12783298964/8.0), REAL_CONST(100725.88043554971/8.0), REAL_CONST(100749.63443849317/8.0), REAL_CONST(100773.38984165489/8.0), REAL_CONST(100797.14664486986/8.0), REAL_CONST(100820.90484797307/8.0), REAL_CONST(100844.66445079957/8.0), REAL_CONST(100868.42545318443/8.0), REAL_CONST(100892.18785496285/8.0), REAL_CONST(100915.95165596998/8.0), REAL_CONST(100939.71685604109/8.0), REAL_CONST(100963.48345501146/8.0), REAL_CONST(100987.25145271645/8.0), REAL_CONST(101011.02084899142/8.0), REAL_CONST(101034.79164367182/8.0), REAL_CONST(101058.56383659317/8.0), REAL_CONST(101082.33742759094/8.0), REAL_CONST(101106.11241650078/8.0), REAL_CONST(101129.88880315828/8.0), REAL_CONST(101153.66658739912/8.0), REAL_CONST(101177.44576905905/8.0), REAL_CONST(101201.22634797383/8.0), REAL_CONST(101225.00832397929/8.0), REAL_CONST(101248.7916969113/8.0), REAL_CONST(101272.57646660579/8.0), REAL_CONST(101296.36263289873/8.0), REAL_CONST(101320.15019562612/8.0), REAL_CONST(101343.93915462404/8.0), REAL_CONST(101367.7295097286/8.0), REAL_CONST(101391.52126077596/8.0), REAL_CONST(101415.31440760233/8.0), REAL_CONST(101439.10895004397/8.0), REAL_CONST(101462.9048879372/8.0), REAL_CONST(101486.70222111834/8.0), REAL_CONST(101510.50094942382/8.0), REAL_CONST(101534.30107269008/8.0), REAL_CONST(101558.10259075361/8.0), REAL_CONST(101581.90550345098/8.0), REAL_CONST(101605.70981061876/8.0), REAL_CONST(101629.5155120936/8.0), REAL_CONST(101653.32260771218/8.0), REAL_CONST(101677.13109731126/8.0), REAL_CONST(101700.9409807276/8.0), REAL_CONST(101724.75225779804/8.0), REAL_CONST(101748.56492835947/8.0), REAL_CONST(101772.37899224881/8.0), REAL_CONST(101796.19444930303/8.0), REAL_CONST(101820.01129935916/8.0), REAL_CONST(101843.82954225427/8.0), REAL_CONST(101867.64917782549/8.0), REAL_CONST(101891.47020590997/8.0), REAL_CONST(101915.29262634492/8.0), REAL_CONST(101939.11643896763/8.0), REAL_CONST(101962.94164361537/8.0), REAL_CONST(101986.76824012553/8.0), REAL_CONST(102010.59622833549/8.0), REAL_CONST(102034.42560808272/8.0), REAL_CONST(102058.25637920471/8.0), REAL_CONST(102082.08854153901/8.0), REAL_CONST(102105.9220949232/8.0), REAL_CONST(102129.75703919494/8.0), REAL_CONST(102153.59337419191/8.0), REAL_CONST(102177.43109975185/8.0), REAL_CONST(102201.27021571253/8.0), REAL_CONST(102225.1107219118/8.0), REAL_CONST(102248.95261818753/8.0), REAL_CONST(102272.79590437764/8.0), REAL_CONST(102296.64058032009/8.0), REAL_CONST(102320.48664585294/8.0), REAL_CONST(102344.33410081422/8.0), REAL_CONST(102368.18294504205/8.0), REAL_CONST(102392.03317837461/8.0), REAL_CONST(102415.88480065008/8.0), REAL_CONST(102439.73781170673/8.0), REAL_CONST(102463.59221138287/8.0), REAL_CONST(102487.44799951684/8.0), REAL_CONST(102511.30517594704/8.0), REAL_CONST(102535.1637405119/8.0), REAL_CONST(102559.02369304992/8.0), REAL_CONST(102582.88503339965/8.0), REAL_CONST(102606.74776139967/8.0), REAL_CONST(102630.61187688859/8.0), REAL_CONST(102654.4773797051/8.0), REAL_CONST(102678.34426968795/8.0), REAL_CONST(102702.21254667587/8.0), REAL_CONST(102726.08221050771/8.0), REAL_CONST(102749.95326102231/8.0), REAL_CONST(102773.8256980586/8.0), REAL_CONST(102797.69952145554/8.0), REAL_CONST(102821.57473105213/8.0), REAL_CONST(102845.45132668741/8.0), REAL_CONST(102869.32930820051/8.0), REAL_CONST(102893.20867543056/8.0), REAL_CONST(102917.08942821674/8.0), REAL_CONST(102940.97156639832/8.0), REAL_CONST(102964.85508981455/8.0), REAL_CONST(102988.73999830478/8.0), REAL_CONST(103012.6262917084/8.0), REAL_CONST(103036.51396986481/8.0), REAL_CONST(103060.40303261351/8.0), REAL_CONST(103084.293479794/8.0), REAL_CONST(103108.18531124585/8.0), REAL_CONST(103132.07852680866/8.0), REAL_CONST(103155.97312632212/8.0), REAL_CONST(103179.8691096259/8.0), REAL_CONST(103203.76647655977/8.0), REAL_CONST(103227.66522696352/8.0), REAL_CONST(103251.56536067701/8.0), REAL_CONST(103275.46687754011/8.0), REAL_CONST(103299.36977739276/8.0), REAL_CONST(103323.27406007495/8.0), REAL_CONST(103347.1797254267/8.0), REAL_CONST(103371.0867732881/8.0), REAL_CONST(103394.99520349925/8.0), REAL_CONST(103418.90501590034/8.0), REAL_CONST(103442.81621033157/8.0), REAL_CONST(103466.72878663319/8.0), REAL_CONST(103490.64274464553/8.0), REAL_CONST(103514.55808420894/8.0), REAL_CONST(103538.4748051638/8.0), REAL_CONST(103562.39290735057/8.0), REAL_CONST(103586.31239060973/8.0), REAL_CONST(103610.23325478184/8.0), REAL_CONST(103634.15549970744/8.0), REAL_CONST(103658.07912522719/8.0), REAL_CONST(103682.00413118176/8.0), REAL_CONST(103705.93051741188/8.0), REAL_CONST(103729.85828375829/8.0), REAL_CONST(103753.78743006183/8.0), REAL_CONST(103777.71795616332/8.0), REAL_CONST(103801.64986190372/8.0), REAL_CONST(103825.58314712394/8.0), REAL_CONST(103849.51781166498/8.0), REAL_CONST(103873.4538553679/8.0), REAL_CONST(103897.39127807376/8.0), REAL_CONST(103921.33007962372/8.0), REAL_CONST(103945.27025985894/8.0), REAL_CONST(103969.21181862066/8.0), REAL_CONST(103993.15475575015/8.0), REAL_CONST(104017.0990710887/8.0), REAL_CONST(104041.0447644777/8.0), REAL_CONST(104064.99183575854/8.0), REAL_CONST(104088.94028477269/8.0), REAL_CONST(104112.89011136163/8.0), REAL_CONST(104136.84131536692/8.0), REAL_CONST(104160.79389663014/8.0), REAL_CONST(104184.74785499295/8.0), REAL_CONST(104208.70319029699/8.0), REAL_CONST(104232.65990238401/8.0), REAL_CONST(104256.61799109577/8.0), REAL_CONST(104280.57745627411/8.0), REAL_CONST(104304.53829776087/8.0), REAL_CONST(104328.50051539797/8.0), REAL_CONST(104352.46410902737/8.0), REAL_CONST(104376.42907849104/8.0), REAL_CONST(104400.39542363105/8.0), REAL_CONST(104424.36314428948/8.0), REAL_CONST(104448.33224030846/8.0), REAL_CONST(104472.3027115302/8.0), REAL_CONST(104496.27455779689/8.0), REAL_CONST(104520.24777895081/8.0), REAL_CONST(104544.22237483428/8.0), REAL_CONST(104568.19834528965/8.0), REAL_CONST(104592.17569015936/8.0), REAL_CONST(104616.15440928582/8.0), REAL_CONST(104640.13450251156/8.0), REAL_CONST(104664.1159696791/8.0), REAL_CONST(104688.09881063103/8.0), REAL_CONST(104712.08302520998/8.0), REAL_CONST(104736.06861325864/8.0), REAL_CONST(104760.05557461972/8.0), REAL_CONST(104784.043909136/8.0), REAL_CONST(104808.03361665027/8.0), REAL_CONST(104832.0246970054/8.0), REAL_CONST(104856.01715004431/8.0), REAL_CONST(104880.01097560991/8.0), REAL_CONST(104904.00617354522/8.0), REAL_CONST(104928.00274369326/8.0), REAL_CONST(104952.00068589712/8.0), REAL_CONST(104975.99999999993/8.0), REAL_CONST(105000.00068584486/8.0), REAL_CONST(105024.00274327511/8.0), REAL_CONST(105048.00617213396/8.0), REAL_CONST(105072.0109722647/8.0), REAL_CONST(105096.0171435107/8.0), REAL_CONST(105120.02468571534/8.0), REAL_CONST(105144.03359872208/8.0), REAL_CONST(105168.04388237436/8.0), REAL_CONST(105192.05553651576/8.0), REAL_CONST(105216.06856098982/8.0), REAL_CONST(105240.08295564017/8.0), REAL_CONST(105264.09872031047/8.0), REAL_CONST(105288.11585484444/8.0), REAL_CONST(105312.13435908582/8.0), REAL_CONST(105336.1542328784/8.0), REAL_CONST(105360.17547606604/8.0), REAL_CONST(105384.19808849262/8.0), REAL_CONST(105408.22207000206/8.0), REAL_CONST(105432.24742043833/8.0), REAL_CONST(105456.27413964548/8.0), REAL_CONST(105480.30222746753/8.0), REAL_CONST(105504.33168374863/8.0), REAL_CONST(105528.36250833291/8.0), REAL_CONST(105552.39470106458/8.0), REAL_CONST(105576.42826178786/8.0), REAL_CONST(105600.46319034706/8.0), REAL_CONST(105624.49948658649/8.0), REAL_CONST(105648.53715035053/8.0), REAL_CONST(105672.5761814836/8.0), REAL_CONST(105696.61657983017/8.0), REAL_CONST(105720.65834523473/8.0), REAL_CONST(105744.70147754184/8.0), REAL_CONST(105768.7459765961/8.0), REAL_CONST(105792.79184224214/8.0), REAL_CONST(105816.83907432464/8.0), REAL_CONST(105840.88767268835/8.0), REAL_CONST(105864.93763717801/8.0), REAL_CONST(105888.98896763846/8.0), REAL_CONST(105913.04166391456/8.0), REAL_CONST(105937.09572585119/8.0), REAL_CONST(105961.15115329332/8.0), REAL_CONST(105985.20794608595/8.0), REAL_CONST(106009.26610407409/8.0), REAL_CONST(106033.32562710284/8.0), REAL_CONST(106057.38651501729/8.0), REAL_CONST(106081.44876766266/8.0), REAL_CONST(106105.51238488412/8.0), REAL_CONST(106129.57736652695/8.0), REAL_CONST(106153.64371243643/8.0), REAL_CONST(106177.71142245791/8.0), REAL_CONST(106201.78049643678/8.0), REAL_CONST(106225.85093421848/8.0), REAL_CONST(106249.92273564848/8.0), REAL_CONST(106273.99590057228/8.0), REAL_CONST(106298.07042883546/8.0), REAL_CONST(106322.14632028362/8.0), REAL_CONST(106346.22357476239/8.0), REAL_CONST(106370.30219211751/8.0), REAL_CONST(106394.38217219469/8.0), REAL_CONST(106418.46351483969/8.0), REAL_CONST(106442.54621989837/8.0), REAL_CONST(106466.63028721658/8.0), REAL_CONST(106490.71571664025/8.0), REAL_CONST(106514.80250801529/8.0), REAL_CONST(106538.89066118775/8.0), REAL_CONST(106562.98017600364/8.0), REAL_CONST(106587.07105230905/8.0), REAL_CONST(106611.16328995011/8.0), REAL_CONST(106635.25688877302/8.0), REAL_CONST(106659.35184862395/8.0), REAL_CONST(106683.44816934918/8.0), REAL_CONST(106707.54585079502/8.0), REAL_CONST(106731.64489280782/8.0), REAL_CONST(106755.74529523395/8.0), REAL_CONST(106779.84705791986/8.0), REAL_CONST(106803.95018071201/8.0), REAL_CONST(106828.05466345693/8.0), REAL_CONST(106852.16050600118/8.0), REAL_CONST(106876.26770819137/8.0), REAL_CONST(106900.37626987413/8.0), REAL_CONST(106924.48619089619/8.0), REAL_CONST(106948.59747110425/8.0), REAL_CONST(106972.71011034511/8.0), REAL_CONST(106996.82410846559/8.0), REAL_CONST(107020.93946531253/8.0), REAL_CONST(107045.05618073288/8.0), REAL_CONST(107069.17425457356/8.0), REAL_CONST(107093.29368668159/8.0), REAL_CONST(107117.41447690397/8.0), REAL_CONST(107141.53662508781/8.0), REAL_CONST(107165.66013108024/8.0), REAL_CONST(107189.7849947284/8.0), REAL_CONST(107213.91121587952/8.0), REAL_CONST(107238.03879438085/8.0), REAL_CONST(107262.16773007967/8.0), REAL_CONST(107286.29802282334/8.0), REAL_CONST(107310.42967245923/8.0), REAL_CONST(107334.56267883476/8.0), REAL_CONST(107358.69704179741/8.0), REAL_CONST(107382.83276119467/8.0), REAL_CONST(107406.96983687414/8.0), REAL_CONST(107431.10826868335/8.0), REAL_CONST(107455.24805646999/8.0), REAL_CONST(107479.38920008171/8.0), REAL_CONST(107503.53169936626/8.0), REAL_CONST(107527.67555417139/8.0), REAL_CONST(107551.82076434491/8.0), REAL_CONST(107575.96732973469/8.0), REAL_CONST(107600.11525018861/8.0), REAL_CONST(107624.26452555459/8.0), REAL_CONST(107648.41515568066/8.0), REAL_CONST(107672.56714041479/8.0), REAL_CONST(107696.72047960508/8.0), REAL_CONST(107720.87517309963/8.0), REAL_CONST(107745.03122074658/8.0), REAL_CONST(107769.18862239413/8.0), REAL_CONST(107793.34737789053/8.0), REAL_CONST(107817.50748708403/8.0), REAL_CONST(107841.66894982298/8.0), REAL_CONST(107865.83176595572/8.0), REAL_CONST(107889.99593533068/8.0), REAL_CONST(107914.16145779629/8.0), REAL_CONST(107938.32833320105/8.0), REAL_CONST(107962.49656139348/8.0), REAL_CONST(107986.66614222217/8.0), REAL_CONST(108010.83707553572/8.0), REAL_CONST(108035.00936118282/8.0), REAL_CONST(108059.18299901215/8.0), REAL_CONST(108083.35798887245/8.0), REAL_CONST(108107.53433061253/8.0), REAL_CONST(108131.71202408121/8.0), REAL_CONST(108155.89106912735/8.0), REAL_CONST(108180.07146559987/8.0), REAL_CONST(108204.25321334775/8.0), REAL_CONST(108228.43631221994/8.0), REAL_CONST(108252.62076206553/8.0), REAL_CONST(108276.80656273357/8.0), REAL_CONST(108300.99371407321/8.0), REAL_CONST(108325.18221593359/8.0), REAL_CONST(108349.37206816394/8.0), REAL_CONST(108373.56327061349/8.0), REAL_CONST(108397.75582313156/8.0), REAL_CONST(108421.94972556747/8.0), REAL_CONST(108446.1449777706/8.0), REAL_CONST(108470.34157959036/8.0), REAL_CONST(108494.53953087622/8.0), REAL_CONST(108518.73883147769/8.0), REAL_CONST(108542.93948124432/8.0), REAL_CONST(108567.14148002568/8.0), REAL_CONST(108591.34482767139/8.0), REAL_CONST(108615.54952403114/8.0), REAL_CONST(108639.75556895464/8.0), REAL_CONST(108663.96296229165/8.0), REAL_CONST(108688.17170389196/8.0), REAL_CONST(108712.38179360541/8.0), REAL_CONST(108736.59323128188/8.0), REAL_CONST(108760.80601677128/8.0), REAL_CONST(108785.02014992358/8.0), REAL_CONST(108809.23563058881/8.0), REAL_CONST(108833.45245861699/8.0), REAL_CONST(108857.67063385822/8.0), REAL_CONST(108881.89015616261/8.0), REAL_CONST(108906.11102538036/8.0), REAL_CONST(108930.33324136167/8.0), REAL_CONST(108954.55680395682/8.0), REAL_CONST(108978.78171301607/8.0), REAL_CONST(109003.00796838976/8.0), REAL_CONST(109027.23556992831/8.0), REAL_CONST(109051.46451748211/8.0), REAL_CONST(109075.69481090162/8.0), REAL_CONST(109099.92645003737/8.0), REAL_CONST(109124.15943473989/8.0), REAL_CONST(109148.39376485976/8.0), REAL_CONST(109172.62944024763/8.0), REAL_CONST(109196.86646075416/8.0), REAL_CONST(109221.10482623006/8.0), REAL_CONST(109245.34453652608/8.0), REAL_CONST(109269.58559149304/8.0), REAL_CONST(109293.82799098175/8.0), REAL_CONST(109318.07173484311/8.0), REAL_CONST(109342.31682292801/8.0), REAL_CONST(109366.56325508743/8.0), REAL_CONST(109390.81103117237/8.0), REAL_CONST(109415.06015103387/8.0), REAL_CONST(109439.31061452301/8.0), REAL_CONST(109463.56242149093/8.0), REAL_CONST(109487.8155717888/8.0), REAL_CONST(109512.07006526781/8.0), REAL_CONST(109536.3259017792/8.0), REAL_CONST(109560.58308117429/8.0), REAL_CONST(109584.8416033044/8.0), REAL_CONST(109609.1014680209/8.0), REAL_CONST(109633.36267517522/8.0), REAL_CONST(109657.62522461878/8.0), REAL_CONST(109681.88911620311/8.0), REAL_CONST(109706.15434977971/8.0), REAL_CONST(109730.4209252002/8.0), REAL_CONST(109754.68884231619/8.0), REAL_CONST(109778.95810097932/8.0), REAL_CONST(109803.22870104131/8.0), REAL_CONST(109827.50064235389/8.0), REAL_CONST(109851.77392476884/8.0), REAL_CONST(109876.04854813802/8.0), REAL_CONST(109900.32451231324/8.0), REAL_CONST(109924.60181714644/8.0), REAL_CONST(109948.88046248957/8.0), REAL_CONST(109973.1604481946/8.0), REAL_CONST(109997.44177411357/8.0), REAL_CONST(110021.72444009855/8.0), REAL_CONST(110046.00844600165/8.0), REAL_CONST(110070.29379167501/8.0), REAL_CONST(110094.58047697082/8.0), REAL_CONST(110118.86850174134/8.0), REAL_CONST(110143.15786583882/8.0), REAL_CONST(110167.44856911557/8.0), REAL_CONST(110191.74061142397/8.0), REAL_CONST(110216.03399261639/8.0), REAL_CONST(110240.32871254528/8.0), REAL_CONST(110264.62477106311/8.0), REAL_CONST(110288.9221680224/8.0), REAL_CONST(110313.22090327571/8.0), REAL_CONST(110337.52097667565/8.0), REAL_CONST(110361.82238807483/8.0), REAL_CONST(110386.12513732594/8.0), REAL_CONST(110410.42922428172/8.0), REAL_CONST(110434.73464879491/8.0), REAL_CONST(110459.04141071832/8.0), REAL_CONST(110483.34950990479/8.0), REAL_CONST(110507.6589462072/8.0), REAL_CONST(110531.96971947847/8.0), REAL_CONST(110556.28182957157/8.0), REAL_CONST(110580.5952763395/8.0), REAL_CONST(110604.91005963532/8.0), REAL_CONST(110629.22617931209/8.0), REAL_CONST(110653.54363522294/8.0), REAL_CONST(110677.86242722106/8.0), REAL_CONST(110702.18255515963/8.0), REAL_CONST(110726.50401889188/8.0), REAL_CONST(110750.82681827113/8.0), REAL_CONST(110775.1509531507/8.0), REAL_CONST(110799.47642338395/8.0), REAL_CONST(110823.80322882428/8.0), REAL_CONST(110848.13136932514/8.0), REAL_CONST(110872.46084474004/8.0), REAL_CONST(110896.79165492248/8.0), REAL_CONST(110921.12379972603/8.0), REAL_CONST(110945.4572790043/8.0), REAL_CONST(110969.79209261097/8.0), REAL_CONST(110994.12824039967/8.0), REAL_CONST(111018.46572222417/8.0), REAL_CONST(111042.80453793822/8.0), REAL_CONST(111067.14468739564/8.0), REAL_CONST(111091.48617045028/8.0), REAL_CONST(111115.82898695602/8.0), REAL_CONST(111140.1731367668/8.0), REAL_CONST(111164.51861973655/8.0), REAL_CONST(111188.86543571933/8.0), REAL_CONST(111213.21358456917/8.0), REAL_CONST(111237.56306614014/8.0), REAL_CONST(111261.91388028639/8.0), REAL_CONST(111286.26602686207/8.0), REAL_CONST(111310.61950572141/8.0), REAL_CONST(111334.97431671864/8.0), REAL_CONST(111359.33045970804/8.0), REAL_CONST(111383.68793454397/8.0), REAL_CONST(111408.04674108078/8.0), REAL_CONST(111432.40687917286/8.0), REAL_CONST(111456.76834867468/8.0), REAL_CONST(111481.13114944073/8.0), REAL_CONST(111505.49528132551/8.0), REAL_CONST(111529.86074418361/8.0), REAL_CONST(111554.22753786964/8.0), REAL_CONST(111578.59566223821/8.0), REAL_CONST(111602.96511714405/8.0), REAL_CONST(111627.33590244185/8.0), REAL_CONST(111651.7080179864/8.0), REAL_CONST(111676.08146363248/8.0), REAL_CONST(111700.45623923496/8.0), REAL_CONST(111724.8323446487/8.0), REAL_CONST(111749.20977972864/8.0), REAL_CONST(111773.58854432974/8.0), REAL_CONST(111797.96863830699/8.0), REAL_CONST(111822.35006151545/8.0), REAL_CONST(111846.73281381019/8.0), REAL_CONST(111871.11689504632/8.0), REAL_CONST(111895.50230507903/8.0), REAL_CONST(111919.8890437635/8.0), REAL_CONST(111944.27711095495/8.0), REAL_CONST(111968.6665065087/8.0), REAL_CONST(111993.05723028004/8.0), REAL_CONST(112017.44928212435/8.0), REAL_CONST(112041.842661897/8.0), REAL_CONST(112066.23736945343/8.0), REAL_CONST(112090.63340464912/8.0), REAL_CONST(112115.03076733962/8.0), REAL_CONST(112139.42945738042/8.0), REAL_CONST(112163.82947462716/8.0), REAL_CONST(112188.23081893545/8.0), REAL_CONST(112212.63349016097/8.0), REAL_CONST(112237.03748815943/8.0), REAL_CONST(112261.44281278658/8.0), REAL_CONST(112285.84946389822/8.0), REAL_CONST(112310.25744135017/8.0), REAL_CONST(112334.66674499828/8.0), REAL_CONST(112359.07737469849/8.0), REAL_CONST(112383.48933030672/8.0), REAL_CONST(112407.90261167898/8.0), REAL_CONST(112432.31721867126/8.0), REAL_CONST(112456.73315113965/8.0), REAL_CONST(112481.15040894024/8.0), REAL_CONST(112505.56899192919/8.0), REAL_CONST(112529.98889996267/8.0), REAL_CONST(112554.41013289688/8.0), REAL_CONST(112578.8326905881/8.0), REAL_CONST(112603.25657289263/8.0), REAL_CONST(112627.68177966679/8.0), REAL_CONST(112652.10831076698/8.0), REAL_CONST(112676.53616604958/8.0), REAL_CONST(112700.96534537108/8.0), REAL_CONST(112725.39584858794/8.0), REAL_CONST(112749.82767555672/8.0), REAL_CONST(112774.26082613398/8.0), REAL_CONST(112798.6953001763/8.0), REAL_CONST(112823.13109754038/8.0), REAL_CONST(112847.56821808286/8.0), REAL_CONST(112872.00666166049/8.0), REAL_CONST(112896.44642813003/8.0), REAL_CONST(112920.88751734827/8.0), REAL_CONST(112945.32992917208/8.0), REAL_CONST(112969.77366345831/8.0), REAL_CONST(112994.21872006389/8.0), REAL_CONST(113018.66509884578/8.0), REAL_CONST(113043.11279966099/8.0), REAL_CONST(113067.56182236652/8.0), REAL_CONST(113092.01216681948/8.0), REAL_CONST(113116.46383287695/8.0), REAL_CONST(113140.9168203961/8.0), REAL_CONST(113165.37112923413/8.0), REAL_CONST(113189.82675924824/8.0), REAL_CONST(113214.28371029573/8.0), REAL_CONST(113238.74198223387/8.0), REAL_CONST(113263.20157492002/8.0), REAL_CONST(113287.66248821157/8.0), REAL_CONST(113312.12472196593/8.0), REAL_CONST(113336.58827604055/8.0), REAL_CONST(113361.05315029295/8.0), REAL_CONST(113385.51934458067/8.0), REAL_CONST(113409.98685876124/8.0), REAL_CONST(113434.45569269233/8.0), REAL_CONST(113458.92584623155/8.0), REAL_CONST(113483.39731923661/8.0), REAL_CONST(113507.87011156522/8.0), REAL_CONST(113532.34422307517/8.0), REAL_CONST(113556.81965362425/8.0), REAL_CONST(113581.2964030703/8.0), REAL_CONST(113605.77447127122/8.0), REAL_CONST(113630.25385808491/8.0), REAL_CONST(113654.73456336933/8.0), REAL_CONST(113679.2165869825/8.0), REAL_CONST(113703.69992878241/8.0), REAL_CONST(113728.18458862718/8.0), REAL_CONST(113752.67056637487/8.0), REAL_CONST(113777.15786188368/8.0), REAL_CONST(113801.64647501177/8.0), REAL_CONST(113826.13640561736/8.0), REAL_CONST(113850.62765355874/8.0), REAL_CONST(113875.12021869418/8.0), REAL_CONST(113899.61410088204/8.0), REAL_CONST(113924.1092999807/8.0), REAL_CONST(113948.60581584855/8.0), REAL_CONST(113973.10364834407/8.0), REAL_CONST(113997.60279732574/8.0), REAL_CONST(114022.1032626521/8.0), REAL_CONST(114046.60504418171/8.0), REAL_CONST(114071.10814177318/8.0), REAL_CONST(114095.61255528514/8.0), REAL_CONST(114120.11828457628/8.0), REAL_CONST(114144.62532950533/8.0), REAL_CONST(114169.13368993104/8.0), REAL_CONST(114193.6433657122/8.0), REAL_CONST(114218.15435670764/8.0), REAL_CONST(114242.66666277625/8.0), REAL_CONST(114267.18028377694/8.0), REAL_CONST(114291.69521956862/8.0), REAL_CONST(114316.21147001031/8.0), REAL_CONST(114340.72903496103/8.0), REAL_CONST(114365.24791427983/8.0), REAL_CONST(114389.7681078258/8.0), REAL_CONST(114414.2896154581/8.0), REAL_CONST(114438.81243703589/8.0), REAL_CONST(114463.33657241837/8.0), REAL_CONST(114487.8620214648/8.0), REAL_CONST(114512.38878403447/8.0), REAL_CONST(114536.91685998671/8.0), REAL_CONST(114561.44624918087/8.0), REAL_CONST(114585.97695147636/8.0), REAL_CONST(114610.5089667326/8.0), REAL_CONST(114635.04229480909/8.0), REAL_CONST(114659.57693556532/8.0), REAL_CONST(114684.11288886084/8.0), REAL_CONST(114708.65015455526/8.0), REAL_CONST(114733.18873250818/8.0), REAL_CONST(114757.72862257928/8.0), REAL_CONST(114782.26982462825/8.0), REAL_CONST(114806.81233851484/8.0), REAL_CONST(114831.35616409882/8.0), REAL_CONST(114855.90130123998/8.0), REAL_CONST(114880.44774979822/8.0), REAL_CONST(114904.99550963337/8.0), REAL_CONST(114929.5445806054/8.0), REAL_CONST(114954.09496257425/8.0), REAL_CONST(114978.64665539992/8.0), REAL_CONST(115003.19965894247/8.0), REAL_CONST(115027.75397306195/8.0), REAL_CONST(115052.30959761847/8.0), REAL_CONST(115076.86653247218/8.0), REAL_CONST(115101.42477748329/8.0), REAL_CONST(115125.984332512/8.0), REAL_CONST(115150.54519741859/8.0), REAL_CONST(115175.10737206334/8.0), REAL_CONST(115199.67085630659/8.0), REAL_CONST(115224.23565000873/8.0), REAL_CONST(115248.80175303014/8.0), REAL_CONST(115273.3691652313/8.0), REAL_CONST(115297.93788647266/8.0), REAL_CONST(115322.50791661476/8.0), REAL_CONST(115347.07925551817/8.0), REAL_CONST(115371.65190304347/8.0), REAL_CONST(115396.22585905129/8.0), REAL_CONST(115420.80112340231/8.0), REAL_CONST(115445.37769595724/8.0), REAL_CONST(115469.95557657682/8.0), REAL_CONST(115494.53476512182/8.0), REAL_CONST(115519.11526145306/8.0), REAL_CONST(115543.69706543141/8.0), REAL_CONST(115568.28017691776/8.0), REAL_CONST(115592.86459577303/8.0), REAL_CONST(115617.4503218582/8.0), REAL_CONST(115642.03735503425/8.0), REAL_CONST(115666.62569516223/8.0), REAL_CONST(115691.21534210323/8.0), REAL_CONST(115715.80629571836/8.0), REAL_CONST(115740.39855586876/8.0), REAL_CONST(115764.99212241563/8.0), REAL_CONST(115789.58699522018/8.0), REAL_CONST(115814.18317414368/8.0), REAL_CONST(115838.78065904744/8.0), REAL_CONST(115863.37944979276/8.0), REAL_CONST(115887.97954624105/8.0), REAL_CONST(115912.5809482537/8.0), REAL_CONST(115937.18365569216/8.0), REAL_CONST(115961.78766841792/8.0), REAL_CONST(115986.39298629249/8.0), REAL_CONST(116010.99960917742/8.0), REAL_CONST(116035.60753693432/8.0), REAL_CONST(116060.21676942479/8.0), REAL_CONST(116084.82730651053/8.0), REAL_CONST(116109.43914805322/8.0), REAL_CONST(116134.0522939146/8.0), REAL_CONST(116158.66674395646/8.0), REAL_CONST(116183.2824980406/8.0), REAL_CONST(116207.89955602887/8.0), REAL_CONST(116232.51791778316/8.0), REAL_CONST(116257.13758316539/8.0), REAL_CONST(116281.75855203751/8.0), REAL_CONST(116306.38082426153/8.0), REAL_CONST(116331.00439969949/8.0), REAL_CONST(116355.62927821343/8.0), REAL_CONST(116380.25545966547/8.0), REAL_CONST(116404.88294391775/8.0), REAL_CONST(116429.51173083246/8.0), REAL_CONST(116454.14182027178/8.0), REAL_CONST(116478.77321209799/8.0), REAL_CONST(116503.40590617337/8.0), REAL_CONST(116528.03990236025/8.0), REAL_CONST(116552.67520052097/8.0), REAL_CONST(116577.31180051794/8.0), REAL_CONST(116601.94970221359/8.0), REAL_CONST(116626.5889054704/8.0), REAL_CONST(116651.22941015086/8.0), REAL_CONST(116675.87121611751/8.0), REAL_CONST(116700.51432323294/8.0), REAL_CONST(116725.15873135976/8.0), REAL_CONST(116749.8044403606/8.0), REAL_CONST(116774.45145009817/8.0), REAL_CONST(116799.0997604352/8.0), REAL_CONST(116823.74937123443/8.0), REAL_CONST(116848.40028235866/8.0), REAL_CONST(116873.05249367072/8.0), REAL_CONST(116897.70600503348/8.0), REAL_CONST(116922.36081630984/8.0), REAL_CONST(116947.01692736275/8.0), REAL_CONST(116971.67433805518/8.0), REAL_CONST(116996.33304825013/8.0), REAL_CONST(117020.99305781067/8.0), REAL_CONST(117045.65436659988/8.0), REAL_CONST(117070.31697448085/8.0), REAL_CONST(117094.98088131678/8.0), REAL_CONST(117119.64608697082/8.0), REAL_CONST(117144.31259130624/8.0), REAL_CONST(117168.98039418629/8.0), REAL_CONST(117193.64949547425/8.0), REAL_CONST(117218.31989503348/8.0), REAL_CONST(117242.99159272734/8.0), REAL_CONST(117267.66458841923/8.0), REAL_CONST(117292.33888197262/8.0), REAL_CONST(117317.01447325097/8.0), REAL_CONST(117341.6913621178/8.0), REAL_CONST(117366.36954843666/8.0), REAL_CONST(117391.04903207115/8.0), REAL_CONST(117415.72981288488/8.0), REAL_CONST(117440.41189074152/8.0), REAL_CONST(117465.09526550474/8.0), REAL_CONST(117489.77993703831/8.0), REAL_CONST(117514.46590520597/8.0), REAL_CONST(117539.15316987153/8.0), REAL_CONST(117563.84173089883/8.0), REAL_CONST(117588.53158815173/8.0), REAL_CONST(117613.22274149416/8.0), REAL_CONST(117637.91519079007/8.0), REAL_CONST(117662.60893590341/8.0), REAL_CONST(117687.30397669821/8.0), REAL_CONST(117712.00031303853/8.0), REAL_CONST(117736.69794478847/8.0), REAL_CONST(117761.39687181212/8.0), REAL_CONST(117786.09709397367/8.0), REAL_CONST(117810.7986111373/8.0), REAL_CONST(117835.50142316725/8.0), REAL_CONST(117860.20552992777/8.0), REAL_CONST(117884.91093128319/8.0), REAL_CONST(117909.6176270978/8.0), REAL_CONST(117934.32561723603/8.0), REAL_CONST(117959.03490156225/8.0), REAL_CONST(117983.74547994092/8.0), REAL_CONST(118008.45735223651/8.0), REAL_CONST(118033.17051831353/8.0), REAL_CONST(118057.88497803656/8.0), REAL_CONST(118082.60073127014/8.0), REAL_CONST(118107.31777787894/8.0), REAL_CONST(118132.03611772758/8.0), REAL_CONST(118156.75575068076/8.0), REAL_CONST(118181.47667660323/8.0), REAL_CONST(118206.19889535972/8.0), REAL_CONST(118230.92240681504/8.0), REAL_CONST(118255.64721083404/8.0), REAL_CONST(118280.37330728157/8.0), REAL_CONST(118305.10069602253/8.0), REAL_CONST(118329.82937692189/8.0), REAL_CONST(118354.55934984458/8.0), REAL_CONST(118379.29061465565/8.0), REAL_CONST(118404.02317122012/8.0), REAL_CONST(118428.75701940308/8.0), REAL_CONST(118453.49215906965/8.0), REAL_CONST(118478.22859008498/8.0), REAL_CONST(118502.96631231424/8.0), REAL_CONST(118527.70532562268/8.0), REAL_CONST(118552.44562987552/8.0), REAL_CONST(118577.18722493808/8.0), REAL_CONST(118601.93011067568/8.0), REAL_CONST(118626.67428695368/8.0), REAL_CONST(118651.41975363747/8.0), REAL_CONST(118676.16651059251/8.0), REAL_CONST(118700.91455768423/8.0), REAL_CONST(118725.66389477813/8.0), REAL_CONST(118750.41452173979/8.0), REAL_CONST(118775.16643843475/8.0), REAL_CONST(118799.91964472862/8.0), REAL_CONST(118824.67414048707/8.0), REAL_CONST(118849.42992557574/8.0), REAL_CONST(118874.18699986035/8.0), REAL_CONST(118898.94536320666/8.0), REAL_CONST(118923.70501548045/8.0), REAL_CONST(118948.46595654752/8.0), REAL_CONST(118973.22818627374/8.0), REAL_CONST(118997.99170452499/8.0), REAL_CONST(119022.7565111672/8.0), REAL_CONST(119047.52260606633/8.0), REAL_CONST(119072.28998908834/8.0), REAL_CONST(119097.0586600993/8.0), REAL_CONST(119121.82861896523/8.0), REAL_CONST(119146.59986555226/8.0), REAL_CONST(119171.3723997265/8.0), REAL_CONST(119196.14622135412/8.0), REAL_CONST(119220.92133030134/8.0), REAL_CONST(119245.69772643436/8.0), REAL_CONST(119270.47540961947/8.0), REAL_CONST(119295.25437972297/8.0), REAL_CONST(119320.03463661121/8.0), REAL_CONST(119344.81618015055/8.0), REAL_CONST(119369.5990102074/8.0), REAL_CONST(119394.38312664822/8.0), REAL_CONST(119419.16852933947/8.0), REAL_CONST(119443.95521814766/8.0), REAL_CONST(119468.74319293935/8.0), REAL_CONST(119493.53245358112/8.0), REAL_CONST(119518.32299993958/8.0), REAL_CONST(119543.11483188139/8.0), REAL_CONST(119567.90794927324/8.0), REAL_CONST(119592.70235198183/8.0), REAL_CONST(119617.49803987393/8.0), REAL_CONST(119642.29501281632/8.0), REAL_CONST(119667.09327067583/8.0), REAL_CONST(119691.89281331931/8.0), REAL_CONST(119716.69364061367/8.0), REAL_CONST(119741.49575242582/8.0), REAL_CONST(119766.29914862274/8.0), REAL_CONST(119791.10382907141/8.0), REAL_CONST(119815.90979363887/8.0), REAL_CONST(119840.71704219218/8.0), REAL_CONST(119865.52557459843/8.0), REAL_CONST(119890.33539072477/8.0), REAL_CONST(119915.14649043836/8.0), REAL_CONST(119939.95887360642/8.0), REAL_CONST(119964.77254009615/8.0), REAL_CONST(119989.58748977486/8.0), REAL_CONST(120014.40372250983/8.0), REAL_CONST(120039.22123816841/8.0), REAL_CONST(120064.04003661797/8.0), REAL_CONST(120088.86011772591/8.0), REAL_CONST(120113.6814813597/8.0), REAL_CONST(120138.5041273868/8.0), REAL_CONST(120163.3280556747/8.0), REAL_CONST(120188.15326609099/8.0), REAL_CONST(120212.97975850321/8.0), REAL_CONST(120237.807532779/8.0), REAL_CONST(120262.63658878599/8.0), REAL_CONST(120287.46692639188/8.0), REAL_CONST(120312.29854546436/8.0), REAL_CONST(120337.13144587121/8.0), REAL_CONST(120361.9656274802/8.0), REAL_CONST(120386.80109015915/8.0), REAL_CONST(120411.63783377589/8.0), REAL_CONST(120436.47585819835/8.0), REAL_CONST(120461.31516329442/8.0), REAL_CONST(120486.15574893207/8.0), REAL_CONST(120510.99761497928/8.0), REAL_CONST(120535.84076130406/8.0), REAL_CONST(120560.68518777451/8.0), REAL_CONST(120585.53089425867/8.0), REAL_CONST(120610.3778806247/8.0), REAL_CONST(120635.22614674074/8.0), REAL_CONST(120660.07569247499/8.0), REAL_CONST(120684.92651769568/8.0), REAL_CONST(120709.77862227106/8.0), REAL_CONST(120734.63200606944/8.0), REAL_CONST(120759.48666895913/8.0), REAL_CONST(120784.3426108085/8.0), REAL_CONST(120809.19983148595/8.0), REAL_CONST(120834.05833085992/8.0), REAL_CONST(120858.91810879884/8.0), REAL_CONST(120883.77916517125/8.0), REAL_CONST(120908.64149984565/8.0), REAL_CONST(120933.5051126906/8.0), REAL_CONST(120958.37000357473/8.0), REAL_CONST(120983.23617236665/8.0), REAL_CONST(121008.10361893504/8.0), REAL_CONST(121032.97234314861/8.0), REAL_CONST(121057.84234487606/8.0), REAL_CONST(121082.71362398617/8.0), REAL_CONST(121107.58618034775/8.0), REAL_CONST(121132.46001382964/8.0), REAL_CONST(121157.33512430069/8.0), REAL_CONST(121182.21151162982/8.0), REAL_CONST(121207.08917568595/8.0), REAL_CONST(121231.96811633807/8.0), REAL_CONST(121256.84833345517/8.0), REAL_CONST(121281.72982690629/8.0), REAL_CONST(121306.61259656049/8.0), REAL_CONST(121331.49664228689/8.0), REAL_CONST(121356.38196395461/8.0), REAL_CONST(121381.26856143285/8.0), REAL_CONST(121406.15643459078/8.0), REAL_CONST(121431.04558329767/8.0), REAL_CONST(121455.93600742276/8.0), REAL_CONST(121480.82770683538/8.0), REAL_CONST(121505.72068140487/8.0), REAL_CONST(121530.61493100057/8.0), REAL_CONST(121555.51045549192/8.0), REAL_CONST(121580.40725474835/8.0), REAL_CONST(121605.30532863933/8.0), REAL_CONST(121630.20467703436/8.0), REAL_CONST(121655.10529980299/8.0), REAL_CONST(121680.00719681478/8.0), REAL_CONST(121704.91036793934/8.0), REAL_CONST(121729.81481304632/8.0), REAL_CONST(121754.72053200539/8.0), REAL_CONST(121779.62752468624/8.0), REAL_CONST(121804.53579095862/8.0), REAL_CONST(121829.44533069231/8.0), REAL_CONST(121854.3561437571/8.0), REAL_CONST(121879.26823002285/8.0), REAL_CONST(121904.1815893594/8.0), REAL_CONST(121929.09622163669/8.0), REAL_CONST(121954.01212672464/8.0), REAL_CONST(121978.92930449323/8.0), REAL_CONST(122003.84775481246/8.0), REAL_CONST(122028.76747755238/8.0), REAL_CONST(122053.68847258303/8.0), REAL_CONST(122078.61073977455/8.0), REAL_CONST(122103.53427899707/8.0), REAL_CONST(122128.45909012076/8.0), REAL_CONST(122153.38517301581/8.0), REAL_CONST(122178.31252755247/8.0), REAL_CONST(122203.24115360099/8.0), REAL_CONST(122228.17105103172/8.0), REAL_CONST(122253.10221971494/8.0), REAL_CONST(122278.03465952107/8.0), REAL_CONST(122302.96837032049/8.0), REAL_CONST(122327.90335198362/8.0), REAL_CONST(122352.83960438096/8.0), REAL_CONST(122377.777127383/8.0), REAL_CONST(122402.71592086025/8.0), REAL_CONST(122427.65598468333/8.0), REAL_CONST(122452.59731872278/8.0), REAL_CONST(122477.53992284928/8.0), REAL_CONST(122502.48379693348/8.0), REAL_CONST(122527.42894084606/8.0), REAL_CONST(122552.37535445779/8.0), REAL_CONST(122577.32303763942/8.0), REAL_CONST(122602.27199026172/8.0), REAL_CONST(122627.22221219557/8.0), REAL_CONST(122652.17370331181/8.0), REAL_CONST(122677.12646348133/8.0), REAL_CONST(122702.08049257506/8.0), REAL_CONST(122727.03579046397/8.0), REAL_CONST(122751.99235701906/8.0), REAL_CONST(122776.95019211136/8.0), REAL_CONST(122801.9092956119/8.0), REAL_CONST(122826.8696673918/8.0), REAL_CONST(122851.83130732219/8.0), REAL_CONST(122876.79421527422/8.0), REAL_CONST(122901.75839111909/8.0), REAL_CONST(122926.72383472799/8.0), REAL_CONST(122951.69054597223/8.0), REAL_CONST(122976.65852472307/8.0), REAL_CONST(123001.62777085182/8.0), REAL_CONST(123026.59828422987/8.0), REAL_CONST(123051.57006472857/8.0), REAL_CONST(123076.54311221937/8.0), REAL_CONST(123101.5174265737/8.0), REAL_CONST(123126.49300766307/8.0), REAL_CONST(123151.46985535898/8.0), REAL_CONST(123176.44796953299/8.0), REAL_CONST(123201.42735005668/8.0), REAL_CONST(123226.40799680166/8.0), REAL_CONST(123251.38990963959/8.0), REAL_CONST(123276.37308844214/8.0), REAL_CONST(123301.35753308103/8.0), REAL_CONST(123326.343243428/8.0), REAL_CONST(123351.33021935483/8.0), REAL_CONST(123376.31846073334/8.0), REAL_CONST(123401.30796743535/8.0), REAL_CONST(123426.29873933276/8.0), REAL_CONST(123451.29077629748/8.0), REAL_CONST(123476.28407820144/8.0), REAL_CONST(123501.2786449166/8.0), REAL_CONST(123526.27447631498/8.0), REAL_CONST(123551.27157226863/8.0), REAL_CONST(123576.26993264959/8.0), REAL_CONST(123601.26955732999/8.0), REAL_CONST(123626.27044618195/8.0), REAL_CONST(123651.27259907764/8.0), REAL_CONST(123676.27601588926/8.0), REAL_CONST(123701.28069648903/8.0), REAL_CONST(123726.28664074924/8.0), REAL_CONST(123751.29384854218/8.0), REAL_CONST(123776.30231974016/8.0), REAL_CONST(123801.31205421555/8.0), REAL_CONST(123826.32305184075/8.0), REAL_CONST(123851.33531248817/8.0), REAL_CONST(123876.34883603029/8.0), REAL_CONST(123901.36362233957/8.0), REAL_CONST(123926.37967128855/8.0), REAL_CONST(123951.39698274979/8.0), REAL_CONST(123976.41555659588/8.0), REAL_CONST(124001.43539269941/8.0), REAL_CONST(124026.45649093305/8.0), REAL_CONST(124051.47885116948/8.0), REAL_CONST(124076.50247328142/8.0), REAL_CONST(124101.5273571416/8.0), REAL_CONST(124126.55350262282/8.0), REAL_CONST(124151.58090959788/8.0), REAL_CONST(124176.60957793961/8.0), REAL_CONST(124201.63950752091/8.0), REAL_CONST(124226.67069821467/8.0), REAL_CONST(124251.70314989384/8.0), REAL_CONST(124276.73686243138/8.0), REAL_CONST(124301.7718357003/8.0), REAL_CONST(124326.80806957364/8.0), REAL_CONST(124351.84556392446/8.0), REAL_CONST(124376.88431862585/8.0), REAL_CONST(124401.92433355095/8.0), REAL_CONST(124426.96560857294/8.0), REAL_CONST(124452.00814356498/8.0), REAL_CONST(124477.05193840031/8.0), REAL_CONST(124502.0969929522/8.0), REAL_CONST(124527.14330709392/8.0), REAL_CONST(124552.19088069882/8.0), REAL_CONST(124577.23971364023/8.0), REAL_CONST(124602.28980579154/8.0), REAL_CONST(124627.34115702618/8.0), REAL_CONST(124652.3937672176/8.0), REAL_CONST(124677.44763623926/8.0), REAL_CONST(124702.50276396469/8.0), REAL_CONST(124727.55915026742/8.0), REAL_CONST(124752.61679502104/8.0), REAL_CONST(124777.67569809916/8.0), REAL_CONST(124802.73585937542/8.0), REAL_CONST(124827.79727872348/8.0), REAL_CONST(124852.85995601704/8.0), REAL_CONST(124877.92389112986/8.0), REAL_CONST(124902.98908393568/8.0), REAL_CONST(124928.05553430831/8.0), REAL_CONST(124953.1232421216/8.0), REAL_CONST(124978.19220724938/8.0), REAL_CONST(125003.26242956554/8.0), REAL_CONST(125028.33390894404/8.0), REAL_CONST(125053.40664525882/8.0), REAL_CONST(125078.48063838384/8.0), REAL_CONST(125103.55588819318/8.0), REAL_CONST(125128.63239456083/8.0), REAL_CONST(125153.71015736091/8.0), REAL_CONST(125178.78917646752/8.0), REAL_CONST(125203.86945175481/8.0), REAL_CONST(125228.95098309696/8.0), REAL_CONST(125254.03377036817/8.0), REAL_CONST(125279.1178134427/8.0), REAL_CONST(125304.20311219479/8.0), REAL_CONST(125329.28966649878/8.0), REAL_CONST(125354.37747622898/8.0), REAL_CONST(125379.46654125977/8.0), REAL_CONST(125404.55686146552/8.0), REAL_CONST(125429.6484367207/8.0), REAL_CONST(125454.74126689974/8.0), REAL_CONST(125479.83535187715/8.0), REAL_CONST(125504.93069152744/8.0), REAL_CONST(125530.02728572517/8.0), REAL_CONST(125555.12513434493/8.0), REAL_CONST(125580.22423726133/8.0), REAL_CONST(125605.32459434902/8.0), REAL_CONST(125630.4262054827/8.0), REAL_CONST(125655.52907053704/8.0), REAL_CONST(125680.63318938682/8.0), REAL_CONST(125705.73856190679/8.0), REAL_CONST(125730.84518797178/8.0), REAL_CONST(125755.9530674566/8.0), REAL_CONST(125781.06220023613/8.0), REAL_CONST(125806.17258618528/8.0), REAL_CONST(125831.28422517896/8.0), REAL_CONST(125856.39711709213/8.0), REAL_CONST(125881.51126179981/8.0), REAL_CONST(125906.62665917698/8.0), REAL_CONST(125931.74330909875/8.0), REAL_CONST(125956.86121144016/8.0), REAL_CONST(125981.98036607634/8.0), REAL_CONST(126007.10077288245/8.0), REAL_CONST(126032.22243173365/8.0), REAL_CONST(126057.34534250517/8.0), REAL_CONST(126082.46950507225/8.0), REAL_CONST(126107.59491931014/8.0), REAL_CONST(126132.72158509417/8.0), REAL_CONST(126157.84950229966/8.0), REAL_CONST(126182.97867080198/8.0), REAL_CONST(126208.10909047653/8.0), REAL_CONST(126233.24076119871/8.0), REAL_CONST(126258.37368284403/8.0), REAL_CONST(126283.50785528794/8.0), REAL_CONST(126308.64327840599/8.0), REAL_CONST(126333.77995207369/8.0), REAL_CONST(126358.91787616667/8.0), REAL_CONST(126384.0570505605/8.0), REAL_CONST(126409.19747513086/8.0), REAL_CONST(126434.3391497534/8.0), REAL_CONST(126459.48207430386/8.0), REAL_CONST(126484.62624865794/8.0), REAL_CONST(126509.77167269142/8.0), REAL_CONST(126534.9183462801/8.0), REAL_CONST(126560.06626929982/8.0), REAL_CONST(126585.21544162642/8.0), REAL_CONST(126610.36586313581/8.0), REAL_CONST(126635.51753370393/8.0), REAL_CONST(126660.67045320668/8.0), REAL_CONST(126685.82462152008/8.0), REAL_CONST(126710.98003852014/8.0), REAL_CONST(126736.13670408291/8.0), REAL_CONST(126761.29461808444/8.0), REAL_CONST(126786.45378040087/8.0), REAL_CONST(126811.61419090834/8.0), REAL_CONST(126836.77584948298/8.0), REAL_CONST(126861.93875600102/8.0), REAL_CONST(126887.10291033868/8.0), REAL_CONST(126912.26831237224/8.0), REAL_CONST(126937.43496197795/8.0), REAL_CONST(126962.60285903217/8.0), REAL_CONST(126987.77200341123/8.0), REAL_CONST(127012.94239499152/8.0), REAL_CONST(127038.11403364947/8.0), REAL_CONST(127063.2869192615/8.0), REAL_CONST(127088.46105170409/8.0), REAL_CONST(127113.63643085376/8.0), REAL_CONST(127138.81305658702/8.0), REAL_CONST(127163.99092878048/8.0), REAL_CONST(127189.17004731069/8.0), REAL_CONST(127214.35041205429/8.0), REAL_CONST(127239.53202288797/8.0), REAL_CONST(127264.71487968838/8.0), REAL_CONST(127289.89898233226/8.0), REAL_CONST(127315.08433069635/8.0), REAL_CONST(127340.27092465744/8.0), REAL_CONST(127365.45876409234/8.0), REAL_CONST(127390.64784887788/8.0), REAL_CONST(127415.83817889093/8.0), REAL_CONST(127441.02975400841/8.0), REAL_CONST(127466.22257410725/8.0), REAL_CONST(127491.41663906439/8.0), REAL_CONST(127516.61194875685/8.0), REAL_CONST(127541.80850306165/8.0), REAL_CONST(127567.00630185583/8.0), REAL_CONST(127592.20534501647/8.0), REAL_CONST(127617.4056324207/8.0), REAL_CONST(127642.60716394568/8.0), REAL_CONST(127667.80993946856/8.0), REAL_CONST(127693.01395886653/8.0), REAL_CONST(127718.21922201688/8.0), REAL_CONST(127743.42572879682/8.0), REAL_CONST(127768.63347908368/8.0), REAL_CONST(127793.84247275478/8.0), REAL_CONST(127819.05270968749/8.0), REAL_CONST(127844.26418975917/8.0), REAL_CONST(127869.47691284724/8.0), REAL_CONST(127894.69087882918/8.0), REAL_CONST(127919.90608758242/8.0), REAL_CONST(127945.12253898452/8.0), REAL_CONST(127970.34023291297/8.0), REAL_CONST(127995.55916924537/8.0), REAL_CONST(128020.77934785932/8.0), REAL_CONST(128046.00076863244/8.0), REAL_CONST(128071.22343144237/8.0), REAL_CONST(128096.44733616684/8.0), REAL_CONST(128121.67248268353/8.0), REAL_CONST(128146.89887087021/8.0), REAL_CONST(128172.12650060465/8.0), REAL_CONST(128197.35537176467/8.0), REAL_CONST(128222.5854842281/8.0), REAL_CONST(128247.81683787282/8.0), REAL_CONST(128273.04943257671/8.0), REAL_CONST(128298.28326821771/8.0), REAL_CONST(128323.51834467379/8.0), REAL_CONST(128348.75466182294/8.0), REAL_CONST(128373.99221954317/8.0), REAL_CONST(128399.23101771252/8.0), REAL_CONST(128424.47105620909/8.0), REAL_CONST(128449.71233491098/8.0), REAL_CONST(128474.95485369631/8.0), REAL_CONST(128500.19861244329/8.0), REAL_CONST(128525.44361103009/8.0), REAL_CONST(128550.68984933494/8.0), REAL_CONST(128575.93732723613/8.0), REAL_CONST(128601.18604461191/8.0), REAL_CONST(128626.43600134061/8.0), REAL_CONST(128651.68719730059/8.0), REAL_CONST(128676.93963237021/8.0), REAL_CONST(128702.1933064279/8.0), REAL_CONST(128727.44821935208/8.0), REAL_CONST(128752.70437102125/8.0), REAL_CONST(128777.96176131385/8.0), REAL_CONST(128803.22039010846/8.0), REAL_CONST(128828.48025728362/8.0), REAL_CONST(128853.74136271792/8.0), REAL_CONST(128879.00370628996/8.0), REAL_CONST(128904.26728787841/8.0), REAL_CONST(128929.53210736193/8.0), REAL_CONST(128954.79816461923/8.0), REAL_CONST(128980.06545952905/8.0), REAL_CONST(129005.33399197015/8.0), REAL_CONST(129030.60376182134/8.0), REAL_CONST(129055.87476896142/8.0), REAL_CONST(129081.14701326926/8.0), REAL_CONST(129106.42049462376/8.0), REAL_CONST(129131.6952129038/8.0), REAL_CONST(129156.97116798835/8.0), REAL_CONST(129182.24835975636/8.0), REAL_CONST(129207.52678808685/8.0), REAL_CONST(129232.80645285884/8.0), REAL_CONST(129258.08735395141/8.0), REAL_CONST(129283.36949124365/8.0), REAL_CONST(129308.65286461466/8.0), REAL_CONST(129333.9374739436/8.0), REAL_CONST(129359.22331910966/8.0), REAL_CONST(129384.51039999202/8.0), REAL_CONST(129409.79871646997/8.0), REAL_CONST(129435.08826842274/8.0), REAL_CONST(129460.37905572963/8.0), REAL_CONST(129485.67107826998/8.0), REAL_CONST(129510.96433592314/8.0), REAL_CONST(129536.25882856851/8.0), REAL_CONST(129561.55455608548/8.0), REAL_CONST(129586.85151835352/8.0), REAL_CONST(129612.14971525209/8.0), REAL_CONST(129637.4491466607/8.0), REAL_CONST(129662.74981245887/8.0), REAL_CONST(129688.0517125262/8.0), REAL_CONST(129713.35484674224/8.0), REAL_CONST(129738.65921498663/8.0), REAL_CONST(129763.96481713903/8.0), REAL_CONST(129789.27165307909/8.0), REAL_CONST(129814.57972268655/8.0), REAL_CONST(129839.88902584116/8.0), REAL_CONST(129865.19956242264/8.0), REAL_CONST(129890.51133231082/8.0), REAL_CONST(129915.82433538554/8.0), REAL_CONST(129941.13857152662/8.0), REAL_CONST(129966.45404061397/8.0), REAL_CONST(129991.7707425275/8.0), REAL_CONST(130017.08867714716/8.0), REAL_CONST(130042.4078443529/8.0), REAL_CONST(130067.72824402474/8.0), REAL_CONST(130093.04987604271/8.0), REAL_CONST(130118.37274028687/8.0), REAL_CONST(130143.69683663732/8.0), REAL_CONST(130169.02216497416/8.0), REAL_CONST(130194.34872517755/8.0), REAL_CONST(130219.67651712766/8.0), REAL_CONST(130245.0055407047/8.0), REAL_CONST(130270.33579578891/8.0), REAL_CONST(130295.66728226055/8.0), REAL_CONST(130320.99999999991/8.0), REAL_CONST(130346.33394888733/8.0), REAL_CONST(130371.66912880314/8.0), REAL_CONST(130397.00553962773/8.0), REAL_CONST(130422.34318124152/8.0), REAL_CONST(130447.68205352494/8.0), REAL_CONST(130473.02215635845/8.0), REAL_CONST(130498.36348962256/8.0), REAL_CONST(130523.70605319779/8.0), REAL_CONST(130549.0498469647/8.0), REAL_CONST(130574.39487080388/8.0), REAL_CONST(130599.74112459592/8.0), REAL_CONST(130625.08860822149/8.0), REAL_CONST(130650.43732156123/8.0), REAL_CONST(130675.78726449587/8.0), REAL_CONST(130701.13843690613/8.0), REAL_CONST(130726.49083867275/8.0), REAL_CONST(130751.84446967654/8.0), REAL_CONST(130777.19932979831/8.0), REAL_CONST(130802.5554189189/8.0), REAL_CONST(130827.91273691918/8.0), REAL_CONST(130853.27128368006/8.0), REAL_CONST(130878.63105908247/8.0), REAL_CONST(130903.99206300738/8.0), REAL_CONST(130929.35429533575/8.0), REAL_CONST(130954.71775594862/8.0), REAL_CONST(130980.08244472703/8.0), REAL_CONST(131005.44836155206/8.0), REAL_CONST(131030.81550630482/8.0), REAL_CONST(131056.18387886642/8.0), REAL_CONST(131081.55347911804/8.0), REAL_CONST(131106.92430694087/8.0), REAL_CONST(131132.29636221612/8.0), REAL_CONST(131157.66964482504/8.0), REAL_CONST(131183.0441546489/8.0), REAL_CONST(131208.41989156904/8.0), REAL_CONST(131233.79685546676/8.0), REAL_CONST(131259.17504622342/8.0), REAL_CONST(131284.55446372041/8.0), REAL_CONST(131309.93510783918/8.0), REAL_CONST(131335.31697846117/8.0), REAL_CONST(131360.70007546784/8.0), REAL_CONST(131386.0843987407/8.0), REAL_CONST(131411.46994816128/8.0), REAL_CONST(131436.85672361116/8.0), REAL_CONST(131462.24472497194/8.0), REAL_CONST(131487.63395212521/8.0), REAL_CONST(131513.02440495262/8.0), REAL_CONST(131538.41608333588/8.0), REAL_CONST(131563.80898715663/8.0), REAL_CONST(131589.2031162967/8.0), REAL_CONST(131614.59847063778/8.0), REAL_CONST(131639.9950500617/8.0), REAL_CONST(131665.39285445024/8.0), REAL_CONST(131690.79188368531/8.0), REAL_CONST(131716.19213764873/8.0), REAL_CONST(131741.59361622241/8.0), REAL_CONST(131766.99631928833/8.0), REAL_CONST(131792.40024672839/8.0), REAL_CONST(131817.80539842462/8.0), REAL_CONST(131843.21177425905/8.0), REAL_CONST(131868.61937411371/8.0), REAL_CONST(131894.02819787065/8.0), REAL_CONST(131919.43824541202/8.0), REAL_CONST(131944.84951661993/8.0), REAL_CONST(131970.26201137656/8.0), REAL_CONST(131995.67572956407/8.0), REAL_CONST(132021.09067106468/8.0), REAL_CONST(132046.50683576067/8.0), REAL_CONST(132071.9242235343/8.0), REAL_CONST(132097.34283426782/8.0), REAL_CONST(132122.76266784366/8.0), REAL_CONST(132148.1837241441/8.0), REAL_CONST(132173.60600305157/8.0), REAL_CONST(132199.02950444847/8.0), REAL_CONST(132224.45422821722/8.0), REAL_CONST(132249.88017424036/8.0), REAL_CONST(132275.30734240031/8.0), REAL_CONST(132300.73573257966/8.0), REAL_CONST(132326.16534466096/8.0), REAL_CONST(132351.59617852676/8.0), REAL_CONST(132377.02823405969/8.0), REAL_CONST(132402.46151114244/8.0), REAL_CONST(132427.89600965759/8.0), REAL_CONST(132453.33172948789/8.0), REAL_CONST(132478.76867051609/8.0), REAL_CONST(132504.20683262491/8.0), REAL_CONST(132529.64621569714/8.0), REAL_CONST(132555.08681961559/8.0), REAL_CONST(132580.5286442631/8.0), REAL_CONST(132605.97168952253/8.0), REAL_CONST(132631.41595527678/8.0), REAL_CONST(132656.86144140881/8.0), REAL_CONST(132682.30814780149/8.0), REAL_CONST(132707.75607433787/8.0), REAL_CONST(132733.20522090094/8.0), REAL_CONST(132758.65558737374/8.0), REAL_CONST(132784.10717363929/8.0), REAL_CONST(132809.55997958075/8.0), REAL_CONST(132835.01400508118/8.0), REAL_CONST(132860.46925002377/8.0), REAL_CONST(132885.92571429166/8.0), REAL_CONST(132911.38339776811/8.0), REAL_CONST(132936.84230033628/8.0), REAL_CONST(132962.30242187946/8.0), REAL_CONST(132987.76376228096/8.0), REAL_CONST(133013.22632142407/8.0), REAL_CONST(133038.69009919214/8.0), REAL_CONST(133064.15509546854/8.0), REAL_CONST(133089.62131013666/8.0), REAL_CONST(133115.08874307995/8.0), REAL_CONST(133140.55739418184/8.0), REAL_CONST(133166.02726332581/8.0), REAL_CONST(133191.49835039541/8.0), REAL_CONST(133216.97065527414/8.0), REAL_CONST(133242.44417784561/8.0), REAL_CONST(133267.91891799335/8.0), REAL_CONST(133293.39487560102/8.0), REAL_CONST(133318.87205055228/8.0), REAL_CONST(133344.35044273079/8.0), REAL_CONST(133369.83005202023/8.0), REAL_CONST(133395.31087830439/8.0), REAL_CONST(133420.79292146701/8.0), REAL_CONST(133446.27618139185/8.0), REAL_CONST(133471.76065796276/8.0), REAL_CONST(133497.24635106357/8.0), REAL_CONST(133522.73326057816/8.0), REAL_CONST(133548.22138639039/8.0), REAL_CONST(133573.71072838426/8.0), REAL_CONST(133599.20128644365/8.0), REAL_CONST(133624.69306045261/8.0), REAL_CONST(133650.1860502951/8.0), REAL_CONST(133675.68025585517/8.0), REAL_CONST(133701.1756770169/8.0), REAL_CONST(133726.67231366437/8.0), REAL_CONST(133752.17016568172/8.0), REAL_CONST(133777.66923295305/8.0), REAL_CONST(133803.16951536259/8.0), REAL_CONST(133828.67101279454/8.0), REAL_CONST(133854.17372513309/8.0), REAL_CONST(133879.67765226253/8.0), REAL_CONST(133905.18279406714/8.0), REAL_CONST(133930.68915043125/8.0), REAL_CONST(133956.19672123916/8.0), REAL_CONST(133981.70550637526/8.0), REAL_CONST(134007.21550572399/8.0), REAL_CONST(134032.7267191697/8.0), REAL_CONST(134058.23914659687/8.0), REAL_CONST(134083.75278789/8.0), REAL_CONST(134109.26764293358/8.0), REAL_CONST(134134.78371161217/8.0), REAL_CONST(134160.30099381026/8.0), REAL_CONST(134185.8194894125/8.0), REAL_CONST(134211.33919830353/8.0), REAL_CONST(134236.8601203679/8.0), REAL_CONST(134262.38225549037/8.0), REAL_CONST(134287.90560355558/8.0), REAL_CONST(134313.43016444831/8.0), REAL_CONST(134338.95593805326/8.0), REAL_CONST(134364.48292425525/8.0), REAL_CONST(134390.01112293909/8.0), REAL_CONST(134415.54053398955/8.0), REAL_CONST(134441.07115729159/8.0), REAL_CONST(134466.60299273001/8.0), REAL_CONST(134492.1360401898/8.0), REAL_CONST(134517.67029955584/8.0), REAL_CONST(134543.20577071316/8.0), REAL_CONST(134568.74245354676/8.0), REAL_CONST(134594.28034794159/8.0), REAL_CONST(134619.81945378278/8.0), REAL_CONST(134645.35977095537/8.0), REAL_CONST(134670.90129934452/8.0), REAL_CONST(134696.4440388353/8.0), REAL_CONST(134721.98798931291/8.0), REAL_CONST(134747.53315066252/8.0), REAL_CONST(134773.07952276937/8.0), REAL_CONST(134798.62710551871/8.0), REAL_CONST(134824.17589879577/8.0), REAL_CONST(134849.72590248589/8.0), REAL_CONST(134875.27711647438/8.0), REAL_CONST(134900.82954064661/8.0), REAL_CONST(134926.38317488792/8.0), REAL_CONST(134951.93801908373/8.0), REAL_CONST(134977.49407311951/8.0), REAL_CONST(135003.05133688069/8.0), REAL_CONST(135028.60981025276/8.0), REAL_CONST(135054.16949312127/8.0), REAL_CONST(135079.73038537172/8.0), REAL_CONST(135105.29248688967/8.0), REAL_CONST(135130.85579756077/8.0), REAL_CONST(135156.42031727062/8.0), REAL_CONST(135181.98604590484/8.0), REAL_CONST(135207.55298334916/8.0), REAL_CONST(135233.12112948924/8.0), REAL_CONST(135258.69048421088/8.0), REAL_CONST(135284.26104739975/8.0), REAL_CONST(135309.83281894168/8.0), REAL_CONST(135335.4057987225/8.0), REAL_CONST(135360.97998662802/8.0), REAL_CONST(135386.55538254412/8.0), REAL_CONST(135412.13198635669/8.0), REAL_CONST(135437.70979795168/8.0), REAL_CONST(135463.28881721498/8.0), REAL_CONST(135488.86904403262/8.0), REAL_CONST(135514.45047829056/8.0), REAL_CONST(135540.03311987486/8.0), REAL_CONST(135565.61696867159/8.0), REAL_CONST(135591.20202456677/8.0), REAL_CONST(135616.78828744654/8.0), REAL_CONST(135642.37575719706/8.0), REAL_CONST(135667.96443370447/8.0), REAL_CONST(135693.55431685498/8.0), REAL_CONST(135719.14540653475/8.0), REAL_CONST(135744.73770263011/8.0), REAL_CONST(135770.33120502727/8.0), REAL_CONST(135795.92591361253/8.0), REAL_CONST(135821.52182827223/8.0), REAL_CONST(135847.11894889272/8.0), REAL_CONST(135872.7172753604/8.0), REAL_CONST(135898.31680756161/8.0), REAL_CONST(135923.91754538284/8.0), REAL_CONST(135949.51948871053/8.0), REAL_CONST(135975.12263743114/8.0), REAL_CONST(136000.72699143123/8.0), REAL_CONST(136026.33255059729/8.0), REAL_CONST(136051.93931481591/8.0), REAL_CONST(136077.54728397369/8.0), REAL_CONST(136103.15645795723/8.0), REAL_CONST(136128.76683665317/8.0), REAL_CONST(136154.37841994822/8.0), REAL_CONST(136179.99120772901/8.0), REAL_CONST(136205.60519988232/8.0), REAL_CONST(136231.2203962949/8.0), REAL_CONST(136256.83679685349/8.0), REAL_CONST(136282.45440144493/8.0), REAL_CONST(136308.07320995603/8.0), REAL_CONST(136333.69322227367/8.0), REAL_CONST(136359.31443828469/8.0), REAL_CONST(136384.93685787608/8.0), REAL_CONST(136410.56048093468/8.0), REAL_CONST(136436.18530734754/8.0), REAL_CONST(136461.81133700156/8.0), REAL_CONST(136487.43856978384/8.0), REAL_CONST(136513.06700558143/8.0), REAL_CONST(136538.6966442813/8.0), REAL_CONST(136564.32748577066/8.0), REAL_CONST(136589.95952993655/8.0), REAL_CONST(136615.59277666616/8.0), REAL_CONST(136641.22722584667/8.0), REAL_CONST(136666.86287736523/8.0), REAL_CONST(136692.49973110916/8.0), REAL_CONST(136718.13778696564/8.0), REAL_CONST(136743.77704482197/8.0), REAL_CONST(136769.41750456547/8.0), REAL_CONST(136795.05916608346/8.0), REAL_CONST(136820.70202926331/8.0), REAL_CONST(136846.34609399244/8.0), REAL_CONST(136871.99136015819/8.0), REAL_CONST(136897.63782764805/8.0), REAL_CONST(136923.28549634948/8.0), REAL_CONST(136948.93436614997/8.0), REAL_CONST(136974.58443693706/8.0), REAL_CONST(137000.23570859825/8.0), REAL_CONST(137025.88818102115/8.0), REAL_CONST(137051.54185409332/8.0), REAL_CONST(137077.19672770242/8.0), REAL_CONST(137102.85280173609/8.0), REAL_CONST(137128.51007608202/8.0), REAL_CONST(137154.16855062786/8.0), REAL_CONST(137179.82822526142/8.0), REAL_CONST(137205.48909987041/8.0), REAL_CONST(137231.15117434258/8.0), REAL_CONST(137256.8144485658/8.0), REAL_CONST(137282.47892242789/8.0), REAL_CONST(137308.14459581667/8.0), REAL_CONST(137333.81146862009/8.0), REAL_CONST(137359.47954072602/8.0), REAL_CONST(137385.14881202241/8.0), REAL_CONST(137410.81928239719/8.0), REAL_CONST(137436.49095173844/8.0), REAL_CONST(137462.16381993407/8.0), REAL_CONST(137487.83788687221/8.0), REAL_CONST(137513.51315244089/8.0), REAL_CONST(137539.18961652822/8.0), REAL_CONST(137564.86727902229/8.0), REAL_CONST(137590.54613981131/8.0), REAL_CONST(137616.22619878338/8.0), REAL_CONST(137641.90745582676/8.0), REAL_CONST(137667.58991082967/8.0), REAL_CONST(137693.27356368033/8.0), REAL_CONST(137718.95841426702/8.0), REAL_CONST(137744.64446247809/8.0), REAL_CONST(137770.33170820182/8.0), REAL_CONST(137796.02015132661/8.0), REAL_CONST(137821.70979174081/8.0), REAL_CONST(137847.40062933284/8.0), REAL_CONST(137873.09266399115/8.0), REAL_CONST(137898.78589560417/8.0), REAL_CONST(137924.48032406042/8.0), REAL_CONST(137950.17594924837/8.0), REAL_CONST(137975.8727710566/8.0), REAL_CONST(138001.57078937365/8.0), REAL_CONST(138027.27000408815/8.0), REAL_CONST(138052.97041508864/8.0), REAL_CONST(138078.67202226384/8.0), REAL_CONST(138104.3748255024/8.0), REAL_CONST(138130.07882469296/8.0), REAL_CONST(138155.78401972432/8.0), REAL_CONST(138181.49041048516/8.0), REAL_CONST(138207.1979968643/8.0), REAL_CONST(138232.9067787505/8.0), REAL_CONST(138258.61675603263/8.0), REAL_CONST(138284.32792859949/8.0), REAL_CONST(138310.04029633995/8.0), REAL_CONST(138335.75385914298/8.0), REAL_CONST(138361.46861689744/8.0), REAL_CONST(138387.18456949232/8.0), REAL_CONST(138412.90171681659/8.0), REAL_CONST(138438.62005875923/8.0), REAL_CONST(138464.33959520931/8.0), REAL_CONST(138490.06032605586/8.0), REAL_CONST(138515.78225118798/8.0), REAL_CONST(138541.50537049473/8.0), REAL_CONST(138567.2296838653/8.0), REAL_CONST(138592.95519118884/8.0), REAL_CONST(138618.68189235451/8.0), REAL_CONST(138644.40978725153/8.0), REAL_CONST(138670.13887576913/8.0), REAL_CONST(138695.86915779658/8.0), REAL_CONST(138721.60063322316/8.0), REAL_CONST(138747.33330193823/8.0), REAL_CONST(138773.06716383106/8.0), REAL_CONST(138798.80221879104/8.0), REAL_CONST(138824.53846670757/8.0), REAL_CONST(138850.27590747006/8.0), REAL_CONST(138876.01454096794/8.0), REAL_CONST(138901.7543670907/8.0), REAL_CONST(138927.49538572782/8.0), REAL_CONST(138953.2375967688/8.0), REAL_CONST(138978.9810001032/8.0), REAL_CONST(139004.72559562061/8.0), REAL_CONST(139030.47138321059/8.0), REAL_CONST(139056.2183627628/8.0), REAL_CONST(139081.96653416683/8.0), REAL_CONST(139107.71589731239/8.0), REAL_CONST(139133.46645208917/8.0), REAL_CONST(139159.21819838689/8.0), REAL_CONST(139184.97113609532/8.0), REAL_CONST(139210.72526510421/8.0), REAL_CONST(139236.48058530336/8.0), REAL_CONST(139262.23709658257/8.0), REAL_CONST(139287.99479883176/8.0), REAL_CONST(139313.75369194071/8.0), REAL_CONST(139339.51377579942/8.0), REAL_CONST(139365.27505029776/8.0), REAL_CONST(139391.03751532568/8.0), REAL_CONST(139416.80117077316/8.0), REAL_CONST(139442.56601653024/8.0), REAL_CONST(139468.33205248689/8.0), REAL_CONST(139494.09927853322/8.0), REAL_CONST(139519.86769455927/8.0), REAL_CONST(139545.63730045516/8.0), REAL_CONST(139571.408096111/8.0), REAL_CONST(139597.18008141697/8.0), REAL_CONST(139622.95325626322/8.0), REAL_CONST(139648.72762054001/8.0), REAL_CONST(139674.5031741375/8.0), REAL_CONST(139700.27991694602/8.0), REAL_CONST(139726.05784885579/8.0), REAL_CONST(139751.83696975713/8.0), REAL_CONST(139777.61727954043/8.0), REAL_CONST(139803.39877809596/8.0), REAL_CONST(139829.18146531415/8.0), REAL_CONST(139854.96534108539/8.0), REAL_CONST(139880.75040530015/8.0), REAL_CONST(139906.53665784886/8.0), REAL_CONST(139932.32409862199/8.0), REAL_CONST(139958.11272751007/8.0), REAL_CONST(139983.90254440365/8.0), REAL_CONST(140009.69354919327/8.0), REAL_CONST(140035.48574176949/8.0), REAL_CONST(140061.27912202294/8.0), REAL_CONST(140087.07368984428/8.0), REAL_CONST(140112.86944512415/8.0), REAL_CONST(140138.66638775321/8.0), REAL_CONST(140164.4645176222/8.0), REAL_CONST(140190.26383462184/8.0), REAL_CONST(140216.06433864293/8.0), REAL_CONST(140241.86602957622/8.0), REAL_CONST(140267.66890731253/8.0), REAL_CONST(140293.47297174268/8.0), REAL_CONST(140319.27822275754/8.0), REAL_CONST(140345.08466024802/8.0), REAL_CONST(140370.89228410498/8.0), REAL_CONST(140396.70109421943/8.0), REAL_CONST(140422.51109048226/8.0), REAL_CONST(140448.32227278448/8.0), REAL_CONST(140474.13464101712/8.0), REAL_CONST(140499.94819507122/8.0), REAL_CONST(140525.76293483781/8.0), REAL_CONST(140551.57886020801/8.0), REAL_CONST(140577.3959710729/8.0), REAL_CONST(140603.21426732364/8.0), REAL_CONST(140629.03374885136/8.0), REAL_CONST(140654.85441554731/8.0), REAL_CONST(140680.67626730262/8.0), REAL_CONST(140706.49930400858/8.0), REAL_CONST(140732.32352555645/8.0), REAL_CONST(140758.1489318375/8.0), REAL_CONST(140783.97552274304/8.0), REAL_CONST(140809.80329816442/8.0), REAL_CONST(140835.63225799298/8.0), REAL_CONST(140861.46240212015/8.0), REAL_CONST(140887.29373043729/8.0), REAL_CONST(140913.12624283586/8.0), REAL_CONST(140938.95993920733/8.0), REAL_CONST(140964.79481944317/8.0), REAL_CONST(140990.63088343487/8.0), REAL_CONST(141016.46813107401/8.0), REAL_CONST(141042.30656225214/8.0), REAL_CONST(141068.14617686081/8.0), REAL_CONST(141093.98697479168/8.0), REAL_CONST(141119.82895593636/8.0), REAL_CONST(141145.6721201865/8.0), REAL_CONST(141171.51646743377/8.0), REAL_CONST(141197.36199756994/8.0), REAL_CONST(141223.20871048668/8.0), REAL_CONST(141249.05660607578/8.0), REAL_CONST(141274.90568422904/8.0), REAL_CONST(141300.75594483822/8.0), REAL_CONST(141326.6073877952/8.0), REAL_CONST(141352.4600129918/8.0), REAL_CONST(141378.31382031992/8.0), REAL_CONST(141404.16880967148/8.0), REAL_CONST(141430.02498093838/8.0), REAL_CONST(141455.8823340126/8.0), REAL_CONST(141481.74086878612/8.0), REAL_CONST(141507.60058515094/8.0), REAL_CONST(141533.46148299909/8.0), REAL_CONST(141559.32356222265/8.0), REAL_CONST(141585.18682271364/8.0), REAL_CONST(141611.05126436421/8.0), REAL_CONST(141636.9168870665/8.0), REAL_CONST(141662.78369071262/8.0), REAL_CONST(141688.65167519479/8.0), REAL_CONST(141714.5208404052/8.0), REAL_CONST(141740.39118623605/8.0), REAL_CONST(141766.26271257963/8.0), REAL_CONST(141792.1354193282/8.0), REAL_CONST(141818.00930637406/8.0), REAL_CONST(141843.88437360956/8.0), REAL_CONST(141869.760620927/8.0), REAL_CONST(141895.6380482188/8.0), REAL_CONST(141921.51665537735/8.0), REAL_CONST(141947.39644229505/8.0), REAL_CONST(141973.27740886438/8.0), REAL_CONST(141999.15955497778/8.0), REAL_CONST(142025.04288052776/8.0), REAL_CONST(142050.92738540689/8.0), REAL_CONST(142076.81306950765/8.0), REAL_CONST(142102.69993272264/8.0), REAL_CONST(142128.58797494444/8.0), REAL_CONST(142154.47719606571/8.0), REAL_CONST(142180.36759597904/8.0), REAL_CONST(142206.25917457714/8.0), REAL_CONST(142232.15193175265/8.0), REAL_CONST(142258.04586739838/8.0), REAL_CONST(142283.94098140698/8.0), REAL_CONST(142309.83727367126/8.0), REAL_CONST(142335.73474408401/8.0), REAL_CONST(142361.63339253806/8.0), REAL_CONST(142387.5332189262/8.0), REAL_CONST(142413.43422314132/8.0), REAL_CONST(142439.33640507635/8.0), REAL_CONST(142465.23976462413/8.0), REAL_CONST(142491.14430167765/8.0), REAL_CONST(142517.05001612983/8.0), REAL_CONST(142542.95690787368/8.0), REAL_CONST(142568.86497680223/8.0), REAL_CONST(142594.77422280848/8.0), REAL_CONST(142620.68464578551/8.0), REAL_CONST(142646.5962456264/8.0), REAL_CONST(142672.50902222423/8.0), REAL_CONST(142698.42297547215/8.0), REAL_CONST(142724.33810526333/8.0), REAL_CONST(142750.25441149093/8.0), REAL_CONST(142776.17189404817/8.0), REAL_CONST(142802.09055282827/8.0), REAL_CONST(142828.01038772447/8.0), REAL_CONST(142853.93139863008/8.0), REAL_CONST(142879.85358543837/8.0), REAL_CONST(142905.77694804268/8.0), REAL_CONST(142931.70148633636/8.0), REAL_CONST(142957.62720021277/8.0), REAL_CONST(142983.55408956532/8.0), REAL_CONST(143009.48215428743/8.0), REAL_CONST(143035.41139427255/8.0), REAL_CONST(143061.34180941415/8.0), REAL_CONST(143087.27339960571/8.0), REAL_CONST(143113.20616474075/8.0), REAL_CONST(143139.14010471283/8.0), REAL_CONST(143165.07521941551/8.0), REAL_CONST(143191.01150874238/8.0), REAL_CONST(143216.94897258704/8.0), REAL_CONST(143242.88761084314/8.0), REAL_CONST(143268.82742340435/8.0), REAL_CONST(143294.76841016437/8.0), REAL_CONST(143320.71057101688/8.0), REAL_CONST(143346.65390585564/8.0), REAL_CONST(143372.59841457437/8.0), REAL_CONST(143398.54409706692/8.0), REAL_CONST(143424.49095322701/8.0), REAL_CONST(143450.43898294857/8.0), REAL_CONST(143476.38818612538/8.0), REAL_CONST(143502.33856265133/8.0), REAL_CONST(143528.29011242036/8.0), REAL_CONST(143554.24283532638/8.0), REAL_CONST(143580.19673126334/8.0), REAL_CONST(143606.1518001252/8.0), REAL_CONST(143632.10804180597/8.0), REAL_CONST(143658.06545619969/8.0), REAL_CONST(143684.02404320039/8.0), REAL_CONST(143709.98380270213/8.0), REAL_CONST(143735.944734599/8.0), REAL_CONST(143761.90683878519/8.0), REAL_CONST(143787.87011515474/8.0), REAL_CONST(143813.83456360188/8.0), REAL_CONST(143839.8001840208/8.0), REAL_CONST(143865.76697630569/8.0), REAL_CONST(143891.73494035081/8.0), REAL_CONST(143917.7040760504/8.0), REAL_CONST(143943.67438329876/8.0), REAL_CONST(143969.6458619902/8.0), REAL_CONST(143995.61851201905/8.0), REAL_CONST(144021.59233327967/8.0), REAL_CONST(144047.56732566646/8.0), REAL_CONST(144073.54348907378/8.0), REAL_CONST(144099.52082339607/8.0), REAL_CONST(144125.49932852783/8.0), REAL_CONST(144151.4790043635/8.0), REAL_CONST(144177.45985079758/8.0), REAL_CONST(144203.44186772458/8.0), REAL_CONST(144229.42505503909/8.0), REAL_CONST(144255.40941263564/8.0), REAL_CONST(144281.39494040885/8.0), REAL_CONST(144307.38163825331/8.0), REAL_CONST(144333.36950606373/8.0), REAL_CONST(144359.35854373468/8.0), REAL_CONST(144385.34875116093/8.0), REAL_CONST(144411.34012823718/8.0), REAL_CONST(144437.33267485813/8.0), REAL_CONST(144463.32639091855/8.0), REAL_CONST(144489.32127631325/8.0), REAL_CONST(144515.31733093705/8.0), REAL_CONST(144541.31455468474/8.0), REAL_CONST(144567.3129474512/8.0), REAL_CONST(144593.3125091313/8.0), REAL_CONST(144619.31323961995/8.0), REAL_CONST(144645.31513881206/8.0), REAL_CONST(144671.31820660262/8.0), REAL_CONST(144697.32244288657/8.0), REAL_CONST(144723.32784755889/8.0), REAL_CONST(144749.33442051467/8.0), REAL_CONST(144775.34216164888/8.0), REAL_CONST(144801.35107085665/8.0), REAL_CONST(144827.36114803303/8.0), REAL_CONST(144853.37239307314/8.0), REAL_CONST(144879.38480587213/8.0), REAL_CONST(144905.39838632516/8.0), REAL_CONST(144931.41313432742/8.0), REAL_CONST(144957.4290497741/8.0), REAL_CONST(144983.44613256046/8.0), REAL_CONST(145009.46438258173/8.0), REAL_CONST(145035.48379973322/8.0), REAL_CONST(145061.50438391021/8.0), REAL_CONST(145087.52613500805/8.0), REAL_CONST(145113.54905292206/8.0), REAL_CONST(145139.57313754765/8.0), REAL_CONST(145165.59838878017/8.0), REAL_CONST(145191.62480651509/8.0), REAL_CONST(145217.65239064783/8.0), REAL_CONST(145243.68114107384/8.0), REAL_CONST(145269.71105768863/8.0), REAL_CONST(145295.74214038774/8.0), REAL_CONST(145321.77438906668/8.0), REAL_CONST(145347.80780362099/8.0), REAL_CONST(145373.84238394629/8.0), REAL_CONST(145399.87812993818/8.0), REAL_CONST(145425.91504149229/8.0), REAL_CONST(145451.95311850426/8.0), REAL_CONST(145477.9923608698/8.0), REAL_CONST(145504.03276848458/8.0), REAL_CONST(145530.07434124436/8.0), REAL_CONST(145556.11707904484/8.0), REAL_CONST(145582.16098178181/8.0), REAL_CONST(145608.20604935108/8.0), REAL_CONST(145634.25228164849/8.0), REAL_CONST(145660.29967856981/8.0), REAL_CONST(145686.34824001096/8.0), REAL_CONST(145712.39796586783/8.0), REAL_CONST(145738.4488560363/8.0), REAL_CONST(145764.50091041232/8.0), REAL_CONST(145790.55412889185/8.0), REAL_CONST(145816.60851137087/8.0), REAL_CONST(145842.66405774537/8.0), REAL_CONST(145868.72076791141/8.0), REAL_CONST(145894.77864176501/8.0), REAL_CONST(145920.83767920226/8.0), REAL_CONST(145946.89788011924/8.0), REAL_CONST(145972.95924441208/8.0), REAL_CONST(145999.02177197693/8.0), REAL_CONST(146025.08546270995/8.0), REAL_CONST(146051.15031650732/8.0), REAL_CONST(146077.21633326527/8.0), REAL_CONST(146103.28351288004/8.0), REAL_CONST(146129.35185524789/8.0), REAL_CONST(146155.42136026506/8.0), REAL_CONST(146181.49202782792/8.0), REAL_CONST(146207.56385783272/8.0), REAL_CONST(146233.63685017588/8.0), REAL_CONST(146259.71100475377/8.0), REAL_CONST(146285.78632146274/8.0), REAL_CONST(146311.86280019928/8.0), REAL_CONST(146337.94044085976/8.0), REAL_CONST(146364.01924334071/8.0), REAL_CONST(146390.09920753856/8.0), REAL_CONST(146416.18033334985/8.0), REAL_CONST(146442.26262067116/8.0), REAL_CONST(146468.34606939898/8.0), REAL_CONST(146494.43067942993/8.0), REAL_CONST(146520.51645066062/8.0), REAL_CONST(146546.60338298764/8.0), REAL_CONST(146572.69147630769/8.0), REAL_CONST(146598.78073051744/8.0), REAL_CONST(146624.87114551352/8.0), REAL_CONST(146650.96272119274/8.0), REAL_CONST(146677.05545745179/8.0), REAL_CONST(146703.14935418745/8.0), REAL_CONST(146729.2444112965/8.0), REAL_CONST(146755.34062867577/8.0), REAL_CONST(146781.43800622207/8.0), REAL_CONST(146807.53654383228/8.0), REAL_CONST(146833.63624140329/8.0), REAL_CONST(146859.73709883197/8.0), REAL_CONST(146885.83911601527/8.0), REAL_CONST(146911.94229285014/8.0), REAL_CONST(146938.04662923355/8.0), REAL_CONST(146964.15212506248/8.0), REAL_CONST(146990.25878023397/8.0), REAL_CONST(147016.36659464505/8.0), REAL_CONST(147042.47556819281/8.0), REAL_CONST(147068.58570077427/8.0), REAL_CONST(147094.6969922866/8.0), REAL_CONST(147120.80944262692/8.0), REAL_CONST(147146.92305169237/8.0), REAL_CONST(147173.03781938017/8.0), REAL_CONST(147199.15374558745/8.0), REAL_CONST(147225.27083021149/8.0), REAL_CONST(147251.38907314953/8.0), REAL_CONST(147277.50847429881/8.0), REAL_CONST(147303.62903355664/8.0), REAL_CONST(147329.75075082036/8.0), REAL_CONST(147355.87362598727/8.0), REAL_CONST(147381.99765895473/8.0), REAL_CONST(147408.12284962015/8.0), REAL_CONST(147434.24919788091/8.0), REAL_CONST(147460.37670363448/8.0), REAL_CONST(147486.50536677826/8.0), REAL_CONST(147512.63518720976/8.0), REAL_CONST(147538.76616482646/8.0), REAL_CONST(147564.89829952587/8.0), REAL_CONST(147591.03159120557/8.0), REAL_CONST(147617.16603976308/8.0), REAL_CONST(147643.30164509601/8.0), REAL_CONST(147669.43840710199/8.0), REAL_CONST(147695.57632567859/8.0), REAL_CONST(147721.71540072354/8.0), REAL_CONST(147747.85563213445/8.0), REAL_CONST(147773.99701980909/8.0), REAL_CONST(147800.13956364512/8.0), REAL_CONST(147826.28326354033/8.0), REAL_CONST(147852.42811939248/8.0), REAL_CONST(147878.57413109933/8.0), REAL_CONST(147904.72129855872/8.0), REAL_CONST(147930.86962166851/8.0), REAL_CONST(147957.01910032652/8.0), REAL_CONST(147983.16973443062/8.0), REAL_CONST(148009.32152387875/8.0), REAL_CONST(148035.47446856883/8.0), REAL_CONST(148061.62856839882/8.0), REAL_CONST(148087.78382326665/8.0), REAL_CONST(148113.94023307035/8.0), REAL_CONST(148140.09779770792/8.0), REAL_CONST(148166.25651707739/8.0), REAL_CONST(148192.41639107687/8.0), REAL_CONST(148218.57741960438/8.0), REAL_CONST(148244.73960255808/8.0), REAL_CONST(148270.90293983606/8.0), REAL_CONST(148297.0674313365/8.0), REAL_CONST(148323.23307695755/8.0), REAL_CONST(148349.39987659742/8.0), REAL_CONST(148375.56783015432/8.0), REAL_CONST(148401.73693752653/8.0), REAL_CONST(148427.90719861226/8.0), REAL_CONST(148454.07861330983/8.0), REAL_CONST(148480.25118151752/8.0), REAL_CONST(148506.42490313368/8.0), REAL_CONST(148532.59977805667/8.0), REAL_CONST(148558.77580618486/8.0), REAL_CONST(148584.95298741665/8.0), REAL_CONST(148611.13132165043/8.0), REAL_CONST(148637.31080878471/8.0), REAL_CONST(148663.49144871789/8.0), REAL_CONST(148689.6732413485/8.0), REAL_CONST(148715.85618657502/8.0), REAL_CONST(148742.040284296/8.0), REAL_CONST(148768.22553440998/8.0), REAL_CONST(148794.41193681557/8.0), REAL_CONST(148820.59949141133/8.0), REAL_CONST(148846.78819809589/8.0), REAL_CONST(148872.97805676793/8.0), REAL_CONST(148899.16906732606/8.0), REAL_CONST(148925.36122966901/8.0), REAL_CONST(148951.55454369547/8.0), REAL_CONST(148977.74900930419/8.0), REAL_CONST(149003.9446263939/8.0), REAL_CONST(149030.1413948634/8.0), REAL_CONST(149056.33931461151/8.0), REAL_CONST(149082.53838553699/8.0), REAL_CONST(149108.73860753875/8.0), REAL_CONST(149134.9399805156/8.0), REAL_CONST(149161.14250436646/8.0), REAL_CONST(149187.34617899026/8.0), REAL_CONST(149213.5510042859/8.0), REAL_CONST(149239.75698015234/8.0), REAL_CONST(149265.96410648854/8.0), REAL_CONST(149292.17238319354/8.0), REAL_CONST(149318.38181016635/8.0), REAL_CONST(149344.59238730598/8.0), REAL_CONST(149370.80411451156/8.0), REAL_CONST(149397.01699168212/8.0), REAL_CONST(149423.23101871679/8.0), REAL_CONST(149449.44619551473/8.0), REAL_CONST(149475.66252197503/8.0), REAL_CONST(149501.87999799693/8.0), REAL_CONST(149528.0986234796/8.0), REAL_CONST(149554.31839832227/8.0), REAL_CONST(149580.53932242419/8.0), REAL_CONST(149606.76139568459/8.0), REAL_CONST(149632.98461800278/8.0), REAL_CONST(149659.20898927809/8.0), REAL_CONST(149685.43450940982/8.0), REAL_CONST(149711.66117829733/8.0), REAL_CONST(149737.88899584001/8.0), REAL_CONST(149764.11796193724/8.0), REAL_CONST(149790.34807648844/8.0), REAL_CONST(149816.57933939309/8.0), REAL_CONST(149842.81175055061/8.0), REAL_CONST(149869.04530986046/8.0), REAL_CONST(149895.28001722222/8.0), REAL_CONST(149921.51587253538/8.0), REAL_CONST(149947.75287569952/8.0), REAL_CONST(149973.99102661415/8.0), REAL_CONST(150000.23032517891/8.0), REAL_CONST(150026.47077129342/8.0), REAL_CONST(150052.71236485732/8.0), REAL_CONST(150078.95510577026/8.0), REAL_CONST(150105.1989939319/8.0), REAL_CONST(150131.444029242/8.0), REAL_CONST(150157.69021160025/8.0), REAL_CONST(150183.93754090639/8.0), REAL_CONST(150210.18601706024/8.0), REAL_CONST(150236.43563996154/8.0), REAL_CONST(150262.68640951012/8.0), REAL_CONST(150288.93832560582/8.0), REAL_CONST(150315.19138814852/8.0), REAL_CONST(150341.44559703805/8.0), REAL_CONST(150367.70095217437/8.0), REAL_CONST(150393.95745345735/8.0), REAL_CONST(150420.21510078697/8.0), REAL_CONST(150446.47389406321/8.0), REAL_CONST(150472.73383318601/8.0), REAL_CONST(150498.99491805542/8.0), REAL_CONST(150525.25714857146/8.0), REAL_CONST(150551.52052463419/8.0), REAL_CONST(150577.78504614369/8.0), REAL_CONST(150604.05071300003/8.0), REAL_CONST(150630.31752510337/8.0), REAL_CONST(150656.58548235384/8.0), REAL_CONST(150682.85458465159/8.0), REAL_CONST(150709.1248318968/8.0), REAL_CONST(150735.39622398972/8.0), REAL_CONST(150761.66876083051/8.0), REAL_CONST(150787.9424423195/8.0), REAL_CONST(150814.21726835691/8.0), REAL_CONST(150840.49323884305/8.0), REAL_CONST(150866.77035367821/8.0), REAL_CONST(150893.04861276277/8.0), REAL_CONST(150919.32801599705/8.0), REAL_CONST(150945.60856328148/8.0), REAL_CONST(150971.89025451642/8.0), REAL_CONST(150998.17308960229/8.0), REAL_CONST(151024.45706843957/8.0), REAL_CONST(151050.74219092872/8.0), REAL_CONST(151077.02845697021/8.0), REAL_CONST(151103.31586646455/8.0), REAL_CONST(151129.60441931229/8.0), REAL_CONST(151155.894115414/8.0), REAL_CONST(151182.1849546702/8.0), REAL_CONST(151208.47693698155/8.0), REAL_CONST(151234.77006224863/8.0), REAL_CONST(151261.06433037209/8.0), REAL_CONST(151287.35974125259/8.0), REAL_CONST(151313.65629479082/8.0), REAL_CONST(151339.95399088747/8.0), REAL_CONST(151366.25282944329/8.0), REAL_CONST(151392.55281035902/8.0), REAL_CONST(151418.85393353543/8.0), REAL_CONST(151445.1561988733/8.0), REAL_CONST(151471.45960627345/8.0), REAL_CONST(151497.76415563675/8.0), REAL_CONST(151524.06984686397/8.0), REAL_CONST(151550.37667985607/8.0), REAL_CONST(151576.68465451393/8.0), REAL_CONST(151602.99377073845/8.0), REAL_CONST(151629.30402843058/8.0), REAL_CONST(151655.61542749128/8.0), REAL_CONST(151681.92796782157/8.0), REAL_CONST(151708.24164932242/8.0), REAL_CONST(151734.55647189484/8.0), REAL_CONST(151760.87243543993/8.0), REAL_CONST(151787.18953985872/8.0), REAL_CONST(151813.50778505235/8.0), REAL_CONST(151839.82717092187/8.0), REAL_CONST(151866.14769736846/8.0), REAL_CONST(151892.46936429327/8.0), REAL_CONST(151918.79217159748/8.0), REAL_CONST(151945.11611918229/8.0), REAL_CONST(151971.44120694889/8.0), REAL_CONST(151997.76743479856/8.0), REAL_CONST(152024.09480263255/8.0), REAL_CONST(152050.42331035214/8.0), REAL_CONST(152076.75295785864/8.0), REAL_CONST(152103.08374505339/8.0), REAL_CONST(152129.41567183775/8.0), REAL_CONST(152155.74873811303/8.0), REAL_CONST(152182.08294378067/8.0), REAL_CONST(152208.41828874208/8.0), REAL_CONST(152234.75477289871/8.0), REAL_CONST(152261.09239615197/8.0), REAL_CONST(152287.43115840337/8.0), REAL_CONST(152313.77105955439/8.0), REAL_CONST(152340.11209950657/8.0), REAL_CONST(152366.45427816146/8.0), REAL_CONST(152392.79759542056/8.0), REAL_CONST(152419.14205118554/8.0), REAL_CONST(152445.48764535793/8.0), REAL_CONST(152471.8343778394/8.0), REAL_CONST(152498.18224853161/8.0), REAL_CONST(152524.53125733617/8.0), REAL_CONST(152550.88140415482/8.0), REAL_CONST(152577.23268888926/8.0), REAL_CONST(152603.58511144121/8.0), REAL_CONST(152629.93867171241/8.0), REAL_CONST(152656.29336960468/8.0), REAL_CONST(152682.64920501978/8.0), REAL_CONST(152709.00617785956/8.0), REAL_CONST(152735.36428802583/8.0), REAL_CONST(152761.72353542043/8.0), REAL_CONST(152788.08391994529/8.0), REAL_CONST(152814.44544150229/8.0), REAL_CONST(152840.80809999333/8.0), REAL_CONST(152867.17189532038/8.0), REAL_CONST(152893.53682738543/8.0), REAL_CONST(152919.90289609041/8.0), REAL_CONST(152946.27010133737/8.0), REAL_CONST(152972.63844302832/8.0), REAL_CONST(152999.00792106529/8.0), REAL_CONST(153025.37853535041/8.0), REAL_CONST(153051.7502857857/8.0), REAL_CONST(153078.12317227334/8.0), REAL_CONST(153104.4971947154/8.0), REAL_CONST(153130.8723530141/8.0), REAL_CONST(153157.24864707157/8.0), REAL_CONST(153183.62607679001/8.0), REAL_CONST(153210.00464207167/8.0), REAL_CONST(153236.38434281875/8.0), REAL_CONST(153262.76517893354/8.0), REAL_CONST(153289.14715031831/8.0), REAL_CONST(153315.53025687535/8.0), REAL_CONST(153341.91449850702/8.0), REAL_CONST(153368.2998751156/8.0), REAL_CONST(153394.68638660354/8.0), REAL_CONST(153421.07403287315/8.0), REAL_CONST(153447.46281382689/8.0), REAL_CONST(153473.85272936718/8.0), REAL_CONST(153500.24377939643/8.0), REAL_CONST(153526.63596381716/8.0), REAL_CONST(153553.02928253182/8.0), REAL_CONST(153579.42373544298/8.0), REAL_CONST(153605.81932245308/8.0), REAL_CONST(153632.21604346478/8.0), REAL_CONST(153658.61389838057/8.0), REAL_CONST(153685.0128871031/8.0), REAL_CONST(153711.41300953497/8.0), REAL_CONST(153737.81426557881/8.0), REAL_CONST(153764.21665513728/8.0), REAL_CONST(153790.62017811305/8.0), REAL_CONST(153817.02483440886/8.0), REAL_CONST(153843.43062392739/8.0), REAL_CONST(153869.83754657139/8.0), REAL_CONST(153896.24560224367/8.0), REAL_CONST(153922.65479084692/8.0), REAL_CONST(153949.06511228404/8.0), REAL_CONST(153975.4765664578/8.0), REAL_CONST(154001.88915327107/8.0), REAL_CONST(154028.30287262669/8.0), REAL_CONST(154054.71772442761/8.0), REAL_CONST(154081.13370857667/8.0), REAL_CONST(154107.55082497682/8.0), REAL_CONST(154133.96907353101/8.0), REAL_CONST(154160.38845414223/8.0), REAL_CONST(154186.80896671346/8.0), REAL_CONST(154213.23061114774/8.0), REAL_CONST(154239.65338734805/8.0), REAL_CONST(154266.07729521746/8.0), REAL_CONST(154292.50233465908/8.0), REAL_CONST(154318.92850557598/8.0), REAL_CONST(154345.35580787127/8.0), REAL_CONST(154371.7842414481/8.0), REAL_CONST(154398.21380620965/8.0), REAL_CONST(154424.64450205903/8.0), REAL_CONST(154451.07632889951/8.0), REAL_CONST(154477.50928663427/8.0), REAL_CONST(154503.94337516659/8.0), REAL_CONST(154530.37859439969/8.0), REAL_CONST(154556.81494423689/8.0), REAL_CONST(154583.25242458144/8.0), REAL_CONST(154609.69103533673/8.0), REAL_CONST(154636.13077640603/8.0), REAL_CONST(154662.57164769279/8.0), REAL_CONST(154689.01364910032/8.0), REAL_CONST(154715.45678053208/8.0), REAL_CONST(154741.90104189145/8.0), REAL_CONST(154768.34643308193/8.0), REAL_CONST(154794.79295400696/8.0), REAL_CONST(154821.24060457002/8.0), REAL_CONST(154847.68938467462/8.0), REAL_CONST(154874.13929422433/8.0), REAL_CONST(154900.59033312264/8.0), REAL_CONST(154927.04250127316/8.0), REAL_CONST(154953.49579857948/8.0), REAL_CONST(154979.95022494521/8.0), REAL_CONST(155006.40578027396/8.0), REAL_CONST(155032.86246446942/8.0), REAL_CONST(155059.32027743524/8.0), REAL_CONST(155085.77921907514/8.0), REAL_CONST(155112.2392892928/8.0), REAL_CONST(155138.70048799197/8.0), REAL_CONST(155165.16281507642/8.0), REAL_CONST(155191.62627044989/8.0), REAL_CONST(155218.09085401625/8.0), REAL_CONST(155244.55656567923/8.0), REAL_CONST(155271.02340534274/8.0), REAL_CONST(155297.49137291059/8.0), REAL_CONST(155323.96046828668/8.0), REAL_CONST(155350.4306913749/8.0), REAL_CONST(155376.90204207919/8.0), REAL_CONST(155403.37452030348/8.0), REAL_CONST(155429.84812595171/8.0), REAL_CONST(155456.32285892789/8.0), REAL_CONST(155482.79871913602/8.0), REAL_CONST(155509.27570648011/8.0), REAL_CONST(155535.75382086422/8.0), REAL_CONST(155562.23306219239/8.0), REAL_CONST(155588.71343036872/8.0), REAL_CONST(155615.19492529731/8.0), REAL_CONST(155641.67754688227/8.0), REAL_CONST(155668.16129502779/8.0), REAL_CONST(155694.64616963797/8.0), REAL_CONST(155721.13217061706/8.0), REAL_CONST(155747.61929786921/8.0), REAL_CONST(155774.10755129869/8.0), REAL_CONST(155800.59693080973/8.0), REAL_CONST(155827.08743630661/8.0), REAL_CONST(155853.57906769359/8.0), REAL_CONST(155880.07182487496/8.0), REAL_CONST(155906.56570775513/8.0), REAL_CONST(155933.06071623837/8.0), REAL_CONST(155959.55685022907/8.0), REAL_CONST(155986.05410963166/8.0), REAL_CONST(156012.5524943505/8.0), REAL_CONST(156039.05200429002/8.0), REAL_CONST(156065.55263935472/8.0), REAL_CONST(156092.054399449/8.0), REAL_CONST(156118.5572844774/8.0), REAL_CONST(156145.06129434443/8.0), REAL_CONST(156171.5664289546/8.0), REAL_CONST(156198.07268821247/8.0), REAL_CONST(156224.5800720226/8.0), REAL_CONST(156251.08858028959/8.0), REAL_CONST(156277.59821291809/8.0), REAL_CONST(156304.10896981266/8.0), REAL_CONST(156330.62085087801/8.0), REAL_CONST(156357.1338560188/8.0), REAL_CONST(156383.64798513969/8.0), REAL_CONST(156410.16323814544/8.0), REAL_CONST(156436.67961494075/8.0), REAL_CONST(156463.1971154304/8.0), REAL_CONST(156489.71573951913/8.0), REAL_CONST(156516.23548711176/8.0), REAL_CONST(156542.75635811311/8.0), REAL_CONST(156569.27835242799/8.0), REAL_CONST(156595.80146996127/8.0), REAL_CONST(156622.32571061782/8.0), REAL_CONST(156648.85107430254/8.0), REAL_CONST(156675.37756092031/8.0), REAL_CONST(156701.90517037612/8.0), REAL_CONST(156728.43390257491/8.0), REAL_CONST(156754.96375742162/8.0), REAL_CONST(156781.49473482129/8.0), REAL_CONST(156808.02683467892/8.0), REAL_CONST(156834.5600568995/8.0), REAL_CONST(156861.09440138817/8.0), REAL_CONST(156887.62986804993/8.0), REAL_CONST(156914.16645678994/8.0), REAL_CONST(156940.70416751326/8.0), REAL_CONST(156967.24300012505/8.0), REAL_CONST(156993.78295453047/8.0), REAL_CONST(157020.32403063469/8.0), REAL_CONST(157046.8662283429/8.0), REAL_CONST(157073.40954756032/8.0), REAL_CONST(157099.9539881922/8.0), REAL_CONST(157126.49955014378/8.0), REAL_CONST(157153.04623332032/8.0), REAL_CONST(157179.59403762716/8.0), REAL_CONST(157206.14296296958/8.0), REAL_CONST(157232.69300925292/8.0), REAL_CONST(157259.24417638258/8.0), REAL_CONST(157285.79646426387/8.0), REAL_CONST(157312.34987280221/8.0), REAL_CONST(157338.90440190304/8.0), REAL_CONST(157365.46005147175/8.0), REAL_CONST(157392.01682141385/8.0), REAL_CONST(157418.57471163478/8.0), REAL_CONST(157445.13372204005/8.0), REAL_CONST(157471.69385253513/8.0), REAL_CONST(157498.25510302564/8.0), REAL_CONST(157524.81747341706/8.0), REAL_CONST(157551.38096361503/8.0), REAL_CONST(157577.9455735251/8.0), REAL_CONST(157604.51130305286/8.0), REAL_CONST(157631.07815210402/8.0), REAL_CONST(157657.64612058419/8.0), REAL_CONST(157684.21520839902/8.0), REAL_CONST(157710.78541545427/8.0), REAL_CONST(157737.35674165559/8.0), REAL_CONST(157763.92918690876/8.0), REAL_CONST(157790.50275111952/8.0), REAL_CONST(157817.07743419363/8.0), REAL_CONST(157843.65323603692/8.0), REAL_CONST(157870.23015655516/8.0), REAL_CONST(157896.80819565422/8.0), REAL_CONST(157923.3873532399/8.0), REAL_CONST(157949.96762921812/8.0), REAL_CONST(157976.54902349479/8.0), REAL_CONST(158003.13153597576/8.0), REAL_CONST(158029.71516656701/8.0), REAL_CONST(158056.29991517449/8.0), REAL_CONST(158082.88578170416/8.0), REAL_CONST(158109.47276606198/8.0), REAL_CONST(158136.06086815402/8.0), REAL_CONST(158162.65008788629/8.0), REAL_CONST(158189.24042516484/8.0), REAL_CONST(158215.83187989573/8.0), REAL_CONST(158242.42445198505/8.0), REAL_CONST(158269.01814133892/8.0), REAL_CONST(158295.61294786347/8.0), REAL_CONST(158322.20887146486/8.0), REAL_CONST(158348.80591204923/8.0), REAL_CONST(158375.4040695228/8.0), REAL_CONST(158402.00334379176/8.0), REAL_CONST(158428.60373476235/8.0), REAL_CONST(158455.2052423408/8.0), REAL_CONST(158481.80786643337/8.0), REAL_CONST(158508.41160694641/8.0), REAL_CONST(158535.01646378616/8.0), REAL_CONST(158561.62243685898/8.0), REAL_CONST(158588.2295260712/8.0), REAL_CONST(158614.8377313292/8.0), REAL_CONST(158641.44705253936/8.0), REAL_CONST(158668.05748960807/8.0), REAL_CONST(158694.66904244179/8.0), REAL_CONST(158721.28171094693/8.0), REAL_CONST(158747.89549502998/8.0), REAL_CONST(158774.5103945974/8.0), REAL_CONST(158801.12640955573/8.0), REAL_CONST(158827.74353981143/8.0), REAL_CONST(158854.36178527112/8.0), REAL_CONST(158880.9811458413/8.0), REAL_CONST(158907.60162142856/8.0), REAL_CONST(158934.22321193956/8.0), REAL_CONST(158960.84591728085/8.0), REAL_CONST(158987.46973735912/8.0), REAL_CONST(159014.09467208097/8.0), REAL_CONST(159040.72072135314/8.0), REAL_CONST(159067.3478850823/8.0), REAL_CONST(159093.97616317519/8.0), REAL_CONST(159120.60555553852/8.0), REAL_CONST(159147.23606207906/8.0), REAL_CONST(159173.8676827036/8.0), REAL_CONST(159200.50041731889/8.0), REAL_CONST(159227.13426583182/8.0), REAL_CONST(159253.76922814918/8.0), REAL_CONST(159280.40530417781/8.0), REAL_CONST(159307.04249382461/8.0), REAL_CONST(159333.68079699649/8.0), REAL_CONST(159360.32021360032/8.0), REAL_CONST(159386.96074354305/8.0), REAL_CONST(159413.60238673165/8.0), REAL_CONST(159440.24514307309/8.0), REAL_CONST(159466.88901247433/8.0), REAL_CONST(159493.53399484244/8.0), REAL_CONST(159520.18009008438/8.0), REAL_CONST(159546.82729810724/8.0), REAL_CONST(159573.47561881805/8.0), REAL_CONST(159600.12505212394/8.0), REAL_CONST(159626.77559793202/8.0), REAL_CONST(159653.42725614941/8.0), REAL_CONST(159680.08002668325/8.0), REAL_CONST(159706.73390944069/8.0), REAL_CONST(159733.38890432892/8.0), REAL_CONST(159760.04501125516/8.0), REAL_CONST(159786.70223012666/8.0), REAL_CONST(159813.36056085059/8.0), REAL_CONST(159840.02000333427/8.0), REAL_CONST(159866.68055748497/8.0), REAL_CONST(159893.34222320997/8.0), REAL_CONST(159920.00500041663/8.0), REAL_CONST(159946.66888901225/8.0), REAL_CONST(159973.33388890422/8.0), REAL_CONST(159999.99999999988/8.0), REAL_CONST(160026.66722220668/8.0), REAL_CONST(160053.33555543202/8.0), REAL_CONST(160080.0049995833/8.0), REAL_CONST(160106.67555456801/8.0), REAL_CONST(160133.3472202936/8.0), REAL_CONST(160160.0199966676/8.0), REAL_CONST(160186.6938835975/8.0), REAL_CONST(160213.36888099083/8.0), REAL_CONST(160240.04498875517/8.0), REAL_CONST(160266.72220679806/8.0), REAL_CONST(160293.40053502709/8.0), REAL_CONST(160320.07997334987/8.0), REAL_CONST(160346.76052167406/8.0), REAL_CONST(160373.44217990729/8.0), REAL_CONST(160400.1249479572/8.0), REAL_CONST(160426.80882573154/8.0), REAL_CONST(160453.49381313793/8.0), REAL_CONST(160480.17991008417/8.0), REAL_CONST(160506.86711647795/8.0), REAL_CONST(160533.55543222709/8.0), REAL_CONST(160560.24485723933/8.0), REAL_CONST(160586.93539142248/8.0), REAL_CONST(160613.62703468435/8.0), REAL_CONST(160640.31978693281/8.0), REAL_CONST(160667.01364807569/8.0), REAL_CONST(160693.70861802087/8.0), REAL_CONST(160720.40469667627/8.0), REAL_CONST(160747.1018839498/8.0), REAL_CONST(160773.80017974938/8.0), REAL_CONST(160800.49958398298/8.0), REAL_CONST(160827.20009655855/8.0), REAL_CONST(160853.90171738411/8.0), REAL_CONST(160880.60444636765/8.0), REAL_CONST(160907.30828341722/8.0), REAL_CONST(160934.01322844089/8.0), REAL_CONST(160960.71928134665/8.0), REAL_CONST(160987.42644204266/8.0), REAL_CONST(161014.13471043704/8.0), REAL_CONST(161040.84408643784/8.0), REAL_CONST(161067.55456995327/8.0), REAL_CONST(161094.26616089148/8.0), REAL_CONST(161120.97885916062/8.0), REAL_CONST(161147.69266466892/8.0), REAL_CONST(161174.40757732463/8.0), REAL_CONST(161201.12359703594/8.0), REAL_CONST(161227.84072371112/8.0), REAL_CONST(161254.55895725847/8.0), REAL_CONST(161281.27829758628/8.0), REAL_CONST(161307.99874460287/8.0), REAL_CONST(161334.72029821656/8.0), REAL_CONST(161361.44295833571/8.0), REAL_CONST(161388.1667248687/8.0), REAL_CONST(161414.89159772391/8.0), REAL_CONST(161441.61757680977/8.0), REAL_CONST(161468.34466203468/8.0), REAL_CONST(161495.07285330712/8.0), REAL_CONST(161521.80215053557/8.0), REAL_CONST(161548.53255362847/8.0), REAL_CONST(161575.26406249436/8.0), REAL_CONST(161601.99667704175/8.0), REAL_CONST(161628.7303971792/8.0), REAL_CONST(161655.46522281526/8.0), REAL_CONST(161682.20115385848/8.0), REAL_CONST(161708.93819021754/8.0), REAL_CONST(161735.67633180099/8.0), REAL_CONST(161762.41557851751/8.0), REAL_CONST(161789.15593027571/8.0), REAL_CONST(161815.89738698432/8.0), REAL_CONST(161842.63994855201/8.0), REAL_CONST(161869.38361488748/8.0), REAL_CONST(161896.1283858995/8.0), REAL_CONST(161922.87426149679/8.0), REAL_CONST(161949.62124158812/8.0), REAL_CONST(161976.36932608229/8.0), REAL_CONST(162003.1185148881/8.0), REAL_CONST(162029.8688079144/8.0), REAL_CONST(162056.62020507001/8.0), REAL_CONST(162083.37270626382/8.0), REAL_CONST(162110.12631140469/8.0), REAL_CONST(162136.88102040152/8.0), REAL_CONST(162163.63683316324/8.0), REAL_CONST(162190.39374959879/8.0), REAL_CONST(162217.15176961714/8.0), REAL_CONST(162243.91089312723/8.0), REAL_CONST(162270.67112003808/8.0), REAL_CONST(162297.43245025873/8.0), REAL_CONST(162324.19488369819/8.0), REAL_CONST(162350.9584202655/8.0), REAL_CONST(162377.72305986975/8.0), REAL_CONST(162404.48880242003/8.0), REAL_CONST(162431.25564782543/8.0), REAL_CONST(162458.02359599507/8.0), REAL_CONST(162484.79264683815/8.0), REAL_CONST(162511.56280026378/8.0), REAL_CONST(162538.33405618116/8.0), REAL_CONST(162565.10641449949/8.0), REAL_CONST(162591.87987512801/8.0), REAL_CONST(162618.65443797593/8.0), REAL_CONST(162645.43010295252/8.0), REAL_CONST(162672.20686996708/8.0), REAL_CONST(162698.98473892888/8.0), REAL_CONST(162725.76370974723/8.0), REAL_CONST(162752.54378233149/8.0), REAL_CONST(162779.32495659095/8.0), REAL_CONST(162806.10723243505/8.0), REAL_CONST(162832.89060977317/8.0), REAL_CONST(162859.67508851466/8.0), REAL_CONST(162886.46066856899/8.0), REAL_CONST(162913.24734984562/8.0), REAL_CONST(162940.03513225398/8.0), REAL_CONST(162966.82401570358/8.0), REAL_CONST(162993.6140001039/8.0), REAL_CONST(163020.40508536444/8.0), REAL_CONST(163047.19727139481/8.0), REAL_CONST(163073.99055810447/8.0), REAL_CONST(163100.78494540305/8.0), REAL_CONST(163127.58043320014/8.0), REAL_CONST(163154.37702140535/8.0), REAL_CONST(163181.17470992831/8.0), REAL_CONST(163207.97349867865/8.0), REAL_CONST(163234.77338756606/8.0), REAL_CONST(163261.57437650024/8.0), REAL_CONST(163288.37646539087/8.0), REAL_CONST(163315.17965414765/8.0), REAL_CONST(163341.98394268038/8.0), REAL_CONST(163368.78933089875/8.0), REAL_CONST(163395.59581871261/8.0), REAL_CONST(163422.40340603172/8.0), REAL_CONST(163449.2120927659/8.0), REAL_CONST(163476.02187882498/8.0), REAL_CONST(163502.83276411882/8.0), REAL_CONST(163529.6447485573/8.0), REAL_CONST(163556.45783205028/8.0), REAL_CONST(163583.2720145077/8.0), REAL_CONST(163610.08729583945/8.0), REAL_CONST(163636.90367595552/8.0), REAL_CONST(163663.72115476584/8.0), REAL_CONST(163690.53973218042/8.0), REAL_CONST(163717.35940810922/8.0), REAL_CONST(163744.18018246227/8.0), REAL_CONST(163771.00205514964/8.0), REAL_CONST(163797.82502608138/8.0), REAL_CONST(163824.64909516752/8.0), REAL_CONST(163851.4742623182/8.0), REAL_CONST(163878.3005274435/8.0), REAL_CONST(163905.12789045356/8.0), REAL_CONST(163931.95635125853/8.0), REAL_CONST(163958.78590976857/8.0), REAL_CONST(163985.61656589387/8.0), REAL_CONST(164012.44831954464/8.0), REAL_CONST(164039.28117063109/8.0), REAL_CONST(164066.11511906344/8.0), REAL_CONST(164092.95016475199/8.0), REAL_CONST(164119.78630760699/8.0), REAL_CONST(164146.62354753874/8.0), REAL_CONST(164173.46188445756/8.0), REAL_CONST(164200.30131827376/8.0), REAL_CONST(164227.14184889771/8.0), REAL_CONST(164253.98347623978/8.0), REAL_CONST(164280.82620021031/8.0), REAL_CONST(164307.67002071979/8.0), REAL_CONST(164334.51493767856/8.0), REAL_CONST(164361.3609509971/8.0), REAL_CONST(164388.20806058586/8.0), REAL_CONST(164415.05626635533/8.0), REAL_CONST(164441.905568216/8.0), REAL_CONST(164468.75596607837/8.0), REAL_CONST(164495.607459853/8.0), REAL_CONST(164522.4600494504/8.0), REAL_CONST(164549.31373478117/8.0), REAL_CONST(164576.16851575591/8.0), REAL_CONST(164603.02439228518/8.0), REAL_CONST(164629.88136427966/8.0), REAL_CONST(164656.73943164994/8.0), REAL_CONST(164683.59859430668/8.0), REAL_CONST(164710.45885216061/8.0), REAL_CONST(164737.32020512238/8.0), REAL_CONST(164764.1826531027/8.0), REAL_CONST(164791.04619601235/8.0), REAL_CONST(164817.91083376206/8.0), REAL_CONST(164844.77656626256/8.0), REAL_CONST(164871.64339342469/8.0), REAL_CONST(164898.51131515924/8.0), REAL_CONST(164925.38033137703/8.0), REAL_CONST(164952.25044198887/8.0), REAL_CONST(164979.1216469057/8.0), REAL_CONST(165005.9939460383/8.0), REAL_CONST(165032.86733929763/8.0), REAL_CONST(165059.7418265946/8.0), REAL_CONST(165086.61740784015/8.0), REAL_CONST(165113.4940829452/8.0) #endif }; #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/is.c000066400000000000000000000074111476153623600147330ustar00rootroot00000000000000/* ** 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.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; real_t scale; #ifdef FIXED_POINT 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)) { int16_t scale_factor = icsr->scale_factors[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_factor = min(max(scale_factor, -120), 120); scale = (real_t)pow(0.5, (0.25*scale_factor)); #else scale_factor = min(max(scale_factor, -60), 60); exp = scale_factor >> 2; /* exp is -15..15 */ frac = scale_factor & 3; scale = pow05_table[frac]; exp += COEF_BITS - REAL_BITS; /* exp is -1..29 */ if (exp < 0) scale <<= -exp; else scale >>= exp; #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++) { r_spec[(group*nshort)+i] = MUL_R(l_spec[(group*nshort)+i], scale); if (is_intensity(icsr, g, sfb) != invert_intensity(ics, g, sfb)) r_spec[(group*nshort)+i] = -r_spec[(group*nshort)+i]; } } } group++; } } } faad2-2.11.2/libfaad/is.h000066400000000000000000000036671476153623600147510ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: is.h,v 1.20 2007/11/01 12:33:31 menno Exp $ **/ #ifndef __IS_H__ #define __IS_H__ #ifdef __cplusplus extern "C" { #endif #include "syntax.h" void is_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len); static INLINE int8_t is_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) { switch (ics->sfb_cb[group][sfb]) { case INTENSITY_HCB: return 1; case INTENSITY_HCB2: return -1; default: return 0; } } static INLINE int8_t invert_intensity(ic_stream *ics, uint8_t group, uint8_t sfb) { if (ics->ms_mask_present == 1) return (1-2*ics->ms_used[group][sfb]); return 1; } #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/kbd_win.h000066400000000000000000002352011476153623600157420ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: kbd_win.h,v 1.21 2007/11/01 12:33:31 menno Exp $ **/ #ifndef __KBD_WIN_H__ #define __KBD_WIN_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t kbd_long_1024[] = { FRAC_CONST(0.00029256153896361), FRAC_CONST(0.00042998567353047), FRAC_CONST(0.00054674074589540), FRAC_CONST(0.00065482304299792), FRAC_CONST(0.00075870195068747), FRAC_CONST(0.00086059331713336), FRAC_CONST(0.00096177541439010), FRAC_CONST(0.0010630609410878), FRAC_CONST(0.0011650036308132), FRAC_CONST(0.0012680012194148), FRAC_CONST(0.0013723517232956), FRAC_CONST(0.0014782864109136), FRAC_CONST(0.0015859901976719), FRAC_CONST(0.0016956148252373), FRAC_CONST(0.0018072876903517), FRAC_CONST(0.0019211179405514), FRAC_CONST(0.0020372007924215), FRAC_CONST(0.0021556206591754), FRAC_CONST(0.0022764534599614), FRAC_CONST(0.0023997683540995), FRAC_CONST(0.0025256290631156), FRAC_CONST(0.0026540948920831), FRAC_CONST(0.0027852215281403), FRAC_CONST(0.0029190616715331), FRAC_CONST(0.0030556655443223), FRAC_CONST(0.0031950812943391), FRAC_CONST(0.0033373553240392), FRAC_CONST(0.0034825325586930), FRAC_CONST(0.0036306566699199), FRAC_CONST(0.0037817702604646), FRAC_CONST(0.0039359150179719), FRAC_CONST(0.0040931318437260), FRAC_CONST(0.0042534609610026), FRAC_CONST(0.0044169420066964), FRAC_CONST(0.0045836141091341), FRAC_CONST(0.0047535159544086), FRAC_CONST(0.0049266858431214), FRAC_CONST(0.0051031617390698), FRAC_CONST(0.0052829813111335), FRAC_CONST(0.0054661819693975), FRAC_CONST(0.0056528008963682), FRAC_CONST(0.0058428750739943), FRAC_CONST(0.0060364413070882), FRAC_CONST(0.0062335362436492), FRAC_CONST(0.0064341963925079), FRAC_CONST(0.0066384581386503), FRAC_CONST(0.0068463577565218), FRAC_CONST(0.0070579314215715), FRAC_CONST(0.0072732152202559), FRAC_CONST(0.0074922451586909), FRAC_CONST(0.0077150571701162), FRAC_CONST(0.0079416871213115), FRAC_CONST(0.0081721708180857), FRAC_CONST(0.0084065440099458), FRAC_CONST(0.0086448423940363), FRAC_CONST(0.0088871016184291), FRAC_CONST(0.0091333572848345), FRAC_CONST(0.0093836449507939), FRAC_CONST(0.0096380001314086), FRAC_CONST(0.0098964583006517), FRAC_CONST(0.010159054892306), FRAC_CONST(0.010425825300561), FRAC_CONST(0.010696804880310), FRAC_CONST(0.010972028947167), FRAC_CONST(0.011251532777236), FRAC_CONST(0.011535351606646), FRAC_CONST(0.011823520630897), FRAC_CONST(0.012116075003993), FRAC_CONST(0.012413049837429), FRAC_CONST(0.012714480198999), FRAC_CONST(0.013020401111478), FRAC_CONST(0.013330847551161), FRAC_CONST(0.013645854446288), FRAC_CONST(0.013965456675352), FRAC_CONST(0.014289689065314), FRAC_CONST(0.014618586389712), FRAC_CONST(0.014952183366697), FRAC_CONST(0.015290514656976), FRAC_CONST(0.015633614861688), FRAC_CONST(0.015981518520214), FRAC_CONST(0.016334260107915), FRAC_CONST(0.016691874033817), FRAC_CONST(0.017054394638241), FRAC_CONST(0.017421856190380), FRAC_CONST(0.017794292885832), FRAC_CONST(0.018171738844085), FRAC_CONST(0.018554228105962), FRAC_CONST(0.018941794631032), FRAC_CONST(0.019334472294980), FRAC_CONST(0.019732294886947), FRAC_CONST(0.020135296106839), FRAC_CONST(0.020543509562604), FRAC_CONST(0.020956968767488), FRAC_CONST(0.021375707137257), FRAC_CONST(0.021799757987407), FRAC_CONST(0.022229154530343), FRAC_CONST(0.022663929872540), FRAC_CONST(0.023104117011689), FRAC_CONST(0.023549748833816), FRAC_CONST(0.024000858110398), FRAC_CONST(0.024457477495451), FRAC_CONST(0.024919639522613), FRAC_CONST(0.025387376602207), FRAC_CONST(0.025860721018295), FRAC_CONST(0.026339704925726), FRAC_CONST(0.026824360347160), FRAC_CONST(0.027314719170100), FRAC_CONST(0.027810813143900), FRAC_CONST(0.028312673876775), FRAC_CONST(0.028820332832801), FRAC_CONST(0.029333821328905), FRAC_CONST(0.029853170531859), FRAC_CONST(0.030378411455255), FRAC_CONST(0.030909574956490), FRAC_CONST(0.031446691733739), FRAC_CONST(0.031989792322926), FRAC_CONST(0.032538907094693), FRAC_CONST(0.033094066251369), FRAC_CONST(0.033655299823935), FRAC_CONST(0.034222637668991), FRAC_CONST(0.034796109465717), FRAC_CONST(0.035375744712844), FRAC_CONST(0.035961572725616), FRAC_CONST(0.036553622632758), FRAC_CONST(0.037151923373446), FRAC_CONST(0.037756503694277), FRAC_CONST(0.038367392146243), FRAC_CONST(0.038984617081711), FRAC_CONST(0.039608206651398), FRAC_CONST(0.040238188801359), FRAC_CONST(0.040874591269976), FRAC_CONST(0.041517441584950), FRAC_CONST(0.042166767060301), FRAC_CONST(0.042822594793376), FRAC_CONST(0.043484951661852), FRAC_CONST(0.044153864320760), FRAC_CONST(0.044829359199509), FRAC_CONST(0.045511462498913), FRAC_CONST(0.046200200188234), FRAC_CONST(0.046895598002228), FRAC_CONST(0.047597681438201), FRAC_CONST(0.048306475753074), FRAC_CONST(0.049022005960455), FRAC_CONST(0.049744296827725), FRAC_CONST(0.050473372873129), FRAC_CONST(0.051209258362879), FRAC_CONST(0.051951977308273), FRAC_CONST(0.052701553462813), FRAC_CONST(0.053458010319350), FRAC_CONST(0.054221371107223), FRAC_CONST(0.054991658789428), FRAC_CONST(0.055768896059787), FRAC_CONST(0.056553105340134), FRAC_CONST(0.057344308777513), FRAC_CONST(0.058142528241393), FRAC_CONST(0.058947785320893), FRAC_CONST(0.059760101322019), FRAC_CONST(0.060579497264926), FRAC_CONST(0.061405993881180), FRAC_CONST(0.062239611611049), FRAC_CONST(0.063080370600799), FRAC_CONST(0.063928290700012), FRAC_CONST(0.064783391458919), FRAC_CONST(0.065645692125747), FRAC_CONST(0.066515211644086), FRAC_CONST(0.067391968650269), FRAC_CONST(0.068275981470777), FRAC_CONST(0.069167268119652), FRAC_CONST(0.070065846295935), FRAC_CONST(0.070971733381121), FRAC_CONST(0.071884946436630), FRAC_CONST(0.072805502201299), FRAC_CONST(0.073733417088896), FRAC_CONST(0.074668707185649), FRAC_CONST(0.075611388247794), FRAC_CONST(0.076561475699152), FRAC_CONST(0.077518984628715), FRAC_CONST(0.078483929788261), FRAC_CONST(0.079456325589986), FRAC_CONST(0.080436186104162), FRAC_CONST(0.081423525056808), FRAC_CONST(0.082418355827392), FRAC_CONST(0.083420691446553), FRAC_CONST(0.084430544593841), FRAC_CONST(0.085447927595483), FRAC_CONST(0.086472852422178), FRAC_CONST(0.087505330686900), FRAC_CONST(0.088545373642744), FRAC_CONST(0.089592992180780), FRAC_CONST(0.090648196827937), FRAC_CONST(0.091710997744919), FRAC_CONST(0.092781404724131), FRAC_CONST(0.093859427187640), FRAC_CONST(0.094945074185163), FRAC_CONST(0.096038354392069), FRAC_CONST(0.097139276107423), FRAC_CONST(0.098247847252041), FRAC_CONST(0.099364075366580), FRAC_CONST(0.10048796760965), FRAC_CONST(0.10161953075597), FRAC_CONST(0.10275877119451), FRAC_CONST(0.10390569492671), FRAC_CONST(0.10506030756469), FRAC_CONST(0.10622261432949), FRAC_CONST(0.10739262004941), FRAC_CONST(0.10857032915821), FRAC_CONST(0.10975574569357), FRAC_CONST(0.11094887329534), FRAC_CONST(0.11214971520402), FRAC_CONST(0.11335827425914), FRAC_CONST(0.11457455289772), FRAC_CONST(0.11579855315274), FRAC_CONST(0.11703027665170), FRAC_CONST(0.11826972461510), FRAC_CONST(0.11951689785504), FRAC_CONST(0.12077179677383), FRAC_CONST(0.12203442136263), FRAC_CONST(0.12330477120008), FRAC_CONST(0.12458284545102), FRAC_CONST(0.12586864286523), FRAC_CONST(0.12716216177615), FRAC_CONST(0.12846340009971), FRAC_CONST(0.12977235533312), FRAC_CONST(0.13108902455375), FRAC_CONST(0.13241340441801), FRAC_CONST(0.13374549116025), FRAC_CONST(0.13508528059173), FRAC_CONST(0.13643276809961), FRAC_CONST(0.13778794864595), FRAC_CONST(0.13915081676677), FRAC_CONST(0.14052136657114), FRAC_CONST(0.14189959174027), FRAC_CONST(0.14328548552671), FRAC_CONST(0.14467904075349), FRAC_CONST(0.14608024981336), FRAC_CONST(0.14748910466804), FRAC_CONST(0.14890559684750), FRAC_CONST(0.15032971744929), FRAC_CONST(0.15176145713790), FRAC_CONST(0.15320080614414), FRAC_CONST(0.15464775426459), FRAC_CONST(0.15610229086100), FRAC_CONST(0.15756440485987), FRAC_CONST(0.15903408475193), FRAC_CONST(0.16051131859170), FRAC_CONST(0.16199609399712), FRAC_CONST(0.16348839814917), FRAC_CONST(0.16498821779156), FRAC_CONST(0.16649553923042), FRAC_CONST(0.16801034833404), FRAC_CONST(0.16953263053270), FRAC_CONST(0.17106237081842), FRAC_CONST(0.17259955374484), FRAC_CONST(0.17414416342714), FRAC_CONST(0.17569618354193), FRAC_CONST(0.17725559732720), FRAC_CONST(0.17882238758238), FRAC_CONST(0.18039653666830), FRAC_CONST(0.18197802650733), FRAC_CONST(0.18356683858343), FRAC_CONST(0.18516295394233), FRAC_CONST(0.18676635319174), FRAC_CONST(0.18837701650148), FRAC_CONST(0.18999492360384), FRAC_CONST(0.19162005379380), FRAC_CONST(0.19325238592940), FRAC_CONST(0.19489189843209), FRAC_CONST(0.19653856928714), FRAC_CONST(0.19819237604409), FRAC_CONST(0.19985329581721), FRAC_CONST(0.20152130528605), FRAC_CONST(0.20319638069594), FRAC_CONST(0.20487849785865), FRAC_CONST(0.20656763215298), FRAC_CONST(0.20826375852540), FRAC_CONST(0.20996685149083), FRAC_CONST(0.21167688513330), FRAC_CONST(0.21339383310678), FRAC_CONST(0.21511766863598), FRAC_CONST(0.21684836451719), FRAC_CONST(0.21858589311922), FRAC_CONST(0.22033022638425), FRAC_CONST(0.22208133582887), FRAC_CONST(0.22383919254503), FRAC_CONST(0.22560376720111), FRAC_CONST(0.22737503004300), FRAC_CONST(0.22915295089517), FRAC_CONST(0.23093749916189), FRAC_CONST(0.23272864382838), FRAC_CONST(0.23452635346201), FRAC_CONST(0.23633059621364), FRAC_CONST(0.23814133981883), FRAC_CONST(0.23995855159925), FRAC_CONST(0.24178219846403), FRAC_CONST(0.24361224691114), FRAC_CONST(0.24544866302890), FRAC_CONST(0.24729141249740), FRAC_CONST(0.24914046059007), FRAC_CONST(0.25099577217522), FRAC_CONST(0.25285731171763), FRAC_CONST(0.25472504328019), FRAC_CONST(0.25659893052556), FRAC_CONST(0.25847893671788), FRAC_CONST(0.26036502472451), FRAC_CONST(0.26225715701781), FRAC_CONST(0.26415529567692), FRAC_CONST(0.26605940238966), FRAC_CONST(0.26796943845439), FRAC_CONST(0.26988536478190), FRAC_CONST(0.27180714189742), FRAC_CONST(0.27373472994256), FRAC_CONST(0.27566808867736), FRAC_CONST(0.27760717748238), FRAC_CONST(0.27955195536071), FRAC_CONST(0.28150238094021), FRAC_CONST(0.28345841247557), FRAC_CONST(0.28542000785059), FRAC_CONST(0.28738712458038), FRAC_CONST(0.28935971981364), FRAC_CONST(0.29133775033492), FRAC_CONST(0.29332117256704), FRAC_CONST(0.29530994257338), FRAC_CONST(0.29730401606034), FRAC_CONST(0.29930334837974), FRAC_CONST(0.30130789453132), FRAC_CONST(0.30331760916521), FRAC_CONST(0.30533244658452), FRAC_CONST(0.30735236074785), FRAC_CONST(0.30937730527195), FRAC_CONST(0.31140723343430), FRAC_CONST(0.31344209817583), FRAC_CONST(0.31548185210356), FRAC_CONST(0.31752644749341), FRAC_CONST(0.31957583629288), FRAC_CONST(0.32162997012390), FRAC_CONST(0.32368880028565), FRAC_CONST(0.32575227775738), FRAC_CONST(0.32782035320134), FRAC_CONST(0.32989297696566), FRAC_CONST(0.33197009908736), FRAC_CONST(0.33405166929523), FRAC_CONST(0.33613763701295), FRAC_CONST(0.33822795136203), FRAC_CONST(0.34032256116495), FRAC_CONST(0.34242141494820), FRAC_CONST(0.34452446094547), FRAC_CONST(0.34663164710072), FRAC_CONST(0.34874292107143), FRAC_CONST(0.35085823023181), FRAC_CONST(0.35297752167598), FRAC_CONST(0.35510074222129), FRAC_CONST(0.35722783841160), FRAC_CONST(0.35935875652060), FRAC_CONST(0.36149344255514), FRAC_CONST(0.36363184225864), FRAC_CONST(0.36577390111444), FRAC_CONST(0.36791956434930), FRAC_CONST(0.37006877693676), FRAC_CONST(0.37222148360070), FRAC_CONST(0.37437762881878), FRAC_CONST(0.37653715682603), FRAC_CONST(0.37870001161834), FRAC_CONST(0.38086613695607), FRAC_CONST(0.38303547636766), FRAC_CONST(0.38520797315322), FRAC_CONST(0.38738357038821), FRAC_CONST(0.38956221092708), FRAC_CONST(0.39174383740701), FRAC_CONST(0.39392839225157), FRAC_CONST(0.39611581767449), FRAC_CONST(0.39830605568342), FRAC_CONST(0.40049904808370), FRAC_CONST(0.40269473648218), FRAC_CONST(0.40489306229101), FRAC_CONST(0.40709396673153), FRAC_CONST(0.40929739083810), FRAC_CONST(0.41150327546197), FRAC_CONST(0.41371156127524), FRAC_CONST(0.41592218877472), FRAC_CONST(0.41813509828594), FRAC_CONST(0.42035022996702), FRAC_CONST(0.42256752381274), FRAC_CONST(0.42478691965848), FRAC_CONST(0.42700835718423), FRAC_CONST(0.42923177591866), FRAC_CONST(0.43145711524314), FRAC_CONST(0.43368431439580), FRAC_CONST(0.43591331247564), FRAC_CONST(0.43814404844658), FRAC_CONST(0.44037646114161), FRAC_CONST(0.44261048926688), FRAC_CONST(0.44484607140589), FRAC_CONST(0.44708314602359), FRAC_CONST(0.44932165147057), FRAC_CONST(0.45156152598727), FRAC_CONST(0.45380270770813), FRAC_CONST(0.45604513466581), FRAC_CONST(0.45828874479543), FRAC_CONST(0.46053347593880), FRAC_CONST(0.46277926584861), FRAC_CONST(0.46502605219277), FRAC_CONST(0.46727377255861), FRAC_CONST(0.46952236445718), FRAC_CONST(0.47177176532752), FRAC_CONST(0.47402191254100), FRAC_CONST(0.47627274340557), FRAC_CONST(0.47852419517009), FRAC_CONST(0.48077620502869), FRAC_CONST(0.48302871012505), FRAC_CONST(0.48528164755674), FRAC_CONST(0.48753495437962), FRAC_CONST(0.48978856761212), FRAC_CONST(0.49204242423966), FRAC_CONST(0.49429646121898), FRAC_CONST(0.49655061548250), FRAC_CONST(0.49880482394273), FRAC_CONST(0.50105902349665), FRAC_CONST(0.50331315103004), FRAC_CONST(0.50556714342194), FRAC_CONST(0.50782093754901), FRAC_CONST(0.51007447028990), FRAC_CONST(0.51232767852971), FRAC_CONST(0.51458049916433), FRAC_CONST(0.51683286910489), FRAC_CONST(0.51908472528213), FRAC_CONST(0.52133600465083), FRAC_CONST(0.52358664419420), FRAC_CONST(0.52583658092832), FRAC_CONST(0.52808575190648), FRAC_CONST(0.53033409422367), FRAC_CONST(0.53258154502092), FRAC_CONST(0.53482804148974), FRAC_CONST(0.53707352087652), FRAC_CONST(0.53931792048690), FRAC_CONST(0.54156117769021), FRAC_CONST(0.54380322992385), FRAC_CONST(0.54604401469766), FRAC_CONST(0.54828346959835), FRAC_CONST(0.55052153229384), FRAC_CONST(0.55275814053768), FRAC_CONST(0.55499323217338), FRAC_CONST(0.55722674513883), FRAC_CONST(0.55945861747062), FRAC_CONST(0.56168878730842), FRAC_CONST(0.56391719289930), FRAC_CONST(0.56614377260214), FRAC_CONST(0.56836846489188), FRAC_CONST(0.57059120836390), FRAC_CONST(0.57281194173835), FRAC_CONST(0.57503060386439), FRAC_CONST(0.57724713372458), FRAC_CONST(0.57946147043912), FRAC_CONST(0.58167355327012), FRAC_CONST(0.58388332162591), FRAC_CONST(0.58609071506528), FRAC_CONST(0.58829567330173), FRAC_CONST(0.59049813620770), FRAC_CONST(0.59269804381879), FRAC_CONST(0.59489533633802), FRAC_CONST(0.59708995413996), FRAC_CONST(0.59928183777495), FRAC_CONST(0.60147092797329), FRAC_CONST(0.60365716564937), FRAC_CONST(0.60584049190582), FRAC_CONST(0.60802084803764), FRAC_CONST(0.61019817553632), FRAC_CONST(0.61237241609393), FRAC_CONST(0.61454351160718), FRAC_CONST(0.61671140418155), FRAC_CONST(0.61887603613527), FRAC_CONST(0.62103735000336), FRAC_CONST(0.62319528854167), FRAC_CONST(0.62534979473088), FRAC_CONST(0.62750081178042), FRAC_CONST(0.62964828313250), FRAC_CONST(0.63179215246597), FRAC_CONST(0.63393236370030), FRAC_CONST(0.63606886099946), FRAC_CONST(0.63820158877577), FRAC_CONST(0.64033049169379), FRAC_CONST(0.64245551467413), FRAC_CONST(0.64457660289729), FRAC_CONST(0.64669370180740), FRAC_CONST(0.64880675711607), FRAC_CONST(0.65091571480603), FRAC_CONST(0.65302052113494), FRAC_CONST(0.65512112263906), FRAC_CONST(0.65721746613689), FRAC_CONST(0.65930949873289), FRAC_CONST(0.66139716782102), FRAC_CONST(0.66348042108842), FRAC_CONST(0.66555920651892), FRAC_CONST(0.66763347239664), FRAC_CONST(0.66970316730947), FRAC_CONST(0.67176824015260), FRAC_CONST(0.67382864013196), FRAC_CONST(0.67588431676768), FRAC_CONST(0.67793521989751), FRAC_CONST(0.67998129968017), FRAC_CONST(0.68202250659876), FRAC_CONST(0.68405879146403), FRAC_CONST(0.68609010541774), FRAC_CONST(0.68811639993588), FRAC_CONST(0.69013762683195), FRAC_CONST(0.69215373826012), FRAC_CONST(0.69416468671849), FRAC_CONST(0.69617042505214), FRAC_CONST(0.69817090645634), FRAC_CONST(0.70016608447958), FRAC_CONST(0.70215591302664), FRAC_CONST(0.70414034636163), FRAC_CONST(0.70611933911096), FRAC_CONST(0.70809284626630), FRAC_CONST(0.71006082318751), FRAC_CONST(0.71202322560554), FRAC_CONST(0.71398000962530), FRAC_CONST(0.71593113172842), FRAC_CONST(0.71787654877613), FRAC_CONST(0.71981621801195), FRAC_CONST(0.72175009706445), FRAC_CONST(0.72367814394990), FRAC_CONST(0.72560031707496), FRAC_CONST(0.72751657523927), FRAC_CONST(0.72942687763803), FRAC_CONST(0.73133118386457), FRAC_CONST(0.73322945391280), FRAC_CONST(0.73512164817975), FRAC_CONST(0.73700772746796), FRAC_CONST(0.73888765298787), FRAC_CONST(0.74076138636020), FRAC_CONST(0.74262888961827), FRAC_CONST(0.74449012521027), FRAC_CONST(0.74634505600152), FRAC_CONST(0.74819364527663), FRAC_CONST(0.75003585674175), FRAC_CONST(0.75187165452661), FRAC_CONST(0.75370100318668), FRAC_CONST(0.75552386770515), FRAC_CONST(0.75734021349500), FRAC_CONST(0.75915000640095), FRAC_CONST(0.76095321270137), FRAC_CONST(0.76274979911019), FRAC_CONST(0.76453973277875), FRAC_CONST(0.76632298129757), FRAC_CONST(0.76809951269819), FRAC_CONST(0.76986929545481), FRAC_CONST(0.77163229848604), FRAC_CONST(0.77338849115651), FRAC_CONST(0.77513784327849), FRAC_CONST(0.77688032511340), FRAC_CONST(0.77861590737340), FRAC_CONST(0.78034456122283), FRAC_CONST(0.78206625827961), FRAC_CONST(0.78378097061667), FRAC_CONST(0.78548867076330), FRAC_CONST(0.78718933170643), FRAC_CONST(0.78888292689189), FRAC_CONST(0.79056943022564), FRAC_CONST(0.79224881607494), FRAC_CONST(0.79392105926949), FRAC_CONST(0.79558613510249), FRAC_CONST(0.79724401933170), FRAC_CONST(0.79889468818046), FRAC_CONST(0.80053811833858), FRAC_CONST(0.80217428696334), FRAC_CONST(0.80380317168028), FRAC_CONST(0.80542475058405), FRAC_CONST(0.80703900223920), FRAC_CONST(0.80864590568089), FRAC_CONST(0.81024544041560), FRAC_CONST(0.81183758642175), FRAC_CONST(0.81342232415032), FRAC_CONST(0.81499963452540), FRAC_CONST(0.81656949894467), FRAC_CONST(0.81813189927991), FRAC_CONST(0.81968681787738), FRAC_CONST(0.82123423755821), FRAC_CONST(0.82277414161874), FRAC_CONST(0.82430651383076), FRAC_CONST(0.82583133844180), FRAC_CONST(0.82734860017528), FRAC_CONST(0.82885828423070), FRAC_CONST(0.83036037628369), FRAC_CONST(0.83185486248609), FRAC_CONST(0.83334172946597), FRAC_CONST(0.83482096432759), FRAC_CONST(0.83629255465130), FRAC_CONST(0.83775648849344), FRAC_CONST(0.83921275438615), FRAC_CONST(0.84066134133716), FRAC_CONST(0.84210223882952), FRAC_CONST(0.84353543682130), FRAC_CONST(0.84496092574524), FRAC_CONST(0.84637869650833), FRAC_CONST(0.84778874049138), FRAC_CONST(0.84919104954855), FRAC_CONST(0.85058561600677), FRAC_CONST(0.85197243266520), FRAC_CONST(0.85335149279457), FRAC_CONST(0.85472279013653), FRAC_CONST(0.85608631890295), FRAC_CONST(0.85744207377513), FRAC_CONST(0.85879004990298), FRAC_CONST(0.86013024290422), FRAC_CONST(0.86146264886346), FRAC_CONST(0.86278726433124), FRAC_CONST(0.86410408632306), FRAC_CONST(0.86541311231838), FRAC_CONST(0.86671434025950), FRAC_CONST(0.86800776855046), FRAC_CONST(0.86929339605590), FRAC_CONST(0.87057122209981), FRAC_CONST(0.87184124646433), FRAC_CONST(0.87310346938840), FRAC_CONST(0.87435789156650), FRAC_CONST(0.87560451414719), FRAC_CONST(0.87684333873173), FRAC_CONST(0.87807436737261), FRAC_CONST(0.87929760257204), FRAC_CONST(0.88051304728038), FRAC_CONST(0.88172070489456), FRAC_CONST(0.88292057925645), FRAC_CONST(0.88411267465117), FRAC_CONST(0.88529699580537), FRAC_CONST(0.88647354788545), FRAC_CONST(0.88764233649580), FRAC_CONST(0.88880336767692), FRAC_CONST(0.88995664790351), FRAC_CONST(0.89110218408260), FRAC_CONST(0.89223998355154), FRAC_CONST(0.89337005407600), FRAC_CONST(0.89449240384793), FRAC_CONST(0.89560704148345), FRAC_CONST(0.89671397602074), FRAC_CONST(0.89781321691786), FRAC_CONST(0.89890477405053), FRAC_CONST(0.89998865770993), FRAC_CONST(0.90106487860034), FRAC_CONST(0.90213344783689), FRAC_CONST(0.90319437694315), FRAC_CONST(0.90424767784873), FRAC_CONST(0.90529336288690), FRAC_CONST(0.90633144479201), FRAC_CONST(0.90736193669708), FRAC_CONST(0.90838485213119), FRAC_CONST(0.90940020501694), FRAC_CONST(0.91040800966776), FRAC_CONST(0.91140828078533), FRAC_CONST(0.91240103345685), FRAC_CONST(0.91338628315231), FRAC_CONST(0.91436404572173), FRAC_CONST(0.91533433739238), FRAC_CONST(0.91629717476594), FRAC_CONST(0.91725257481564), FRAC_CONST(0.91820055488334), FRAC_CONST(0.91914113267664), FRAC_CONST(0.92007432626589), FRAC_CONST(0.92100015408120), FRAC_CONST(0.92191863490944), FRAC_CONST(0.92282978789113), FRAC_CONST(0.92373363251740), FRAC_CONST(0.92463018862687), FRAC_CONST(0.92551947640245), FRAC_CONST(0.92640151636824), FRAC_CONST(0.92727632938624), FRAC_CONST(0.92814393665320), FRAC_CONST(0.92900435969727), FRAC_CONST(0.92985762037477), FRAC_CONST(0.93070374086684), FRAC_CONST(0.93154274367610), FRAC_CONST(0.93237465162328), FRAC_CONST(0.93319948784382), FRAC_CONST(0.93401727578443), FRAC_CONST(0.93482803919967), FRAC_CONST(0.93563180214841), FRAC_CONST(0.93642858899043), FRAC_CONST(0.93721842438279), FRAC_CONST(0.93800133327637), FRAC_CONST(0.93877734091223), FRAC_CONST(0.93954647281807), FRAC_CONST(0.94030875480458), FRAC_CONST(0.94106421296182), FRAC_CONST(0.94181287365556), FRAC_CONST(0.94255476352362), FRAC_CONST(0.94328990947213), FRAC_CONST(0.94401833867184), FRAC_CONST(0.94474007855439), FRAC_CONST(0.94545515680855), FRAC_CONST(0.94616360137644), FRAC_CONST(0.94686544044975), FRAC_CONST(0.94756070246592), FRAC_CONST(0.94824941610434), FRAC_CONST(0.94893161028248), FRAC_CONST(0.94960731415209), FRAC_CONST(0.95027655709525), FRAC_CONST(0.95093936872056), FRAC_CONST(0.95159577885924), FRAC_CONST(0.95224581756115), FRAC_CONST(0.95288951509097), FRAC_CONST(0.95352690192417), FRAC_CONST(0.95415800874314), FRAC_CONST(0.95478286643320), FRAC_CONST(0.95540150607863), FRAC_CONST(0.95601395895871), FRAC_CONST(0.95662025654373), FRAC_CONST(0.95722043049100), FRAC_CONST(0.95781451264084), FRAC_CONST(0.95840253501260), FRAC_CONST(0.95898452980058), FRAC_CONST(0.95956052937008), FRAC_CONST(0.96013056625336), FRAC_CONST(0.96069467314557), FRAC_CONST(0.96125288290073), FRAC_CONST(0.96180522852773), FRAC_CONST(0.96235174318622), FRAC_CONST(0.96289246018262), FRAC_CONST(0.96342741296604), FRAC_CONST(0.96395663512424), FRAC_CONST(0.96448016037959), FRAC_CONST(0.96499802258499), FRAC_CONST(0.96551025571985), FRAC_CONST(0.96601689388602), FRAC_CONST(0.96651797130376), FRAC_CONST(0.96701352230768), FRAC_CONST(0.96750358134269), FRAC_CONST(0.96798818295998), FRAC_CONST(0.96846736181297), FRAC_CONST(0.96894115265327), FRAC_CONST(0.96940959032667), FRAC_CONST(0.96987270976912), FRAC_CONST(0.97033054600270), FRAC_CONST(0.97078313413161), FRAC_CONST(0.97123050933818), FRAC_CONST(0.97167270687887), FRAC_CONST(0.97210976208030), FRAC_CONST(0.97254171033525), FRAC_CONST(0.97296858709871), FRAC_CONST(0.97339042788392), FRAC_CONST(0.97380726825843), FRAC_CONST(0.97421914384017), FRAC_CONST(0.97462609029350), FRAC_CONST(0.97502814332534), FRAC_CONST(0.97542533868127), FRAC_CONST(0.97581771214160), FRAC_CONST(0.97620529951759), FRAC_CONST(0.97658813664749), FRAC_CONST(0.97696625939282), FRAC_CONST(0.97733970363445), FRAC_CONST(0.97770850526884), FRAC_CONST(0.97807270020427), FRAC_CONST(0.97843232435704), FRAC_CONST(0.97878741364771), FRAC_CONST(0.97913800399743), FRAC_CONST(0.97948413132414), FRAC_CONST(0.97982583153895), FRAC_CONST(0.98016314054243), FRAC_CONST(0.98049609422096), FRAC_CONST(0.98082472844313), FRAC_CONST(0.98114907905608), FRAC_CONST(0.98146918188197), FRAC_CONST(0.98178507271438), FRAC_CONST(0.98209678731477), FRAC_CONST(0.98240436140902), FRAC_CONST(0.98270783068385), FRAC_CONST(0.98300723078342), FRAC_CONST(0.98330259730589), FRAC_CONST(0.98359396579995), FRAC_CONST(0.98388137176152), FRAC_CONST(0.98416485063031), FRAC_CONST(0.98444443778651), FRAC_CONST(0.98472016854752), FRAC_CONST(0.98499207816463), FRAC_CONST(0.98526020181980), FRAC_CONST(0.98552457462240), FRAC_CONST(0.98578523160609), FRAC_CONST(0.98604220772560), FRAC_CONST(0.98629553785362), FRAC_CONST(0.98654525677772), FRAC_CONST(0.98679139919726), FRAC_CONST(0.98703399972035), FRAC_CONST(0.98727309286089), FRAC_CONST(0.98750871303556), FRAC_CONST(0.98774089456089), FRAC_CONST(0.98796967165036), FRAC_CONST(0.98819507841154), FRAC_CONST(0.98841714884323), FRAC_CONST(0.98863591683269), FRAC_CONST(0.98885141615285), FRAC_CONST(0.98906368045957), FRAC_CONST(0.98927274328896), FRAC_CONST(0.98947863805473), FRAC_CONST(0.98968139804554), FRAC_CONST(0.98988105642241), FRAC_CONST(0.99007764621618), FRAC_CONST(0.99027120032501), FRAC_CONST(0.99046175151186), FRAC_CONST(0.99064933240208), FRAC_CONST(0.99083397548099), FRAC_CONST(0.99101571309153), FRAC_CONST(0.99119457743191), FRAC_CONST(0.99137060055337), FRAC_CONST(0.99154381435784), FRAC_CONST(0.99171425059582), FRAC_CONST(0.99188194086414), FRAC_CONST(0.99204691660388), FRAC_CONST(0.99220920909823), FRAC_CONST(0.99236884947045), FRAC_CONST(0.99252586868186), FRAC_CONST(0.99268029752989), FRAC_CONST(0.99283216664606), FRAC_CONST(0.99298150649419), FRAC_CONST(0.99312834736847), FRAC_CONST(0.99327271939167), FRAC_CONST(0.99341465251338), FRAC_CONST(0.99355417650825), FRAC_CONST(0.99369132097430), FRAC_CONST(0.99382611533130), FRAC_CONST(0.99395858881910), FRAC_CONST(0.99408877049612), FRAC_CONST(0.99421668923778), FRAC_CONST(0.99434237373503), FRAC_CONST(0.99446585249289), FRAC_CONST(0.99458715382906), FRAC_CONST(0.99470630587254), FRAC_CONST(0.99482333656229), FRAC_CONST(0.99493827364600), FRAC_CONST(0.99505114467878), FRAC_CONST(0.99516197702200), FRAC_CONST(0.99527079784214), FRAC_CONST(0.99537763410962), FRAC_CONST(0.99548251259777), FRAC_CONST(0.99558545988178), FRAC_CONST(0.99568650233767), FRAC_CONST(0.99578566614138), FRAC_CONST(0.99588297726783), FRAC_CONST(0.99597846149005), FRAC_CONST(0.99607214437834), FRAC_CONST(0.99616405129947), FRAC_CONST(0.99625420741595), FRAC_CONST(0.99634263768527), FRAC_CONST(0.99642936685928), FRAC_CONST(0.99651441948352), FRAC_CONST(0.99659781989663), FRAC_CONST(0.99667959222978), FRAC_CONST(0.99675976040620), FRAC_CONST(0.99683834814063), FRAC_CONST(0.99691537893895), FRAC_CONST(0.99699087609774), FRAC_CONST(0.99706486270391), FRAC_CONST(0.99713736163442), FRAC_CONST(0.99720839555593), FRAC_CONST(0.99727798692461), FRAC_CONST(0.99734615798589), FRAC_CONST(0.99741293077431), FRAC_CONST(0.99747832711337), FRAC_CONST(0.99754236861541), FRAC_CONST(0.99760507668158), FRAC_CONST(0.99766647250181), FRAC_CONST(0.99772657705478), FRAC_CONST(0.99778541110799), FRAC_CONST(0.99784299521785), FRAC_CONST(0.99789934972976), FRAC_CONST(0.99795449477828), FRAC_CONST(0.99800845028730), FRAC_CONST(0.99806123597027), FRAC_CONST(0.99811287133042), FRAC_CONST(0.99816337566108), FRAC_CONST(0.99821276804596), FRAC_CONST(0.99826106735952), FRAC_CONST(0.99830829226732), FRAC_CONST(0.99835446122649), FRAC_CONST(0.99839959248609), FRAC_CONST(0.99844370408765), FRAC_CONST(0.99848681386566), FRAC_CONST(0.99852893944805), FRAC_CONST(0.99857009825685), FRAC_CONST(0.99861030750869), FRAC_CONST(0.99864958421549), FRAC_CONST(0.99868794518504), FRAC_CONST(0.99872540702178), FRAC_CONST(0.99876198612738), FRAC_CONST(0.99879769870160), FRAC_CONST(0.99883256074295), FRAC_CONST(0.99886658804953), FRAC_CONST(0.99889979621983), FRAC_CONST(0.99893220065356), FRAC_CONST(0.99896381655254), FRAC_CONST(0.99899465892154), FRAC_CONST(0.99902474256924), FRAC_CONST(0.99905408210916), FRAC_CONST(0.99908269196056), FRAC_CONST(0.99911058634952), FRAC_CONST(0.99913777930986), FRAC_CONST(0.99916428468421), FRAC_CONST(0.99919011612505), FRAC_CONST(0.99921528709576), FRAC_CONST(0.99923981087174), FRAC_CONST(0.99926370054150), FRAC_CONST(0.99928696900779), FRAC_CONST(0.99930962898876), FRAC_CONST(0.99933169301910), FRAC_CONST(0.99935317345126), FRAC_CONST(0.99937408245662), FRAC_CONST(0.99939443202674), FRAC_CONST(0.99941423397457), FRAC_CONST(0.99943349993572), FRAC_CONST(0.99945224136972), FRAC_CONST(0.99947046956130), FRAC_CONST(0.99948819562171), FRAC_CONST(0.99950543049000), FRAC_CONST(0.99952218493439), FRAC_CONST(0.99953846955355), FRAC_CONST(0.99955429477803), FRAC_CONST(0.99956967087154), FRAC_CONST(0.99958460793242), FRAC_CONST(0.99959911589494), FRAC_CONST(0.99961320453077), FRAC_CONST(0.99962688345035), FRAC_CONST(0.99964016210433), FRAC_CONST(0.99965304978499), FRAC_CONST(0.99966555562769), FRAC_CONST(0.99967768861231), FRAC_CONST(0.99968945756473), FRAC_CONST(0.99970087115825), FRAC_CONST(0.99971193791510), FRAC_CONST(0.99972266620792), FRAC_CONST(0.99973306426121), FRAC_CONST(0.99974314015288), FRAC_CONST(0.99975290181568), FRAC_CONST(0.99976235703876), FRAC_CONST(0.99977151346914), FRAC_CONST(0.99978037861326), FRAC_CONST(0.99978895983845), FRAC_CONST(0.99979726437448), FRAC_CONST(0.99980529931507), FRAC_CONST(0.99981307161943), FRAC_CONST(0.99982058811377), FRAC_CONST(0.99982785549283), FRAC_CONST(0.99983488032144), FRAC_CONST(0.99984166903600), FRAC_CONST(0.99984822794606), FRAC_CONST(0.99985456323584), FRAC_CONST(0.99986068096572), FRAC_CONST(0.99986658707386), FRAC_CONST(0.99987228737764), FRAC_CONST(0.99987778757524), FRAC_CONST(0.99988309324717), FRAC_CONST(0.99988820985777), FRAC_CONST(0.99989314275675), FRAC_CONST(0.99989789718072), FRAC_CONST(0.99990247825468), FRAC_CONST(0.99990689099357), FRAC_CONST(0.99991114030376), FRAC_CONST(0.99991523098456), FRAC_CONST(0.99991916772971), FRAC_CONST(0.99992295512891), FRAC_CONST(0.99992659766930), FRAC_CONST(0.99993009973692), FRAC_CONST(0.99993346561824), FRAC_CONST(0.99993669950161), FRAC_CONST(0.99993980547870), FRAC_CONST(0.99994278754604), FRAC_CONST(0.99994564960642), FRAC_CONST(0.99994839547033), FRAC_CONST(0.99995102885747), FRAC_CONST(0.99995355339809), FRAC_CONST(0.99995597263451), FRAC_CONST(0.99995829002249), FRAC_CONST(0.99996050893264), FRAC_CONST(0.99996263265183), FRAC_CONST(0.99996466438460), FRAC_CONST(0.99996660725452), FRAC_CONST(0.99996846430558), FRAC_CONST(0.99997023850356), FRAC_CONST(0.99997193273736), FRAC_CONST(0.99997354982037), FRAC_CONST(0.99997509249183), FRAC_CONST(0.99997656341810), FRAC_CONST(0.99997796519400), FRAC_CONST(0.99997930034415), FRAC_CONST(0.99998057132421), FRAC_CONST(0.99998178052220), FRAC_CONST(0.99998293025975), FRAC_CONST(0.99998402279338), FRAC_CONST(0.99998506031574), FRAC_CONST(0.99998604495686), FRAC_CONST(0.99998697878536), FRAC_CONST(0.99998786380966), FRAC_CONST(0.99998870197921), FRAC_CONST(0.99998949518567), FRAC_CONST(0.99999024526408), FRAC_CONST(0.99999095399401), FRAC_CONST(0.99999162310077), FRAC_CONST(0.99999225425649), FRAC_CONST(0.99999284908128), FRAC_CONST(0.99999340914435), FRAC_CONST(0.99999393596510), FRAC_CONST(0.99999443101421), FRAC_CONST(0.99999489571473), FRAC_CONST(0.99999533144314), FRAC_CONST(0.99999573953040), FRAC_CONST(0.99999612126300), FRAC_CONST(0.99999647788395), FRAC_CONST(0.99999681059383), FRAC_CONST(0.99999712055178), FRAC_CONST(0.99999740887647), FRAC_CONST(0.99999767664709), FRAC_CONST(0.99999792490431), FRAC_CONST(0.99999815465123), FRAC_CONST(0.99999836685427), FRAC_CONST(0.99999856244415), FRAC_CONST(0.99999874231676), FRAC_CONST(0.99999890733405), FRAC_CONST(0.99999905832493), FRAC_CONST(0.99999919608613), FRAC_CONST(0.99999932138304), FRAC_CONST(0.99999943495056), FRAC_CONST(0.99999953749392), FRAC_CONST(0.99999962968950), FRAC_CONST(0.99999971218563), FRAC_CONST(0.99999978560337), FRAC_CONST(0.99999985053727), FRAC_CONST(0.99999990755616), FRAC_CONST(0.99999995720387) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t kbd_long_960[] = { FRAC_CONST(0.0003021562530949), FRAC_CONST(0.0004452267024786), FRAC_CONST(0.0005674947527496), FRAC_CONST(0.0006812465553466), FRAC_CONST(0.0007910496776387), FRAC_CONST(0.0008991655033895), FRAC_CONST(0.0010068978259384), FRAC_CONST(0.0011150758515751), FRAC_CONST(0.0012242653193642), FRAC_CONST(0.0013348735658205), FRAC_CONST(0.0014472068670273), FRAC_CONST(0.0015615039850448), FRAC_CONST(0.0016779568885263), FRAC_CONST(0.0017967241232412), FRAC_CONST(0.0019179397560955), FRAC_CONST(0.0020417195415393), FRAC_CONST(0.0021681652836642), FRAC_CONST(0.0022973679910599), FRAC_CONST(0.0024294102029937), FRAC_CONST(0.0025643677339078), FRAC_CONST(0.0027023110014772), FRAC_CONST(0.0028433060512612), FRAC_CONST(0.0029874153568025), FRAC_CONST(0.0031346984511728), FRAC_CONST(0.0032852124303662), FRAC_CONST(0.0034390123581190), FRAC_CONST(0.0035961515940931), FRAC_CONST(0.0037566820618961), FRAC_CONST(0.0039206544694386), FRAC_CONST(0.0040881184912194), FRAC_CONST(0.0042591229199617), FRAC_CONST(0.0044337157933972), FRAC_CONST(0.0046119445007641), FRAC_CONST(0.0047938558726415), FRAC_CONST(0.0049794962570131), FRAC_CONST(0.0051689115838900), FRAC_CONST(0.0053621474203763), FRAC_CONST(0.0055592490177131), FRAC_CONST(0.0057602613515573), FRAC_CONST(0.0059652291565289), FRAC_CONST(0.0061741969558843), FRAC_CONST(0.0063872090870253), FRAC_CONST(0.0066043097234387), FRAC_CONST(0.0068255428935640), FRAC_CONST(0.0070509524970088), FRAC_CONST(0.0072805823184660), FRAC_CONST(0.0075144760396340), FRAC_CONST(0.0077526772493942), FRAC_CONST(0.0079952294524673), FRAC_CONST(0.0082421760767325), FRAC_CONST(0.0084935604793733), FRAC_CONST(0.0087494259519870), FRAC_CONST(0.0090098157247792), FRAC_CONST(0.0092747729699467), FRAC_CONST(0.0095443408043399), FRAC_CONST(0.0098185622914832), FRAC_CONST(0.0100974804430226), FRAC_CONST(0.0103811382196612), FRAC_CONST(0.0106695785316351), FRAC_CONST(0.0109628442387771), FRAC_CONST(0.0112609781502091), FRAC_CONST(0.0115640230236993), FRAC_CONST(0.0118720215647169), FRAC_CONST(0.0121850164252137), FRAC_CONST(0.0125030502021561), FRAC_CONST(0.0128261654358321), FRAC_CONST(0.0131544046079532), FRAC_CONST(0.0134878101395681), FRAC_CONST(0.0138264243888068), FRAC_CONST(0.0141702896484671), FRAC_CONST(0.0145194481434592), FRAC_CONST(0.0148739420281182), FRAC_CONST(0.0152338133833959), FRAC_CONST(0.0155991042139432), FRAC_CONST(0.0159698564450882), FRAC_CONST(0.0163461119197227), FRAC_CONST(0.0167279123950996), FRAC_CONST(0.0171152995395520), FRAC_CONST(0.0175083149291368), FRAC_CONST(0.0179070000442104), FRAC_CONST(0.0183113962659409), FRAC_CONST(0.0187215448727609), FRAC_CONST(0.0191374870367659), FRAC_CONST(0.0195592638200623), FRAC_CONST(0.0199869161710679), FRAC_CONST(0.0204204849207691), FRAC_CONST(0.0208600107789370), FRAC_CONST(0.0213055343303066), FRAC_CONST(0.0217570960307201), FRAC_CONST(0.0222147362032386), FRAC_CONST(0.0226784950342228), FRAC_CONST(0.0231484125693867), FRAC_CONST(0.0236245287098244), FRAC_CONST(0.0241068832080138), FRAC_CONST(0.0245955156637973), FRAC_CONST(0.0250904655203431), FRAC_CONST(0.0255917720600868), FRAC_CONST(0.0260994744006559), FRAC_CONST(0.0266136114907790), FRAC_CONST(0.0271342221061795), FRAC_CONST(0.0276613448454576), FRAC_CONST(0.0281950181259587), FRAC_CONST(0.0287352801796329), FRAC_CONST(0.0292821690488833), FRAC_CONST(0.0298357225824074), FRAC_CONST(0.0303959784310299), FRAC_CONST(0.0309629740435296), FRAC_CONST(0.0315367466624615), FRAC_CONST(0.0321173333199732), FRAC_CONST(0.0327047708336193), FRAC_CONST(0.0332990958021720), FRAC_CONST(0.0339003446014307), FRAC_CONST(0.0345085533800302), FRAC_CONST(0.0351237580552491), FRAC_CONST(0.0357459943088193), FRAC_CONST(0.0363752975827358), FRAC_CONST(0.0370117030750704), FRAC_CONST(0.0376552457357870), FRAC_CONST(0.0383059602625614), FRAC_CONST(0.0389638810966056), FRAC_CONST(0.0396290424184964), FRAC_CONST(0.0403014781440112), FRAC_CONST(0.0409812219199691), FRAC_CONST(0.0416683071200799), FRAC_CONST(0.0423627668408009), FRAC_CONST(0.0430646338972016), FRAC_CONST(0.0437739408188385), FRAC_CONST(0.0444907198456388), FRAC_CONST(0.0452150029237951), FRAC_CONST(0.0459468217016708), FRAC_CONST(0.0466862075257170), FRAC_CONST(0.0474331914364021), FRAC_CONST(0.0481878041641539), FRAC_CONST(0.0489500761253148), FRAC_CONST(0.0497200374181119), FRAC_CONST(0.0504977178186404), FRAC_CONST(0.0512831467768636), FRAC_CONST(0.0520763534126273), FRAC_CONST(0.0528773665116913), FRAC_CONST(0.0536862145217772), FRAC_CONST(0.0545029255486345), FRAC_CONST(0.0553275273521232), FRAC_CONST(0.0561600473423164), FRAC_CONST(0.0570005125756209), FRAC_CONST(0.0578489497509179), FRAC_CONST(0.0587053852057233), FRAC_CONST(0.0595698449123695), FRAC_CONST(0.0604423544742077), FRAC_CONST(0.0613229391218317), FRAC_CONST(0.0622116237093247), FRAC_CONST(0.0631084327105284), FRAC_CONST(0.0640133902153352), FRAC_CONST(0.0649265199260043), FRAC_CONST(0.0658478451535027), FRAC_CONST(0.0667773888138695), FRAC_CONST(0.0677151734246072), FRAC_CONST(0.0686612211010977), FRAC_CONST(0.0696155535530446), FRAC_CONST(0.0705781920809429), FRAC_CONST(0.0715491575725758), FRAC_CONST(0.0725284704995383), FRAC_CONST(0.0735161509137906), FRAC_CONST(0.0745122184442388), FRAC_CONST(0.0755166922933461), FRAC_CONST(0.0765295912337720), FRAC_CONST(0.0775509336050437), FRAC_CONST(0.0785807373102561), FRAC_CONST(0.0796190198128044), FRAC_CONST(0.0806657981331473), FRAC_CONST(0.0817210888456026), FRAC_CONST(0.0827849080751753), FRAC_CONST(0.0838572714944183), FRAC_CONST(0.0849381943203265), FRAC_CONST(0.0860276913112652), FRAC_CONST(0.0871257767639319), FRAC_CONST(0.0882324645103534), FRAC_CONST(0.0893477679149177), FRAC_CONST(0.0904716998714418), FRAC_CONST(0.0916042728002747), FRAC_CONST(0.0927454986454381), FRAC_CONST(0.0938953888718020), FRAC_CONST(0.0950539544622996), FRAC_CONST(0.0962212059151784), FRAC_CONST(0.0973971532412897), FRAC_CONST(0.0985818059614169), FRAC_CONST(0.0997751731036425), FRAC_CONST(0.1009772632007537), FRAC_CONST(0.1021880842876888), FRAC_CONST(0.1034076438990227), FRAC_CONST(0.1046359490664932), FRAC_CONST(0.1058730063165681), FRAC_CONST(0.1071188216680533), FRAC_CONST(0.1083734006297428), FRAC_CONST(0.1096367481981100), FRAC_CONST(0.1109088688550422), FRAC_CONST(0.1121897665656167), FRAC_CONST(0.1134794447759207), FRAC_CONST(0.1147779064109143), FRAC_CONST(0.1160851538723372), FRAC_CONST(0.1174011890366591), FRAC_CONST(0.1187260132530751), FRAC_CONST(0.1200596273415457), FRAC_CONST(0.1214020315908810), FRAC_CONST(0.1227532257568719), FRAC_CONST(0.1241132090604651), FRAC_CONST(0.1254819801859856), FRAC_CONST(0.1268595372794049), FRAC_CONST(0.1282458779466558), FRAC_CONST(0.1296409992519942), FRAC_CONST(0.1310448977164081), FRAC_CONST(0.1324575693160745), FRAC_CONST(0.1338790094808633), FRAC_CONST(0.1353092130928902), FRAC_CONST(0.1367481744851168), FRAC_CONST(0.1381958874400010), FRAC_CONST(0.1396523451881945), FRAC_CONST(0.1411175404072910), FRAC_CONST(0.1425914652206223), FRAC_CONST(0.1440741111961058), FRAC_CONST(0.1455654693451402), FRAC_CONST(0.1470655301215526), FRAC_CONST(0.1485742834205956), FRAC_CONST(0.1500917185779945), FRAC_CONST(0.1516178243690463), FRAC_CONST(0.1531525890077689), FRAC_CONST(0.1546960001461024), FRAC_CONST(0.1562480448731608), FRAC_CONST(0.1578087097145364), FRAC_CONST(0.1593779806316558), FRAC_CONST(0.1609558430211876), FRAC_CONST(0.1625422817145027), FRAC_CONST(0.1641372809771871), FRAC_CONST(0.1657408245086070), FRAC_CONST(0.1673528954415270), FRAC_CONST(0.1689734763417811), FRAC_CONST(0.1706025492079969), FRAC_CONST(0.1722400954713725), FRAC_CONST(0.1738860959955082), FRAC_CONST(0.1755405310762898), FRAC_CONST(0.1772033804418275), FRAC_CONST(0.1788746232524467), FRAC_CONST(0.1805542381007349), FRAC_CONST(0.1822422030116404), FRAC_CONST(0.1839384954426268), FRAC_CONST(0.1856430922838810), FRAC_CONST(0.1873559698585756), FRAC_CONST(0.1890771039231862), FRAC_CONST(0.1908064696678625), FRAC_CONST(0.1925440417168546), FRAC_CONST(0.1942897941289937), FRAC_CONST(0.1960437003982277), FRAC_CONST(0.1978057334542116), FRAC_CONST(0.1995758656629525), FRAC_CONST(0.2013540688275098), FRAC_CONST(0.2031403141887507), FRAC_CONST(0.2049345724261595), FRAC_CONST(0.2067368136587033), FRAC_CONST(0.2085470074457521), FRAC_CONST(0.2103651227880538), FRAC_CONST(0.2121911281287646), FRAC_CONST(0.2140249913545346), FRAC_CONST(0.2158666797966480), FRAC_CONST(0.2177161602322188), FRAC_CONST(0.2195733988854414), FRAC_CONST(0.2214383614288963), FRAC_CONST(0.2233110129849106), FRAC_CONST(0.2251913181269740), FRAC_CONST(0.2270792408812093), FRAC_CONST(0.2289747447278976), FRAC_CONST(0.2308777926030592), FRAC_CONST(0.2327883469000885), FRAC_CONST(0.2347063694714437), FRAC_CONST(0.2366318216303919), FRAC_CONST(0.2385646641528076), FRAC_CONST(0.2405048572790267), FRAC_CONST(0.2424523607157545), FRAC_CONST(0.2444071336380283), FRAC_CONST(0.2463691346912334), FRAC_CONST(0.2483383219931741), FRAC_CONST(0.2503146531361985), FRAC_CONST(0.2522980851893767), FRAC_CONST(0.2542885747007335), FRAC_CONST(0.2562860776995335), FRAC_CONST(0.2582905496986215), FRAC_CONST(0.2603019456968142), FRAC_CONST(0.2623202201813464), FRAC_CONST(0.2643453271303700), FRAC_CONST(0.2663772200155053), FRAC_CONST(0.2684158518044454), FRAC_CONST(0.2704611749636135), FRAC_CONST(0.2725131414608710), FRAC_CONST(0.2745717027682799), FRAC_CONST(0.2766368098649151), FRAC_CONST(0.2787084132397296), FRAC_CONST(0.2807864628944707), FRAC_CONST(0.2828709083466482), FRAC_CONST(0.2849616986325523), FRAC_CONST(0.2870587823103237), FRAC_CONST(0.2891621074630737), FRAC_CONST(0.2912716217020546), FRAC_CONST(0.2933872721698803), FRAC_CONST(0.2955090055437973), FRAC_CONST(0.2976367680390041), FRAC_CONST(0.2997705054120213), FRAC_CONST(0.3019101629641097), FRAC_CONST(0.3040556855447379), FRAC_CONST(0.3062070175550981), FRAC_CONST(0.3083641029516701), FRAC_CONST(0.3105268852498334), FRAC_CONST(0.3126953075275265), FRAC_CONST(0.3148693124289546), FRAC_CONST(0.3170488421683428), FRAC_CONST(0.3192338385337370), FRAC_CONST(0.3214242428908514), FRAC_CONST(0.3236199961869606), FRAC_CONST(0.3258210389548392), FRAC_CONST(0.3280273113167459), FRAC_CONST(0.3302387529884521), FRAC_CONST(0.3324553032833160), FRAC_CONST(0.3346769011164010), FRAC_CONST(0.3369034850086373), FRAC_CONST(0.3391349930910280), FRAC_CONST(0.3413713631088974), FRAC_CONST(0.3436125324261830), FRAC_CONST(0.3458584380297697), FRAC_CONST(0.3481090165338656), FRAC_CONST(0.3503642041844199), FRAC_CONST(0.3526239368635820), FRAC_CONST(0.3548881500942010), FRAC_CONST(0.3571567790443668), FRAC_CONST(0.3594297585319891), FRAC_CONST(0.3617070230294185), FRAC_CONST(0.3639885066681048), FRAC_CONST(0.3662741432432950), FRAC_CONST(0.3685638662187693), FRAC_CONST(0.3708576087316147), FRAC_CONST(0.3731553035970366), FRAC_CONST(0.3754568833132069), FRAC_CONST(0.3777622800661488), FRAC_CONST(0.3800714257346570), FRAC_CONST(0.3823842518952546), FRAC_CONST(0.3847006898271841), FRAC_CONST(0.3870206705174334), FRAC_CONST(0.3893441246657958), FRAC_CONST(0.3916709826899639), FRAC_CONST(0.3940011747306560), FRAC_CONST(0.3963346306567764), FRAC_CONST(0.3986712800706062), FRAC_CONST(0.4010110523130271), FRAC_CONST(0.4033538764687756), FRAC_CONST(0.4056996813717284), FRAC_CONST(0.4080483956102172), FRAC_CONST(0.4103999475323736), FRAC_CONST(0.4127542652515031), FRAC_CONST(0.4151112766514873), FRAC_CONST(0.4174709093922143), FRAC_CONST(0.4198330909150365), FRAC_CONST(0.4221977484482556), FRAC_CONST(0.4245648090126334), FRAC_CONST(0.4269341994269293), FRAC_CONST(0.4293058463134616), FRAC_CONST(0.4316796761036958), FRAC_CONST(0.4340556150438547), FRAC_CONST(0.4364335892005536), FRAC_CONST(0.4388135244664580), FRAC_CONST(0.4411953465659639), FRAC_CONST(0.4435789810609000), FRAC_CONST(0.4459643533562509), FRAC_CONST(0.4483513887059016), FRAC_CONST(0.4507400122184019), FRAC_CONST(0.4531301488627497), FRAC_CONST(0.4555217234741947), FRAC_CONST(0.4579146607600593), FRAC_CONST(0.4603088853055777), FRAC_CONST(0.4627043215797521), FRAC_CONST(0.4651008939412254), FRAC_CONST(0.4674985266441709), FRAC_CONST(0.4698971438441951), FRAC_CONST(0.4722966696042580), FRAC_CONST(0.4746970279006055), FRAC_CONST(0.4770981426287164), FRAC_CONST(0.4794999376092619), FRAC_CONST(0.4819023365940778), FRAC_CONST(0.4843052632721476), FRAC_CONST(0.4867086412755978), FRAC_CONST(0.4891123941857028), FRAC_CONST(0.4915164455388997), FRAC_CONST(0.4939207188328126), FRAC_CONST(0.4963251375322855), FRAC_CONST(0.4987296250754225), FRAC_CONST(0.5011341048796359), FRAC_CONST(0.5035385003477012), FRAC_CONST(0.5059427348738168), FRAC_CONST(0.5083467318496706), FRAC_CONST(0.5107504146705106), FRAC_CONST(0.5131537067412193), FRAC_CONST(0.5155565314823923), FRAC_CONST(0.5179588123364193), FRAC_CONST(0.5203604727735667), FRAC_CONST(0.5227614362980630), FRAC_CONST(0.5251616264541841), FRAC_CONST(0.5275609668323384), FRAC_CONST(0.5299593810751532), FRAC_CONST(0.5323567928835578), FRAC_CONST(0.5347531260228663), FRAC_CONST(0.5371483043288580), FRAC_CONST(0.5395422517138538), FRAC_CONST(0.5419348921727899), FRAC_CONST(0.5443261497892862), FRAC_CONST(0.5467159487417104), FRAC_CONST(0.5491042133092364), FRAC_CONST(0.5514908678778958), FRAC_CONST(0.5538758369466227), FRAC_CONST(0.5562590451332913), FRAC_CONST(0.5586404171807443), FRAC_CONST(0.5610198779628133), FRAC_CONST(0.5633973524903286), FRAC_CONST(0.5657727659171199), FRAC_CONST(0.5681460435460047), FRAC_CONST(0.5705171108347663), FRAC_CONST(0.5728858934021188), FRAC_CONST(0.5752523170336598), FRAC_CONST(0.5776163076878088), FRAC_CONST(0.5799777915017323), FRAC_CONST(0.5823366947972535), FRAC_CONST(0.5846929440867458), FRAC_CONST(0.5870464660790119), FRAC_CONST(0.5893971876851449), FRAC_CONST(0.5917450360243719), FRAC_CONST(0.5940899384298793), FRAC_CONST(0.5964318224546208), FRAC_CONST(0.5987706158771039), FRAC_CONST(0.6011062467071583), FRAC_CONST(0.6034386431916822), FRAC_CONST(0.6057677338203681), FRAC_CONST(0.6080934473314057), FRAC_CONST(0.6104157127171639), FRAC_CONST(0.6127344592298474), FRAC_CONST(0.6150496163871310), FRAC_CONST(0.6173611139777690), FRAC_CONST(0.6196688820671789), FRAC_CONST(0.6219728510029997), FRAC_CONST(0.6242729514206247), FRAC_CONST(0.6265691142487051), FRAC_CONST(0.6288612707146283), FRAC_CONST(0.6311493523499663), FRAC_CONST(0.6334332909958958), FRAC_CONST(0.6357130188085891), FRAC_CONST(0.6379884682645743), FRAC_CONST(0.6402595721660647), FRAC_CONST(0.6425262636462578), FRAC_CONST(0.6447884761746012), FRAC_CONST(0.6470461435620266), FRAC_CONST(0.6492991999661505), FRAC_CONST(0.6515475798964411), FRAC_CONST(0.6537912182193508), FRAC_CONST(0.6560300501634142), FRAC_CONST(0.6582640113243098), FRAC_CONST(0.6604930376698862), FRAC_CONST(0.6627170655451516), FRAC_CONST(0.6649360316772256), FRAC_CONST(0.6671498731802533), FRAC_CONST(0.6693585275602818), FRAC_CONST(0.6715619327200959), FRAC_CONST(0.6737600269640164), FRAC_CONST(0.6759527490026566), FRAC_CONST(0.6781400379576392), FRAC_CONST(0.6803218333662715), FRAC_CONST(0.6824980751861787), FRAC_CONST(0.6846687037998949), FRAC_CONST(0.6868336600194123), FRAC_CONST(0.6889928850906855), FRAC_CONST(0.6911463206980928), FRAC_CONST(0.6932939089688525), FRAC_CONST(0.6954355924773949), FRAC_CONST(0.6975713142496884), FRAC_CONST(0.6997010177675195), FRAC_CONST(0.7018246469727265), FRAC_CONST(0.7039421462713862), FRAC_CONST(0.7060534605379528), FRAC_CONST(0.7081585351193496), FRAC_CONST(0.7102573158390105), FRAC_CONST(0.7123497490008750), FRAC_CONST(0.7144357813933307), FRAC_CONST(0.7165153602931092), FRAC_CONST(0.7185884334691287), FRAC_CONST(0.7206549491862871), FRAC_CONST(0.7227148562092042), FRAC_CONST(0.7247681038059106), FRAC_CONST(0.7268146417514855), FRAC_CONST(0.7288544203316418), FRAC_CONST(0.7308873903462577), FRAC_CONST(0.7329135031128549), FRAC_CONST(0.7349327104700221), FRAC_CONST(0.7369449647807855), FRAC_CONST(0.7389502189359237), FRAC_CONST(0.7409484263572271), FRAC_CONST(0.7429395410007016), FRAC_CONST(0.7449235173597176), FRAC_CONST(0.7469003104681008), FRAC_CONST(0.7488698759031670), FRAC_CONST(0.7508321697887005), FRAC_CONST(0.7527871487978728), FRAC_CONST(0.7547347701561059), FRAC_CONST(0.7566749916438754), FRAC_CONST(0.7586077715994560), FRAC_CONST(0.7605330689216074), FRAC_CONST(0.7624508430722016), FRAC_CONST(0.7643610540787891), FRAC_CONST(0.7662636625371070), FRAC_CONST(0.7681586296135255), FRAC_CONST(0.7700459170474343), FRAC_CONST(0.7719254871535672), FRAC_CONST(0.7737973028242671), FRAC_CONST(0.7756613275316875), FRAC_CONST(0.7775175253299340), FRAC_CONST(0.7793658608571425), FRAC_CONST(0.7812062993374951), FRAC_CONST(0.7830388065831744), FRAC_CONST(0.7848633489962533), FRAC_CONST(0.7866798935705233), FRAC_CONST(0.7884884078932579), FRAC_CONST(0.7902888601469138), FRAC_CONST(0.7920812191107668), FRAC_CONST(0.7938654541624850), FRAC_CONST(0.7956415352796368), FRAC_CONST(0.7974094330411343), FRAC_CONST(0.7991691186286133), FRAC_CONST(0.8009205638277465), FRAC_CONST(0.8026637410294932), FRAC_CONST(0.8043986232312831), FRAC_CONST(0.8061251840381346), FRAC_CONST(0.8078433976637077), FRAC_CONST(0.8095532389312917), FRAC_CONST(0.8112546832747255), FRAC_CONST(0.8129477067392539), FRAC_CONST(0.8146322859823164), FRAC_CONST(0.8163083982742698), FRAC_CONST(0.8179760214990457), FRAC_CONST(0.8196351341547393), FRAC_CONST(0.8212857153541345), FRAC_CONST(0.8229277448251595), FRAC_CONST(0.8245612029112778), FRAC_CONST(0.8261860705718113), FRAC_CONST(0.8278023293821971), FRAC_CONST(0.8294099615341773), FRAC_CONST(0.8310089498359212), FRAC_CONST(0.8325992777120815), FRAC_CONST(0.8341809292037831), FRAC_CONST(0.8357538889685445), FRAC_CONST(0.8373181422801330), FRAC_CONST(0.8388736750283521), FRAC_CONST(0.8404204737187619), FRAC_CONST(0.8419585254723335), FRAC_CONST(0.8434878180250348), FRAC_CONST(0.8450083397273509), FRAC_CONST(0.8465200795437368), FRAC_CONST(0.8480230270520029), FRAC_CONST(0.8495171724426350), FRAC_CONST(0.8510025065180464), FRAC_CONST(0.8524790206917633), FRAC_CONST(0.8539467069875448), FRAC_CONST(0.8554055580384357), FRAC_CONST(0.8568555670857525), FRAC_CONST(0.8582967279780043), FRAC_CONST(0.8597290351697464), FRAC_CONST(0.8611524837203691), FRAC_CONST(0.8625670692928198), FRAC_CONST(0.8639727881522599), FRAC_CONST(0.8653696371646555), FRAC_CONST(0.8667576137953045), FRAC_CONST(0.8681367161072958), FRAC_CONST(0.8695069427599065), FRAC_CONST(0.8708682930069319), FRAC_CONST(0.8722207666949527), FRAC_CONST(0.8735643642615368), FRAC_CONST(0.8748990867333771), FRAC_CONST(0.8762249357243662), FRAC_CONST(0.8775419134336067), FRAC_CONST(0.8788500226433579), FRAC_CONST(0.8801492667169208), FRAC_CONST(0.8814396495964587), FRAC_CONST(0.8827211758007560), FRAC_CONST(0.8839938504229149), FRAC_CONST(0.8852576791279895), FRAC_CONST(0.8865126681505587), FRAC_CONST(0.8877588242922386), FRAC_CONST(0.8889961549191320), FRAC_CONST(0.8902246679592184), FRAC_CONST(0.8914443718996848), FRAC_CONST(0.8926552757841945), FRAC_CONST(0.8938573892100969), FRAC_CONST(0.8950507223255798), FRAC_CONST(0.8962352858267605), FRAC_CONST(0.8974110909547198), FRAC_CONST(0.8985781494924783), FRAC_CONST(0.8997364737619142), FRAC_CONST(0.9008860766206249), FRAC_CONST(0.9020269714587307), FRAC_CONST(0.9031591721956235), FRAC_CONST(0.9042826932766591), FRAC_CONST(0.9053975496697941), FRAC_CONST(0.9065037568621681), FRAC_CONST(0.9076013308566311), FRAC_CONST(0.9086902881682180), FRAC_CONST(0.9097706458205682), FRAC_CONST(0.9108424213422940), FRAC_CONST(0.9119056327632955), FRAC_CONST(0.9129602986110235), FRAC_CONST(0.9140064379066919), FRAC_CONST(0.9150440701614393), FRAC_CONST(0.9160732153724396), FRAC_CONST(0.9170938940189634), FRAC_CONST(0.9181061270583908), FRAC_CONST(0.9191099359221748), FRAC_CONST(0.9201053425117579), FRAC_CONST(0.9210923691944400), FRAC_CONST(0.9220710387992010), FRAC_CONST(0.9230413746124764), FRAC_CONST(0.9240034003738882), FRAC_CONST(0.9249571402719298), FRAC_CONST(0.9259026189396085), FRAC_CONST(0.9268398614500427), FRAC_CONST(0.9277688933120170), FRAC_CONST(0.9286897404654957), FRAC_CONST(0.9296024292770939), FRAC_CONST(0.9305069865355076), FRAC_CONST(0.9314034394469048), FRAC_CONST(0.9322918156302762), FRAC_CONST(0.9331721431127471), FRAC_CONST(0.9340444503248519), FRAC_CONST(0.9349087660957711), FRAC_CONST(0.9357651196485313), FRAC_CONST(0.9366135405951697), FRAC_CONST(0.9374540589318637), FRAC_CONST(0.9382867050340261), FRAC_CONST(0.9391115096513655), FRAC_CONST(0.9399285039029165), FRAC_CONST(0.9407377192720349), FRAC_CONST(0.9415391876013639), FRAC_CONST(0.9423329410877687), FRAC_CONST(0.9431190122772415), FRAC_CONST(0.9438974340597782), FRAC_CONST(0.9446682396642262), FRAC_CONST(0.9454314626531054), FRAC_CONST(0.9461871369174033), FRAC_CONST(0.9469352966713429), FRAC_CONST(0.9476759764471278), FRAC_CONST(0.9484092110896616), FRAC_CONST(0.9491350357512457), FRAC_CONST(0.9498534858862532), FRAC_CONST(0.9505645972457831), FRAC_CONST(0.9512684058722927), FRAC_CONST(0.9519649480942105), FRAC_CONST(0.9526542605205314), FRAC_CONST(0.9533363800353921), FRAC_CONST(0.9540113437926313), FRAC_CONST(0.9546791892103320), FRAC_CONST(0.9553399539653500), FRAC_CONST(0.9559936759878265), FRAC_CONST(0.9566403934556893), FRAC_CONST(0.9572801447891388), FRAC_CONST(0.9579129686451244), FRAC_CONST(0.9585389039118085), FRAC_CONST(0.9591579897030224), FRAC_CONST(0.9597702653527108), FRAC_CONST(0.9603757704093711), FRAC_CONST(0.9609745446304828), FRAC_CONST(0.9615666279769324), FRAC_CONST(0.9621520606074324), FRAC_CONST(0.9627308828729358), FRAC_CONST(0.9633031353110477), FRAC_CONST(0.9638688586404335), FRAC_CONST(0.9644280937552258), FRAC_CONST(0.9649808817194311), FRAC_CONST(0.9655272637613366), FRAC_CONST(0.9660672812679171), FRAC_CONST(0.9666009757792454), FRAC_CONST(0.9671283889829055), FRAC_CONST(0.9676495627084089), FRAC_CONST(0.9681645389216160), FRAC_CONST(0.9686733597191652), FRAC_CONST(0.9691760673229058), FRAC_CONST(0.9696727040743406), FRAC_CONST(0.9701633124290767), FRAC_CONST(0.9706479349512860), FRAC_CONST(0.9711266143081750), FRAC_CONST(0.9715993932644684), FRAC_CONST(0.9720663146769026), FRAC_CONST(0.9725274214887337), FRAC_CONST(0.9729827567242596), FRAC_CONST(0.9734323634833574), FRAC_CONST(0.9738762849360358), FRAC_CONST(0.9743145643170059), FRAC_CONST(0.9747472449202687), FRAC_CONST(0.9751743700937215), FRAC_CONST(0.9755959832337850), FRAC_CONST(0.9760121277800496), FRAC_CONST(0.9764228472099433), FRAC_CONST(0.9768281850334235), FRAC_CONST(0.9772281847876897), FRAC_CONST(0.9776228900319223), FRAC_CONST(0.9780123443420448), FRAC_CONST(0.9783965913055132), FRAC_CONST(0.9787756745161313), FRAC_CONST(0.9791496375688939), FRAC_CONST(0.9795185240548578), FRAC_CONST(0.9798823775560431), FRAC_CONST(0.9802412416403639), FRAC_CONST(0.9805951598565897), FRAC_CONST(0.9809441757293399), FRAC_CONST(0.9812883327541090), FRAC_CONST(0.9816276743923267), FRAC_CONST(0.9819622440664515), FRAC_CONST(0.9822920851550995), FRAC_CONST(0.9826172409882086), FRAC_CONST(0.9829377548422400), FRAC_CONST(0.9832536699354163), FRAC_CONST(0.9835650294229984), FRAC_CONST(0.9838718763926001), FRAC_CONST(0.9841742538595437), FRAC_CONST(0.9844722047622547), FRAC_CONST(0.9847657719576983), FRAC_CONST(0.9850549982168574), FRAC_CONST(0.9853399262202529), FRAC_CONST(0.9856205985535073), FRAC_CONST(0.9858970577029519), FRAC_CONST(0.9861693460512790), FRAC_CONST(0.9864375058732389), FRAC_CONST(0.9867015793313820), FRAC_CONST(0.9869616084718489), FRAC_CONST(0.9872176352202061), FRAC_CONST(0.9874697013773301), FRAC_CONST(0.9877178486153397), FRAC_CONST(0.9879621184735767), FRAC_CONST(0.9882025523546365), FRAC_CONST(0.9884391915204485), FRAC_CONST(0.9886720770884069), FRAC_CONST(0.9889012500275530), FRAC_CONST(0.9891267511548089), FRAC_CONST(0.9893486211312621), FRAC_CONST(0.9895669004585049), FRAC_CONST(0.9897816294750255), FRAC_CONST(0.9899928483526520), FRAC_CONST(0.9902005970930525), FRAC_CONST(0.9904049155242876), FRAC_CONST(0.9906058432974180), FRAC_CONST(0.9908034198831690), FRAC_CONST(0.9909976845686489), FRAC_CONST(0.9911886764541239), FRAC_CONST(0.9913764344498495), FRAC_CONST(0.9915609972729590), FRAC_CONST(0.9917424034444086), FRAC_CONST(0.9919206912859797), FRAC_CONST(0.9920958989173397), FRAC_CONST(0.9922680642531603), FRAC_CONST(0.9924372250002933), FRAC_CONST(0.9926034186550070), FRAC_CONST(0.9927666825002789), FRAC_CONST(0.9929270536031491), FRAC_CONST(0.9930845688121325), FRAC_CONST(0.9932392647546895), FRAC_CONST(0.9933911778347579), FRAC_CONST(0.9935403442303433), FRAC_CONST(0.9936867998911693), FRAC_CONST(0.9938305805363887), FRAC_CONST(0.9939717216523539), FRAC_CONST(0.9941102584904481), FRAC_CONST(0.9942462260649764), FRAC_CONST(0.9943796591511174), FRAC_CONST(0.9945105922829353), FRAC_CONST(0.9946390597514524), FRAC_CONST(0.9947650956027824), FRAC_CONST(0.9948887336363228), FRAC_CONST(0.9950100074030103), FRAC_CONST(0.9951289502036336), FRAC_CONST(0.9952455950872091), FRAC_CONST(0.9953599748494155), FRAC_CONST(0.9954721220310890), FRAC_CONST(0.9955820689167787), FRAC_CONST(0.9956898475333619), FRAC_CONST(0.9957954896487196), FRAC_CONST(0.9958990267704713), FRAC_CONST(0.9960004901447701), FRAC_CONST(0.9960999107551559), FRAC_CONST(0.9961973193214694), FRAC_CONST(0.9962927462988245), FRAC_CONST(0.9963862218766388), FRAC_CONST(0.9964777759777242), FRAC_CONST(0.9965674382574342), FRAC_CONST(0.9966552381028704), FRAC_CONST(0.9967412046321465), FRAC_CONST(0.9968253666937095), FRAC_CONST(0.9969077528657186), FRAC_CONST(0.9969883914554805), FRAC_CONST(0.9970673104989413), FRAC_CONST(0.9971445377602348), FRAC_CONST(0.9972201007312871), FRAC_CONST(0.9972940266314749), FRAC_CONST(0.9973663424073412), FRAC_CONST(0.9974370747323638), FRAC_CONST(0.9975062500067785), FRAC_CONST(0.9975738943574574), FRAC_CONST(0.9976400336378379), FRAC_CONST(0.9977046934279079), FRAC_CONST(0.9977678990342401), FRAC_CONST(0.9978296754900812), FRAC_CONST(0.9978900475554902), FRAC_CONST(0.9979490397175296), FRAC_CONST(0.9980066761905056), FRAC_CONST(0.9980629809162593), FRAC_CONST(0.9981179775645063), FRAC_CONST(0.9981716895332257), FRAC_CONST(0.9982241399490979), FRAC_CONST(0.9982753516679893), FRAC_CONST(0.9983253472754841), FRAC_CONST(0.9983741490874634), FRAC_CONST(0.9984217791507299), FRAC_CONST(0.9984682592436778), FRAC_CONST(0.9985136108770075), FRAC_CONST(0.9985578552944850), FRAC_CONST(0.9986010134737439), FRAC_CONST(0.9986431061271304), FRAC_CONST(0.9986841537025921), FRAC_CONST(0.9987241763846056), FRAC_CONST(0.9987631940951476), FRAC_CONST(0.9988012264947044), FRAC_CONST(0.9988382929833222), FRAC_CONST(0.9988744127016956), FRAC_CONST(0.9989096045322947), FRAC_CONST(0.9989438871005292), FRAC_CONST(0.9989772787759494), FRAC_CONST(0.9990097976734847), FRAC_CONST(0.9990414616547146), FRAC_CONST(0.9990722883291779), FRAC_CONST(0.9991022950557125), FRAC_CONST(0.9991314989438310), FRAC_CONST(0.9991599168551279), FRAC_CONST(0.9991875654047181), FRAC_CONST(0.9992144609627068), FRAC_CONST(0.9992406196556911), FRAC_CONST(0.9992660573682882), FRAC_CONST(0.9992907897446957), FRAC_CONST(0.9993148321902777), FRAC_CONST(0.9993381998731797), FRAC_CONST(0.9993609077259696), FRAC_CONST(0.9993829704473038), FRAC_CONST(0.9994044025036201), FRAC_CONST(0.9994252181308537), FRAC_CONST(0.9994454313361775), FRAC_CONST(0.9994650558997651), FRAC_CONST(0.9994841053765757), FRAC_CONST(0.9995025930981609), FRAC_CONST(0.9995205321744921), FRAC_CONST(0.9995379354958073), FRAC_CONST(0.9995548157344778), FRAC_CONST(0.9995711853468930), FRAC_CONST(0.9995870565753632), FRAC_CONST(0.9996024414500382), FRAC_CONST(0.9996173517908444), FRAC_CONST(0.9996317992094352), FRAC_CONST(0.9996457951111574), FRAC_CONST(0.9996593506970310), FRAC_CONST(0.9996724769657434), FRAC_CONST(0.9996851847156547), FRAC_CONST(0.9996974845468164), FRAC_CONST(0.9997093868630000), FRAC_CONST(0.9997209018737374), FRAC_CONST(0.9997320395963699), FRAC_CONST(0.9997428098581069), FRAC_CONST(0.9997532222980933), FRAC_CONST(0.9997632863694836), FRAC_CONST(0.9997730113415246), FRAC_CONST(0.9997824063016426), FRAC_CONST(0.9997914801575380), FRAC_CONST(0.9998002416392840), FRAC_CONST(0.9998086993014300), FRAC_CONST(0.9998168615251084), FRAC_CONST(0.9998247365201450), FRAC_CONST(0.9998323323271717), FRAC_CONST(0.9998396568197407), FRAC_CONST(0.9998467177064404), FRAC_CONST(0.9998535225330116), FRAC_CONST(0.9998600786844637), FRAC_CONST(0.9998663933871905), FRAC_CONST(0.9998724737110845), FRAC_CONST(0.9998783265716498), FRAC_CONST(0.9998839587321121), FRAC_CONST(0.9998893768055266), FRAC_CONST(0.9998945872568815), FRAC_CONST(0.9998995964051983), FRAC_CONST(0.9999044104256269), FRAC_CONST(0.9999090353515359), FRAC_CONST(0.9999134770765971), FRAC_CONST(0.9999177413568642), FRAC_CONST(0.9999218338128448), FRAC_CONST(0.9999257599315647), FRAC_CONST(0.9999295250686255), FRAC_CONST(0.9999331344502529), FRAC_CONST(0.9999365931753376), FRAC_CONST(0.9999399062174669), FRAC_CONST(0.9999430784269460), FRAC_CONST(0.9999461145328103), FRAC_CONST(0.9999490191448277), FRAC_CONST(0.9999517967554878), FRAC_CONST(0.9999544517419835), FRAC_CONST(0.9999569883681778), FRAC_CONST(0.9999594107865607), FRAC_CONST(0.9999617230401926), FRAC_CONST(0.9999639290646355), FRAC_CONST(0.9999660326898712), FRAC_CONST(0.9999680376422052), FRAC_CONST(0.9999699475461585), FRAC_CONST(0.9999717659263435), FRAC_CONST(0.9999734962093266), FRAC_CONST(0.9999751417254756), FRAC_CONST(0.9999767057107922), FRAC_CONST(0.9999781913087290), FRAC_CONST(0.9999796015719915), FRAC_CONST(0.9999809394643231), FRAC_CONST(0.9999822078622751), FRAC_CONST(0.9999834095569596), FRAC_CONST(0.9999845472557860), FRAC_CONST(0.9999856235841805), FRAC_CONST(0.9999866410872889), FRAC_CONST(0.9999876022316609), FRAC_CONST(0.9999885094069193), FRAC_CONST(0.9999893649274085), FRAC_CONST(0.9999901710338274), FRAC_CONST(0.9999909298948430), FRAC_CONST(0.9999916436086862), FRAC_CONST(0.9999923142047299), FRAC_CONST(0.9999929436450469), FRAC_CONST(0.9999935338259505), FRAC_CONST(0.9999940865795161), FRAC_CONST(0.9999946036750835), FRAC_CONST(0.9999950868207405), FRAC_CONST(0.9999955376647868), FRAC_CONST(0.9999959577971798), FRAC_CONST(0.9999963487509599), FRAC_CONST(0.9999967120036571), FRAC_CONST(0.9999970489786785), FRAC_CONST(0.9999973610466748), FRAC_CONST(0.9999976495268890), FRAC_CONST(0.9999979156884846), FRAC_CONST(0.9999981607518545), FRAC_CONST(0.9999983858899099), FRAC_CONST(0.9999985922293493), FRAC_CONST(0.9999987808519092), FRAC_CONST(0.9999989527955938), FRAC_CONST(0.9999991090558848), FRAC_CONST(0.9999992505869332), FRAC_CONST(0.9999993783027293), FRAC_CONST(0.9999994930782556), FRAC_CONST(0.9999995957506171), FRAC_CONST(0.9999996871201549), FRAC_CONST(0.9999997679515386), FRAC_CONST(0.9999998389748399), FRAC_CONST(0.9999999008865869), FRAC_CONST(0.9999999543507984) }; #endif ALIGN static const real_t kbd_short_128[] = { FRAC_CONST(4.3795702929468881e-005), FRAC_CONST(0.00011867384265436617), FRAC_CONST(0.0002307165763996192), FRAC_CONST(0.00038947282760568383), FRAC_CONST(0.00060581272288302553), FRAC_CONST(0.00089199695169487453), FRAC_CONST(0.0012617254423430522), FRAC_CONST(0.0017301724373162003), FRAC_CONST(0.0023140071937421476), FRAC_CONST(0.0030313989666022221), FRAC_CONST(0.0039020049735530842), FRAC_CONST(0.0049469401815512024), FRAC_CONST(0.0061887279335368318), FRAC_CONST(0.0076512306364647726), FRAC_CONST(0.0093595599562652423), FRAC_CONST(0.011339966208377799), FRAC_CONST(0.013619706891715299), FRAC_CONST(0.016226894586323766), FRAC_CONST(0.019190324717288168), FRAC_CONST(0.022539283975960878), FRAC_CONST(0.026303340480472455), FRAC_CONST(0.030512117046644357), FRAC_CONST(0.03519504922365594), FRAC_CONST(0.040381130021856941), FRAC_CONST(0.046098643518702249), FRAC_CONST(0.052374889768730587), FRAC_CONST(0.059235903660769147), FRAC_CONST(0.066706170556282418), FRAC_CONST(0.074808341703430481), FRAC_CONST(0.083562952548726227), FRAC_CONST(0.092988147159339674), FRAC_CONST(0.1030994120216919), FRAC_CONST(0.11390932249409955), FRAC_CONST(0.12542730516149531), FRAC_CONST(0.13765941926783826), FRAC_CONST(0.15060816028651081), FRAC_CONST(0.16427228853114245), FRAC_CONST(0.17864668550988483), FRAC_CONST(0.19372224048676889), FRAC_CONST(0.20948576943658073), FRAC_CONST(0.22591996826744942), FRAC_CONST(0.24300340184133981), FRAC_CONST(0.26071052995068139), FRAC_CONST(0.27901177101369551), FRAC_CONST(0.29787360383626599), FRAC_CONST(0.3172587073594233), FRAC_CONST(0.33712613787396362), FRAC_CONST(0.35743154274286698), FRAC_CONST(0.37812740923363009), FRAC_CONST(0.39916334663203618), FRAC_CONST(0.42048639939189658), FRAC_CONST(0.4420413886774246), FRAC_CONST(0.4637712792815169), FRAC_CONST(0.4856175685594023), FRAC_CONST(0.50752069370766872), FRAC_CONST(0.52942045344797806), FRAC_CONST(0.55125643994680196), FRAC_CONST(0.57296847662071559), FRAC_CONST(0.59449705734411495), FRAC_CONST(0.61578378249506627), FRAC_CONST(0.63677178724712891), FRAC_CONST(0.65740615754163356), FRAC_CONST(0.67763432925662526), FRAC_CONST(0.69740646622548552), FRAC_CONST(0.71667581294953808), FRAC_CONST(0.73539901809352737), FRAC_CONST(0.75353642514900732), FRAC_CONST(0.77105232699609816), FRAC_CONST(0.78791518148597028), FRAC_CONST(0.80409778560147072), FRAC_CONST(0.81957740622770781), FRAC_CONST(0.83433586607383625), FRAC_CONST(0.84835958382689225), FRAC_CONST(0.86163956818294229), FRAC_CONST(0.87417136598406997), FRAC_CONST(0.88595496528524853), FRAC_CONST(0.89699465477567619), FRAC_CONST(0.90729884157670959), FRAC_CONST(0.91687983002436779), FRAC_CONST(0.92575356460899649), FRAC_CONST(0.93393934077779084), FRAC_CONST(0.94145948779657318), FRAC_CONST(0.94833902830402828), FRAC_CONST(0.95460531956280026), FRAC_CONST(0.96028768170574896), FRAC_CONST(0.96541701848104766), FRAC_CONST(0.97002543610646474), FRAC_CONST(0.97414586584250062), FRAC_CONST(0.97781169577969584), FRAC_CONST(0.98105641710392333), FRAC_CONST(0.98391328975491177), FRAC_CONST(0.98641503193166202), FRAC_CONST(0.98859353733226141), FRAC_CONST(0.99047962335771556), FRAC_CONST(0.9921028127769449), FRAC_CONST(0.99349115056397752), FRAC_CONST(0.99467105680259038), FRAC_CONST(0.9956672157341897), FRAC_CONST(0.99650250022834352), FRAC_CONST(0.99719793020823266), FRAC_CONST(0.99777266288955657), FRAC_CONST(0.99824401211201486), FRAC_CONST(0.99862749357391212), FRAC_CONST(0.99893689243401962), FRAC_CONST(0.99918434952623147), FRAC_CONST(0.99938046234161726), FRAC_CONST(0.99953439696357238), FRAC_CONST(0.99965400728430465), FRAC_CONST(0.99974595807027455), FRAC_CONST(0.99981584876278362), FRAC_CONST(0.99986833527824281), FRAC_CONST(0.99990724749057802), FRAC_CONST(0.99993570051598468), FRAC_CONST(0.99995619835942084), FRAC_CONST(0.99997072890647543), FRAC_CONST(0.9999808496399144), FRAC_CONST(0.99998776381655818), FRAC_CONST(0.99999238714961569), FRAC_CONST(0.99999540529959718), FRAC_CONST(0.99999732268176988), FRAC_CONST(0.99999850325054862), FRAC_CONST(0.99999920402413744), FRAC_CONST(0.9999996021706401), FRAC_CONST(0.99999981649545566), FRAC_CONST(0.99999992415545547), FRAC_CONST(0.99999997338493041), FRAC_CONST(0.99999999295825959), FRAC_CONST(0.99999999904096815) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t kbd_short_120[] = { FRAC_CONST(0.0000452320086910), FRAC_CONST(0.0001274564692111), FRAC_CONST(0.0002529398385345), FRAC_CONST(0.0004335140496648), FRAC_CONST(0.0006827100966952), FRAC_CONST(0.0010158708222246), FRAC_CONST(0.0014502162869659), FRAC_CONST(0.0020048865156264), FRAC_CONST(0.0027009618393178), FRAC_CONST(0.0035614590925043), FRAC_CONST(0.0046113018122711), FRAC_CONST(0.0058772627936484), FRAC_CONST(0.0073878776584103), FRAC_CONST(0.0091733284512589), FRAC_CONST(0.0112652966728373), FRAC_CONST(0.0136967855861945), FRAC_CONST(0.0165019120857793), FRAC_CONST(0.0197156688892217), FRAC_CONST(0.0233736582950619), FRAC_CONST(0.0275117992367496), FRAC_CONST(0.0321660098468534), FRAC_CONST(0.0373718682174417), FRAC_CONST(0.0431642544948834), FRAC_CONST(0.0495769778717676), FRAC_CONST(0.0566423924273392), FRAC_CONST(0.0643910061132260), FRAC_CONST(0.0728510874761729), FRAC_CONST(0.0820482749475221), FRAC_CONST(0.0920051937045235), FRAC_CONST(0.1027410852163450), FRAC_CONST(0.1142714546239370), FRAC_CONST(0.1266077410648368), FRAC_CONST(0.1397570159398145), FRAC_CONST(0.1537217139274270), FRAC_CONST(0.1684994012857075), FRAC_CONST(0.1840825856392944), FRAC_CONST(0.2004585710384133), FRAC_CONST(0.2176093615976121), FRAC_CONST(0.2355116164824983), FRAC_CONST(0.2541366584185075), FRAC_CONST(0.2734505372545160), FRAC_CONST(0.2934141494343369), FRAC_CONST(0.3139834135200387), FRAC_CONST(0.3351095011824163), FRAC_CONST(0.3567391223361566), FRAC_CONST(0.3788148623608774), FRAC_CONST(0.4012755686250732), FRAC_CONST(0.4240567828288110), FRAC_CONST(0.4470912150133537), FRAC_CONST(0.4703092544619664), FRAC_CONST(0.4936395121456694), FRAC_CONST(0.5170093888596962), FRAC_CONST(0.5403456627591340), FRAC_CONST(0.5635750896430154), FRAC_CONST(0.5866250090612892), FRAC_CONST(0.6094239491338723), FRAC_CONST(0.6319022228794100), FRAC_CONST(0.6539925088563087), FRAC_CONST(0.6756304090216887), FRAC_CONST(0.6967549769155277), FRAC_CONST(0.7173092095766250), FRAC_CONST(0.7372404969921184), FRAC_CONST(0.7565010233699827), FRAC_CONST(0.7750481150999984), FRAC_CONST(0.7928445309277697), FRAC_CONST(0.8098586906021583), FRAC_CONST(0.8260648390616000), FRAC_CONST(0.8414431440907889), FRAC_CONST(0.8559797262966709), FRAC_CONST(0.8696666212110165), FRAC_CONST(0.8825016743142358), FRAC_CONST(0.8944883707784486), FRAC_CONST(0.9056356027326216), FRAC_CONST(0.9159573778427816), FRAC_CONST(0.9254724739583072), FRAC_CONST(0.9342040454819434), FRAC_CONST(0.9421791879559176), FRAC_CONST(0.9494284680976784), FRAC_CONST(0.9559854271440150), FRAC_CONST(0.9618860658493898), FRAC_CONST(0.9671683198119525), FRAC_CONST(0.9718715339497299), FRAC_CONST(0.9760359449042233), FRAC_CONST(0.9797021798981759), FRAC_CONST(0.9829107801140203), FRAC_CONST(0.9857017559923277), FRAC_CONST(0.9881141809867999), FRAC_CONST(0.9901858292742826), FRAC_CONST(0.9919528617340944), FRAC_CONST(0.9934495632180476), FRAC_CONST(0.9947081327749199), FRAC_CONST(0.9957585271195989), FRAC_CONST(0.9966283562984427), FRAC_CONST(0.9973428292485683), FRAC_CONST(0.9979247458259197), FRAC_CONST(0.9983945309245774), FRAC_CONST(0.9987703055583410), FRAC_CONST(0.9990679892449266), FRAC_CONST(0.9993014277313617), FRAC_CONST(0.9994825400228521), FRAC_CONST(0.9996214788122335), FRAC_CONST(0.9997267987294857), FRAC_CONST(0.9998056273097539), FRAC_CONST(0.9998638341781910), FRAC_CONST(0.9999061946325793), FRAC_CONST(0.9999365445321382), FRAC_CONST(0.9999579241373735), FRAC_CONST(0.9999727092594598), FRAC_CONST(0.9999827287418790), FRAC_CONST(0.9999893678912771), FRAC_CONST(0.9999936579844555), FRAC_CONST(0.9999963523959187), FRAC_CONST(0.9999979902130101), FRAC_CONST(0.9999989484358076), FRAC_CONST(0.9999994840031031), FRAC_CONST(0.9999997669534347), FRAC_CONST(0.9999999060327799), FRAC_CONST(0.9999999680107184), FRAC_CONST(0.9999999918774242), FRAC_CONST(0.9999999989770326) }; #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/lt_predict.c000066400000000000000000000142041476153623600164470ustar00rootroot00000000000000/* ** 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 (int16_t)(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 (int16_t)lrintf(sig_in); } #endif void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, uint16_t frame_len, uint8_t object_type) { uint16_t i; /* * The reference point for index i and the content of the buffer * lt_pred_stat are arranged so that lt_pred_stat(0 ... N/2 - 1) contains the * last aliased half window from the IMDCT, and lt_pred_stat(N/2 ... N-1) * is always all zeros. The rest of lt_pred_stat (i<0) contains the previous * fully reconstructed time domain samples, i.e., output of the decoder. * * These values are shifted up by N*2 to avoid (i<0) * * For the LD object type an extra 512 samples lookback is accomodated here. */ #ifdef LD_DEC if (object_type == LD) { for (i = 0; i < frame_len; i++) { lt_pred_stat[i] /* extra 512 */ = lt_pred_stat[i + frame_len]; lt_pred_stat[frame_len + i] = lt_pred_stat[i + (frame_len * 2)]; lt_pred_stat[(frame_len * 2) + i] = real_to_int16(time[i]); lt_pred_stat[(frame_len * 3) + i] = real_to_int16(overlap[i]); } } else { #endif for (i = 0; i < frame_len; i++) { lt_pred_stat[i] = lt_pred_stat[i + frame_len]; lt_pred_stat[frame_len + i] = real_to_int16(time[i]); lt_pred_stat[(frame_len * 2) + i] = real_to_int16(overlap[i]); #if 0 /* set to zero once upon initialisation */ lt_pred_stat[(frame_len * 3) + i] = 0; #endif } #ifdef LD_DEC } #endif } #endif faad2-2.11.2/libfaad/lt_predict.h000066400000000000000000000040551476153623600164570ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: lt_predict.h,v 1.20 2007/11/01 12:33:31 menno Exp $ **/ #ifdef LTP_DEC #ifndef __LT_PREDICT_H__ #define __LT_PREDICT_H__ #ifdef __cplusplus extern "C" { #endif #include "filtbank.h" uint8_t is_ltp_ot(uint8_t object_type); void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec, int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape, uint8_t win_shape_prev, uint8_t sr_index, uint8_t object_type, uint16_t frame_len); void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap, uint16_t frame_len, uint8_t object_type); #ifdef __cplusplus } #endif #endif #endif faad2-2.11.2/libfaad/mdct.c000066400000000000000000000201021476153623600152370ustar00rootroot00000000000000/* ** 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 = 0, b_scale = 0; #endif #endif ALIGN complex_t Z1[512]; complex_t *sincos = mdct->sincos; uint16_t N = mdct->N; uint16_t N2 = N >> 1; uint16_t N4 = N >> 2; uint16_t N8 = N >> 3; #ifdef PROFILE int64_t count1, count2 = faad_get_ts(); #endif #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT /* detect non-power of 2 */ if (N & (N-1)) { /* adjust scale for non-power of 2 MDCT */ /* 2048/1920 */ b_scale = 1; scale = COEF_CONST(1.0666666666666667); } #endif #endif /* pre-IFFT complex multiplication */ for (k = 0; k < N4; k++) { ComplexMult(&IM(Z1[k]), &RE(Z1[k]), X_in[2*k], X_in[N2 - 1 - 2*k], RE(sincos[k]), IM(sincos[k])); } #ifdef PROFILE count1 = faad_get_ts(); #endif /* complex IFFT, any non-scaling FFT can be used here */ cfftb(mdct->cfft, Z1); #ifdef PROFILE count1 = faad_get_ts() - count1; #endif /* post-IFFT complex multiplication */ for (k = 0; k < N4; k++) { RE(x) = RE(Z1[k]); IM(x) = IM(Z1[k]); ComplexMult(&IM(Z1[k]), &RE(Z1[k]), IM(x), RE(x), RE(sincos[k]), IM(sincos[k])); #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT /* non-power of 2 MDCT scaling */ if (b_scale) { RE(Z1[k]) = MUL_C(RE(Z1[k]), scale); IM(Z1[k]) = MUL_C(IM(Z1[k]), scale); } #endif #endif } /* reordering */ for (k = 0; k < N8; k+=2) { X_out[ 2*k] = IM(Z1[N8 + k]); X_out[ 2 + 2*k] = IM(Z1[N8 + 1 + k]); X_out[ 1 + 2*k] = -RE(Z1[N8 - 1 - k]); X_out[ 3 + 2*k] = -RE(Z1[N8 - 2 - k]); X_out[N4 + 2*k] = RE(Z1[ k]); X_out[N4 + + 2 + 2*k] = RE(Z1[ 1 + k]); X_out[N4 + 1 + 2*k] = -IM(Z1[N4 - 1 - k]); X_out[N4 + 3 + 2*k] = -IM(Z1[N4 - 2 - k]); X_out[N2 + 2*k] = RE(Z1[N8 + k]); X_out[N2 + + 2 + 2*k] = RE(Z1[N8 + 1 + k]); X_out[N2 + 1 + 2*k] = -IM(Z1[N8 - 1 - k]); X_out[N2 + 3 + 2*k] = -IM(Z1[N8 - 2 - k]); X_out[N2 + N4 + 2*k] = -IM(Z1[ k]); X_out[N2 + N4 + 2 + 2*k] = -IM(Z1[ 1 + k]); X_out[N2 + N4 + 1 + 2*k] = RE(Z1[N4 - 1 - k]); X_out[N2 + N4 + 3 + 2*k] = RE(Z1[N4 - 2 - k]); } #ifdef PROFILE count2 = faad_get_ts() - count2; mdct->fft_cycles += count1; mdct->cycles += (count2 - count1); #endif } #ifdef LTP_DEC void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out) { uint16_t k; complex_t x; ALIGN complex_t Z1[512]; complex_t *sincos = mdct->sincos; uint16_t N = mdct->N; uint16_t N2 = N >> 1; uint16_t N4 = N >> 2; uint16_t N8 = N >> 3; #ifndef FIXED_POINT real_t scale = REAL_CONST(N); #else real_t scale = REAL_CONST(4.0/N); #endif #ifdef ALLOW_SMALL_FRAMELENGTH #ifdef FIXED_POINT /* detect non-power of 2 */ if (N & (N-1)) { /* adjust scale for non-power of 2 MDCT */ /* *= sqrt(2048/1920) */ scale = MUL_C(scale, COEF_CONST(1.0327955589886444)); } #endif #endif /* pre-FFT complex multiplication */ for (k = 0; k < N8; k++) { uint16_t n = k << 1; RE(x) = X_in[N - N4 - 1 - n] + X_in[N - N4 + n]; IM(x) = X_in[ N4 + n] - X_in[ N4 - 1 - n]; ComplexMult(&RE(Z1[k]), &IM(Z1[k]), RE(x), IM(x), RE(sincos[k]), IM(sincos[k])); RE(Z1[k]) = MUL_R(RE(Z1[k]), scale); IM(Z1[k]) = MUL_R(IM(Z1[k]), scale); RE(x) = X_in[N2 - 1 - n] - X_in[ n]; IM(x) = X_in[N2 + n] + X_in[N - 1 - n]; ComplexMult(&RE(Z1[k + N8]), &IM(Z1[k + N8]), RE(x), IM(x), RE(sincos[k + N8]), IM(sincos[k + N8])); RE(Z1[k + N8]) = MUL_R(RE(Z1[k + N8]), scale); IM(Z1[k + N8]) = MUL_R(IM(Z1[k + N8]), scale); } /* complex FFT, any non-scaling FFT can be used here */ cfftf(mdct->cfft, Z1); /* post-FFT complex multiplication */ for (k = 0; k < N4; k++) { uint16_t n = k << 1; ComplexMult(&RE(x), &IM(x), RE(Z1[k]), IM(Z1[k]), RE(sincos[k]), IM(sincos[k])); X_out[ n] = -RE(x); X_out[N2 - 1 - n] = IM(x); X_out[N2 + n] = -IM(x); X_out[N - 1 - n] = RE(x); } } #endif faad2-2.11.2/libfaad/mdct.h000066400000000000000000000031161476153623600152520ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mdct.h,v 1.30 2007/11/01 12:33:31 menno Exp $ **/ #ifndef __MDCT_H__ #define __MDCT_H__ #ifdef __cplusplus extern "C" { #endif mdct_info *faad_mdct_init(uint16_t N); void faad_mdct_end(mdct_info *mdct); void faad_imdct(mdct_info *mdct, real_t *X_in, real_t *X_out); void faad_mdct(mdct_info *mdct, real_t *X_in, real_t *X_out); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/mdct_tab.h000066400000000000000000007464141476153623600161170ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mdct_tab.h,v 1.7 2007/11/01 12:33:32 menno Exp $ **/ #ifndef __MDCT_TAB_H__ #define __MDCT_TAB_H__ #ifdef __cplusplus extern "C" { #endif #ifdef FIXED_POINT /* 256 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_2048[] = { { FRAC_CONST(0.999999926465718), FRAC_CONST(0.000383495187571) }, { FRAC_CONST(0.999994043728986), FRAC_CONST(0.003451449920136) }, { FRAC_CONST(0.999978748667469), FRAC_CONST(0.006519372166339) }, { FRAC_CONST(0.999954041425130), FRAC_CONST(0.009587233049729) }, { FRAC_CONST(0.999919922234523), FRAC_CONST(0.012655003694430) }, { FRAC_CONST(0.999876391416790), FRAC_CONST(0.015722655225417) }, { FRAC_CONST(0.999823449381662), FRAC_CONST(0.018790158768785) }, { FRAC_CONST(0.999761096627447), FRAC_CONST(0.021857485452022) }, { FRAC_CONST(0.999689333741034), FRAC_CONST(0.024924606404281) }, { FRAC_CONST(0.999608161397882), FRAC_CONST(0.027991492756653) }, { FRAC_CONST(0.999517580362017), FRAC_CONST(0.031058115642435) }, { FRAC_CONST(0.999417591486022), FRAC_CONST(0.034124446197403) }, { FRAC_CONST(0.999308195711029), FRAC_CONST(0.037190455560088) }, { FRAC_CONST(0.999189394066715), FRAC_CONST(0.040256114872041) }, { FRAC_CONST(0.999061187671285), FRAC_CONST(0.043321395278110) }, { FRAC_CONST(0.998923577731466), FRAC_CONST(0.046386267926707) }, { FRAC_CONST(0.998776565542496), FRAC_CONST(0.049450703970085) }, { FRAC_CONST(0.998620152488109), FRAC_CONST(0.052514674564603) }, { FRAC_CONST(0.998454340040525), FRAC_CONST(0.055578150871005) }, { FRAC_CONST(0.998279129760433), FRAC_CONST(0.058641104054683) }, { FRAC_CONST(0.998094523296980), FRAC_CONST(0.061703505285957) }, { FRAC_CONST(0.997900522387752), FRAC_CONST(0.064765325740340) }, { FRAC_CONST(0.997697128858759), FRAC_CONST(0.067826536598811) }, { FRAC_CONST(0.997484344624418), FRAC_CONST(0.070887109048088) }, { FRAC_CONST(0.997262171687536), FRAC_CONST(0.073947014280897) }, { FRAC_CONST(0.997030612139289), FRAC_CONST(0.077006223496246) }, { FRAC_CONST(0.996789668159205), FRAC_CONST(0.080064707899691) }, { FRAC_CONST(0.996539342015138), FRAC_CONST(0.083122438703613) }, { FRAC_CONST(0.996279636063255), FRAC_CONST(0.086179387127485) }, { FRAC_CONST(0.996010552748006), FRAC_CONST(0.089235524398144) }, { FRAC_CONST(0.995732094602106), FRAC_CONST(0.092290821750062) }, { FRAC_CONST(0.995444264246510), FRAC_CONST(0.095345250425618) }, { FRAC_CONST(0.995147064390386), FRAC_CONST(0.098398781675364) }, { FRAC_CONST(0.994840497831093), FRAC_CONST(0.101451386758302) }, { FRAC_CONST(0.994524567454152), FRAC_CONST(0.104503036942151) }, { FRAC_CONST(0.994199276233219), FRAC_CONST(0.107553703503616) }, { FRAC_CONST(0.993864627230060), FRAC_CONST(0.110603357728662) }, { FRAC_CONST(0.993520623594518), FRAC_CONST(0.113651970912782) }, { FRAC_CONST(0.993167268564487), FRAC_CONST(0.116699514361268) }, { FRAC_CONST(0.992804565465879), FRAC_CONST(0.119745959389480) }, { FRAC_CONST(0.992432517712594), FRAC_CONST(0.122791277323117) }, { FRAC_CONST(0.992051128806486), FRAC_CONST(0.125835439498487) }, { FRAC_CONST(0.991660402337333), FRAC_CONST(0.128878417262777) }, { FRAC_CONST(0.991260341982802), FRAC_CONST(0.131920181974320) }, { FRAC_CONST(0.990850951508414), FRAC_CONST(0.134960705002869) }, { FRAC_CONST(0.990432234767506), FRAC_CONST(0.137999957729863) }, { FRAC_CONST(0.990004195701201), FRAC_CONST(0.141037911548698) }, { FRAC_CONST(0.989566838338365), FRAC_CONST(0.144074537864995) }, { FRAC_CONST(0.989120166795573), FRAC_CONST(0.147109808096872) }, { FRAC_CONST(0.988664185277066), FRAC_CONST(0.150143693675208) }, { FRAC_CONST(0.988198898074718), FRAC_CONST(0.153176166043918) }, { FRAC_CONST(0.987724309567987), FRAC_CONST(0.156207196660216) }, { FRAC_CONST(0.987240424223882), FRAC_CONST(0.159236756994888) }, { FRAC_CONST(0.986747246596917), FRAC_CONST(0.162264818532558) }, { FRAC_CONST(0.986244781329065), FRAC_CONST(0.165291352771958) }, { FRAC_CONST(0.985733033149723), FRAC_CONST(0.168316331226195) }, { FRAC_CONST(0.985212006875659), FRAC_CONST(0.171339725423019) }, { FRAC_CONST(0.984681707410971), FRAC_CONST(0.174361506905094) }, { FRAC_CONST(0.984142139747039), FRAC_CONST(0.177381647230260) }, { FRAC_CONST(0.983593308962479), FRAC_CONST(0.180400117971807) }, { FRAC_CONST(0.983035220223096), FRAC_CONST(0.183416890718739) }, { FRAC_CONST(0.982467878781833), FRAC_CONST(0.186431937076042) }, { FRAC_CONST(0.981891289978725), FRAC_CONST(0.189445228664950) }, { FRAC_CONST(0.981305459240845), FRAC_CONST(0.192456737123217) }, { FRAC_CONST(0.980710392082254), FRAC_CONST(0.195466434105377) }, { FRAC_CONST(0.980106094103952), FRAC_CONST(0.198474291283016) }, { FRAC_CONST(0.979492570993821), FRAC_CONST(0.201480280345038) }, { FRAC_CONST(0.978869828526574), FRAC_CONST(0.204484372997927) }, { FRAC_CONST(0.978237872563701), FRAC_CONST(0.207486540966021) }, { FRAC_CONST(0.977596709053412), FRAC_CONST(0.210486755991770) }, { FRAC_CONST(0.976946344030582), FRAC_CONST(0.213484989836008) }, { FRAC_CONST(0.976286783616694), FRAC_CONST(0.216481214278217) }, { FRAC_CONST(0.975618034019782), FRAC_CONST(0.219475401116790) }, { FRAC_CONST(0.974940101534372), FRAC_CONST(0.222467522169302) }, { FRAC_CONST(0.974252992541423), FRAC_CONST(0.225457549272769) }, { FRAC_CONST(0.973556713508266), FRAC_CONST(0.228445454283916) }, { FRAC_CONST(0.972851270988544), FRAC_CONST(0.231431209079446) }, { FRAC_CONST(0.972136671622152), FRAC_CONST(0.234414785556295) }, { FRAC_CONST(0.971412922135171), FRAC_CONST(0.237396155631907) }, { FRAC_CONST(0.970680029339806), FRAC_CONST(0.240375291244489) }, { FRAC_CONST(0.969938000134324), FRAC_CONST(0.243352164353285) }, { FRAC_CONST(0.969186841502986), FRAC_CONST(0.246326746938829) }, { FRAC_CONST(0.968426560515983), FRAC_CONST(0.249299011003218) }, { FRAC_CONST(0.967657164329370), FRAC_CONST(0.252268928570371) }, { FRAC_CONST(0.966878660184996), FRAC_CONST(0.255236471686292) }, { FRAC_CONST(0.966091055410439), FRAC_CONST(0.258201612419335) }, { FRAC_CONST(0.965294357418935), FRAC_CONST(0.261164322860466) }, { FRAC_CONST(0.964488573709308), FRAC_CONST(0.264124575123528) }, { FRAC_CONST(0.963673711865903), FRAC_CONST(0.267082341345496) }, { FRAC_CONST(0.962849779558509), FRAC_CONST(0.270037593686751) }, { FRAC_CONST(0.962016784542291), FRAC_CONST(0.272990304331330) }, { FRAC_CONST(0.961174734657714), FRAC_CONST(0.275940445487197) }, { FRAC_CONST(0.960323637830474), FRAC_CONST(0.278887989386500) }, { FRAC_CONST(0.959463502071418), FRAC_CONST(0.281832908285833) }, { FRAC_CONST(0.958594335476470), FRAC_CONST(0.284775174466498) }, { FRAC_CONST(0.957716146226559), FRAC_CONST(0.287714760234765) }, { FRAC_CONST(0.956828942587535), FRAC_CONST(0.290651637922133) }, { FRAC_CONST(0.955932732910098), FRAC_CONST(0.293585779885591) }, { FRAC_CONST(0.955027525629714), FRAC_CONST(0.296517158507877) }, { FRAC_CONST(0.954113329266539), FRAC_CONST(0.299445746197740) }, { FRAC_CONST(0.953190152425337), FRAC_CONST(0.302371515390196) }, { FRAC_CONST(0.952258003795400), FRAC_CONST(0.305294438546792) }, { FRAC_CONST(0.951316892150466), FRAC_CONST(0.308214488155861) }, { FRAC_CONST(0.950366826348636), FRAC_CONST(0.311131636732785) }, { FRAC_CONST(0.949407815332292), FRAC_CONST(0.314045856820251) }, { FRAC_CONST(0.948439868128010), FRAC_CONST(0.316957120988508) }, { FRAC_CONST(0.947462993846478), FRAC_CONST(0.319865401835631) }, { FRAC_CONST(0.946477201682409), FRAC_CONST(0.322770671987771) }, { FRAC_CONST(0.945482500914454), FRAC_CONST(0.325672904099420) }, { FRAC_CONST(0.944478900905116), FRAC_CONST(0.328572070853664) }, { FRAC_CONST(0.943466411100659), FRAC_CONST(0.331468144962441) }, { FRAC_CONST(0.942445041031025), FRAC_CONST(0.334361099166799) }, { FRAC_CONST(0.941414800309736), FRAC_CONST(0.337250906237151) }, { FRAC_CONST(0.940375698633812), FRAC_CONST(0.340137538973532) }, { FRAC_CONST(0.939327745783671), FRAC_CONST(0.343020970205856) }, { FRAC_CONST(0.938270951623047), FRAC_CONST(0.345901172794169) }, { FRAC_CONST(0.937205326098888), FRAC_CONST(0.348778119628908) }, { FRAC_CONST(0.936130879241267), FRAC_CONST(0.351651783631155) }, { FRAC_CONST(0.935047621163287), FRAC_CONST(0.354522137752887) }, { FRAC_CONST(0.933955562060987), FRAC_CONST(0.357389154977241) }, { FRAC_CONST(0.932854712213241), FRAC_CONST(0.360252808318757) }, { FRAC_CONST(0.931745081981669), FRAC_CONST(0.363113070823639) }, { FRAC_CONST(0.930626681810532), FRAC_CONST(0.365969915570009) }, { FRAC_CONST(0.929499522226639), FRAC_CONST(0.368823315668154) }, { FRAC_CONST(0.928363613839244), FRAC_CONST(0.371673244260787) }, { FRAC_CONST(0.927218967339952), FRAC_CONST(0.374519674523293) }, { FRAC_CONST(0.926065593502609), FRAC_CONST(0.377362579663988) }, { FRAC_CONST(0.924903503183211), FRAC_CONST(0.380201932924366) }, { FRAC_CONST(0.923732707319793), FRAC_CONST(0.383037707579352) }, { FRAC_CONST(0.922553216932333), FRAC_CONST(0.385869876937555) }, { FRAC_CONST(0.921365043122642), FRAC_CONST(0.388698414341519) }, { FRAC_CONST(0.920168197074266), FRAC_CONST(0.391523293167972) }, { FRAC_CONST(0.918962690052376), FRAC_CONST(0.394344486828080) }, { FRAC_CONST(0.917748533403661), FRAC_CONST(0.397161968767692) }, { FRAC_CONST(0.916525738556228), FRAC_CONST(0.399975712467595) }, { FRAC_CONST(0.915294317019487), FRAC_CONST(0.402785691443764) }, { FRAC_CONST(0.914054280384047), FRAC_CONST(0.405591879247604) }, { FRAC_CONST(0.912805640321604), FRAC_CONST(0.408394249466208) }, { FRAC_CONST(0.911548408584834), FRAC_CONST(0.411192775722600) }, { FRAC_CONST(0.910282597007282), FRAC_CONST(0.413987431675985) }, { FRAC_CONST(0.909008217503247), FRAC_CONST(0.416778191021998) }, { FRAC_CONST(0.907725282067676), FRAC_CONST(0.419565027492947) }, { FRAC_CONST(0.906433802776045), FRAC_CONST(0.422347914858067) }, { FRAC_CONST(0.905133791784250), FRAC_CONST(0.425126826923762) }, { FRAC_CONST(0.903825261328488), FRAC_CONST(0.427901737533854) }, { FRAC_CONST(0.902508223725146), FRAC_CONST(0.430672620569827) }, { FRAC_CONST(0.901182691370685), FRAC_CONST(0.433439449951074) }, { FRAC_CONST(0.899848676741519), FRAC_CONST(0.436202199635144) }, { FRAC_CONST(0.898506192393902), FRAC_CONST(0.438960843617984) }, { FRAC_CONST(0.897155250963809), FRAC_CONST(0.441715355934187) }, { FRAC_CONST(0.895795865166814), FRAC_CONST(0.444465710657234) }, { FRAC_CONST(0.894428047797974), FRAC_CONST(0.447211881899738) }, { FRAC_CONST(0.893051811731707), FRAC_CONST(0.449953843813691) }, { FRAC_CONST(0.891667169921672), FRAC_CONST(0.452691570590701) }, { FRAC_CONST(0.890274135400645), FRAC_CONST(0.455425036462242) }, { FRAC_CONST(0.888872721280396), FRAC_CONST(0.458154215699893) }, { FRAC_CONST(0.887462940751569), FRAC_CONST(0.460879082615579) }, { FRAC_CONST(0.886044807083556), FRAC_CONST(0.463599611561814) }, { FRAC_CONST(0.884618333624370), FRAC_CONST(0.466315776931944) }, { FRAC_CONST(0.883183533800523), FRAC_CONST(0.469027553160387) }, { FRAC_CONST(0.881740421116898), FRAC_CONST(0.471734914722871) }, { FRAC_CONST(0.880289009156621), FRAC_CONST(0.474437836136679) }, { FRAC_CONST(0.878829311580933), FRAC_CONST(0.477136291960885) }, { FRAC_CONST(0.877361342129065), FRAC_CONST(0.479830256796594) }, { FRAC_CONST(0.875885114618104), FRAC_CONST(0.482519705287184) }, { FRAC_CONST(0.874400642942865), FRAC_CONST(0.485204612118542) }, { FRAC_CONST(0.872907941075761), FRAC_CONST(0.487884952019301) }, { FRAC_CONST(0.871407023066671), FRAC_CONST(0.490560699761082) }, { FRAC_CONST(0.869897903042806), FRAC_CONST(0.493231830158728) }, { FRAC_CONST(0.868380595208580), FRAC_CONST(0.495898318070542) }, { FRAC_CONST(0.866855113845470), FRAC_CONST(0.498560138398525) }, { FRAC_CONST(0.865321473311890), FRAC_CONST(0.501217266088610) }, { FRAC_CONST(0.863779688043047), FRAC_CONST(0.503869676130899) }, { FRAC_CONST(0.862229772550811), FRAC_CONST(0.506517343559899) }, { FRAC_CONST(0.860671741423578), FRAC_CONST(0.509160243454755) }, { FRAC_CONST(0.859105609326130), FRAC_CONST(0.511798350939487) }, { FRAC_CONST(0.857531390999499), FRAC_CONST(0.514431641183223) }, { FRAC_CONST(0.855949101260827), FRAC_CONST(0.517060089400432) }, { FRAC_CONST(0.854358755003227), FRAC_CONST(0.519683670851158) }, { FRAC_CONST(0.852760367195645), FRAC_CONST(0.522302360841255) }, { FRAC_CONST(0.851153952882715), FRAC_CONST(0.524916134722613) }, { FRAC_CONST(0.849539527184621), FRAC_CONST(0.527524967893398) }, { FRAC_CONST(0.847917105296951), FRAC_CONST(0.530128835798279) }, { FRAC_CONST(0.846286702490560), FRAC_CONST(0.532727713928659) }, { FRAC_CONST(0.844648334111418), FRAC_CONST(0.535321577822907) }, { FRAC_CONST(0.843002015580473), FRAC_CONST(0.537910403066589) }, { FRAC_CONST(0.841347762393502), FRAC_CONST(0.540494165292695) }, { FRAC_CONST(0.839685590120966), FRAC_CONST(0.543072840181872) }, { FRAC_CONST(0.838015514407864), FRAC_CONST(0.545646403462649) }, { FRAC_CONST(0.836337550973584), FRAC_CONST(0.548214830911668) }, { FRAC_CONST(0.834651715611756), FRAC_CONST(0.550778098353912) }, { FRAC_CONST(0.832958024190107), FRAC_CONST(0.553336181662932) }, { FRAC_CONST(0.831256492650303), FRAC_CONST(0.555889056761074) }, { FRAC_CONST(0.829547137007809), FRAC_CONST(0.558436699619704) }, { FRAC_CONST(0.827829973351730), FRAC_CONST(0.560979086259438) }, { FRAC_CONST(0.826105017844665), FRAC_CONST(0.563516192750365) }, { FRAC_CONST(0.824372286722551), FRAC_CONST(0.566047995212271) }, { FRAC_CONST(0.822631796294515), FRAC_CONST(0.568574469814869) }, { FRAC_CONST(0.820883562942715), FRAC_CONST(0.571095592778017) }, { FRAC_CONST(0.819127603122188), FRAC_CONST(0.573611340371945) }, { FRAC_CONST(0.817363933360698), FRAC_CONST(0.576121688917478) }, { FRAC_CONST(0.815592570258577), FRAC_CONST(0.578626614786261) }, { FRAC_CONST(0.813813530488567), FRAC_CONST(0.581126094400978) }, { FRAC_CONST(0.812026830795670), FRAC_CONST(0.583620104235573) }, { FRAC_CONST(0.810232487996982), FRAC_CONST(0.586108620815476) }, { FRAC_CONST(0.808430518981543), FRAC_CONST(0.588591620717823) }, { FRAC_CONST(0.806620940710170), FRAC_CONST(0.591069080571671) }, { FRAC_CONST(0.804803770215303), FRAC_CONST(0.593540977058226) }, { FRAC_CONST(0.802979024600843), FRAC_CONST(0.596007286911057) }, { FRAC_CONST(0.801146721041991), FRAC_CONST(0.598467986916314) }, { FRAC_CONST(0.799306876785086), FRAC_CONST(0.600923053912954) }, { FRAC_CONST(0.797459509147442), FRAC_CONST(0.603372464792950) }, { FRAC_CONST(0.795604635517188), FRAC_CONST(0.605816196501515) }, { FRAC_CONST(0.793742273353100), FRAC_CONST(0.608254226037314) }, { FRAC_CONST(0.791872440184440), FRAC_CONST(0.610686530452686) }, { FRAC_CONST(0.789995153610791), FRAC_CONST(0.613113086853855) }, { FRAC_CONST(0.788110431301888), FRAC_CONST(0.615533872401147) }, { FRAC_CONST(0.786218290997456), FRAC_CONST(0.617948864309208) }, { FRAC_CONST(0.784318750507039), FRAC_CONST(0.620358039847214) }, { FRAC_CONST(0.782411827709837), FRAC_CONST(0.622761376339086) }, { FRAC_CONST(0.780497540554532), FRAC_CONST(0.625158851163708) }, { FRAC_CONST(0.778575907059125), FRAC_CONST(0.627550441755132) }, { FRAC_CONST(0.776646945310762), FRAC_CONST(0.629936125602796) }, { FRAC_CONST(0.774710673465566), FRAC_CONST(0.632315880251738) }, { FRAC_CONST(0.772767109748464), FRAC_CONST(0.634689683302798) }, { FRAC_CONST(0.770816272453019), FRAC_CONST(0.637057512412839) }, { FRAC_CONST(0.768858179941253), FRAC_CONST(0.639419345294951) }, { FRAC_CONST(0.766892850643481), FRAC_CONST(0.641775159718664) }, { FRAC_CONST(0.764920303058128), FRAC_CONST(0.644124933510155) }, { FRAC_CONST(0.762940555751566), FRAC_CONST(0.646468644552458) }, { FRAC_CONST(0.760953627357928), FRAC_CONST(0.648806270785673) }, { FRAC_CONST(0.758959536578942), FRAC_CONST(0.651137790207170) }, { FRAC_CONST(0.756958302183750), FRAC_CONST(0.653463180871802) }, { FRAC_CONST(0.754949943008733), FRAC_CONST(0.655782420892106) }, { FRAC_CONST(0.752934477957330), FRAC_CONST(0.658095488438511) }, { FRAC_CONST(0.750911925999868), FRAC_CONST(0.660402361739545) }, { FRAC_CONST(0.748882306173375), FRAC_CONST(0.662703019082037) }, { FRAC_CONST(0.746845637581407), FRAC_CONST(0.664997438811325) }, { FRAC_CONST(0.744801939393863), FRAC_CONST(0.667285599331456) }, { FRAC_CONST(0.742751230846809), FRAC_CONST(0.669567479105392) }, { FRAC_CONST(0.740693531242296), FRAC_CONST(0.671843056655212) }, { FRAC_CONST(0.738628859948175), FRAC_CONST(0.674112310562312) }, { FRAC_CONST(0.736557236397919), FRAC_CONST(0.676375219467612) }, { FRAC_CONST(0.734478680090438), FRAC_CONST(0.678631762071749) }, { FRAC_CONST(0.732393210589896), FRAC_CONST(0.680881917135287) }, { FRAC_CONST(0.730300847525525), FRAC_CONST(0.683125663478909) }, { FRAC_CONST(0.728201610591445), FRAC_CONST(0.685362979983619) }, { FRAC_CONST(0.726095519546471), FRAC_CONST(0.687593845590942) }, { FRAC_CONST(0.723982594213936), FRAC_CONST(0.689818239303122) }, { FRAC_CONST(0.721862854481496), FRAC_CONST(0.692036140183319) }, { FRAC_CONST(0.719736320300951), FRAC_CONST(0.694247527355803) }, { FRAC_CONST(0.717603011688049), FRAC_CONST(0.696452380006158) }, { FRAC_CONST(0.715462948722304), FRAC_CONST(0.698650677381469) }, { FRAC_CONST(0.713316151546803), FRAC_CONST(0.700842398790526) }, { FRAC_CONST(0.711162640368018), FRAC_CONST(0.703027523604011) }, { FRAC_CONST(0.709002435455618), FRAC_CONST(0.705206031254698) }, { FRAC_CONST(0.706835557142274), FRAC_CONST(0.707377901237642) }, { FRAC_CONST(0.704662025823469), FRAC_CONST(0.709543113110377) }, { FRAC_CONST(0.702481861957308), FRAC_CONST(0.711701646493103) }, { FRAC_CONST(0.700295086064324), FRAC_CONST(0.713853481068882) }, { FRAC_CONST(0.698101718727284), FRAC_CONST(0.715998596583829) }, { FRAC_CONST(0.695901780590997), FRAC_CONST(0.718136972847297) }, { FRAC_CONST(0.693695292362118), FRAC_CONST(0.720268589732077) }, { FRAC_CONST(0.691482274808956), FRAC_CONST(0.722393427174578) }, { FRAC_CONST(0.689262748761273), FRAC_CONST(0.724511465175020) }, { FRAC_CONST(0.687036735110096), FRAC_CONST(0.726622683797623) }, { FRAC_CONST(0.684804254807511), FRAC_CONST(0.728727063170794) }, { FRAC_CONST(0.682565328866473), FRAC_CONST(0.730824583487312) }, { FRAC_CONST(0.680319978360607), FRAC_CONST(0.732915225004518) }, { FRAC_CONST(0.678068224424007), FRAC_CONST(0.734998968044497) }, { FRAC_CONST(0.675810088251037), FRAC_CONST(0.737075792994266) }, { FRAC_CONST(0.673545591096136), FRAC_CONST(0.739145680305957) }, { FRAC_CONST(0.671274754273613), FRAC_CONST(0.741208610497004) }, { FRAC_CONST(0.668997599157450), FRAC_CONST(0.743264564150321) }, { FRAC_CONST(0.666714147181098), FRAC_CONST(0.745313521914490) }, { FRAC_CONST(0.664424419837275), FRAC_CONST(0.747355464503940) }, { FRAC_CONST(0.662128438677769), FRAC_CONST(0.749390372699130) }, { FRAC_CONST(0.659826225313227), FRAC_CONST(0.751418227346727) }, { FRAC_CONST(0.657517801412960), FRAC_CONST(0.753439009359794) }, { FRAC_CONST(0.655203188704732), FRAC_CONST(0.755452699717958) }, { FRAC_CONST(0.652882408974559), FRAC_CONST(0.757459279467601) }, { FRAC_CONST(0.650555484066504), FRAC_CONST(0.759458729722028) }, { FRAC_CONST(0.648222435882470), FRAC_CONST(0.761451031661654) }, { FRAC_CONST(0.645883286381996), FRAC_CONST(0.763436166534172) }, { FRAC_CONST(0.643538057582048), FRAC_CONST(0.765414115654738) }, { FRAC_CONST(0.641186771556811), FRAC_CONST(0.767384860406142) }, { FRAC_CONST(0.638829450437486), FRAC_CONST(0.769348382238982) }, { FRAC_CONST(0.636466116412077), FRAC_CONST(0.771304662671845) }, { FRAC_CONST(0.634096791725184), FRAC_CONST(0.773253683291473) }, { FRAC_CONST(0.631721498677792), FRAC_CONST(0.775195425752941) }, { FRAC_CONST(0.629340259627066), FRAC_CONST(0.777129871779832) }, { FRAC_CONST(0.626953096986133), FRAC_CONST(0.779057003164401) }, { FRAC_CONST(0.624560033223877), FRAC_CONST(0.780976801767754) }, { FRAC_CONST(0.622161090864727), FRAC_CONST(0.782889249520015) }, { FRAC_CONST(0.619756292488441), FRAC_CONST(0.784794328420499) }, { FRAC_CONST(0.617345660729897), FRAC_CONST(0.786692020537877) }, { FRAC_CONST(0.614929218278880), FRAC_CONST(0.788582308010347) }, { FRAC_CONST(0.612506987879866), FRAC_CONST(0.790465173045805) }, { FRAC_CONST(0.610078992331810), FRAC_CONST(0.792340597922007) }, { FRAC_CONST(0.607645254487931), FRAC_CONST(0.794208564986741) }, { FRAC_CONST(0.605205797255497), FRAC_CONST(0.796069056657988) }, { FRAC_CONST(0.602760643595607), FRAC_CONST(0.797922055424093) }, { FRAC_CONST(0.600309816522980), FRAC_CONST(0.799767543843926) }, { FRAC_CONST(0.597853339105734), FRAC_CONST(0.801605504547046) }, { FRAC_CONST(0.595391234465169), FRAC_CONST(0.803435920233868) }, { FRAC_CONST(0.592923525775551), FRAC_CONST(0.805258773675822) }, { FRAC_CONST(0.590450236263896), FRAC_CONST(0.807074047715518) }, { FRAC_CONST(0.587971389209745), FRAC_CONST(0.808881725266904) }, { FRAC_CONST(0.585487007944951), FRAC_CONST(0.810681789315431) }, { FRAC_CONST(0.582997115853458), FRAC_CONST(0.812474222918210) }, { FRAC_CONST(0.580501736371077), FRAC_CONST(0.814259009204175) }, { FRAC_CONST(0.578000892985270), FRAC_CONST(0.816036131374237) }, { FRAC_CONST(0.575494609234928), FRAC_CONST(0.817805572701444) }, { FRAC_CONST(0.572982908710149), FRAC_CONST(0.819567316531142) }, { FRAC_CONST(0.570465815052013), FRAC_CONST(0.821321346281127) }, { FRAC_CONST(0.567943351952366), FRAC_CONST(0.823067645441802) }, { FRAC_CONST(0.565415543153590), FRAC_CONST(0.824806197576334) }, { FRAC_CONST(0.562882412448385), FRAC_CONST(0.826536986320810) }, { FRAC_CONST(0.560343983679541), FRAC_CONST(0.828259995384386) }, { FRAC_CONST(0.557800280739717), FRAC_CONST(0.829975208549444) }, { FRAC_CONST(0.555251327571214), FRAC_CONST(0.831682609671745) }, { FRAC_CONST(0.552697148165750), FRAC_CONST(0.833382182680580) }, { FRAC_CONST(0.550137766564234), FRAC_CONST(0.835073911578919) }, { FRAC_CONST(0.547573206856540), FRAC_CONST(0.836757780443567) }, { FRAC_CONST(0.545003493181281), FRAC_CONST(0.838433773425308) }, { FRAC_CONST(0.542428649725581), FRAC_CONST(0.840101874749058) }, { FRAC_CONST(0.539848700724848), FRAC_CONST(0.841762068714012) }, { FRAC_CONST(0.537263670462543), FRAC_CONST(0.843414339693793) }, { FRAC_CONST(0.534673583269956), FRAC_CONST(0.845058672136595) }, { FRAC_CONST(0.532078463525974), FRAC_CONST(0.846695050565337) }, { FRAC_CONST(0.529478335656852), FRAC_CONST(0.848323459577802) }, { FRAC_CONST(0.526873224135985), FRAC_CONST(0.849943883846782) }, { FRAC_CONST(0.524263153483673), FRAC_CONST(0.851556308120229) }, { FRAC_CONST(0.521648148266897), FRAC_CONST(0.853160717221390) }, { FRAC_CONST(0.519028233099081), FRAC_CONST(0.854757096048957) }, { FRAC_CONST(0.516403432639864), FRAC_CONST(0.856345429577204) }, { FRAC_CONST(0.513773771594868), FRAC_CONST(0.857925702856130) }, { FRAC_CONST(0.511139274715464), FRAC_CONST(0.859497901011602) }, { FRAC_CONST(0.508499966798541), FRAC_CONST(0.861062009245491) }, { FRAC_CONST(0.505855872686269), FRAC_CONST(0.862618012835817) }, { FRAC_CONST(0.503207017265869), FRAC_CONST(0.864165897136879) }, { FRAC_CONST(0.500553425469378), FRAC_CONST(0.865705647579402) }, { FRAC_CONST(0.497895122273411), FRAC_CONST(0.867237249670668) }, { FRAC_CONST(0.495232132698931), FRAC_CONST(0.868760688994655) }, { FRAC_CONST(0.492564481811011), FRAC_CONST(0.870275951212172) }, { FRAC_CONST(0.489892194718595), FRAC_CONST(0.871783022060993) }, { FRAC_CONST(0.487215296574269), FRAC_CONST(0.873281887355994) }, { FRAC_CONST(0.484533812574016), FRAC_CONST(0.874772532989284) }, { FRAC_CONST(0.481847767956986), FRAC_CONST(0.876254944930338) }, { FRAC_CONST(0.479157188005253), FRAC_CONST(0.877729109226132) }, { FRAC_CONST(0.476462098043581), FRAC_CONST(0.879195012001267) }, { FRAC_CONST(0.473762523439183), FRAC_CONST(0.880652639458111) }, { FRAC_CONST(0.471058489601483), FRAC_CONST(0.882101977876918) }, { FRAC_CONST(0.468350021981877), FRAC_CONST(0.883543013615962) }, { FRAC_CONST(0.465637146073494), FRAC_CONST(0.884975733111667) }, { FRAC_CONST(0.462919887410955), FRAC_CONST(0.886400122878730) }, { FRAC_CONST(0.460198271570134), FRAC_CONST(0.887816169510255) }, { FRAC_CONST(0.457472324167916), FRAC_CONST(0.889223859677868) }, { FRAC_CONST(0.454742070861955), FRAC_CONST(0.890623180131856) }, { FRAC_CONST(0.452007537350437), FRAC_CONST(0.892014117701280) }, { FRAC_CONST(0.449268749371830), FRAC_CONST(0.893396659294108) }, { FRAC_CONST(0.446525732704651), FRAC_CONST(0.894770791897330) }, { FRAC_CONST(0.443778513167218), FRAC_CONST(0.896136502577087) }, { FRAC_CONST(0.441027116617407), FRAC_CONST(0.897493778478790) }, { FRAC_CONST(0.438271568952410), FRAC_CONST(0.898842606827242) }, { FRAC_CONST(0.435511896108492), FRAC_CONST(0.900182974926757) }, { FRAC_CONST(0.432748124060744), FRAC_CONST(0.901514870161279) }, { FRAC_CONST(0.429980278822841), FRAC_CONST(0.902838279994503) }, { FRAC_CONST(0.427208386446796), FRAC_CONST(0.904153191969992) }, { FRAC_CONST(0.424432473022717), FRAC_CONST(0.905459593711293) }, { FRAC_CONST(0.421652564678558), FRAC_CONST(0.906757472922057) }, { FRAC_CONST(0.418868687579875), FRAC_CONST(0.908046817386148) }, { FRAC_CONST(0.416080867929579), FRAC_CONST(0.909327614967767) }, { FRAC_CONST(0.413289131967691), FRAC_CONST(0.910599853611559) }, { FRAC_CONST(0.410493505971093), FRAC_CONST(0.911863521342729) }, { FRAC_CONST(0.407694016253280), FRAC_CONST(0.913118606267154) }, { FRAC_CONST(0.404890689164118), FRAC_CONST(0.914365096571498) }, { FRAC_CONST(0.402083551089587), FRAC_CONST(0.915602980523320) }, { FRAC_CONST(0.399272628451541), FRAC_CONST(0.916832246471184) }, { FRAC_CONST(0.396457947707454), FRAC_CONST(0.918052882844770) }, { FRAC_CONST(0.393639535350173), FRAC_CONST(0.919264878154985) }, { FRAC_CONST(0.390817417907669), FRAC_CONST(0.920468220994067) }, { FRAC_CONST(0.387991621942785), FRAC_CONST(0.921662900035695) }, { FRAC_CONST(0.385162174052990), FRAC_CONST(0.922848904035094) }, { FRAC_CONST(0.382329100870125), FRAC_CONST(0.924026221829144) }, { FRAC_CONST(0.379492429060153), FRAC_CONST(0.925194842336480) }, { FRAC_CONST(0.376652185322910), FRAC_CONST(0.926354754557603) }, { FRAC_CONST(0.373808396391851), FRAC_CONST(0.927505947574975) }, { FRAC_CONST(0.370961089033802), FRAC_CONST(0.928648410553131) }, { FRAC_CONST(0.368110290048703), FRAC_CONST(0.929782132738772) }, { FRAC_CONST(0.365256026269360), FRAC_CONST(0.930907103460875) }, { FRAC_CONST(0.362398324561191), FRAC_CONST(0.932023312130786) }, { FRAC_CONST(0.359537211821973), FRAC_CONST(0.933130748242325) }, { FRAC_CONST(0.356672714981588), FRAC_CONST(0.934229401371881) }, { FRAC_CONST(0.353804861001772), FRAC_CONST(0.935319261178512) }, { FRAC_CONST(0.350933676875858), FRAC_CONST(0.936400317404042) }, { FRAC_CONST(0.348059189628526), FRAC_CONST(0.937472559873159) }, { FRAC_CONST(0.345181426315543), FRAC_CONST(0.938535978493509) }, { FRAC_CONST(0.342300414023514), FRAC_CONST(0.939590563255789) }, { FRAC_CONST(0.339416179869623), FRAC_CONST(0.940636304233848) }, { FRAC_CONST(0.336528751001382), FRAC_CONST(0.941673191584771) }, { FRAC_CONST(0.333638154596371), FRAC_CONST(0.942701215548982) }, { FRAC_CONST(0.330744417861983), FRAC_CONST(0.943720366450326) }, { FRAC_CONST(0.327847568035171), FRAC_CONST(0.944730634696168) }, { FRAC_CONST(0.324947632382188), FRAC_CONST(0.945732010777477) }, { FRAC_CONST(0.322044638198335), FRAC_CONST(0.946724485268921) }, { FRAC_CONST(0.319138612807696), FRAC_CONST(0.947708048828952) }, { FRAC_CONST(0.316229583562890), FRAC_CONST(0.948682692199895) }, { FRAC_CONST(0.313317577844809), FRAC_CONST(0.949648406208035) }, { FRAC_CONST(0.310402623062359), FRAC_CONST(0.950605181763705) }, { FRAC_CONST(0.307484746652204), FRAC_CONST(0.951553009861369) }, { FRAC_CONST(0.304563976078509), FRAC_CONST(0.952491881579706) }, { FRAC_CONST(0.301640338832679), FRAC_CONST(0.953421788081700) }, { FRAC_CONST(0.298713862433100), FRAC_CONST(0.954342720614716) }, { FRAC_CONST(0.295784574424884), FRAC_CONST(0.955254670510587) }, { FRAC_CONST(0.292852502379605), FRAC_CONST(0.956157629185692) }, { FRAC_CONST(0.289917673895041), FRAC_CONST(0.957051588141041) }, { FRAC_CONST(0.286980116594916), FRAC_CONST(0.957936538962351) }, { FRAC_CONST(0.284039858128637), FRAC_CONST(0.958812473320129) }, { FRAC_CONST(0.281096926171038), FRAC_CONST(0.959679382969747) }, { FRAC_CONST(0.278151348422115), FRAC_CONST(0.960537259751520) }, { FRAC_CONST(0.275203152606767), FRAC_CONST(0.961386095590786) }, { FRAC_CONST(0.272252366474537), FRAC_CONST(0.962225882497979) }, { FRAC_CONST(0.269299017799346), FRAC_CONST(0.963056612568704) }, { FRAC_CONST(0.266343134379238), FRAC_CONST(0.963878277983814) }, { FRAC_CONST(0.263384744036113), FRAC_CONST(0.964690871009481) }, { FRAC_CONST(0.260423874615468), FRAC_CONST(0.965494383997270) }, { FRAC_CONST(0.257460553986133), FRAC_CONST(0.966288809384210) }, { FRAC_CONST(0.254494810040011), FRAC_CONST(0.967074139692867) }, { FRAC_CONST(0.251526670691813), FRAC_CONST(0.967850367531414) }, { FRAC_CONST(0.248556163878797), FRAC_CONST(0.968617485593698) }, { FRAC_CONST(0.245583317560504), FRAC_CONST(0.969375486659311) }, { FRAC_CONST(0.242608159718497), FRAC_CONST(0.970124363593660) }, { FRAC_CONST(0.239630718356094), FRAC_CONST(0.970864109348029) }, { FRAC_CONST(0.236651021498106), FRAC_CONST(0.971594716959650) }, { FRAC_CONST(0.233669097190577), FRAC_CONST(0.972316179551765) }, { FRAC_CONST(0.230684973500512), FRAC_CONST(0.973028490333694) }, { FRAC_CONST(0.227698678515621), FRAC_CONST(0.973731642600896) }, { FRAC_CONST(0.224710240344050), FRAC_CONST(0.974425629735035) }, { FRAC_CONST(0.221719687114115), FRAC_CONST(0.975110445204039) }, { FRAC_CONST(0.218727046974045), FRAC_CONST(0.975786082562164) }, { FRAC_CONST(0.215732348091706), FRAC_CONST(0.976452535450054) }, { FRAC_CONST(0.212735618654346), FRAC_CONST(0.977109797594801) }, { FRAC_CONST(0.209736886868323), FRAC_CONST(0.977757862810003) }, { FRAC_CONST(0.206736180958844), FRAC_CONST(0.978396724995823) }, { FRAC_CONST(0.203733529169694), FRAC_CONST(0.979026378139048) }, { FRAC_CONST(0.200728959762976), FRAC_CONST(0.979646816313141) }, { FRAC_CONST(0.197722501018842), FRAC_CONST(0.980258033678304) }, { FRAC_CONST(0.194714181235226), FRAC_CONST(0.980860024481524) }, { FRAC_CONST(0.191704028727580), FRAC_CONST(0.981452783056636) }, { FRAC_CONST(0.188692071828605), FRAC_CONST(0.982036303824369) }, { FRAC_CONST(0.185678338887988), FRAC_CONST(0.982610581292405) }, { FRAC_CONST(0.182662858272129), FRAC_CONST(0.983175610055424) }, { FRAC_CONST(0.179645658363882), FRAC_CONST(0.983731384795162) }, { FRAC_CONST(0.176626767562281), FRAC_CONST(0.984277900280454) }, { FRAC_CONST(0.173606214282275), FRAC_CONST(0.984815151367289) }, { FRAC_CONST(0.170584026954464), FRAC_CONST(0.985343132998855) }, { FRAC_CONST(0.167560234024824), FRAC_CONST(0.985861840205587) }, { FRAC_CONST(0.164534863954446), FRAC_CONST(0.986371268105216) }, { FRAC_CONST(0.161507945219266), FRAC_CONST(0.986871411902812) }, { FRAC_CONST(0.158479506309796), FRAC_CONST(0.987362266890832) }, { FRAC_CONST(0.155449575730856), FRAC_CONST(0.987843828449162) }, { FRAC_CONST(0.152418182001307), FRAC_CONST(0.988316092045160) }, { FRAC_CONST(0.149385353653780), FRAC_CONST(0.988779053233702) }, { FRAC_CONST(0.146351119234411), FRAC_CONST(0.989232707657220) }, { FRAC_CONST(0.143315507302572), FRAC_CONST(0.989677051045747) }, { FRAC_CONST(0.140278546430595), FRAC_CONST(0.990112079216954) }, { FRAC_CONST(0.137240265203516), FRAC_CONST(0.990537788076189) }, { FRAC_CONST(0.134200692218792), FRAC_CONST(0.990954173616519) }, { FRAC_CONST(0.131159856086043), FRAC_CONST(0.991361231918763) }, { FRAC_CONST(0.128117785426777), FRAC_CONST(0.991758959151536) }, { FRAC_CONST(0.125074508874121), FRAC_CONST(0.992147351571276) }, { FRAC_CONST(0.122030055072553), FRAC_CONST(0.992526405522286) }, { FRAC_CONST(0.118984452677633), FRAC_CONST(0.992896117436766) }, { FRAC_CONST(0.115937730355728), FRAC_CONST(0.993256483834846) }, { FRAC_CONST(0.112889916783750), FRAC_CONST(0.993607501324622) }, { FRAC_CONST(0.109841040648883), FRAC_CONST(0.993949166602181) }, { FRAC_CONST(0.106791130648307), FRAC_CONST(0.994281476451642) }, { FRAC_CONST(0.103740215488939), FRAC_CONST(0.994604427745176) }, { FRAC_CONST(0.100688323887154), FRAC_CONST(0.994918017443043) }, { FRAC_CONST(0.097635484568517), FRAC_CONST(0.995222242593618) }, { FRAC_CONST(0.094581726267515), FRAC_CONST(0.995517100333418) }, { FRAC_CONST(0.091527077727285), FRAC_CONST(0.995802587887129) }, { FRAC_CONST(0.088471567699341), FRAC_CONST(0.996078702567634) }, { FRAC_CONST(0.085415224943307), FRAC_CONST(0.996345441776036) }, { FRAC_CONST(0.082358078226647), FRAC_CONST(0.996602803001684) }, { FRAC_CONST(0.079300156324388), FRAC_CONST(0.996850783822197) }, { FRAC_CONST(0.076241488018856), FRAC_CONST(0.997089381903483) }, { FRAC_CONST(0.073182102099403), FRAC_CONST(0.997318594999769) }, { FRAC_CONST(0.070122027362134), FRAC_CONST(0.997538420953611) }, { FRAC_CONST(0.067061292609637), FRAC_CONST(0.997748857695926) }, { FRAC_CONST(0.063999926650714), FRAC_CONST(0.997949903246001) }, { FRAC_CONST(0.060937958300107), FRAC_CONST(0.998141555711521) }, { FRAC_CONST(0.057875416378229), FRAC_CONST(0.998323813288578) }, { FRAC_CONST(0.054812329710890), FRAC_CONST(0.998496674261695) }, { FRAC_CONST(0.051748727129028), FRAC_CONST(0.998660137003838) }, { FRAC_CONST(0.048684637468439), FRAC_CONST(0.998814199976435) }, { FRAC_CONST(0.045620089569500), FRAC_CONST(0.998958861729386) }, { FRAC_CONST(0.042555112276904), FRAC_CONST(0.999094120901079) }, { FRAC_CONST(0.039489734439384), FRAC_CONST(0.999219976218404) }, { FRAC_CONST(0.036423984909444), FRAC_CONST(0.999336426496761) }, { FRAC_CONST(0.033357892543086), FRAC_CONST(0.999443470640078) }, { FRAC_CONST(0.030291486199539), FRAC_CONST(0.999541107640813) }, { FRAC_CONST(0.027224794740988), FRAC_CONST(0.999629336579970) }, { FRAC_CONST(0.024157847032300), FRAC_CONST(0.999708156627105) }, { FRAC_CONST(0.021090671940755), FRAC_CONST(0.999777567040333) }, { FRAC_CONST(0.018023298335774), FRAC_CONST(0.999837567166337) }, { FRAC_CONST(0.014955755088644), FRAC_CONST(0.999888156440373) }, { FRAC_CONST(0.011888071072252), FRAC_CONST(0.999929334386276) }, { FRAC_CONST(0.008820275160808), FRAC_CONST(0.999961100616463) }, { FRAC_CONST(0.005752396229574), FRAC_CONST(0.999983454831938) }, { FRAC_CONST(0.002684463154596), FRAC_CONST(0.999996396822294) } }; /* 64 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_256[] = { { FRAC_CONST(0.999995293809576), FRAC_CONST(0.003067956762966) }, { FRAC_CONST(0.999618822495179), FRAC_CONST(0.027608145778966) }, { FRAC_CONST(0.998640218180265), FRAC_CONST(0.052131704680283) }, { FRAC_CONST(0.997060070339483), FRAC_CONST(0.076623861392031) }, { FRAC_CONST(0.994879330794806), FRAC_CONST(0.101069862754828) }, { FRAC_CONST(0.992099313142192), FRAC_CONST(0.125454983411546) }, { FRAC_CONST(0.988721691960324), FRAC_CONST(0.149764534677322) }, { FRAC_CONST(0.984748501801904), FRAC_CONST(0.173983873387464) }, { FRAC_CONST(0.980182135968117), FRAC_CONST(0.198098410717954) }, { FRAC_CONST(0.975025345066994), FRAC_CONST(0.222093620973204) }, { FRAC_CONST(0.969281235356549), FRAC_CONST(0.245955050335795) }, { FRAC_CONST(0.962953266873684), FRAC_CONST(0.269668325572915) }, { FRAC_CONST(0.956045251349996), FRAC_CONST(0.293219162694259) }, { FRAC_CONST(0.948561349915730), FRAC_CONST(0.316593375556166) }, { FRAC_CONST(0.940506070593268), FRAC_CONST(0.339776884406827) }, { FRAC_CONST(0.931884265581668), FRAC_CONST(0.362755724367397) }, { FRAC_CONST(0.922701128333879), FRAC_CONST(0.385516053843919) }, { FRAC_CONST(0.912962190428398), FRAC_CONST(0.408044162864979) }, { FRAC_CONST(0.902673318237259), FRAC_CONST(0.430326481340083) }, { FRAC_CONST(0.891840709392343), FRAC_CONST(0.452349587233771) }, { FRAC_CONST(0.880470889052161), FRAC_CONST(0.474100214650550) }, { FRAC_CONST(0.868570705971341), FRAC_CONST(0.495565261825773) }, { FRAC_CONST(0.856147328375194), FRAC_CONST(0.516731799017650) }, { FRAC_CONST(0.843208239641845), FRAC_CONST(0.537587076295645) }, { FRAC_CONST(0.829761233794523), FRAC_CONST(0.558118531220556) }, { FRAC_CONST(0.815814410806734), FRAC_CONST(0.578313796411656) }, { FRAC_CONST(0.801376171723140), FRAC_CONST(0.598160706996342) }, { FRAC_CONST(0.786455213599086), FRAC_CONST(0.617647307937804) }, { FRAC_CONST(0.771060524261814), FRAC_CONST(0.636761861236284) }, { FRAC_CONST(0.755201376896537), FRAC_CONST(0.655492852999615) }, { FRAC_CONST(0.738887324460615), FRAC_CONST(0.673829000378756) }, { FRAC_CONST(0.722128193929215), FRAC_CONST(0.691759258364158) }, { FRAC_CONST(0.704934080375905), FRAC_CONST(0.709272826438866) }, { FRAC_CONST(0.687315340891759), FRAC_CONST(0.726359155084346) }, { FRAC_CONST(0.669282588346636), FRAC_CONST(0.743007952135122) }, { FRAC_CONST(0.650846684996381), FRAC_CONST(0.759209188978388) }, { FRAC_CONST(0.632018735939809), FRAC_CONST(0.774953106594874) }, { FRAC_CONST(0.612810082429410), FRAC_CONST(0.790230221437310) }, { FRAC_CONST(0.593232295039800), FRAC_CONST(0.805031331142964) }, { FRAC_CONST(0.573297166698042), FRAC_CONST(0.819347520076797) }, { FRAC_CONST(0.553016705580028), FRAC_CONST(0.833170164701913) }, { FRAC_CONST(0.532403127877198), FRAC_CONST(0.846490938774052) }, { FRAC_CONST(0.511468850437971), FRAC_CONST(0.859301818357008) }, { FRAC_CONST(0.490226483288291), FRAC_CONST(0.871595086655951) }, { FRAC_CONST(0.468688822035828), FRAC_CONST(0.883363338665732) }, { FRAC_CONST(0.446868840162374), FRAC_CONST(0.894599485631383) }, { FRAC_CONST(0.424779681209109), FRAC_CONST(0.905296759318119) }, { FRAC_CONST(0.402434650859419), FRAC_CONST(0.915448716088268) }, { FRAC_CONST(0.379847208924051), FRAC_CONST(0.925049240782678) }, { FRAC_CONST(0.357030961233430), FRAC_CONST(0.934092550404259) }, { FRAC_CONST(0.333999651442009), FRAC_CONST(0.942573197601447) }, { FRAC_CONST(0.310767152749611), FRAC_CONST(0.950486073949482) }, { FRAC_CONST(0.287347459544730), FRAC_CONST(0.957826413027533) }, { FRAC_CONST(0.263754678974832), FRAC_CONST(0.964589793289813) }, { FRAC_CONST(0.240003022448742), FRAC_CONST(0.970772140728950) }, { FRAC_CONST(0.216106797076220), FRAC_CONST(0.976369731330021) }, { FRAC_CONST(0.192080397049892), FRAC_CONST(0.981379193313755) }, { FRAC_CONST(0.167938294974731), FRAC_CONST(0.985797509167567) }, { FRAC_CONST(0.143695033150295), FRAC_CONST(0.989622017463201) }, { FRAC_CONST(0.119365214810991), FRAC_CONST(0.992850414459865) }, { FRAC_CONST(0.094963495329639), FRAC_CONST(0.995480755491927) }, { FRAC_CONST(0.070504573389614), FRAC_CONST(0.997511456140303) }, { FRAC_CONST(0.046003182130915), FRAC_CONST(0.998941293186857) }, { FRAC_CONST(0.021474080275470), FRAC_CONST(0.999769405351215) } }; #ifdef LD_DEC /* 256 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1024[] = { { FRAC_CONST(0.999999705862882), FRAC_CONST(0.000766990318743) }, { FRAC_CONST(0.999976174986898), FRAC_CONST(0.006902858724730) }, { FRAC_CONST(0.999914995573113), FRAC_CONST(0.013038467241987) }, { FRAC_CONST(0.999816169924900), FRAC_CONST(0.019173584868323) }, { FRAC_CONST(0.999679701762988), FRAC_CONST(0.025307980620025) }, { FRAC_CONST(0.999505596225325), FRAC_CONST(0.031441423540560) }, { FRAC_CONST(0.999293859866888), FRAC_CONST(0.037573682709270) }, { FRAC_CONST(0.999044500659429), FRAC_CONST(0.043704527250063) }, { FRAC_CONST(0.998757527991183), FRAC_CONST(0.049833726340107) }, { FRAC_CONST(0.998432952666508), FRAC_CONST(0.055961049218521) }, { FRAC_CONST(0.998070786905482), FRAC_CONST(0.062086265195060) }, { FRAC_CONST(0.997671044343441), FRAC_CONST(0.068209143658806) }, { FRAC_CONST(0.997233740030466), FRAC_CONST(0.074329454086846) }, { FRAC_CONST(0.996758890430818), FRAC_CONST(0.080446966052950) }, { FRAC_CONST(0.996246513422316), FRAC_CONST(0.086561449236251) }, { FRAC_CONST(0.995696628295664), FRAC_CONST(0.092672673429913) }, { FRAC_CONST(0.995109255753726), FRAC_CONST(0.098780408549800) }, { FRAC_CONST(0.994484417910748), FRAC_CONST(0.104884424643135) }, { FRAC_CONST(0.993822138291520), FRAC_CONST(0.110984491897163) }, { FRAC_CONST(0.993122441830496), FRAC_CONST(0.117080380647801) }, { FRAC_CONST(0.992385354870852), FRAC_CONST(0.123171861388280) }, { FRAC_CONST(0.991610905163495), FRAC_CONST(0.129258704777796) }, { FRAC_CONST(0.990799121866020), FRAC_CONST(0.135340681650134) }, { FRAC_CONST(0.989950035541609), FRAC_CONST(0.141417563022303) }, { FRAC_CONST(0.989063678157882), FRAC_CONST(0.147489120103154) }, { FRAC_CONST(0.988140083085693), FRAC_CONST(0.153555124301993) }, { FRAC_CONST(0.987179285097874), FRAC_CONST(0.159615347237193) }, { FRAC_CONST(0.986181320367928), FRAC_CONST(0.165669560744784) }, { FRAC_CONST(0.985146226468662), FRAC_CONST(0.171717536887050) }, { FRAC_CONST(0.984074042370776), FRAC_CONST(0.177759047961107) }, { FRAC_CONST(0.982964808441396), FRAC_CONST(0.183793866507478) }, { FRAC_CONST(0.981818566442553), FRAC_CONST(0.189821765318656) }, { FRAC_CONST(0.980635359529608), FRAC_CONST(0.195842517447658) }, { FRAC_CONST(0.979415232249635), FRAC_CONST(0.201855896216568) }, { FRAC_CONST(0.978158230539735), FRAC_CONST(0.207861675225075) }, { FRAC_CONST(0.976864401725313), FRAC_CONST(0.213859628358994) }, { FRAC_CONST(0.975533794518291), FRAC_CONST(0.219849529798779) }, { FRAC_CONST(0.974166459015280), FRAC_CONST(0.225831154028026) }, { FRAC_CONST(0.972762446695689), FRAC_CONST(0.231804275841965) }, { FRAC_CONST(0.971321810419786), FRAC_CONST(0.237768670355934) }, { FRAC_CONST(0.969844604426715), FRAC_CONST(0.243724113013852) }, { FRAC_CONST(0.968330884332445), FRAC_CONST(0.249670379596669) }, { FRAC_CONST(0.966780707127683), FRAC_CONST(0.255607246230807) }, { FRAC_CONST(0.965194131175725), FRAC_CONST(0.261534489396596) }, { FRAC_CONST(0.963571216210257), FRAC_CONST(0.267451885936678) }, { FRAC_CONST(0.961912023333112), FRAC_CONST(0.273359213064419) }, { FRAC_CONST(0.960216615011963), FRAC_CONST(0.279256248372291) }, { FRAC_CONST(0.958485055077976), FRAC_CONST(0.285142769840249) }, { FRAC_CONST(0.956717408723403), FRAC_CONST(0.291018555844085) }, { FRAC_CONST(0.954913742499131), FRAC_CONST(0.296883385163778) }, { FRAC_CONST(0.953074124312172), FRAC_CONST(0.302737036991819) }, { FRAC_CONST(0.951198623423113), FRAC_CONST(0.308579290941525) }, { FRAC_CONST(0.949287310443502), FRAC_CONST(0.314409927055337) }, { FRAC_CONST(0.947340257333192), FRAC_CONST(0.320228725813100) }, { FRAC_CONST(0.945357537397632), FRAC_CONST(0.326035468140330) }, { FRAC_CONST(0.943339225285108), FRAC_CONST(0.331829935416461) }, { FRAC_CONST(0.941285396983929), FRAC_CONST(0.337611909483075) }, { FRAC_CONST(0.939196129819570), FRAC_CONST(0.343381172652115) }, { FRAC_CONST(0.937071502451759), FRAC_CONST(0.349137507714085) }, { FRAC_CONST(0.934911594871516), FRAC_CONST(0.354880697946223) }, { FRAC_CONST(0.932716488398140), FRAC_CONST(0.360610527120662) }, { FRAC_CONST(0.930486265676150), FRAC_CONST(0.366326779512574) }, { FRAC_CONST(0.928221010672169), FRAC_CONST(0.372029239908285) }, { FRAC_CONST(0.925920808671770), FRAC_CONST(0.377717693613386) }, { FRAC_CONST(0.923585746276257), FRAC_CONST(0.383391926460809) }, { FRAC_CONST(0.921215911399409), FRAC_CONST(0.389051724818894) }, { FRAC_CONST(0.918811393264170), FRAC_CONST(0.394696875599434) }, { FRAC_CONST(0.916372282399289), FRAC_CONST(0.400327166265690) }, { FRAC_CONST(0.913898670635912), FRAC_CONST(0.405942384840403) }, { FRAC_CONST(0.911390651104122), FRAC_CONST(0.411542319913765) }, { FRAC_CONST(0.908848318229439), FRAC_CONST(0.417126760651388) }, { FRAC_CONST(0.906271767729258), FRAC_CONST(0.422695496802233) }, { FRAC_CONST(0.903661096609248), FRAC_CONST(0.428248318706532) }, { FRAC_CONST(0.901016403159702), FRAC_CONST(0.433785017303679) }, { FRAC_CONST(0.898337786951834), FRAC_CONST(0.439305384140100) }, { FRAC_CONST(0.895625348834030), FRAC_CONST(0.444809211377105) }, { FRAC_CONST(0.892879190928052), FRAC_CONST(0.450296291798709) }, { FRAC_CONST(0.890099416625192), FRAC_CONST(0.455766418819435) }, { FRAC_CONST(0.887286130582383), FRAC_CONST(0.461219386492092) }, { FRAC_CONST(0.884439438718254), FRAC_CONST(0.466654989515531) }, { FRAC_CONST(0.881559448209144), FRAC_CONST(0.472073023242369) }, { FRAC_CONST(0.878646267485068), FRAC_CONST(0.477473283686698) }, { FRAC_CONST(0.875700006225635), FRAC_CONST(0.482855567531766) }, { FRAC_CONST(0.872720775355914), FRAC_CONST(0.488219672137627) }, { FRAC_CONST(0.869708687042266), FRAC_CONST(0.493565395548775) }, { FRAC_CONST(0.866663854688111), FRAC_CONST(0.498892536501745) }, { FRAC_CONST(0.863586392929668), FRAC_CONST(0.504200894432690) }, { FRAC_CONST(0.860476417631632), FRAC_CONST(0.509490269484936) }, { FRAC_CONST(0.857334045882816), FRAC_CONST(0.514760462516501) }, { FRAC_CONST(0.854159395991739), FRAC_CONST(0.520011275107596) }, { FRAC_CONST(0.850952587482176), FRAC_CONST(0.525242509568095) }, { FRAC_CONST(0.847713741088654), FRAC_CONST(0.530453968944976) }, { FRAC_CONST(0.844442978751911), FRAC_CONST(0.535645457029741) }, { FRAC_CONST(0.841140423614298), FRAC_CONST(0.540816778365797) }, { FRAC_CONST(0.837806200015151), FRAC_CONST(0.545967738255818) }, { FRAC_CONST(0.834440433486103), FRAC_CONST(0.551098142769075) }, { FRAC_CONST(0.831043250746362), FRAC_CONST(0.556207798748740) }, { FRAC_CONST(0.827614779697938), FRAC_CONST(0.561296513819151) }, { FRAC_CONST(0.824155149420829), FRAC_CONST(0.566364096393064) }, { FRAC_CONST(0.820664490168157), FRAC_CONST(0.571410355678857) }, { FRAC_CONST(0.817142933361273), FRAC_CONST(0.576435101687722) }, { FRAC_CONST(0.813590611584799), FRAC_CONST(0.581438145240810) }, { FRAC_CONST(0.810007658581641), FRAC_CONST(0.586419297976361) }, { FRAC_CONST(0.806394209247956), FRAC_CONST(0.591378372356788) }, { FRAC_CONST(0.802750399628069), FRAC_CONST(0.596315181675744) }, { FRAC_CONST(0.799076366909352), FRAC_CONST(0.601229540065149) }, { FRAC_CONST(0.795372249417061), FRAC_CONST(0.606121262502186) }, { FRAC_CONST(0.791638186609126), FRAC_CONST(0.610990164816272) }, { FRAC_CONST(0.787874319070900), FRAC_CONST(0.615836063695985) }, { FRAC_CONST(0.784080788509870), FRAC_CONST(0.620658776695972) }, { FRAC_CONST(0.780257737750317), FRAC_CONST(0.625458122243814) }, { FRAC_CONST(0.776405310727940), FRAC_CONST(0.630233919646864) }, { FRAC_CONST(0.772523652484441), FRAC_CONST(0.634985989099049) }, { FRAC_CONST(0.768612909162058), FRAC_CONST(0.639714151687640) }, { FRAC_CONST(0.764673227998067), FRAC_CONST(0.644418229399988) }, { FRAC_CONST(0.760704757319237), FRAC_CONST(0.649098045130226) }, { FRAC_CONST(0.756707646536246), FRAC_CONST(0.653753422685936) }, { FRAC_CONST(0.752682046138055), FRAC_CONST(0.658384186794785) }, { FRAC_CONST(0.748628107686245), FRAC_CONST(0.662990163111121) }, { FRAC_CONST(0.744545983809307), FRAC_CONST(0.667571178222540) }, { FRAC_CONST(0.740435828196898), FRAC_CONST(0.672127059656412) }, { FRAC_CONST(0.736297795594053), FRAC_CONST(0.676657635886375) }, { FRAC_CONST(0.732132041795361), FRAC_CONST(0.681162736338795) }, { FRAC_CONST(0.727938723639099), FRAC_CONST(0.685642191399187) }, { FRAC_CONST(0.723717999001324), FRAC_CONST(0.690095832418600) }, { FRAC_CONST(0.719470026789933), FRAC_CONST(0.694523491719966) }, { FRAC_CONST(0.715194966938680), FRAC_CONST(0.698925002604414) }, { FRAC_CONST(0.710892980401152), FRAC_CONST(0.703300199357549) }, { FRAC_CONST(0.706564229144710), FRAC_CONST(0.707648917255684) }, { FRAC_CONST(0.702208876144392), FRAC_CONST(0.711970992572050) }, { FRAC_CONST(0.697827085376777), FRAC_CONST(0.716266262582953) }, { FRAC_CONST(0.693419021813812), FRAC_CONST(0.720534565573905) }, { FRAC_CONST(0.688984851416597), FRAC_CONST(0.724775740845711) }, { FRAC_CONST(0.684524741129142), FRAC_CONST(0.728989628720519) }, { FRAC_CONST(0.680038858872079), FRAC_CONST(0.733176070547833) }, { FRAC_CONST(0.675527373536339), FRAC_CONST(0.737334908710483) }, { FRAC_CONST(0.670990454976794), FRAC_CONST(0.741465986630563) }, { FRAC_CONST(0.666428274005865), FRAC_CONST(0.745569148775325) }, { FRAC_CONST(0.661841002387087), FRAC_CONST(0.749644240663033) }, { FRAC_CONST(0.657228812828643), FRAC_CONST(0.753691108868781) }, { FRAC_CONST(0.652591878976863), FRAC_CONST(0.757709601030268) }, { FRAC_CONST(0.647930375409685), FRAC_CONST(0.761699565853535) }, { FRAC_CONST(0.643244477630086), FRAC_CONST(0.765660853118662) }, { FRAC_CONST(0.638534362059467), FRAC_CONST(0.769593313685423) }, { FRAC_CONST(0.633800206031017), FRAC_CONST(0.773496799498899) }, { FRAC_CONST(0.629042187783036), FRAC_CONST(0.777371163595056) }, { FRAC_CONST(0.624260486452221), FRAC_CONST(0.781216260106276) }, { FRAC_CONST(0.619455282066924), FRAC_CONST(0.785031944266848) }, { FRAC_CONST(0.614626755540375), FRAC_CONST(0.788818072418420) }, { FRAC_CONST(0.609775088663868), FRAC_CONST(0.792574502015408) }, { FRAC_CONST(0.604900464099920), FRAC_CONST(0.796301091630359) }, { FRAC_CONST(0.600003065375389), FRAC_CONST(0.799997700959282) }, { FRAC_CONST(0.595083076874570), FRAC_CONST(0.803664190826924) }, { FRAC_CONST(0.590140683832249), FRAC_CONST(0.807300423192014) }, { FRAC_CONST(0.585176072326730), FRAC_CONST(0.810906261152460) }, { FRAC_CONST(0.580189429272832), FRAC_CONST(0.814481568950499) }, { FRAC_CONST(0.575180942414845), FRAC_CONST(0.818026211977813) }, { FRAC_CONST(0.570150800319470), FRAC_CONST(0.821540056780598) }, { FRAC_CONST(0.565099192368714), FRAC_CONST(0.825022971064580) }, { FRAC_CONST(0.560026308752760), FRAC_CONST(0.828474823700007) }, { FRAC_CONST(0.554932340462810), FRAC_CONST(0.831895484726578) }, { FRAC_CONST(0.549817479283891), FRAC_CONST(0.835284825358337) }, { FRAC_CONST(0.544681917787635), FRAC_CONST(0.838642717988527) }, { FRAC_CONST(0.539525849325029), FRAC_CONST(0.841969036194388) }, { FRAC_CONST(0.534349468019138), FRAC_CONST(0.845263654741918) }, { FRAC_CONST(0.529152968757791), FRAC_CONST(0.848526449590593) }, { FRAC_CONST(0.523936547186249), FRAC_CONST(0.851757297898029) }, { FRAC_CONST(0.518700399699835), FRAC_CONST(0.854956078024615) }, { FRAC_CONST(0.513444723436544), FRAC_CONST(0.858122669538086) }, { FRAC_CONST(0.508169716269615), FRAC_CONST(0.861256953218062) }, { FRAC_CONST(0.502875576800087), FRAC_CONST(0.864358811060534) }, { FRAC_CONST(0.497562504349319), FRAC_CONST(0.867428126282307) }, { FRAC_CONST(0.492230698951486), FRAC_CONST(0.870464783325398) }, { FRAC_CONST(0.486880361346047), FRAC_CONST(0.873468667861385) }, { FRAC_CONST(0.481511692970190), FRAC_CONST(0.876439666795714) }, { FRAC_CONST(0.476124895951244), FRAC_CONST(0.879377668271953) }, { FRAC_CONST(0.470720173099072), FRAC_CONST(0.882282561676009) }, { FRAC_CONST(0.465297727898435), FRAC_CONST(0.885154237640285) }, { FRAC_CONST(0.459857764501330), FRAC_CONST(0.887992588047806) }, { FRAC_CONST(0.454400487719304), FRAC_CONST(0.890797506036281) }, { FRAC_CONST(0.448926103015743), FRAC_CONST(0.893568886002136) }, { FRAC_CONST(0.443434816498138), FRAC_CONST(0.896306623604480) }, { FRAC_CONST(0.437926834910323), FRAC_CONST(0.899010615769039) }, { FRAC_CONST(0.432402365624690), FRAC_CONST(0.901680760692038) }, { FRAC_CONST(0.426861616634386), FRAC_CONST(0.904316957844028) }, { FRAC_CONST(0.421304796545480), FRAC_CONST(0.906919107973678) }, { FRAC_CONST(0.415732114569105), FRAC_CONST(0.909487113111505) }, { FRAC_CONST(0.410143780513590), FRAC_CONST(0.912020876573568) }, { FRAC_CONST(0.404540004776553), FRAC_CONST(0.914520302965104) }, { FRAC_CONST(0.398920998336983), FRAC_CONST(0.916985298184123) }, { FRAC_CONST(0.393286972747297), FRAC_CONST(0.919415769424947) }, { FRAC_CONST(0.387638140125373), FRAC_CONST(0.921811625181708) }, { FRAC_CONST(0.381974713146567), FRAC_CONST(0.924172775251791) }, { FRAC_CONST(0.376296905035705), FRAC_CONST(0.926499130739231) }, { FRAC_CONST(0.370604929559052), FRAC_CONST(0.928790604058057) }, { FRAC_CONST(0.364899001016267), FRAC_CONST(0.931047108935595) }, { FRAC_CONST(0.359179334232337), FRAC_CONST(0.933268560415712) }, { FRAC_CONST(0.353446144549481), FRAC_CONST(0.935454874862015) }, { FRAC_CONST(0.347699647819051), FRAC_CONST(0.937605969961000) }, { FRAC_CONST(0.341940060393402), FRAC_CONST(0.939721764725153) }, { FRAC_CONST(0.336167599117745), FRAC_CONST(0.941802179495998) }, { FRAC_CONST(0.330382481321983), FRAC_CONST(0.943847135947093) }, { FRAC_CONST(0.324584924812532), FRAC_CONST(0.945856557086984) }, { FRAC_CONST(0.318775147864118), FRAC_CONST(0.947830367262101) }, { FRAC_CONST(0.312953369211560), FRAC_CONST(0.949768492159607) }, { FRAC_CONST(0.307119808041533), FRAC_CONST(0.951670858810194) }, { FRAC_CONST(0.301274683984318), FRAC_CONST(0.953537395590833) }, { FRAC_CONST(0.295418217105532), FRAC_CONST(0.955368032227470) }, { FRAC_CONST(0.289550627897843), FRAC_CONST(0.957162699797670) }, { FRAC_CONST(0.283672137272669), FRAC_CONST(0.958921330733213) }, { FRAC_CONST(0.277782966551858), FRAC_CONST(0.960643858822638) }, { FRAC_CONST(0.271883337459360), FRAC_CONST(0.962330219213737) }, { FRAC_CONST(0.265973472112876), FRAC_CONST(0.963980348415994) }, { FRAC_CONST(0.260053593015495), FRAC_CONST(0.965594184302977) }, { FRAC_CONST(0.254123923047321), FRAC_CONST(0.967171666114677) }, { FRAC_CONST(0.248184685457075), FRAC_CONST(0.968712734459795) }, { FRAC_CONST(0.242236103853696), FRAC_CONST(0.970217331317979) }, { FRAC_CONST(0.236278402197920), FRAC_CONST(0.971685400042009) }, { FRAC_CONST(0.230311804793846), FRAC_CONST(0.973116885359925) }, { FRAC_CONST(0.224336536280494), FRAC_CONST(0.974511733377116) }, { FRAC_CONST(0.218352821623346), FRAC_CONST(0.975869891578341) }, { FRAC_CONST(0.212360886105879), FRAC_CONST(0.977191308829712) }, { FRAC_CONST(0.206360955321076), FRAC_CONST(0.978475935380617) }, { FRAC_CONST(0.200353255162940), FRAC_CONST(0.979723722865591) }, { FRAC_CONST(0.194338011817989), FRAC_CONST(0.980934624306142) }, { FRAC_CONST(0.188315451756732), FRAC_CONST(0.982108594112514) }, { FRAC_CONST(0.182285801725153), FRAC_CONST(0.983245588085407) }, { FRAC_CONST(0.176249288736168), FRAC_CONST(0.984345563417642) }, { FRAC_CONST(0.170206140061078), FRAC_CONST(0.985408478695768) }, { FRAC_CONST(0.164156583221016), FRAC_CONST(0.986434293901627) }, { FRAC_CONST(0.158100845978377), FRAC_CONST(0.987422970413855) }, { FRAC_CONST(0.152039156328246), FRAC_CONST(0.988374471009341) }, { FRAC_CONST(0.145971742489812), FRAC_CONST(0.989288759864625) }, { FRAC_CONST(0.139898832897777), FRAC_CONST(0.990165802557248) }, { FRAC_CONST(0.133820656193755), FRAC_CONST(0.991005566067049) }, { FRAC_CONST(0.127737441217662), FRAC_CONST(0.991808018777406) }, { FRAC_CONST(0.121649416999106), FRAC_CONST(0.992573130476429) }, { FRAC_CONST(0.115556812748755), FRAC_CONST(0.993300872358093) }, { FRAC_CONST(0.109459857849718), FRAC_CONST(0.993991217023329) }, { FRAC_CONST(0.103358781848900), FRAC_CONST(0.994644138481051) }, { FRAC_CONST(0.097253814448363), FRAC_CONST(0.995259612149133) }, { FRAC_CONST(0.091145185496681), FRAC_CONST(0.995837614855342) }, { FRAC_CONST(0.085033124980280), FRAC_CONST(0.996378124838200) }, { FRAC_CONST(0.078917863014785), FRAC_CONST(0.996881121747814) }, { FRAC_CONST(0.072799629836352), FRAC_CONST(0.997346586646633) }, { FRAC_CONST(0.066678655793002), FRAC_CONST(0.997774502010168) }, { FRAC_CONST(0.060555171335948), FRAC_CONST(0.998164851727646) }, { FRAC_CONST(0.054429407010919), FRAC_CONST(0.998517621102622) }, { FRAC_CONST(0.048301593449480), FRAC_CONST(0.998832796853528) }, { FRAC_CONST(0.042171961360348), FRAC_CONST(0.999110367114175) }, { FRAC_CONST(0.036040741520706), FRAC_CONST(0.999350321434199) }, { FRAC_CONST(0.029908164767517), FRAC_CONST(0.999552650779457) }, { FRAC_CONST(0.023774461988828), FRAC_CONST(0.999717347532362) }, { FRAC_CONST(0.017639864115082), FRAC_CONST(0.999844405492175) }, { FRAC_CONST(0.011504602110423), FRAC_CONST(0.999933819875236) }, { FRAC_CONST(0.005368906963996), FRAC_CONST(0.999985587315143) } }; #endif // LD_DEC #ifdef ALLOW_SMALL_FRAMELENGTH /* 480 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1920[] = { { FRAC_CONST(0.999999916334328), FRAC_CONST(0.000409061532028) }, { FRAC_CONST(0.999993223088129), FRAC_CONST(0.003681545574400) }, { FRAC_CONST(0.999975820717897), FRAC_CONST(0.006953990190376) }, { FRAC_CONST(0.999947709409999), FRAC_CONST(0.010226360334704) }, { FRAC_CONST(0.999908889465485), FRAC_CONST(0.013498620962929) }, { FRAC_CONST(0.999859361300084), FRAC_CONST(0.016770737031768) }, { FRAC_CONST(0.999799125444203), FRAC_CONST(0.020042673499487) }, { FRAC_CONST(0.999728182542920), FRAC_CONST(0.023314395326274) }, { FRAC_CONST(0.999646533355977), FRAC_CONST(0.026585867474619) }, { FRAC_CONST(0.999554178757770), FRAC_CONST(0.029857054909681) }, { FRAC_CONST(0.999451119737344), FRAC_CONST(0.033127922599673) }, { FRAC_CONST(0.999337357398377), FRAC_CONST(0.036398435516228) }, { FRAC_CONST(0.999212892959173), FRAC_CONST(0.039668558634781) }, { FRAC_CONST(0.999077727752645), FRAC_CONST(0.042938256934941) }, { FRAC_CONST(0.998931863226306), FRAC_CONST(0.046207495400865) }, { FRAC_CONST(0.998775300942246), FRAC_CONST(0.049476239021636) }, { FRAC_CONST(0.998608042577122), FRAC_CONST(0.052744452791636) }, { FRAC_CONST(0.998430089922136), FRAC_CONST(0.056012101710921) }, { FRAC_CONST(0.998241444883019), FRAC_CONST(0.059279150785597) }, { FRAC_CONST(0.998042109480008), FRAC_CONST(0.062545565028192) }, { FRAC_CONST(0.997832085847824), FRAC_CONST(0.065811309458034) }, { FRAC_CONST(0.997611376235651), FRAC_CONST(0.069076349101624) }, { FRAC_CONST(0.997379983007114), FRAC_CONST(0.072340648993011) }, { FRAC_CONST(0.997137908640245), FRAC_CONST(0.075604174174166) }, { FRAC_CONST(0.996885155727469), FRAC_CONST(0.078866889695354) }, { FRAC_CONST(0.996621726975566), FRAC_CONST(0.082128760615515) }, { FRAC_CONST(0.996347625205645), FRAC_CONST(0.085389752002632) }, { FRAC_CONST(0.996062853353117), FRAC_CONST(0.088649828934106) }, { FRAC_CONST(0.995767414467660), FRAC_CONST(0.091908956497133) }, { FRAC_CONST(0.995461311713186), FRAC_CONST(0.095167099789075) }, { FRAC_CONST(0.995144548367810), FRAC_CONST(0.098424223917834) }, { FRAC_CONST(0.994817127823813), FRAC_CONST(0.101680294002229) }, { FRAC_CONST(0.994479053587606), FRAC_CONST(0.104935275172364) }, { FRAC_CONST(0.994130329279692), FRAC_CONST(0.108189132570007) }, { FRAC_CONST(0.993770958634630), FRAC_CONST(0.111441831348957) }, { FRAC_CONST(0.993400945500988), FRAC_CONST(0.114693336675426) }, { FRAC_CONST(0.993020293841312), FRAC_CONST(0.117943613728403) }, { FRAC_CONST(0.992629007732074), FRAC_CONST(0.121192627700032) }, { FRAC_CONST(0.992227091363634), FRAC_CONST(0.124440343795983) }, { FRAC_CONST(0.991814549040194), FRAC_CONST(0.127686727235827) }, { FRAC_CONST(0.991391385179751), FRAC_CONST(0.130931743253405) }, { FRAC_CONST(0.990957604314048), FRAC_CONST(0.134175357097202) }, { FRAC_CONST(0.990513211088533), FRAC_CONST(0.137417534030720) }, { FRAC_CONST(0.990058210262297), FRAC_CONST(0.140658239332849) }, { FRAC_CONST(0.989592606708036), FRAC_CONST(0.143897438298239) }, { FRAC_CONST(0.989116405411988), FRAC_CONST(0.147135096237670) }, { FRAC_CONST(0.988629611473887), FRAC_CONST(0.150371178478428) }, { FRAC_CONST(0.988132230106905), FRAC_CONST(0.153605650364672) }, { FRAC_CONST(0.987624266637598), FRAC_CONST(0.156838477257806) }, { FRAC_CONST(0.987105726505845), FRAC_CONST(0.160069624536852) }, { FRAC_CONST(0.986576615264794), FRAC_CONST(0.163299057598817) }, { FRAC_CONST(0.986036938580803), FRAC_CONST(0.166526741859069) }, { FRAC_CONST(0.985486702233375), FRAC_CONST(0.169752642751702) }, { FRAC_CONST(0.984925912115099), FRAC_CONST(0.172976725729910) }, { FRAC_CONST(0.984354574231587), FRAC_CONST(0.176198956266353) }, { FRAC_CONST(0.983772694701407), FRAC_CONST(0.179419299853531) }, { FRAC_CONST(0.983180279756024), FRAC_CONST(0.182637722004152) }, { FRAC_CONST(0.982577335739725), FRAC_CONST(0.185854188251500) }, { FRAC_CONST(0.981963869109555), FRAC_CONST(0.189068664149806) }, { FRAC_CONST(0.981339886435250), FRAC_CONST(0.192281115274616) }, { FRAC_CONST(0.980705394399163), FRAC_CONST(0.195491507223158) }, { FRAC_CONST(0.980060399796194), FRAC_CONST(0.198699805614714) }, { FRAC_CONST(0.979404909533716), FRAC_CONST(0.201905976090986) }, { FRAC_CONST(0.978738930631504), FRAC_CONST(0.205109984316464) }, { FRAC_CONST(0.978062470221657), FRAC_CONST(0.208311795978794) }, { FRAC_CONST(0.977375535548522), FRAC_CONST(0.211511376789145) }, { FRAC_CONST(0.976678133968618), FRAC_CONST(0.214708692482577) }, { FRAC_CONST(0.975970272950556), FRAC_CONST(0.217903708818409) }, { FRAC_CONST(0.975251960074958), FRAC_CONST(0.221096391580581) }, { FRAC_CONST(0.974523203034377), FRAC_CONST(0.224286706578026) }, { FRAC_CONST(0.973784009633218), FRAC_CONST(0.227474619645035) }, { FRAC_CONST(0.973034387787646), FRAC_CONST(0.230660096641619) }, { FRAC_CONST(0.972274345525510), FRAC_CONST(0.233843103453878) }, { FRAC_CONST(0.971503890986252), FRAC_CONST(0.237023605994367) }, { FRAC_CONST(0.970723032420820), FRAC_CONST(0.240201570202459) }, { FRAC_CONST(0.969931778191584), FRAC_CONST(0.243376962044711) }, { FRAC_CONST(0.969130136772239), FRAC_CONST(0.246549747515226) }, { FRAC_CONST(0.968318116747721), FRAC_CONST(0.249719892636022) }, { FRAC_CONST(0.967495726814114), FRAC_CONST(0.252887363457390) }, { FRAC_CONST(0.966662975778551), FRAC_CONST(0.256052126058264) }, { FRAC_CONST(0.965819872559127), FRAC_CONST(0.259214146546579) }, { FRAC_CONST(0.964966426184802), FRAC_CONST(0.262373391059634) }, { FRAC_CONST(0.964102645795299), FRAC_CONST(0.265529825764461) }, { FRAC_CONST(0.963228540641012), FRAC_CONST(0.268683416858178) }, { FRAC_CONST(0.962344120082907), FRAC_CONST(0.271834130568359) }, { FRAC_CONST(0.961449393592416), FRAC_CONST(0.274981933153391) }, { FRAC_CONST(0.960544370751341), FRAC_CONST(0.278126790902837) }, { FRAC_CONST(0.959629061251750), FRAC_CONST(0.281268670137799) }, { FRAC_CONST(0.958703474895872), FRAC_CONST(0.284407537211272) }, { FRAC_CONST(0.957767621595993), FRAC_CONST(0.287543358508512) }, { FRAC_CONST(0.956821511374351), FRAC_CONST(0.290676100447394) }, { FRAC_CONST(0.955865154363025), FRAC_CONST(0.293805729478766) }, { FRAC_CONST(0.954898560803832), FRAC_CONST(0.296932212086818) }, { FRAC_CONST(0.953921741048211), FRAC_CONST(0.300055514789431) }, { FRAC_CONST(0.952934705557117), FRAC_CONST(0.303175604138543) }, { FRAC_CONST(0.951937464900908), FRAC_CONST(0.306292446720504) }, { FRAC_CONST(0.950930029759229), FRAC_CONST(0.309406009156434) }, { FRAC_CONST(0.949912410920903), FRAC_CONST(0.312516258102580) }, { FRAC_CONST(0.948884619283808), FRAC_CONST(0.315623160250676) }, { FRAC_CONST(0.947846665854767), FRAC_CONST(0.318726682328294) }, { FRAC_CONST(0.946798561749429), FRAC_CONST(0.321826791099207) }, { FRAC_CONST(0.945740318192145), FRAC_CONST(0.324923453363742) }, { FRAC_CONST(0.944671946515855), FRAC_CONST(0.328016635959131) }, { FRAC_CONST(0.943593458161960), FRAC_CONST(0.331106305759876) }, { FRAC_CONST(0.942504864680205), FRAC_CONST(0.334192429678095) }, { FRAC_CONST(0.941406177728551), FRAC_CONST(0.337274974663880) }, { FRAC_CONST(0.940297409073052), FRAC_CONST(0.340353907705650) }, { FRAC_CONST(0.939178570587730), FRAC_CONST(0.343429195830507) }, { FRAC_CONST(0.938049674254446), FRAC_CONST(0.346500806104585) }, { FRAC_CONST(0.936910732162774), FRAC_CONST(0.349568705633406) }, { FRAC_CONST(0.935761756509868), FRAC_CONST(0.352632861562230) }, { FRAC_CONST(0.934602759600334), FRAC_CONST(0.355693241076410) }, { FRAC_CONST(0.933433753846097), FRAC_CONST(0.358749811401739) }, { FRAC_CONST(0.932254751766271), FRAC_CONST(0.361802539804806) }, { FRAC_CONST(0.931065765987021), FRAC_CONST(0.364851393593340) }, { FRAC_CONST(0.929866809241428), FRAC_CONST(0.367896340116568) }, { FRAC_CONST(0.928657894369357), FRAC_CONST(0.370937346765559) }, { FRAC_CONST(0.927439034317314), FRAC_CONST(0.373974380973575) }, { FRAC_CONST(0.926210242138311), FRAC_CONST(0.377007410216418) }, { FRAC_CONST(0.924971530991726), FRAC_CONST(0.380036402012783) }, { FRAC_CONST(0.923722914143160), FRAC_CONST(0.383061323924602) }, { FRAC_CONST(0.922464404964295), FRAC_CONST(0.386082143557389) }, { FRAC_CONST(0.921196016932755), FRAC_CONST(0.389098828560595) }, { FRAC_CONST(0.919917763631956), FRAC_CONST(0.392111346627946) }, { FRAC_CONST(0.918629658750963), FRAC_CONST(0.395119665497795) }, { FRAC_CONST(0.917331716084346), FRAC_CONST(0.398123752953462) }, { FRAC_CONST(0.916023949532027), FRAC_CONST(0.401123576823585) }, { FRAC_CONST(0.914706373099136), FRAC_CONST(0.404119104982459) }, { FRAC_CONST(0.913379000895858), FRAC_CONST(0.407110305350386) }, { FRAC_CONST(0.912041847137282), FRAC_CONST(0.410097145894012) }, { FRAC_CONST(0.910694926143251), FRAC_CONST(0.413079594626675) }, { FRAC_CONST(0.909338252338207), FRAC_CONST(0.416057619608744) }, { FRAC_CONST(0.907971840251037), FRAC_CONST(0.419031188947965) }, { FRAC_CONST(0.906595704514915), FRAC_CONST(0.422000270799800) }, { FRAC_CONST(0.905209859867151), FRAC_CONST(0.424964833367766) }, { FRAC_CONST(0.903814321149027), FRAC_CONST(0.427924844903780) }, { FRAC_CONST(0.902409103305641), FRAC_CONST(0.430880273708497) }, { FRAC_CONST(0.900994221385748), FRAC_CONST(0.433831088131649) }, { FRAC_CONST(0.899569690541596), FRAC_CONST(0.436777256572384) }, { FRAC_CONST(0.898135526028766), FRAC_CONST(0.439718747479604) }, { FRAC_CONST(0.896691743206008), FRAC_CONST(0.442655529352306) }, { FRAC_CONST(0.895238357535076), FRAC_CONST(0.445587570739915) }, { FRAC_CONST(0.893775384580563), FRAC_CONST(0.448514840242624) }, { FRAC_CONST(0.892302840009734), FRAC_CONST(0.451437306511726) }, { FRAC_CONST(0.890820739592359), FRAC_CONST(0.454354938249958) }, { FRAC_CONST(0.889329099200541), FRAC_CONST(0.457267704211826) }, { FRAC_CONST(0.887827934808551), FRAC_CONST(0.460175573203949) }, { FRAC_CONST(0.886317262492655), FRAC_CONST(0.463078514085383) }, { FRAC_CONST(0.884797098430938), FRAC_CONST(0.465976495767966) }, { FRAC_CONST(0.883267458903136), FRAC_CONST(0.468869487216642) }, { FRAC_CONST(0.881728360290461), FRAC_CONST(0.471757457449795) }, { FRAC_CONST(0.880179819075421), FRAC_CONST(0.474640375539586) }, { FRAC_CONST(0.878621851841649), FRAC_CONST(0.477518210612278) }, { FRAC_CONST(0.877054475273722), FRAC_CONST(0.480390931848569) }, { FRAC_CONST(0.875477706156984), FRAC_CONST(0.483258508483922) }, { FRAC_CONST(0.873891561377366), FRAC_CONST(0.486120909808896) }, { FRAC_CONST(0.872296057921204), FRAC_CONST(0.488978105169472) }, { FRAC_CONST(0.870691212875058), FRAC_CONST(0.491830063967383) }, { FRAC_CONST(0.869077043425529), FRAC_CONST(0.494676755660442) }, { FRAC_CONST(0.867453566859076), FRAC_CONST(0.497518149762867) }, { FRAC_CONST(0.865820800561827), FRAC_CONST(0.500354215845611) }, { FRAC_CONST(0.864178762019399), FRAC_CONST(0.503184923536685) }, { FRAC_CONST(0.862527468816704), FRAC_CONST(0.506010242521482) }, { FRAC_CONST(0.860866938637767), FRAC_CONST(0.508830142543107) }, { FRAC_CONST(0.859197189265532), FRAC_CONST(0.511644593402696) }, { FRAC_CONST(0.857518238581672), FRAC_CONST(0.514453564959741) }, { FRAC_CONST(0.855830104566401), FRAC_CONST(0.517257027132414) }, { FRAC_CONST(0.854132805298278), FRAC_CONST(0.520054949897887) }, { FRAC_CONST(0.852426358954015), FRAC_CONST(0.522847303292655) }, { FRAC_CONST(0.850710783808280), FRAC_CONST(0.525634057412856) }, { FRAC_CONST(0.848986098233506), FRAC_CONST(0.528415182414593) }, { FRAC_CONST(0.847252320699689), FRAC_CONST(0.531190648514252) }, { FRAC_CONST(0.845509469774194), FRAC_CONST(0.533960425988819) }, { FRAC_CONST(0.843757564121554), FRAC_CONST(0.536724485176205) }, { FRAC_CONST(0.841996622503271), FRAC_CONST(0.539482796475555) }, { FRAC_CONST(0.840226663777615), FRAC_CONST(0.542235330347571) }, { FRAC_CONST(0.838447706899422), FRAC_CONST(0.544982057314827) }, { FRAC_CONST(0.836659770919891), FRAC_CONST(0.547722947962084) }, { FRAC_CONST(0.834862874986380), FRAC_CONST(0.550457972936605) }, { FRAC_CONST(0.833057038342201), FRAC_CONST(0.553187102948470) }, { FRAC_CONST(0.831242280326413), FRAC_CONST(0.555910308770889) }, { FRAC_CONST(0.829418620373617), FRAC_CONST(0.558627561240515) }, { FRAC_CONST(0.827586078013746), FRAC_CONST(0.561338831257758) }, { FRAC_CONST(0.825744672871856), FRAC_CONST(0.564044089787093) }, { FRAC_CONST(0.823894424667918), FRAC_CONST(0.566743307857377) }, { FRAC_CONST(0.822035353216601), FRAC_CONST(0.569436456562150) }, { FRAC_CONST(0.820167478427070), FRAC_CONST(0.572123507059955) }, { FRAC_CONST(0.818290820302761), FRAC_CONST(0.574804430574639) }, { FRAC_CONST(0.816405398941175), FRAC_CONST(0.577479198395666) }, { FRAC_CONST(0.814511234533661), FRAC_CONST(0.580147781878420) }, { FRAC_CONST(0.812608347365198), FRAC_CONST(0.582810152444517) }, { FRAC_CONST(0.810696757814178), FRAC_CONST(0.585466281582107) }, { FRAC_CONST(0.808776486352191), FRAC_CONST(0.588116140846181) }, { FRAC_CONST(0.806847553543799), FRAC_CONST(0.590759701858874) }, { FRAC_CONST(0.804909980046325), FRAC_CONST(0.593396936309773) }, { FRAC_CONST(0.802963786609623), FRAC_CONST(0.596027815956215) }, { FRAC_CONST(0.801008994075862), FRAC_CONST(0.598652312623592) }, { FRAC_CONST(0.799045623379300), FRAC_CONST(0.601270398205654) }, { FRAC_CONST(0.797073695546059), FRAC_CONST(0.603882044664808) }, { FRAC_CONST(0.795093231693901), FRAC_CONST(0.606487224032418) }, { FRAC_CONST(0.793104253032005), FRAC_CONST(0.609085908409106) }, { FRAC_CONST(0.791106780860733), FRAC_CONST(0.611678069965050) }, { FRAC_CONST(0.789100836571407), FRAC_CONST(0.614263680940283) }, { FRAC_CONST(0.787086441646080), FRAC_CONST(0.616842713644988) }, { FRAC_CONST(0.785063617657302), FRAC_CONST(0.619415140459796) }, { FRAC_CONST(0.783032386267894), FRAC_CONST(0.621980933836084) }, { FRAC_CONST(0.780992769230711), FRAC_CONST(0.624540066296266) }, { FRAC_CONST(0.778944788388414), FRAC_CONST(0.627092510434089) }, { FRAC_CONST(0.776888465673232), FRAC_CONST(0.629638238914927) }, { FRAC_CONST(0.774823823106730), FRAC_CONST(0.632177224476073) }, { FRAC_CONST(0.772750882799570), FRAC_CONST(0.634709439927031) }, { FRAC_CONST(0.770669666951277), FRAC_CONST(0.637234858149809) }, { FRAC_CONST(0.768580197850002), FRAC_CONST(0.639753452099206) }, { FRAC_CONST(0.766482497872280), FRAC_CONST(0.642265194803105) }, { FRAC_CONST(0.764376589482793), FRAC_CONST(0.644770059362758) }, { FRAC_CONST(0.762262495234126), FRAC_CONST(0.647268018953079) }, { FRAC_CONST(0.760140237766532), FRAC_CONST(0.649759046822928) }, { FRAC_CONST(0.758009839807683), FRAC_CONST(0.652243116295397) }, { FRAC_CONST(0.755871324172429), FRAC_CONST(0.654720200768098) }, { FRAC_CONST(0.753724713762555), FRAC_CONST(0.657190273713446) }, { FRAC_CONST(0.751570031566534), FRAC_CONST(0.659653308678945) }, { FRAC_CONST(0.749407300659280), FRAC_CONST(0.662109279287469) }, { FRAC_CONST(0.747236544201905), FRAC_CONST(0.664558159237545) }, { FRAC_CONST(0.745057785441466), FRAC_CONST(0.666999922303638) }, { FRAC_CONST(0.742871047710719), FRAC_CONST(0.669434542336425) }, { FRAC_CONST(0.740676354427868), FRAC_CONST(0.671861993263083) }, { FRAC_CONST(0.738473729096316), FRAC_CONST(0.674282249087562) }, { FRAC_CONST(0.736263195304409), FRAC_CONST(0.676695283890867) }, { FRAC_CONST(0.734044776725190), FRAC_CONST(0.679101071831334) }, { FRAC_CONST(0.731818497116138), FRAC_CONST(0.681499587144906) }, { FRAC_CONST(0.729584380318920), FRAC_CONST(0.683890804145412) }, { FRAC_CONST(0.727342450259131), FRAC_CONST(0.686274697224838) }, { FRAC_CONST(0.725092730946042), FRAC_CONST(0.688651240853606) }, { FRAC_CONST(0.722835246472338), FRAC_CONST(0.691020409580841) }, { FRAC_CONST(0.720570021013866), FRAC_CONST(0.693382178034651) }, { FRAC_CONST(0.718297078829369), FRAC_CONST(0.695736520922392) }, { FRAC_CONST(0.716016444260233), FRAC_CONST(0.698083413030944) }, { FRAC_CONST(0.713728141730222), FRAC_CONST(0.700422829226978) }, { FRAC_CONST(0.711432195745216), FRAC_CONST(0.702754744457225) }, { FRAC_CONST(0.709128630892954), FRAC_CONST(0.705079133748748) }, { FRAC_CONST(0.706817471842764), FRAC_CONST(0.707395972209203) }, { FRAC_CONST(0.704498743345302), FRAC_CONST(0.709705235027113) }, { FRAC_CONST(0.702172470232289), FRAC_CONST(0.712006897472128) }, { FRAC_CONST(0.699838677416240), FRAC_CONST(0.714300934895292) }, { FRAC_CONST(0.697497389890200), FRAC_CONST(0.716587322729308) }, { FRAC_CONST(0.695148632727480), FRAC_CONST(0.718866036488799) }, { FRAC_CONST(0.692792431081381), FRAC_CONST(0.721137051770570) }, { FRAC_CONST(0.690428810184929), FRAC_CONST(0.723400344253874) }, { FRAC_CONST(0.688057795350606), FRAC_CONST(0.725655889700665) }, { FRAC_CONST(0.685679411970075), FRAC_CONST(0.727903663955865) }, { FRAC_CONST(0.683293685513912), FRAC_CONST(0.730143642947616) }, { FRAC_CONST(0.680900641531330), FRAC_CONST(0.732375802687543) }, { FRAC_CONST(0.678500305649909), FRAC_CONST(0.734600119271009) }, { FRAC_CONST(0.676092703575316), FRAC_CONST(0.736816568877370) }, { FRAC_CONST(0.673677861091036), FRAC_CONST(0.739025127770231) }, { FRAC_CONST(0.671255804058092), FRAC_CONST(0.741225772297702) }, { FRAC_CONST(0.668826558414768), FRAC_CONST(0.743418478892647) }, { FRAC_CONST(0.666390150176334), FRAC_CONST(0.745603224072940) }, { FRAC_CONST(0.663946605434765), FRAC_CONST(0.747779984441716) }, { FRAC_CONST(0.661495950358462), FRAC_CONST(0.749948736687619) }, { FRAC_CONST(0.659038211191971), FRAC_CONST(0.752109457585056) }, { FRAC_CONST(0.656573414255705), FRAC_CONST(0.754262123994441) }, { FRAC_CONST(0.654101585945659), FRAC_CONST(0.756406712862448) }, { FRAC_CONST(0.651622752733128), FRAC_CONST(0.758543201222251) }, { FRAC_CONST(0.649136941164425), FRAC_CONST(0.760671566193777) }, { FRAC_CONST(0.646644177860593), FRAC_CONST(0.762791784983948) }, { FRAC_CONST(0.644144489517126), FRAC_CONST(0.764903834886923) }, { FRAC_CONST(0.641637902903677), FRAC_CONST(0.767007693284345) }, { FRAC_CONST(0.639124444863776), FRAC_CONST(0.769103337645580) }, { FRAC_CONST(0.636604142314538), FRAC_CONST(0.771190745527961) }, { FRAC_CONST(0.634077022246379), FRAC_CONST(0.773269894577026) }, { FRAC_CONST(0.631543111722725), FRAC_CONST(0.775340762526760) }, { FRAC_CONST(0.629002437879721), FRAC_CONST(0.777403327199831) }, { FRAC_CONST(0.626455027925944), FRAC_CONST(0.779457566507828) }, { FRAC_CONST(0.623900909142107), FRAC_CONST(0.781503458451498) }, { FRAC_CONST(0.621340108880771), FRAC_CONST(0.783540981120982) }, { FRAC_CONST(0.618772654566049), FRAC_CONST(0.785570112696050) }, { FRAC_CONST(0.616198573693314), FRAC_CONST(0.787590831446332) }, { FRAC_CONST(0.613617893828905), FRAC_CONST(0.789603115731555) }, { FRAC_CONST(0.611030642609828), FRAC_CONST(0.791606944001769) }, { FRAC_CONST(0.608436847743468), FRAC_CONST(0.793602294797585) }, { FRAC_CONST(0.605836537007281), FRAC_CONST(0.795589146750397) }, { FRAC_CONST(0.603229738248508), FRAC_CONST(0.797567478582619) }, { FRAC_CONST(0.600616479383869), FRAC_CONST(0.799537269107905) }, { FRAC_CONST(0.597996788399267), FRAC_CONST(0.801498497231381) }, { FRAC_CONST(0.595370693349487), FRAC_CONST(0.803451141949871) }, { FRAC_CONST(0.592738222357898), FRAC_CONST(0.805395182352117) }, { FRAC_CONST(0.590099403616149), FRAC_CONST(0.807330597619008) }, { FRAC_CONST(0.587454265383869), FRAC_CONST(0.809257367023803) }, { FRAC_CONST(0.584802835988364), FRAC_CONST(0.811175469932349) }, { FRAC_CONST(0.582145143824311), FRAC_CONST(0.813084885803304) }, { FRAC_CONST(0.579481217353460), FRAC_CONST(0.814985594188359) }, { FRAC_CONST(0.576811085104321), FRAC_CONST(0.816877574732454) }, { FRAC_CONST(0.574134775671867), FRAC_CONST(0.818760807173997) }, { FRAC_CONST(0.571452317717222), FRAC_CONST(0.820635271345081) }, { FRAC_CONST(0.568763739967354), FRAC_CONST(0.822500947171703) }, { FRAC_CONST(0.566069071214772), FRAC_CONST(0.824357814673971) }, { FRAC_CONST(0.563368340317214), FRAC_CONST(0.826205853966327) }, { FRAC_CONST(0.560661576197336), FRAC_CONST(0.828045045257756) }, { FRAC_CONST(0.557948807842409), FRAC_CONST(0.829875368851995) }, { FRAC_CONST(0.555230064304002), FRAC_CONST(0.831696805147750) }, { FRAC_CONST(0.552505374697674), FRAC_CONST(0.833509334638900) }, { FRAC_CONST(0.549774768202663), FRAC_CONST(0.835312937914713) }, { FRAC_CONST(0.547038274061568), FRAC_CONST(0.837107595660044) }, { FRAC_CONST(0.544295921580046), FRAC_CONST(0.838893288655553) }, { FRAC_CONST(0.541547740126486), FRAC_CONST(0.840669997777901) }, { FRAC_CONST(0.538793759131706), FRAC_CONST(0.842437703999961) }, { FRAC_CONST(0.536034008088628), FRAC_CONST(0.844196388391019) }, { FRAC_CONST(0.533268516551970), FRAC_CONST(0.845946032116980) }, { FRAC_CONST(0.530497314137923), FRAC_CONST(0.847686616440563) }, { FRAC_CONST(0.527720430523840), FRAC_CONST(0.849418122721510) }, { FRAC_CONST(0.524937895447912), FRAC_CONST(0.851140532416778) }, { FRAC_CONST(0.522149738708856), FRAC_CONST(0.852853827080745) }, { FRAC_CONST(0.519355990165590), FRAC_CONST(0.854557988365401) }, { FRAC_CONST(0.516556679736915), FRAC_CONST(0.856252998020546) }, { FRAC_CONST(0.513751837401199), FRAC_CONST(0.857938837893991) }, { FRAC_CONST(0.510941493196049), FRAC_CONST(0.859615489931744) }, { FRAC_CONST(0.508125677217994), FRAC_CONST(0.861282936178208) }, { FRAC_CONST(0.505304419622159), FRAC_CONST(0.862941158776375) }, { FRAC_CONST(0.502477750621949), FRAC_CONST(0.864590139968012) }, { FRAC_CONST(0.499645700488717), FRAC_CONST(0.866229862093855) }, { FRAC_CONST(0.496808299551444), FRAC_CONST(0.867860307593799) }, { FRAC_CONST(0.493965578196415), FRAC_CONST(0.869481459007080) }, { FRAC_CONST(0.491117566866892), FRAC_CONST(0.871093298972471) }, { FRAC_CONST(0.488264296062789), FRAC_CONST(0.872695810228461) }, { FRAC_CONST(0.485405796340343), FRAC_CONST(0.874288975613440) }, { FRAC_CONST(0.482542098311789), FRAC_CONST(0.875872778065888) }, { FRAC_CONST(0.479673232645033), FRAC_CONST(0.877447200624553) }, { FRAC_CONST(0.476799230063322), FRAC_CONST(0.879012226428633) }, { FRAC_CONST(0.473920121344914), FRAC_CONST(0.880567838717962) }, { FRAC_CONST(0.471035937322751), FRAC_CONST(0.882114020833179) }, { FRAC_CONST(0.468146708884125), FRAC_CONST(0.883650756215917) }, { FRAC_CONST(0.465252466970353), FRAC_CONST(0.885178028408975) }, { FRAC_CONST(0.462353242576441), FRAC_CONST(0.886695821056495) }, { FRAC_CONST(0.459449066750752), FRAC_CONST(0.888204117904136) }, { FRAC_CONST(0.456539970594675), FRAC_CONST(0.889702902799251) }, { FRAC_CONST(0.453625985262295), FRAC_CONST(0.891192159691058) }, { FRAC_CONST(0.450707141960053), FRAC_CONST(0.892671872630812) }, { FRAC_CONST(0.447783471946415), FRAC_CONST(0.894142025771977) }, { FRAC_CONST(0.444855006531538), FRAC_CONST(0.895602603370393) }, { FRAC_CONST(0.441921777076935), FRAC_CONST(0.897053589784447) }, { FRAC_CONST(0.438983814995137), FRAC_CONST(0.898494969475242) }, { FRAC_CONST(0.436041151749356), FRAC_CONST(0.899926727006758) }, { FRAC_CONST(0.433093818853152), FRAC_CONST(0.901348847046022) }, { FRAC_CONST(0.430141847870093), FRAC_CONST(0.902761314363272) }, { FRAC_CONST(0.427185270413416), FRAC_CONST(0.904164113832116) }, { FRAC_CONST(0.424224118145690), FRAC_CONST(0.905557230429701) }, { FRAC_CONST(0.421258422778478), FRAC_CONST(0.906940649236866) }, { FRAC_CONST(0.418288216071994), FRAC_CONST(0.908314355438308) }, { FRAC_CONST(0.415313529834766), FRAC_CONST(0.909678334322736) }, { FRAC_CONST(0.412334395923293), FRAC_CONST(0.911032571283032) }, { FRAC_CONST(0.409350846241706), FRAC_CONST(0.912377051816407) }, { FRAC_CONST(0.406362912741425), FRAC_CONST(0.913711761524555) }, { FRAC_CONST(0.403370627420818), FRAC_CONST(0.915036686113806) }, { FRAC_CONST(0.400374022324857), FRAC_CONST(0.916351811395282) }, { FRAC_CONST(0.397373129544774), FRAC_CONST(0.917657123285050) }, { FRAC_CONST(0.394367981217720), FRAC_CONST(0.918952607804266) }, { FRAC_CONST(0.391358609526420), FRAC_CONST(0.920238251079332) }, { FRAC_CONST(0.388345046698826), FRAC_CONST(0.921514039342042) }, { FRAC_CONST(0.385327325007776), FRAC_CONST(0.922779958929729) }, { FRAC_CONST(0.382305476770645), FRAC_CONST(0.924035996285410) }, { FRAC_CONST(0.379279534348999), FRAC_CONST(0.925282137957935) }, { FRAC_CONST(0.376249530148250), FRAC_CONST(0.926518370602127) }, { FRAC_CONST(0.373215496617310), FRAC_CONST(0.927744680978929) }, { FRAC_CONST(0.370177466248239), FRAC_CONST(0.928961055955541) }, { FRAC_CONST(0.367135471575903), FRAC_CONST(0.930167482505564) }, { FRAC_CONST(0.364089545177621), FRAC_CONST(0.931363947709140) }, { FRAC_CONST(0.361039719672816), FRAC_CONST(0.932550438753087) }, { FRAC_CONST(0.357986027722671), FRAC_CONST(0.933726942931039) }, { FRAC_CONST(0.354928502029772), FRAC_CONST(0.934893447643582) }, { FRAC_CONST(0.351867175337763), FRAC_CONST(0.936049940398387) }, { FRAC_CONST(0.348802080430994), FRAC_CONST(0.937196408810347) }, { FRAC_CONST(0.345733250134169), FRAC_CONST(0.938332840601705) }, { FRAC_CONST(0.342660717311994), FRAC_CONST(0.939459223602190) }, { FRAC_CONST(0.339584514868829), FRAC_CONST(0.940575545749145) }, { FRAC_CONST(0.336504675748328), FRAC_CONST(0.941681795087657) }, { FRAC_CONST(0.333421232933097), FRAC_CONST(0.942777959770684) }, { FRAC_CONST(0.330334219444328), FRAC_CONST(0.943864028059183) }, { FRAC_CONST(0.327243668341457), FRAC_CONST(0.944939988322235) }, { FRAC_CONST(0.324149612721804), FRAC_CONST(0.946005829037171) }, { FRAC_CONST(0.321052085720218), FRAC_CONST(0.947061538789691) }, { FRAC_CONST(0.317951120508725), FRAC_CONST(0.948107106273994) }, { FRAC_CONST(0.314846750296171), FRAC_CONST(0.949142520292891) }, { FRAC_CONST(0.311739008327867), FRAC_CONST(0.950167769757930) }, { FRAC_CONST(0.308627927885232), FRAC_CONST(0.951182843689513) }, { FRAC_CONST(0.305513542285440), FRAC_CONST(0.952187731217013) }, { FRAC_CONST(0.302395884881056), FRAC_CONST(0.953182421578893) }, { FRAC_CONST(0.299274989059689), FRAC_CONST(0.954166904122818) }, { FRAC_CONST(0.296150888243624), FRAC_CONST(0.955141168305771) }, { FRAC_CONST(0.293023615889471), FRAC_CONST(0.956105203694164) }, { FRAC_CONST(0.289893205487806), FRAC_CONST(0.957058999963955) }, { FRAC_CONST(0.286759690562807), FRAC_CONST(0.958002546900750) }, { FRAC_CONST(0.283623104671904), FRAC_CONST(0.958935834399920) }, { FRAC_CONST(0.280483481405410), FRAC_CONST(0.959858852466706) }, { FRAC_CONST(0.277340854386169), FRAC_CONST(0.960771591216325) }, { FRAC_CONST(0.274195257269191), FRAC_CONST(0.961674040874080) }, { FRAC_CONST(0.271046723741295), FRAC_CONST(0.962566191775459) }, { FRAC_CONST(0.267895287520743), FRAC_CONST(0.963448034366243) }, { FRAC_CONST(0.264740982356888), FRAC_CONST(0.964319559202607) }, { FRAC_CONST(0.261583842029803), FRAC_CONST(0.965180756951218) }, { FRAC_CONST(0.258423900349924), FRAC_CONST(0.966031618389343) }, { FRAC_CONST(0.255261191157689), FRAC_CONST(0.966872134404937) }, { FRAC_CONST(0.252095748323171), FRAC_CONST(0.967702295996750) }, { FRAC_CONST(0.248927605745720), FRAC_CONST(0.968522094274417) }, { FRAC_CONST(0.245756797353599), FRAC_CONST(0.969331520458559) }, { FRAC_CONST(0.242583357103617), FRAC_CONST(0.970130565880871) }, { FRAC_CONST(0.239407318980770), FRAC_CONST(0.970919221984218) }, { FRAC_CONST(0.236228716997876), FRAC_CONST(0.971697480322728) }, { FRAC_CONST(0.233047585195206), FRAC_CONST(0.972465332561878) }, { FRAC_CONST(0.229863957640129), FRAC_CONST(0.973222770478587) }, { FRAC_CONST(0.226677868426735), FRAC_CONST(0.973969785961306) }, { FRAC_CONST(0.223489351675482), FRAC_CONST(0.974706371010097) }, { FRAC_CONST(0.220298441532823), FRAC_CONST(0.975432517736727) }, { FRAC_CONST(0.217105172170841), FRAC_CONST(0.976148218364747) }, { FRAC_CONST(0.213909577786886), FRAC_CONST(0.976853465229579) }, { FRAC_CONST(0.210711692603206), FRAC_CONST(0.977548250778596) }, { FRAC_CONST(0.207511550866582), FRAC_CONST(0.978232567571202) }, { FRAC_CONST(0.204309186847962), FRAC_CONST(0.978906408278914) }, { FRAC_CONST(0.201104634842092), FRAC_CONST(0.979569765685441) }, { FRAC_CONST(0.197897929167148), FRAC_CONST(0.980222632686756) }, { FRAC_CONST(0.194689104164373), FRAC_CONST(0.980865002291179) }, { FRAC_CONST(0.191478194197704), FRAC_CONST(0.981496867619447) }, { FRAC_CONST(0.188265233653407), FRAC_CONST(0.982118221904791) }, { FRAC_CONST(0.185050256939710), FRAC_CONST(0.982729058493005) }, { FRAC_CONST(0.181833298486427), FRAC_CONST(0.983329370842520) }, { FRAC_CONST(0.178614392744603), FRAC_CONST(0.983919152524473) }, { FRAC_CONST(0.175393574186129), FRAC_CONST(0.984498397222776) }, { FRAC_CONST(0.172170877303385), FRAC_CONST(0.985067098734184) }, { FRAC_CONST(0.168946336608867), FRAC_CONST(0.985625250968360) }, { FRAC_CONST(0.165719986634814), FRAC_CONST(0.986172847947943) }, { FRAC_CONST(0.162491861932842), FRAC_CONST(0.986709883808609) }, { FRAC_CONST(0.159261997073573), FRAC_CONST(0.987236352799134) }, { FRAC_CONST(0.156030426646266), FRAC_CONST(0.987752249281460) }, { FRAC_CONST(0.152797185258443), FRAC_CONST(0.988257567730749) }, { FRAC_CONST(0.149562307535523), FRAC_CONST(0.988752302735447) }, { FRAC_CONST(0.146325828120446), FRAC_CONST(0.989236448997339) }, { FRAC_CONST(0.143087781673307), FRAC_CONST(0.989710001331608) }, { FRAC_CONST(0.139848202870981), FRAC_CONST(0.990172954666889) }, { FRAC_CONST(0.136607126406757), FRAC_CONST(0.990625304045323) }, { FRAC_CONST(0.133364586989957), FRAC_CONST(0.991067044622612) }, { FRAC_CONST(0.130120619345575), FRAC_CONST(0.991498171668069) }, { FRAC_CONST(0.126875258213898), FRAC_CONST(0.991918680564670) }, { FRAC_CONST(0.123628538350136), FRAC_CONST(0.992328566809103) }, { FRAC_CONST(0.120380494524051), FRAC_CONST(0.992727826011815) }, { FRAC_CONST(0.117131161519582), FRAC_CONST(0.993116453897061) }, { FRAC_CONST(0.113880574134475), FRAC_CONST(0.993494446302948) }, { FRAC_CONST(0.110628767179910), FRAC_CONST(0.993861799181482) }, { FRAC_CONST(0.107375775480128), FRAC_CONST(0.994218508598608) }, { FRAC_CONST(0.104121633872055), FRAC_CONST(0.994564570734255) }, { FRAC_CONST(0.100866377204933), FRAC_CONST(0.994899981882376) }, { FRAC_CONST(0.097610040339947), FRAC_CONST(0.995224738450986) }, { FRAC_CONST(0.094352658149849), FRAC_CONST(0.995538836962204) }, { FRAC_CONST(0.091094265518583), FRAC_CONST(0.995842274052287) }, { FRAC_CONST(0.087834897340919), FRAC_CONST(0.996135046471667) }, { FRAC_CONST(0.084574588522070), FRAC_CONST(0.996417151084987) }, { FRAC_CONST(0.081313373977324), FRAC_CONST(0.996688584871134) }, { FRAC_CONST(0.078051288631670), FRAC_CONST(0.996949344923269) }, { FRAC_CONST(0.074788367419420), FRAC_CONST(0.997199428448862) }, { FRAC_CONST(0.071524645283840), FRAC_CONST(0.997438832769720) }, { FRAC_CONST(0.068260157176771), FRAC_CONST(0.997667555322013) }, { FRAC_CONST(0.064994938058259), FRAC_CONST(0.997885593656308) }, { FRAC_CONST(0.061729022896176), FRAC_CONST(0.998092945437590) }, { FRAC_CONST(0.058462446665851), FRAC_CONST(0.998289608445286) }, { FRAC_CONST(0.055195244349690), FRAC_CONST(0.998475580573295) }, { FRAC_CONST(0.051927450936806), FRAC_CONST(0.998650859830004) }, { FRAC_CONST(0.048659101422640), FRAC_CONST(0.998815444338313) }, { FRAC_CONST(0.045390230808591), FRAC_CONST(0.998969332335654) }, { FRAC_CONST(0.042120874101635), FRAC_CONST(0.999112522174011) }, { FRAC_CONST(0.038851066313958), FRAC_CONST(0.999245012319936) }, { FRAC_CONST(0.035580842462574), FRAC_CONST(0.999366801354564) }, { FRAC_CONST(0.032310237568951), FRAC_CONST(0.999477887973635) }, { FRAC_CONST(0.029039286658643), FRAC_CONST(0.999578270987499) }, { FRAC_CONST(0.025768024760904), FRAC_CONST(0.999667949321134) }, { FRAC_CONST(0.022496486908322), FRAC_CONST(0.999746922014158) }, { FRAC_CONST(0.019224708136438), FRAC_CONST(0.999815188220837) }, { FRAC_CONST(0.015952723483375), FRAC_CONST(0.999872747210095) }, { FRAC_CONST(0.012680567989461), FRAC_CONST(0.999919598365521) }, { FRAC_CONST(0.009408276696850), FRAC_CONST(0.999955741185376) }, { FRAC_CONST(0.006135884649155), FRAC_CONST(0.999981175282601) }, { FRAC_CONST(0.002863426891064), FRAC_CONST(0.999995900384816) } }; #ifdef LD_DEC /* 240 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_960[] = { { FRAC_CONST(0.999999665337326), FRAC_CONST(0.000818122995607) }, { FRAC_CONST(0.999972892444367), FRAC_CONST(0.007363041249780) }, { FRAC_CONST(0.999903284040864), FRAC_CONST(0.013907644095771) }, { FRAC_CONST(0.999790843108610), FRAC_CONST(0.020451651184577) }, { FRAC_CONST(0.999635574464198), FRAC_CONST(0.026994782192715) }, { FRAC_CONST(0.999437484758823), FRAC_CONST(0.033536756834230) }, { FRAC_CONST(0.999196582477986), FRAC_CONST(0.040077294872701) }, { FRAC_CONST(0.998912877941140), FRAC_CONST(0.046616116133247) }, { FRAC_CONST(0.998586383301244), FRAC_CONST(0.053152940514528) }, { FRAC_CONST(0.998217112544241), FRAC_CONST(0.059687488000744) }, { FRAC_CONST(0.997805081488460), FRAC_CONST(0.066219478673630) }, { FRAC_CONST(0.997350307783942), FRAC_CONST(0.072748632724445) }, { FRAC_CONST(0.996852810911678), FRAC_CONST(0.079274670465961) }, { FRAC_CONST(0.996312612182778), FRAC_CONST(0.085797312344440) }, { FRAC_CONST(0.995729734737558), FRAC_CONST(0.092316278951614) }, { FRAC_CONST(0.995104203544548), FRAC_CONST(0.098831291036650) }, { FRAC_CONST(0.994436045399422), FRAC_CONST(0.105342069518114) }, { FRAC_CONST(0.993725288923851), FRAC_CONST(0.111848335495926) }, { FRAC_CONST(0.992971964564277), FRAC_CONST(0.118349810263305) }, { FRAC_CONST(0.992176104590608), FRAC_CONST(0.124846215318711) }, { FRAC_CONST(0.991337743094838), FRAC_CONST(0.131337272377774) }, { FRAC_CONST(0.990456915989581), FRAC_CONST(0.137822703385212) }, { FRAC_CONST(0.989533661006540), FRAC_CONST(0.144302230526747) }, { FRAC_CONST(0.988568017694885), FRAC_CONST(0.150775576241001) }, { FRAC_CONST(0.987560027419562), FRAC_CONST(0.157242463231389) }, { FRAC_CONST(0.986509733359519), FRAC_CONST(0.163702614477995) }, { FRAC_CONST(0.985417180505858), FRAC_CONST(0.170155753249442) }, { FRAC_CONST(0.984282415659907), FRAC_CONST(0.176601603114742) }, { FRAC_CONST(0.983105487431216), FRAC_CONST(0.183039887955141) }, { FRAC_CONST(0.981886446235473), FRAC_CONST(0.189470331975943) }, { FRAC_CONST(0.980625344292344), FRAC_CONST(0.195892659718330) }, { FRAC_CONST(0.979322235623241), FRAC_CONST(0.202306596071156) }, { FRAC_CONST(0.977977176049000), FRAC_CONST(0.208711866282735) }, { FRAC_CONST(0.976590223187499), FRAC_CONST(0.215108195972610) }, { FRAC_CONST(0.975161436451181), FRAC_CONST(0.221495311143304) }, { FRAC_CONST(0.973690877044515), FRAC_CONST(0.227872938192063) }, { FRAC_CONST(0.972178607961371), FRAC_CONST(0.234240803922570) }, { FRAC_CONST(0.970624693982323), FRAC_CONST(0.240598635556650) }, { FRAC_CONST(0.969029201671875), FRAC_CONST(0.246946160745958) }, { FRAC_CONST(0.967392199375607), FRAC_CONST(0.253283107583640) }, { FRAC_CONST(0.965713757217249), FRAC_CONST(0.259609204615985) }, { FRAC_CONST(0.963993947095677), FRAC_CONST(0.265924180854051) }, { FRAC_CONST(0.962232842681832), FRAC_CONST(0.272227765785273) }, { FRAC_CONST(0.960430519415566), FRAC_CONST(0.278519689385053) }, { FRAC_CONST(0.958587054502409), FRAC_CONST(0.284799682128326) }, { FRAC_CONST(0.956702526910263), FRAC_CONST(0.291067475001103) }, { FRAC_CONST(0.954777017366017), FRAC_CONST(0.297322799511998) }, { FRAC_CONST(0.952810608352092), FRAC_CONST(0.303565387703730) }, { FRAC_CONST(0.950803384102905), FRAC_CONST(0.309794972164597) }, { FRAC_CONST(0.948755430601263), FRAC_CONST(0.316011286039934) }, { FRAC_CONST(0.946666835574676), FRAC_CONST(0.322214063043544) }, { FRAC_CONST(0.944537688491606), FRAC_CONST(0.328403037469105) }, { FRAC_CONST(0.942368080557626), FRAC_CONST(0.334577944201551) }, { FRAC_CONST(0.940158104711519), FRAC_CONST(0.340738518728429) }, { FRAC_CONST(0.937907855621296), FRAC_CONST(0.346884497151231) }, { FRAC_CONST(0.935617429680138), FRAC_CONST(0.353015616196696) }, { FRAC_CONST(0.933286925002268), FRAC_CONST(0.359131613228090) }, { FRAC_CONST(0.930916441418752), FRAC_CONST(0.365232226256457) }, { FRAC_CONST(0.928506080473216), FRAC_CONST(0.371317193951838) }, { FRAC_CONST(0.926055945417500), FRAC_CONST(0.377386255654469) }, { FRAC_CONST(0.923566141207236), FRAC_CONST(0.383439151385947) }, { FRAC_CONST(0.921036774497350), FRAC_CONST(0.389475621860365) }, { FRAC_CONST(0.918467953637492), FRAC_CONST(0.395495408495417) }, { FRAC_CONST(0.915859788667400), FRAC_CONST(0.401498253423481) }, { FRAC_CONST(0.913212391312179), FRAC_CONST(0.407483899502658) }, { FRAC_CONST(0.910525874977521), FRAC_CONST(0.413452090327791) }, { FRAC_CONST(0.907800354744844), FRAC_CONST(0.419402570241451) }, { FRAC_CONST(0.905035947366364), FRAC_CONST(0.425335084344881) }, { FRAC_CONST(0.902232771260093), FRAC_CONST(0.431249378508924) }, { FRAC_CONST(0.899390946504764), FRAC_CONST(0.437145199384900) }, { FRAC_CONST(0.896510594834693), FRAC_CONST(0.443022294415467) }, { FRAC_CONST(0.893591839634558), FRAC_CONST(0.448880411845433) }, { FRAC_CONST(0.890634805934118), FRAC_CONST(0.454719300732547) }, { FRAC_CONST(0.887639620402854), FRAC_CONST(0.460538710958240) }, { FRAC_CONST(0.884606411344546), FRAC_CONST(0.466338393238348) }, { FRAC_CONST(0.881535308691775), FRAC_CONST(0.472118099133784) }, { FRAC_CONST(0.878426444000357), FRAC_CONST(0.477877581061184) }, { FRAC_CONST(0.875279950443708), FRAC_CONST(0.483616592303511) }, { FRAC_CONST(0.872095962807140), FRAC_CONST(0.489334887020625) }, { FRAC_CONST(0.868874617482085), FRAC_CONST(0.495032220259813) }, { FRAC_CONST(0.865616052460258), FRAC_CONST(0.500708347966279) }, { FRAC_CONST(0.862320407327736), FRAC_CONST(0.506363026993605) }, { FRAC_CONST(0.858987823258990), FRAC_CONST(0.511996015114162) }, { FRAC_CONST(0.855618443010829), FRAC_CONST(0.517607071029487) }, { FRAC_CONST(0.852212410916289), FRAC_CONST(0.523195954380619) }, { FRAC_CONST(0.848769872878448), FRAC_CONST(0.528762425758396) }, { FRAC_CONST(0.845290976364179), FRAC_CONST(0.534306246713712) }, { FRAC_CONST(0.841775870397828), FRAC_CONST(0.539827179767727) }, { FRAC_CONST(0.838224705554838), FRAC_CONST(0.545324988422046) }, { FRAC_CONST(0.834637633955290), FRAC_CONST(0.550799437168844) }, { FRAC_CONST(0.831014809257393), FRAC_CONST(0.556250291500956) }, { FRAC_CONST(0.827356386650900), FRAC_CONST(0.561677317921925) }, { FRAC_CONST(0.823662522850458), FRAC_CONST(0.567080283956001) }, { FRAC_CONST(0.819933376088899), FRAC_CONST(0.572458958158102) }, { FRAC_CONST(0.816169106110459), FRAC_CONST(0.577813110123727) }, { FRAC_CONST(0.812369874163934), FRAC_CONST(0.583142510498826) }, { FRAC_CONST(0.808535842995778), FRAC_CONST(0.588446930989624) }, { FRAC_CONST(0.804667176843123), FRAC_CONST(0.593726144372402) }, { FRAC_CONST(0.800764041426753), FRAC_CONST(0.598979924503229) }, { FRAC_CONST(0.796826603943998), FRAC_CONST(0.604208046327650) }, { FRAC_CONST(0.792855033061574), FRAC_CONST(0.609410285890327) }, { FRAC_CONST(0.788849498908361), FRAC_CONST(0.614586420344631) }, { FRAC_CONST(0.784810173068109), FRAC_CONST(0.619736227962191) }, { FRAC_CONST(0.780737228572094), FRAC_CONST(0.624859488142386) }, { FRAC_CONST(0.776630839891703), FRAC_CONST(0.629955981421804) }, { FRAC_CONST(0.772491182930959), FRAC_CONST(0.635025489483633) }, { FRAC_CONST(0.768318435018988), FRAC_CONST(0.640067795167023) }, { FRAC_CONST(0.764112774902423), FRAC_CONST(0.645082682476378) }, { FRAC_CONST(0.759874382737746), FRAC_CONST(0.650069936590618) }, { FRAC_CONST(0.755603440083571), FRAC_CONST(0.655029343872374) }, { FRAC_CONST(0.751300129892866), FRAC_CONST(0.659960691877147) }, { FRAC_CONST(0.746964636505118), FRAC_CONST(0.664863769362399) }, { FRAC_CONST(0.742597145638433), FRAC_CONST(0.669738366296610) }, { FRAC_CONST(0.738197844381584), FRAC_CONST(0.674584273868271) }, { FRAC_CONST(0.733766921185995), FRAC_CONST(0.679401284494831) }, { FRAC_CONST(0.729304565857668), FRAC_CONST(0.684189191831585) }, { FRAC_CONST(0.724810969549055), FRAC_CONST(0.688947790780520) }, { FRAC_CONST(0.720286324750863), FRAC_CONST(0.693676877499095) }, { FRAC_CONST(0.715730825283819), FRAC_CONST(0.698376249408973) }, { FRAC_CONST(0.711144666290356), FRAC_CONST(0.703045705204703) }, { FRAC_CONST(0.706528044226263), FRAC_CONST(0.707685044862340) }, { FRAC_CONST(0.701881156852263), FRAC_CONST(0.712294069648014) }, { FRAC_CONST(0.697204203225545), FRAC_CONST(0.716872582126442) }, { FRAC_CONST(0.692497383691237), FRAC_CONST(0.721420386169390) }, { FRAC_CONST(0.687760899873822), FRAC_CONST(0.725937286964068) }, { FRAC_CONST(0.682994954668502), FRAC_CONST(0.730423091021479) }, { FRAC_CONST(0.678199752232508), FRAC_CONST(0.734877606184707) }, { FRAC_CONST(0.673375497976352), FRAC_CONST(0.739300641637149) }, { FRAC_CONST(0.668522398555031), FRAC_CONST(0.743692007910687) }, { FRAC_CONST(0.663640661859171), FRAC_CONST(0.748051516893805) }, { FRAC_CONST(0.658730497006124), FRAC_CONST(0.752378981839648) }, { FRAC_CONST(0.653792114331011), FRAC_CONST(0.756674217374021) }, { FRAC_CONST(0.648825725377709), FRAC_CONST(0.760937039503328) }, { FRAC_CONST(0.643831542889792), FRAC_CONST(0.765167265622459) }, { FRAC_CONST(0.638809780801414), FRAC_CONST(0.769364714522605) }, { FRAC_CONST(0.633760654228152), FRAC_CONST(0.773529206399025) }, { FRAC_CONST(0.628684379457781), FRAC_CONST(0.777660562858748) }, { FRAC_CONST(0.623581173941019), FRAC_CONST(0.781758606928213) }, { FRAC_CONST(0.618451256282204), FRAC_CONST(0.785823163060853) }, { FRAC_CONST(0.613294846229936), FRAC_CONST(0.789854057144609) }, { FRAC_CONST(0.608112164667659), FRAC_CONST(0.793851116509396) }, { FRAC_CONST(0.602903433604202), FRAC_CONST(0.797814169934493) }, { FRAC_CONST(0.597668876164268), FRAC_CONST(0.801743047655882) }, { FRAC_CONST(0.592408716578875), FRAC_CONST(0.805637581373517) }, { FRAC_CONST(0.587123180175754), FRAC_CONST(0.809497604258536) }, { FRAC_CONST(0.581812493369691), FRAC_CONST(0.813322950960406) }, { FRAC_CONST(0.576476883652835), FRAC_CONST(0.817113457614006) }, { FRAC_CONST(0.571116579584947), FRAC_CONST(0.820868961846646) }, { FRAC_CONST(0.565731810783613), FRAC_CONST(0.824589302785025) }, { FRAC_CONST(0.560322807914407), FRAC_CONST(0.828274321062119) }, { FRAC_CONST(0.554889802681009), FRAC_CONST(0.831923858824010) }, { FRAC_CONST(0.549433027815281), FRAC_CONST(0.835537759736646) }, { FRAC_CONST(0.543952717067296), FRAC_CONST(0.839115868992540) }, { FRAC_CONST(0.538449105195327), FRAC_CONST(0.842658033317402) }, { FRAC_CONST(0.532922427955790), FRAC_CONST(0.846164100976699) }, { FRAC_CONST(0.527372922093142), FRAC_CONST(0.849633921782164) }, { FRAC_CONST(0.521800825329746), FRAC_CONST(0.853067347098221) }, { FRAC_CONST(0.516206376355680), FRAC_CONST(0.856464229848356) }, { FRAC_CONST(0.510589814818519), FRAC_CONST(0.859824424521420) }, { FRAC_CONST(0.504951381313066), FRAC_CONST(0.863147787177854) }, { FRAC_CONST(0.499291317371047), FRAC_CONST(0.866434175455865) }, { FRAC_CONST(0.493609865450762), FRAC_CONST(0.869683448577516) }, { FRAC_CONST(0.487907268926702), FRAC_CONST(0.872895467354761) }, { FRAC_CONST(0.482183772079123), FRAC_CONST(0.876070094195407) }, { FRAC_CONST(0.476439620083580), FRAC_CONST(0.879207193109004) }, { FRAC_CONST(0.470675059000427), FRAC_CONST(0.882306629712678) }, { FRAC_CONST(0.464890335764274), FRAC_CONST(0.885368271236879) }, { FRAC_CONST(0.459085698173413), FRAC_CONST(0.888391986531075) }, { FRAC_CONST(0.453261394879198), FRAC_CONST(0.891377646069366) }, { FRAC_CONST(0.447417675375397), FRAC_CONST(0.894325121956035) }, { FRAC_CONST(0.441554789987504), FRAC_CONST(0.897234287931024) }, { FRAC_CONST(0.435672989862017), FRAC_CONST(0.900105019375345) }, { FRAC_CONST(0.429772526955677), FRAC_CONST(0.902937193316419) }, { FRAC_CONST(0.423853654024676), FRAC_CONST(0.905730688433339) }, { FRAC_CONST(0.417916624613831), FRAC_CONST(0.908485385062073) }, { FRAC_CONST(0.411961693045722), FRAC_CONST(0.911201165200584) }, { FRAC_CONST(0.405989114409798), FRAC_CONST(0.913877912513892) }, { FRAC_CONST(0.399999144551449), FRAC_CONST(0.916515512339049) }, { FRAC_CONST(0.393992040061048), FRAC_CONST(0.919113851690058) }, { FRAC_CONST(0.387968058262959), FRAC_CONST(0.921672819262709) }, { FRAC_CONST(0.381927457204511), FRAC_CONST(0.924192305439348) }, { FRAC_CONST(0.375870495644949), FRAC_CONST(0.926672202293573) }, { FRAC_CONST(0.369797433044349), FRAC_CONST(0.929112403594856) }, { FRAC_CONST(0.363708529552499), FRAC_CONST(0.931512804813095) }, { FRAC_CONST(0.357604045997758), FRAC_CONST(0.933873303123091) }, { FRAC_CONST(0.351484243875885), FRAC_CONST(0.936193797408954) }, { FRAC_CONST(0.345349385338836), FRAC_CONST(0.938474188268430) }, { FRAC_CONST(0.339199733183530), FRAC_CONST(0.940714378017165) }, { FRAC_CONST(0.333035550840599), FRAC_CONST(0.942914270692887) }, { FRAC_CONST(0.326857102363098), FRAC_CONST(0.945073772059514) }, { FRAC_CONST(0.320664652415198), FRAC_CONST(0.947192789611197) }, { FRAC_CONST(0.314458466260842), FRAC_CONST(0.949271232576274) }, { FRAC_CONST(0.308238809752391), FRAC_CONST(0.951309011921168) }, { FRAC_CONST(0.302005949319228), FRAC_CONST(0.953306040354194) }, { FRAC_CONST(0.295760151956351), FRAC_CONST(0.955262232329299) }, { FRAC_CONST(0.289501685212929), FRAC_CONST(0.957177504049732) }, { FRAC_CONST(0.283230817180850), FRAC_CONST(0.959051773471624) }, { FRAC_CONST(0.276947816483228), FRAC_CONST(0.960884960307514) }, { FRAC_CONST(0.270652952262902), FRAC_CONST(0.962676986029777) }, { FRAC_CONST(0.264346494170904), FRAC_CONST(0.964427773873996) }, { FRAC_CONST(0.258028712354909), FRAC_CONST(0.966137248842248) }, { FRAC_CONST(0.251699877447663), FRAC_CONST(0.967805337706313) }, { FRAC_CONST(0.245360260555389), FRAC_CONST(0.969431969010818) }, { FRAC_CONST(0.239010133246176), FRAC_CONST(0.971017073076290) }, { FRAC_CONST(0.232649767538342), FRAC_CONST(0.972560582002147) }, { FRAC_CONST(0.226279435888785), FRAC_CONST(0.974062429669605) }, { FRAC_CONST(0.219899411181310), FRAC_CONST(0.975522551744506) }, { FRAC_CONST(0.213509966714943), FRAC_CONST(0.976940885680082) }, { FRAC_CONST(0.207111376192219), FRAC_CONST(0.978317370719628) }, { FRAC_CONST(0.200703913707458), FRAC_CONST(0.979651947899104) }, { FRAC_CONST(0.194287853735029), FRAC_CONST(0.980944560049668) }, { FRAC_CONST(0.187863471117585), FRAC_CONST(0.982195151800116) }, { FRAC_CONST(0.181431041054297), FRAC_CONST(0.983403669579260) }, { FRAC_CONST(0.174990839089060), FRAC_CONST(0.984570061618221) }, { FRAC_CONST(0.168543141098691), FRAC_CONST(0.985694277952645) }, { FRAC_CONST(0.162088223281113), FRAC_CONST(0.986776270424848) }, { FRAC_CONST(0.155626362143520), FRAC_CONST(0.987815992685872) }, { FRAC_CONST(0.149157834490539), FRAC_CONST(0.988813400197476) }, { FRAC_CONST(0.142682917412363), FRAC_CONST(0.989768450234042) }, { FRAC_CONST(0.136201888272891), FRAC_CONST(0.990681101884405) }, { FRAC_CONST(0.129715024697841), FRAC_CONST(0.991551316053606) }, { FRAC_CONST(0.123222604562857), FRAC_CONST(0.992379055464567) }, { FRAC_CONST(0.116724905981611), FRAC_CONST(0.993164284659685) }, { FRAC_CONST(0.110222207293883), FRAC_CONST(0.993906970002356) }, { FRAC_CONST(0.103714787053643), FRAC_CONST(0.994607079678411) }, { FRAC_CONST(0.097202924017115), FRAC_CONST(0.995264583697482) }, { FRAC_CONST(0.090686897130838), FRAC_CONST(0.995879453894286) }, { FRAC_CONST(0.084166985519718), FRAC_CONST(0.996451663929828) }, { FRAC_CONST(0.077643468475068), FRAC_CONST(0.996981189292537) }, { FRAC_CONST(0.071116625442645), FRAC_CONST(0.997468007299307) }, { FRAC_CONST(0.064586736010684), FRAC_CONST(0.997912097096476) }, { FRAC_CONST(0.058054079897912), FRAC_CONST(0.998313439660714) }, { FRAC_CONST(0.051518936941578), FRAC_CONST(0.998672017799843) }, { FRAC_CONST(0.044981587085452), FRAC_CONST(0.998987816153567) }, { FRAC_CONST(0.038442310367847), FRAC_CONST(0.999260821194138) }, { FRAC_CONST(0.031901386909611), FRAC_CONST(0.999491021226926) }, { FRAC_CONST(0.025359096902136), FRAC_CONST(0.999678406390929) }, { FRAC_CONST(0.018815720595351), FRAC_CONST(0.999822968659191) }, { FRAC_CONST(0.012271538285720), FRAC_CONST(0.999924701839145) }, { FRAC_CONST(0.005726830304231), FRAC_CONST(0.999983601572879) } }; #endif // LD_DEC /* 60 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_240[] = { { FRAC_CONST(0.999994645401696), FRAC_CONST(0.003272486506527) }, { FRAC_CONST(0.999566308502021), FRAC_CONST(0.029448173247963) }, { FRAC_CONST(0.998452918783950), FRAC_CONST(0.055603677682425) }, { FRAC_CONST(0.996655239309180), FRAC_CONST(0.081721074133668) }, { FRAC_CONST(0.994174502117428), FRAC_CONST(0.107782463042759) }, { FRAC_CONST(0.991012407382049), FRAC_CONST(0.133769983235535) }, { FRAC_CONST(0.987171122244825), FRAC_CONST(0.159665824163761) }, { FRAC_CONST(0.982653279330712), FRAC_CONST(0.185452238111591) }, { FRAC_CONST(0.977461974943572), FRAC_CONST(0.211111552358965) }, { FRAC_CONST(0.971600766944121), FRAC_CONST(0.236626181293610) }, { FRAC_CONST(0.965073672311547), FRAC_CONST(0.261978638463337) }, { FRAC_CONST(0.957885164390477), FRAC_CONST(0.287151548560387) }, { FRAC_CONST(0.950040169825165), FRAC_CONST(0.312127659329594) }, { FRAC_CONST(0.941544065183021), FRAC_CONST(0.336889853392220) }, { FRAC_CONST(0.932402673269775), FRAC_CONST(0.361421159977355) }, { FRAC_CONST(0.922622259138823), FRAC_CONST(0.385704766552831) }, { FRAC_CONST(0.912209525797468), FRAC_CONST(0.409724030347695) }, { FRAC_CONST(0.901171609613013), FRAC_CONST(0.433462489758331) }, { FRAC_CONST(0.889516075421856), FRAC_CONST(0.456903875630421) }, { FRAC_CONST(0.877250911344924), FRAC_CONST(0.480032122409011) }, { FRAC_CONST(0.864384523313017), FRAC_CONST(0.502831379149042) }, { FRAC_CONST(0.850925729305802), FRAC_CONST(0.525286020378792) }, { FRAC_CONST(0.836883753308409), FRAC_CONST(0.547380656808797) }, { FRAC_CONST(0.822268218989775), FRAC_CONST(0.569100145878898) }, { FRAC_CONST(0.807089143107059), FRAC_CONST(0.590429602136201) }, { FRAC_CONST(0.791356928640660), FRAC_CONST(0.611354407436816) }, { FRAC_CONST(0.775082357664531), FRAC_CONST(0.631860220964409) }, { FRAC_CONST(0.758276583956687), FRAC_CONST(0.651932989058674) }, { FRAC_CONST(0.740951125354959), FRAC_CONST(0.671558954847018) }, { FRAC_CONST(0.723117855863248), FRAC_CONST(0.690724667672829) }, { FRAC_CONST(0.704788997513670), FRAC_CONST(0.709416992313883) }, { FRAC_CONST(0.685977111990193), FRAC_CONST(0.727623117984575) }, { FRAC_CONST(0.666695092019479), FRAC_CONST(0.745330567115786) }, { FRAC_CONST(0.646956152534857), FRAC_CONST(0.762527203906388) }, { FRAC_CONST(0.626773821619469), FRAC_CONST(0.779201242640517) }, { FRAC_CONST(0.606161931234795), FRAC_CONST(0.795341255764910) }, { FRAC_CONST(0.585134607740916), FRAC_CONST(0.810936181720784) }, { FRAC_CONST(0.563706262215017), FRAC_CONST(0.825975332524873) }, { FRAC_CONST(0.541891580574752), FRAC_CONST(0.840448401094438) }, { FRAC_CONST(0.519705513513249), FRAC_CONST(0.854345468311227) }, { FRAC_CONST(0.497163266252654), FRAC_CONST(0.867657009819544) }, { FRAC_CONST(0.474280288123229), FRAC_CONST(0.880373902553765) }, { FRAC_CONST(0.451072261975153), FRAC_CONST(0.892487430990834) }, { FRAC_CONST(0.427555093430282), FRAC_CONST(0.903989293123443) }, { FRAC_CONST(0.403744899981227), FRAC_CONST(0.914871606149819) }, { FRAC_CONST(0.379657999945233), FRAC_CONST(0.925126911876195) }, { FRAC_CONST(0.355310901280416), FRAC_CONST(0.934748181828292) }, { FRAC_CONST(0.330720290272038), FRAC_CONST(0.943728822068278) }, { FRAC_CONST(0.305903020096554), FRAC_CONST(0.952062677713924) }, { FRAC_CONST(0.280876099271292), FRAC_CONST(0.959744037156857) }, { FRAC_CONST(0.255656679997665), FRAC_CONST(0.966767635977008) }, { FRAC_CONST(0.230262046405902), FRAC_CONST(0.973128660550580) }, { FRAC_CONST(0.204709602709380), FRAC_CONST(0.978822751349072) }, { FRAC_CONST(0.179016861276633), FRAC_CONST(0.983846005927077) }, { FRAC_CONST(0.153201430629259), FRAC_CONST(0.988194981596825) }, { FRAC_CONST(0.127281003373913), FRAC_CONST(0.991866697787626) }, { FRAC_CONST(0.101273344076683), FRAC_CONST(0.994858638088611) }, { FRAC_CONST(0.075196277088140), FRAC_CONST(0.997168751973348) }, { FRAC_CONST(0.049067674327418), FRAC_CONST(0.998795456205172) }, { FRAC_CONST(0.022905443033697), FRAC_CONST(0.999737635922260) } }; #endif // ALLOW_SMALL_FRAMELENGTH #ifdef SSR_DEC /* 128 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_512[] = { { FRAC_CONST(0.999998823451702), FRAC_CONST(0.001533980186285) }, { FRAC_CONST(0.999904701082853), FRAC_CONST(0.013805388528060) }, { FRAC_CONST(0.999659996743959), FRAC_CONST(0.026074717829104) }, { FRAC_CONST(0.999264747286594), FRAC_CONST(0.038340120373553) }, { FRAC_CONST(0.998719012233873), FRAC_CONST(0.050599749036899) }, { FRAC_CONST(0.998022873771486), FRAC_CONST(0.062851757564161) }, { FRAC_CONST(0.997176436735326), FRAC_CONST(0.075094300847921) }, { FRAC_CONST(0.996179828595697), FRAC_CONST(0.087325535206192) }, { FRAC_CONST(0.995033199438119), FRAC_CONST(0.099543618660069) }, { FRAC_CONST(0.993736721940725), FRAC_CONST(0.111746711211127) }, { FRAC_CONST(0.992290591348257), FRAC_CONST(0.123932975118512) }, { FRAC_CONST(0.990695025442665), FRAC_CONST(0.136100575175706) }, { FRAC_CONST(0.988950264510303), FRAC_CONST(0.148247678986896) }, { FRAC_CONST(0.987056571305751), FRAC_CONST(0.160372457242928) }, { FRAC_CONST(0.985014231012240), FRAC_CONST(0.172473083996796) }, { FRAC_CONST(0.982823551198705), FRAC_CONST(0.184547736938620) }, { FRAC_CONST(0.980484861773469), FRAC_CONST(0.196594597670080) }, { FRAC_CONST(0.977998514934557), FRAC_CONST(0.208611851978263) }, { FRAC_CONST(0.975364885116657), FRAC_CONST(0.220597690108874) }, { FRAC_CONST(0.972584368934732), FRAC_CONST(0.232550307038775) }, { FRAC_CONST(0.969657385124292), FRAC_CONST(0.244467902747824) }, { FRAC_CONST(0.966584374478333), FRAC_CONST(0.256348682489943) }, { FRAC_CONST(0.963365799780954), FRAC_CONST(0.268190857063403) }, { FRAC_CONST(0.960002145737666), FRAC_CONST(0.279992643080273) }, { FRAC_CONST(0.956493918902395), FRAC_CONST(0.291752263234989) }, { FRAC_CONST(0.952841647601199), FRAC_CONST(0.303467946572011) }, { FRAC_CONST(0.949045881852701), FRAC_CONST(0.315137928752522) }, { FRAC_CONST(0.945107193285261), FRAC_CONST(0.326760452320132) }, { FRAC_CONST(0.941026175050889), FRAC_CONST(0.338333766965541) }, { FRAC_CONST(0.936803441735922), FRAC_CONST(0.349856129790135) }, { FRAC_CONST(0.932439629268462), FRAC_CONST(0.361325805568454) }, { FRAC_CONST(0.927935394822618), FRAC_CONST(0.372741067009516) }, { FRAC_CONST(0.923291416719528), FRAC_CONST(0.384100195016935) }, { FRAC_CONST(0.918508394325212), FRAC_CONST(0.395401478947816) }, { FRAC_CONST(0.913587047945251), FRAC_CONST(0.406643216870369) }, { FRAC_CONST(0.908528118716306), FRAC_CONST(0.417823715820212) }, { FRAC_CONST(0.903332368494512), FRAC_CONST(0.428941292055329) }, { FRAC_CONST(0.898000579740740), FRAC_CONST(0.439994271309633) }, { FRAC_CONST(0.892533555402765), FRAC_CONST(0.450980989045104) }, { FRAC_CONST(0.886932118794342), FRAC_CONST(0.461899790702463) }, { FRAC_CONST(0.881197113471222), FRAC_CONST(0.472749031950343) }, { FRAC_CONST(0.875329403104111), FRAC_CONST(0.483527078932919) }, { FRAC_CONST(0.869329871348607), FRAC_CONST(0.494232308515960) }, { FRAC_CONST(0.863199421712124), FRAC_CONST(0.504863108531268) }, { FRAC_CONST(0.856938977417829), FRAC_CONST(0.515417878019463) }, { FRAC_CONST(0.850549481265603), FRAC_CONST(0.525895027471085) }, { FRAC_CONST(0.844031895490066), FRAC_CONST(0.536292979065963) }, { FRAC_CONST(0.837387201615662), FRAC_CONST(0.546610166910835) }, { FRAC_CONST(0.830616400308846), FRAC_CONST(0.556845037275160) }, { FRAC_CONST(0.823720511227391), FRAC_CONST(0.566996048825109) }, { FRAC_CONST(0.816700572866828), FRAC_CONST(0.577061672855679) }, { FRAC_CONST(0.809557642404051), FRAC_CONST(0.587040393520918) }, { FRAC_CONST(0.802292795538116), FRAC_CONST(0.596930708062197) }, { FRAC_CONST(0.794907126328237), FRAC_CONST(0.606731127034524) }, { FRAC_CONST(0.787401747029031), FRAC_CONST(0.616440174530854) }, { FRAC_CONST(0.779777787923015), FRAC_CONST(0.626056388404344) }, { FRAC_CONST(0.772036397150385), FRAC_CONST(0.635578320488556) }, { FRAC_CONST(0.764178740536117), FRAC_CONST(0.645004536815544) }, { FRAC_CONST(0.756206001414395), FRAC_CONST(0.654333617831800) }, { FRAC_CONST(0.748119380450404), FRAC_CONST(0.663564158612040) }, { FRAC_CONST(0.739920095459516), FRAC_CONST(0.672694769070773) }, { FRAC_CONST(0.731609381223893), FRAC_CONST(0.681724074171650) }, { FRAC_CONST(0.723188489306527), FRAC_CONST(0.690650714134535) }, { FRAC_CONST(0.714658687862769), FRAC_CONST(0.699473344640284) }, { FRAC_CONST(0.706021261449340), FRAC_CONST(0.708190637033195) }, { FRAC_CONST(0.697277510830887), FRAC_CONST(0.716801278521100) }, { FRAC_CONST(0.688428752784091), FRAC_CONST(0.725303972373061) }, { FRAC_CONST(0.679476319899365), FRAC_CONST(0.733697438114660) }, { FRAC_CONST(0.670421560380173), FRAC_CONST(0.741980411720831) }, { FRAC_CONST(0.661265837839992), FRAC_CONST(0.750151645806215) }, { FRAC_CONST(0.652010531096960), FRAC_CONST(0.758209909813015) }, { FRAC_CONST(0.642657033966227), FRAC_CONST(0.766153990196313) }, { FRAC_CONST(0.633206755050057), FRAC_CONST(0.773982690606823) }, { FRAC_CONST(0.623661117525695), FRAC_CONST(0.781694832071059) }, { FRAC_CONST(0.614021558931038), FRAC_CONST(0.789289253168886) }, { FRAC_CONST(0.604289530948156), FRAC_CONST(0.796764810208419) }, { FRAC_CONST(0.594466499184665), FRAC_CONST(0.804120377398266) }, { FRAC_CONST(0.584553942953015), FRAC_CONST(0.811354847017064) }, { FRAC_CONST(0.574553355047716), FRAC_CONST(0.818467129580299) }, { FRAC_CONST(0.564466241520520), FRAC_CONST(0.825456154004377) }, { FRAC_CONST(0.554294121453620), FRAC_CONST(0.832320867767930) }, { FRAC_CONST(0.544038526730884), FRAC_CONST(0.839060237070313) }, { FRAC_CONST(0.533701001807153), FRAC_CONST(0.845673246987299) }, { FRAC_CONST(0.523283103475656), FRAC_CONST(0.852158901623920) }, { FRAC_CONST(0.512786400633563), FRAC_CONST(0.858516224264443) }, { FRAC_CONST(0.502212474045711), FRAC_CONST(0.864744257519462) }, { FRAC_CONST(0.491562916106550), FRAC_CONST(0.870842063470079) }, { FRAC_CONST(0.480839330600334), FRAC_CONST(0.876808723809146) }, { FRAC_CONST(0.470043332459596), FRAC_CONST(0.882643339979563) }, { FRAC_CONST(0.459176547521944), FRAC_CONST(0.888345033309596) }, { FRAC_CONST(0.448240612285220), FRAC_CONST(0.893912945145203) }, { FRAC_CONST(0.437237173661044), FRAC_CONST(0.899346236979341) }, { FRAC_CONST(0.426167888726800), FRAC_CONST(0.904644090578246) }, { FRAC_CONST(0.415034424476082), FRAC_CONST(0.909805708104652) }, { FRAC_CONST(0.403838457567654), FRAC_CONST(0.914830312237946) }, { FRAC_CONST(0.392581674072952), FRAC_CONST(0.919717146291227) }, { FRAC_CONST(0.381265769222162), FRAC_CONST(0.924465474325263) }, { FRAC_CONST(0.369892447148934), FRAC_CONST(0.929074581259316) }, { FRAC_CONST(0.358463420633737), FRAC_CONST(0.933543772978836) }, { FRAC_CONST(0.346980410845924), FRAC_CONST(0.937872376439990) }, { FRAC_CONST(0.335445147084532), FRAC_CONST(0.942059739771017) }, { FRAC_CONST(0.323859366517853), FRAC_CONST(0.946105232370403) }, { FRAC_CONST(0.312224813921825), FRAC_CONST(0.950008245001843) }, { FRAC_CONST(0.300543241417273), FRAC_CONST(0.953768189885990) }, { FRAC_CONST(0.288816408206049), FRAC_CONST(0.957384500788976) }, { FRAC_CONST(0.277046080306100), FRAC_CONST(0.960856633107680) }, { FRAC_CONST(0.265234030285512), FRAC_CONST(0.964184063951746) }, { FRAC_CONST(0.253382036995570), FRAC_CONST(0.967366292222329) }, { FRAC_CONST(0.241491885302869), FRAC_CONST(0.970402838687556) }, { FRAC_CONST(0.229565365820519), FRAC_CONST(0.973293246054698) }, { FRAC_CONST(0.217604274638484), FRAC_CONST(0.976037079039039) }, { FRAC_CONST(0.205610413053099), FRAC_CONST(0.978633924429423) }, { FRAC_CONST(0.193585587295804), FRAC_CONST(0.981083391150487) }, { FRAC_CONST(0.181531608261125), FRAC_CONST(0.983385110321551) }, { FRAC_CONST(0.169450291233968), FRAC_CONST(0.985538735312176) }, { FRAC_CONST(0.157343455616238), FRAC_CONST(0.987543941794359) }, { FRAC_CONST(0.145212924652848), FRAC_CONST(0.989400427791380) }, { FRAC_CONST(0.133060525157139), FRAC_CONST(0.991107913723277) }, { FRAC_CONST(0.120888087235777), FRAC_CONST(0.992666142448948) }, { FRAC_CONST(0.108697444013139), FRAC_CONST(0.994074879304879) }, { FRAC_CONST(0.096490431355253), FRAC_CONST(0.995333912140482) }, { FRAC_CONST(0.084268887593324), FRAC_CONST(0.996443051350043) }, { FRAC_CONST(0.072034653246889), FRAC_CONST(0.997402129901275) }, { FRAC_CONST(0.059789570746640), FRAC_CONST(0.998211003360478) }, { FRAC_CONST(0.047535484156959), FRAC_CONST(0.998869549914284) }, { FRAC_CONST(0.035274238898214), FRAC_CONST(0.999377670388003) }, { FRAC_CONST(0.023007681468839), FRAC_CONST(0.999735288260562) }, { FRAC_CONST(0.010737659167265), FRAC_CONST(0.999942349676024) } }; /* 16 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_64[] = { { FRAC_CONST(0.999924701839145), FRAC_CONST(0.012271538285720) }, { FRAC_CONST(0.993906970002356), FRAC_CONST(0.110222207293883) }, { FRAC_CONST(0.978317370719628), FRAC_CONST(0.207111376192219) }, { FRAC_CONST(0.953306040354194), FRAC_CONST(0.302005949319228) }, { FRAC_CONST(0.919113851690058), FRAC_CONST(0.393992040061048) }, { FRAC_CONST(0.876070094195407), FRAC_CONST(0.482183772079123) }, { FRAC_CONST(0.824589302785025), FRAC_CONST(0.565731810783613) }, { FRAC_CONST(0.765167265622459), FRAC_CONST(0.643831542889791) }, { FRAC_CONST(0.698376249408973), FRAC_CONST(0.715730825283819) }, { FRAC_CONST(0.624859488142386), FRAC_CONST(0.780737228572094) }, { FRAC_CONST(0.545324988422046), FRAC_CONST(0.838224705554838) }, { FRAC_CONST(0.460538710958240), FRAC_CONST(0.887639620402854) }, { FRAC_CONST(0.371317193951838), FRAC_CONST(0.928506080473215) }, { FRAC_CONST(0.278519689385053), FRAC_CONST(0.960430519415566) }, { FRAC_CONST(0.183039887955141), FRAC_CONST(0.983105487431216) }, { FRAC_CONST(0.085797312344440), FRAC_CONST(0.996312612182778) } }; #endif // SSR_DEC #else // FIXED_POINT /* 256 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_2048[] = { { FRAC_CONST(0.031249997702054), FRAC_CONST(0.000011984224612) }, { FRAC_CONST(0.031249813866531), FRAC_CONST(0.000107857810004) }, { FRAC_CONST(0.031249335895858), FRAC_CONST(0.000203730380198) }, { FRAC_CONST(0.031248563794535), FRAC_CONST(0.000299601032804) }, { FRAC_CONST(0.031247497569829), FRAC_CONST(0.000395468865451) }, { FRAC_CONST(0.031246137231775), FRAC_CONST(0.000491332975794) }, { FRAC_CONST(0.031244482793177), FRAC_CONST(0.000587192461525) }, { FRAC_CONST(0.031242534269608), FRAC_CONST(0.000683046420376) }, { FRAC_CONST(0.031240291679407), FRAC_CONST(0.000778893950134) }, { FRAC_CONST(0.031237755043684), FRAC_CONST(0.000874734148645) }, { FRAC_CONST(0.031234924386313), FRAC_CONST(0.000970566113826) }, { FRAC_CONST(0.031231799733938), FRAC_CONST(0.001066388943669) }, { FRAC_CONST(0.031228381115970), FRAC_CONST(0.001162201736253) }, { FRAC_CONST(0.031224668564585), FRAC_CONST(0.001258003589751) }, { FRAC_CONST(0.031220662114728), FRAC_CONST(0.001353793602441) }, { FRAC_CONST(0.031216361804108), FRAC_CONST(0.001449570872710) }, { FRAC_CONST(0.031211767673203), FRAC_CONST(0.001545334499065) }, { FRAC_CONST(0.031206879765253), FRAC_CONST(0.001641083580144) }, { FRAC_CONST(0.031201698126266), FRAC_CONST(0.001736817214719) }, { FRAC_CONST(0.031196222805014), FRAC_CONST(0.001832534501709) }, { FRAC_CONST(0.031190453853031), FRAC_CONST(0.001928234540186) }, { FRAC_CONST(0.031184391324617), FRAC_CONST(0.002023916429386) }, { FRAC_CONST(0.031178035276836), FRAC_CONST(0.002119579268713) }, { FRAC_CONST(0.031171385769513), FRAC_CONST(0.002215222157753) }, { FRAC_CONST(0.031164442865236), FRAC_CONST(0.002310844196278) }, { FRAC_CONST(0.031157206629353), FRAC_CONST(0.002406444484258) }, { FRAC_CONST(0.031149677129975), FRAC_CONST(0.002502022121865) }, { FRAC_CONST(0.031141854437973), FRAC_CONST(0.002597576209488) }, { FRAC_CONST(0.031133738626977), FRAC_CONST(0.002693105847734) }, { FRAC_CONST(0.031125329773375), FRAC_CONST(0.002788610137442) }, { FRAC_CONST(0.031116627956316), FRAC_CONST(0.002884088179689) }, { FRAC_CONST(0.031107633257703), FRAC_CONST(0.002979539075801) }, { FRAC_CONST(0.031098345762200), FRAC_CONST(0.003074961927355) }, { FRAC_CONST(0.031088765557222), FRAC_CONST(0.003170355836197) }, { FRAC_CONST(0.031078892732942), FRAC_CONST(0.003265719904442) }, { FRAC_CONST(0.031068727382288), FRAC_CONST(0.003361053234488) }, { FRAC_CONST(0.031058269600939), FRAC_CONST(0.003456354929021) }, { FRAC_CONST(0.031047519487329), FRAC_CONST(0.003551624091024) }, { FRAC_CONST(0.031036477142640), FRAC_CONST(0.003646859823790) }, { FRAC_CONST(0.031025142670809), FRAC_CONST(0.003742061230921) }, { FRAC_CONST(0.031013516178519), FRAC_CONST(0.003837227416347) }, { FRAC_CONST(0.031001597775203), FRAC_CONST(0.003932357484328) }, { FRAC_CONST(0.030989387573042), FRAC_CONST(0.004027450539462) }, { FRAC_CONST(0.030976885686963), FRAC_CONST(0.004122505686697) }, { FRAC_CONST(0.030964092234638), FRAC_CONST(0.004217522031340) }, { FRAC_CONST(0.030951007336485), FRAC_CONST(0.004312498679058) }, { FRAC_CONST(0.030937631115663), FRAC_CONST(0.004407434735897) }, { FRAC_CONST(0.030923963698074), FRAC_CONST(0.004502329308281) }, { FRAC_CONST(0.030910005212362), FRAC_CONST(0.004597181503027) }, { FRAC_CONST(0.030895755789908), FRAC_CONST(0.004691990427350) }, { FRAC_CONST(0.030881215564835), FRAC_CONST(0.004786755188872) }, { FRAC_CONST(0.030866384674000), FRAC_CONST(0.004881474895632) }, { FRAC_CONST(0.030851263256996), FRAC_CONST(0.004976148656090) }, { FRAC_CONST(0.030835851456154), FRAC_CONST(0.005070775579142) }, { FRAC_CONST(0.030820149416533), FRAC_CONST(0.005165354774124) }, { FRAC_CONST(0.030804157285929), FRAC_CONST(0.005259885350819) }, { FRAC_CONST(0.030787875214864), FRAC_CONST(0.005354366419469) }, { FRAC_CONST(0.030771303356593), FRAC_CONST(0.005448797090784) }, { FRAC_CONST(0.030754441867095), FRAC_CONST(0.005543176475946) }, { FRAC_CONST(0.030737290905077), FRAC_CONST(0.005637503686619) }, { FRAC_CONST(0.030719850631972), FRAC_CONST(0.005731777834961) }, { FRAC_CONST(0.030702121211932), FRAC_CONST(0.005825998033626) }, { FRAC_CONST(0.030684102811835), FRAC_CONST(0.005920163395780) }, { FRAC_CONST(0.030665795601276), FRAC_CONST(0.006014273035101) }, { FRAC_CONST(0.030647199752570), FRAC_CONST(0.006108326065793) }, { FRAC_CONST(0.030628315440748), FRAC_CONST(0.006202321602594) }, { FRAC_CONST(0.030609142843557), FRAC_CONST(0.006296258760782) }, { FRAC_CONST(0.030589682141455), FRAC_CONST(0.006390136656185) }, { FRAC_CONST(0.030569933517616), FRAC_CONST(0.006483954405188) }, { FRAC_CONST(0.030549897157919), FRAC_CONST(0.006577711124743) }, { FRAC_CONST(0.030529573250956), FRAC_CONST(0.006671405932375) }, { FRAC_CONST(0.030508961988022), FRAC_CONST(0.006765037946194) }, { FRAC_CONST(0.030488063563118), FRAC_CONST(0.006858606284900) }, { FRAC_CONST(0.030466878172949), FRAC_CONST(0.006952110067791) }, { FRAC_CONST(0.030445406016919), FRAC_CONST(0.007045548414774) }, { FRAC_CONST(0.030423647297133), FRAC_CONST(0.007138920446372) }, { FRAC_CONST(0.030401602218392), FRAC_CONST(0.007232225283733) }, { FRAC_CONST(0.030379270988192), FRAC_CONST(0.007325462048634) }, { FRAC_CONST(0.030356653816724), FRAC_CONST(0.007418629863497) }, { FRAC_CONST(0.030333750916869), FRAC_CONST(0.007511727851390) }, { FRAC_CONST(0.030310562504198), FRAC_CONST(0.007604755136040) }, { FRAC_CONST(0.030287088796968), FRAC_CONST(0.007697710841838) }, { FRAC_CONST(0.030263330016124), FRAC_CONST(0.007790594093851) }, { FRAC_CONST(0.030239286385293), FRAC_CONST(0.007883404017824) }, { FRAC_CONST(0.030214958130781), FRAC_CONST(0.007976139740197) }, { FRAC_CONST(0.030190345481576), FRAC_CONST(0.008068800388104) }, { FRAC_CONST(0.030165448669342), FRAC_CONST(0.008161385089390) }, { FRAC_CONST(0.030140267928416), FRAC_CONST(0.008253892972610) }, { FRAC_CONST(0.030114803495809), FRAC_CONST(0.008346323167047) }, { FRAC_CONST(0.030089055611203), FRAC_CONST(0.008438674802711) }, { FRAC_CONST(0.030063024516947), FRAC_CONST(0.008530947010354) }, { FRAC_CONST(0.030036710458054), FRAC_CONST(0.008623138921475) }, { FRAC_CONST(0.030010113682202), FRAC_CONST(0.008715249668328) }, { FRAC_CONST(0.029983234439732), FRAC_CONST(0.008807278383932) }, { FRAC_CONST(0.029956072983640), FRAC_CONST(0.008899224202078) }, { FRAC_CONST(0.029928629569580), FRAC_CONST(0.008991086257336) }, { FRAC_CONST(0.029900904455860), FRAC_CONST(0.009082863685067) }, { FRAC_CONST(0.029872897903441), FRAC_CONST(0.009174555621425) }, { FRAC_CONST(0.029844610175929), FRAC_CONST(0.009266161203371) }, { FRAC_CONST(0.029816041539579), FRAC_CONST(0.009357679568679) }, { FRAC_CONST(0.029787192263292), FRAC_CONST(0.009449109855944) }, { FRAC_CONST(0.029758062618606), FRAC_CONST(0.009540451204587) }, { FRAC_CONST(0.029728652879702), FRAC_CONST(0.009631702754871) }, { FRAC_CONST(0.029698963323395), FRAC_CONST(0.009722863647900) }, { FRAC_CONST(0.029668994229134), FRAC_CONST(0.009813933025633) }, { FRAC_CONST(0.029638745879000), FRAC_CONST(0.009904910030891) }, { FRAC_CONST(0.029608218557702), FRAC_CONST(0.009995793807363) }, { FRAC_CONST(0.029577412552575), FRAC_CONST(0.010086583499618) }, { FRAC_CONST(0.029546328153577), FRAC_CONST(0.010177278253107) }, { FRAC_CONST(0.029514965653285), FRAC_CONST(0.010267877214177) }, { FRAC_CONST(0.029483325346896), FRAC_CONST(0.010358379530076) }, { FRAC_CONST(0.029451407532220), FRAC_CONST(0.010448784348962) }, { FRAC_CONST(0.029419212509679), FRAC_CONST(0.010539090819911) }, { FRAC_CONST(0.029386740582307), FRAC_CONST(0.010629298092923) }, { FRAC_CONST(0.029353992055740), FRAC_CONST(0.010719405318933) }, { FRAC_CONST(0.029320967238220), FRAC_CONST(0.010809411649818) }, { FRAC_CONST(0.029287666440590), FRAC_CONST(0.010899316238403) }, { FRAC_CONST(0.029254089976290), FRAC_CONST(0.010989118238474) }, { FRAC_CONST(0.029220238161353), FRAC_CONST(0.011078816804778) }, { FRAC_CONST(0.029186111314406), FRAC_CONST(0.011168411093039) }, { FRAC_CONST(0.029151709756664), FRAC_CONST(0.011257900259961) }, { FRAC_CONST(0.029117033811927), FRAC_CONST(0.011347283463239) }, { FRAC_CONST(0.029082083806579), FRAC_CONST(0.011436559861563) }, { FRAC_CONST(0.029046860069582), FRAC_CONST(0.011525728614630) }, { FRAC_CONST(0.029011362932476), FRAC_CONST(0.011614788883150) }, { FRAC_CONST(0.028975592729373), FRAC_CONST(0.011703739828853) }, { FRAC_CONST(0.028939549796957), FRAC_CONST(0.011792580614500) }, { FRAC_CONST(0.028903234474475), FRAC_CONST(0.011881310403886) }, { FRAC_CONST(0.028866647103744), FRAC_CONST(0.011969928361855) }, { FRAC_CONST(0.028829788029135), FRAC_CONST(0.012058433654299) }, { FRAC_CONST(0.028792657597583), FRAC_CONST(0.012146825448172) }, { FRAC_CONST(0.028755256158571), FRAC_CONST(0.012235102911499) }, { FRAC_CONST(0.028717584064137), FRAC_CONST(0.012323265213377) }, { FRAC_CONST(0.028679641668864), FRAC_CONST(0.012411311523990) }, { FRAC_CONST(0.028641429329882), FRAC_CONST(0.012499241014612) }, { FRAC_CONST(0.028602947406859), FRAC_CONST(0.012587052857618) }, { FRAC_CONST(0.028564196262001), FRAC_CONST(0.012674746226488) }, { FRAC_CONST(0.028525176260050), FRAC_CONST(0.012762320295819) }, { FRAC_CONST(0.028485887768276), FRAC_CONST(0.012849774241331) }, { FRAC_CONST(0.028446331156478), FRAC_CONST(0.012937107239875) }, { FRAC_CONST(0.028406506796976), FRAC_CONST(0.013024318469437) }, { FRAC_CONST(0.028366415064615), FRAC_CONST(0.013111407109155) }, { FRAC_CONST(0.028326056336751), FRAC_CONST(0.013198372339315) }, { FRAC_CONST(0.028285430993258), FRAC_CONST(0.013285213341368) }, { FRAC_CONST(0.028244539416515), FRAC_CONST(0.013371929297933) }, { FRAC_CONST(0.028203381991411), FRAC_CONST(0.013458519392807) }, { FRAC_CONST(0.028161959105334), FRAC_CONST(0.013544982810971) }, { FRAC_CONST(0.028120271148172), FRAC_CONST(0.013631318738598) }, { FRAC_CONST(0.028078318512309), FRAC_CONST(0.013717526363062) }, { FRAC_CONST(0.028036101592619), FRAC_CONST(0.013803604872943) }, { FRAC_CONST(0.027993620786463), FRAC_CONST(0.013889553458039) }, { FRAC_CONST(0.027950876493687), FRAC_CONST(0.013975371309367) }, { FRAC_CONST(0.027907869116616), FRAC_CONST(0.014061057619178) }, { FRAC_CONST(0.027864599060052), FRAC_CONST(0.014146611580959) }, { FRAC_CONST(0.027821066731270), FRAC_CONST(0.014232032389445) }, { FRAC_CONST(0.027777272540012), FRAC_CONST(0.014317319240622) }, { FRAC_CONST(0.027733216898487), FRAC_CONST(0.014402471331737) }, { FRAC_CONST(0.027688900221361), FRAC_CONST(0.014487487861307) }, { FRAC_CONST(0.027644322925762), FRAC_CONST(0.014572368029123) }, { FRAC_CONST(0.027599485431266), FRAC_CONST(0.014657111036262) }, { FRAC_CONST(0.027554388159903), FRAC_CONST(0.014741716085090) }, { FRAC_CONST(0.027509031536144), FRAC_CONST(0.014826182379271) }, { FRAC_CONST(0.027463415986904), FRAC_CONST(0.014910509123778) }, { FRAC_CONST(0.027417541941533), FRAC_CONST(0.014994695524894) }, { FRAC_CONST(0.027371409831816), FRAC_CONST(0.015078740790225) }, { FRAC_CONST(0.027325020091965), FRAC_CONST(0.015162644128704) }, { FRAC_CONST(0.027278373158618), FRAC_CONST(0.015246404750603) }, { FRAC_CONST(0.027231469470833), FRAC_CONST(0.015330021867534) }, { FRAC_CONST(0.027184309470088), FRAC_CONST(0.015413494692460) }, { FRAC_CONST(0.027136893600268), FRAC_CONST(0.015496822439704) }, { FRAC_CONST(0.027089222307671), FRAC_CONST(0.015580004324954) }, { FRAC_CONST(0.027041296040997), FRAC_CONST(0.015663039565269) }, { FRAC_CONST(0.026993115251345), FRAC_CONST(0.015745927379091) }, { FRAC_CONST(0.026944680392213), FRAC_CONST(0.015828666986247) }, { FRAC_CONST(0.026895991919487), FRAC_CONST(0.015911257607961) }, { FRAC_CONST(0.026847050291442), FRAC_CONST(0.015993698466859) }, { FRAC_CONST(0.026797855968734), FRAC_CONST(0.016075988786976) }, { FRAC_CONST(0.026748409414401), FRAC_CONST(0.016158127793763) }, { FRAC_CONST(0.026698711093851), FRAC_CONST(0.016240114714099) }, { FRAC_CONST(0.026648761474864), FRAC_CONST(0.016321948776289) }, { FRAC_CONST(0.026598561027585), FRAC_CONST(0.016403629210082) }, { FRAC_CONST(0.026548110224519), FRAC_CONST(0.016485155246669) }, { FRAC_CONST(0.026497409540530), FRAC_CONST(0.016566526118696) }, { FRAC_CONST(0.026446459452830), FRAC_CONST(0.016647741060271) }, { FRAC_CONST(0.026395260440982), FRAC_CONST(0.016728799306966) }, { FRAC_CONST(0.026343812986890), FRAC_CONST(0.016809700095831) }, { FRAC_CONST(0.026292117574797), FRAC_CONST(0.016890442665397) }, { FRAC_CONST(0.026240174691280), FRAC_CONST(0.016971026255683) }, { FRAC_CONST(0.026187984825246), FRAC_CONST(0.017051450108208) }, { FRAC_CONST(0.026135548467924), FRAC_CONST(0.017131713465990) }, { FRAC_CONST(0.026082866112867), FRAC_CONST(0.017211815573560) }, { FRAC_CONST(0.026029938255941), FRAC_CONST(0.017291755676967) }, { FRAC_CONST(0.025976765395322), FRAC_CONST(0.017371533023784) }, { FRAC_CONST(0.025923348031494), FRAC_CONST(0.017451146863116) }, { FRAC_CONST(0.025869686667242), FRAC_CONST(0.017530596445607) }, { FRAC_CONST(0.025815781807646), FRAC_CONST(0.017609881023449) }, { FRAC_CONST(0.025761633960080), FRAC_CONST(0.017688999850383) }, { FRAC_CONST(0.025707243634204), FRAC_CONST(0.017767952181715) }, { FRAC_CONST(0.025652611341960), FRAC_CONST(0.017846737274313) }, { FRAC_CONST(0.025597737597568), FRAC_CONST(0.017925354386623) }, { FRAC_CONST(0.025542622917522), FRAC_CONST(0.018003802778671) }, { FRAC_CONST(0.025487267820581), FRAC_CONST(0.018082081712071) }, { FRAC_CONST(0.025431672827768), FRAC_CONST(0.018160190450031) }, { FRAC_CONST(0.025375838462365), FRAC_CONST(0.018238128257362) }, { FRAC_CONST(0.025319765249906), FRAC_CONST(0.018315894400484) }, { FRAC_CONST(0.025263453718173), FRAC_CONST(0.018393488147432) }, { FRAC_CONST(0.025206904397193), FRAC_CONST(0.018470908767865) }, { FRAC_CONST(0.025150117819228), FRAC_CONST(0.018548155533070) }, { FRAC_CONST(0.025093094518776), FRAC_CONST(0.018625227715971) }, { FRAC_CONST(0.025035835032562), FRAC_CONST(0.018702124591135) }, { FRAC_CONST(0.024978339899534), FRAC_CONST(0.018778845434780) }, { FRAC_CONST(0.024920609660858), FRAC_CONST(0.018855389524780) }, { FRAC_CONST(0.024862644859912), FRAC_CONST(0.018931756140672) }, { FRAC_CONST(0.024804446042284), FRAC_CONST(0.019007944563666) }, { FRAC_CONST(0.024746013755764), FRAC_CONST(0.019083954076646) }, { FRAC_CONST(0.024687348550337), FRAC_CONST(0.019159783964183) }, { FRAC_CONST(0.024628450978184), FRAC_CONST(0.019235433512536) }, { FRAC_CONST(0.024569321593670), FRAC_CONST(0.019310902009663) }, { FRAC_CONST(0.024509960953345), FRAC_CONST(0.019386188745225) }, { FRAC_CONST(0.024450369615932), FRAC_CONST(0.019461293010596) }, { FRAC_CONST(0.024390548142329), FRAC_CONST(0.019536214098866) }, { FRAC_CONST(0.024330497095598), FRAC_CONST(0.019610951304848) }, { FRAC_CONST(0.024270217040961), FRAC_CONST(0.019685503925087) }, { FRAC_CONST(0.024209708545799), FRAC_CONST(0.019759871257867) }, { FRAC_CONST(0.024148972179639), FRAC_CONST(0.019834052603212) }, { FRAC_CONST(0.024088008514157), FRAC_CONST(0.019908047262901) }, { FRAC_CONST(0.024026818123164), FRAC_CONST(0.019981854540467) }, { FRAC_CONST(0.023965401582609), FRAC_CONST(0.020055473741208) }, { FRAC_CONST(0.023903759470567), FRAC_CONST(0.020128904172192) }, { FRAC_CONST(0.023841892367236), FRAC_CONST(0.020202145142264) }, { FRAC_CONST(0.023779800854935), FRAC_CONST(0.020275195962052) }, { FRAC_CONST(0.023717485518092), FRAC_CONST(0.020348055943974) }, { FRAC_CONST(0.023654946943242), FRAC_CONST(0.020420724402244) }, { FRAC_CONST(0.023592185719023), FRAC_CONST(0.020493200652878) }, { FRAC_CONST(0.023529202436167), FRAC_CONST(0.020565484013703) }, { FRAC_CONST(0.023465997687496), FRAC_CONST(0.020637573804361) }, { FRAC_CONST(0.023402572067918), FRAC_CONST(0.020709469346314) }, { FRAC_CONST(0.023338926174419), FRAC_CONST(0.020781169962854) }, { FRAC_CONST(0.023275060606058), FRAC_CONST(0.020852674979108) }, { FRAC_CONST(0.023210975963963), FRAC_CONST(0.020923983722044) }, { FRAC_CONST(0.023146672851322), FRAC_CONST(0.020995095520475) }, { FRAC_CONST(0.023082151873380), FRAC_CONST(0.021066009705072) }, { FRAC_CONST(0.023017413637435), FRAC_CONST(0.021136725608363) }, { FRAC_CONST(0.022952458752826), FRAC_CONST(0.021207242564742) }, { FRAC_CONST(0.022887287830934), FRAC_CONST(0.021277559910478) }, { FRAC_CONST(0.022821901485173), FRAC_CONST(0.021347676983716) }, { FRAC_CONST(0.022756300330983), FRAC_CONST(0.021417593124488) }, { FRAC_CONST(0.022690484985827), FRAC_CONST(0.021487307674717) }, { FRAC_CONST(0.022624456069185), FRAC_CONST(0.021556819978223) }, { FRAC_CONST(0.022558214202547), FRAC_CONST(0.021626129380729) }, { FRAC_CONST(0.022491760009405), FRAC_CONST(0.021695235229869) }, { FRAC_CONST(0.022425094115252), FRAC_CONST(0.021764136875192) }, { FRAC_CONST(0.022358217147572), FRAC_CONST(0.021832833668171) }, { FRAC_CONST(0.022291129735838), FRAC_CONST(0.021901324962204) }, { FRAC_CONST(0.022223832511501), FRAC_CONST(0.021969610112625) }, { FRAC_CONST(0.022156326107988), FRAC_CONST(0.022037688476709) }, { FRAC_CONST(0.022088611160696), FRAC_CONST(0.022105559413676) }, { FRAC_CONST(0.022020688306983), FRAC_CONST(0.022173222284699) }, { FRAC_CONST(0.021952558186166), FRAC_CONST(0.022240676452909) }, { FRAC_CONST(0.021884221439510), FRAC_CONST(0.022307921283403) }, { FRAC_CONST(0.021815678710228), FRAC_CONST(0.022374956143245) }, { FRAC_CONST(0.021746930643469), FRAC_CONST(0.022441780401478) }, { FRAC_CONST(0.021677977886316), FRAC_CONST(0.022508393429127) }, { FRAC_CONST(0.021608821087780), FRAC_CONST(0.022574794599206) }, { FRAC_CONST(0.021539460898790), FRAC_CONST(0.022640983286719) }, { FRAC_CONST(0.021469897972190), FRAC_CONST(0.022706958868676) }, { FRAC_CONST(0.021400132962735), FRAC_CONST(0.022772720724087) }, { FRAC_CONST(0.021330166527077), FRAC_CONST(0.022838268233979) }, { FRAC_CONST(0.021259999323769), FRAC_CONST(0.022903600781391) }, { FRAC_CONST(0.021189632013250), FRAC_CONST(0.022968717751391) }, { FRAC_CONST(0.021119065257845), FRAC_CONST(0.023033618531071) }, { FRAC_CONST(0.021048299721754), FRAC_CONST(0.023098302509561) }, { FRAC_CONST(0.020977336071050), FRAC_CONST(0.023162769078031) }, { FRAC_CONST(0.020906174973670), FRAC_CONST(0.023227017629698) }, { FRAC_CONST(0.020834817099409), FRAC_CONST(0.023291047559828) }, { FRAC_CONST(0.020763263119915), FRAC_CONST(0.023354858265748) }, { FRAC_CONST(0.020691513708680), FRAC_CONST(0.023418449146848) }, { FRAC_CONST(0.020619569541038), FRAC_CONST(0.023481819604585) }, { FRAC_CONST(0.020547431294155), FRAC_CONST(0.023544969042494) }, { FRAC_CONST(0.020475099647023), FRAC_CONST(0.023607896866186) }, { FRAC_CONST(0.020402575280455), FRAC_CONST(0.023670602483363) }, { FRAC_CONST(0.020329858877078), FRAC_CONST(0.023733085303813) }, { FRAC_CONST(0.020256951121327), FRAC_CONST(0.023795344739427) }, { FRAC_CONST(0.020183852699437), FRAC_CONST(0.023857380204193) }, { FRAC_CONST(0.020110564299439), FRAC_CONST(0.023919191114211) }, { FRAC_CONST(0.020037086611150), FRAC_CONST(0.023980776887692) }, { FRAC_CONST(0.019963420326171), FRAC_CONST(0.024042136944968) }, { FRAC_CONST(0.019889566137877), FRAC_CONST(0.024103270708495) }, { FRAC_CONST(0.019815524741412), FRAC_CONST(0.024164177602859) }, { FRAC_CONST(0.019741296833681), FRAC_CONST(0.024224857054779) }, { FRAC_CONST(0.019666883113346), FRAC_CONST(0.024285308493120) }, { FRAC_CONST(0.019592284280817), FRAC_CONST(0.024345531348888) }, { FRAC_CONST(0.019517501038246), FRAC_CONST(0.024405525055242) }, { FRAC_CONST(0.019442534089523), FRAC_CONST(0.024465289047500) }, { FRAC_CONST(0.019367384140264), FRAC_CONST(0.024524822763141) }, { FRAC_CONST(0.019292051897809), FRAC_CONST(0.024584125641809) }, { FRAC_CONST(0.019216538071215), FRAC_CONST(0.024643197125323) }, { FRAC_CONST(0.019140843371246), FRAC_CONST(0.024702036657681) }, { FRAC_CONST(0.019064968510369), FRAC_CONST(0.024760643685063) }, { FRAC_CONST(0.018988914202748), FRAC_CONST(0.024819017655836) }, { FRAC_CONST(0.018912681164234), FRAC_CONST(0.024877158020562) }, { FRAC_CONST(0.018836270112363), FRAC_CONST(0.024935064232003) }, { FRAC_CONST(0.018759681766343), FRAC_CONST(0.024992735745123) }, { FRAC_CONST(0.018682916847054), FRAC_CONST(0.025050172017095) }, { FRAC_CONST(0.018605976077037), FRAC_CONST(0.025107372507308) }, { FRAC_CONST(0.018528860180486), FRAC_CONST(0.025164336677369) }, { FRAC_CONST(0.018451569883247), FRAC_CONST(0.025221063991110) }, { FRAC_CONST(0.018374105912805), FRAC_CONST(0.025277553914591) }, { FRAC_CONST(0.018296468998280), FRAC_CONST(0.025333805916107) }, { FRAC_CONST(0.018218659870421), FRAC_CONST(0.025389819466194) }, { FRAC_CONST(0.018140679261596), FRAC_CONST(0.025445594037630) }, { FRAC_CONST(0.018062527905790), FRAC_CONST(0.025501129105445) }, { FRAC_CONST(0.017984206538592), FRAC_CONST(0.025556424146920) }, { FRAC_CONST(0.017905715897192), FRAC_CONST(0.025611478641598) }, { FRAC_CONST(0.017827056720375), FRAC_CONST(0.025666292071285) }, { FRAC_CONST(0.017748229748511), FRAC_CONST(0.025720863920056) }, { FRAC_CONST(0.017669235723550), FRAC_CONST(0.025775193674260) }, { FRAC_CONST(0.017590075389012), FRAC_CONST(0.025829280822525) }, { FRAC_CONST(0.017510749489986), FRAC_CONST(0.025883124855762) }, { FRAC_CONST(0.017431258773116), FRAC_CONST(0.025936725267170) }, { FRAC_CONST(0.017351603986600), FRAC_CONST(0.025990081552242) }, { FRAC_CONST(0.017271785880180), FRAC_CONST(0.026043193208768) }, { FRAC_CONST(0.017191805205132), FRAC_CONST(0.026096059736841) }, { FRAC_CONST(0.017111662714267), FRAC_CONST(0.026148680638861) }, { FRAC_CONST(0.017031359161915), FRAC_CONST(0.026201055419541) }, { FRAC_CONST(0.016950895303924), FRAC_CONST(0.026253183585908) }, { FRAC_CONST(0.016870271897651), FRAC_CONST(0.026305064647313) }, { FRAC_CONST(0.016789489701954), FRAC_CONST(0.026356698115431) }, { FRAC_CONST(0.016708549477186), FRAC_CONST(0.026408083504269) }, { FRAC_CONST(0.016627451985187), FRAC_CONST(0.026459220330167) }, { FRAC_CONST(0.016546197989277), FRAC_CONST(0.026510108111806) }, { FRAC_CONST(0.016464788254250), FRAC_CONST(0.026560746370212) }, { FRAC_CONST(0.016383223546365), FRAC_CONST(0.026611134628757) }, { FRAC_CONST(0.016301504633341), FRAC_CONST(0.026661272413168) }, { FRAC_CONST(0.016219632284346), FRAC_CONST(0.026711159251530) }, { FRAC_CONST(0.016137607269996), FRAC_CONST(0.026760794674288) }, { FRAC_CONST(0.016055430362340), FRAC_CONST(0.026810178214254) }, { FRAC_CONST(0.015973102334858), FRAC_CONST(0.026859309406613) }, { FRAC_CONST(0.015890623962454), FRAC_CONST(0.026908187788922) }, { FRAC_CONST(0.015807996021446), FRAC_CONST(0.026956812901119) }, { FRAC_CONST(0.015725219289558), FRAC_CONST(0.027005184285527) }, { FRAC_CONST(0.015642294545918), FRAC_CONST(0.027053301486856) }, { FRAC_CONST(0.015559222571044), FRAC_CONST(0.027101164052208) }, { FRAC_CONST(0.015476004146842), FRAC_CONST(0.027148771531083) }, { FRAC_CONST(0.015392640056594), FRAC_CONST(0.027196123475380) }, { FRAC_CONST(0.015309131084956), FRAC_CONST(0.027243219439406) }, { FRAC_CONST(0.015225478017946), FRAC_CONST(0.027290058979875) }, { FRAC_CONST(0.015141681642938), FRAC_CONST(0.027336641655915) }, { FRAC_CONST(0.015057742748656), FRAC_CONST(0.027382967029073) }, { FRAC_CONST(0.014973662125164), FRAC_CONST(0.027429034663317) }, { FRAC_CONST(0.014889440563862), FRAC_CONST(0.027474844125040) }, { FRAC_CONST(0.014805078857474), FRAC_CONST(0.027520394983066) }, { FRAC_CONST(0.014720577800046), FRAC_CONST(0.027565686808654) }, { FRAC_CONST(0.014635938186934), FRAC_CONST(0.027610719175499) }, { FRAC_CONST(0.014551160814797), FRAC_CONST(0.027655491659740) }, { FRAC_CONST(0.014466246481592), FRAC_CONST(0.027700003839960) }, { FRAC_CONST(0.014381195986567), FRAC_CONST(0.027744255297195) }, { FRAC_CONST(0.014296010130247), FRAC_CONST(0.027788245614933) }, { FRAC_CONST(0.014210689714436), FRAC_CONST(0.027831974379120) }, { FRAC_CONST(0.014125235542201), FRAC_CONST(0.027875441178165) }, { FRAC_CONST(0.014039648417870), FRAC_CONST(0.027918645602941) }, { FRAC_CONST(0.013953929147020), FRAC_CONST(0.027961587246792) }, { FRAC_CONST(0.013868078536476), FRAC_CONST(0.028004265705534) }, { FRAC_CONST(0.013782097394294), FRAC_CONST(0.028046680577462) }, { FRAC_CONST(0.013695986529763), FRAC_CONST(0.028088831463351) }, { FRAC_CONST(0.013609746753390), FRAC_CONST(0.028130717966461) }, { FRAC_CONST(0.013523378876898), FRAC_CONST(0.028172339692540) }, { FRAC_CONST(0.013436883713214), FRAC_CONST(0.028213696249828) }, { FRAC_CONST(0.013350262076462), FRAC_CONST(0.028254787249062) }, { FRAC_CONST(0.013263514781960), FRAC_CONST(0.028295612303478) }, { FRAC_CONST(0.013176642646205), FRAC_CONST(0.028336171028814) }, { FRAC_CONST(0.013089646486871), FRAC_CONST(0.028376463043317) }, { FRAC_CONST(0.013002527122799), FRAC_CONST(0.028416487967743) }, { FRAC_CONST(0.012915285373990), FRAC_CONST(0.028456245425361) }, { FRAC_CONST(0.012827922061597), FRAC_CONST(0.028495735041960) }, { FRAC_CONST(0.012740438007915), FRAC_CONST(0.028534956445849) }, { FRAC_CONST(0.012652834036379), FRAC_CONST(0.028573909267859) }, { FRAC_CONST(0.012565110971550), FRAC_CONST(0.028612593141354) }, { FRAC_CONST(0.012477269639111), FRAC_CONST(0.028651007702224) }, { FRAC_CONST(0.012389310865858), FRAC_CONST(0.028689152588899) }, { FRAC_CONST(0.012301235479693), FRAC_CONST(0.028727027442343) }, { FRAC_CONST(0.012213044309615), FRAC_CONST(0.028764631906065) }, { FRAC_CONST(0.012124738185712), FRAC_CONST(0.028801965626115) }, { FRAC_CONST(0.012036317939156), FRAC_CONST(0.028839028251097) }, { FRAC_CONST(0.011947784402191), FRAC_CONST(0.028875819432161) }, { FRAC_CONST(0.011859138408130), FRAC_CONST(0.028912338823015) }, { FRAC_CONST(0.011770380791341), FRAC_CONST(0.028948586079925) }, { FRAC_CONST(0.011681512387245), FRAC_CONST(0.028984560861718) }, { FRAC_CONST(0.011592534032306), FRAC_CONST(0.029020262829785) }, { FRAC_CONST(0.011503446564022), FRAC_CONST(0.029055691648087) }, { FRAC_CONST(0.011414250820918), FRAC_CONST(0.029090846983152) }, { FRAC_CONST(0.011324947642537), FRAC_CONST(0.029125728504087) }, { FRAC_CONST(0.011235537869437), FRAC_CONST(0.029160335882573) }, { FRAC_CONST(0.011146022343175), FRAC_CONST(0.029194668792871) }, { FRAC_CONST(0.011056401906305), FRAC_CONST(0.029228726911828) }, { FRAC_CONST(0.010966677402371), FRAC_CONST(0.029262509918876) }, { FRAC_CONST(0.010876849675891), FRAC_CONST(0.029296017496036) }, { FRAC_CONST(0.010786919572361), FRAC_CONST(0.029329249327922) }, { FRAC_CONST(0.010696887938235), FRAC_CONST(0.029362205101743) }, { FRAC_CONST(0.010606755620926), FRAC_CONST(0.029394884507308) }, { FRAC_CONST(0.010516523468793), FRAC_CONST(0.029427287237024) }, { FRAC_CONST(0.010426192331137), FRAC_CONST(0.029459412985906) }, { FRAC_CONST(0.010335763058187), FRAC_CONST(0.029491261451573) }, { FRAC_CONST(0.010245236501099), FRAC_CONST(0.029522832334255) }, { FRAC_CONST(0.010154613511943), FRAC_CONST(0.029554125336796) }, { FRAC_CONST(0.010063894943698), FRAC_CONST(0.029585140164654) }, { FRAC_CONST(0.009973081650240), FRAC_CONST(0.029615876525905) }, { FRAC_CONST(0.009882174486340), FRAC_CONST(0.029646334131247) }, { FRAC_CONST(0.009791174307650), FRAC_CONST(0.029676512694001) }, { FRAC_CONST(0.009700081970699), FRAC_CONST(0.029706411930116) }, { FRAC_CONST(0.009608898332881), FRAC_CONST(0.029736031558168) }, { FRAC_CONST(0.009517624252453), FRAC_CONST(0.029765371299366) }, { FRAC_CONST(0.009426260588521), FRAC_CONST(0.029794430877553) }, { FRAC_CONST(0.009334808201034), FRAC_CONST(0.029823210019210) }, { FRAC_CONST(0.009243267950778), FRAC_CONST(0.029851708453456) }, { FRAC_CONST(0.009151640699363), FRAC_CONST(0.029879925912053) }, { FRAC_CONST(0.009059927309220), FRAC_CONST(0.029907862129408) }, { FRAC_CONST(0.008968128643591), FRAC_CONST(0.029935516842573) }, { FRAC_CONST(0.008876245566520), FRAC_CONST(0.029962889791254) }, { FRAC_CONST(0.008784278942845), FRAC_CONST(0.029989980717805) }, { FRAC_CONST(0.008692229638191), FRAC_CONST(0.030016789367235) }, { FRAC_CONST(0.008600098518961), FRAC_CONST(0.030043315487212) }, { FRAC_CONST(0.008507886452329), FRAC_CONST(0.030069558828062) }, { FRAC_CONST(0.008415594306230), FRAC_CONST(0.030095519142772) }, { FRAC_CONST(0.008323222949351), FRAC_CONST(0.030121196186994) }, { FRAC_CONST(0.008230773251129), FRAC_CONST(0.030146589719046) }, { FRAC_CONST(0.008138246081733), FRAC_CONST(0.030171699499915) }, { FRAC_CONST(0.008045642312067), FRAC_CONST(0.030196525293257) }, { FRAC_CONST(0.007952962813750), FRAC_CONST(0.030221066865402) }, { FRAC_CONST(0.007860208459119), FRAC_CONST(0.030245323985357) }, { FRAC_CONST(0.007767380121212), FRAC_CONST(0.030269296424803) }, { FRAC_CONST(0.007674478673766), FRAC_CONST(0.030292983958103) }, { FRAC_CONST(0.007581504991203), FRAC_CONST(0.030316386362302) }, { FRAC_CONST(0.007488459948628), FRAC_CONST(0.030339503417126) }, { FRAC_CONST(0.007395344421816), FRAC_CONST(0.030362334904989) }, { FRAC_CONST(0.007302159287206), FRAC_CONST(0.030384880610993) }, { FRAC_CONST(0.007208905421891), FRAC_CONST(0.030407140322928) }, { FRAC_CONST(0.007115583703613), FRAC_CONST(0.030429113831278) }, { FRAC_CONST(0.007022195010752), FRAC_CONST(0.030450800929220) }, { FRAC_CONST(0.006928740222316), FRAC_CONST(0.030472201412626) }, { FRAC_CONST(0.006835220217939), FRAC_CONST(0.030493315080068) }, { FRAC_CONST(0.006741635877866), FRAC_CONST(0.030514141732814) }, { FRAC_CONST(0.006647988082948), FRAC_CONST(0.030534681174838) }, { FRAC_CONST(0.006554277714635), FRAC_CONST(0.030554933212813) }, { FRAC_CONST(0.006460505654964), FRAC_CONST(0.030574897656119) }, { FRAC_CONST(0.006366672786553), FRAC_CONST(0.030594574316845) }, { FRAC_CONST(0.006272779992593), FRAC_CONST(0.030613963009786) }, { FRAC_CONST(0.006178828156839), FRAC_CONST(0.030633063552447) }, { FRAC_CONST(0.006084818163601), FRAC_CONST(0.030651875765048) }, { FRAC_CONST(0.005990750897737), FRAC_CONST(0.030670399470520) }, { FRAC_CONST(0.005896627244644), FRAC_CONST(0.030688634494512) }, { FRAC_CONST(0.005802448090250), FRAC_CONST(0.030706580665388) }, { FRAC_CONST(0.005708214321004), FRAC_CONST(0.030724237814232) }, { FRAC_CONST(0.005613926823871), FRAC_CONST(0.030741605774849) }, { FRAC_CONST(0.005519586486321), FRAC_CONST(0.030758684383764) }, { FRAC_CONST(0.005425194196321), FRAC_CONST(0.030775473480228) }, { FRAC_CONST(0.005330750842327), FRAC_CONST(0.030791972906214) }, { FRAC_CONST(0.005236257313276), FRAC_CONST(0.030808182506425) }, { FRAC_CONST(0.005141714498576), FRAC_CONST(0.030824102128288) }, { FRAC_CONST(0.005047123288102), FRAC_CONST(0.030839731621963) }, { FRAC_CONST(0.004952484572181), FRAC_CONST(0.030855070840339) }, { FRAC_CONST(0.004857799241589), FRAC_CONST(0.030870119639036) }, { FRAC_CONST(0.004763068187541), FRAC_CONST(0.030884877876411) }, { FRAC_CONST(0.004668292301681), FRAC_CONST(0.030899345413553) }, { FRAC_CONST(0.004573472476075), FRAC_CONST(0.030913522114288) }, { FRAC_CONST(0.004478609603205), FRAC_CONST(0.030927407845180) }, { FRAC_CONST(0.004383704575956), FRAC_CONST(0.030941002475530) }, { FRAC_CONST(0.004288758287610), FRAC_CONST(0.030954305877381) }, { FRAC_CONST(0.004193771631837), FRAC_CONST(0.030967317925516) }, { FRAC_CONST(0.004098745502689), FRAC_CONST(0.030980038497461) }, { FRAC_CONST(0.004003680794587), FRAC_CONST(0.030992467473486) }, { FRAC_CONST(0.003908578402316), FRAC_CONST(0.031004604736602) }, { FRAC_CONST(0.003813439221017), FRAC_CONST(0.031016450172571) }, { FRAC_CONST(0.003718264146176), FRAC_CONST(0.031028003669899) }, { FRAC_CONST(0.003623054073616), FRAC_CONST(0.031039265119839) }, { FRAC_CONST(0.003527809899492), FRAC_CONST(0.031050234416394) }, { FRAC_CONST(0.003432532520278), FRAC_CONST(0.031060911456318) }, { FRAC_CONST(0.003337222832760), FRAC_CONST(0.031071296139114) }, { FRAC_CONST(0.003241881734029), FRAC_CONST(0.031081388367037) }, { FRAC_CONST(0.003146510121474), FRAC_CONST(0.031091188045095) }, { FRAC_CONST(0.003051108892766), FRAC_CONST(0.031100695081051) }, { FRAC_CONST(0.002955678945860), FRAC_CONST(0.031109909385419) }, { FRAC_CONST(0.002860221178978), FRAC_CONST(0.031118830871473) }, { FRAC_CONST(0.002764736490604), FRAC_CONST(0.031127459455239) }, { FRAC_CONST(0.002669225779478), FRAC_CONST(0.031135795055501) }, { FRAC_CONST(0.002573689944583), FRAC_CONST(0.031143837593803) }, { FRAC_CONST(0.002478129885137), FRAC_CONST(0.031151586994444) }, { FRAC_CONST(0.002382546500589), FRAC_CONST(0.031159043184484) }, { FRAC_CONST(0.002286940690606), FRAC_CONST(0.031166206093743) }, { FRAC_CONST(0.002191313355067), FRAC_CONST(0.031173075654800) }, { FRAC_CONST(0.002095665394051), FRAC_CONST(0.031179651802998) }, { FRAC_CONST(0.001999997707835), FRAC_CONST(0.031185934476438) }, { FRAC_CONST(0.001904311196878), FRAC_CONST(0.031191923615985) }, { FRAC_CONST(0.001808606761820), FRAC_CONST(0.031197619165268) }, { FRAC_CONST(0.001712885303465), FRAC_CONST(0.031203021070678) }, { FRAC_CONST(0.001617147722782), FRAC_CONST(0.031208129281370) }, { FRAC_CONST(0.001521394920889), FRAC_CONST(0.031212943749264) }, { FRAC_CONST(0.001425627799047), FRAC_CONST(0.031217464429043) }, { FRAC_CONST(0.001329847258653), FRAC_CONST(0.031221691278159) }, { FRAC_CONST(0.001234054201231), FRAC_CONST(0.031225624256825) }, { FRAC_CONST(0.001138249528420), FRAC_CONST(0.031229263328024) }, { FRAC_CONST(0.001042434141971), FRAC_CONST(0.031232608457502) }, { FRAC_CONST(0.000946608943736), FRAC_CONST(0.031235659613775) }, { FRAC_CONST(0.000850774835656), FRAC_CONST(0.031238416768124) }, { FRAC_CONST(0.000754932719759), FRAC_CONST(0.031240879894597) }, { FRAC_CONST(0.000659083498149), FRAC_CONST(0.031243048970010) }, { FRAC_CONST(0.000563228072993), FRAC_CONST(0.031244923973948) }, { FRAC_CONST(0.000467367346520), FRAC_CONST(0.031246504888762) }, { FRAC_CONST(0.000371502221008), FRAC_CONST(0.031247791699571) }, { FRAC_CONST(0.000275633598775), FRAC_CONST(0.031248784394264) }, { FRAC_CONST(0.000179762382174), FRAC_CONST(0.031249482963498) }, { FRAC_CONST(0.000083889473581), FRAC_CONST(0.031249887400697) } }; /* 64 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_256[] = { { FRAC_CONST(0.088387931675923), FRAC_CONST(0.000271171628935) }, { FRAC_CONST(0.088354655998507), FRAC_CONST(0.002440238387037) }, { FRAC_CONST(0.088268158780110), FRAC_CONST(0.004607835236780) }, { FRAC_CONST(0.088128492123423), FRAC_CONST(0.006772656498875) }, { FRAC_CONST(0.087935740158418), FRAC_CONST(0.008933398165942) }, { FRAC_CONST(0.087690018991670), FRAC_CONST(0.011088758687994) }, { FRAC_CONST(0.087391476636423), FRAC_CONST(0.013237439756448) }, { FRAC_CONST(0.087040292923427), FRAC_CONST(0.015378147086172) }, { FRAC_CONST(0.086636679392621), FRAC_CONST(0.017509591195118) }, { FRAC_CONST(0.086180879165703), FRAC_CONST(0.019630488181053) }, { FRAC_CONST(0.085673166799686), FRAC_CONST(0.021739560494940) }, { FRAC_CONST(0.085113848121515), FRAC_CONST(0.023835537710479) }, { FRAC_CONST(0.084503260043847), FRAC_CONST(0.025917157289369) }, { FRAC_CONST(0.083841770362110), FRAC_CONST(0.027983165341813) }, { FRAC_CONST(0.083129777532952), FRAC_CONST(0.030032317381813) }, { FRAC_CONST(0.082367710434230), FRAC_CONST(0.032063379076803) }, { FRAC_CONST(0.081556028106671), FRAC_CONST(0.034075126991164) }, { FRAC_CONST(0.080695219477356), FRAC_CONST(0.036066349323177) }, { FRAC_CONST(0.079785803065216), FRAC_CONST(0.038035846634965) }, { FRAC_CONST(0.078828326668693), FRAC_CONST(0.039982432574992) }, { FRAC_CONST(0.077823367035766), FRAC_CONST(0.041904934592675) }, { FRAC_CONST(0.076771529516540), FRAC_CONST(0.043802194644686) }, { FRAC_CONST(0.075673447698606), FRAC_CONST(0.045673069892513) }, { FRAC_CONST(0.074529783025390), FRAC_CONST(0.047516433390863) }, { FRAC_CONST(0.073341224397728), FRAC_CONST(0.049331174766491) }, { FRAC_CONST(0.072108487758894), FRAC_CONST(0.051116200887052) }, { FRAC_CONST(0.070832315663343), FRAC_CONST(0.052870436519557) }, { FRAC_CONST(0.069513476829429), FRAC_CONST(0.054592824978055) }, { FRAC_CONST(0.068152765676348), FRAC_CONST(0.056282328760143) }, { FRAC_CONST(0.066751001845620), FRAC_CONST(0.057937930171918) }, { FRAC_CONST(0.065309029707361), FRAC_CONST(0.059558631940996) }, { FRAC_CONST(0.063827717851668), FRAC_CONST(0.061143457817234) }, { FRAC_CONST(0.062307958565413), FRAC_CONST(0.062691453160784) }, { FRAC_CONST(0.060750667294763), FRAC_CONST(0.064201685517134) }, { FRAC_CONST(0.059156782093749), FRAC_CONST(0.065673245178784) }, { FRAC_CONST(0.057527263059216), FRAC_CONST(0.067105245733220) }, { FRAC_CONST(0.055863091752499), FRAC_CONST(0.068496824596852) }, { FRAC_CONST(0.054165270608165), FRAC_CONST(0.069847143534609) }, { FRAC_CONST(0.052434822330188), FRAC_CONST(0.071155389164853) }, { FRAC_CONST(0.050672789275903), FRAC_CONST(0.072420773449336) }, { FRAC_CONST(0.048880232828135), FRAC_CONST(0.073642534167879) }, { FRAC_CONST(0.047058232755862), FRAC_CONST(0.074819935377512) }, { FRAC_CONST(0.045207886563797), FRAC_CONST(0.075952267855771) }, { FRAC_CONST(0.043330308831298), FRAC_CONST(0.077038849527912) }, { FRAC_CONST(0.041426630540984), FRAC_CONST(0.078079025877766) }, { FRAC_CONST(0.039497998397473), FRAC_CONST(0.079072170341994) }, { FRAC_CONST(0.037545574136653), FRAC_CONST(0.080017684687506) }, { FRAC_CONST(0.035570533825892), FRAC_CONST(0.080914999371817) }, { FRAC_CONST(0.033574067155622), FRAC_CONST(0.081763573886112) }, { FRAC_CONST(0.031557376722714), FRAC_CONST(0.082562897080836) }, { FRAC_CONST(0.029521677306074), FRAC_CONST(0.083312487473584) }, { FRAC_CONST(0.027468195134911), FRAC_CONST(0.084011893539132) }, { FRAC_CONST(0.025398167150101), FRAC_CONST(0.084660693981419) }, { FRAC_CONST(0.023312840259098), FRAC_CONST(0.085258497987320) }, { FRAC_CONST(0.021213470584847), FRAC_CONST(0.085804945462053) }, { FRAC_CONST(0.019101322709138), FRAC_CONST(0.086299707246093) }, { FRAC_CONST(0.016977668910873), FRAC_CONST(0.086742485313442) }, { FRAC_CONST(0.014843788399692), FRAC_CONST(0.087133012951149) }, { FRAC_CONST(0.012700966545425), FRAC_CONST(0.087471054919968) }, { FRAC_CONST(0.010550494103830), FRAC_CONST(0.087756407596056) }, { FRAC_CONST(0.008393666439096), FRAC_CONST(0.087988899093631) }, { FRAC_CONST(0.006231782743558), FRAC_CONST(0.088168389368510) }, { FRAC_CONST(0.004066145255116), FRAC_CONST(0.088294770302461) }, { FRAC_CONST(0.001898058472816), FRAC_CONST(0.088367965768336) } }; #ifdef LD_DEC /* 128 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1024[] = { { FRAC_CONST(0.044194160825012), FRAC_CONST(0.000033896503468) }, { FRAC_CONST(0.044193120897389), FRAC_CONST(0.000305066138364) }, { FRAC_CONST(0.044190417123742), FRAC_CONST(0.000576224287693) }, { FRAC_CONST(0.044186049605866), FRAC_CONST(0.000847360742503) }, { FRAC_CONST(0.044180018508197), FRAC_CONST(0.001118465294660) }, { FRAC_CONST(0.044172324057802), FRAC_CONST(0.001389527737231) }, { FRAC_CONST(0.044162966544372), FRAC_CONST(0.001660537864867) }, { FRAC_CONST(0.044151946320213), FRAC_CONST(0.001931485474192) }, { FRAC_CONST(0.044139263800230), FRAC_CONST(0.002202360364180) }, { FRAC_CONST(0.044124919461912), FRAC_CONST(0.002473152336546) }, { FRAC_CONST(0.044108913845316), FRAC_CONST(0.002743851196123) }, { FRAC_CONST(0.044091247553044), FRAC_CONST(0.003014446751254) }, { FRAC_CONST(0.044071921250223), FRAC_CONST(0.003284928814169) }, { FRAC_CONST(0.044050935664476), FRAC_CONST(0.003555287201370) }, { FRAC_CONST(0.044028291585898), FRAC_CONST(0.003825511734018) }, { FRAC_CONST(0.044003989867028), FRAC_CONST(0.004095592238311) }, { FRAC_CONST(0.043978031422810), FRAC_CONST(0.004365518545871) }, { FRAC_CONST(0.043950417230565), FRAC_CONST(0.004635280494126) }, { FRAC_CONST(0.043921148329953), FRAC_CONST(0.004904867926689) }, { FRAC_CONST(0.043890225822930), FRAC_CONST(0.005174270693748) }, { FRAC_CONST(0.043857650873712), FRAC_CONST(0.005443478652439) }, { FRAC_CONST(0.043823424708727), FRAC_CONST(0.005712481667236) }, { FRAC_CONST(0.043787548616571), FRAC_CONST(0.005981269610326) }, { FRAC_CONST(0.043750023947958), FRAC_CONST(0.006249832361997) }, { FRAC_CONST(0.043710852115672), FRAC_CONST(0.006518159811011) }, { FRAC_CONST(0.043670034594508), FRAC_CONST(0.006786241854993) }, { FRAC_CONST(0.043627572921225), FRAC_CONST(0.007054068400804) }, { FRAC_CONST(0.043583468694479), FRAC_CONST(0.007321629364927) }, { FRAC_CONST(0.043537723574771), FRAC_CONST(0.007588914673843) }, { FRAC_CONST(0.043490339284377), FRAC_CONST(0.007855914264410) }, { FRAC_CONST(0.043441317607290), FRAC_CONST(0.008122618084246) }, { FRAC_CONST(0.043390660389149), FRAC_CONST(0.008389016092101) }, { FRAC_CONST(0.043338369537168), FRAC_CONST(0.008655098258243) }, { FRAC_CONST(0.043284447020070), FRAC_CONST(0.008920854564826) }, { FRAC_CONST(0.043228894868005), FRAC_CONST(0.009186275006278) }, { FRAC_CONST(0.043171715172482), FRAC_CONST(0.009451349589667) }, { FRAC_CONST(0.043112910086283), FRAC_CONST(0.009716068335087) }, { FRAC_CONST(0.043052481823387), FRAC_CONST(0.009980421276025) }, { FRAC_CONST(0.042990432658884), FRAC_CONST(0.010244398459743) }, { FRAC_CONST(0.042926764928889), FRAC_CONST(0.010507989947649) }, { FRAC_CONST(0.042861481030457), FRAC_CONST(0.010771185815673) }, { FRAC_CONST(0.042794583421490), FRAC_CONST(0.011033976154639) }, { FRAC_CONST(0.042726074620644), FRAC_CONST(0.011296351070639) }, { FRAC_CONST(0.042655957207238), FRAC_CONST(0.011558300685406) }, { FRAC_CONST(0.042584233821153), FRAC_CONST(0.011819815136685) }, { FRAC_CONST(0.042510907162732), FRAC_CONST(0.012080884578604) }, { FRAC_CONST(0.042435979992684), FRAC_CONST(0.012341499182048) }, { FRAC_CONST(0.042359455131975), FRAC_CONST(0.012601649135022) }, { FRAC_CONST(0.042281335461721), FRAC_CONST(0.012861324643029) }, { FRAC_CONST(0.042201623923085), FRAC_CONST(0.013120515929433) }, { FRAC_CONST(0.042120323517160), FRAC_CONST(0.013379213235827) }, { FRAC_CONST(0.042037437304862), FRAC_CONST(0.013637406822406) }, { FRAC_CONST(0.041952968406809), FRAC_CONST(0.013895086968325) }, { FRAC_CONST(0.041866920003207), FRAC_CONST(0.014152243972073) }, { FRAC_CONST(0.041779295333730), FRAC_CONST(0.014408868151835) }, { FRAC_CONST(0.041690097697398), FRAC_CONST(0.014664949845855) }, { FRAC_CONST(0.041599330452450), FRAC_CONST(0.014920479412801) }, { FRAC_CONST(0.041506997016224), FRAC_CONST(0.015175447232131) }, { FRAC_CONST(0.041413100865019), FRAC_CONST(0.015429843704450) }, { FRAC_CONST(0.041317645533974), FRAC_CONST(0.015683659251874) }, { FRAC_CONST(0.041220634616927), FRAC_CONST(0.015936884318392) }, { FRAC_CONST(0.041122071766285), FRAC_CONST(0.016189509370223) }, { FRAC_CONST(0.041021960692883), FRAC_CONST(0.016441524896177) }, { FRAC_CONST(0.040920305165846), FRAC_CONST(0.016692921408010) }, { FRAC_CONST(0.040817109012449), FRAC_CONST(0.016943689440788) }, { FRAC_CONST(0.040712376117967), FRAC_CONST(0.017193819553235) }, { FRAC_CONST(0.040606110425535), FRAC_CONST(0.017443302328094) }, { FRAC_CONST(0.040498315935996), FRAC_CONST(0.017692128372479) }, { FRAC_CONST(0.040388996707752), FRAC_CONST(0.017940288318230) }, { FRAC_CONST(0.040278156856609), FRAC_CONST(0.018187772822267) }, { FRAC_CONST(0.040165800555627), FRAC_CONST(0.018434572566936) }, { FRAC_CONST(0.040051932034955), FRAC_CONST(0.018680678260367) }, { FRAC_CONST(0.039936555581679), FRAC_CONST(0.018926080636820) }, { FRAC_CONST(0.039819675539659), FRAC_CONST(0.019170770457035) }, { FRAC_CONST(0.039701296309360), FRAC_CONST(0.019414738508577) }, { FRAC_CONST(0.039581422347694), FRAC_CONST(0.019657975606187) }, { FRAC_CONST(0.039460058167849), FRAC_CONST(0.019900472592126) }, { FRAC_CONST(0.039337208339116), FRAC_CONST(0.020142220336521) }, { FRAC_CONST(0.039212877486723), FRAC_CONST(0.020383209737704) }, { FRAC_CONST(0.039087070291656), FRAC_CONST(0.020623431722561) }, { FRAC_CONST(0.038959791490485), FRAC_CONST(0.020862877246870) }, { FRAC_CONST(0.038831045875184), FRAC_CONST(0.021101537295642) }, { FRAC_CONST(0.038700838292953), FRAC_CONST(0.021339402883462) }, { FRAC_CONST(0.038569173646034), FRAC_CONST(0.021576465054824) }, { FRAC_CONST(0.038436056891527), FRAC_CONST(0.021812714884472) }, { FRAC_CONST(0.038301493041202), FRAC_CONST(0.022048143477734) }, { FRAC_CONST(0.038165487161312), FRAC_CONST(0.022282741970855) }, { FRAC_CONST(0.038028044372402), FRAC_CONST(0.022516501531335) }, { FRAC_CONST(0.037889169849115), FRAC_CONST(0.022749413358259) }, { FRAC_CONST(0.037748868819998), FRAC_CONST(0.022981468682628) }, { FRAC_CONST(0.037607146567305), FRAC_CONST(0.023212658767690) }, { FRAC_CONST(0.037464008426800), FRAC_CONST(0.023442974909269) }, { FRAC_CONST(0.037319459787553), FRAC_CONST(0.023672408436094) }, { FRAC_CONST(0.037173506091737), FRAC_CONST(0.023900950710120) }, { FRAC_CONST(0.037026152834428), FRAC_CONST(0.024128593126861) }, { FRAC_CONST(0.036877405563392), FRAC_CONST(0.024355327115708) }, { FRAC_CONST(0.036727269878879), FRAC_CONST(0.024581144140255) }, { FRAC_CONST(0.036575751433414), FRAC_CONST(0.024806035698618) }, { FRAC_CONST(0.036422855931580), FRAC_CONST(0.025029993323758) }, { FRAC_CONST(0.036268589129807), FRAC_CONST(0.025253008583796) }, { FRAC_CONST(0.036112956836151), FRAC_CONST(0.025475073082334) }, { FRAC_CONST(0.035955964910083), FRAC_CONST(0.025696178458769) }, { FRAC_CONST(0.035797619262257), FRAC_CONST(0.025916316388609) }, { FRAC_CONST(0.035637925854300), FRAC_CONST(0.026135478583784) }, { FRAC_CONST(0.035476890698576), FRAC_CONST(0.026353656792963) }, { FRAC_CONST(0.035314519857970), FRAC_CONST(0.026570842801858) }, { FRAC_CONST(0.035150819445650), FRAC_CONST(0.026787028433540) }, { FRAC_CONST(0.034985795624846), FRAC_CONST(0.027002205548742) }, { FRAC_CONST(0.034819454608610), FRAC_CONST(0.027216366046166) }, { FRAC_CONST(0.034651802659589), FRAC_CONST(0.027429501862792) }, { FRAC_CONST(0.034482846089783), FRAC_CONST(0.027641604974175) }, { FRAC_CONST(0.034312591260311), FRAC_CONST(0.027852667394755) }, { FRAC_CONST(0.034141044581172), FRAC_CONST(0.028062681178149) }, { FRAC_CONST(0.033968212511001), FRAC_CONST(0.028271638417458) }, { FRAC_CONST(0.033794101556828), FRAC_CONST(0.028479531245560) }, { FRAC_CONST(0.033618718273831), FRAC_CONST(0.028686351835407) }, { FRAC_CONST(0.033442069265093), FRAC_CONST(0.028892092400321) }, { FRAC_CONST(0.033264161181349), FRAC_CONST(0.029096745194286) }, { FRAC_CONST(0.033085000720737), FRAC_CONST(0.029300302512241) }, { FRAC_CONST(0.032904594628548), FRAC_CONST(0.029502756690366) }, { FRAC_CONST(0.032722949696969), FRAC_CONST(0.029704100106376) }, { FRAC_CONST(0.032540072764829), FRAC_CONST(0.029904325179807) }, { FRAC_CONST(0.032355970717341), FRAC_CONST(0.030103424372297) }, { FRAC_CONST(0.032170650485843), FRAC_CONST(0.030301390187873) }, { FRAC_CONST(0.031984119047537), FRAC_CONST(0.030498215173235) }, { FRAC_CONST(0.031796383425227), FRAC_CONST(0.030693891918034) }, { FRAC_CONST(0.031607450687052), FRAC_CONST(0.030888413055150) }, { FRAC_CONST(0.031417327946223), FRAC_CONST(0.031081771260973) }, { FRAC_CONST(0.031226022360754), FRAC_CONST(0.031273959255676) }, { FRAC_CONST(0.031033541133193), FRAC_CONST(0.031464969803488) }, { FRAC_CONST(0.030839891510348), FRAC_CONST(0.031654795712972) }, { FRAC_CONST(0.030645080783018), FRAC_CONST(0.031843429837288) }, { FRAC_CONST(0.030449116285718), FRAC_CONST(0.032030865074469) }, { FRAC_CONST(0.030252005396399), FRAC_CONST(0.032217094367684) }, { FRAC_CONST(0.030053755536176), FRAC_CONST(0.032402110705505) }, { FRAC_CONST(0.029854374169043), FRAC_CONST(0.032585907122172) }, { FRAC_CONST(0.029653868801596), FRAC_CONST(0.032768476697853) }, { FRAC_CONST(0.029452246982750), FRAC_CONST(0.032949812558907) }, { FRAC_CONST(0.029249516303451), FRAC_CONST(0.033129907878142) }, { FRAC_CONST(0.029045684396395), FRAC_CONST(0.033308755875070) }, { FRAC_CONST(0.028840758935738), FRAC_CONST(0.033486349816166) }, { FRAC_CONST(0.028634747636808), FRAC_CONST(0.033662683015118) }, { FRAC_CONST(0.028427658255815), FRAC_CONST(0.033837748833080) }, { FRAC_CONST(0.028219498589555), FRAC_CONST(0.034011540678924) }, { FRAC_CONST(0.028010276475123), FRAC_CONST(0.034184052009485) }, { FRAC_CONST(0.027799999789613), FRAC_CONST(0.034355276329809) }, { FRAC_CONST(0.027588676449824), FRAC_CONST(0.034525207193396) }, { FRAC_CONST(0.027376314411959), FRAC_CONST(0.034693838202447) }, { FRAC_CONST(0.027162921671330), FRAC_CONST(0.034861163008098) }, { FRAC_CONST(0.026948506262053), FRAC_CONST(0.035027175310665) }, { FRAC_CONST(0.026733076256746), FRAC_CONST(0.035191868859880) }, { FRAC_CONST(0.026516639766228), FRAC_CONST(0.035355237455122) }, { FRAC_CONST(0.026299204939210), FRAC_CONST(0.035517274945657) }, { FRAC_CONST(0.026080779961991), FRAC_CONST(0.035677975230865) }, { FRAC_CONST(0.025861373058146), FRAC_CONST(0.035837332260471) }, { FRAC_CONST(0.025640992488223), FRAC_CONST(0.035995340034772) }, { FRAC_CONST(0.025419646549425), FRAC_CONST(0.036151992604866) }, { FRAC_CONST(0.025197343575302), FRAC_CONST(0.036307284072871) }, { FRAC_CONST(0.024974091935435), FRAC_CONST(0.036461208592152) }, { FRAC_CONST(0.024749900035122), FRAC_CONST(0.036613760367538) }, { FRAC_CONST(0.024524776315061), FRAC_CONST(0.036764933655540) }, { FRAC_CONST(0.024298729251033), FRAC_CONST(0.036914722764569) }, { FRAC_CONST(0.024071767353583), FRAC_CONST(0.037063122055150) }, { FRAC_CONST(0.023843899167697), FRAC_CONST(0.037210125940135) }, { FRAC_CONST(0.023615133272485), FRAC_CONST(0.037355728884908) }, { FRAC_CONST(0.023385478280852), FRAC_CONST(0.037499925407603) }, { FRAC_CONST(0.023154942839179), FRAC_CONST(0.037642710079302) }, { FRAC_CONST(0.022923535626995), FRAC_CONST(0.037784077524241) }, { FRAC_CONST(0.022691265356652), FRAC_CONST(0.037924022420018) }, { FRAC_CONST(0.022458140772993), FRAC_CONST(0.038062539497785) }, { FRAC_CONST(0.022224170653027), FRAC_CONST(0.038199623542453) }, { FRAC_CONST(0.021989363805598), FRAC_CONST(0.038335269392885) }, { FRAC_CONST(0.021753729071049), FRAC_CONST(0.038469471942092) }, { FRAC_CONST(0.021517275320897), FRAC_CONST(0.038602226137423) }, { FRAC_CONST(0.021280011457490), FRAC_CONST(0.038733526980758) }, { FRAC_CONST(0.021041946413679), FRAC_CONST(0.038863369528695) }, { FRAC_CONST(0.020803089152479), FRAC_CONST(0.038991748892734) }, { FRAC_CONST(0.020563448666730), FRAC_CONST(0.039118660239466) }, { FRAC_CONST(0.020323033978761), FRAC_CONST(0.039244098790750) }, { FRAC_CONST(0.020081854140050), FRAC_CONST(0.039368059823895) }, { FRAC_CONST(0.019839918230880), FRAC_CONST(0.039490538671839) }, { FRAC_CONST(0.019597235360003), FRAC_CONST(0.039611530723322) }, { FRAC_CONST(0.019353814664291), FRAC_CONST(0.039731031423061) }, { FRAC_CONST(0.019109665308395), FRAC_CONST(0.039849036271924) }, { FRAC_CONST(0.018864796484402), FRAC_CONST(0.039965540827094) }, { FRAC_CONST(0.018619217411483), FRAC_CONST(0.040080540702240) }, { FRAC_CONST(0.018372937335552), FRAC_CONST(0.040194031567683) }, { FRAC_CONST(0.018125965528915), FRAC_CONST(0.040306009150554) }, { FRAC_CONST(0.017878311289921), FRAC_CONST(0.040416469234963) }, { FRAC_CONST(0.017629983942612), FRAC_CONST(0.040525407662148) }, { FRAC_CONST(0.017380992836371), FRAC_CONST(0.040632820330639) }, { FRAC_CONST(0.017131347345575), FRAC_CONST(0.040738703196411) }, { FRAC_CONST(0.016881056869233), FRAC_CONST(0.040843052273033) }, { FRAC_CONST(0.016630130830641), FRAC_CONST(0.040945863631822) }, { FRAC_CONST(0.016378578677023), FRAC_CONST(0.041047133401988) }, { FRAC_CONST(0.016126409879175), FRAC_CONST(0.041146857770781) }, { FRAC_CONST(0.015873633931110), FRAC_CONST(0.041245032983635) }, { FRAC_CONST(0.015620260349699), FRAC_CONST(0.041341655344309) }, { FRAC_CONST(0.015366298674314), FRAC_CONST(0.041436721215026) }, { FRAC_CONST(0.015111758466470), FRAC_CONST(0.041530227016609) }, { FRAC_CONST(0.014856649309460), FRAC_CONST(0.041622169228618) }, { FRAC_CONST(0.014600980808001), FRAC_CONST(0.041712544389481) }, { FRAC_CONST(0.014344762587867), FRAC_CONST(0.041801349096623) }, { FRAC_CONST(0.014088004295529), FRAC_CONST(0.041888580006598) }, { FRAC_CONST(0.013830715597792), FRAC_CONST(0.041974233835211) }, { FRAC_CONST(0.013572906181430), FRAC_CONST(0.042058307357645) }, { FRAC_CONST(0.013314585752822), FRAC_CONST(0.042140797408577) }, { FRAC_CONST(0.013055764037585), FRAC_CONST(0.042221700882306) }, { FRAC_CONST(0.012796450780212), FRAC_CONST(0.042301014732860) }, { FRAC_CONST(0.012536655743699), FRAC_CONST(0.042378735974118) }, { FRAC_CONST(0.012276388709183), FRAC_CONST(0.042454861679919) }, { FRAC_CONST(0.012015659475571), FRAC_CONST(0.042529388984173) }, { FRAC_CONST(0.011754477859172), FRAC_CONST(0.042602315080970) }, { FRAC_CONST(0.011492853693324), FRAC_CONST(0.042673637224683) }, { FRAC_CONST(0.011230796828031), FRAC_CONST(0.042743352730074) }, { FRAC_CONST(0.010968317129584), FRAC_CONST(0.042811458972393) }, { FRAC_CONST(0.010705424480197), FRAC_CONST(0.042877953387479) }, { FRAC_CONST(0.010442128777629), FRAC_CONST(0.042942833471854) }, { FRAC_CONST(0.010178439934815), FRAC_CONST(0.043006096782821) }, { FRAC_CONST(0.009914367879490), FRAC_CONST(0.043067740938551) }, { FRAC_CONST(0.009649922553818), FRAC_CONST(0.043127763618177) }, { FRAC_CONST(0.009385113914016), FRAC_CONST(0.043186162561878) }, { FRAC_CONST(0.009119951929979), FRAC_CONST(0.043242935570968) }, { FRAC_CONST(0.008854446584907), FRAC_CONST(0.043298080507974) }, { FRAC_CONST(0.008588607874926), FRAC_CONST(0.043351595296722) }, { FRAC_CONST(0.008322445808712), FRAC_CONST(0.043403477922409) }, { FRAC_CONST(0.008055970407118), FRAC_CONST(0.043453726431684) }, { FRAC_CONST(0.007789191702791), FRAC_CONST(0.043502338932719) }, { FRAC_CONST(0.007522119739798), FRAC_CONST(0.043549313595281) }, { FRAC_CONST(0.007254764573250), FRAC_CONST(0.043594648650800) }, { FRAC_CONST(0.006987136268915), FRAC_CONST(0.043638342392438) }, { FRAC_CONST(0.006719244902849), FRAC_CONST(0.043680393175148) }, { FRAC_CONST(0.006451100561010), FRAC_CONST(0.043720799415744) }, { FRAC_CONST(0.006182713338881), FRAC_CONST(0.043759559592953) }, { FRAC_CONST(0.005914093341090), FRAC_CONST(0.043796672247476) }, { FRAC_CONST(0.005645250681027), FRAC_CONST(0.043832135982044) }, { FRAC_CONST(0.005376195480466), FRAC_CONST(0.043865949461465) }, { FRAC_CONST(0.005106937869184), FRAC_CONST(0.043898111412683) }, { FRAC_CONST(0.004837487984578), FRAC_CONST(0.043928620624817) }, { FRAC_CONST(0.004567855971284), FRAC_CONST(0.043957475949213) }, { FRAC_CONST(0.004298051980793), FRAC_CONST(0.043984676299484) }, { FRAC_CONST(0.004028086171076), FRAC_CONST(0.044010220651553) }, { FRAC_CONST(0.003757968706190), FRAC_CONST(0.044034108043689) }, { FRAC_CONST(0.003487709755907), FRAC_CONST(0.044056337576546) }, { FRAC_CONST(0.003217319495322), FRAC_CONST(0.044076908413193) }, { FRAC_CONST(0.002946808104477), FRAC_CONST(0.044095819779151) }, { FRAC_CONST(0.002676185767973), FRAC_CONST(0.044113070962418) }, { FRAC_CONST(0.002405462674586), FRAC_CONST(0.044128661313495) }, { FRAC_CONST(0.002134649016890), FRAC_CONST(0.044142590245416) }, { FRAC_CONST(0.001863754990865), FRAC_CONST(0.044154857233763) }, { FRAC_CONST(0.001592790795518), FRAC_CONST(0.044165461816692) }, { FRAC_CONST(0.001321766632497), FRAC_CONST(0.044174403594946) }, { FRAC_CONST(0.001050692705710), FRAC_CONST(0.044181682231873) }, { FRAC_CONST(0.000779579220936), FRAC_CONST(0.044187297453434) }, { FRAC_CONST(0.000508436385446), FRAC_CONST(0.044191249048222) }, { FRAC_CONST(0.000237274407613), FRAC_CONST(0.044193536867459) } }; #endif // LD_DEC #ifdef ALLOW_SMALL_FRAMELENGTH /* 480 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_1920[] = { { FRAC_CONST(0.032274858518097), FRAC_CONST(0.000013202404176) }, { FRAC_CONST(0.032274642494505), FRAC_CONST(0.000118821372483) }, { FRAC_CONST(0.032274080835421), FRAC_CONST(0.000224439068308) }, { FRAC_CONST(0.032273173546860), FRAC_CONST(0.000330054360572) }, { FRAC_CONST(0.032271920638538), FRAC_CONST(0.000435666118218) }, { FRAC_CONST(0.032270322123873), FRAC_CONST(0.000541273210231) }, { FRAC_CONST(0.032268378019984), FRAC_CONST(0.000646874505642) }, { FRAC_CONST(0.032266088347691), FRAC_CONST(0.000752468873546) }, { FRAC_CONST(0.032263453131514), FRAC_CONST(0.000858055183114) }, { FRAC_CONST(0.032260472399674), FRAC_CONST(0.000963632303600) }, { FRAC_CONST(0.032257146184092), FRAC_CONST(0.001069199104358) }, { FRAC_CONST(0.032253474520390), FRAC_CONST(0.001174754454853) }, { FRAC_CONST(0.032249457447888), FRAC_CONST(0.001280297224671) }, { FRAC_CONST(0.032245095009606), FRAC_CONST(0.001385826283535) }, { FRAC_CONST(0.032240387252262), FRAC_CONST(0.001491340501313) }, { FRAC_CONST(0.032235334226272), FRAC_CONST(0.001596838748031) }, { FRAC_CONST(0.032229935985750), FRAC_CONST(0.001702319893890) }, { FRAC_CONST(0.032224192588507), FRAC_CONST(0.001807782809271) }, { FRAC_CONST(0.032218104096050), FRAC_CONST(0.001913226364749) }, { FRAC_CONST(0.032211670573582), FRAC_CONST(0.002018649431111) }, { FRAC_CONST(0.032204892090000), FRAC_CONST(0.002124050879359) }, { FRAC_CONST(0.032197768717898), FRAC_CONST(0.002229429580728) }, { FRAC_CONST(0.032190300533560), FRAC_CONST(0.002334784406698) }, { FRAC_CONST(0.032182487616965), FRAC_CONST(0.002440114229003) }, { FRAC_CONST(0.032174330051782), FRAC_CONST(0.002545417919644) }, { FRAC_CONST(0.032165827925374), FRAC_CONST(0.002650694350905) }, { FRAC_CONST(0.032156981328790), FRAC_CONST(0.002755942395358) }, { FRAC_CONST(0.032147790356771), FRAC_CONST(0.002861160925883) }, { FRAC_CONST(0.032138255107744), FRAC_CONST(0.002966348815672) }, { FRAC_CONST(0.032128375683825), FRAC_CONST(0.003071504938250) }, { FRAC_CONST(0.032118152190814), FRAC_CONST(0.003176628167476) }, { FRAC_CONST(0.032107584738196), FRAC_CONST(0.003281717377568) }, { FRAC_CONST(0.032096673439141), FRAC_CONST(0.003386771443102) }, { FRAC_CONST(0.032085418410500), FRAC_CONST(0.003491789239036) }, { FRAC_CONST(0.032073819772804), FRAC_CONST(0.003596769640711) }, { FRAC_CONST(0.032061877650267), FRAC_CONST(0.003701711523874) }, { FRAC_CONST(0.032049592170778), FRAC_CONST(0.003806613764680) }, { FRAC_CONST(0.032036963465906), FRAC_CONST(0.003911475239711) }, { FRAC_CONST(0.032023991670893), FRAC_CONST(0.004016294825985) }, { FRAC_CONST(0.032010676924657), FRAC_CONST(0.004121071400967) }, { FRAC_CONST(0.031997019369789), FRAC_CONST(0.004225803842586) }, { FRAC_CONST(0.031983019152549), FRAC_CONST(0.004330491029241) }, { FRAC_CONST(0.031968676422869), FRAC_CONST(0.004435131839816) }, { FRAC_CONST(0.031953991334348), FRAC_CONST(0.004539725153692) }, { FRAC_CONST(0.031938964044252), FRAC_CONST(0.004644269850758) }, { FRAC_CONST(0.031923594713510), FRAC_CONST(0.004748764811426) }, { FRAC_CONST(0.031907883506716), FRAC_CONST(0.004853208916638) }, { FRAC_CONST(0.031891830592124), FRAC_CONST(0.004957601047881) }, { FRAC_CONST(0.031875436141648), FRAC_CONST(0.005061940087200) }, { FRAC_CONST(0.031858700330859), FRAC_CONST(0.005166224917208) }, { FRAC_CONST(0.031841623338985), FRAC_CONST(0.005270454421097) }, { FRAC_CONST(0.031824205348907), FRAC_CONST(0.005374627482653) }, { FRAC_CONST(0.031806446547156), FRAC_CONST(0.005478742986267) }, { FRAC_CONST(0.031788347123916), FRAC_CONST(0.005582799816945) }, { FRAC_CONST(0.031769907273017), FRAC_CONST(0.005686796860323) }, { FRAC_CONST(0.031751127191935), FRAC_CONST(0.005790733002674) }, { FRAC_CONST(0.031732007081789), FRAC_CONST(0.005894607130928) }, { FRAC_CONST(0.031712547147340), FRAC_CONST(0.005998418132675) }, { FRAC_CONST(0.031692747596989), FRAC_CONST(0.006102164896182) }, { FRAC_CONST(0.031672608642773), FRAC_CONST(0.006205846310406) }, { FRAC_CONST(0.031652130500364), FRAC_CONST(0.006309461265002) }, { FRAC_CONST(0.031631313389067), FRAC_CONST(0.006413008650337) }, { FRAC_CONST(0.031610157531816), FRAC_CONST(0.006516487357501) }, { FRAC_CONST(0.031588663155172), FRAC_CONST(0.006619896278321) }, { FRAC_CONST(0.031566830489325), FRAC_CONST(0.006723234305370) }, { FRAC_CONST(0.031544659768083), FRAC_CONST(0.006826500331981) }, { FRAC_CONST(0.031522151228878), FRAC_CONST(0.006929693252258) }, { FRAC_CONST(0.031499305112758), FRAC_CONST(0.007032811961088) }, { FRAC_CONST(0.031476121664387), FRAC_CONST(0.007135855354151) }, { FRAC_CONST(0.031452601132040), FRAC_CONST(0.007238822327937) }, { FRAC_CONST(0.031428743767604), FRAC_CONST(0.007341711779751) }, { FRAC_CONST(0.031404549826572), FRAC_CONST(0.007444522607730) }, { FRAC_CONST(0.031380019568042), FRAC_CONST(0.007547253710853) }, { FRAC_CONST(0.031355153254712), FRAC_CONST(0.007649903988952) }, { FRAC_CONST(0.031329951152882), FRAC_CONST(0.007752472342725) }, { FRAC_CONST(0.031304413532445), FRAC_CONST(0.007854957673748) }, { FRAC_CONST(0.031278540666888), FRAC_CONST(0.007957358884484) }, { FRAC_CONST(0.031252332833290), FRAC_CONST(0.008059674878300) }, { FRAC_CONST(0.031225790312316), FRAC_CONST(0.008161904559473) }, { FRAC_CONST(0.031198913388214), FRAC_CONST(0.008264046833205) }, { FRAC_CONST(0.031171702348814), FRAC_CONST(0.008366100605636) }, { FRAC_CONST(0.031144157485525), FRAC_CONST(0.008468064783849) }, { FRAC_CONST(0.031116279093331), FRAC_CONST(0.008569938275893) }, { FRAC_CONST(0.031088067470786), FRAC_CONST(0.008671719990782) }, { FRAC_CONST(0.031059522920014), FRAC_CONST(0.008773408838517) }, { FRAC_CONST(0.031030645746705), FRAC_CONST(0.008875003730092) }, { FRAC_CONST(0.031001436260110), FRAC_CONST(0.008976503577507) }, { FRAC_CONST(0.030971894773039), FRAC_CONST(0.009077907293780) }, { FRAC_CONST(0.030942021601857), FRAC_CONST(0.009179213792959) }, { FRAC_CONST(0.030911817066483), FRAC_CONST(0.009280421990133) }, { FRAC_CONST(0.030881281490382), FRAC_CONST(0.009381530801444) }, { FRAC_CONST(0.030850415200566), FRAC_CONST(0.009482539144097) }, { FRAC_CONST(0.030819218527589), FRAC_CONST(0.009583445936373) }, { FRAC_CONST(0.030787691805541), FRAC_CONST(0.009684250097643) }, { FRAC_CONST(0.030755835372048), FRAC_CONST(0.009784950548375) }, { FRAC_CONST(0.030723649568268), FRAC_CONST(0.009885546210147) }, { FRAC_CONST(0.030691134738883), FRAC_CONST(0.009986036005661) }, { FRAC_CONST(0.030658291232103), FRAC_CONST(0.010086418858753) }, { FRAC_CONST(0.030625119399655), FRAC_CONST(0.010186693694402) }, { FRAC_CONST(0.030591619596781), FRAC_CONST(0.010286859438745) }, { FRAC_CONST(0.030557792182239), FRAC_CONST(0.010386915019088) }, { FRAC_CONST(0.030523637518292), FRAC_CONST(0.010486859363916) }, { FRAC_CONST(0.030489155970710), FRAC_CONST(0.010586691402906) }, { FRAC_CONST(0.030454347908763), FRAC_CONST(0.010686410066936) }, { FRAC_CONST(0.030419213705216), FRAC_CONST(0.010786014288099) }, { FRAC_CONST(0.030383753736329), FRAC_CONST(0.010885502999714) }, { FRAC_CONST(0.030347968381849), FRAC_CONST(0.010984875136338) }, { FRAC_CONST(0.030311858025010), FRAC_CONST(0.011084129633775) }, { FRAC_CONST(0.030275423052523), FRAC_CONST(0.011183265429088) }, { FRAC_CONST(0.030238663854579), FRAC_CONST(0.011282281460612) }, { FRAC_CONST(0.030201580824838), FRAC_CONST(0.011381176667967) }, { FRAC_CONST(0.030164174360430), FRAC_CONST(0.011479949992062) }, { FRAC_CONST(0.030126444861948), FRAC_CONST(0.011578600375117) }, { FRAC_CONST(0.030088392733446), FRAC_CONST(0.011677126760663) }, { FRAC_CONST(0.030050018382430), FRAC_CONST(0.011775528093563) }, { FRAC_CONST(0.030011322219859), FRAC_CONST(0.011873803320018) }, { FRAC_CONST(0.029972304660138), FRAC_CONST(0.011971951387578) }, { FRAC_CONST(0.029932966121114), FRAC_CONST(0.012069971245157) }, { FRAC_CONST(0.029893307024070), FRAC_CONST(0.012167861843041) }, { FRAC_CONST(0.029853327793724), FRAC_CONST(0.012265622132901) }, { FRAC_CONST(0.029813028858222), FRAC_CONST(0.012363251067801) }, { FRAC_CONST(0.029772410649132), FRAC_CONST(0.012460747602215) }, { FRAC_CONST(0.029731473601443), FRAC_CONST(0.012558110692033) }, { FRAC_CONST(0.029690218153558), FRAC_CONST(0.012655339294575) }, { FRAC_CONST(0.029648644747289), FRAC_CONST(0.012752432368600) }, { FRAC_CONST(0.029606753827855), FRAC_CONST(0.012849388874320) }, { FRAC_CONST(0.029564545843872), FRAC_CONST(0.012946207773407) }, { FRAC_CONST(0.029522021247356), FRAC_CONST(0.013042888029011) }, { FRAC_CONST(0.029479180493710), FRAC_CONST(0.013139428605762) }, { FRAC_CONST(0.029436024041725), FRAC_CONST(0.013235828469789) }, { FRAC_CONST(0.029392552353570), FRAC_CONST(0.013332086588727) }, { FRAC_CONST(0.029348765894794), FRAC_CONST(0.013428201931728) }, { FRAC_CONST(0.029304665134313), FRAC_CONST(0.013524173469475) }, { FRAC_CONST(0.029260250544412), FRAC_CONST(0.013620000174189) }, { FRAC_CONST(0.029215522600735), FRAC_CONST(0.013715681019643) }, { FRAC_CONST(0.029170481782283), FRAC_CONST(0.013811214981173) }, { FRAC_CONST(0.029125128571406), FRAC_CONST(0.013906601035686) }, { FRAC_CONST(0.029079463453801), FRAC_CONST(0.014001838161674) }, { FRAC_CONST(0.029033486918505), FRAC_CONST(0.014096925339225) }, { FRAC_CONST(0.028987199457889), FRAC_CONST(0.014191861550031) }, { FRAC_CONST(0.028940601567655), FRAC_CONST(0.014286645777401) }, { FRAC_CONST(0.028893693746829), FRAC_CONST(0.014381277006273) }, { FRAC_CONST(0.028846476497755), FRAC_CONST(0.014475754223221) }, { FRAC_CONST(0.028798950326094), FRAC_CONST(0.014570076416472) }, { FRAC_CONST(0.028751115740811), FRAC_CONST(0.014664242575910) }, { FRAC_CONST(0.028702973254178), FRAC_CONST(0.014758251693091) }, { FRAC_CONST(0.028654523381760), FRAC_CONST(0.014852102761253) }, { FRAC_CONST(0.028605766642418), FRAC_CONST(0.014945794775326) }, { FRAC_CONST(0.028556703558297), FRAC_CONST(0.015039326731945) }, { FRAC_CONST(0.028507334654823), FRAC_CONST(0.015132697629457) }, { FRAC_CONST(0.028457660460698), FRAC_CONST(0.015225906467935) }, { FRAC_CONST(0.028407681507891), FRAC_CONST(0.015318952249187) }, { FRAC_CONST(0.028357398331639), FRAC_CONST(0.015411833976768) }, { FRAC_CONST(0.028306811470432), FRAC_CONST(0.015504550655988) }, { FRAC_CONST(0.028255921466016), FRAC_CONST(0.015597101293927) }, { FRAC_CONST(0.028204728863381), FRAC_CONST(0.015689484899442) }, { FRAC_CONST(0.028153234210760), FRAC_CONST(0.015781700483179) }, { FRAC_CONST(0.028101438059619), FRAC_CONST(0.015873747057582) }, { FRAC_CONST(0.028049340964652), FRAC_CONST(0.015965623636907) }, { FRAC_CONST(0.027996943483779), FRAC_CONST(0.016057329237229) }, { FRAC_CONST(0.027944246178133), FRAC_CONST(0.016148862876456) }, { FRAC_CONST(0.027891249612061), FRAC_CONST(0.016240223574335) }, { FRAC_CONST(0.027837954353113), FRAC_CONST(0.016331410352467) }, { FRAC_CONST(0.027784360972039), FRAC_CONST(0.016422422234315) }, { FRAC_CONST(0.027730470042780), FRAC_CONST(0.016513258245214) }, { FRAC_CONST(0.027676282142466), FRAC_CONST(0.016603917412384) }, { FRAC_CONST(0.027621797851405), FRAC_CONST(0.016694398764938) }, { FRAC_CONST(0.027567017753080), FRAC_CONST(0.016784701333894) }, { FRAC_CONST(0.027511942434143), FRAC_CONST(0.016874824152183) }, { FRAC_CONST(0.027456572484404), FRAC_CONST(0.016964766254662) }, { FRAC_CONST(0.027400908496833), FRAC_CONST(0.017054526678124) }, { FRAC_CONST(0.027344951067546), FRAC_CONST(0.017144104461307) }, { FRAC_CONST(0.027288700795801), FRAC_CONST(0.017233498644904) }, { FRAC_CONST(0.027232158283994), FRAC_CONST(0.017322708271577) }, { FRAC_CONST(0.027175324137651), FRAC_CONST(0.017411732385960) }, { FRAC_CONST(0.027118198965418), FRAC_CONST(0.017500570034678) }, { FRAC_CONST(0.027060783379060), FRAC_CONST(0.017589220266351) }, { FRAC_CONST(0.027003077993454), FRAC_CONST(0.017677682131607) }, { FRAC_CONST(0.026945083426576), FRAC_CONST(0.017765954683088) }, { FRAC_CONST(0.026886800299502), FRAC_CONST(0.017854036975468) }, { FRAC_CONST(0.026828229236397), FRAC_CONST(0.017941928065456) }, { FRAC_CONST(0.026769370864511), FRAC_CONST(0.018029627011808) }, { FRAC_CONST(0.026710225814170), FRAC_CONST(0.018117132875340) }, { FRAC_CONST(0.026650794718768), FRAC_CONST(0.018204444718934) }, { FRAC_CONST(0.026591078214767), FRAC_CONST(0.018291561607551) }, { FRAC_CONST(0.026531076941680), FRAC_CONST(0.018378482608238) }, { FRAC_CONST(0.026470791542075), FRAC_CONST(0.018465206790142) }, { FRAC_CONST(0.026410222661558), FRAC_CONST(0.018551733224515) }, { FRAC_CONST(0.026349370948775), FRAC_CONST(0.018638060984730) }, { FRAC_CONST(0.026288237055398), FRAC_CONST(0.018724189146286) }, { FRAC_CONST(0.026226821636121), FRAC_CONST(0.018810116786819) }, { FRAC_CONST(0.026165125348656), FRAC_CONST(0.018895842986112) }, { FRAC_CONST(0.026103148853718), FRAC_CONST(0.018981366826109) }, { FRAC_CONST(0.026040892815028), FRAC_CONST(0.019066687390916) }, { FRAC_CONST(0.025978357899296), FRAC_CONST(0.019151803766819) }, { FRAC_CONST(0.025915544776223), FRAC_CONST(0.019236715042290) }, { FRAC_CONST(0.025852454118485), FRAC_CONST(0.019321420307998) }, { FRAC_CONST(0.025789086601733), FRAC_CONST(0.019405918656817) }, { FRAC_CONST(0.025725442904582), FRAC_CONST(0.019490209183837) }, { FRAC_CONST(0.025661523708606), FRAC_CONST(0.019574290986376) }, { FRAC_CONST(0.025597329698327), FRAC_CONST(0.019658163163984) }, { FRAC_CONST(0.025532861561211), FRAC_CONST(0.019741824818458) }, { FRAC_CONST(0.025468119987662), FRAC_CONST(0.019825275053848) }, { FRAC_CONST(0.025403105671008), FRAC_CONST(0.019908512976470) }, { FRAC_CONST(0.025337819307501), FRAC_CONST(0.019991537694913) }, { FRAC_CONST(0.025272261596305), FRAC_CONST(0.020074348320047) }, { FRAC_CONST(0.025206433239491), FRAC_CONST(0.020156943965039) }, { FRAC_CONST(0.025140334942028), FRAC_CONST(0.020239323745355) }, { FRAC_CONST(0.025073967411776), FRAC_CONST(0.020321486778774) }, { FRAC_CONST(0.025007331359476), FRAC_CONST(0.020403432185395) }, { FRAC_CONST(0.024940427498748), FRAC_CONST(0.020485159087650) }, { FRAC_CONST(0.024873256546079), FRAC_CONST(0.020566666610309) }, { FRAC_CONST(0.024805819220816), FRAC_CONST(0.020647953880491) }, { FRAC_CONST(0.024738116245157), FRAC_CONST(0.020729020027676) }, { FRAC_CONST(0.024670148344147), FRAC_CONST(0.020809864183709) }, { FRAC_CONST(0.024601916245669), FRAC_CONST(0.020890485482816) }, { FRAC_CONST(0.024533420680433), FRAC_CONST(0.020970883061607) }, { FRAC_CONST(0.024464662381971), FRAC_CONST(0.021051056059087) }, { FRAC_CONST(0.024395642086630), FRAC_CONST(0.021131003616670) }, { FRAC_CONST(0.024326360533561), FRAC_CONST(0.021210724878181) }, { FRAC_CONST(0.024256818464715), FRAC_CONST(0.021290218989868) }, { FRAC_CONST(0.024187016624830), FRAC_CONST(0.021369485100415) }, { FRAC_CONST(0.024116955761430), FRAC_CONST(0.021448522360944) }, { FRAC_CONST(0.024046636624808), FRAC_CONST(0.021527329925030) }, { FRAC_CONST(0.023976059968027), FRAC_CONST(0.021605906948708) }, { FRAC_CONST(0.023905226546906), FRAC_CONST(0.021684252590480) }, { FRAC_CONST(0.023834137120014), FRAC_CONST(0.021762366011328) }, { FRAC_CONST(0.023762792448662), FRAC_CONST(0.021840246374720) }, { FRAC_CONST(0.023691193296893), FRAC_CONST(0.021917892846620) }, { FRAC_CONST(0.023619340431478), FRAC_CONST(0.021995304595495) }, { FRAC_CONST(0.023547234621902), FRAC_CONST(0.022072480792330) }, { FRAC_CONST(0.023474876640361), FRAC_CONST(0.022149420610628) }, { FRAC_CONST(0.023402267261751), FRAC_CONST(0.022226123226426) }, { FRAC_CONST(0.023329407263659), FRAC_CONST(0.022302587818300) }, { FRAC_CONST(0.023256297426359), FRAC_CONST(0.022378813567377) }, { FRAC_CONST(0.023182938532797), FRAC_CONST(0.022454799657339) }, { FRAC_CONST(0.023109331368588), FRAC_CONST(0.022530545274437) }, { FRAC_CONST(0.023035476722006), FRAC_CONST(0.022606049607496) }, { FRAC_CONST(0.022961375383975), FRAC_CONST(0.022681311847926) }, { FRAC_CONST(0.022887028148061), FRAC_CONST(0.022756331189727) }, { FRAC_CONST(0.022812435810462), FRAC_CONST(0.022831106829504) }, { FRAC_CONST(0.022737599170003), FRAC_CONST(0.022905637966469) }, { FRAC_CONST(0.022662519028125), FRAC_CONST(0.022979923802453) }, { FRAC_CONST(0.022587196188874), FRAC_CONST(0.023053963541915) }, { FRAC_CONST(0.022511631458899), FRAC_CONST(0.023127756391950) }, { FRAC_CONST(0.022435825647437), FRAC_CONST(0.023201301562294) }, { FRAC_CONST(0.022359779566306), FRAC_CONST(0.023274598265338) }, { FRAC_CONST(0.022283494029900), FRAC_CONST(0.023347645716133) }, { FRAC_CONST(0.022206969855176), FRAC_CONST(0.023420443132400) }, { FRAC_CONST(0.022130207861645), FRAC_CONST(0.023492989734537) }, { FRAC_CONST(0.022053208871367), FRAC_CONST(0.023565284745628) }, { FRAC_CONST(0.021975973708940), FRAC_CONST(0.023637327391451) }, { FRAC_CONST(0.021898503201489), FRAC_CONST(0.023709116900488) }, { FRAC_CONST(0.021820798178663), FRAC_CONST(0.023780652503931) }, { FRAC_CONST(0.021742859472618), FRAC_CONST(0.023851933435691) }, { FRAC_CONST(0.021664687918017), FRAC_CONST(0.023922958932406) }, { FRAC_CONST(0.021586284352013), FRAC_CONST(0.023993728233451) }, { FRAC_CONST(0.021507649614247), FRAC_CONST(0.024064240580942) }, { FRAC_CONST(0.021428784546832), FRAC_CONST(0.024134495219750) }, { FRAC_CONST(0.021349689994350), FRAC_CONST(0.024204491397504) }, { FRAC_CONST(0.021270366803840), FRAC_CONST(0.024274228364600) }, { FRAC_CONST(0.021190815824791), FRAC_CONST(0.024343705374213) }, { FRAC_CONST(0.021111037909128), FRAC_CONST(0.024412921682298) }, { FRAC_CONST(0.021031033911210), FRAC_CONST(0.024481876547605) }, { FRAC_CONST(0.020950804687815), FRAC_CONST(0.024550569231683) }, { FRAC_CONST(0.020870351098134), FRAC_CONST(0.024618998998889) }, { FRAC_CONST(0.020789674003759), FRAC_CONST(0.024687165116394) }, { FRAC_CONST(0.020708774268678), FRAC_CONST(0.024755066854194) }, { FRAC_CONST(0.020627652759262), FRAC_CONST(0.024822703485116) }, { FRAC_CONST(0.020546310344257), FRAC_CONST(0.024890074284826) }, { FRAC_CONST(0.020464747894775), FRAC_CONST(0.024957178531837) }, { FRAC_CONST(0.020382966284284), FRAC_CONST(0.025024015507516) }, { FRAC_CONST(0.020300966388600), FRAC_CONST(0.025090584496093) }, { FRAC_CONST(0.020218749085876), FRAC_CONST(0.025156884784668) }, { FRAC_CONST(0.020136315256592), FRAC_CONST(0.025222915663218) }, { FRAC_CONST(0.020053665783549), FRAC_CONST(0.025288676424605) }, { FRAC_CONST(0.019970801551857), FRAC_CONST(0.025354166364584) }, { FRAC_CONST(0.019887723448925), FRAC_CONST(0.025419384781811) }, { FRAC_CONST(0.019804432364452), FRAC_CONST(0.025484330977848) }, { FRAC_CONST(0.019720929190419), FRAC_CONST(0.025549004257175) }, { FRAC_CONST(0.019637214821078), FRAC_CONST(0.025613403927192) }, { FRAC_CONST(0.019553290152943), FRAC_CONST(0.025677529298230) }, { FRAC_CONST(0.019469156084779), FRAC_CONST(0.025741379683559) }, { FRAC_CONST(0.019384813517595), FRAC_CONST(0.025804954399392) }, { FRAC_CONST(0.019300263354632), FRAC_CONST(0.025868252764895) }, { FRAC_CONST(0.019215506501354), FRAC_CONST(0.025931274102193) }, { FRAC_CONST(0.019130543865439), FRAC_CONST(0.025994017736379) }, { FRAC_CONST(0.019045376356769), FRAC_CONST(0.026056482995518) }, { FRAC_CONST(0.018960004887419), FRAC_CONST(0.026118669210657) }, { FRAC_CONST(0.018874430371648), FRAC_CONST(0.026180575715833) }, { FRAC_CONST(0.018788653725892), FRAC_CONST(0.026242201848076) }, { FRAC_CONST(0.018702675868750), FRAC_CONST(0.026303546947421) }, { FRAC_CONST(0.018616497720974), FRAC_CONST(0.026364610356909) }, { FRAC_CONST(0.018530120205464), FRAC_CONST(0.026425391422602) }, { FRAC_CONST(0.018443544247254), FRAC_CONST(0.026485889493583) }, { FRAC_CONST(0.018356770773502), FRAC_CONST(0.026546103921965) }, { FRAC_CONST(0.018269800713483), FRAC_CONST(0.026606034062902) }, { FRAC_CONST(0.018182634998576), FRAC_CONST(0.026665679274589) }, { FRAC_CONST(0.018095274562256), FRAC_CONST(0.026725038918274) }, { FRAC_CONST(0.018007720340083), FRAC_CONST(0.026784112358263) }, { FRAC_CONST(0.017919973269692), FRAC_CONST(0.026842898961926) }, { FRAC_CONST(0.017832034290785), FRAC_CONST(0.026901398099707) }, { FRAC_CONST(0.017743904345116), FRAC_CONST(0.026959609145127) }, { FRAC_CONST(0.017655584376488), FRAC_CONST(0.027017531474792) }, { FRAC_CONST(0.017567075330734), FRAC_CONST(0.027075164468401) }, { FRAC_CONST(0.017478378155718), FRAC_CONST(0.027132507508750) }, { FRAC_CONST(0.017389493801313), FRAC_CONST(0.027189559981742) }, { FRAC_CONST(0.017300423219401), FRAC_CONST(0.027246321276391) }, { FRAC_CONST(0.017211167363854), FRAC_CONST(0.027302790784828) }, { FRAC_CONST(0.017121727190533), FRAC_CONST(0.027358967902310) }, { FRAC_CONST(0.017032103657269), FRAC_CONST(0.027414852027226) }, { FRAC_CONST(0.016942297723858), FRAC_CONST(0.027470442561102) }, { FRAC_CONST(0.016852310352050), FRAC_CONST(0.027525738908608) }, { FRAC_CONST(0.016762142505537), FRAC_CONST(0.027580740477564) }, { FRAC_CONST(0.016671795149944), FRAC_CONST(0.027635446678948) }, { FRAC_CONST(0.016581269252819), FRAC_CONST(0.027689856926900) }, { FRAC_CONST(0.016490565783622), FRAC_CONST(0.027743970638730) }, { FRAC_CONST(0.016399685713714), FRAC_CONST(0.027797787234924) }, { FRAC_CONST(0.016308630016347), FRAC_CONST(0.027851306139149) }, { FRAC_CONST(0.016217399666655), FRAC_CONST(0.027904526778260) }, { FRAC_CONST(0.016125995641641), FRAC_CONST(0.027957448582309) }, { FRAC_CONST(0.016034418920170), FRAC_CONST(0.028010070984544) }, { FRAC_CONST(0.015942670482954), FRAC_CONST(0.028062393421421) }, { FRAC_CONST(0.015850751312545), FRAC_CONST(0.028114415332610) }, { FRAC_CONST(0.015758662393324), FRAC_CONST(0.028166136160998) }, { FRAC_CONST(0.015666404711489), FRAC_CONST(0.028217555352697) }, { FRAC_CONST(0.015573979255046), FRAC_CONST(0.028268672357047) }, { FRAC_CONST(0.015481387013797), FRAC_CONST(0.028319486626627) }, { FRAC_CONST(0.015388628979331), FRAC_CONST(0.028369997617257) }, { FRAC_CONST(0.015295706145012), FRAC_CONST(0.028420204788004) }, { FRAC_CONST(0.015202619505968), FRAC_CONST(0.028470107601191) }, { FRAC_CONST(0.015109370059084), FRAC_CONST(0.028519705522399) }, { FRAC_CONST(0.015015958802984), FRAC_CONST(0.028568998020472) }, { FRAC_CONST(0.014922386738030), FRAC_CONST(0.028617984567529) }, { FRAC_CONST(0.014828654866302), FRAC_CONST(0.028666664638963) }, { FRAC_CONST(0.014734764191593), FRAC_CONST(0.028715037713449) }, { FRAC_CONST(0.014640715719398), FRAC_CONST(0.028763103272951) }, { FRAC_CONST(0.014546510456900), FRAC_CONST(0.028810860802724) }, { FRAC_CONST(0.014452149412962), FRAC_CONST(0.028858309791325) }, { FRAC_CONST(0.014357633598114), FRAC_CONST(0.028905449730613) }, { FRAC_CONST(0.014262964024545), FRAC_CONST(0.028952280115756) }, { FRAC_CONST(0.014168141706090), FRAC_CONST(0.028998800445240) }, { FRAC_CONST(0.014073167658220), FRAC_CONST(0.029045010220868) }, { FRAC_CONST(0.013978042898030), FRAC_CONST(0.029090908947771) }, { FRAC_CONST(0.013882768444231), FRAC_CONST(0.029136496134411) }, { FRAC_CONST(0.013787345317136), FRAC_CONST(0.029181771292585) }, { FRAC_CONST(0.013691774538648), FRAC_CONST(0.029226733937433) }, { FRAC_CONST(0.013596057132255), FRAC_CONST(0.029271383587441) }, { FRAC_CONST(0.013500194123014), FRAC_CONST(0.029315719764447) }, { FRAC_CONST(0.013404186537539), FRAC_CONST(0.029359741993647) }, { FRAC_CONST(0.013308035403995), FRAC_CONST(0.029403449803598) }, { FRAC_CONST(0.013211741752084), FRAC_CONST(0.029446842726223) }, { FRAC_CONST(0.013115306613032), FRAC_CONST(0.029489920296820) }, { FRAC_CONST(0.013018731019584), FRAC_CONST(0.029532682054063) }, { FRAC_CONST(0.012922016005985), FRAC_CONST(0.029575127540008) }, { FRAC_CONST(0.012825162607977), FRAC_CONST(0.029617256300097) }, { FRAC_CONST(0.012728171862781), FRAC_CONST(0.029659067883165) }, { FRAC_CONST(0.012631044809089), FRAC_CONST(0.029700561841444) }, { FRAC_CONST(0.012533782487056), FRAC_CONST(0.029741737730567) }, { FRAC_CONST(0.012436385938281), FRAC_CONST(0.029782595109573) }, { FRAC_CONST(0.012338856205805), FRAC_CONST(0.029823133540913) }, { FRAC_CONST(0.012241194334091), FRAC_CONST(0.029863352590452) }, { FRAC_CONST(0.012143401369021), FRAC_CONST(0.029903251827477) }, { FRAC_CONST(0.012045478357878), FRAC_CONST(0.029942830824699) }, { FRAC_CONST(0.011947426349339), FRAC_CONST(0.029982089158259) }, { FRAC_CONST(0.011849246393462), FRAC_CONST(0.030021026407731) }, { FRAC_CONST(0.011750939541676), FRAC_CONST(0.030059642156129) }, { FRAC_CONST(0.011652506846768), FRAC_CONST(0.030097935989909) }, { FRAC_CONST(0.011553949362874), FRAC_CONST(0.030135907498976) }, { FRAC_CONST(0.011455268145464), FRAC_CONST(0.030173556276684) }, { FRAC_CONST(0.011356464251335), FRAC_CONST(0.030210881919845) }, { FRAC_CONST(0.011257538738598), FRAC_CONST(0.030247884028732) }, { FRAC_CONST(0.011158492666665), FRAC_CONST(0.030284562207083) }, { FRAC_CONST(0.011059327096240), FRAC_CONST(0.030320916062102) }, { FRAC_CONST(0.010960043089307), FRAC_CONST(0.030356945204470) }, { FRAC_CONST(0.010860641709118), FRAC_CONST(0.030392649248343) }, { FRAC_CONST(0.010761124020182), FRAC_CONST(0.030428027811361) }, { FRAC_CONST(0.010661491088253), FRAC_CONST(0.030463080514646) }, { FRAC_CONST(0.010561743980319), FRAC_CONST(0.030497806982812) }, { FRAC_CONST(0.010461883764593), FRAC_CONST(0.030532206843968) }, { FRAC_CONST(0.010361911510496), FRAC_CONST(0.030566279729717) }, { FRAC_CONST(0.010261828288652), FRAC_CONST(0.030600025275167) }, { FRAC_CONST(0.010161635170872), FRAC_CONST(0.030633443118931) }, { FRAC_CONST(0.010061333230142), FRAC_CONST(0.030666532903129) }, { FRAC_CONST(0.009960923540617), FRAC_CONST(0.030699294273397) }, { FRAC_CONST(0.009860407177603), FRAC_CONST(0.030731726878888) }, { FRAC_CONST(0.009759785217550), FRAC_CONST(0.030763830372273) }, { FRAC_CONST(0.009659058738038), FRAC_CONST(0.030795604409750) }, { FRAC_CONST(0.009558228817767), FRAC_CONST(0.030827048651045) }, { FRAC_CONST(0.009457296536545), FRAC_CONST(0.030858162759415) }, { FRAC_CONST(0.009356262975275), FRAC_CONST(0.030888946401653) }, { FRAC_CONST(0.009255129215945), FRAC_CONST(0.030919399248091) }, { FRAC_CONST(0.009153896341616), FRAC_CONST(0.030949520972603) }, { FRAC_CONST(0.009052565436412), FRAC_CONST(0.030979311252611) }, { FRAC_CONST(0.008951137585505), FRAC_CONST(0.031008769769084) }, { FRAC_CONST(0.008849613875105), FRAC_CONST(0.031037896206544) }, { FRAC_CONST(0.008747995392451), FRAC_CONST(0.031066690253072) }, { FRAC_CONST(0.008646283225794), FRAC_CONST(0.031095151600306) }, { FRAC_CONST(0.008544478464390), FRAC_CONST(0.031123279943448) }, { FRAC_CONST(0.008442582198486), FRAC_CONST(0.031151074981266) }, { FRAC_CONST(0.008340595519310), FRAC_CONST(0.031178536416098) }, { FRAC_CONST(0.008238519519057), FRAC_CONST(0.031205663953853) }, { FRAC_CONST(0.008136355290878), FRAC_CONST(0.031232457304017) }, { FRAC_CONST(0.008034103928871), FRAC_CONST(0.031258916179656) }, { FRAC_CONST(0.007931766528065), FRAC_CONST(0.031285040297416) }, { FRAC_CONST(0.007829344184412), FRAC_CONST(0.031310829377528) }, { FRAC_CONST(0.007726837994772), FRAC_CONST(0.031336283143813) }, { FRAC_CONST(0.007624249056906), FRAC_CONST(0.031361401323680) }, { FRAC_CONST(0.007521578469457), FRAC_CONST(0.031386183648135) }, { FRAC_CONST(0.007418827331946), FRAC_CONST(0.031410629851778) }, { FRAC_CONST(0.007315996744755), FRAC_CONST(0.031434739672811) }, { FRAC_CONST(0.007213087809115), FRAC_CONST(0.031458512853036) }, { FRAC_CONST(0.007110101627101), FRAC_CONST(0.031481949137863) }, { FRAC_CONST(0.007007039301610), FRAC_CONST(0.031505048276306) }, { FRAC_CONST(0.006903901936357), FRAC_CONST(0.031527810020993) }, { FRAC_CONST(0.006800690635862), FRAC_CONST(0.031550234128164) }, { FRAC_CONST(0.006697406505433), FRAC_CONST(0.031572320357675) }, { FRAC_CONST(0.006594050651161), FRAC_CONST(0.031594068473000) }, { FRAC_CONST(0.006490624179905), FRAC_CONST(0.031615478241233) }, { FRAC_CONST(0.006387128199278), FRAC_CONST(0.031636549433095) }, { FRAC_CONST(0.006283563817639), FRAC_CONST(0.031657281822929) }, { FRAC_CONST(0.006179932144080), FRAC_CONST(0.031677675188707) }, { FRAC_CONST(0.006076234288412), FRAC_CONST(0.031697729312034) }, { FRAC_CONST(0.005972471361157), FRAC_CONST(0.031717443978146) }, { FRAC_CONST(0.005868644473532), FRAC_CONST(0.031736818975914) }, { FRAC_CONST(0.005764754737440), FRAC_CONST(0.031755854097848) }, { FRAC_CONST(0.005660803265456), FRAC_CONST(0.031774549140098) }, { FRAC_CONST(0.005556791170816), FRAC_CONST(0.031792903902453) }, { FRAC_CONST(0.005452719567407), FRAC_CONST(0.031810918188350) }, { FRAC_CONST(0.005348589569753), FRAC_CONST(0.031828591804869) }, { FRAC_CONST(0.005244402293001), FRAC_CONST(0.031845924562742) }, { FRAC_CONST(0.005140158852914), FRAC_CONST(0.031862916276347) }, { FRAC_CONST(0.005035860365855), FRAC_CONST(0.031879566763717) }, { FRAC_CONST(0.004931507948778), FRAC_CONST(0.031895875846539) }, { FRAC_CONST(0.004827102719212), FRAC_CONST(0.031911843350155) }, { FRAC_CONST(0.004722645795254), FRAC_CONST(0.031927469103567) }, { FRAC_CONST(0.004618138295554), FRAC_CONST(0.031942752939435) }, { FRAC_CONST(0.004513581339303), FRAC_CONST(0.031957694694082) }, { FRAC_CONST(0.004408976046222), FRAC_CONST(0.031972294207493) }, { FRAC_CONST(0.004304323536549), FRAC_CONST(0.031986551323320) }, { FRAC_CONST(0.004199624931030), FRAC_CONST(0.032000465888879) }, { FRAC_CONST(0.004094881350902), FRAC_CONST(0.032014037755158) }, { FRAC_CONST(0.003990093917884), FRAC_CONST(0.032027266776813) }, { FRAC_CONST(0.003885263754166), FRAC_CONST(0.032040152812170) }, { FRAC_CONST(0.003780391982394), FRAC_CONST(0.032052695723232) }, { FRAC_CONST(0.003675479725661), FRAC_CONST(0.032064895375674) }, { FRAC_CONST(0.003570528107494), FRAC_CONST(0.032076751638847) }, { FRAC_CONST(0.003465538251839), FRAC_CONST(0.032088264385780) }, { FRAC_CONST(0.003360511283053), FRAC_CONST(0.032099433493181) }, { FRAC_CONST(0.003255448325892), FRAC_CONST(0.032110258841438) }, { FRAC_CONST(0.003150350505494), FRAC_CONST(0.032120740314619) }, { FRAC_CONST(0.003045218947373), FRAC_CONST(0.032130877800478) }, { FRAC_CONST(0.002940054777404), FRAC_CONST(0.032140671190449) }, { FRAC_CONST(0.002834859121810), FRAC_CONST(0.032150120379653) }, { FRAC_CONST(0.002729633107153), FRAC_CONST(0.032159225266897) }, { FRAC_CONST(0.002624377860318), FRAC_CONST(0.032167985754674) }, { FRAC_CONST(0.002519094508504), FRAC_CONST(0.032176401749168) }, { FRAC_CONST(0.002413784179212), FRAC_CONST(0.032184473160250) }, { FRAC_CONST(0.002308448000231), FRAC_CONST(0.032192199901481) }, { FRAC_CONST(0.002203087099626), FRAC_CONST(0.032199581890114) }, { FRAC_CONST(0.002097702605728), FRAC_CONST(0.032206619047093) }, { FRAC_CONST(0.001992295647121), FRAC_CONST(0.032213311297057) }, { FRAC_CONST(0.001886867352628), FRAC_CONST(0.032219658568338) }, { FRAC_CONST(0.001781418851302), FRAC_CONST(0.032225660792960) }, { FRAC_CONST(0.001675951272410), FRAC_CONST(0.032231317906644) }, { FRAC_CONST(0.001570465745428), FRAC_CONST(0.032236629848809) }, { FRAC_CONST(0.001464963400018), FRAC_CONST(0.032241596562566) }, { FRAC_CONST(0.001359445366028), FRAC_CONST(0.032246217994727) }, { FRAC_CONST(0.001253912773470), FRAC_CONST(0.032250494095799) }, { FRAC_CONST(0.001148366752513), FRAC_CONST(0.032254424819990) }, { FRAC_CONST(0.001042808433471), FRAC_CONST(0.032258010125204) }, { FRAC_CONST(0.000937238946789), FRAC_CONST(0.032261249973045) }, { FRAC_CONST(0.000831659423030), FRAC_CONST(0.032264144328817) }, { FRAC_CONST(0.000726070992868), FRAC_CONST(0.032266693161525) }, { FRAC_CONST(0.000620474787068), FRAC_CONST(0.032268896443871) }, { FRAC_CONST(0.000514871936481), FRAC_CONST(0.032270754152261) }, { FRAC_CONST(0.000409263572030), FRAC_CONST(0.032272266266801) }, { FRAC_CONST(0.000303650824695), FRAC_CONST(0.032273432771295) }, { FRAC_CONST(0.000198034825504), FRAC_CONST(0.032274253653254) }, { FRAC_CONST(0.000092416705518), FRAC_CONST(0.032274728903884) } }; #ifdef LD_DEC /* 240 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_960[] = { { FRAC_CONST(0.045643531183573), FRAC_CONST(0.000037342034959) }, { FRAC_CONST(0.045642309173789), FRAC_CONST(0.000336075315362) }, { FRAC_CONST(0.045639131999390), FRAC_CONST(0.000634794199417) }, { FRAC_CONST(0.045633999796474), FRAC_CONST(0.000933485891002) }, { FRAC_CONST(0.045626912784890), FRAC_CONST(0.001232137595157) }, { FRAC_CONST(0.045617871268219), FRAC_CONST(0.001530736518639) }, { FRAC_CONST(0.045606875633772), FRAC_CONST(0.001829269870464) }, { FRAC_CONST(0.045593926352564), FRAC_CONST(0.002127724862455) }, { FRAC_CONST(0.045579023979299), FRAC_CONST(0.002426088709795) }, { FRAC_CONST(0.045562169152346), FRAC_CONST(0.002724348631569) }, { FRAC_CONST(0.045543362593709), FRAC_CONST(0.003022491851315) }, { FRAC_CONST(0.045522605108999), FRAC_CONST(0.003320505597570) }, { FRAC_CONST(0.045499897587396), FRAC_CONST(0.003618377104416) }, { FRAC_CONST(0.045475241001617), FRAC_CONST(0.003916093612031) }, { FRAC_CONST(0.045448636407866), FRAC_CONST(0.004213642367228) }, { FRAC_CONST(0.045420084945797), FRAC_CONST(0.004511010624011) }, { FRAC_CONST(0.045389587838458), FRAC_CONST(0.004808185644112) }, { FRAC_CONST(0.045357146392244), FRAC_CONST(0.005105154697544) }, { FRAC_CONST(0.045322761996840), FRAC_CONST(0.005401905063139) }, { FRAC_CONST(0.045286436125157), FRAC_CONST(0.005698424029100) }, { FRAC_CONST(0.045248170333275), FRAC_CONST(0.005994698893542) }, { FRAC_CONST(0.045207966260374), FRAC_CONST(0.006290716965035) }, { FRAC_CONST(0.045165825628663), FRAC_CONST(0.006586465563151) }, { FRAC_CONST(0.045121750243305), FRAC_CONST(0.006881932019003) }, { FRAC_CONST(0.045075741992343), FRAC_CONST(0.007177103675792) }, { FRAC_CONST(0.045027802846618), FRAC_CONST(0.007471967889347) }, { FRAC_CONST(0.044977934859683), FRAC_CONST(0.007766512028667) }, { FRAC_CONST(0.044926140167717), FRAC_CONST(0.008060723476460) }, { FRAC_CONST(0.044872420989432), FRAC_CONST(0.008354589629687) }, { FRAC_CONST(0.044816779625979), FRAC_CONST(0.008648097900101) }, { FRAC_CONST(0.044759218460849), FRAC_CONST(0.008941235714784) }, { FRAC_CONST(0.044699739959770), FRAC_CONST(0.009233990516688) }, { FRAC_CONST(0.044638346670603), FRAC_CONST(0.009526349765171) }, { FRAC_CONST(0.044575041223233), FRAC_CONST(0.009818300936537) }, { FRAC_CONST(0.044509826329454), FRAC_CONST(0.010109831524568) }, { FRAC_CONST(0.044442704782856), FRAC_CONST(0.010400929041064) }, { FRAC_CONST(0.044373679458701), FRAC_CONST(0.010691581016378) }, { FRAC_CONST(0.044302753313806), FRAC_CONST(0.010981774999945) }, { FRAC_CONST(0.044229929386409), FRAC_CONST(0.011271498560822) }, { FRAC_CONST(0.044155210796046), FRAC_CONST(0.011560739288214) }, { FRAC_CONST(0.044078600743413), FRAC_CONST(0.011849484792012) }, { FRAC_CONST(0.044000102510229), FRAC_CONST(0.012137722703321) }, { FRAC_CONST(0.043919719459097), FRAC_CONST(0.012425440674986) }, { FRAC_CONST(0.043837455033359), FRAC_CONST(0.012712626382127) }, { FRAC_CONST(0.043753312756950), FRAC_CONST(0.012999267522665) }, { FRAC_CONST(0.043667296234245), FRAC_CONST(0.013285351817848) }, { FRAC_CONST(0.043579409149906), FRAC_CONST(0.013570867012776) }, { FRAC_CONST(0.043489655268722), FRAC_CONST(0.013855800876928) }, { FRAC_CONST(0.043398038435451), FRAC_CONST(0.014140141204686) }, { FRAC_CONST(0.043304562574653), FRAC_CONST(0.014423875815857) }, { FRAC_CONST(0.043209231690524), FRAC_CONST(0.014706992556195) }, { FRAC_CONST(0.043112049866720), FRAC_CONST(0.014989479297920) }, { FRAC_CONST(0.043013021266188), FRAC_CONST(0.015271323940241) }, { FRAC_CONST(0.042912150130984), FRAC_CONST(0.015552514409871) }, { FRAC_CONST(0.042809440782090), FRAC_CONST(0.015833038661547) }, { FRAC_CONST(0.042704897619235), FRAC_CONST(0.016112884678543) }, { FRAC_CONST(0.042598525120698), FRAC_CONST(0.016392040473187) }, { FRAC_CONST(0.042490327843124), FRAC_CONST(0.016670494087374) }, { FRAC_CONST(0.042380310421324), FRAC_CONST(0.016948233593079) }, { FRAC_CONST(0.042268477568078), FRAC_CONST(0.017225247092864) }, { FRAC_CONST(0.042154834073934), FRAC_CONST(0.017501522720393) }, { FRAC_CONST(0.042039384807000), FRAC_CONST(0.017777048640940) }, { FRAC_CONST(0.041922134712739), FRAC_CONST(0.018051813051888) }, { FRAC_CONST(0.041803088813754), FRAC_CONST(0.018325804183247) }, { FRAC_CONST(0.041682252209576), FRAC_CONST(0.018599010298148) }, { FRAC_CONST(0.041559630076443), FRAC_CONST(0.018871419693350) }, { FRAC_CONST(0.041435227667079), FRAC_CONST(0.019143020699741) }, { FRAC_CONST(0.041309050310468), FRAC_CONST(0.019413801682838) }, { FRAC_CONST(0.041181103411629), FRAC_CONST(0.019683751043285) }, { FRAC_CONST(0.041051392451382), FRAC_CONST(0.019952857217350) }, { FRAC_CONST(0.040919922986111), FRAC_CONST(0.020221108677421) }, { FRAC_CONST(0.040786700647532), FRAC_CONST(0.020488493932496) }, { FRAC_CONST(0.040651731142446), FRAC_CONST(0.020755001528683) }, { FRAC_CONST(0.040515020252497), FRAC_CONST(0.021020620049682) }, { FRAC_CONST(0.040376573833925), FRAC_CONST(0.021285338117280) }, { FRAC_CONST(0.040236397817314), FRAC_CONST(0.021549144391836) }, { FRAC_CONST(0.040094498207337), FRAC_CONST(0.021812027572768) }, { FRAC_CONST(0.039950881082502), FRAC_CONST(0.022073976399034) }, { FRAC_CONST(0.039805552594888), FRAC_CONST(0.022334979649620) }, { FRAC_CONST(0.039658518969884), FRAC_CONST(0.022595026144014) }, { FRAC_CONST(0.039509786505922), FRAC_CONST(0.022854104742690) }, { FRAC_CONST(0.039359361574204), FRAC_CONST(0.023112204347583) }, { FRAC_CONST(0.039207250618434), FRAC_CONST(0.023369313902565) }, { FRAC_CONST(0.039053460154540), FRAC_CONST(0.023625422393919) }, { FRAC_CONST(0.038897996770393), FRAC_CONST(0.023880518850809) }, { FRAC_CONST(0.038740867125527), FRAC_CONST(0.024134592345752) }, { FRAC_CONST(0.038582077950852), FRAC_CONST(0.024387631995085) }, { FRAC_CONST(0.038421636048370), FRAC_CONST(0.024639626959432) }, { FRAC_CONST(0.038259548290876), FRAC_CONST(0.024890566444167) }, { FRAC_CONST(0.038095821621671), FRAC_CONST(0.025140439699877) }, { FRAC_CONST(0.037930463054261), FRAC_CONST(0.025389236022825) }, { FRAC_CONST(0.037763479672055), FRAC_CONST(0.025636944755403) }, { FRAC_CONST(0.037594878628068), FRAC_CONST(0.025883555286595) }, { FRAC_CONST(0.037424667144605), FRAC_CONST(0.026129057052425) }, { FRAC_CONST(0.037252852512960), FRAC_CONST(0.026373439536415) }, { FRAC_CONST(0.037079442093102), FRAC_CONST(0.026616692270033) }, { FRAC_CONST(0.036904443313354), FRAC_CONST(0.026858804833142) }, { FRAC_CONST(0.036727863670081), FRAC_CONST(0.027099766854444) }, { FRAC_CONST(0.036549710727369), FRAC_CONST(0.027339568011930) }, { FRAC_CONST(0.036369992116697), FRAC_CONST(0.027578198033315) }, { FRAC_CONST(0.036188715536611), FRAC_CONST(0.027815646696484) }, { FRAC_CONST(0.036005888752396), FRAC_CONST(0.028051903829926) }, { FRAC_CONST(0.035821519595745), FRAC_CONST(0.028286959313171) }, { FRAC_CONST(0.035635615964417), FRAC_CONST(0.028520803077226) }, { FRAC_CONST(0.035448185821906), FRAC_CONST(0.028753425105002) }, { FRAC_CONST(0.035259237197095), FRAC_CONST(0.028984815431745) }, { FRAC_CONST(0.035068778183914), FRAC_CONST(0.029214964145465) }, { FRAC_CONST(0.034876816940994), FRAC_CONST(0.029443861387355) }, { FRAC_CONST(0.034683361691315), FRAC_CONST(0.029671497352220) }, { FRAC_CONST(0.034488420721856), FRAC_CONST(0.029897862288892) }, { FRAC_CONST(0.034292002383240), FRAC_CONST(0.030122946500652) }, { FRAC_CONST(0.034094115089375), FRAC_CONST(0.030346740345641) }, { FRAC_CONST(0.033894767317093), FRAC_CONST(0.030569234237276) }, { FRAC_CONST(0.033693967605790), FRAC_CONST(0.030790418644658) }, { FRAC_CONST(0.033491724557057), FRAC_CONST(0.031010284092984) }, { FRAC_CONST(0.033288046834313), FRAC_CONST(0.031228821163949) }, { FRAC_CONST(0.033082943162434), FRAC_CONST(0.031446020496153) }, { FRAC_CONST(0.032876422327378), FRAC_CONST(0.031661872785500) }, { FRAC_CONST(0.032668493175811), FRAC_CONST(0.031876368785596) }, { FRAC_CONST(0.032459164614726), FRAC_CONST(0.032089499308145) }, { FRAC_CONST(0.032248445611061), FRAC_CONST(0.032301255223347) }, { FRAC_CONST(0.032036345191317), FRAC_CONST(0.032511627460281) }, { FRAC_CONST(0.031822872441171), FRAC_CONST(0.032720607007302) }, { FRAC_CONST(0.031608036505083), FRAC_CONST(0.032928184912422) }, { FRAC_CONST(0.031391846585912), FRAC_CONST(0.033134352283693) }, { FRAC_CONST(0.031174311944513), FRAC_CONST(0.033339100289593) }, { FRAC_CONST(0.030955441899347), FRAC_CONST(0.033542420159397) }, { FRAC_CONST(0.030735245826077), FRAC_CONST(0.033744303183559) }, { FRAC_CONST(0.030513733157171), FRAC_CONST(0.033944740714083) }, { FRAC_CONST(0.030290913381494), FRAC_CONST(0.034143724164891) }, { FRAC_CONST(0.030066796043904), FRAC_CONST(0.034341245012195) }, { FRAC_CONST(0.029841390744841), FRAC_CONST(0.034537294794860) }, { FRAC_CONST(0.029614707139919), FRAC_CONST(0.034731865114764) }, { FRAC_CONST(0.029386754939508), FRAC_CONST(0.034924947637164) }, { FRAC_CONST(0.029157543908322), FRAC_CONST(0.035116534091046) }, { FRAC_CONST(0.028927083864999), FRAC_CONST(0.035306616269485) }, { FRAC_CONST(0.028695384681680), FRAC_CONST(0.035495186029992) }, { FRAC_CONST(0.028462456283587), FRAC_CONST(0.035682235294866) }, { FRAC_CONST(0.028228308648598), FRAC_CONST(0.035867756051541) }, { FRAC_CONST(0.027992951806817), FRAC_CONST(0.036051740352923) }, { FRAC_CONST(0.027756395840148), FRAC_CONST(0.036234180317738) }, { FRAC_CONST(0.027518650881862), FRAC_CONST(0.036415068130865) }, { FRAC_CONST(0.027279727116161), FRAC_CONST(0.036594396043672) }, { FRAC_CONST(0.027039634777745), FRAC_CONST(0.036772156374348) }, { FRAC_CONST(0.026798384151369), FRAC_CONST(0.036948341508233) }, { FRAC_CONST(0.026555985571409), FRAC_CONST(0.037122943898140) }, { FRAC_CONST(0.026312449421412), FRAC_CONST(0.037295956064686) }, { FRAC_CONST(0.026067786133656), FRAC_CONST(0.037467370596605) }, { FRAC_CONST(0.025822006188702), FRAC_CONST(0.037637180151068) }, { FRAC_CONST(0.025575120114946), FRAC_CONST(0.037805377454000) }, { FRAC_CONST(0.025327138488165), FRAC_CONST(0.037971955300388) }, { FRAC_CONST(0.025078071931066), FRAC_CONST(0.038136906554591) }, { FRAC_CONST(0.024827931112832), FRAC_CONST(0.038300224150647) }, { FRAC_CONST(0.024576726748663), FRAC_CONST(0.038461901092573) }, { FRAC_CONST(0.024324469599317), FRAC_CONST(0.038621930454668) }, { FRAC_CONST(0.024071170470652), FRAC_CONST(0.038780305381806) }, { FRAC_CONST(0.023816840213160), FRAC_CONST(0.038937019089732) }, { FRAC_CONST(0.023561489721501), FRAC_CONST(0.039092064865353) }, { FRAC_CONST(0.023305129934041), FRAC_CONST(0.039245436067023) }, { FRAC_CONST(0.023047771832380), FRAC_CONST(0.039397126124832) }, { FRAC_CONST(0.022789426440883), FRAC_CONST(0.039547128540881) }, { FRAC_CONST(0.022530104826206), FRAC_CONST(0.039695436889566) }, { FRAC_CONST(0.022269818096825), FRAC_CONST(0.039842044817851) }, { FRAC_CONST(0.022008577402555), FRAC_CONST(0.039986946045542) }, { FRAC_CONST(0.021746393934081), FRAC_CONST(0.040130134365550) }, { FRAC_CONST(0.021483278922467), FRAC_CONST(0.040271603644166) }, { FRAC_CONST(0.021219243638687), FRAC_CONST(0.040411347821316) }, { FRAC_CONST(0.020954299393132), FRAC_CONST(0.040549360910825) }, { FRAC_CONST(0.020688457535133), FRAC_CONST(0.040685637000671) }, { FRAC_CONST(0.020421729452469), FRAC_CONST(0.040820170253240) }, { FRAC_CONST(0.020154126570884), FRAC_CONST(0.040952954905576) }, { FRAC_CONST(0.019885660353596), FRAC_CONST(0.041083985269625) }, { FRAC_CONST(0.019616342300802), FRAC_CONST(0.041213255732484) }, { FRAC_CONST(0.019346183949192), FRAC_CONST(0.041340760756635) }, { FRAC_CONST(0.019075196871451), FRAC_CONST(0.041466494880189) }, { FRAC_CONST(0.018803392675763), FRAC_CONST(0.041590452717113) }, { FRAC_CONST(0.018530783005316), FRAC_CONST(0.041712628957466) }, { FRAC_CONST(0.018257379537800), FRAC_CONST(0.041833018367625) }, { FRAC_CONST(0.017983193984910), FRAC_CONST(0.041951615790509) }, { FRAC_CONST(0.017708238091842), FRAC_CONST(0.042068416145797) }, { FRAC_CONST(0.017432523636792), FRAC_CONST(0.042183414430153) }, { FRAC_CONST(0.017156062430449), FRAC_CONST(0.042296605717432) }, { FRAC_CONST(0.016878866315491), FRAC_CONST(0.042407985158896) }, { FRAC_CONST(0.016600947166078), FRAC_CONST(0.042517547983420) }, { FRAC_CONST(0.016322316887341), FRAC_CONST(0.042625289497698) }, { FRAC_CONST(0.016042987414872), FRAC_CONST(0.042731205086442) }, { FRAC_CONST(0.015762970714219), FRAC_CONST(0.042835290212581) }, { FRAC_CONST(0.015482278780363), FRAC_CONST(0.042937540417454) }, { FRAC_CONST(0.015200923637213), FRAC_CONST(0.043037951321002) }, { FRAC_CONST(0.014918917337087), FRAC_CONST(0.043136518621958) }, { FRAC_CONST(0.014636271960196), FRAC_CONST(0.043233238098025) }, { FRAC_CONST(0.014352999614128), FRAC_CONST(0.043328105606063) }, { FRAC_CONST(0.014069112433327), FRAC_CONST(0.043421117082265) }, { FRAC_CONST(0.013784622578575), FRAC_CONST(0.043512268542327) }, { FRAC_CONST(0.013499542236471), FRAC_CONST(0.043601556081625) }, { FRAC_CONST(0.013213883618907), FRAC_CONST(0.043688975875378) }, { FRAC_CONST(0.012927658962548), FRAC_CONST(0.043774524178812) }, { FRAC_CONST(0.012640880528305), FRAC_CONST(0.043858197327323) }, { FRAC_CONST(0.012353560600813), FRAC_CONST(0.043939991736633) }, { FRAC_CONST(0.012065711487901), FRAC_CONST(0.044019903902940) }, { FRAC_CONST(0.011777345520066), FRAC_CONST(0.044097930403073) }, { FRAC_CONST(0.011488475049948), FRAC_CONST(0.044174067894638) }, { FRAC_CONST(0.011199112451794), FRAC_CONST(0.044248313116156) }, { FRAC_CONST(0.010909270120937), FRAC_CONST(0.044320662887211) }, { FRAC_CONST(0.010618960473257), FRAC_CONST(0.044391114108577) }, { FRAC_CONST(0.010328195944653), FRAC_CONST(0.044459663762361) }, { FRAC_CONST(0.010036988990509), FRAC_CONST(0.044526308912122) }, { FRAC_CONST(0.009745352085163), FRAC_CONST(0.044591046703005) }, { FRAC_CONST(0.009453297721368), FRAC_CONST(0.044653874361857) }, { FRAC_CONST(0.009160838409762), FRAC_CONST(0.044714789197351) }, { FRAC_CONST(0.008867986678328), FRAC_CONST(0.044773788600099) }, { FRAC_CONST(0.008574755071860), FRAC_CONST(0.044830870042761) }, { FRAC_CONST(0.008281156151424), FRAC_CONST(0.044886031080160) }, { FRAC_CONST(0.007987202493820), FRAC_CONST(0.044939269349379) }, { FRAC_CONST(0.007692906691044), FRAC_CONST(0.044990582569869) }, { FRAC_CONST(0.007398281349750), FRAC_CONST(0.045039968543542) }, { FRAC_CONST(0.007103339090706), FRAC_CONST(0.045087425154868) }, { FRAC_CONST(0.006808092548258), FRAC_CONST(0.045132950370962) }, { FRAC_CONST(0.006512554369783), FRAC_CONST(0.045176542241676) }, { FRAC_CONST(0.006216737215155), FRAC_CONST(0.045218198899680) }, { FRAC_CONST(0.005920653756196), FRAC_CONST(0.045257918560541) }, { FRAC_CONST(0.005624316676135), FRAC_CONST(0.045295699522801) }, { FRAC_CONST(0.005327738669067), FRAC_CONST(0.045331540168049) }, { FRAC_CONST(0.005030932439406), FRAC_CONST(0.045365438960992) }, { FRAC_CONST(0.004733910701344), FRAC_CONST(0.045397394449517) }, { FRAC_CONST(0.004436686178303), FRAC_CONST(0.045427405264758) }, { FRAC_CONST(0.004139271602393), FRAC_CONST(0.045455470121152) }, { FRAC_CONST(0.003841679713863), FRAC_CONST(0.045481587816494) }, { FRAC_CONST(0.003543923260561), FRAC_CONST(0.045505757231988) }, { FRAC_CONST(0.003246014997382), FRAC_CONST(0.045527977332297) }, { FRAC_CONST(0.002947967685724), FRAC_CONST(0.045548247165585) }, { FRAC_CONST(0.002649794092941), FRAC_CONST(0.045566565863562) }, { FRAC_CONST(0.002351506991799), FRAC_CONST(0.045582932641515) }, { FRAC_CONST(0.002053119159924), FRAC_CONST(0.045597346798344) }, { FRAC_CONST(0.001754643379257), FRAC_CONST(0.045609807716597) }, { FRAC_CONST(0.001456092435508), FRAC_CONST(0.045620314862489) }, { FRAC_CONST(0.001157479117605), FRAC_CONST(0.045628867785927) }, { FRAC_CONST(0.000858816217149), FRAC_CONST(0.045635466120535) }, { FRAC_CONST(0.000560116527865), FRAC_CONST(0.045640109583661) }, { FRAC_CONST(0.000261392845053), FRAC_CONST(0.045642797976394) } }; #endif // LD_DEC /* 60 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_240[] = { { FRAC_CONST(0.091286604111815), FRAC_CONST(0.000298735779793) }, { FRAC_CONST(0.091247502481454), FRAC_CONST(0.002688238127538) }, { FRAC_CONST(0.091145864370807), FRAC_CONST(0.005075898091152) }, { FRAC_CONST(0.090981759437558), FRAC_CONST(0.007460079287760) }, { FRAC_CONST(0.090755300151030), FRAC_CONST(0.009839147718664) }, { FRAC_CONST(0.090466641715108), FRAC_CONST(0.012211472889198) }, { FRAC_CONST(0.090115981961863), FRAC_CONST(0.014575428926191) }, { FRAC_CONST(0.089703561215976), FRAC_CONST(0.016929395692256) }, { FRAC_CONST(0.089229662130024), FRAC_CONST(0.019271759896156) }, { FRAC_CONST(0.088694609490769), FRAC_CONST(0.021600916198470) }, { FRAC_CONST(0.088098769996564), FRAC_CONST(0.023915268311810) }, { FRAC_CONST(0.087442552006035), FRAC_CONST(0.026213230094844) }, { FRAC_CONST(0.086726405258214), FRAC_CONST(0.028493226639351) }, { FRAC_CONST(0.085950820564309), FRAC_CONST(0.030753695349588) }, { FRAC_CONST(0.085116329471329), FRAC_CONST(0.032993087013213) }, { FRAC_CONST(0.084223503897785), FRAC_CONST(0.035209866863042) }, { FRAC_CONST(0.083272955741727), FRAC_CONST(0.037402515628894) }, { FRAC_CONST(0.082265336461381), FRAC_CONST(0.039569530578832) }, { FRAC_CONST(0.081201336628670), FRAC_CONST(0.041709426549053) }, { FRAC_CONST(0.080081685455930), FRAC_CONST(0.043820736961749) }, { FRAC_CONST(0.078907150296148), FRAC_CONST(0.045902014830227) }, { FRAC_CONST(0.077678536117054), FRAC_CONST(0.047951833750597) }, { FRAC_CONST(0.076396684949434), FRAC_CONST(0.049968788879362) }, { FRAC_CONST(0.075062475310050), FRAC_CONST(0.051951497896226) }, { FRAC_CONST(0.073676821599542), FRAC_CONST(0.053898601951466) }, { FRAC_CONST(0.072240673475749), FRAC_CONST(0.055808766597225) }, { FRAC_CONST(0.070755015202858), FRAC_CONST(0.057680682702068) }, { FRAC_CONST(0.069220864976840), FRAC_CONST(0.059513067348201) }, { FRAC_CONST(0.067639274227625), FRAC_CONST(0.061304664710718) }, { FRAC_CONST(0.066011326898512), FRAC_CONST(0.063054246918278) }, { FRAC_CONST(0.064338138703282), FRAC_CONST(0.064760614894630) }, { FRAC_CONST(0.062620856361546), FRAC_CONST(0.066422599180399) }, { FRAC_CONST(0.060860656812842), FRAC_CONST(0.068039060734572) }, { FRAC_CONST(0.059058746410016), FRAC_CONST(0.069608891715145) }, { FRAC_CONST(0.057216360092450), FRAC_CONST(0.071131016238378) }, { FRAC_CONST(0.055334760539699), FRAC_CONST(0.072604391116154) }, { FRAC_CONST(0.053415237306106), FRAC_CONST(0.074028006570930) }, { FRAC_CONST(0.051459105937014), FRAC_CONST(0.075400886927784) }, { FRAC_CONST(0.049467707067153), FRAC_CONST(0.076722091283096) }, { FRAC_CONST(0.047442405501835), FRAC_CONST(0.077990714149396) }, { FRAC_CONST(0.045384589281588), FRAC_CONST(0.079205886075941) }, { FRAC_CONST(0.043295668730857), FRAC_CONST(0.080366774244592) }, { FRAC_CONST(0.041177075491445), FRAC_CONST(0.081472583040586) }, { FRAC_CONST(0.039030261541332), FRAC_CONST(0.082522554597810) }, { FRAC_CONST(0.036856698199564), FRAC_CONST(0.083515969318206) }, { FRAC_CONST(0.034657875117883), FRAC_CONST(0.084452146364948) }, { FRAC_CONST(0.032435299259796), FRAC_CONST(0.085330444129049) }, { FRAC_CONST(0.030190493867775), FRAC_CONST(0.086150260669096) }, { FRAC_CONST(0.027924997419306), FRAC_CONST(0.086911034123781) }, { FRAC_CONST(0.025640362572491), FRAC_CONST(0.087612243096981) }, { FRAC_CONST(0.023338155101933), FRAC_CONST(0.088253407015092) }, { FRAC_CONST(0.021019952825636), FRAC_CONST(0.088834086456390) }, { FRAC_CONST(0.018687344523641), FRAC_CONST(0.089353883452193) }, { FRAC_CONST(0.016341928849164), FRAC_CONST(0.089812441759604) }, { FRAC_CONST(0.013985313232951), FRAC_CONST(0.090209447105664) }, { FRAC_CONST(0.011619112781631), FRAC_CONST(0.090544627402740) }, { FRAC_CONST(0.009244949170797), FRAC_CONST(0.090817752935000) }, { FRAC_CONST(0.006864449533597), FRAC_CONST(0.091028636515846) }, { FRAC_CONST(0.004479245345574), FRAC_CONST(0.091177133616206) }, { FRAC_CONST(0.002090971306534), FRAC_CONST(0.091263142463585) } }; #endif // ALLOW_SMALL_FRAMELENGTH #ifdef SSR_DEC /* 128 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_512[] = { { FRAC_CONST(0.062499926465731), FRAC_CONST(0.000095873761643) }, { FRAC_CONST(0.062494043817678), FRAC_CONST(0.000862836783004) }, { FRAC_CONST(0.062478749796497), FRAC_CONST(0.001629669864319) }, { FRAC_CONST(0.062454046705412), FRAC_CONST(0.002396257523347) }, { FRAC_CONST(0.062419938264617), FRAC_CONST(0.003162484314806) }, { FRAC_CONST(0.062376429610718), FRAC_CONST(0.003928234847760) }, { FRAC_CONST(0.062323527295958), FRAC_CONST(0.004693393802995) }, { FRAC_CONST(0.062261239287231), FRAC_CONST(0.005457845950387) }, { FRAC_CONST(0.062189574964882), FRAC_CONST(0.006221476166254) }, { FRAC_CONST(0.062108545121295), FRAC_CONST(0.006984169450695) }, { FRAC_CONST(0.062018161959266), FRAC_CONST(0.007745810944907) }, { FRAC_CONST(0.061918439090167), FRAC_CONST(0.008506285948482) }, { FRAC_CONST(0.061809391531894), FRAC_CONST(0.009265479936681) }, { FRAC_CONST(0.061691035706609), FRAC_CONST(0.010023278577683) }, { FRAC_CONST(0.061563389438265), FRAC_CONST(0.010779567749800) }, { FRAC_CONST(0.061426471949919), FRAC_CONST(0.011534233558664) }, { FRAC_CONST(0.061280303860842), FRAC_CONST(0.012287162354380) }, { FRAC_CONST(0.061124907183410), FRAC_CONST(0.013038240748641) }, { FRAC_CONST(0.060960305319791), FRAC_CONST(0.013787355631805) }, { FRAC_CONST(0.060786523058421), FRAC_CONST(0.014534394189923) }, { FRAC_CONST(0.060603586570268), FRAC_CONST(0.015279243921739) }, { FRAC_CONST(0.060411523404896), FRAC_CONST(0.016021792655621) }, { FRAC_CONST(0.060210362486310), FRAC_CONST(0.016761928566463) }, { FRAC_CONST(0.060000134108604), FRAC_CONST(0.017499540192517) }, { FRAC_CONST(0.059780869931400), FRAC_CONST(0.018234516452187) }, { FRAC_CONST(0.059552602975075), FRAC_CONST(0.018966746660751) }, { FRAC_CONST(0.059315367615794), FRAC_CONST(0.019696120547033) }, { FRAC_CONST(0.059069199580329), FRAC_CONST(0.020422528270008) }, { FRAC_CONST(0.058814135940681), FRAC_CONST(0.021145860435346) }, { FRAC_CONST(0.058550215108495), FRAC_CONST(0.021866008111883) }, { FRAC_CONST(0.058277476829279), FRAC_CONST(0.022582862848028) }, { FRAC_CONST(0.057995962176414), FRAC_CONST(0.023296316688095) }, { FRAC_CONST(0.057705713544970), FRAC_CONST(0.024006262188558) }, { FRAC_CONST(0.057406774645326), FRAC_CONST(0.024712592434239) }, { FRAC_CONST(0.057099190496578), FRAC_CONST(0.025415201054398) }, { FRAC_CONST(0.056783007419769), FRAC_CONST(0.026113982238763) }, { FRAC_CONST(0.056458273030907), FRAC_CONST(0.026808830753458) }, { FRAC_CONST(0.056125036233796), FRAC_CONST(0.027499641956852) }, { FRAC_CONST(0.055783347212673), FRAC_CONST(0.028186311815319) }, { FRAC_CONST(0.055433257424646), FRAC_CONST(0.028868736918904) }, { FRAC_CONST(0.055074819591951), FRAC_CONST(0.029546814496896) }, { FRAC_CONST(0.054708087694007), FRAC_CONST(0.030220442433307) }, { FRAC_CONST(0.054333116959288), FRAC_CONST(0.030889519282247) }, { FRAC_CONST(0.053949963857008), FRAC_CONST(0.031553944283204) }, { FRAC_CONST(0.053558686088614), FRAC_CONST(0.032213617376216) }, { FRAC_CONST(0.053159342579100), FRAC_CONST(0.032868439216943) }, { FRAC_CONST(0.052751993468129), FRAC_CONST(0.033518311191623) }, { FRAC_CONST(0.052336700100979), FRAC_CONST(0.034163135431927) }, { FRAC_CONST(0.051913525019303), FRAC_CONST(0.034802814829698) }, { FRAC_CONST(0.051482531951712), FRAC_CONST(0.035437253051569) }, { FRAC_CONST(0.051043785804177), FRAC_CONST(0.036066354553480) }, { FRAC_CONST(0.050597352650253), FRAC_CONST(0.036690024595057) }, { FRAC_CONST(0.050143299721132), FRAC_CONST(0.037308169253887) }, { FRAC_CONST(0.049681695395515), FRAC_CONST(0.037920695439658) }, { FRAC_CONST(0.049212609189314), FRAC_CONST(0.038527510908178) }, { FRAC_CONST(0.048736111745188), FRAC_CONST(0.039128524275271) }, { FRAC_CONST(0.048252274821899), FRAC_CONST(0.039723645030535) }, { FRAC_CONST(0.047761171283507), FRAC_CONST(0.040312783550971) }, { FRAC_CONST(0.047262875088400), FRAC_CONST(0.040895851114488) }, { FRAC_CONST(0.046757461278150), FRAC_CONST(0.041472759913252) }, { FRAC_CONST(0.046245005966220), FRAC_CONST(0.042043423066923) }, { FRAC_CONST(0.045725586326493), FRAC_CONST(0.042607754635728) }, { FRAC_CONST(0.045199280581658), FRAC_CONST(0.043165669633408) }, { FRAC_CONST(0.044666167991423), FRAC_CONST(0.043717084040018) }, { FRAC_CONST(0.044126328840584), FRAC_CONST(0.044261914814575) }, { FRAC_CONST(0.043579844426930), FRAC_CONST(0.044800079907569) }, { FRAC_CONST(0.043026797049006), FRAC_CONST(0.045331498273316) }, { FRAC_CONST(0.042467269993710), FRAC_CONST(0.045856089882166) }, { FRAC_CONST(0.041901347523761), FRAC_CONST(0.046373775732552) }, { FRAC_CONST(0.041329114865000), FRAC_CONST(0.046884477862888) }, { FRAC_CONST(0.040750658193560), FRAC_CONST(0.047388119363313) }, { FRAC_CONST(0.040166064622889), FRAC_CONST(0.047884624387270) }, { FRAC_CONST(0.039575422190629), FRAC_CONST(0.048373918162926) }, { FRAC_CONST(0.038978819845356), FRAC_CONST(0.048855927004441) }, { FRAC_CONST(0.038376347433190), FRAC_CONST(0.049330578323055) }, { FRAC_CONST(0.037768095684260), FRAC_CONST(0.049797800638026) }, { FRAC_CONST(0.037154156199042), FRAC_CONST(0.050257523587392) }, { FRAC_CONST(0.036534621434563), FRAC_CONST(0.050709677938566) }, { FRAC_CONST(0.035909584690482), FRAC_CONST(0.051154195598769) }, { FRAC_CONST(0.035279140095032), FRAC_CONST(0.051591009625274) }, { FRAC_CONST(0.034643382590851), FRAC_CONST(0.052020054235496) }, { FRAC_CONST(0.034002407920680), FRAC_CONST(0.052441264816895) }, { FRAC_CONST(0.033356312612947), FRAC_CONST(0.052854577936706) }, { FRAC_CONST(0.032705193967229), FRAC_CONST(0.053259931351495) }, { FRAC_CONST(0.032049150039598), FRAC_CONST(0.053657264016528) }, { FRAC_CONST(0.031388279627857), FRAC_CONST(0.054046516094966) }, { FRAC_CONST(0.030722682256659), FRAC_CONST(0.054427628966880) }, { FRAC_CONST(0.030052458162521), FRAC_CONST(0.054800545238072) }, { FRAC_CONST(0.029377708278725), FRAC_CONST(0.055165208748723) }, { FRAC_CONST(0.028698534220122), FRAC_CONST(0.055521564581850) }, { FRAC_CONST(0.028015038267826), FRAC_CONST(0.055869559071575) }, { FRAC_CONST(0.027327323353815), FRAC_CONST(0.056209139811209) }, { FRAC_CONST(0.026635493045425), FRAC_CONST(0.056540255661140) }, { FRAC_CONST(0.025939651529755), FRAC_CONST(0.056862856756541) }, { FRAC_CONST(0.025239903597978), FRAC_CONST(0.057176894514872) }, { FRAC_CONST(0.024536354629559), FRAC_CONST(0.057482321643202) }, { FRAC_CONST(0.023829110576385), FRAC_CONST(0.057779092145329) }, { FRAC_CONST(0.023118277946808), FRAC_CONST(0.058067161328707) }, { FRAC_CONST(0.022403963789609), FRAC_CONST(0.058346485811177) }, { FRAC_CONST(0.021686275677870), FRAC_CONST(0.058617023527499) }, { FRAC_CONST(0.020965321692783), FRAC_CONST(0.058878733735689) }, { FRAC_CONST(0.020241210407366), FRAC_CONST(0.059131577023150) }, { FRAC_CONST(0.019514050870114), FRAC_CONST(0.059375515312615) }, { FRAC_CONST(0.018783952588580), FRAC_CONST(0.059610511867874) }, { FRAC_CONST(0.018051025512878), FRAC_CONST(0.059836531299311) }, { FRAC_CONST(0.017315380019131), FRAC_CONST(0.060053539569230) }, { FRAC_CONST(0.016577126892844), FRAC_CONST(0.060261503996984) }, { FRAC_CONST(0.015836377312223), FRAC_CONST(0.060460393263896) }, { FRAC_CONST(0.015093242831429), FRAC_CONST(0.060650177417972) }, { FRAC_CONST(0.014347835363782), FRAC_CONST(0.060830827878419) }, { FRAC_CONST(0.013600267164905), FRAC_CONST(0.061002317439940) }, { FRAC_CONST(0.012850650815819), FRAC_CONST(0.061164620276839) }, { FRAC_CONST(0.012099099205988), FRAC_CONST(0.061317711946905) }, { FRAC_CONST(0.011345725516320), FRAC_CONST(0.061461569395097) }, { FRAC_CONST(0.010590643202123), FRAC_CONST(0.061596170957011) }, { FRAC_CONST(0.009833965976015), FRAC_CONST(0.061721496362147) }, { FRAC_CONST(0.009075807790803), FRAC_CONST(0.061837526736961) }, { FRAC_CONST(0.008316282822321), FRAC_CONST(0.061944244607705) }, { FRAC_CONST(0.007555505452236), FRAC_CONST(0.062041633903059) }, { FRAC_CONST(0.006793590250821), FRAC_CONST(0.062129679956555) }, { FRAC_CONST(0.006030651959703), FRAC_CONST(0.062208369508780) }, { FRAC_CONST(0.005266805474583), FRAC_CONST(0.062277690709378) }, { FRAC_CONST(0.004502165827931), FRAC_CONST(0.062337633118830) }, { FRAC_CONST(0.003736848171665), FRAC_CONST(0.062388187710030) }, { FRAC_CONST(0.002970967759810), FRAC_CONST(0.062429346869643) }, { FRAC_CONST(0.002204639931138), FRAC_CONST(0.062461104399250) }, { FRAC_CONST(0.001437980091802), FRAC_CONST(0.062483455516285) }, { FRAC_CONST(0.000671103697954), FRAC_CONST(0.062496396854751) } }; /* 16 (N/4) complex twiddle factors */ ALIGN static const complex_t mdct_tab_64[] = { { FRAC_CONST(0.176763384336599), FRAC_CONST(0.002169321984356) }, { FRAC_CONST(0.175699589589310), FRAC_CONST(0.019484717553714) }, { FRAC_CONST(0.172943711747111), FRAC_CONST(0.036612464641599) }, { FRAC_CONST(0.168522291420137), FRAC_CONST(0.053387613680577) }, { FRAC_CONST(0.162477909303132), FRAC_CONST(0.069648610815172) }, { FRAC_CONST(0.154868776100077), FRAC_CONST(0.085238853753814) }, { FRAC_CONST(0.145768171923295), FRAC_CONST(0.100008199934509) }, { FRAC_CONST(0.135263740565902), FRAC_CONST(0.113814412479792) }, { FRAC_CONST(0.123456645444178), FRAC_CONST(0.126524530015608) }, { FRAC_CONST(0.110460595338559), FRAC_CONST(0.138016147162030) }, { FRAC_CONST(0.096400749315926), FRAC_CONST(0.148178593363981) }, { FRAC_CONST(0.081412511379371), FRAC_CONST(0.156913998709178) }, { FRAC_CONST(0.065640226453626), FRAC_CONST(0.164138236468888) }, { FRAC_CONST(0.049235790264535), FRAC_CONST(0.169781733284316) }, { FRAC_CONST(0.032357186500177), FRAC_CONST(0.173790139196080) }, { FRAC_CONST(0.015166965341583), FRAC_CONST(0.176124851064031) } }; #endif // SSR_DEC #endif // FIXED_POINT #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/mp4.c000066400000000000000000000230451476153623600150210ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mp4.c,v 1.41 2016/11/11 11:25:58 knik Exp $ **/ #include "common.h" #include "structs.h" #include #include "mp4.h" #include "syntax.h" /* defines if an object type can be decoded by this library or not */ static uint8_t ObjectTypesTable[32] = { 0, /* 0 NULL */ #ifdef MAIN_DEC 1, /* 1 AAC Main */ #else 0, /* 1 AAC Main */ #endif 1, /* 2 AAC LC */ #ifdef SSR_DEC 1, /* 3 AAC SSR */ #else 0, /* 3 AAC SSR */ #endif #ifdef LTP_DEC 1, /* 4 AAC LTP */ #else 0, /* 4 AAC LTP */ #endif #ifdef SBR_DEC 1, /* 5 SBR */ #else 0, /* 5 SBR */ #endif 0, /* 6 AAC Scalable */ 0, /* 7 TwinVQ */ 0, /* 8 CELP */ 0, /* 9 HVXC */ 0, /* 10 Reserved */ 0, /* 11 Reserved */ 0, /* 12 TTSI */ 0, /* 13 Main synthetic */ 0, /* 14 Wavetable synthesis */ 0, /* 15 General MIDI */ 0, /* 16 Algorithmic Synthesis and Audio FX */ /* MPEG-4 Version 2 */ #ifdef ERROR_RESILIENCE 1, /* 17 ER AAC LC */ 0, /* 18 (Reserved) */ #ifdef LTP_DEC 1, /* 19 ER AAC LTP */ #else 0, /* 19 ER AAC LTP */ #endif 0, /* 20 ER AAC scalable */ 0, /* 21 ER TwinVQ */ 0, /* 22 ER BSAC */ #ifdef LD_DEC 1, /* 23 ER AAC LD */ #else 0, /* 23 ER AAC LD */ #endif 0, /* 24 ER CELP */ 0, /* 25 ER HVXC */ 0, /* 26 ER HILN */ 0, /* 27 ER Parametric */ #else /* No ER defined */ 0, /* 17 ER AAC LC */ 0, /* 18 (Reserved) */ 0, /* 19 ER AAC LTP */ 0, /* 20 ER AAC scalable */ 0, /* 21 ER TwinVQ */ 0, /* 22 ER BSAC */ 0, /* 23 ER AAC LD */ 0, /* 24 ER CELP */ 0, /* 25 ER HVXC */ 0, /* 26 ER HILN */ 0, /* 27 ER Parametric */ #endif 0, /* 28 (Reserved) */ #ifdef PS_DEC 1, /* 29 AAC LC + SBR + PS */ #else 0, /* 29 AAC LC + SBR + PS */ #endif 0, /* 30 (Reserved) */ 0 /* 31 (Reserved) */ }; /* Table 1.6.1 */ char NeAACDecAudioSpecificConfig(unsigned char *pBuffer, unsigned long buffer_size, mp4AudioSpecificConfig *mp4ASC) { return AudioSpecificConfig2(pBuffer, buffer_size, mp4ASC, NULL, 0); } int8_t AudioSpecificConfigFromBitfile(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint32_t buffer_size, uint8_t short_form) { int8_t result = 0; uint32_t startpos = faad_get_processed_bits(ld); #ifdef SBR_DEC int8_t bits_to_decode = 0; #endif if (mp4ASC == NULL) return -8; memset(mp4ASC, 0, sizeof(mp4AudioSpecificConfig)); mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,1,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); mp4ASC->samplingFrequencyIndex = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,2,"parse_audio_decoder_specific_info(): SamplingFrequencyIndex")); if(mp4ASC->samplingFrequencyIndex==0x0f) faad_getbits(ld, 24); mp4ASC->channelsConfiguration = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,3,"parse_audio_decoder_specific_info(): ChannelsConfiguration")); mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); if (ObjectTypesTable[mp4ASC->objectTypeIndex] != 1) { return -1; } if (mp4ASC->samplingFrequency == 0) { return -2; } if (mp4ASC->channelsConfiguration > 7) { return -3; } #if (defined(PS_DEC) || defined(DRM_PS)) /* check if we have a mono file */ if (mp4ASC->channelsConfiguration == 1) { /* upMatrix to 2 channels for implicit signalling of PS */ mp4ASC->channelsConfiguration = 2; } #endif #ifdef SBR_DEC mp4ASC->sbr_present_flag = -1; if (mp4ASC->objectTypeIndex == 5 || mp4ASC->objectTypeIndex == 29) { uint8_t tmp; mp4ASC->sbr_present_flag = 1; tmp = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,5,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); /* check for downsampled SBR */ if (tmp == mp4ASC->samplingFrequencyIndex) mp4ASC->downSampledSBR = 1; mp4ASC->samplingFrequencyIndex = tmp; if (mp4ASC->samplingFrequencyIndex == 15) { mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 DEBUGVAR(1,6,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); } else { mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); } mp4ASC->objectTypeIndex = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,7,"parse_audio_decoder_specific_info(): ObjectTypeIndex")); } #endif /* get GASpecificConfig */ if (mp4ASC->objectTypeIndex == 1 || mp4ASC->objectTypeIndex == 2 || mp4ASC->objectTypeIndex == 3 || mp4ASC->objectTypeIndex == 4 || mp4ASC->objectTypeIndex == 6 || mp4ASC->objectTypeIndex == 7) { result = GASpecificConfig(ld, mp4ASC, pce); #ifdef ERROR_RESILIENCE } else if (mp4ASC->objectTypeIndex >= ER_OBJECT_START) { /* ER */ result = GASpecificConfig(ld, mp4ASC, pce); mp4ASC->epConfig = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,143,"parse_audio_decoder_specific_info(): epConfig")); if (mp4ASC->epConfig != 0) result = -5; #endif } else { result = -4; } #ifdef SSR_DEC /* shorter frames not allowed for SSR */ if ((mp4ASC->objectTypeIndex == 4) && mp4ASC->frameLengthFlag) return -6; #endif #ifdef SBR_DEC if(short_form) bits_to_decode = 0; else bits_to_decode = (int8_t)(buffer_size*8 + faad_get_processed_bits(ld) - startpos); if ((mp4ASC->objectTypeIndex != 5 && mp4ASC->objectTypeIndex != 29) && (bits_to_decode >= 16)) { int16_t syncExtensionType = (int16_t)faad_getbits(ld, 11 DEBUGVAR(1,9,"parse_audio_decoder_specific_info(): syncExtensionType")); if (syncExtensionType == 0x2b7) { uint8_t tmp_OTi = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,10,"parse_audio_decoder_specific_info(): extensionAudioObjectType")); if (tmp_OTi == 5) { mp4ASC->sbr_present_flag = (uint8_t)faad_get1bit(ld DEBUGVAR(1,11,"parse_audio_decoder_specific_info(): sbr_present_flag")); if (mp4ASC->sbr_present_flag) { uint8_t tmp; /* Don't set OT to SBR until checked that it is actually there */ mp4ASC->objectTypeIndex = tmp_OTi; tmp = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,12,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); /* check for downsampled SBR */ if (tmp == mp4ASC->samplingFrequencyIndex) mp4ASC->downSampledSBR = 1; mp4ASC->samplingFrequencyIndex = tmp; if (mp4ASC->samplingFrequencyIndex == 15) { mp4ASC->samplingFrequency = (uint32_t)faad_getbits(ld, 24 DEBUGVAR(1,13,"parse_audio_decoder_specific_info(): extensionSamplingFrequencyIndex")); } else { mp4ASC->samplingFrequency = get_sample_rate(mp4ASC->samplingFrequencyIndex); } } } } } /* no SBR signalled, this could mean either implicit signalling or no SBR in this file */ /* MPEG specification states: assume SBR on files with samplerate <= 24000 Hz */ if (mp4ASC->sbr_present_flag == (char)-1) /* cannot be -1 on systems with unsigned char */ { if (mp4ASC->samplingFrequency <= 24000) { mp4ASC->samplingFrequency *= 2; mp4ASC->forceUpSampling = 1; } else /* > 24000*/ { mp4ASC->downSampledSBR = 1; } } #endif faad_endbits(ld); return result; } int8_t AudioSpecificConfig2(uint8_t *pBuffer, uint32_t buffer_size, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint8_t short_form) { uint8_t ret = 0; bitfile ld; faad_initbits(&ld, pBuffer, buffer_size); if (ld.error != 0) return -7; ret = AudioSpecificConfigFromBitfile(&ld, mp4ASC, pce, buffer_size, short_form); faad_endbits(&ld); return ret; } faad2-2.11.2/libfaad/mp4.h000066400000000000000000000035451476153623600150310ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: mp4.h,v 1.28 2009/02/05 00:51:03 menno Exp $ **/ #ifndef __MP4_H__ #define __MP4_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #include "neaacdec.h" int8_t AudioSpecificConfig2(uint8_t *pBuffer, uint32_t buffer_size, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint8_t short_form); int8_t AudioSpecificConfigFromBitfile(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce, uint32_t bsize, uint8_t short_form); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ms.c000066400000000000000000000053321476153623600147370ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ms.c,v 1.21 2007/11/01 12:33:32 menno Exp $ **/ #include "common.h" #include "structs.h" #include "syntax.h" #include "ms.h" #include "is.h" #include "pns.h" void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len) { uint8_t g, b, sfb; uint8_t group = 0; uint16_t nshort = frame_len/8; uint16_t i, k; real_t tmp; if (ics->ms_mask_present >= 1) { for (g = 0; g < ics->num_window_groups; g++) { for (b = 0; b < ics->window_group_length[g]; b++) { for (sfb = 0; sfb < ics->max_sfb; sfb++) { /* If intensity stereo coding or noise substitution is on for a particular scalefactor band, no M/S stereo decoding is carried out. */ if ((ics->ms_used[g][sfb] || ics->ms_mask_present == 2) && !is_intensity(icsr, g, sfb) && !is_noise(ics, g, sfb)) { for (i = ics->swb_offset[sfb]; i < min(ics->swb_offset[sfb+1], ics->swb_offset_max); i++) { k = (group*nshort) + i; tmp = l_spec[k] - r_spec[k]; l_spec[k] = l_spec[k] + r_spec[k]; r_spec[k] = tmp; } } } group++; } } } } faad2-2.11.2/libfaad/ms.h000066400000000000000000000027611476153623600147470ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ms.h,v 1.19 2007/11/01 12:33:32 menno Exp $ **/ #ifndef __MS_H__ #define __MS_H__ #ifdef __cplusplus extern "C" { #endif void ms_decode(ic_stream *ics, ic_stream *icsr, real_t *l_spec, real_t *r_spec, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/output.c000066400000000000000000000427111476153623600156620ustar00rootroot00000000000000/* ** 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) #define BOTH FRAC_CONST(0.2265409196609864215998) // 1/(sqrt(2) + 2 + 1) 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) { real_t C; if (up_matrix == 1) return input[internal_channel[0]][sample]; if (!down_matrix) return input[internal_channel[channel]][sample]; C = MUL_F(input[internal_channel[0]][sample], BOTH); if (channel == 0) { real_t L_S = MUL_F(input[internal_channel[3]][sample], BOTH); real_t core = MUL_F(input[internal_channel[1]][sample], DM_MUL); return core + C + L_S; } else { real_t R_S = MUL_F(input[internal_channel[4]][sample], BOTH); real_t core = MUL_F(input[internal_channel[2]][sample], DM_MUL); return core + C + R_S; } } 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; int32_t exp, half, sat_shift_mask; /* 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: exp = 16 - REAL_BITS; half = 1 << (exp - 1); sat_shift_mask = SAT_SHIFT_MASK(exp); 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 += half; } else { tmp += -half; } tmp = SAT_SHIFT(tmp, exp, sat_shift_mask); int_sample_buffer[(i*channels)+ch] = tmp; } break; case FAAD_FMT_FIXED: for(i = 0; i < frame_len; i++) { real_t tmp = get_sample(input, ch, i, hDecoder->downMatrix, hDecoder->upMatrix, hDecoder->internal_channel); int_sample_buffer[(i*channels)+ch] = (int32_t)tmp; } break; } } return sample_buffer; } #endif faad2-2.11.2/libfaad/output.h000066400000000000000000000031661476153623600156700ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: output.h,v 1.26 2009/01/26 23:51:15 menno Exp $ **/ #ifndef __OUTPUT_H__ #define __OUTPUT_H__ #ifdef __cplusplus extern "C" { #endif void* output_to_PCM(NeAACDecStruct *hDecoder, real_t **input, void *samplebuffer, uint8_t channels, uint16_t frame_len, uint8_t format); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/pns.c000066400000000000000000000220621476153623600151170ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pns.c,v 1.39 2010/06/04 20:47:56 menno Exp $ **/ #include "common.h" #include "structs.h" #include "pns.h" /* static function declarations */ static void gen_rand_vector(real_t *spec, int16_t scale_factor, uint16_t size, uint8_t sub, /* RNG states */ uint32_t *__r1, uint32_t *__r2); #ifdef FIXED_POINT static real_t const pow2_table[] = { COEF_CONST(1.0), COEF_CONST(1.18920711500272), COEF_CONST(1.41421356237310), COEF_CONST(1.68179283050743) }; // mean_energy_table[x] == sqrt(3 / x) static real_t const mean_energy_table[] = { COEF_CONST(0.0), // should not happen COEF_CONST(1.7320508075688772), COEF_CONST(1.224744871391589), COEF_CONST(1.0), // sqrt(3/3) COEF_CONST(0.8660254037844386), COEF_CONST(0.7745966692414834), COEF_CONST(0.7071067811865476), COEF_CONST(0.6546536707079771), COEF_CONST(0.6123724356957945), COEF_CONST(0.5773502691896257), COEF_CONST(0.5477225575051661), COEF_CONST(0.5222329678670935), COEF_CONST(0.5), // sqrt(3/12) COEF_CONST(0.4803844614152614), COEF_CONST(0.4629100498862757), COEF_CONST(0.4472135954999579), }; #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; (void)sub; scale_factor = min(max(scale_factor, -120), 120); for (i = 0; i < size; i++) { real_t tmp = (real_t)(int32_t)ne_rng(__r1, __r2); spec[i] = tmp; energy += tmp*tmp; } if (energy > 0) { real_t 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 scale; int32_t exp, frac; int32_t idx, mask; /* IMDCT pre-scaling */ scale_factor -= 4 * sub; // 52 stands for 2**13 == 8192 factor; larger factor causes overflows later (in cfft). scale_factor = min(max(scale_factor, -(REAL_BITS * 4)), 52); exp = scale_factor >> 2; frac = scale_factor & 3; /* 29 <= REAL_BITS + exp <= 0 */ mask = (1 << (REAL_BITS + exp)) - 1; idx = size; scale = COEF_CONST(1); // At most 2 iterations. while (idx >= 16) { idx >>= 2; scale >>= 1; } scale = MUL_C(scale, mean_energy_table[idx]); if (frac) scale = MUL_C(scale, pow2_table[frac]); // scale is less than 4.0 now. for (i = 0; i < size; i++) { real_t tmp = (int32_t)ne_rng(__r1, __r2); if (tmp < 0) tmp = -(tmp & mask); else tmp = (tmp & mask); spec[i] = MUL_C(tmp, 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 begin, end; 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*/; } #else (void)object_type; #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++) { uint16_t base = group * nshort; for (sfb = 0; sfb < ics_left->max_sfb; sfb++) { uint32_t r1_dep = 0, r2_dep = 0; if (is_noise(ics_left, g, sfb)) { #ifdef LTP_DEC /* Simultaneous use of LTP and PNS is not prevented in the syntax. If both LTP, and PNS are enabled on the same scalefactor band, PNS takes precedence, and no prediction is applied to this band. */ ics_left->ltp.long_used[sfb] = 0; ics_left->ltp2.long_used[sfb] = 0; #endif #ifdef MAIN_DEC /* For scalefactor bands coded using PNS the corresponding predictors are switched to "off". */ ics_left->pred.prediction_used[sfb] = 0; #endif begin = min(base + ics_left->swb_offset[sfb], ics_left->swb_offset_max); end = min(base + ics_left->swb_offset[sfb+1], ics_left->swb_offset_max); r1_dep = *__r1; r2_dep = *__r2; /* Generate random vector */ gen_rand_vector(&spec_left[begin], ics_left->scale_factors[g][sfb], end - begin, sub, __r1, __r2); } /* From the spec: If the same scalefactor band and group is coded by perceptual noise substitution in both channels of a channel pair, the correlation of the noise signal can be controlled by means of the ms_used field: While the default noise generation process works independently for each channel (separate generation of random vectors), the same random vector is used for both channels if ms_used[] is set for a particular scalefactor band and group. In this case, no M/S stereo coding is carried out (because M/S stereo coding and noise substitution coding are mutually exclusive). If the same scalefactor band and group is coded by perceptual noise substitution in only one channel of a channel pair the setting of ms_used[] is not evaluated. */ if ((ics_right != NULL) && is_noise(ics_right, g, sfb)) { #ifdef LTP_DEC /* See comment above. */ ics_right->ltp.long_used[sfb] = 0; ics_right->ltp2.long_used[sfb] = 0; #endif #ifdef MAIN_DEC /* See comment above. */ ics_right->pred.prediction_used[sfb] = 0; #endif if (channel_pair && is_noise(ics_left, g, sfb) && (((ics_left->ms_mask_present == 1) && (ics_left->ms_used[g][sfb])) || (ics_left->ms_mask_present == 2))) { /*uint16_t c;*/ begin = min(base + ics_right->swb_offset[sfb], ics_right->swb_offset_max); end = min(base + ics_right->swb_offset[sfb+1], ics_right->swb_offset_max); /* Generate random vector dependent on left channel*/ gen_rand_vector(&spec_right[begin], ics_right->scale_factors[g][sfb], end - begin, sub, &r1_dep, &r2_dep); } else /*if (ics_left->ms_mask_present == 0)*/ { begin = min(base + ics_right->swb_offset[sfb], ics_right->swb_offset_max); end = min(base + ics_right->swb_offset[sfb+1], ics_right->swb_offset_max); /* Generate random vector */ gen_rand_vector(&spec_right[begin], ics_right->scale_factors[g][sfb], end - begin, sub, __r1, __r2); } } } /* sfb */ group++; } /* b */ } /* g */ } faad2-2.11.2/libfaad/pns.h000066400000000000000000000035171476153623600151300ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pns.h,v 1.27 2007/11/01 12:33:33 menno Exp $ **/ #ifndef __PNS_H__ #define __PNS_H__ #ifdef __cplusplus extern "C" { #endif #include "syntax.h" #define NOISE_OFFSET 90 void pns_decode(ic_stream *ics_left, ic_stream *ics_right, real_t *spec_left, real_t *spec_right, uint16_t frame_len, uint8_t channel_pair, uint8_t object_type, /* RNG states */ uint32_t *__r1, uint32_t *__r2); static INLINE uint8_t is_noise(ic_stream *ics, uint8_t group, uint8_t sfb) { if (ics->sfb_cb[group][sfb] == NOISE_HCB) return 1; return 0; } #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ps_dec.c000066400000000000000000002163131476153623600155600ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ps_dec.c,v 1.16 2009/01/26 22:32:31 menno Exp $ **/ #include "common.h" #ifdef PS_DEC #include #include #include "ps_dec.h" #include "ps_tables.h" /* constants */ #define NEGATE_IPD_MASK (0x1000) #define DECAY_SLOPE FRAC_CONST(0.05) #define COEF_SQRT2 COEF_CONST(1.4142135623731) /* tables */ /* filters are mirrored in coef 6, second half left out */ static const real_t p8_13_20[7] = { FRAC_CONST(0.00746082949812), FRAC_CONST(0.02270420949825), FRAC_CONST(0.04546865930473), FRAC_CONST(0.07266113929591), FRAC_CONST(0.09885108575264), FRAC_CONST(0.11793710567217), FRAC_CONST(0.125) }; static const real_t p2_13_20[7] = { FRAC_CONST(0.0), FRAC_CONST(0.01899487526049), FRAC_CONST(0.0), FRAC_CONST(-0.07293139167538), FRAC_CONST(0.0), FRAC_CONST(0.30596630545168), FRAC_CONST(0.5) }; static const real_t p12_13_34[7] = { FRAC_CONST(0.04081179924692), FRAC_CONST(0.03812810994926), FRAC_CONST(0.05144908135699), FRAC_CONST(0.06399831151592), FRAC_CONST(0.07428313801106), FRAC_CONST(0.08100347892914), FRAC_CONST(0.08333333333333) }; static const real_t p8_13_34[7] = { FRAC_CONST(0.01565675600122), FRAC_CONST(0.03752716391991), FRAC_CONST(0.05417891378782), FRAC_CONST(0.08417044116767), FRAC_CONST(0.10307344158036), FRAC_CONST(0.12222452249753), FRAC_CONST(0.125) }; static const real_t p4_13_34[7] = { FRAC_CONST(-0.05908211155639), FRAC_CONST(-0.04871498374946), FRAC_CONST(0.0), FRAC_CONST(0.07778723915851), FRAC_CONST(0.16486303567403), FRAC_CONST(0.23279856662996), FRAC_CONST(0.25) }; #ifdef PARAM_32KHZ static const uint8_t delay_length_d[2][NO_ALLPASS_LINKS] = { { 1, 2, 3 } /* d_24kHz */, { 3, 4, 5 } /* d_48kHz */ }; #else static const uint8_t delay_length_d[NO_ALLPASS_LINKS] = { 3, 4, 5 /* d_48kHz */ }; #endif static const real_t filter_a[NO_ALLPASS_LINKS] = { /* a(m) = exp(-d_48kHz(m)/7) */ FRAC_CONST(0.65143905753106), FRAC_CONST(0.56471812200776), FRAC_CONST(0.48954165955695) }; static const uint8_t group_border20[10+12 + 1] = { 6, 7, 0, 1, 2, 3, /* 6 subqmf subbands */ 9, 8, /* 2 subqmf subbands */ 10, 11, /* 2 subqmf subbands */ 3, 4, 5, 6, 7, 8, 9, 11, 14, 18, 23, 35, 64 }; static const uint8_t group_border34[32+18 + 1] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, /* 12 subqmf subbands */ 12, 13, 14, 15, 16, 17, 18, 19, /* 8 subqmf subbands */ 20, 21, 22, 23, /* 4 subqmf subbands */ 24, 25, 26, 27, /* 4 subqmf subbands */ 28, 29, 30, 31, /* 4 subqmf subbands */ 32-27, 33-27, 34-27, 35-27, 36-27, 37-27, 38-27, 40-27, 42-27, 44-27, 46-27, 48-27, 51-27, 54-27, 57-27, 60-27, 64-27, 68-27, 91-27 }; static const uint16_t map_group2bk20[10+12] = { (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; static const uint16_t map_group2bk34[32+18] = { 0, 1, 2, 3, 4, 5, 6, 6, 7, (NEGATE_IPD_MASK | 2), (NEGATE_IPD_MASK | 1), (NEGATE_IPD_MASK | 0), 10, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 9, 14, 11, 12, 13, 14, 15, 16, 13, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 }; /* type definitions */ typedef struct { uint8_t frame_len; uint8_t resolution20[3]; uint8_t resolution34[5]; qmf_t *work; qmf_t **buffer; qmf_t **temp; } hyb_info; /* static function declarations */ static void ps_data_decode(ps_info *ps); static hyb_info *hybrid_init(uint8_t numTimeSlotsRate); static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid); static void INLINE DCT3_4_unscaled(real_t *y, real_t *x); static void channel_filter8(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid); static void hybrid_analysis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], uint8_t use34, uint8_t numTimeSlotsRate); static void hybrid_synthesis(hyb_info *hyb, qmf_t X[32][64], qmf_t X_hybrid[32][32], uint8_t use34, uint8_t numTimeSlotsRate); static int8_t delta_clip(int8_t i, int8_t min, int8_t max); static void delta_decode(uint8_t enable, int8_t *index, int8_t *index_prev, uint8_t dt_flag, uint8_t nr_par, uint8_t stride, int8_t min_index, int8_t max_index); static void delta_modulo_decode(uint8_t enable, int8_t *index, int8_t *index_prev, uint8_t dt_flag, uint8_t nr_par, uint8_t stride, int8_t and_modulo); static void map20indexto34(int8_t *index, uint8_t bins); #ifdef PS_LOW_POWER static void map34indexto20(int8_t *index, uint8_t bins); #endif static void ps_data_decode(ps_info *ps); static void ps_decorrelate(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); static void ps_mix_phase(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64], qmf_t X_hybrid_left[32][32], qmf_t X_hybrid_right[32][32]); /* */ static hyb_info *hybrid_init(uint8_t numTimeSlotsRate) { uint8_t i; hyb_info *hyb = (hyb_info*)faad_malloc(sizeof(hyb_info)); hyb->resolution34[0] = 12; hyb->resolution34[1] = 8; hyb->resolution34[2] = 4; hyb->resolution34[3] = 4; hyb->resolution34[4] = 4; hyb->resolution20[0] = 8; hyb->resolution20[1] = 2; hyb->resolution20[2] = 2; hyb->frame_len = numTimeSlotsRate; hyb->work = (qmf_t*)faad_malloc((hyb->frame_len+12) * sizeof(qmf_t)); memset(hyb->work, 0, (hyb->frame_len+12) * sizeof(qmf_t)); hyb->buffer = (qmf_t**)faad_malloc(5 * sizeof(qmf_t*)); for (i = 0; i < 5; i++) { hyb->buffer[i] = (qmf_t*)faad_malloc(hyb->frame_len * sizeof(qmf_t)); memset(hyb->buffer[i], 0, hyb->frame_len * sizeof(qmf_t)); } hyb->temp = (qmf_t**)faad_malloc(hyb->frame_len * sizeof(qmf_t*)); for (i = 0; i < hyb->frame_len; i++) { hyb->temp[i] = (qmf_t*)faad_malloc(12 /*max*/ * sizeof(qmf_t)); } return hyb; } static void hybrid_free(hyb_info *hyb) { uint8_t i; if (!hyb) return; if (hyb->work) faad_free(hyb->work); for (i = 0; i < 5; i++) { if (hyb->buffer[i]) faad_free(hyb->buffer[i]); } if (hyb->buffer) faad_free(hyb->buffer); for (i = 0; i < hyb->frame_len; i++) { if (hyb->temp[i]) faad_free(hyb->temp[i]); } if (hyb->temp) faad_free(hyb->temp); faad_free(hyb); } /* real filter, size 2 */ static void channel_filter2(hyb_info *hyb, uint8_t frame_len, const real_t *filter, qmf_t *buffer, qmf_t **X_hybrid) { uint8_t i; (void)hyb; /* TODO: remove parameter? */ 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]; (void)hyb; /* TODO: remove parameter? */ 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]; (void)hyb; /* TODO: remove parameter? */ 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]; (void)hyb; /* TODO: remove parameter? */ 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; (void)numTimeSlotsRate; /* TODO: remove parameter? */ 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, bk; uint8_t temp_delay = 0; 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 n multiplied by filter_a[n] */ for (n = 0; n < NO_ALLPASS_LINKS; n++) { g_DecaySlope_filt[n] = MUL_F(g_DecaySlope, filter_a[n]); } /* 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; uint8_t m; 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 */ 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 (n = 0; n < NO_ALLPASS_LINKS; n++) ps->delay_buf_index_ser[n] = temp_delay_ser[n]; } #if 0 #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 #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; // COEF complex_t H11, H12, H21, H22; // COEF complex_t deltaH11, deltaH12, deltaH21, deltaH22; // COEF complex_t tempLeft, tempRight; // FRAC complex_t phaseLeft, phaseRight; // FRAC 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++) { uint8_t abs_iid = (uint8_t)abs(ps->iid_index[env][bk]); /* index range is supposed to be -7...7 or -15...15 depending on iid_mode (Table 8.24, ISO/IEC 14496-3:2005). if it is outside these boundaries, this is most likely an error. sanitize it and try to process further. */ if (ps->iid_index[env][bk] < -no_iid_steps) { fprintf(stderr, "Warning: invalid iid_index: %d < %d\n", ps->iid_index[env][bk], -no_iid_steps); ps->iid_index[env][bk] = -no_iid_steps; abs_iid = no_iid_steps; } else if (ps->iid_index[env][bk] > no_iid_steps) { fprintf(stderr, "Warning: invalid iid_index: %d > %d\n", ps->iid_index[env][bk], no_iid_steps); ps->iid_index[env][bk] = no_iid_steps; abs_iid = no_iid_steps; } if (ps->icc_index[env][bk] < 0) { fprintf(stderr, "Warning: invalid icc_index: %d < 0\n", ps->icc_index[env][bk]); ps->icc_index[env][bk] = 0; } else if (ps->icc_index[env][bk] > 7) { fprintf(stderr, "Warning: invalid icc_index: %d > 7\n", ps->icc_index[env][bk]); ps->icc_index[env][bk] = 7; } if (ps->icc_mode < 3) { /* type 'A' mixing as described in 8.6.4.6.2.1 */ real_t c_1, c_2; // COEF real_t cosa, sina; // COEF real_t cosb, sinb; // COEF real_t ab1, ab2; // COEF real_t ab3, ab4; // COEF /* 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) { cosb = cos_betas_fine[abs_iid][ps->icc_index[env][bk]]; sinb = sin_betas_fine[abs_iid][ps->icc_index[env][bk]]; } else { cosb = cos_betas_normal[abs_iid][ps->icc_index[env][bk]]; sinb = sin_betas_normal[abs_iid][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; // COEF real_t cosg, sing; // COEF /* 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) { 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 { 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)); } IM(h11) = IM(h12) = IM(h21) = IM(h22) = 0; /* 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; // FRAC /* ringbuffer index */ i = ps->phase_hist; /* previous value */ #ifdef FIXED_POINT /* divide by 4*2, shift right 3 bits; extra halving to avoid overflows; it is ok, because result is normalized */ RE(tempLeft) = RE(ps->ipd_prev[bk][i]) >> 3; IM(tempLeft) = IM(ps->ipd_prev[bk][i]) >> 3; RE(tempRight) = RE(ps->opd_prev[bk][i]) >> 3; IM(tempRight) = IM(ps->opd_prev[bk][i]) >> 3; #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 */ #ifdef FIXED_POINT /* extra halving to avoid overflows */ 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) += 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]); #endif /* ringbuffer index */ if (i == 0) { i = 2; } i--; /* get value before previous */ #ifdef FIXED_POINT /* dividing by 2*2, shift right 2 bits; extra halving to avoid overflows */ 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.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_F(RE(tempRight), xy); IM(phaseLeft) = DIV_F(IM(tempRight), xy); } else { RE(phaseLeft) = 0; IM(phaseLeft) = 0; } xypq = MUL_F(xy, pq); if (xypq != 0) { real_t tmp1 = MUL_F(RE(tempRight), RE(tempLeft)) + MUL_F(IM(tempRight), IM(tempLeft)); real_t tmp2 = MUL_F(IM(tempRight), RE(tempLeft)) - MUL_F(RE(tempRight), IM(tempLeft)); RE(phaseRight) = DIV_F(tmp1, xypq); IM(phaseRight) = DIV_F(tmp2, xypq); } else { RE(phaseRight) = 0; IM(phaseRight) = 0; } #endif /* MUL_F(COEF, REAL) = COEF */ IM(h11) = MUL_F(RE(h11), IM(phaseLeft)); IM(h12) = MUL_F(RE(h12), IM(phaseRight)); IM(h21) = MUL_F(RE(h21), IM(phaseLeft)); IM(h22) = MUL_F(RE(h22), IM(phaseRight)); RE(h11) = MUL_F(RE(h11), RE(phaseLeft)); RE(h12) = MUL_F(RE(h12), RE(phaseRight)); RE(h21) = MUL_F(RE(h21), RE(phaseLeft)); RE(h22) = MUL_F(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]); IM(H11) = IM(H12) = IM(H21) = IM(H22) = 0; 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; // precision_of in(Left|Right) == precision_of X_(left|right) /* 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]); } /* precision_of temp(Left|Right) == precision_of X_(left|right) */ /* 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 (void)sr_index; /* 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->h11_prev[i]) = 1; RE(ps->h12_prev[i]) = 1; IM(ps->h12_prev[i]) = 1; } ps->phase_hist = 0; for (i = 0; i < 20; i++) { RE(ps->ipd_prev[i][0]) = 0; IM(ps->ipd_prev[i][0]) = 0; RE(ps->ipd_prev[i][1]) = 0; IM(ps->ipd_prev[i][1]) = 0; RE(ps->opd_prev[i][0]) = 0; IM(ps->opd_prev[i][0]) = 0; RE(ps->opd_prev[i][1]) = 0; IM(ps->opd_prev[i][1]) = 0; } return ps; } /* main Parametric Stereo decoding function */ uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]) { qmf_t X_hybrid_left[32][32] = {{{0}}}; qmf_t X_hybrid_right[32][32] = {{{0}}}; /* delta decoding of the bitstream data */ ps_data_decode(ps); /* set up some parameters depending on filterbank type */ if (ps->use34hybrid_bands) { ps->group_border = (uint8_t*)group_border34; ps->map_group2bk = (uint16_t*)map_group2bk34; ps->num_groups = 32+18; ps->num_hybrid_groups = 32; ps->nr_par_bands = 34; ps->decay_cutoff = 5; } else { ps->group_border = (uint8_t*)group_border20; ps->map_group2bk = (uint16_t*)map_group2bk20; ps->num_groups = 10+12; ps->num_hybrid_groups = 10; ps->nr_par_bands = 20; ps->decay_cutoff = 3; } /* Perform further analysis on the lowest subbands to get a higher * frequency resolution */ hybrid_analysis((hyb_info*)ps->hyb, X_left, X_hybrid_left, ps->use34hybrid_bands, ps->numTimeSlotsRate); /* decorrelate mono signal */ ps_decorrelate(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); /* apply mixing and phase parameters */ ps_mix_phase(ps, X_left, X_right, X_hybrid_left, X_hybrid_right); /* hybrid synthesis, to rebuild the SBR QMF matrices */ hybrid_synthesis((hyb_info*)ps->hyb, X_left, X_hybrid_left, ps->use34hybrid_bands, ps->numTimeSlotsRate); hybrid_synthesis((hyb_info*)ps->hyb, X_right, X_hybrid_right, ps->use34hybrid_bands, ps->numTimeSlotsRate); return 0; } #endif faad2-2.11.2/libfaad/ps_dec.h000066400000000000000000000102751476153623600155640ustar00rootroot00000000000000/* ** 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; /**/ uint8_t num_groups; uint8_t num_hybrid_groups; uint8_t nr_par_bands; uint8_t nr_allpass_bands; uint8_t decay_cutoff; /* 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]; /* mixing and phase */ uint8_t phase_hist; /* hybrid filterbank parameters */ uint8_t use34hybrid_bands; uint8_t numTimeSlotsRate; uint8_t *group_border; uint16_t *map_group2bk; 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]; complex_t ipd_prev[20][2]; complex_t opd_prev[20][2]; /* hybrid filterbank parameters */ void *hyb; } ps_info; /* ps_syntax.c */ uint16_t ps_data(ps_info *ps, bitfile *ld, uint8_t *header); /* ps_dec.c */ ps_info *ps_init(uint8_t sr_index, uint8_t numTimeSlotsRate); void ps_free(ps_info *ps); uint8_t ps_decode(ps_info *ps, qmf_t X_left[38][64], qmf_t X_right[38][64]); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ps_syntax.c000066400000000000000000000610041476153623600163460ustar00rootroot00000000000000/* ** 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); (void)num_bits_left; /* TODO: remove parameter, or actually use it. */ 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; int8_t index = 0; while (index >= 0) { bit = (uint8_t)faad_get1bit(ld); index = t_huff[index][bit]; } return index + 31; } #endif faad2-2.11.2/libfaad/ps_tables.h000066400000000000000000001727101476153623600163060ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ps_tables.h,v 1.8 2007/11/01 12:33:33 menno Exp $ **/ #ifndef __PS_TABLES_H__ #define __PS_TABLES_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif #if 0 #if 0 float f_center_20[12] = { 0.5/4, 1.5/4, 2.5/4, 3.5/4, 4.5/4*0, 5.5/4*0, -1.5/4, -0.5/4, 3.5/2, 2.5/2, 4.5/2, 5.5/2 }; #else float f_center_20[12] = { 0.5/8, 1.5/8, 2.5/8, 3.5/8, 4.5/8*0, 5.5/8*0, -1.5/8, -0.5/8, 3.5/4, 2.5/4, 4.5/4, 5.5/4 }; #endif float f_center_34[32] = { 1/12, 3/12, 5/12, 7/12, 9/12, 11/12, 13/12, 15/12, 17/12, -5/12, -3/12, -1/12, 17/8, 19/8, 5/8, 7/8, 9/8, 11/8, 13/8, 15/8, 9/4, 11/4, 13/4, 7/4, 17/4, 11/4, 13/4, 15/4, 17/4, 19/4, 21/4, 15/4 }; static const real_t frac_delay_q[] = { FRAC_CONST(0.43), FRAC_CONST(0.75), FRAC_CONST(0.347) }; #endif /* RE(ps->Phi_Fract_Qmf[j]) = (float)cos(M_PI*(j+0.5)*(0.39)); */ /* IM(ps->Phi_Fract_Qmf[j]) = (float)sin(M_PI*(j+0.5)*(0.39)); */ static const complex_t Phi_Fract_Qmf[] = { { FRAC_CONST(0.8181497455), FRAC_CONST(0.5750052333) }, { FRAC_CONST(-0.2638730407), FRAC_CONST(0.9645574093) }, { FRAC_CONST(-0.9969173074), FRAC_CONST(0.0784590989) }, { FRAC_CONST(-0.4115143716), FRAC_CONST(-0.9114032984) }, { FRAC_CONST(0.7181262970), FRAC_CONST(-0.6959127784) }, { FRAC_CONST(0.8980275989), FRAC_CONST(0.4399391711) }, { FRAC_CONST(-0.1097343117), FRAC_CONST(0.9939609766) }, { FRAC_CONST(-0.9723699093), FRAC_CONST(0.2334453613) }, { FRAC_CONST(-0.5490227938), FRAC_CONST(-0.8358073831) }, { FRAC_CONST(0.6004202366), FRAC_CONST(-0.7996846437) }, { FRAC_CONST(0.9557930231), FRAC_CONST(0.2940403223) }, { FRAC_CONST(0.0471064523), FRAC_CONST(0.9988898635) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.6730124950), FRAC_CONST(-0.7396311164) }, { FRAC_CONST(0.4679298103), FRAC_CONST(-0.8837656379) }, { FRAC_CONST(0.9900236726), FRAC_CONST(0.1409012377) }, { FRAC_CONST(0.2027872950), FRAC_CONST(0.9792228341) }, { FRAC_CONST(-0.8526401520), FRAC_CONST(0.5224985480) }, { FRAC_CONST(-0.7804304361), FRAC_CONST(-0.6252426505) }, { FRAC_CONST(0.3239174187), FRAC_CONST(-0.9460853338) }, { FRAC_CONST(0.9998766184), FRAC_CONST(-0.0157073177) }, { FRAC_CONST(0.3534748554), FRAC_CONST(0.9354440570) }, { FRAC_CONST(-0.7604059577), FRAC_CONST(0.6494480371) }, { FRAC_CONST(-0.8686315417), FRAC_CONST(-0.4954586625) }, { FRAC_CONST(0.1719291061), FRAC_CONST(-0.9851093292) }, { FRAC_CONST(0.9851093292), FRAC_CONST(-0.1719291061) }, { FRAC_CONST(0.4954586625), FRAC_CONST(0.8686315417) }, { FRAC_CONST(-0.6494480371), FRAC_CONST(0.7604059577) }, { FRAC_CONST(-0.9354440570), FRAC_CONST(-0.3534748554) }, { FRAC_CONST(0.0157073177), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(0.9460853338), FRAC_CONST(-0.3239174187) }, { FRAC_CONST(0.6252426505), FRAC_CONST(0.7804304361) }, { FRAC_CONST(-0.5224985480), FRAC_CONST(0.8526401520) }, { FRAC_CONST(-0.9792228341), FRAC_CONST(-0.2027872950) }, { FRAC_CONST(-0.1409012377), FRAC_CONST(-0.9900236726) }, { FRAC_CONST(0.8837656379), FRAC_CONST(-0.4679298103) }, { FRAC_CONST(0.7396311164), FRAC_CONST(0.6730124950) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9988898635), FRAC_CONST(-0.0471064523) }, { FRAC_CONST(-0.2940403223), FRAC_CONST(-0.9557930231) }, { FRAC_CONST(0.7996846437), FRAC_CONST(-0.6004202366) }, { FRAC_CONST(0.8358073831), FRAC_CONST(0.5490227938) }, { FRAC_CONST(-0.2334453613), FRAC_CONST(0.9723699093) }, { FRAC_CONST(-0.9939609766), FRAC_CONST(0.1097343117) }, { FRAC_CONST(-0.4399391711), FRAC_CONST(-0.8980275989) }, { FRAC_CONST(0.6959127784), FRAC_CONST(-0.7181262970) }, { FRAC_CONST(0.9114032984), FRAC_CONST(0.4115143716) }, { FRAC_CONST(-0.0784590989), FRAC_CONST(0.9969173074) }, { FRAC_CONST(-0.9645574093), FRAC_CONST(0.2638730407) }, { FRAC_CONST(-0.5750052333), FRAC_CONST(-0.8181497455) }, { FRAC_CONST(0.5750052333), FRAC_CONST(-0.8181497455) }, { FRAC_CONST(0.9645574093), FRAC_CONST(0.2638730407) }, { FRAC_CONST(0.0784590989), FRAC_CONST(0.9969173074) }, { FRAC_CONST(-0.9114032984), FRAC_CONST(0.4115143716) }, { FRAC_CONST(-0.6959127784), FRAC_CONST(-0.7181262970) }, { FRAC_CONST(0.4399391711), FRAC_CONST(-0.8980275989) }, { FRAC_CONST(0.9939609766), FRAC_CONST(0.1097343117) }, { FRAC_CONST(0.2334453613), FRAC_CONST(0.9723699093) }, { FRAC_CONST(-0.8358073831), FRAC_CONST(0.5490227938) }, { FRAC_CONST(-0.7996846437), FRAC_CONST(-0.6004202366) }, { FRAC_CONST(0.2940403223), FRAC_CONST(-0.9557930231) }, { FRAC_CONST(0.9988898635), FRAC_CONST(-0.0471064523) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7396311164), FRAC_CONST(0.6730124950) } }; /* RE(Phi_Fract_SubQmf20[j]) = (float)cos(M_PI*f_center_20[j]*0.39); */ /* IM(Phi_Fract_SubQmf20[j]) = (float)sin(M_PI*f_center_20[j]*0.39); */ static const complex_t Phi_Fract_SubQmf20[] = { { FRAC_CONST(0.9882950187), FRAC_CONST(0.1525546312) }, { FRAC_CONST(0.8962930441), FRAC_CONST(0.4434623122) }, { FRAC_CONST(0.7208535671), FRAC_CONST(0.6930873394) }, { FRAC_CONST(0.4783087075), FRAC_CONST(0.8781917691) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(0.8962930441), FRAC_CONST(-0.4434623122) }, { FRAC_CONST(0.9882950187), FRAC_CONST(-0.1525546312) }, { FRAC_CONST(-0.5424415469), FRAC_CONST(0.8400935531) }, { FRAC_CONST(0.0392598175), FRAC_CONST(0.9992290139) }, { FRAC_CONST(-0.9268565774), FRAC_CONST(0.3754155636) }, { FRAC_CONST(-0.9741733670), FRAC_CONST(-0.2258012742) } }; /* RE(Phi_Fract_SubQmf34[j]) = (float)cos(M_PI*f_center_34[j]*0.39); */ /* IM(Phi_Fract_SubQmf34[j]) = (float)sin(M_PI*f_center_34[j]*0.39); */ static const complex_t Phi_Fract_SubQmf34[] = { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, { FRAC_CONST(0.3387379348), FRAC_CONST(0.9408807755) }, { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, { FRAC_CONST(-0.7705132365), FRAC_CONST(0.6374239922) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) }, { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, { FRAC_CONST(0.1873813123), FRAC_CONST(-0.9822872281) }, { FRAC_CONST(0.9876883626), FRAC_CONST(-0.1564344615) }, { FRAC_CONST(-0.8607420325), FRAC_CONST(-0.5090414286) } }; /* RE(Q_Fract_allpass_Qmf[j][i]) = (float)cos(M_PI*(j+0.5)*(frac_delay_q[i])); */ /* IM(Q_Fract_allpass_Qmf[j][i]) = (float)sin(M_PI*(j+0.5)*(frac_delay_q[i])); */ static const complex_t Q_Fract_allpass_Qmf[][3] = { { { FRAC_CONST(0.7804303765), FRAC_CONST(0.6252426505) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.8550928831), FRAC_CONST(0.5184748173) } }, { { FRAC_CONST(-0.4399392009), FRAC_CONST(0.8980275393) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.0643581524), FRAC_CONST(0.9979268909) } }, { { FRAC_CONST(-0.9723699093), FRAC_CONST(-0.2334454209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.9146071672), FRAC_CONST(0.4043435752) } }, { { FRAC_CONST(0.0157073960), FRAC_CONST(-0.9998766184) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7814115286), FRAC_CONST(-0.6240159869) } }, { { FRAC_CONST(0.9792228341), FRAC_CONST(-0.2027871907) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.1920081824), FRAC_CONST(-0.9813933372) } }, { { FRAC_CONST(0.4115142524), FRAC_CONST(0.9114032984) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9589683414), FRAC_CONST(-0.2835132182) } }, { { FRAC_CONST(-0.7996847630), FRAC_CONST(0.6004201174) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.6947838664), FRAC_CONST(0.7192186117) } }, { { FRAC_CONST(-0.7604058385), FRAC_CONST(-0.6494481564) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3164770305), FRAC_CONST(0.9486001730) } }, { { FRAC_CONST(0.4679299891), FRAC_CONST(-0.8837655187) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9874414206), FRAC_CONST(0.1579856575) } }, { { FRAC_CONST(0.9645573497), FRAC_CONST(0.2638732493) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.5966450572), FRAC_CONST(-0.8025052547) } }, { { FRAC_CONST(-0.0471066870), FRAC_CONST(0.9988898635) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.4357025325), FRAC_CONST(-0.9000906944) } }, { { FRAC_CONST(-0.9851093888), FRAC_CONST(0.1719288528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9995546937), FRAC_CONST(-0.0298405960) } }, { { FRAC_CONST(-0.3826831877), FRAC_CONST(-0.9238796234) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.4886211455), FRAC_CONST(0.8724960685) } }, { { FRAC_CONST(0.8181498647), FRAC_CONST(-0.5750049949) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.5477093458), FRAC_CONST(0.8366686702) } }, { { FRAC_CONST(0.7396308780), FRAC_CONST(0.6730127335) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9951074123), FRAC_CONST(-0.0987988561) } }, { { FRAC_CONST(-0.4954589605), FRAC_CONST(0.8686313629) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.3725017905), FRAC_CONST(-0.9280315042) } }, { { FRAC_CONST(-0.9557929039), FRAC_CONST(-0.2940406799) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.6506417990), FRAC_CONST(-0.7593847513) } }, { { FRAC_CONST(0.0784594864), FRAC_CONST(-0.9969173074) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9741733670), FRAC_CONST(0.2258014232) } }, { { FRAC_CONST(0.9900237322), FRAC_CONST(-0.1409008205) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.2502108514), FRAC_CONST(0.9681913853) } }, { { FRAC_CONST(0.3534744382), FRAC_CONST(0.9354441762) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.7427945137), FRAC_CONST(0.6695194840) } }, { { FRAC_CONST(-0.8358076215), FRAC_CONST(0.5490224361) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9370992780), FRAC_CONST(-0.3490629196) } }, { { FRAC_CONST(-0.7181259394), FRAC_CONST(-0.6959131360) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.1237744763), FRAC_CONST(-0.9923103452) } }, { { FRAC_CONST(0.5224990249), FRAC_CONST(-0.8526399136) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.8226406574), FRAC_CONST(-0.5685616732) } }, { { FRAC_CONST(0.9460852146), FRAC_CONST(0.3239179254) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.8844994903), FRAC_CONST(0.4665412009) } }, { { FRAC_CONST(-0.1097348556), FRAC_CONST(0.9939609170) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.0047125919), FRAC_CONST(0.9999889135) } }, { { FRAC_CONST(-0.9939610362), FRAC_CONST(0.1097337380) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8888573647), FRAC_CONST(0.4581840038) } }, { { FRAC_CONST(-0.3239168525), FRAC_CONST(-0.9460855722) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8172453642), FRAC_CONST(-0.5762898922) } }, { { FRAC_CONST(0.8526405096), FRAC_CONST(-0.5224980116) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.1331215799), FRAC_CONST(-0.9910997152) } }, { { FRAC_CONST(0.6959123611), FRAC_CONST(0.7181267142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9403476119), FRAC_CONST(-0.3402152061) } }, { { FRAC_CONST(-0.5490233898), FRAC_CONST(0.8358070254) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7364512086), FRAC_CONST(0.6764906645) } }, { { FRAC_CONST(-0.9354437590), FRAC_CONST(-0.3534754813) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2593250275), FRAC_CONST(0.9657900929) } }, { { FRAC_CONST(0.1409019381), FRAC_CONST(-0.9900235534) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9762582779), FRAC_CONST(0.2166097313) } }, { { FRAC_CONST(0.9969173670), FRAC_CONST(-0.0784583688) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.6434556246), FRAC_CONST(-0.7654833794) } }, { { FRAC_CONST(0.2940396070), FRAC_CONST(0.9557932615) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3812320232), FRAC_CONST(-0.9244794250) } }, { { FRAC_CONST(-0.8686318994), FRAC_CONST(0.4954580069) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9959943891), FRAC_CONST(-0.0894154981) } }, { { FRAC_CONST(-0.6730118990), FRAC_CONST(-0.7396316528) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.5397993922), FRAC_CONST(0.8417937160) } }, { { FRAC_CONST(0.5750059485), FRAC_CONST(-0.8181492686) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.4968227744), FRAC_CONST(0.8678520322) } }, { { FRAC_CONST(0.9238792062), FRAC_CONST(0.3826842010) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9992290139), FRAC_CONST(-0.0392601527) } }, { { FRAC_CONST(-0.1719299555), FRAC_CONST(0.9851091504) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4271997511), FRAC_CONST(-0.9041572809) } }, { { FRAC_CONST(-0.9988899231), FRAC_CONST(0.0471055657) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.6041822433), FRAC_CONST(-0.7968461514) } }, { { FRAC_CONST(-0.2638721764), FRAC_CONST(-0.9645576477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9859085083), FRAC_CONST(0.1672853529) } }, { { FRAC_CONST(0.8837660551), FRAC_CONST(-0.4679289758) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.3075223565), FRAC_CONST(0.9515408874) } }, { { FRAC_CONST(0.6494473219), FRAC_CONST(0.7604066133) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.7015317082), FRAC_CONST(0.7126382589) } }, { { FRAC_CONST(-0.6004210114), FRAC_CONST(0.7996840477) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.9562535882), FRAC_CONST(-0.2925389707) } }, { { FRAC_CONST(-0.9114028811), FRAC_CONST(-0.4115152657) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.1827499419), FRAC_CONST(-0.9831594229) } }, { { FRAC_CONST(0.2027882934), FRAC_CONST(-0.9792225957) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.7872582674), FRAC_CONST(-0.6166234016) } }, { { FRAC_CONST(0.9998766780), FRAC_CONST(-0.0157062728) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.9107555747), FRAC_CONST(0.4129458666) } }, { { FRAC_CONST(0.2334443331), FRAC_CONST(0.9723701477) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.0549497530), FRAC_CONST(0.9984891415) } }, { { FRAC_CONST(-0.8980280757), FRAC_CONST(0.4399381876) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.8599416018), FRAC_CONST(0.5103924870) } }, { { FRAC_CONST(-0.6252418160), FRAC_CONST(-0.7804310918) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(-0.8501682281), FRAC_CONST(-0.5265110731) } }, { { FRAC_CONST(0.6252435446), FRAC_CONST(-0.7804297209) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.0737608299), FRAC_CONST(-0.9972759485) } }, { { FRAC_CONST(0.8980270624), FRAC_CONST(0.4399402142) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.9183775187), FRAC_CONST(-0.3957053721) } }, { { FRAC_CONST(-0.2334465086), FRAC_CONST(0.9723696709) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.7754954696), FRAC_CONST(0.6313531399) } }, { { FRAC_CONST(-0.9998766184), FRAC_CONST(-0.0157085191) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.2012493610), FRAC_CONST(0.9795400500) } }, { { FRAC_CONST(-0.2027861029), FRAC_CONST(-0.9792230725) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.9615978599), FRAC_CONST(0.2744622827) } }, { { FRAC_CONST(0.9114037752), FRAC_CONST(-0.4115132093) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.6879743338), FRAC_CONST(-0.7257350087) } }, { { FRAC_CONST(0.6004192233), FRAC_CONST(0.7996854186) }, { FRAC_CONST(0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(0.3254036009), FRAC_CONST(-0.9455752373) } }, { { FRAC_CONST(-0.6494490504), FRAC_CONST(0.7604051232) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.9888865948), FRAC_CONST(-0.1486719251) } }, { { FRAC_CONST(-0.8837650418), FRAC_CONST(-0.4679309726) }, { FRAC_CONST(0.9238795042), FRAC_CONST(-0.3826834261) }, { FRAC_CONST(0.5890548825), FRAC_CONST(0.8080930114) } }, { { FRAC_CONST(0.2638743520), FRAC_CONST(-0.9645570517) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(0.9238795042) }, { FRAC_CONST(-0.4441666007), FRAC_CONST(0.8959442377) } }, { { FRAC_CONST(0.9988898039), FRAC_CONST(0.0471078083) }, { FRAC_CONST(-0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(-0.9997915030), FRAC_CONST(0.0204183888) } }, { { FRAC_CONST(0.1719277352), FRAC_CONST(0.9851095676) }, { FRAC_CONST(0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(-0.4803760946), FRAC_CONST(-0.8770626187) } }, { { FRAC_CONST(-0.9238800406), FRAC_CONST(0.3826821446) }, { FRAC_CONST(-0.9238795042), FRAC_CONST(0.3826834261) }, { FRAC_CONST(0.5555707216), FRAC_CONST(-0.8314692974) } }, { { FRAC_CONST(-0.5750041008), FRAC_CONST(-0.8181505203) }, { FRAC_CONST(0.3826834261), FRAC_CONST(-0.9238795042) }, { FRAC_CONST(0.9941320419), FRAC_CONST(0.1081734300) } } }; /* RE(Q_Fract_allpass_SubQmf20[j][i]) = (float)cos(M_PI*f_center_20[j]*frac_delay_q[i]); */ /* IM(Q_Fract_allpass_SubQmf20[j][i]) = (float)sin(M_PI*f_center_20[j]*frac_delay_q[i]); */ static const complex_t Q_Fract_allpass_SubQmf20[][3] = { { { FRAC_CONST(0.9857769012), FRAC_CONST(0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(0.1358452588) } }, { { FRAC_CONST(0.8744080663), FRAC_CONST(0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(0.3975082636) } }, { { FRAC_CONST(0.6642524004), FRAC_CONST(0.7475083470) }, { FRAC_CONST(0.0980171412), FRAC_CONST(0.9951847196) }, { FRAC_CONST(0.7767338753), FRAC_CONST(0.6298289299) } }, { { FRAC_CONST(0.3790524006), FRAC_CONST(0.9253752232) }, { FRAC_CONST(-0.4713967443), FRAC_CONST(0.8819212914) }, { FRAC_CONST(0.5785340071), FRAC_CONST(0.8156582713) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(0.8744080663), FRAC_CONST(-0.4851911962) }, { FRAC_CONST(0.6343932748), FRAC_CONST(-0.7730104327) }, { FRAC_CONST(0.9175986052), FRAC_CONST(-0.3975082636) } }, { { FRAC_CONST(0.9857769012), FRAC_CONST(-0.1680592746) }, { FRAC_CONST(0.9569403529), FRAC_CONST(-0.2902846634) }, { FRAC_CONST(0.9907300472), FRAC_CONST(-0.1358452588) } }, { { FRAC_CONST(-0.7126385570), FRAC_CONST(0.7015314102) }, { FRAC_CONST(-0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.3305967748), FRAC_CONST(0.9437720776) } }, { { FRAC_CONST(-0.1175374240), FRAC_CONST(0.9930684566) }, { FRAC_CONST(-0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(0.2066311091), FRAC_CONST(0.9784189463) } }, { { FRAC_CONST(-0.9947921634), FRAC_CONST(0.1019244045) }, { FRAC_CONST(0.5555702448), FRAC_CONST(-0.8314695954) }, { FRAC_CONST(-0.7720130086), FRAC_CONST(0.6356067061) } }, { { FRAC_CONST(-0.8400934935), FRAC_CONST(-0.5424416065) }, { FRAC_CONST(0.9807852507), FRAC_CONST(0.1950903237) }, { FRAC_CONST(-0.9896889329), FRAC_CONST(0.1432335079) } } }; /* RE(Q_Fract_allpass_SubQmf34[j][i]) = (float)cos(M_PI*f_center_34[j]*frac_delay_q[i]); */ /* IM(Q_Fract_allpass_SubQmf34[j][i]) = (float)sin(M_PI*f_center_34[j]*frac_delay_q[i]); */ static const complex_t Q_Fract_allpass_SubQmf34[][3] = { { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(1.0000000000), FRAC_CONST(0.0000000000) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, { { FRAC_CONST(0.2181432247), FRAC_CONST(0.9759167433) }, { FRAC_CONST(-0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(0.4623677433), FRAC_CONST(0.8866882324) } }, { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, { { FRAC_CONST(-0.9048270583), FRAC_CONST(0.4257792532) }, { FRAC_CONST(-0.0000000000), FRAC_CONST(-1.0000000000) }, { FRAC_CONST(-0.5724321604), FRAC_CONST(0.8199520707) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } }, { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, { { FRAC_CONST(0.6374240518), FRAC_CONST(-0.7705131769) }, { FRAC_CONST(-1.0000000000), FRAC_CONST(0.0000000000) }, { FRAC_CONST(-0.3446428776), FRAC_CONST(-0.9387338758) } }, { { FRAC_CONST(0.8910064697), FRAC_CONST(0.4539906085) }, { FRAC_CONST(0.7071067691), FRAC_CONST(-0.7071067691) }, { FRAC_CONST(0.6730125546), FRAC_CONST(-0.7396310568) } }, { { FRAC_CONST(-0.6129069924), FRAC_CONST(-0.7901550531) }, { FRAC_CONST(0.7071067691), FRAC_CONST(0.7071067691) }, { FRAC_CONST(-0.9917160273), FRAC_CONST(-0.1284494549) } } }; #if 0 static float quant_rho[8] = { FRAC_CONST(1.0), FRAC_CONST(0.937), FRAC_CONST(0.84118), FRAC_CONST(0.60092), FRAC_CONST(0.36764), FRAC_CONST(0.0), FRAC_CONST(-0.589), FRAC_CONST(-1.0) }; static const uint8_t quant_iid_normal[7] = { 2, 4, 7, 10, 14, 18, 25 }; static const uint8_t quant_iid_fine[15] = { 2, 4, 6, 8, 10, 13, 16, 19, 22, 25, 30, 35, 40, 45, 50 }; #endif static const real_t cos_alphas[] = { COEF_CONST(1.0000000000), COEF_CONST(0.9841239700), COEF_CONST(0.9594738210), COEF_CONST(0.8946843079), COEF_CONST(0.8269340931), COEF_CONST(0.7071067812), COEF_CONST(0.4533210856), COEF_CONST(0.0000000000) }; static const real_t sin_alphas[] = { COEF_CONST(0.0000000000), COEF_CONST(0.1774824264), COEF_CONST(0.2817977763), COEF_CONST(0.4466989918), COEF_CONST(0.5622988580), COEF_CONST(0.7071067812), COEF_CONST(0.8913472911), COEF_CONST(1.0000000000) }; static const real_t cos_betas_normal[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9959398908), COEF_CONST(0.9896038018), COEF_CONST(0.9727589768), COEF_CONST(0.9548355329), COEF_CONST(0.9223070404), COEF_CONST(0.8494349490), COEF_CONST(0.7013005535) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9902068095), COEF_CONST(0.9749613872), COEF_CONST(0.9346538534), COEF_CONST(0.8921231300), COEF_CONST(0.8158851259), COEF_CONST(0.6495964302), COEF_CONST(0.3313370772) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9880510933), COEF_CONST(0.9694670261), COEF_CONST(0.9204347876), COEF_CONST(0.8688622825), COEF_CONST(0.7768516704), COEF_CONST(0.5782161800), COEF_CONST(0.2069970356) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) } }; static const real_t sin_betas_normal[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0900207420), COEF_CONST(-0.1438204281), COEF_CONST(-0.2318188366), COEF_CONST(-0.2971348264), COEF_CONST(-0.3864579191), COEF_CONST(-0.5276933461), COEF_CONST(-0.7128657193) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1396082894), COEF_CONST(-0.2223742196), COEF_CONST(-0.3555589603), COEF_CONST(-0.4517923427), COEF_CONST(-0.5782140273), COEF_CONST(-0.7602792104), COEF_CONST(-0.9435124489) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1541266914), COEF_CONST(-0.2452217065), COEF_CONST(-0.3908961522), COEF_CONST(-0.4950538699), COEF_CONST(-0.6296836366), COEF_CONST(-0.8158836002), COEF_CONST(-0.9783415698) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) } }; static const real_t cos_betas_fine[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000), COEF_CONST(1.0000000000) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9995871699), COEF_CONST(0.9989419133), COEF_CONST(0.9972204583), COEF_CONST(0.9953790839), COEF_CONST(0.9920112747), COEF_CONST(0.9843408180), COEF_CONST(0.9681727381) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9984497744), COEF_CONST(0.9960279377), COEF_CONST(0.9895738413), COEF_CONST(0.9826814632), COEF_CONST(0.9701058164), COEF_CONST(0.9416098832), COEF_CONST(0.8822105900) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9968361371), COEF_CONST(0.9918968104), COEF_CONST(0.9787540479), COEF_CONST(0.9647515190), COEF_CONST(0.9392903010), COEF_CONST(0.8820167114), COEF_CONST(0.7645325390) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9950262915), COEF_CONST(0.9872675041), COEF_CONST(0.9666584578), COEF_CONST(0.9447588606), COEF_CONST(0.9050918405), COEF_CONST(0.8165997379), COEF_CONST(0.6383824796) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9932417400), COEF_CONST(0.9827071856), COEF_CONST(0.9547730996), COEF_CONST(0.9251668930), COEF_CONST(0.8717461589), COEF_CONST(0.7535520592), COEF_CONST(0.5198827312) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9908827998), COEF_CONST(0.9766855904), COEF_CONST(0.9391249214), COEF_CONST(0.8994531782), COEF_CONST(0.8282352693), COEF_CONST(0.6723983174), COEF_CONST(0.3719473225) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9890240165), COEF_CONST(0.9719459866), COEF_CONST(0.9268448110), COEF_CONST(0.8793388536), COEF_CONST(0.7944023271), COEF_CONST(0.6101812098), COEF_CONST(0.2621501145) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9876350461), COEF_CONST(0.9684073447), COEF_CONST(0.9176973944), COEF_CONST(0.8643930070), COEF_CONST(0.7693796058), COEF_CONST(0.5646720713), COEF_CONST(0.1838899556) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9866247085), COEF_CONST(0.9658349704), COEF_CONST(0.9110590761), COEF_CONST(0.8535668048), COEF_CONST(0.7513165426), COEF_CONST(0.5320914819), COEF_CONST(0.1289530943) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9858996945), COEF_CONST(0.9639898866), COEF_CONST(0.9063034786), COEF_CONST(0.8458214608), COEF_CONST(0.7384262300), COEF_CONST(0.5089811277), COEF_CONST(0.0905465944) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9851245614), COEF_CONST(0.9620180268), COEF_CONST(0.9012265590), COEF_CONST(0.8375623272), COEF_CONST(0.7247108045), COEF_CONST(0.4845204297), COEF_CONST(0.0504115003) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9846869856), COEF_CONST(0.9609052357), COEF_CONST(0.8983639533), COEF_CONST(0.8329098386), COEF_CONST(0.7169983441), COEF_CONST(0.4708245354), COEF_CONST(0.0281732509) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9844406325), COEF_CONST(0.9602788522), COEF_CONST(0.8967533934), COEF_CONST(0.8302936455), COEF_CONST(0.7126658102), COEF_CONST(0.4631492839), COEF_CONST(0.0157851140) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9843020502), COEF_CONST(0.9599265269), COEF_CONST(0.8958477331), COEF_CONST(0.8288229094), COEF_CONST(0.7102315840), COEF_CONST(0.4588429315), COEF_CONST(0.0088578059) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9842241136), COEF_CONST(0.9597283916), COEF_CONST(0.8953385094), COEF_CONST(0.8279961409), COEF_CONST(0.7088635748), COEF_CONST(0.4564246834), COEF_CONST(0.0049751355) } }; static const real_t sin_betas_fine[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000), COEF_CONST(0.0000000000) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0287313368), COEF_CONST(-0.0459897147), COEF_CONST(-0.0745074328), COEF_CONST(-0.0960233266), COEF_CONST(-0.1261492408), COEF_CONST(-0.1762757894), COEF_CONST(-0.2502829383) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0556601118), COEF_CONST(-0.0890412670), COEF_CONST(-0.1440264301), COEF_CONST(-0.1853028382), COEF_CONST(-0.2426823129), COEF_CONST(-0.3367058477), COEF_CONST(-0.4708550466) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0794840594), COEF_CONST(-0.1270461238), COEF_CONST(-0.2050378347), COEF_CONST(-0.2631625097), COEF_CONST(-0.3431234916), COEF_CONST(-0.4712181245), COEF_CONST(-0.6445851354) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.0996126459), COEF_CONST(-0.1590687758), COEF_CONST(-0.2560691819), COEF_CONST(-0.3277662204), COEF_CONST(-0.4252161335), COEF_CONST(-0.5772043556), COEF_CONST(-0.7697193058) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1160639735), COEF_CONST(-0.1851663774), COEF_CONST(-0.2973353800), COEF_CONST(-0.3795605619), COEF_CONST(-0.4899577884), COEF_CONST(-0.6573882369), COEF_CONST(-0.8542376401) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1347266752), COEF_CONST(-0.2146747714), COEF_CONST(-0.3435758752), COEF_CONST(-0.4370171396), COEF_CONST(-0.5603805303), COEF_CONST(-0.7401895046), COEF_CONST(-0.9282538388) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1477548470), COEF_CONST(-0.2352041647), COEF_CONST(-0.3754446647), COEF_CONST(-0.4761965776), COEF_CONST(-0.6073919186), COEF_CONST(-0.7922618830), COEF_CONST(-0.9650271071) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1567705832), COEF_CONST(-0.2493736450), COEF_CONST(-0.3972801182), COEF_CONST(-0.5028167951), COEF_CONST(-0.6387918458), COEF_CONST(-0.8253153651), COEF_CONST(-0.9829468369) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1630082348), COEF_CONST(-0.2591578860), COEF_CONST(-0.4122758299), COEF_CONST(-0.5209834064), COEF_CONST(-0.6599420072), COEF_CONST(-0.8466868694), COEF_CONST(-0.9916506943) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1673373610), COEF_CONST(-0.2659389001), COEF_CONST(-0.4226275012), COEF_CONST(-0.5334660781), COEF_CONST(-0.6743342664), COEF_CONST(-0.8607776784), COEF_CONST(-0.9958922202) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1718417832), COEF_CONST(-0.2729859267), COEF_CONST(-0.4333482310), COEF_CONST(-0.5463417868), COEF_CONST(-0.6890531546), COEF_CONST(-0.8747799456), COEF_CONST(-0.9987285320) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1743316967), COEF_CONST(-0.2768774604), COEF_CONST(-0.4392518725), COEF_CONST(-0.5534087104), COEF_CONST(-0.6970748701), COEF_CONST(-0.8822268738), COEF_CONST(-0.9996030552) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1757175038), COEF_CONST(-0.2790421580), COEF_CONST(-0.4425306221), COEF_CONST(-0.5573261722), COEF_CONST(-0.7015037013), COEF_CONST(-0.8862802834), COEF_CONST(-0.9998754073) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1764921355), COEF_CONST(-0.2802517850), COEF_CONST(-0.4443611583), COEF_CONST(-0.5595110229), COEF_CONST(-0.7039681080), COEF_CONST(-0.8885173967), COEF_CONST(-0.9999607689) }, { COEF_CONST(0.0000000000), COEF_CONST(-0.1769262394), COEF_CONST(-0.2809295540), COEF_CONST(-0.4453862969), COEF_CONST(-0.5607337966), COEF_CONST(-0.7053456119), COEF_CONST(-0.8897620516), COEF_CONST(-0.9999876239) } }; static const real_t sincos_alphas_B_normal[][8] = { { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, { COEF_CONST(0.1249065138), COEF_CONST(0.1173697697), COEF_CONST(0.1057888284), COEF_CONST(0.0761985131), COEF_CONST(0.0468732723), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103), COEF_CONST(0.0063956103) }, { COEF_CONST(0.1956693050), COEF_CONST(0.1846090179), COEF_CONST(0.1673645109), COEF_CONST(0.1220621836), COEF_CONST(0.0757362479), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630), COEF_CONST(0.0103882630) }, { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, { COEF_CONST(0.4078449476), COEF_CONST(0.3929852420), COEF_CONST(0.3680589270), COEF_CONST(0.2911029124), COEF_CONST(0.1934512363), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716), COEF_CONST(0.0278686716) }, { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, { COEF_CONST(0.9130511848), COEF_CONST(0.9195447612), COEF_CONST(0.9298024282), COEF_CONST(0.9566917233), COEF_CONST(0.9811098801), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928), COEF_CONST(0.9996115928) }, { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, { COEF_CONST(0.9806699215), COEF_CONST(0.9828120260), COEF_CONST(0.9858950861), COEF_CONST(0.9925224431), COEF_CONST(0.9971278825), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406), COEF_CONST(0.9999460406) }, { COEF_CONST(0.9921685024), COEF_CONST(0.9930882705), COEF_CONST(0.9943886135), COEF_CONST(0.9970926648), COEF_CONST(0.9989008403), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479), COEF_CONST(0.9999795479) }, { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) } }; static const real_t sincos_alphas_B_fine[][8] = { { COEF_CONST(0.0031622158), COEF_CONST(0.0029630181), COEF_CONST(0.0026599892), COEF_CONST(0.0019002704), COEF_CONST(0.0011626042), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278), COEF_CONST(0.0001580278) }, { COEF_CONST(0.0056232673), COEF_CONST(0.0052689825), COEF_CONST(0.0047302825), COEF_CONST(0.0033791756), COEF_CONST(0.0020674015), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710), COEF_CONST(0.0002811710) }, { COEF_CONST(0.0099994225), COEF_CONST(0.0093696693), COEF_CONST(0.0084117414), COEF_CONST(0.0060093796), COEF_CONST(0.0036766009), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392), COEF_CONST(0.0005000392) }, { COEF_CONST(0.0177799194), COEF_CONST(0.0166607102), COEF_CONST(0.0149581377), COEF_CONST(0.0106875809), COEF_CONST(0.0065392545), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767), COEF_CONST(0.0008893767) }, { COEF_CONST(0.0316069684), COEF_CONST(0.0296211579), COEF_CONST(0.0265987295), COEF_CONST(0.0190113813), COEF_CONST(0.0116349973), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974), COEF_CONST(0.0015826974) }, { COEF_CONST(0.0561454100), COEF_CONST(0.0526385859), COEF_CONST(0.0472937334), COEF_CONST(0.0338410641), COEF_CONST(0.0207261065), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635), COEF_CONST(0.0028205635) }, { COEF_CONST(0.0791834041), COEF_CONST(0.0742798103), COEF_CONST(0.0667907269), COEF_CONST(0.0478705292), COEF_CONST(0.0293500747), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755), COEF_CONST(0.0039966755) }, { COEF_CONST(0.1115021177), COEF_CONST(0.1047141985), COEF_CONST(0.0943053154), COEF_CONST(0.0678120561), COEF_CONST(0.0416669150), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213), COEF_CONST(0.0056813213) }, { COEF_CONST(0.1565355066), COEF_CONST(0.1473258371), COEF_CONST(0.1330924027), COEF_CONST(0.0963282233), COEF_CONST(0.0594509113), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946), COEF_CONST(0.0081277946) }, { COEF_CONST(0.2184643682), COEF_CONST(0.2064579524), COEF_CONST(0.1876265439), COEF_CONST(0.1375744167), COEF_CONST(0.0856896681), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338), COEF_CONST(0.0117817338) }, { COEF_CONST(0.3015113269), COEF_CONST(0.2870525790), COEF_CONST(0.2637738799), COEF_CONST(0.1984573949), COEF_CONST(0.1260749909), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126), COEF_CONST(0.0175600126) }, { COEF_CONST(0.3698741335), COEF_CONST(0.3547727297), COEF_CONST(0.3298252076), COEF_CONST(0.2556265829), COEF_CONST(0.1665990017), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541), COEF_CONST(0.0236344541) }, { COEF_CONST(0.4480623975), COEF_CONST(0.4339410024), COEF_CONST(0.4098613774), COEF_CONST(0.3322709108), COEF_CONST(0.2266784729), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131), COEF_CONST(0.0334094131) }, { COEF_CONST(0.5336171261), COEF_CONST(0.5226637762), COEF_CONST(0.5033652606), COEF_CONST(0.4349162672), COEF_CONST(0.3224682122), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036), COEF_CONST(0.0521999036) }, { COEF_CONST(0.6219832023), COEF_CONST(0.6161847276), COEF_CONST(0.6057251063), COEF_CONST(0.5654342668), COEF_CONST(0.4826149915), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758), COEF_CONST(0.1058044758) }, { COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657), COEF_CONST(0.7071067657) }, { COEF_CONST(0.7830305572), COEF_CONST(0.7876016373), COEF_CONST(0.7956739618), COEF_CONST(0.8247933372), COEF_CONST(0.8758325942), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542), COEF_CONST(0.9943869542) }, { COEF_CONST(0.8457261833), COEF_CONST(0.8525388778), COEF_CONST(0.8640737401), COEF_CONST(0.9004708933), COEF_CONST(0.9465802987), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532), COEF_CONST(0.9986366532) }, { COEF_CONST(0.8940022267), COEF_CONST(0.9009412572), COEF_CONST(0.9121477564), COEF_CONST(0.9431839770), COEF_CONST(0.9739696219), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480), COEF_CONST(0.9994417480) }, { COEF_CONST(0.9290818561), COEF_CONST(0.9349525662), COEF_CONST(0.9440420138), COEF_CONST(0.9667755833), COEF_CONST(0.9860247275), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664), COEF_CONST(0.9997206664) }, { COEF_CONST(0.9534625907), COEF_CONST(0.9579148236), COEF_CONST(0.9645845234), COEF_CONST(0.9801095128), COEF_CONST(0.9920207064), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099), COEF_CONST(0.9998458099) }, { COEF_CONST(0.9758449068), COEF_CONST(0.9784554646), COEF_CONST(0.9822404252), COEF_CONST(0.9904914275), COEF_CONST(0.9963218730), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926), COEF_CONST(0.9999305926) }, { COEF_CONST(0.9876723320), COEF_CONST(0.9890880155), COEF_CONST(0.9911036356), COEF_CONST(0.9953496173), COEF_CONST(0.9982312259), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685), COEF_CONST(0.9999669685) }, { COEF_CONST(0.9937641889), COEF_CONST(0.9945023501), COEF_CONST(0.9955433130), COEF_CONST(0.9976981117), COEF_CONST(0.9991315558), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610), COEF_CONST(0.9999838610) }, { COEF_CONST(0.9968600642), COEF_CONST(0.9972374385), COEF_CONST(0.9977670024), COEF_CONST(0.9988535464), COEF_CONST(0.9995691924), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129), COEF_CONST(0.9999920129) }, { COEF_CONST(0.9984226014), COEF_CONST(0.9986136287), COEF_CONST(0.9988810254), COEF_CONST(0.9994272242), COEF_CONST(0.9997851906), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221), COEF_CONST(0.9999960221) }, { COEF_CONST(0.9995003746), COEF_CONST(0.9995611974), COEF_CONST(0.9996461891), COEF_CONST(0.9998192657), COEF_CONST(0.9999323103), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475), COEF_CONST(0.9999987475) }, { COEF_CONST(0.9998419236), COEF_CONST(0.9998611991), COEF_CONST(0.9998881193), COEF_CONST(0.9999428861), COEF_CONST(0.9999786185), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045), COEF_CONST(0.9999996045) }, { COEF_CONST(0.9999500038), COEF_CONST(0.9999561034), COEF_CONST(0.9999646206), COEF_CONST(0.9999819429), COEF_CONST(0.9999932409), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750), COEF_CONST(0.9999998750) }, { COEF_CONST(0.9999841890), COEF_CONST(0.9999861183), COEF_CONST(0.9999888121), COEF_CONST(0.9999942902), COEF_CONST(0.9999978628), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605), COEF_CONST(0.9999999605) }, { COEF_CONST(0.9999950000), COEF_CONST(0.9999956102), COEF_CONST(0.9999964621), COEF_CONST(0.9999981945), COEF_CONST(0.9999993242), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875), COEF_CONST(0.9999999875) } }; static const real_t cos_gammas_normal[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9913533967), COEF_CONST(0.9786000177), COEF_CONST(0.9496063381), COEF_CONST(0.9277157252), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077), COEF_CONST(0.9133354077) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9977406278), COEF_CONST(0.9945423840), COEF_CONST(0.9878736667), COEF_CONST(0.9833980494), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440), COEF_CONST(0.9807207440) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9990607067), COEF_CONST(0.9977417734), COEF_CONST(0.9950323970), COEF_CONST(0.9932453273), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740), COEF_CONST(0.9921884740) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) } }; static const real_t cos_gammas_fine[][8] = { { COEF_CONST(1.0000000000), COEF_CONST(0.9841239707), COEF_CONST(0.9594738226), COEF_CONST(0.8946843024), COEF_CONST(0.8269341029), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486), COEF_CONST(0.7245688486) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9849690570), COEF_CONST(0.9617776789), COEF_CONST(0.9020941550), COEF_CONST(0.8436830391), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804), COEF_CONST(0.7846832804) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9871656089), COEF_CONST(0.9676774734), COEF_CONST(0.9199102884), COEF_CONST(0.8785067015), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214), COEF_CONST(0.8464232214) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9899597309), COEF_CONST(0.9750098690), COEF_CONST(0.9402333855), COEF_CONST(0.9129698759), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944), COEF_CONST(0.8943765944) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9926607607), COEF_CONST(0.9819295710), COEF_CONST(0.9580160104), COEF_CONST(0.9404993670), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472), COEF_CONST(0.9293004472) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9948924435), COEF_CONST(0.9875319180), COEF_CONST(0.9716329849), COEF_CONST(0.9604805241), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574), COEF_CONST(0.9535949574) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9972074644), COEF_CONST(0.9932414270), COEF_CONST(0.9849197629), COEF_CONST(0.9792926592), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525), COEF_CONST(0.9759092525) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9985361982), COEF_CONST(0.9964742028), COEF_CONST(0.9922136306), COEF_CONST(0.9893845420), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371), COEF_CONST(0.9877041371) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9992494366), COEF_CONST(0.9981967170), COEF_CONST(0.9960386625), COEF_CONST(0.9946185834), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239), COEF_CONST(0.9937800239) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9996194722), COEF_CONST(0.9990869422), COEF_CONST(0.9979996269), COEF_CONST(0.9972873651), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747), COEF_CONST(0.9968679747) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9998081748), COEF_CONST(0.9995400312), COEF_CONST(0.9989936459), COEF_CONST(0.9986365356), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591), COEF_CONST(0.9984265591) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999390971), COEF_CONST(0.9998540271), COEF_CONST(0.9996809352), COEF_CONST(0.9995679735), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284), COEF_CONST(0.9995016284) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999807170), COEF_CONST(0.9999537862), COEF_CONST(0.9998990191), COEF_CONST(0.9998632947), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208), COEF_CONST(0.9998423208) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999938979), COEF_CONST(0.9999853814), COEF_CONST(0.9999680568), COEF_CONST(0.9999567596), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270), COEF_CONST(0.9999501270) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999980703), COEF_CONST(0.9999953731), COEF_CONST(0.9999898968), COEF_CONST(0.9999863277), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265), COEF_CONST(0.9999842265) }, { COEF_CONST(1.0000000000), COEF_CONST(0.9999993891), COEF_CONST(0.9999985397), COEF_CONST(0.9999968037), COEF_CONST(0.9999956786), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155), COEF_CONST(0.9999950155) } }; static const real_t sin_gammas_normal[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1312190642), COEF_CONST(0.2057717310), COEF_CONST(0.3134450552), COEF_CONST(0.3732874674), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955), COEF_CONST(0.4072080955) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0671836269), COEF_CONST(0.1043333428), COEF_CONST(0.1552598422), COEF_CONST(0.1814615013), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885), COEF_CONST(0.1954144885) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0433324862), COEF_CONST(0.0671666110), COEF_CONST(0.0995516398), COEF_CONST(0.1160332699), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739), COEF_CONST(0.1247478739) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) } }; static const real_t sin_gammas_fine[][8] = { { COEF_CONST(0.0000000000), COEF_CONST(0.1774824223), COEF_CONST(0.2817977711), COEF_CONST(0.4466990028), COEF_CONST(0.5622988435), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258), COEF_CONST(0.6892024258) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1727308798), COEF_CONST(0.2738315110), COEF_CONST(0.4315392630), COEF_CONST(0.5368416242), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861), COEF_CONST(0.6198968861) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1596999079), COEF_CONST(0.2521910140), COEF_CONST(0.3921288836), COEF_CONST(0.4777300236), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795), COEF_CONST(0.5325107795) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1413496768), COEF_CONST(0.2221615526), COEF_CONST(0.3405307340), COEF_CONST(0.4080269669), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744), COEF_CONST(0.4473147744) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1209322714), COEF_CONST(0.1892467110), COEF_CONST(0.2867147079), COEF_CONST(0.3397954394), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252), COEF_CONST(0.3693246252) }, { COEF_CONST(0.0000000000), COEF_CONST(0.1009407043), COEF_CONST(0.1574189028), COEF_CONST(0.2364938532), COEF_CONST(0.2783471983), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396), COEF_CONST(0.3010924396) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0746811420), COEF_CONST(0.1160666523), COEF_CONST(0.1730117353), COEF_CONST(0.2024497161), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341), COEF_CONST(0.2181768341) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0540875291), COEF_CONST(0.0838997203), COEF_CONST(0.1245476266), COEF_CONST(0.1453211203), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972), COEF_CONST(0.1563346972) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0387371058), COEF_CONST(0.0600276114), COEF_CONST(0.0889212171), COEF_CONST(0.1036044086), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634), COEF_CONST(0.1113609634) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0275846110), COEF_CONST(0.0427233177), COEF_CONST(0.0632198125), COEF_CONST(0.0736064637), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596), COEF_CONST(0.0790837596) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0195860576), COEF_CONST(0.0303269852), COEF_CONST(0.0448519274), COEF_CONST(0.0522022017), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040), COEF_CONST(0.0560750040) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0110363955), COEF_CONST(0.0170857974), COEF_CONST(0.0252592108), COEF_CONST(0.0293916021), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054), COEF_CONST(0.0315673054) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0062101284), COEF_CONST(0.0096138203), COEF_CONST(0.0142109649), COEF_CONST(0.0165345659), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316), COEF_CONST(0.0177576316) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0034934509), COEF_CONST(0.0054071189), COEF_CONST(0.0079928316), COEF_CONST(0.0092994041), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631), COEF_CONST(0.0099871631) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0019645397), COEF_CONST(0.0030419905), COEF_CONST(0.0044951511), COEF_CONST(0.0052291853), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498), COEF_CONST(0.0056166498) }, { COEF_CONST(0.0000000000), COEF_CONST(0.0011053943), COEF_CONST(0.0017089869), COEF_CONST(0.0025283670), COEF_CONST(0.0029398552), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685), COEF_CONST(0.0031573685) } }; static const real_t sf_iid_normal[] = { COEF_CONST(1.4119827747), COEF_CONST(1.4031381607), COEF_CONST(1.3868767023), COEF_CONST(1.3483997583), COEF_CONST(1.2912493944), COEF_CONST(1.1960374117), COEF_CONST(1.1073724031), COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), COEF_CONST(0.7546485662), COEF_CONST(0.5767799020), COEF_CONST(0.4264014363), COEF_CONST(0.2767182887), COEF_CONST(0.1766446233), COEF_CONST(0.0794016272) }; static const real_t sf_iid_fine[] = { COEF_CONST(1.4142065048), COEF_CONST(1.4141912460), COEF_CONST(1.4141428471), COEF_CONST(1.4139900208), COEF_CONST(1.4135069847), COEF_CONST(1.4119827747), COEF_CONST(1.4097729921), COEF_CONST(1.4053947926), COEF_CONST(1.3967796564), COEF_CONST(1.3800530434), COEF_CONST(1.3483997583), COEF_CONST(1.3139201403), COEF_CONST(1.2643101215), COEF_CONST(1.1960374117), COEF_CONST(1.1073724031), COEF_CONST(1.0000000000), COEF_CONST(0.8796171546), COEF_CONST(0.7546485662), COEF_CONST(0.6336560845), COEF_CONST(0.5230810642), COEF_CONST(0.4264014363), COEF_CONST(0.3089554012), COEF_CONST(0.2213746458), COEF_CONST(0.1576878875), COEF_CONST(0.1119822487), COEF_CONST(0.0794016272), COEF_CONST(0.0446990170), COEF_CONST(0.0251446925), COEF_CONST(0.0141414283), COEF_CONST(0.0079525812), COEF_CONST(0.0044721137) }; #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/pulse.c000066400000000000000000000036041476153623600154500ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pulse.c,v 1.21 2007/11/01 12:33:34 menno Exp $ **/ #include "common.h" #include "structs.h" #include "syntax.h" #include "pulse.h" uint8_t pulse_decode(ic_stream *ics, int16_t *spec_data, uint16_t framelen) { uint8_t i; uint16_t k; pulse_info *pul = &(ics->pul); k = min(ics->swb_offset[pul->pulse_start_sfb], ics->swb_offset_max); for (i = 0; i <= pul->number_pulse; i++) { k += pul->pulse_offset[i]; if (k >= framelen) return 15; /* should not be possible */ if (spec_data[k] > 0) spec_data[k] += pul->pulse_amp[i]; else spec_data[k] -= pul->pulse_amp[i]; } return 0; } faad2-2.11.2/libfaad/pulse.h000066400000000000000000000027231476153623600154560ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: pulse.h,v 1.20 2007/11/01 12:33:34 menno Exp $ **/ #ifndef __PULSE_H__ #define __PULSE_H__ #ifdef __cplusplus extern "C" { #endif uint8_t pulse_decode(ic_stream *ics, int16_t *spec_coef, uint16_t framelen); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/rvlc.c000066400000000000000000000401271476153623600152670ustar00rootroot00000000000000/* ** 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 = {0}, ld_rvlc_esc = {0}; // 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->length_of_rvlc_sf == 0) || (ld_rvlc_sf.error != 0)) { memset(&ld_rvlc_sf, 0, sizeof(ld_rvlc_sf)); ld_rvlc_sf.error = 1; } 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); } if (!ics->sf_escapes_present || (ld_rvlc_esc.error != 0)) { memset(&ld_rvlc_esc, 0, sizeof(ld_rvlc_esc)); ld_rvlc_esc.error = 1; } /* 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 = ld_sf->error | ld_esc->error; 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; int16_t scale_factor_max = 255; #ifdef FIXED_POINT /* TODO: consider rolling out to regular build. */ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION /* The value is inexact, adjusted to current fuzzer findings. */ scale_factor_max = 165; #endif // FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION #endif // FIXED_POINT #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 || scale_factor > 255) return 4; ics->scale_factors[g][sfb] = min(scale_factor, scale_factor_max); 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*/) { uint16_t i, j; int16_t index; uint32_t cw; rvlc_huff_table *h = book_rvlc; int8_t direction = +1; i = h->len; if (direction > 0) cw = faad_getbits(ld_sf, i DEBUGVAR(1,0,"")); else cw = 0 /* 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 |= 0 /* 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 (int8_t)index; } static int8_t rvlc_huffman_esc(bitfile *ld /*, int8_t direction*/) { uint16_t i, j; uint32_t cw; rvlc_huff_table *h = book_escape; int8_t direction = +1; i = h->len; if (direction > 0) cw = faad_getbits(ld, i DEBUGVAR(1,0,"")); else cw = 0 /* 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 |= 0 /* faad_getbits_rev(ld, j DEBUGVAR(1,0,"")) */; } return (int8_t)h->index; } #endif faad2-2.11.2/libfaad/rvlc.h000066400000000000000000000031711476153623600152720ustar00rootroot00000000000000/* ** 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 { int16_t index; uint16_t len; uint32_t cw; } rvlc_huff_table; #define ESC_VAL 7 uint8_t rvlc_scale_factor_data(ic_stream *ics, bitfile *ld); uint8_t rvlc_decode_scale_factors(ic_stream *ics, bitfile *ld); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_dct.c000066400000000000000000002401451476153623600157430ustar00rootroot00000000000000/* ** 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_C(COEF_CONST(1.2130114330978077), f4); f152 = MUL_F(FRAC_CONST(-0.9700312531945440), f150); f153 = MUL_F(FRAC_CONST(-0.7270510732912803), f26); f154 = f151 + f152; f155 = f153 - f152; f156 = f8 + f22; f157 = MUL_C(COEF_CONST(1.3315443865537255), f8); f158 = MUL_F(FRAC_CONST(-0.9039892931234433), f156); f159 = MUL_F(FRAC_CONST(-0.4764341996931612), f22); f160 = f157 + f158; f161 = f159 - f158; f162 = f12 + f18; f163 = MUL_C(COEF_CONST(1.3989068359730781), f12); f164 = MUL_F(FRAC_CONST(-0.8032075314806453), f162); f165 = MUL_F(FRAC_CONST(-0.2075082269882124), f18); f166 = f163 + f164; f167 = f165 - f164; f168 = f16 + f14; f169 = MUL_C(COEF_CONST(1.4125100802019777), f16); f170 = MUL_F(FRAC_CONST(-0.6715589548470187), f168); f171 = MUL_F(FRAC_CONST(0.0693921705079402), f14); f172 = f169 + f170; f173 = f171 - f170; f174 = f20 + f10; f175 = MUL_C(COEF_CONST(1.3718313541934939), f20); f176 = MUL_F(FRAC_CONST(-0.5141027441932219), f174); f177 = MUL_F(FRAC_CONST(0.3436258658070501), f10); f178 = f175 + f176; f179 = f177 - f176; f180 = f24 + f6; f181 = MUL_C(COEF_CONST(1.2784339185752409), f24); f182 = MUL_F(FRAC_CONST(-0.3368898533922200), f180); f183 = MUL_F(FRAC_CONST(0.6046542117908008), f6); f184 = f181 + f182; f185 = f183 - f182; f186 = f28 + f2; f187 = MUL_C(COEF_CONST(1.1359069844201433), f28); f188 = MUL_F(FRAC_CONST(-0.1467304744553624), f186); f189 = MUL_F(FRAC_CONST(0.8424460355094185), f2); f190 = f187 + f188; f191 = f189 - f188; f192 = f149 - f173; f193 = f149 + f173; f194 = f148 - f172; f195 = f148 + f172; f196 = f155 - f179; f197 = f155 + f179; f198 = f154 - f178; f199 = f154 + f178; f200 = f161 - f185; f201 = f161 + f185; f202 = f160 - f184; f203 = f160 + f184; f204 = f167 - f191; f205 = f167 + f191; f206 = f166 - f190; f207 = f166 + f190; f208 = f192 + f194; f209 = MUL_C(COEF_CONST(1.1758756024193588), f192); f210 = MUL_F(FRAC_CONST(-0.9807852804032304), f208); f211 = MUL_F(FRAC_CONST(-0.7856949583871021), f194); f212 = f209 + f210; f213 = f211 - f210; f214 = f196 + f198; f215 = MUL_C(COEF_CONST(1.3870398453221475), f196); f216 = MUL_F(FRAC_CONST(-0.5555702330196022), f214); f217 = MUL_F(FRAC_CONST(0.2758993792829431), f198); f218 = f215 + f216; f219 = f217 - f216; f220 = f200 + f202; f221 = MUL_F(FRAC_CONST(0.7856949583871022), f200); f222 = MUL_F(FRAC_CONST(0.1950903220161283), f220); f223 = MUL_C(COEF_CONST(1.1758756024193586), f202); f224 = f221 + f222; f225 = f223 - f222; f226 = f204 + f206; f227 = MUL_F(FRAC_CONST(-0.2758993792829430), f204); f228 = MUL_F(FRAC_CONST(0.8314696123025452), f226); f229 = MUL_C(COEF_CONST(1.3870398453221475), f206); f230 = f227 + f228; f231 = f229 - f228; f232 = f193 - f201; f233 = f193 + f201; f234 = f195 - f203; f235 = f195 + f203; f236 = f197 - f205; f237 = f197 + f205; f238 = f199 - f207; f239 = f199 + f207; f240 = f213 - f225; f241 = f213 + f225; f242 = f212 - f224; f243 = f212 + f224; f244 = f219 - f231; f245 = f219 + f231; f246 = f218 - f230; f247 = f218 + f230; f248 = f232 + f234; f249 = MUL_C(COEF_CONST(1.3065629648763766), f232); f250 = MUL_F(FRAC_CONST(-0.9238795325112866), f248); f251 = MUL_F(FRAC_CONST(-0.5411961001461967), f234); f252 = f249 + f250; f253 = f251 - f250; f254 = f236 + f238; f255 = MUL_F(FRAC_CONST(0.5411961001461969), f236); f256 = MUL_F(FRAC_CONST(0.3826834323650898), f254); f257 = MUL_C(COEF_CONST(1.3065629648763766), f238); f258 = f255 + f256; f259 = f257 - f256; f260 = f240 + f242; f261 = MUL_C(COEF_CONST(1.3065629648763766), f240); f262 = MUL_F(FRAC_CONST(-0.9238795325112866), f260); f263 = MUL_F(FRAC_CONST(-0.5411961001461967), f242); f264 = f261 + f262; f265 = f263 - f262; f266 = f244 + f246; f267 = MUL_F(FRAC_CONST(0.5411961001461969), f244); f268 = MUL_F(FRAC_CONST(0.3826834323650898), f266); f269 = MUL_C(COEF_CONST(1.3065629648763766), f246); f270 = f267 + f268; f271 = f269 - f268; f272 = f233 - f237; f273 = f233 + f237; f274 = f235 - f239; f275 = f235 + f239; f276 = f253 - f259; f277 = f253 + f259; f278 = f252 - f258; f279 = f252 + f258; f280 = f241 - f245; f281 = f241 + f245; f282 = f243 - f247; f283 = f243 + f247; f284 = f265 - f271; f285 = f265 + f271; f286 = f264 - f270; f287 = f264 + f270; f288 = f272 - f274; f289 = f272 + f274; f290 = MUL_F(FRAC_CONST(0.7071067811865474), f288); f291 = MUL_F(FRAC_CONST(0.7071067811865474), f289); f292 = f276 - f278; f293 = f276 + f278; f294 = MUL_F(FRAC_CONST(0.7071067811865474), f292); f295 = MUL_F(FRAC_CONST(0.7071067811865474), f293); f296 = f280 - f282; f297 = f280 + f282; f298 = MUL_F(FRAC_CONST(0.7071067811865474), f296); f299 = MUL_F(FRAC_CONST(0.7071067811865474), f297); f300 = f284 - f286; f301 = f284 + f286; f302 = MUL_F(FRAC_CONST(0.7071067811865474), f300); f303 = MUL_F(FRAC_CONST(0.7071067811865474), f301); f304 = f129 - f273; f305 = f129 + f273; f306 = f131 - f281; f307 = f131 + f281; f308 = f133 - f285; f309 = f133 + f285; f310 = f135 - f277; f311 = f135 + f277; f312 = f137 - f295; f313 = f137 + f295; f314 = f139 - f303; f315 = f139 + f303; f316 = f141 - f299; f317 = f141 + f299; f318 = f143 - f291; f319 = f143 + f291; f320 = f142 - f290; f321 = f142 + f290; f322 = f140 - f298; f323 = f140 + f298; f324 = f138 - f302; f325 = f138 + f302; f326 = f136 - f294; f327 = f136 + f294; f328 = f134 - f279; f329 = f134 + f279; f330 = f132 - f287; f331 = f132 + f287; f332 = f130 - f283; f333 = f130 + f283; f334 = f128 - f275; f335 = f128 + f275; y[31] = MUL_F(FRAC_CONST(0.5001506360206510), f305); y[30] = MUL_F(FRAC_CONST(0.5013584524464084), f307); y[29] = MUL_F(FRAC_CONST(0.5037887256810443), f309); y[28] = MUL_F(FRAC_CONST(0.5074711720725553), f311); y[27] = MUL_F(FRAC_CONST(0.5124514794082247), f313); y[26] = MUL_F(FRAC_CONST(0.5187927131053328), f315); y[25] = MUL_F(FRAC_CONST(0.5265773151542700), f317); y[24] = MUL_F(FRAC_CONST(0.5359098169079920), f319); y[23] = MUL_F(FRAC_CONST(0.5469204379855088), f321); y[22] = MUL_F(FRAC_CONST(0.5597698129470802), f323); y[21] = MUL_F(FRAC_CONST(0.5746551840326600), f325); y[20] = MUL_F(FRAC_CONST(0.5918185358574165), f327); y[19] = MUL_F(FRAC_CONST(0.6115573478825099), f329); y[18] = MUL_F(FRAC_CONST(0.6342389366884031), f331); y[17] = MUL_F(FRAC_CONST(0.6603198078137061), f333); y[16] = MUL_F(FRAC_CONST(0.6903721282002123), f335); y[15] = MUL_F(FRAC_CONST(0.7251205223771985), f334); y[14] = MUL_F(FRAC_CONST(0.7654941649730891), f332); y[13] = MUL_F(FRAC_CONST(0.8127020908144905), f330); y[12] = MUL_F(FRAC_CONST(0.8683447152233481), f328); y[11] = MUL_F(FRAC_CONST(0.9345835970364075), f326); y[10] = MUL_C(COEF_CONST(1.0144082649970547), f324); y[9] = MUL_C(COEF_CONST(1.1120716205797176), f322); y[8] = MUL_C(COEF_CONST(1.2338327379765710), f320); y[7] = MUL_C(COEF_CONST(1.3892939586328277), f318); y[6] = MUL_C(COEF_CONST(1.5939722833856311), f316); y[5] = MUL_C(COEF_CONST(1.8746759800084078), f314); y[4] = MUL_C(COEF_CONST(2.2820500680051619), f312); y[3] = MUL_C(COEF_CONST(2.9246284281582162), f310); y[2] = MUL_C(COEF_CONST(4.0846110781292477), f308); y[1] = MUL_C(COEF_CONST(6.7967507116736332), f306); y[0] = MUL_R(REAL_CONST(20.3738781672314530), f304); } #ifdef SBR_LOW_POWER void DCT2_16_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f31, f32; real_t f33, f34, f37, f38, f39, f40, f41, f42, f43, f44; real_t f45, f46, f47, f48, f49, f51, f53, f54, f57, f58; real_t f59, f60, f61, f62, f63, f64, f65, f66, f67, f68; real_t f69, f70, f71, f72, f73, f74, f75, f76, f77, f78; real_t f79, f80, f81, f82, f83, f84, f85, f86, f87, f88; real_t f89, f90, f91, f92, f95, f96, f97, f98, f101, f102; real_t f103, f104, f107, f108, f109, f110; f0 = x[0] - x[15]; f1 = x[0] + x[15]; f2 = x[1] - x[14]; f3 = x[1] + x[14]; f4 = x[2] - x[13]; f5 = x[2] + x[13]; f6 = x[3] - x[12]; f7 = x[3] + x[12]; f8 = x[4] - x[11]; f9 = x[4] + x[11]; f10 = x[5] - x[10]; f11 = x[5] + x[10]; f12 = x[6] - x[9]; f13 = x[6] + x[9]; f14 = x[7] - x[8]; f15 = x[7] + x[8]; f16 = f1 - f15; f17 = f1 + f15; f18 = f3 - f13; f19 = f3 + f13; f20 = f5 - f11; f21 = f5 + f11; f22 = f7 - f9; f23 = f7 + f9; f24 = f17 - f23; f25 = f17 + f23; f26 = f19 - f21; f27 = f19 + f21; f28 = f25 - f27; y[0] = f25 + f27; y[8] = MUL_F(f28, FRAC_CONST(0.7071067811865476)); f31 = f24 + f26; f32 = MUL_C(f24, COEF_CONST(1.3065629648763766)); f33 = MUL_F(f31, FRAC_CONST(-0.9238795325112866)); f34 = MUL_F(f26, FRAC_CONST(-0.5411961001461967)); y[12] = f32 + f33; y[4] = f34 - f33; f37 = f16 + f22; f38 = MUL_C(f16, COEF_CONST(1.1758756024193588)); f39 = MUL_F(f37, FRAC_CONST(-0.9807852804032304)); f40 = MUL_F(f22, FRAC_CONST(-0.7856949583871021)); f41 = f38 + f39; f42 = f40 - f39; f43 = f18 + f20; f44 = MUL_C(f18, COEF_CONST(1.3870398453221473)); f45 = MUL_F(f43, FRAC_CONST(-0.8314696123025455)); f46 = MUL_F(f20, FRAC_CONST(-0.2758993792829436)); f47 = f44 + f45; f48 = f46 - f45; f49 = f42 - f48; y[2] = f42 + f48; f51 = MUL_F(f49, FRAC_CONST(0.7071067811865476)); y[14] = f41 - f47; f53 = f41 + f47; f54 = MUL_F(f53, FRAC_CONST(0.7071067811865476)); y[10] = f51 - f54; y[6] = f51 + f54; f57 = f2 - f4; f58 = f2 + f4; f59 = f6 - f8; f60 = f6 + f8; f61 = f10 - f12; f62 = f10 + f12; f63 = MUL_F(f60, FRAC_CONST(0.7071067811865476)); f64 = f0 - f63; f65 = f0 + f63; f66 = f58 + f62; f67 = MUL_C(f58, COEF_CONST(1.3065629648763766)); f68 = MUL_F(f66, FRAC_CONST(-0.9238795325112866)); f69 = MUL_F(f62, FRAC_CONST(-0.5411961001461967)); f70 = f67 + f68; f71 = f69 - f68; f72 = f65 - f71; f73 = f65 + f71; f74 = f64 - f70; f75 = f64 + f70; f76 = MUL_F(f59, FRAC_CONST(0.7071067811865476)); f77 = f14 - f76; f78 = f14 + f76; f79 = f61 + f57; f80 = MUL_C(f61, COEF_CONST(1.3065629648763766)); f81 = MUL_F(f79, FRAC_CONST(-0.9238795325112866)); f82 = MUL_F(f57, FRAC_CONST(-0.5411961001461967)); f83 = f80 + f81; f84 = f82 - f81; f85 = f78 - f84; f86 = f78 + f84; f87 = f77 - f83; f88 = f77 + f83; f89 = f86 + f73; f90 = MUL_F(f86, FRAC_CONST(-0.8971675863426361)); f91 = MUL_F(f89, FRAC_CONST(0.9951847266721968)); f92 = MUL_C(f73, COEF_CONST(1.0932018670017576)); y[1] = f90 + f91; y[15] = f92 - f91; f95 = f75 - f88; f96 = MUL_F(f88, FRAC_CONST(-0.6666556584777466)); f97 = MUL_F(f95, FRAC_CONST(0.9569403357322089)); f98 = MUL_C(f75, COEF_CONST(1.2472250129866713)); y[3] = f97 - f96; y[13] = f98 - f97; f101 = f87 + f74; f102 = MUL_F(f87, FRAC_CONST(-0.4105245275223571)); f103 = MUL_F(f101, FRAC_CONST(0.8819212643483549)); f104 = MUL_C(f74, COEF_CONST(1.3533180011743529)); y[5] = f102 + f103; y[11] = f104 - f103; f107 = f72 - f85; f108 = MUL_F(f85, FRAC_CONST(-0.1386171691990915)); f109 = MUL_F(f107, FRAC_CONST(0.7730104533627370)); f110 = MUL_C(f72, COEF_CONST(1.4074037375263826)); y[7] = f109 - f108; y[9] = f110 - f109; } void DCT4_16(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; real_t f121, f122, f123, f124, f125, f126, f127, f128, f130, f132; real_t f134, f136, f138, f140, f142, f144, f145, f148, f149, f152; real_t f153, f156, f157; f0 = x[0] + x[15]; f1 = MUL_C(COEF_CONST(1.0478631305325901), x[0]); f2 = MUL_F(FRAC_CONST(-0.9987954562051724), f0); f3 = MUL_F(FRAC_CONST(-0.9497277818777548), x[15]); f4 = f1 + f2; f5 = f3 - f2; f6 = x[2] + x[13]; f7 = MUL_C(COEF_CONST(1.2130114330978077), x[2]); f8 = MUL_F(FRAC_CONST(-0.9700312531945440), f6); f9 = MUL_F(FRAC_CONST(-0.7270510732912803), x[13]); f10 = f7 + f8; f11 = f9 - f8; f12 = x[4] + x[11]; f13 = MUL_C(COEF_CONST(1.3315443865537255), x[4]); f14 = MUL_F(FRAC_CONST(-0.9039892931234433), f12); f15 = MUL_F(FRAC_CONST(-0.4764341996931612), x[11]); f16 = f13 + f14; f17 = f15 - f14; f18 = x[6] + x[9]; f19 = MUL_C(COEF_CONST(1.3989068359730781), x[6]); f20 = MUL_F(FRAC_CONST(-0.8032075314806453), f18); f21 = MUL_F(FRAC_CONST(-0.2075082269882124), x[9]); f22 = f19 + f20; f23 = f21 - f20; f24 = x[8] + x[7]; f25 = MUL_C(COEF_CONST(1.4125100802019777), x[8]); f26 = MUL_F(FRAC_CONST(-0.6715589548470187), f24); f27 = MUL_F(FRAC_CONST(0.0693921705079402), x[7]); f28 = f25 + f26; f29 = f27 - f26; f30 = x[10] + x[5]; f31 = MUL_C(COEF_CONST(1.3718313541934939), x[10]); f32 = MUL_F(FRAC_CONST(-0.5141027441932219), f30); f33 = MUL_F(FRAC_CONST(0.3436258658070501), x[5]); f34 = f31 + f32; f35 = f33 - f32; f36 = x[12] + x[3]; f37 = MUL_C(COEF_CONST(1.2784339185752409), x[12]); f38 = MUL_F(FRAC_CONST(-0.3368898533922200), f36); f39 = MUL_F(FRAC_CONST(0.6046542117908008), x[3]); f40 = f37 + f38; f41 = f39 - f38; f42 = x[14] + x[1]; f43 = MUL_C(COEF_CONST(1.1359069844201433), x[14]); f44 = MUL_F(FRAC_CONST(-0.1467304744553624), f42); f45 = MUL_F(FRAC_CONST(0.8424460355094185), x[1]); f46 = f43 + f44; f47 = f45 - f44; f48 = f5 - f29; f49 = f5 + f29; f50 = f4 - f28; f51 = f4 + f28; f52 = f11 - f35; f53 = f11 + f35; f54 = f10 - f34; f55 = f10 + f34; f56 = f17 - f41; f57 = f17 + f41; f58 = f16 - f40; f59 = f16 + f40; f60 = f23 - f47; f61 = f23 + f47; f62 = f22 - f46; f63 = f22 + f46; f64 = f48 + f50; f65 = MUL_C(COEF_CONST(1.1758756024193588), f48); f66 = MUL_F(FRAC_CONST(-0.9807852804032304), f64); f67 = MUL_F(FRAC_CONST(-0.7856949583871021), f50); f68 = f65 + f66; f69 = f67 - f66; f70 = f52 + f54; f71 = MUL_C(COEF_CONST(1.3870398453221475), f52); f72 = MUL_F(FRAC_CONST(-0.5555702330196022), f70); f73 = MUL_F(FRAC_CONST(0.2758993792829431), f54); f74 = f71 + f72; f75 = f73 - f72; f76 = f56 + f58; f77 = MUL_F(FRAC_CONST(0.7856949583871022), f56); f78 = MUL_F(FRAC_CONST(0.1950903220161283), f76); f79 = MUL_C(COEF_CONST(1.1758756024193586), f58); f80 = f77 + f78; f81 = f79 - f78; f82 = f60 + f62; f83 = MUL_F(FRAC_CONST(-0.2758993792829430), f60); f84 = MUL_F(FRAC_CONST(0.8314696123025452), f82); f85 = MUL_C(COEF_CONST(1.3870398453221475), f62); f86 = f83 + f84; f87 = f85 - f84; f88 = f49 - f57; f89 = f49 + f57; f90 = f51 - f59; f91 = f51 + f59; f92 = f53 - f61; f93 = f53 + f61; f94 = f55 - f63; f95 = f55 + f63; f96 = f69 - f81; f97 = f69 + f81; f98 = f68 - f80; f99 = f68 + f80; f100 = f75 - f87; f101 = f75 + f87; f102 = f74 - f86; f103 = f74 + f86; f104 = f88 + f90; f105 = MUL_C(COEF_CONST(1.3065629648763766), f88); f106 = MUL_F(FRAC_CONST(-0.9238795325112866), f104); f107 = MUL_F(FRAC_CONST(-0.5411961001461967), f90); f108 = f105 + f106; f109 = f107 - f106; f110 = f92 + f94; f111 = MUL_F(FRAC_CONST(0.5411961001461969), f92); f112 = MUL_F(FRAC_CONST(0.3826834323650898), f110); f113 = MUL_C(COEF_CONST(1.3065629648763766), f94); f114 = f111 + f112; f115 = f113 - f112; f116 = f96 + f98; f117 = MUL_C(COEF_CONST(1.3065629648763766), f96); f118 = MUL_F(FRAC_CONST(-0.9238795325112866), f116); f119 = MUL_F(FRAC_CONST(-0.5411961001461967), f98); f120 = f117 + f118; f121 = f119 - f118; f122 = f100 + f102; f123 = MUL_F(FRAC_CONST(0.5411961001461969), f100); f124 = MUL_F(FRAC_CONST(0.3826834323650898), f122); f125 = MUL_C(COEF_CONST(1.3065629648763766), f102); f126 = f123 + f124; f127 = f125 - f124; f128 = f89 - f93; y[0] = f89 + f93; f130 = f91 - f95; y[15] = f91 + f95; f132 = f109 - f115; y[3] = f109 + f115; f134 = f108 - f114; y[12] = f108 + f114; f136 = f97 - f101; y[1] = f97 + f101; f138 = f99 - f103; y[14] = f99 + f103; f140 = f121 - f127; y[2] = f121 + f127; f142 = f120 - f126; y[13] = f120 + f126; f144 = f128 - f130; f145 = f128 + f130; y[8] = MUL_F(FRAC_CONST(0.7071067811865474), f144); y[7] = MUL_F(FRAC_CONST(0.7071067811865474), f145); f148 = f132 - f134; f149 = f132 + f134; y[11] = MUL_F(FRAC_CONST(0.7071067811865474), f148); y[4] = MUL_F(FRAC_CONST(0.7071067811865474), f149); f152 = f136 - f138; f153 = f136 + f138; y[9] = MUL_F(FRAC_CONST(0.7071067811865474), f152); y[6] = MUL_F(FRAC_CONST(0.7071067811865474), f153); f156 = f140 - f142; f157 = f140 + f142; y[10] = MUL_F(FRAC_CONST(0.7071067811865474), f156); y[5] = MUL_F(FRAC_CONST(0.7071067811865474), f157); } void DCT3_32_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f61, f62, f63, f64, f65, f66, f67, f68, f69, f70; real_t f71, f72, f73, f74, f75, f76, f77, f78, f79, f80; real_t f81, f82, f83, f84, f85, f86, f87, f88, f89, f90; real_t f91, f92, f93, f94, f95, f96, f97, f98, f99, f100; real_t f101, f102, f103, f104, f105, f106, f107, f108, f109, f110; real_t f111, f112, f113, f114, f115, f116, f117, f118, f119, f120; real_t f121, f122, f123, f124, f125, f126, f127, f128, f129, f130; real_t f131, f132, f133, f134, f135, f136, f137, f138, f139, f140; real_t f141, f142, f143, f144, f145, f146, f147, f148, f149, f150; real_t f151, f152, f153, f154, f155, f156, f157, f158, f159, f160; real_t f161, f162, f163, f164, f165, f166, f167, f168, f169, f170; real_t f171, f172, f173, f174, f175, f176, f177, f178, f179, f180; real_t f181, f182, f183, f184, f185, f186, f187, f188, f189, f190; real_t f191, f192, f193, f194, f195, f196, f197, f198, f199, f200; real_t f201, f202, f203, f204, f205, f206, f207, f208, f209, f210; real_t f211, f212, f213, f214, f215, f216, f217, f218, f219, f220; real_t f221, f222, f223, f224, f225, f226, f227, f228, f229, f230; real_t f231, f232, f233, f234, f235, f236, f237, f238, f239, f240; real_t f241, f242, f243, f244, f245, f246, f247, f248, f249, f250; real_t f251, f252, f253, f254, f255, f256, f257, f258, f259, f260; real_t f261, f262, f263, f264, f265, f266, f267, f268, f269, f270; real_t f271, f272; f0 = MUL_F(x[16], FRAC_CONST(0.7071067811865476)); f1 = x[0] - f0; f2 = x[0] + f0; f3 = x[8] + x[24]; f4 = MUL_C(x[8], COEF_CONST(1.3065629648763766)); f5 = MUL_F(f3, FRAC_CONST((-0.9238795325112866))); f6 = MUL_F(x[24], FRAC_CONST((-0.5411961001461967))); f7 = f4 + f5; f8 = f6 - f5; f9 = f2 - f8; f10 = f2 + f8; f11 = f1 - f7; f12 = f1 + f7; f13 = x[4] + x[28]; f14 = MUL_C(x[4], COEF_CONST(1.1758756024193588)); f15 = MUL_F(f13, FRAC_CONST((-0.9807852804032304))); f16 = MUL_F(x[28], FRAC_CONST((-0.7856949583871021))); f17 = f14 + f15; f18 = f16 - f15; f19 = x[12] + x[20]; f20 = MUL_C(x[12], COEF_CONST(1.3870398453221473)); f21 = MUL_F(f19, FRAC_CONST((-0.8314696123025455))); f22 = MUL_F(x[20], FRAC_CONST((-0.2758993792829436))); f23 = f20 + f21; f24 = f22 - f21; f25 = f18 - f24; f26 = f18 + f24; f27 = MUL_F(f25, FRAC_CONST(0.7071067811865476)); f28 = f17 - f23; f29 = f17 + f23; f30 = MUL_F(f29, FRAC_CONST(0.7071067811865476)); f31 = f27 - f30; f32 = f27 + f30; f33 = f10 - f26; f34 = f10 + f26; f35 = f12 - f32; f36 = f12 + f32; f37 = f11 - f31; f38 = f11 + f31; f39 = f9 - f28; f40 = f9 + f28; f41 = x[2] + x[30]; f42 = MUL_C(x[2], COEF_CONST(1.0932018670017569)); f43 = MUL_F(f41, FRAC_CONST((-0.9951847266721969))); f44 = MUL_F(x[30], FRAC_CONST((-0.8971675863426368))); f45 = f42 + f43; f46 = f44 - f43; f47 = x[6] + x[26]; f48 = MUL_C(x[6], COEF_CONST(1.2472250129866711)); f49 = MUL_F(f47, FRAC_CONST((-0.9569403357322089))); f50 = MUL_F(x[26], FRAC_CONST((-0.6666556584777469))); f51 = f48 + f49; f52 = f50 - f49; f53 = x[10] + x[22]; f54 = MUL_C(x[10], COEF_CONST(1.3533180011743526)); f55 = MUL_F(f53, FRAC_CONST((-0.8819212643483551))); f56 = MUL_F(x[22], FRAC_CONST((-0.4105245275223575))); f57 = f54 + f55; f58 = f56 - f55; f59 = x[14] + x[18]; f60 = MUL_C(x[14], COEF_CONST(1.4074037375263826)); f61 = MUL_F(f59, FRAC_CONST((-0.7730104533627369))); f62 = MUL_F(x[18], FRAC_CONST((-0.1386171691990913))); f63 = f60 + f61; f64 = f62 - f61; f65 = f46 - f64; f66 = f46 + f64; f67 = f52 - f58; f68 = f52 + f58; f69 = f66 - f68; f70 = f66 + f68; f71 = MUL_F(f69, FRAC_CONST(0.7071067811865476)); f72 = f65 + f67; f73 = MUL_C(f65, COEF_CONST(1.3065629648763766)); f74 = MUL_F(f72, FRAC_CONST((-0.9238795325112866))); f75 = MUL_F(f67, FRAC_CONST((-0.5411961001461967))); f76 = f73 + f74; f77 = f75 - f74; f78 = f45 - f63; f79 = f45 + f63; f80 = f51 - f57; f81 = f51 + f57; f82 = f79 + f81; f83 = MUL_C(f79, COEF_CONST(1.3065629648763770)); f84 = MUL_F(f82, FRAC_CONST((-0.3826834323650904))); f85 = MUL_F(f81, FRAC_CONST(0.5411961001461961)); f86 = f83 + f84; f87 = f85 - f84; f88 = f78 - f80; f89 = f78 + f80; f90 = MUL_F(f89, FRAC_CONST(0.7071067811865476)); f91 = f77 - f87; f92 = f77 + f87; f93 = f71 - f90; f94 = f71 + f90; f95 = f76 - f86; f96 = f76 + f86; f97 = f34 - f70; f98 = f34 + f70; f99 = f36 - f92; f100 = f36 + f92; f101 = f38 - f91; f102 = f38 + f91; f103 = f40 - f94; f104 = f40 + f94; f105 = f39 - f93; f106 = f39 + f93; f107 = f37 - f96; f108 = f37 + f96; f109 = f35 - f95; f110 = f35 + f95; f111 = f33 - f88; f112 = f33 + f88; f113 = x[1] + x[31]; f114 = MUL_C(x[1], COEF_CONST(1.0478631305325901)); f115 = MUL_F(f113, FRAC_CONST((-0.9987954562051724))); f116 = MUL_F(x[31], FRAC_CONST((-0.9497277818777548))); f117 = f114 + f115; f118 = f116 - f115; f119 = x[5] + x[27]; f120 = MUL_C(x[5], COEF_CONST(1.2130114330978077)); f121 = MUL_F(f119, FRAC_CONST((-0.9700312531945440))); f122 = MUL_F(x[27], FRAC_CONST((-0.7270510732912803))); f123 = f120 + f121; f124 = f122 - f121; f125 = x[9] + x[23]; f126 = MUL_C(x[9], COEF_CONST(1.3315443865537255)); f127 = MUL_F(f125, FRAC_CONST((-0.9039892931234433))); f128 = MUL_F(x[23], FRAC_CONST((-0.4764341996931612))); f129 = f126 + f127; f130 = f128 - f127; f131 = x[13] + x[19]; f132 = MUL_C(x[13], COEF_CONST(1.3989068359730781)); f133 = MUL_F(f131, FRAC_CONST((-0.8032075314806453))); f134 = MUL_F(x[19], FRAC_CONST((-0.2075082269882124))); f135 = f132 + f133; f136 = f134 - f133; f137 = x[17] + x[15]; f138 = MUL_C(x[17], COEF_CONST(1.4125100802019777)); f139 = MUL_F(f137, FRAC_CONST((-0.6715589548470187))); f140 = MUL_F(x[15], FRAC_CONST(0.0693921705079402)); f141 = f138 + f139; f142 = f140 - f139; f143 = x[21] + x[11]; f144 = MUL_C(x[21], COEF_CONST(1.3718313541934939)); f145 = MUL_F(f143, FRAC_CONST((-0.5141027441932219))); f146 = MUL_F(x[11], FRAC_CONST(0.3436258658070501)); f147 = f144 + f145; f148 = f146 - f145; f149 = x[25] + x[7]; f150 = MUL_C(x[25], COEF_CONST(1.2784339185752409)); f151 = MUL_F(f149, FRAC_CONST((-0.3368898533922200))); f152 = MUL_F(x[7], FRAC_CONST(0.6046542117908008)); f153 = f150 + f151; f154 = f152 - f151; f155 = x[29] + x[3]; f156 = MUL_C(x[29], COEF_CONST(1.1359069844201433)); f157 = MUL_F(f155, FRAC_CONST((-0.1467304744553624))); f158 = MUL_F(x[3], FRAC_CONST(0.8424460355094185)); f159 = f156 + f157; f160 = f158 - f157; f161 = f118 - f142; f162 = f118 + f142; f163 = f117 - f141; f164 = f117 + f141; f165 = f124 - f148; f166 = f124 + f148; f167 = f123 - f147; f168 = f123 + f147; f169 = f130 - f154; f170 = f130 + f154; f171 = f129 - f153; f172 = f129 + f153; f173 = f136 - f160; f174 = f136 + f160; f175 = f135 - f159; f176 = f135 + f159; f177 = f161 + f163; f178 = MUL_C(f161, COEF_CONST(1.1758756024193588)); f179 = MUL_F(f177, FRAC_CONST((-0.9807852804032304))); f180 = MUL_F(f163, FRAC_CONST((-0.7856949583871021))); f181 = f178 + f179; f182 = f180 - f179; f183 = f165 + f167; f184 = MUL_C(f165, COEF_CONST(1.3870398453221475)); f185 = MUL_F(f183, FRAC_CONST((-0.5555702330196022))); f186 = MUL_F(f167, FRAC_CONST(0.2758993792829431)); f187 = f184 + f185; f188 = f186 - f185; f189 = f169 + f171; f190 = MUL_F(f169, FRAC_CONST(0.7856949583871022)); f191 = MUL_F(f189, FRAC_CONST(0.1950903220161283)); f192 = MUL_C(f171, COEF_CONST(1.1758756024193586)); f193 = f190 + f191; f194 = f192 - f191; f195 = f173 + f175; f196 = MUL_F(f173, FRAC_CONST((-0.2758993792829430))); f197 = MUL_F(f195, FRAC_CONST(0.8314696123025452)); f198 = MUL_C(f175, COEF_CONST(1.3870398453221475)); f199 = f196 + f197; f200 = f198 - f197; f201 = f162 - f170; f202 = f162 + f170; f203 = f164 - f172; f204 = f164 + f172; f205 = f166 - f174; f206 = f166 + f174; f207 = f168 - f176; f208 = f168 + f176; f209 = f182 - f194; f210 = f182 + f194; f211 = f181 - f193; f212 = f181 + f193; f213 = f188 - f200; f214 = f188 + f200; f215 = f187 - f199; f216 = f187 + f199; f217 = f201 + f203; f218 = MUL_C(f201, COEF_CONST(1.3065629648763766)); f219 = MUL_F(f217, FRAC_CONST((-0.9238795325112866))); f220 = MUL_F(f203, FRAC_CONST((-0.5411961001461967))); f221 = f218 + f219; f222 = f220 - f219; f223 = f205 + f207; f224 = MUL_F(f205, FRAC_CONST(0.5411961001461969)); f225 = MUL_F(f223, FRAC_CONST(0.3826834323650898)); f226 = MUL_C(f207, COEF_CONST(1.3065629648763766)); f227 = f224 + f225; f228 = f226 - f225; f229 = f209 + f211; f230 = MUL_C(f209, COEF_CONST(1.3065629648763766)); f231 = MUL_F(f229, FRAC_CONST((-0.9238795325112866))); f232 = MUL_F(f211, FRAC_CONST((-0.5411961001461967))); f233 = f230 + f231; f234 = f232 - f231; f235 = f213 + f215; f236 = MUL_F(f213, FRAC_CONST(0.5411961001461969)); f237 = MUL_F(f235, FRAC_CONST(0.3826834323650898)); f238 = MUL_C(f215, COEF_CONST(1.3065629648763766)); f239 = f236 + f237; f240 = f238 - f237; f241 = f202 - f206; f242 = f202 + f206; f243 = f204 - f208; f244 = f204 + f208; f245 = f222 - f228; f246 = f222 + f228; f247 = f221 - f227; f248 = f221 + f227; f249 = f210 - f214; f250 = f210 + f214; f251 = f212 - f216; f252 = f212 + f216; f253 = f234 - f240; f254 = f234 + f240; f255 = f233 - f239; f256 = f233 + f239; f257 = f241 - f243; f258 = f241 + f243; f259 = MUL_F(f257, FRAC_CONST(0.7071067811865474)); f260 = MUL_F(f258, FRAC_CONST(0.7071067811865474)); f261 = f245 - f247; f262 = f245 + f247; f263 = MUL_F(f261, FRAC_CONST(0.7071067811865474)); f264 = MUL_F(f262, FRAC_CONST(0.7071067811865474)); f265 = f249 - f251; f266 = f249 + f251; f267 = MUL_F(f265, FRAC_CONST(0.7071067811865474)); f268 = MUL_F(f266, FRAC_CONST(0.7071067811865474)); f269 = f253 - f255; f270 = f253 + f255; f271 = MUL_F(f269, FRAC_CONST(0.7071067811865474)); f272 = MUL_F(f270, FRAC_CONST(0.7071067811865474)); y[31] = f98 - f242; y[0] = f98 + f242; y[30] = f100 - f250; y[1] = f100 + f250; y[29] = f102 - f254; y[2] = f102 + f254; y[28] = f104 - f246; y[3] = f104 + f246; y[27] = f106 - f264; y[4] = f106 + f264; y[26] = f108 - f272; y[5] = f108 + f272; y[25] = f110 - f268; y[6] = f110 + f268; y[24] = f112 - f260; y[7] = f112 + f260; y[23] = f111 - f259; y[8] = f111 + f259; y[22] = f109 - f267; y[9] = f109 + f267; y[21] = f107 - f271; y[10] = f107 + f271; y[20] = f105 - f263; y[11] = f105 + f263; y[19] = f103 - f248; y[12] = f103 + f248; y[18] = f101 - f256; y[13] = f101 + f256; y[17] = f99 - f252; y[14] = f99 + f252; y[16] = f97 - f244; y[15] = f97 + f244; } void DCT2_32_unscaled(real_t *y, real_t *x) { real_t f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10; real_t f11, f12, f13, f14, f15, f16, f17, f18, f19, f20; real_t f21, f22, f23, f24, f25, f26, f27, f28, f29, f30; real_t f31, f32, f33, f34, f35, f36, f37, f38, f39, f40; real_t f41, f42, f43, f44, f45, f46, f47, f48, f49, f50; real_t f51, f52, f53, f54, f55, f56, f57, f58, f59, f60; real_t f63, f64, f65, f66, f69, f70, f71, f72, f73, f74; real_t f75, f76, f77, f78, f79, f80, f81, f83, f85, f86; real_t f89, f90, f91, f92, f93, f94, f95, f96, f97, f98; real_t f99, f100, f101, f102, f103, f104, f105, f106, f107, f108; real_t f109, f110, f111, f112, f113, f114, f115, f116, f117, f118; real_t f119, f120, f121, f122, f123, f124, f127, f128, f129, f130; real_t f133, f134, f135, f136, f139, f140, f141, f142, f145, f146; real_t f147, f148, f149, f150, f151, f152, f153, f154, f155, f156; real_t f157, f158, f159, f160, f161, f162, f163, f164, f165, f166; real_t f167, f168, f169, f170, f171, f172, f173, f174, f175, f176; real_t f177, f178, f179, f180, f181, f182, f183, f184, f185, f186; real_t f187, f188, f189, f190, f191, f192, f193, f194, f195, f196; real_t f197, f198, f199, f200, f201, f202, f203, f204, f205, f206; real_t f207, f208, f209, f210, f211, f212, f213, f214, f215, f216; real_t f217, f218, f219, f220, f221, f222, f223, f224, f225, f226; real_t f227, f228, f229, f230, f231, f232, f233, f234, f235, f236; real_t f237, f238, f239, f240, f241, f242, f243, f244, f247, f248; real_t f249, f250, f253, f254, f255, f256, f259, f260, f261, f262; real_t f265, f266, f267, f268, f271, f272, f273, f274, f277, f278; real_t f279, f280, f283, f284, f285, f286; f0 = x[0] - x[31]; f1 = x[0] + x[31]; f2 = x[1] - x[30]; f3 = x[1] + x[30]; f4 = x[2] - x[29]; f5 = x[2] + x[29]; f6 = x[3] - x[28]; f7 = x[3] + x[28]; f8 = x[4] - x[27]; f9 = x[4] + x[27]; f10 = x[5] - x[26]; f11 = x[5] + x[26]; f12 = x[6] - x[25]; f13 = x[6] + x[25]; f14 = x[7] - x[24]; f15 = x[7] + x[24]; f16 = x[8] - x[23]; f17 = x[8] + x[23]; f18 = x[9] - x[22]; f19 = x[9] + x[22]; f20 = x[10] - x[21]; f21 = x[10] + x[21]; f22 = x[11] - x[20]; f23 = x[11] + x[20]; f24 = x[12] - x[19]; f25 = x[12] + x[19]; f26 = x[13] - x[18]; f27 = x[13] + x[18]; f28 = x[14] - x[17]; f29 = x[14] + x[17]; f30 = x[15] - x[16]; f31 = x[15] + x[16]; f32 = f1 - f31; f33 = f1 + f31; f34 = f3 - f29; f35 = f3 + f29; f36 = f5 - f27; f37 = f5 + f27; f38 = f7 - f25; f39 = f7 + f25; f40 = f9 - f23; f41 = f9 + f23; f42 = f11 - f21; f43 = f11 + f21; f44 = f13 - f19; f45 = f13 + f19; f46 = f15 - f17; f47 = f15 + f17; f48 = f33 - f47; f49 = f33 + f47; f50 = f35 - f45; f51 = f35 + f45; f52 = f37 - f43; f53 = f37 + f43; f54 = f39 - f41; f55 = f39 + f41; f56 = f49 - f55; f57 = f49 + f55; f58 = f51 - f53; f59 = f51 + f53; f60 = f57 - f59; y[0] = f57 + f59; y[16] = MUL_F(FRAC_CONST(0.7071067811865476), f60); f63 = f56 + f58; f64 = MUL_C(COEF_CONST(1.3065629648763766), f56); f65 = MUL_F(FRAC_CONST(-0.9238795325112866), f63); f66 = MUL_F(FRAC_CONST(-0.5411961001461967), f58); y[24] = f64 + f65; y[8] = f66 - f65; f69 = f48 + f54; f70 = MUL_C(COEF_CONST(1.1758756024193588), f48); f71 = MUL_F(FRAC_CONST(-0.9807852804032304), f69); f72 = MUL_F(FRAC_CONST(-0.7856949583871021), f54); f73 = f70 + f71; f74 = f72 - f71; f75 = f50 + f52; f76 = MUL_C(COEF_CONST(1.3870398453221473), f50); f77 = MUL_F(FRAC_CONST(-0.8314696123025455), f75); f78 = MUL_F(FRAC_CONST(-0.2758993792829436), f52); f79 = f76 + f77; f80 = f78 - f77; f81 = f74 - f80; y[4] = f74 + f80; f83 = MUL_F(FRAC_CONST(0.7071067811865476), f81); y[28] = f73 - f79; f85 = f73 + f79; f86 = MUL_F(FRAC_CONST(0.7071067811865476), f85); y[20] = f83 - f86; y[12] = f83 + f86; f89 = f34 - f36; f90 = f34 + f36; f91 = f38 - f40; f92 = f38 + f40; f93 = f42 - f44; f94 = f42 + f44; f95 = MUL_F(FRAC_CONST(0.7071067811865476), f92); f96 = f32 - f95; f97 = f32 + f95; f98 = f90 + f94; f99 = MUL_C(COEF_CONST(1.3065629648763766), f90); f100 = MUL_F(FRAC_CONST(-0.9238795325112866), f98); f101 = MUL_F(FRAC_CONST(-0.5411961001461967), f94); f102 = f99 + f100; f103 = f101 - f100; f104 = f97 - f103; f105 = f97 + f103; f106 = f96 - f102; f107 = f96 + f102; f108 = MUL_F(FRAC_CONST(0.7071067811865476), f91); f109 = f46 - f108; f110 = f46 + f108; f111 = f93 + f89; f112 = MUL_C(COEF_CONST(1.3065629648763766), f93); f113 = MUL_F(FRAC_CONST(-0.9238795325112866), f111); f114 = MUL_F(FRAC_CONST(-0.5411961001461967), f89); f115 = f112 + f113; f116 = f114 - f113; f117 = f110 - f116; f118 = f110 + f116; f119 = f109 - f115; f120 = f109 + f115; f121 = f118 + f105; f122 = MUL_F(FRAC_CONST(-0.8971675863426361), f118); f123 = MUL_F(FRAC_CONST(0.9951847266721968), f121); f124 = MUL_C(COEF_CONST(1.0932018670017576), f105); y[2] = f122 + f123; y[30] = f124 - f123; f127 = f107 - f120; f128 = MUL_F(FRAC_CONST(-0.6666556584777466), f120); f129 = MUL_F(FRAC_CONST(0.9569403357322089), f127); f130 = MUL_C(COEF_CONST(1.2472250129866713), f107); y[6] = f129 - f128; y[26] = f130 - f129; f133 = f119 + f106; f134 = MUL_F(FRAC_CONST(-0.4105245275223571), f119); f135 = MUL_F(FRAC_CONST(0.8819212643483549), f133); f136 = MUL_C(COEF_CONST(1.3533180011743529), f106); y[10] = f134 + f135; y[22] = f136 - f135; f139 = f104 - f117; f140 = MUL_F(FRAC_CONST(-0.1386171691990915), f117); f141 = MUL_F(FRAC_CONST(0.7730104533627370), f139); f142 = MUL_C(COEF_CONST(1.4074037375263826), f104); y[14] = f141 - f140; y[18] = f142 - f141; f145 = f2 - f4; f146 = f2 + f4; f147 = f6 - f8; f148 = f6 + f8; f149 = f10 - f12; f150 = f10 + f12; f151 = f14 - f16; f152 = f14 + f16; f153 = f18 - f20; f154 = f18 + f20; f155 = f22 - f24; f156 = f22 + f24; f157 = f26 - f28; f158 = f26 + f28; f159 = MUL_F(FRAC_CONST(0.7071067811865476), f152); f160 = f0 - f159; f161 = f0 + f159; f162 = f148 + f156; f163 = MUL_C(COEF_CONST(1.3065629648763766), f148); f164 = MUL_F(FRAC_CONST(-0.9238795325112866), f162); f165 = MUL_F(FRAC_CONST(-0.5411961001461967), f156); f166 = f163 + f164; f167 = f165 - f164; f168 = f161 - f167; f169 = f161 + f167; f170 = f160 - f166; f171 = f160 + f166; f172 = f146 + f158; f173 = MUL_C(COEF_CONST(1.1758756024193588), f146); f174 = MUL_F(FRAC_CONST(-0.9807852804032304), f172); f175 = MUL_F(FRAC_CONST(-0.7856949583871021), f158); f176 = f173 + f174; f177 = f175 - f174; f178 = f150 + f154; f179 = MUL_C(COEF_CONST(1.3870398453221473), f150); f180 = MUL_F(FRAC_CONST(-0.8314696123025455), f178); f181 = MUL_F(FRAC_CONST(-0.2758993792829436), f154); f182 = f179 + f180; f183 = f181 - f180; f184 = f177 - f183; f185 = f177 + f183; f186 = MUL_F(FRAC_CONST(0.7071067811865476), f184); f187 = f176 - f182; f188 = f176 + f182; f189 = MUL_F(FRAC_CONST(0.7071067811865476), f188); f190 = f186 - f189; f191 = f186 + f189; f192 = f169 - f185; f193 = f169 + f185; f194 = f171 - f191; f195 = f171 + f191; f196 = f170 - f190; f197 = f170 + f190; f198 = f168 - f187; f199 = f168 + f187; f200 = MUL_F(FRAC_CONST(0.7071067811865476), f151); f201 = f30 - f200; f202 = f30 + f200; f203 = f155 + f147; f204 = MUL_C(COEF_CONST(1.3065629648763766), f155); f205 = MUL_F(FRAC_CONST(-0.9238795325112866), f203); f206 = MUL_F(FRAC_CONST(-0.5411961001461967), f147); f207 = f204 + f205; f208 = f206 - f205; f209 = f202 - f208; f210 = f202 + f208; f211 = f201 - f207; f212 = f201 + f207; f213 = f157 + f145; f214 = MUL_C(COEF_CONST(1.1758756024193588), f157); f215 = MUL_F(FRAC_CONST(-0.9807852804032304), f213); f216 = MUL_F(FRAC_CONST(-0.7856949583871021), f145); f217 = f214 + f215; f218 = f216 - f215; f219 = f153 + f149; f220 = MUL_C(COEF_CONST(1.3870398453221473), f153); f221 = MUL_F(FRAC_CONST(-0.8314696123025455), f219); f222 = MUL_F(FRAC_CONST(-0.2758993792829436), f149); f223 = f220 + f221; f224 = f222 - f221; f225 = f218 - f224; f226 = f218 + f224; f227 = MUL_F(FRAC_CONST(0.7071067811865476), f225); f228 = f217 - f223; f229 = f217 + f223; f230 = MUL_F(FRAC_CONST(0.7071067811865476), f229); f231 = f227 - f230; f232 = f227 + f230; f233 = f210 - f226; f234 = f210 + f226; f235 = f212 - f232; f236 = f212 + f232; f237 = f211 - f231; f238 = f211 + f231; f239 = f209 - f228; f240 = f209 + f228; f241 = f234 + f193; f242 = MUL_F(FRAC_CONST(-0.9497277818777543), f234); f243 = MUL_F(FRAC_CONST(0.9987954562051724), f241); f244 = MUL_C(COEF_CONST(1.0478631305325905), f193); y[1] = f242 + f243; y[31] = f244 - f243; f247 = f195 - f236; f248 = MUL_F(FRAC_CONST(-0.8424460355094192), f236); f249 = MUL_F(FRAC_CONST(0.9891765099647810), f247); f250 = MUL_C(COEF_CONST(1.1359069844201428), f195); y[3] = f249 - f248; y[29] = f250 - f249; f253 = f238 + f197; f254 = MUL_F(FRAC_CONST(-0.7270510732912801), f238); f255 = MUL_F(FRAC_CONST(0.9700312531945440), f253); f256 = MUL_C(COEF_CONST(1.2130114330978079), f197); y[5] = f254 + f255; y[27] = f256 - f255; f259 = f199 - f240; f260 = MUL_F(FRAC_CONST(-0.6046542117908007), f240); f261 = MUL_F(FRAC_CONST(0.9415440651830208), f259); f262 = MUL_C(COEF_CONST(1.2784339185752409), f199); y[7] = f261 - f260; y[25] = f262 - f261; f265 = f239 + f198; f266 = MUL_F(FRAC_CONST(-0.4764341996931611), f239); f267 = MUL_F(FRAC_CONST(0.9039892931234433), f265); f268 = MUL_C(COEF_CONST(1.3315443865537255), f198); y[9] = f266 + f267; y[23] = f268 - f267; f271 = f196 - f237; f272 = MUL_F(FRAC_CONST(-0.3436258658070505), f237); f273 = MUL_F(FRAC_CONST(0.8577286100002721), f271); f274 = MUL_C(COEF_CONST(1.3718313541934939), f196); y[11] = f273 - f272; y[21] = f274 - f273; f277 = f235 + f194; f278 = MUL_F(FRAC_CONST(-0.2075082269882114), f235); f279 = MUL_F(FRAC_CONST(0.8032075314806448), f277); f280 = MUL_C(COEF_CONST(1.3989068359730783), f194); y[13] = f278 + f279; y[19] = f280 - f279; f283 = f192 - f233; f284 = MUL_F(FRAC_CONST(-0.0693921705079408), f233); f285 = MUL_F(FRAC_CONST(0.7409511253549591), f283); f286 = MUL_C(COEF_CONST(1.4125100802019774), f192); y[15] = f285 - f284; y[17] = f286 - f285; } #else #define n 32 #define log2n 5 // w_array_real[i] = cos(2*M_PI*i/32) static const real_t w_array_real[] = { FRAC_CONST(1.000000000000000), FRAC_CONST(0.980785279337272), FRAC_CONST(0.923879528329380), FRAC_CONST(0.831469603195765), FRAC_CONST(0.707106765732237), FRAC_CONST(0.555570210304169), FRAC_CONST(0.382683402077046), FRAC_CONST(0.195090284503576), FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090370246552), FRAC_CONST(-0.382683482845162), FRAC_CONST(-0.555570282993553), FRAC_CONST(-0.707106827549476), FRAC_CONST(-0.831469651765257), FRAC_CONST(-0.923879561784627), FRAC_CONST(-0.980785296392607) }; // w_array_imag[i] = sin(-2*M_PI*i/32) static const real_t w_array_imag[] = { FRAC_CONST(0.000000000000000), FRAC_CONST(-0.195090327375064), FRAC_CONST(-0.382683442461104), FRAC_CONST(-0.555570246648862), FRAC_CONST(-0.707106796640858), FRAC_CONST(-0.831469627480512), FRAC_CONST(-0.923879545057005), FRAC_CONST(-0.980785287864940), FRAC_CONST(-1.000000000000000), FRAC_CONST(-0.980785270809601), FRAC_CONST(-0.923879511601754), FRAC_CONST(-0.831469578911016), FRAC_CONST(-0.707106734823616), FRAC_CONST(-0.555570173959476), FRAC_CONST(-0.382683361692986), FRAC_CONST(-0.195090241632088) }; // FFT decimation in frequency // 4*16*2+16=128+16=144 multiplications // 6*16*2+10*8+4*16*2=192+80+128=400 additions static void fft_dif(real_t * Real, real_t * Imag) { real_t w_real, w_imag; // For faster access real_t point1_real, point1_imag, point2_real, point2_imag; // For faster access uint32_t j, i, i2, w_index; // Counters // First 2 stages of 32 point FFT decimation in frequency // 4*16*2=64*2=128 multiplications // 6*16*2=96*2=192 additions // Stage 1 of 32 point FFT decimation in frequency for (i = 0; i < 16; i++) { point1_real = Real[i]; point1_imag = Imag[i]; i2 = i+16; point2_real = Real[i2]; point2_imag = Imag[i2]; w_real = w_array_real[i]; w_imag = w_array_imag[i]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); } // Stage 2 of 32 point FFT decimation in frequency for (j = 0, w_index = 0; j < 8; j++, w_index += 2) { w_real = w_array_real[w_index]; w_imag = w_array_imag[w_index]; i = j; point1_real = Real[i]; point1_imag = Imag[i]; i2 = i+8; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); i = j+16; point1_real = Real[i]; point1_imag = Imag[i]; i2 = i+8; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = (MUL_F(point1_real,w_real) - MUL_F(point1_imag,w_imag)); Imag[i2] = (MUL_F(point1_real,w_imag) + MUL_F(point1_imag,w_real)); } // Stage 3 of 32 point FFT decimation in frequency // 2*4*2=16 multiplications // 4*4*2+6*4*2=10*8=80 additions for (i = 0; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // out[i1] = point1 + point2 Real[i] += point2_real; Imag[i] += point2_imag; // out[i2] = point1 - point2 Real[i2] = point1_real - point2_real; Imag[i2] = point1_imag - point2_imag; } w_real = w_array_real[4]; // = sqrt(2)/2 // w_imag = -w_real; // = w_array_imag[4]; // = -sqrt(2)/2 for (i = 1; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = MUL_F(point1_real+point1_imag, w_real); Imag[i2] = MUL_F(point1_imag-point1_real, w_real); } for (i = 2; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // x[i] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * (-i) Real[i2] = point1_imag - point2_imag; Imag[i2] = point2_real - point1_real; } w_real = w_array_real[12]; // = -sqrt(2)/2 // w_imag = w_real; // = w_array_imag[12]; // = -sqrt(2)/2 for (i = 3; i < n; i += 8) { i2 = i+4; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // temp1 = x[i] - x[i2] point1_real -= point2_real; point1_imag -= point2_imag; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * w Real[i2] = MUL_F(point1_real-point1_imag, w_real); Imag[i2] = MUL_F(point1_real+point1_imag, w_real); } // Stage 4 of 32 point FFT decimation in frequency (no multiplications) // 16*4=64 additions for (i = 0; i < n; i += 4) { i2 = i+2; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // x[i1] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = x[i] - x[i2] Real[i2] = point1_real - point2_real; Imag[i2] = point1_imag - point2_imag; } for (i = 1; i < n; i += 4) { i2 = i+2; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // x[i] = x[i] + x[i2] Real[i] += point2_real; Imag[i] += point2_imag; // x[i2] = (x[i] - x[i2]) * (-i) Real[i2] = point1_imag - point2_imag; Imag[i2] = point2_real - point1_real; } // Stage 5 of 32 point FFT decimation in frequency (no multiplications) // 16*4=64 additions for (i = 0; i < n; i += 2) { i2 = i+1; point1_real = Real[i]; point1_imag = Imag[i]; point2_real = Real[i2]; point2_imag = Imag[i2]; // out[i1] = point1 + point2 Real[i] += point2_real; Imag[i] += point2_imag; // out[i2] = point1 - point2 Real[i2] = point1_real - point2_real; Imag[i2] = point1_imag - point2_imag; } #ifdef REORDER_IN_FFT FFTReorder(Real, Imag); #endif // #ifdef REORDER_IN_FFT } #undef n #undef log2n static const real_t dct4_64_tab[] = { COEF_CONST(0.999924719333649), COEF_CONST(0.998118102550507), COEF_CONST(0.993906974792480), COEF_CONST(0.987301409244537), COEF_CONST(0.978317379951477), COEF_CONST(0.966976463794708), COEF_CONST(0.953306019306183), COEF_CONST(0.937339007854462), COEF_CONST(0.919113874435425), COEF_CONST(0.898674488067627), COEF_CONST(0.876070082187653), COEF_CONST(0.851355195045471), COEF_CONST(0.824589252471924), COEF_CONST(0.795836925506592), COEF_CONST(0.765167236328125), COEF_CONST(0.732654273509979), COEF_CONST(0.698376238346100), COEF_CONST(0.662415742874146), COEF_CONST(0.624859452247620), COEF_CONST(0.585797846317291), COEF_CONST(0.545324981212616), COEF_CONST(0.503538429737091), COEF_CONST(0.460538715124130), COEF_CONST(0.416429549455643), COEF_CONST(0.371317148208618), COEF_CONST(0.325310230255127), COEF_CONST(0.278519600629807), COEF_CONST(0.231058135628700), COEF_CONST(0.183039888739586), COEF_CONST(0.134580686688423), COEF_CONST(0.085797272622585), COEF_CONST(0.036807164549828), COEF_CONST(-1.012196302413940), COEF_CONST(-1.059438824653626), COEF_CONST(-1.104129195213318), COEF_CONST(-1.146159529685974), COEF_CONST(-1.185428738594055), COEF_CONST(-1.221842169761658), COEF_CONST(-1.255311965942383), COEF_CONST(-1.285757660865784), COEF_CONST(-1.313105940818787), COEF_CONST(-1.337290763854981), COEF_CONST(-1.358253836631775), COEF_CONST(-1.375944852828980), COEF_CONST(-1.390321016311646), COEF_CONST(-1.401347875595093), COEF_CONST(-1.408998727798462), COEF_CONST(-1.413255214691162), COEF_CONST(-1.414107084274292), COEF_CONST(-1.411552190780640), COEF_CONST(-1.405596733093262), COEF_CONST(-1.396255016326904), COEF_CONST(-1.383549690246582), COEF_CONST(-1.367511272430420), COEF_CONST(-1.348178386688232), COEF_CONST(-1.325597524642944), COEF_CONST(-1.299823284149170), COEF_CONST(-1.270917654037476), COEF_CONST(-1.238950133323669), COEF_CONST(-1.203998088836670), COEF_CONST(-1.166145324707031), COEF_CONST(-1.125483393669128), COEF_CONST(-1.082109928131104), COEF_CONST(-1.036129593849182), COEF_CONST(-0.987653195858002), COEF_CONST(-0.936797380447388), COEF_CONST(-0.883684754371643), COEF_CONST(-0.828443288803101), COEF_CONST(-0.771206021308899), COEF_CONST(-0.712110757827759), COEF_CONST(-0.651300072669983), COEF_CONST(-0.588920354843140), COEF_CONST(-0.525121808052063), COEF_CONST(-0.460058242082596), COEF_CONST(-0.393886327743530), COEF_CONST(-0.326765477657318), COEF_CONST(-0.258857429027557), COEF_CONST(-0.190325915813446), COEF_CONST(-0.121335685253143), COEF_CONST(-0.052053272724152), COEF_CONST(0.017354607582092), COEF_CONST(0.086720645427704), COEF_CONST(0.155877828598022), COEF_CONST(0.224659323692322), COEF_CONST(0.292899727821350), COEF_CONST(0.360434412956238), COEF_CONST(0.427100926637650), COEF_CONST(0.492738455533981), COEF_CONST(0.557188928127289), COEF_CONST(0.620297133922577), COEF_CONST(0.681910991668701), COEF_CONST(0.741881847381592), COEF_CONST(0.800065577030182), COEF_CONST(0.856321990489960), COEF_CONST(0.910515367984772), COEF_CONST(0.962515234947205), COEF_CONST(1.000000000000000), COEF_CONST(0.998795449733734), COEF_CONST(0.995184719562531), COEF_CONST(0.989176511764526), COEF_CONST(0.980785250663757), COEF_CONST(0.970031261444092), COEF_CONST(0.956940352916718), COEF_CONST(0.941544055938721), COEF_CONST(0.923879504203796), COEF_CONST(0.903989315032959), COEF_CONST(0.881921231746674), COEF_CONST(0.857728600502014), COEF_CONST(0.831469595432281), COEF_CONST(0.803207516670227), COEF_CONST(0.773010432720184), COEF_CONST(0.740951120853424), COEF_CONST(0.707106769084930), COEF_CONST(0.671558916568756), COEF_CONST(0.634393274784088), COEF_CONST(0.595699310302734), COEF_CONST(0.555570185184479), COEF_CONST(0.514102697372437), COEF_CONST(0.471396654844284), COEF_CONST(0.427555114030838), COEF_CONST(0.382683426141739), COEF_CONST(0.336889833211899), COEF_CONST(0.290284633636475), COEF_CONST(0.242980122566223), COEF_CONST(0.195090234279633), COEF_CONST(0.146730497479439), COEF_CONST(0.098017133772373), COEF_CONST(0.049067649990320), COEF_CONST(-1.000000000000000), COEF_CONST(-1.047863125801086), COEF_CONST(-1.093201875686646), COEF_CONST(-1.135906934738159), COEF_CONST(-1.175875544548035), COEF_CONST(-1.213011503219605), COEF_CONST(-1.247225046157837), COEF_CONST(-1.278433918952942), COEF_CONST(-1.306562900543213), COEF_CONST(-1.331544399261475), COEF_CONST(-1.353317975997925), COEF_CONST(-1.371831417083740), COEF_CONST(-1.387039899826050), COEF_CONST(-1.398906826972961), COEF_CONST(-1.407403707504273), COEF_CONST(-1.412510156631470), COEF_CONST(0), COEF_CONST(-1.412510156631470), COEF_CONST(-1.407403707504273), COEF_CONST(-1.398906826972961), COEF_CONST(-1.387039899826050), COEF_CONST(-1.371831417083740), COEF_CONST(-1.353317975997925), COEF_CONST(-1.331544399261475), COEF_CONST(-1.306562900543213), COEF_CONST(-1.278433918952942), COEF_CONST(-1.247225046157837), COEF_CONST(-1.213011384010315), COEF_CONST(-1.175875544548035), COEF_CONST(-1.135907053947449), COEF_CONST(-1.093201875686646), COEF_CONST(-1.047863125801086), COEF_CONST(-1.000000000000000), COEF_CONST(-0.949727773666382), COEF_CONST(-0.897167563438416), COEF_CONST(-0.842446029186249), COEF_CONST(-0.785694956779480), COEF_CONST(-0.727051079273224), COEF_CONST(-0.666655659675598), COEF_CONST(-0.604654192924500), COEF_CONST(-0.541196048259735), COEF_CONST(-0.476434230804443), COEF_CONST(-0.410524487495422), COEF_CONST(-0.343625843524933), COEF_CONST(-0.275899350643158), COEF_CONST(-0.207508206367493), COEF_CONST(-0.138617098331451), COEF_CONST(-0.069392144680023), COEF_CONST(0), COEF_CONST(0.069392263889313), COEF_CONST(0.138617157936096), COEF_CONST(0.207508206367493), COEF_CONST(0.275899469852448), COEF_CONST(0.343625962734222), COEF_CONST(0.410524636507034), COEF_CONST(0.476434201002121), COEF_CONST(0.541196107864380), COEF_CONST(0.604654192924500), COEF_CONST(0.666655719280243), COEF_CONST(0.727051138877869), COEF_CONST(0.785695075988770), COEF_CONST(0.842446029186249), COEF_CONST(0.897167563438416), COEF_CONST(0.949727773666382) }; /* size 64 only! */ void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag) { // Tables with bit reverse values for 5 bits, bit reverse of i at i-th position const uint8_t bit_rev_tab[32] = { 0,16,8,24,4,20,12,28,2,18,10,26,6,22,14,30,1,17,9,25,5,21,13,29,3,19,11,27,7,23,15,31 }; uint32_t i, i_rev; /* Step 2: modulate */ // 3*32=96 multiplications // 3*32=96 additions for (i = 0; i < 32; i++) { real_t x_re, x_im, tmp; x_re = in_real[i]; x_im = in_imag[i]; tmp = MUL_C(x_re + x_im, dct4_64_tab[i]); in_real[i] = MUL_C(x_im, dct4_64_tab[i + 64]) + tmp; in_imag[i] = MUL_C(x_re, dct4_64_tab[i + 32]) + tmp; } /* Step 3: FFT, but with output in bit reverse order */ fft_dif(in_real, in_imag); /* Step 4: modulate + bitreverse reordering */ // 3*31+2=95 multiplications // 3*31+2=95 additions for (i = 0; i < 16; i++) { real_t x_re, x_im, tmp; i_rev = bit_rev_tab[i]; x_re = in_real[i_rev]; x_im = in_imag[i_rev]; tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; } // i = 16, i_rev = 1 = rev(16); out_imag[16] = MUL_C(in_imag[1] - in_real[1], dct4_64_tab[16 + 3*32]); out_real[16] = MUL_C(in_real[1] + in_imag[1], dct4_64_tab[16 + 3*32]); for (i = 17; i < 32; i++) { real_t x_re, x_im, tmp; i_rev = bit_rev_tab[i]; x_re = in_real[i_rev]; x_im = in_imag[i_rev]; tmp = MUL_C(x_re + x_im, dct4_64_tab[i + 3*32]); out_real[i] = MUL_C(x_im, dct4_64_tab[i + 5*32]) + tmp; out_imag[i] = MUL_C(x_re, dct4_64_tab[i + 4*32]) + tmp; } } #endif #endif faad2-2.11.2/libfaad/sbr_dct.h000066400000000000000000000033361476153623600157470ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_dct.h,v 1.19 2007/11/01 12:33:34 menno Exp $ **/ #ifndef __SBR_DCT_H__ #define __SBR_DCT_H__ #ifdef __cplusplus extern "C" { #endif void dct4_kernel(real_t * in_real, real_t * in_imag, real_t * out_real, real_t * out_imag); void DCT3_32_unscaled(real_t *y, real_t *x); void DCT4_32(real_t *y, real_t *x); void DST4_32(real_t *y, real_t *x); void DCT2_32_unscaled(real_t *y, real_t *x); void DCT4_16(real_t *y, real_t *x); void DCT2_16_unscaled(real_t *y, real_t *x); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_dec.c000066400000000000000000000443251476153623600157260ustar00rootroot00000000000000/* ** 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 "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); #define INVALID ((uint8_t)-1) 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 = INVALID; if (framelength == 960) { sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS_960; sbr->numTimeSlots = NO_TIME_SLOTS_960; } else if (framelength == 1024) { sbr->numTimeSlotsRate = RATE * NO_TIME_SLOTS; sbr->numTimeSlots = NO_TIME_SLOTS; } else { faad_free(sbr); return NULL; } sbr->GQ_ringbuf_index[0] = 0; sbr->GQ_ringbuf_index[1] = 0; if (id_aac == ID_CPE) { /* stereo */ uint8_t j; sbr->qmfa[0] = qmfa_init(32); sbr->qmfa[1] = qmfa_init(32); sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); for (j = 0; j < 5; j++) { sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); sbr->G_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); sbr->Q_temp_prev[1][j] = faad_malloc(64*sizeof(real_t)); } memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); } else { /* mono */ uint8_t j; sbr->qmfa[0] = qmfa_init(32); sbr->qmfs[0] = qmfs_init((downSampledSBR)?32:64); sbr->qmfs[1] = NULL; for (j = 0; j < 5; j++) { sbr->G_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); sbr->Q_temp_prev[0][j] = faad_malloc(64*sizeof(real_t)); } memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); } return sbr; } void sbrDecodeEnd(sbr_info *sbr) { uint8_t j; if (sbr) { qmfa_end(sbr->qmfa[0]); qmfs_end(sbr->qmfs[0]); if (sbr->qmfs[1] != NULL) { qmfa_end(sbr->qmfa[1]); qmfs_end(sbr->qmfs[1]); } for (j = 0; j < 5; j++) { if (sbr->G_temp_prev[0][j]) faad_free(sbr->G_temp_prev[0][j]); if (sbr->Q_temp_prev[0][j]) faad_free(sbr->Q_temp_prev[0][j]); if (sbr->G_temp_prev[1][j]) faad_free(sbr->G_temp_prev[1][j]); if (sbr->Q_temp_prev[1][j]) faad_free(sbr->Q_temp_prev[1][j]); } #ifdef PS_DEC if (sbr->ps != NULL) ps_free(sbr->ps); #endif #ifdef DRM_PS if (sbr->drm_ps != NULL) drm_ps_free(sbr->drm_ps); #endif faad_free(sbr); } } void sbrReset(sbr_info *sbr) { uint8_t j; if (sbr->qmfa[0] != NULL) memset(sbr->qmfa[0]->x, 0, 2 * sbr->qmfa[0]->channels * 10 * sizeof(real_t)); if (sbr->qmfa[1] != NULL) memset(sbr->qmfa[1]->x, 0, 2 * sbr->qmfa[1]->channels * 10 * sizeof(real_t)); if (sbr->qmfs[0] != NULL) memset(sbr->qmfs[0]->v, 0, 2 * sbr->qmfs[0]->channels * 20 * sizeof(real_t)); if (sbr->qmfs[1] != NULL) memset(sbr->qmfs[1]->v, 0, 2 * sbr->qmfs[1]->channels * 20 * sizeof(real_t)); for (j = 0; j < 5; j++) { if (sbr->G_temp_prev[0][j] != NULL) memset(sbr->G_temp_prev[0][j], 0, 64*sizeof(real_t)); if (sbr->G_temp_prev[1][j] != NULL) memset(sbr->G_temp_prev[1][j], 0, 64*sizeof(real_t)); if (sbr->Q_temp_prev[0][j] != NULL) memset(sbr->Q_temp_prev[0][j], 0, 64*sizeof(real_t)); if (sbr->Q_temp_prev[1][j] != NULL) memset(sbr->Q_temp_prev[1][j], 0, 64*sizeof(real_t)); } memset(sbr->Xsbr[0], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); memset(sbr->Xsbr[1], 0, (sbr->numTimeSlotsRate+sbr->tHFGen)*64 * sizeof(qmf_t)); sbr->GQ_ringbuf_index[0] = 0; sbr->GQ_ringbuf_index[1] = 0; sbr->header_count = 0; sbr->Reset = 1; sbr->L_E_prev[0] = 0; sbr->L_E_prev[1] = 0; sbr->bs_freq_scale = 2; sbr->bs_alter_scale = 1; sbr->bs_noise_bands = 2; sbr->bs_limiter_bands = 2; sbr->bs_limiter_gains = 2; sbr->bs_interpol_freq = 1; sbr->bs_smoothing_mode = 1; sbr->bs_start_freq = 5; sbr->bs_amp_res = 1; sbr->bs_samplerate_mode = 1; sbr->prevEnvIsShort[0] = -1; sbr->prevEnvIsShort[1] = -1; sbr->bsco = 0; sbr->bsco_prev = 0; sbr->M_prev = 0; sbr->bs_start_freq_prev = INVALID; 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; (void)downSampledSBR; /* TODO: remove parameter? */ #ifdef SBR_LOW_POWER ALIGN real_t deg[64]; #endif #ifdef DRM if (sbr->Is_DRM_SBR) { sbr->bsco = (uint8_t)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_NTSRHFG][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 = INVALID; } 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_NTSRHFG][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 = INVALID; } 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[MAX_NTSRHFG][64] = {{{0}}}; ALIGN qmf_t X_right[MAX_NTSRHFG][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 = INVALID; } if (just_seeked) { sbr->just_seeked = 1; } else { sbr->just_seeked = 0; } if (sbr->qmfs[1] == NULL) { sbr->qmfs[1] = qmfs_init((downSampledSBR)?32:64); } sbr->ret += sbr_process_channel(sbr, left_channel, X_left, 0, dont_process, downSampledSBR); /* copy some extra data for PS */ for (l = sbr->numTimeSlotsRate; l < sbr->numTimeSlotsRate + 6; l++) { for (k = 0; k < 5; k++) { QMF_RE(X_left[l][k]) = QMF_RE(sbr->Xsbr[0][sbr->tHFAdj+l][k]); QMF_IM(X_left[l][k]) = QMF_IM(sbr->Xsbr[0][sbr->tHFAdj+l][k]); } } /* perform parametric stereo */ #ifdef DRM_PS if (sbr->Is_DRM_SBR) { drm_ps_decode(sbr->drm_ps, (sbr->ret > 0), X_left, X_right); } else { #endif #ifdef PS_DEC ps_decode(sbr->ps, X_left, X_right); #endif #ifdef DRM_PS } #endif /* subband synthesis */ if (downSampledSBR) { sbr_qmf_synthesis_32(sbr, sbr->qmfs[0], X_left, left_channel); sbr_qmf_synthesis_32(sbr, sbr->qmfs[1], X_right, right_channel); } else { sbr_qmf_synthesis_64(sbr, sbr->qmfs[0], X_left, left_channel); sbr_qmf_synthesis_64(sbr, sbr->qmfs[1], X_right, right_channel); } if (sbr->bs_header_flag) sbr->just_seeked = 0; if (sbr->header_count != 0 && sbr->ret == 0) { ret = sbr_save_prev_data(sbr, 0); if (ret) return ret; } sbr_save_matrix(sbr, 0); sbr->frame++; return 0; } #endif #endif faad2-2.11.2/libfaad/sbr_dec.h000066400000000000000000000144421476153623600157300ustar00rootroot00000000000000/* ** 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]; 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]; int8_t GQ_ringbuf_index[2]; 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; uint32_t frame; uint32_t header_count; qmfa_info *qmfa[2]; qmfs_info *qmfs[2]; qmf_t Xsbr[2][MAX_NTSRHFG][64]; #if defined(DRM) && defined(DRM_PS) drm_ps_info *drm_ps; #endif #ifdef PS_DEC ps_info *ps; #endif uint8_t numTimeSlotsRate; uint8_t numTimeSlots; uint8_t tHFGen; uint8_t tHFAdj; #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]; uint8_t Reset; uint8_t id_aac; #ifdef DRM uint8_t Is_DRM_SBR; #endif } sbr_info; sbr_info *sbrDecodeInit(uint16_t framelength, uint8_t id_aac, uint32_t sample_rate, uint8_t downSampledSBR #ifdef DRM , uint8_t IsDRM #endif ); void sbrDecodeEnd(sbr_info *sbr); void sbrReset(sbr_info *sbr); uint8_t sbrDecodeCoupleFrame(sbr_info *sbr, real_t *left_chan, real_t *right_chan, const uint8_t just_seeked, const uint8_t downSampledSBR); uint8_t sbrDecodeSingleFrame(sbr_info *sbr, real_t *channel, const uint8_t just_seeked, const uint8_t downSampledSBR); #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t sbrDecodeSingleFramePS(sbr_info *sbr, real_t *left_channel, real_t *right_channel, const uint8_t just_seeked, const uint8_t downSampledSBR); #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_e_nf.c000066400000000000000000001416431476153623600161030ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_e_nf.c,v 1.22 2008/03/23 23:03:29 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include #include "sbr_syntax.h" #include "sbr_e_nf.h" void extract_envelope_data(sbr_info *sbr, uint8_t ch) { uint8_t l, k; for (l = 0; l < sbr->L_E[ch]; l++) { if (sbr->bs_df_env[ch][l] == 0) { for (k = 1; k < sbr->n[sbr->f[ch][l]]; k++) { sbr->E[ch][k][l] = sbr->E[ch][k - 1][l] + sbr->E[ch][k][l]; if (sbr->E[ch][k][l] < 0) sbr->E[ch][k][l] = 0; } } else { /* bs_df_env == 1 */ uint8_t g = (l == 0) ? sbr->f_prev[ch] : sbr->f[ch][l-1]; int16_t E_prev; if (sbr->f[ch][l] == g) { for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { if (l == 0) E_prev = sbr->E_prev[ch][k]; else E_prev = sbr->E[ch][k][l - 1]; sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; } } else if ((g == 1) && (sbr->f[ch][l] == 0)) { uint8_t i; for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { for (i = 0; i < sbr->N_high; i++) { if (sbr->f_table_res[HI_RES][i] == sbr->f_table_res[LO_RES][k]) { if (l == 0) E_prev = sbr->E_prev[ch][i]; else E_prev = sbr->E[ch][i][l - 1]; sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; } } } } else if ((g == 0) && (sbr->f[ch][l] == 1)) { uint8_t i; for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { for (i = 0; i < sbr->N_low; i++) { if ((sbr->f_table_res[LO_RES][i] <= sbr->f_table_res[HI_RES][k]) && (sbr->f_table_res[HI_RES][k] < sbr->f_table_res[LO_RES][i + 1])) { if (l == 0) E_prev = sbr->E_prev[ch][i]; else E_prev = sbr->E[ch][i][l - 1]; sbr->E[ch][k][l] = E_prev + sbr->E[ch][k][l]; } } } } } } } void extract_noise_floor_data(sbr_info *sbr, uint8_t ch) { uint8_t l, k; for (l = 0; l < sbr->L_Q[ch]; l++) { if (sbr->bs_df_noise[ch][l] == 0) { for (k = 1; k < sbr->N_Q; k++) { sbr->Q[ch][k][l] = sbr->Q[ch][k][l] + sbr->Q[ch][k-1][l]; } } else { if (l == 0) { for (k = 0; k < sbr->N_Q; k++) { sbr->Q[ch][k][l] = sbr->Q_prev[ch][k] + sbr->Q[ch][k][0]; } } else { for (k = 0; k < sbr->N_Q; k++) { sbr->Q[ch][k][l] = sbr->Q[ch][k][l - 1] + sbr->Q[ch][k][l]; } } } } } #ifndef FIXED_POINT /* table for Q_div values when no coupling */ static const real_t Q_div_tab[31] = { FRAC_CONST(0.0153846), FRAC_CONST(0.030303), FRAC_CONST(0.0588235), FRAC_CONST(0.111111), FRAC_CONST(0.2), FRAC_CONST(0.333333), FRAC_CONST(0.5), FRAC_CONST(0.666667), FRAC_CONST(0.8), FRAC_CONST(0.888889), FRAC_CONST(0.941176), FRAC_CONST(0.969697), FRAC_CONST(0.984615), FRAC_CONST(0.992248), FRAC_CONST(0.996109), FRAC_CONST(0.998051), FRAC_CONST(0.999024), FRAC_CONST(0.999512), FRAC_CONST(0.999756), FRAC_CONST(0.999878), FRAC_CONST(0.999939), FRAC_CONST(0.999969), FRAC_CONST(0.999985), FRAC_CONST(0.999992), FRAC_CONST(0.999996), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }; static const real_t Q_div_tab_left[31][13] = { { FRAC_CONST(0.969704), FRAC_CONST(0.888985), FRAC_CONST(0.667532), FRAC_CONST(0.336788), FRAC_CONST(0.117241), FRAC_CONST(0.037594), FRAC_CONST(0.0153846), FRAC_CONST(0.00967118), FRAC_CONST(0.00823245), FRAC_CONST(0.00787211), FRAC_CONST(0.00778198), FRAC_CONST(0.00775945), FRAC_CONST(0.00775382) }, { FRAC_CONST(0.984619), FRAC_CONST(0.94123), FRAC_CONST(0.800623), FRAC_CONST(0.503876), FRAC_CONST(0.209877), FRAC_CONST(0.0724638), FRAC_CONST(0.030303), FRAC_CONST(0.0191571), FRAC_CONST(0.0163305), FRAC_CONST(0.0156212), FRAC_CONST(0.0154438), FRAC_CONST(0.0153994), FRAC_CONST(0.0153883) }, { FRAC_CONST(0.99225), FRAC_CONST(0.969726), FRAC_CONST(0.889273), FRAC_CONST(0.670103), FRAC_CONST(0.346939), FRAC_CONST(0.135135), FRAC_CONST(0.0588235), FRAC_CONST(0.037594), FRAC_CONST(0.0321361), FRAC_CONST(0.0307619), FRAC_CONST(0.0304178), FRAC_CONST(0.0303317), FRAC_CONST(0.0303102) }, { FRAC_CONST(0.99611), FRAC_CONST(0.98463), FRAC_CONST(0.941392), FRAC_CONST(0.802469), FRAC_CONST(0.515152), FRAC_CONST(0.238095), FRAC_CONST(0.111111), FRAC_CONST(0.0724638), FRAC_CONST(0.0622711), FRAC_CONST(0.0596878), FRAC_CONST(0.0590397), FRAC_CONST(0.0588776), FRAC_CONST(0.058837) }, { FRAC_CONST(0.998051), FRAC_CONST(0.992256), FRAC_CONST(0.969811), FRAC_CONST(0.890411), FRAC_CONST(0.68), FRAC_CONST(0.384615), FRAC_CONST(0.2), FRAC_CONST(0.135135), FRAC_CONST(0.117241), FRAC_CONST(0.112652), FRAC_CONST(0.111497), FRAC_CONST(0.111208), FRAC_CONST(0.111135) }, { FRAC_CONST(0.999025), FRAC_CONST(0.996113), FRAC_CONST(0.984674), FRAC_CONST(0.942029), FRAC_CONST(0.809524), FRAC_CONST(0.555556), FRAC_CONST(0.333333), FRAC_CONST(0.238095), FRAC_CONST(0.209877), FRAC_CONST(0.202492), FRAC_CONST(0.200625), FRAC_CONST(0.200156), FRAC_CONST(0.200039) }, { FRAC_CONST(0.999512), FRAC_CONST(0.998053), FRAC_CONST(0.992278), FRAC_CONST(0.970149), FRAC_CONST(0.894737), FRAC_CONST(0.714286), FRAC_CONST(0.5), FRAC_CONST(0.384615), FRAC_CONST(0.346939), FRAC_CONST(0.336788), FRAC_CONST(0.3342), FRAC_CONST(0.33355), FRAC_CONST(0.333388) }, { FRAC_CONST(0.999756), FRAC_CONST(0.999025), FRAC_CONST(0.996124), FRAC_CONST(0.984848), FRAC_CONST(0.944444), FRAC_CONST(0.833333), FRAC_CONST(0.666667), FRAC_CONST(0.555556), FRAC_CONST(0.515152), FRAC_CONST(0.503876), FRAC_CONST(0.500975), FRAC_CONST(0.500244), FRAC_CONST(0.500061) }, { FRAC_CONST(0.999878), FRAC_CONST(0.999512), FRAC_CONST(0.998058), FRAC_CONST(0.992366), FRAC_CONST(0.971429), FRAC_CONST(0.909091), FRAC_CONST(0.8), FRAC_CONST(0.714286), FRAC_CONST(0.68), FRAC_CONST(0.670103), FRAC_CONST(0.667532), FRAC_CONST(0.666884), FRAC_CONST(0.666721) }, { FRAC_CONST(0.999939), FRAC_CONST(0.999756), FRAC_CONST(0.999028), FRAC_CONST(0.996169), FRAC_CONST(0.985507), FRAC_CONST(0.952381), FRAC_CONST(0.888889), FRAC_CONST(0.833333), FRAC_CONST(0.809524), FRAC_CONST(0.802469), FRAC_CONST(0.800623), FRAC_CONST(0.800156), FRAC_CONST(0.800039) }, { FRAC_CONST(0.999969), FRAC_CONST(0.999878), FRAC_CONST(0.999514), FRAC_CONST(0.998081), FRAC_CONST(0.992701), FRAC_CONST(0.97561), FRAC_CONST(0.941176), FRAC_CONST(0.909091), FRAC_CONST(0.894737), FRAC_CONST(0.890411), FRAC_CONST(0.889273), FRAC_CONST(0.888985), FRAC_CONST(0.888913) }, { FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.999757), FRAC_CONST(0.999039), FRAC_CONST(0.996337), FRAC_CONST(0.987654), FRAC_CONST(0.969697), FRAC_CONST(0.952381), FRAC_CONST(0.944444), FRAC_CONST(0.942029), FRAC_CONST(0.941392), FRAC_CONST(0.94123), FRAC_CONST(0.94119) }, { FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999878), FRAC_CONST(0.999519), FRAC_CONST(0.998165), FRAC_CONST(0.993789), FRAC_CONST(0.984615), FRAC_CONST(0.97561), FRAC_CONST(0.971429), FRAC_CONST(0.970149), FRAC_CONST(0.969811), FRAC_CONST(0.969726), FRAC_CONST(0.969704) }, { FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999939), FRAC_CONST(0.99976), FRAC_CONST(0.999082), FRAC_CONST(0.996885), FRAC_CONST(0.992248), FRAC_CONST(0.987654), FRAC_CONST(0.985507), FRAC_CONST(0.984848), FRAC_CONST(0.984674), FRAC_CONST(0.98463), FRAC_CONST(0.984619) }, { FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.99988), FRAC_CONST(0.999541), FRAC_CONST(0.99844), FRAC_CONST(0.996109), FRAC_CONST(0.993789), FRAC_CONST(0.992701), FRAC_CONST(0.992366), FRAC_CONST(0.992278), FRAC_CONST(0.992256), FRAC_CONST(0.99225) }, { FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.99994), FRAC_CONST(0.99977), FRAC_CONST(0.999219), FRAC_CONST(0.998051), FRAC_CONST(0.996885), FRAC_CONST(0.996337), FRAC_CONST(0.996169), FRAC_CONST(0.996124), FRAC_CONST(0.996113), FRAC_CONST(0.99611) }, { FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.99997), FRAC_CONST(0.999885), FRAC_CONST(0.99961), FRAC_CONST(0.999024), FRAC_CONST(0.99844), FRAC_CONST(0.998165), FRAC_CONST(0.998081), FRAC_CONST(0.998058), FRAC_CONST(0.998053), FRAC_CONST(0.998051) }, { FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999985), FRAC_CONST(0.999943), FRAC_CONST(0.999805), FRAC_CONST(0.999512), FRAC_CONST(0.999219), FRAC_CONST(0.999082), FRAC_CONST(0.999039), FRAC_CONST(0.999028), FRAC_CONST(0.999025), FRAC_CONST(0.999025) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999992), FRAC_CONST(0.999971), FRAC_CONST(0.999902), FRAC_CONST(0.999756), FRAC_CONST(0.99961), FRAC_CONST(0.999541), FRAC_CONST(0.999519), FRAC_CONST(0.999514), FRAC_CONST(0.999512), FRAC_CONST(0.999512) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999986), FRAC_CONST(0.999951), FRAC_CONST(0.999878), FRAC_CONST(0.999805), FRAC_CONST(0.99977), FRAC_CONST(0.99976), FRAC_CONST(0.999757), FRAC_CONST(0.999756), FRAC_CONST(0.999756) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999993), FRAC_CONST(0.999976), FRAC_CONST(0.999939), FRAC_CONST(0.999902), FRAC_CONST(0.999885), FRAC_CONST(0.99988), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999996), FRAC_CONST(0.999988), FRAC_CONST(0.999969), FRAC_CONST(0.999951), FRAC_CONST(0.999943), FRAC_CONST(0.99994), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999994), FRAC_CONST(0.999985), FRAC_CONST(0.999976), FRAC_CONST(0.999971), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999969) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999997), FRAC_CONST(0.999992), FRAC_CONST(0.999988), FRAC_CONST(0.999986), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999998), FRAC_CONST(0.999996), FRAC_CONST(0.999994), FRAC_CONST(0.999993), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999997), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } }; static const real_t Q_div_tab_right[31][13] = { { FRAC_CONST(0.00775382), FRAC_CONST(0.00775945), FRAC_CONST(0.00778198), FRAC_CONST(0.00787211), FRAC_CONST(0.00823245), FRAC_CONST(0.00967118), FRAC_CONST(0.0153846), FRAC_CONST(0.037594), FRAC_CONST(0.117241), FRAC_CONST(0.336788), FRAC_CONST(0.667532), FRAC_CONST(0.888985), FRAC_CONST(0.969704) }, { FRAC_CONST(0.0153883), FRAC_CONST(0.0153994), FRAC_CONST(0.0154438), FRAC_CONST(0.0156212), FRAC_CONST(0.0163305), FRAC_CONST(0.0191571), FRAC_CONST(0.030303), FRAC_CONST(0.0724638), FRAC_CONST(0.209877), FRAC_CONST(0.503876), FRAC_CONST(0.800623), FRAC_CONST(0.94123), FRAC_CONST(0.984619) }, { FRAC_CONST(0.0303102), FRAC_CONST(0.0303317), FRAC_CONST(0.0304178), FRAC_CONST(0.0307619), FRAC_CONST(0.0321361), FRAC_CONST(0.037594), FRAC_CONST(0.0588235), FRAC_CONST(0.135135), FRAC_CONST(0.346939), FRAC_CONST(0.670103), FRAC_CONST(0.889273), FRAC_CONST(0.969726), FRAC_CONST(0.99225) }, { FRAC_CONST(0.058837), FRAC_CONST(0.0588776), FRAC_CONST(0.0590397), FRAC_CONST(0.0596878), FRAC_CONST(0.0622711), FRAC_CONST(0.0724638), FRAC_CONST(0.111111), FRAC_CONST(0.238095), FRAC_CONST(0.515152), FRAC_CONST(0.802469), FRAC_CONST(0.941392), FRAC_CONST(0.98463), FRAC_CONST(0.99611) }, { FRAC_CONST(0.111135), FRAC_CONST(0.111208), FRAC_CONST(0.111497), FRAC_CONST(0.112652), FRAC_CONST(0.117241), FRAC_CONST(0.135135), FRAC_CONST(0.2), FRAC_CONST(0.384615), FRAC_CONST(0.68), FRAC_CONST(0.890411), FRAC_CONST(0.969811), FRAC_CONST(0.992256), FRAC_CONST(0.998051) }, { FRAC_CONST(0.200039), FRAC_CONST(0.200156), FRAC_CONST(0.200625), FRAC_CONST(0.202492), FRAC_CONST(0.209877), FRAC_CONST(0.238095), FRAC_CONST(0.333333), FRAC_CONST(0.555556), FRAC_CONST(0.809524), FRAC_CONST(0.942029), FRAC_CONST(0.984674), FRAC_CONST(0.996113), FRAC_CONST(0.999025) }, { FRAC_CONST(0.333388), FRAC_CONST(0.33355), FRAC_CONST(0.3342), FRAC_CONST(0.336788), FRAC_CONST(0.346939), FRAC_CONST(0.384615), FRAC_CONST(0.5), FRAC_CONST(0.714286), FRAC_CONST(0.894737), FRAC_CONST(0.970149), FRAC_CONST(0.992278), FRAC_CONST(0.998053), FRAC_CONST(0.999512) }, { FRAC_CONST(0.500061), FRAC_CONST(0.500244), FRAC_CONST(0.500975), FRAC_CONST(0.503876), FRAC_CONST(0.515152), FRAC_CONST(0.555556), FRAC_CONST(0.666667), FRAC_CONST(0.833333), FRAC_CONST(0.944444), FRAC_CONST(0.984848), FRAC_CONST(0.996124), FRAC_CONST(0.999025), FRAC_CONST(0.999756) }, { FRAC_CONST(0.666721), FRAC_CONST(0.666884), FRAC_CONST(0.667532), FRAC_CONST(0.670103), FRAC_CONST(0.68), FRAC_CONST(0.714286), FRAC_CONST(0.8), FRAC_CONST(0.909091), FRAC_CONST(0.971429), FRAC_CONST(0.992366), FRAC_CONST(0.998058), FRAC_CONST(0.999512), FRAC_CONST(0.999878) }, { FRAC_CONST(0.800039), FRAC_CONST(0.800156), FRAC_CONST(0.800623), FRAC_CONST(0.802469), FRAC_CONST(0.809524), FRAC_CONST(0.833333), FRAC_CONST(0.888889), FRAC_CONST(0.952381), FRAC_CONST(0.985507), FRAC_CONST(0.996169), FRAC_CONST(0.999028), FRAC_CONST(0.999756), FRAC_CONST(0.999939) }, { FRAC_CONST(0.888913), FRAC_CONST(0.888985), FRAC_CONST(0.889273), FRAC_CONST(0.890411), FRAC_CONST(0.894737), FRAC_CONST(0.909091), FRAC_CONST(0.941176), FRAC_CONST(0.97561), FRAC_CONST(0.992701), FRAC_CONST(0.998081), FRAC_CONST(0.999514), FRAC_CONST(0.999878), FRAC_CONST(0.999969) }, { FRAC_CONST(0.94119), FRAC_CONST(0.94123), FRAC_CONST(0.941392), FRAC_CONST(0.942029), FRAC_CONST(0.944444), FRAC_CONST(0.952381), FRAC_CONST(0.969697), FRAC_CONST(0.987654), FRAC_CONST(0.996337), FRAC_CONST(0.999039), FRAC_CONST(0.999757), FRAC_CONST(0.999939), FRAC_CONST(0.999985) }, { FRAC_CONST(0.969704), FRAC_CONST(0.969726), FRAC_CONST(0.969811), FRAC_CONST(0.970149), FRAC_CONST(0.971429), FRAC_CONST(0.97561), FRAC_CONST(0.984615), FRAC_CONST(0.993789), FRAC_CONST(0.998165), FRAC_CONST(0.999519), FRAC_CONST(0.999878), FRAC_CONST(0.99997), FRAC_CONST(0.999992) }, { FRAC_CONST(0.984619), FRAC_CONST(0.98463), FRAC_CONST(0.984674), FRAC_CONST(0.984848), FRAC_CONST(0.985507), FRAC_CONST(0.987654), FRAC_CONST(0.992248), FRAC_CONST(0.996885), FRAC_CONST(0.999082), FRAC_CONST(0.99976), FRAC_CONST(0.999939), FRAC_CONST(0.999985), FRAC_CONST(0.999996) }, { FRAC_CONST(0.99225), FRAC_CONST(0.992256), FRAC_CONST(0.992278), FRAC_CONST(0.992366), FRAC_CONST(0.992701), FRAC_CONST(0.993789), FRAC_CONST(0.996109), FRAC_CONST(0.99844), FRAC_CONST(0.999541), FRAC_CONST(0.99988), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998) }, { FRAC_CONST(0.99611), FRAC_CONST(0.996113), FRAC_CONST(0.996124), FRAC_CONST(0.996169), FRAC_CONST(0.996337), FRAC_CONST(0.996885), FRAC_CONST(0.998051), FRAC_CONST(0.999219), FRAC_CONST(0.99977), FRAC_CONST(0.99994), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999) }, { FRAC_CONST(0.998051), FRAC_CONST(0.998053), FRAC_CONST(0.998058), FRAC_CONST(0.998081), FRAC_CONST(0.998165), FRAC_CONST(0.99844), FRAC_CONST(0.999024), FRAC_CONST(0.99961), FRAC_CONST(0.999885), FRAC_CONST(0.99997), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1) }, { FRAC_CONST(0.999025), FRAC_CONST(0.999025), FRAC_CONST(0.999028), FRAC_CONST(0.999039), FRAC_CONST(0.999082), FRAC_CONST(0.999219), FRAC_CONST(0.999512), FRAC_CONST(0.999805), FRAC_CONST(0.999943), FRAC_CONST(0.999985), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1) }, { FRAC_CONST(0.999512), FRAC_CONST(0.999512), FRAC_CONST(0.999514), FRAC_CONST(0.999519), FRAC_CONST(0.999541), FRAC_CONST(0.99961), FRAC_CONST(0.999756), FRAC_CONST(0.999902), FRAC_CONST(0.999971), FRAC_CONST(0.999992), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999756), FRAC_CONST(0.999756), FRAC_CONST(0.999757), FRAC_CONST(0.99976), FRAC_CONST(0.99977), FRAC_CONST(0.999805), FRAC_CONST(0.999878), FRAC_CONST(0.999951), FRAC_CONST(0.999986), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.999878), FRAC_CONST(0.99988), FRAC_CONST(0.999885), FRAC_CONST(0.999902), FRAC_CONST(0.999939), FRAC_CONST(0.999976), FRAC_CONST(0.999993), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.999939), FRAC_CONST(0.99994), FRAC_CONST(0.999943), FRAC_CONST(0.999951), FRAC_CONST(0.999969), FRAC_CONST(0.999988), FRAC_CONST(0.999996), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999969), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.99997), FRAC_CONST(0.999971), FRAC_CONST(0.999976), FRAC_CONST(0.999985), FRAC_CONST(0.999994), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999985), FRAC_CONST(0.999986), FRAC_CONST(0.999988), FRAC_CONST(0.999992), FRAC_CONST(0.999997), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999992), FRAC_CONST(0.999993), FRAC_CONST(0.999994), FRAC_CONST(0.999996), FRAC_CONST(0.999998), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999996), FRAC_CONST(0.999997), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999998), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(0.999999), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }, { FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) } }; /* calculates 1/(1+Q) */ /* [0..1] */ static real_t calc_Q_div(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) { if (sbr->bs_coupling) { /* left channel */ if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) { return 0; } else { /* the pan parameter is always even */ if (ch == 0) { return Q_div_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } else { return Q_div_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } } } else { /* no coupling */ if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) { return 0; } else { return Q_div_tab[sbr->Q[ch][m][l]]; } } } /* table for Q_div2 values when no coupling */ static const real_t Q_div2_tab[31] = { FRAC_CONST(0.984615), FRAC_CONST(0.969697), FRAC_CONST(0.941176), FRAC_CONST(0.888889), FRAC_CONST(0.8), FRAC_CONST(0.666667), FRAC_CONST(0.5), FRAC_CONST(0.333333), FRAC_CONST(0.2), FRAC_CONST(0.111111), FRAC_CONST(0.0588235), FRAC_CONST(0.030303), FRAC_CONST(0.0153846), FRAC_CONST(0.00775194), FRAC_CONST(0.00389105), FRAC_CONST(0.00194932), FRAC_CONST(0.00097561), FRAC_CONST(0.000488043), FRAC_CONST(0.000244081), FRAC_CONST(0.000122055), FRAC_CONST(6.10314E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(1.52586E-005), FRAC_CONST(7.62934E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(1.90734E-006), FRAC_CONST(9.53673E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(2.38419E-007), FRAC_CONST(1.19209E-007), FRAC_CONST(5.96046E-008) }; static const real_t Q_div2_tab_left[31][13] = { { FRAC_CONST(0.0302959), FRAC_CONST(0.111015), FRAC_CONST(0.332468), FRAC_CONST(0.663212), FRAC_CONST(0.882759), FRAC_CONST(0.962406), FRAC_CONST(0.984615), FRAC_CONST(0.990329), FRAC_CONST(0.991768), FRAC_CONST(0.992128), FRAC_CONST(0.992218), FRAC_CONST(0.992241), FRAC_CONST(0.992246) }, { FRAC_CONST(0.0153809), FRAC_CONST(0.0587695), FRAC_CONST(0.199377), FRAC_CONST(0.496124), FRAC_CONST(0.790123), FRAC_CONST(0.927536), FRAC_CONST(0.969697), FRAC_CONST(0.980843), FRAC_CONST(0.98367), FRAC_CONST(0.984379), FRAC_CONST(0.984556), FRAC_CONST(0.984601), FRAC_CONST(0.984612) }, { FRAC_CONST(0.00775006), FRAC_CONST(0.0302744), FRAC_CONST(0.110727), FRAC_CONST(0.329897), FRAC_CONST(0.653061), FRAC_CONST(0.864865), FRAC_CONST(0.941176), FRAC_CONST(0.962406), FRAC_CONST(0.967864), FRAC_CONST(0.969238), FRAC_CONST(0.969582), FRAC_CONST(0.969668), FRAC_CONST(0.96969) }, { FRAC_CONST(0.0038901), FRAC_CONST(0.0153698), FRAC_CONST(0.0586081), FRAC_CONST(0.197531), FRAC_CONST(0.484848), FRAC_CONST(0.761905), FRAC_CONST(0.888889), FRAC_CONST(0.927536), FRAC_CONST(0.937729), FRAC_CONST(0.940312), FRAC_CONST(0.94096), FRAC_CONST(0.941122), FRAC_CONST(0.941163) }, { FRAC_CONST(0.00194884), FRAC_CONST(0.00774443), FRAC_CONST(0.0301887), FRAC_CONST(0.109589), FRAC_CONST(0.32), FRAC_CONST(0.615385), FRAC_CONST(0.8), FRAC_CONST(0.864865), FRAC_CONST(0.882759), FRAC_CONST(0.887348), FRAC_CONST(0.888503), FRAC_CONST(0.888792), FRAC_CONST(0.888865) }, { FRAC_CONST(0.000975372), FRAC_CONST(0.00388727), FRAC_CONST(0.0153257), FRAC_CONST(0.057971), FRAC_CONST(0.190476), FRAC_CONST(0.444444), FRAC_CONST(0.666667), FRAC_CONST(0.761905), FRAC_CONST(0.790123), FRAC_CONST(0.797508), FRAC_CONST(0.799375), FRAC_CONST(0.799844), FRAC_CONST(0.799961) }, { FRAC_CONST(0.000487924), FRAC_CONST(0.00194742), FRAC_CONST(0.00772201), FRAC_CONST(0.0298507), FRAC_CONST(0.105263), FRAC_CONST(0.285714), FRAC_CONST(0.5), FRAC_CONST(0.615385), FRAC_CONST(0.653061), FRAC_CONST(0.663212), FRAC_CONST(0.6658), FRAC_CONST(0.66645), FRAC_CONST(0.666612) }, { FRAC_CONST(0.000244021), FRAC_CONST(0.000974659), FRAC_CONST(0.00387597), FRAC_CONST(0.0151515), FRAC_CONST(0.0555556), FRAC_CONST(0.166667), FRAC_CONST(0.333333), FRAC_CONST(0.444444), FRAC_CONST(0.484848), FRAC_CONST(0.496124), FRAC_CONST(0.499025), FRAC_CONST(0.499756), FRAC_CONST(0.499939) }, { FRAC_CONST(0.000122026), FRAC_CONST(0.000487567), FRAC_CONST(0.00194175), FRAC_CONST(0.00763359), FRAC_CONST(0.0285714), FRAC_CONST(0.0909091), FRAC_CONST(0.2), FRAC_CONST(0.285714), FRAC_CONST(0.32), FRAC_CONST(0.329897), FRAC_CONST(0.332468), FRAC_CONST(0.333116), FRAC_CONST(0.333279) }, { FRAC_CONST(6.10165E-005), FRAC_CONST(0.000243843), FRAC_CONST(0.000971817), FRAC_CONST(0.00383142), FRAC_CONST(0.0144928), FRAC_CONST(0.047619), FRAC_CONST(0.111111), FRAC_CONST(0.166667), FRAC_CONST(0.190476), FRAC_CONST(0.197531), FRAC_CONST(0.199377), FRAC_CONST(0.199844), FRAC_CONST(0.199961) }, { FRAC_CONST(3.05092E-005), FRAC_CONST(0.000121936), FRAC_CONST(0.000486145), FRAC_CONST(0.00191939), FRAC_CONST(0.00729927), FRAC_CONST(0.0243902), FRAC_CONST(0.0588235), FRAC_CONST(0.0909091), FRAC_CONST(0.105263), FRAC_CONST(0.109589), FRAC_CONST(0.110727), FRAC_CONST(0.111015), FRAC_CONST(0.111087) }, { FRAC_CONST(1.52548E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(0.000243132), FRAC_CONST(0.000960615), FRAC_CONST(0.003663), FRAC_CONST(0.0123457), FRAC_CONST(0.030303), FRAC_CONST(0.047619), FRAC_CONST(0.0555556), FRAC_CONST(0.057971), FRAC_CONST(0.0586081), FRAC_CONST(0.0587695), FRAC_CONST(0.05881) }, { FRAC_CONST(7.62747E-006), FRAC_CONST(3.04869E-005), FRAC_CONST(0.000121581), FRAC_CONST(0.000480538), FRAC_CONST(0.00183486), FRAC_CONST(0.00621118), FRAC_CONST(0.0153846), FRAC_CONST(0.0243902), FRAC_CONST(0.0285714), FRAC_CONST(0.0298507), FRAC_CONST(0.0301887), FRAC_CONST(0.0302744), FRAC_CONST(0.0302959) }, { FRAC_CONST(3.81375E-006), FRAC_CONST(1.52437E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(0.000240327), FRAC_CONST(0.000918274), FRAC_CONST(0.00311526), FRAC_CONST(0.00775194), FRAC_CONST(0.0123457), FRAC_CONST(0.0144928), FRAC_CONST(0.0151515), FRAC_CONST(0.0153257), FRAC_CONST(0.0153698), FRAC_CONST(0.0153809) }, { FRAC_CONST(1.90688E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(3.03979E-005), FRAC_CONST(0.000120178), FRAC_CONST(0.000459348), FRAC_CONST(0.00156006), FRAC_CONST(0.00389105), FRAC_CONST(0.00621118), FRAC_CONST(0.00729927), FRAC_CONST(0.00763359), FRAC_CONST(0.00772201), FRAC_CONST(0.00774443), FRAC_CONST(0.00775006) }, { FRAC_CONST(9.53441E-007), FRAC_CONST(3.81096E-006), FRAC_CONST(1.51992E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(0.000229727), FRAC_CONST(0.00078064), FRAC_CONST(0.00194932), FRAC_CONST(0.00311526), FRAC_CONST(0.003663), FRAC_CONST(0.00383142), FRAC_CONST(0.00387597), FRAC_CONST(0.00388727), FRAC_CONST(0.0038901) }, { FRAC_CONST(4.76721E-007), FRAC_CONST(1.90548E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(3.00472E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000390472), FRAC_CONST(0.00097561), FRAC_CONST(0.00156006), FRAC_CONST(0.00183486), FRAC_CONST(0.00191939), FRAC_CONST(0.00194175), FRAC_CONST(0.00194742), FRAC_CONST(0.00194884) }, { FRAC_CONST(2.3836E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(3.79984E-006), FRAC_CONST(1.50238E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(0.000195274), FRAC_CONST(0.000488043), FRAC_CONST(0.00078064), FRAC_CONST(0.000918274), FRAC_CONST(0.000960615), FRAC_CONST(0.000971817), FRAC_CONST(0.000974659), FRAC_CONST(0.000975372) }, { FRAC_CONST(1.1918E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(1.89992E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(2.87216E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000244081), FRAC_CONST(0.000390472), FRAC_CONST(0.000459348), FRAC_CONST(0.000480538), FRAC_CONST(0.000486145), FRAC_CONST(0.000487567), FRAC_CONST(0.000487924) }, { FRAC_CONST(5.95901E-008), FRAC_CONST(2.38186E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(3.756E-006), FRAC_CONST(1.4361E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(0.000122055), FRAC_CONST(0.000195274), FRAC_CONST(0.000229727), FRAC_CONST(0.000240327), FRAC_CONST(0.000243132), FRAC_CONST(0.000243843), FRAC_CONST(0.000244021) }, { FRAC_CONST(2.9795E-008), FRAC_CONST(1.19093E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(1.878E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(2.44135E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(9.76467E-005), FRAC_CONST(0.000114877), FRAC_CONST(0.000120178), FRAC_CONST(0.000121581), FRAC_CONST(0.000121936), FRAC_CONST(0.000122026) }, { FRAC_CONST(1.48975E-008), FRAC_CONST(5.95465E-008), FRAC_CONST(2.37491E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(3.59029E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.10165E-005) }, { FRAC_CONST(7.44876E-009), FRAC_CONST(2.97732E-008), FRAC_CONST(1.18745E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(1.79515E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(1.52586E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.05092E-005) }, { FRAC_CONST(3.72438E-009), FRAC_CONST(1.48866E-008), FRAC_CONST(5.93727E-008), FRAC_CONST(2.34751E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(3.05175E-006), FRAC_CONST(7.62934E-006), FRAC_CONST(1.22069E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.52548E-005) }, { FRAC_CONST(1.86219E-009), FRAC_CONST(7.44331E-009), FRAC_CONST(2.96864E-008), FRAC_CONST(1.17375E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.62747E-006) }, { FRAC_CONST(9.31095E-010), FRAC_CONST(3.72166E-009), FRAC_CONST(1.48432E-008), FRAC_CONST(5.86876E-008), FRAC_CONST(2.24394E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(1.90734E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.81375E-006) }, { FRAC_CONST(4.65548E-010), FRAC_CONST(1.86083E-009), FRAC_CONST(7.42159E-009), FRAC_CONST(2.93438E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(9.53673E-007), FRAC_CONST(1.52588E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.90688E-006) }, { FRAC_CONST(2.32774E-010), FRAC_CONST(9.30414E-010), FRAC_CONST(3.71079E-009), FRAC_CONST(1.46719E-008), FRAC_CONST(5.60985E-008), FRAC_CONST(1.90735E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.53441E-007) }, { FRAC_CONST(1.16387E-010), FRAC_CONST(4.65207E-010), FRAC_CONST(1.8554E-009), FRAC_CONST(7.33596E-009), FRAC_CONST(2.80492E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(2.38419E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.76721E-007) }, { FRAC_CONST(5.81935E-011), FRAC_CONST(2.32603E-010), FRAC_CONST(9.27699E-010), FRAC_CONST(3.66798E-009), FRAC_CONST(1.40246E-008), FRAC_CONST(4.76837E-008), FRAC_CONST(1.19209E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.3836E-007) }, { FRAC_CONST(2.90967E-011), FRAC_CONST(1.16302E-010), FRAC_CONST(4.63849E-010), FRAC_CONST(1.83399E-009), FRAC_CONST(7.01231E-009), FRAC_CONST(2.38419E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(9.53674E-008), FRAC_CONST(1.12197E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.1918E-007) } }; static const real_t Q_div2_tab_right[31][13] = { { FRAC_CONST(0.992246), FRAC_CONST(0.992241), FRAC_CONST(0.992218), FRAC_CONST(0.992128), FRAC_CONST(0.991768), FRAC_CONST(0.990329), FRAC_CONST(0.984615), FRAC_CONST(0.962406), FRAC_CONST(0.882759), FRAC_CONST(0.663212), FRAC_CONST(0.332468), FRAC_CONST(0.111015), FRAC_CONST(0.0302959) }, { FRAC_CONST(0.984612), FRAC_CONST(0.984601), FRAC_CONST(0.984556), FRAC_CONST(0.984379), FRAC_CONST(0.98367), FRAC_CONST(0.980843), FRAC_CONST(0.969697), FRAC_CONST(0.927536), FRAC_CONST(0.790123), FRAC_CONST(0.496124), FRAC_CONST(0.199377), FRAC_CONST(0.0587695), FRAC_CONST(0.0153809) }, { FRAC_CONST(0.96969), FRAC_CONST(0.969668), FRAC_CONST(0.969582), FRAC_CONST(0.969238), FRAC_CONST(0.967864), FRAC_CONST(0.962406), FRAC_CONST(0.941176), FRAC_CONST(0.864865), FRAC_CONST(0.653061), FRAC_CONST(0.329897), FRAC_CONST(0.110727), FRAC_CONST(0.0302744), FRAC_CONST(0.00775006) }, { FRAC_CONST(0.941163), FRAC_CONST(0.941122), FRAC_CONST(0.94096), FRAC_CONST(0.940312), FRAC_CONST(0.937729), FRAC_CONST(0.927536), FRAC_CONST(0.888889), FRAC_CONST(0.761905), FRAC_CONST(0.484848), FRAC_CONST(0.197531), FRAC_CONST(0.0586081), FRAC_CONST(0.0153698), FRAC_CONST(0.0038901) }, { FRAC_CONST(0.888865), FRAC_CONST(0.888792), FRAC_CONST(0.888503), FRAC_CONST(0.887348), FRAC_CONST(0.882759), FRAC_CONST(0.864865), FRAC_CONST(0.8), FRAC_CONST(0.615385), FRAC_CONST(0.32), FRAC_CONST(0.109589), FRAC_CONST(0.0301887), FRAC_CONST(0.00774443), FRAC_CONST(0.00194884) }, { FRAC_CONST(0.799961), FRAC_CONST(0.799844), FRAC_CONST(0.799375), FRAC_CONST(0.797508), FRAC_CONST(0.790123), FRAC_CONST(0.761905), FRAC_CONST(0.666667), FRAC_CONST(0.444444), FRAC_CONST(0.190476), FRAC_CONST(0.057971), FRAC_CONST(0.0153257), FRAC_CONST(0.00388727), FRAC_CONST(0.000975372) }, { FRAC_CONST(0.666612), FRAC_CONST(0.66645), FRAC_CONST(0.6658), FRAC_CONST(0.663212), FRAC_CONST(0.653061), FRAC_CONST(0.615385), FRAC_CONST(0.5), FRAC_CONST(0.285714), FRAC_CONST(0.105263), FRAC_CONST(0.0298507), FRAC_CONST(0.00772201), FRAC_CONST(0.00194742), FRAC_CONST(0.000487924) }, { FRAC_CONST(0.499939), FRAC_CONST(0.499756), FRAC_CONST(0.499025), FRAC_CONST(0.496124), FRAC_CONST(0.484848), FRAC_CONST(0.444444), FRAC_CONST(0.333333), FRAC_CONST(0.166667), FRAC_CONST(0.0555556), FRAC_CONST(0.0151515), FRAC_CONST(0.00387597), FRAC_CONST(0.000974659), FRAC_CONST(0.000244021) }, { FRAC_CONST(0.333279), FRAC_CONST(0.333116), FRAC_CONST(0.332468), FRAC_CONST(0.329897), FRAC_CONST(0.32), FRAC_CONST(0.285714), FRAC_CONST(0.2), FRAC_CONST(0.0909091), FRAC_CONST(0.0285714), FRAC_CONST(0.00763359), FRAC_CONST(0.00194175), FRAC_CONST(0.000487567), FRAC_CONST(0.000122026) }, { FRAC_CONST(0.199961), FRAC_CONST(0.199844), FRAC_CONST(0.199377), FRAC_CONST(0.197531), FRAC_CONST(0.190476), FRAC_CONST(0.166667), FRAC_CONST(0.111111), FRAC_CONST(0.047619), FRAC_CONST(0.0144928), FRAC_CONST(0.00383142), FRAC_CONST(0.000971817), FRAC_CONST(0.000243843), FRAC_CONST(6.10165E-005) }, { FRAC_CONST(0.111087), FRAC_CONST(0.111015), FRAC_CONST(0.110727), FRAC_CONST(0.109589), FRAC_CONST(0.105263), FRAC_CONST(0.0909091), FRAC_CONST(0.0588235), FRAC_CONST(0.0243902), FRAC_CONST(0.00729927), FRAC_CONST(0.00191939), FRAC_CONST(0.000486145), FRAC_CONST(0.000121936), FRAC_CONST(3.05092E-005) }, { FRAC_CONST(0.05881), FRAC_CONST(0.0587695), FRAC_CONST(0.0586081), FRAC_CONST(0.057971), FRAC_CONST(0.0555556), FRAC_CONST(0.047619), FRAC_CONST(0.030303), FRAC_CONST(0.0123457), FRAC_CONST(0.003663), FRAC_CONST(0.000960615), FRAC_CONST(0.000243132), FRAC_CONST(6.09719E-005), FRAC_CONST(1.52548E-005) }, { FRAC_CONST(0.0302959), FRAC_CONST(0.0302744), FRAC_CONST(0.0301887), FRAC_CONST(0.0298507), FRAC_CONST(0.0285714), FRAC_CONST(0.0243902), FRAC_CONST(0.0153846), FRAC_CONST(0.00621118), FRAC_CONST(0.00183486), FRAC_CONST(0.000480538), FRAC_CONST(0.000121581), FRAC_CONST(3.04869E-005), FRAC_CONST(7.62747E-006) }, { FRAC_CONST(0.0153809), FRAC_CONST(0.0153698), FRAC_CONST(0.0153257), FRAC_CONST(0.0151515), FRAC_CONST(0.0144928), FRAC_CONST(0.0123457), FRAC_CONST(0.00775194), FRAC_CONST(0.00311526), FRAC_CONST(0.000918274), FRAC_CONST(0.000240327), FRAC_CONST(6.0794E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(3.81375E-006) }, { FRAC_CONST(0.00775006), FRAC_CONST(0.00774443), FRAC_CONST(0.00772201), FRAC_CONST(0.00763359), FRAC_CONST(0.00729927), FRAC_CONST(0.00621118), FRAC_CONST(0.00389105), FRAC_CONST(0.00156006), FRAC_CONST(0.000459348), FRAC_CONST(0.000120178), FRAC_CONST(3.03979E-005), FRAC_CONST(7.62189E-006), FRAC_CONST(1.90688E-006) }, { FRAC_CONST(0.0038901), FRAC_CONST(0.00388727), FRAC_CONST(0.00387597), FRAC_CONST(0.00383142), FRAC_CONST(0.003663), FRAC_CONST(0.00311526), FRAC_CONST(0.00194932), FRAC_CONST(0.00078064), FRAC_CONST(0.000229727), FRAC_CONST(6.00925E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(3.81096E-006), FRAC_CONST(9.53441E-007) }, { FRAC_CONST(0.00194884), FRAC_CONST(0.00194742), FRAC_CONST(0.00194175), FRAC_CONST(0.00191939), FRAC_CONST(0.00183486), FRAC_CONST(0.00156006), FRAC_CONST(0.00097561), FRAC_CONST(0.000390472), FRAC_CONST(0.000114877), FRAC_CONST(3.00472E-005), FRAC_CONST(7.59965E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(4.76721E-007) }, { FRAC_CONST(0.000975372), FRAC_CONST(0.000974659), FRAC_CONST(0.000971817), FRAC_CONST(0.000960615), FRAC_CONST(0.000918274), FRAC_CONST(0.00078064), FRAC_CONST(0.000488043), FRAC_CONST(0.000195274), FRAC_CONST(5.74416E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(3.79984E-006), FRAC_CONST(9.52743E-007), FRAC_CONST(2.3836E-007) }, { FRAC_CONST(0.000487924), FRAC_CONST(0.000487567), FRAC_CONST(0.000486145), FRAC_CONST(0.000480538), FRAC_CONST(0.000459348), FRAC_CONST(0.000390472), FRAC_CONST(0.000244081), FRAC_CONST(9.76467E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(7.51196E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(4.76372E-007), FRAC_CONST(1.1918E-007) }, { FRAC_CONST(0.000244021), FRAC_CONST(0.000243843), FRAC_CONST(0.000243132), FRAC_CONST(0.000240327), FRAC_CONST(0.000229727), FRAC_CONST(0.000195274), FRAC_CONST(0.000122055), FRAC_CONST(4.88257E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(3.756E-006), FRAC_CONST(9.49963E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(5.95901E-008) }, { FRAC_CONST(0.000122026), FRAC_CONST(0.000121936), FRAC_CONST(0.000121581), FRAC_CONST(0.000120178), FRAC_CONST(0.000114877), FRAC_CONST(9.76467E-005), FRAC_CONST(6.10314E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(7.18056E-006), FRAC_CONST(1.878E-006), FRAC_CONST(4.74982E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(2.9795E-008) }, { FRAC_CONST(6.10165E-005), FRAC_CONST(6.09719E-005), FRAC_CONST(6.0794E-005), FRAC_CONST(6.00925E-005), FRAC_CONST(5.74416E-005), FRAC_CONST(4.88257E-005), FRAC_CONST(3.05166E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(3.59029E-006), FRAC_CONST(9.39002E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(5.95465E-008), FRAC_CONST(1.48975E-008) }, { FRAC_CONST(3.05092E-005), FRAC_CONST(3.04869E-005), FRAC_CONST(3.03979E-005), FRAC_CONST(3.00472E-005), FRAC_CONST(2.87216E-005), FRAC_CONST(2.44135E-005), FRAC_CONST(1.52586E-005), FRAC_CONST(6.10348E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(4.69501E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(2.97732E-008), FRAC_CONST(7.44876E-009) }, { FRAC_CONST(1.52548E-005), FRAC_CONST(1.52437E-005), FRAC_CONST(1.51992E-005), FRAC_CONST(1.50238E-005), FRAC_CONST(1.4361E-005), FRAC_CONST(1.22069E-005), FRAC_CONST(7.62934E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(8.97575E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(5.93727E-008), FRAC_CONST(1.48866E-008), FRAC_CONST(3.72438E-009) }, { FRAC_CONST(7.62747E-006), FRAC_CONST(7.62189E-006), FRAC_CONST(7.59965E-006), FRAC_CONST(7.51196E-006), FRAC_CONST(7.18056E-006), FRAC_CONST(6.10348E-006), FRAC_CONST(3.81468E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(4.48788E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(2.96864E-008), FRAC_CONST(7.44331E-009), FRAC_CONST(1.86219E-009) }, { FRAC_CONST(3.81375E-006), FRAC_CONST(3.81096E-006), FRAC_CONST(3.79984E-006), FRAC_CONST(3.756E-006), FRAC_CONST(3.59029E-006), FRAC_CONST(3.05175E-006), FRAC_CONST(1.90734E-006), FRAC_CONST(7.62939E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(5.86876E-008), FRAC_CONST(1.48432E-008), FRAC_CONST(3.72166E-009), FRAC_CONST(9.31095E-010) }, { FRAC_CONST(1.90688E-006), FRAC_CONST(1.90548E-006), FRAC_CONST(1.89992E-006), FRAC_CONST(1.878E-006), FRAC_CONST(1.79515E-006), FRAC_CONST(1.52588E-006), FRAC_CONST(9.53673E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(2.93438E-008), FRAC_CONST(7.42159E-009), FRAC_CONST(1.86083E-009), FRAC_CONST(4.65548E-010) }, { FRAC_CONST(9.53441E-007), FRAC_CONST(9.52743E-007), FRAC_CONST(9.49963E-007), FRAC_CONST(9.39002E-007), FRAC_CONST(8.97575E-007), FRAC_CONST(7.62939E-007), FRAC_CONST(4.76837E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(5.60985E-008), FRAC_CONST(1.46719E-008), FRAC_CONST(3.71079E-009), FRAC_CONST(9.30414E-010), FRAC_CONST(2.32774E-010) }, { FRAC_CONST(4.76721E-007), FRAC_CONST(4.76372E-007), FRAC_CONST(4.74982E-007), FRAC_CONST(4.69501E-007), FRAC_CONST(4.48788E-007), FRAC_CONST(3.8147E-007), FRAC_CONST(2.38419E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(2.80492E-008), FRAC_CONST(7.33596E-009), FRAC_CONST(1.8554E-009), FRAC_CONST(4.65207E-010), FRAC_CONST(1.16387E-010) }, { FRAC_CONST(2.3836E-007), FRAC_CONST(2.38186E-007), FRAC_CONST(2.37491E-007), FRAC_CONST(2.34751E-007), FRAC_CONST(2.24394E-007), FRAC_CONST(1.90735E-007), FRAC_CONST(1.19209E-007), FRAC_CONST(4.76837E-008), FRAC_CONST(1.40246E-008), FRAC_CONST(3.66798E-009), FRAC_CONST(9.27699E-010), FRAC_CONST(2.32603E-010), FRAC_CONST(5.81935E-011) }, { FRAC_CONST(1.1918E-007), FRAC_CONST(1.19093E-007), FRAC_CONST(1.18745E-007), FRAC_CONST(1.17375E-007), FRAC_CONST(1.12197E-007), FRAC_CONST(9.53674E-008), FRAC_CONST(5.96046E-008), FRAC_CONST(2.38419E-008), FRAC_CONST(7.01231E-009), FRAC_CONST(1.83399E-009), FRAC_CONST(4.63849E-010), FRAC_CONST(1.16302E-010), FRAC_CONST(2.90967E-011) } }; /* calculates Q/(1+Q) */ /* [0..1] */ static real_t calc_Q_div2(sbr_info *sbr, uint8_t ch, uint8_t m, uint8_t l) { if (sbr->bs_coupling) { if ((sbr->Q[0][m][l] < 0 || sbr->Q[0][m][l] > 30) || (sbr->Q[1][m][l] < 0 || sbr->Q[1][m][l] > 24 /* 2*panOffset(1) */)) { return 0; } else { /* the pan parameter is always even */ if (ch == 0) { return Q_div2_tab_left[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } else { return Q_div2_tab_right[sbr->Q[0][m][l]][sbr->Q[1][m][l] >> 1]; } } } else { /* no coupling */ if (sbr->Q[ch][m][l] < 0 || sbr->Q[ch][m][l] > 30) { return 0; } else { return Q_div2_tab[sbr->Q[ch][m][l]]; } } } static const real_t E_deq_tab[64] = { 64.0f, 128.0f, 256.0f, 512.0f, 1024.0f, 2048.0f, 4096.0f, 8192.0f, 16384.0f, 32768.0f, 65536.0f, 131072.0f, 262144.0f, 524288.0f, 1.04858E+006f, 2.09715E+006f, 4.1943E+006f, 8.38861E+006f, 1.67772E+007f, 3.35544E+007f, 6.71089E+007f, 1.34218E+008f, 2.68435E+008f, 5.36871E+008f, 1.07374E+009f, 2.14748E+009f, 4.29497E+009f, 8.58993E+009f, 1.71799E+010f, 3.43597E+010f, 6.87195E+010f, 1.37439E+011f, 2.74878E+011f, 5.49756E+011f, 1.09951E+012f, 2.19902E+012f, 4.39805E+012f, 8.79609E+012f, 1.75922E+013f, 3.51844E+013f, 7.03687E+013f, 1.40737E+014f, 2.81475E+014f, 5.6295E+014f, 1.1259E+015f, 2.2518E+015f, 4.5036E+015f, 9.0072E+015f, 1.80144E+016f, 3.60288E+016f, 7.20576E+016f, 1.44115E+017f, 2.8823E+017f, 5.76461E+017f, 1.15292E+018f, 2.30584E+018f, 4.61169E+018f, 9.22337E+018f, 1.84467E+019f, 3.68935E+019f, 7.3787E+019f, 1.47574E+020f, 2.95148E+020f, 5.90296E+020f }; void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch) { if (sbr->bs_coupling == 0) { int16_t exp; uint8_t l, k; uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; for (l = 0; l < sbr->L_E[ch]; l++) { for (k = 0; k < sbr->n[sbr->f[ch][l]]; k++) { /* +6 for the *64 and -10 for the /32 in the synthesis QMF (fixed) * since this is a energy value: (x/32)^2 = (x^2)/1024 */ /* exp = (sbr->E[ch][k][l] >> amp) + 6; */ exp = (sbr->E[ch][k][l] >> amp); if ((exp < 0) || (exp >= 64)) { sbr->E_orig[ch][k][l] = 0; } else { sbr->E_orig[ch][k][l] = E_deq_tab[exp]; /* save half the table size at the cost of 1 multiply */ if (amp && (sbr->E[ch][k][l] & 1)) { sbr->E_orig[ch][k][l] = MUL_C(sbr->E_orig[ch][k][l], COEF_CONST(1.414213562)); } } } } for (l = 0; l < sbr->L_Q[ch]; l++) { for (k = 0; k < sbr->N_Q; k++) { sbr->Q_div[ch][k][l] = calc_Q_div(sbr, ch, k, l); sbr->Q_div2[ch][k][l] = calc_Q_div2(sbr, ch, k, l); } } } } static const real_t E_pan_tab[25] = { FRAC_CONST(0.000244081), FRAC_CONST(0.000488043), FRAC_CONST(0.00097561), FRAC_CONST(0.00194932), FRAC_CONST(0.00389105), FRAC_CONST(0.00775194), FRAC_CONST(0.0153846), FRAC_CONST(0.030303), FRAC_CONST(0.0588235), FRAC_CONST(0.111111), FRAC_CONST(0.2), FRAC_CONST(0.333333), FRAC_CONST(0.5), FRAC_CONST(0.666667), FRAC_CONST(0.8), FRAC_CONST(0.888889), FRAC_CONST(0.941176), FRAC_CONST(0.969697), FRAC_CONST(0.984615), FRAC_CONST(0.992248), FRAC_CONST(0.996109), FRAC_CONST(0.998051), FRAC_CONST(0.999024), FRAC_CONST(0.999512), FRAC_CONST(0.999756) }; void unmap_envelope_noise(sbr_info *sbr) { real_t tmp; int16_t exp0, exp1; uint8_t l, k; uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; for (l = 0; l < sbr->L_E[0]; l++) { for (k = 0; k < sbr->n[sbr->f[0][l]]; k++) { /* +6: * 64 ; +1: * 2 ; */ exp0 = (sbr->E[0][k][l] >> amp0) + 1; /* UN_MAP removed: (x / 4096) same as (x >> 12) */ /* E[1] is always even so no need for compensating the divide by 2 with * an extra multiplication */ /* exp1 = (sbr->E[1][k][l] >> amp1) - 12; */ exp1 = (sbr->E[1][k][l] >> amp1); if ((exp0 < 0) || (exp0 >= 64) || (exp1 < 0) || (exp1 > 24)) { sbr->E_orig[1][k][l] = 0; sbr->E_orig[0][k][l] = 0; } else { tmp = E_deq_tab[exp0]; if (amp0 && (sbr->E[0][k][l] & 1)) { tmp = MUL_C(tmp, COEF_CONST(1.414213562)); } /* panning */ sbr->E_orig[0][k][l] = MUL_F(tmp, E_pan_tab[exp1]); sbr->E_orig[1][k][l] = MUL_F(tmp, E_pan_tab[24 - exp1]); } } } for (l = 0; l < sbr->L_Q[0]; l++) { for (k = 0; k < sbr->N_Q; k++) { sbr->Q_div[0][k][l] = calc_Q_div(sbr, 0, k, l); sbr->Q_div[1][k][l] = calc_Q_div(sbr, 1, k, l); sbr->Q_div2[0][k][l] = calc_Q_div2(sbr, 0, k, l); sbr->Q_div2[1][k][l] = calc_Q_div2(sbr, 1, k, l); } } } #endif #endif faad2-2.11.2/libfaad/sbr_e_nf.h000066400000000000000000000032061476153623600161000ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_e_nf.h,v 1.18 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_E_NF_H__ #define __SBR_E_NF_H__ #ifdef __cplusplus extern "C" { #endif void extract_envelope_data(sbr_info *sbr, uint8_t ch); void extract_noise_floor_data(sbr_info *sbr, uint8_t ch); #ifndef FIXED_POINT void envelope_noise_dequantisation(sbr_info *sbr, uint8_t ch); void unmap_envelope_noise(sbr_info *sbr); #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_fbt.c000066400000000000000000000573201476153623600157450ustar00rootroot00000000000000/* ** 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 int32cmp(const void *a, const void *b) { return ((int)(*(int32_t*)a - *(int32_t*)b)); } static int uint8cmp(const void *a, const void *b) { return ((int)(*(uint8_t*)a - *(uint8_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]), int32cmp); 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; int32_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 (void)bs_alter_scale; /* TODO: remove parameter? */ /* 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]), int32cmp); 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]), int32cmp); 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]), int32cmp); vk1[0] = k1; for (k = 1; k <= nrBand1; k++) { vk1[k] = vk1[k-1] + vDk1[k-1]; if (vDk1[k-1] == 0) return 1; } sbr->N_master = nrBand0 + nrBand1; sbr->N_master = min(sbr->N_master, 64); for (k = 0; k <= nrBand0; k++) { sbr->f_master[k] = (uint8_t) vk0[k]; } for (k = nrBand0 + 1; k <= sbr->N_master; k++) { sbr->f_master[k] = (uint8_t) vk1[k - nrBand0]; } #if 0 printf("f_master[%d]: ", sbr->N_master); for (k = 0; k <= sbr->N_master; k++) { printf("%d ", sbr->f_master[k]); } printf("\n"); #endif return 0; } /* calculate the derived frequency border tables from f_master */ uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, uint8_t k2) { uint8_t k, i; uint32_t minus; /* The following relation shall be satisfied: bs_xover_band < N_Master */ if (sbr->N_master <= bs_xover_band) return 1; sbr->N_high = sbr->N_master - bs_xover_band; sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1)); sbr->n[0] = sbr->N_low; sbr->n[1] = sbr->N_high; for (k = 0; k <= sbr->N_high; k++) { sbr->f_table_res[HI_RES][k] = sbr->f_master[k + bs_xover_band]; } sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0]; if (sbr->M > MAX_M) return 1; sbr->kx = sbr->f_table_res[HI_RES][0]; if (sbr->kx > 32) return 1; if (sbr->kx + sbr->M > 64) return 1; minus = (sbr->N_high & 1) ? 1 : 0; i = 0; for (k = 0; k <= sbr->N_low; k++) { if (k != 0) 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); } i = 0; for (k = 0; k <= sbr->N_Q; k++) { if (k != 0) 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++) { uint8_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]), uint8cmp); 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]), uint8cmp); nrLim--; goto restart; } } } /* remove kth element */ limTable[k] = sbr->f_table_res[LO_RES][sbr->N_low]; qsort(limTable, nrLim, sizeof(limTable[0]), uint8cmp); nrLim--; goto restart; } else { k++; goto restart; } } sbr->N_L[s] = nrLim; for (k = 0; k <= nrLim; k++) { sbr->f_table_lim[s][k] = limTable[k] - sbr->kx; } #if 0 printf("f_table_lim[%d][%d]: ", s, sbr->N_L[s]); for (k = 0; k <= sbr->N_L[s]; k++) { printf("%d ", sbr->f_table_lim[s][k]); } printf("\n"); #endif } } #endif faad2-2.11.2/libfaad/sbr_fbt.h000066400000000000000000000040641476153623600157470ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_fbt.h,v 1.18 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_FBT_H__ #define __SBR_FBT_H__ #ifdef __cplusplus extern "C" { #endif uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, uint32_t sample_rate); uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, uint8_t k0); uint8_t master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2, uint8_t bs_alter_scale); uint8_t master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2, uint8_t bs_freq_scale, uint8_t bs_alter_scale); uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, uint8_t k2); void limiter_frequency_table(sbr_info *sbr); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_hfadj.c000066400000000000000000002444301476153623600162460ustar00rootroot00000000000000/* ** 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 #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; (void)adj; /* TODO: remove parameter? */ #ifdef FIXED_POINT const real_t half = REAL_CONST(0.5); real_t limit; real_t mul; #else const real_t half = 0; /* Compiler is smart enough to eliminate +0 op. */ const real_t limit = FLT_MAX; #endif 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; #ifdef FIXED_POINT limit = div << (30 - (COEF_BITS - REAL_BITS)); mul = (1 << (COEF_BITS - REAL_BITS)) / div; #endif for (m = 0; m < sbr->M; m++) { nrg = 0; for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) { real_t re = QMF_RE(Xsbr[i][m + sbr->kx]) + half; real_t im = QMF_IM(Xsbr[i][m + sbr->kx]) + half; (void)im; /* Actually, that should be MUL_R. On floating-point build that is the same. On fixed point-build we use it to pre-scale result (to aviod overflow). That, of course causes some precision loss. */ nrg += MUL_C(re, re) #ifndef SBR_LOW_POWER + MUL_C(im, im) #endif ; } if (nrg < -limit || nrg > limit) return 1; #ifdef FIXED_POINT sbr->E_curr[ch][m][l] = nrg * mul; #else sbr->E_curr[ch][m][l] = nrg / div; #endif #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; #ifdef FIXED_POINT limit = div << (30 - (COEF_BITS - REAL_BITS)); mul = (1 << (COEF_BITS - REAL_BITS)) / div; #endif for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) { for (j = k_l; j < k_h; j++) { real_t re = QMF_RE(Xsbr[i][j]) + half; real_t im = QMF_IM(Xsbr[i][j]) + half; (void)im; /* Actually, that should be MUL_R. On floating-point build that is the same. On fixed point-build we use it to pre-scale result (to aviod overflow). That, of course causes some precision loss. */ nrg += MUL_C(re, re) #ifndef SBR_LOW_POWER + MUL_C(im, im) #endif ; } } if (nrg < -limit || nrg > limit) return 1; #ifdef FIXED_POINT sbr->E_curr[ch][k - sbr->kx][l] = nrg * mul; #else sbr->E_curr[ch][k - sbr->kx][l] = nrg / div; #endif #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) }; // pan_log2_tab[X] = log2(2**X + 1) - X static const real_t pan_log2_tab[13] = { 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) }; 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) { int16_t e = sbr->E[0][k][l]; int16_t E = sbr->E[1][k][l]; uint8_t amp0 = (sbr->amp_res[0]) ? 0 : 1; uint8_t amp1 = (sbr->amp_res[1]) ? 0 : 1; real_t tmp, pan; /* E[1] should always be even so shifting is OK */ E >>= amp1; if (e < 0 || e >= 64 || E < 0 || E > 24) return LOG2_MIN_INF; E -= 12; if (ch != 0) // L/R anti-symmetry E = -E; if (E >= 0) { /* negative */ pan = pan_log2_tab[E]; } else { /* positive */ pan = pan_log2_tab[-E] + ((-E)<E[ch][k][l]; uint8_t amp = (sbr->amp_res[ch]) ? 0 : 1; if (e < 0 || (e >> amp) >= 64) return LOG2_MIN_INF; return 6 * REAL_PRECISION + e * (REAL_PRECISION >> 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) { int32_t q = sbr->Q[0][k][l]; int32_t Q = sbr->Q[1][k][l]; real_t tmp, pan; if (q < 0 || q > 30 || Q < 0 || Q > 24) return LOG2_MIN_INF; Q -= 12; if (ch != 0) // L/R anti-symmetry Q = -Q; if (Q >= 0) { /* negative */ pan = pan_log2_tab[Q]; } else { /* positive */ pan = pan_log2_tab[-Q] + ((-Q)<Q[ch][k][l]; if (q < 0 || q > 30) return LOG2_MIN_INF; return (6 - q) * REAL_PRECISION; } } 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 */ /* Last one less than log2(1e10) due to FIXED POINT float limitations */ static real_t limGain[] = { REAL_CONST(-1.0), REAL_CONST(0.0), REAL_CONST(1.0), REAL_CONST(21.0) }; 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]; real_t exp = REAL_CONST(-10); 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; uint64_t den = 0, acc1 = 0, acc2 = 0; uint8_t current_res_band_size = 0; uint8_t Q_M_size = 0; real_t log_e, log_den, log_acc1, log_acc2; uint8_t ml1, ml2; /* bounds of current limiter bands */ ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; if (ml1 > MAX_M) ml1 = MAX_M; if (ml2 > MAX_M) ml2 = MAX_M; /* calculate the accumulated E_orig and E_curr over the limiter band */ for (m = ml1; m < ml2; m++) { if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { current_res_band_size++; } else { log_e = find_log2_E(sbr, current_res_band, l, ch); acc1 += pow2_int(exp + log2_int_tab[current_res_band_size] + log_e); current_res_band++; current_res_band_size = 1; } acc2 += sbr->E_curr[ch][m][l]; } if (current_res_band_size) { log_e = find_log2_E(sbr, current_res_band, l, ch); acc1 += pow2_int(exp + log2_int_tab[current_res_band_size] + log_e); } if (acc1 == 0) log_acc1 = LOG2_MIN_INF; else log_acc1 = log2_int(acc1); if (acc2 == 0) log_acc2 = LOG2_MIN_INF; else log_acc2 = log2_int(acc2); /* calculate the maximum gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G_max = log_acc1 - log_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 = exp + 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; S_M[m] = min(S_M[m], limGain[3]); /* 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 exp */ G = E_orig - max(exp, 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); } if (den == 0) log_den = LOG2_MIN_INF; else log_den = log2_int(den /*+ EPS*/); /* calculate the final gain */ /* G_boost: [0..2.51188643] */ G_boost = log_acc1 - log_den; 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); adj->S_M_boost[l][m] = pow2_fix((S_M[m] + G_boost) >> 1); } } } } #else //#define LOG2_TEST #ifdef LOG2_TEST #define LOG2_MIN_INF -100000 __inline float pow2(float val) { return pow(2.0, val); } __inline float log2(float val) { return log(val)/log(2.0); } #define RB 14 float QUANTISE2REAL(float val) { __int32 ival = (__int32)(val * (1<bs_coupling == 1) { real_t amp0 = (sbr->amp_res[0]) ? 1.0 : 0.5; real_t amp1 = (sbr->amp_res[1]) ? 1.0 : 0.5; float tmp = QUANTISE2REAL(7.0 + (real_t)sbr->E[0][k][l] * amp0); float pan; int E = (int)(sbr->E[1][k][l] * amp1); if (ch == 0) { if (E > 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-12 + E]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[12 - E] + (12 - E)); } } else { if (E < 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-E + 12]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[E - 12] + (E - 12)); } } /* tmp / pan in log2 */ return QUANTISE2REAL(tmp - pan); } else { real_t amp = (sbr->amp_res[ch]) ? 1.0 : 0.5; return QUANTISE2REAL(6.0 + (real_t)sbr->E[ch][k][l] * amp); } } static real_t find_log2_Q(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { float tmp = QUANTISE2REAL(7.0 - (real_t)sbr->Q[0][k][l]); float pan; int Q = (int)(sbr->Q[1][k][l]); if (ch == 0) { if (Q > 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-12 + Q]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[12 - Q] + (12 - Q)); } } else { if (Q < 12) { /* negative */ pan = QUANTISE2REAL(pan_log2_tab[-Q + 12]); } else { /* positive */ pan = QUANTISE2REAL(pan_log2_tab[Q - 12] + (Q - 12)); } } /* tmp / pan in log2 */ return QUANTISE2REAL(tmp - pan); } else { return QUANTISE2REAL(6.0 - (real_t)sbr->Q[ch][k][l]); } } static const real_t log_Qplus1_pan[31][13] = { { REAL_CONST(0.044383447617292), REAL_CONST(0.169768601655960), REAL_CONST(0.583090126514435), REAL_CONST(1.570089221000671), REAL_CONST(3.092446088790894), REAL_CONST(4.733354568481445), REAL_CONST(6.022367954254150), REAL_CONST(6.692092418670654), REAL_CONST(6.924463272094727), REAL_CONST(6.989034175872803), REAL_CONST(7.005646705627441), REAL_CONST(7.009829998016357), REAL_CONST(7.010877609252930) }, { REAL_CONST(0.022362394258380), REAL_CONST(0.087379962205887), REAL_CONST(0.320804953575134), REAL_CONST(0.988859415054321), REAL_CONST(2.252387046813965), REAL_CONST(3.786596298217773), REAL_CONST(5.044394016265869), REAL_CONST(5.705977916717529), REAL_CONST(5.936291694641113), REAL_CONST(6.000346660614014), REAL_CONST(6.016829967498779), REAL_CONST(6.020981311798096), REAL_CONST(6.022020816802979) }, { REAL_CONST(0.011224525049329), REAL_CONST(0.044351425021887), REAL_CONST(0.169301137328148), REAL_CONST(0.577544987201691), REAL_CONST(1.527246952056885), REAL_CONST(2.887525320053101), REAL_CONST(4.087462902069092), REAL_CONST(4.733354568481445), REAL_CONST(4.959661006927490), REAL_CONST(5.022709369659424), REAL_CONST(5.038940429687500), REAL_CONST(5.043028831481934), REAL_CONST(5.044052600860596) }, { REAL_CONST(0.005623178556561), REAL_CONST(0.022346137091517), REAL_CONST(0.087132595479488), REAL_CONST(0.317482173442841), REAL_CONST(0.956931233406067), REAL_CONST(2.070389270782471), REAL_CONST(3.169924974441528), REAL_CONST(3.786596298217773), REAL_CONST(4.005294322967529), REAL_CONST(4.066420555114746), REAL_CONST(4.082170009613037), REAL_CONST(4.086137294769287), REAL_CONST(4.087131500244141) }, { REAL_CONST(0.002814328996465), REAL_CONST(0.011216334067285), REAL_CONST(0.044224001467228), REAL_CONST(0.167456731200218), REAL_CONST(0.556393325328827), REAL_CONST(1.378511548042297), REAL_CONST(2.321928024291992), REAL_CONST(2.887525320053101), REAL_CONST(3.092446088790894), REAL_CONST(3.150059700012207), REAL_CONST(3.164926528930664), REAL_CONST(3.168673276901245), REAL_CONST(3.169611930847168) }, { REAL_CONST(0.001407850766554), REAL_CONST(0.005619067233056), REAL_CONST(0.022281449288130), REAL_CONST(0.086156636476517), REAL_CONST(0.304854571819305), REAL_CONST(0.847996890544891), REAL_CONST(1.584962487220764), REAL_CONST(2.070389270782471), REAL_CONST(2.252387046813965), REAL_CONST(2.304061651229858), REAL_CONST(2.317430257797241), REAL_CONST(2.320801734924316), REAL_CONST(2.321646213531494) }, { REAL_CONST(0.000704097095877), REAL_CONST(0.002812269143760), REAL_CONST(0.011183738708496), REAL_CONST(0.043721374124289), REAL_CONST(0.160464659333229), REAL_CONST(0.485426813364029), REAL_CONST(1.000000000000000), REAL_CONST(1.378511548042297), REAL_CONST(1.527246952056885), REAL_CONST(1.570089221000671), REAL_CONST(1.581215262413025), REAL_CONST(1.584023833274841), REAL_CONST(1.584727644920349) }, { REAL_CONST(0.000352177477907), REAL_CONST(0.001406819908880), REAL_CONST(0.005602621007711), REAL_CONST(0.022026389837265), REAL_CONST(0.082462236285210), REAL_CONST(0.263034462928772), REAL_CONST(0.584962487220764), REAL_CONST(0.847996890544891), REAL_CONST(0.956931233406067), REAL_CONST(0.988859415054321), REAL_CONST(0.997190535068512), REAL_CONST(0.999296069145203), REAL_CONST(0.999823868274689) }, { REAL_CONST(0.000176099492819), REAL_CONST(0.000703581434209), REAL_CONST(0.002804030198604), REAL_CONST(0.011055230163038), REAL_CONST(0.041820213198662), REAL_CONST(0.137503549456596), REAL_CONST(0.321928083896637), REAL_CONST(0.485426813364029), REAL_CONST(0.556393325328827), REAL_CONST(0.577544987201691), REAL_CONST(0.583090126514435), REAL_CONST(0.584493279457092), REAL_CONST(0.584845066070557) }, { REAL_CONST(0.000088052431238), REAL_CONST(0.000351833587047), REAL_CONST(0.001402696361765), REAL_CONST(0.005538204684854), REAL_CONST(0.021061634644866), REAL_CONST(0.070389263331890), REAL_CONST(0.169925004243851), REAL_CONST(0.263034462928772), REAL_CONST(0.304854571819305), REAL_CONST(0.317482173442841), REAL_CONST(0.320804953575134), REAL_CONST(0.321646571159363), REAL_CONST(0.321857661008835) }, { REAL_CONST(0.000044026888645), REAL_CONST(0.000175927518285), REAL_CONST(0.000701518612914), REAL_CONST(0.002771759871393), REAL_CONST(0.010569252073765), REAL_CONST(0.035623874515295), REAL_CONST(0.087462842464447), REAL_CONST(0.137503549456596), REAL_CONST(0.160464659333229), REAL_CONST(0.167456731200218), REAL_CONST(0.169301137328148), REAL_CONST(0.169768601655960), REAL_CONST(0.169885858893394) }, { REAL_CONST(0.000022013611670), REAL_CONST(0.000088052431238), REAL_CONST(0.000350801943569), REAL_CONST(0.001386545598507), REAL_CONST(0.005294219125062), REAL_CONST(0.017921976745129), REAL_CONST(0.044394120573997), REAL_CONST(0.070389263331890), REAL_CONST(0.082462236285210), REAL_CONST(0.086156636476517), REAL_CONST(0.087132595479488), REAL_CONST(0.087379962205887), REAL_CONST(0.087442122399807) }, { REAL_CONST(0.000011006847672), REAL_CONST(0.000044026888645), REAL_CONST(0.000175411638338), REAL_CONST(0.000693439331371), REAL_CONST(0.002649537986144), REAL_CONST(0.008988817222416), REAL_CONST(0.022367812693119), REAL_CONST(0.035623874515295), REAL_CONST(0.041820213198662), REAL_CONST(0.043721374124289), REAL_CONST(0.044224001467228), REAL_CONST(0.044351425021887), REAL_CONST(0.044383447617292) }, { REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000087708482170), REAL_CONST(0.000346675369656), REAL_CONST(0.001325377263129), REAL_CONST(0.004501323681325), REAL_CONST(0.011227255687118), REAL_CONST(0.017921976745129), REAL_CONST(0.021061634644866), REAL_CONST(0.022026389837265), REAL_CONST(0.022281449288130), REAL_CONST(0.022346137091517), REAL_CONST(0.022362394258380) }, { REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043854910473), REAL_CONST(0.000173348103999), REAL_CONST(0.000662840844598), REAL_CONST(0.002252417383716), REAL_CONST(0.005624548997730), REAL_CONST(0.008988817222416), REAL_CONST(0.010569252073765), REAL_CONST(0.011055230163038), REAL_CONST(0.011183738708496), REAL_CONST(0.011216334067285), REAL_CONST(0.011224525049329) }, { REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000022013611670), REAL_CONST(0.000086676649516), REAL_CONST(0.000331544462824), REAL_CONST(0.001126734190620), REAL_CONST(0.002815015614033), REAL_CONST(0.004501323681325), REAL_CONST(0.005294219125062), REAL_CONST(0.005538204684854), REAL_CONST(0.005602621007711), REAL_CONST(0.005619067233056), REAL_CONST(0.005623178556561) }, { REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000011006847672), REAL_CONST(0.000043338975956), REAL_CONST(0.000165781748365), REAL_CONST(0.000563477107789), REAL_CONST(0.001408194424585), REAL_CONST(0.002252417383716), REAL_CONST(0.002649537986144), REAL_CONST(0.002771759871393), REAL_CONST(0.002804030198604), REAL_CONST(0.002812269143760), REAL_CONST(0.002814328996465) }, { REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000021669651687), REAL_CONST(0.000082893253420), REAL_CONST(0.000281680084299), REAL_CONST(0.000704268983100), REAL_CONST(0.001126734190620), REAL_CONST(0.001325377263129), REAL_CONST(0.001386545598507), REAL_CONST(0.001402696361765), REAL_CONST(0.001406819908880), REAL_CONST(0.001407850766554) }, { REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010834866771), REAL_CONST(0.000041447223339), REAL_CONST(0.000140846910654), REAL_CONST(0.000352177477907), REAL_CONST(0.000563477107789), REAL_CONST(0.000662840844598), REAL_CONST(0.000693439331371), REAL_CONST(0.000701518612914), REAL_CONST(0.000703581434209), REAL_CONST(0.000704097095877) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005503434295), REAL_CONST(0.000020637769921), REAL_CONST(0.000070511166996), REAL_CONST(0.000176099492819), REAL_CONST(0.000281680084299), REAL_CONST(0.000331544462824), REAL_CONST(0.000346675369656), REAL_CONST(0.000350801943569), REAL_CONST(0.000351833587047), REAL_CONST(0.000352177477907) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002751719876), REAL_CONST(0.000010318922250), REAL_CONST(0.000035256012779), REAL_CONST(0.000088052431238), REAL_CONST(0.000140846910654), REAL_CONST(0.000165781748365), REAL_CONST(0.000173348103999), REAL_CONST(0.000175411638338), REAL_CONST(0.000175927518285), REAL_CONST(0.000176099492819) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000005159470220), REAL_CONST(0.000017542124624), REAL_CONST(0.000044026888645), REAL_CONST(0.000070511166996), REAL_CONST(0.000082893253420), REAL_CONST(0.000086676649516), REAL_CONST(0.000087708482170), REAL_CONST(0.000088052431238), REAL_CONST(0.000088052431238) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002579737384), REAL_CONST(0.000008771088687), REAL_CONST(0.000022013611670), REAL_CONST(0.000035256012779), REAL_CONST(0.000041447223339), REAL_CONST(0.000043338975956), REAL_CONST(0.000043854910473), REAL_CONST(0.000044026888645), REAL_CONST(0.000044026888645) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001375860506), REAL_CONST(0.000004471542070), REAL_CONST(0.000011006847672), REAL_CONST(0.000017542124624), REAL_CONST(0.000020637769921), REAL_CONST(0.000021669651687), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670), REAL_CONST(0.000022013611670) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000687930424), REAL_CONST(0.000002235772627), REAL_CONST(0.000005503434295), REAL_CONST(0.000008771088687), REAL_CONST(0.000010318922250), REAL_CONST(0.000010834866771), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672), REAL_CONST(0.000011006847672) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000001031895522), REAL_CONST(0.000002751719876), REAL_CONST(0.000004471542070), REAL_CONST(0.000005159470220), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295), REAL_CONST(0.000005503434295) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000515947875), REAL_CONST(0.000001375860506), REAL_CONST(0.000002235772627), REAL_CONST(0.000002579737384), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876), REAL_CONST(0.000002751719876) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000343965269), REAL_CONST(0.000000687930424), REAL_CONST(0.000001031895522), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506), REAL_CONST(0.000001375860506) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000515947875), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424), REAL_CONST(0.000000687930424) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269), REAL_CONST(0.000000343965269) }, { REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000000000000), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634), REAL_CONST(0.000000171982634) } }; static const real_t log_Qplus1[31] = { REAL_CONST(6.022367813028454), REAL_CONST(5.044394119358453), REAL_CONST(4.087462841250339), REAL_CONST(3.169925001442313), REAL_CONST(2.321928094887362), REAL_CONST(1.584962500721156), REAL_CONST(1.000000000000000), REAL_CONST(0.584962500721156), REAL_CONST(0.321928094887362), REAL_CONST(0.169925001442312), REAL_CONST(0.087462841250339), REAL_CONST(0.044394119358453), REAL_CONST(0.022367813028455), REAL_CONST(0.011227255423254), REAL_CONST(0.005624549193878), REAL_CONST(0.002815015607054), REAL_CONST(0.001408194392808), REAL_CONST(0.000704269011247), REAL_CONST(0.000352177480301), REAL_CONST(0.000176099486443), REAL_CONST(0.000088052430122), REAL_CONST(0.000044026886827), REAL_CONST(0.000022013611360), REAL_CONST(0.000011006847667), REAL_CONST(0.000005503434331), REAL_CONST(0.000002751719790), REAL_CONST(0.000001375860551), REAL_CONST(0.000000687930439), REAL_CONST(0.000000343965261), REAL_CONST(0.000000171982641), REAL_CONST(0.000000000000000) }; static real_t find_log2_Qplus1(sbr_info *sbr, uint8_t k, uint8_t l, uint8_t ch) { /* check for coupled energy/noise data */ if (sbr->bs_coupling == 1) { if ((sbr->Q[0][k][l] >= 0) && (sbr->Q[0][k][l] <= 30) && (sbr->Q[1][k][l] >= 0) && (sbr->Q[1][k][l] <= 24)) { if (ch == 0) { return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][sbr->Q[1][k][l] >> 1]); } else { return QUANTISE2REAL(log_Qplus1_pan[sbr->Q[0][k][l]][12 - (sbr->Q[1][k][l] >> 1)]); } } else { return 0; } } else { if (sbr->Q[ch][k][l] >= 0 && sbr->Q[ch][k][l] <= 30) { return QUANTISE2REAL(log_Qplus1[sbr->Q[ch][k][l]]); } else { return 0; } } } static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) { /* log2 values of limiter gains */ static real_t limGain[] = { -1.0, 0.0, 1.0, 33.219 }; uint8_t m, l, k; uint8_t current_t_noise_band = 0; uint8_t S_mapped; ALIGN real_t Q_M_lim[MAX_M]; ALIGN real_t G_lim[MAX_M]; ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; uint8_t current_res_band = 0; uint8_t current_res_band2 = 0; uint8_t current_hi_res_band = 0; real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) { current_t_noise_band++; } for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) { real_t Q_M = 0; real_t G_max; real_t den = 0; real_t acc1 = 0; real_t acc2 = 0; uint8_t current_res_band_size = 0; uint8_t Q_M_size = 0; uint8_t ml1, ml2; /* bounds of current limiter bands */ ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; if (ml1 > MAX_M) ml1 = MAX_M; if (ml2 > MAX_M) ml2 = MAX_M; /* calculate the accumulated E_orig and E_curr over the limiter band */ for (m = ml1; m < ml2; m++) { if ((m + sbr->kx) < sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { current_res_band_size++; } else { acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); current_res_band++; current_res_band_size = 1; } acc2 += QUANTISE2INT(sbr->E_curr[ch][m][l]/1024.0); } acc1 += QUANTISE2INT(pow2(-10 + log2_int_tab[current_res_band_size] + find_log2_E(sbr, current_res_band, l, ch))); acc1 = QUANTISE2REAL( log2(EPS + acc1) ); /* calculate the maximum gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G_max = acc1 - QUANTISE2REAL(log2(EPS + acc2)) + QUANTISE2REAL(limGain[sbr->bs_limiter_gains]); G_max = min(G_max, QUANTISE2REAL(limGain[3])); for (m = ml1; m < ml2; m++) { real_t G; real_t E_curr, E_orig; real_t Q_orig, Q_orig_plus1; uint8_t S_index_mapped; /* check if m is on a noise band border */ if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) { /* step to next noise band */ current_f_noise_band++; } /* check if m is on a resolution band border */ if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) { /* accumulate a whole range of equal Q_Ms */ if (Q_M_size > 0) den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); Q_M_size = 0; /* step to next resolution band */ current_res_band2++; /* if we move to a new resolution band, we should check if we are * going to add a sinusoid in this band */ S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); } /* check if m is on a HI_RES band border */ if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) { /* step to next HI_RES band */ current_hi_res_band++; } /* find S_index_mapped * S_index_mapped can only be 1 for the m in the middle of the * current HI_RES band */ S_index_mapped = 0; if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) { /* find the middle subband of the HI_RES frequency band */ if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; } /* find bitstream parameters */ if (sbr->E_curr[ch][m][l] == 0) E_curr = LOG2_MIN_INF; else E_curr = -10 + log2(sbr->E_curr[ch][m][l]); E_orig = -10 + find_log2_E(sbr, current_res_band2, l, ch); Q_orig = find_log2_Q(sbr, current_f_noise_band, current_t_noise_band, ch); Q_orig_plus1 = find_log2_Qplus1(sbr, current_f_noise_band, current_t_noise_band, ch); /* Q_M only depends on E_orig and Q_div2: * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on * a change of current res band (HI or LO) */ Q_M = E_orig + Q_orig - Q_orig_plus1; /* S_M only depends on E_orig, Q_div and S_index_mapped: * S_index_mapped can only be non-zero once per HI_RES band */ if (S_index_mapped == 0) { S_M[m] = LOG2_MIN_INF; /* -inf */ } else { S_M[m] = E_orig - Q_orig_plus1; /* accumulate sinusoid part of the total energy */ den += pow2(S_M[m]); } /* calculate gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ /* E_curr here is officially E_curr+1 so the log2() of that can never be < 0 */ /* scaled by -10 */ G = E_orig - max(-10, E_curr); if ((S_mapped == 0) && (delta == 1)) { /* G = G * 1/(1+Q) */ G -= Q_orig_plus1; } else if (S_mapped == 1) { /* G = G * Q/(1+Q) */ G += Q_orig - Q_orig_plus1; } /* limit the additional noise energy level */ /* and apply the limiter */ if (G_max > G) { Q_M_lim[m] = QUANTISE2REAL(Q_M); G_lim[m] = QUANTISE2REAL(G); if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) { Q_M_size++; } } else { /* G > G_max */ Q_M_lim[m] = QUANTISE2REAL(Q_M) + G_max - QUANTISE2REAL(G); G_lim[m] = G_max; /* accumulate limited Q_M */ if ((S_index_mapped == 0) && (l != sbr->l_A[ch])) { den += QUANTISE2INT(pow2(Q_M_lim[m])); } } /* accumulate the total energy */ /* E_curr changes for every m so we do need to accumulate every m */ den += QUANTISE2INT(pow2(E_curr + G_lim[m])); } /* accumulate last range of equal Q_Ms */ if (Q_M_size > 0) { den += QUANTISE2INT(pow2(log2_int_tab[Q_M_size] + Q_M)); } /* calculate the final gain */ /* G_boost: [0..2.51188643] */ G_boost = acc1 - QUANTISE2REAL(log2(den + EPS)); G_boost = min(G_boost, QUANTISE2REAL(1.328771237) /* log2(1.584893192 ^ 2) */); for (m = ml1; m < ml2; m++) { /* apply compensation to gain, noise floor sf's and sinusoid levels */ #ifndef SBR_LOW_POWER adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2((G_lim[m] + G_boost) / 2.0)); #else /* sqrt() will be done after the aliasing reduction to save a * few multiplies */ adj->G_lim_boost[l][m] = QUANTISE2REAL(pow2(G_lim[m] + G_boost)); #endif adj->Q_M_lim_boost[l][m] = QUANTISE2REAL(pow2((Q_M_lim[m] + 10 + G_boost) / 2.0)); if (S_M[m] != LOG2_MIN_INF) { adj->S_M_boost[l][m] = QUANTISE2REAL(pow2((S_M[m] + 10 + G_boost) / 2.0)); } else { adj->S_M_boost[l][m] = 0; } } } } } #else static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) { static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 }; uint8_t m, l, k; uint8_t current_t_noise_band = 0; uint8_t S_mapped; ALIGN real_t Q_M_lim[MAX_M]; ALIGN real_t G_lim[MAX_M]; ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; uint8_t current_res_band = 0; uint8_t current_res_band2 = 0; uint8_t current_hi_res_band = 0; real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1; S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); if (sbr->t_E[ch][l+1] > sbr->t_Q[ch][current_t_noise_band+1]) { current_t_noise_band++; } for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++) { real_t G_max; real_t den = 0; real_t acc1 = 0; real_t acc2 = 0; uint8_t ml1, ml2; ml1 = sbr->f_table_lim[sbr->bs_limiter_bands][k]; ml2 = sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; if (ml1 > MAX_M) ml1 = MAX_M; if (ml2 > MAX_M) ml2 = MAX_M; /* calculate the accumulated E_orig and E_curr over the limiter band */ for (m = ml1; m < ml2; m++) { if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band+1]) { current_res_band++; } acc1 += sbr->E_orig[ch][current_res_band][l]; acc2 += sbr->E_curr[ch][m][l]; } /* calculate the maximum gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G_max = ((EPS + acc1) / (EPS + acc2)) * limGain[sbr->bs_limiter_gains]; G_max = min(G_max, 1e10); for (m = ml1; m < ml2; m++) { real_t Q_M, G; real_t Q_div, Q_div2; uint8_t S_index_mapped; /* check if m is on a noise band border */ if ((m + sbr->kx) == sbr->f_table_noise[current_f_noise_band+1]) { /* step to next noise band */ current_f_noise_band++; } /* check if m is on a resolution band border */ if ((m + sbr->kx) == sbr->f_table_res[sbr->f[ch][l]][current_res_band2+1]) { /* step to next resolution band */ current_res_band2++; /* if we move to a new resolution band, we should check if we are * going to add a sinusoid in this band */ S_mapped = get_S_mapped(sbr, ch, l, current_res_band2); } /* check if m is on a HI_RES band border */ if ((m + sbr->kx) == sbr->f_table_res[HI_RES][current_hi_res_band+1]) { /* step to next HI_RES band */ current_hi_res_band++; } /* find S_index_mapped * S_index_mapped can only be 1 for the m in the middle of the * current HI_RES band */ S_index_mapped = 0; if ((l >= sbr->l_A[ch]) || (sbr->bs_add_harmonic_prev[ch][current_hi_res_band] && sbr->bs_add_harmonic_flag_prev[ch])) { /* find the middle subband of the HI_RES frequency band */ if ((m + sbr->kx) == (sbr->f_table_res[HI_RES][current_hi_res_band+1] + sbr->f_table_res[HI_RES][current_hi_res_band]) >> 1) S_index_mapped = sbr->bs_add_harmonic[ch][current_hi_res_band]; } /* Q_div: [0..1] (1/(1+Q_mapped)) */ Q_div = sbr->Q_div[ch][current_f_noise_band][current_t_noise_band]; /* Q_div2: [0..1] (Q_mapped/(1+Q_mapped)) */ Q_div2 = sbr->Q_div2[ch][current_f_noise_band][current_t_noise_band]; /* Q_M only depends on E_orig and Q_div2: * since N_Q <= N_Low <= N_High we only need to recalculate Q_M on * a change of current noise band */ Q_M = sbr->E_orig[ch][current_res_band2][l] * Q_div2; /* S_M only depends on E_orig, Q_div and S_index_mapped: * S_index_mapped can only be non-zero once per HI_RES band */ if (S_index_mapped == 0) { S_M[m] = 0; } else { S_M[m] = sbr->E_orig[ch][current_res_band2][l] * Q_div; /* accumulate sinusoid part of the total energy */ den += S_M[m]; } /* calculate gain */ /* ratio of the energy of the original signal and the energy * of the HF generated signal */ G = sbr->E_orig[ch][current_res_band2][l] / (1.0 + sbr->E_curr[ch][m][l]); if ((S_mapped == 0) && (delta == 1)) G *= Q_div; else if (S_mapped == 1) G *= Q_div2; /* limit the additional noise energy level */ /* and apply the limiter */ if (G <= G_max) { 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 if (adj->S_M_boost[l][m] != 0 || no_noise) Q_filt = 0; /* 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_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])); 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_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 { int8_t rev = (((m + sbr->kx) & 1) ? -1 : 1); QMF_RE(psi) = 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 * 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) && (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))); } } if (adj->S_M_boost[l][m] != 0) sinusoids++; #endif } } fIndexSine = (fIndexSine + 1) & 3; /* update the ringbuffer index used for filtering G and Q with h_smooth */ sbr->GQ_ringbuf_index[ch]++; if (sbr->GQ_ringbuf_index[ch] >= 5) sbr->GQ_ringbuf_index[ch] = 0; } } sbr->index_noise_prev[ch] = fIndexNoise; sbr->psi_is_prev[ch] = fIndexSine; } #endif faad2-2.11.2/libfaad/sbr_hfadj.h000066400000000000000000000033251476153623600162470ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_hfadj.h,v 1.19 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_HFADJ_H__ #define __SBR_HFADJ_H__ #ifdef __cplusplus extern "C" { #endif typedef struct { real_t G_lim_boost[MAX_L_E][MAX_M]; real_t Q_M_lim_boost[MAX_L_E][MAX_M]; real_t S_M_boost[MAX_L_E][MAX_M]; } sbr_hfadj_info; uint8_t hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg #endif ,uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_hfgen.c000066400000000000000000000535721476153623600162660ustar00rootroot00000000000000/* ** 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 half; #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); /* All-zero input. */ if (exp == 0) { RE(ac->r01) = 0; IM(ac->r01) = 0; RE(ac->r02) = 0; IM(ac->r02) = 0; RE(ac->r11) = 0; // IM(ac->r11) = 0; // unused RE(ac->r12) = 0; IM(ac->r12) = 0; RE(ac->r22) = 0; // IM(ac->r22) = 0; // unused ac->det = 0; return; } /* Otherwise exp > 0. */ /* improves accuracy */ exp -= 1; /* Now exp is 0..31 */ half = (1 << exp) >> 1; temp2_r = (QMF_RE(buffer[offset-2][bd]) + half) >> exp; temp2_i = (QMF_IM(buffer[offset-2][bd]) + half) >> exp; temp3_r = (QMF_RE(buffer[offset-1][bd]) + half) >> exp; temp3_i = (QMF_IM(buffer[offset-1][bd]) + half) >> 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]) + half) >> exp; temp3_i = (QMF_IM(buffer[j][bd]) + half) >> 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 } /* Sanity check; important: use "yes" check to filter-out NaN values. */ 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))) return; /* Fallback */ RE(alpha_0[k]) = 0; IM(alpha_0[k]) = 0; RE(alpha_1[k]) = 0; IM(alpha_1[k]) = 0; } #else static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], complex_t *alpha_0, complex_t *alpha_1, real_t *rxx) { uint8_t k; real_t tmp; acorr_coef ac; for (k = 1; k < sbr->f_master[0]; k++) { auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6); if (ac.det == 0) { RE(alpha_0[k]) = 0; RE(alpha_1[k]) = 0; } else { tmp = MUL_R(RE(ac.r01), RE(ac.r22)) - MUL_R(RE(ac.r12), RE(ac.r02)); RE(alpha_0[k]) = DIV_R(tmp, (-ac.det)); tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)); RE(alpha_1[k]) = DIV_R(tmp, ac.det); } if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4))) { RE(alpha_0[k]) = REAL_CONST(0); RE(alpha_1[k]) = REAL_CONST(0); } /* reflection coefficient */ if (RE(ac.r11) == 0) { rxx[k] = COEF_CONST(0.0); } else { rxx[k] = DIV_C(RE(ac.r01), RE(ac.r11)); rxx[k] = -rxx[k]; if (rxx[k] > COEF_CONST(1.0)) rxx[k] = COEF_CONST(1.0); if (rxx[k] < COEF_CONST(-1.0)) rxx[k] = COEF_CONST(-1.0); } } } static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg) { uint8_t k; rxx[0] = COEF_CONST(0.0); deg[1] = COEF_CONST(0.0); for (k = 2; k < sbr->k0; k++) { deg[k] = 0.0; if ((k % 2 == 0) && (rxx[k] < COEF_CONST(0.0))) { if (rxx[k-1] < 0.0) { deg[k] = COEF_CONST(1.0); if (rxx[k-2] > COEF_CONST(0.0)) { deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } else if (rxx[k-2] > COEF_CONST(0.0)) { deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } if ((k % 2 == 1) && (rxx[k] > COEF_CONST(0.0))) { if (rxx[k-1] > COEF_CONST(0.0)) { deg[k] = COEF_CONST(1.0); if (rxx[k-2] < COEF_CONST(0.0)) { deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } else if (rxx[k-2] < COEF_CONST(0.0)) { deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]); } } } } #endif /* FIXED POINT: bwArray = COEF */ static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev) { switch (invf_mode) { case 1: /* LOW */ if (invf_mode_prev == 0) /* NONE */ return COEF_CONST(0.6); else return COEF_CONST(0.75); case 2: /* MID */ return COEF_CONST(0.9); case 3: /* HIGH */ return COEF_CONST(0.98); default: /* NONE */ if (invf_mode_prev == 1) /* LOW */ return COEF_CONST(0.6); else return COEF_CONST(0.0); } } /* FIXED POINT: bwArray = COEF */ static void calc_chirp_factors(sbr_info *sbr, uint8_t ch) { uint8_t i; for (i = 0; i < sbr->N_Q; i++) { sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]); if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i]) sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25)); else sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375)); if (sbr->bwArray[ch][i] < COEF_CONST(0.015625)) sbr->bwArray[ch][i] = COEF_CONST(0.0); if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375)) sbr->bwArray[ch][i] = COEF_CONST(0.99609375); sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i]; sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i]; } } static void patch_construction(sbr_info *sbr) { uint8_t i, k; uint8_t odd, sb; uint8_t msb = sbr->k0; uint8_t usb = sbr->kx; uint8_t goalSbTab[] = { 21, 23, 32, 43, 46, 64, 85, 93, 128, 0, 0, 0 }; /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */ uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)]; sbr->noPatches = 0; if (goalSb < (sbr->kx + sbr->M)) { for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++) k = i+1; } else { k = sbr->N_master; } if (sbr->N_master == 0) { sbr->noPatches = 0; sbr->patchNoSubbands[0] = 0; sbr->patchStartSubband[0] = 0; return; } do { uint8_t j = k + 1; do { j--; sb = sbr->f_master[j]; odd = (sb - 2 + sbr->k0) % 2; } while (sb > (sbr->k0 - 1 + msb - odd)); sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0); sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd - sbr->patchNoSubbands[sbr->noPatches]; if (sbr->patchNoSubbands[sbr->noPatches] > 0) { usb = sb; msb = sb; sbr->noPatches++; } else { msb = sbr->kx; } if (sbr->f_master[k] - sb < 3) k = sbr->N_master; } while (sb != (sbr->kx + sbr->M)); if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1)) { sbr->noPatches--; } sbr->noPatches = min(sbr->noPatches, 5); } #endif faad2-2.11.2/libfaad/sbr_hfgen.h000066400000000000000000000031371476153623600162630ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_hfgen.h,v 1.20 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_HFGEN_H__ #define __SBR_HFGEN_H__ #ifdef __cplusplus extern "C" { #endif void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64], qmf_t Xhigh[MAX_NTSRHFG][64] #ifdef SBR_LOW_POWER ,real_t *deg #endif ,uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_huff.c000066400000000000000000000400141476153623600161120ustar00rootroot00000000000000/* ** 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" /* * Huffman tables describe structure and symbols of Huffman trees. Huffman tree * is a kind of binary tree, i. e. each node is either a leaf or has 2 child * nodes. Items of Huffman table describe non-leaf nodes, that is why those are * represented by a pair of integers. Depending on a bit value left (0-th) or * right (1-st) child chosen. If value is non-negative, then it is an index * of next inner node. Otherwise it encodes a leaf (Huffman symbol). To get the * symbol value 64 is added to leaf value. Since all integers are int8_t, the * range of symbol values is -64..63. * * Note: table with N entries describes tree with N+1 leaves. * Note: it is possible to extend range to -64..64, since index 0 is forbidden. * Note: it is possible to extend the range even further by using deltas instead * of absolute indices, switching to uint8_t, and employing all the values * bigger than maximal delta. */ 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}, {-62, 2}, {-66, 3}, {-60, 4}, {-68, 5}, {-58, 6}, {-70, 7}, {-56, 8}, {-72, 9}, {10, 11}, {-74, -54}, {12, 13}, {-76, -52}, {14, 28}, {15, 21}, {16, 18}, {-50, 17}, {-78, -48}, {19, 20}, {-112, -110}, {-108, -106}, {22, 25}, {23, 24}, {-104, -102}, {-100, -98}, {26, 27}, {-96, -94}, {-92, -90}, {29, 36}, {30, 33}, {31, 32}, {-88, -86}, {-84, -82}, {34, 35}, {-80, -46}, {-44, -42}, {37, 41}, {38, 39}, {-40, -38}, {-36, 40}, {-34, -32}, {42, 45}, {43, 44}, {-30, -28}, {-26, -24}, {46, 47}, {-22, -20}, {-18, -16} }; static const int8_t f_huffman_env_bal_1_5dB[48][2] = { {-64, 1}, {-66, 2}, {-62, 3}, {-68, 4}, {-60, 5}, {-58, 6}, {-70, 7}, {-72, 8}, {-56, 9}, {10, 11}, {-74, -54}, {-76, 12}, {-52, 13}, {14, 17}, {-78, 15}, {-50, 16}, {-48, -82}, {18, 32}, {19, 25}, {20, 22}, {-80, 21}, {-112, -110}, {23, 24}, {-108, -106}, {-104, -102}, {26, 29}, {27, 28}, {-100, -98}, {-96, -94}, {30, 31}, {-92, -90}, {-88, -86}, {33, 40}, {34, 37}, {35, 36}, {-84, -46}, {-44, -42}, {38, 39}, {-40, -38}, {-36, -34}, {41, 44}, {42, 43}, {-32, -30}, {-28, -26}, {45, 46}, {-24, -22}, {-20, 47}, {-18, -16} }; 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}, {-62, 2}, {-66, 3}, {-68, 4}, {-60, 5}, {-58, 6}, {-70, 7}, {-72, 8}, {-56, 9}, {10, 16}, {11, 13}, {-74, 12}, {-88, -86}, {14, 15}, {-84, -82}, {-80, -78}, {17, 20}, {18, 19}, {-76, -54}, {-52, -50}, {21, 22}, {-48, -46}, {-44, 23}, {-42, -40} }; static const int8_t f_huffman_env_bal_3_0dB[24][2] = { {-64, 1}, {-66, 2}, {-62, 3}, {-68, 4}, {-60, 5}, {-58, 6}, {-70, 7}, {-72, 8}, {-56, 9}, {10, 13}, {-74, 11}, {-54, 12}, {-52, -88}, {14, 17}, {15, 16}, {-86, -84}, {-82, -80}, {18, 21}, {19, 20}, {-78, -76}, {-50, -48}, {22, 23}, {-46, -44}, {-42, -40} }; 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}, {-66, 2}, {-62, 3}, {4, 9}, {-68, 5}, {-60, 6}, {7, 8}, {-88, -86}, {-84, -82}, {10, 17}, {11, 14}, {12, 13}, {-80, -78}, {-76, -74}, {15, 16}, {-72, -70}, {-58, -56}, {18, 21}, {19, 20}, {-54, -52}, {-50, -48}, {22, 23}, {-46, -44}, {-42, -40} }; 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)); } } else { for (band = 0; band < sbr->n[sbr->f[ch][env]]; band++) { sbr->E[ch][band][env] = (sbr_huff_dec(ld, t_huff)); } } } 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)); } } else { for (band = 0; band < sbr->N_Q; band++) { sbr->Q[ch][band][noise] = (sbr_huff_dec(ld, t_huff)); } } } extract_noise_floor_data(sbr, ch); } #endif faad2-2.11.2/libfaad/sbr_huff.h000066400000000000000000000030041476153623600161150ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_huff.h,v 1.21 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_HUFF_H__ #define __SBR_HUFF_H__ #ifdef __cplusplus extern "C" { #endif void sbr_envelope(bitfile *ld, sbr_info *sbr, uint8_t ch); void sbr_noise(bitfile *ld, sbr_info *sbr, uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_noise.h000066400000000000000000001100541476153623600163060ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_noise.h,v 1.17 2007/11/01 12:33:35 menno Exp $ **/ #ifndef __SBR_NOISE_H__ #define __SBR_NOISE_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif /* Table 1.A.13 Noise table V */ ALIGN static const complex_t V[] = { { FRAC_CONST(-0.99948155879974), FRAC_CONST(-0.59483414888382) }, { FRAC_CONST(0.97113454341888), FRAC_CONST(-0.67528516054153) }, { FRAC_CONST(0.14130051434040), FRAC_CONST(-0.95090985298157) }, { FRAC_CONST(-0.47005495429039), FRAC_CONST(-0.37340548634529) }, { FRAC_CONST(0.80705064535141), FRAC_CONST(0.29653668403625) }, { FRAC_CONST(-0.38981479406357), FRAC_CONST(0.89572608470917) }, { FRAC_CONST(-0.01053049881011), FRAC_CONST(-0.66959059238434) }, { FRAC_CONST(-0.91266369819641), FRAC_CONST(-0.11522938311100) }, { FRAC_CONST(0.54840421676636), FRAC_CONST(0.75221365690231) }, { FRAC_CONST(0.40009254217148), FRAC_CONST(-0.98929399251938) }, { FRAC_CONST(-0.99867975711823), FRAC_CONST(-0.88147068023682) }, { FRAC_CONST(-0.95531076192856), FRAC_CONST(0.90908759832382) }, { FRAC_CONST(-0.45725932717323), FRAC_CONST(-0.56716322898865) }, { FRAC_CONST(-0.72929674386978), FRAC_CONST(-0.98008275032043) }, { FRAC_CONST(0.75622802972794), FRAC_CONST(0.20950329303741) }, { FRAC_CONST(0.07069442421198), FRAC_CONST(-0.78247898817062) }, { FRAC_CONST(0.74496251344681), FRAC_CONST(-0.91169005632401) }, { FRAC_CONST(-0.96440184116364), FRAC_CONST(-0.94739919900894) }, { FRAC_CONST(0.30424630641937), FRAC_CONST(-0.49438267946243) }, { FRAC_CONST(0.66565030813217), FRAC_CONST(0.64652937650681) }, { FRAC_CONST(0.91697007417679), FRAC_CONST(0.17514097690582) }, { FRAC_CONST(-0.70774918794632), FRAC_CONST(0.52548652887344) }, { FRAC_CONST(-0.70051413774490), FRAC_CONST(-0.45340028405190) }, { FRAC_CONST(-0.99496513605118), FRAC_CONST(-0.90071910619736) }, { FRAC_CONST(0.98164492845535), FRAC_CONST(-0.77463155984879) }, { FRAC_CONST(-0.54671579599380), FRAC_CONST(-0.02570928446949) }, { FRAC_CONST(-0.01689629070461), FRAC_CONST(0.00287506449968) }, { FRAC_CONST(-0.86110347509384), FRAC_CONST(0.42548584938049) }, { FRAC_CONST(-0.98892980813980), FRAC_CONST(-0.87881129980087) }, { FRAC_CONST(0.51756626367569), FRAC_CONST(0.66926783323288) }, { FRAC_CONST(-0.99635028839111), FRAC_CONST(-0.58107727766037) }, { FRAC_CONST(-0.99969369173050), FRAC_CONST(0.98369991779327) }, { FRAC_CONST(0.55266261100769), FRAC_CONST(0.59449058771133) }, { FRAC_CONST(0.34581178426743), FRAC_CONST(0.94879418611526) }, { FRAC_CONST(0.62664210796356), FRAC_CONST(-0.74402970075607) }, { FRAC_CONST(-0.77149701118469), FRAC_CONST(-0.33883658051491) }, { FRAC_CONST(-0.91592246294022), FRAC_CONST(0.03687901422381) }, { FRAC_CONST(-0.76285493373871), FRAC_CONST(-0.91371870040894) }, { FRAC_CONST(0.79788339138031), FRAC_CONST(-0.93180972337723) }, { FRAC_CONST(0.54473078250885), FRAC_CONST(-0.11919206380844) }, { FRAC_CONST(-0.85639280080795), FRAC_CONST(0.42429855465889) }, { FRAC_CONST(-0.92882400751114), FRAC_CONST(0.27871808409691) }, { FRAC_CONST(-0.11708371341228), FRAC_CONST(-0.99800843000412) }, { FRAC_CONST(0.21356749534607), FRAC_CONST(-0.90716296434402) }, { FRAC_CONST(-0.76191693544388), FRAC_CONST(0.99768120050430) }, { FRAC_CONST(0.98111045360565), FRAC_CONST(-0.95854461193085) }, { FRAC_CONST(-0.85913270711899), FRAC_CONST(0.95766568183899) }, { FRAC_CONST(-0.93307244777679), FRAC_CONST(0.49431759119034) }, { FRAC_CONST(0.30485755205154), FRAC_CONST(-0.70540034770966) }, { FRAC_CONST(0.85289651155472), FRAC_CONST(0.46766132116318) }, { FRAC_CONST(0.91328084468842), FRAC_CONST(-0.99839597940445) }, { FRAC_CONST(-0.05890199914575), FRAC_CONST(0.70741826295853) }, { FRAC_CONST(0.28398686647415), FRAC_CONST(0.34633556008339) }, { FRAC_CONST(0.95258164405823), FRAC_CONST(-0.54893416166306) }, { FRAC_CONST(-0.78566324710846), FRAC_CONST(-0.75568538904190) }, { FRAC_CONST(-0.95789498090744), FRAC_CONST(-0.20423194766045) }, { FRAC_CONST(0.82411158084869), FRAC_CONST(0.96654617786407) }, { FRAC_CONST(-0.65185445547104), FRAC_CONST(-0.88734990358353) }, { FRAC_CONST(-0.93643605709076), FRAC_CONST(0.99870789051056) }, { FRAC_CONST(0.91427159309387), FRAC_CONST(-0.98290503025055) }, { FRAC_CONST(-0.70395684242249), FRAC_CONST(0.58796799182892) }, { FRAC_CONST(0.00563771976158), FRAC_CONST(0.61768198013306) }, { FRAC_CONST(0.89065051078796), FRAC_CONST(0.52783352136612) }, { FRAC_CONST(-0.68683707714081), FRAC_CONST(0.80806946754456) }, { FRAC_CONST(0.72165340185165), FRAC_CONST(-0.69259858131409) }, { FRAC_CONST(-0.62928247451782), FRAC_CONST(0.13627037405968) }, { FRAC_CONST(0.29938435554504), FRAC_CONST(-0.46051329374313) }, { FRAC_CONST(-0.91781955957413), FRAC_CONST(-0.74012714624405) }, { FRAC_CONST(0.99298715591431), FRAC_CONST(0.40816611051559) }, { FRAC_CONST(0.82368296384811), FRAC_CONST(-0.74036049842834) }, { FRAC_CONST(-0.98512834310532), FRAC_CONST(-0.99972331523895) }, { FRAC_CONST(-0.95915371179581), FRAC_CONST(-0.99237799644470) }, { FRAC_CONST(-0.21411126852036), FRAC_CONST(-0.93424820899963) }, { FRAC_CONST(-0.68821477890015), FRAC_CONST(-0.26892307400703) }, { FRAC_CONST(0.91851997375488), FRAC_CONST(0.09358228743076) }, { FRAC_CONST(-0.96062767505646), FRAC_CONST(0.36099094152451) }, { FRAC_CONST(0.51646184921265), FRAC_CONST(-0.71373331546783) }, { FRAC_CONST(0.61130720376968), FRAC_CONST(0.46950140595436) }, { FRAC_CONST(0.47336128354073), FRAC_CONST(-0.27333179116249) }, { FRAC_CONST(0.90998309850693), FRAC_CONST(0.96715664863586) }, { FRAC_CONST(0.44844800233841), FRAC_CONST(0.99211573600769) }, { FRAC_CONST(0.66614890098572), FRAC_CONST(0.96590173244476) }, { FRAC_CONST(0.74922239780426), FRAC_CONST(-0.89879858493805) }, { FRAC_CONST(-0.99571585655212), FRAC_CONST(0.52785521745682) }, { FRAC_CONST(0.97401082515717), FRAC_CONST(-0.16855870187283) }, { FRAC_CONST(0.72683745622635), FRAC_CONST(-0.48060774803162) }, { FRAC_CONST(0.95432192087173), FRAC_CONST(0.68849605321884) }, { FRAC_CONST(-0.72962206602097), FRAC_CONST(-0.76608443260193) }, { FRAC_CONST(-0.85359477996826), FRAC_CONST(0.88738125562668) }, { FRAC_CONST(-0.81412428617477), FRAC_CONST(-0.97480767965317) }, { FRAC_CONST(-0.87930774688721), FRAC_CONST(0.74748307466507) }, { FRAC_CONST(-0.71573328971863), FRAC_CONST(-0.98570609092712) }, { FRAC_CONST(0.83524298667908), FRAC_CONST(0.83702534437180) }, { FRAC_CONST(-0.48086065053940), FRAC_CONST(-0.98848503828049) }, { FRAC_CONST(0.97139126062393), FRAC_CONST(0.80093622207642) }, { FRAC_CONST(0.51992827653885), FRAC_CONST(0.80247628688812) }, { FRAC_CONST(-0.00848591234535), FRAC_CONST(-0.76670128107071) }, { FRAC_CONST(-0.70294374227524), FRAC_CONST(0.55359911918640) }, { FRAC_CONST(-0.95894426107407), FRAC_CONST(-0.43265503644943) }, { FRAC_CONST(0.97079253196716), FRAC_CONST(0.09325857460499) }, { FRAC_CONST(-0.92404294013977), FRAC_CONST(0.85507702827454) }, { FRAC_CONST(-0.69506472349167), FRAC_CONST(0.98633414506912) }, { FRAC_CONST(0.26559203863144), FRAC_CONST(0.73314309120178) }, { FRAC_CONST(0.28038442134857), FRAC_CONST(0.14537914097309) }, { FRAC_CONST(-0.74138122797012), FRAC_CONST(0.99310338497162) }, { FRAC_CONST(-0.01752796024084), FRAC_CONST(-0.82616633176804) }, { FRAC_CONST(-0.55126774311066), FRAC_CONST(-0.98898541927338) }, { FRAC_CONST(0.97960901260376), FRAC_CONST(-0.94021445512772) }, { FRAC_CONST(-0.99196308851242), FRAC_CONST(0.67019015550613) }, { FRAC_CONST(-0.67684930562973), FRAC_CONST(0.12631492316723) }, { FRAC_CONST(0.09140039235353), FRAC_CONST(-0.20537731051445) }, { FRAC_CONST(-0.71658962965012), FRAC_CONST(-0.97788202762604) }, { FRAC_CONST(0.81014639139175), FRAC_CONST(0.53722649812698) }, { FRAC_CONST(0.40616992115974), FRAC_CONST(-0.26469007134438) }, { FRAC_CONST(-0.67680186033249), FRAC_CONST(0.94502049684525) }, { FRAC_CONST(0.86849772930145), FRAC_CONST(-0.18333598971367) }, { FRAC_CONST(-0.99500381946564), FRAC_CONST(-0.02634122036397) }, { FRAC_CONST(0.84329187870026), FRAC_CONST(0.10406957566738) }, { FRAC_CONST(-0.09215968847275), FRAC_CONST(0.69540011882782) }, { FRAC_CONST(0.99956172704697), FRAC_CONST(-0.12358541786671) }, { FRAC_CONST(-0.79732781648636), FRAC_CONST(-0.91582524776459) }, { FRAC_CONST(0.96349972486496), FRAC_CONST(0.96640455722809) }, { FRAC_CONST(-0.79942780733109), FRAC_CONST(0.64323902130127) }, { FRAC_CONST(-0.11566039919853), FRAC_CONST(0.28587844967842) }, { FRAC_CONST(-0.39922955632210), FRAC_CONST(0.94129604101181) }, { FRAC_CONST(0.99089199304581), FRAC_CONST(-0.92062628269196) }, { FRAC_CONST(0.28631284832954), FRAC_CONST(-0.91035044193268) }, { FRAC_CONST(-0.83302724361420), FRAC_CONST(-0.67330408096313) }, { FRAC_CONST(0.95404446125031), FRAC_CONST(0.49162766337395) }, { FRAC_CONST(-0.06449863314629), FRAC_CONST(0.03250560909510) }, { FRAC_CONST(-0.99575054645538), FRAC_CONST(0.42389783263206) }, { FRAC_CONST(-0.65501141548157), FRAC_CONST(0.82546114921570) }, { FRAC_CONST(-0.81254440546036), FRAC_CONST(-0.51627236604691) }, { FRAC_CONST(-0.99646371603012), FRAC_CONST(0.84490531682968) }, { FRAC_CONST(0.00287840608507), FRAC_CONST(0.64768260717392) }, { FRAC_CONST(0.70176988840103), FRAC_CONST(-0.20453028380871) }, { FRAC_CONST(0.96361881494522), FRAC_CONST(0.40706968307495) }, { FRAC_CONST(-0.68883758783340), FRAC_CONST(0.91338956356049) }, { FRAC_CONST(-0.34875586628914), FRAC_CONST(0.71472293138504) }, { FRAC_CONST(0.91980081796646), FRAC_CONST(0.66507452726364) }, { FRAC_CONST(-0.99009048938751), FRAC_CONST(0.85868018865585) }, { FRAC_CONST(0.68865793943405), FRAC_CONST(0.55660319328308) }, { FRAC_CONST(-0.99484401941299), FRAC_CONST(-0.20052559673786) }, { FRAC_CONST(0.94214510917664), FRAC_CONST(-0.99696427583694) }, { FRAC_CONST(-0.67414629459381), FRAC_CONST(0.49548220634460) }, { FRAC_CONST(-0.47339352965355), FRAC_CONST(-0.85904330015182) }, { FRAC_CONST(0.14323651790619), FRAC_CONST(-0.94145596027374) }, { FRAC_CONST(-0.29268294572830), FRAC_CONST(0.05759225040674) }, { FRAC_CONST(0.43793860077858), FRAC_CONST(-0.78904968500137) }, { FRAC_CONST(-0.36345127224922), FRAC_CONST(0.64874434471130) }, { FRAC_CONST(-0.08750604838133), FRAC_CONST(0.97686946392059) }, { FRAC_CONST(-0.96495270729065), FRAC_CONST(-0.53960305452347) }, { FRAC_CONST(0.55526942014694), FRAC_CONST(0.78891521692276) }, { FRAC_CONST(0.73538213968277), FRAC_CONST(0.96452075242996) }, { FRAC_CONST(-0.30889773368835), FRAC_CONST(-0.80664390325546) }, { FRAC_CONST(0.03574995696545), FRAC_CONST(-0.97325617074966) }, { FRAC_CONST(0.98720687627792), FRAC_CONST(0.48409134149551) }, { FRAC_CONST(-0.81689298152924), FRAC_CONST(-0.90827703475952) }, { FRAC_CONST(0.67866861820221), FRAC_CONST(0.81284505128860) }, { FRAC_CONST(-0.15808570384979), FRAC_CONST(0.85279554128647) }, { FRAC_CONST(0.80723392963409), FRAC_CONST(-0.24717418849468) }, { FRAC_CONST(0.47788757085800), FRAC_CONST(-0.46333149075508) }, { FRAC_CONST(0.96367555856705), FRAC_CONST(0.38486748933792) }, { FRAC_CONST(-0.99143874645233), FRAC_CONST(-0.24945276975632) }, { FRAC_CONST(0.83081877231598), FRAC_CONST(-0.94780850410461) }, { FRAC_CONST(-0.58753192424774), FRAC_CONST(0.01290772389621) }, { FRAC_CONST(0.95538109540939), FRAC_CONST(-0.85557049512863) }, { FRAC_CONST(-0.96490919589996), FRAC_CONST(-0.64020973443985) }, { FRAC_CONST(-0.97327101230621), FRAC_CONST(0.12378127872944) }, { FRAC_CONST(0.91400367021561), FRAC_CONST(0.57972472906113) }, { FRAC_CONST(-0.99925839900970), FRAC_CONST(0.71084845066071) }, { FRAC_CONST(-0.86875903606415), FRAC_CONST(-0.20291699469090) }, { FRAC_CONST(-0.26240035891533), FRAC_CONST(-0.68264555931091) }, { FRAC_CONST(-0.24664412438869), FRAC_CONST(-0.87642270326614) }, { FRAC_CONST(0.02416275814176), FRAC_CONST(0.27192914485931) }, { FRAC_CONST(0.82068622112274), FRAC_CONST(-0.85087788105011) }, { FRAC_CONST(0.88547372817993), FRAC_CONST(-0.89636802673340) }, { FRAC_CONST(-0.18173077702522), FRAC_CONST(-0.26152145862579) }, { FRAC_CONST(0.09355476498604), FRAC_CONST(0.54845124483109) }, { FRAC_CONST(-0.54668414592743), FRAC_CONST(0.95980775356293) }, { FRAC_CONST(0.37050989270210), FRAC_CONST(-0.59910142421722) }, { FRAC_CONST(-0.70373594760895), FRAC_CONST(0.91227668523788) }, { FRAC_CONST(-0.34600785374641), FRAC_CONST(-0.99441426992416) }, { FRAC_CONST(-0.68774479627609), FRAC_CONST(-0.30238837003708) }, { FRAC_CONST(-0.26843291521072), FRAC_CONST(0.83115667104721) }, { FRAC_CONST(0.49072334170341), FRAC_CONST(-0.45359709858894) }, { FRAC_CONST(0.38975992798805), FRAC_CONST(0.95515358448029) }, { FRAC_CONST(-0.97757124900818), FRAC_CONST(0.05305894464254) }, { FRAC_CONST(-0.17325553297997), FRAC_CONST(-0.92770671844482) }, { FRAC_CONST(0.99948036670685), FRAC_CONST(0.58285546302795) }, { FRAC_CONST(-0.64946246147156), FRAC_CONST(0.68645507097244) }, { FRAC_CONST(-0.12016920745373), FRAC_CONST(-0.57147324085236) }, { FRAC_CONST(-0.58947455883026), FRAC_CONST(-0.34847131371498) }, { FRAC_CONST(-0.41815140843391), FRAC_CONST(0.16276422142982) }, { FRAC_CONST(0.99885648488998), FRAC_CONST(0.11136095225811) }, { FRAC_CONST(-0.56649613380432), FRAC_CONST(-0.90494865179062) }, { FRAC_CONST(0.94138020277023), FRAC_CONST(0.35281917452812) }, { FRAC_CONST(-0.75725078582764), FRAC_CONST(0.53650552034378) }, { FRAC_CONST(0.20541973412037), FRAC_CONST(-0.94435143470764) }, { FRAC_CONST(0.99980372190475), FRAC_CONST(0.79835915565491) }, { FRAC_CONST(0.29078277945518), FRAC_CONST(0.35393777489662) }, { FRAC_CONST(-0.62858772277832), FRAC_CONST(0.38765692710876) }, { FRAC_CONST(0.43440905213356), FRAC_CONST(-0.98546332120895) }, { FRAC_CONST(-0.98298585414886), FRAC_CONST(0.21021524071693) }, { FRAC_CONST(0.19513028860092), FRAC_CONST(-0.94239830970764) }, { FRAC_CONST(-0.95476663112640), FRAC_CONST(0.98364555835724) }, { FRAC_CONST(0.93379634618759), FRAC_CONST(-0.70881992578506) }, { FRAC_CONST(-0.85235410928726), FRAC_CONST(-0.08342348039150) }, { FRAC_CONST(-0.86425095796585), FRAC_CONST(-0.45795026421547) }, { FRAC_CONST(0.38879778981209), FRAC_CONST(0.97274428606033) }, { FRAC_CONST(0.92045122385025), FRAC_CONST(-0.62433654069901) }, { FRAC_CONST(0.89162534475327), FRAC_CONST(0.54950958490372) }, { FRAC_CONST(-0.36834338307381), FRAC_CONST(0.96458297967911) }, { FRAC_CONST(0.93891763687134), FRAC_CONST(-0.89968353509903) }, { FRAC_CONST(0.99267655611038), FRAC_CONST(-0.03757034242153) }, { FRAC_CONST(-0.94063472747803), FRAC_CONST(0.41332337260246) }, { FRAC_CONST(0.99740225076675), FRAC_CONST(-0.16830494999886) }, { FRAC_CONST(-0.35899412631989), FRAC_CONST(-0.46633225679398) }, { FRAC_CONST(0.05237237364054), FRAC_CONST(-0.25640362501144) }, { FRAC_CONST(0.36703583598137), FRAC_CONST(-0.38653266429901) }, { FRAC_CONST(0.91653180122375), FRAC_CONST(-0.30587628483772) }, { FRAC_CONST(0.69000804424286), FRAC_CONST(0.90952169895172) }, { FRAC_CONST(-0.38658750057220), FRAC_CONST(0.99501574039459) }, { FRAC_CONST(-0.29250815510750), FRAC_CONST(0.37444993853569) }, { FRAC_CONST(-0.60182201862335), FRAC_CONST(0.86779648065567) }, { FRAC_CONST(-0.97418588399887), FRAC_CONST(0.96468526124954) }, { FRAC_CONST(0.88461571931839), FRAC_CONST(0.57508403062820) }, { FRAC_CONST(0.05198933184147), FRAC_CONST(0.21269661188126) }, { FRAC_CONST(-0.53499621152878), FRAC_CONST(0.97241556644440) }, { FRAC_CONST(-0.49429559707642), FRAC_CONST(0.98183864355087) }, { FRAC_CONST(-0.98935145139694), FRAC_CONST(-0.40249159932137) }, { FRAC_CONST(-0.98081380128860), FRAC_CONST(-0.72856897115707) }, { FRAC_CONST(-0.27338150143623), FRAC_CONST(0.99950921535492) }, { FRAC_CONST(0.06310802698135), FRAC_CONST(-0.54539585113525) }, { FRAC_CONST(-0.20461677014828), FRAC_CONST(-0.14209978282452) }, { FRAC_CONST(0.66223841905594), FRAC_CONST(0.72528582811356) }, { FRAC_CONST(-0.84764343500137), FRAC_CONST(0.02372316829860) }, { FRAC_CONST(-0.89039862155914), FRAC_CONST(0.88866579532623) }, { FRAC_CONST(0.95903307199478), FRAC_CONST(0.76744925975800) }, { FRAC_CONST(0.73504126071930), FRAC_CONST(-0.03747203201056) }, { FRAC_CONST(-0.31744435429573), FRAC_CONST(-0.36834111809731) }, { FRAC_CONST(-0.34110826253891), FRAC_CONST(0.40211221575737) }, { FRAC_CONST(0.47803884744644), FRAC_CONST(-0.39423218369484) }, { FRAC_CONST(0.98299193382263), FRAC_CONST(0.01989791356027) }, { FRAC_CONST(-0.30963072180748), FRAC_CONST(-0.18076720833778) }, { FRAC_CONST(0.99992591142654), FRAC_CONST(-0.26281872391701) }, { FRAC_CONST(-0.93149733543396), FRAC_CONST(-0.98313164710999) }, { FRAC_CONST(0.99923473596573), FRAC_CONST(-0.80142992734909) }, { FRAC_CONST(-0.26024168729782), FRAC_CONST(-0.75999760627747) }, { FRAC_CONST(-0.35712513327599), FRAC_CONST(0.19298963248730) }, { FRAC_CONST(-0.99899083375931), FRAC_CONST(0.74645155668259) }, { FRAC_CONST(0.86557173728943), FRAC_CONST(0.55593866109848) }, { FRAC_CONST(0.33408042788506), FRAC_CONST(0.86185956001282) }, { FRAC_CONST(0.99010735750198), FRAC_CONST(0.04602397605777) }, { FRAC_CONST(-0.66694271564484), FRAC_CONST(-0.91643613576889) }, { FRAC_CONST(0.64016789197922), FRAC_CONST(0.15649530291557) }, { FRAC_CONST(0.99570536613464), FRAC_CONST(0.45844584703445) }, { FRAC_CONST(-0.63431465625763), FRAC_CONST(0.21079117059708) }, { FRAC_CONST(-0.07706847041845), FRAC_CONST(-0.89581435918808) }, { FRAC_CONST(0.98590087890625), FRAC_CONST(0.88241720199585) }, { FRAC_CONST(0.80099332332611), FRAC_CONST(-0.36851897835732) }, { FRAC_CONST(0.78368133306503), FRAC_CONST(0.45506998896599) }, { FRAC_CONST(0.08707806468010), FRAC_CONST(0.80938994884491) }, { FRAC_CONST(-0.86811882257462), FRAC_CONST(0.39347308874130) }, { FRAC_CONST(-0.39466530084610), FRAC_CONST(-0.66809433698654) }, { FRAC_CONST(0.97875326871872), FRAC_CONST(-0.72467839717865) }, { FRAC_CONST(-0.95038563013077), FRAC_CONST(0.89563220739365) }, { FRAC_CONST(0.17005239427090), FRAC_CONST(0.54683053493500) }, { FRAC_CONST(-0.76910793781281), FRAC_CONST(-0.96226614713669) }, { FRAC_CONST(0.99743282794952), FRAC_CONST(0.42697158455849) }, { FRAC_CONST(0.95437383651733), FRAC_CONST(0.97002321481705) }, { FRAC_CONST(0.99578905105591), FRAC_CONST(-0.54106825590134) }, { FRAC_CONST(0.28058260679245), FRAC_CONST(-0.85361421108246) }, { FRAC_CONST(0.85256522893906), FRAC_CONST(-0.64567607641220) }, { FRAC_CONST(-0.50608539581299), FRAC_CONST(-0.65846014022827) }, { FRAC_CONST(-0.97210735082626), FRAC_CONST(-0.23095212876797) }, { FRAC_CONST(0.95424050092697), FRAC_CONST(-0.99240148067474) }, { FRAC_CONST(-0.96926569938660), FRAC_CONST(0.73775655031204) }, { FRAC_CONST(0.30872163176537), FRAC_CONST(0.41514959931374) }, { FRAC_CONST(-0.24523839354515), FRAC_CONST(0.63206630945206) }, { FRAC_CONST(-0.33813264966011), FRAC_CONST(-0.38661777973175) }, { FRAC_CONST(-0.05826828256249), FRAC_CONST(-0.06940773874521) }, { FRAC_CONST(-0.22898460924625), FRAC_CONST(0.97054851055145) }, { FRAC_CONST(-0.18509915471077), FRAC_CONST(0.47565764188766) }, { FRAC_CONST(-0.10488238185644), FRAC_CONST(-0.87769949436188) }, { FRAC_CONST(-0.71886587142944), FRAC_CONST(0.78030979633331) }, { FRAC_CONST(0.99793875217438), FRAC_CONST(0.90041309595108) }, { FRAC_CONST(0.57563304901123), FRAC_CONST(-0.91034334897995) }, { FRAC_CONST(0.28909647464752), FRAC_CONST(0.96307784318924) }, { FRAC_CONST(0.42188999056816), FRAC_CONST(0.48148649930954) }, { FRAC_CONST(0.93335050344467), FRAC_CONST(-0.43537023663521) }, { FRAC_CONST(-0.97087377309799), FRAC_CONST(0.86636447906494) }, { FRAC_CONST(0.36722871661186), FRAC_CONST(0.65291655063629) }, { FRAC_CONST(-0.81093025207520), FRAC_CONST(0.08778370171785) }, { FRAC_CONST(-0.26240602135658), FRAC_CONST(-0.92774093151093) }, { FRAC_CONST(0.83996498584747), FRAC_CONST(0.55839848518372) }, { FRAC_CONST(-0.99909615516663), FRAC_CONST(-0.96024608612061) }, { FRAC_CONST(0.74649465084076), FRAC_CONST(0.12144893407822) }, { FRAC_CONST(-0.74774593114853), FRAC_CONST(-0.26898062229156) }, { FRAC_CONST(0.95781666040421), FRAC_CONST(-0.79047924280167) }, { FRAC_CONST(0.95472306013107), FRAC_CONST(-0.08588775992393) }, { FRAC_CONST(0.48708331584930), FRAC_CONST(0.99999040365219) }, { FRAC_CONST(0.46332037448883), FRAC_CONST(0.10964126139879) }, { FRAC_CONST(-0.76497006416321), FRAC_CONST(0.89210927486420) }, { FRAC_CONST(0.57397389411926), FRAC_CONST(0.35289704799652) }, { FRAC_CONST(0.75374317169189), FRAC_CONST(0.96705216169357) }, { FRAC_CONST(-0.59174400568008), FRAC_CONST(-0.89405369758606) }, { FRAC_CONST(0.75087904930115), FRAC_CONST(-0.29612672328949) }, { FRAC_CONST(-0.98607856035233), FRAC_CONST(0.25034910440445) }, { FRAC_CONST(-0.40761056542397), FRAC_CONST(-0.90045571327209) }, { FRAC_CONST(0.66929268836975), FRAC_CONST(0.98629492521286) }, { FRAC_CONST(-0.97463697195053), FRAC_CONST(-0.00190223299433) }, { FRAC_CONST(0.90145510435104), FRAC_CONST(0.99781388044357) }, { FRAC_CONST(-0.87259286642075), FRAC_CONST(0.99233585596085) }, { FRAC_CONST(-0.91529458761215), FRAC_CONST(-0.15698707103729) }, { FRAC_CONST(-0.03305738791823), FRAC_CONST(-0.37205263972282) }, { FRAC_CONST(0.07223051041365), FRAC_CONST(-0.88805001974106) }, { FRAC_CONST(0.99498009681702), FRAC_CONST(0.97094357013702) }, { FRAC_CONST(-0.74904936552048), FRAC_CONST(0.99985486268997) }, { FRAC_CONST(0.04585228487849), FRAC_CONST(0.99812334775925) }, { FRAC_CONST(-0.89054954051971), FRAC_CONST(-0.31791913509369) }, { FRAC_CONST(-0.83782142400742), FRAC_CONST(0.97637635469437) }, { FRAC_CONST(0.33454805612564), FRAC_CONST(-0.86231517791748) }, { FRAC_CONST(-0.99707579612732), FRAC_CONST(0.93237990140915) }, { FRAC_CONST(-0.22827528417110), FRAC_CONST(0.18874759972095) }, { FRAC_CONST(0.67248046398163), FRAC_CONST(-0.03646211326122) }, { FRAC_CONST(-0.05146538093686), FRAC_CONST(-0.92599701881409) }, { FRAC_CONST(0.99947297573090), FRAC_CONST(0.93625229597092) }, { FRAC_CONST(0.66951125860214), FRAC_CONST(0.98905825614929) }, { FRAC_CONST(-0.99602955579758), FRAC_CONST(-0.44654715061188) }, { FRAC_CONST(0.82104903459549), FRAC_CONST(0.99540740251541) }, { FRAC_CONST(0.99186509847641), FRAC_CONST(0.72022998332977) }, { FRAC_CONST(-0.65284591913223), FRAC_CONST(0.52186721563339) }, { FRAC_CONST(0.93885445594788), FRAC_CONST(-0.74895310401917) }, { FRAC_CONST(0.96735250949860), FRAC_CONST(0.90891814231873) }, { FRAC_CONST(-0.22225968539715), FRAC_CONST(0.57124030590057) }, { FRAC_CONST(-0.44132784008980), FRAC_CONST(-0.92688840627670) }, { FRAC_CONST(-0.85694974660873), FRAC_CONST(0.88844531774521) }, { FRAC_CONST(0.91783040761948), FRAC_CONST(-0.46356892585754) }, { FRAC_CONST(0.72556972503662), FRAC_CONST(-0.99899554252625) }, { FRAC_CONST(-0.99711579084396), FRAC_CONST(0.58211559057236) }, { FRAC_CONST(0.77638977766037), FRAC_CONST(0.94321835041046) }, { FRAC_CONST(0.07717324048281), FRAC_CONST(0.58638399839401) }, { FRAC_CONST(-0.56049829721451), FRAC_CONST(0.82522302865982) }, { FRAC_CONST(0.98398894071579), FRAC_CONST(0.39467439055443) }, { FRAC_CONST(0.47546947002411), FRAC_CONST(0.68613046407700) }, { FRAC_CONST(0.65675091743469), FRAC_CONST(0.18331636488438) }, { FRAC_CONST(0.03273375332355), FRAC_CONST(-0.74933111667633) }, { FRAC_CONST(-0.38684144616127), FRAC_CONST(0.51337349414825) }, { FRAC_CONST(-0.97346270084381), FRAC_CONST(-0.96549361944199) }, { FRAC_CONST(-0.53282153606415), FRAC_CONST(-0.91423267126083) }, { FRAC_CONST(0.99817311763763), FRAC_CONST(0.61133575439453) }, { FRAC_CONST(-0.50254499912262), FRAC_CONST(-0.88829338550568) }, { FRAC_CONST(0.01995873264968), FRAC_CONST(0.85223513841629) }, { FRAC_CONST(0.99930381774902), FRAC_CONST(0.94578897953033) }, { FRAC_CONST(0.82907766103745), FRAC_CONST(-0.06323442608118) }, { FRAC_CONST(-0.58660709857941), FRAC_CONST(0.96840775012970) }, { FRAC_CONST(-0.17573736608028), FRAC_CONST(-0.48166921734810) }, { FRAC_CONST(0.83434289693832), FRAC_CONST(-0.13023450970650) }, { FRAC_CONST(0.05946491286159), FRAC_CONST(0.20511047542095) }, { FRAC_CONST(0.81505483388901), FRAC_CONST(-0.94685947895050) }, { FRAC_CONST(-0.44976380467415), FRAC_CONST(0.40894573926926) }, { FRAC_CONST(-0.89746475219727), FRAC_CONST(0.99846577644348) }, { FRAC_CONST(0.39677256345749), FRAC_CONST(-0.74854665994644) }, { FRAC_CONST(-0.07588948309422), FRAC_CONST(0.74096214771271) }, { FRAC_CONST(0.76343196630478), FRAC_CONST(0.41746628284454) }, { FRAC_CONST(-0.74490106105804), FRAC_CONST(0.94725912809372) }, { FRAC_CONST(0.64880120754242), FRAC_CONST(0.41336661577225) }, { FRAC_CONST(0.62319535017014), FRAC_CONST(-0.93098312616348) }, { FRAC_CONST(0.42215818166733), FRAC_CONST(-0.07712787389755) }, { FRAC_CONST(0.02704554051161), FRAC_CONST(-0.05417517945170) }, { FRAC_CONST(0.80001771450043), FRAC_CONST(0.91542196273804) }, { FRAC_CONST(-0.79351830482483), FRAC_CONST(-0.36208897829056) }, { FRAC_CONST(0.63872361183167), FRAC_CONST(0.08128252625465) }, { FRAC_CONST(0.52890521287918), FRAC_CONST(0.60048872232437) }, { FRAC_CONST(0.74238550662994), FRAC_CONST(0.04491915181279) }, { FRAC_CONST(0.99096131324768), FRAC_CONST(-0.19451183080673) }, { FRAC_CONST(-0.80412328243256), FRAC_CONST(-0.88513815402985) }, { FRAC_CONST(-0.64612615108490), FRAC_CONST(0.72198677062988) }, { FRAC_CONST(0.11657770723104), FRAC_CONST(-0.83662831783295) }, { FRAC_CONST(-0.95053184032440), FRAC_CONST(-0.96939903497696) }, { FRAC_CONST(-0.62228870391846), FRAC_CONST(0.82767260074615) }, { FRAC_CONST(0.03004475869238), FRAC_CONST(-0.99738895893097) }, { FRAC_CONST(-0.97987216711044), FRAC_CONST(0.36526128649712) }, { FRAC_CONST(-0.99986982345581), FRAC_CONST(-0.36021611094475) }, { FRAC_CONST(0.89110648632050), FRAC_CONST(-0.97894251346588) }, { FRAC_CONST(0.10407960414886), FRAC_CONST(0.77357792854309) }, { FRAC_CONST(0.95964735746384), FRAC_CONST(-0.35435819625854) }, { FRAC_CONST(0.50843232870102), FRAC_CONST(0.96107691526413) }, { FRAC_CONST(0.17006334662437), FRAC_CONST(-0.76854026317596) }, { FRAC_CONST(0.25872674584389), FRAC_CONST(0.99893301725388) }, { FRAC_CONST(-0.01115998718888), FRAC_CONST(0.98496019840240) }, { FRAC_CONST(-0.79598701000214), FRAC_CONST(0.97138410806656) }, { FRAC_CONST(-0.99264711141586), FRAC_CONST(-0.99542820453644) }, { FRAC_CONST(-0.99829661846161), FRAC_CONST(0.01877138763666) }, { FRAC_CONST(-0.70801013708115), FRAC_CONST(0.33680686354637) }, { FRAC_CONST(-0.70467054843903), FRAC_CONST(0.93272775411606) }, { FRAC_CONST(0.99846023321152), FRAC_CONST(-0.98725748062134) }, { FRAC_CONST(-0.63364970684052), FRAC_CONST(-0.16473594307899) }, { FRAC_CONST(-0.16258217394352), FRAC_CONST(-0.95939123630524) }, { FRAC_CONST(-0.43645593523979), FRAC_CONST(-0.94805032014847) }, { FRAC_CONST(-0.99848473072052), FRAC_CONST(0.96245169639587) }, { FRAC_CONST(-0.16796459257603), FRAC_CONST(-0.98987513780594) }, { FRAC_CONST(-0.87979227304459), FRAC_CONST(-0.71725726127625) }, { FRAC_CONST(0.44183099269867), FRAC_CONST(-0.93568974733353) }, { FRAC_CONST(0.93310177326202), FRAC_CONST(-0.99913311004639) }, { FRAC_CONST(-0.93941932916641), FRAC_CONST(-0.56409376859665) }, { FRAC_CONST(-0.88590002059937), FRAC_CONST(0.47624599933624) }, { FRAC_CONST(0.99971461296082), FRAC_CONST(-0.83889955282211) }, { FRAC_CONST(-0.75376385450363), FRAC_CONST(0.00814643409103) }, { FRAC_CONST(0.93887686729431), FRAC_CONST(-0.11284527927637) }, { FRAC_CONST(0.85126435756683), FRAC_CONST(0.52349251508713) }, { FRAC_CONST(0.39701420068741), FRAC_CONST(0.81779634952545) }, { FRAC_CONST(-0.37024465203285), FRAC_CONST(-0.87071657180786) }, { FRAC_CONST(-0.36024826765060), FRAC_CONST(0.34655734896660) }, { FRAC_CONST(-0.93388813734055), FRAC_CONST(-0.84476542472839) }, { FRAC_CONST(-0.65298801660538), FRAC_CONST(-0.18439576029778) }, { FRAC_CONST(0.11960318684578), FRAC_CONST(0.99899345636368) }, { FRAC_CONST(0.94292563199997), FRAC_CONST(0.83163905143738) }, { FRAC_CONST(0.75081145763397), FRAC_CONST(-0.35533222556114) }, { FRAC_CONST(0.56721979379654), FRAC_CONST(-0.24076835811138) }, { FRAC_CONST(0.46857765316963), FRAC_CONST(-0.30140233039856) }, { FRAC_CONST(0.97312313318253), FRAC_CONST(-0.99548190832138) }, { FRAC_CONST(-0.38299977779388), FRAC_CONST(0.98516911268234) }, { FRAC_CONST(0.41025799512863), FRAC_CONST(0.02116736955941) }, { FRAC_CONST(0.09638062119484), FRAC_CONST(0.04411984235048) }, { FRAC_CONST(-0.85283249616623), FRAC_CONST(0.91475564241409) }, { FRAC_CONST(0.88866806030273), FRAC_CONST(-0.99735265970230) }, { FRAC_CONST(-0.48202428221703), FRAC_CONST(-0.96805608272552) }, { FRAC_CONST(0.27572581171989), FRAC_CONST(0.58634752035141) }, { FRAC_CONST(-0.65889132022858), FRAC_CONST(0.58835631608963) }, { FRAC_CONST(0.98838084936142), FRAC_CONST(0.99994349479675) }, { FRAC_CONST(-0.20651349425316), FRAC_CONST(0.54593044519424) }, { FRAC_CONST(-0.62126415967941), FRAC_CONST(-0.59893679618835) }, { FRAC_CONST(0.20320105552673), FRAC_CONST(-0.86879181861877) }, { FRAC_CONST(-0.97790551185608), FRAC_CONST(0.96290808916092) }, { FRAC_CONST(0.11112534999847), FRAC_CONST(0.21484763920307) }, { FRAC_CONST(-0.41368338465691), FRAC_CONST(0.28216838836670) }, { FRAC_CONST(0.24133038520813), FRAC_CONST(0.51294362545013) }, { FRAC_CONST(-0.66393411159515), FRAC_CONST(-0.08249679952860) }, { FRAC_CONST(-0.53697830438614), FRAC_CONST(-0.97649902105331) }, { FRAC_CONST(-0.97224736213684), FRAC_CONST(0.22081333398819) }, { FRAC_CONST(0.87392479181290), FRAC_CONST(-0.12796173989773) }, { FRAC_CONST(0.19050361216068), FRAC_CONST(0.01602615416050) }, { FRAC_CONST(-0.46353441476822), FRAC_CONST(-0.95249038934708) }, { FRAC_CONST(-0.07064096629620), FRAC_CONST(-0.94479805231094) }, { FRAC_CONST(-0.92444086074829), FRAC_CONST(-0.10457590222359) }, { FRAC_CONST(-0.83822596073151), FRAC_CONST(-0.01695043221116) }, { FRAC_CONST(0.75214684009552), FRAC_CONST(-0.99955683946609) }, { FRAC_CONST(-0.42102998495102), FRAC_CONST(0.99720942974091) }, { FRAC_CONST(-0.72094786167145), FRAC_CONST(-0.35008960962296) }, { FRAC_CONST(0.78843313455582), FRAC_CONST(0.52851396799088) }, { FRAC_CONST(0.97394025325775), FRAC_CONST(-0.26695942878723) }, { FRAC_CONST(0.99206465482712), FRAC_CONST(-0.57010120153427) }, { FRAC_CONST(0.76789611577988), FRAC_CONST(-0.76519358158112) }, { FRAC_CONST(-0.82002419233322), FRAC_CONST(-0.73530179262161) }, { FRAC_CONST(0.81924992799759), FRAC_CONST(0.99698424339294) }, { FRAC_CONST(-0.26719850301743), FRAC_CONST(0.68903368711472) }, { FRAC_CONST(-0.43311259150505), FRAC_CONST(0.85321813821793) }, { FRAC_CONST(0.99194979667664), FRAC_CONST(0.91876250505447) }, { FRAC_CONST(-0.80691999197006), FRAC_CONST(-0.32627540826797) }, { FRAC_CONST(0.43080005049706), FRAC_CONST(-0.21919095516205) }, { FRAC_CONST(0.67709493637085), FRAC_CONST(-0.95478075742722) }, { FRAC_CONST(0.56151771545410), FRAC_CONST(-0.70693808794022) }, { FRAC_CONST(0.10831862688065), FRAC_CONST(-0.08628837019205) }, { FRAC_CONST(0.91229414939880), FRAC_CONST(-0.65987348556519) }, { FRAC_CONST(-0.48972892761230), FRAC_CONST(0.56289243698120) }, { FRAC_CONST(-0.89033657312393), FRAC_CONST(-0.71656566858292) }, { FRAC_CONST(0.65269446372986), FRAC_CONST(0.65916007757187) }, { FRAC_CONST(0.67439478635788), FRAC_CONST(-0.81684380769730) }, { FRAC_CONST(-0.47770830988884), FRAC_CONST(-0.16789555549622) }, { FRAC_CONST(-0.99715977907181), FRAC_CONST(-0.93565785884857) }, { FRAC_CONST(-0.90889590978622), FRAC_CONST(0.62034398317337) }, { FRAC_CONST(-0.06618622690439), FRAC_CONST(-0.23812216520309) }, { FRAC_CONST(0.99430269002914), FRAC_CONST(0.18812555074692) }, { FRAC_CONST(0.97686403989792), FRAC_CONST(-0.28664535284042) }, { FRAC_CONST(0.94813650846481), FRAC_CONST(-0.97506642341614) }, { FRAC_CONST(-0.95434498786926), FRAC_CONST(-0.79607981443405) }, { FRAC_CONST(-0.49104782938957), FRAC_CONST(0.32895213365555) }, { FRAC_CONST(0.99881172180176), FRAC_CONST(0.88993984460831) }, { FRAC_CONST(0.50449168682098), FRAC_CONST(-0.85995072126389) }, { FRAC_CONST(0.47162890434265), FRAC_CONST(-0.18680204451084) }, { FRAC_CONST(-0.62081581354141), FRAC_CONST(0.75000673532486) }, { FRAC_CONST(-0.43867015838623), FRAC_CONST(0.99998068809509) }, { FRAC_CONST(0.98630565404892), FRAC_CONST(-0.53578901290894) }, { FRAC_CONST(-0.61510360240936), FRAC_CONST(-0.89515018463135) }, { FRAC_CONST(-0.03841517493129), FRAC_CONST(-0.69888818264008) }, { FRAC_CONST(-0.30102157592773), FRAC_CONST(-0.07667808979750) }, { FRAC_CONST(0.41881284117699), FRAC_CONST(0.02188098989427) }, { FRAC_CONST(-0.86135452985764), FRAC_CONST(0.98947483301163) }, { FRAC_CONST(0.67226862907410), FRAC_CONST(-0.13494388759136) }, { FRAC_CONST(-0.70737397670746), FRAC_CONST(-0.76547348499298) }, { FRAC_CONST(0.94044947624207), FRAC_CONST(0.09026201069355) }, { FRAC_CONST(-0.82386350631714), FRAC_CONST(0.08924768865108) }, { FRAC_CONST(-0.32070666551590), FRAC_CONST(0.50143420696259) }, { FRAC_CONST(0.57593160867691), FRAC_CONST(-0.98966425657272) }, { FRAC_CONST(-0.36326017975807), FRAC_CONST(0.07440242916346) }, { FRAC_CONST(0.99979043006897), FRAC_CONST(-0.14130286872387) }, { FRAC_CONST(-0.92366021871567), FRAC_CONST(-0.97979295253754) }, { FRAC_CONST(-0.44607177376747), FRAC_CONST(-0.54233253002167) }, { FRAC_CONST(0.44226801395416), FRAC_CONST(0.71326756477356) }, { FRAC_CONST(0.03671907261014), FRAC_CONST(0.63606387376785) }, { FRAC_CONST(0.52175426483154), FRAC_CONST(-0.85396826267242) }, { FRAC_CONST(-0.94701141119003), FRAC_CONST(-0.01826348155737) }, { FRAC_CONST(-0.98759609460831), FRAC_CONST(0.82288712263107) }, { FRAC_CONST(0.87434792518616), FRAC_CONST(0.89399492740631) }, { FRAC_CONST(-0.93412041664124), FRAC_CONST(0.41374051570892) }, { FRAC_CONST(0.96063941717148), FRAC_CONST(0.93116706609726) }, { FRAC_CONST(0.97534251213074), FRAC_CONST(0.86150932312012) }, { FRAC_CONST(0.99642467498779), FRAC_CONST(0.70190042257309) }, { FRAC_CONST(-0.94705086946487), FRAC_CONST(-0.29580041766167) }, { FRAC_CONST(0.91599804162979), FRAC_CONST(-0.98147833347321) } }; #ifdef __cplusplus #endif #endif faad2-2.11.2/libfaad/sbr_qmf.c000066400000000000000000000554631476153623600157630ustar00rootroot00000000000000/* ** 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 "sbr_dct.h" #include "sbr_qmf.h" #include "sbr_qmf_c.h" #include "sbr_syntax.h" qmfa_info *qmfa_init(uint8_t channels) { qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info)); /* x is implemented as double ringbuffer */ qmfa->x = (real_t*)faad_malloc(2 * channels * 10 * sizeof(real_t)); memset(qmfa->x, 0, 2 * channels * 10 * sizeof(real_t)); /* ringbuffer index */ qmfa->x_index = 0; qmfa->channels = channels; return qmfa; } void qmfa_end(qmfa_info *qmfa) { if (qmfa) { if (qmfa->x) faad_free(qmfa->x); faad_free(qmfa); } } void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx) { ALIGN real_t u[64]; #ifndef SBR_LOW_POWER ALIGN real_t in_real[32], in_imag[32], out_real[32], out_imag[32]; #else ALIGN real_t y[32]; #endif uint32_t in = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { int16_t n; /* shift input buffer x */ /* input buffer is not shifted anymore, x is implemented as double ringbuffer */ //memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t)); /* add new samples to input buffer x */ for (n = 32 - 1; n >= 0; n--) { #ifdef FIXED_POINT qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = (input[in++]) >> 4; #else qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = input[in++]; #endif } /* window and summation to create array u */ for (n = 0; n < 64; n++) { u[n] = MUL_F(qmfa->x[qmfa->x_index + n], qmf_c[2*n]) + MUL_F(qmfa->x[qmfa->x_index + n + 64], qmf_c[2*(n + 64)]) + MUL_F(qmfa->x[qmfa->x_index + n + 128], qmf_c[2*(n + 128)]) + MUL_F(qmfa->x[qmfa->x_index + n + 192], qmf_c[2*(n + 192)]) + MUL_F(qmfa->x[qmfa->x_index + n + 256], qmf_c[2*(n + 256)]); } /* update ringbuffer index */ qmfa->x_index -= 32; if (qmfa->x_index < 0) qmfa->x_index = (320-32); /* calculate 32 subband samples by introducing X */ #ifdef SBR_LOW_POWER y[0] = u[48]; for (n = 1; n < 16; n++) y[n] = u[n+48] + u[48-n]; for (n = 16; n < 32; n++) y[n] = -u[n-16] + u[48-n]; DCT3_32_unscaled(u, y); for (n = 0; n < 32; n++) { if (n < kx) { #ifdef FIXED_POINT QMF_RE(X[l + offset][n]) = u[n] /*<< 1*/; #else QMF_RE(X[l + offset][n]) = 2. * u[n]; #endif } else { QMF_RE(X[l + offset][n]) = 0; } } #else // Reordering of data moved from DCT_IV to here in_imag[31] = u[1]; in_real[0] = u[0]; for (n = 1; n < 31; n++) { in_imag[31 - n] = u[n+1]; in_real[n] = -u[64-n]; } in_imag[0] = u[32]; in_real[31] = -u[33]; // dct4_kernel is DCT_IV without reordering which is done before and after FFT dct4_kernel(in_real, in_imag, out_real, out_imag); // Reordering of data moved from DCT_IV to here for (n = 0; n < 16; n++) { if (2*n+1 < kx) { #ifdef FIXED_POINT QMF_RE(X[l + offset][2*n]) = out_real[n]; QMF_IM(X[l + offset][2*n]) = out_imag[n]; QMF_RE(X[l + offset][2*n+1]) = -out_imag[31-n]; QMF_IM(X[l + offset][2*n+1]) = -out_real[31-n]; #else QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; QMF_RE(X[l + offset][2*n+1]) = -2. * out_imag[31-n]; QMF_IM(X[l + offset][2*n+1]) = -2. * out_real[31-n]; #endif } else { if (2*n < kx) { #ifdef FIXED_POINT QMF_RE(X[l + offset][2*n]) = out_real[n]; QMF_IM(X[l + offset][2*n]) = out_imag[n]; #else QMF_RE(X[l + offset][2*n]) = 2. * out_real[n]; QMF_IM(X[l + offset][2*n]) = 2. * out_imag[n]; #endif } else { QMF_RE(X[l + offset][2*n]) = 0; QMF_IM(X[l + offset][2*n]) = 0; } QMF_RE(X[l + offset][2*n+1]) = 0; QMF_IM(X[l + offset][2*n+1]) = 0; } } #endif } } static const complex_t qmf32_pre_twiddle[] = { { FRAC_CONST(0.999924701839145), FRAC_CONST(-0.012271538285720) }, { FRAC_CONST(0.999322384588350), FRAC_CONST(-0.036807222941359) }, { FRAC_CONST(0.998118112900149), FRAC_CONST(-0.061320736302209) }, { FRAC_CONST(0.996312612182778), FRAC_CONST(-0.085797312344440) }, { FRAC_CONST(0.993906970002356), FRAC_CONST(-0.110222207293883) }, { FRAC_CONST(0.990902635427780), FRAC_CONST(-0.134580708507126) }, { FRAC_CONST(0.987301418157858), FRAC_CONST(-0.158858143333861) }, { FRAC_CONST(0.983105487431216), FRAC_CONST(-0.183039887955141) }, { FRAC_CONST(0.978317370719628), FRAC_CONST(-0.207111376192219) }, { FRAC_CONST(0.972939952205560), FRAC_CONST(-0.231058108280671) }, { FRAC_CONST(0.966976471044852), FRAC_CONST(-0.254865659604515) }, { FRAC_CONST(0.960430519415566), FRAC_CONST(-0.278519689385053) }, { FRAC_CONST(0.953306040354194), FRAC_CONST(-0.302005949319228) }, { FRAC_CONST(0.945607325380521), FRAC_CONST(-0.325310292162263) }, { FRAC_CONST(0.937339011912575), FRAC_CONST(-0.348418680249435) }, { FRAC_CONST(0.928506080473216), FRAC_CONST(-0.371317193951838) }, { FRAC_CONST(0.919113851690058), FRAC_CONST(-0.393992040061048) }, { FRAC_CONST(0.909167983090522), FRAC_CONST(-0.416429560097637) }, { FRAC_CONST(0.898674465693954), FRAC_CONST(-0.438616238538528) }, { FRAC_CONST(0.887639620402854), FRAC_CONST(-0.460538710958240) }, { FRAC_CONST(0.876070094195407), FRAC_CONST(-0.482183772079123) }, { FRAC_CONST(0.863972856121587), FRAC_CONST(-0.503538383725718) }, { FRAC_CONST(0.851355193105265), FRAC_CONST(-0.524589682678469) }, { FRAC_CONST(0.838224705554838), FRAC_CONST(-0.545324988422046) }, { FRAC_CONST(0.824589302785025), FRAC_CONST(-0.565731810783613) }, { FRAC_CONST(0.810457198252595), FRAC_CONST(-0.585797857456439) }, { FRAC_CONST(0.795836904608884), FRAC_CONST(-0.605511041404326) }, { FRAC_CONST(0.780737228572094), FRAC_CONST(-0.624859488142386) }, { FRAC_CONST(0.765167265622459), FRAC_CONST(-0.643831542889791) }, { FRAC_CONST(0.749136394523459), FRAC_CONST(-0.662415777590172) }, { FRAC_CONST(0.732654271672413), FRAC_CONST(-0.680600997795453) }, { FRAC_CONST(0.715730825283819), FRAC_CONST(-0.698376249408973) } }; qmfs_info *qmfs_init(uint8_t channels) { qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info)); /* v is a double ringbuffer */ qmfs->v = (real_t*)faad_malloc(2 * channels * 20 * sizeof(real_t)); memset(qmfs->v, 0, 2 * channels * 20 * sizeof(real_t)); qmfs->v_index = 0; qmfs->channels = channels; return qmfs; } void qmfs_end(qmfs_info *qmfs) { if (qmfs) { if (qmfs->v) faad_free(qmfs->v); faad_free(qmfs); } } #ifdef SBR_LOW_POWER void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x[16]; ALIGN real_t y[16]; int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffers */ /* we are not shifting v, it is a double ringbuffer */ //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); /* calculate 64 samples */ for (k = 0; k < 16; k++) { #ifdef FIXED_POINT y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])); x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])); #else y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])) / 32.0; x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])) / 32.0; #endif } /* even n samples */ DCT2_16_unscaled(x, x); /* odd n samples */ DCT4_16(y, y); for (n = 8; n < 24; n++) { qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 640 + n*2] = x[n-8]; qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 640 + n*2+1] = y[n-8]; } for (n = 0; n < 16; n++) { qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = qmfs->v[qmfs->v_index + 32-n]; } qmfs->v[qmfs->v_index + 48] = qmfs->v[qmfs->v_index + 640 + 48] = 0; for (n = 1; n < 16; n++) { qmfs->v[qmfs->v_index + 48+n] = qmfs->v[qmfs->v_index + 640 + 48+n] = -qmfs->v[qmfs->v_index + 48-n]; } /* calculate 32 output samples and window */ for (k = 0; k < 32; k++) { output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); } /* update the ringbuffer index */ qmfs->v_index -= 64; if (qmfs->v_index < 0) qmfs->v_index = (640-64); } } void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x[64]; ALIGN real_t y[64]; int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffers */ /* we are not shifting v, it is a double ringbuffer */ //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); /* calculate 128 samples */ for (k = 0; k < 32; k++) { #ifdef FIXED_POINT y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])); x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])); #else y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])) / 32.0; x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])) / 32.0; #endif } /* even n samples */ DCT2_32_unscaled(x, x); /* odd n samples */ DCT4_32(y, y); for (n = 16; n < 48; n++) { qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 1280 + n*2] = x[n-16]; qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 1280 + n*2+1] = y[n-16]; } for (n = 0; n < 32; n++) { qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 1280 + n] = qmfs->v[qmfs->v_index + 64-n]; } qmfs->v[qmfs->v_index + 96] = qmfs->v[qmfs->v_index + 1280 + 96] = 0; for (n = 1; n < 32; n++) { qmfs->v[qmfs->v_index + 96+n] = qmfs->v[qmfs->v_index + 1280 + 96+n] = -qmfs->v[qmfs->v_index + 96-n]; } /* calculate 64 output samples and window */ for (k = 0; k < 64; k++) { output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[k]) + MUL_F(qmfs->v[qmfs->v_index + 192 + k], qmf_c[64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[128 + k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + 192 + k], qmf_c[128 + 64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[256 + k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + 192 + k], qmf_c[256 + 64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 768 + k], qmf_c[384 + k]) + MUL_F(qmfs->v[qmfs->v_index + 768 + 192 + k], qmf_c[384 + 64 + k]) + MUL_F(qmfs->v[qmfs->v_index + 1024 + k], qmf_c[512 + k]) + MUL_F(qmfs->v[qmfs->v_index + 1024 + 192 + k], qmf_c[512 + 64 + k]); } /* update the ringbuffer index */ qmfs->v_index -= 128; if (qmfs->v_index < 0) qmfs->v_index = (1280-128); } } #else void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { ALIGN real_t x1[32], x2[32]; #ifndef FIXED_POINT real_t scale = 1.f/64.f; #endif int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffer v */ /* buffer is not shifted, we are using a ringbuffer */ //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t)); /* calculate 64 samples */ /* complex pre-twiddle */ for (k = 0; k < 32; k++) { x1[k] = MUL_F(QMF_RE(X[l][k]), RE(qmf32_pre_twiddle[k])) - MUL_F(QMF_IM(X[l][k]), IM(qmf32_pre_twiddle[k])); x2[k] = MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k])); #ifndef FIXED_POINT x1[k] *= scale; x2[k] *= scale; #else x1[k] >>= 1; x2[k] >>= 1; #endif } /* transform */ DCT4_32(x1, x1); DST4_32(x2, x2); for (n = 0; n < 32; n++) { qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = -x1[n] + x2[n]; qmfs->v[qmfs->v_index + 63 - n] = qmfs->v[qmfs->v_index + 640 + 63 - n] = x1[n] + x2[n]; } /* calculate 32 output samples and window */ for (k = 0; k < 32; k++) { output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) + MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) + MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]); } /* update ringbuffer index */ qmfs->v_index -= 64; if (qmfs->v_index < 0) qmfs->v_index = (640 - 64); } } void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output) { // ALIGN real_t x1[64], x2[64]; #ifndef SBR_LOW_POWER ALIGN real_t in_real1[32], in_imag1[32], out_real1[32], out_imag1[32]; ALIGN real_t in_real2[32], in_imag2[32], out_real2[32], out_imag2[32]; #endif qmf_t * pX; real_t * pring_buffer_1, * pring_buffer_3; // real_t * ptemp_1, * ptemp_2; #ifdef PREFER_POINTERS // These pointers are used if target platform has autoinc address generators real_t * pring_buffer_2, * pring_buffer_4; real_t * pring_buffer_5, * pring_buffer_6; real_t * pring_buffer_7, * pring_buffer_8; real_t * pring_buffer_9, * pring_buffer_10; const real_t * pqmf_c_1, * pqmf_c_2, * pqmf_c_3, * pqmf_c_4; const real_t * pqmf_c_5, * pqmf_c_6, * pqmf_c_7, * pqmf_c_8; const real_t * pqmf_c_9, * pqmf_c_10; #endif // #ifdef PREFER_POINTERS #ifndef FIXED_POINT real_t scale = 1.f/64.f; #endif int32_t n, k, out = 0; uint8_t l; /* qmf subsample l */ for (l = 0; l < sbr->numTimeSlotsRate; l++) { /* shift buffer v */ /* buffer is not shifted, we use double ringbuffer */ //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t)); /* calculate 128 samples */ #ifndef FIXED_POINT pX = X[l]; in_imag1[31] = scale*QMF_RE(pX[1]); in_real1[0] = scale*QMF_RE(pX[0]); in_imag2[31] = scale*QMF_IM(pX[63-1]); in_real2[0] = scale*QMF_IM(pX[63-0]); for (k = 1; k < 31; k++) { in_imag1[31 - k] = scale*QMF_RE(pX[2*k + 1]); in_real1[ k] = scale*QMF_RE(pX[2*k ]); in_imag2[31 - k] = scale*QMF_IM(pX[63 - (2*k + 1)]); in_real2[ k] = scale*QMF_IM(pX[63 - (2*k )]); } in_imag1[0] = scale*QMF_RE(pX[63]); in_real1[31] = scale*QMF_RE(pX[62]); in_imag2[0] = scale*QMF_IM(pX[63-63]); in_real2[31] = scale*QMF_IM(pX[63-62]); #else pX = X[l]; in_imag1[31] = QMF_RE(pX[1]) >> 1; in_real1[0] = QMF_RE(pX[0]) >> 1; in_imag2[31] = QMF_IM(pX[62]) >> 1; in_real2[0] = QMF_IM(pX[63]) >> 1; for (k = 1; k < 31; k++) { in_imag1[31 - k] = QMF_RE(pX[2*k + 1]) >> 1; in_real1[ k] = QMF_RE(pX[2*k ]) >> 1; in_imag2[31 - k] = QMF_IM(pX[63 - (2*k + 1)]) >> 1; in_real2[ k] = QMF_IM(pX[63 - (2*k )]) >> 1; } in_imag1[0] = QMF_RE(pX[63]) >> 1; in_real1[31] = QMF_RE(pX[62]) >> 1; in_imag2[0] = QMF_IM(pX[0]) >> 1; in_real2[31] = QMF_IM(pX[1]) >> 1; #endif // dct4_kernel is DCT_IV without reordering which is done before and after FFT dct4_kernel(in_real1, in_imag1, out_real1, out_imag1); dct4_kernel(in_real2, in_imag2, out_real2, out_imag2); pring_buffer_1 = qmfs->v + qmfs->v_index; pring_buffer_3 = pring_buffer_1 + 1280; #ifdef PREFER_POINTERS pring_buffer_2 = pring_buffer_1 + 127; pring_buffer_4 = pring_buffer_1 + (1280 + 127); #endif // #ifdef PREFER_POINTERS // ptemp_1 = x1; // ptemp_2 = x2; #ifdef PREFER_POINTERS for (n = 0; n < 32; n ++) { //real_t x1 = *ptemp_1++; //real_t x2 = *ptemp_2++; // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer *pring_buffer_1++ = *pring_buffer_3++ = out_real2[n] - out_real1[n]; *pring_buffer_2-- = *pring_buffer_4-- = out_real2[n] + out_real1[n]; //x1 = *ptemp_1++; //x2 = *ptemp_2++; *pring_buffer_1++ = *pring_buffer_3++ = out_imag2[31-n] + out_imag1[31-n]; *pring_buffer_2-- = *pring_buffer_4-- = out_imag2[31-n] - out_imag1[31-n]; } #else // #ifdef PREFER_POINTERS for (n = 0; n < 32; n++) { // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer pring_buffer_1[2*n] = pring_buffer_3[2*n] = out_real2[n] - out_real1[n]; pring_buffer_1[127-2*n] = pring_buffer_3[127-2*n] = out_real2[n] + out_real1[n]; pring_buffer_1[2*n+1] = pring_buffer_3[2*n+1] = out_imag2[31-n] + out_imag1[31-n]; pring_buffer_1[127-(2*n+1)] = pring_buffer_3[127-(2*n+1)] = out_imag2[31-n] - out_imag1[31-n]; } #endif // #ifdef PREFER_POINTERS pring_buffer_1 = qmfs->v + qmfs->v_index; #ifdef PREFER_POINTERS pring_buffer_2 = pring_buffer_1 + 192; pring_buffer_3 = pring_buffer_1 + 256; pring_buffer_4 = pring_buffer_1 + (256 + 192); pring_buffer_5 = pring_buffer_1 + 512; pring_buffer_6 = pring_buffer_1 + (512 + 192); pring_buffer_7 = pring_buffer_1 + 768; pring_buffer_8 = pring_buffer_1 + (768 + 192); pring_buffer_9 = pring_buffer_1 + 1024; pring_buffer_10 = pring_buffer_1 + (1024 + 192); pqmf_c_1 = qmf_c; pqmf_c_2 = qmf_c + 64; pqmf_c_3 = qmf_c + 128; pqmf_c_4 = qmf_c + 192; pqmf_c_5 = qmf_c + 256; pqmf_c_6 = qmf_c + 320; pqmf_c_7 = qmf_c + 384; pqmf_c_8 = qmf_c + 448; pqmf_c_9 = qmf_c + 512; pqmf_c_10 = qmf_c + 576; #endif // #ifdef PREFER_POINTERS /* calculate 64 output samples and window */ for (k = 0; k < 64; k++) { #ifdef PREFER_POINTERS output[out++] = MUL_F(*pring_buffer_1++, *pqmf_c_1++) + MUL_F(*pring_buffer_2++, *pqmf_c_2++) + MUL_F(*pring_buffer_3++, *pqmf_c_3++) + MUL_F(*pring_buffer_4++, *pqmf_c_4++) + MUL_F(*pring_buffer_5++, *pqmf_c_5++) + MUL_F(*pring_buffer_6++, *pqmf_c_6++) + MUL_F(*pring_buffer_7++, *pqmf_c_7++) + MUL_F(*pring_buffer_8++, *pqmf_c_8++) + MUL_F(*pring_buffer_9++, *pqmf_c_9++) + MUL_F(*pring_buffer_10++, *pqmf_c_10++); #else // #ifdef PREFER_POINTERS output[out++] = MUL_F(pring_buffer_1[k+0], qmf_c[k+0]) + MUL_F(pring_buffer_1[k+192], qmf_c[k+64]) + MUL_F(pring_buffer_1[k+256], qmf_c[k+128]) + MUL_F(pring_buffer_1[k+(256+192)], qmf_c[k+192]) + MUL_F(pring_buffer_1[k+512], qmf_c[k+256]) + MUL_F(pring_buffer_1[k+(512+192)], qmf_c[k+320]) + MUL_F(pring_buffer_1[k+768], qmf_c[k+384]) + MUL_F(pring_buffer_1[k+(768+192)], qmf_c[k+448]) + MUL_F(pring_buffer_1[k+1024], qmf_c[k+512]) + MUL_F(pring_buffer_1[k+(1024+192)], qmf_c[k+576]); #endif // #ifdef PREFER_POINTERS } /* update ringbuffer index */ qmfs->v_index -= 128; if (qmfs->v_index < 0) qmfs->v_index = (1280 - 128); } } #endif #endif faad2-2.11.2/libfaad/sbr_qmf.h000066400000000000000000000036731476153623600157640ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_qmf.h,v 1.25 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_QMF_H__ #define __SBR_QMF_H__ #ifdef __cplusplus extern "C" { #endif qmfa_info *qmfa_init(uint8_t channels); void qmfa_end(qmfa_info *qmfa); qmfs_info *qmfs_init(uint8_t channels); void qmfs_end(qmfs_info *qmfs); void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input, qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx); void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output); void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64], real_t *output); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sbr_qmf_c.h000066400000000000000000000531521476153623600162630ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_qmf_c.h,v 1.17 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_QMF_C_H__ #define __SBR_QMF_C_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t qmf_c[640] = { FRAC_CONST(0), FRAC_CONST(-0.00055252865047), FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00049475180896), FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00048937912498), FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00052265642972), FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00056778025613), FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00061327473938), FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00065403333621), FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00069416146273), FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00072550431222), FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00074905980532), FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00077248485949), FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077798694927), FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00078014496257), FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00076307935757), FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00073193571525), FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00069179375372), FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00063415949025), FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00055645763906), FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00046063254803), FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00035011758756), FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.0002098337344), FRAC_CONST(-0.00014463809349), FRAC_CONST(-6.173344072E-005), FRAC_CONST(1.349497418E-005), FRAC_CONST(0.00010943831274), FRAC_CONST(0.00020430170688), FRAC_CONST(0.00029495311041), FRAC_CONST(0.0004026540216), FRAC_CONST(0.00051073884952), FRAC_CONST(0.00062393761391), FRAC_CONST(0.00074580258865), FRAC_CONST(0.00086084433262), FRAC_CONST(0.00098859883015), FRAC_CONST(0.00112501551307), FRAC_CONST(0.00125778846475), FRAC_CONST(0.00139024948272), FRAC_CONST(0.00154432198471), FRAC_CONST(0.00168680832531), FRAC_CONST(0.00183482654224), FRAC_CONST(0.00198411407369), FRAC_CONST(0.00214615835557), FRAC_CONST(0.00230172547746), FRAC_CONST(0.00246256169126), FRAC_CONST(0.00262017586902), FRAC_CONST(0.00278704643465), FRAC_CONST(0.00294694477165), FRAC_CONST(0.00311254206525), FRAC_CONST(0.00327396134847), FRAC_CONST(0.00344188741828), FRAC_CONST(0.00360082681231), FRAC_CONST(0.00376039229104), FRAC_CONST(0.00392074323703), FRAC_CONST(0.00408197531935), FRAC_CONST(0.0042264269227), FRAC_CONST(0.00437307196781), FRAC_CONST(0.00452098527825), FRAC_CONST(0.00466064606118), FRAC_CONST(0.00479325608498), FRAC_CONST(0.00491376035745), FRAC_CONST(0.00503930226013), FRAC_CONST(0.00514073539032), FRAC_CONST(0.00524611661324), FRAC_CONST(0.00534716811982), FRAC_CONST(0.00541967759307), FRAC_CONST(0.00548760401507), FRAC_CONST(0.00554757145088), FRAC_CONST(0.00559380230045), FRAC_CONST(0.00562206432097), FRAC_CONST(0.00564551969164), FRAC_CONST(0.00563891995151), FRAC_CONST(0.00562661141932), FRAC_CONST(0.0055917128663), FRAC_CONST(0.005540436394), FRAC_CONST(0.0054753783077), FRAC_CONST(0.0053838975897), FRAC_CONST(0.00527157587272), FRAC_CONST(0.00513822754514), FRAC_CONST(0.00498396877629), FRAC_CONST(0.004810946906), FRAC_CONST(0.00460395301471), FRAC_CONST(0.00438018617447), FRAC_CONST(0.0041251642327), FRAC_CONST(0.00384564081246), FRAC_CONST(0.00354012465507), FRAC_CONST(0.00320918858098), FRAC_CONST(0.00284467578623), FRAC_CONST(0.00245085400321), FRAC_CONST(0.0020274176185), FRAC_CONST(0.00157846825768), FRAC_CONST(0.00109023290512), FRAC_CONST(0.0005832264248), FRAC_CONST(2.760451905E-005), FRAC_CONST(-0.00054642808664), FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00180394725893), FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.003193377839), FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.004722259624), FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.00637922932685), FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00817982333726), FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.01011502154986), FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01218499959508), FRAC_CONST(0.01327182200351), FRAC_CONST(0.01439046660792), FRAC_CONST(0.01554055533423), FRAC_CONST(0.01673247129989), FRAC_CONST(0.01794333813443), FRAC_CONST(0.01918724313698), FRAC_CONST(0.02045317933555), FRAC_CONST(0.02174675502535), FRAC_CONST(0.02306801692862), FRAC_CONST(0.02441609920285), FRAC_CONST(0.02578758475467), FRAC_CONST(0.02718594296329), FRAC_CONST(0.02860721736385), FRAC_CONST(0.03005026574279), FRAC_CONST(0.03150176087389), FRAC_CONST(0.03297540810337), FRAC_CONST(0.03446209487686), FRAC_CONST(0.03596975605542), FRAC_CONST(0.03748128504252), FRAC_CONST(0.03900536794745), FRAC_CONST(0.04053491705584), FRAC_CONST(0.04206490946367), FRAC_CONST(0.04360975421304), FRAC_CONST(0.04514884056413), FRAC_CONST(0.04668430272642), FRAC_CONST(0.04821657200672), FRAC_CONST(0.04973857556014), FRAC_CONST(0.05125561555216), FRAC_CONST(0.05276307465207), FRAC_CONST(0.05424527683589), FRAC_CONST(0.05571736482138), FRAC_CONST(0.05716164501299), FRAC_CONST(0.0585915683626), FRAC_CONST(0.05998374801761), FRAC_CONST(0.06134551717207), FRAC_CONST(0.06268578081172), FRAC_CONST(0.06397158980681), FRAC_CONST(0.0652247106438), FRAC_CONST(0.06643675122104), FRAC_CONST(0.06760759851228), FRAC_CONST(0.06870438283512), FRAC_CONST(0.06976302447127), FRAC_CONST(0.07076287107266), FRAC_CONST(0.07170026731102), FRAC_CONST(0.07256825833083), FRAC_CONST(0.07336202550803), FRAC_CONST(0.07410036424342), FRAC_CONST(0.07474525581194), FRAC_CONST(0.07531373362019), FRAC_CONST(0.07580083586584), FRAC_CONST(0.07619924793396), FRAC_CONST(0.07649921704119), FRAC_CONST(0.07670934904245), FRAC_CONST(0.07681739756964), FRAC_CONST(0.07682300113923), FRAC_CONST(0.07672049241746), FRAC_CONST(0.07650507183194), FRAC_CONST(0.07617483218536), FRAC_CONST(0.07573057565061), FRAC_CONST(0.0751576255287), FRAC_CONST(0.07446643947564), FRAC_CONST(0.0736406005762), FRAC_CONST(0.07267746427299), FRAC_CONST(0.07158263647903), FRAC_CONST(0.07035330735093), FRAC_CONST(0.06896640131951), FRAC_CONST(0.06745250215166), FRAC_CONST(0.06576906686508), FRAC_CONST(0.06394448059633), FRAC_CONST(0.06196027790387), FRAC_CONST(0.0598166570809), FRAC_CONST(0.05751526919867), FRAC_CONST(0.05504600343009), FRAC_CONST(0.05240938217366), FRAC_CONST(0.04959786763445), FRAC_CONST(0.04663033051701), FRAC_CONST(0.04347687821958), FRAC_CONST(0.04014582784127), FRAC_CONST(0.03664181168133), FRAC_CONST(0.03295839306691), FRAC_CONST(0.02908240060125), FRAC_CONST(0.02503075618909), FRAC_CONST(0.02079970728622), FRAC_CONST(0.01637012582228), FRAC_CONST(0.01176238327857), FRAC_CONST(0.00696368621617), FRAC_CONST(0.00197656014503), FRAC_CONST(-0.00320868968304), FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.01412888273558), FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.02582272888064), FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.03827765720822), FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.05148041767934), FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.06544098531359), FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.08013729344279), FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.09555333528914), FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.1116826931773), FRAC_CONST(-0.120007798468), FRAC_CONST(-0.12850028503878), FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.1459766491187), FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.16409588556669), FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.18281725485142), FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.20212501768103), FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.22196526964149), FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.24230168845974), FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.26310532994603), FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.28432141891085), FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.30590985751916), FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.32781137272105), FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.3499914122931), FRAC_CONST(0.36115899031355), FRAC_CONST(0.37237955463061), FRAC_CONST(0.38363500139043), FRAC_CONST(0.39492117615675), FRAC_CONST(0.40623176767625), FRAC_CONST(0.41756968968409), FRAC_CONST(0.42891199207373), FRAC_CONST(0.44025537543665), FRAC_CONST(0.45159965356824), FRAC_CONST(0.46293080852757), FRAC_CONST(0.47424532146115), FRAC_CONST(0.48552530911099), FRAC_CONST(0.49677082545707), FRAC_CONST(0.50798175000434), FRAC_CONST(0.51912349702391), FRAC_CONST(0.53022408956855), FRAC_CONST(0.54125534487322), FRAC_CONST(0.55220512585061), FRAC_CONST(0.5630789140137), FRAC_CONST(0.57385241316923), FRAC_CONST(0.58454032354679), FRAC_CONST(0.59511230862496), FRAC_CONST(0.6055783538918), FRAC_CONST(0.61591099320291), FRAC_CONST(0.62612426956055), FRAC_CONST(0.63619801077286), FRAC_CONST(0.64612696959461), FRAC_CONST(0.65590163024671), FRAC_CONST(0.66551398801627), FRAC_CONST(0.67496631901712), FRAC_CONST(0.68423532934598), FRAC_CONST(0.69332823767032), FRAC_CONST(0.70223887193539), FRAC_CONST(0.71094104263095), FRAC_CONST(0.71944626349561), FRAC_CONST(0.72774489002994), FRAC_CONST(0.73582117582769), FRAC_CONST(0.74368278636488), FRAC_CONST(0.75131374561237), FRAC_CONST(0.75870807608242), FRAC_CONST(0.76586748650939), FRAC_CONST(0.77277808813327), FRAC_CONST(0.77942875190216), FRAC_CONST(0.7858353120392), FRAC_CONST(0.79197358416424), FRAC_CONST(0.797846641377), FRAC_CONST(0.80344857518505), FRAC_CONST(0.80876950044491), FRAC_CONST(0.81381912706217), FRAC_CONST(0.81857760046468), FRAC_CONST(0.82304198905409), FRAC_CONST(0.8272275347336), FRAC_CONST(0.8311038457152), FRAC_CONST(0.83469373618402), FRAC_CONST(0.83797173378865), FRAC_CONST(0.84095413924722), FRAC_CONST(0.84362382812005), FRAC_CONST(0.84598184698206), FRAC_CONST(0.84803157770763), FRAC_CONST(0.84978051984268), FRAC_CONST(0.85119715249343), FRAC_CONST(0.85230470352147), FRAC_CONST(0.85310209497017), FRAC_CONST(0.85357205739107), FRAC_CONST(0.85373856005937 /*max*/), FRAC_CONST(0.85357205739107), FRAC_CONST(0.85310209497017), FRAC_CONST(0.85230470352147), FRAC_CONST(0.85119715249343), FRAC_CONST(0.84978051984268), FRAC_CONST(0.84803157770763), FRAC_CONST(0.84598184698206), FRAC_CONST(0.84362382812005), FRAC_CONST(0.84095413924722), FRAC_CONST(0.83797173378865), FRAC_CONST(0.83469373618402), FRAC_CONST(0.8311038457152), FRAC_CONST(0.8272275347336), FRAC_CONST(0.82304198905409), FRAC_CONST(0.81857760046468), FRAC_CONST(0.81381912706217), FRAC_CONST(0.80876950044491), FRAC_CONST(0.80344857518505), FRAC_CONST(0.797846641377), FRAC_CONST(0.79197358416424), FRAC_CONST(0.7858353120392), FRAC_CONST(0.77942875190216), FRAC_CONST(0.77277808813327), FRAC_CONST(0.76586748650939), FRAC_CONST(0.75870807608242), FRAC_CONST(0.75131374561237), FRAC_CONST(0.74368278636488), FRAC_CONST(0.73582117582769), FRAC_CONST(0.72774489002994), FRAC_CONST(0.71944626349561), FRAC_CONST(0.71094104263095), FRAC_CONST(0.70223887193539), FRAC_CONST(0.69332823767032), FRAC_CONST(0.68423532934598), FRAC_CONST(0.67496631901712), FRAC_CONST(0.66551398801627), FRAC_CONST(0.65590163024671), FRAC_CONST(0.64612696959461), FRAC_CONST(0.63619801077286), FRAC_CONST(0.62612426956055), FRAC_CONST(0.61591099320291), FRAC_CONST(0.6055783538918), FRAC_CONST(0.59511230862496), FRAC_CONST(0.58454032354679), FRAC_CONST(0.57385241316923), FRAC_CONST(0.5630789140137), FRAC_CONST(0.55220512585061), FRAC_CONST(0.54125534487322), FRAC_CONST(0.53022408956855), FRAC_CONST(0.51912349702391), FRAC_CONST(0.50798175000434), FRAC_CONST(0.49677082545707), FRAC_CONST(0.48552530911099), FRAC_CONST(0.47424532146115), FRAC_CONST(0.46293080852757), FRAC_CONST(0.45159965356824), FRAC_CONST(0.44025537543665), FRAC_CONST(0.42891199207373), FRAC_CONST(0.41756968968409), FRAC_CONST(0.40623176767625), FRAC_CONST(0.39492117615675), FRAC_CONST(0.38363500139043), FRAC_CONST(0.37237955463061), FRAC_CONST(-0.36115899031355), FRAC_CONST(-0.3499914122931), FRAC_CONST(-0.33887226938665), FRAC_CONST(-0.32781137272105), FRAC_CONST(-0.31682789136456), FRAC_CONST(-0.30590985751916), FRAC_CONST(-0.29507167170646), FRAC_CONST(-0.28432141891085), FRAC_CONST(-0.27366340405625), FRAC_CONST(-0.26310532994603), FRAC_CONST(-0.25264803095722), FRAC_CONST(-0.24230168845974), FRAC_CONST(-0.23206908706791), FRAC_CONST(-0.22196526964149), FRAC_CONST(-0.21197358538056), FRAC_CONST(-0.20212501768103), FRAC_CONST(-0.19239667457267), FRAC_CONST(-0.18281725485142), FRAC_CONST(-0.17338081721706), FRAC_CONST(-0.16409588556669), FRAC_CONST(-0.15496070710605), FRAC_CONST(-0.1459766491187), FRAC_CONST(-0.13715517611934), FRAC_CONST(-0.12850028503878), FRAC_CONST(-0.120007798468), FRAC_CONST(-0.1116826931773), FRAC_CONST(-0.10353295311463), FRAC_CONST(-0.09555333528914), FRAC_CONST(-0.08775475365593), FRAC_CONST(-0.08013729344279), FRAC_CONST(-0.07269433008129), FRAC_CONST(-0.06544098531359), FRAC_CONST(-0.05837053268336), FRAC_CONST(-0.05148041767934), FRAC_CONST(-0.04478068215856), FRAC_CONST(-0.03827765720822), FRAC_CONST(-0.03195312745332), FRAC_CONST(-0.02582272888064), FRAC_CONST(-0.01988341292573), FRAC_CONST(-0.01412888273558), FRAC_CONST(-0.00857117491366), FRAC_CONST(-0.00320868968304), FRAC_CONST(0.00197656014503), FRAC_CONST(0.00696368621617), FRAC_CONST(0.01176238327857), FRAC_CONST(0.01637012582228), FRAC_CONST(0.02079970728622), FRAC_CONST(0.02503075618909), FRAC_CONST(0.02908240060125), FRAC_CONST(0.03295839306691), FRAC_CONST(0.03664181168133), FRAC_CONST(0.04014582784127), FRAC_CONST(0.04347687821958), FRAC_CONST(0.04663033051701), FRAC_CONST(0.04959786763445), FRAC_CONST(0.05240938217366), FRAC_CONST(0.05504600343009), FRAC_CONST(0.05751526919867), FRAC_CONST(0.0598166570809), FRAC_CONST(0.06196027790387), FRAC_CONST(0.06394448059633), FRAC_CONST(0.06576906686508), FRAC_CONST(0.06745250215166), FRAC_CONST(0.06896640131951), FRAC_CONST(0.07035330735093), FRAC_CONST(0.07158263647903), FRAC_CONST(0.07267746427299), FRAC_CONST(0.0736406005762), FRAC_CONST(0.07446643947564), FRAC_CONST(0.0751576255287), FRAC_CONST(0.07573057565061), FRAC_CONST(0.07617483218536), FRAC_CONST(0.07650507183194), FRAC_CONST(0.07672049241746), FRAC_CONST(0.07682300113923), FRAC_CONST(0.07681739756964), FRAC_CONST(0.07670934904245), FRAC_CONST(0.07649921704119), FRAC_CONST(0.07619924793396), FRAC_CONST(0.07580083586584), FRAC_CONST(0.07531373362019), FRAC_CONST(0.07474525581194), FRAC_CONST(0.07410036424342), FRAC_CONST(0.07336202550803), FRAC_CONST(0.07256825833083), FRAC_CONST(0.07170026731102), FRAC_CONST(0.07076287107266), FRAC_CONST(0.06976302447127), FRAC_CONST(0.06870438283512), FRAC_CONST(0.06760759851228), FRAC_CONST(0.06643675122104), FRAC_CONST(0.0652247106438), FRAC_CONST(0.06397158980681), FRAC_CONST(0.06268578081172), FRAC_CONST(0.06134551717207), FRAC_CONST(0.05998374801761), FRAC_CONST(0.0585915683626), FRAC_CONST(0.05716164501299), FRAC_CONST(0.05571736482138), FRAC_CONST(0.05424527683589), FRAC_CONST(0.05276307465207), FRAC_CONST(0.05125561555216), FRAC_CONST(0.04973857556014), FRAC_CONST(0.04821657200672), FRAC_CONST(0.04668430272642), FRAC_CONST(0.04514884056413), FRAC_CONST(0.04360975421304), FRAC_CONST(0.04206490946367), FRAC_CONST(0.04053491705584), FRAC_CONST(0.03900536794745), FRAC_CONST(0.03748128504252), FRAC_CONST(0.03596975605542), FRAC_CONST(0.03446209487686), FRAC_CONST(0.03297540810337), FRAC_CONST(0.03150176087389), FRAC_CONST(0.03005026574279), FRAC_CONST(0.02860721736385), FRAC_CONST(0.02718594296329), FRAC_CONST(0.02578758475467), FRAC_CONST(0.02441609920285), FRAC_CONST(0.02306801692862), FRAC_CONST(0.02174675502535), FRAC_CONST(0.02045317933555), FRAC_CONST(0.01918724313698), FRAC_CONST(0.01794333813443), FRAC_CONST(0.01673247129989), FRAC_CONST(0.01554055533423), FRAC_CONST(0.01439046660792), FRAC_CONST(-0.01327182200351), FRAC_CONST(-0.01218499959508), FRAC_CONST(-0.01113155480321), FRAC_CONST(-0.01011502154986), FRAC_CONST(-0.00913253296085), FRAC_CONST(-0.00817982333726), FRAC_CONST(-0.00726158168517), FRAC_CONST(-0.00637922932685), FRAC_CONST(-0.00553372111088), FRAC_CONST(-0.004722259624), FRAC_CONST(-0.00394011240522), FRAC_CONST(-0.003193377839), FRAC_CONST(-0.00248267236449), FRAC_CONST(-0.00180394725893), FRAC_CONST(-0.00115681355227), FRAC_CONST(-0.00054642808664), FRAC_CONST(2.760451905E-005), FRAC_CONST(0.0005832264248), FRAC_CONST(0.00109023290512), FRAC_CONST(0.00157846825768), FRAC_CONST(0.0020274176185), FRAC_CONST(0.00245085400321), FRAC_CONST(0.00284467578623), FRAC_CONST(0.00320918858098), FRAC_CONST(0.00354012465507), FRAC_CONST(0.00384564081246), FRAC_CONST(0.0041251642327), FRAC_CONST(0.00438018617447), FRAC_CONST(0.00460395301471), FRAC_CONST(0.004810946906), FRAC_CONST(0.00498396877629), FRAC_CONST(0.00513822754514), FRAC_CONST(0.00527157587272), FRAC_CONST(0.0053838975897), FRAC_CONST(0.0054753783077), FRAC_CONST(0.005540436394), FRAC_CONST(0.0055917128663), FRAC_CONST(0.00562661141932), FRAC_CONST(0.00563891995151), FRAC_CONST(0.00564551969164), FRAC_CONST(0.00562206432097), FRAC_CONST(0.00559380230045), FRAC_CONST(0.00554757145088), FRAC_CONST(0.00548760401507), FRAC_CONST(0.00541967759307), FRAC_CONST(0.00534716811982), FRAC_CONST(0.00524611661324), FRAC_CONST(0.00514073539032), FRAC_CONST(0.00503930226013), FRAC_CONST(0.00491376035745), FRAC_CONST(0.00479325608498), FRAC_CONST(0.00466064606118), FRAC_CONST(0.00452098527825), FRAC_CONST(0.00437307196781), FRAC_CONST(0.0042264269227), FRAC_CONST(0.00408197531935), FRAC_CONST(0.00392074323703), FRAC_CONST(0.00376039229104), FRAC_CONST(0.00360082681231), FRAC_CONST(0.00344188741828), FRAC_CONST(0.00327396134847), FRAC_CONST(0.00311254206525), FRAC_CONST(0.00294694477165), FRAC_CONST(0.00278704643465), FRAC_CONST(0.00262017586902), FRAC_CONST(0.00246256169126), FRAC_CONST(0.00230172547746), FRAC_CONST(0.00214615835557), FRAC_CONST(0.00198411407369), FRAC_CONST(0.00183482654224), FRAC_CONST(0.00168680832531), FRAC_CONST(0.00154432198471), FRAC_CONST(0.00139024948272), FRAC_CONST(0.00125778846475), FRAC_CONST(0.00112501551307), FRAC_CONST(0.00098859883015), FRAC_CONST(0.00086084433262), FRAC_CONST(0.00074580258865), FRAC_CONST(0.00062393761391), FRAC_CONST(0.00051073884952), FRAC_CONST(0.0004026540216), FRAC_CONST(0.00029495311041), FRAC_CONST(0.00020430170688), FRAC_CONST(0.00010943831274), FRAC_CONST(1.349497418E-005), FRAC_CONST(-6.173344072E-005), FRAC_CONST(-0.00014463809349), FRAC_CONST(-0.0002098337344), FRAC_CONST(-0.00028969811748), FRAC_CONST(-0.00035011758756), FRAC_CONST(-0.00040951214522), FRAC_CONST(-0.00046063254803), FRAC_CONST(-0.00051455722108), FRAC_CONST(-0.00055645763906), FRAC_CONST(-0.0005946118933), FRAC_CONST(-0.00063415949025), FRAC_CONST(-0.00066504150893), FRAC_CONST(-0.00069179375372), FRAC_CONST(-0.00072153919876), FRAC_CONST(-0.00073193571525), FRAC_CONST(-0.00075300014201), FRAC_CONST(-0.00076307935757), FRAC_CONST(-0.0007757977331), FRAC_CONST(-0.00078014496257), FRAC_CONST(-0.000780366471), FRAC_CONST(-0.00077798694927), FRAC_CONST(-0.00078343322877), FRAC_CONST(-0.00077248485949), FRAC_CONST(-0.0007681371927), FRAC_CONST(-0.00074905980532), FRAC_CONST(-0.00074409418541), FRAC_CONST(-0.00072550431222), FRAC_CONST(-0.00071577364744), FRAC_CONST(-0.00069416146273), FRAC_CONST(-0.00067776907764), FRAC_CONST(-0.00065403333621), FRAC_CONST(-0.00063124935319), FRAC_CONST(-0.00061327473938), FRAC_CONST(-0.00058709304852), FRAC_CONST(-0.00056778025613), FRAC_CONST(-0.00054665656337), FRAC_CONST(-0.00052265642972), FRAC_CONST(-0.00050407143497), FRAC_CONST(-0.00048937912498), FRAC_CONST(-0.00048752279712), FRAC_CONST(-0.00049475180896), FRAC_CONST(-0.00056176925738), FRAC_CONST(-0.00055252865047) }; #endif faad2-2.11.2/libfaad/sbr_syntax.c000066400000000000000000000711031476153623600165130ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_syntax.c,v 1.39 2009/01/26 22:32:31 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SBR_DEC #include "sbr_syntax.h" #include "syntax.h" #include "sbr_huff.h" #include "sbr_fbt.h" #include "sbr_tf_grid.h" #include "sbr_e_nf.h" #include "bits.h" #ifdef PS_DEC #include "ps_dec.h" #endif #ifdef DRM_PS #include "drm_dec.h" #endif #include "analysis.h" /* static function declarations */ /* static function declarations */ static void sbr_header(bitfile *ld, sbr_info *sbr); static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, uint8_t samplerate_mode, uint8_t freq_scale, uint8_t alter_scale, uint8_t xover_band); static uint8_t sbr_data(bitfile *ld, sbr_info *sbr); static uint16_t sbr_extension(bitfile *ld, sbr_info *sbr, uint8_t bs_extension_id, uint16_t num_bits_left); static uint8_t sbr_single_channel_element(bitfile *ld, sbr_info *sbr); static uint8_t sbr_channel_pair_element(bitfile *ld, sbr_info *sbr); static uint8_t sbr_grid(bitfile *ld, sbr_info *sbr, uint8_t ch); static void sbr_dtdf(bitfile *ld, sbr_info *sbr, uint8_t ch); static void invf_mode(bitfile *ld, sbr_info *sbr, uint8_t ch); static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch); static void sbr_reset(sbr_info *sbr) { #if 0 printf("%d\n", sbr->bs_start_freq_prev); printf("%d\n", sbr->bs_stop_freq_prev); printf("%d\n", sbr->bs_freq_scale_prev); printf("%d\n", sbr->bs_alter_scale_prev); printf("%d\n", sbr->bs_xover_band_prev); printf("%d\n\n", sbr->bs_noise_bands_prev); #endif /* if these are different from the previous frame: Reset = 1 */ if ((sbr->bs_start_freq != sbr->bs_start_freq_prev) || (sbr->bs_stop_freq != sbr->bs_stop_freq_prev) || (sbr->bs_freq_scale != sbr->bs_freq_scale_prev) || (sbr->bs_alter_scale != sbr->bs_alter_scale_prev) || (sbr->bs_xover_band != sbr->bs_xover_band_prev) || (sbr->bs_noise_bands != sbr->bs_noise_bands_prev)) { sbr->Reset = 1; } else { sbr->Reset = 0; } sbr->bs_start_freq_prev = sbr->bs_start_freq; sbr->bs_stop_freq_prev = sbr->bs_stop_freq; sbr->bs_freq_scale_prev = sbr->bs_freq_scale; sbr->bs_alter_scale_prev = sbr->bs_alter_scale; sbr->bs_xover_band_prev = sbr->bs_xover_band; sbr->bs_noise_bands_prev = sbr->bs_noise_bands; } static uint8_t calc_sbr_tables(sbr_info *sbr, uint8_t start_freq, uint8_t stop_freq, uint8_t samplerate_mode, uint8_t freq_scale, uint8_t alter_scale, uint8_t xover_band) { uint8_t result = 0; uint8_t k2; /* calculate the Master Frequency Table */ sbr->k0 = qmf_start_channel(start_freq, samplerate_mode, sbr->sample_rate); k2 = qmf_stop_channel(stop_freq, sbr->sample_rate, sbr->k0); /* check k0 and k2 */ if (sbr->sample_rate >= 48000) { if ((k2 - sbr->k0) > 32) result += 1; } else if (sbr->sample_rate <= 32000) { if ((k2 - sbr->k0) > 48) result += 1; } else { /* (sbr->sample_rate == 44100) */ if ((k2 - sbr->k0) > 45) result += 1; } if (freq_scale == 0) { result += master_frequency_table_fs0(sbr, sbr->k0, k2, alter_scale); } else { result += master_frequency_table(sbr, sbr->k0, k2, freq_scale, alter_scale); } result += derived_frequency_table(sbr, xover_band, k2); result = (result > 0) ? 1 : 0; return result; } /* table 2 */ uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt, uint8_t psResetFlag) { uint8_t result = 0; uint16_t num_align_bits = 0; uint16_t num_sbr_bits1 = (uint16_t)faad_get_processed_bits(ld); uint16_t num_sbr_bits2; uint8_t saved_start_freq, saved_samplerate_mode; uint8_t saved_stop_freq, saved_freq_scale; uint8_t saved_alter_scale, saved_xover_band; #if (defined(PS_DEC) || defined(DRM_PS)) if (psResetFlag) sbr->psResetFlag = psResetFlag; #endif #ifdef DRM if (!sbr->Is_DRM_SBR) #endif { uint8_t bs_extension_type = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,198,"sbr_bitstream(): bs_extension_type")); if (bs_extension_type == EXT_SBR_DATA_CRC) { sbr->bs_sbr_crc_bits = (uint16_t)faad_getbits(ld, 10 DEBUGVAR(1,199,"sbr_bitstream(): bs_sbr_crc_bits")); } } /* save old header values, in case the new ones are corrupted */ saved_start_freq = sbr->bs_start_freq; saved_samplerate_mode = sbr->bs_samplerate_mode; saved_stop_freq = sbr->bs_stop_freq; saved_freq_scale = sbr->bs_freq_scale; saved_alter_scale = sbr->bs_alter_scale; saved_xover_band = sbr->bs_xover_band; sbr->bs_header_flag = faad_get1bit(ld DEBUGVAR(1,200,"sbr_bitstream(): bs_header_flag")); if (sbr->bs_header_flag) sbr_header(ld, sbr); /* Reset? */ sbr_reset(sbr); /* first frame should have a header */ //if (!(sbr->frame == 0 && sbr->bs_header_flag == 0)) if (sbr->header_count != 0) { if (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked)) { uint8_t rt = calc_sbr_tables(sbr, sbr->bs_start_freq, sbr->bs_stop_freq, sbr->bs_samplerate_mode, sbr->bs_freq_scale, sbr->bs_alter_scale, sbr->bs_xover_band); /* if an error occured with the new header values revert to the old ones */ if (rt > 0) { result += calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, saved_samplerate_mode, saved_freq_scale, saved_alter_scale, saved_xover_band); } } if (result == 0) { result = sbr_data(ld, sbr); /* sbr_data() returning an error means that there was an error in envelope_time_border_vector(). In this case the old time border vector is saved and all the previous data normally read after sbr_grid() is saved. */ /* to be on the safe side, calculate old sbr tables in case of error */ if ((result > 0) && (sbr->Reset || (sbr->bs_header_flag && sbr->just_seeked))) { result += calc_sbr_tables(sbr, saved_start_freq, saved_stop_freq, saved_samplerate_mode, saved_freq_scale, saved_alter_scale, saved_xover_band); } /* we should be able to safely set result to 0 now, */ /* but practise indicates this doesn't work well */ } } else { result = 1; } num_sbr_bits2 = (uint16_t)faad_get_processed_bits(ld) - num_sbr_bits1; /* check if we read more bits then were available for sbr */ if (8*cnt < num_sbr_bits2) { faad_resetbits(ld, num_sbr_bits1 + 8u * 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 uint8_t sbr_log2(const uint8_t val) { uint8_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, j, 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(1u << i, 5u); 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; } j = bs_num_env; i = sbr_log2(j + 1); sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i DEBUGVAR(1,254,"sbr_grid(): bs_pointer")); sbr->bs_pointer[ch] = min(sbr->bs_pointer[ch], j); 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; } j = bs_num_env; i = sbr_log2(j + 1); sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i DEBUGVAR(1,259,"sbr_grid(): bs_pointer")); sbr->bs_pointer[ch] = min(sbr->bs_pointer[ch], j); 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; } j = sbr->bs_num_rel_0[ch] + sbr->bs_num_rel_1[ch] + 1; i = sbr_log2(j + 1); sbr->bs_pointer[ch] = (uint8_t)faad_getbits(ld, i DEBUGVAR(1,267,"sbr_grid(): bs_pointer")); sbr->bs_pointer[ch] = min(sbr->bs_pointer[ch], j); 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 (void)num_bits_left; /* TODO: remove or actually use parameter. */ 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: /* If not expected then only decode but do not expose. */ if (sbr->Is_DRM_SBR) { sbr->ps_used = 1; } if (!sbr->drm_ps) { sbr->drm_ps = drm_ps_init(); } return drm_ps_data(sbr->drm_ps, ld); #endif default: sbr->bs_extension_data = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,279,"sbr_single_channel_element(): bs_extension_data")); return 6; } } /* table 12 */ static void sinusoidal_coding(bitfile *ld, sbr_info *sbr, uint8_t ch) { uint8_t n; for (n = 0; n < sbr->N_high; n++) { sbr->bs_add_harmonic[ch][n] = faad_get1bit(ld DEBUGVAR(1,278,"sinusoidal_coding(): bs_add_harmonic")); } } #endif /* SBR_DEC */ faad2-2.11.2/libfaad/sbr_syntax.h000066400000000000000000000035601476153623600165220ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_syntax.h,v 1.23 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_SYNTAX_H__ #define __SBR_SYNTAX_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #define T_HFGEN 8 #define T_HFADJ 2 #define EXT_SBR_DATA 13 #define EXT_SBR_DATA_CRC 14 #define FIXFIX 0 #define FIXVAR 1 #define VARFIX 2 #define VARVAR 3 #define LO_RES 0 #define HI_RES 1 #define NO_TIME_SLOTS_960 15 #define NO_TIME_SLOTS 16 #define RATE 2 #define NOISE_FLOOR_OFFSET 6 uint8_t sbr_extension_data(bitfile *ld, sbr_info *sbr, uint16_t cnt, uint8_t resetFlag); #ifdef __cplusplus } #endif #endif /* __SBR_SYNTAX_H__ */ faad2-2.11.2/libfaad/sbr_tf_grid.c000066400000000000000000000146011476153623600166030ustar00rootroot00000000000000/* ** 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, trail; uint8_t t_E_temp[6] = {0}; trail = sbr->abs_bord_trail[ch]; t_E_temp[0] = sbr->rate * sbr->abs_bord_lead[ch]; t_E_temp[sbr->L_E[ch]] = sbr->rate * trail; 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 (border > trail) 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 (border > trail) return 1; t_E_temp[i++] = sbr->rate * border; } } if (sbr->bs_num_rel_1[ch]) { int8_t i = sbr->L_E[ch]; border = sbr->abs_bord_trail[ch]; for (l = 0; l < sbr->bs_num_rel_1[ch]; l++) { if (border < sbr->bs_rel_bord_1[ch][l]) return 1; border -= sbr->bs_rel_bord_1[ch][l]; t_E_temp[--i] = sbr->rate * border; } } break; } /* no error occured, we can safely use this t_E vector */ for (l = 0; l < 6; l++) { sbr->t_E[ch][l] = t_E_temp[l]; } return 0; } void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch) { sbr->t_Q[ch][0] = sbr->t_E[ch][0]; if (sbr->L_E[ch] == 1) { sbr->t_Q[ch][1] = sbr->t_E[ch][1]; sbr->t_Q[ch][2] = 0; } else { uint8_t index = middleBorder(sbr, ch); sbr->t_Q[ch][1] = sbr->t_E[ch][index]; sbr->t_Q[ch][2] = sbr->t_E[ch][sbr->L_E[ch]]; } } #if 0 static int16_t rel_bord_lead(sbr_info *sbr, uint8_t ch, uint8_t l) { uint8_t i; int16_t acc = 0; switch (sbr->bs_frame_class[ch]) { case FIXFIX: return sbr->numTimeSlots/sbr->L_E[ch]; case FIXVAR: return 0; case VARFIX: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord[ch][i]; } return acc; case VARVAR: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord_0[ch][i]; } return acc; } return 0; } static int16_t rel_bord_trail(sbr_info *sbr, uint8_t ch, uint8_t l) { uint8_t i; int16_t acc = 0; switch (sbr->bs_frame_class[ch]) { case FIXFIX: case VARFIX: return 0; case FIXVAR: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord[ch][i]; } return acc; case VARVAR: for (i = 0; i < l; i++) { acc += sbr->bs_rel_bord_1[ch][i]; } return acc; } return 0; } #endif static uint8_t middleBorder(sbr_info *sbr, uint8_t ch) { int8_t retval = 0; switch (sbr->bs_frame_class[ch]) { case FIXFIX: retval = sbr->L_E[ch]/2; break; case VARFIX: if (sbr->bs_pointer[ch] == 0) retval = 1; else if (sbr->bs_pointer[ch] == 1) retval = sbr->L_E[ch] - 1; else retval = sbr->bs_pointer[ch] - 1; break; case FIXVAR: case VARVAR: if (sbr->bs_pointer[ch] > 1) retval = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch]; else retval = sbr->L_E[ch] - 1; break; } return (retval > 0) ? retval : 0; } #endif faad2-2.11.2/libfaad/sbr_tf_grid.h000066400000000000000000000030331476153623600166050ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sbr_tf_grid.h,v 1.17 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SBR_TF_GRID_H__ #define __SBR_TF_GRID_H__ #ifdef __cplusplus extern "C" { #endif uint8_t envelope_time_border_vector(sbr_info *sbr, uint8_t ch); void noise_floor_time_border_vector(sbr_info *sbr, uint8_t ch); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/sine_win.h000066400000000000000000004322061476153623600161440ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: sine_win.h,v 1.19 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SINE_WIN_H__ #define __SINE_WIN_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif ALIGN static const real_t sine_long_1024[] = { FRAC_CONST(0.00076699031874270449), FRAC_CONST(0.002300969151425805), FRAC_CONST(0.0038349425697062275), FRAC_CONST(0.0053689069639963425), FRAC_CONST(0.0069028587247297558), FRAC_CONST(0.0084367942423697988), FRAC_CONST(0.0099707099074180308), FRAC_CONST(0.011504602110422714), FRAC_CONST(0.013038467241987334), FRAC_CONST(0.014572301692779064), FRAC_CONST(0.016106101853537287), FRAC_CONST(0.017639864115082053), FRAC_CONST(0.019173584868322623), FRAC_CONST(0.020707260504265895), FRAC_CONST(0.022240887414024961), FRAC_CONST(0.023774461988827555), FRAC_CONST(0.025307980620024571), FRAC_CONST(0.026841439699098531), FRAC_CONST(0.028374835617672099), FRAC_CONST(0.029908164767516555), FRAC_CONST(0.031441423540560301), FRAC_CONST(0.032974608328897335), FRAC_CONST(0.03450771552479575), FRAC_CONST(0.036040741520706229), FRAC_CONST(0.037573682709270494), FRAC_CONST(0.039106535483329888), FRAC_CONST(0.040639296235933736), FRAC_CONST(0.042171961360347947), FRAC_CONST(0.043704527250063421), FRAC_CONST(0.04523699029880459), FRAC_CONST(0.046769346900537863), FRAC_CONST(0.048301593449480144), FRAC_CONST(0.049833726340107277), FRAC_CONST(0.051365741967162593), FRAC_CONST(0.052897636725665324), FRAC_CONST(0.054429407010919133), FRAC_CONST(0.055961049218520569), FRAC_CONST(0.057492559744367566), FRAC_CONST(0.059023934984667931), FRAC_CONST(0.060555171335947788), FRAC_CONST(0.062086265195060088), FRAC_CONST(0.063617212959193106), FRAC_CONST(0.065148011025878833), FRAC_CONST(0.066678655793001557), FRAC_CONST(0.068209143658806329), FRAC_CONST(0.069739471021907307), FRAC_CONST(0.071269634281296401), FRAC_CONST(0.072799629836351673), FRAC_CONST(0.074329454086845756), FRAC_CONST(0.075859103432954447), FRAC_CONST(0.077388574275265049), FRAC_CONST(0.078917863014784942), FRAC_CONST(0.080446966052950014), FRAC_CONST(0.081975879791633066), FRAC_CONST(0.083504600633152432), FRAC_CONST(0.085033124980280275), FRAC_CONST(0.08656144923625117), FRAC_CONST(0.088089569804770507), FRAC_CONST(0.089617483090022959), FRAC_CONST(0.091145185496681005), FRAC_CONST(0.09267267342991331), FRAC_CONST(0.094199943295393204), FRAC_CONST(0.095726991499307162), FRAC_CONST(0.097253814448363271), FRAC_CONST(0.098780408549799623), FRAC_CONST(0.10030677021139286), FRAC_CONST(0.10183289584146653), FRAC_CONST(0.10335878184889961), FRAC_CONST(0.10488442464313497), FRAC_CONST(0.10640982063418768), FRAC_CONST(0.10793496623265365), FRAC_CONST(0.10945985784971798), FRAC_CONST(0.11098449189716339), FRAC_CONST(0.11250886478737869), FRAC_CONST(0.1140329729333672), FRAC_CONST(0.11555681274875526), FRAC_CONST(0.11708038064780059), FRAC_CONST(0.11860367304540072), FRAC_CONST(0.1201266863571015), FRAC_CONST(0.12164941699910553), FRAC_CONST(0.12317186138828048), FRAC_CONST(0.12469401594216764), FRAC_CONST(0.12621587707899035), FRAC_CONST(0.12773744121766231), FRAC_CONST(0.12925870477779614), FRAC_CONST(0.13077966417971171), FRAC_CONST(0.13230031584444465), FRAC_CONST(0.13382065619375472), FRAC_CONST(0.13534068165013421), FRAC_CONST(0.13686038863681638), FRAC_CONST(0.13837977357778389), FRAC_CONST(0.13989883289777721), FRAC_CONST(0.14141756302230302), FRAC_CONST(0.14293596037764267), FRAC_CONST(0.14445402139086047), FRAC_CONST(0.14597174248981221), FRAC_CONST(0.14748912010315357), FRAC_CONST(0.14900615066034845), FRAC_CONST(0.1505228305916774), FRAC_CONST(0.15203915632824605), FRAC_CONST(0.15355512430199345), FRAC_CONST(0.15507073094570051), FRAC_CONST(0.15658597269299843), FRAC_CONST(0.15810084597837698), FRAC_CONST(0.15961534723719306), FRAC_CONST(0.16112947290567881), FRAC_CONST(0.16264321942095031), FRAC_CONST(0.16415658322101581), FRAC_CONST(0.16566956074478412), FRAC_CONST(0.16718214843207294), FRAC_CONST(0.16869434272361733), FRAC_CONST(0.17020614006107807), FRAC_CONST(0.17171753688704997), FRAC_CONST(0.17322852964507032), FRAC_CONST(0.1747391147796272), FRAC_CONST(0.17624928873616788), FRAC_CONST(0.17775904796110717), FRAC_CONST(0.17926838890183575), FRAC_CONST(0.18077730800672859), FRAC_CONST(0.1822858017251533), FRAC_CONST(0.18379386650747845), FRAC_CONST(0.1853014988050819), FRAC_CONST(0.18680869507035927), FRAC_CONST(0.18831545175673212), FRAC_CONST(0.18982176531865641), FRAC_CONST(0.1913276322116309), FRAC_CONST(0.19283304889220523), FRAC_CONST(0.1943380118179886), FRAC_CONST(0.19584251744765785), FRAC_CONST(0.19734656224096592), FRAC_CONST(0.19885014265875009), FRAC_CONST(0.20035325516294045), FRAC_CONST(0.20185589621656805), FRAC_CONST(0.20335806228377332), FRAC_CONST(0.20485974982981442), FRAC_CONST(0.20636095532107551), FRAC_CONST(0.20786167522507507), FRAC_CONST(0.20936190601047416), FRAC_CONST(0.21086164414708486), FRAC_CONST(0.21236088610587842), FRAC_CONST(0.21385962835899375), FRAC_CONST(0.21535786737974555), FRAC_CONST(0.21685559964263262), FRAC_CONST(0.21835282162334632), FRAC_CONST(0.2198495297987787), FRAC_CONST(0.22134572064703081), FRAC_CONST(0.22284139064742112), FRAC_CONST(0.2243365362804936), FRAC_CONST(0.22583115402802617), FRAC_CONST(0.22732524037303886), FRAC_CONST(0.22881879179980222), FRAC_CONST(0.23031180479384544), FRAC_CONST(0.23180427584196478), FRAC_CONST(0.23329620143223159), FRAC_CONST(0.23478757805400097), FRAC_CONST(0.23627840219791957), FRAC_CONST(0.23776867035593419), FRAC_CONST(0.23925837902129998), FRAC_CONST(0.24074752468858843), FRAC_CONST(0.24223610385369601), FRAC_CONST(0.24372411301385216), FRAC_CONST(0.24521154866762754), FRAC_CONST(0.24669840731494241), FRAC_CONST(0.24818468545707478), FRAC_CONST(0.24967037959666857), FRAC_CONST(0.25115548623774192), FRAC_CONST(0.25264000188569552), FRAC_CONST(0.25412392304732062), FRAC_CONST(0.25560724623080738), FRAC_CONST(0.25708996794575312), FRAC_CONST(0.25857208470317034), FRAC_CONST(0.26005359301549519), FRAC_CONST(0.26153448939659552), FRAC_CONST(0.263014770361779), FRAC_CONST(0.26449443242780163), FRAC_CONST(0.26597347211287559), FRAC_CONST(0.26745188593667762), FRAC_CONST(0.26892967042035726), FRAC_CONST(0.27040682208654482), FRAC_CONST(0.27188333745935972), FRAC_CONST(0.27335921306441868), FRAC_CONST(0.27483444542884394), FRAC_CONST(0.27630903108127108), FRAC_CONST(0.27778296655185769), FRAC_CONST(0.27925624837229118), FRAC_CONST(0.28072887307579719), FRAC_CONST(0.28220083719714756), FRAC_CONST(0.28367213727266843), FRAC_CONST(0.28514276984024867), FRAC_CONST(0.28661273143934779), FRAC_CONST(0.28808201861100413), FRAC_CONST(0.28955062789784303), FRAC_CONST(0.29101855584408509), FRAC_CONST(0.29248579899555388), FRAC_CONST(0.29395235389968466), FRAC_CONST(0.29541821710553201), FRAC_CONST(0.29688338516377827), FRAC_CONST(0.2983478546267414), FRAC_CONST(0.29981162204838335), FRAC_CONST(0.30127468398431795), FRAC_CONST(0.30273703699181914), FRAC_CONST(0.30419867762982911), FRAC_CONST(0.30565960245896612), FRAC_CONST(0.3071198080415331), FRAC_CONST(0.30857929094152509), FRAC_CONST(0.31003804772463789), FRAC_CONST(0.31149607495827591), FRAC_CONST(0.3129533692115602), FRAC_CONST(0.31440992705533666), FRAC_CONST(0.31586574506218396), FRAC_CONST(0.31732081980642174), FRAC_CONST(0.31877514786411848), FRAC_CONST(0.32022872581309986), FRAC_CONST(0.32168155023295658), FRAC_CONST(0.32313361770505233), FRAC_CONST(0.32458492481253215), FRAC_CONST(0.32603546814033024), FRAC_CONST(0.327485244275178), FRAC_CONST(0.3289342498056122), FRAC_CONST(0.33038248132198278), FRAC_CONST(0.33182993541646111), FRAC_CONST(0.33327660868304793), FRAC_CONST(0.33472249771758122), FRAC_CONST(0.33616759911774452), FRAC_CONST(0.33761190948307462), FRAC_CONST(0.33905542541496964), FRAC_CONST(0.34049814351669716), FRAC_CONST(0.34194006039340219), FRAC_CONST(0.34338117265211504), FRAC_CONST(0.34482147690175929), FRAC_CONST(0.34626096975316001), FRAC_CONST(0.34769964781905138), FRAC_CONST(0.34913750771408497), FRAC_CONST(0.35057454605483751), FRAC_CONST(0.35201075945981908), FRAC_CONST(0.35344614454948081), FRAC_CONST(0.35488069794622279), FRAC_CONST(0.35631441627440241), FRAC_CONST(0.3577472961603419), FRAC_CONST(0.3591793342323365), FRAC_CONST(0.36061052712066227), FRAC_CONST(0.36204087145758418), FRAC_CONST(0.36347036387736376), FRAC_CONST(0.36489900101626732), FRAC_CONST(0.36632677951257359), FRAC_CONST(0.36775369600658198), FRAC_CONST(0.36917974714062002), FRAC_CONST(0.37060492955905167), FRAC_CONST(0.37202923990828501), FRAC_CONST(0.3734526748367803), FRAC_CONST(0.37487523099505754), FRAC_CONST(0.37629690503570479), FRAC_CONST(0.37771769361338564), FRAC_CONST(0.37913759338484732), FRAC_CONST(0.38055660100892852), FRAC_CONST(0.38197471314656722), FRAC_CONST(0.38339192646080866), FRAC_CONST(0.38480823761681288), FRAC_CONST(0.38622364328186298), FRAC_CONST(0.38763814012537273), FRAC_CONST(0.38905172481889438), FRAC_CONST(0.39046439403612659), FRAC_CONST(0.39187614445292235), FRAC_CONST(0.3932869727472964), FRAC_CONST(0.39469687559943356), FRAC_CONST(0.39610584969169627), FRAC_CONST(0.39751389170863233), FRAC_CONST(0.39892099833698291), FRAC_CONST(0.40032716626569009), FRAC_CONST(0.40173239218590501), FRAC_CONST(0.4031366727909953), FRAC_CONST(0.404540004776553), FRAC_CONST(0.40594238484040251), FRAC_CONST(0.40734380968260797), FRAC_CONST(0.40874427600548136), FRAC_CONST(0.41014378051359024), FRAC_CONST(0.41154231991376522), FRAC_CONST(0.41293989091510808), FRAC_CONST(0.4143364902289991), FRAC_CONST(0.41573211456910536), FRAC_CONST(0.41712676065138787), FRAC_CONST(0.4185204251941097), FRAC_CONST(0.41991310491784362), FRAC_CONST(0.42130479654547964), FRAC_CONST(0.42269549680223295), FRAC_CONST(0.42408520241565156), FRAC_CONST(0.4254739101156238), FRAC_CONST(0.42686161663438643), FRAC_CONST(0.42824831870653196), FRAC_CONST(0.42963401306901638), FRAC_CONST(0.43101869646116703), FRAC_CONST(0.43240236562469014), FRAC_CONST(0.43378501730367852), FRAC_CONST(0.43516664824461926), FRAC_CONST(0.4365472551964012), FRAC_CONST(0.43792683491032286), FRAC_CONST(0.43930538414009995), FRAC_CONST(0.4406828996418729), FRAC_CONST(0.4420593781742147), FRAC_CONST(0.44343481649813848), FRAC_CONST(0.44480921137710488), FRAC_CONST(0.44618255957703007), FRAC_CONST(0.44755485786629301), FRAC_CONST(0.44892610301574326), FRAC_CONST(0.45029629179870861), FRAC_CONST(0.45166542099100249), FRAC_CONST(0.45303348737093158), FRAC_CONST(0.45440048771930358), FRAC_CONST(0.45576641881943464), FRAC_CONST(0.45713127745715698), FRAC_CONST(0.45849506042082627), FRAC_CONST(0.45985776450132954), FRAC_CONST(0.46121938649209238), FRAC_CONST(0.46257992318908681), FRAC_CONST(0.46393937139083852), FRAC_CONST(0.4652977278984346), FRAC_CONST(0.46665498951553092), FRAC_CONST(0.46801115304835983), FRAC_CONST(0.46936621530573752), FRAC_CONST(0.4707201730990716), FRAC_CONST(0.47207302324236866), FRAC_CONST(0.47342476255224153), FRAC_CONST(0.47477538784791712), FRAC_CONST(0.47612489595124358), FRAC_CONST(0.47747328368669806), FRAC_CONST(0.47882054788139389), FRAC_CONST(0.48016668536508839), FRAC_CONST(0.48151169297018986), FRAC_CONST(0.48285556753176567), FRAC_CONST(0.48419830588754903), FRAC_CONST(0.48553990487794696), FRAC_CONST(0.48688036134604734), FRAC_CONST(0.48821967213762679), FRAC_CONST(0.48955783410115744), FRAC_CONST(0.49089484408781509), FRAC_CONST(0.49223069895148602), FRAC_CONST(0.49356539554877477), FRAC_CONST(0.49489893073901126), FRAC_CONST(0.49623130138425825), FRAC_CONST(0.49756250434931915), FRAC_CONST(0.49889253650174459), FRAC_CONST(0.50022139471184068), FRAC_CONST(0.50154907585267539), FRAC_CONST(0.50287557680008699), FRAC_CONST(0.50420089443269034), FRAC_CONST(0.50552502563188539), FRAC_CONST(0.50684796728186321), FRAC_CONST(0.5081697162696146), FRAC_CONST(0.50949026948493636), FRAC_CONST(0.51080962382043904), FRAC_CONST(0.51212777617155469), FRAC_CONST(0.51344472343654346), FRAC_CONST(0.5147604625165012), FRAC_CONST(0.51607499031536663), FRAC_CONST(0.51738830373992906), FRAC_CONST(0.51870039969983495), FRAC_CONST(0.52001127510759604), FRAC_CONST(0.52132092687859566), FRAC_CONST(0.52262935193109661), FRAC_CONST(0.5239365471862486), FRAC_CONST(0.52524250956809471), FRAC_CONST(0.52654723600357944), FRAC_CONST(0.52785072342255523), FRAC_CONST(0.52915296875779061), FRAC_CONST(0.53045396894497632), FRAC_CONST(0.53175372092273332), FRAC_CONST(0.53305222163261945), FRAC_CONST(0.53434946801913752), FRAC_CONST(0.53564545702974109), FRAC_CONST(0.53694018561484291), FRAC_CONST(0.5382336507278217), FRAC_CONST(0.53952584932502889), FRAC_CONST(0.54081677836579667), FRAC_CONST(0.54210643481244392), FRAC_CONST(0.5433948156302848), FRAC_CONST(0.54468191778763453), FRAC_CONST(0.54596773825581757), FRAC_CONST(0.54725227400917409), FRAC_CONST(0.54853552202506739), FRAC_CONST(0.54981747928389091), FRAC_CONST(0.55109814276907543), FRAC_CONST(0.55237750946709607), FRAC_CONST(0.55365557636747931), FRAC_CONST(0.55493234046281037), FRAC_CONST(0.55620779874873993), FRAC_CONST(0.55748194822399155), FRAC_CONST(0.55875478589036831), FRAC_CONST(0.56002630875276038), FRAC_CONST(0.56129651381915147), FRAC_CONST(0.56256539810062656), FRAC_CONST(0.56383295861137817), FRAC_CONST(0.56509919236871398), FRAC_CONST(0.56636409639306384), FRAC_CONST(0.56762766770798623), FRAC_CONST(0.56888990334017586), FRAC_CONST(0.5701508003194703), FRAC_CONST(0.57141035567885723), FRAC_CONST(0.57266856645448116), FRAC_CONST(0.57392542968565075), FRAC_CONST(0.57518094241484508), FRAC_CONST(0.57643510168772183), FRAC_CONST(0.5776879045531228), FRAC_CONST(0.57893934806308178), FRAC_CONST(0.58018942927283168), FRAC_CONST(0.58143814524081017), FRAC_CONST(0.58268549302866846), FRAC_CONST(0.58393146970127618), FRAC_CONST(0.58517607232673041), FRAC_CONST(0.5864192979763605), FRAC_CONST(0.58766114372473666), FRAC_CONST(0.58890160664967572), FRAC_CONST(0.59014068383224882), FRAC_CONST(0.59137837235678758), FRAC_CONST(0.59261466931089113), FRAC_CONST(0.59384957178543363), FRAC_CONST(0.59508307687456996), FRAC_CONST(0.59631518167574371), FRAC_CONST(0.59754588328969316), FRAC_CONST(0.59877517882045872), FRAC_CONST(0.60000306537538894), FRAC_CONST(0.6012295400651485), FRAC_CONST(0.60245460000372375), FRAC_CONST(0.60367824230843037), FRAC_CONST(0.60490046409991982), FRAC_CONST(0.60612126250218612), FRAC_CONST(0.60734063464257293), FRAC_CONST(0.60855857765177945), FRAC_CONST(0.60977508866386843), FRAC_CONST(0.61099016481627166), FRAC_CONST(0.61220380324979795), FRAC_CONST(0.61341600110863859), FRAC_CONST(0.61462675554037505), FRAC_CONST(0.61583606369598509), FRAC_CONST(0.61704392272984976), FRAC_CONST(0.61825032979976025), FRAC_CONST(0.61945528206692402), FRAC_CONST(0.62065877669597214), FRAC_CONST(0.62186081085496536), FRAC_CONST(0.62306138171540126), FRAC_CONST(0.62426048645222065), FRAC_CONST(0.62545812224381436), FRAC_CONST(0.62665428627202935), FRAC_CONST(0.62784897572217646), FRAC_CONST(0.629042187783036), FRAC_CONST(0.63023391964686437), FRAC_CONST(0.63142416850940186), FRAC_CONST(0.63261293156987741), FRAC_CONST(0.63380020603101728), FRAC_CONST(0.63498598909904946), FRAC_CONST(0.63617027798371217), FRAC_CONST(0.63735306989825913), FRAC_CONST(0.63853436205946679), FRAC_CONST(0.63971415168764045), FRAC_CONST(0.64089243600662138), FRAC_CONST(0.64206921224379254), FRAC_CONST(0.64324447763008585), FRAC_CONST(0.64441822939998838), FRAC_CONST(0.64559046479154869), FRAC_CONST(0.64676118104638392), FRAC_CONST(0.64793037540968534), FRAC_CONST(0.64909804513022595), FRAC_CONST(0.65026418746036585), FRAC_CONST(0.65142879965605982), FRAC_CONST(0.65259187897686244), FRAC_CONST(0.65375342268593606), FRAC_CONST(0.65491342805005603), FRAC_CONST(0.6560718923396176), FRAC_CONST(0.65722881282864254), FRAC_CONST(0.65838418679478505), FRAC_CONST(0.65953801151933866), FRAC_CONST(0.6606902842872423), FRAC_CONST(0.66184100238708687), FRAC_CONST(0.66299016311112147), FRAC_CONST(0.66413776375526001), FRAC_CONST(0.66528380161908718), FRAC_CONST(0.66642827400586524), FRAC_CONST(0.66757117822254031), FRAC_CONST(0.66871251157974798), FRAC_CONST(0.66985227139182102), FRAC_CONST(0.67099045497679422), FRAC_CONST(0.67212705965641173), FRAC_CONST(0.67326208275613297), FRAC_CONST(0.67439552160513905), FRAC_CONST(0.67552737353633852), FRAC_CONST(0.67665763588637495), FRAC_CONST(0.6777863059956315), FRAC_CONST(0.67891338120823841), FRAC_CONST(0.68003885887207893), FRAC_CONST(0.68116273633879543), FRAC_CONST(0.68228501096379557), FRAC_CONST(0.68340568010625868), FRAC_CONST(0.6845247411291423), FRAC_CONST(0.68564219139918747), FRAC_CONST(0.68675802828692589), FRAC_CONST(0.68787224916668555), FRAC_CONST(0.68898485141659704), FRAC_CONST(0.69009583241859995), FRAC_CONST(0.69120518955844845), FRAC_CONST(0.69231292022571822), FRAC_CONST(0.69341902181381176), FRAC_CONST(0.69452349171996552), FRAC_CONST(0.69562632734525487), FRAC_CONST(0.6967275260946012), FRAC_CONST(0.69782708537677729), FRAC_CONST(0.69892500260441415), FRAC_CONST(0.70002127519400625), FRAC_CONST(0.70111590056591866), FRAC_CONST(0.70220887614439187), FRAC_CONST(0.70330019935754873), FRAC_CONST(0.70438986763740041), FRAC_CONST(0.7054778784198521), FRAC_CONST(0.70656422914470951), FRAC_CONST(0.70764891725568435), FRAC_CONST(0.70873194020040065), FRAC_CONST(0.70981329543040084), FRAC_CONST(0.71089298040115168), FRAC_CONST(0.71197099257204999), FRAC_CONST(0.71304732940642923), FRAC_CONST(0.71412198837156471), FRAC_CONST(0.71519496693868001), FRAC_CONST(0.71626626258295312), FRAC_CONST(0.71733587278352173), FRAC_CONST(0.71840379502348972), FRAC_CONST(0.71947002678993299), FRAC_CONST(0.72053456557390527), FRAC_CONST(0.72159740887044366), FRAC_CONST(0.72265855417857561), FRAC_CONST(0.72371799900132339), FRAC_CONST(0.72477574084571128), FRAC_CONST(0.72583177722277037), FRAC_CONST(0.72688610564754497), FRAC_CONST(0.72793872363909862), FRAC_CONST(0.72898962872051931), FRAC_CONST(0.73003881841892615), FRAC_CONST(0.73108629026547423), FRAC_CONST(0.73213204179536129), FRAC_CONST(0.73317607054783274), FRAC_CONST(0.73421837406618817), FRAC_CONST(0.73525894989778673), FRAC_CONST(0.73629779559405306), FRAC_CONST(0.73733490871048279), FRAC_CONST(0.73837028680664851), FRAC_CONST(0.73940392744620576), FRAC_CONST(0.74043582819689802), FRAC_CONST(0.74146598663056329), FRAC_CONST(0.74249440032313918), FRAC_CONST(0.74352106685466912), FRAC_CONST(0.74454598380930725), FRAC_CONST(0.74556914877532543), FRAC_CONST(0.74659055934511731), FRAC_CONST(0.74761021311520515), FRAC_CONST(0.74862810768624533), FRAC_CONST(0.74964424066303348), FRAC_CONST(0.75065860965451059), FRAC_CONST(0.75167121227376843), FRAC_CONST(0.75268204613805523), FRAC_CONST(0.75369110886878121), FRAC_CONST(0.75469839809152439), FRAC_CONST(0.75570391143603588), FRAC_CONST(0.75670764653624567), FRAC_CONST(0.75770960103026808), FRAC_CONST(0.75870977256040739), FRAC_CONST(0.75970815877316344), FRAC_CONST(0.76070475731923692), FRAC_CONST(0.76169956585353527), FRAC_CONST(0.76269258203517787), FRAC_CONST(0.76368380352750187), FRAC_CONST(0.76467322799806714), FRAC_CONST(0.76566085311866239), FRAC_CONST(0.76664667656531038), FRAC_CONST(0.76763069601827327), FRAC_CONST(0.76861290916205827), FRAC_CONST(0.76959331368542294), FRAC_CONST(0.7705719072813807), FRAC_CONST(0.7715486876472063), FRAC_CONST(0.77252365248444133), FRAC_CONST(0.77349679949889905), FRAC_CONST(0.77446812640067086), FRAC_CONST(0.77543763090413043), FRAC_CONST(0.77640531072794039), FRAC_CONST(0.7773711635950562), FRAC_CONST(0.77833518723273309), FRAC_CONST(0.7792973793725303), FRAC_CONST(0.78025773775031659), FRAC_CONST(0.78121626010627609), FRAC_CONST(0.7821729441849129), FRAC_CONST(0.78312778773505731), FRAC_CONST(0.78408078850986995), FRAC_CONST(0.78503194426684808), FRAC_CONST(0.78598125276783015), FRAC_CONST(0.7869287117790017), FRAC_CONST(0.78787431907090011), FRAC_CONST(0.78881807241842017), FRAC_CONST(0.78975996960081907), FRAC_CONST(0.79070000840172161), FRAC_CONST(0.79163818660912577), FRAC_CONST(0.79257450201540758), FRAC_CONST(0.79350895241732666), FRAC_CONST(0.79444153561603059), FRAC_CONST(0.79537224941706119), FRAC_CONST(0.79630109163035911), FRAC_CONST(0.7972280600702687), FRAC_CONST(0.79815315255554375), FRAC_CONST(0.79907636690935235), FRAC_CONST(0.79999770095928191), FRAC_CONST(0.8009171525373443), FRAC_CONST(0.80183471947998131), FRAC_CONST(0.80275039962806916), FRAC_CONST(0.80366419082692409), FRAC_CONST(0.804576090926307), FRAC_CONST(0.80548609778042912), FRAC_CONST(0.80639420924795624), FRAC_CONST(0.80730042319201445), FRAC_CONST(0.80820473748019472), FRAC_CONST(0.80910714998455813), FRAC_CONST(0.81000765858164114), FRAC_CONST(0.81090626115245967), FRAC_CONST(0.81180295558251536), FRAC_CONST(0.81269773976179949), FRAC_CONST(0.81359061158479851), FRAC_CONST(0.81448156895049861), FRAC_CONST(0.81537060976239129), FRAC_CONST(0.81625773192847739), FRAC_CONST(0.81714293336127297), FRAC_CONST(0.81802621197781344), FRAC_CONST(0.81890756569965895), FRAC_CONST(0.81978699245289899), FRAC_CONST(0.82066449016815746), FRAC_CONST(0.82154005678059761), FRAC_CONST(0.82241369022992639), FRAC_CONST(0.82328538846040011), FRAC_CONST(0.82415514942082857), FRAC_CONST(0.82502297106458022), FRAC_CONST(0.82588885134958678), FRAC_CONST(0.82675278823834852), FRAC_CONST(0.8276147796979384), FRAC_CONST(0.82847482370000713), FRAC_CONST(0.82933291822078825), FRAC_CONST(0.83018906124110237), FRAC_CONST(0.83104325074636232), FRAC_CONST(0.83189548472657759), FRAC_CONST(0.83274576117635946), FRAC_CONST(0.83359407809492514), FRAC_CONST(0.83444043348610319), FRAC_CONST(0.83528482535833737), FRAC_CONST(0.83612725172469216), FRAC_CONST(0.83696771060285702), FRAC_CONST(0.83780620001515094), FRAC_CONST(0.8386427179885273), FRAC_CONST(0.83947726255457855), FRAC_CONST(0.84030983174954077), FRAC_CONST(0.84114042361429808), FRAC_CONST(0.84196903619438768), FRAC_CONST(0.84279566754000412), FRAC_CONST(0.84362031570600404), FRAC_CONST(0.84444297875191066), FRAC_CONST(0.84526365474191822), FRAC_CONST(0.84608234174489694), FRAC_CONST(0.84689903783439735), FRAC_CONST(0.84771374108865427), FRAC_CONST(0.84852644959059265), FRAC_CONST(0.84933716142783067), FRAC_CONST(0.85014587469268521), FRAC_CONST(0.85095258748217573), FRAC_CONST(0.85175729789802912), FRAC_CONST(0.85256000404668397), FRAC_CONST(0.85336070403929543), FRAC_CONST(0.85415939599173873), FRAC_CONST(0.85495607802461482), FRAC_CONST(0.85575074826325392), FRAC_CONST(0.85654340483771996), FRAC_CONST(0.85733404588281559), FRAC_CONST(0.85812266953808602), FRAC_CONST(0.8589092739478239), FRAC_CONST(0.85969385726107261), FRAC_CONST(0.86047641763163207), FRAC_CONST(0.86125695321806206), FRAC_CONST(0.86203546218368721), FRAC_CONST(0.86281194269660033), FRAC_CONST(0.86358639292966799), FRAC_CONST(0.86435881106053403), FRAC_CONST(0.86512919527162369), FRAC_CONST(0.86589754375014882), FRAC_CONST(0.86666385468811102), FRAC_CONST(0.86742812628230692), FRAC_CONST(0.86819035673433131), FRAC_CONST(0.86895054425058238), FRAC_CONST(0.86970868704226556), FRAC_CONST(0.87046478332539767), FRAC_CONST(0.8712188313208109), FRAC_CONST(0.8719708292541577), FRAC_CONST(0.8727207753559143), FRAC_CONST(0.87346866786138488), FRAC_CONST(0.8742145050107063), FRAC_CONST(0.87495828504885154), FRAC_CONST(0.8757000062256346), FRAC_CONST(0.87643966679571361), FRAC_CONST(0.87717726501859594), FRAC_CONST(0.87791279915864173), FRAC_CONST(0.87864626748506813), FRAC_CONST(0.87937766827195318), FRAC_CONST(0.88010699979824036), FRAC_CONST(0.88083426034774204), FRAC_CONST(0.88155944820914378), FRAC_CONST(0.8822825616760086), FRAC_CONST(0.88300359904678072), FRAC_CONST(0.88372255862478966), FRAC_CONST(0.8844394387182537), FRAC_CONST(0.88515423764028511), FRAC_CONST(0.88586695370889279), FRAC_CONST(0.88657758524698704), FRAC_CONST(0.88728613058238315), FRAC_CONST(0.88799258804780556), FRAC_CONST(0.88869695598089171), FRAC_CONST(0.88939923272419552), FRAC_CONST(0.89009941662519221), FRAC_CONST(0.89079750603628149), FRAC_CONST(0.89149349931479138), FRAC_CONST(0.89218739482298248), FRAC_CONST(0.89287919092805168), FRAC_CONST(0.89356888600213602), FRAC_CONST(0.89425647842231604), FRAC_CONST(0.89494196657062075), FRAC_CONST(0.89562534883403), FRAC_CONST(0.89630662360447966), FRAC_CONST(0.89698578927886397), FRAC_CONST(0.89766284425904075), FRAC_CONST(0.89833778695183419), FRAC_CONST(0.89901061576903907), FRAC_CONST(0.89968132912742393), FRAC_CONST(0.9003499254487356), FRAC_CONST(0.90101640315970233), FRAC_CONST(0.90168076069203773), FRAC_CONST(0.9023429964824442), FRAC_CONST(0.90300310897261704), FRAC_CONST(0.90366109660924798), FRAC_CONST(0.90431695784402832), FRAC_CONST(0.90497069113365325), FRAC_CONST(0.90562229493982516), FRAC_CONST(0.90627176772925766), FRAC_CONST(0.90691910797367803), FRAC_CONST(0.90756431414983252), FRAC_CONST(0.9082073847394887), FRAC_CONST(0.90884831822943912), FRAC_CONST(0.90948711311150543), FRAC_CONST(0.91012376788254157), FRAC_CONST(0.91075828104443757), FRAC_CONST(0.91139065110412232), FRAC_CONST(0.91202087657356823), FRAC_CONST(0.9126489559697939), FRAC_CONST(0.91327488781486776), FRAC_CONST(0.91389867063591168), FRAC_CONST(0.91452030296510445), FRAC_CONST(0.91513978333968526), FRAC_CONST(0.91575711030195672), FRAC_CONST(0.91637228239928914), FRAC_CONST(0.91698529818412289), FRAC_CONST(0.91759615621397295), FRAC_CONST(0.9182048550514309), FRAC_CONST(0.91881139326416994), FRAC_CONST(0.91941576942494696), FRAC_CONST(0.92001798211160657), FRAC_CONST(0.92061802990708386), FRAC_CONST(0.92121591139940873), FRAC_CONST(0.92181162518170812), FRAC_CONST(0.92240516985220988), FRAC_CONST(0.92299654401424625), FRAC_CONST(0.92358574627625656), FRAC_CONST(0.9241727752517912), FRAC_CONST(0.92475762955951391), FRAC_CONST(0.9253403078232062), FRAC_CONST(0.92592080867176996), FRAC_CONST(0.92649913073923051), FRAC_CONST(0.9270752726647401), FRAC_CONST(0.92764923309258118), FRAC_CONST(0.92822101067216944), FRAC_CONST(0.92879060405805702), FRAC_CONST(0.9293580119099355), FRAC_CONST(0.92992323289263956), FRAC_CONST(0.93048626567614978), FRAC_CONST(0.93104710893559517), FRAC_CONST(0.93160576135125783), FRAC_CONST(0.93216222160857432), FRAC_CONST(0.93271648839814025), FRAC_CONST(0.93326856041571205), FRAC_CONST(0.93381843636221096), FRAC_CONST(0.9343661149437259), FRAC_CONST(0.93491159487151609), FRAC_CONST(0.93545487486201462), FRAC_CONST(0.9359959536368313), FRAC_CONST(0.9365348299227555), FRAC_CONST(0.93707150245175919), FRAC_CONST(0.93760596996099999), FRAC_CONST(0.93813823119282436), FRAC_CONST(0.93866828489477017), FRAC_CONST(0.9391961298195699), FRAC_CONST(0.93972176472515334), FRAC_CONST(0.94024518837465088), FRAC_CONST(0.94076639953639607), FRAC_CONST(0.94128539698392866), FRAC_CONST(0.94180217949599765), FRAC_CONST(0.94231674585656378), FRAC_CONST(0.94282909485480271), FRAC_CONST(0.94333922528510772), FRAC_CONST(0.94384713594709269), FRAC_CONST(0.94435282564559475), FRAC_CONST(0.94485629319067721), FRAC_CONST(0.94535753739763229), FRAC_CONST(0.94585655708698391), FRAC_CONST(0.94635335108449059), FRAC_CONST(0.946847918221148), FRAC_CONST(0.94734025733319194), FRAC_CONST(0.94783036726210101), FRAC_CONST(0.94831824685459909), FRAC_CONST(0.94880389496265838), FRAC_CONST(0.94928731044350201), FRAC_CONST(0.94976849215960668), FRAC_CONST(0.95024743897870523), FRAC_CONST(0.95072414977378961), FRAC_CONST(0.95119862342311323), FRAC_CONST(0.95167085881019386), FRAC_CONST(0.95214085482381583), FRAC_CONST(0.95260861035803324), FRAC_CONST(0.9530741243121722), FRAC_CONST(0.95353739559083328), FRAC_CONST(0.95399842310389449), FRAC_CONST(0.95445720576651349), FRAC_CONST(0.95491374249913052), FRAC_CONST(0.95536803222747024), FRAC_CONST(0.95582007388254542), FRAC_CONST(0.95626986640065814), FRAC_CONST(0.95671740872340305), FRAC_CONST(0.9571626997976701), FRAC_CONST(0.95760573857564624), FRAC_CONST(0.9580465240148186), FRAC_CONST(0.9584850550779761), FRAC_CONST(0.95892133073321306), FRAC_CONST(0.95935534995393079), FRAC_CONST(0.9597871117188399), FRAC_CONST(0.96021661501196343), FRAC_CONST(0.96064385882263847), FRAC_CONST(0.96106884214551935), FRAC_CONST(0.961491563980579), FRAC_CONST(0.9619120233331121), FRAC_CONST(0.9623302192137374), FRAC_CONST(0.96274615063839941), FRAC_CONST(0.96315981662837136), FRAC_CONST(0.96357121621025721), FRAC_CONST(0.96398034841599411), FRAC_CONST(0.96438721228285429), FRAC_CONST(0.9647918068534479), FRAC_CONST(0.96519413117572472), FRAC_CONST(0.96559418430297683), FRAC_CONST(0.96599196529384057), FRAC_CONST(0.96638747321229879), FRAC_CONST(0.96678070712768327), FRAC_CONST(0.96717166611467664), FRAC_CONST(0.96756034925331436), FRAC_CONST(0.9679467556289878), FRAC_CONST(0.9683308843324453), FRAC_CONST(0.96871273445979478), FRAC_CONST(0.9690923051125061), FRAC_CONST(0.96946959539741295), FRAC_CONST(0.96984460442671483), FRAC_CONST(0.97021733131797916), FRAC_CONST(0.97058777519414363), FRAC_CONST(0.97095593518351797), FRAC_CONST(0.97132181041978616), FRAC_CONST(0.97168540004200854), FRAC_CONST(0.9720467031946235), FRAC_CONST(0.97240571902744977), FRAC_CONST(0.97276244669568857), FRAC_CONST(0.97311688535992513), FRAC_CONST(0.97346903418613095), FRAC_CONST(0.9738188923456661), FRAC_CONST(0.97416645901528032), FRAC_CONST(0.97451173337711572), FRAC_CONST(0.97485471461870843), FRAC_CONST(0.97519540193299037), FRAC_CONST(0.97553379451829136), FRAC_CONST(0.97586989157834103), FRAC_CONST(0.97620369232227056), FRAC_CONST(0.97653519596461447), FRAC_CONST(0.97686440172531264), FRAC_CONST(0.97719130882971228), FRAC_CONST(0.97751591650856928), FRAC_CONST(0.97783822399805043), FRAC_CONST(0.97815823053973505), FRAC_CONST(0.97847593538061683), FRAC_CONST(0.97879133777310567), FRAC_CONST(0.97910443697502925), FRAC_CONST(0.97941523224963478), FRAC_CONST(0.97972372286559117), FRAC_CONST(0.98002990809698998), FRAC_CONST(0.98033378722334796), FRAC_CONST(0.98063535952960812), FRAC_CONST(0.98093462430614164), FRAC_CONST(0.98123158084874973), FRAC_CONST(0.98152622845866466), FRAC_CONST(0.9818185664425525), FRAC_CONST(0.98210859411251361), FRAC_CONST(0.98239631078608469), FRAC_CONST(0.98268171578624086), FRAC_CONST(0.98296480844139644), FRAC_CONST(0.98324558808540707), FRAC_CONST(0.98352405405757126), FRAC_CONST(0.98380020570263149), FRAC_CONST(0.98407404237077645), FRAC_CONST(0.9843455634176419), FRAC_CONST(0.9846147682043126), FRAC_CONST(0.9848816560973237), FRAC_CONST(0.98514622646866223), FRAC_CONST(0.98540847869576842), FRAC_CONST(0.98566841216153755), FRAC_CONST(0.98592602625432113), FRAC_CONST(0.98618132036792827), FRAC_CONST(0.98643429390162707), FRAC_CONST(0.98668494626014669), FRAC_CONST(0.98693327685367771), FRAC_CONST(0.98717928509787434), FRAC_CONST(0.98742297041385541), FRAC_CONST(0.98766433222820571), FRAC_CONST(0.98790336997297779), FRAC_CONST(0.98814008308569257), FRAC_CONST(0.98837447100934128), FRAC_CONST(0.98860653319238645), FRAC_CONST(0.98883626908876354), FRAC_CONST(0.98906367815788154), FRAC_CONST(0.98928875986462517), FRAC_CONST(0.98951151367935519), FRAC_CONST(0.98973193907791057), FRAC_CONST(0.98995003554160899), FRAC_CONST(0.9901658025572484), FRAC_CONST(0.99037923961710816), FRAC_CONST(0.99059034621895015), FRAC_CONST(0.99079912186602037), FRAC_CONST(0.99100556606704937), FRAC_CONST(0.99120967833625406), FRAC_CONST(0.99141145819333854), FRAC_CONST(0.99161090516349537), FRAC_CONST(0.99180801877740643), FRAC_CONST(0.99200279857124452), FRAC_CONST(0.99219524408667392), FRAC_CONST(0.99238535487085167), FRAC_CONST(0.99257313047642881), FRAC_CONST(0.99275857046155114), FRAC_CONST(0.99294167438986047), FRAC_CONST(0.99312244183049558), FRAC_CONST(0.99330087235809328), FRAC_CONST(0.99347696555278919), FRAC_CONST(0.99365072100021912), FRAC_CONST(0.99382213829151966), FRAC_CONST(0.99399121702332938), FRAC_CONST(0.99415795679778973), FRAC_CONST(0.99432235722254581), FRAC_CONST(0.9944844179107476), FRAC_CONST(0.99464413848105071), FRAC_CONST(0.99480151855761711), FRAC_CONST(0.99495655777011638), FRAC_CONST(0.99510925575372611), FRAC_CONST(0.99525961214913339), FRAC_CONST(0.9954076266025349), FRAC_CONST(0.99555329876563847), FRAC_CONST(0.99569662829566352), FRAC_CONST(0.99583761485534161), FRAC_CONST(0.99597625811291779), FRAC_CONST(0.99611255774215113), FRAC_CONST(0.99624651342231552), FRAC_CONST(0.99637812483820021), FRAC_CONST(0.99650739168011082), FRAC_CONST(0.9966343136438699), FRAC_CONST(0.996758890430818), FRAC_CONST(0.99688112174781385), FRAC_CONST(0.99700100730723529), FRAC_CONST(0.99711854682697998), FRAC_CONST(0.99723374003046616), FRAC_CONST(0.99734658664663323), FRAC_CONST(0.99745708640994191), FRAC_CONST(0.99756523906037575), FRAC_CONST(0.997671044343441), FRAC_CONST(0.99777450201016782), FRAC_CONST(0.99787561181711015), FRAC_CONST(0.99797437352634699), FRAC_CONST(0.99807078690548234), FRAC_CONST(0.99816485172764624), FRAC_CONST(0.99825656777149518), FRAC_CONST(0.99834593482121237), FRAC_CONST(0.99843295266650844), FRAC_CONST(0.99851762110262221), FRAC_CONST(0.99859993993032037), FRAC_CONST(0.99867990895589909), FRAC_CONST(0.99875752799118334), FRAC_CONST(0.99883279685352799), FRAC_CONST(0.99890571536581829), FRAC_CONST(0.99897628335646982), FRAC_CONST(0.99904450065942929), FRAC_CONST(0.99911036711417489), FRAC_CONST(0.99917388256571638), FRAC_CONST(0.99923504686459585), FRAC_CONST(0.99929385986688779), FRAC_CONST(0.99935032143419944), FRAC_CONST(0.9994044314336713), FRAC_CONST(0.99945618973797734), FRAC_CONST(0.99950559622532531), FRAC_CONST(0.99955265077945699), FRAC_CONST(0.99959735328964838), FRAC_CONST(0.9996397036507102), FRAC_CONST(0.99967970176298793), FRAC_CONST(0.99971734753236219), FRAC_CONST(0.99975264087024884), FRAC_CONST(0.99978558169359921), FRAC_CONST(0.99981616992490041), FRAC_CONST(0.99984440549217524), FRAC_CONST(0.99987028832898295), FRAC_CONST(0.99989381837441849), FRAC_CONST(0.99991499557311347), FRAC_CONST(0.999933819875236), FRAC_CONST(0.99995029123649048), FRAC_CONST(0.99996440961811828), FRAC_CONST(0.99997617498689761), FRAC_CONST(0.9999855873151432), FRAC_CONST(0.99999264658070719), FRAC_CONST(0.99999735276697821), FRAC_CONST(0.99999970586288223) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t sine_long_960[] = { FRAC_CONST(0.00081812299560725323), FRAC_CONST(0.0024543667964602917), FRAC_CONST(0.0040906040262347889), FRAC_CONST(0.0057268303042312674), FRAC_CONST(0.0073630412497795667), FRAC_CONST(0.0089992324822505774), FRAC_CONST(0.010635399621067975), FRAC_CONST(0.012271538285719924), FRAC_CONST(0.013907644095770845), FRAC_CONST(0.015543712670873098), FRAC_CONST(0.017179739630778748), FRAC_CONST(0.018815720595351273), FRAC_CONST(0.020451651184577292), FRAC_CONST(0.022087527018578291), FRAC_CONST(0.023723343717622358), FRAC_CONST(0.025359096902135895), FRAC_CONST(0.02699478219271537), FRAC_CONST(0.028630395210139003), FRAC_CONST(0.030265931575378519), FRAC_CONST(0.031901386909610863), FRAC_CONST(0.033536756834229922), FRAC_CONST(0.035172036970858266), FRAC_CONST(0.036807222941358832), FRAC_CONST(0.038442310367846677), FRAC_CONST(0.040077294872700696), FRAC_CONST(0.041712172078575326), FRAC_CONST(0.043346937608412288), FRAC_CONST(0.044981587085452281), FRAC_CONST(0.046616116133246711), FRAC_CONST(0.048250520375669431), FRAC_CONST(0.049884795436928406), FRAC_CONST(0.051518936941577477), FRAC_CONST(0.053152940514528055), FRAC_CONST(0.05478680178106083), FRAC_CONST(0.056420516366837495), FRAC_CONST(0.05805407989791244), FRAC_CONST(0.059687488000744485), FRAC_CONST(0.061320736302208578), FRAC_CONST(0.062953820429607482), FRAC_CONST(0.064586736010683557), FRAC_CONST(0.066219478673630344), FRAC_CONST(0.06785204404710439), FRAC_CONST(0.069484427760236861), FRAC_CONST(0.071116625442645326), FRAC_CONST(0.072748632724445372), FRAC_CONST(0.07438044523626236), FRAC_CONST(0.076012058609243122), FRAC_CONST(0.077643468475067631), FRAC_CONST(0.079274670465960706), FRAC_CONST(0.080905660214703745), FRAC_CONST(0.082536433354646319), FRAC_CONST(0.084166985519717977), FRAC_CONST(0.085797312344439894), FRAC_CONST(0.08742740946393647), FRAC_CONST(0.089057272513947183), FRAC_CONST(0.090686897130838162), FRAC_CONST(0.092316278951613845), FRAC_CONST(0.093945413613928788), FRAC_CONST(0.095574296756099186), FRAC_CONST(0.097202924017114667), FRAC_CONST(0.098831291036649963), FRAC_CONST(0.10045939345507648), FRAC_CONST(0.10208722691347409), FRAC_CONST(0.10371478705364276), FRAC_CONST(0.10534206951811415), FRAC_CONST(0.10696906995016341), FRAC_CONST(0.10859578399382072), FRAC_CONST(0.11022220729388306), FRAC_CONST(0.11184833549592579), FRAC_CONST(0.11347416424631435), FRAC_CONST(0.11509968919221586), FRAC_CONST(0.11672490598161089), FRAC_CONST(0.11834981026330495), FRAC_CONST(0.11997439768694031), FRAC_CONST(0.12159866390300751), FRAC_CONST(0.12322260456285709), FRAC_CONST(0.12484621531871121), FRAC_CONST(0.12646949182367517), FRAC_CONST(0.12809242973174936), FRAC_CONST(0.12971502469784052), FRAC_CONST(0.13133727237777362), FRAC_CONST(0.13295916842830346), FRAC_CONST(0.13458070850712617), FRAC_CONST(0.13620188827289101), FRAC_CONST(0.1378227033852118), FRAC_CONST(0.13944314950467873), FRAC_CONST(0.14106322229286994), FRAC_CONST(0.14268291741236291), FRAC_CONST(0.14430223052674654), FRAC_CONST(0.1459211573006321), FRAC_CONST(0.14753969339966552), FRAC_CONST(0.14915783449053857), FRAC_CONST(0.15077557624100058), FRAC_CONST(0.15239291431987001), FRAC_CONST(0.1540098443970461), FRAC_CONST(0.15562636214352044), FRAC_CONST(0.15724246323138855), FRAC_CONST(0.15885814333386142), FRAC_CONST(0.16047339812527725), FRAC_CONST(0.16208822328111283), FRAC_CONST(0.16370261447799525), FRAC_CONST(0.16531656739371339), FRAC_CONST(0.16693007770722967), FRAC_CONST(0.16854314109869134), FRAC_CONST(0.17015575324944232), FRAC_CONST(0.17176790984203447), FRAC_CONST(0.17337960656023954), FRAC_CONST(0.1749908390890603), FRAC_CONST(0.17660160311474243), FRAC_CONST(0.17821189432478593), FRAC_CONST(0.17982170840795647), FRAC_CONST(0.18143104105429744), FRAC_CONST(0.18303988795514095), FRAC_CONST(0.1846482448031197), FRAC_CONST(0.18625610729217834), FRAC_CONST(0.1878634711175852), FRAC_CONST(0.18947033197594348), FRAC_CONST(0.19107668556520319), FRAC_CONST(0.19268252758467228), FRAC_CONST(0.19428785373502844), FRAC_CONST(0.19589265971833042), FRAC_CONST(0.19749694123802966), FRAC_CONST(0.19910069399898173), FRAC_CONST(0.20070391370745785), FRAC_CONST(0.20230659607115639), FRAC_CONST(0.20390873679921437), FRAC_CONST(0.20551033160221882), FRAC_CONST(0.20711137619221856), FRAC_CONST(0.2087118662827353), FRAC_CONST(0.21031179758877552), FRAC_CONST(0.21191116582684155), FRAC_CONST(0.21350996671494335), FRAC_CONST(0.21510819597260972), FRAC_CONST(0.21670584932089998), FRAC_CONST(0.2183029224824154), FRAC_CONST(0.21989941118131037), FRAC_CONST(0.22149531114330431), FRAC_CONST(0.22309061809569264), FRAC_CONST(0.22468532776735861), FRAC_CONST(0.22627943588878449), FRAC_CONST(0.22787293819206314), FRAC_CONST(0.22946583041090929), FRAC_CONST(0.23105810828067114), FRAC_CONST(0.23264976753834157), FRAC_CONST(0.23424080392256985), FRAC_CONST(0.2358312131736727), FRAC_CONST(0.23742099103364595), FRAC_CONST(0.23901013324617584), FRAC_CONST(0.24059863555665045), FRAC_CONST(0.24218649371217096), FRAC_CONST(0.24377370346156332), FRAC_CONST(0.24536026055538934), FRAC_CONST(0.24694616074595824), FRAC_CONST(0.24853139978733788), FRAC_CONST(0.25011597343536629), FRAC_CONST(0.25169987744766298), FRAC_CONST(0.25328310758364025), FRAC_CONST(0.25486565960451457), FRAC_CONST(0.25644752927331788), FRAC_CONST(0.25802871235490898), FRAC_CONST(0.25960920461598508), FRAC_CONST(0.26118900182509258), FRAC_CONST(0.26276809975263904), FRAC_CONST(0.264346494170904), FRAC_CONST(0.26592418085405067), FRAC_CONST(0.26750115557813692), FRAC_CONST(0.2690774141211269), FRAC_CONST(0.27065295226290209), FRAC_CONST(0.2722277657852728), FRAC_CONST(0.27380185047198918), FRAC_CONST(0.27537520210875299), FRAC_CONST(0.2769478164832283), FRAC_CONST(0.27851968938505312), FRAC_CONST(0.28009081660585067), FRAC_CONST(0.28166119393924061), FRAC_CONST(0.28323081718085019), FRAC_CONST(0.28479968212832563), FRAC_CONST(0.28636778458134327), FRAC_CONST(0.28793512034162105), FRAC_CONST(0.2895016852129294), FRAC_CONST(0.29106747500110264), FRAC_CONST(0.29263248551405047), FRAC_CONST(0.2941967125617686), FRAC_CONST(0.29576015195635058), FRAC_CONST(0.29732279951199847), FRAC_CONST(0.29888465104503475), FRAC_CONST(0.30044570237391266), FRAC_CONST(0.30200594931922808), FRAC_CONST(0.30356538770373032), FRAC_CONST(0.30512401335233358), FRAC_CONST(0.30668182209212791), FRAC_CONST(0.3082388097523906), FRAC_CONST(0.30979497216459695), FRAC_CONST(0.31135030516243201), FRAC_CONST(0.3129048045818012), FRAC_CONST(0.31445846626084178), FRAC_CONST(0.31601128603993378), FRAC_CONST(0.31756325976171151), FRAC_CONST(0.31911438327107416), FRAC_CONST(0.32066465241519732), FRAC_CONST(0.32221406304354389), FRAC_CONST(0.3237626110078754), FRAC_CONST(0.32531029216226293), FRAC_CONST(0.32685710236309828), FRAC_CONST(0.32840303746910487), FRAC_CONST(0.32994809334134939), FRAC_CONST(0.3314922658432522), FRAC_CONST(0.33303555084059877), FRAC_CONST(0.33457794420155085), FRAC_CONST(0.33611944179665709), FRAC_CONST(0.33766003949886464), FRAC_CONST(0.33919973318352969), FRAC_CONST(0.34073851872842903), FRAC_CONST(0.34227639201377064), FRAC_CONST(0.34381334892220483), FRAC_CONST(0.34534938533883547), FRAC_CONST(0.34688449715123082), FRAC_CONST(0.34841868024943456), FRAC_CONST(0.34995193052597684), FRAC_CONST(0.35148424387588523), FRAC_CONST(0.3530156161966958), FRAC_CONST(0.35454604338846402), FRAC_CONST(0.35607552135377557), FRAC_CONST(0.35760404599775775), FRAC_CONST(0.35913161322809023), FRAC_CONST(0.36065821895501554), FRAC_CONST(0.36218385909135092), FRAC_CONST(0.36370852955249849), FRAC_CONST(0.36523222625645668), FRAC_CONST(0.36675494512383078), FRAC_CONST(0.36827668207784414), FRAC_CONST(0.36979743304434909), FRAC_CONST(0.37131719395183754), FRAC_CONST(0.37283596073145214), FRAC_CONST(0.37435372931699717), FRAC_CONST(0.37587049564494951), FRAC_CONST(0.37738625565446909), FRAC_CONST(0.37890100528741022), FRAC_CONST(0.38041474048833229), FRAC_CONST(0.38192745720451066), FRAC_CONST(0.38343915138594736), FRAC_CONST(0.38494981898538222), FRAC_CONST(0.38645945595830333), FRAC_CONST(0.38796805826295838), FRAC_CONST(0.38947562186036483), FRAC_CONST(0.39098214271432141), FRAC_CONST(0.39248761679141814), FRAC_CONST(0.3939920400610481), FRAC_CONST(0.39549540849541737), FRAC_CONST(0.39699771806955625), FRAC_CONST(0.39849896476132979), FRAC_CONST(0.39999914455144892), FRAC_CONST(0.40149825342348083), FRAC_CONST(0.4029962873638599), FRAC_CONST(0.40449324236189854), FRAC_CONST(0.40598911440979762), FRAC_CONST(0.40748389950265762), FRAC_CONST(0.40897759363848879), FRAC_CONST(0.41047019281822261), FRAC_CONST(0.41196169304572178), FRAC_CONST(0.4134520903277914), FRAC_CONST(0.41494138067418929), FRAC_CONST(0.41642956009763715), FRAC_CONST(0.41791662461383078), FRAC_CONST(0.41940257024145089), FRAC_CONST(0.42088739300217382), FRAC_CONST(0.42237108892068231), FRAC_CONST(0.42385365402467584), FRAC_CONST(0.42533508434488143), FRAC_CONST(0.42681537591506419), FRAC_CONST(0.42829452477203828), FRAC_CONST(0.42977252695567697), FRAC_CONST(0.43124937850892364), FRAC_CONST(0.4327250754778022), FRAC_CONST(0.43419961391142781), FRAC_CONST(0.43567298986201736), FRAC_CONST(0.43714519938489987), FRAC_CONST(0.43861623853852766), FRAC_CONST(0.44008610338448595), FRAC_CONST(0.44155478998750436), FRAC_CONST(0.44302229441546676), FRAC_CONST(0.4444886127394222), FRAC_CONST(0.44595374103359531), FRAC_CONST(0.44741767537539667), FRAC_CONST(0.44888041184543348), FRAC_CONST(0.45034194652752002), FRAC_CONST(0.45180227550868812), FRAC_CONST(0.45326139487919759), FRAC_CONST(0.45471930073254679), FRAC_CONST(0.45617598916548296), FRAC_CONST(0.45763145627801283), FRAC_CONST(0.45908569817341294), FRAC_CONST(0.46053871095824001), FRAC_CONST(0.46199049074234161), FRAC_CONST(0.46344103363886635), FRAC_CONST(0.46489033576427435), FRAC_CONST(0.46633839323834758), FRAC_CONST(0.46778520218420055), FRAC_CONST(0.46923075872829029), FRAC_CONST(0.47067505900042683), FRAC_CONST(0.47211809913378361), FRAC_CONST(0.47355987526490806), FRAC_CONST(0.47500038353373153), FRAC_CONST(0.47643962008357982), FRAC_CONST(0.47787758106118372), FRAC_CONST(0.47931426261668875), FRAC_CONST(0.48074966090366611), FRAC_CONST(0.48218377207912272), FRAC_CONST(0.48361659230351117), FRAC_CONST(0.48504811774074069), FRAC_CONST(0.48647834455818684), FRAC_CONST(0.48790726892670194), FRAC_CONST(0.48933488702062544), FRAC_CONST(0.49076119501779414), FRAC_CONST(0.49218618909955225), FRAC_CONST(0.4936098654507618), FRAC_CONST(0.49503222025981269), FRAC_CONST(0.49645324971863303), FRAC_CONST(0.49787295002269943), FRAC_CONST(0.49929131737104687), FRAC_CONST(0.50070834796627917), FRAC_CONST(0.50212403801457872), FRAC_CONST(0.50353838372571758), FRAC_CONST(0.50495138131306638), FRAC_CONST(0.50636302699360547), FRAC_CONST(0.50777331698793449), FRAC_CONST(0.50918224752028263), FRAC_CONST(0.51058981481851906), FRAC_CONST(0.51199601511416237), FRAC_CONST(0.51340084464239111), FRAC_CONST(0.51480429964205421), FRAC_CONST(0.51620637635567967), FRAC_CONST(0.51760707102948678), FRAC_CONST(0.51900637991339404), FRAC_CONST(0.5204042992610306), FRAC_CONST(0.52180082532974559), FRAC_CONST(0.5231959543806185), FRAC_CONST(0.52458968267846895), FRAC_CONST(0.52598200649186677), FRAC_CONST(0.52737292209314235), FRAC_CONST(0.52876242575839572), FRAC_CONST(0.53015051376750777), FRAC_CONST(0.53153718240414882), FRAC_CONST(0.53292242795578992), FRAC_CONST(0.53430624671371152), FRAC_CONST(0.53568863497301467), FRAC_CONST(0.5370695890326298), FRAC_CONST(0.5384491051953274), FRAC_CONST(0.53982717976772743), FRAC_CONST(0.54120380906030963), FRAC_CONST(0.54257898938742311), FRAC_CONST(0.54395271706729609), FRAC_CONST(0.54532498842204646), FRAC_CONST(0.54669579977769045), FRAC_CONST(0.54806514746415402), FRAC_CONST(0.54943302781528081), FRAC_CONST(0.55079943716884383), FRAC_CONST(0.55216437186655387), FRAC_CONST(0.55352782825406999), FRAC_CONST(0.55488980268100907), FRAC_CONST(0.55625029150095584), FRAC_CONST(0.55760929107147217), FRAC_CONST(0.55896679775410718), FRAC_CONST(0.56032280791440714), FRAC_CONST(0.56167731792192455), FRAC_CONST(0.56303032415022869), FRAC_CONST(0.56438182297691453), FRAC_CONST(0.56573181078361312), FRAC_CONST(0.56708028395600085), FRAC_CONST(0.56842723888380908), FRAC_CONST(0.56977267196083425), FRAC_CONST(0.57111657958494688), FRAC_CONST(0.5724589581581021), FRAC_CONST(0.57379980408634845), FRAC_CONST(0.57513911377983773), FRAC_CONST(0.57647688365283478), FRAC_CONST(0.57781311012372738), FRAC_CONST(0.57914778961503466), FRAC_CONST(0.58048091855341843), FRAC_CONST(0.5818124933696911), FRAC_CONST(0.58314251049882604), FRAC_CONST(0.58447096637996743), FRAC_CONST(0.58579785745643886), FRAC_CONST(0.5871231801757536), FRAC_CONST(0.58844693098962408), FRAC_CONST(0.58976910635397084), FRAC_CONST(0.59108970272893235), FRAC_CONST(0.59240871657887517), FRAC_CONST(0.59372614437240179), FRAC_CONST(0.59504198258236196), FRAC_CONST(0.5963562276858605), FRAC_CONST(0.59766887616426767), FRAC_CONST(0.5989799245032289), FRAC_CONST(0.60028936919267273), FRAC_CONST(0.60159720672682204), FRAC_CONST(0.60290343360420195), FRAC_CONST(0.60420804632765002), FRAC_CONST(0.60551104140432543), FRAC_CONST(0.60681241534571839), FRAC_CONST(0.60811216466765883), FRAC_CONST(0.60941028589032709), FRAC_CONST(0.61070677553826169), FRAC_CONST(0.61200163014036979), FRAC_CONST(0.61329484622993602), FRAC_CONST(0.6145864203446314), FRAC_CONST(0.61587634902652377), FRAC_CONST(0.61716462882208556), FRAC_CONST(0.61845125628220421), FRAC_CONST(0.61973622796219074), FRAC_CONST(0.6210195404217892), FRAC_CONST(0.62230119022518593), FRAC_CONST(0.62358117394101897), FRAC_CONST(0.62485948814238634), FRAC_CONST(0.62613612940685637), FRAC_CONST(0.62741109431647646), FRAC_CONST(0.62868437945778133), FRAC_CONST(0.62995598142180387), FRAC_CONST(0.6312258968040827), FRAC_CONST(0.63249412220467238), FRAC_CONST(0.63376065422815175), FRAC_CONST(0.63502548948363347), FRAC_CONST(0.63628862458477287), FRAC_CONST(0.63755005614977711), FRAC_CONST(0.63880978080141437), FRAC_CONST(0.6400677951670225), FRAC_CONST(0.6413240958785188), FRAC_CONST(0.64257867957240766), FRAC_CONST(0.6438315428897915), FRAC_CONST(0.64508268247637779), FRAC_CONST(0.64633209498248945), FRAC_CONST(0.64757977706307335), FRAC_CONST(0.64882572537770888), FRAC_CONST(0.65006993659061751), FRAC_CONST(0.65131240737067142), FRAC_CONST(0.65255313439140239), FRAC_CONST(0.65379211433101081), FRAC_CONST(0.65502934387237444), FRAC_CONST(0.6562648197030575), FRAC_CONST(0.65749853851531959), FRAC_CONST(0.65873049700612374), FRAC_CONST(0.65996069187714679), FRAC_CONST(0.66118911983478657), FRAC_CONST(0.66241577759017178), FRAC_CONST(0.66364066185917048), FRAC_CONST(0.66486376936239888), FRAC_CONST(0.66608509682523009), FRAC_CONST(0.66730464097780284), FRAC_CONST(0.66852239855503071), FRAC_CONST(0.66973836629660977), FRAC_CONST(0.67095254094702894), FRAC_CONST(0.67216491925557675), FRAC_CONST(0.67337549797635199), FRAC_CONST(0.67458427386827102), FRAC_CONST(0.67579124369507693), FRAC_CONST(0.67699640422534846), FRAC_CONST(0.67819975223250772), FRAC_CONST(0.6794012844948305), FRAC_CONST(0.68060099779545302), FRAC_CONST(0.68179888892238183), FRAC_CONST(0.6829949546685018), FRAC_CONST(0.68418919183158522), FRAC_CONST(0.68538159721429948), FRAC_CONST(0.6865721676242168), FRAC_CONST(0.68776089987382172), FRAC_CONST(0.68894779078052026), FRAC_CONST(0.69013283716664853), FRAC_CONST(0.69131603585948032), FRAC_CONST(0.69249738369123692), FRAC_CONST(0.69367687749909468), FRAC_CONST(0.69485451412519361), FRAC_CONST(0.69603029041664599), FRAC_CONST(0.6972042032255451), FRAC_CONST(0.6983762494089728), FRAC_CONST(0.69954642582900894), FRAC_CONST(0.70071472935273893), FRAC_CONST(0.70188115685226271), FRAC_CONST(0.703045705204703), FRAC_CONST(0.70420837129221303), FRAC_CONST(0.70536915200198613), FRAC_CONST(0.70652804422626281), FRAC_CONST(0.70768504486233985), FRAC_CONST(0.70884015081257845), FRAC_CONST(0.70999335898441229), FRAC_CONST(0.711144666290356), FRAC_CONST(0.71229406964801356), FRAC_CONST(0.71344156598008623), FRAC_CONST(0.71458715221438096), FRAC_CONST(0.71573082528381871), FRAC_CONST(0.71687258212644234), FRAC_CONST(0.7180124196854254), FRAC_CONST(0.71915033490907943), FRAC_CONST(0.72028632475086318), FRAC_CONST(0.72142038616938997), FRAC_CONST(0.72255251612843596), FRAC_CONST(0.72368271159694852), FRAC_CONST(0.72481096954905444), FRAC_CONST(0.72593728696406756), FRAC_CONST(0.72706166082649704), FRAC_CONST(0.72818408812605595), FRAC_CONST(0.72930456585766834), FRAC_CONST(0.73042309102147851), FRAC_CONST(0.73153966062285747), FRAC_CONST(0.73265427167241282), FRAC_CONST(0.73376692118599507), FRAC_CONST(0.73487760618470677), FRAC_CONST(0.73598632369490979), FRAC_CONST(0.73709307074823405), FRAC_CONST(0.73819784438158409), FRAC_CONST(0.73930064163714881), FRAC_CONST(0.74040145956240788), FRAC_CONST(0.74150029521014049), FRAC_CONST(0.74259714563843304), FRAC_CONST(0.74369200791068657), FRAC_CONST(0.74478487909562552), FRAC_CONST(0.74587575626730485), FRAC_CONST(0.74696463650511791), FRAC_CONST(0.74805151689380456), FRAC_CONST(0.74913639452345926), FRAC_CONST(0.75021926648953785), FRAC_CONST(0.75130012989286621), FRAC_CONST(0.7523789818396478), FRAC_CONST(0.75345581944147111), FRAC_CONST(0.75453063981531809), FRAC_CONST(0.75560344008357094), FRAC_CONST(0.75667421737402052), FRAC_CONST(0.7577429688198738), FRAC_CONST(0.75880969155976163), FRAC_CONST(0.75987438273774599), FRAC_CONST(0.76093703950332836), FRAC_CONST(0.76199765901145666), FRAC_CONST(0.76305623842253345), FRAC_CONST(0.76411277490242291), FRAC_CONST(0.76516726562245885), FRAC_CONST(0.76621970775945258), FRAC_CONST(0.76727009849569949), FRAC_CONST(0.76831843501898767), FRAC_CONST(0.76936471452260458), FRAC_CONST(0.77040893420534517), FRAC_CONST(0.77145109127151923), FRAC_CONST(0.77249118293095853), FRAC_CONST(0.77352920639902467), FRAC_CONST(0.77456515889661659), FRAC_CONST(0.77559903765017746), FRAC_CONST(0.7766308398917029), FRAC_CONST(0.77766056285874774), FRAC_CONST(0.77868820379443371), FRAC_CONST(0.77971375994745684), FRAC_CONST(0.78073722857209438), FRAC_CONST(0.7817586069282132), FRAC_CONST(0.78277789228127592), FRAC_CONST(0.78379508190234881), FRAC_CONST(0.78481017306810918), FRAC_CONST(0.78582316306085265), FRAC_CONST(0.78683404916849986), FRAC_CONST(0.78784282868460476), FRAC_CONST(0.78884949890836087), FRAC_CONST(0.78985405714460888), FRAC_CONST(0.7908565007038445), FRAC_CONST(0.79185682690222425), FRAC_CONST(0.79285503306157412), FRAC_CONST(0.79385111650939566), FRAC_CONST(0.79484507457887377), FRAC_CONST(0.79583690460888357), FRAC_CONST(0.79682660394399751), FRAC_CONST(0.79781416993449272), FRAC_CONST(0.79879959993635785), FRAC_CONST(0.7997828913113002), FRAC_CONST(0.80076404142675273), FRAC_CONST(0.80174304765588156), FRAC_CONST(0.80271990737759213), FRAC_CONST(0.80369461797653707), FRAC_CONST(0.80466717684312306), FRAC_CONST(0.80563758137351682), FRAC_CONST(0.80660582896965372), FRAC_CONST(0.80757191703924336), FRAC_CONST(0.80853584299577752), FRAC_CONST(0.80949760425853612), FRAC_CONST(0.81045719825259477), FRAC_CONST(0.81141462240883167), FRAC_CONST(0.81236987416393436), FRAC_CONST(0.81332295096040608), FRAC_CONST(0.81427385024657373), FRAC_CONST(0.81522256947659355), FRAC_CONST(0.81616910611045879), FRAC_CONST(0.817113457614006), FRAC_CONST(0.81805562145892186), FRAC_CONST(0.81899559512275044), FRAC_CONST(0.81993337608889916), FRAC_CONST(0.82086896184664637), FRAC_CONST(0.8218023498911472), FRAC_CONST(0.82273353772344116), FRAC_CONST(0.82366252285045805), FRAC_CONST(0.82458930278502529), FRAC_CONST(0.82551387504587381), FRAC_CONST(0.82643623715764558), FRAC_CONST(0.82735638665089983), FRAC_CONST(0.82827432106211907), FRAC_CONST(0.82919003793371693), FRAC_CONST(0.83010353481404364), FRAC_CONST(0.83101480925739324), FRAC_CONST(0.83192385882400965), FRAC_CONST(0.83283068108009373), FRAC_CONST(0.8337352735978093), FRAC_CONST(0.83463763395529011), FRAC_CONST(0.83553775973664579), FRAC_CONST(0.83643564853196872), FRAC_CONST(0.83733129793734051), FRAC_CONST(0.83822470555483797), FRAC_CONST(0.83911586899254031), FRAC_CONST(0.84000478586453453), FRAC_CONST(0.84089145379092289), FRAC_CONST(0.84177587039782842), FRAC_CONST(0.84265803331740163), FRAC_CONST(0.84353794018782702), FRAC_CONST(0.844415588653329), FRAC_CONST(0.8452909763641786), FRAC_CONST(0.84616410097669936), FRAC_CONST(0.84703496015327406), FRAC_CONST(0.84790355156235053), FRAC_CONST(0.84876987287844818), FRAC_CONST(0.8496339217821639), FRAC_CONST(0.85049569596017938), FRAC_CONST(0.85135519310526508), FRAC_CONST(0.85221241091628896), FRAC_CONST(0.85306734709822085), FRAC_CONST(0.85391999936213903), FRAC_CONST(0.85477036542523732), FRAC_CONST(0.85561844301082923), FRAC_CONST(0.85646422984835635), FRAC_CONST(0.85730772367339259), FRAC_CONST(0.85814892222765116), FRAC_CONST(0.85898782325899026), FRAC_CONST(0.85982442452141961), FRAC_CONST(0.86065872377510555), FRAC_CONST(0.86149071878637817), FRAC_CONST(0.8623204073277364), FRAC_CONST(0.86314778717785412), FRAC_CONST(0.8639728561215867), FRAC_CONST(0.86479561194997623), FRAC_CONST(0.86561605246025763), FRAC_CONST(0.86643417545586487), FRAC_CONST(0.8672499787464365), FRAC_CONST(0.86806346014782154), FRAC_CONST(0.8688746174820855), FRAC_CONST(0.86968344857751589), FRAC_CONST(0.87048995126862883), FRAC_CONST(0.87129412339617363), FRAC_CONST(0.87209596280713941), FRAC_CONST(0.8728954673547612), FRAC_CONST(0.87369263489852422), FRAC_CONST(0.87448746330417149), FRAC_CONST(0.87527995044370765), FRAC_CONST(0.8760700941954066), FRAC_CONST(0.87685789244381551), FRAC_CONST(0.87764334307976144), FRAC_CONST(0.87842644400035663), FRAC_CONST(0.8792071931090043), FRAC_CONST(0.87998558831540408), FRAC_CONST(0.88076162753555787), FRAC_CONST(0.88153530869177488), FRAC_CONST(0.88230662971267804), FRAC_CONST(0.88307558853320878), FRAC_CONST(0.88384218309463292), FRAC_CONST(0.8846064113445461), FRAC_CONST(0.88536827123687933), FRAC_CONST(0.88612776073190425), FRAC_CONST(0.88688487779623937), FRAC_CONST(0.88763962040285393), FRAC_CONST(0.8883919865310751), FRAC_CONST(0.88914197416659235), FRAC_CONST(0.88988958130146301), FRAC_CONST(0.8906348059341177), FRAC_CONST(0.89137764606936609), FRAC_CONST(0.89211809971840139), FRAC_CONST(0.89285616489880615), FRAC_CONST(0.89359183963455813), FRAC_CONST(0.89432512195603453), FRAC_CONST(0.89505600990001799), FRAC_CONST(0.89578450150970124), FRAC_CONST(0.8965105948346932), FRAC_CONST(0.89723428793102367), FRAC_CONST(0.89795557886114807), FRAC_CONST(0.89867446569395382), FRAC_CONST(0.89939094650476448), FRAC_CONST(0.90010501937534515), FRAC_CONST(0.900816682393908), FRAC_CONST(0.90152593365511691), FRAC_CONST(0.90223277126009283), FRAC_CONST(0.90293719331641886), FRAC_CONST(0.90363919793814496), FRAC_CONST(0.90433878324579353), FRAC_CONST(0.90503594736636439), FRAC_CONST(0.90573068843333915), FRAC_CONST(0.90642300458668679), FRAC_CONST(0.90711289397286898), FRAC_CONST(0.90780035474484411), FRAC_CONST(0.90848538506207266), FRAC_CONST(0.90916798309052227), FRAC_CONST(0.90984814700267291), FRAC_CONST(0.9105258749775208), FRAC_CONST(0.91120116520058425), FRAC_CONST(0.91187401586390815), FRAC_CONST(0.91254442516606893), FRAC_CONST(0.9132123913121788), FRAC_CONST(0.91387791251389161), FRAC_CONST(0.91454098698940678), FRAC_CONST(0.91520161296347435), FRAC_CONST(0.91585978866739981), FRAC_CONST(0.91651551233904871), FRAC_CONST(0.91716878222285148), FRAC_CONST(0.91781959656980805), FRAC_CONST(0.91846795363749245), FRAC_CONST(0.91911385169005766), FRAC_CONST(0.9197572889982405), FRAC_CONST(0.9203982638393654), FRAC_CONST(0.92103677449734989), FRAC_CONST(0.92167281926270861), FRAC_CONST(0.92230639643255874), FRAC_CONST(0.92293750431062316), FRAC_CONST(0.92356614120723612), FRAC_CONST(0.92419230543934783), FRAC_CONST(0.92481599533052783), FRAC_CONST(0.92543720921097061), FRAC_CONST(0.92605594541749991), FRAC_CONST(0.92667220229357261), FRAC_CONST(0.92728597818928349), FRAC_CONST(0.9278972714613698), FRAC_CONST(0.92850608047321548), FRAC_CONST(0.9291124035948557), FRAC_CONST(0.92971623920298097), FRAC_CONST(0.93031758568094147), FRAC_CONST(0.93091644141875196), FRAC_CONST(0.93151280481309506), FRAC_CONST(0.93210667426732674), FRAC_CONST(0.93269804819147983), FRAC_CONST(0.93328692500226818), FRAC_CONST(0.93387330312309147), FRAC_CONST(0.93445718098403896), FRAC_CONST(0.93503855702189376), FRAC_CONST(0.9356174296801375), FRAC_CONST(0.93619379740895381), FRAC_CONST(0.93676765866523259), FRAC_CONST(0.93733901191257496), FRAC_CONST(0.93790785562129597), FRAC_CONST(0.93847418826842988), FRAC_CONST(0.93903800833773399), FRAC_CONST(0.93959931431969212), FRAC_CONST(0.94015810471151917), FRAC_CONST(0.94071437801716529), FRAC_CONST(0.94126813274731924), FRAC_CONST(0.94181936741941319), FRAC_CONST(0.94236808055762578), FRAC_CONST(0.94291427069288691), FRAC_CONST(0.94345793636288133), FRAC_CONST(0.94399907611205225), FRAC_CONST(0.9445376884916058), FRAC_CONST(0.94507377205951448), FRAC_CONST(0.94560732538052128), FRAC_CONST(0.94613834702614352), FRAC_CONST(0.94666683557467624), FRAC_CONST(0.94719278961119657), FRAC_CONST(0.94771620772756759), FRAC_CONST(0.94823708852244104), FRAC_CONST(0.94875543060126255), FRAC_CONST(0.94927123257627433), FRAC_CONST(0.94978449306651924), FRAC_CONST(0.95029521069784428), FRAC_CONST(0.9508033841029051), FRAC_CONST(0.95130901192116835), FRAC_CONST(0.9518120927989161), FRAC_CONST(0.95231262538924943), FRAC_CONST(0.95281060835209208), FRAC_CONST(0.95330604035419386), FRAC_CONST(0.95379892006913403), FRAC_CONST(0.95428924617732525), FRAC_CONST(0.95477701736601728), FRAC_CONST(0.95526223232929941), FRAC_CONST(0.95574488976810545), FRAC_CONST(0.95622498839021619), FRAC_CONST(0.95670252691026292), FRAC_CONST(0.95717750404973156), FRAC_CONST(0.95764991853696524), FRAC_CONST(0.95811976910716812), FRAC_CONST(0.95858705450240911), FRAC_CONST(0.95905177347162429), FRAC_CONST(0.95951392477062125), FRAC_CONST(0.95997350716208196), FRAC_CONST(0.96043051941556579), FRAC_CONST(0.96088496030751369), FRAC_CONST(0.96133682862125036), FRAC_CONST(0.96178612314698864), FRAC_CONST(0.96223284268183173), FRAC_CONST(0.9626769860297768), FRAC_CONST(0.96311855200171881), FRAC_CONST(0.96355753941545252), FRAC_CONST(0.96399394709567654), FRAC_CONST(0.96442777387399625), FRAC_CONST(0.96485901858892686), FRAC_CONST(0.96528768008589627), FRAC_CONST(0.96571375721724895), FRAC_CONST(0.96613724884224783), FRAC_CONST(0.96655815382707866), FRAC_CONST(0.96697647104485207), FRAC_CONST(0.96739219937560694), FRAC_CONST(0.96780533770631338), FRAC_CONST(0.96821588493087585), FRAC_CONST(0.9686238399501359), FRAC_CONST(0.96902920167187501), FRAC_CONST(0.96943196901081796), FRAC_CONST(0.96983214088863534), FRAC_CONST(0.9702297162339466), FRAC_CONST(0.97062469398232287), FRAC_CONST(0.97101707307629004), FRAC_CONST(0.97140685246533098), FRAC_CONST(0.97179403110588902), FRAC_CONST(0.97217860796137046), FRAC_CONST(0.97256058200214734), FRAC_CONST(0.97293995220556007), FRAC_CONST(0.97331671755592064), FRAC_CONST(0.97369087704451474), FRAC_CONST(0.97406242966960455), FRAC_CONST(0.97443137443643235), FRAC_CONST(0.97479771035722163), FRAC_CONST(0.97516143645118103), FRAC_CONST(0.97552255174450631), FRAC_CONST(0.97588105527038305), FRAC_CONST(0.97623694606898959), FRAC_CONST(0.97659022318749911), FRAC_CONST(0.97694088568008242), FRAC_CONST(0.97728893260791039), FRAC_CONST(0.97763436303915685), FRAC_CONST(0.97797717604900047), FRAC_CONST(0.97831737071962765), FRAC_CONST(0.97865494614023485), FRAC_CONST(0.97898990140703124), FRAC_CONST(0.97932223562324061), FRAC_CONST(0.97965194789910426), FRAC_CONST(0.9799790373518833), FRAC_CONST(0.98030350310586067), FRAC_CONST(0.98062534429234405), FRAC_CONST(0.98094456004966768), FRAC_CONST(0.98126114952319499), FRAC_CONST(0.98157511186532054), FRAC_CONST(0.98188644623547261), FRAC_CONST(0.98219515180011563), FRAC_CONST(0.98250122773275184), FRAC_CONST(0.98280467321392362), FRAC_CONST(0.98310548743121629), FRAC_CONST(0.98340366957925973), FRAC_CONST(0.98369921885973044), FRAC_CONST(0.98399213448135414), FRAC_CONST(0.98428241565990748), FRAC_CONST(0.98457006161822058), FRAC_CONST(0.98485507158617835), FRAC_CONST(0.98513744480072363), FRAC_CONST(0.98541718050585803), FRAC_CONST(0.98569427795264519), FRAC_CONST(0.98596873639921168), FRAC_CONST(0.98624055511074971), FRAC_CONST(0.98650973335951875), FRAC_CONST(0.98677627042484772), FRAC_CONST(0.98704016559313645), FRAC_CONST(0.98730141815785832), FRAC_CONST(0.98756002741956173), FRAC_CONST(0.9878159926858715), FRAC_CONST(0.98806931327149194), FRAC_CONST(0.98831998849820735), FRAC_CONST(0.98856801769488489), FRAC_CONST(0.98881340019747566), FRAC_CONST(0.98905613534901682), FRAC_CONST(0.98929622249963345), FRAC_CONST(0.98953366100653983), FRAC_CONST(0.98976845023404181), FRAC_CONST(0.99000058955353776), FRAC_CONST(0.99023007834352106), FRAC_CONST(0.99045691598958097), FRAC_CONST(0.99068110188440506), FRAC_CONST(0.99090263542778001), FRAC_CONST(0.99112151602659404), FRAC_CONST(0.99133774309483769), FRAC_CONST(0.99155131605360625), FRAC_CONST(0.99176223433110056), FRAC_CONST(0.99197049736262888), FRAC_CONST(0.99217610459060845), FRAC_CONST(0.99237905546456673), FRAC_CONST(0.99257934944114334), FRAC_CONST(0.99277698598409092), FRAC_CONST(0.99297196456427694), FRAC_CONST(0.99316428465968509), FRAC_CONST(0.99335394575541669), FRAC_CONST(0.99354094734369169), FRAC_CONST(0.99372528892385081), FRAC_CONST(0.99390697000235606), FRAC_CONST(0.99408599009279242), FRAC_CONST(0.99426234871586938), FRAC_CONST(0.99443604539942176), FRAC_CONST(0.99460707967841133), FRAC_CONST(0.99477545109492771), FRAC_CONST(0.99494115919819004), FRAC_CONST(0.99510420354454787), FRAC_CONST(0.99526458369748239), FRAC_CONST(0.99542229922760772), FRAC_CONST(0.99557734971267187), FRAC_CONST(0.9957297347375581), FRAC_CONST(0.99587945389428578), FRAC_CONST(0.99602650678201154), FRAC_CONST(0.99617089300703077), FRAC_CONST(0.996312612182778), FRAC_CONST(0.99645166392982831), FRAC_CONST(0.99658804787589839), FRAC_CONST(0.99672176365584741), FRAC_CONST(0.99685281091167788), FRAC_CONST(0.99698118929253687), FRAC_CONST(0.99710689845471678), FRAC_CONST(0.99722993806165661), FRAC_CONST(0.99735030778394196), FRAC_CONST(0.99746800729930707), FRAC_CONST(0.99758303629263489), FRAC_CONST(0.99769539445595812), FRAC_CONST(0.99780508148846014), FRAC_CONST(0.99791209709647588), FRAC_CONST(0.99801644099349218), FRAC_CONST(0.99811811290014918), FRAC_CONST(0.9982171125442405), FRAC_CONST(0.9983134396607144), FRAC_CONST(0.99840709399167404), FRAC_CONST(0.99849807528637868), FRAC_CONST(0.99858638330124405), FRAC_CONST(0.99867201779984294), FRAC_CONST(0.99875497855290607), FRAC_CONST(0.99883526533832245), FRAC_CONST(0.99891287794114036), FRAC_CONST(0.99898781615356746), FRAC_CONST(0.99906007977497147), FRAC_CONST(0.99912966861188113), FRAC_CONST(0.99919658247798593), FRAC_CONST(0.99926082119413751), FRAC_CONST(0.99932238458834954), FRAC_CONST(0.999381272495798), FRAC_CONST(0.99943748475882255), FRAC_CONST(0.9994910212269259), FRAC_CONST(0.99954188175677483), FRAC_CONST(0.99959006621220048), FRAC_CONST(0.99963557446419837), FRAC_CONST(0.99967840639092931), FRAC_CONST(0.99971856187771946), FRAC_CONST(0.99975604081706027), FRAC_CONST(0.99979084310860955), FRAC_CONST(0.99982296865919107), FRAC_CONST(0.99985241738279484), FRAC_CONST(0.99987918920057806), FRAC_CONST(0.99990328404086426), FRAC_CONST(0.9999247018391445), FRAC_CONST(0.99994344253807688), FRAC_CONST(0.99995950608748674), FRAC_CONST(0.99997289244436727), FRAC_CONST(0.99998360157287902), FRAC_CONST(0.9999916334443506), FRAC_CONST(0.99999698803727821), FRAC_CONST(0.99999966533732598) }; #endif ALIGN static const real_t sine_short_128[] = { FRAC_CONST(0.0061358846491544753), FRAC_CONST(0.01840672990580482), FRAC_CONST(0.030674803176636626), FRAC_CONST(0.04293825693494082), FRAC_CONST(0.055195244349689934), FRAC_CONST(0.067443919563664051), FRAC_CONST(0.079682437971430126), FRAC_CONST(0.091908956497132724), FRAC_CONST(0.10412163387205459), FRAC_CONST(0.11631863091190475), FRAC_CONST(0.12849811079379317), FRAC_CONST(0.14065823933284921), FRAC_CONST(0.15279718525844344), FRAC_CONST(0.16491312048996989), FRAC_CONST(0.17700422041214875), FRAC_CONST(0.18906866414980619), FRAC_CONST(0.2011046348420919), FRAC_CONST(0.21311031991609136), FRAC_CONST(0.22508391135979283), FRAC_CONST(0.2370236059943672), FRAC_CONST(0.24892760574572015), FRAC_CONST(0.26079411791527551), FRAC_CONST(0.27262135544994898), FRAC_CONST(0.28440753721127188), FRAC_CONST(0.29615088824362379), FRAC_CONST(0.30784964004153487), FRAC_CONST(0.31950203081601569), FRAC_CONST(0.33110630575987643), FRAC_CONST(0.34266071731199438), FRAC_CONST(0.35416352542049034), FRAC_CONST(0.36561299780477385), FRAC_CONST(0.37700741021641826), FRAC_CONST(0.38834504669882625), FRAC_CONST(0.39962419984564679), FRAC_CONST(0.41084317105790391), FRAC_CONST(0.42200027079979968), FRAC_CONST(0.43309381885315196), FRAC_CONST(0.4441221445704292), FRAC_CONST(0.45508358712634384), FRAC_CONST(0.46597649576796618), FRAC_CONST(0.47679923006332209), FRAC_CONST(0.487550160148436), FRAC_CONST(0.49822766697278187), FRAC_CONST(0.50883014254310699), FRAC_CONST(0.51935599016558964), FRAC_CONST(0.52980362468629461), FRAC_CONST(0.54017147272989285), FRAC_CONST(0.55045797293660481), FRAC_CONST(0.56066157619733603), FRAC_CONST(0.57078074588696726), FRAC_CONST(0.58081395809576453), FRAC_CONST(0.59075970185887416), FRAC_CONST(0.60061647938386897), FRAC_CONST(0.61038280627630948), FRAC_CONST(0.6200572117632891), FRAC_CONST(0.62963823891492698), FRAC_CONST(0.63912444486377573), FRAC_CONST(0.64851440102211244), FRAC_CONST(0.65780669329707864), FRAC_CONST(0.66699992230363747), FRAC_CONST(0.67609270357531592), FRAC_CONST(0.68508366777270036), FRAC_CONST(0.693971460889654), FRAC_CONST(0.7027547444572253), FRAC_CONST(0.71143219574521643), FRAC_CONST(0.72000250796138165), FRAC_CONST(0.7284643904482252), FRAC_CONST(0.73681656887736979), FRAC_CONST(0.74505778544146595), FRAC_CONST(0.75318679904361241), FRAC_CONST(0.76120238548426178), FRAC_CONST(0.76910333764557959), FRAC_CONST(0.77688846567323244), FRAC_CONST(0.78455659715557524), FRAC_CONST(0.79210657730021239), FRAC_CONST(0.79953726910790501), FRAC_CONST(0.80684755354379922), FRAC_CONST(0.8140363297059483), FRAC_CONST(0.82110251499110465), FRAC_CONST(0.8280450452577558), FRAC_CONST(0.83486287498638001), FRAC_CONST(0.84155497743689833), FRAC_CONST(0.84812034480329712), FRAC_CONST(0.85455798836540053), FRAC_CONST(0.86086693863776731), FRAC_CONST(0.86704624551569265), FRAC_CONST(0.87309497841829009), FRAC_CONST(0.87901222642863341), FRAC_CONST(0.88479709843093779), FRAC_CONST(0.89044872324475788), FRAC_CONST(0.89596624975618511), FRAC_CONST(0.90134884704602203), FRAC_CONST(0.90659570451491533), FRAC_CONST(0.91170603200542988), FRAC_CONST(0.9166790599210427), FRAC_CONST(0.9215140393420419), FRAC_CONST(0.92621024213831127), FRAC_CONST(0.93076696107898371), FRAC_CONST(0.9351835099389475), FRAC_CONST(0.93945922360218992), FRAC_CONST(0.94359345816196039), FRAC_CONST(0.94758559101774109), FRAC_CONST(0.95143502096900834), FRAC_CONST(0.95514116830577067), FRAC_CONST(0.9587034748958716), FRAC_CONST(0.96212140426904158), FRAC_CONST(0.9653944416976894), FRAC_CONST(0.96852209427441727), FRAC_CONST(0.97150389098625178), FRAC_CONST(0.97433938278557586), FRAC_CONST(0.97702814265775439), FRAC_CONST(0.97956976568544052), FRAC_CONST(0.98196386910955524), FRAC_CONST(0.98421009238692903), FRAC_CONST(0.98630809724459867), FRAC_CONST(0.98825756773074946), FRAC_CONST(0.99005821026229712), FRAC_CONST(0.99170975366909953), FRAC_CONST(0.9932119492347945), FRAC_CONST(0.99456457073425542), FRAC_CONST(0.99576741446765982), FRAC_CONST(0.99682029929116567), FRAC_CONST(0.99772306664419164), FRAC_CONST(0.99847558057329477), FRAC_CONST(0.99907772775264536), FRAC_CONST(0.99952941750109314), FRAC_CONST(0.9998305817958234), FRAC_CONST(0.99998117528260111) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t sine_short_120[] = { FRAC_CONST(0.0065449379673518581), FRAC_CONST(0.019633692460628301), FRAC_CONST(0.032719082821776137), FRAC_CONST(0.045798866936520771), FRAC_CONST(0.058870803651189033), FRAC_CONST(0.071932653156719387), FRAC_CONST(0.084982177372441667), FRAC_CONST(0.09801714032956059), FRAC_CONST(0.11103530855427769), FRAC_CONST(0.12403445145048532), FRAC_CONST(0.13701234168196802), FRAC_CONST(0.14996675555404498), FRAC_CONST(0.16289547339458874), FRAC_CONST(0.17579627993435451), FRAC_CONST(0.18866696468655525), FRAC_CONST(0.2015053223256171), FRAC_CONST(0.21430915306505074), FRAC_CONST(0.2270762630343732), FRAC_CONST(0.23980446465501654), FRAC_CONST(0.25249157701515795), FRAC_CONST(0.26513542624340797), FRAC_CONST(0.27773384588129219), FRAC_CONST(0.29028467725446233), FRAC_CONST(0.3027857698425746), FRAC_CONST(0.31523498164776964), FRAC_CONST(0.32763017956169349), FRAC_CONST(0.33996923973099424), FRAC_CONST(0.35225004792123354), FRAC_CONST(0.36447049987914965), FRAC_CONST(0.37662850169321077), FRAC_CONST(0.38872197015239557), FRAC_CONST(0.40074883310314097), FRAC_CONST(0.41270702980439467), FRAC_CONST(0.42459451128071307), FRAC_CONST(0.43640924067334208), FRAC_CONST(0.44814919358922256), FRAC_CONST(0.45981235844785984), FRAC_CONST(0.47139673682599764), FRAC_CONST(0.48290034380003727), FRAC_CONST(0.49432120828614462), FRAC_CONST(0.50565737337798455), FRAC_CONST(0.51690689668202761), FRAC_CONST(0.52806785065036799), FRAC_CONST(0.53913832291100017), FRAC_CONST(0.55011641659549337), FRAC_CONST(0.56100025066400983), FRAC_CONST(0.57178796022761225), FRAC_CONST(0.58247769686780215), FRAC_CONST(0.59306762895323706), FRAC_CONST(0.60355594195357143), FRAC_CONST(0.61394083875036642), FRAC_CONST(0.62422053994501758), FRAC_CONST(0.63439328416364549), FRAC_CONST(0.64445732835889735), FRAC_CONST(0.65441094810861034), FRAC_CONST(0.66425243791128175), FRAC_CONST(0.67398011147829784), FRAC_CONST(0.68359230202287125), FRAC_CONST(0.69308736254563585), FRAC_CONST(0.70246366611685174), FRAC_CONST(0.71171960615517138), FRAC_CONST(0.72085359670291882), FRAC_CONST(0.7298640726978356), FRAC_CONST(0.73874949024124625), FRAC_CONST(0.74750832686259672), FRAC_CONST(0.75613908178032285), FRAC_CONST(0.76464027615900032), FRAC_CONST(0.77301045336273699), FRAC_CONST(0.78124817920475853), FRAC_CONST(0.78935204219315003), FRAC_CONST(0.79732065377270711), FRAC_CONST(0.80515264856285829), FRAC_CONST(0.81284668459161513), FRAC_CONST(0.82040144352551359), FRAC_CONST(0.82781563089550203), FRAC_CONST(0.83508797631874299), FRAC_CONST(0.84221723371628654), FRAC_CONST(0.84920218152657889), FRAC_CONST(0.85604162291477137), FRAC_CONST(0.86273438597779184), FRAC_CONST(0.86927932394514362), FRAC_CONST(0.87567531537539967), FRAC_CONST(0.88192126434835494), FRAC_CONST(0.88801610065280734), FRAC_CONST(0.89395877996993212), FRAC_CONST(0.8997482840522214), FRAC_CONST(0.90538362089795521), FRAC_CONST(0.91086382492117568), FRAC_CONST(0.91618795711713596), FRAC_CONST(0.92135510522319242), FRAC_CONST(0.9263643838751181), FRAC_CONST(0.93121493475880346), FRAC_CONST(0.93590592675732565), FRAC_CONST(0.94043655609335486), FRAC_CONST(0.94480604646687805), FRAC_CONST(0.94901364918821385), FRAC_CONST(0.95305864330629697), FRAC_CONST(0.95694033573220882), FRAC_CONST(0.9606580613579353), FRAC_CONST(0.96421118317032928), FRAC_CONST(0.96759909236025976), FRAC_CONST(0.9708212084269281), FRAC_CONST(0.97387697927733363), FRAC_CONST(0.97676588132087239), FRAC_CONST(0.97948741955905139), FRAC_CONST(0.98204112767030394), FRAC_CONST(0.98442656808989171), FRAC_CONST(0.98664333208487898), FRAC_CONST(0.98869103982416728), FRAC_CONST(0.99056934044357725), FRAC_CONST(0.99227791210596705), FRAC_CONST(0.99381646205637808), FRAC_CONST(0.99518472667219682), FRAC_CONST(0.99638247150832537), FRAC_CONST(0.99740949133735191), FRAC_CONST(0.99826561018471593), FRAC_CONST(0.99895068135886012), FRAC_CONST(0.99946458747636568), FRAC_CONST(0.99980724048206482), FRAC_CONST(0.99997858166412923) }; #endif #ifdef LD_DEC ALIGN static const real_t sine_mid_512[] = { FRAC_CONST(0.0015339801862847655), FRAC_CONST(0.0046019261204485705), FRAC_CONST(0.007669828739531097), FRAC_CONST(0.010737659167264491), FRAC_CONST(0.013805388528060391), FRAC_CONST(0.01687298794728171), FRAC_CONST(0.019940428551514441), FRAC_CONST(0.023007681468839369), FRAC_CONST(0.026074717829103901), FRAC_CONST(0.029141508764193722), FRAC_CONST(0.032208025408304586), FRAC_CONST(0.035274238898213947), FRAC_CONST(0.038340120373552694), FRAC_CONST(0.041405640977076739), FRAC_CONST(0.044470771854938668), FRAC_CONST(0.047535484156959303), FRAC_CONST(0.050599749036899282), FRAC_CONST(0.05366353765273052), FRAC_CONST(0.056726821166907748), FRAC_CONST(0.059789570746639868), FRAC_CONST(0.062851757564161406), FRAC_CONST(0.065913352797003805), FRAC_CONST(0.068974327628266746), FRAC_CONST(0.072034653246889332), FRAC_CONST(0.075094300847921305), FRAC_CONST(0.078153241632794232), FRAC_CONST(0.081211446809592441), FRAC_CONST(0.084268887593324071), FRAC_CONST(0.087325535206192059), FRAC_CONST(0.090381360877864983), FRAC_CONST(0.093436335845747787), FRAC_CONST(0.096490431355252593), FRAC_CONST(0.099543618660069319), FRAC_CONST(0.10259586902243628), FRAC_CONST(0.10564715371341062), FRAC_CONST(0.10869744401313872), FRAC_CONST(0.11174671121112659), FRAC_CONST(0.11479492660651008), FRAC_CONST(0.11784206150832498), FRAC_CONST(0.12088808723577708), FRAC_CONST(0.12393297511851216), FRAC_CONST(0.12697669649688587), FRAC_CONST(0.13001922272223335), FRAC_CONST(0.13306052515713906), FRAC_CONST(0.1361005751757062), FRAC_CONST(0.1391393441638262), FRAC_CONST(0.14217680351944803), FRAC_CONST(0.14521292465284746), FRAC_CONST(0.14824767898689603), FRAC_CONST(0.15128103795733022), FRAC_CONST(0.1543129730130201), FRAC_CONST(0.15734345561623825), FRAC_CONST(0.16037245724292828), FRAC_CONST(0.16339994938297323), FRAC_CONST(0.1664259035404641), FRAC_CONST(0.16945029123396796), FRAC_CONST(0.17247308399679595), FRAC_CONST(0.17549425337727143), FRAC_CONST(0.17851377093899751), FRAC_CONST(0.18153160826112497), FRAC_CONST(0.18454773693861962), FRAC_CONST(0.1875621285825296), FRAC_CONST(0.19057475482025274), FRAC_CONST(0.19358558729580361), FRAC_CONST(0.19659459767008022), FRAC_CONST(0.19960175762113097), FRAC_CONST(0.20260703884442113), FRAC_CONST(0.20561041305309924), FRAC_CONST(0.20861185197826349), FRAC_CONST(0.21161132736922755), FRAC_CONST(0.21460881099378676), FRAC_CONST(0.21760427463848364), FRAC_CONST(0.22059769010887351), FRAC_CONST(0.22358902922978999), FRAC_CONST(0.22657826384561), FRAC_CONST(0.22956536582051887), FRAC_CONST(0.23255030703877524), FRAC_CONST(0.23553305940497549), FRAC_CONST(0.23851359484431842), FRAC_CONST(0.24149188530286933), FRAC_CONST(0.24446790274782415), FRAC_CONST(0.24744161916777327), FRAC_CONST(0.25041300657296522), FRAC_CONST(0.25338203699557016), FRAC_CONST(0.25634868248994291), FRAC_CONST(0.25931291513288623), FRAC_CONST(0.26227470702391359), FRAC_CONST(0.26523403028551179), FRAC_CONST(0.26819085706340318), FRAC_CONST(0.27114515952680801), FRAC_CONST(0.27409690986870638), FRAC_CONST(0.2770460803060999), FRAC_CONST(0.27999264308027322), FRAC_CONST(0.28293657045705539), FRAC_CONST(0.28587783472708062), FRAC_CONST(0.28881640820604948), FRAC_CONST(0.29175226323498926), FRAC_CONST(0.29468537218051433), FRAC_CONST(0.2976157074350862), FRAC_CONST(0.30054324141727345), FRAC_CONST(0.30346794657201132), FRAC_CONST(0.30638979537086092), FRAC_CONST(0.30930876031226873), FRAC_CONST(0.31222481392182488), FRAC_CONST(0.31513792875252244), FRAC_CONST(0.31804807738501495), FRAC_CONST(0.32095523242787521), FRAC_CONST(0.32385936651785285), FRAC_CONST(0.32676045232013173), FRAC_CONST(0.32965846252858749), FRAC_CONST(0.33255336986604422), FRAC_CONST(0.3354451470845316), FRAC_CONST(0.33833376696554113), FRAC_CONST(0.34121920232028236), FRAC_CONST(0.34410142598993881), FRAC_CONST(0.34698041084592368), FRAC_CONST(0.34985612979013492), FRAC_CONST(0.35272855575521073), FRAC_CONST(0.35559766170478385), FRAC_CONST(0.35846342063373654), FRAC_CONST(0.36132580556845428), FRAC_CONST(0.36418478956707989), FRAC_CONST(0.36704034571976718), FRAC_CONST(0.3698924471489341), FRAC_CONST(0.37274106700951576), FRAC_CONST(0.37558617848921722), FRAC_CONST(0.37842775480876556), FRAC_CONST(0.38126576922216238), FRAC_CONST(0.38410019501693504), FRAC_CONST(0.38693100551438858), FRAC_CONST(0.38975817406985641), FRAC_CONST(0.39258167407295147), FRAC_CONST(0.39540147894781635), FRAC_CONST(0.39821756215337356), FRAC_CONST(0.40102989718357562), FRAC_CONST(0.40383845756765407), FRAC_CONST(0.40664321687036903), FRAC_CONST(0.40944414869225759), FRAC_CONST(0.41224122666988289), FRAC_CONST(0.41503442447608163), FRAC_CONST(0.41782371582021227), FRAC_CONST(0.42060907444840251), FRAC_CONST(0.42339047414379605), FRAC_CONST(0.42616788872679962), FRAC_CONST(0.42894129205532949), FRAC_CONST(0.43171065802505726), FRAC_CONST(0.43447596056965565), FRAC_CONST(0.43723717366104409), FRAC_CONST(0.43999427130963326), FRAC_CONST(0.44274722756457002), FRAC_CONST(0.44549601651398174), FRAC_CONST(0.44824061228521989), FRAC_CONST(0.45098098904510386), FRAC_CONST(0.45371712100016387), FRAC_CONST(0.45644898239688392), FRAC_CONST(0.45917654752194409), FRAC_CONST(0.46189979070246273), FRAC_CONST(0.46461868630623782), FRAC_CONST(0.46733320874198842), FRAC_CONST(0.47004333245959562), FRAC_CONST(0.47274903195034279), FRAC_CONST(0.47545028174715587), FRAC_CONST(0.47814705642484301), FRAC_CONST(0.48083933060033396), FRAC_CONST(0.48352707893291874), FRAC_CONST(0.48621027612448642), FRAC_CONST(0.48888889691976317), FRAC_CONST(0.4915629161065499), FRAC_CONST(0.49423230851595967), FRAC_CONST(0.49689704902265447), FRAC_CONST(0.49955711254508184), FRAC_CONST(0.50221247404571079), FRAC_CONST(0.50486310853126759), FRAC_CONST(0.50750899105297087), FRAC_CONST(0.51015009670676681), FRAC_CONST(0.51278640063356296), FRAC_CONST(0.51541787801946293), FRAC_CONST(0.51804450409599934), FRAC_CONST(0.52066625414036716), FRAC_CONST(0.52328310347565643), FRAC_CONST(0.52589502747108463), FRAC_CONST(0.52850200154222848), FRAC_CONST(0.531104001151255), FRAC_CONST(0.53370100180715296), FRAC_CONST(0.53629297906596318), FRAC_CONST(0.53887990853100842), FRAC_CONST(0.54146176585312344), FRAC_CONST(0.54403852673088382), FRAC_CONST(0.54661016691083486), FRAC_CONST(0.54917666218771966), FRAC_CONST(0.55173798840470734), FRAC_CONST(0.55429412145362), FRAC_CONST(0.5568450372751601), FRAC_CONST(0.55939071185913614), FRAC_CONST(0.56193112124468947), FRAC_CONST(0.5644662415205195), FRAC_CONST(0.56699604882510868), FRAC_CONST(0.56952051934694714), FRAC_CONST(0.57203962932475705), FRAC_CONST(0.57455335504771576), FRAC_CONST(0.57706167285567944), FRAC_CONST(0.57956455913940563), FRAC_CONST(0.58206199034077544), FRAC_CONST(0.58455394295301533), FRAC_CONST(0.58704039352091797), FRAC_CONST(0.58952131864106394), FRAC_CONST(0.59199669496204099), FRAC_CONST(0.59446649918466443), FRAC_CONST(0.5969307080621965), FRAC_CONST(0.59938929840056454), FRAC_CONST(0.60184224705858003), FRAC_CONST(0.60428953094815596), FRAC_CONST(0.60673112703452448), FRAC_CONST(0.60916701233645321), FRAC_CONST(0.61159716392646191), FRAC_CONST(0.61402155893103838), FRAC_CONST(0.61644017453085365), FRAC_CONST(0.61885298796097632), FRAC_CONST(0.62125997651108755), FRAC_CONST(0.62366111752569453), FRAC_CONST(0.62605638840434352), FRAC_CONST(0.62844576660183271), FRAC_CONST(0.63082922962842447), FRAC_CONST(0.63320675505005719), FRAC_CONST(0.63557832048855611), FRAC_CONST(0.63794390362184406), FRAC_CONST(0.64030348218415167), FRAC_CONST(0.64265703396622686), FRAC_CONST(0.64500453681554393), FRAC_CONST(0.64734596863651206), FRAC_CONST(0.64968130739068319), FRAC_CONST(0.6520105310969595), FRAC_CONST(0.65433361783180044), FRAC_CONST(0.65665054572942894), FRAC_CONST(0.65896129298203732), FRAC_CONST(0.66126583783999227), FRAC_CONST(0.66356415861203977), FRAC_CONST(0.66585623366550972), FRAC_CONST(0.66814204142651845), FRAC_CONST(0.67042156038017309), FRAC_CONST(0.67269476907077286), FRAC_CONST(0.67496164610201193), FRAC_CONST(0.67722217013718033), FRAC_CONST(0.67947631989936497), FRAC_CONST(0.68172407417164971), FRAC_CONST(0.6839654117973154), FRAC_CONST(0.68620031168003859), FRAC_CONST(0.68842875278409044), FRAC_CONST(0.6906507141345346), FRAC_CONST(0.69286617481742463), FRAC_CONST(0.69507511398000088), FRAC_CONST(0.69727751083088652), FRAC_CONST(0.69947334464028377), FRAC_CONST(0.70166259474016845), FRAC_CONST(0.70384524052448494), FRAC_CONST(0.70602126144933974), FRAC_CONST(0.70819063703319529), FRAC_CONST(0.71035334685706231), FRAC_CONST(0.71250937056469232), FRAC_CONST(0.71465868786276898), FRAC_CONST(0.71680127852109954), FRAC_CONST(0.71893712237280438), FRAC_CONST(0.72106619931450811), FRAC_CONST(0.72318848930652735), FRAC_CONST(0.72530397237306066), FRAC_CONST(0.72741262860237577), FRAC_CONST(0.7295144381469969), FRAC_CONST(0.73160938122389252), FRAC_CONST(0.73369743811466026), FRAC_CONST(0.73577858916571348), FRAC_CONST(0.73785281478846598), FRAC_CONST(0.73992009545951609), FRAC_CONST(0.74198041172083096), FRAC_CONST(0.74403374417992918), FRAC_CONST(0.74608007351006378), FRAC_CONST(0.74811938045040349), FRAC_CONST(0.75015164580621496), FRAC_CONST(0.7521768504490427), FRAC_CONST(0.75419497531688917), FRAC_CONST(0.75620600141439454), FRAC_CONST(0.75820990981301528), FRAC_CONST(0.76020668165120242), FRAC_CONST(0.7621962981345789), FRAC_CONST(0.76417874053611667), FRAC_CONST(0.76615399019631281), FRAC_CONST(0.76812202852336531), FRAC_CONST(0.7700828369933479), FRAC_CONST(0.77203639715038441), FRAC_CONST(0.77398269060682279), FRAC_CONST(0.77592169904340758), FRAC_CONST(0.77785340420945304), FRAC_CONST(0.77977778792301444), FRAC_CONST(0.78169483207105939), FRAC_CONST(0.7836045186096382), FRAC_CONST(0.78550682956405393), FRAC_CONST(0.78740174702903132), FRAC_CONST(0.78928925316888565), FRAC_CONST(0.79116933021769009), FRAC_CONST(0.79304196047944364), FRAC_CONST(0.79490712632823701), FRAC_CONST(0.79676481020841872), FRAC_CONST(0.79861499463476082), FRAC_CONST(0.80045766219262271), FRAC_CONST(0.80229279553811572), FRAC_CONST(0.8041203773982657), FRAC_CONST(0.80594039057117628), FRAC_CONST(0.80775281792619036), FRAC_CONST(0.80955764240405126), FRAC_CONST(0.81135484701706373), FRAC_CONST(0.81314441484925359), FRAC_CONST(0.81492632905652662), FRAC_CONST(0.81670057286682785), FRAC_CONST(0.81846712958029866), FRAC_CONST(0.82022598256943469), FRAC_CONST(0.82197711527924155), FRAC_CONST(0.82372051122739132), FRAC_CONST(0.82545615400437744), FRAC_CONST(0.82718402727366902), FRAC_CONST(0.82890411477186487), FRAC_CONST(0.8306164003088462), FRAC_CONST(0.83232086776792968), FRAC_CONST(0.83401750110601813), FRAC_CONST(0.8357062843537526), FRAC_CONST(0.83738720161566194), FRAC_CONST(0.83906023707031263), FRAC_CONST(0.84072537497045807), FRAC_CONST(0.84238259964318596), FRAC_CONST(0.84403189549006641), FRAC_CONST(0.84567324698729907), FRAC_CONST(0.84730663868585832), FRAC_CONST(0.84893205521163961), FRAC_CONST(0.85054948126560337), FRAC_CONST(0.85215890162391983), FRAC_CONST(0.8537603011381113), FRAC_CONST(0.85535366473519603), FRAC_CONST(0.85693897741782865), FRAC_CONST(0.85851622426444274), FRAC_CONST(0.86008539042939014), FRAC_CONST(0.8616464611430813), FRAC_CONST(0.86319942171212416), FRAC_CONST(0.86474425751946238), FRAC_CONST(0.86628095402451299), FRAC_CONST(0.86780949676330321), FRAC_CONST(0.86932987134860673), FRAC_CONST(0.87084206347007886), FRAC_CONST(0.87234605889439154), FRAC_CONST(0.87384184346536675), FRAC_CONST(0.87532940310411078), FRAC_CONST(0.87680872380914576), FRAC_CONST(0.87827979165654146), FRAC_CONST(0.87974259280004741), FRAC_CONST(0.88119711347122198), FRAC_CONST(0.88264333997956279), FRAC_CONST(0.88408125871263499), FRAC_CONST(0.88551085613619995), FRAC_CONST(0.88693211879434208), FRAC_CONST(0.88834503330959624), FRAC_CONST(0.88974958638307289), FRAC_CONST(0.89114576479458318), FRAC_CONST(0.89253355540276469), FRAC_CONST(0.89391294514520325), FRAC_CONST(0.89528392103855758), FRAC_CONST(0.89664647017868015), FRAC_CONST(0.89800057974073988), FRAC_CONST(0.89934623697934146), FRAC_CONST(0.90068342922864686), FRAC_CONST(0.90201214390249307), FRAC_CONST(0.90333236849451182), FRAC_CONST(0.90464409057824624), FRAC_CONST(0.90594729780726846), FRAC_CONST(0.90724197791529593), FRAC_CONST(0.90852811871630612), FRAC_CONST(0.90980570810465222), FRAC_CONST(0.91107473405517625), FRAC_CONST(0.91233518462332275), FRAC_CONST(0.91358704794525081), FRAC_CONST(0.91483031223794609), FRAC_CONST(0.91606496579933161), FRAC_CONST(0.91729099700837791), FRAC_CONST(0.91850839432521225), FRAC_CONST(0.91971714629122736), FRAC_CONST(0.92091724152918952), FRAC_CONST(0.92210866874334507), FRAC_CONST(0.92329141671952764), FRAC_CONST(0.9244654743252626), FRAC_CONST(0.92563083050987272), FRAC_CONST(0.92678747430458175), FRAC_CONST(0.92793539482261789), FRAC_CONST(0.92907458125931575), FRAC_CONST(0.93020502289221907), FRAC_CONST(0.93132670908118043), FRAC_CONST(0.93243962926846236), FRAC_CONST(0.93354377297883617), FRAC_CONST(0.93463912981968078), FRAC_CONST(0.93572568948108037), FRAC_CONST(0.93680344173592156), FRAC_CONST(0.93787237643998989), FRAC_CONST(0.93893248353206449), FRAC_CONST(0.93998375303401394), FRAC_CONST(0.94102617505088926), FRAC_CONST(0.94205973977101731), FRAC_CONST(0.94308443746609349), FRAC_CONST(0.94410025849127266), FRAC_CONST(0.94510719328526061), FRAC_CONST(0.94610523237040334), FRAC_CONST(0.94709436635277722), FRAC_CONST(0.94807458592227623), FRAC_CONST(0.94904588185270056), FRAC_CONST(0.950008245001843), FRAC_CONST(0.95096166631157508), FRAC_CONST(0.95190613680793223), FRAC_CONST(0.95284164760119872), FRAC_CONST(0.95376818988599033), FRAC_CONST(0.95468575494133834), FRAC_CONST(0.95559433413077111), FRAC_CONST(0.95649391890239499), FRAC_CONST(0.95738450078897586), FRAC_CONST(0.95826607140801767), FRAC_CONST(0.95913862246184189), FRAC_CONST(0.96000214573766585), FRAC_CONST(0.96085663310767966), FRAC_CONST(0.96170207652912254), FRAC_CONST(0.96253846804435916), FRAC_CONST(0.96336579978095405), FRAC_CONST(0.96418406395174572), FRAC_CONST(0.96499325285492032), FRAC_CONST(0.96579335887408357), FRAC_CONST(0.96658437447833312), FRAC_CONST(0.96736629222232851), FRAC_CONST(0.96813910474636233), FRAC_CONST(0.96890280477642887), FRAC_CONST(0.96965738512429245), FRAC_CONST(0.9704028386875555), FRAC_CONST(0.97113915844972509), FRAC_CONST(0.9718663374802794), FRAC_CONST(0.97258436893473221), FRAC_CONST(0.97329324605469825), FRAC_CONST(0.97399296216795583), FRAC_CONST(0.97468351068851067), FRAC_CONST(0.97536488511665687), FRAC_CONST(0.97603707903903902), FRAC_CONST(0.97670008612871184), FRAC_CONST(0.97735390014519996), FRAC_CONST(0.97799851493455714), FRAC_CONST(0.9786339244294231), FRAC_CONST(0.97926012264908202), FRAC_CONST(0.97987710369951764), FRAC_CONST(0.98048486177346938), FRAC_CONST(0.98108339115048659), FRAC_CONST(0.98167268619698311), FRAC_CONST(0.98225274136628937), FRAC_CONST(0.98282355119870524), FRAC_CONST(0.98338511032155118), FRAC_CONST(0.98393741344921892), FRAC_CONST(0.98448045538322093), FRAC_CONST(0.98501423101223984), FRAC_CONST(0.98553873531217606), FRAC_CONST(0.98605396334619544), FRAC_CONST(0.98655991026477541), FRAC_CONST(0.98705657130575097), FRAC_CONST(0.98754394179435923), FRAC_CONST(0.98802201714328353), FRAC_CONST(0.98849079285269659), FRAC_CONST(0.98895026451030299), FRAC_CONST(0.98940042779138038), FRAC_CONST(0.98984127845882053), FRAC_CONST(0.99027281236316911), FRAC_CONST(0.99069502544266463), FRAC_CONST(0.99110791372327678), FRAC_CONST(0.9915114733187439), FRAC_CONST(0.99190570043060933), FRAC_CONST(0.99229059134825737), FRAC_CONST(0.99266614244894802), FRAC_CONST(0.99303235019785141), FRAC_CONST(0.99338921114808065), FRAC_CONST(0.9937367219407246), FRAC_CONST(0.99407487930487937), FRAC_CONST(0.9944036800576791), FRAC_CONST(0.9947231211043257), FRAC_CONST(0.99503319943811863), FRAC_CONST(0.99533391214048228), FRAC_CONST(0.99562525638099431), FRAC_CONST(0.99590722941741172), FRAC_CONST(0.99617982859569687), FRAC_CONST(0.99644305135004263), FRAC_CONST(0.99669689520289606), FRAC_CONST(0.99694135776498216), FRAC_CONST(0.99717643673532619), FRAC_CONST(0.9974021299012753), FRAC_CONST(0.99761843513851955), FRAC_CONST(0.99782535041111164), FRAC_CONST(0.99802287377148624), FRAC_CONST(0.99821100336047819), FRAC_CONST(0.99838973740734016), FRAC_CONST(0.99855907422975931), FRAC_CONST(0.99871901223387294), FRAC_CONST(0.99886954991428356), FRAC_CONST(0.99901068585407338), FRAC_CONST(0.99914241872481691), FRAC_CONST(0.99926474728659442), FRAC_CONST(0.99937767038800285), FRAC_CONST(0.99948118696616695), FRAC_CONST(0.99957529604674922), FRAC_CONST(0.99965999674395922), FRAC_CONST(0.99973528826056168), FRAC_CONST(0.99980116988788426), FRAC_CONST(0.99985764100582386), FRAC_CONST(0.9999047010828529), FRAC_CONST(0.99994234967602391), FRAC_CONST(0.99997058643097414), FRAC_CONST(0.9999894110819284), FRAC_CONST(0.99999882345170188) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t sine_mid_480[] = { FRAC_CONST(0.0016362454436240478), FRAC_CONST(0.00490871880799799), FRAC_CONST(0.0081811396039371282), FRAC_CONST(0.011453472786443779), FRAC_CONST(0.014725683311458524), FRAC_CONST(0.017997736136235509), FRAC_CONST(0.021269596219717739), FRAC_CONST(0.024541228522912285), FRAC_CONST(0.027812598009265607), FRAC_CONST(0.03108366964503869), FRAC_CONST(0.034354408399682276), FRAC_CONST(0.037624779246211978), FRAC_CONST(0.04089474716158345), FRAC_CONST(0.044164277127067358), FRAC_CONST(0.047433334128624507), FRAC_CONST(0.050701883157280733), FRAC_CONST(0.053969889209501881), FRAC_CONST(0.057237317287568618), FRAC_CONST(0.060504132399951269), FRAC_CONST(0.063770299561684493), FRAC_CONST(0.06703578379474201), FRAC_CONST(0.070300550128411174), FRAC_CONST(0.073564563599667426), FRAC_CONST(0.076827789253548759), FRAC_CONST(0.080090192143530081), FRAC_CONST(0.083351737331897449), FRAC_CONST(0.086612389890122182), FRAC_CONST(0.089872114899234967), FRAC_CONST(0.093130877450199795), FRAC_CONST(0.096388642644287828), FRAC_CONST(0.09964537559345106), FRAC_CONST(0.1029010414206961), FRAC_CONST(0.10615560526045748), FRAC_CONST(0.10940903225897117), FRAC_CONST(0.11266128757464781), FRAC_CONST(0.11591233637844581), FRAC_CONST(0.11916214385424433), FRAC_CONST(0.1224106751992162), FRAC_CONST(0.12565789562420052), FRAC_CONST(0.12890377035407541), FRAC_CONST(0.13214826462813015), FRAC_CONST(0.13539134370043773), FRAC_CONST(0.13863297284022669), FRAC_CONST(0.14187311733225325), FRAC_CONST(0.14511174247717309), FRAC_CONST(0.14834881359191271), FRAC_CONST(0.15158429601004111), FRAC_CONST(0.15481815508214106), FRAC_CONST(0.1580503561761798), FRAC_CONST(0.16128086467788047), FRAC_CONST(0.16450964599109233), FRAC_CONST(0.16773666553816149), FRAC_CONST(0.17096188876030122), FRAC_CONST(0.17418528111796186), FRAC_CONST(0.17740680809120093), FRAC_CONST(0.18062643518005275), FRAC_CONST(0.18384412790489776), FRAC_CONST(0.18705985180683199), FRAC_CONST(0.19027357244803589), FRAC_CONST(0.19348525541214331), FRAC_CONST(0.19669486630460997), FRAC_CONST(0.19990237075308173), FRAC_CONST(0.20310773440776286), FRAC_CONST(0.20631092294178383), FRAC_CONST(0.20951190205156878), FRAC_CONST(0.21271063745720317), FRAC_CONST(0.21590709490280058), FRAC_CONST(0.2191012401568698), FRAC_CONST(0.22229303901268133), FRAC_CONST(0.22548245728863364), FRAC_CONST(0.22866946082861941), FRAC_CONST(0.23185401550239115), FRAC_CONST(0.23503608720592667), FRAC_CONST(0.23821564186179459), FRAC_CONST(0.24139264541951888), FRAC_CONST(0.24456706385594387), FRAC_CONST(0.24773886317559846), FRAC_CONST(0.25090800941106001), FRAC_CONST(0.25407446862331851), FRAC_CONST(0.25723820690213967), FRAC_CONST(0.26039919036642817), FRAC_CONST(0.26355738516459076), FRAC_CONST(0.26671275747489837), FRAC_CONST(0.2698652735058486), FRAC_CONST(0.27301489949652735), FRAC_CONST(0.27616160171697068), FRAC_CONST(0.27930534646852595), FRAC_CONST(0.28244610008421245), FRAC_CONST(0.2855838289290823), FRAC_CONST(0.28871849940058025), FRAC_CONST(0.29185007792890405), FRAC_CONST(0.29497853097736348), FRAC_CONST(0.2981038250427398), FRAC_CONST(0.30122592665564446), FRAC_CONST(0.30434480238087736), FRAC_CONST(0.30746041881778519), FRAC_CONST(0.31057274260061901), FRAC_CONST(0.31368174039889146), FRAC_CONST(0.31678737891773395), FRAC_CONST(0.31988962489825296), FRAC_CONST(0.32298844511788638), FRAC_CONST(0.32608380639075912), FRAC_CONST(0.32917567556803889), FRAC_CONST(0.33226401953829071), FRAC_CONST(0.33534880522783189), FRAC_CONST(0.33842999960108583), FRAC_CONST(0.34150756966093632), FRAC_CONST(0.34458148244908043), FRAC_CONST(0.34765170504638188), FRAC_CONST(0.35071820457322322), FRAC_CONST(0.35378094818985806), FRAC_CONST(0.35683990309676283), FRAC_CONST(0.35989503653498811), FRAC_CONST(0.36294631578650921), FRAC_CONST(0.36599370817457672), FRAC_CONST(0.36903718106406647), FRAC_CONST(0.37207670186182878), FRAC_CONST(0.37511223801703802), FRAC_CONST(0.37814375702154046), FRAC_CONST(0.38117122641020335), FRAC_CONST(0.38419461376126157), FRAC_CONST(0.38721388669666562), FRAC_CONST(0.39022901288242801), FRAC_CONST(0.39323996002896966), FRAC_CONST(0.39624669589146555), FRAC_CONST(0.39924918827019029), FRAC_CONST(0.40224740501086254), FRAC_CONST(0.40524131400498986), FRAC_CONST(0.40823088319021217), FRAC_CONST(0.41121608055064529), FRAC_CONST(0.41419687411722372), FRAC_CONST(0.41717323196804335), FRAC_CONST(0.42014512222870243), FRAC_CONST(0.42311251307264408), FRAC_CONST(0.42607537272149631), FRAC_CONST(0.4290336694454126), FRAC_CONST(0.43198737156341183), FRAC_CONST(0.43493644744371707), FRAC_CONST(0.43788086550409511), FRAC_CONST(0.44082059421219388), FRAC_CONST(0.44375560208588088), FRAC_CONST(0.44668585769357955), FRAC_CONST(0.4496113296546066), FRAC_CONST(0.45253198663950756), FRAC_CONST(0.45544779737039259), FRAC_CONST(0.45835873062127125), FRAC_CONST(0.46126475521838717), FRAC_CONST(0.46416584004055156), FRAC_CONST(0.46706195401947659), FRAC_CONST(0.46995306614010829), FRAC_CONST(0.47283914544095862), FRAC_CONST(0.47572016101443682), FRAC_CONST(0.47859608200718085), FRAC_CONST(0.4814668776203872), FRAC_CONST(0.48433251711014125), FRAC_CONST(0.4871929697877464), FRAC_CONST(0.49004820502005247), FRAC_CONST(0.49289819222978404), FRAC_CONST(0.49574290089586776), FRAC_CONST(0.49858230055375902), FRAC_CONST(0.50141636079576901), FRAC_CONST(0.50424505127138919), FRAC_CONST(0.50706834168761705), FRAC_CONST(0.50988620180928057), FRAC_CONST(0.51269860145936175), FRAC_CONST(0.51550551051931948), FRAC_CONST(0.51830689892941317), FRAC_CONST(0.5211027366890234), FRAC_CONST(0.52389299385697385), FRAC_CONST(0.52667764055185196), FRAC_CONST(0.52945664695232897), FRAC_CONST(0.53222998329747884), FRAC_CONST(0.53499761988709726), FRAC_CONST(0.53775952708201991), FRAC_CONST(0.54051567530443978), FRAC_CONST(0.54326603503822357), FRAC_CONST(0.54601057682922816), FRAC_CONST(0.54874927128561579), FRAC_CONST(0.55148208907816942), FRAC_CONST(0.55420900094060566), FRAC_CONST(0.55692997766988939), FRAC_CONST(0.559644990126546), FRAC_CONST(0.56235400923497314), FRAC_CONST(0.56505700598375252), FRAC_CONST(0.56775395142596052), FRAC_CONST(0.57044481667947822), FRAC_CONST(0.57312957292730071), FRAC_CONST(0.57580819141784534), FRAC_CONST(0.57848064346525996), FRAC_CONST(0.58114690044973039), FRAC_CONST(0.58380693381778626), FRAC_CONST(0.58646071508260733), FRAC_CONST(0.58910821582432815), FRAC_CONST(0.5917494076903429), FRAC_CONST(0.5943842623956086), FRAC_CONST(0.59701275172294799), FRAC_CONST(0.59963484752335228), FRAC_CONST(0.60225052171628191), FRAC_CONST(0.60485974628996786), FRAC_CONST(0.60746249330171098), FRAC_CONST(0.61005873487818185), FRAC_CONST(0.61264844321571899), FRAC_CONST(0.61523159058062682), FRAC_CONST(0.61780814930947225), FRAC_CONST(0.62037809180938108), FRAC_CONST(0.62294139055833397), FRAC_CONST(0.6254980181054608), FRAC_CONST(0.62804794707133416), FRAC_CONST(0.63059115014826372), FRAC_CONST(0.63312760010058777), FRAC_CONST(0.63565726976496484), FRAC_CONST(0.63818013205066515), FRAC_CONST(0.64069615993986073), FRAC_CONST(0.64320532648791406), FRAC_CONST(0.64570760482366729), FRAC_CONST(0.64820296814972966), FRAC_CONST(0.65069138974276486), FRAC_CONST(0.65317284295377676), FRAC_CONST(0.65564730120839498), FRAC_CONST(0.65811473800715958), FRAC_CONST(0.660575126925805), FRAC_CONST(0.66302844161554231), FRAC_CONST(0.6654746558033422), FRAC_CONST(0.66791374329221598), FRAC_CONST(0.67034567796149647), FRAC_CONST(0.67277043376711676), FRAC_CONST(0.67518798474189046), FRAC_CONST(0.67759830499578866), FRAC_CONST(0.68000136871621808), FRAC_CONST(0.68239715016829683), FRAC_CONST(0.6847856236951303), FRAC_CONST(0.68716676371808583), FRAC_CONST(0.68954054473706683), FRAC_CONST(0.69190694133078579), FRAC_CONST(0.69426592815703603), FRAC_CONST(0.69661747995296419), FRAC_CONST(0.69896157153533944), FRAC_CONST(0.70129817780082437), FRAC_CONST(0.7036272737262429), FRAC_CONST(0.70594883436884903), FRAC_CONST(0.70826283486659336), FRAC_CONST(0.71056925043838959), FRAC_CONST(0.71286805638437978), FRAC_CONST(0.71515922808619936), FRAC_CONST(0.71744274100723993), FRAC_CONST(0.71971857069291278), FRAC_CONST(0.7219866927709101), FRAC_CONST(0.72424708295146689), FRAC_CONST(0.72649971702762028), FRAC_CONST(0.72874457087546896), FRAC_CONST(0.73098162045443171), FRAC_CONST(0.73321084180750484), FRAC_CONST(0.73543221106151868), FRAC_CONST(0.73764570442739286), FRAC_CONST(0.73985129820039208), FRAC_CONST(0.74204896876037885), FRAC_CONST(0.7442386925720671), FRAC_CONST(0.74642044618527381), FRAC_CONST(0.74859420623517081), FRAC_CONST(0.75075994944253421), FRAC_CONST(0.75291765261399446), FRAC_CONST(0.75506729264228367), FRAC_CONST(0.75720884650648446), FRAC_CONST(0.75934229127227548), FRAC_CONST(0.76146760409217706), FRAC_CONST(0.76358476220579641), FRAC_CONST(0.7656937429400712), FRAC_CONST(0.76779452370951196), FRAC_CONST(0.76988708201644451), FRAC_CONST(0.77197139545125026), FRAC_CONST(0.7740474416926072), FRAC_CONST(0.77611519850772781), FRAC_CONST(0.77817464375259782), FRAC_CONST(0.78022575537221317), FRAC_CONST(0.78226851140081632), FRAC_CONST(0.78430288996213138), FRAC_CONST(0.78632886926959822), FRAC_CONST(0.78834642762660623), FRAC_CONST(0.79035554342672631), FRAC_CONST(0.79235619515394229), FRAC_CONST(0.79434836138288134), FRAC_CONST(0.79633202077904397), FRAC_CONST(0.79830715209903147), FRAC_CONST(0.8002737341907743), FRAC_CONST(0.80223174599375802), FRAC_CONST(0.80418116653924954), FRAC_CONST(0.80612197495052085), FRAC_CONST(0.80805415044307316), FRAC_CONST(0.80997767232485907), FRAC_CONST(0.81189251999650469), FRAC_CONST(0.81379867295152986), FRAC_CONST(0.81569611077656778), FRAC_CONST(0.81758481315158371), FRAC_CONST(0.81946475985009259), FRAC_CONST(0.82133593073937561), FRAC_CONST(0.82319830578069586), FRAC_CONST(0.82505186502951278), FRAC_CONST(0.82689658863569615), FRAC_CONST(0.82873245684373809), FRAC_CONST(0.83055944999296494), FRAC_CONST(0.83237754851774781), FRAC_CONST(0.83418673294771239), FRAC_CONST(0.83598698390794668), FRAC_CONST(0.83777828211920935), FRAC_CONST(0.83956060839813562), FRAC_CONST(0.84133394365744296), FRAC_CONST(0.84309826890613537), FRAC_CONST(0.84485356524970701), FRAC_CONST(0.84659981389034411), FRAC_CONST(0.84833699612712676), FRAC_CONST(0.85006509335622882), FRAC_CONST(0.8517840870711173), FRAC_CONST(0.85349395886275037), FRAC_CONST(0.85519469041977514), FRAC_CONST(0.85688626352872277), FRAC_CONST(0.85856866007420429), FRAC_CONST(0.86024186203910447), FRAC_CONST(0.86190585150477417), FRAC_CONST(0.86356061065122347), FRAC_CONST(0.86520612175731115), FRAC_CONST(0.86684236720093533), FRAC_CONST(0.86846932945922151), FRAC_CONST(0.87008699110871135), FRAC_CONST(0.87169533482554817), FRAC_CONST(0.87329434338566281), FRAC_CONST(0.87488399966495822), FRAC_CONST(0.87646428663949283), FRAC_CONST(0.87803518738566277), FRAC_CONST(0.87959668508038291), FRAC_CONST(0.88114876300126743), FRAC_CONST(0.88269140452680916), FRAC_CONST(0.8842245931365561), FRAC_CONST(0.88574831241129048), FRAC_CONST(0.88726254603320276), FRAC_CONST(0.88876727778606746), FRAC_CONST(0.89026249155541637), FRAC_CONST(0.8917481713287112), FRAC_CONST(0.89322430119551532), FRAC_CONST(0.89469086534766362), FRAC_CONST(0.89614784807943237), FRAC_CONST(0.89759523378770689), FRAC_CONST(0.89903300697214927), FRAC_CONST(0.9004611522353636), FRAC_CONST(0.90187965428306172), FRAC_CONST(0.90328849792422594), FRAC_CONST(0.90468766807127299), FRAC_CONST(0.90607714974021469), FRAC_CONST(0.90745692805081868), FRAC_CONST(0.90882698822676755), FRAC_CONST(0.91018731559581767), FRAC_CONST(0.91153789558995579), FRAC_CONST(0.91287871374555518), FRAC_CONST(0.91420975570353069), FRAC_CONST(0.9155310072094921), FRAC_CONST(0.91684245411389753), FRAC_CONST(0.91814408237220391), FRAC_CONST(0.91943587804501858), FRAC_CONST(0.92071782729824769), FRAC_CONST(0.92198991640324446), FRAC_CONST(0.92325213173695675), FRAC_CONST(0.92450445978207241), FRAC_CONST(0.92574688712716402), FRAC_CONST(0.92697940046683291), FRAC_CONST(0.92820198660185149), FRAC_CONST(0.92941463243930444), FRAC_CONST(0.93061732499272909), FRAC_CONST(0.93181005138225426), FRAC_CONST(0.93299279883473885), FRAC_CONST(0.93416555468390772), FRAC_CONST(0.93532830637048769), FRAC_CONST(0.93648104144234268), FRAC_CONST(0.93762374755460598), FRAC_CONST(0.93875641246981323), FRAC_CONST(0.93987902405803303), FRAC_CONST(0.94099157029699743), FRAC_CONST(0.94209403927222979), FRAC_CONST(0.94318641917717327), FRAC_CONST(0.9442686983133165), FRAC_CONST(0.94534086509031956), FRAC_CONST(0.9464029080261378), FRAC_CONST(0.94745481574714419), FRAC_CONST(0.94849657698825252), FRAC_CONST(0.94952818059303667), FRAC_CONST(0.95054961551385087), FRAC_CONST(0.95156087081194762), FRAC_CONST(0.95256193565759528), FRAC_CONST(0.95355279933019343), FRAC_CONST(0.9545334512183884), FRAC_CONST(0.95550388082018611), FRAC_CONST(0.95646407774306541), FRAC_CONST(0.95741403170408834), FRAC_CONST(0.95835373253001133), FRAC_CONST(0.95928317015739362), FRAC_CONST(0.96020233463270466), FRAC_CONST(0.96111121611243155), FRAC_CONST(0.96200980486318388), FRAC_CONST(0.96289809126179782), FRAC_CONST(0.96377606579543984), FRAC_CONST(0.96464371906170809), FRAC_CONST(0.96550104176873297), FRAC_CONST(0.96634802473527726), FRAC_CONST(0.96718465889083372), FRAC_CONST(0.96801093527572268), FRAC_CONST(0.96882684504118799), FRAC_CONST(0.96963237944949143), FRAC_CONST(0.97042752987400682), FRAC_CONST(0.97121228779931179), FRAC_CONST(0.97198664482127939), FRAC_CONST(0.97275059264716823), FRAC_CONST(0.97350412309571066), FRAC_CONST(0.97424722809720088), FRAC_CONST(0.97497989969358168), FRAC_CONST(0.97570213003852857), FRAC_CONST(0.97641391139753486), FRAC_CONST(0.97711523614799412), FRAC_CONST(0.97780609677928154), FRAC_CONST(0.97848648589283505), FRAC_CONST(0.97915639620223371), FRAC_CONST(0.9798158205332762), FRAC_CONST(0.98046475182405801), FRAC_CONST(0.98110318312504607), FRAC_CONST(0.98173110759915416), FRAC_CONST(0.98234851852181571), FRAC_CONST(0.98295540928105563), FRAC_CONST(0.9835517733775615), FRAC_CONST(0.98413760442475307), FRAC_CONST(0.98471289614885038), FRAC_CONST(0.98527764238894122), FRAC_CONST(0.98583183709704714), FRAC_CONST(0.98637547433818806), FRAC_CONST(0.98690854829044583), FRAC_CONST(0.98743105324502667), FRAC_CONST(0.98794298360632238), FRAC_CONST(0.98844433389196995), FRAC_CONST(0.98893509873291074), FRAC_CONST(0.98941527287344755), FRAC_CONST(0.98988485117130098), FRAC_CONST(0.99034382859766479), FRAC_CONST(0.99079220023725967), FRAC_CONST(0.99122996128838525), FRAC_CONST(0.9916571070629725), FRAC_CONST(0.99207363298663342), FRAC_CONST(0.99247953459870997), FRAC_CONST(0.99287480755232194), FRAC_CONST(0.99325944761441354), FRAC_CONST(0.99363345066579889), FRAC_CONST(0.99399681270120555), FRAC_CONST(0.99434952982931812), FRAC_CONST(0.9946915982728195), FRAC_CONST(0.99502301436843166), FRAC_CONST(0.99534377456695422), FRAC_CONST(0.9956538754333033), FRAC_CONST(0.99595331364654771), FRAC_CONST(0.99624208599994479), FRAC_CONST(0.99652018940097464), FRAC_CONST(0.99678762087137318), FRAC_CONST(0.99704437754716424), FRAC_CONST(0.99729045667869021), FRAC_CONST(0.99752585563064111), FRAC_CONST(0.99775057188208349), FRAC_CONST(0.9979646030264866), FRAC_CONST(0.99816794677174903), FRAC_CONST(0.9983606009402225), FRAC_CONST(0.99854256346873571), FRAC_CONST(0.99871383240861611), FRAC_CONST(0.99887440592571108), FRAC_CONST(0.99902428230040718), FRAC_CONST(0.99916345992764877), FRAC_CONST(0.99929193731695531), FRAC_CONST(0.99940971309243731), FRAC_CONST(0.99951678599281069), FRAC_CONST(0.99961315487141078), FRAC_CONST(0.99969881869620425), FRAC_CONST(0.99977377654980037), FRAC_CONST(0.99983802762946083), FRAC_CONST(0.99989157124710804), FRAC_CONST(0.9999344068293331), FRAC_CONST(0.99996653391740109), FRAC_CONST(0.99998795216725689), FRAC_CONST(0.99999866134952808) }; #endif ALIGN static const real_t ld_mid_512[] = { FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0.0061358846491544753), FRAC_CONST(0.01840672990580482), FRAC_CONST(0.030674803176636626), FRAC_CONST(0.04293825693494082), FRAC_CONST(0.055195244349689934), FRAC_CONST(0.067443919563664051), FRAC_CONST(0.079682437971430126), FRAC_CONST(0.091908956497132724), FRAC_CONST(0.10412163387205459), FRAC_CONST(0.11631863091190475), FRAC_CONST(0.12849811079379317), FRAC_CONST(0.14065823933284921), FRAC_CONST(0.15279718525844344), FRAC_CONST(0.16491312048996989), FRAC_CONST(0.17700422041214875), FRAC_CONST(0.18906866414980619), FRAC_CONST(0.2011046348420919), FRAC_CONST(0.21311031991609136), FRAC_CONST(0.22508391135979283), FRAC_CONST(0.2370236059943672), FRAC_CONST(0.24892760574572015), FRAC_CONST(0.26079411791527551), FRAC_CONST(0.27262135544994898), FRAC_CONST(0.28440753721127188), FRAC_CONST(0.29615088824362379), FRAC_CONST(0.30784964004153487), FRAC_CONST(0.31950203081601569), FRAC_CONST(0.33110630575987643), FRAC_CONST(0.34266071731199438), FRAC_CONST(0.35416352542049034), FRAC_CONST(0.36561299780477385), FRAC_CONST(0.37700741021641826), FRAC_CONST(0.38834504669882625), FRAC_CONST(0.39962419984564679), FRAC_CONST(0.41084317105790391), FRAC_CONST(0.42200027079979968), FRAC_CONST(0.43309381885315196), FRAC_CONST(0.4441221445704292), FRAC_CONST(0.45508358712634384), FRAC_CONST(0.46597649576796618), FRAC_CONST(0.47679923006332209), FRAC_CONST(0.487550160148436), FRAC_CONST(0.49822766697278187), FRAC_CONST(0.50883014254310699), FRAC_CONST(0.51935599016558964), FRAC_CONST(0.52980362468629461), FRAC_CONST(0.54017147272989285), FRAC_CONST(0.55045797293660481), FRAC_CONST(0.56066157619733603), FRAC_CONST(0.57078074588696726), FRAC_CONST(0.58081395809576453), FRAC_CONST(0.59075970185887416), FRAC_CONST(0.60061647938386897), FRAC_CONST(0.61038280627630948), FRAC_CONST(0.6200572117632891), FRAC_CONST(0.62963823891492698), FRAC_CONST(0.63912444486377573), FRAC_CONST(0.64851440102211244), FRAC_CONST(0.65780669329707864), FRAC_CONST(0.66699992230363747), FRAC_CONST(0.67609270357531592), FRAC_CONST(0.68508366777270036), FRAC_CONST(0.693971460889654), FRAC_CONST(0.7027547444572253), FRAC_CONST(0.71143219574521643), FRAC_CONST(0.72000250796138165), FRAC_CONST(0.7284643904482252), FRAC_CONST(0.73681656887736979), FRAC_CONST(0.74505778544146595), FRAC_CONST(0.75318679904361241), FRAC_CONST(0.76120238548426178), FRAC_CONST(0.76910333764557959), FRAC_CONST(0.77688846567323244), FRAC_CONST(0.78455659715557524), FRAC_CONST(0.79210657730021239), FRAC_CONST(0.79953726910790501), FRAC_CONST(0.80684755354379922), FRAC_CONST(0.8140363297059483), FRAC_CONST(0.82110251499110465), FRAC_CONST(0.8280450452577558), FRAC_CONST(0.83486287498638001), FRAC_CONST(0.84155497743689833), FRAC_CONST(0.84812034480329712), FRAC_CONST(0.85455798836540053), FRAC_CONST(0.86086693863776731), FRAC_CONST(0.86704624551569265), FRAC_CONST(0.87309497841829009), FRAC_CONST(0.87901222642863341), FRAC_CONST(0.88479709843093779), FRAC_CONST(0.89044872324475788), FRAC_CONST(0.89596624975618511), FRAC_CONST(0.90134884704602203), FRAC_CONST(0.90659570451491533), FRAC_CONST(0.91170603200542988), FRAC_CONST(0.9166790599210427), FRAC_CONST(0.9215140393420419), FRAC_CONST(0.92621024213831127), FRAC_CONST(0.93076696107898371), FRAC_CONST(0.9351835099389475), FRAC_CONST(0.93945922360218992), FRAC_CONST(0.94359345816196039), FRAC_CONST(0.94758559101774109), FRAC_CONST(0.95143502096900834), FRAC_CONST(0.95514116830577067), FRAC_CONST(0.9587034748958716), FRAC_CONST(0.96212140426904158), FRAC_CONST(0.9653944416976894), FRAC_CONST(0.96852209427441727), FRAC_CONST(0.97150389098625178), FRAC_CONST(0.97433938278557586), FRAC_CONST(0.97702814265775439), FRAC_CONST(0.97956976568544052), FRAC_CONST(0.98196386910955524), FRAC_CONST(0.98421009238692903), FRAC_CONST(0.98630809724459867), FRAC_CONST(0.98825756773074946), FRAC_CONST(0.99005821026229712), FRAC_CONST(0.99170975366909953), FRAC_CONST(0.9932119492347945), FRAC_CONST(0.99456457073425542), FRAC_CONST(0.99576741446765982), FRAC_CONST(0.99682029929116567), FRAC_CONST(0.99772306664419164), FRAC_CONST(0.99847558057329477), FRAC_CONST(0.99907772775264536), FRAC_CONST(0.99952941750109314), FRAC_CONST(0.9998305817958234), FRAC_CONST(0.99998117528260111), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }; #ifdef ALLOW_SMALL_FRAMELENGTH ALIGN static const real_t ld_mid_480[] = { FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0), FRAC_CONST(0.0065449379673518581), FRAC_CONST(0.019633692460628301), FRAC_CONST(0.032719082821776137), FRAC_CONST(0.045798866936520771), FRAC_CONST(0.058870803651189033), FRAC_CONST(0.071932653156719387), FRAC_CONST(0.084982177372441667), FRAC_CONST(0.09801714032956059), FRAC_CONST(0.11103530855427769), FRAC_CONST(0.12403445145048532), FRAC_CONST(0.13701234168196802), FRAC_CONST(0.14996675555404498), FRAC_CONST(0.16289547339458874), FRAC_CONST(0.17579627993435451), FRAC_CONST(0.18866696468655525), FRAC_CONST(0.2015053223256171), FRAC_CONST(0.21430915306505074), FRAC_CONST(0.2270762630343732), FRAC_CONST(0.23980446465501654), FRAC_CONST(0.25249157701515795), FRAC_CONST(0.26513542624340797), FRAC_CONST(0.27773384588129219), FRAC_CONST(0.29028467725446233), FRAC_CONST(0.3027857698425746), FRAC_CONST(0.31523498164776964), FRAC_CONST(0.32763017956169349), FRAC_CONST(0.33996923973099424), FRAC_CONST(0.35225004792123354), FRAC_CONST(0.36447049987914965), FRAC_CONST(0.37662850169321077), FRAC_CONST(0.38872197015239557), FRAC_CONST(0.40074883310314097), FRAC_CONST(0.41270702980439467), FRAC_CONST(0.42459451128071307), FRAC_CONST(0.43640924067334208), FRAC_CONST(0.44814919358922256), FRAC_CONST(0.45981235844785984), FRAC_CONST(0.47139673682599764), FRAC_CONST(0.48290034380003727), FRAC_CONST(0.49432120828614462), FRAC_CONST(0.50565737337798455), FRAC_CONST(0.51690689668202761), FRAC_CONST(0.52806785065036799), FRAC_CONST(0.53913832291100017), FRAC_CONST(0.55011641659549337), FRAC_CONST(0.56100025066400983), FRAC_CONST(0.57178796022761225), FRAC_CONST(0.58247769686780215), FRAC_CONST(0.59306762895323706), FRAC_CONST(0.60355594195357143), FRAC_CONST(0.61394083875036642), FRAC_CONST(0.62422053994501758), FRAC_CONST(0.63439328416364549), FRAC_CONST(0.64445732835889735), FRAC_CONST(0.65441094810861034), FRAC_CONST(0.66425243791128175), FRAC_CONST(0.67398011147829784), FRAC_CONST(0.68359230202287125), FRAC_CONST(0.69308736254563585), FRAC_CONST(0.70246366611685174), FRAC_CONST(0.71171960615517138), FRAC_CONST(0.72085359670291882), FRAC_CONST(0.7298640726978356), FRAC_CONST(0.73874949024124625), FRAC_CONST(0.74750832686259672), FRAC_CONST(0.75613908178032285), FRAC_CONST(0.76464027615900032), FRAC_CONST(0.77301045336273699), FRAC_CONST(0.78124817920475853), FRAC_CONST(0.78935204219315003), FRAC_CONST(0.79732065377270711), FRAC_CONST(0.80515264856285829), FRAC_CONST(0.81284668459161513), FRAC_CONST(0.82040144352551359), FRAC_CONST(0.82781563089550203), FRAC_CONST(0.83508797631874299), FRAC_CONST(0.84221723371628654), FRAC_CONST(0.84920218152657889), FRAC_CONST(0.85604162291477137), FRAC_CONST(0.86273438597779184), FRAC_CONST(0.86927932394514362), FRAC_CONST(0.87567531537539967), FRAC_CONST(0.88192126434835494), FRAC_CONST(0.88801610065280734), FRAC_CONST(0.89395877996993212), FRAC_CONST(0.8997482840522214), FRAC_CONST(0.90538362089795521), FRAC_CONST(0.91086382492117568), FRAC_CONST(0.91618795711713596), FRAC_CONST(0.92135510522319242), FRAC_CONST(0.9263643838751181), FRAC_CONST(0.93121493475880346), FRAC_CONST(0.93590592675732565), FRAC_CONST(0.94043655609335486), FRAC_CONST(0.94480604646687805), FRAC_CONST(0.94901364918821385), FRAC_CONST(0.95305864330629697), FRAC_CONST(0.95694033573220882), FRAC_CONST(0.9606580613579353), FRAC_CONST(0.96421118317032928), FRAC_CONST(0.96759909236025976), FRAC_CONST(0.9708212084269281), FRAC_CONST(0.97387697927733363), FRAC_CONST(0.97676588132087239), FRAC_CONST(0.97948741955905139), FRAC_CONST(0.98204112767030394), FRAC_CONST(0.98442656808989171), FRAC_CONST(0.98664333208487898), FRAC_CONST(0.98869103982416728), FRAC_CONST(0.99056934044357725), FRAC_CONST(0.99227791210596705), FRAC_CONST(0.99381646205637808), FRAC_CONST(0.99518472667219682), FRAC_CONST(0.99638247150832537), FRAC_CONST(0.99740949133735191), FRAC_CONST(0.99826561018471593), FRAC_CONST(0.99895068135886012), FRAC_CONST(0.99946458747636568), FRAC_CONST(0.99980724048206482), FRAC_CONST(0.99997858166412923), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1), FRAC_CONST(1) }; #endif #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/specrec.c000066400000000000000000001346721476153623600157560ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: specrec.c,v 1.63 2010/06/04 20:47:56 menno Exp $ **/ /* Spectral reconstruction: - grouping/sectioning - inverse quantization - applying scalefactors */ #include "common.h" #include "structs.h" #include #include "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; if (sf_index >= 12) return 32; 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; uint8_t error = 0; /* Init error flag */ #ifndef FIXED_POINT real_t scf; #else int32_t sat_shift_mask = 0; #endif k = 0; gindex = 0; /* In this case quant_to_spec is no-op and spec_data remains undefined. * Without peeking into AAC specification, there is no strong evidence if * such streams are invalid -> just calm down MSAN. */ if (ics->num_swb == 0) memset(spec_data, 0, frame_len * sizeof(real_t)); 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; uint16_t wa = gindex + j; int16_t scale_factor = ics->scale_factors[g][sfb]; width = ics->swb_offset[sfb+1] - ics->swb_offset[sfb]; #ifdef FIXED_POINT scale_factor -= 100; /* IMDCT pre-scaling */ if (hDecoder->object_type == LD) { scale_factor -= 24 /*9*/; } else { if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) scale_factor -= 16 /*7*/; else scale_factor -= 28 /*10*/; } if (scale_factor > 120) scale_factor = 120; /* => exp <= 30 */ #else (void)hDecoder; #endif /* scale_factor for IS or PNS, has different meaning; fill with almost zeroes */ if (is_intensity(ics, g, sfb) || is_noise(ics, g, sfb)) { scale_factor = 0; } /* scale_factor must be between 0 and 255 */ exp = (scale_factor /* - 100 */) >> 2; /* frac must always be > 0 */ frac = (scale_factor /* - 100 */) & 3; #ifndef FIXED_POINT scf = pow2sf_tab[exp/*+25*/] * pow2_table[frac]; #else if (exp > 0) sat_shift_mask = SAT_SHIFT_MASK(exp); #endif for (win = 0; win < ics->window_group_length[g]; win++) { for (bin = 0; bin < width; bin += 4) { uint16_t wb = wa + bin; #ifndef FIXED_POINT 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); if (exp == -32) { spec_data[wb+0] = 0; spec_data[wb+1] = 0; spec_data[wb+2] = 0; spec_data[wb+3] = 0; } else 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 { /* exp > 0 */ spec_data[wb+0] = SAT_SHIFT(iq0, exp, sat_shift_mask); spec_data[wb+1] = SAT_SHIFT(iq1, exp, sat_shift_mask); spec_data[wb+2] = SAT_SHIFT(iq2, exp, sat_shift_mask); spec_data[wb+3] = SAT_SHIFT(iq3, exp, sat_shift_mask); } 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 { 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 } if (hDecoder->time_out[channel] == NULL) { 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; uint8_t 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! */ /* The simplest way to fix the accounting, * is to reallocate this and all the following channels. */ memset(&hDecoder->element_alloced[hDecoder->fr_ch_ele], 0, sizeof(uint8_t) * (MAX_SYNTAX_ELEMENTS - hDecoder->fr_ch_ele)); hDecoder->element_output_channels[hDecoder->fr_ch_ele] = output_channels; //return 21; } if (hDecoder->element_alloced[hDecoder->fr_ch_ele] == 0) { retval = allocate_single_channel(hDecoder, sce->channel, output_channels); if (retval > 0) return retval; hDecoder->element_alloced[hDecoder->fr_ch_ele] = 1; } /* sanity check, CVE-2018-20199, CVE-2018-20360 */ if(!hDecoder->time_out[sce->channel]) return 15; if(output_channels > 1 && !hDecoder->time_out[sce->channel+1]) return 15; if(!hDecoder->fb_intermed[sce->channel]) return 15; /* dequantisation and scaling */ retval = quant_to_spec(hDecoder, ics, spec_data, spec_coef, hDecoder->frameLength); if (retval > 0) return retval; #ifdef PROFILE count = faad_get_ts() - count; hDecoder->requant_cycles += count; #endif /* pns decoding */ pns_decode(ics, NULL, spec_coef, NULL, hDecoder->frameLength, 0, hDecoder->object_type, &(hDecoder->__r1), &(hDecoder->__r2)); #ifdef MAIN_DEC /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { if (!hDecoder->pred_stat[sce->channel]) return 33; /* intra channel prediction */ ic_prediction(ics, spec_coef, hDecoder->pred_stat[sce->channel], hDecoder->frameLength, hDecoder->sf_index); /* In addition, for scalefactor bands coded by perceptual noise substitution the predictors belonging to the corresponding spectral coefficients are reset. */ pns_reset_pred_state(ics, hDecoder->pred_stat[sce->channel]); } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { #ifdef LD_DEC if (hDecoder->object_type == LD) { if (ics->ltp.data_present) { if (ics->ltp.lag_update) hDecoder->ltp_lag[sce->channel] = ics->ltp.lag; } ics->ltp.lag = hDecoder->ltp_lag[sce->channel]; } #endif /* long term prediction */ lt_prediction(ics, &(ics->ltp), spec_coef, hDecoder->lt_pred_stat[sce->channel], hDecoder->fb, ics->window_shape, hDecoder->window_shape_prev[sce->channel], hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); } #endif /* tns decoding */ tns_decode_frame(ics, &(ics->tns), hDecoder->sf_index, hDecoder->object_type, spec_coef, hDecoder->frameLength); /* drc decoding */ #ifdef APPLY_DRC if (hDecoder->drc->present) { if (!hDecoder->drc->exclude_mask[sce->channel] || !hDecoder->drc->excluded_chns_present) drc_decode(hDecoder->drc, spec_coef); } #endif /* filter bank */ #ifdef SSR_DEC if (hDecoder->object_type != SSR) { #endif ifilter_bank(hDecoder->fb, ics->window_sequence, ics->window_shape, hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], hDecoder->object_type, hDecoder->frameLength); #ifdef SSR_DEC } else { ssr_decode(&(ics->ssr), hDecoder->fb, ics->window_sequence, ics->window_shape, hDecoder->window_shape_prev[sce->channel], spec_coef, hDecoder->time_out[sce->channel], hDecoder->ssr_overlap[sce->channel], hDecoder->ipqf_buffer[sce->channel], hDecoder->prev_fmd[sce->channel], hDecoder->frameLength); } #endif /* save window shape for next frame */ hDecoder->window_shape_prev[sce->channel] = ics->window_shape; #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { lt_update_state(hDecoder->lt_pred_stat[sce->channel], hDecoder->time_out[sce->channel], hDecoder->fb_intermed[sce->channel], hDecoder->frameLength, hDecoder->object_type); } #endif #ifdef SBR_DEC if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { int ele = hDecoder->fr_ch_ele; int ch = sce->channel; /* following case can happen when forceUpSampling == 1 */ if (hDecoder->sbr[ele] == NULL) { hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), hDecoder->downSampledSBR #ifdef DRM , 0 #endif ); } if (!hDecoder->sbr[ele]) return 19; if (sce->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) hDecoder->sbr[ele]->maxAACLine = 8*min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); else hDecoder->sbr[ele]->maxAACLine = min(sce->ics1.swb_offset[max(sce->ics1.max_sfb-1, 0)], sce->ics1.swb_offset_max); /* check if any of the PS tools is used */ #if (defined(PS_DEC) || defined(DRM_PS)) if (hDecoder->ps_used[ele] == 0) { #endif retval = sbrDecodeSingleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch], hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); #if (defined(PS_DEC) || defined(DRM_PS)) } else { retval = sbrDecodeSingleFramePS(hDecoder->sbr[ele], hDecoder->time_out[ch], hDecoder->time_out[ch+1], hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); } #endif if (retval > 0) return retval; } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { return 23; } #endif /* copy L to R when no PS is used */ #if (defined(PS_DEC) || defined(DRM_PS)) if ((hDecoder->ps_used[hDecoder->fr_ch_ele] == 0) && (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2)) { int ele = hDecoder->fr_ch_ele; int ch = sce->channel; int frame_size = (hDecoder->sbr_alloced[ele]) ? 2 : 1; frame_size *= hDecoder->frameLength*sizeof(real_t); memcpy(hDecoder->time_out[ch+1], hDecoder->time_out[ch], frame_size); } #endif return 0; } uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, element *cpe, int16_t *spec_data1, int16_t *spec_data2) { uint8_t retval; ALIGN real_t spec_coef1[1024]; ALIGN real_t spec_coef2[1024]; #ifdef PROFILE int64_t count = faad_get_ts(); #endif if (hDecoder->element_alloced[hDecoder->fr_ch_ele] != 2) { retval = allocate_channel_pair(hDecoder, cpe->channel, (uint8_t)cpe->paired_channel); if (retval > 0) return retval; hDecoder->element_alloced[hDecoder->fr_ch_ele] = 2; } /* sanity check, CVE-2018-20199, CVE-2018-20360 */ if(!hDecoder->time_out[cpe->channel] || !hDecoder->time_out[cpe->paired_channel]) return 15; if(!hDecoder->fb_intermed[cpe->channel] || !hDecoder->fb_intermed[cpe->paired_channel]) return 15; /* dequantisation and scaling */ retval = quant_to_spec(hDecoder, ics1, spec_data1, spec_coef1, hDecoder->frameLength); if (retval > 0) return retval; retval = quant_to_spec(hDecoder, ics2, spec_data2, spec_coef2, hDecoder->frameLength); if (retval > 0) return retval; #ifdef PROFILE count = faad_get_ts() - count; hDecoder->requant_cycles += count; #endif /* pns decoding */ if (ics1->ms_mask_present) { pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 1, hDecoder->object_type, &(hDecoder->__r1), &(hDecoder->__r2)); } else { pns_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength, 0, hDecoder->object_type, &(hDecoder->__r1), &(hDecoder->__r2)); } /* mid/side decoding */ ms_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); #if 0 { int i; for (i = 0; i < 1024; i++) { //printf("%d\n", spec_coef1[i]); printf("0x%.8X\n", spec_coef1[i]); } for (i = 0; i < 1024; i++) { //printf("%d\n", spec_coef2[i]); printf("0x%.8X\n", spec_coef2[i]); } } #endif /* intensity stereo decoding */ is_decode(ics1, ics2, spec_coef1, spec_coef2, hDecoder->frameLength); #if 0 { int i; for (i = 0; i < 1024; i++) { printf("%d\n", spec_coef1[i]); //printf("0x%.8X\n", spec_coef1[i]); } for (i = 0; i < 1024; i++) { printf("%d\n", spec_coef2[i]); //printf("0x%.8X\n", spec_coef2[i]); } } #endif #ifdef MAIN_DEC /* MAIN object type prediction */ if (hDecoder->object_type == MAIN) { /* intra channel prediction */ ic_prediction(ics1, spec_coef1, hDecoder->pred_stat[cpe->channel], hDecoder->frameLength, hDecoder->sf_index); ic_prediction(ics2, spec_coef2, hDecoder->pred_stat[cpe->paired_channel], hDecoder->frameLength, hDecoder->sf_index); /* In addition, for scalefactor bands coded by perceptual noise substitution the predictors belonging to the corresponding spectral coefficients are reset. */ pns_reset_pred_state(ics1, hDecoder->pred_stat[cpe->channel]); pns_reset_pred_state(ics2, hDecoder->pred_stat[cpe->paired_channel]); } #endif #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { ltp_info *ltp1 = &(ics1->ltp); ltp_info *ltp2 = (cpe->common_window) ? &(ics2->ltp2) : &(ics2->ltp); #ifdef LD_DEC if (hDecoder->object_type == LD) { if (ltp1->data_present) { if (ltp1->lag_update) hDecoder->ltp_lag[cpe->channel] = ltp1->lag; } ltp1->lag = hDecoder->ltp_lag[cpe->channel]; if (ltp2->data_present) { if (ltp2->lag_update) hDecoder->ltp_lag[cpe->paired_channel] = ltp2->lag; } ltp2->lag = hDecoder->ltp_lag[cpe->paired_channel]; } #endif /* long term prediction */ lt_prediction(ics1, ltp1, spec_coef1, hDecoder->lt_pred_stat[cpe->channel], hDecoder->fb, ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); lt_prediction(ics2, ltp2, spec_coef2, hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->fb, ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], hDecoder->sf_index, hDecoder->object_type, hDecoder->frameLength); } #endif /* tns decoding */ tns_decode_frame(ics1, &(ics1->tns), hDecoder->sf_index, hDecoder->object_type, spec_coef1, hDecoder->frameLength); tns_decode_frame(ics2, &(ics2->tns), hDecoder->sf_index, hDecoder->object_type, spec_coef2, hDecoder->frameLength); /* drc decoding */ #if APPLY_DRC 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); } #endif /* filter bank */ #ifdef SSR_DEC if (hDecoder->object_type != SSR) { #endif ifilter_bank(hDecoder->fb, ics1->window_sequence, ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], hDecoder->object_type, hDecoder->frameLength); ifilter_bank(hDecoder->fb, ics2->window_sequence, ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], hDecoder->object_type, hDecoder->frameLength); #ifdef SSR_DEC } else { ssr_decode(&(ics1->ssr), hDecoder->fb, ics1->window_sequence, ics1->window_shape, hDecoder->window_shape_prev[cpe->channel], spec_coef1, hDecoder->time_out[cpe->channel], hDecoder->ssr_overlap[cpe->channel], hDecoder->ipqf_buffer[cpe->channel], hDecoder->prev_fmd[cpe->channel], hDecoder->frameLength); ssr_decode(&(ics2->ssr), hDecoder->fb, ics2->window_sequence, ics2->window_shape, hDecoder->window_shape_prev[cpe->paired_channel], spec_coef2, hDecoder->time_out[cpe->paired_channel], hDecoder->ssr_overlap[cpe->paired_channel], hDecoder->ipqf_buffer[cpe->paired_channel], hDecoder->prev_fmd[cpe->paired_channel], hDecoder->frameLength); } #endif /* save window shape for next frame */ hDecoder->window_shape_prev[cpe->channel] = ics1->window_shape; hDecoder->window_shape_prev[cpe->paired_channel] = ics2->window_shape; #ifdef LTP_DEC if (is_ltp_ot(hDecoder->object_type)) { lt_update_state(hDecoder->lt_pred_stat[cpe->channel], hDecoder->time_out[cpe->channel], hDecoder->fb_intermed[cpe->channel], hDecoder->frameLength, hDecoder->object_type); lt_update_state(hDecoder->lt_pred_stat[cpe->paired_channel], hDecoder->time_out[cpe->paired_channel], hDecoder->fb_intermed[cpe->paired_channel], hDecoder->frameLength, hDecoder->object_type); } #endif #ifdef SBR_DEC if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { int ele = hDecoder->fr_ch_ele; int ch0 = cpe->channel; int ch1 = cpe->paired_channel; /* following case can happen when forceUpSampling == 1 */ if (hDecoder->sbr[ele] == NULL) { hDecoder->sbr[ele] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[ele], 2*get_sample_rate(hDecoder->sf_index), hDecoder->downSampledSBR #ifdef DRM , 0 #endif ); } if (!hDecoder->sbr[ele]) return 19; if (cpe->ics1.window_sequence == EIGHT_SHORT_SEQUENCE) hDecoder->sbr[ele]->maxAACLine = 8*min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); else hDecoder->sbr[ele]->maxAACLine = min(cpe->ics1.swb_offset[max(cpe->ics1.max_sfb-1, 0)], cpe->ics1.swb_offset_max); retval = sbrDecodeCoupleFrame(hDecoder->sbr[ele], hDecoder->time_out[ch0], hDecoder->time_out[ch1], hDecoder->postSeekResetFlag, hDecoder->downSampledSBR); if (retval > 0) return retval; } else if (((hDecoder->sbr_present_flag == 1) || (hDecoder->forceUpSampling == 1)) && !hDecoder->sbr_alloced[hDecoder->fr_ch_ele]) { return 23; } #endif return 0; } faad2-2.11.2/libfaad/specrec.h000066400000000000000000000034601476153623600157510ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: specrec.h,v 1.33 2009/01/26 23:51:15 menno Exp $ **/ #ifndef __SPECREC_H__ #define __SPECREC_H__ #ifdef __cplusplus extern "C" { #endif #include "syntax.h" uint8_t window_grouping_info(NeAACDecStruct *hDecoder, ic_stream *ics); uint8_t reconstruct_channel_pair(NeAACDecStruct *hDecoder, ic_stream *ics1, ic_stream *ics2, element *cpe, int16_t *spec_data1, int16_t *spec_data2); uint8_t reconstruct_single_channel(NeAACDecStruct *hDecoder, ic_stream *ics, element *sce, int16_t *spec_data); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ssr.c000066400000000000000000000134421476153623600151300ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr.c,v 1.19 2007/11/01 12:33:36 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SSR_DEC #include "syntax.h" #include "filtbank.h" #include "ssr.h" #include "ssr_fb.h" void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, real_t ipqf_buffer[SSR_BANDS][96/4], real_t *prev_fmd, uint16_t frame_len) { uint8_t band; uint16_t ssr_frame_len = frame_len/SSR_BANDS; real_t time_tmp[2048] = {0}; real_t output[1024] = {0}; for (band = 0; band < SSR_BANDS; band++) { int16_t j; /* uneven bands have inverted frequency scale */ if (band == 1 || band == 3) { for (j = 0; j < ssr_frame_len/2; j++) { real_t tmp; tmp = freq_in[j + ssr_frame_len*band]; freq_in[j + ssr_frame_len*band] = freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band]; freq_in[ssr_frame_len - j - 1 + ssr_frame_len*band] = tmp; } } /* non-overlapping inverse filterbank for SSR */ ssr_ifilter_bank(fb, window_sequence, window_shape, window_shape_prev, freq_in + band*ssr_frame_len, time_tmp + band*ssr_frame_len, ssr_frame_len); /* gain control */ ssr_gain_control(ssr, time_tmp, output, overlap, prev_fmd, band, window_sequence, ssr_frame_len); } /* inverse pqf to bring subbands together again */ ssr_ipqf(ssr, output, time_out, ipqf_buffer, frame_len, SSR_BANDS); } static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, real_t *overlap, real_t *prev_fmd, uint8_t band, uint8_t window_sequence, uint16_t frame_len) { uint16_t i; real_t gc_function[2*1024/SSR_BANDS]; if (window_sequence != EIGHT_SHORT_SEQUENCE) { ssr_gc_function(ssr, &prev_fmd[band * frame_len*2], gc_function, window_sequence, band, frame_len); for (i = 0; i < frame_len*2; i++) data[band * frame_len*2 + i] *= gc_function[i]; for (i = 0; i < frame_len; i++) { output[band*frame_len + i] = overlap[band*frame_len + i] + data[band*frame_len*2 + i]; } for (i = 0; i < frame_len; i++) { overlap[band*frame_len + i] = data[band*frame_len*2 + frame_len + i]; } } else { uint8_t w; for (w = 0; w < 8; w++) { uint16_t frame_len8 = frame_len/8; uint16_t frame_len16 = frame_len/16; ssr_gc_function(ssr, &prev_fmd[band*frame_len*2 + w*frame_len*2/8], gc_function, window_sequence, frame_len); for (i = 0; i < frame_len8*2; i++) data[band*frame_len*2 + w*frame_len8*2+i] *= gc_function[i]; for (i = 0; i < frame_len8; i++) { overlap[band*frame_len + i + 7*frame_len16 + w*frame_len8] += data[band*frame_len*2 + 2*w*frame_len8 + i]; } for (i = 0; i < frame_len8; i++) { overlap[band*frame_len + i + 7*frame_len16 + (w+1)*frame_len8] = data[band*frame_len*2 + 2*w*frame_len8 + frame_len8 + i]; } } for (i = 0; i < frame_len; i++) output[band*frame_len + i] = overlap[band*frame_len + i]; for (i = 0; i < frame_len; i++) overlap[band*frame_len + i] = overlap[band*frame_len + i + frame_len]; } } static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, real_t *gc_function, uint8_t window_sequence, uint8_t band, uint16_t frame_len) { uint16_t i; uint16_t len_area1, len_area2; int32_t aloc[10]; real_t alev[10]; switch (window_sequence) { case ONLY_LONG_SEQUENCE: len_area1 = frame_len/SSR_BANDS; len_area2 = 0; break; case LONG_START_SEQUENCE: len_area1 = (frame_len/SSR_BANDS)*7/32; len_area2 = (frame_len/SSR_BANDS)/16; break; case EIGHT_SHORT_SEQUENCE: len_area1 = (frame_len/8)/SSR_BANDS; len_area2 = 0; break; case LONG_STOP_SEQUENCE: len_area1 = (frame_len/SSR_BANDS); len_area2 = 0; break; } /* decode bitstream information */ /* build array M */ for (i = 0; i < frame_len*2; i++) gc_function[i] = 1; } #endif faad2-2.11.2/libfaad/ssr.h000066400000000000000000000041741476153623600151370ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr.h,v 1.19 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SSR_H__ #define __SSR_H__ #ifdef __cplusplus extern "C" { #endif #define SSR_BANDS 4 #define PQFTAPS 96 void ssr_decode(ssr_info *ssr, fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, real_t *overlap, real_t ipqf_buffer[SSR_BANDS][96/4], real_t *prev_fmd, uint16_t frame_len); static void ssr_gain_control(ssr_info *ssr, real_t *data, real_t *output, real_t *overlap, real_t *prev_fmd, uint8_t band, uint8_t window_sequence, uint16_t frame_len); static void ssr_gc_function(ssr_info *ssr, real_t *prev_fmd, real_t *gc_function, uint8_t window_sequence, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ssr_fb.c000066400000000000000000000152351476153623600156010ustar00rootroot00000000000000/* ** 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 "syntax.h" #include "filtbank.h" #include "mdct.h" #include "ssr_fb.h" #include "ssr_win.h" fb_info *ssr_filter_bank_init(uint16_t frame_len) { uint16_t nshort = frame_len/8; fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); memset(fb, 0, sizeof(fb_info)); /* normal */ fb->mdct256 = faad_mdct_init(2*nshort); fb->mdct2048 = faad_mdct_init(2*frame_len); fb->long_window[0] = sine_long_256; fb->short_window[0] = sine_short_32; fb->long_window[1] = kbd_long_256; fb->short_window[1] = kbd_short_32; return fb; } void ssr_filter_bank_end(fb_info *fb) { faad_mdct_end(fb->mdct256); faad_mdct_end(fb->mdct2048); if (fb) faad_free(fb); } static INLINE void imdct_ssr(fb_info *fb, real_t *in_data, real_t *out_data, uint16_t len) { mdct_info *mdct; switch (len) { case 512: mdct = fb->mdct2048; break; case 64: mdct = fb->mdct256; break; } faad_imdct(mdct, in_data, out_data); } /* NON-overlapping inverse filterbank for use with SSR */ void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, uint16_t frame_len) { int16_t i; real_t *transf_buf; real_t *window_long; real_t *window_long_prev; real_t *window_short; real_t *window_short_prev; uint16_t nlong = frame_len; uint16_t nshort = frame_len/8; uint16_t trans = nshort/2; uint16_t nflat_ls = (nlong-nshort)/2; transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t)); window_long = fb->long_window[window_shape]; window_long_prev = fb->long_window[window_shape_prev]; window_short = fb->short_window[window_shape]; window_short_prev = fb->short_window[window_shape_prev]; switch (window_sequence) { case ONLY_LONG_SEQUENCE: imdct_ssr(fb, freq_in, transf_buf, 2*nlong); for (i = nlong-1; i >= 0; i--) { time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); } break; case LONG_START_SEQUENCE: imdct_ssr(fb, freq_in, transf_buf, 2*nlong); for (i = 0; i < nlong; i++) time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); for (i = 0; i < nflat_ls; i++) time_out[nlong+i] = transf_buf[nlong+i]; for (i = 0; i < nshort; i++) time_out[nlong+nflat_ls+i] = MUL_R_C(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); for (i = 0; i < nflat_ls; i++) time_out[nlong+nflat_ls+nshort+i] = 0; break; case EIGHT_SHORT_SEQUENCE: imdct_ssr(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort); imdct_ssr(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort); imdct_ssr(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort); imdct_ssr(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort); imdct_ssr(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort); imdct_ssr(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort); imdct_ssr(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort); imdct_ssr(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort); for(i = nshort-1; i >= 0; i--) { time_out[i+0*nshort] = MUL_R_C(transf_buf[nshort*0+i],window_short_prev[i]); time_out[i+1*nshort] = MUL_R_C(transf_buf[nshort*1+i],window_short[i]); time_out[i+2*nshort] = MUL_R_C(transf_buf[nshort*2+i],window_short_prev[i]); time_out[i+3*nshort] = MUL_R_C(transf_buf[nshort*3+i],window_short[i]); time_out[i+4*nshort] = MUL_R_C(transf_buf[nshort*4+i],window_short_prev[i]); time_out[i+5*nshort] = MUL_R_C(transf_buf[nshort*5+i],window_short[i]); time_out[i+6*nshort] = MUL_R_C(transf_buf[nshort*6+i],window_short_prev[i]); time_out[i+7*nshort] = MUL_R_C(transf_buf[nshort*7+i],window_short[i]); time_out[i+8*nshort] = MUL_R_C(transf_buf[nshort*8+i],window_short_prev[i]); time_out[i+9*nshort] = MUL_R_C(transf_buf[nshort*9+i],window_short[i]); time_out[i+10*nshort] = MUL_R_C(transf_buf[nshort*10+i],window_short_prev[i]); time_out[i+11*nshort] = MUL_R_C(transf_buf[nshort*11+i],window_short[i]); time_out[i+12*nshort] = MUL_R_C(transf_buf[nshort*12+i],window_short_prev[i]); time_out[i+13*nshort] = MUL_R_C(transf_buf[nshort*13+i],window_short[i]); time_out[i+14*nshort] = MUL_R_C(transf_buf[nshort*14+i],window_short_prev[i]); time_out[i+15*nshort] = MUL_R_C(transf_buf[nshort*15+i],window_short[i]); } break; case LONG_STOP_SEQUENCE: imdct_ssr(fb, freq_in, transf_buf, 2*nlong); for (i = 0; i < nflat_ls; i++) time_out[i] = 0; for (i = 0; i < nshort; i++) time_out[nflat_ls+i] = MUL_R_C(transf_buf[nflat_ls+i],window_short_prev[i]); for (i = 0; i < nflat_ls; i++) time_out[nflat_ls+nshort+i] = transf_buf[nflat_ls+nshort+i]; for (i = 0; i < nlong; i++) time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); break; } faad_free(transf_buf); } #endif faad2-2.11.2/libfaad/ssr_fb.h000066400000000000000000000035061476153623600156040ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_fb.h,v 1.16 2007/11/01 12:33:36 menno Exp $ **/ #ifndef __SSR_FB_H__ #define __SSR_FB_H__ #ifdef __cplusplus extern "C" { #endif fb_info *ssr_filter_bank_init(uint16_t frame_len); void ssr_filter_bank_end(fb_info *fb); /*non overlapping inverse filterbank */ void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, uint8_t window_shape_prev, real_t *freq_in, real_t *time_out, uint16_t frame_len); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ssr_ipqf.c000066400000000000000000000140751476153623600161520ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_ipqf.c,v 1.18 2007/11/01 12:33:39 menno Exp $ **/ #include "common.h" #include "structs.h" #ifdef SSR_DEC #include "ssr.h" #include "ssr_ipqf.h" static real_t **app_pqfbuf; static real_t **pp_q0, **pp_t0, **pp_t1; void gc_set_protopqf(real_t *p_proto) { int j; static real_t a_half[48] = { 1.2206911375946939E-05, 1.7261986723798209E-05, 1.2300093657077942E-05, -1.0833943097791965E-05, -5.7772498639901686E-05, -1.2764767618947719E-04, -2.0965186675013334E-04, -2.8166673689263850E-04, -3.1234860429017460E-04, -2.6738519958452353E-04, -1.1949424681824722E-04, 1.3965139412648678E-04, 4.8864136409185725E-04, 8.7044629275148344E-04, 1.1949430269934793E-03, 1.3519708175026700E-03, 1.2346314373964412E-03, 7.6953209114159191E-04, -5.2242432579537141E-05, -1.1516092887213454E-03, -2.3538469841711277E-03, -3.4033123072127277E-03, -4.0028551071986133E-03, -3.8745415659693259E-03, -2.8321073426874310E-03, -8.5038892323704195E-04, 1.8856751185350931E-03, 4.9688741735340923E-03, 7.8056704536795926E-03, 9.7027909685901654E-03, 9.9960423120166159E-03, 8.2019366335594487E-03, 4.1642072876103365E-03, -1.8364453822737758E-03, -9.0384863094167686E-03, -1.6241528177129844E-02, -2.1939551286300665E-02, -2.4533179947088161E-02, -2.2591663337768787E-02, -1.5122066420044672E-02, -1.7971713448186293E-03, 1.6903413428575379E-02, 3.9672315874127042E-02, 6.4487527248102796E-02, 8.8850025474701726E-02, 0.1101132906105560 , 0.1258540205143761 , 0.1342239368467012 }; for (j = 0; j < 48; ++j) { p_proto[j] = p_proto[95-j] = a_half[j]; } } void gc_setcoef_eff_pqfsyn(int mm, int kk, real_t *p_proto, real_t ***ppp_q0, real_t ***ppp_t0, real_t ***ppp_t1) { int i, k, n; real_t w; /* Set 1st Mul&Acc Coef's */ *ppp_q0 = (real_t **) calloc(mm, sizeof(real_t *)); for (n = 0; n < mm; ++n) { (*ppp_q0)[n] = (real_t *) calloc(mm, sizeof(real_t)); } for (n = 0; n < mm/2; ++n) { for (i = 0; i < mm; ++i) { w = (2*i+1)*(2*n+1-mm)*M_PI/(4*mm); (*ppp_q0)[n][i] = 2.0 * cos((real_t) w); w = (2*i+1)*(2*(mm+n)+1-mm)*M_PI/(4*mm); (*ppp_q0)[n + mm/2][i] = 2.0 * cos((real_t) w); } } /* Set 2nd Mul&Acc Coef's */ *ppp_t0 = (real_t **) calloc(mm, sizeof(real_t *)); *ppp_t1 = (real_t **) calloc(mm, sizeof(real_t *)); for (n = 0; n < mm; ++n) { (*ppp_t0)[n] = (real_t *) calloc(kk, sizeof(real_t)); (*ppp_t1)[n] = (real_t *) calloc(kk, sizeof(real_t)); } for (n = 0; n < mm; ++n) { for (k = 0; k < kk; ++k) { (*ppp_t0)[n][k] = mm * p_proto[2*k *mm + n]; (*ppp_t1)[n][k] = mm * p_proto[(2*k+1)*mm + n]; if (k%2 != 0) { (*ppp_t0)[n][k] = -(*ppp_t0)[n][k]; (*ppp_t1)[n][k] = -(*ppp_t1)[n][k]; } } } } void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, real_t buffer[SSR_BANDS][96/4], uint16_t frame_len, uint8_t bands) { static int initFlag = 0; real_t a_pqfproto[PQFTAPS]; int i; if (initFlag == 0) { gc_set_protopqf(a_pqfproto); gc_setcoef_eff_pqfsyn(SSR_BANDS, PQFTAPS/(2*SSR_BANDS), a_pqfproto, &pp_q0, &pp_t0, &pp_t1); initFlag = 1; } for (i = 0; i < frame_len / SSR_BANDS; i++) { int l, n, k; int mm = SSR_BANDS; int kk = PQFTAPS/(2*SSR_BANDS); for (n = 0; n < mm; n++) { for (k = 0; k < 2*kk-1; k++) { buffer[n][k] = buffer[n][k+1]; } } for (n = 0; n < mm; n++) { real_t acc = 0.0; for (l = 0; l < mm; l++) { acc += pp_q0[n][l] * in_data[l*frame_len/SSR_BANDS + i]; } buffer[n][2*kk-1] = acc; } for (n = 0; n < mm/2; n++) { real_t acc = 0.0; for (k = 0; k < kk; k++) { acc += pp_t0[n][k] * buffer[n][2*kk-1-2*k]; } for (k = 0; k < kk; ++k) { acc += pp_t1[n][k] * buffer[n + mm/2][2*kk-2-2*k]; } out_data[i*SSR_BANDS + n] = acc; acc = 0.0; for (k = 0; k < kk; k++) { acc += pp_t0[mm-1-n][k] * buffer[n][2*kk-1-2*k]; } for (k = 0; k < kk; k++) { acc -= pp_t1[mm-1-n][k] * buffer[n + mm/2][2*kk-2-2*k]; } out_data[i*SSR_BANDS + mm-1-n] = acc; } } } #endif faad2-2.11.2/libfaad/ssr_ipqf.h000066400000000000000000000031011476153623600161430ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_ipqf.h,v 1.17 2007/11/01 12:33:39 menno Exp $ **/ #ifndef __SSR_IPQF_H__ #define __SSR_IPQF_H__ #ifdef __cplusplus extern "C" { #endif void ssr_ipqf(ssr_info *ssr, real_t *in_data, real_t *out_data, real_t buffer[SSR_BANDS][96/4], uint16_t frame_len, uint8_t bands); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/ssr_win.h000066400000000000000000000327031476153623600160130ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Ahead Software AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. ** ** $Id: ssr_win.h,v 1.16 2007/11/01 12:33:39 menno Exp $ **/ #ifndef __SSR_WIN_H__ #define __SSR_WIN_H__ #ifdef __cplusplus extern "C" { #endif #ifdef _MSC_VER #pragma warning(disable:4305) #pragma warning(disable:4244) #endif static real_t sine_short_32[] = { 0.0245412290, 0.0735645667, 0.1224106774, 0.1709618866, 0.2191012502, 0.2667127550, 0.3136817515, 0.3598950505, 0.4052413106, 0.4496113360, 0.4928981960, 0.5349976420, 0.5758082271, 0.6152316332, 0.6531728506, 0.6895405650, 0.7242470980, 0.7572088838, 0.7883464694, 0.8175848126, 0.8448535800, 0.8700870275, 0.8932242990, 0.9142097831, 0.9329928160, 0.9495282173, 0.9637760520, 0.9757021666, 0.9852776527, 0.9924795628, 0.9972904325, 0.9996988177 }; static real_t sine_long_256[] = { 0.0030679568, 0.0092037553, 0.0153392069, 0.0214740802, 0.0276081469, 0.0337411724, 0.0398729295, 0.0460031852, 0.0521317050, 0.0582582653, 0.0643826351, 0.0705045760, 0.0766238645, 0.0827402696, 0.0888535529, 0.0949634984, 0.1010698676, 0.1071724296, 0.1132709533, 0.1193652153, 0.1254549921, 0.1315400302, 0.1376201212, 0.1436950415, 0.1497645378, 0.1558284014, 0.1618863940, 0.1679383069, 0.1739838719, 0.1800229102, 0.1860551536, 0.1920804083, 0.1980984211, 0.2041089684, 0.2101118416, 0.2161068022, 0.2220936269, 0.2280720919, 0.2340419590, 0.2400030345, 0.2459550500, 0.2518978119, 0.2578310966, 0.2637546957, 0.2696683407, 0.2755718231, 0.2814649343, 0.2873474658, 0.2932191789, 0.2990798354, 0.3049292266, 0.3107671738, 0.3165933788, 0.3224076927, 0.3282098472, 0.3339996636, 0.3397769034, 0.3455413282, 0.3512927592, 0.3570309579, 0.3627557456, 0.3684668541, 0.3741640747, 0.3798472285, 0.3855160773, 0.3911703825, 0.3968099952, 0.4024346471, 0.4080441594, 0.4136383235, 0.4192169011, 0.4247796834, 0.4303264916, 0.4358570874, 0.4413712919, 0.4468688369, 0.4523496032, 0.4578133225, 0.4632597864, 0.4686888456, 0.4741002321, 0.4794937670, 0.4848692715, 0.4902265072, 0.4955652654, 0.5008853674, 0.5061866641, 0.5114688873, 0.5167317986, 0.5219752789, 0.5271991491, 0.5324031115, 0.5375871062, 0.5427507758, 0.5478940606, 0.5530167222, 0.5581185222, 0.5631993413, 0.5682589412, 0.5732972026, 0.5783138275, 0.5833086967, 0.5882815719, 0.5932323337, 0.5981607437, 0.6030666232, 0.6079497933, 0.6128100753, 0.6176473498, 0.6224613190, 0.6272518039, 0.6320187449, 0.6367619038, 0.6414810419, 0.6461760402, 0.6508467197, 0.6554928422, 0.6601143479, 0.6647109985, 0.6692826152, 0.6738290191, 0.6783500314, 0.6828455329, 0.6873153448, 0.6917592883, 0.6961771250, 0.7005687952, 0.7049341202, 0.7092728615, 0.7135848999, 0.7178700566, 0.7221282125, 0.7263591886, 0.7305628061, 0.7347388864, 0.7388873696, 0.7430079579, 0.7471006513, 0.7511651516, 0.7552013993, 0.7592092156, 0.7631884217, 0.7671388984, 0.7710605264, 0.7749531269, 0.7788165212, 0.7826505899, 0.7864552140, 0.7902302146, 0.7939754725, 0.7976908684, 0.8013761640, 0.8050313592, 0.8086562157, 0.8122506142, 0.8158144355, 0.8193475604, 0.8228498101, 0.8263210654, 0.8297612667, 0.8331701756, 0.8365477324, 0.8398938179, 0.8432082534, 0.8464909792, 0.8497417569, 0.8529606462, 0.8561473489, 0.8593018055, 0.8624239564, 0.8655136228, 0.8685707450, 0.8715950847, 0.8745866418, 0.8775452971, 0.8804709315, 0.8833633661, 0.8862225413, 0.8890483975, 0.8918406963, 0.8945994973, 0.8973246217, 0.9000158906, 0.9026733041, 0.9052967429, 0.9078861475, 0.9104412794, 0.9129621983, 0.9154487252, 0.9179008007, 0.9203183055, 0.9227011204, 0.9250492454, 0.9273625612, 0.9296408892, 0.9318842888, 0.9340925813, 0.9362657070, 0.9384035468, 0.9405061007, 0.9425731897, 0.9446048737, 0.9466009140, 0.9485613704, 0.9504860640, 0.9523749948, 0.9542281032, 0.9560452700, 0.9578264356, 0.9595715404, 0.9612805247, 0.9629532695, 0.9645897746, 0.9661900401, 0.9677538276, 0.9692812562, 0.9707721472, 0.9722265005, 0.9736442566, 0.9750253558, 0.9763697386, 0.9776773453, 0.9789481759, 0.9801821709, 0.9813792109, 0.9825392962, 0.9836624265, 0.9847484827, 0.9857975245, 0.9868094325, 0.9877841473, 0.9887216687, 0.9896219969, 0.9904850721, 0.9913108945, 0.9920993447, 0.9928504229, 0.9935641289, 0.9942404628, 0.9948793054, 0.9954807758, 0.9960446954, 0.9965711236, 0.9970600605, 0.9975114465, 0.9979252815, 0.9983015656, 0.9986402392, 0.9989413023, 0.9992047548, 0.9994305968, 0.9996188283, 0.9997693896, 0.9998823404, 0.9999576211, 0.9999952912 }; static real_t kbd_short_32[] = { 0.0000875914060105, 0.0009321760265333, 0.0032114611466596, 0.0081009893216786, 0.0171240286619181, 0.0320720743527833, 0.0548307856028528, 0.0871361822564870, 0.1302923415174603, 0.1848955425508276, 0.2506163195331889, 0.3260874142923209, 0.4089316830907141, 0.4959414909423747, 0.5833939894958904, 0.6674601983218376, 0.7446454751465113, 0.8121892962974020, 0.8683559394406505, 0.9125649996381605, 0.9453396205809574, 0.9680864942677585, 0.9827581789763112, 0.9914756203467121, 0.9961964092194694, 0.9984956609571091, 0.9994855586984285, 0.9998533730714648, 0.9999671864476404, 0.9999948432453556, 0.9999995655238333, 0.9999999961638728 }; static real_t kbd_long_256[] = { 0.0005851230124487, 0.0009642149851497, 0.0013558207534965, 0.0017771849644394, 0.0022352533849672, 0.0027342299070304, 0.0032773001022195, 0.0038671998069216, 0.0045064443384152, 0.0051974336885144, 0.0059425050016407, 0.0067439602523141, 0.0076040812644888, 0.0085251378135895, 0.0095093917383048, 0.0105590986429280, 0.0116765080854300, 0.0128638627792770, 0.0141233971318631, 0.0154573353235409, 0.0168678890600951, 0.0183572550877256, 0.0199276125319803, 0.0215811201042484, 0.0233199132076965, 0.0251461009666641, 0.0270617631981826, 0.0290689473405856, 0.0311696653515848, 0.0333658905863535, 0.0356595546648444, 0.0380525443366107, 0.0405466983507029, 0.0431438043376910, 0.0458455957104702, 0.0486537485902075, 0.0515698787635492, 0.0545955386770205, 0.0577322144743916, 0.0609813230826460, 0.0643442093520723, 0.0678221432558827, 0.0714163171546603, 0.0751278431308314, 0.0789577503982528, 0.0829069827918993, 0.0869763963425241, 0.0911667569410503, 0.0954787380973307, 0.0999129187977865, 0.1044697814663005, 0.1091497100326053, 0.1139529881122542, 0.1188797973021148, 0.1239302155951605, 0.1291042159181728, 0.1344016647957880, 0.1398223211441467, 0.1453658351972151, 0.1510317475686540, 0.1568194884519144, 0.1627283769610327, 0.1687576206143887, 0.1749063149634756, 0.1811734433685097, 0.1875578769224857, 0.1940583745250518, 0.2006735831073503, 0.2074020380087318, 0.2142421635060113, 0.2211922734956977, 0.2282505723293797, 0.2354151558022098, 0.2426840122941792, 0.2500550240636293, 0.2575259686921987, 0.2650945206801527, 0.2727582531907993, 0.2805146399424422, 0.2883610572460804, 0.2962947861868143, 0.3043130149466800, 0.3124128412663888, 0.3205912750432127, 0.3288452410620226, 0.3371715818562547, 0.3455670606953511, 0.3540283646950029, 0.3625521080463003, 0.3711348353596863, 0.3797730251194006, 0.3884630932439016, 0.3972013967475546, 0.4059842374986933, 0.4148078660689724, 0.4236684856687616, 0.4325622561631607, 0.4414852981630577, 0.4504336971855032, 0.4594035078775303, 0.4683907582974173, 0.4773914542472655, 0.4864015836506502, 0.4954171209689973, 0.5044340316502417, 0.5134482766032377, 0.5224558166913167, 0.5314526172383208, 0.5404346525403849, 0.5493979103766972, 0.5583383965124314, 0.5672521391870222, 0.5761351935809411, 0.5849836462541291, 0.5937936195492526, 0.6025612759529649, 0.6112828224083939, 0.6199545145721097, 0.6285726610088878, 0.6371336273176413, 0.6456338401819751, 0.6540697913388968, 0.6624380414593221, 0.6707352239341151, 0.6789580485595255, 0.6871033051160131, 0.6951678668345944, 0.7031486937449871, 0.7110428359000029, 0.7188474364707993, 0.7265597347077880, 0.7341770687621900, 0.7416968783634273, 0.7491167073477523, 0.7564342060337386, 0.7636471334404891, 0.7707533593446514, 0.7777508661725849, 0.7846377507242818, 0.7914122257259034, 0.7980726212080798, 0.8046173857073919, 0.8110450872887550, 0.8173544143867162, 0.8235441764639875, 0.8296133044858474, 0.8355608512093652, 0.8413859912867303, 0.8470880211822968, 0.8526663589032990, 0.8581205435445334, 0.8634502346476508, 0.8686552113760616, 0.8737353715068081, 0.8786907302411250, 0.8835214188357692, 0.8882276830575707, 0.8928098814640207, 0.8972684835130879, 0.9016040675058185, 0.9058173183656508, 0.9099090252587376, 0.9138800790599416, 0.9177314696695282, 0.9214642831859411, 0.9250796989403991, 0.9285789863994010, 0.9319635019415643, 0.9352346855155568, 0.9383940571861993, 0.9414432135761304, 0.9443838242107182, 0.9472176277741918, 0.9499464282852282, 0.9525720912004834, 0.9550965394547873, 0.9575217494469370, 0.9598497469802043, 0.9620826031668507, 0.9642224303060783, 0.9662713777449607, 0.9682316277319895, 0.9701053912729269, 0.9718949039986892, 0.9736024220549734, 0.9752302180233160, 0.9767805768831932, 0.9782557920246753, 0.9796581613210076, 0.9809899832703159, 0.9822535532154261, 0.9834511596505429, 0.9845850806232530, 0.9856575802399989, 0.9866709052828243, 0.9876272819448033, 0.9885289126911557, 0.9893779732525968, 0.9901766097569984, 0.9909269360049311, 0.9916310308941294, 0.9922909359973702, 0.9929086532976777, 0.9934861430841844, 0.9940253220113651, 0.9945280613237534, 0.9949961852476154, 0.9954314695504363, 0.9958356402684387, 0.9962103726017252, 0.9965572899760172, 0.9968779632693499, 0.9971739102014799, 0.9974465948831872, 0.9976974275220812, 0.9979277642809907, 0.9981389072844972, 0.9983321047686901, 0.9985085513687731, 0.9986693885387259, 0.9988157050968516, 0.9989485378906924, 0.9990688725744943, 0.9991776444921379, 0.9992757396582338, 0.9993639958299003, 0.9994432036616085, 0.9995141079353859, 0.9995774088586188, 0.9996337634216871, 0.9996837868076957, 0.9997280538466377, 0.9997671005064359, 0.9998014254134544, 0.9998314913952471, 0.9998577270385304, 0.9998805282555989, 0.9999002598526793, 0.9999172570940037, 0.9999318272557038, 0.9999442511639580, 0.9999547847121726, 0.9999636603523446, 0.9999710885561258, 0.9999772592414866, 0.9999823431612708, 0.9999864932503106, 0.9999898459281599, 0.9999925223548691, 0.9999946296375997, 0.9999962619864214, 0.9999975018180320, 0.9999984208055542, 0.9999990808746198, 0.9999995351446231, 0.9999998288155155 }; #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/structs.h000066400000000000000000000244031476153623600160340ustar00rootroot00000000000000/* ** 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; uint16_t crc_check; uint8_t no_raw_data_blocks_in_frame; /* control param */ uint8_t old_format; } adts_header; typedef struct { uint8_t copyright_id_present; int8_t copyright_id[10]; uint8_t original_copy; uint32_t bitrate; uint32_t adif_buffer_fullness; uint8_t num_program_config_elements; uint8_t home; uint8_t bitstream_type; /* 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 global_gain; 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 */ int16_t scale_factors[8][51]; /* [0..255], except for noise and intensity */ 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; 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; uint8_t rev_global_gain; #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; uint8_t postSeekResetFlag; #ifdef ERROR_RESILIENCE uint8_t aacSectionDataResilienceFlag; uint8_t aacScalefactorDataResilienceFlag; uint8_t aacSpectralDataResilienceFlag; #endif uint16_t frameLength; uint32_t frame; uint32_t sample_buffer_size; 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]; /* sample_buffer_size: (internal) output dara buffer size */ latm_header latm_config; /* 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 sbr_info *sbr[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 /* RNG states */ uint32_t __r1; uint32_t __r2; #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]; #endif #if (defined(PS_DEC) || defined(DRM_PS)) uint8_t ps_used[MAX_SYNTAX_ELEMENTS]; uint8_t ps_used_global; #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 */ NeAACDecConfiguration config; #ifdef PROFILE int64_t cycles; int64_t spectral_cycles; int64_t output_cycles; int64_t scalefac_cycles; int64_t requant_cycles; #endif const unsigned char *cmes; } NeAACDecStruct; #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/syntax.c000066400000000000000000002500311476153623600156440ustar00rootroot00000000000000/* ** 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 "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 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 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); #else static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count); static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc); static uint8_t excluded_channels(bitfile *ld, drc_info *drc); #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; /* One or two channels are used; exact number will be known after single_lfe_channel_element */ if (channels+2 > MAX_CHANNELS) { hInfo->error = 12; return; } if (hDecoder->fr_ch_ele+1 > MAX_SYNTAX_ELEMENTS) { hInfo->error = 13; return; } /* for SCE hDecoder->element_output_channels[] is not set here because this can become 2 when some form of Parametric Stereo coding is used */ if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) { /* element inconsistency */ hInfo->error = 21; return; } /* save the syntax element id */ hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; /* decode the element */ hInfo->error = single_lfe_channel_element(hDecoder, ld, channels, &tag); /* map output channels position to internal data channels */ if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 2) { /* this might be faulty when pce_set is true */ hDecoder->internal_channel[channels] = channels; hDecoder->internal_channel[channels+1] = channels+1; } else { if (hDecoder->pce_set) { if (hDecoder->pce.channels > MAX_CHANNELS) { hInfo->error = 22; return; } 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; } if (hDecoder->pce_set && (hDecoder->pce.channels > MAX_CHANNELS)) { hInfo->error = 22; return; } /* for CPE the number of output channels is always 2 */ if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) { /* element_output_channels not set yet */ hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; } else if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] != 2) { /* element inconsistency */ hInfo->error = 21; return; } if (hDecoder->element_id[hDecoder->fr_ch_ele] != INVALID_ELEMENT_ID && hDecoder->element_id[hDecoder->fr_ch_ele] != id_syn_ele) { /* element inconsistency */ hInfo->error = 21; return; } /* save the syntax element id */ hDecoder->element_id[hDecoder->fr_ch_ele] = id_syn_ele; /* decode the element */ hInfo->error = channel_pair_element(hDecoder, ld, channels, &tag); /* map output channel position to internal data channels */ if (hDecoder->pce_set) { hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]] = channels; hDecoder->internal_channel[hDecoder->pce.cpe_channel[tag]+1] = channels+1; } else { hDecoder->internal_channel[channels] = channels; hDecoder->internal_channel[channels+1] = channels+1; } hDecoder->fr_channels += 2; hDecoder->fr_ch_ele++; } void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc) { uint8_t id_syn_ele; uint8_t ele_this_frame = 0; hDecoder->fr_channels = 0; hDecoder->fr_ch_ele = 0; hDecoder->first_syn_ele = 25; hDecoder->has_lfe = 0; #ifdef ERROR_RESILIENCE if (hDecoder->object_type < ER_OBJECT_START) { #endif /* Table 4.4.3: raw_data_block() */ while ((id_syn_ele = (uint8_t)faad_getbits(ld, LEN_SE_ID DEBUGVAR(1,4,"NeAACDecDecode(): id_syn_ele"))) != ID_END) { switch (id_syn_ele) { case ID_SCE: ele_this_frame++; if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); if (hInfo->error > 0) return; break; case ID_CPE: ele_this_frame++; if (hDecoder->first_syn_ele == 25) hDecoder->first_syn_ele = id_syn_ele; decode_cpe(hDecoder, hInfo, ld, id_syn_ele); if (hInfo->error > 0) return; break; case ID_LFE: #ifdef DRM hInfo->error = 32; #else ele_this_frame++; hDecoder->has_lfe++; decode_sce_lfe(hDecoder, hInfo, ld, id_syn_ele); #endif if (hInfo->error > 0) return; break; case ID_CCE: /* not implemented yet, but skip the bits */ #ifdef DRM hInfo->error = 32; #else ele_this_frame++; #ifdef COUPLING_DEC hInfo->error = coupling_channel_element(hDecoder, ld); #else hInfo->error = 6; #endif #endif if (hInfo->error > 0) return; break; case ID_DSE: ele_this_frame++; data_stream_element(hDecoder, ld); break; case ID_PCE: if (ele_this_frame != 0) { hInfo->error = 31; return; } ele_this_frame++; /* 14496-4: 5.6.4.1.2.1.3: */ /* program_configuration_element()'s in access units shall be ignored */ program_config_element(pce, ld); //if ((hInfo->error = program_config_element(pce, ld)) > 0) // return; //hDecoder->pce_set = 1; break; case ID_FIL: ele_this_frame++; /* one sbr_info describes a channel_element not a channel! */ /* if we encounter SBR data here: error */ /* SBR data will be read directly in the SCE/LFE/CPE element */ if ((hInfo->error = fill_element(hDecoder, ld, drc #ifdef SBR_DEC , INVALID_SBR_ELEMENT #endif )) > 0) return; break; } if (ld->error != 0) { hInfo->error = 32; return; } } #ifdef ERROR_RESILIENCE } else { /* Table 262: er_raw_data_block() */ switch (hDecoder->channelConfiguration) { case 1: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; break; case 2: decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; break; case 3: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; break; case 4: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; break; case 5: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; break; case 6: decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); if (hInfo->error > 0) return; break; case 7: /* 8 channels */ decode_sce_lfe(hDecoder, hInfo, ld, ID_SCE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_cpe(hDecoder, hInfo, ld, ID_CPE); if (hInfo->error > 0) return; decode_sce_lfe(hDecoder, hInfo, ld, ID_LFE); if (hInfo->error > 0) return; break; default: hInfo->error = 7; return; } #if 0 cnt = bits_to_decode() / 8; while (cnt >= 1) { cnt -= extension_payload(cnt); } #endif } #endif /* new in corrigendum 14496-3:2002 */ #ifdef DRM if (hDecoder->object_type != DRM_ER_LC #if 0 && !hDecoder->latm_header_present #endif ) #endif { faad_byte_align(ld); } return; } /* Table 4.4.4 and */ /* Table 4.4.9 */ static uint8_t single_lfe_channel_element(NeAACDecStruct *hDecoder, bitfile *ld, uint8_t channel, uint8_t *tag) { uint8_t retval = 0; element sce = {0}; ic_stream *ics = &(sce.ics1); ALIGN int16_t spec_data[1024] = {0}; sce.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG DEBUGVAR(1,38,"single_lfe_channel_element(): element_instance_tag")); *tag = sce.element_instance_tag; sce.channel = channel; sce.paired_channel = -1; retval = individual_channel_stream(hDecoder, &sce, ld, ics, 0, spec_data); if (retval > 0) return retval; /* IS not allowed in single channel */ if (ics->is_used) return 32; #ifdef SBR_DEC /* check if next bitstream element is a fill element */ /* if so, read it now so SBR decoding can be done in case of a file with SBR */ if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) { faad_flushbits(ld, LEN_SE_ID); /* one sbr_info describes a channel_element not a channel! */ if ((retval = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) { return retval; } } #endif /* noiseless coding is done, spectral reconstruction is done now */ retval = reconstruct_single_channel(hDecoder, ics, &sce, spec_data); if (retval > 0) return retval; return 0; } /* Table 4.4.5 */ static uint8_t channel_pair_element(NeAACDecStruct *hDecoder, bitfile *ld, uint8_t channels, uint8_t *tag) { ALIGN int16_t spec_data1[1024] = {0}; ALIGN int16_t spec_data2[1024] = {0}; element cpe = {0}; ic_stream *ics1 = &(cpe.ics1); ic_stream *ics2 = &(cpe.ics2); uint8_t result; cpe.channel = channels; cpe.paired_channel = channels+1; cpe.element_instance_tag = (uint8_t)faad_getbits(ld, LEN_TAG DEBUGVAR(1,39,"channel_pair_element(): element_instance_tag")); *tag = cpe.element_instance_tag; if ((cpe.common_window = faad_get1bit(ld DEBUGVAR(1,40,"channel_pair_element(): common_window"))) & 1) { /* both channels have common ics information */ if ((result = ics_info(hDecoder, ics1, ld, cpe.common_window)) > 0) return result; ics1->ms_mask_present = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,41,"channel_pair_element(): ms_mask_present")); if (ics1->ms_mask_present == 3) { /* bitstream error */ return 32; } if (ics1->ms_mask_present == 1) { uint8_t g, sfb; for (g = 0; g < ics1->num_window_groups; g++) { for (sfb = 0; sfb < ics1->max_sfb; sfb++) { ics1->ms_used[g][sfb] = faad_get1bit(ld DEBUGVAR(1,42,"channel_pair_element(): faad_get1bit")); } } } #ifdef ERROR_RESILIENCE if ((hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) { if (( #ifdef LTP_DEC ics1->ltp.data_present = #endif faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) { #ifdef LTP_DEC if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp), ld)) > 0) { return result; } #else return 26; #endif } } #endif memcpy(ics2, ics1, sizeof(ic_stream)); } else { ics1->ms_mask_present = 0; } if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics1, 0, spec_data1)) > 0) { return result; } #ifdef ERROR_RESILIENCE if (cpe.common_window && (hDecoder->object_type >= ER_OBJECT_START) && (ics1->predictor_data_present)) { if (( #ifdef LTP_DEC ics1->ltp2.data_present = #endif faad_get1bit(ld DEBUGVAR(1,50,"channel_pair_element(): ltp.data_present"))) & 1) { #ifdef LTP_DEC if ((result = ltp_data(hDecoder, ics1, &(ics1->ltp2), ld)) > 0) { return result; } #else return 26; #endif } } #endif if ((result = individual_channel_stream(hDecoder, &cpe, ld, ics2, 0, spec_data2)) > 0) { return result; } #ifdef SBR_DEC /* check if next bitstream element is a fill element */ /* if so, read it now so SBR decoding can be done in case of a file with SBR */ if (faad_showbits(ld, LEN_SE_ID) == ID_FIL) { faad_flushbits(ld, LEN_SE_ID); /* one sbr_info describes a channel_element not a channel! */ if ((result = fill_element(hDecoder, ld, hDecoder->drc, hDecoder->fr_ch_ele)) > 0) { return result; } } #endif /* noiseless coding is done, spectral reconstruction is done now */ if ((result = reconstruct_channel_pair(hDecoder, ics1, ics2, &cpe, spec_data1, spec_data2)) > 0) { return result; } return 0; } /* Table 4.4.6 */ static uint8_t ics_info(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, uint8_t common_window) { uint8_t retval = 0; uint8_t ics_reserved_bit; ics_reserved_bit = faad_get1bit(ld DEBUGVAR(1,43,"ics_info(): ics_reserved_bit")); if (ics_reserved_bit != 0) return 32; ics->window_sequence = (uint8_t)faad_getbits(ld, 2 DEBUGVAR(1,44,"ics_info(): window_sequence")); ics->window_shape = faad_get1bit(ld DEBUGVAR(1,45,"ics_info(): window_shape")); #ifdef LD_DEC /* No block switching in LD */ if ((hDecoder->object_type == LD) && (ics->window_sequence != ONLY_LONG_SEQUENCE)) return 32; #endif if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { ics->max_sfb = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,46,"ics_info(): max_sfb (short)")); ics->scale_factor_grouping = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,47,"ics_info(): scale_factor_grouping")); } else { ics->max_sfb = (uint8_t)faad_getbits(ld, 6 DEBUGVAR(1,48,"ics_info(): max_sfb (long)")); } /* get the grouping information */ if ((retval = window_grouping_info(hDecoder, ics)) > 0) return retval; /* should be an error */ /* check the range of max_sfb */ if (ics->max_sfb > ics->num_swb) return 16; if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) { if ((ics->predictor_data_present = faad_get1bit(ld DEBUGVAR(1,49,"ics_info(): predictor_data_present"))) & 1) { if (hDecoder->object_type == MAIN) /* MPEG2 style AAC predictor */ { uint8_t sfb; uint8_t predictor_reset, predictor_reset_group_number, prediction_used; uint8_t limit = min(ics->max_sfb, max_pred_sfb(hDecoder->sf_index)); predictor_reset = faad_get1bit(ld DEBUGVAR(1,53,"ics_info(): pred.predictor_reset")); if (predictor_reset) { predictor_reset_group_number = (uint8_t)faad_getbits(ld, 5 DEBUGVAR(1,54,"ics_info(): pred.predictor_reset_group_number")); } else { predictor_reset_group_number = 0; } for (sfb = 0; sfb < limit; sfb++) { prediction_used = faad_get1bit(ld DEBUGVAR(1,55,"ics_info(): pred.prediction_used")); #ifdef MAIN_DEC ics->pred.prediction_used[sfb] = prediction_used; #endif } #ifdef MAIN_DEC ics->pred.limit = limit; ics->pred.predictor_reset = predictor_reset; ics->pred.predictor_reset_group_number = predictor_reset_group_number; #else (void)predictor_reset_group_number; (void)prediction_used; #endif } #ifdef LTP_DEC else { /* Long Term Prediction */ if (hDecoder->object_type < ER_OBJECT_START) { if ((ics->ltp.data_present = faad_get1bit(ld DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) { if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) { return retval; } } if (common_window) { if ((ics->ltp2.data_present = faad_get1bit(ld DEBUGVAR(1,51,"ics_info(): ltp2.data_present"))) & 1) { if ((retval = ltp_data(hDecoder, ics, &(ics->ltp2), ld)) > 0) { return retval; } } } } #ifdef ERROR_RESILIENCE if (!common_window && (hDecoder->object_type >= ER_OBJECT_START)) { if ((ics->ltp.data_present = faad_get1bit(ld DEBUGVAR(1,50,"ics_info(): ltp.data_present"))) & 1) { if ((retval = ltp_data(hDecoder, ics, &(ics->ltp), ld)) > 0) { return retval; } } } #endif /* ERROR_RESILIENCE */ } #else /* LTP_DEC */ (void)common_window; #endif /* LTP_DEC */ } } 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; (void)hDecoder; /* TODO: remove parameter; rename method; why result is unused? */ /* element_instance_tag = */ faad_getbits(ld, LEN_TAG DEBUGVAR(1,60,"data_stream_element(): element_instance_tag")); byte_aligned = faad_get1bit(ld DEBUGVAR(1,61,"data_stream_element(): byte_aligned")); count = (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,62,"data_stream_element(): count")); if (count == 255) { count += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,63,"data_stream_element(): extra count")); } if (byte_aligned) faad_byte_align(ld); for (i = 0; i < count; i++) { faad_getbits(ld, LEN_BYTE DEBUGVAR(1,64,"data_stream_element(): data_stream_byte")); } return count; } /* Table 4.4.11 */ static uint8_t fill_element(NeAACDecStruct *hDecoder, bitfile *ld, drc_info *drc #ifdef SBR_DEC ,uint8_t sbr_ele #endif ) { uint16_t count; #ifdef SBR_DEC uint8_t bs_extension_type; #endif count = (uint16_t)faad_getbits(ld, 4 DEBUGVAR(1,65,"fill_element(): count")); if (count == 15) { count += (uint16_t)faad_getbits(ld, 8 DEBUGVAR(1,66,"fill_element(): extra count")) - 1; } if (count > 0) { #ifdef SBR_DEC bs_extension_type = (uint8_t)faad_showbits(ld, 4); if ((bs_extension_type == EXT_SBR_DATA) || (bs_extension_type == EXT_SBR_DATA_CRC)) { if (sbr_ele == INVALID_SBR_ELEMENT) return 24; if (!hDecoder->sbr[sbr_ele]) { hDecoder->sbr[sbr_ele] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[sbr_ele], 2*get_sample_rate(hDecoder->sf_index), hDecoder->downSampledSBR #ifdef DRM , 0 #endif ); } if (!hDecoder->sbr[sbr_ele]) return 19; hDecoder->sbr_present_flag = 1; /* parse the SBR data */ hDecoder->sbr[sbr_ele]->ret = sbr_extension_data(ld, hDecoder->sbr[sbr_ele], count, hDecoder->postSeekResetFlag); #if 0 if (hDecoder->sbr[sbr_ele]->ret > 0) { printf("%s\n", NeAACDecGetErrorMessage(hDecoder->sbr[sbr_ele]->ret)); } #endif #if (defined(PS_DEC) || defined(DRM_PS)) if (hDecoder->sbr[sbr_ele]->ps_used) { hDecoder->ps_used[sbr_ele] = 1; /* set element independent flag to 1 as well */ hDecoder->ps_used_global = 1; } #endif } else { #endif #ifndef DRM while (count > 0) { uint16_t payload_bytes = extension_payload(ld, drc, count); if (payload_bytes <= count) { count -= payload_bytes; } else { count = 0; } } #else (void)drc; 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 channels = hDecoder->fr_channels = 0; uint8_t this_layer_stereo = (hDecoder->channelConfiguration > 1) ? 1 : 0; element cpe = {0}; ic_stream *ics1 = &(cpe.ics1); ic_stream *ics2 = &(cpe.ics2); ALIGN int16_t spec_data1[1024] = {0}; ALIGN int16_t spec_data2[1024] = {0}; (void)drc; /* TODO: remove unused parameter? */ (void)pce; /* TODO: remove unused parameter? */ hDecoder->fr_ch_ele = 0; hInfo->error = DRM_aac_scalable_main_header(hDecoder, ics1, ics2, ld, this_layer_stereo); if (hInfo->error > 0) return; cpe.common_window = 1; if (this_layer_stereo) { hDecoder->element_id[0] = ID_CPE; if (hDecoder->element_output_channels[hDecoder->fr_ch_ele] == 0) hDecoder->element_output_channels[hDecoder->fr_ch_ele] = 2; } else { hDecoder->element_id[0] = ID_SCE; } if (this_layer_stereo) { cpe.channel = 0; cpe.paired_channel = 1; } /* Stereo2 / Mono1 */ ics1->tns_data_present = faad_get1bit(ld); #if defined(LTP_DEC) ics1->ltp.data_present = faad_get1bit(ld); #elif defined (DRM) if(faad_get1bit(ld)) { hInfo->error = 26; return; } #else faad_get1bit(ld); #endif hInfo->error = side_info(hDecoder, &cpe, ld, ics1, 1); if (hInfo->error > 0) return; if (this_layer_stereo) { /* Stereo3 */ ics2->tns_data_present = faad_get1bit(ld); #ifdef LTP_DEC ics1->ltp.data_present = #endif faad_get1bit(ld); hInfo->error = side_info(hDecoder, &cpe, ld, ics2, 1); if (hInfo->error > 0) return; } /* Stereo4 / Mono2 */ if (ics1->tns_data_present) tns_data(ics1, &(ics1->tns), ld); if (this_layer_stereo) { /* Stereo5 */ if (ics2->tns_data_present) tns_data(ics2, &(ics2->tns), ld); } #ifdef DRM /* CRC check */ if (hDecoder->object_type == DRM_ER_LC) { if ((hInfo->error = (uint8_t)faad_check_CRC(ld, (uint16_t)faad_get_processed_bits(ld) - 8)) > 0) return; } #endif /* Stereo6 / Mono3 */ /* error resilient spectral data decoding */ if ((hInfo->error = reordered_spectral_data(hDecoder, ics1, ld, spec_data1)) > 0) { return; } if (this_layer_stereo) { /* Stereo7 */ /* error resilient spectral data decoding */ if ((hInfo->error = reordered_spectral_data(hDecoder, ics2, ld, spec_data2)) > 0) { return; } } #ifdef DRM #ifdef SBR_DEC /* In case of DRM we need to read the SBR info before channel reconstruction */ if ((hDecoder->sbr_present_flag == 1) && (hDecoder->object_type == DRM_ER_LC)) { bitfile ld_sbr = {0}; uint32_t i; uint16_t count = 0; uint8_t *revbuffer; uint8_t *prevbufstart; uint8_t *pbufend; /* all forward bitreading should be finished at this point */ uint32_t bitsconsumed = faad_get_processed_bits(ld); uint32_t buffer_size = faad_origbitbuffer_size(ld); uint8_t *buffer = (uint8_t*)faad_origbitbuffer(ld); if (bitsconsumed + 8 > buffer_size*8) { hInfo->error = 14; return; } if (!hDecoder->sbr[0]) { hDecoder->sbr[0] = sbrDecodeInit(hDecoder->frameLength, hDecoder->element_id[0], 2*get_sample_rate(hDecoder->sf_index), 0 /* ds SBR */, 1); } if (!hDecoder->sbr[0]) { hInfo->error = 19; return; } /* Reverse bit reading of SBR data in DRM audio frame */ revbuffer = (uint8_t*)faad_malloc(buffer_size*sizeof(uint8_t)); prevbufstart = revbuffer; pbufend = &buffer[buffer_size - 1]; for (i = 0; i < buffer_size; i++) *prevbufstart++ = reverse_byte(*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 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; uint8_t sect_lim; /* 51 or 120, anyways less than 127. */ if (ics->window_sequence == EIGHT_SHORT_SEQUENCE) { sect_bits = 3; sect_lim = 8 * 15; } else { sect_bits = 5; sect_lim = MAX_SFB; } sect_esc_val = (1u<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; uint8_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; if (i >= sect_lim) return 15; #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; if (sect_len > sect_lim) return 15; 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 (sect_len > sect_lim) return 15; if (k + sect_len > sect_lim) 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; /* k <= sect_lim */ 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; int16_t scale_factor = ics->global_gain; int16_t is_position = 0; int16_t scale_factor_max = 255; #ifdef FIXED_POINT /* TODO: consider rolling out to regular build. */ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION /* The value is inexact, adjusted to current fuzzer findings. */ scale_factor_max = 165; #endif // FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION #endif // FIXED_POINT #ifndef DRM int8_t noise_pcm_flag = 1; int16_t noise_energy = ics->global_gain - 90; #endif 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] = min(scale_factor, scale_factor_max); #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, 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++) { uint8_t start_coef_bits = 3; 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; #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; } #ifndef DRM /* Table 4.4.30 */ static uint16_t extension_payload(bitfile *ld, drc_info *drc, uint16_t count) { uint16_t i, n, dataElementLength; uint8_t dataElementLengthPart; uint8_t align = 4, data_element_version, loopCounter; uint8_t extension_type = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,87,"extension_payload(): extension_type")); switch (extension_type) { case EXT_DYNAMIC_RANGE: drc->present = 1; n = dynamic_range_info(ld, drc); return n; case EXT_FILL_DATA: /* fill_nibble = */ faad_getbits(ld, 4 DEBUGVAR(1,136,"extension_payload(): fill_nibble")); /* must be '0000' */ for (i = 0; i < count-1; i++) { /* fill_byte[i] = */ faad_getbits(ld, 8 DEBUGVAR(1,88,"extension_payload(): fill_byte")); /* must be '10100101' */ } return count; case EXT_DATA_ELEMENT: data_element_version = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,400,"extension_payload(): data_element_version")); switch (data_element_version) { case ANC_DATA: loopCounter = 0; dataElementLength = 0; do { dataElementLengthPart = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,401,"extension_payload(): dataElementLengthPart")); dataElementLength += dataElementLengthPart; loopCounter++; } while (dataElementLengthPart == 255); for (i = 0; i < dataElementLength; i++) { /* data_element_byte[i] = */ faad_getbits(ld, 8 DEBUGVAR(1,402,"extension_payload(): data_element_byte")); return (dataElementLength+loopCounter+1); } default: align = 0; } case EXT_FIL: default: faad_getbits(ld, align DEBUGVAR(1,88,"extension_payload(): fill_nibble")); for (i = 0; i < count-1; i++) { /* other_bits[i] = */ faad_getbits(ld, 8 DEBUGVAR(1,89,"extension_payload(): fill_bit")); } return count; } } /* Table 4.4.31 */ static uint8_t dynamic_range_info(bitfile *ld, drc_info *drc) { uint8_t i, n = 1; uint8_t band_incr; drc->num_bands = 1; if (faad_get1bit(ld DEBUGVAR(1,90,"dynamic_range_info(): has instance_tag")) & 1) { drc->pce_instance_tag = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,91,"dynamic_range_info(): pce_instance_tag")); /* drc->drc_tag_reserved_bits = */ faad_getbits(ld, 4 DEBUGVAR(1,92,"dynamic_range_info(): drc_tag_reserved_bits")); n++; } drc->excluded_chns_present = faad_get1bit(ld DEBUGVAR(1,93,"dynamic_range_info(): excluded_chns_present")); if (drc->excluded_chns_present == 1) { n += excluded_channels(ld, drc); } if (faad_get1bit(ld DEBUGVAR(1,94,"dynamic_range_info(): has bands data")) & 1) { band_incr = (uint8_t)faad_getbits(ld, 4 DEBUGVAR(1,95,"dynamic_range_info(): band_incr")); /* drc->drc_bands_reserved_bits = */ faad_getbits(ld, 4 DEBUGVAR(1,96,"dynamic_range_info(): drc_bands_reserved_bits")); n++; drc->num_bands += band_incr; for (i = 0; i < drc->num_bands; i++) { drc->band_top[i] = (uint8_t)faad_getbits(ld, 8 DEBUGVAR(1,97,"dynamic_range_info(): band_top")); n++; } } if (faad_get1bit(ld DEBUGVAR(1,98,"dynamic_range_info(): has prog_ref_level")) & 1) { drc->prog_ref_level = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,99,"dynamic_range_info(): prog_ref_level")); /* drc->prog_ref_level_reserved_bits = */ faad_get1bit(ld DEBUGVAR(1,100,"dynamic_range_info(): prog_ref_level_reserved_bits")); n++; } for (i = 0; i < drc->num_bands; i++) { drc->dyn_rng_sgn[i] = faad_get1bit(ld DEBUGVAR(1,101,"dynamic_range_info(): dyn_rng_sgn")); drc->dyn_rng_ctl[i] = (uint8_t)faad_getbits(ld, 7 DEBUGVAR(1,102,"dynamic_range_info(): dyn_rng_ctl")); n++; } return n; } /* Table 4.4.32 */ static uint8_t excluded_channels(bitfile *ld, drc_info *drc) { uint8_t i, n = 0; uint8_t num_excl_chan = 7; for (i = 0; i < 7; i++) { drc->exclude_mask[i] = faad_get1bit(ld DEBUGVAR(1,103,"excluded_channels(): exclude_mask")); } n++; while ((drc->additional_excluded_chns[n-1] = faad_get1bit(ld DEBUGVAR(1,104,"excluded_channels(): additional_excluded_chns"))) == 1) { if (i >= MAX_CHANNELS - num_excl_chan - 7) return n; for (i = num_excl_chan; i < num_excl_chan+7; i++) { drc->exclude_mask[i] = faad_get1bit(ld DEBUGVAR(1,105,"excluded_channels(): exclude_mask")); } n++; num_excl_chan += 7; } return n; } #endif /* 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 */ #if 0 static uint32_t latm_get_value(bitfile *ld) { uint32_t l, value; uint8_t bytesForValue; bytesForValue = (uint8_t)faad_getbits(ld, 2); value = 0; for(l=0; lframelen_type==0) { do { tmp = (uint8_t)faad_getbits(ld, 8); framelen += tmp; } while(tmp==0xff); } else if(latm->framelen_type==1) framelen=latm->frameLength; return framelen; } static uint32_t latmAudioMuxElement(latm_header *latm, bitfile *ld) { uint32_t ascLen, asc_bits=0; uint32_t x1, y1, m, n, i; program_config pce; mp4AudioSpecificConfig mp4ASC; latm->useSameStreamMux = (uint8_t)faad_getbits(ld, 1); if(!latm->useSameStreamMux) { //parseSameStreamMuxConfig latm->version = (uint8_t) faad_getbits(ld, 1); if(latm->version) latm->versionA = (uint8_t) faad_getbits(ld, 1); if(latm->versionA) { //dunno the payload format for versionA fprintf(stderr, "versionA not supported\n"); return 0; } if(latm->version) //read taraBufferFullness latm_get_value(ld); latm->allStreamsSameTimeFraming = (uint8_t)faad_getbits(ld, 1); latm->numSubFrames = (uint8_t)faad_getbits(ld, 6) + 1; latm->numPrograms = (uint8_t)faad_getbits(ld, 4) + 1; latm->numLayers = faad_getbits(ld, 3) + 1; if(latm->numPrograms>1 || !latm->allStreamsSameTimeFraming || latm->numSubFrames>1 || latm->numLayers>1) { fprintf(stderr, "\r\nUnsupported LATM configuration: %d programs/ %d subframes, %d layers, allstreams: %d\n", latm->numPrograms, latm->numSubFrames, latm->numLayers, latm->allStreamsSameTimeFraming); return 0; } ascLen = 0; if(latm->version) ascLen = latm_get_value(ld); x1 = faad_get_processed_bits(ld); if(AudioSpecificConfigFromBitfile(ld, &mp4ASC, &pce, 0, 1) < 0) return 0; //horrid hack to unread the ASC bits and store them in latm->ASC //the correct code would rely on an ideal faad_ungetbits() y1 = faad_get_processed_bits(ld); if((y1-x1) <= MAX_ASC_BYTES*8) { faad_rewindbits(ld); m = x1; while(m>0) { n = min(m, 32); faad_getbits(ld, n); m -= n; } i = 0; m = latm->ASCbits = y1 - x1; while(m > 0) { n = min(m, 8); latm->ASC[i++] = (uint8_t) faad_getbits(ld, n); m -= n; } } asc_bits = y1-x1; if(ascLen>asc_bits) faad_getbits(ld, ascLen-asc_bits); latm->framelen_type = (uint8_t) faad_getbits(ld, 3); if(latm->framelen_type == 0) { latm->frameLength = 0; faad_getbits(ld, 8); //buffer fullness for frame_len_type==0, useless } else if(latm->framelen_type == 1) { latm->frameLength = faad_getbits(ld, 9); if(latm->frameLength==0) { fprintf(stderr, "Invalid frameLength: 0\r\n"); return 0; } latm->frameLength = (latm->frameLength+20)*8; } else { //hellish CELP or HCVX stuff, discard fprintf(stderr, "Unsupported CELP/HCVX framelentype: %d\n", latm->framelen_type); return 0; } latm->otherDataLenBits = 0; if(faad_getbits(ld, 1)) { //other data present int esc, tmp; if(latm->version) latm->otherDataLenBits = latm_get_value(ld); else do { esc = faad_getbits(ld, 1); tmp = faad_getbits(ld, 8); latm->otherDataLenBits = (latm->otherDataLenBits << 8) + tmp; } while(esc); } if(faad_getbits(ld, 1)) //crc faad_getbits(ld, 8); latm->inited = 1; } //read payload if(latm->inited) return latmParsePayload(latm, ld); else return 0; } uint32_t faad_latm_frame(latm_header *latm, bitfile *ld) { uint16_t len; uint32_t initpos, endpos, firstpos, ret; firstpos = faad_get_processed_bits(ld); while (ld->bytes_left) { faad_byte_align(ld); if(faad_showbits(ld, 11) != 0x2B7) { faad_getbits(ld, 8); continue; } faad_getbits(ld, 11); len = faad_getbits(ld, 13); if(!len) continue; initpos = faad_get_processed_bits(ld); ret = latmAudioMuxElement(latm, ld); endpos = faad_get_processed_bits(ld); if(ret>0) return (len*8)-(endpos-initpos); //faad_getbits(ld, initpos-endpos); //go back to initpos, but is valid a getbits(-N) ? } return 0xFFFFFFFF; } #endif faad2-2.11.2/libfaad/syntax.h000066400000000000000000000071761476153623600156630ustar00rootroot00000000000000/* ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com ** ** This program is free software; you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation; either version 2 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ** ** Any non-GPL usage of this software or parts of this software is strictly ** forbidden. ** ** The "appropriate copyright message" mentioned in section 2c of the GPLv2 ** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com" ** ** Commercial non-GPL licensing of this software is possible. ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. ** ** $Id: syntax.h,v 1.60 2009/01/26 23:51:17 menno Exp $ **/ #ifndef __SYNTAX_H__ #define __SYNTAX_H__ #ifdef __cplusplus extern "C" { #endif #include "bits.h" #define MAIN 1 #define LC 2 #define SSR 3 #define LTP 4 #define HE_AAC 5 #define LD 23 #define ER_LC 17 #define ER_LTP 19 #define DRM_ER_LC 27 /* special object type for DRM */ /* header types */ #define RAW 0 #define ADIF 1 #define ADTS 2 #define LATM 3 /* SBR signalling */ #define NO_SBR 0 #define SBR_UPSAMPLED 1 #define SBR_DOWNSAMPLED 2 #define NO_SBR_UPSAMPLED 3 /* DRM channel definitions */ #define DRMCH_MONO 1 #define DRMCH_STEREO 2 #define DRMCH_SBR_MONO 3 #define DRMCH_SBR_STEREO 4 #define DRMCH_SBR_PS_STEREO 5 /* First object type that has ER */ #define ER_OBJECT_START 17 /* Bitstream */ #define LEN_SE_ID 3 #define LEN_TAG 4 #define LEN_BYTE 8 #define EXT_FIL 0 #define EXT_FILL_DATA 1 #define EXT_DATA_ELEMENT 2 #define EXT_DYNAMIC_RANGE 11 #define ANC_DATA 0 /* Syntax elements */ #define ID_SCE 0x0 #define ID_CPE 0x1 #define ID_CCE 0x2 #define ID_LFE 0x3 #define ID_DSE 0x4 #define ID_PCE 0x5 #define ID_FIL 0x6 #define ID_END 0x7 #define INVALID_ELEMENT_ID 255 #define ONLY_LONG_SEQUENCE 0x0 #define LONG_START_SEQUENCE 0x1 #define EIGHT_SHORT_SEQUENCE 0x2 #define LONG_STOP_SEQUENCE 0x3 #define ZERO_HCB 0 #define FIRST_PAIR_HCB 5 #define ESC_HCB 11 #define QUAD_LEN 4 #define PAIR_LEN 2 #define NOISE_HCB 13 #define INTENSITY_HCB2 14 #define INTENSITY_HCB 15 #define INVALID_SBR_ELEMENT 255 int8_t GASpecificConfig(bitfile *ld, mp4AudioSpecificConfig *mp4ASC, program_config *pce); uint8_t adts_frame(adts_header *adts, bitfile *ld); void get_adif_header(adif_header *adif, bitfile *ld); void raw_data_block(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc); uint8_t reordered_spectral_data(NeAACDecStruct *hDecoder, ic_stream *ics, bitfile *ld, int16_t *spectral_data); #ifdef DRM void DRM_aac_scalable_main_element(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo, bitfile *ld, program_config *pce, drc_info *drc); #endif #if 0 uint32_t faad_latm_frame(latm_header *latm, bitfile *ld); #endif #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad/tns.c000066400000000000000000000263471476153623600151350ustar00rootroot00000000000000/* ** 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 */ /* returns exp */ static uint8_t 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, uint8_t exp); static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, uint8_t order, uint8_t exp); #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) }; static real_t* all_tns_coefs[] = {tns_coef_0_3, tns_coef_0_4, tns_coef_1_3, tns_coef_1_4}; /* 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]; uint8_t exp; 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; exp = 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, exp); } } } /* 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]; uint8_t exp; 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; exp = 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, exp); } } } /* Decoder transmitted coefficients for one TNS filter */ static uint8_t 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]; uint8_t table_index = 2 * (coef_compress != 0) + (coef_res_bits != 3); real_t* tns_coef = all_tns_coefs[table_index]; uint8_t exp = 0; /* Conversion to signed integer */ for (i = 0; i < order; i++) tmp2[i] = tns_coef[coef[i]]; /* Conversion to LPC coefficients */ a[0] = COEF_CONST(1.0); for (m = 1; m <= order; m++) { a[m] = tmp2[m-1]; /* changed */ for (i = 1; i < m; i++) /* loop only while i>= exp; /* OK not to check after the last iteration. */ if (m < order) { real_t sum_abs = COEF_CONST(0.0); for (i = 1; i <= m; ++i) { sum_abs += (a[i] >= 0) ? a[i] : -a[i]; } /* Next iteration would turn sum to 2*sum + 1; maximal "coef" is 7.999 */ if (sum_abs >= COEF_CONST(3.5)) { exp++; for (i = 1; i <= m; ++i) { a[i] >>= 1; } } } #endif } return exp; } static void tns_ar_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, uint8_t order, uint8_t exp) { /* - Simple all-pole filter of order "order" defined by y(n) = x(n) - lpc[1]*y(n-1) - ... - lpc[order]*y(n-order) - The state variables of the filter are initialized to zero every time - The output data is written over the input data ("in-place operation") - An input vector of "size" samples is processed and the index increment to the next data sample is given by "inc" */ uint8_t j; uint16_t i; /* state is stored as a double ringbuffer */ real_t state[2*TNS_MAX_ORDER] = {0}; int8_t state_index = 0; int32_t mul = 1; #ifdef FIXED_POINT if (exp >= 4) return; mul = 1 << exp; #else (void)exp; #endif for (i = 0; i < size; i++) { real_t y = REAL_CONST(0.0); for (j = 0; j < order; j++) y += MUL_C(state[state_index+j], lpc[j+1]); y = *spectrum - (y * mul); /* double ringbuffer state */ state_index--; if (state_index < 0) state_index = order-1; state[state_index] = state[state_index + order] = y; *spectrum = y; spectrum += inc; //#define TNS_PRINT #ifdef TNS_PRINT //printf("%d\n", y); printf("0x%.8X\n", y); #endif } } static void tns_ma_filter(real_t *spectrum, uint16_t size, int8_t inc, real_t *lpc, uint8_t order, uint8_t exp) { /* - 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; /* state is stored as a double ringbuffer */ real_t state[2*TNS_MAX_ORDER] = {0}; int8_t state_index = 0; int32_t mul = 1; #ifdef FIXED_POINT if (exp >= 4) return; mul = 1 << exp; #else (void)exp; #endif for (i = 0; i < size; i++) { real_t y = REAL_CONST(0.0); for (j = 0; j < order; j++) y += MUL_C(state[state_index+j], lpc[j+1]); y = *spectrum + (y * mul); /* double ringbuffer state */ state_index--; if (state_index < 0) state_index = order-1; state[state_index] = state[state_index + order] = *spectrum; *spectrum = y; spectrum += inc; } } faad2-2.11.2/libfaad/tns.h000066400000000000000000000033071476153623600151310ustar00rootroot00000000000000/* ** 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.h,v 1.23 2007/11/01 12:33:41 menno Exp $ **/ #ifndef __TNS_H__ #define __TNS_H__ #ifdef __cplusplus extern "C" { #endif #define TNS_MAX_ORDER 20 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); 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); #ifdef __cplusplus } #endif #endif faad2-2.11.2/libfaad2.def000066400000000000000000000006701476153623600147160ustar00rootroot00000000000000EXPORTS ; ; libfaad2 exports ; NeAACDecOpen @1 NeAACDecGetCurrentConfiguration @2 NeAACDecSetConfiguration @3 NeAACDecInit @4 NeAACDecInit2 @5 NeAACDecDecode @6 NeAACDecClose @7 NeAACDecGetErrorMessage @8 NeAACDecAudioSpecificConfig @9 NeAACDecPostSeekReset @10 NeAACDecDecode2 @11 faad2-2.11.2/properties.json000066400000000000000000000001531476153623600156550ustar00rootroot00000000000000{ "//": "This file contains properties used in build / release process", "PACKAGE_VERSION": "2.11.2" } faad2-2.11.2/workspace.bzl000066400000000000000000000005701476153623600153000ustar00rootroot00000000000000def _wrap_json_properties_impl(ctx): content = ctx.read(ctx.attr.src) bzl = "PROPERTIES = %s" % (content) ctx.file("BUILD", content = "", executable = False) ctx.file("properties.bzl", content = bzl, executable = False) wrap_json_properties = repository_rule( attrs = { "src": attr.label(mandatory = True), }, implementation = _wrap_json_properties_impl, )