diff -Nru fdk-aac-2.0.1/Android.bp fdk-aac-2.0.2/Android.bp --- fdk-aac-2.0.1/Android.bp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/Android.bp 2021-04-28 12:34:15.000000000 +0000 @@ -1,6 +1,40 @@ +// *** THIS PACKAGE HAS SPECIAL LICENSING CONDITIONS. PLEASE +// CONSULT THE OWNERS AND opensource-licensing@google.com BEFORE +// DEPENDING ON IT IN YOUR PROJECT. *** +package { + default_applicable_licenses: ["external_aac_license"], +} + +// Added automatically by a large-scale-change that took the approach of +// 'apply every license found to every target'. While this makes sure we respect +// every license restriction, it may not be entirely correct. +// +// e.g. GPL in an MIT project might only apply to the contrib/ directory. +// +// Please consider splitting the single license below into multiple licenses, +// taking care not to lose any license_kind information, and overriding the +// default license using the 'licenses: [...]' property on targets as needed. +// +// For unused files, consider creating a 'fileGroup' with "//visibility:private" +// to attach the license to, and including a comment whether the files may be +// used in the current project. +// See: http://go/android-license-faq +license { + name: "external_aac_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-Apache-2.0", + "legacy_by_exception_only", // by exception only + ], + license_text: [ + "NOTICE", + ], +} + cc_library_static { name: "libFraunhoferAAC", vendor_available: true, + host_supported: true, srcs: [ "libAACdec/src/*.cpp", "libAACenc/src/*.cpp", @@ -23,12 +57,13 @@ "-Wuninitialized", "-Wno-self-assign", "-Wno-implicit-fallthrough", + "-DSUPPRESS_BUILD_DATE_INFO", ], sanitize: { - misc_undefined:[ - "unsigned-integer-overflow", - "signed-integer-overflow", - "bounds", + misc_undefined: [ + "unsigned-integer-overflow", + "signed-integer-overflow", + "bounds", ], cfi: true, }, @@ -50,4 +85,17 @@ "libSACdec/include", "libSACenc/include", ], + + target: { + darwin: { + enabled: false, + }, + }, + + apex_available: [ + "//apex_available:platform", + "com.android.bluetooth.updatable", + "com.android.media.swcodec", + ], + min_sdk_version: "29", } diff -Nru fdk-aac-2.0.1/ChangeLog fdk-aac-2.0.2/ChangeLog --- fdk-aac-2.0.1/ChangeLog 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/ChangeLog 2021-04-28 12:34:15.000000000 +0000 @@ -1,3 +1,9 @@ +2.0.2 + - Minor upstream updates + - Lots of upstream and local fuzzing fixes + - Added CMake project files + - Removed the MSVC specific makefile + 2.0.1 - Minor release with a number of crash/fuzz fixes, primarily for the decoder diff -Nru fdk-aac-2.0.1/CMakeLists.txt fdk-aac-2.0.2/CMakeLists.txt --- fdk-aac-2.0.1/CMakeLists.txt 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/CMakeLists.txt 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,588 @@ +# # CMake project for fdk-aac +# +# ## Basic usage +# +# 1. Download and install CMake >= 3.10 (CMake >= 3.15 is recommended) +# 2. Clone fdk-aac repository +# 3. In fdk-aac directory create and go to `build` subdirectory: +# +# mkdir build +# cd build +# +# 4. Run cmake to configure project with desired build type (Release|Debug): +# +# cmake .. -DCMAKE_BUILD_TYPE=Release +# +# Note CMake configuration without CMAKE_BUILD_TYPE option will not set build +# type to some default and it is most likely is not what you want. +# +# If you want to build static (default is shared library), add BUILD_SHARED_LIBS=OFF option: +# +# # cmake .. -DBUILD_SHARED_LIBS=OFF +# +# You can combine options as well: +# +# cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF +# +# 5. Run cmake to build project: +# +# cmake --build . -c Release + +cmake_minimum_required(VERSION 3.5.1) + +# Policies + +## Enables CMAKE_MSVC_RUNTIME_LIBRARY option support for CMake >= 3.15 +## if you want to use a MSVC multi-threaded statically-linked runtime library +## If you enable it, CMake will build fdk-acc.dll without external dependencies. +## +## Example usage: +## +## cmake .. -DCMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded$<$:Debug> +if(POLICY CMP0091) + cmake_policy(SET CMP0091 NEW) +endif() + +project(fdk-aac VERSION 2.0.2) + +# Includes + +include(CheckFunctionExists) +include(CheckLibraryExists) +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +if(CMAKE_VERSION VERSION_LESS 3.11) + set(CPACK_PACKAGE_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}) + set(CPACK_PACKAGE_VERSION_MINOR ${PROJECT_VERSION_MINOR}) + set(CPACK_PACKAGE_VERSION_PATCH ${PROJECT_VERSION_PATCH}) +endif() +include(CPack) + +# Options + +option(BUILD_SHARED_LIBS "Build shared library" ON) +option(BUILD_PROGRAMS "Build aac-enc utility" OFF) +option(FDK_AAC_INSTALL_CMAKE_CONFIG_MODULE "Install CMake package configuration file" ON) +option(FDK_AAC_INSTALL_PKGCONFIG_MODULE "Install pkg-config .pc file" ON) + +# Checks + +## Check if math functions are in separate library (Most of Linux distros, maybe some other OSes) +check_function_exists(sin HAVE_DEFAULT_MATH) +if(NOT HAVE_DEFAULT_MATH) + check_library_exists(m sin "" HAVE_LIBM) +endif() + +# Library + +## Sources + +set(AACDEC_SRC + libAACdec/src/FDK_delay.cpp + libAACdec/src/aac_ram.cpp + libAACdec/src/aac_rom.cpp + libAACdec/src/aacdec_drc.cpp + libAACdec/src/aacdec_hcr.cpp + libAACdec/src/aacdec_hcr_bit.cpp + libAACdec/src/aacdec_hcrs.cpp + libAACdec/src/aacdec_pns.cpp + libAACdec/src/aacdec_tns.cpp + libAACdec/src/aacdecoder.cpp + libAACdec/src/aacdecoder_lib.cpp + libAACdec/src/block.cpp + libAACdec/src/channel.cpp + libAACdec/src/channelinfo.cpp + libAACdec/src/conceal.cpp + libAACdec/src/ldfiltbank.cpp + libAACdec/src/pulsedata.cpp + libAACdec/src/rvlc.cpp + libAACdec/src/rvlcbit.cpp + libAACdec/src/rvlcconceal.cpp + libAACdec/src/stereo.cpp + libAACdec/src/usacdec_ace_d4t64.cpp + libAACdec/src/usacdec_ace_ltp.cpp + libAACdec/src/usacdec_acelp.cpp + libAACdec/src/usacdec_fac.cpp + libAACdec/src/usacdec_lpc.cpp + libAACdec/src/usacdec_lpd.cpp + libAACdec/src/usacdec_rom.cpp + libAACdec/src/aac_ram.h + libAACdec/src/aac_rom.h + libAACdec/src/aacdec_drc.h + libAACdec/src/aacdec_drc_types.h + libAACdec/src/aacdec_hcr.h + libAACdec/src/aacdec_hcr_bit.h + libAACdec/src/aacdec_hcr_types.h + libAACdec/src/aacdec_hcrs.h + libAACdec/src/aacdec_pns.h + libAACdec/src/aacdec_tns.h + libAACdec/src/aacdecoder.h + libAACdec/src/block.h + libAACdec/src/channel.h + libAACdec/src/channelinfo.h + libAACdec/src/conceal.h + libAACdec/src/conceal_types.h + libAACdec/src/FDK_delay.h + libAACdec/src/ldfiltbank.h + libAACdec/src/overlapadd.h + libAACdec/src/pulsedata.h + libAACdec/src/rvlc.h + libAACdec/src/rvlc_info.h + libAACdec/src/rvlcbit.h + libAACdec/src/rvlcconceal.h + libAACdec/src/stereo.h + libAACdec/src/usacdec_ace_d4t64.h + libAACdec/src/usacdec_ace_ltp.h + libAACdec/src/usacdec_acelp.h + libAACdec/src/usacdec_const.h + libAACdec/src/usacdec_fac.h + libAACdec/src/usacdec_lpc.h + libAACdec/src/usacdec_lpd.h + libAACdec/src/usacdec_rom.h) + +set(AACENC_SRC + libAACenc/src/aacEnc_ram.cpp + libAACenc/src/aacEnc_rom.cpp + libAACenc/src/aacenc.cpp + libAACenc/src/aacenc_lib.cpp + libAACenc/src/aacenc_pns.cpp + libAACenc/src/aacenc_tns.cpp + libAACenc/src/adj_thr.cpp + libAACenc/src/band_nrg.cpp + libAACenc/src/bandwidth.cpp + libAACenc/src/bit_cnt.cpp + libAACenc/src/bitenc.cpp + libAACenc/src/block_switch.cpp + libAACenc/src/channel_map.cpp + libAACenc/src/chaosmeasure.cpp + libAACenc/src/dyn_bits.cpp + libAACenc/src/grp_data.cpp + libAACenc/src/intensity.cpp + libAACenc/src/line_pe.cpp + libAACenc/src/metadata_compressor.cpp + libAACenc/src/metadata_main.cpp + libAACenc/src/mps_main.cpp + libAACenc/src/ms_stereo.cpp + libAACenc/src/noisedet.cpp + libAACenc/src/pnsparam.cpp + libAACenc/src/pre_echo_control.cpp + libAACenc/src/psy_configuration.cpp + libAACenc/src/psy_main.cpp + libAACenc/src/qc_main.cpp + libAACenc/src/quantize.cpp + libAACenc/src/sf_estim.cpp + libAACenc/src/spreading.cpp + libAACenc/src/tonality.cpp + libAACenc/src/transform.cpp + libAACenc/src/aacenc.h + libAACenc/src/aacenc_pns.h + libAACenc/src/aacEnc_ram.h + libAACenc/src/aacEnc_rom.h + libAACenc/src/aacenc_tns.h + libAACenc/src/adj_thr.h + libAACenc/src/adj_thr_data.h + libAACenc/src/band_nrg.h + libAACenc/src/bandwidth.h + libAACenc/src/bit_cnt.h + libAACenc/src/bitenc.h + libAACenc/src/block_switch.h + libAACenc/src/channel_map.h + libAACenc/src/chaosmeasure.h + libAACenc/src/dyn_bits.h + libAACenc/src/grp_data.h + libAACenc/src/intensity.h + libAACenc/src/interface.h + libAACenc/src/line_pe.h + libAACenc/src/metadata_compressor.h + libAACenc/src/metadata_main.h + libAACenc/src/mps_main.h + libAACenc/src/ms_stereo.h + libAACenc/src/noisedet.h + libAACenc/src/pns_func.h + libAACenc/src/pnsparam.h + libAACenc/src/pre_echo_control.h + libAACenc/src/psy_configuration.h + libAACenc/src/psy_const.h + libAACenc/src/psy_data.h + libAACenc/src/psy_main.h + libAACenc/src/qc_data.h + libAACenc/src/qc_main.h + libAACenc/src/quantize.h + libAACenc/src/sf_estim.h + libAACenc/src/spreading.h + libAACenc/src/tns_func.h + libAACenc/src/tonality.h + libAACenc/src/transform.h) + +set(ARITHCODING_SRC + libArithCoding/src/ac_arith_coder.cpp) + +set(DRCDEC_SRC + libDRCdec/src/FDK_drcDecLib.cpp + libDRCdec/src/drcDec_gainDecoder.cpp + libDRCdec/src/drcDec_reader.cpp + libDRCdec/src/drcDec_rom.cpp + libDRCdec/src/drcDec_selectionProcess.cpp + libDRCdec/src/drcDec_tools.cpp + libDRCdec/src/drcGainDec_init.cpp + libDRCdec/src/drcGainDec_preprocess.cpp + libDRCdec/src/drcGainDec_process.cpp + libDRCdec/src/drcDec_gainDecoder.h + libDRCdec/src/drcDec_reader.h + libDRCdec/src/drcDec_rom.h + libDRCdec/src/drcDec_selectionProcess.h + libDRCdec/src/drcDec_tools.h + libDRCdec/src/drcDec_types.h + libDRCdec/src/drcDecoder.h + libDRCdec/src/drcGainDec_init.h + libDRCdec/src/drcGainDec_preprocess.h + libDRCdec/src/drcGainDec_process.h) + +set(FDK_SRC + libFDK/src/FDK_bitbuffer.cpp + libFDK/src/FDK_core.cpp + libFDK/src/FDK_crc.cpp + libFDK/src/FDK_decorrelate.cpp + libFDK/src/FDK_hybrid.cpp + libFDK/src/FDK_lpc.cpp + libFDK/src/FDK_matrixCalloc.cpp + libFDK/src/FDK_qmf_domain.cpp + libFDK/src/FDK_tools_rom.cpp + libFDK/src/FDK_trigFcts.cpp + libFDK/src/autocorr2nd.cpp + libFDK/src/dct.cpp + libFDK/src/fft.cpp + libFDK/src/fft_rad2.cpp + libFDK/src/fixpoint_math.cpp + libFDK/src/huff_nodes.cpp + libFDK/src/mdct.cpp + libFDK/src/nlc_dec.cpp + libFDK/src/qmf.cpp + libFDK/src/scale.cpp) + +set(MPEGTPDEC_SRC + libMpegTPDec/src/tpdec_adif.cpp + libMpegTPDec/src/tpdec_adts.cpp + libMpegTPDec/src/tpdec_asc.cpp + libMpegTPDec/src/tpdec_drm.cpp + libMpegTPDec/src/tpdec_latm.cpp + libMpegTPDec/src/tpdec_lib.cpp + libMpegTPDec/src/tp_version.h + libMpegTPDec/src/tpdec_adif.h + libMpegTPDec/src/tpdec_adts.h + libMpegTPDec/src/tpdec_drm.h + libMpegTPDec/src/tpdec_latm.h) + +set(MPEGTPENC_SRC + libMpegTPEnc/src/tpenc_adif.cpp + libMpegTPEnc/src/tpenc_adts.cpp + libMpegTPEnc/src/tpenc_asc.cpp + libMpegTPEnc/src/tpenc_latm.cpp + libMpegTPEnc/src/tpenc_lib.cpp + libMpegTPEnc/src/tp_version.h + libMpegTPEnc/src/tpenc_adif.h + libMpegTPEnc/src/tpenc_adts.h + libMpegTPEnc/src/tpenc_asc.h + libMpegTPEnc/src/tpenc_latm.h) + +set(PCMUTILS_SRC + libPCMutils/src/limiter.cpp + libPCMutils/src/pcm_utils.cpp + libPCMutils/src/pcmdmx_lib.cpp + libPCMutils/src/version.h) + +set(SACDEC_SRC + libSACdec/src/sac_bitdec.cpp + libSACdec/src/sac_calcM1andM2.cpp + libSACdec/src/sac_dec.cpp + libSACdec/src/sac_dec_conceal.cpp + libSACdec/src/sac_dec_lib.cpp + libSACdec/src/sac_process.cpp + libSACdec/src/sac_qmf.cpp + libSACdec/src/sac_reshapeBBEnv.cpp + libSACdec/src/sac_rom.cpp + libSACdec/src/sac_smoothing.cpp + libSACdec/src/sac_stp.cpp + libSACdec/src/sac_tsd.cpp + libSACdec/src/sac_bitdec.h + libSACdec/src/sac_calcM1andM2.h + libSACdec/src/sac_dec.h + libSACdec/src/sac_dec_conceal.h + libSACdec/src/sac_dec_interface.h + libSACdec/src/sac_dec_ssc_struct.h + libSACdec/src/sac_process.h + libSACdec/src/sac_qmf.h + libSACdec/src/sac_reshapeBBEnv.h + libSACdec/src/sac_rom.h + libSACdec/src/sac_smoothing.h + libSACdec/src/sac_stp.h + libSACdec/src/sac_tsd.h) + +set(SACENC_SRC + libSACenc/src/sacenc_bitstream.cpp + libSACenc/src/sacenc_delay.cpp + libSACenc/src/sacenc_dmx_tdom_enh.cpp + libSACenc/src/sacenc_filter.cpp + libSACenc/src/sacenc_framewindowing.cpp + libSACenc/src/sacenc_huff_tab.cpp + libSACenc/src/sacenc_lib.cpp + libSACenc/src/sacenc_nlc_enc.cpp + libSACenc/src/sacenc_onsetdetect.cpp + libSACenc/src/sacenc_paramextract.cpp + libSACenc/src/sacenc_staticgain.cpp + libSACenc/src/sacenc_tree.cpp + libSACenc/src/sacenc_vectorfunctions.cpp + libSACenc/src/sacenc_bitstream.h + libSACenc/src/sacenc_const.h + libSACenc/src/sacenc_delay.h + libSACenc/src/sacenc_dmx_tdom_enh.h + libSACenc/src/sacenc_filter.h + libSACenc/src/sacenc_framewindowing.h + libSACenc/src/sacenc_huff_tab.h + libSACenc/src/sacenc_nlc_enc.h + libSACenc/src/sacenc_onsetdetect.h + libSACenc/src/sacenc_paramextract.h + libSACenc/src/sacenc_staticgain.h + libSACenc/src/sacenc_tree.h + libSACenc/src/sacenc_vectorfunctions.h) + +set(SBRDEC_SRC + libSBRdec/src/HFgen_preFlat.cpp + libSBRdec/src/env_calc.cpp + libSBRdec/src/env_dec.cpp + libSBRdec/src/env_extr.cpp + libSBRdec/src/hbe.cpp + libSBRdec/src/huff_dec.cpp + libSBRdec/src/lpp_tran.cpp + libSBRdec/src/psbitdec.cpp + libSBRdec/src/psdec.cpp + libSBRdec/src/psdec_drm.cpp + libSBRdec/src/psdecrom_drm.cpp + libSBRdec/src/pvc_dec.cpp + libSBRdec/src/sbr_deb.cpp + libSBRdec/src/sbr_dec.cpp + libSBRdec/src/sbr_ram.cpp + libSBRdec/src/sbr_rom.cpp + libSBRdec/src/sbrdec_drc.cpp + libSBRdec/src/sbrdec_freq_sca.cpp + libSBRdec/src/sbrdecoder.cpp + libSBRdec/src/env_calc.h + libSBRdec/src/env_dec.h + libSBRdec/src/env_extr.h + libSBRdec/src/hbe.h + libSBRdec/src/HFgen_preFlat.h + libSBRdec/src/huff_dec.h + libSBRdec/src/lpp_tran.h + libSBRdec/src/psbitdec.h + libSBRdec/src/psdec.h + libSBRdec/src/psdec_drm.h + libSBRdec/src/pvc_dec.h + libSBRdec/src/sbr_deb.h + libSBRdec/src/sbr_dec.h + libSBRdec/src/sbr_ram.h + libSBRdec/src/sbr_rom.h + libSBRdec/src/sbrdec_drc.h + libSBRdec/src/sbrdec_freq_sca.h + libSBRdec/src/transcendent.h) + +set(SBRENC_SRC + libSBRenc/src/bit_sbr.cpp + libSBRenc/src/code_env.cpp + libSBRenc/src/env_bit.cpp + libSBRenc/src/env_est.cpp + libSBRenc/src/fram_gen.cpp + libSBRenc/src/invf_est.cpp + libSBRenc/src/mh_det.cpp + libSBRenc/src/nf_est.cpp + libSBRenc/src/ps_bitenc.cpp + libSBRenc/src/ps_encode.cpp + libSBRenc/src/ps_main.cpp + libSBRenc/src/resampler.cpp + libSBRenc/src/sbr_encoder.cpp + libSBRenc/src/sbr_misc.cpp + libSBRenc/src/sbrenc_freq_sca.cpp + libSBRenc/src/sbrenc_ram.cpp + libSBRenc/src/sbrenc_rom.cpp + libSBRenc/src/ton_corr.cpp + libSBRenc/src/tran_det.cpp + libSBRenc/src/bit_sbr.h + libSBRenc/src/cmondata.h + libSBRenc/src/code_env.h + libSBRenc/src/env_bit.h + libSBRenc/src/env_est.h + libSBRenc/src/fram_gen.h + libSBRenc/src/invf_est.h + libSBRenc/src/mh_det.h + libSBRenc/src/nf_est.h + libSBRenc/src/ps_bitenc.h + libSBRenc/src/ps_const.h + libSBRenc/src/ps_encode.h + libSBRenc/src/ps_main.h + libSBRenc/src/resampler.h + libSBRenc/src/sbr.h + libSBRenc/src/sbr_def.h + libSBRenc/src/sbr_misc.h + libSBRenc/src/sbrenc_freq_sca.h + libSBRenc/src/sbrenc_ram.h + libSBRenc/src/sbrenc_rom.h + libSBRenc/src/ton_corr.h + libSBRenc/src/tran_det.h) + +set(SYS_SRC + libSYS/src/genericStds.cpp + libSYS/src/syslib_channelMapDescr.cpp) + +set(fdk_aacinclude_HEADERS + libSYS/include/machine_type.h + libSYS/include/genericStds.h + libSYS/include/FDK_audio.h + libSYS/include/syslib_channelMapDescr.h + libAACenc/include/aacenc_lib.h + libAACdec/include/aacdecoder_lib.h) + +set(libfdk_aac_SOURCES + ${AACDEC_SRC} ${AACENC_SRC} + ${ARITHCODING_SRC} + ${DRCDEC_SRC} + ${MPEGTPDEC_SRC} ${MPEGTPENC_SRC} + ${SACDEC_SRC} ${SACENC_SRC} + ${SBRDEC_SRC} ${SBRENC_SRC} + ${PCMUTILS_SRC} ${FDK_SRC} ${SYS_SRC}) + +if(WIN32 AND BUILD_SHARED_LIBS) + set(libfdk_aac_SOURCES ${libfdk_aac_SOURCES} fdk-aac.def) +endif() + +## Create Library target. Actually fdk-aac is enough, but we also create +## FDK-AAC::fdk-aac for consistence with config-file package. + +add_library(fdk-aac ${libfdk_aac_SOURCES}) +add_library(FDK-AAC::fdk-aac ALIAS fdk-aac) + +## Library target configuration + +### Library target includes +target_include_directories(fdk-aac + PUBLIC + $ + $ + $ + $ + PRIVATE + libArithCoding/include + libDRCdec/include + libSACdec/include + libSACenc/include + libSBRdec/include + libSBRenc/include + libMpegTPDec/include + libMpegTPEnc/include + libFDK/include + libPCMutils/include) + +### Link math library if required +target_link_libraries(fdk-aac PRIVATE $<$:m>) + +### Set public headers and shared library version. Version info is critical for Unix-like OSes. +set_target_properties(fdk-aac PROPERTIES + PUBLIC_HEADER "${fdk_aacinclude_HEADERS}" + VERSION 2.0.2 + SOVERSION 2 + MACHO_COMPATIBILITY_VERSION 3.0.0 + MACHO_CURRENT_VERSION 3.2.0) + +### Some compiler options from Makefile.am +if(MSVC) + target_compile_options(fdk-aac PRIVATE /EHsc) +else() + target_compile_options(fdk-aac PRIVATE -fno-exceptions -fno-rtti) +endif() + +### Set proper name for MinGW or Cygwin DLL + +if((MINGW OR CYGWIN) AND BUILD_SHARED_LIBS) + set_property(TARGET fdk-aac PROPERTY RUNTIME_OUTPUT_NAME fdk-aac-2) +endif() + +## Library installation + +### Note we export `fdk-aac-targets` to use with config-file package. +install(TARGETS fdk-aac EXPORT fdk-aac-targets + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT BIN + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT DEV + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT DEV + PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/fdk-aac COMPONENT DEV) + +### Configure and install pkg-config module. +if(FDK_AAC_INSTALL_PKGCONFIG_MODULE) + set(prefix ${CMAKE_INSTALL_PREFIX}) + set(exec_prefix "\$\{prefix\}") + set(libdir "\$\{exec_prefix\}/${CMAKE_INSTALL_LIBDIR}") + set(includedir "\$\{prefix\}/${CMAKE_INSTALL_INCLUDEDIR}") + set(PACKAGE_VERSION ${PROJECT_VERSION}) + if(HAVE_LIBM) + if(BUILD_SHARED_LIBS) + set(LIBS_PRIVATE "-lm") + else() + set(LIBS_PUBLIC "-lm") + endif() + endif() + configure_file(fdk-aac.pc.in fdk-aac.pc @ONLY) + install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac.pc + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) +endif() + +### Configure and install config-file package. Something like pkg-config module, but for Windows. +if(FDK_AAC_INSTALL_CMAKE_CONFIG_MODULE) + + set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/fdk-aac) + + configure_package_config_file(fdk-aac-config.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac-config.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) + + if(CMAKE_VERSION VERSION_LESS 3.11) + write_basic_package_version_file(fdk-aac-config-version.cmake COMPATIBILITY SameMajorVersion) + else() + write_basic_package_version_file(fdk-aac-config-version.cmake COMPATIBILITY SameMinorVersion) + endif() + + install(EXPORT fdk-aac-targets + NAMESPACE FDK-AAC:: + DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) + install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac-config.cmake + ${CMAKE_CURRENT_BINARY_DIR}/fdk-aac-config-version.cmake + DESTINATION ${CMAKE_INSTALL_PACKAGEDIR}) + +endif() + +# Programs + +if(BUILD_PROGRAMS) + + ## Program sources + + set(aac_enc_SOURCES + aac-enc.c + wavreader.c + wavreader.h) + + ## Program target + add_executable(aac-enc ${aac_enc_SOURCES}) + + ## Program target configuration + target_link_libraries(aac-enc PRIVATE fdk-aac) + target_compile_definitions(aac-enc PRIVATE $<$:_CRT_SECURE_NO_WARNINGS>) + if(WIN32) + target_sources(aac-enc PRIVATE win32/getopt.h) + target_include_directories(aac-enc PRIVATE win32) + endif() + + ## Program target installation + install(TARGETS aac-enc RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +endif() diff -Nru fdk-aac-2.0.1/configure.ac fdk-aac-2.0.2/configure.ac --- fdk-aac-2.0.1/configure.ac 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/configure.ac 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ dnl -*- Autoconf -*- dnl Process this file with autoconf to produce a configure script. -AC_INIT([fdk-aac], [2.0.1], [http://sourceforge.net/projects/opencore-amr/]) +AC_INIT([fdk-aac], [2.0.2], [http://sourceforge.net/projects/opencore-amr/]) AC_CONFIG_AUX_DIR(.) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE([tar-ustar foreign]) @@ -26,7 +26,7 @@ dnl soname version to use dnl goes by ‘current[:revision[:age]]’ with the soname ending up as dnl current.age.revision -FDK_AAC_VERSION=2:1:0 +FDK_AAC_VERSION=2:2:0 AS_IF([test x$enable_shared = xyes], [LIBS_PRIVATE=$LIBS], [LIBS_PUBLIC=$LIBS]) AC_SUBST(FDK_AAC_VERSION) diff -Nru fdk-aac-2.0.1/debian/changelog fdk-aac-2.0.2/debian/changelog --- fdk-aac-2.0.1/debian/changelog 2020-03-18 19:53:14.000000000 +0000 +++ fdk-aac-2.0.2/debian/changelog 2021-09-23 22:20:49.000000000 +0000 @@ -1,3 +1,13 @@ +fdk-aac (2.0.2-1) unstable; urgency=medium + + * Team upload + * New upstream release + * debian/control: Bump Standards-Version + * debian/: Bump debhelper compat to 13 + * debian/copyright: Update copyright years + + -- Sebastian Ramacher Fri, 24 Sep 2021 00:20:49 +0200 + fdk-aac (2.0.1-1) unstable; urgency=medium * Team upload. diff -Nru fdk-aac-2.0.1/debian/control fdk-aac-2.0.2/debian/control --- fdk-aac-2.0.1/debian/control 2020-03-18 19:45:00.000000000 +0000 +++ fdk-aac-2.0.2/debian/control 2021-09-23 22:15:06.000000000 +0000 @@ -4,8 +4,8 @@ Maintainer: Debian Multimedia Maintainers Uploaders: Romain Beauxis Homepage: https://github.com/mstorsjo/fdk-aac -Standards-Version: 4.5.0 -Build-Depends: debhelper-compat (= 12) +Standards-Version: 4.6.0 +Build-Depends: debhelper-compat (= 13) Vcs-Git: https://salsa.debian.org/multimedia-team/fdk-aac.git Vcs-Browser: https://salsa.debian.org/multimedia-team/fdk-aac XS-Autobuild: yes diff -Nru fdk-aac-2.0.1/debian/copyright fdk-aac-2.0.2/debian/copyright --- fdk-aac-2.0.1/debian/copyright 2020-03-15 20:01:38.000000000 +0000 +++ fdk-aac-2.0.2/debian/copyright 2021-09-23 22:16:30.000000000 +0000 @@ -4,12 +4,15 @@ Files: * Copyright: - 1995 - 2015 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e. V. + 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e. V. License: Fraunhofer-FDK-AAC-for-Android -Files: aac-enc.* wavreader.* +Files: aac-enc.* + wavreader.* + fuzzer/* Copyright: 2009, 2011 Martin Storsjo + 2020, The Android Open Source Project License: Apache-2.0 Files: debian/* diff -Nru fdk-aac-2.0.1/debian/not-installed fdk-aac-2.0.2/debian/not-installed --- fdk-aac-2.0.1/debian/not-installed 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/debian/not-installed 2021-09-23 22:19:10.000000000 +0000 @@ -0,0 +1 @@ +usr/lib/*/*.la Binary files /tmp/tmp9x8bf9ou/na2F4qR4fN/fdk-aac-2.0.1/documentation/aacDecoder.pdf and /tmp/tmp9x8bf9ou/2IwCyKJoOz/fdk-aac-2.0.2/documentation/aacDecoder.pdf differ Binary files /tmp/tmp9x8bf9ou/na2F4qR4fN/fdk-aac-2.0.1/documentation/aacEncoder.pdf and /tmp/tmp9x8bf9ou/2IwCyKJoOz/fdk-aac-2.0.2/documentation/aacEncoder.pdf differ diff -Nru fdk-aac-2.0.1/fdk-aac-config.cmake.in fdk-aac-2.0.2/fdk-aac-config.cmake.in --- fdk-aac-2.0.1/fdk-aac-config.cmake.in 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/fdk-aac-config.cmake.in 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,5 @@ +@PACKAGE_INIT@ + +include(${CMAKE_CURRENT_LIST_DIR}/fdk-aac-targets.cmake) + +check_required_components(FDK-AAC) diff -Nru fdk-aac-2.0.1/fdk-aac.def fdk-aac-2.0.2/fdk-aac.def --- fdk-aac-2.0.1/fdk-aac.def 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/fdk-aac.def 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,19 @@ +EXPORTS + aacDecoder_AncDataGet + aacDecoder_AncDataInit + aacDecoder_Close + aacDecoder_ConfigRaw + aacDecoder_DecodeFrame + aacDecoder_Fill + aacDecoder_GetFreeBytes + aacDecoder_GetLibInfo + aacDecoder_GetStreamInfo + aacDecoder_Open + aacDecoder_SetParam + aacEncClose + aacEncEncode + aacEncGetLibInfo + aacEncInfo + aacEncOpen + aacEncoder_GetParam + aacEncoder_SetParam diff -Nru fdk-aac-2.0.1/fuzzer/aac_dec_fuzzer.cpp fdk-aac-2.0.2/fuzzer/aac_dec_fuzzer.cpp --- fdk-aac-2.0.1/fuzzer/aac_dec_fuzzer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/fuzzer/aac_dec_fuzzer.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,140 @@ +/****************************************************************************** + * + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore + */ + +#include +#include +#include +#include "aacdecoder_lib.h" + +constexpr uint8_t kNumberOfLayers = 1; +constexpr uint8_t kMaxChannelCount = 8; +constexpr uint32_t kMaxConfigurationSize = 1024; +constexpr uint32_t kMaxOutBufferSize = 2048 * kMaxChannelCount; + +// Value indicating the start of AAC Header Segment +constexpr const char *kAacSegStartSeq = "AAC_STRT"; +constexpr uint8_t kAacSegStartSeqLen = sizeof(kAacSegStartSeq); +// Value indicating the end of AAC Header Segment +constexpr const char *kAacSegEndSeq = "AAC_ENDS"; +constexpr uint8_t kAacSegEndSeqLen = sizeof(kAacSegEndSeq); + +// Number of bytes used to signal the length of the header +constexpr uint8_t kHeaderLengthBytes = 2; +// Minimum size of an AAC header is 2 +// Minimum data required is +// strlen(AAC_STRT) + strlen(AAC_ENDS) + kHeaderLengthBytes + 2; +constexpr UINT kMinDataSize = kAacSegStartSeqLen + kAacSegEndSeqLen + kHeaderLengthBytes + 2; + +UINT getHeaderSize(UCHAR *data, UINT size) { + if (size < kMinDataSize) { + return 0; + } + + int32_t result = memcmp(data, kAacSegStartSeq, kAacSegStartSeqLen); + if (result) { + return 0; + } + data += kAacSegStartSeqLen; + size -= kAacSegStartSeqLen; + + uint32_t headerLengthInBytes = (data[0] << 8 | data[1]) & 0xFFFF; + data += kHeaderLengthBytes; + size -= kHeaderLengthBytes; + + if (headerLengthInBytes + kAacSegEndSeqLen > size) { + return 0; + } + + data += headerLengthInBytes; + size -= headerLengthInBytes; + result = memcmp(data, kAacSegEndSeq, kAacSegEndSeqLen); + if (result) { + return 0; + } + + return std::min(headerLengthInBytes, kMaxConfigurationSize); +} + +class Codec { + public: + Codec() = default; + ~Codec() { deInitDecoder(); } + bool initDecoder(); + void decodeFrames(UCHAR *data, UINT size); + void deInitDecoder(); + + private: + HANDLE_AACDECODER mAacDecoderHandle = nullptr; + AAC_DECODER_ERROR mErrorCode = AAC_DEC_OK; +}; + +bool Codec::initDecoder() { + mAacDecoderHandle = aacDecoder_Open(TT_MP4_ADIF, kNumberOfLayers); + if (!mAacDecoderHandle) { + return false; + } + return true; +} + +void Codec::deInitDecoder() { + aacDecoder_Close(mAacDecoderHandle); + mAacDecoderHandle = nullptr; +} + +void Codec::decodeFrames(UCHAR *data, UINT size) { + UINT headerSize = getHeaderSize(data, size); + if (headerSize != 0) { + data += kAacSegStartSeqLen + kHeaderLengthBytes; + size -= kAacSegStartSeqLen + kHeaderLengthBytes; + aacDecoder_ConfigRaw(mAacDecoderHandle, &data, &headerSize); + data += headerSize + kAacSegEndSeqLen; + size -= headerSize + kAacSegEndSeqLen; + } + while (size > 0) { + UINT inputSize = size; + UINT valid = size; + mErrorCode = aacDecoder_Fill(mAacDecoderHandle, &data, &inputSize, &valid); + if (mErrorCode != AAC_DEC_OK) { + ++data; + --size; + } else { + INT_PCM outputBuf[kMaxOutBufferSize]; + do { + mErrorCode = + aacDecoder_DecodeFrame(mAacDecoderHandle, outputBuf, sizeof(outputBuf), 0); + } while (mErrorCode == AAC_DEC_OK); + UINT offset = inputSize - valid; + data += offset; + size = valid; + } + } +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + Codec *codec = new Codec(); + if (!codec) { + return 0; + } + if (codec->initDecoder()) { + codec->decodeFrames((UCHAR *)(data), static_cast(size)); + } + delete codec; + return 0; +} diff -Nru fdk-aac-2.0.1/fuzzer/aac_enc_fuzzer.cpp fdk-aac-2.0.2/fuzzer/aac_enc_fuzzer.cpp --- fdk-aac-2.0.1/fuzzer/aac_enc_fuzzer.cpp 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/fuzzer/aac_enc_fuzzer.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,479 @@ +/****************************************************************************** + * + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore + */ + +#include +#include "aacenc_lib.h" +#include "src/aacenc.h" + +using namespace std; + +// IN_AUDIO_DATA, IN_ANCILLRY_DATA and IN_METADATA_SETUP +constexpr size_t kMaxBuffers = 3; + +constexpr size_t kMaxOutputBufferSize = 8192; + +constexpr uint32_t kMinBitRate = 8000; +constexpr uint32_t kMaxBitRate = 960000; + +constexpr int32_t kSampleRates[] = {8000, 11025, 12000, 16000, 22050, 24000, + 32000, 44100, 48000, 64000, 88200, 96000}; +constexpr size_t kSampleRatesSize = size(kSampleRates); + +constexpr CHANNEL_MODE kChannelModes[] = {MODE_1, + MODE_2, + MODE_1_2, + MODE_1_2_1, + MODE_1_2_2, + MODE_1_2_2_1, + MODE_1_2_2_2_1, + MODE_6_1, + MODE_7_1_BACK, + MODE_7_1_TOP_FRONT, + MODE_7_1_REAR_SURROUND, + MODE_7_1_FRONT_CENTER, + MODE_212}; +constexpr size_t kChannelModesSize = size(kChannelModes); + +constexpr TRANSPORT_TYPE kIdentifiers[] = { + TT_MP4_RAW, TT_MP4_ADIF, TT_MP4_ADTS, TT_MP4_LATM_MCP1, TT_MP4_LATM_MCP0, TT_MP4_LOAS, TT_DRM}; +constexpr size_t kIdentifiersSize = size(kIdentifiers); + +constexpr AUDIO_OBJECT_TYPE kAudioObjectTypes[] = {AOT_NONE, AOT_NULL_OBJECT, + AOT_AAC_MAIN, AOT_AAC_LC, + AOT_AAC_SSR, AOT_AAC_LTP, + AOT_SBR, AOT_AAC_SCAL, + AOT_TWIN_VQ, AOT_CELP, + AOT_HVXC, AOT_RSVD_10, + AOT_RSVD_11, AOT_TTSI, + AOT_MAIN_SYNTH, AOT_WAV_TAB_SYNTH, + AOT_GEN_MIDI, AOT_ALG_SYNTH_AUD_FX, + AOT_ER_AAC_LC, AOT_RSVD_18, + AOT_ER_AAC_LTP, AOT_ER_AAC_SCAL, + AOT_ER_TWIN_VQ, AOT_ER_BSAC, + AOT_ER_AAC_LD, AOT_ER_CELP, + AOT_ER_HVXC, AOT_ER_HILN, + AOT_ER_PARA, AOT_RSVD_28, + AOT_PS, AOT_MPEGS, + AOT_ESCAPE, AOT_MP3ONMP4_L1, + AOT_MP3ONMP4_L2, AOT_MP3ONMP4_L3, + AOT_RSVD_35, AOT_RSVD_36, + AOT_AAC_SLS, AOT_SLS, + AOT_ER_AAC_ELD, AOT_USAC, + AOT_SAOC, AOT_LD_MPEGS, + AOT_MP2_AAC_LC, AOT_MP2_SBR, + AOT_DRM_AAC, AOT_DRM_SBR, + AOT_DRM_MPEG_PS, AOT_DRM_SURROUND, + AOT_DRM_USAC}; + +constexpr size_t kAudioObjectTypesSize = size(kAudioObjectTypes); + +constexpr int32_t kSbrRatios[] = {-1, 0, 1, 2}; +constexpr size_t kSbrRatiosSize = size(kSbrRatios); + +constexpr int32_t kBitRateModes[] = { + AACENC_BR_MODE_INVALID, AACENC_BR_MODE_CBR, AACENC_BR_MODE_VBR_1, + AACENC_BR_MODE_VBR_2, AACENC_BR_MODE_VBR_3, AACENC_BR_MODE_VBR_4, + AACENC_BR_MODE_VBR_5, AACENC_BR_MODE_FF, AACENC_BR_MODE_SFR}; +constexpr size_t kBitRateModesSize = size(kBitRateModes); + +constexpr int32_t kGranuleLengths[] = {120, 128, 240, 256, 480, 512, 1024}; +constexpr size_t kGranuleLengthsSize = size(kGranuleLengths); + +constexpr int32_t kChannelOrder[] = {CH_ORDER_MPEG, CH_ORDER_WAV}; +constexpr size_t kChannelOrderSize = size(kChannelOrder); + +constexpr int32_t kSignalingModes[] = {-1, 0, 1, 2, 3}; +constexpr size_t kSignalingModesSize = size(kSignalingModes); + +constexpr int32_t kAudioMuxVer[] = {-1, 0, 1, 2}; +constexpr size_t kAudioMuxVerSize = size(kAudioMuxVer); + +constexpr int32_t kSbrModes[] = {-1, 0, 1, 2}; +constexpr size_t kSbrModesSize = size(kSbrModes); + +constexpr AACENC_METADATA_DRC_PROFILE kMetaDataDrcProfiles[] = { + AACENC_METADATA_DRC_NONE, AACENC_METADATA_DRC_FILMSTANDARD, + AACENC_METADATA_DRC_FILMLIGHT, AACENC_METADATA_DRC_MUSICSTANDARD, + AACENC_METADATA_DRC_MUSICLIGHT, AACENC_METADATA_DRC_SPEECH, + AACENC_METADATA_DRC_NOT_PRESENT}; +constexpr size_t kMetaDataDrcProfilesSize = size(kMetaDataDrcProfiles); + +enum { + IDX_SBR_MODE = 0, + IDX_AAC_AOT, + IDX_SAMPLE_RATE, + IDX_BIT_RATE_1, + IDX_BIT_RATE_2, + IDX_BIT_RATE_3, + IDX_CHANNEL, + IDX_IDENTIFIER, + IDX_SBR_RATIO, + IDX_METADATA_DRC_PROFILE, + IDX_METADATA_COMP_PROFILE, + IDX_METADATA_DRC_TARGET_REF_LEVEL, + IDX_METADATA_COMP_TARGET_REF_LEVEL, + IDX_METADATA_PROG_LEVEL_PRESENT, + IDX_METADATA_PROG_LEVEL, + IDX_METADATA_PCE_MIXDOWN_IDX_PRESENT, + IDX_METADATA_ETSI_DMXLVL_PRESENT, + IDX_METADATA_CENTER_MIX_LEVEL, + IDX_METADATA_SURROUND_MIX_LEVEL, + IDX_METADATA_DOLBY_SURROUND_MODE, + IDX_METADATA_DRC_PRESENTATION_MODE, + IDX_METADATA_EXT_ANC_DATA_ENABLE, + IDX_METADATA_EXT_DOWNMIX_LEVEL_ENABLE, + IDX_METADATA_EXT_DOWNMIX_LEVEL_A, + IDX_METADATA_EXT_DOWNMIX_LEVEL_B, + IDX_METADATA_DMX_GAIN_ENABLE, + IDX_METADATA_DMX_GAIN_5, + IDX_METADATA_DMX_GAIN_2, + IDX_METADATA_LFE_DMX_ENABLE, + IDX_METADATA_LFE_DMX_LEVEL, + IDX_IN_BUFFER_INDEX_1, + IDX_IN_BUFFER_INDEX_2, + IDX_IN_BUFFER_INDEX_3, + IDX_BIT_RATE_MODE, + IDX_GRANULE_LENGTH, + IDX_CHANNELORDER, + IDX_AFTERBURNER, + IDX_BANDWIDTH, + IDX_PEAK_BITRATE, + IDX_HEADER_PERIOD, + IDX_SIGNALING_MODE, + IDX_TPSUBFRAMES, + IDX_AUDIOMUXVER, + IDX_PROTECTION, + IDX_ANCILLARY_BITRATE, + IDX_METADATA_MODE, + IDX_LAST +}; + +template +auto generateNumberInRangeFromData(type1 data, type2 min, type3 max) -> decltype(max) { + return (data % (1 + max - min)) + min; +} + +class Codec { + public: + ~Codec() { deInitEncoder(); } + bool initEncoder(uint8_t **dataPtr, size_t *sizePtr); + void encodeFrames(const uint8_t *data, size_t size); + void deInitEncoder(); + + private: + template + void setAACParam(type1 data, const AACENC_PARAM aacParam, type2 min, type2 max, + const type3 *array = nullptr); + void setupMetaData(uint8_t *data); + + HANDLE_AACENCODER mEncoder = nullptr; + AACENC_MetaData mMetaData = {}; + uint32_t mInBufferIdx_1 = 0; + uint32_t mInBufferIdx_2 = 0; + uint32_t mInBufferIdx_3 = 0; +}; + +void Codec::setupMetaData(uint8_t *data) { + uint32_t drcProfileIndex = generateNumberInRangeFromData(data[IDX_METADATA_DRC_PROFILE], 0, + kMetaDataDrcProfilesSize - 1); + AACENC_METADATA_DRC_PROFILE drcProfile = kMetaDataDrcProfiles[drcProfileIndex]; + mMetaData.drc_profile = drcProfile; + + uint32_t compProfileIndex = generateNumberInRangeFromData(data[IDX_METADATA_COMP_PROFILE], 0, + kMetaDataDrcProfilesSize - 1); + AACENC_METADATA_DRC_PROFILE compProfile = kMetaDataDrcProfiles[compProfileIndex]; + mMetaData.comp_profile = compProfile; + + INT drcTargetRefLevel = + generateNumberInRangeFromData(data[IDX_METADATA_DRC_TARGET_REF_LEVEL], 0, UINT8_MAX); + mMetaData.drc_TargetRefLevel = drcTargetRefLevel; + + INT compTargetRefLevel = + generateNumberInRangeFromData(data[IDX_METADATA_COMP_TARGET_REF_LEVEL], 0, UINT8_MAX); + mMetaData.comp_TargetRefLevel = compTargetRefLevel; + + INT isProgRefLevelPresent = + generateNumberInRangeFromData(data[IDX_METADATA_PROG_LEVEL_PRESENT], 0, 1); + mMetaData.prog_ref_level_present = isProgRefLevelPresent; + + INT progRefLevel = generateNumberInRangeFromData(data[IDX_METADATA_PROG_LEVEL], 0, UINT8_MAX); + mMetaData.prog_ref_level = progRefLevel; + + UCHAR isPCEMixdownIdxPresent = + generateNumberInRangeFromData(data[IDX_METADATA_PCE_MIXDOWN_IDX_PRESENT], 0, 1); + mMetaData.PCE_mixdown_idx_present = isPCEMixdownIdxPresent; + + UCHAR isETSIDmxLvlPresent = + generateNumberInRangeFromData(data[IDX_METADATA_ETSI_DMXLVL_PRESENT], 0, 1); + mMetaData.ETSI_DmxLvl_present = isETSIDmxLvlPresent; + + SCHAR centerMixLevel = generateNumberInRangeFromData(data[IDX_METADATA_CENTER_MIX_LEVEL], 0, 7); + mMetaData.centerMixLevel = centerMixLevel; + + SCHAR surroundMixLevel = + generateNumberInRangeFromData(data[IDX_METADATA_SURROUND_MIX_LEVEL], 0, 7); + mMetaData.surroundMixLevel = surroundMixLevel; + + UCHAR dolbySurroundMode = + generateNumberInRangeFromData(data[IDX_METADATA_DOLBY_SURROUND_MODE], 0, 2); + mMetaData.dolbySurroundMode = dolbySurroundMode; + + UCHAR drcPresentationMode = + generateNumberInRangeFromData(data[IDX_METADATA_DRC_PRESENTATION_MODE], 0, 2); + mMetaData.drcPresentationMode = drcPresentationMode; + + UCHAR extAncDataEnable = + generateNumberInRangeFromData(data[IDX_METADATA_EXT_ANC_DATA_ENABLE], 0, 1); + mMetaData.ExtMetaData.extAncDataEnable = extAncDataEnable; + + UCHAR extDownmixLevelEnable = + generateNumberInRangeFromData(data[IDX_METADATA_EXT_DOWNMIX_LEVEL_ENABLE], 0, 1); + mMetaData.ExtMetaData.extDownmixLevelEnable = extDownmixLevelEnable; + + UCHAR extDownmixLevel_A = + generateNumberInRangeFromData(data[IDX_METADATA_EXT_DOWNMIX_LEVEL_A], 0, 7); + mMetaData.ExtMetaData.extDownmixLevel_A = extDownmixLevel_A; + + UCHAR extDownmixLevel_B = + generateNumberInRangeFromData(data[IDX_METADATA_EXT_DOWNMIX_LEVEL_B], 0, 7); + mMetaData.ExtMetaData.extDownmixLevel_B = extDownmixLevel_B; + + UCHAR dmxGainEnable = generateNumberInRangeFromData(data[IDX_METADATA_DMX_GAIN_ENABLE], 0, 1); + mMetaData.ExtMetaData.dmxGainEnable = dmxGainEnable; + + INT dmxGain5 = generateNumberInRangeFromData(data[IDX_METADATA_DMX_GAIN_5], 0, UINT8_MAX); + mMetaData.ExtMetaData.dmxGain5 = dmxGain5; + + INT dmxGain2 = generateNumberInRangeFromData(data[IDX_METADATA_DMX_GAIN_2], 0, UINT8_MAX); + mMetaData.ExtMetaData.dmxGain2 = dmxGain2; + + UCHAR lfeDmxEnable = generateNumberInRangeFromData(data[IDX_METADATA_LFE_DMX_ENABLE], 0, 1); + mMetaData.ExtMetaData.lfeDmxEnable = lfeDmxEnable; + + UCHAR lfeDmxLevel = generateNumberInRangeFromData(data[IDX_METADATA_LFE_DMX_LEVEL], 0, 15); + mMetaData.ExtMetaData.lfeDmxLevel = lfeDmxLevel; +} + +template +void Codec::setAACParam(type1 data, const AACENC_PARAM aacParam, type2 min, type2 max, + const type3 *array) { + auto value = 0; + if (array) { + uint32_t index = generateNumberInRangeFromData(data, min, max); + value = array[index]; + } else { + value = generateNumberInRangeFromData(data, min, max); + } + aacEncoder_SetParam(mEncoder, aacParam, value); + (void)aacEncoder_GetParam(mEncoder, aacParam); +} + +bool Codec::initEncoder(uint8_t **dataPtr, size_t *sizePtr) { + uint8_t *data = *dataPtr; + + if (AACENC_OK != aacEncOpen(&mEncoder, 0, 0)) { + return false; + } + + setAACParam(data[IDX_SBR_MODE], AACENC_SBR_MODE, 0, kSbrModesSize - 1, + kSbrModes); + + setAACParam(data[IDX_SBR_RATIO], AACENC_SBR_RATIO, 0, + kSbrRatiosSize - 1, kSbrRatios); + + setAACParam(data[IDX_AAC_AOT], AACENC_AOT, 0, + kAudioObjectTypesSize - 1, kAudioObjectTypes); + + setAACParam(data[IDX_SAMPLE_RATE], AACENC_SAMPLERATE, 0, + kSampleRatesSize - 1, kSampleRates); + + uint32_t tempValue = + (data[IDX_BIT_RATE_1] << 16) | (data[IDX_BIT_RATE_2] << 8) | data[IDX_BIT_RATE_3]; + setAACParam(tempValue, AACENC_BITRATE, kMinBitRate, kMaxBitRate); + + setAACParam(data[IDX_CHANNEL], AACENC_CHANNELMODE, 0, + kChannelModesSize - 1, kChannelModes); + + setAACParam(data[IDX_IDENTIFIER], AACENC_TRANSMUX, 0, + kIdentifiersSize - 1, kIdentifiers); + + setAACParam(data[IDX_BIT_RATE_MODE], AACENC_BITRATEMODE, 0, + kBitRateModesSize - 1, kBitRateModes); + + setAACParam(data[IDX_GRANULE_LENGTH], AACENC_GRANULE_LENGTH, 0, + kGranuleLengthsSize - 1, kGranuleLengths); + + setAACParam(data[IDX_CHANNELORDER], AACENC_CHANNELORDER, 0, + kChannelOrderSize - 1, kChannelOrder); + + setAACParam(data[IDX_AFTERBURNER], AACENC_AFTERBURNER, 0, 1); + + setAACParam(data[IDX_BANDWIDTH], AACENC_BANDWIDTH, 0, 1); + + setAACParam(data[IDX_PEAK_BITRATE], AACENC_PEAK_BITRATE, + kMinBitRate, kMinBitRate); + + setAACParam(data[IDX_HEADER_PERIOD], AACENC_HEADER_PERIOD, 0, + UINT8_MAX); + + setAACParam(data[IDX_SIGNALING_MODE], AACENC_SIGNALING_MODE, 0, + kSignalingModesSize - 1, kSignalingModes); + + setAACParam(data[IDX_TPSUBFRAMES], AACENC_TPSUBFRAMES, 0, + UINT8_MAX); + + setAACParam(data[IDX_AUDIOMUXVER], AACENC_AUDIOMUXVER, 0, + kAudioMuxVerSize - 1, kAudioMuxVer); + + setAACParam(data[IDX_PROTECTION], AACENC_PROTECTION, 0, 1); + + setAACParam(data[IDX_ANCILLARY_BITRATE], AACENC_ANCILLARY_BITRATE, + 0, kMaxBitRate); + + setAACParam(data[IDX_METADATA_MODE], AACENC_METADATA_MODE, 0, 3); + + AACENC_InfoStruct encInfo; + aacEncInfo(mEncoder, &encInfo); + + mInBufferIdx_1 = generateNumberInRangeFromData(data[IDX_IN_BUFFER_INDEX_1], 0, kMaxBuffers - 1); + mInBufferIdx_2 = generateNumberInRangeFromData(data[IDX_IN_BUFFER_INDEX_2], 0, kMaxBuffers - 1); + mInBufferIdx_3 = generateNumberInRangeFromData(data[IDX_IN_BUFFER_INDEX_3], 0, kMaxBuffers - 1); + + setupMetaData(data); + + // Not re-using the data which was used for configuration for encoding + *dataPtr += IDX_LAST; + *sizePtr -= IDX_LAST; + + return true; +} + +static void deleteBuffers(uint8_t **buffers, size_t size) { + for (size_t n = 0; n < size; ++n) { + delete[] buffers[n]; + } + delete[] buffers; +} + +void Codec::encodeFrames(const uint8_t *data, size_t size) { + uint8_t *audioData = (uint8_t *)data; + uint8_t *ancData = (uint8_t *)data; + size_t audioSize = size; + size_t ancSize = size; + + while ((audioSize > 0) && (ancSize > 0)) { + AACENC_InArgs inargs; + memset(&inargs, 0, sizeof(inargs)); + inargs.numInSamples = audioSize / sizeof(int16_t); + inargs.numAncBytes = ancSize; + + void *buffers[] = {(void *)audioData, (void *)ancData, &mMetaData}; + INT bufferIds[] = {IN_AUDIO_DATA, IN_ANCILLRY_DATA, IN_METADATA_SETUP}; + INT bufferSizes[] = {static_cast(audioSize), static_cast(ancSize), + static_cast(sizeof(mMetaData))}; + INT bufferElSizes[] = {sizeof(int16_t), sizeof(UCHAR), sizeof(AACENC_MetaData)}; + + void *inBuffer[kMaxBuffers] = {}; + INT inBufferIds[kMaxBuffers] = {}; + INT inBufferSize[kMaxBuffers] = {}; + INT inBufferElSize[kMaxBuffers] = {}; + for (int32_t buffer = 0; buffer < kMaxBuffers; ++buffer) { + uint32_t Idxs[] = {mInBufferIdx_1, mInBufferIdx_2, mInBufferIdx_3}; + inBuffer[buffer] = buffers[Idxs[buffer]]; + inBufferIds[buffer] = bufferIds[Idxs[buffer]]; + inBufferSize[buffer] = bufferSizes[Idxs[buffer]]; + inBufferElSize[buffer] = bufferElSizes[Idxs[buffer]]; + } + + AACENC_BufDesc inBufDesc; + inBufDesc.numBufs = kMaxBuffers; + inBufDesc.bufs = (void **)&inBuffer; + inBufDesc.bufferIdentifiers = inBufferIds; + inBufDesc.bufSizes = inBufferSize; + inBufDesc.bufElSizes = inBufferElSize; + + uint8_t **outPtrRef = new uint8_t *[kMaxBuffers]; + for (int32_t buffer = 0; buffer < kMaxBuffers; ++buffer) { + outPtrRef[buffer] = new uint8_t[kMaxOutputBufferSize]; + } + + void *outBuffer[kMaxBuffers]; + INT outBufferIds[kMaxBuffers]; + INT outBufferSize[kMaxBuffers]; + INT outBufferElSize[kMaxBuffers]; + + for (int32_t buffer = 0; buffer < kMaxBuffers; ++buffer) { + outBuffer[buffer] = outPtrRef[buffer]; + outBufferIds[buffer] = OUT_BITSTREAM_DATA; + outBufferSize[buffer] = (INT)kMaxOutputBufferSize; + outBufferElSize[buffer] = sizeof(UCHAR); + } + + AACENC_BufDesc outBufDesc; + outBufDesc.numBufs = kMaxBuffers; + outBufDesc.bufs = (void **)&outBuffer; + outBufDesc.bufferIdentifiers = outBufferIds; + outBufDesc.bufSizes = outBufferSize; + outBufDesc.bufElSizes = outBufferElSize; + + AACENC_OutArgs outargs = {}; + aacEncEncode(mEncoder, &inBufDesc, &outBufDesc, &inargs, &outargs); + + if (outargs.numOutBytes == 0) { + if (audioSize > 0) { + ++audioData; + --audioSize; + } + if (ancSize > 0) { + ++ancData; + --ancSize; + } + } else { + size_t audioConsumed = outargs.numInSamples * sizeof(int16_t); + audioData += audioConsumed; + audioSize -= audioConsumed; + + size_t ancConsumed = outargs.numAncBytes; + ancData += ancConsumed; + ancSize -= ancConsumed; + } + deleteBuffers(outPtrRef, kMaxBuffers); + + // break out of loop if only metadata was sent in all the input buffers + // as sending it multiple times in a loop is redundant. + if ((mInBufferIdx_1 == kMaxBuffers - 1) && (mInBufferIdx_2 == kMaxBuffers - 1) && + (mInBufferIdx_3 == kMaxBuffers - 1)) { + break; + } + } +} + +void Codec::deInitEncoder() { aacEncClose(&mEncoder); } + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + if (size < IDX_LAST) { + return 0; + } + Codec encoder; + if (encoder.initEncoder(const_cast(&data), &size)) { + encoder.encodeFrames(data, size); + } + return 0; +} diff -Nru fdk-aac-2.0.1/fuzzer/Android.bp fdk-aac-2.0.2/fuzzer/Android.bp --- fdk-aac-2.0.1/fuzzer/Android.bp 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/fuzzer/Android.bp 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,82 @@ +/****************************************************************************** + * + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ***************************************************************************** + * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore + */ + +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "external_aac_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["external_aac_license"], +} + +cc_defaults { + name: "aac_fuzz_defaults", + host_supported: true, + + static_libs: [ + "libFraunhoferAAC", + ], + + target: { + darwin: { + enabled: false, + }, + }, + + fuzz_config: { + cc: [ + "android-media-fuzzing-reports@google.com", + ], + componentid: 155276, + }, +} + +cc_fuzz { + name: "aac_dec_fuzzer", + + srcs: [ + "aac_dec_fuzzer.cpp", + ], + + static_libs: [ + "liblog", + ], + + defaults: [ + "aac_fuzz_defaults" + ], +} + +cc_fuzz { + name: "aac_enc_fuzzer", + + srcs: [ + "aac_enc_fuzzer.cpp", + ], + + defaults: [ + "aac_fuzz_defaults" + ], + + include_dirs: [ + "external/aac/libAACenc/" + ], +} diff -Nru fdk-aac-2.0.1/fuzzer/README.md fdk-aac-2.0.2/fuzzer/README.md --- fdk-aac-2.0.1/fuzzer/README.md 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/fuzzer/README.md 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,150 @@ +# Fuzzer for libFraunhoferAAC decoder + +## Plugin Design Considerations +The fuzzer plugin for aac decoder is designed based on the understanding of the +codec and tries to achieve the following: + +##### Maximize code coverage + +This fuzzer makes use of the following config parameters: +1. Transport type (parameter name: `TRANSPORT_TYPE`) + +| Parameter| Valid Values| Configured Value| +|------------- |-------------| ----- | +| `TRANSPORT_TYPE` | 0.`TT_UNKNOWN ` 1.`TT_MP4_RAW ` 2.`TT_MP4_ADIF ` 3.`TT_MP4_ADTS ` 4.`TT_MP4_LATM_MCP1 ` 5.`TT_MP4_LATM_MCP0 ` 6.`TT_MP4_LOAS ` 7.`TT_DRM ` | `TT_MP4_ADIF ` | + +Note: Value of `TRANSPORT_TYPE` could be set to any of these values. +It is set to `TT_MP4_ADIF` in the fuzzer plugin. + +##### Maximize utilization of input data +The plugin feeds the entire input data to the codec using a loop. + * If the decode operation was successful, the input is advanced by an + offset calculated using valid bytes. + * If the decode operation was un-successful, the input is advanced by 1 byte + till it reaches a valid frame or end of stream. + +This ensures that the plugin tolerates any kind of input (empty, huge, +malformed, etc) and doesnt `exit()` on any input and thereby increasing the +chance of identifying vulnerabilities. + +## Build + +This describes steps to build aac_dec_fuzzer binary. + +## Android + +### Steps to build +Build the fuzzer +``` + $ mm -j$(nproc) aac_dec_fuzzer +``` + +### Steps to run +Create a directory CORPUS_DIR and copy some aac files to that folder. +Push this directory to device. + +To run on device +``` + $ adb sync data + $ adb shell /data/fuzz/arm64/aac_dec_fuzzer/aac_dec_fuzzer CORPUS_DIR +``` +To run on host +``` + $ $ANDROID_HOST_OUT/fuzz/x86_64/aac_dec_fuzzer/aac_dec_fuzzer CORPUS_DIR +``` + +# Fuzzer for libFraunhoferAAC encoder + +## Plugin Design Considerations +The fuzzer plugin for aac encoder is designed based on the understanding of the +codec and tries to achieve the following: + +##### Maximize code coverage + +The configuration parameters are not hardcoded, but instead selected based on +incoming data. This ensures more code paths are reached by the fuzzer. + +Following arguments are passed to aacEncoder_SetParam to set the respective AACENC_PARAM parameter: + +| AACENC_PARAM param| Valid Values| Configured Value| +|-------------| ----- |----- | +|`AACENC_SBR_MODE` | `-1 ` `0 ` `1 ` `2 ` | Calculated using first byte of data | +|`AACENC_AOT` |`AOT_NONE ` `AOT_NULL_OBJECT ` `AOT_AAC_MAIN ` `AOT_AAC_LC ` `AOT_AAC_SSR ` `AOT_AAC_LTP ` `AOT_SBR ` `AOT_AAC_SCAL ` `AOT_TWIN_VQ ` `AOT_CELP ` `AOT_HVXC ` `AOT_RSVD_10 ` `AOT_RSVD_11 ` `AOT_TTSI ` `AOT_MAIN_SYNTH ` `AOT_WAV_TAB_SYNTH ` `AOT_GEN_MIDI ` `AOT_ALG_SYNTH_AUD_FX ` `AOT_ER_AAC_LC ` `AOT_RSVD_18 ` `AOT_ER_AAC_LTP ` `AOT_ER_AAC_SCAL ` `AOT_ER_TWIN_VQ ` `AOT_ER_BSAC ` `AOT_ER_AAC_LD ` `AOT_ER_CELP ` `AOT_ER_HVXC ` `AOT_ER_HILN ` `AOT_ER_PARA ` `AOT_RSVD_28 ` `AOT_PS ` `AOT_MPEGS ` `AOT_ESCAPE ` `AOT_MP3ONMP4_L1 ` `AOT_MP3ONMP4_L2 ` `AOT_MP3ONMP4_L3 ` `AOT_RSVD_35 ` `AOT_RSVD_36 ` `AOT_AAC_SLS ` `AOT_SLS ` `AOT_ER_AAC_ELD ` `AOT_USAC ` `AOT_SAOC ` `AOT_LD_MPEGS ` `AOT_MP2_AAC_LC ` `AOT_MP2_SBR ` `AOT_DRM_AAC ` `AOT_DRM_SBR ` `AOT_DRM_MPEG_PS ` `AOT_DRM_SURROUND ` `AOT_DRM_USAC ` | Calculated using second byte of data | +|`AACENC_SAMPLERATE` | `8000 ` `11025 ` `12000 ` `16000 ` `22050 ` `24000 ` `32000 ` `44100 ` `48000 ` `64000 ` `88200 ` `96000 `| Calculated using third byte of data | +|`AACENC_BITRATE` | In range `8000 ` to `960000 ` | Calculated using fourth, fifth and sixth byte of data | +|`AACENC_CHANNELMODE` | `MODE_1 ` `MODE_2 ` `MODE_1_2 ` `MODE_1_2_1 ` `MODE_1_2_2 ` `MODE_1_2_2_1 ` `MODE_1_2_2_2_1 ` `MODE_6_1 ` `MODE_7_1_BACK ` `MODE_7_1_TOP_FRONT ` `MODE_7_1_REAR_SURROUND ` `MODE_7_1_FRONT_CENTER ` `MODE_212 ` | Calculated using seventh byte of data | +|`AACENC_TRANSMUX` | `TT_MP4_RAW ` `TT_MP4_ADIF ` `TT_MP4_ADTS ` `TT_MP4_LATM_MCP1 ` `TT_MP4_LATM_MCP0 ` `TT_MP4_LOAS ` `TT_DRM ` | Calculated using eight byte of data |`AACENC_SBR_RATIO` |`-1 ` `0 ` `1 ` `2 ` | Calculated using ninth byte of data | +|`AACENC_BITRATEMODE` |`AACENC_BR_MODE_INVALID ` `AACENC_BR_MODE_CBR ` `AACENC_BR_MODE_VBR_1 ` `AACENC_BR_MODE_VBR_2 ` `AACENC_BR_MODE_VBR_3 ` `AACENC_BR_MODE_VBR_4 ` `AACENC_BR_MODE_VBR_5 ` `AACENC_BR_MODE_FF ` `AACENC_BR_MODE_SFR ` | Calculated using thirty-fourth byte of data | +|`AACENC_GRANULE_LENGTH` |`120 ` `128 ` `240 ` `256 ` `480 ` `512 ` `1024 ` | Calculated using thirty-fifth byte of data | +|`AACENC_CHANNELORDER` |`CH_ORDER_MPEG ` `CH_ORDER_WAV ` | Calculated using thirty-sixth byte of data | +|`AACENC_AFTERBURNER` |`0 ` `1 ` | Calculated using thirty-seventh byte of data | +|`AACENC_BANDWIDTH` |`0 ` `1` | Calculated using thirty-eigth byte of data | +|` AACENC_IDX_PEAK_BITRATE` | In range `8000 ` to `960000 ` | Calculated using thirty-ninth byte of data | +|` AACENC_HEADER_PERIOD` |In range `0 ` to `255 ` | Calculated using fortieth byte of data | +|` AACENC_SIGNALING_MODE` |`-1 ` `0 ` `1 ` `2 ` `3 ` | Calculated using forty-first byte of data | +|` AACENC_TPSUBFRAMES` |In range `0 ` to `255 ` | Calculated using forty-second byte of data | +|` AACENC_AUDIOMUXVER` |`-1 ` `0 ` `1 ` `2 ` | Calculated using forty-third byte of data | +|` AACENC_PROTECTION` |`0 ` `1 ` | Calculated using forty-fourth of data | +|`AACENC_ANCILLARY_BITRATE` |In range `0 ` to `960000 `| Calculated using forty-fifth byte of data | +|`AACENC_METADATA_MODE ` |`0 ` `1 ` `2 ` `3 ` | Calculated using forty-sixth byte of data | + +Following values are configured to set up the meta data represented by the class variable `mMetaData ` : + +| Variable name| Possible Values| Configured Value| +|------------- | ----- |----- | +| `drc_profile` | `AACENC_METADATA_DRC_NONE ` `AACENC_METADATA_DRC_FILMSTANDARD ` `AACENC_METADATA_DRC_FILMLIGHT ` `AACENC_METADATA_DRC_MUSICSTANDARD ` `AACENC_METADATA_DRC_MUSICLIGHT ` `AACENC_METADATA_DRC_SPEECH ` `AACENC_METADATA_DRC_NOT_PRESENT ` | Calculated using tenth byte of data | +| `comp_profile` | `AACENC_METADATA_DRC_NONE ` `AACENC_METADATA_DRC_FILMSTANDARD ` `AACENC_METADATA_DRC_FILMLIGHT ` `AACENC_METADATA_DRC_MUSICSTANDARD ` `AACENC_METADATA_DRC_MUSICLIGHT ` `AACENC_METADATA_DRC_SPEECH ` `AACENC_METADATA_DRC_NOT_PRESENT ` | Calculated using eleventh byte of data | +| `drc_TargetRefLevel` | In range `0 ` to `255 ` | Calculated using twelfth byte of data | +| `comp_TargetRefLevel` | In range `0 ` to `255 ` | Calculated using thirteenth byte of data | +| `prog_ref_level_present` | `0 ` `1 ` | Calculated using fourteenth byte of data | +| `prog_ref_level` | In range `0 ` to `255 ` | Calculated using fifteenth byte of data | +| `PCE_mixdown_idx_present` | `0 ` `1 ` | Calculated using sixteenth byte of data | +| `ETSI_DmxLvl_present` | `0 ` `1 ` | Calculated using seventeenth byte of data | +| `centerMixLevel` | In range `0 ` to `7 ` | Calculated using eighteenth byte of data | +| `surroundMixLevel` | In range `0 ` to `7 ` | Calculated using nineteenth byte of data | +| `dolbySurroundMode` | In range `0 ` to `2 ` | Calculated using twentieth byte of data | +| `drcPresentationMode` | In range `0 ` to `2 ` | Calculated using twenty-first byte of data | +| `extAncDataEnable` | `0 ` `1 ` | Calculated using twenty-second byte of data | +| `extDownmixLevelEnable` | `0 ` `1 ` | Calculated using twenty-third byte of data | +| `extDownmixLevel_A` | In range `0 ` to `7 ` | Calculated using twenty-fourth byte of data | +| `extDownmixLevel_B` | In range `0 ` to `7 ` | Calculated using twenty-fifth byte of data | +| `dmxGainEnable` | `0 ` `1 ` | Calculated using twenty-sixth byte of data | +| `dmxGain5` | In range `0 ` to `255 ` | Calculated using twenty-seventh byte of data | +| `dmxGain2` | In range `0 ` to `255 ` | Calculated using twenty-eighth byte of data | +| `lfeDmxEnable` | `0 ` `1 ` | Calculated using twenty-ninth byte of data | +| `lfeDmxLevel` | In range `0 ` to `15 ` | Calculated using thirtieth byte of data | + +Indexes `mInBufferIdx_1`, `mInBufferIdx_2` and `mInBufferIdx_3`(in range `0 ` to `2`) are calculated using the thirty-first, thirty-second and thirty-third byte respectively. + +##### Maximize utilization of input data +The plugin feeds the entire input data to the codec and continues with the encoding even on a failure. This ensures that the plugin tolerates any kind of input (empty, huge, malformed, etc) and doesnt `exit()` on any input and thereby increasing the chance of identifying vulnerabilities. + +## Build + +This describes steps to build aac_enc_fuzzer binary. + +## Android + +### Steps to build +Build the fuzzer +``` + $ mm -j$(nproc) aac_enc_fuzzer +``` + +### Steps to run +Create a directory CORPUS_DIR and copy some raw files to that folder. +Push this directory to device. + +To run on device +``` + $ adb sync data + $ adb shell /data/fuzz/arm64/aac_enc_fuzzer/aac_enc_fuzzer CORPUS_DIR +``` +To run on host +``` + $ $ANDROID_HOST_OUT/fuzz/x86_64/aac_enc_fuzzer/aac_enc_fuzzer CORPUS_DIR +``` + +## References: + * http://llvm.org/docs/LibFuzzer.html + * https://github.com/google/oss-fuzz diff -Nru fdk-aac-2.0.1/.gitignore fdk-aac-2.0.2/.gitignore --- fdk-aac-2.0.1/.gitignore 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/.gitignore 2021-04-28 12:34:15.000000000 +0000 @@ -27,3 +27,18 @@ stamp-h1 aac-enc compile + +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +CMakeSettings.json + +*[Bb]uild*/ + +.vs/ +.vscode/ diff -Nru fdk-aac-2.0.1/libAACdec/include/aacdecoder_lib.h fdk-aac-2.0.2/libAACdec/include/aacdecoder_lib.h --- fdk-aac-2.0.1/libAACdec/include/aacdecoder_lib.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/include/aacdecoder_lib.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -164,9 +164,6 @@ files are provided for usage in specific C/C++ programs. The main AAC decoder library API functions are located in aacdecoder_lib.h header file. -In binary releases the decoder core resides in statically linkable libraries, -for example libAACdec.a. - \section Calling_Sequence Calling Sequence @@ -174,19 +171,7 @@ HE-AAC v2, or MPEG-D USAC bitstreams. In the following description, input stream read and output write function details are left out, since they may be implemented in a variety of configurations depending on the user's specific -requirements. The example implementation uses file-based input/output, and in -such case one may call mpegFileRead_Open() to open an input file and to allocate -memory for the required structures, and the corresponding mpegFileRead_Close() -to close opened files and to de-allocate associated structures. -mpegFileRead_Open() will attempt to detect the bitstream format and in case of -MPEG-4 file format or Raw Packets file format (a proprietary Fraunhofer IIS file -format suitable only for testing) it will read the Audio Specific Config data -(ASC). An unsuccessful attempt to recognize the bitstream format requires the -user to provide this information manually. For any other bitstream formats that -are usually applicable in streaming applications, the decoder itself will try to -synchronize and parse the given bitstream fragment using the FDK transport -library. Hence, for streaming applications (without file access) this step is -not necessary. +requirements. -# Call aacDecoder_Open() to open and retrieve a handle to a new AAC decoder @@ -205,19 +190,17 @@ working memory (a client-supplied input buffer "inBuffer" in framework). This buffer will be used to load AAC bitstream data to the decoder. Only when all data in this buffer has been processed will the decoder signal an empty buffer. -For file-based input, you may invoke mpegFileRead_Read() to acquire new -bitstream data. -# Call aacDecoder_Fill() to fill the decoder's internal bitstream input buffer with the client-supplied bitstream input buffer. Note, if the data loaded in to the internal buffer is not sufficient to decode a frame, aacDecoder_DecodeFrame() will return ::AAC_DEC_NOT_ENOUGH_BITS until a sufficient amount of data is loaded in to the internal buffer. For streaming formats (ADTS, LOAS), it is acceptable to load more than one frame to the -decoder. However, for RAW file format (Fraunhofer IIS proprietary format), only -one frame may be loaded to the decoder per aacDecoder_DecodeFrame() call. For -least amount of communication delay, fill and decode should be performed on a -frame by frame basis. \code ErrorStatus = aacDecoder_Fill(aacDecoderInfo, -inBuffer, bytesRead, bytesValid); \endcode +decoder. However, for packed based formats, only one frame may be loaded to the +decoder per aacDecoder_DecodeFrame() call. For least amount of communication +delay, fill and decode should be performed on a frame by frame basis. \code + ErrorStatus = aacDecoder_Fill(aacDecoderInfo, inBuffer, bytesRead, +bytesValid); \endcode -# Call aacDecoder_DecodeFrame(). This function decodes one frame and writes decoded PCM audio data to a client-supplied buffer. It is the client's responsibility to allocate a buffer which is large enough to hold the decoded @@ -225,12 +208,9 @@ TimeData, OUT_BUF_SIZE, flags); \endcode If the bitstream configuration (number of channels, sample rate, frame size) is not known a priori, you may call aacDecoder_GetStreamInfo() to retrieve a structure that contains this -information. You may use this data to initialize an audio output device. In the -example program, if the number of channels or the sample rate has changed since -program start or the previously decoded frame, the audio output device is then -re-initialized. If WAVE file output is chosen, a new WAVE file for each new -stream configuration is be created. \code p_si = -aacDecoder_GetStreamInfo(aacDecoderInfo); \endcode +information. You may use this data to initialize an audio output device. \code + p_si = aacDecoder_GetStreamInfo(aacDecoderInfo); +\endcode -# Repeat steps 5 to 7 until no data is available to decode any more, or in case of error. \code } while (bytesRead[0] > 0 || doFlush || doBsFlush || forceContinue); \endcode @@ -239,7 +219,7 @@ \image latex decode.png "Decode calling sequence" width=11cm -\image latex change_source.png "Change data source sequence" width 5cm +\image latex change_source.png "Change data source sequence" width=5cm \image latex conceal.png "Error concealment sequence" width=14cm @@ -296,16 +276,14 @@ limited applications, the output buffer may be reused as an external input buffer prior to the subsequence aacDecoder_Fill() function call. -The external input buffer is set in the example program and its size is defined -by ::IN_BUF_SIZE. You may freely choose different buffer sizes. To feed the data -to the decoder-internal input buffer, use the function aacDecoder_Fill(). This -function returns important information regarding the number of bytes in the -external input buffer that have not yet been copied into the internal input -buffer (variable bytesValid). Once the external buffer has been fully copied, it -can be completely re-filled again. In case you wish to refill the buffer while -there are unprocessed bytes (bytesValid is unequal 0), you should preserve the -unconsumed data. However, we recommend to refill the buffer only when bytesValid -returns 0. +To feed the data to the decoder-internal input buffer, use the +function aacDecoder_Fill(). This function returns important information +regarding the number of bytes in the external input buffer that have not yet +been copied into the internal input buffer (variable bytesValid). Once the +external buffer has been fully copied, it can be completely re-filled again. In +case you wish to refill the buffer while there are unprocessed bytes (bytesValid +is unequal 0), you should preserve the unconsumed data. However, we recommend to +refill the buffer only when bytesValid returns 0. The bytesValid parameter is an input and output parameter to the FDK decoder. As an input, it signals how many valid bytes are available in the external buffer. @@ -340,10 +318,7 @@ In case a Program Config is included in the audio configuration, the channel mapping described within it will be adopted. -In case of MPEG-D Surround the channel mapping will follow the same criteria -described in ISO/IEC 13818-7:2005(E), but adding corresponding top channels (if -available) to the channel types in order to avoid ambiguity. The examples below -explain these aspects in detail. +The examples below explain these aspects in detail. \section OutputFormatChange Changing the audio output format @@ -459,7 +434,7 @@ #include "genericStds.h" #define AACDECODER_LIB_VL0 3 -#define AACDECODER_LIB_VL1 0 +#define AACDECODER_LIB_VL1 2 #define AACDECODER_LIB_VL2 0 /** @@ -694,9 +669,7 @@ 2. If the parameter value is greater than that of ::AAC_PCM_MAX_OUTPUT_CHANNELS both will be set to the same value. \n - 3. This parameter does not affect MPEG Surround processing. - \n - 4. This parameter will be ignored if the number of encoded + 3. This parameter will be ignored if the number of encoded audio channels is greater than 8. */ AAC_PCM_MAX_OUTPUT_CHANNELS = 0x0012, /*!< Maximum number of PCM output channels. If lower than the @@ -723,11 +696,7 @@ 2. If the parameter value is greater than zero but smaller than ::AAC_PCM_MIN_OUTPUT_CHANNELS both will be set to same value. \n - 3. The operating mode of the MPEG Surround module will be - set accordingly. \n - 4. Setting this parameter with any value will disable the - binaural processing of the MPEG Surround module - 5. This parameter will be ignored if the number of encoded + 3. This parameter will be ignored if the number of encoded audio channels is greater than 8. */ AAC_METADATA_PROFILE = 0x0020, /*!< See ::AAC_MD_PROFILE for all available values. */ @@ -746,66 +715,77 @@ ::CONCEAL_INTER. only some AOTs are supported). \n */ AAC_DRC_BOOST_FACTOR = - 0x0200, /*!< Dynamic Range Control: Scaling factor for boosting gain - values. Defines how the boosting DRC factors (conveyed in the - bitstream) will be applied to the decoded signal. The valid - values range from 0 (don't apply boost factors) to 127 (fully - apply boost factors). Default value is 0. */ - AAC_DRC_ATTENUATION_FACTOR = - 0x0201, /*!< Dynamic Range Control: Scaling factor for attenuating gain - values. Same as - ::AAC_DRC_BOOST_FACTOR but for attenuating DRC factors. */ + 0x0200, /*!< MPEG-4 / MPEG-D Dynamic Range Control (DRC): Scaling factor + for boosting gain values. Defines how the boosting DRC factors + (conveyed in the bitstream) will be applied to the decoded + signal. The valid values range from 0 (don't apply boost + factors) to 127 (fully apply boost factors). Default value is 0 + for MPEG-4 DRC and 127 for MPEG-D DRC. */ + AAC_DRC_ATTENUATION_FACTOR = 0x0201, /*!< MPEG-4 / MPEG-D DRC: Scaling factor + for attenuating gain values. Same as + ::AAC_DRC_BOOST_FACTOR but for + attenuating DRC factors. */ AAC_DRC_REFERENCE_LEVEL = - 0x0202, /*!< Dynamic Range Control (DRC): Target reference level. Defines - the level below full-scale (quantized in steps of 0.25dB) to - which the output audio signal will be normalized to by the DRC - module. The parameter controls loudness normalization for both - MPEG-4 DRC and MPEG-D DRC. The valid values range from 40 (-10 - dBFS) to 127 (-31.75 dBFS). Any value smaller than 0 switches - off loudness normalization and MPEG-4 DRC. By default, loudness - normalization and MPEG-4 DRC is switched off. */ + 0x0202, /*!< MPEG-4 / MPEG-D DRC: Target reference level / decoder target + loudness.\n Defines the level below full-scale (quantized in + steps of 0.25dB) to which the output audio signal will be + normalized to by the DRC module.\n The parameter controls + loudness normalization for both MPEG-4 DRC and MPEG-D DRC. The + valid values range from 40 (-10 dBFS) to 127 (-31.75 dBFS).\n + Example values:\n + 124 (-31 dBFS) for audio/video receivers (AVR) or other + devices allowing audio playback with high dynamic range,\n 96 + (-24 dBFS) for TV sets or equivalent devices (default),\n 64 + (-16 dBFS) for mobile devices where the dynamic range of audio + playback is restricted.\n Any value smaller than 0 switches off + loudness normalization and MPEG-4 DRC. */ AAC_DRC_HEAVY_COMPRESSION = - 0x0203, /*!< Dynamic Range Control: En-/Disable DVB specific heavy - compression (aka RF mode). If set to 1, the decoder will apply - the compression values from the DVB specific ancillary data - field. At the same time the MPEG-4 Dynamic Range Control tool - will be disabled. By default, heavy compression is disabled. */ + 0x0203, /*!< MPEG-4 DRC: En-/Disable DVB specific heavy compression (aka + RF mode). If set to 1, the decoder will apply the compression + values from the DVB specific ancillary data field. At the same + time the MPEG-4 Dynamic Range Control tool will be disabled. By + default, heavy compression is disabled. */ AAC_DRC_DEFAULT_PRESENTATION_MODE = - 0x0204, /*!< Dynamic Range Control: Default presentation mode (DRC - parameter handling). \n Defines the handling of the DRC - parameters boost factor, attenuation factor and heavy - compression, if no presentation mode is indicated in the - bitstream.\n For options, see - ::AAC_DRC_DEFAULT_PRESENTATION_MODE_OPTIONS.\n Default: + 0x0204, /*!< MPEG-4 DRC: Default presentation mode (DRC parameter + handling). \n Defines the handling of the DRC parameters boost + factor, attenuation factor and heavy compression, if no + presentation mode is indicated in the bitstream.\n For options, + see ::AAC_DRC_DEFAULT_PRESENTATION_MODE_OPTIONS.\n Default: ::AAC_DRC_PARAMETER_HANDLING_DISABLED */ AAC_DRC_ENC_TARGET_LEVEL = - 0x0205, /*!< Dynamic Range Control: Encoder target level for light (i.e. - not heavy) compression.\n If known, this declares the target - reference level that was assumed at the encoder for calculation - of limiting gains. The valid values range from 0 (full-scale) - to 127 (31.75 dB below full-scale). This parameter is used only + 0x0205, /*!< MPEG-4 DRC: Encoder target level for light (i.e. not heavy) + compression.\n If known, this declares the target reference + level that was assumed at the encoder for calculation of + limiting gains. The valid values range from 0 (full-scale) to + 127 (31.75 dB below full-scale). This parameter is used only with ::AAC_DRC_PARAMETER_HANDLING_ENABLED and ignored otherwise.\n Default: 127 (worst-case assumption).\n */ - AAC_QMF_LOWPOWER = 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing - mode. \n -1: Use internal default. Implies MPEG - Surround partially complex accordingly. \n 0: - Use complex QMF data mode. \n 1: Use real (low - power) QMF data mode. \n */ + AAC_UNIDRC_SET_EFFECT = 0x0206, /*!< MPEG-D DRC: Request a DRC effect type for + selection of a DRC set.\n Supported indices + are:\n -1: DRC off. Completely disables + MPEG-D DRC.\n 0: None (default). Disables + MPEG-D DRC, but automatically enables DRC + if necessary to prevent clipping.\n 1: Late + night\n 2: Noisy environment\n 3: Limited + playback range\n 4: Low playback level\n 5: + Dialog enhancement\n 6: General + compression. Used for generally enabling + MPEG-D DRC without particular request.\n */ + AAC_UNIDRC_ALBUM_MODE = + 0x0207, /*!< MPEG-D DRC: Enable album mode. 0: Disabled (default), 1: + Enabled.\n Disabled album mode leads to application of gain + sequences for fading in and out, if provided in the + bitstream.\n Enabled album mode makes use of dedicated album + loudness information, if provided in the bitstream.\n */ + AAC_QMF_LOWPOWER = + 0x0300, /*!< Quadrature Mirror Filter (QMF) Bank processing mode. \n + -1: Use internal default. \n + 0: Use complex QMF data mode. \n + 1: Use real (low power) QMF data mode. \n */ AAC_TPDEC_CLEAR_BUFFER = - 0x0603, /*!< Clear internal bit stream buffer of transport layers. The - decoder will start decoding at new data passed after this event - and any previous data is discarded. */ - AAC_UNIDRC_SET_EFFECT = 0x0903 /*!< MPEG-D DRC: Request a DRC effect type for - selection of a DRC set.\n Supported indices - are:\n -1: DRC off. Completely disables - MPEG-D DRC.\n 0: None (default). Disables - MPEG-D DRC, but automatically enables DRC if - necessary to prevent clipping.\n 1: Late - night\n 2: Noisy environment\n 3: Limited - playback range\n 4: Low playback level\n 5: - Dialog enhancement\n 6: General compression. - Used for generally enabling MPEG-D DRC - without particular request.\n */ + 0x0603 /*!< Clear internal bit stream buffer of transport layers. The + decoder will start decoding at new data passed after this event + and any previous data is discarded. */ } AACDEC_PARAM; @@ -886,15 +866,25 @@ 1770. If no level has been found in the bitstream the value is -1. */ SCHAR - drcPresMode; /*!< DRC presentation mode. According to ETSI TS 101 154, - this field indicates whether light (MPEG-4 Dynamic Range - Control tool) or heavy compression (DVB heavy - compression) dynamic range control shall take priority - on the outputs. For details, see ETSI TS 101 154, table - C.33. Possible values are: \n -1: No corresponding - metadata found in the bitstream \n 0: DRC presentation - mode not indicated \n 1: DRC presentation mode 1 \n 2: - DRC presentation mode 2 \n 3: Reserved */ + drcPresMode; /*!< DRC presentation mode. According to ETSI TS 101 154, + this field indicates whether light (MPEG-4 Dynamic Range + Control tool) or heavy compression (DVB heavy + compression) dynamic range control shall take priority + on the outputs. For details, see ETSI TS 101 154, table + C.33. Possible values are: \n -1: No corresponding + metadata found in the bitstream \n 0: DRC presentation + mode not indicated \n 1: DRC presentation mode 1 \n 2: + DRC presentation mode 2 \n 3: Reserved */ + INT outputLoudness; /*!< Audio output loudness in steps of -0.25 dB. Range: 0 + (0 dBFS) to 231 (-57.75 dBFS).\n A value of -1 + indicates that no loudness metadata is present.\n If + loudness normalization is active, the value corresponds + to the target loudness value set with + ::AAC_DRC_REFERENCE_LEVEL.\n If loudness normalization + is not active, the output loudness value corresponds to + the loudness metadata given in the bitstream.\n + Loudness metadata can originate from MPEG-4 DRC or + MPEG-D DRC. */ } CStreamInfo; @@ -1022,21 +1012,24 @@ const UINT bufferSize[], UINT *bytesValid); -#define AACDEC_CONCEAL \ - 1 /*!< Flag for aacDecoder_DecodeFrame(): Trigger the built-in error \ - concealment module to generate a substitute signal for one lost frame. \ - New input data will not be considered. */ -#define AACDEC_FLUSH \ - 2 /*!< Flag for aacDecoder_DecodeFrame(): Flush all filterbanks to get all \ - delayed audio without having new input data. Thus new input data will \ - not be considered.*/ -#define AACDEC_INTR \ - 4 /*!< Flag for aacDecoder_DecodeFrame(): Signal an input bit stream data \ - discontinuity. Resync any internals as necessary. */ -#define AACDEC_CLRHIST \ - 8 /*!< Flag for aacDecoder_DecodeFrame(): Clear all signal delay lines and \ - history buffers. CAUTION: This can cause discontinuities in the output \ - signal. */ +/** Flag for aacDecoder_DecodeFrame(): Trigger the built-in error concealment + * module to generate a substitute signal for one lost frame. New input data + * will not be considered. + */ +#define AACDEC_CONCEAL 1 +/** Flag for aacDecoder_DecodeFrame(): Flush all filterbanks to get all delayed + * audio without having new input data. Thus new input data will not be + * considered. + */ +#define AACDEC_FLUSH 2 +/** Flag for aacDecoder_DecodeFrame(): Signal an input bit stream data + * discontinuity. Resync any internals as necessary. + */ +#define AACDEC_INTR 4 +/** Flag for aacDecoder_DecodeFrame(): Clear all signal delay lines and history + * buffers. CAUTION: This can cause discontinuities in the output signal. + */ +#define AACDEC_CLRHIST 8 /** * \brief Decode one audio frame diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdec_drc.cpp fdk-aac-2.0.2/libAACdec/src/aacdec_drc.cpp --- fdk-aac-2.0.1/libAACdec/src/aacdec_drc.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdec_drc.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -150,6 +150,20 @@ } /*! +\brief Reset DRC information + +\self Handle of DRC info + +\return none +*/ +void aacDecoder_drcReset(HANDLE_AAC_DRC self) { + self->applyExtGain = 0; + self->additionalGainPrev = AACDEC_DRC_GAIN_INIT_VALUE; + self->additionalGainFilterState = AACDEC_DRC_GAIN_INIT_VALUE; + self->additionalGainFilterState1 = AACDEC_DRC_GAIN_INIT_VALUE; +} + +/*! \brief Initialize DRC information \self Handle of DRC info @@ -174,9 +188,8 @@ pParams->usrCut = FL2FXCONST_DBL(0.0f); pParams->boost = FL2FXCONST_DBL(0.0f); pParams->usrBoost = FL2FXCONST_DBL(0.0f); - pParams->targetRefLevel = -1; + pParams->targetRefLevel = 96; pParams->expiryFrame = AACDEC_DRC_DFLT_EXPIRY_FRAMES; - pParams->applyDigitalNorm = OFF; pParams->applyHeavyCompression = OFF; pParams->usrApplyHeavyCompression = OFF; @@ -192,6 +205,8 @@ self->progRefLevelPresent = 0; self->presMode = -1; self->uniDrcPrecedence = 0; + + aacDecoder_drcReset(self); } /*! @@ -258,11 +273,8 @@ return AAC_DEC_INVALID_HANDLE; } if (value < 0) { - self->params.applyDigitalNorm = OFF; self->params.targetRefLevel = -1; } else { - /* ref_level must be between 0 and MAX_REFERENCE_LEVEL, inclusive */ - self->params.applyDigitalNorm = ON; if (self->params.targetRefLevel != (SCHAR)value) { self->params.targetRefLevel = (SCHAR)value; self->progRefLevel = (SCHAR)value; /* Always set the program reference @@ -273,16 +285,6 @@ self->update = 1; } break; - case APPLY_NORMALIZATION: - if ((value != OFF) && (value != ON)) { - return AAC_DEC_SET_PARAM_FAIL; - } - if (self == NULL) { - return AAC_DEC_INVALID_HANDLE; - } - /* Store new parameter value */ - self->params.applyDigitalNorm = (UCHAR)value; - break; case APPLY_HEAVY_COMPRESSION: if ((value != OFF) && (value != ON)) { return AAC_DEC_SET_PARAM_FAIL; @@ -910,11 +912,9 @@ FDK_ASSERT(0); } } - if (self->params.applyDigitalNorm == OFF) { - /* Reset normalization gain since this module must not apply it */ - norm_mantissa = FL2FXCONST_DBL(0.5f); - norm_exponent = 1; - } + /* Reset normalization gain since this module must not apply it */ + norm_mantissa = FL2FXCONST_DBL(0.5f); + norm_exponent = 1; /* calc scale factors */ for (band = 0; band < numBands; band++) { @@ -1353,3 +1353,152 @@ } } } + +/** + * \brief Apply DRC Level Normalization. + * + * This function prepares/applies the gain values for the DRC Level + * Normalization and returns the exponent of the time data. The following two + * cases are handled: + * + * - Limiter enabled: + * The input data must be interleaved. + * One gain per sample is written to the buffer pGainPerSample. + * If necessary the time data is rescaled. + * + * - Limiter disabled: + * The input data can be interleaved or deinterleaved. + * The gain values are applied to the time data. + * If necessary the time data is rescaled. + * + * \param hDrcInfo [i/o] handle to drc data structure. + * \param samplesIn [i/o] pointer to time data. + * \param pGain [i ] pointer to gain to be applied to + * the time data. + * \param pGainPerSample [o ] pointer to the gain per sample to + * be applied to the time data in the limiter. + * \param gain_scale [i ] exponent to be applied to the time + * data. + * \param gain_delay [i ] delay[samples] with which the gains + * in pGain shall be applied (gain_delay <= nSamples). + * \param nSamples [i ] number of samples per frame. + * \param channels [i ] number of channels. + * \param stride [i ] channel stride of time data. + * \param limiterEnabled [i ] 1 if limiter is enabled, otherwise + * 0. + * + * \return exponent of time data + */ +INT applyDrcLevelNormalization(HANDLE_AAC_DRC hDrcInfo, PCM_DEC *samplesIn, + FIXP_DBL *pGain, FIXP_DBL *pGainPerSample, + const INT gain_scale, const UINT gain_delay, + const UINT nSamples, const UINT channels, + const UINT stride, const UINT limiterEnabled) { + UINT i; + INT additionalGain_scaling; + FIXP_DBL additionalGain; + + FDK_ASSERT(gain_delay <= nSamples); + + FIXP_DBL additionalGainSmoothState = hDrcInfo->additionalGainFilterState; + FIXP_DBL additionalGainSmoothState1 = hDrcInfo->additionalGainFilterState1; + + if (!gain_delay) { + additionalGain = pGain[0]; + + /* Apply the additional scaling gain_scale[0] that has no delay and no + * smoothing */ + additionalGain_scaling = + fMin(gain_scale, CntLeadingZeros(additionalGain) - 1); + additionalGain = scaleValue(additionalGain, additionalGain_scaling); + + /* if it's not possible to fully apply gain_scale to additionalGain, apply + * it to the input signal */ + additionalGain_scaling -= gain_scale; + + if (additionalGain_scaling) { + scaleValuesSaturate(samplesIn, channels * nSamples, + -additionalGain_scaling); + } + + if (limiterEnabled) { + FDK_ASSERT(pGainPerSample != NULL); + + for (i = 0; i < nSamples; i++) { + pGainPerSample[i] = additionalGain; + } + } else { + for (i = 0; i < channels * nSamples; i++) { + samplesIn[i] = FIXP_DBL2PCM_DEC(fMult(samplesIn[i], additionalGain)); + } + } + } else { + UINT inc; + FIXP_DBL additionalGainUnfiltered; + + inc = (stride == 1) ? channels : 1; + + for (i = 0; i < nSamples; i++) { + if (i < gain_delay) { + additionalGainUnfiltered = hDrcInfo->additionalGainPrev; + } else { + additionalGainUnfiltered = pGain[0]; + } + + /* Smooth additionalGain */ + + /* [b,a] = butter(1, 0.01) */ + static const FIXP_SGL b[] = {FL2FXCONST_SGL(0.015466 * 2.0), + FL2FXCONST_SGL(0.015466 * 2.0)}; + static const FIXP_SGL a[] = {(FIXP_SGL)MAXVAL_SGL, + FL2FXCONST_SGL(-0.96907)}; + + additionalGain = -fMult(additionalGainSmoothState, a[1]) + + fMultDiv2(additionalGainUnfiltered, b[0]) + + fMultDiv2(additionalGainSmoothState1, b[1]); + additionalGainSmoothState1 = additionalGainUnfiltered; + additionalGainSmoothState = additionalGain; + + /* Apply the additional scaling gain_scale[0] that has no delay and no + * smoothing */ + additionalGain_scaling = + fMin(gain_scale, CntLeadingZeros(additionalGain) - 1); + additionalGain = scaleValue(additionalGain, additionalGain_scaling); + + /* if it's not possible to fully apply gain_scale[0] to additionalGain, + * apply it to the input signal */ + additionalGain_scaling -= gain_scale; + + if (limiterEnabled) { + FDK_ASSERT(stride == 1); + FDK_ASSERT(pGainPerSample != NULL); + + if (additionalGain_scaling) { + scaleValuesSaturate(samplesIn, channels, -additionalGain_scaling); + } + + pGainPerSample[i] = additionalGain; + } else { + if (additionalGain_scaling) { + for (UINT k = 0; k < channels; k++) { + scaleValuesSaturate(&samplesIn[k * stride], 1, + -additionalGain_scaling); + } + } + + for (UINT k = 0; k < channels; k++) { + samplesIn[k * stride] = + FIXP_DBL2PCM_DEC(fMult(samplesIn[k * stride], additionalGain)); + } + } + + samplesIn += inc; + } + } + + hDrcInfo->additionalGainPrev = pGain[0]; + hDrcInfo->additionalGainFilterState = additionalGainSmoothState; + hDrcInfo->additionalGainFilterState1 = additionalGainSmoothState1; + + return (AACDEC_DRC_GAIN_SCALING); +} diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdec_drc.h fdk-aac-2.0.2/libAACdec/src/aacdec_drc.h --- fdk-aac-2.0.1/libAACdec/src/aacdec_drc.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdec_drc.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -109,6 +109,11 @@ #include "channel.h" #include "FDK_bitstream.h" +#define AACDEC_DRC_GAIN_SCALING (11) /* Scaling of DRC gains */ +#define AACDEC_DRC_GAIN_INIT_VALUE \ + (FL2FXCONST_DBL( \ + 1.0f / (1 << AACDEC_DRC_GAIN_SCALING))) /* Init value for DRC gains */ + #define AACDEC_DRC_DFLT_EXPIRY_FRAMES \ (0) /* Default DRC data expiry time in AAC frames */ @@ -125,7 +130,6 @@ TARGET_REF_LEVEL, DRC_BS_DELAY, DRC_DATA_EXPIRY_FRAME, - APPLY_NORMALIZATION, APPLY_HEAVY_COMPRESSION, DEFAULT_PRESENTATION_MODE, ENCODER_TARGET_LEVEL, @@ -136,6 +140,8 @@ /** * \brief DRC module interface functions */ +void aacDecoder_drcReset(HANDLE_AAC_DRC self); + void aacDecoder_drcInit(HANDLE_AAC_DRC self); void aacDecoder_drcInitChannelData(CDrcChannelData *pDrcChannel); @@ -189,4 +195,45 @@ void aacDecoder_drcGetInfo(HANDLE_AAC_DRC self, SCHAR *pPresMode, SCHAR *pProgRefLevel); +/** + * \brief Apply DRC Level Normalization. + * + * This function prepares/applies the gain values for the DRC Level + * Normalization and returns the exponent of the time data. The following two + * cases are handled: + * + * - Limiter enabled: + * The input data must be interleaved. + * One gain per sample is written to the buffer pGainPerSample. + * If necessary the time data is rescaled. + * + * - Limiter disabled: + * The input data can be interleaved or deinterleaved. + * The gain values are applied to the time data. + * If necessary the time data is rescaled. + * + * \param hDrcInfo [i/o] handle to drc data structure. + * \param samplesIn [i/o] pointer to time data. + * \param pGain [i ] pointer to gain to be applied to + * the time data. + * \param pGainPerSample [o ] pointer to the gain per sample to + * be applied to the time data in the limiter. + * \param gain_scale [i ] exponent to be applied to the time + * data. + * \param gain_delay [i ] delay[samples] with which the gains + * in pGain shall be applied (gain_delay <= nSamples). + * \param nSamples [i ] number of samples per frame. + * \param channels [i ] number of channels. + * \param stride [i ] channel stride of time data. + * \param limiterEnabled [i ] 1 if limiter is enabled, otherwise + * 0. + * + * \return exponent of time data + */ +INT applyDrcLevelNormalization(HANDLE_AAC_DRC hDrcInfo, PCM_DEC *samplesIn, + FIXP_DBL *pGain, FIXP_DBL *pGainPerSample, + const INT gain_scale, const UINT gain_delay, + const UINT nSamples, const UINT channels, + const UINT stride, const UINT limiterEnabled); + #endif /* AACDEC_DRC_H */ diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdec_drc_types.h fdk-aac-2.0.2/libAACdec/src/aacdec_drc_types.h --- fdk-aac-2.0.1/libAACdec/src/aacdec_drc_types.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdec_drc_types.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -168,7 +168,6 @@ UINT expiryFrame; UCHAR bsDelayEnable; - UCHAR applyDigitalNorm; AACDEC_DRC_PARAMETER_HANDLING defaultPresentationMode; UCHAR encoderTargetLevel; @@ -213,6 +212,13 @@ uniDrcPrecedence; /* Flag for signalling that uniDrc is active and takes precedence over legacy DRC */ + UCHAR applyExtGain; /* Flag is 1 if extGain has to be applied, otherwise 0. */ + + FIXP_DBL additionalGainPrev; /* Gain of previous frame to be applied to the + time data */ + FIXP_DBL additionalGainFilterState; /* Filter state for the gain smoothing */ + FIXP_DBL additionalGainFilterState1; /* Filter state for the gain smoothing */ + } CDrcInfo; typedef CDrcInfo *HANDLE_AAC_DRC; diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdec_hcr.cpp fdk-aac-2.0.2/libAACdec/src/aacdec_hcr.cpp --- fdk-aac-2.0.1/libAACdec/src/aacdec_hcr.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdec_hcr.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -137,7 +137,7 @@ static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, INT quantSpecCoef, INT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, - int *pNumDecodedBits); + int *pNumDecodedBits, UINT *errorWord); static int DecodePCW_Sign(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, UINT codebookDim, const SCHAR *pQuantVal, @@ -1179,8 +1179,8 @@ bs, pHcr->decInOut.bitstreamAnchor, pQuantizedSpectralCoefficients [quantizedSpectralCoefficientsIdx], - pLeftStartOfSegment, pRemainingBitsInSegment, - &numDecodedBits); + pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits, + &pHcr->decInOut.errorLog); } quantizedSpectralCoefficientsIdx++; if (quantizedSpectralCoefficientsIdx >= 1024) { @@ -1195,8 +1195,8 @@ bs, pHcr->decInOut.bitstreamAnchor, pQuantizedSpectralCoefficients [quantizedSpectralCoefficientsIdx], - pLeftStartOfSegment, pRemainingBitsInSegment, - &numDecodedBits); + pLeftStartOfSegment, pRemainingBitsInSegment, &numDecodedBits, + &pHcr->decInOut.errorLog); } quantizedSpectralCoefficientsIdx++; if (quantizedSpectralCoefficientsIdx >= 1024) { @@ -1386,7 +1386,7 @@ static INT DecodeEscapeSequence(HANDLE_FDK_BITSTREAM bs, const INT bsAnchor, INT quantSpecCoef, INT *pLeftStartOfSegment, SCHAR *pRemainingBitsInSegment, - int *pNumDecodedBits) { + int *pNumDecodedBits, UINT *errorWord) { UINT i; INT sign; UINT escapeOnesCounter = 0; @@ -1400,6 +1400,9 @@ FROM_LEFT_TO_RIGHT); *pRemainingBitsInSegment -= 1; *pNumDecodedBits += 1; + if (*pRemainingBitsInSegment < 0) { + return Q_VALUE_INVALID; + } if (carryBit != 0) { escapeOnesCounter += 1; @@ -1416,6 +1419,9 @@ FROM_LEFT_TO_RIGHT); *pRemainingBitsInSegment -= 1; *pNumDecodedBits += 1; + if (*pRemainingBitsInSegment < 0) { + return Q_VALUE_INVALID; + } escape_word <<= 1; escape_word = escape_word | carryBit; @@ -1423,8 +1429,12 @@ sign = (quantSpecCoef >= 0) ? 1 : -1; - quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word); - + if (escapeOnesCounter < 13) { + quantSpecCoef = sign * (((INT)1 << escapeOnesCounter) + escape_word); + } else { + *errorWord |= TOO_MANY_PCW_BODY_SIGN_ESC_BITS_DECODED; + quantSpecCoef = Q_VALUE_INVALID; + } return quantSpecCoef; } diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdec_hcrs.cpp fdk-aac-2.0.2/libAACdec/src/aacdec_hcrs.cpp --- fdk-aac-2.0.1/libAACdec/src/aacdec_hcrs.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdec_hcrs.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -1324,6 +1324,10 @@ /* count ones and store sum in escapePrefixUp */ if (carryBit == 1) { escapePrefixUp += 1; /* update conter for ones */ + if (escapePrefixUp > 8) { + pHcr->decInOut.errorLog |= STATE_ERROR_BODY_SIGN_ESC__ESC_PREFIX; + return BODY_SIGN_ESC__ESC_PREFIX; + } /* store updated counter in sideinfo of current codeword */ pEscapeSequenceInfo[codewordOffset] &= diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdecoder.cpp fdk-aac-2.0.2/libAACdec/src/aacdecoder.cpp --- fdk-aac-2.0.1/libAACdec/src/aacdecoder.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdecoder.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -1225,6 +1225,8 @@ pStreamInfo->drcProgRefLev = -1; /* set program reference level to not indicated */ pStreamInfo->drcPresMode = -1; /* default: presentation mode not indicated */ + + pStreamInfo->outputLoudness = -1; /* default: no loudness metadata present */ } /*! @@ -1279,6 +1281,7 @@ /* Set default frame delay */ aacDecoder_drcSetParam(self->hDrcInfo, DRC_BS_DELAY, CConcealment_GetDelay(&self->concealCommonData)); + self->workBufferCore1 = (FIXP_DBL *)GetWorkBufferCore1(); self->workBufferCore2 = GetWorkBufferCore2(); if (self->workBufferCore2 == NULL) goto bail; @@ -1303,7 +1306,8 @@ const int subStreamIndex) { int ch; int aacChannelOffset = 0, aacChannels = (8); - int numElements = (((8)) + (8)), elementOffset = 0; + int numElements = (3 * ((8) * 2) + (((8) * 2)) / 2 + 4 * (1) + 1), + elementOffset = 0; if (self == NULL) return; @@ -1453,6 +1457,10 @@ FreeDrcInfo(&self->hDrcInfo); } + if (self->workBufferCore1 != NULL) { + FreeWorkBufferCore1((CWorkBufferCore1 **)&self->workBufferCore1); + } + /* Free WorkBufferCore2 */ if (self->workBufferCore2 != NULL) { FreeWorkBufferCore2(&self->workBufferCore2); @@ -1490,6 +1498,8 @@ UCHAR downscaleFactor = self->downscaleFactor; UCHAR downscaleFactorInBS = self->downscaleFactorInBS; + self->aacOutDataHeadroom = (3); + // set profile and check for supported aot // leave profile on default (=-1) for all other supported MPEG-4 aot's except // aot=2 (=AAC-LC) @@ -1815,6 +1825,9 @@ self->useLdQmfTimeAlign = asc->m_sc.m_eldSpecificConfig.m_useLdQmfTimeAlign; } + if (self->sbrEnabled != asc->m_sbrPresentFlag) { + ascChanged = 1; + } } self->streamInfo.extAot = asc->m_extensionAudioObjectType; @@ -1844,6 +1857,12 @@ self->streamInfo.extSamplingRate / self->downscaleFactor; } } + if ((asc->m_aot == AOT_AAC_LC) && (asc->m_sbrPresentFlag == 1) && + (asc->m_extensionSamplingFrequency > (2 * asc->m_samplingFrequency))) { + return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; /* Core decoder supports at most a + 1:2 upsampling for HE-AAC and + HE-AACv2 */ + } /* --------- vcb11 ------------ */ self->flags[streamIndex] |= (asc->m_vcb11Flag) ? AC_ER_VCB11 : 0; @@ -1925,6 +1944,9 @@ self->samplingRateInfo[0].samplingRate / self->downscaleFactor; self->streamInfo.aacSamplesPerFrame = asc->m_samplesPerFrame / self->downscaleFactor; + if (self->streamInfo.aacSampleRate <= 0) { + return AAC_DEC_UNSUPPORTED_SAMPLINGRATE; + } } } @@ -2359,6 +2381,13 @@ goto bail; } + if (*configChanged) { + if (asc->m_aot == AOT_USAC) { + self->hDrcInfo->enable = 0; + self->hDrcInfo->progRefLevelPresent = 0; + } + } + if (asc->m_aot == AOT_USAC) { pcmLimiter_SetAttack(self->hLimiter, (5)); pcmLimiter_SetThreshold(self->hLimiter, FL2FXCONST_DBL(0.89125094f)); @@ -2372,7 +2401,7 @@ } LINKSPEC_CPP AAC_DECODER_ERROR CAacDecoder_DecodeFrame( - HANDLE_AACDECODER self, const UINT flags, FIXP_PCM *pTimeData, + HANDLE_AACDECODER self, const UINT flags, PCM_DEC *pTimeData, const INT timeDataSize, const int timeDataChannelOffset) { AAC_DECODER_ERROR ErrorStatus = AAC_DEC_OK; @@ -3148,11 +3177,6 @@ FDKmemcpy(drcChMap, self->chMapping, (8) * sizeof(UCHAR)); } - /* Turn on/off DRC modules level normalization in digital domain depending - * on the limiter status. */ - aacDecoder_drcSetParam(self->hDrcInfo, APPLY_NORMALIZATION, - (self->limiterEnableCurr) ? 0 : 1); - /* deactivate legacy DRC in case uniDrc is active, i.e. uniDrc payload is * present and one of DRC or Loudness Normalization is switched on */ aacDecoder_drcSetParam( @@ -3165,9 +3189,15 @@ self->hDrcInfo, bs, self->pAacDecoderStaticChannelInfo, pce->ElementInstanceTag, drcChMap, aacChannels); if (mapped > 0) { - /* If at least one DRC thread has been mapped to a channel threre was DRC - * data in the bitstream. */ - self->flags[streamIndex] |= AC_DRC_PRESENT; + if (!(self->flags[streamIndex] & (AC_USAC | AC_RSV603DA))) { + /* If at least one DRC thread has been mapped to a channel there was DRC + * data in the bitstream. */ + self->flags[streamIndex] |= AC_DRC_PRESENT; + } else { + self->hDrcInfo->enable = 0; + self->hDrcInfo->progRefLevelPresent = 0; + ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT; + } } /* Create a reverse mapping table */ @@ -3297,9 +3327,11 @@ &pAacDecoderStaticChannelInfo->drcData); } } + /* The DRC module demands to be called with the gain field holding the * gain scale. */ - self->extGain[0] = (FIXP_DBL)TDL_GAIN_SCALING; + self->extGain[0] = (FIXP_DBL)AACDEC_DRC_GAIN_SCALING; + /* DRC processing */ aacDecoder_drcApply( self->hDrcInfo, self->hSbrDecoder, pAacDecoderChannelInfo, @@ -3315,7 +3347,7 @@ if (self->flushStatus && (self->flushCnt > 0) && !(flags & AACDEC_CONCEAL)) { FDKmemclear(pTimeData + offset, - sizeof(FIXP_PCM) * self->streamInfo.aacSamplesPerFrame); + sizeof(PCM_DEC) * self->streamInfo.aacSamplesPerFrame); } else switch (pAacDecoderChannelInfo->renderMode) { case AACDEC_RENDER_IMDCT: @@ -3327,7 +3359,7 @@ !frameOk_butConceal), pAacDecoderChannelInfo->pComStaticData->pWorkBufferCore1 ->mdctOutTemp, - self->elFlags[el], elCh); + self->aacOutDataHeadroom, self->elFlags[el], elCh); self->extGainDelay = self->streamInfo.aacSamplesPerFrame; break; @@ -3348,7 +3380,7 @@ &self->samplingRateInfo[streamIndex], (self->frameOK && !(flags & AACDEC_CONCEAL) && !frameOk_butConceal), - flags, self->flags[streamIndex]); + self->aacOutDataHeadroom, flags, self->flags[streamIndex]); self->extGainDelay = self->streamInfo.aacSamplesPerFrame; break; @@ -3360,7 +3392,8 @@ if (!CConceal_TDFading_Applied[c]) { CConceal_TDFading_Applied[c] = CConcealment_TDFading( self->streamInfo.aacSamplesPerFrame, - &self->pAacDecoderStaticChannelInfo[c], pTimeData + offset, 0); + &self->pAacDecoderStaticChannelInfo[c], self->aacOutDataHeadroom, + pTimeData + offset, 0); if (c + 1 < (8) && c < aacChannels - 1) { /* update next TDNoise Seed to avoid muting in case of Parametric * Stereo */ @@ -3382,22 +3415,17 @@ if ((aacChannels == 2) && bsPseudoLr) { int i, offset2; const FIXP_SGL invSqrt2 = FL2FXCONST_SGL(0.707106781186547f); - FIXP_PCM *pTD = pTimeData; + PCM_DEC *pTD = pTimeData; offset2 = timeDataChannelOffset; for (i = 0; i < self->streamInfo.aacSamplesPerFrame; i++) { - FIXP_DBL L = FX_PCM2FX_DBL(pTD[0]); - FIXP_DBL R = FX_PCM2FX_DBL(pTD[offset2]); + FIXP_DBL L = PCM_DEC2FIXP_DBL(pTD[0]); + FIXP_DBL R = PCM_DEC2FIXP_DBL(pTD[offset2]); L = fMult(L, invSqrt2); R = fMult(R, invSqrt2); -#if (SAMPLE_BITS == 16) - pTD[0] = FX_DBL2FX_PCM(fAddSaturate(L + R, (FIXP_DBL)0x8000)); - pTD[offset2] = FX_DBL2FX_PCM(fAddSaturate(L - R, (FIXP_DBL)0x8000)); -#else - pTD[0] = FX_DBL2FX_PCM(L + R); - pTD[offset2] = FX_DBL2FX_PCM(L - R); -#endif + pTD[0] = L + R; + pTD[offset2] = L - R; pTD++; } } @@ -3408,9 +3436,15 @@ self->hDrcInfo, bs, self->pAacDecoderStaticChannelInfo, pce->ElementInstanceTag, drcChMap, aacChannels); if (mapped > 0) { - /* If at least one DRC thread has been mapped to a channel threre was DRC - * data in the bitstream. */ - self->flags[streamIndex] |= AC_DRC_PRESENT; + if (!(self->flags[streamIndex] & (AC_USAC | AC_RSV603DA))) { + /* If at least one DRC thread has been mapped to a channel there was DRC + * data in the bitstream. */ + self->flags[streamIndex] |= AC_DRC_PRESENT; + } else { + self->hDrcInfo->enable = 0; + self->hDrcInfo->progRefLevelPresent = 0; + ErrorStatus = AAC_DEC_UNSUPPORTED_FORMAT; + } } } diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdecoder.h fdk-aac-2.0.2/libAACdec/src/aacdecoder.h --- fdk-aac-2.0.1/libAACdec/src/aacdecoder.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdecoder.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -191,6 +191,9 @@ INT outputInterleaved; /*!< PCM output format (interleaved/none interleaved). */ + INT aacOutDataHeadroom; /*!< Headroom of the output time signal to prevent + clipping */ + HANDLE_TRANSPORTDEC hInput; /*!< Transport layer handle. */ SamplingRateInfo @@ -235,6 +238,7 @@ CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo[(8)]; /*!< Persistent channel memory */ + FIXP_DBL *workBufferCore1; FIXP_DBL *workBufferCore2; PCM_DEC *pTimeData2; INT timeData2Size; @@ -311,11 +315,10 @@ UCHAR limiterEnableUser; /*!< The limiter configuration requested by the library user */ UCHAR limiterEnableCurr; /*!< The current limiter configuration. */ + FIXP_DBL extGain[1]; /*!< Gain that must be applied to the output signal. */ UINT extGainDelay; /*!< Delay that must be accounted for extGain. */ - INT_PCM pcmOutputBuffer[(8) * (1024 * 2)]; - HANDLE_DRC_DECODER hUniDrcDecoder; UCHAR multibandDrcPresent; UCHAR numTimeSlots; @@ -427,7 +430,7 @@ \return error status */ LINKSPEC_H AAC_DECODER_ERROR CAacDecoder_DecodeFrame( - HANDLE_AACDECODER self, const UINT flags, FIXP_PCM *pTimeData, + HANDLE_AACDECODER self, const UINT flags, PCM_DEC *pTimeData, const INT timeDataSize, const int timeDataChannelOffset); /* Free config dependent AAC memory */ diff -Nru fdk-aac-2.0.1/libAACdec/src/aacdecoder_lib.cpp fdk-aac-2.0.2/libAACdec/src/aacdecoder_lib.cpp --- fdk-aac-2.0.1/libAACdec/src/aacdecoder_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aacdecoder_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -119,10 +119,10 @@ /* Decoder library info */ #define AACDECODER_LIB_VL0 3 -#define AACDECODER_LIB_VL1 0 +#define AACDECODER_LIB_VL1 2 #define AACDECODER_LIB_VL2 0 #define AACDECODER_LIB_TITLE "AAC Decoder Lib" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define AACDECODER_LIB_BUILD_DATE "" #define AACDECODER_LIB_BUILD_TIME "" #else @@ -823,11 +823,15 @@ case AAC_DRC_ATTENUATION_FACTOR: /* DRC compression factor (where 0 is no and 127 is max compression) */ errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_CUT_SCALE, value); + uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_COMPRESS, + value * (FL2FXCONST_DBL(0.5f / 127.0f))); break; case AAC_DRC_BOOST_FACTOR: /* DRC boost factor (where 0 is no and 127 is max boost) */ errorStatus = aacDecoder_drcSetParam(hDrcInfo, DRC_BOOST_SCALE, value); + uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_BOOST, + value * (FL2FXCONST_DBL(0.5f / 127.0f))); break; case AAC_DRC_REFERENCE_LEVEL: @@ -871,6 +875,11 @@ uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_EFFECT_TYPE, (FIXP_DBL)value); break; + case AAC_UNIDRC_ALBUM_MODE: + uniDrcErr = FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_ALBUM_MODE, + (FIXP_DBL)value); + break; + case AAC_TPDEC_CLEAR_BUFFER: errTp = transportDec_SetParam(hTpDec, TPDEC_PARAM_RESET, 1); self->streamInfo.numLostAccessUnits = 0; @@ -1124,35 +1133,31 @@ return n; } -LINKSPEC_CPP AAC_DECODER_ERROR -aacDecoder_DecodeFrame(HANDLE_AACDECODER self, INT_PCM *pTimeData_extern, - const INT timeDataSize_extern, const UINT flags) { +LINKSPEC_CPP AAC_DECODER_ERROR aacDecoder_DecodeFrame(HANDLE_AACDECODER self, + INT_PCM *pTimeData, + const INT timeDataSize, + const UINT flags) { AAC_DECODER_ERROR ErrorStatus; INT layer; INT nBits; + INT timeData2Size; + INT timeData3Size; + INT timeDataHeadroom; HANDLE_FDK_BITSTREAM hBs; int fTpInterruption = 0; /* Transport originated interruption detection. */ int fTpConceal = 0; /* Transport originated concealment. */ - INT_PCM *pTimeData = NULL; - INT timeDataSize = 0; UINT accessUnit = 0; UINT numAccessUnits = 1; UINT numPrerollAU = 0; - int fEndAuNotAdjusted = 0; /* The end of the access unit was not adjusted */ - int applyCrossfade = 1; /* flag indicates if flushing was possible */ - FIXP_PCM *pTimeDataFixpPcm; /* Signal buffer for decoding process before PCM - processing */ - INT timeDataFixpPcmSize; - PCM_DEC *pTimeDataPcmPost; /* Signal buffer for PCM post-processing */ - INT timeDataPcmPostSize; + int fEndAuNotAdjusted = 0; /* The end of the access unit was not adjusted */ + int applyCrossfade = 1; /* flag indicates if flushing was possible */ + PCM_DEC *pTimeData2; + PCM_AAC *pTimeData3; if (self == NULL) { return AAC_DEC_INVALID_HANDLE; } - pTimeData = self->pcmOutputBuffer; - timeDataSize = sizeof(self->pcmOutputBuffer) / sizeof(*self->pcmOutputBuffer); - if (flags & AACDEC_INTR) { self->streamInfo.numLostAccessUnits = 0; } @@ -1262,9 +1267,9 @@ } /* Signal bit stream interruption to other modules if required. */ - if (fTpInterruption || (flags & AACDEC_INTR)) { + if (fTpInterruption || ((flags & AACDEC_INTR) && (accessUnit == 0))) { aacDecoder_SignalInterruption(self); - if (!(flags & AACDEC_INTR)) { + if (!((flags & AACDEC_INTR) && (accessUnit == 0))) { ErrorStatus = AAC_DEC_TRANSPORT_SYNC_ERROR; goto bail; } @@ -1308,19 +1313,23 @@ /* Use limiter configuration as requested. */ self->limiterEnableCurr = self->limiterEnableUser; } - /* reset limiter gain on a per frame basis */ - self->extGain[0] = FL2FXCONST_DBL(1.0f / (float)(1 << TDL_GAIN_SCALING)); - pTimeDataFixpPcm = pTimeData; - timeDataFixpPcmSize = timeDataSize; + /* reset DRC level normalization gain on a per frame basis */ + self->extGain[0] = AACDEC_DRC_GAIN_INIT_VALUE; + + pTimeData2 = self->pTimeData2; + timeData2Size = self->timeData2Size / sizeof(PCM_DEC); + pTimeData3 = (PCM_AAC *)self->pTimeData2; + timeData3Size = self->timeData2Size / sizeof(PCM_AAC); ErrorStatus = CAacDecoder_DecodeFrame( self, flags | (fTpConceal ? AACDEC_CONCEAL : 0) | ((self->flushStatus && !(flags & AACDEC_CONCEAL)) ? AACDEC_FLUSH : 0), - pTimeDataFixpPcm + 0, timeDataFixpPcmSize, - self->streamInfo.aacSamplesPerFrame + 0); + pTimeData2 + 0, timeData2Size, self->streamInfo.aacSamplesPerFrame + 0); + + timeDataHeadroom = self->aacOutDataHeadroom; /* if flushing for USAC DASH IPF was not possible go on with decoding * preroll */ @@ -1345,7 +1354,7 @@ } } - /* If the current pTimeDataFixpPcm does not contain a valid signal, there + /* If the current pTimeData2 does not contain a valid signal, there * nothing else we can do, so bail. */ if (!IS_OUTPUT_VALID(ErrorStatus)) { goto bail; @@ -1359,10 +1368,10 @@ self->streamInfo.numChannels = self->streamInfo.aacNumChannels; { - FDK_Delay_Apply(&self->usacResidualDelay, - pTimeDataFixpPcm + - 1 * (self->streamInfo.aacSamplesPerFrame + 0) + 0, - self->streamInfo.frameSize, 0); + FDK_Delay_Apply( + &self->usacResidualDelay, + pTimeData2 + 1 * (self->streamInfo.aacSamplesPerFrame + 0) + 0, + self->streamInfo.frameSize, 0); } /* Setting of internal MPS state; may be reset in CAacDecoder_SyncQmfMode @@ -1409,8 +1418,6 @@ } } - self->qmfDomain.globalConf.TDinput = pTimeData; - switch (FDK_QmfDomain_Configure(&self->qmfDomain)) { default: case QMF_DOMAIN_INIT_ERROR: @@ -1467,18 +1474,18 @@ sbrDecoder_SetParam(self->hSbrDecoder, SBR_SKIP_QMF, (self->mpsEnableCurr) ? 2 : 0); - INT_PCM *input; - input = (INT_PCM *)self->workBufferCore2; - FDKmemcpy(input, pTimeData, - sizeof(INT_PCM) * (self->streamInfo.numChannels) * + PCM_AAC *input; + input = (PCM_AAC *)self->workBufferCore2; + FDKmemcpy(input, pTimeData3, + sizeof(PCM_AAC) * (self->streamInfo.numChannels) * (self->streamInfo.frameSize)); /* apply SBR processing */ - sbrError = sbrDecoder_Apply(self->hSbrDecoder, input, pTimeData, - timeDataSize, &self->streamInfo.numChannels, - &self->streamInfo.sampleRate, - &self->mapDescr, self->chMapIndex, - self->frameOK, &self->psPossible); + sbrError = sbrDecoder_Apply( + self->hSbrDecoder, input, pTimeData3, timeData3Size, + &self->streamInfo.numChannels, &self->streamInfo.sampleRate, + &self->mapDescr, self->chMapIndex, self->frameOK, &self->psPossible, + self->aacOutDataHeadroom, &timeDataHeadroom); if (sbrError == SBRDEC_OK) { /* Update data in streaminfo structure. Assume that the SBR upsampling @@ -1557,10 +1564,11 @@ if (err == 0) { err = mpegSurroundDecoder_Apply( (CMpegSurroundDecoder *)self->pMpegSurroundDecoder, - (INT_PCM *)self->workBufferCore2, pTimeData, timeDataSize, + (PCM_AAC *)self->workBufferCore2, pTimeData3, timeData3Size, self->streamInfo.aacSamplesPerFrame, &nChannels, &frameSize, self->streamInfo.sampleRate, self->streamInfo.aot, - self->channelType, self->channelIndices, &self->mapDescr); + self->channelType, self->channelIndices, &self->mapDescr, + self->aacOutDataHeadroom, &timeDataHeadroom); } if (err == MPS_OUTPUT_BUFFER_TOO_SMALL) { @@ -1583,8 +1591,8 @@ self->streamInfo.frameSize = self->mpsFrameSizeLast; /* ... and clear output buffer so that potentially corrupted data does * not reach the framework. */ - FDKmemclear(pTimeData, self->mpsOutChannelsLast * - self->mpsFrameSizeLast * sizeof(INT_PCM)); + FDKmemclear(pTimeData3, self->mpsOutChannelsLast * + self->mpsFrameSizeLast * sizeof(PCM_AAC)); /* Additionally proclaim that this frame had errors during decoding. */ ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; @@ -1605,11 +1613,11 @@ sbrDecoder_SetParam(self->hSbrDecoder, SBR_SKIP_QMF, 1); /* apply SBR processing */ - sbrError = sbrDecoder_Apply(self->hSbrDecoder, pTimeData, pTimeData, - timeDataSize, &self->streamInfo.numChannels, - &self->streamInfo.sampleRate, - &self->mapDescr, self->chMapIndex, - self->frameOK, &self->psPossible); + sbrError = sbrDecoder_Apply( + self->hSbrDecoder, pTimeData3, pTimeData3, timeData3Size, + &self->streamInfo.numChannels, &self->streamInfo.sampleRate, + &self->mapDescr, self->chMapIndex, self->frameOK, &self->psPossible, + self->aacOutDataHeadroom, &timeDataHeadroom); if (sbrError == SBRDEC_OK) { /* Update data in streaminfo structure. Assume that the SBR upsampling @@ -1637,17 +1645,15 @@ } } - /* Use dedicated memory for PCM postprocessing */ - pTimeDataPcmPost = self->pTimeData2; - timeDataPcmPostSize = self->timeData2Size; - { - const int size = - self->streamInfo.frameSize * self->streamInfo.numChannels; - FDK_ASSERT(timeDataPcmPostSize >= size); - for (int i = 0; i < size; i++) { - pTimeDataPcmPost[i] = - (PCM_DEC)FX_PCM2PCM_DEC(pTimeData[i]) >> PCM_OUT_HEADROOM; + if ((INT)PCM_OUT_HEADROOM != timeDataHeadroom) { + for (int i = ((self->streamInfo.frameSize * + self->streamInfo.numChannels) - + 1); + i >= 0; i--) { + pTimeData2[i] = + (PCM_DEC)pTimeData3[i] >> (PCM_OUT_HEADROOM - timeDataHeadroom); + } } } @@ -1669,6 +1675,13 @@ reverseOutChannelMap[ch] = ch; } + /* Update sampleRate and frameSize. This may be necessary in case of + * implicit SBR signaling */ + FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_SAMPLE_RATE, + self->streamInfo.sampleRate); + FDK_drcDec_SetParam(self->hUniDrcDecoder, DRC_DEC_FRAME_SIZE, + self->streamInfo.frameSize); + /* If SBR and/or MPS is active, the DRC gains are aligned to the QMF domain signal before the QMF synthesis. Therefore the DRC gains need to be delayed by the QMF synthesis delay. */ @@ -1695,22 +1708,21 @@ if ((self->streamInfo.numChannels > 1) && (0 || (self->sbrEnabled) || (self->mpsEnableCurr))) { /* interleaving/deinterleaving is performed on upper part of - * pTimeDataPcmPost. Check if this buffer is large enough. */ - if (timeDataPcmPostSize < - (INT)(2 * self->streamInfo.numChannels * - self->streamInfo.frameSize * sizeof(PCM_DEC))) { + * pTimeData2. Check if this buffer is large enough. */ + if (timeData2Size < (INT)(2 * self->streamInfo.numChannels * + self->streamInfo.frameSize)) { ErrorStatus = AAC_DEC_UNKNOWN; goto bail; } needsDeinterleaving = 1; drcWorkBuffer = - (FIXP_DBL *)pTimeDataPcmPost + + (FIXP_DBL *)pTimeData2 + self->streamInfo.numChannels * self->streamInfo.frameSize; FDK_deinterleave( - pTimeDataPcmPost, drcWorkBuffer, self->streamInfo.numChannels, + pTimeData2, drcWorkBuffer, self->streamInfo.numChannels, self->streamInfo.frameSize, self->streamInfo.frameSize); } else { - drcWorkBuffer = (FIXP_DBL *)pTimeDataPcmPost; + drcWorkBuffer = pTimeData2; } /* prepare Loudness Normalisation gain */ @@ -1745,16 +1757,51 @@ if (needsDeinterleaving) { FDK_interleave( - drcWorkBuffer, pTimeDataPcmPost, self->streamInfo.numChannels, + drcWorkBuffer, pTimeData2, self->streamInfo.numChannels, self->streamInfo.frameSize, self->streamInfo.frameSize); } } } + if (FDK_drcDec_GetParam(self->hUniDrcDecoder, DRC_DEC_IS_ACTIVE)) { + /* return output loudness information for MPEG-D DRC */ + LONG outputLoudness = + FDK_drcDec_GetParam(self->hUniDrcDecoder, DRC_DEC_OUTPUT_LOUDNESS); + if (outputLoudness == DRC_DEC_LOUDNESS_NOT_PRESENT) { + /* no valid MPEG-D DRC loudness value contained */ + self->streamInfo.outputLoudness = -1; + } else { + if (outputLoudness > 0) { + /* positive output loudness values (very unusual) are limited to 0 + * dB */ + self->streamInfo.outputLoudness = 0; + } else { + self->streamInfo.outputLoudness = + -(INT)outputLoudness >> + 22; /* negate and scale from e = 7 to e = (31-2) */ + } + } + } else { + /* return output loudness information for MPEG-4 DRC */ + if (self->streamInfo.drcProgRefLev < + 0) { /* no MPEG-4 DRC loudness metadata contained */ + self->streamInfo.outputLoudness = -1; + } else { + if (self->defaultTargetLoudness < + 0) { /* loudness normalization is off */ + self->streamInfo.outputLoudness = self->streamInfo.drcProgRefLev; + } else { + self->streamInfo.outputLoudness = self->defaultTargetLoudness; + } + } + } if (self->streamInfo.extAot != AOT_AAC_SLS) { INT pcmLimiterScale = 0; + INT interleaved = 0; + interleaved |= (self->sbrEnabled) ? 1 : 0; + interleaved |= (self->mpsEnableCurr) ? 1 : 0; PCMDMX_ERROR dmxErr = PCMDMX_OK; - if (flags & (AACDEC_INTR)) { + if ((flags & AACDEC_INTR) && (accessUnit == 0)) { /* delete data from the past (e.g. mixdown coeficients) */ pcmDmx_Reset(self->hPcmUtils, PCMDMX_RESET_BS_DATA); } @@ -1765,17 +1812,12 @@ } } - INT interleaved = 0; - interleaved |= (self->sbrEnabled) ? 1 : 0; - interleaved |= (self->mpsEnableCurr) ? 1 : 0; - /* do PCM post processing */ - dmxErr = pcmDmx_ApplyFrame( - self->hPcmUtils, pTimeDataPcmPost, timeDataFixpPcmSize, - self->streamInfo.frameSize, &self->streamInfo.numChannels, - interleaved, self->channelType, self->channelIndices, - &self->mapDescr, - (self->limiterEnableCurr) ? &pcmLimiterScale : NULL); + dmxErr = pcmDmx_ApplyFrame(self->hPcmUtils, pTimeData2, timeData2Size, + self->streamInfo.frameSize, + &self->streamInfo.numChannels, interleaved, + self->channelType, self->channelIndices, + &self->mapDescr, &pcmLimiterScale); if (dmxErr == PCMDMX_OUTPUT_BUFFER_TOO_SMALL) { ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL; goto bail; @@ -1787,13 +1829,35 @@ ErrorStatus = AAC_DEC_DECODE_FRAME_ERROR; } + pcmLimiterScale += PCM_OUT_HEADROOM; + if (flags & AACDEC_CLRHIST) { if (!(self->flags[0] & AC_USAC)) { + /* Reset DRC data */ + aacDecoder_drcReset(self->hDrcInfo); /* Delete the delayed signal. */ pcmLimiter_Reset(self->hLimiter); } } + /* Set applyExtGain if DRC processing is enabled and if + progRefLevelPresent is present for the first time. Consequences: The + headroom of the output signal can be set to AACDEC_DRC_GAIN_SCALING + only for audio formats which support legacy DRC Level Normalization. + For all other audio formats the headroom of the output + signal is set to PCM_OUT_HEADROOM. */ + if (self->hDrcInfo->enable && + (self->hDrcInfo->progRefLevelPresent == 1)) { + self->hDrcInfo->applyExtGain |= 1; + } + + /* Check whether time data buffer is large enough. */ + if (timeDataSize < + (self->streamInfo.numChannels * self->streamInfo.frameSize)) { + ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL; + goto bail; + } + if (self->limiterEnableCurr) { /* use workBufferCore2 buffer for interleaving */ PCM_LIM *pInterleaveBuffer; @@ -1802,44 +1866,72 @@ /* Set actual signal parameters */ pcmLimiter_SetNChannels(self->hLimiter, self->streamInfo.numChannels); pcmLimiter_SetSampleRate(self->hLimiter, self->streamInfo.sampleRate); - pcmLimiterScale += PCM_OUT_HEADROOM; if ((self->streamInfo.numChannels == 1) || (self->sbrEnabled) || (self->mpsEnableCurr)) { - pInterleaveBuffer = (PCM_LIM *)pTimeDataPcmPost; + pInterleaveBuffer = (PCM_LIM *)pTimeData2; } else { - pInterleaveBuffer = (PCM_LIM *)pTimeData; + pInterleaveBuffer = (PCM_LIM *)self->workBufferCore2; + /* applyLimiter requests for interleaved data */ /* Interleave ouput buffer */ - FDK_interleave(pTimeDataPcmPost, pInterleaveBuffer, + FDK_interleave(pTimeData2, pInterleaveBuffer, self->streamInfo.numChannels, blockLength, self->streamInfo.frameSize); } + FIXP_DBL *pGainPerSample = NULL; + + if (self->hDrcInfo->enable && self->hDrcInfo->applyExtGain) { + pGainPerSample = self->workBufferCore1; + + if ((INT)GetRequiredMemWorkBufferCore1() < + (INT)(self->streamInfo.frameSize * sizeof(FIXP_DBL))) { + ErrorStatus = AAC_DEC_UNKNOWN; + goto bail; + } + + pcmLimiterScale = applyDrcLevelNormalization( + self->hDrcInfo, (PCM_DEC *)pInterleaveBuffer, self->extGain, + pGainPerSample, pcmLimiterScale, self->extGainDelay, + self->streamInfo.frameSize, self->streamInfo.numChannels, 1, 1); + } + pcmLimiter_Apply(self->hLimiter, pInterleaveBuffer, pTimeData, - self->extGain, &pcmLimiterScale, 1, - self->extGainDelay, self->streamInfo.frameSize); + pGainPerSample, pcmLimiterScale, + self->streamInfo.frameSize); { /* Announce the additional limiter output delay */ self->streamInfo.outputDelay += pcmLimiter_GetDelay(self->hLimiter); } } else { + if (self->hDrcInfo->enable && self->hDrcInfo->applyExtGain) { + pcmLimiterScale = applyDrcLevelNormalization( + self->hDrcInfo, pTimeData2, self->extGain, NULL, + pcmLimiterScale, self->extGainDelay, self->streamInfo.frameSize, + self->streamInfo.numChannels, + (interleaved || (self->streamInfo.numChannels == 1)) + ? 1 + : self->streamInfo.frameSize, + 0); + } + /* If numChannels = 1 we do not need interleaving. The same applies if SBR or MPS are used, since their output is interleaved already (resampled or not) */ if ((self->streamInfo.numChannels == 1) || (self->sbrEnabled) || (self->mpsEnableCurr)) { scaleValuesSaturate( - pTimeData, pTimeDataPcmPost, + pTimeData, pTimeData2, self->streamInfo.frameSize * self->streamInfo.numChannels, - PCM_OUT_HEADROOM); + pcmLimiterScale); } else { scaleValuesSaturate( - (INT_PCM *)self->workBufferCore2, pTimeDataPcmPost, + (INT_PCM *)self->workBufferCore2, pTimeData2, self->streamInfo.frameSize * self->streamInfo.numChannels, - PCM_OUT_HEADROOM); + pcmLimiterScale); /* Interleave ouput buffer */ FDK_interleave((INT_PCM *)self->workBufferCore2, pTimeData, self->streamInfo.numChannels, @@ -1935,20 +2027,8 @@ ErrorStatus = AAC_DEC_UNKNOWN; } - /* Check whether external output buffer is large enough. */ - if (timeDataSize_extern < - self->streamInfo.numChannels * self->streamInfo.frameSize) { - ErrorStatus = AAC_DEC_OUTPUT_BUFFER_TOO_SMALL; - } - - /* Update external output buffer. */ - if (IS_OUTPUT_VALID(ErrorStatus)) { - FDKmemcpy(pTimeData_extern, pTimeData, - self->streamInfo.numChannels * self->streamInfo.frameSize * - sizeof(*pTimeData)); - } else { - FDKmemclear(pTimeData_extern, - timeDataSize_extern * sizeof(*pTimeData_extern)); + if (!IS_OUTPUT_VALID(ErrorStatus)) { + FDKmemclear(pTimeData, timeDataSize * sizeof(*pTimeData)); } return ErrorStatus; diff -Nru fdk-aac-2.0.1/libAACdec/src/aac_ram.cpp fdk-aac-2.0.2/libAACdec/src/aac_ram.cpp --- fdk-aac-2.0.1/libAACdec/src/aac_ram.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aac_ram.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -105,12 +105,7 @@ #define WORKBUFFER1_TAG 0 #define WORKBUFFER2_TAG 1 - -#define WORKBUFFER3_TAG 4 -#define WORKBUFFER4_TAG 5 - #define WORKBUFFER5_TAG 6 - #define WORKBUFFER6_TAG 7 /*! The structure AAC_DECODER_INSTANCE is the top level structure holding all @@ -169,9 +164,6 @@ C_ALLOC_MEM_OVERLAY(WorkBufferCore2, FIXP_DBL, ((8) * 1024), SECT_DATA_L2, WORKBUFFER2_TAG) -C_ALLOC_MEM_OVERLAY(WorkBufferCore3, FIXP_DBL, WB_SECTION_SIZE, SECT_DATA_L2, - WORKBUFFER3_TAG) -C_AALLOC_MEM(WorkBufferCore4, FIXP_DBL, WB_SECTION_SIZE) C_ALLOC_MEM_OVERLAY(WorkBufferCore6, SCHAR, fMax((INT)(sizeof(FIXP_DBL) * WB_SECTION_SIZE), (INT)sizeof(CAacDecoderCommonData)), diff -Nru fdk-aac-2.0.1/libAACdec/src/aac_ram.h fdk-aac-2.0.2/libAACdec/src/aac_ram.h --- fdk-aac-2.0.1/libAACdec/src/aac_ram.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aac_ram.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -136,12 +136,7 @@ H_ALLOC_MEM_OVERLAY(WorkBufferCore1, CWorkBufferCore1) H_ALLOC_MEM_OVERLAY(WorkBufferCore2, FIXP_DBL) - -H_ALLOC_MEM_OVERLAY(WorkBufferCore3, FIXP_DBL) -H_ALLOC_MEM(WorkBufferCore4, FIXP_DBL) - H_ALLOC_MEM_OVERLAY(WorkBufferCore5, PCM_DEC) - H_ALLOC_MEM_OVERLAY(WorkBufferCore6, SCHAR) #endif /* #ifndef AAC_RAM_H */ diff -Nru fdk-aac-2.0.1/libAACdec/src/aac_rom.h fdk-aac-2.0.2/libAACdec/src/aac_rom.h --- fdk-aac-2.0.1/libAACdec/src/aac_rom.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/aac_rom.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -108,6 +108,7 @@ #include "aacdec_hcr_types.h" #include "aacdec_hcrs.h" +#define PCM_AAC LONG #define PCM_DEC FIXP_DBL #define MAXVAL_PCM_DEC MAXVAL_DBL #define MINVAL_PCM_DEC MINVAL_DBL diff -Nru fdk-aac-2.0.1/libAACdec/src/block.cpp fdk-aac-2.0.2/libAACdec/src/block.cpp --- fdk-aac-2.0.1/libAACdec/src/block.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/block.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -1015,9 +1015,9 @@ void CBlock_FrequencyToTime( CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[], + CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[], const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1, - UINT elFlags, INT elCh) { + const INT aacOutDataHeadroom, UINT elFlags, INT elCh) { int fr, fl, tl, nSpec; #if defined(FDK_ASSERT_ENABLE) @@ -1213,6 +1213,7 @@ bass_pf_1sf_delay(p2_synth, pitch, pit_gain, frameLen, (LpdSfd + 2) * L_SUBFR + BPF_SFD * L_SUBFR, frameLen - (LpdSfd + 4) * L_SUBFR, outSamples, + aacOutDataHeadroom, pAacDecoderStaticChannelInfo->mem_bpf); } @@ -1236,7 +1237,8 @@ ? MLT_FLAG_CURR_ALIAS_SYMMETRY : 0); - scaleValuesSaturate(outSamples, tmp, frameLen, MDCT_OUT_HEADROOM); + scaleValuesSaturate(outSamples, tmp, frameLen, + MDCT_OUT_HEADROOM - aacOutDataHeadroom); } } @@ -1251,7 +1253,7 @@ #include "ldfiltbank.h" void CBlock_FrequencyToTimeLowDelay( CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[], + CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[], const short frameLen) { InvMdctTransformLowDelay_fdk( SPEC_LONG(pAacDecoderChannelInfo->pSpectralCoefficient), diff -Nru fdk-aac-2.0.1/libAACdec/src/block.h fdk-aac-2.0.2/libAACdec/src/block.h --- fdk-aac-2.0.1/libAACdec/src/block.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/block.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -218,16 +218,16 @@ */ void CBlock_FrequencyToTime( CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[], + CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[], const SHORT frameLen, const int frameOk, FIXP_DBL *pWorkBuffer1, - UINT elFlags, INT elCh); + const INT aacOutDataHeadroom, UINT elFlags, INT elCh); /** * \brief Transform double lapped MDCT (AAC-ELD) spectral data into time domain. */ void CBlock_FrequencyToTimeLowDelay( CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM outSamples[], + CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC outSamples[], const short frameLen); AAC_DECODER_ERROR CBlock_InverseQuantizeSpectralData( diff -Nru fdk-aac-2.0.1/libAACdec/src/conceal.cpp fdk-aac-2.0.2/libAACdec/src/conceal.cpp --- fdk-aac-2.0.1/libAACdec/src/conceal.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/conceal.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -226,7 +226,7 @@ /* TimeDomainFading */ static void CConcealment_TDFadePcmAtt(int start, int len, FIXP_DBL fadeStart, - FIXP_DBL fadeStop, FIXP_PCM *pcmdata); + FIXP_DBL fadeStop, PCM_DEC *pcmdata); static void CConcealment_TDFadeFillFadingStations(FIXP_DBL *fadingStations, int *fadingSteps, FIXP_DBL fadeStop, @@ -242,7 +242,9 @@ static int CConcealment_TDNoise_Random(ULONG *seed); static void CConcealment_TDNoise_Apply(CConcealmentInfo *const pConcealmentInfo, - const int len, FIXP_PCM *const pcmdata); + const int len, + const INT aacOutDataHeadroom, + PCM_DEC *const pcmdata); static BLOCK_TYPE CConcealment_GetWinSeq(int prevWinSeq) { BLOCK_TYPE newWinSeq = BLOCK_LONG; @@ -1228,7 +1230,6 @@ int sfb, line = 0; int fac_shift; int fac_mod; - FIXP_DBL accu; for (sfb = 0; sfb < sfbCnt; sfb++) { fac_shift = @@ -1236,15 +1237,11 @@ fac_mod = fac_shift & 3; fac_shift = (fac_shift >> 2) + 1; fac_shift += *pSpecScalePrv - fixMax(*pSpecScalePrv, *pSpecScaleAct); + fac_shift = fMax(fMin(fac_shift, DFRACT_BITS - 1), -(DFRACT_BITS - 1)); for (; line < pSfbOffset[sfb + 1]; line++) { - accu = fMult(*(spectrum + line), facMod4Table[fac_mod]); - if (fac_shift < 0) { - accu >>= -fac_shift; - } else { - accu <<= fac_shift; - } - *(spectrum + line) = accu; + FIXP_DBL accu = fMult(*(spectrum + line), facMod4Table[fac_mod]); + *(spectrum + line) = scaleValue(accu, fac_shift); } } *pSpecScaleOut = fixMax(*pSpecScalePrv, *pSpecScaleAct); @@ -1618,7 +1615,7 @@ } if (packedSign & 0x1) { - spec[i] = -spec[i]; + spec[i] = -fMax(spec[i], (FIXP_DBL)(MINVAL_DBL + 1)); } packedSign >>= 1; @@ -1849,7 +1846,7 @@ INT CConcealment_TDFading( int len, CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo, - FIXP_PCM *pcmdata, FIXP_PCM *pcmdata_1) { + const INT aacOutDataHeadroom, PCM_DEC *pcmdata, PCM_DEC *pcmdata_1) { /* Do the fading in Time domain based on concealment states and core mode */ @@ -1962,7 +1959,8 @@ start += len; } } - CConcealment_TDNoise_Apply(pConcealmentInfo, len, pcmdata); + CConcealment_TDNoise_Apply(pConcealmentInfo, len, aacOutDataHeadroom, + pcmdata); /* Save end-of-frame attenuation and fading type */ pConcealmentInfo->lastFadingType = fadingType; @@ -1974,12 +1972,11 @@ /* attenuate pcmdata in Time Domain Fading process */ static void CConcealment_TDFadePcmAtt(int start, int len, FIXP_DBL fadeStart, - FIXP_DBL fadeStop, FIXP_PCM *pcmdata) { + FIXP_DBL fadeStop, PCM_DEC *pcmdata) { int i; FIXP_DBL dStep; FIXP_DBL dGain; FIXP_DBL dGain_apply; - int bitshift = (DFRACT_BITS - SAMPLE_BITS); /* set start energy */ dGain = fadeStart; @@ -1992,7 +1989,7 @@ */ dGain_apply = fMax((FIXP_DBL)0, dGain); /* finally, attenuate samples */ - pcmdata[i] = (FIXP_PCM)((fMult(pcmdata[i], (dGain_apply))) >> bitshift); + pcmdata[i] = FIXP_DBL2PCM_DEC(fMult(pcmdata[i], dGain_apply)); } } @@ -2055,9 +2052,11 @@ } static void CConcealment_TDNoise_Apply(CConcealmentInfo *const pConcealmentInfo, - const int len, FIXP_PCM *const pcmdata) { - FIXP_PCM *states = pConcealmentInfo->TDNoiseStates; - FIXP_PCM noiseVal; + const int len, + const INT aacOutDataHeadroom, + PCM_DEC *const pcmdata) { + PCM_DEC *states = pConcealmentInfo->TDNoiseStates; + PCM_DEC noiseVal; FIXP_DBL noiseValLong; FIXP_SGL *coef = pConcealmentInfo->TDNoiseCoef; FIXP_DBL TDNoiseAtt; @@ -2075,18 +2074,20 @@ /* create filtered noise */ states[2] = states[1]; states[1] = states[0]; - states[0] = ((FIXP_PCM)CConcealment_TDNoise_Random(&seed)); + states[0] = + FIXP_DBL2PCM_DEC((FIXP_DBL)CConcealment_TDNoise_Random(&seed)); noiseValLong = fMult(states[0], coef[0]) + fMult(states[1], coef[1]) + fMult(states[2], coef[2]); - noiseVal = FX_DBL2FX_PCM(fMult(noiseValLong, TDNoiseAtt)); + noiseVal = FIXP_DBL2PCM_DEC(fMult(noiseValLong, TDNoiseAtt) >> + aacOutDataHeadroom); /* add filtered noise - check for clipping, before */ - if (noiseVal > (FIXP_PCM)0 && - pcmdata[ii] > (FIXP_PCM)MAXVAL_FIXP_PCM - noiseVal) { - noiseVal = noiseVal * (FIXP_PCM)-1; - } else if (noiseVal < (FIXP_PCM)0 && - pcmdata[ii] < (FIXP_PCM)MINVAL_FIXP_PCM - noiseVal) { - noiseVal = noiseVal * (FIXP_PCM)-1; + if (noiseVal > (PCM_DEC)0 && + pcmdata[ii] > (PCM_DEC)MAXVAL_PCM_DEC - noiseVal) { + noiseVal = noiseVal * (PCM_DEC)-1; + } else if (noiseVal < (PCM_DEC)0 && + pcmdata[ii] < (PCM_DEC)MINVAL_PCM_DEC - noiseVal) { + noiseVal = noiseVal * (PCM_DEC)-1; } pcmdata[ii] += noiseVal; diff -Nru fdk-aac-2.0.1/libAACdec/src/conceal.h fdk-aac-2.0.2/libAACdec/src/conceal.h --- fdk-aac-2.0.1/libAACdec/src/conceal.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/conceal.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -147,6 +147,6 @@ INT CConcealment_TDFading( int len, CAacDecoderStaticChannelInfo **ppAacDecoderStaticChannelInfo, - FIXP_PCM *pcmdata, FIXP_PCM *pcmdata_1); + const INT aacOutDataHeadroom, PCM_DEC *pcmdata, PCM_DEC *pcmdata_1); #endif /* #ifndef CONCEAL_H */ diff -Nru fdk-aac-2.0.1/libAACdec/src/conceal_types.h fdk-aac-2.0.2/libAACdec/src/conceal_types.h --- fdk-aac-2.0.1/libAACdec/src/conceal_types.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/conceal_types.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -194,7 +194,7 @@ FIXP_DBL last_tcx_gain; INT last_tcx_gain_e; ULONG TDNoiseSeed; - FIXP_PCM TDNoiseStates[3]; + PCM_DEC TDNoiseStates[3]; FIXP_SGL TDNoiseCoef[3]; FIXP_SGL TDNoiseAtt; diff -Nru fdk-aac-2.0.1/libAACdec/src/FDK_delay.cpp fdk-aac-2.0.2/libAACdec/src/FDK_delay.cpp --- fdk-aac-2.0.1/libAACdec/src/FDK_delay.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/FDK_delay.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -113,7 +113,7 @@ if (delay > 0) { data->delay_line = - (INT_PCM*)FDKcalloc(num_channels * delay, sizeof(INT_PCM)); + (PCM_DEC*)FDKcalloc(num_channels * delay, sizeof(PCM_DEC)); if (data->delay_line == NULL) { return -1; } @@ -126,36 +126,36 @@ return 0; } -void FDK_Delay_Apply(FDK_SignalDelay* data, FIXP_PCM* time_buffer, +void FDK_Delay_Apply(FDK_SignalDelay* data, PCM_DEC* time_buffer, const UINT frame_length, const UCHAR channel) { FDK_ASSERT(data != NULL); if (data->delay > 0) { - C_ALLOC_SCRATCH_START(tmp, FIXP_PCM, MAX_FRAME_LENGTH) + C_ALLOC_SCRATCH_START(tmp, PCM_DEC, MAX_FRAME_LENGTH) FDK_ASSERT(frame_length <= MAX_FRAME_LENGTH); FDK_ASSERT(channel < data->num_channels); FDK_ASSERT(time_buffer != NULL); if (frame_length >= data->delay) { FDKmemcpy(tmp, &time_buffer[frame_length - data->delay], - data->delay * sizeof(FIXP_PCM)); + data->delay * sizeof(PCM_DEC)); FDKmemmove(&time_buffer[data->delay], &time_buffer[0], - (frame_length - data->delay) * sizeof(FIXP_PCM)); + (frame_length - data->delay) * sizeof(PCM_DEC)); FDKmemcpy(&time_buffer[0], &data->delay_line[channel * data->delay], - data->delay * sizeof(FIXP_PCM)); + data->delay * sizeof(PCM_DEC)); FDKmemcpy(&data->delay_line[channel * data->delay], tmp, - data->delay * sizeof(FIXP_PCM)); + data->delay * sizeof(PCM_DEC)); } else { - FDKmemcpy(tmp, &time_buffer[0], frame_length * sizeof(FIXP_PCM)); + FDKmemcpy(tmp, &time_buffer[0], frame_length * sizeof(PCM_DEC)); FDKmemcpy(&time_buffer[0], &data->delay_line[channel * data->delay], - frame_length * sizeof(FIXP_PCM)); + frame_length * sizeof(PCM_DEC)); FDKmemcpy(&data->delay_line[channel * data->delay], &data->delay_line[channel * data->delay + frame_length], - (data->delay - frame_length) * sizeof(FIXP_PCM)); + (data->delay - frame_length) * sizeof(PCM_DEC)); FDKmemcpy(&data->delay_line[channel * data->delay + (data->delay - frame_length)], - tmp, frame_length * sizeof(FIXP_PCM)); + tmp, frame_length * sizeof(PCM_DEC)); } - C_ALLOC_SCRATCH_END(tmp, FIXP_PCM, MAX_FRAME_LENGTH) + C_ALLOC_SCRATCH_END(tmp, PCM_DEC, MAX_FRAME_LENGTH) } return; diff -Nru fdk-aac-2.0.1/libAACdec/src/FDK_delay.h fdk-aac-2.0.2/libAACdec/src/FDK_delay.h --- fdk-aac-2.0.1/libAACdec/src/FDK_delay.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/FDK_delay.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -109,7 +109,7 @@ * Structure representing one delay element for multiple channels. */ typedef struct { - INT_PCM* delay_line; /*!< Pointer which stores allocated delay line. */ + PCM_DEC* delay_line; /*!< Pointer which stores allocated delay line. */ USHORT delay; /*!< Delay required in samples (per channel). */ UCHAR num_channels; /*!< Number of channels to delay. */ } FDK_SignalDelay; @@ -137,7 +137,7 @@ * * \return void */ -void FDK_Delay_Apply(FDK_SignalDelay* data, FIXP_PCM* time_buffer, +void FDK_Delay_Apply(FDK_SignalDelay* data, PCM_DEC* time_buffer, const UINT frame_length, const UCHAR channel); /** diff -Nru fdk-aac-2.0.1/libAACdec/src/ldfiltbank.cpp fdk-aac-2.0.2/libAACdec/src/ldfiltbank.cpp --- fdk-aac-2.0.1/libAACdec/src/ldfiltbank.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/ldfiltbank.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -112,17 +112,20 @@ #if defined(__arm__) #endif -static void multE2_DinvF_fdk(FIXP_PCM *output, FIXP_DBL *x, const FIXP_WTB *fb, +static void multE2_DinvF_fdk(PCM_DEC *output, FIXP_DBL *x, const FIXP_WTB *fb, FIXP_DBL *z, const int N) { int i; - /* scale for FIXP_DBL -> INT_PCM conversion. */ - const int scale = (DFRACT_BITS - SAMPLE_BITS) - LDFB_HEADROOM; -#if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) + /* scale for FIXP_DBL -> PCM_DEC conversion: */ + const int scale = (DFRACT_BITS - PCM_OUT_BITS) - LDFB_HEADROOM + (3); + +#if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0) FIXP_DBL rnd_val_wts0 = (FIXP_DBL)0; FIXP_DBL rnd_val_wts1 = (FIXP_DBL)0; +#if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - WTS0 - 1) > 0) if (-WTS0 - 1 + scale) rnd_val_wts0 = (FIXP_DBL)(1 << (-WTS0 - 1 + scale - 1)); +#endif if (-WTS1 - 1 + scale) rnd_val_wts1 = (FIXP_DBL)(1 << (-WTS1 - 1 + scale - 1)); #endif @@ -131,24 +134,26 @@ FIXP_DBL z0, z2, tmp; z2 = x[N / 2 + i]; - z0 = z2 + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1)); + z0 = fAddSaturate(z2, + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1))); - z[N / 2 + i] = x[N / 2 - 1 - i] + - (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1)); + z[N / 2 + i] = fAddSaturate( + x[N / 2 - 1 - i], + (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1))); tmp = (fMultDiv2(z[N / 2 + i], fb[N + N / 2 - 1 - i]) + fMultDiv2(z[i], fb[N + N / 2 + i])); -#if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) +#if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0) FDK_ASSERT((-WTS1 - 1 + scale) >= 0); FDK_ASSERT(tmp <= ((FIXP_DBL)0x7FFFFFFF - rnd_val_wts1)); /* rounding must not cause overflow */ - output[(N * 3 / 4 - 1 - i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( + output[(N * 3 / 4 - 1 - i)] = (PCM_DEC)SATURATE_RIGHT_SHIFT( tmp + rnd_val_wts1, -WTS1 - 1 + scale, PCM_OUT_BITS); #else FDK_ASSERT((WTS1 + 1 - scale) >= 0); output[(N * 3 / 4 - 1 - i)] = - (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp, WTS1 + 1 - scale, PCM_OUT_BITS); + (PCM_DEC)SATURATE_LEFT_SHIFT(tmp, WTS1 + 1 - scale, PCM_OUT_BITS); #endif z[i] = z0; @@ -159,32 +164,34 @@ FIXP_DBL z0, z2, tmp0, tmp1; z2 = x[N / 2 + i]; - z0 = z2 + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1)); + z0 = fAddSaturate(z2, + (fMultDiv2(z[N / 2 + i], fb[2 * N + i]) >> (-WTS2 - 1))); - z[N / 2 + i] = x[N / 2 - 1 - i] + - (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1)); + z[N / 2 + i] = fAddSaturate( + x[N / 2 - 1 - i], + (fMultDiv2(z[N + i], fb[2 * N + N / 2 + i]) >> (-WTS2 - 1))); tmp0 = (fMultDiv2(z[N / 2 + i], fb[N / 2 - 1 - i]) + fMultDiv2(z[i], fb[N / 2 + i])); tmp1 = (fMultDiv2(z[N / 2 + i], fb[N + N / 2 - 1 - i]) + fMultDiv2(z[i], fb[N + N / 2 + i])); -#if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) +#if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0) FDK_ASSERT((-WTS0 - 1 + scale) >= 0); FDK_ASSERT(tmp0 <= ((FIXP_DBL)0x7FFFFFFF - rnd_val_wts0)); /* rounding must not cause overflow */ FDK_ASSERT(tmp1 <= ((FIXP_DBL)0x7FFFFFFF - rnd_val_wts1)); /* rounding must not cause overflow */ - output[(i - N / 4)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( + output[(i - N / 4)] = (PCM_DEC)SATURATE_RIGHT_SHIFT( tmp0 + rnd_val_wts0, -WTS0 - 1 + scale, PCM_OUT_BITS); - output[(N * 3 / 4 - 1 - i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( + output[(N * 3 / 4 - 1 - i)] = (PCM_DEC)SATURATE_RIGHT_SHIFT( tmp1 + rnd_val_wts1, -WTS1 - 1 + scale, PCM_OUT_BITS); #else FDK_ASSERT((WTS0 + 1 - scale) >= 0); output[(i - N / 4)] = - (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS); + (PCM_DEC)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS); output[(N * 3 / 4 - 1 - i)] = - (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp1, WTS1 + 1 - scale, PCM_OUT_BITS); + (PCM_DEC)SATURATE_LEFT_SHIFT(tmp1, WTS1 + 1 - scale, PCM_OUT_BITS); #endif z[i] = z0; z[N + i] = z2; @@ -194,22 +201,22 @@ for (i = 0; i < N / 4; i++) { FIXP_DBL tmp0 = fMultDiv2(z[i], fb[N / 2 + i]); -#if ((DFRACT_BITS - SAMPLE_BITS - LDFB_HEADROOM) > 0) +#if ((DFRACT_BITS - PCM_OUT_BITS - LDFB_HEADROOM + (3) - 1) > 0) FDK_ASSERT((-WTS0 - 1 + scale) >= 0); FDK_ASSERT(tmp0 <= ((FIXP_DBL)0x7FFFFFFF - rnd_val_wts0)); /* rounding must not cause overflow */ - output[(N * 3 / 4 + i)] = (FIXP_PCM)SATURATE_RIGHT_SHIFT( + output[(N * 3 / 4 + i)] = (PCM_DEC)SATURATE_RIGHT_SHIFT( tmp0 + rnd_val_wts0, -WTS0 - 1 + scale, PCM_OUT_BITS); #else FDK_ASSERT((WTS0 + 1 - scale) >= 0); output[(N * 3 / 4 + i)] = - (FIXP_PCM)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS); + (PCM_DEC)SATURATE_LEFT_SHIFT(tmp0, WTS0 + 1 - scale, PCM_OUT_BITS); #endif } } int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctData, const int mdctData_e, - FIXP_PCM *output, FIXP_DBL *fs_buffer, + PCM_DEC *output, FIXP_DBL *fs_buffer, const int N) { const FIXP_WTB *coef; FIXP_DBL gain = (FIXP_DBL)0; diff -Nru fdk-aac-2.0.1/libAACdec/src/ldfiltbank.h fdk-aac-2.0.2/libAACdec/src/ldfiltbank.h --- fdk-aac-2.0.1/libAACdec/src/ldfiltbank.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/ldfiltbank.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -104,9 +104,10 @@ #define LDFILTBANK_H #include "common_fix.h" +#include "aac_rom.h" int InvMdctTransformLowDelay_fdk(FIXP_DBL *mdctdata_m, const int mdctdata_e, - FIXP_PCM *mdctOut, FIXP_DBL *fs_buffer, + PCM_DEC *mdctOut, FIXP_DBL *fs_buffer, const int frameLength); #endif diff -Nru fdk-aac-2.0.1/libAACdec/src/stereo.cpp fdk-aac-2.0.2/libAACdec/src/stereo.cpp --- fdk-aac-2.0.1/libAACdec/src/stereo.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/stereo.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -807,19 +807,17 @@ for (int i = 0; i < windowLen; i++) { dmx_re_prev[i] = ((staticSpectralCoeffsL[index_offset + i] >> - srLeftChan) + + fMin(DFRACT_BITS - 1, srLeftChan + 1)) + (staticSpectralCoeffsR[index_offset + i] >> - srRightChan)) >> - 1; + fMin(DFRACT_BITS - 1, srRightChan + 1))); } } else { for (int i = 0; i < windowLen; i++) { dmx_re_prev[i] = ((staticSpectralCoeffsL[index_offset + i] >> - srLeftChan) - + fMin(DFRACT_BITS - 1, srLeftChan + 1)) - (staticSpectralCoeffsR[index_offset + i] >> - srRightChan)) >> - 1; + fMin(DFRACT_BITS - 1, srRightChan + 1))); } } } @@ -854,12 +852,13 @@ if (window == 0) { if (dmx_re_prev_e < frameMaxScale) { if (mainband_flag == 0) { - scaleValues(dmx_re_prev, store_dmx_re_prev, windowLen, - -(frameMaxScale - dmx_re_prev_e)); + scaleValues( + dmx_re_prev, store_dmx_re_prev, windowLen, + -fMin(DFRACT_BITS - 1, (frameMaxScale - dmx_re_prev_e))); } else { - for (int i = 0; i < windowLen; i++) { - dmx_re_prev[i] >>= (frameMaxScale - dmx_re_prev_e); - } + scaleValues( + dmx_re_prev, windowLen, + -fMin(DFRACT_BITS - 1, (frameMaxScale - dmx_re_prev_e))); } } else { if (mainband_flag == 0) { @@ -873,10 +872,9 @@ FDK_ASSERT(pAacDecoderChannelInfo[L]->icsInfo.WindowSequence == BLOCK_SHORT); if (specScaleL[window - 1] < frameMaxScale) { - for (int i = 0; i < windowLen; i++) { - dmx_re[windowLen * (window - 1) + i] >>= - (frameMaxScale - specScaleL[window - 1]); - } + scaleValues(&dmx_re[windowLen * (window - 1)], windowLen, + -fMin(DFRACT_BITS - 1, + (frameMaxScale - specScaleL[window - 1]))); } else { specScaleL[window] = specScaleL[window - 1]; specScaleR[window] = specScaleR[window - 1]; @@ -991,7 +989,7 @@ } /* if ( pJointStereoData->complex_coef == 1 ) */ /* 4. upmix process */ - INT pred_dir = cplxPredictionData->pred_dir ? -1 : 1; + LONG pred_dir = cplxPredictionData->pred_dir ? -1 : 1; /* 0.1 in Q-3.34 */ const FIXP_DBL pointOne = 0x66666666; /* 0.8 */ /* Shift value for the downmix */ @@ -1041,34 +1039,24 @@ the downmix. "dmx_re" and "specL" are two different pointers pointing to separate arrays, which may or may not contain the same data (with different scaling). - */ - /* help1: alpha_re[i] * dmx_re[i] */ - FIXP_DBL help1 = fMultDiv2(alpha_re_tmp, *p2dmxRe++); - - /* tmp: dmx_im[i] */ - FIXP_DBL tmp = (*p2dmxIm++) << shift_dmx; + specL[i] = + (specL[i] + side); + specR[i] = -/+ (specL[i] - side); + */ + FIXP_DBL side, left, right; - /* help2: alpha_im[i] * dmx_im[i] */ - FIXP_DBL help2 = fMultDiv2(alpha_im_tmp, tmp); + side = fMultAddDiv2(fMultDiv2(alpha_re_tmp, *p2dmxRe++), + alpha_im_tmp, (*p2dmxIm++) << shift_dmx); + side = ((*p2CoeffR) >> 2) - + (FIXP_DBL)SATURATE_SHIFT(side, -(help3_shift - 2), + DFRACT_BITS - 2); + + left = ((*p2CoeffL) >> 2) + side; + right = ((*p2CoeffL) >> 2) - side; + right = (FIXP_DBL)((LONG)right * pred_dir); - /* help3: alpha_re[i] * dmx_re[i] + alpha_im[i] * dmx_im[i] */ - FIXP_DBL help3 = help1 + help2; - - /* side (= help4) = specR[i] - (dmx_re[i] * specL[i] + alpha_im[i] - * * dmx_im[i]) */ - FIXP_DBL help4 = *p2CoeffR - scaleValue(help3, help3_shift); - - /* We calculate the left and right output by using the helper - * function */ - /* specR[i] = -/+ (specL[i] - side); */ - *p2CoeffR = - (FIXP_DBL)((LONG)(*p2CoeffL - help4) * (LONG)pred_dir); - p2CoeffR++; - - /* specL[i] = specL[i] + side; */ - *p2CoeffL = *p2CoeffL + help4; - p2CoeffL++; + *p2CoeffL++ = SATURATE_LEFT_SHIFT_ALT(left, 2, DFRACT_BITS); + *p2CoeffR++ = SATURATE_LEFT_SHIFT_ALT(right, 2, DFRACT_BITS); } } diff -Nru fdk-aac-2.0.1/libAACdec/src/usacdec_acelp.cpp fdk-aac-2.0.2/libAACdec/src/usacdec_acelp.cpp --- fdk-aac-2.0.1/libAACdec/src/usacdec_acelp.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/usacdec_acelp.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -131,7 +131,7 @@ int i; for (i = 0; i < L; i++) { - out[i] = in[i] - fMult(PREEMPH_FAC, in[i - 1]); + out[i] = fAddSaturate(in[i], -fMult(PREEMPH_FAC, in[i - 1])); } return; @@ -465,7 +465,9 @@ /* Note: code[L_SUBFR] and exc2[L_SUBFR] share the same memory! If exc2[i] is written, code[i] will be destroyed! */ -#define SF (SF_CODE + SF_GAIN_C + 1 - SF_EXC) +#define SF_HEADROOM (1) +#define SF (SF_CODE + SF_GAIN_C + 1 - SF_EXC - SF_HEADROOM) +#define SF_GAIN_P2 (SF_GAIN_P - SF_HEADROOM) int i; FIXP_DBL tmp, cpe, code_smooth_prev, code_smooth; @@ -477,8 +479,8 @@ cpe = (period_fac >> (2 - SF_PFAC)) + FL2FXCONST_DBL(0.25f); /* u'(n) */ - tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); /* v(0)*g_p */ - *exc++ = tmp + (fMultDiv2(code[0], gain_code) << SF); + tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1); /* v(0)*g_p */ + *exc++ = (tmp + (fMultDiv2(code[0], gain_code) << SF)) << SF_HEADROOM; /* u(n) */ code_smooth_prev = fMultDiv2(*code++, gain_code_smoothed) @@ -487,15 +489,15 @@ code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF; /* c(1) * g_sc */ tmp += code_smooth_prev; /* tmp = v(0)*g_p + c(0)*g_sc */ cpe_code_smooth = fMultDiv2(cpe, code_smooth); - *exc2++ = tmp - cpe_code_smooth; + *exc2++ = (tmp - cpe_code_smooth) << SF_HEADROOM; cpe_code_smooth_prev = fMultDiv2(cpe, code_smooth_prev); i = L_SUBFR - 2; do /* ARM926: 22 cycles per iteration */ { /* u'(n) */ - tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); - *exc++ = tmp + (fMultDiv2(code_i, gain_code) << SF); + tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1); + *exc++ = (tmp + (fMultDiv2(code_i, gain_code) << SF)) << SF_HEADROOM; /* u(n) */ tmp += code_smooth; /* += g_sc * c(i) */ tmp -= cpe_code_smooth_prev; @@ -503,16 +505,17 @@ code_i = *code++; code_smooth = fMultDiv2(code_i, gain_code_smoothed) << SF; cpe_code_smooth = fMultDiv2(cpe, code_smooth); - *exc2++ = tmp - cpe_code_smooth; /* tmp - c_pe * g_sc * c(i+1) */ + *exc2++ = (tmp - cpe_code_smooth) + << SF_HEADROOM; /* tmp - c_pe * g_sc * c(i+1) */ } while (--i != 0); /* u'(n) */ - tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P + 1); - *exc = tmp + (fMultDiv2(code_i, gain_code) << SF); + tmp = fMultDiv2(*exc, gain_pit) << (SF_GAIN_P2 + 1); + *exc = (tmp + (fMultDiv2(code_i, gain_code) << SF)) << SF_HEADROOM; /* u(n) */ tmp += code_smooth; tmp -= cpe_code_smooth_prev; - *exc2++ = tmp; + *exc2++ = tmp << SF_HEADROOM; return; } diff -Nru fdk-aac-2.0.1/libAACdec/src/usacdec_fac.cpp fdk-aac-2.0.2/libAACdec/src/usacdec_fac.cpp --- fdk-aac-2.0.1/libAACdec/src/usacdec_fac.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/usacdec_fac.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -344,7 +344,7 @@ /* Overlap Add */ x0 = -fMult(*pOvl--, pWindow[i].v.re); - *pOut0 += IMDCT_SCALE_DBL(x0); + *pOut0 = fAddSaturate(*pOut0, IMDCT_SCALE_DBL(x0)); pOut0++; } } else { @@ -354,7 +354,7 @@ /* Overlap Add */ x0 = fMult(*pOvl--, pWindow[i].v.re); - *pOut0 += IMDCT_SCALE_DBL(x0); + *pOut0 = fAddSaturate(*pOut0, IMDCT_SCALE_DBL(x0)); pOut0++; } } @@ -362,7 +362,7 @@ 0) { /* this should only happen for ACELP -> TCX20 -> ACELP transition */ FIXP_DBL *pOut = pOut0 - fl / 2; /* fl/2 == fac_length */ for (i = 0; i < fl / 2; i++) { - pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]); + pOut[i] = fAddSaturate(pOut[i], IMDCT_SCALE_DBL(hMdct->pFacZir[i])); } hMdct->pFacZir = NULL; } @@ -493,9 +493,7 @@ /* Div2 is compensated by table scaling */ x = fMultDiv2(pTmp2[i], FacWindowZir[w]); x += fMultDiv2(pTmp1[-i - 1], FacWindowSynth[w]); - x += pFAC_and_FAC_ZIR[i]; - pOut1[i] = x; - + pOut1[i] = fAddSaturate(x, pFAC_and_FAC_ZIR[i]); w++; } } @@ -552,7 +550,7 @@ FDK_ASSERT((pOut1 >= hMdct->overlap.time && pOut1 < hMdct->overlap.time + hMdct->ov_size) || (pOut1 >= output && pOut1 < output + 1024)); - *pOut1 += IMDCT_SCALE_DBL(-x1); + *pOut1 = fAddSaturate(*pOut1, IMDCT_SCALE_DBL(-x1)); pOut1--; } @@ -578,7 +576,7 @@ FIXP_DBL x = -(*pCurr--); /* 5) (item 4) Synthesis filter Zir component, FAC ZIR (another one). */ if (i < f_len) { - x += *pF++; + x = fAddSaturate(x, *pF++); } FDK_ASSERT((pOut1 >= hMdct->overlap.time && @@ -668,9 +666,9 @@ for (i = 0; i < fl / 2; i++) { FIXP_DBL x0, x1; - cplxMult(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]); - *pOut0 = IMDCT_SCALE_DBL(x0); - *pOut1 = IMDCT_SCALE_DBL(-x1); + cplxMultDiv2(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]); + *pOut0 = IMDCT_SCALE_DBL_LSH1(x0); + *pOut1 = IMDCT_SCALE_DBL_LSH1(-x1); pOut0++; pOut1--; } @@ -680,9 +678,9 @@ for (i = 0; i < fl / 2; i++) { FIXP_DBL x0, x1; - cplxMult(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]); - *pOut0 = IMDCT_SCALE_DBL(x0); - *pOut1 = IMDCT_SCALE_DBL(x1); + cplxMultDiv2(&x1, &x0, *pCurr++, -*pOvl--, pWindow_prev[i]); + *pOut0 = IMDCT_SCALE_DBL_LSH1(x0); + *pOut1 = IMDCT_SCALE_DBL_LSH1(x1); pOut0++; pOut1--; } @@ -691,9 +689,9 @@ for (i = 0; i < fl / 2; i++) { FIXP_DBL x0, x1; - cplxMult(&x1, &x0, *pCurr++, *pOvl--, pWindow_prev[i]); - *pOut0 = IMDCT_SCALE_DBL(x0); - *pOut1 = IMDCT_SCALE_DBL(x1); + cplxMultDiv2(&x1, &x0, *pCurr++, *pOvl--, pWindow_prev[i]); + *pOut0 = IMDCT_SCALE_DBL_LSH1(x0); + *pOut1 = IMDCT_SCALE_DBL_LSH1(x1); pOut0++; pOut1--; } @@ -705,7 +703,7 @@ FIXP_DBL *pOut = pOut0 - fl / 2; FDK_ASSERT(fl / 2 <= 128); for (i = 0; i < fl / 2; i++) { - pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]); + pOut[i] = fAddSaturate(pOut[i], IMDCT_SCALE_DBL(hMdct->pFacZir[i])); } hMdct->pFacZir = NULL; } diff -Nru fdk-aac-2.0.1/libAACdec/src/usacdec_lpc.cpp fdk-aac-2.0.2/libAACdec/src/usacdec_lpc.cpp --- fdk-aac-2.0.1/libAACdec/src/usacdec_lpc.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/usacdec_lpc.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -231,7 +231,7 @@ void RE8_PPV(FIXP_ZF x[], SHORT y[], int r) { int i, y0[8], y1[8]; FIXP_ZF x1[8], tmp; - FIXP_DBL e; + INT64 e; /* find the nearest neighbor y0 of x in 2D8 */ nearest_neighbor_2D8(x, y0); @@ -245,16 +245,16 @@ } /* compute e0=||x-y0||^2 and e1=||x-y1||^2 */ - e = (FIXP_DBL)0; + e = 0; for (i = 0; i < 8; i++) { tmp = x[i] - INT2ZF(y0[i], 0); - e += fPow2Div2( + e += (INT64)fPow2Div2( tmp << r); /* shift left to ensure that no fract part bits get lost. */ tmp = x[i] - INT2ZF(y1[i], 0); - e -= fPow2Div2(tmp << r); + e -= (INT64)fPow2Div2(tmp << r); } /* select best candidate y0 or y1 to minimize distortion */ - if (e < (FIXP_DBL)0) { + if (e < 0) { for (i = 0; i < 8; i++) { y[i] = y0[i]; } @@ -565,7 +565,8 @@ /* add non-weighted residual LSF vector to LSF1st */ for (i = 0; i < M_LP_FILTER_ORDER; i++) { w = (LONG)fMultDiv2(factor, sqrtFixp(fMult(d[i], d[i + 1]))); - lsfq[i] = fAddSaturate(lsfq[i], FX_DBL2FX_LPC((FIXP_DBL)(w * (LONG)xq[i]))); + lsfq[i] = fAddSaturate(lsfq[i], + FX_DBL2FX_LPC((FIXP_DBL)((INT64)w * (LONG)xq[i]))); } return; @@ -1138,9 +1139,12 @@ for (i = 2; i <= n; i++) { plsp += 2; b = -FX_LPC2FX_DBL(*plsp); - f[i] = ((fMultDiv2(b, f[i - 1]) << 1) + (f[i - 2])) << 1; + f[i] = SATURATE_LEFT_SHIFT((fMultDiv2(b, f[i - 1]) + (f[i - 2] >> 1)), 2, + DFRACT_BITS); for (j = i - 1; j > 1; j--) { - f[j] = f[j] + (fMultDiv2(b, f[j - 1]) << 2) + f[j - 2]; + f[j] = SATURATE_LEFT_SHIFT( + ((f[j] >> 2) + fMultDiv2(b, f[j - 1]) + (f[j - 2] >> 2)), 2, + DFRACT_BITS); } f[1] = f[1] + (b >> (SF_F - 1)); } @@ -1167,6 +1171,9 @@ /*-----------------------------------------------------* * Multiply F1(z) by (1+z^-1) and F2(z) by (1-z^-1) * *-----------------------------------------------------*/ + scaleValues(f1, NC + 1, -2); + scaleValues(f2, NC + 1, -2); + for (i = NC; i > 0; i--) { f1[i] += f1[i - 1]; f2[i] -= f2[i - 1]; @@ -1175,13 +1182,8 @@ FIXP_DBL aDBL[M_LP_FILTER_ORDER]; for (i = 1, k = M_LP_FILTER_ORDER - 1; i <= NC; i++, k--) { - FIXP_DBL tmp1, tmp2; - - tmp1 = f1[i] >> 1; - tmp2 = f2[i] >> 1; - - aDBL[i - 1] = (tmp1 + tmp2); - aDBL[k] = (tmp1 - tmp2); + aDBL[i - 1] = f1[i] + f2[i]; + aDBL[k] = f1[i] - f2[i]; } int headroom_a = getScalefactor(aDBL, M_LP_FILTER_ORDER); @@ -1190,5 +1192,5 @@ a[i] = FX_DBL2FX_LPC(aDBL[i] << headroom_a); } - *a_exp = 8 - headroom_a; + *a_exp = SF_F + (2 - 1) - headroom_a; } diff -Nru fdk-aac-2.0.1/libAACdec/src/usacdec_lpd.cpp fdk-aac-2.0.2/libAACdec/src/usacdec_lpd.cpp --- fdk-aac-2.0.1/libAACdec/src/usacdec_lpd.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/usacdec_lpd.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -122,17 +122,21 @@ #include "ac_arith_coder.h" -void filtLP(const FIXP_DBL *syn, FIXP_PCM *syn_out, FIXP_DBL *noise, - const FIXP_SGL *filt, INT stop, int len) { +void filtLP(const FIXP_DBL *syn, PCM_DEC *syn_out, FIXP_DBL *noise, + const FIXP_SGL *filt, const INT aacOutDataHeadroom, INT stop, + int len) { INT i, j; FIXP_DBL tmp; + FDK_ASSERT((aacOutDataHeadroom - 1) >= -(MDCT_OUTPUT_SCALE)); + for (i = 0; i < stop; i++) { tmp = fMultDiv2(noise[i], filt[0]); // Filt in Q-1.16 for (j = 1; j <= len; j++) { - tmp += fMultDiv2((noise[i - j] + noise[i + j]), filt[j]); + tmp += fMult((noise[i - j] >> 1) + (noise[i + j] >> 1), filt[j]); } - syn_out[i] = (FIXP_PCM)(IMDCT_SCALE(syn[i] - tmp)); + syn_out[i] = (PCM_DEC)( + IMDCT_SCALE((syn[i] >> 1) - (tmp >> 1), aacOutDataHeadroom - 1)); } } @@ -142,8 +146,10 @@ FIXP_DBL *pit_gain, const int frame_length, /* (i) : frame length (should be 768|1024) */ const INT l_frame, - const INT l_next, /* (i) : look ahead for symmetric filtering */ - FIXP_PCM *synth_out, /* (o) : filtered synthesis (with delay of 1 subfr) */ + const INT l_next, /* (i) : look ahead for symmetric filtering */ + PCM_DEC *synth_out, /* (o) : filtered synthesis (with delay of 1 subfr) */ + const INT aacOutDataHeadroom, /* (i) : headroom of the output time signal to + prevent clipping */ FIXP_DBL mem_bpf[]) /* i/o : memory state [L_FILT+L_SUBFR] */ { INT i, sf, i_subfr, T, T2, lg; @@ -335,17 +341,22 @@ { for (i = 0; i < lg; i++) { - /* scaled with SF_SYNTH + gain_sf + 1 */ + /* scaled with SF_SYNTH + gain_sf + 1; composition of scalefactor 2: + * one additional shift of syn values + fMult => fMultDiv2 */ noise_in[i] = - (fMult(gainSGL, syn[i + i_subfr] - (syn[i + i_subfr - T] >> 1) - - (syn[i + i_subfr + T] >> 1))) >> - s1; + scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) - + (syn[i + i_subfr - T] >> 2) - + (syn[i + i_subfr + T] >> 2)), + 2 - s1); } for (i = lg; i < L_SUBFR; i++) { - /* scaled with SF_SYNTH + gain_sf + 1 */ + /* scaled with SF_SYNTH + gain_sf + 1; composition of scalefactor 2: + * one additional shift of syn values + fMult => fMultDiv2 */ noise_in[i] = - (fMult(gainSGL, syn[i + i_subfr] - syn[i + i_subfr - T])) >> s1; + scaleValue(fMultDiv2(gainSGL, (syn[i + i_subfr] >> 1) - + (syn[i + i_subfr - T] >> 1)), + 2 - s1); } } } else { @@ -364,7 +375,7 @@ { filtLP(&syn[i_subfr - L_SUBFR], &synth_out[i_subfr], noise, - fdk_dec_filt_lp, L_SUBFR, L_FILT); + fdk_dec_filt_lp, aacOutDataHeadroom, L_SUBFR, L_FILT); } } @@ -377,9 +388,9 @@ /* Output scaling of the BPF memory */ scaleValues(mem_bpf, (L_FILT + L_SUBFR), -1); /* Copy the rest of the signal (after the fac) */ - scaleValuesSaturate((FIXP_PCM *)&synth_out[l_frame], - (FIXP_DBL *)&syn[l_frame - L_SUBFR], - (frame_length - l_frame), MDCT_OUT_HEADROOM); + scaleValuesSaturate( + (PCM_DEC *)&synth_out[l_frame], (FIXP_DBL *)&syn[l_frame - L_SUBFR], + (frame_length - l_frame), MDCT_OUT_HEADROOM - aacOutDataHeadroom); } return; @@ -1546,9 +1557,9 @@ AAC_DECODER_ERROR CLpd_RenderTimeSignal( CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM *pTimeData, - INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk, UINT flags, - UINT strmFlags) { + CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC *pTimeData, + INT lFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk, + const INT aacOutDataHeadroom, UINT flags, UINT strmFlags) { UCHAR *mod = pAacDecoderChannelInfo->data.usac.mod; AAC_DECODER_ERROR error = AAC_DEC_OK; int k, i_offset; @@ -2011,7 +2022,8 @@ { bass_pf_1sf_delay(p2_synth, pitch, pit_gain, lFrame, lFrame / facFB, mod[nbDiv - 1] ? (SynDelay - (lDiv / 2)) : SynDelay, - pTimeData, pAacDecoderStaticChannelInfo->mem_bpf); + pTimeData, aacOutDataHeadroom, + pAacDecoderStaticChannelInfo->mem_bpf); } } diff -Nru fdk-aac-2.0.1/libAACdec/src/usacdec_lpd.h fdk-aac-2.0.2/libAACdec/src/usacdec_lpd.h --- fdk-aac-2.0.1/libAACdec/src/usacdec_lpd.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACdec/src/usacdec_lpd.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -140,13 +140,14 @@ * \param pTimeData pointer to output buffer * \param samplesPerFrame amount of output samples * \param pSamplingRateInfo holds the sampling rate information - * \param pWorkBuffer1 pointer to work buffer for temporal data + * \param aacOutDataHeadroom headroom of the output time signal to prevent + * clipping */ AAC_DECODER_ERROR CLpd_RenderTimeSignal( CAacDecoderStaticChannelInfo *pAacDecoderStaticChannelInfo, - CAacDecoderChannelInfo *pAacDecoderChannelInfo, FIXP_PCM *pTimeData, + CAacDecoderChannelInfo *pAacDecoderChannelInfo, PCM_DEC *pTimeData, INT samplesPerFrame, SamplingRateInfo *pSamplingRateInfo, UINT frameOk, - UINT flags, UINT strmFlags); + const INT aacOutDataHeadroom, UINT flags, UINT strmFlags); static inline INT CLpd_FAC_getLength(int fNotShortBlock, int fac_length_long) { if (fNotShortBlock) { @@ -156,8 +157,9 @@ } } -void filtLP(const FIXP_DBL *syn, FIXP_PCM *syn_out, FIXP_DBL *noise, - const FIXP_SGL *filt, INT stop, int len); +void filtLP(const FIXP_DBL *syn, PCM_DEC *syn_out, FIXP_DBL *noise, + const FIXP_SGL *filt, const INT aacOutDataHeadroom, INT stop, + int len); /** * \brief perform a low-frequency pitch enhancement on time domain signal @@ -171,13 +173,14 @@ * \param[in] l_frame length of filtering, must be multiple of L_SUBFR * \param[in] l_next length of allowed look ahead on syn[i], i < l_frame+l_next * \param[out] synth_out pointer to time domain output signal + * \param[in] headroom of the output time signal to prevent clipping * \param[in,out] mem_bpf pointer to filter memory (L_FILT+L_SUBFR) */ void bass_pf_1sf_delay(FIXP_DBL syn[], const INT T_sf[], FIXP_DBL *pit_gain, const int frame_length, const INT l_frame, - const INT l_next, FIXP_PCM *synth_out, - FIXP_DBL mem_bpf[]); + const INT l_next, PCM_DEC *synth_out, + const INT aacOutDataHeadroom, FIXP_DBL mem_bpf[]); /** * \brief random sign generator for FD and TCX noise filling diff -Nru fdk-aac-2.0.1/libAACenc/include/aacenc_lib.h fdk-aac-2.0.2/libAACenc/include/aacenc_lib.h --- fdk-aac-2.0.1/libAACenc/include/aacenc_lib.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/include/aacenc_lib.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -149,12 +149,6 @@ All header files are provided for usage in C/C++ programs. The AAC encoder library API functions are located in aacenc_lib.h. -In binary releases the encoder core resides in statically linkable libraries -called for example libAACenc.a/libFDK.a (LINUX) or FDK_fastaaclib.lib (MS Visual -C++) for the plain AAC-LC core encoder and libSBRenc.a (LINUX) or -FDK_sbrEncLib.lib (MS Visual C++) for the SBR (Spectral Band Replication) and PS -(Parametric Stereo) modules. - \section CallingSequence Calling Sequence For encoding of ISO/MPEG-2/4 AAC bitstreams the following sequence is mandatory. @@ -326,25 +320,19 @@ \endcode \section writeOutData Output Bitstream Data -If any AAC bitstream data is available, write it to output file or device. This -can be done once the following condition is true: \code if -(outargs.numOutBytes>0) { - +If any AAC bitstream data is available, write it to output file or device as +follows. \code if (outargs.numOutBytes>0) { FDKfwrite(outputBuffer, +outargs.numOutBytes, 1, pOutFile); } \endcode -If you use file I/O then for example call mpegFileWrite_Write() from the library -libMpegFileWrite \code mpegFileWrite_Write(hMpegFile, outputBuffer, -outargs.numOutBytes, aacEncoder_GetParam(hAacEncoder, AACENC_GRANULE_LENGTH)); -\endcode - \section cfgMetaData Meta Data Configuration If the present library is configured with Metadata support, it is possible to insert meta data side info into the generated audio bitstream while encoding. To work with meta data the encoder instance has to be \ref encOpen "allocated" -with meta data support. The meta data mode must be be configured with the +with meta data support. The meta data mode must be configured with the ::AACENC_METADATA_MODE parameter and aacEncoder_SetParam() function. \code aacEncoder_SetParam(hAacEncoder, AACENC_METADATA_MODE, 0-3); \endcode @@ -427,7 +415,7 @@ return chMode; \endcode -\subsection bitreservoir Bitreservoir Configuration +\subsection peakbitrate Peak Bitrate Configuration In AAC, the default bitreservoir configuration depends on the chosen bitrate per frame and the number of effective channels. The size can be determined as below. \f[ @@ -436,17 +424,10 @@ Due to audio quality concerns it is not recommended to change the bitreservoir size to a lower value than the default setting! However, for minimizing the delay for streaming applications or for achieving a constant size of the -bitstream packages in each frame, it may be necessaray to change the -bitreservoir size. This can be done with the ::AACENC_PEAK_BITRATE parameter. -\code +bitstream packages in each frame, it may be necessaray to limit the maximum bits +per frame size. This can be done with the ::AACENC_PEAK_BITRATE parameter. \code aacEncoder_SetParam(hAacEncoder, AACENC_PEAK_BITRATE, value); \endcode -By setting ::AACENC_BITRATEMODE to fixed framing, the bitreservoir is disabled. -A disabled bitreservoir results in a constant size for each bitstream package. -Please note that especially at lower bitrates a disabled bitreservoir can -downgrade the audio quality considerably! The default bitreservoir configuration -can be achieved as follows. \code aacEncoder_SetParam(hAacEncoder, -AACENC_BITRESERVOIR, -1); \endcode To achieve acceptable audio quality with a reduced bitreservoir size setting at least 1000 bits per audio channel is recommended. For a multichannel audio file @@ -455,31 +436,32 @@ \subsection vbrmode Variable Bitrate Mode -The encoder provides various Variable Bitrate Modes that differ in audio quality -and average overall bitrate. The given values are averages over time, different -encoder settings and strongly depend on the type of audio signal. The VBR -configurations can be adjusted via ::AACENC_BITRATEMODE encoder parameter. +The variable bitrate (VBR) mode coding adapts the bit consumption to the +psychoacoustic requirements of the signal. The encoder ignores the user-defined +bit rate and selects a suitable pre-defined configuration based on the provided +AOT. The VBR mode 1 is tuned for HE-AACv2, for VBR mode 2, HE-AACv1 should be +used. VBR modes 3-5 should be used with Low-Complexity AAC. When encoding +AAC-ELD, the best mode is selected automatically. + +The bitrates given in the table are averages over time and different encoder +settings. They strongly depend on the type of audio signal. The VBR +configurations can be adjusted with the ::AACENC_BITRATEMODE encoder parameter. \verbatim --------------------------------------------- - VBR_MODE | Approx. Bitrate in kbps/channel - | AAC-LC | AAC-LD/AC_ELD -----------+---------------+----------------- - VBR_1 | 32 - 48 | 32 - 56 - VBR_2 | 40 - 56 | 40 - 64 - VBR_3 | 48 - 64 | 48 - 72 - VBR_4 | 64 - 80 | 64 - 88 - VBR_5 | 96 - 120 | 112 - 144 +----------------------------------------------- + VBR_MODE | Approx. Bitrate in kbps for stereo + | AAC-LC | AAC-ELD +----------+---------------+-------------------- + VBR_1 | 32 (HE-AACv2) | 48 + VBR_2 | 72 (HE-AACv1) | 56 + VBR_3 | 112 | 72 + VBR_4 | 148 | 148 + VBR_5 | 228 | 224 -------------------------------------------- \endverbatim -The bitrate ranges apply for individual audio channels. In case of multichannel -configurations the average bitrate might be estimated by multiplying with the -number of effective channels. This corresponds to all audio input channels -exclusively the low frequency channel. At configurations which are making use of -downmix modules the AAC core channels respectively downmix channels shall be -considered. For ::AACENC_AOT which are using SBR, the average bitrate can be -estimated by using the ratio of 0.5 for dualrate SBR and 0.75 for downsampled -SBR configurations. - +Note that these figures are valid for stereo encoding only. VBR modes 2-5 will +yield much lower bit rates when encoding single-channel input. For +configurations which are making use of downmix modules the AAC core channels +respectively downmix channels shall be considered. \subsection encQual Audio Quality Considerations The default encoder configuration is suggested to be used. Encoder tools such as @@ -967,9 +949,7 @@ \subsection BEHAVIOUR_ESTIM_AVG_FRAMESIZES Estimating Average Frame Sizes -A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel (there is -also one mode with 1920 samples per channel but this is only for special -purposes such as DAB+ digital radio). +A HE-AAC v1 or v2 audio frame contains 2048 PCM samples per channel. The number of HE-AAC frames \f$N\_FRAMES\f$ per second at 44.1 kHz is: @@ -1027,7 +1007,7 @@ #define AACENCODER_LIB_VL0 4 #define AACENCODER_LIB_VL1 0 -#define AACENCODER_LIB_VL2 0 +#define AACENCODER_LIB_VL2 1 /** * AAC encoder error codes. @@ -1086,9 +1066,7 @@ typedef struct { UINT maxOutBufBytes; /*!< Maximum number of encoder bitstream bytes within one frame. Size depends on maximum number of supported - channels in encoder instance. For superframing (as - used for example in DAB+), size has to be a multiple - accordingly. */ + channels in encoder instance. */ UINT maxAncBytes; /*!< Maximum number of ancillary data bytes which can be inserted into bitstream within one frame. */ diff -Nru fdk-aac-2.0.1/libAACenc/src/aacenc.cpp fdk-aac-2.0.2/libAACenc/src/aacenc.cpp --- fdk-aac-2.0.1/libAACenc/src/aacenc.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/aacenc.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -114,6 +114,8 @@ #include "genericStds.h" +#define BITRES_MIN \ + 300 /* default threshold for using reduced/disabled bitres mode */ #define BITRES_MAX_LD 4000 #define BITRES_MIN_LD 500 #define BITRATE_MAX_LD 70000 /* Max assumed bitrate for bitres calculation */ @@ -243,6 +245,46 @@ return bitrate; } +/*----------------------------------------------------------------------------- + + functionname: FDKaacEnc_AdjustVBRBitrateMode + description: Adjust bitrate mode to given bitrate parameter + input params: int vbrQuality (VBR0, VBR1, VBR2) + bitrate + channelMode + returns: vbr bitrate mode + + ------------------------------------------------------------------------------*/ +AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode( + AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode) { + AACENC_BITRATE_MODE newBitrateMode = bitrateMode; + + if (bitrate != -1) { + const INT monoStereoMode = + (FDKaacEnc_GetMonoStereoMode(channelMode) == EL_MODE_STEREO) ? 1 : 0; + const INT nChannelsEff = + FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff; + newBitrateMode = AACENC_BR_MODE_INVALID; + + for (int idx = (int)(sizeof(configTabVBR) / sizeof(*configTabVBR)) - 1; + idx >= 0; idx--) { + if (bitrate >= + configTabVBR[idx].chanBitrate[monoStereoMode] * nChannelsEff) { + if (configTabVBR[idx].chanBitrate[monoStereoMode] * nChannelsEff < + FDKaacEnc_GetVBRBitrate(bitrateMode, channelMode)) { + newBitrateMode = configTabVBR[idx].bitrateMode; + } else { + newBitrateMode = bitrateMode; + } + break; + } + } + } + + return AACENC_BR_MODE_IS_VBR(newBitrateMode) ? newBitrateMode + : AACENC_BR_MODE_INVALID; +} + /** * \brief Convert encoder bitreservoir value for transport library. * @@ -395,7 +437,6 @@ FIXP_DBL mbfac, bw_ratio; QC_INIT qcInit; INT averageBitsPerFrame = 0; - int bitresMin = 0; /* the bitreservoir is always big for AAC-LC */ const CHANNEL_MODE prevChannelMode = hAacEnc->encoderMode; if (config == NULL) return AAC_ENC_INVALID_HANDLE; @@ -550,7 +591,7 @@ (config->minBitsPerFrame != -1) ? config->minBitsPerFrame : 0; qcInit.minBits = fixMin(qcInit.minBits, averageBitsPerFrame & ~7); } else { - INT bitreservoir = -1; /* default bitrservoir size*/ + INT bitreservoir = -1; /* default bitreservoir size*/ if (isLowDelay(config->audioObjectType)) { INT brPerChannel = config->bitRate / config->nChannels; brPerChannel = fMin(BITRATE_MAX_LD, fMax(BITRATE_MIN_LD, brPerChannel)); @@ -564,7 +605,6 @@ bitreservoir = fMultI(slope, (INT)(BITRES_MAX_LD - BITRES_MIN_LD)) + BITRES_MIN_LD; /* interpolate */ bitreservoir = bitreservoir & ~7; /* align to bytes */ - bitresMin = BITRES_MIN_LD; } int maxBitres; @@ -601,9 +641,10 @@ qcInit.nSubFrames = config->nSubFrames; qcInit.padding.paddingRest = config->sampleRate; - if (qcInit.bitRes >= bitresMin * config->nChannels) { + if (qcInit.maxBits - qcInit.averageBits >= + ((qcInit.isLowDelay) ? BITRES_MIN_LD : BITRES_MIN) * config->nChannels) { qcInit.bitResMode = AACENC_BR_MODE_FULL; /* full bitreservoir */ - } else if (qcInit.bitRes > 0) { + } else if (qcInit.maxBits > qcInit.averageBits) { qcInit.bitResMode = AACENC_BR_MODE_REDUCED; /* reduced bitreservoir */ } else { qcInit.bitResMode = AACENC_BR_MODE_DISABLED; /* disabled bitreservoir */ diff -Nru fdk-aac-2.0.1/libAACenc/src/aacenc.h fdk-aac-2.0.2/libAACenc/src/aacenc.h --- fdk-aac-2.0.1/libAACenc/src/aacenc.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/aacenc.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -336,6 +336,19 @@ /*----------------------------------------------------------------------------- + functionname: FDKaacEnc_AdjustVBRBitrateMode + description: Adjust bitrate mode to given bitrate parameter + input params: int vbrQuality (VBR0, VBR1, VBR2) + bitrate + channelMode + returns: vbr bitrate mode + + ------------------------------------------------------------------------------*/ +AACENC_BITRATE_MODE FDKaacEnc_AdjustVBRBitrateMode( + AACENC_BITRATE_MODE bitrateMode, INT bitrate, CHANNEL_MODE channelMode); + +/*----------------------------------------------------------------------------- + functionname: FDKaacEnc_AacInitDefaultConfig description: gives reasonable default configuration returns: --- diff -Nru fdk-aac-2.0.1/libAACenc/src/aacenc_lib.cpp fdk-aac-2.0.2/libAACenc/src/aacenc_lib.cpp --- fdk-aac-2.0.1/libAACenc/src/aacenc_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/aacenc_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -110,9 +110,9 @@ /* Encoder library info */ #define AACENCODER_LIB_VL0 4 #define AACENCODER_LIB_VL1 0 -#define AACENCODER_LIB_VL2 0 +#define AACENCODER_LIB_VL2 1 #define AACENCODER_LIB_TITLE "AAC Encoder" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define AACENCODER_LIB_BUILD_DATE "" #define AACENCODER_LIB_BUILD_TIME "" #else @@ -446,6 +446,24 @@ return sbrSignaling; } +static inline INT getAssociatedChElement(SBR_ELEMENT_INFO *elInfoSbr, + CHANNEL_MAPPING *channelMapping) { + ELEMENT_INFO *elInfo = channelMapping->elInfo; + INT nElements = channelMapping->nElements; + INT associatedChElement = -1; + int i; + + for (i = 0; i < nElements; i++) { + if (elInfoSbr->elType == elInfo[i].elType && + elInfoSbr->instanceTag == elInfo[i].instanceTag) { + associatedChElement = i; + break; + } + } + + return associatedChElement; +} + /**************************************************************************** Allocate Encoder ****************************************************************************/ @@ -1010,6 +1028,13 @@ case AACENC_BR_MODE_VBR_3: case AACENC_BR_MODE_VBR_4: case AACENC_BR_MODE_VBR_5: + /* Adjust bitrate mode in case given peak bitrate is lower than expected + * VBR bitrate. */ + if ((INT)config->userPeakBitrate != -1) { + hAacConfig->bitrateMode = FDKaacEnc_AdjustVBRBitrateMode( + hAacConfig->bitrateMode, config->userPeakBitrate, + hAacConfig->channelMode); + } /* Get bitrate in VBR configuration */ /* In VBR mode; SBR-modul depends on bitrate, core encoder on bitrateMode. */ @@ -1761,6 +1786,10 @@ hAacEncoder->inputBuffer + (hAacEncoder->inputBufferOffset + hAacEncoder->nSamplesRead) / hAacEncoder->aacConfig.nChannels; + newSamples -= + (newSamples % + hAacEncoder->extParam + .nChannels); /* process multiple samples of input channels */ /* Copy new input samples to internal buffer */ if (inBufDesc->bufElSizes[idx] == (INT)sizeof(INT_PCM)) { @@ -1917,7 +1946,15 @@ { hAacEncoder->extPayload[nExtensions].dataSize = hAacEncoder->pSbrPayload->dataSize[nPayload][i]; - hAacEncoder->extPayload[nExtensions].associatedChElement = i; + hAacEncoder->extPayload[nExtensions].associatedChElement = + getAssociatedChElement( + &hAacEncoder->hEnvEnc->sbrElement[i]->elInfo, + &hAacEncoder->hAacEnc->channelMapping); + if (hAacEncoder->extPayload[nExtensions].associatedChElement == + -1) { + err = AACENC_ENCODE_ERROR; + goto bail; + } } hAacEncoder->extPayload[nExtensions].dataType = EXT_SBR_DATA; /* Once SBR Encoder supports SBR CRC set diff -Nru fdk-aac-2.0.1/libAACenc/src/aacEnc_ram.cpp fdk-aac-2.0.2/libAACenc/src/aacEnc_ram.cpp --- fdk-aac-2.0.1/libAACenc/src/aacEnc_ram.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/aacEnc_ram.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -204,5 +204,5 @@ * (dynamic_RAM + P_BUF_0 + n*sizeof(QC_OUT_CHANNEL)) is sufficiently aligned, * so the cast is safe */ return reinterpret_cast(reinterpret_cast( - dynamic_RAM + P_BUF_0 + n * sizeof(QC_OUT_CHANNEL))); + dynamic_RAM + P_BUF_0 + n * ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)))); } diff -Nru fdk-aac-2.0.1/libAACenc/src/aacEnc_ram.h fdk-aac-2.0.2/libAACenc/src/aacEnc_ram.h --- fdk-aac-2.0.1/libAACenc/src/aacEnc_ram.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/aacEnc_ram.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -198,7 +198,7 @@ +++++++++++++++++++++++++++++++++++++++++++++++++++++ */ -#define BUF_SIZE_0 (ALIGN_SIZE(sizeof(QC_OUT_CHANNEL) * (8))) +#define BUF_SIZE_0 (ALIGN_SIZE(sizeof(QC_OUT_CHANNEL)) * (8)) #define BUF_SIZE_1 \ (ALIGN_SIZE(maxSize(maxSize(sizeof(PSY_DYNAMIC), \ (BIT_LOOK_UP_SIZE + MERGE_GAIN_LOOK_UP_SIZE)), \ diff -Nru fdk-aac-2.0.1/libAACenc/src/adj_thr.cpp fdk-aac-2.0.2/libAACenc/src/adj_thr.cpp --- fdk-aac-2.0.1/libAACenc/src/adj_thr.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/adj_thr.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -591,13 +591,11 @@ if (sfbEn > avgEn) { FIXP_DBL tmpMinSnrLdData; if (psyOutChannel[ch]->lastWindowSequence == LONG_WINDOW) - tmpMinSnrLdData = - fixMax(SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), - (FIXP_DBL)SnrLdMin1); + tmpMinSnrLdData = SnrLdFac + fixMax(avgEnLdData - sfbEnLdData, + SnrLdMin1 - SnrLdFac); else - tmpMinSnrLdData = - fixMax(SnrLdFac + (FIXP_DBL)(avgEnLdData - sfbEnLdData), - (FIXP_DBL)SnrLdMin3); + tmpMinSnrLdData = SnrLdFac + fixMax(avgEnLdData - sfbEnLdData, + SnrLdMin3 - SnrLdFac); qcOutChan->sfbMinSnrLdData[sfbGrp + sfb] = fixMin( qcOutChan->sfbMinSnrLdData[sfbGrp + sfb], tmpMinSnrLdData); @@ -1304,14 +1302,6 @@ if (sfbThrReducedLdData < FL2FXCONST_DBL(-0.5f)) sfbThrReducedLdData = FL2FXCONST_DBL(-1.f); - /* minimum of 29 dB Ratio for Thresholds */ - if ((sfbEnLdData + FL2FXCONST_DBL(1.0f)) > - FL2FXCONST_DBL(9.6336206 / LD_DATA_SCALING)) { - sfbThrReducedLdData = fixMax( - sfbThrReducedLdData, - sfbEnLdData - FL2FXCONST_DBL(9.6336206 / LD_DATA_SCALING)); - } - sfbThrReducedLdData = fixMax(MIN_LDTHRESH, sfbThrReducedLdData); qcOutChan->sfbThresholdLdData[sfbGrp + sfb] = sfbThrReducedLdData; diff -Nru fdk-aac-2.0.1/libAACenc/src/bandwidth.cpp fdk-aac-2.0.2/libAACenc/src/bandwidth.cpp --- fdk-aac-2.0.1/libAACenc/src/bandwidth.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/bandwidth.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -151,11 +151,11 @@ static const BANDWIDTH_TAB_VBR bandWidthTableVBR[] = { {AACENC_BR_MODE_CBR, 0, 0}, - {AACENC_BR_MODE_VBR_1, 13050, 13050}, - {AACENC_BR_MODE_VBR_2, 13050, 13050}, - {AACENC_BR_MODE_VBR_3, 14260, 14260}, - {AACENC_BR_MODE_VBR_4, 15500, 15500}, - {AACENC_BR_MODE_VBR_5, 48000, 48000}, + {AACENC_BR_MODE_VBR_1, 13000, 13000}, + {AACENC_BR_MODE_VBR_2, 13000, 13000}, + {AACENC_BR_MODE_VBR_3, 15750, 15750}, + {AACENC_BR_MODE_VBR_4, 16500, 16500}, + {AACENC_BR_MODE_VBR_5, 19293, 19293}, {AACENC_BR_MODE_SFR, 0, 0}, {AACENC_BR_MODE_FF, 0, 0} diff -Nru fdk-aac-2.0.1/libAACenc/src/intensity.cpp fdk-aac-2.0.2/libAACenc/src/intensity.cpp --- fdk-aac-2.0.1/libAACenc/src/intensity.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/intensity.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -661,6 +661,7 @@ for (sfboffs = 0; sfboffs < maxSfbPerGroup; sfboffs++) { INT sL, sR; FIXP_DBL inv_n; + INT mdct_spec_sf = MDCT_SPEC_SF; msMask[sfb + sfboffs] = 0; if (isMask[sfb + sfboffs] == 0) { @@ -682,6 +683,12 @@ } } + if (sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs] > + 1 << mdct_spec_sf) { + mdct_spec_sf++; /* This is for rare cases where the number of bins in a + scale factor band is > 64 */ + } + inv_n = GetInvInt( (sfbOffset[sfb + sfboffs + 1] - sfbOffset[sfb + sfboffs]) >> 1); // scaled with 2 to compensate fMultDiv2() in subsequent loop @@ -707,11 +714,11 @@ j++) { d = ((mdctSpectrumLeft[j] << s0) >> 1) - ((mdctSpectrumRight[j] << s0) >> 1); - ed += fMultDiv2(d, d) >> (MDCT_SPEC_SF - 1); + ed += fMultDiv2(d, d) >> (mdct_spec_sf - 1); } msMask[sfb + sfboffs] = 1; tmp = fDivNorm(sfbEnergyLeft[sfb + sfboffs], ed, &s1); - s2 = (s1) + (2 * s0) - 2 - MDCT_SPEC_SF; + s2 = (s1) + (2 * s0) - 2 - mdct_spec_sf; if (s2 & 1) { tmp = tmp >> 1; s2 = s2 + 1; @@ -747,13 +754,13 @@ j++) { s = ((mdctSpectrumLeft[j] << s0) >> 1) + ((mdctSpectrumRight[j] << s0) >> 1); - es = fAddSaturate(es, fMultDiv2(s, s) >> - (MDCT_SPEC_SF - - 1)); // scaled 2*(mdctScale - s0 + 1) + MDCT_SPEC_SF + es += fMultDiv2(s, s) >> + (mdct_spec_sf - + 1); // scaled 2*(mdctScale - s0 + 1) + mdct_spec_sf } msMask[sfb + sfboffs] = 0; tmp = fDivNorm(sfbEnergyLeft[sfb + sfboffs], es, &s1); - s2 = (s1) + (2 * s0) - 2 - MDCT_SPEC_SF; + s2 = (s1) + (2 * s0) - 2 - mdct_spec_sf; if (s2 & 1) { tmp = tmp >> 1; s2 = s2 + 1; diff -Nru fdk-aac-2.0.1/libAACenc/src/qc_main.cpp fdk-aac-2.0.2/libAACenc/src/qc_main.cpp --- fdk-aac-2.0.1/libAACenc/src/qc_main.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libAACenc/src/qc_main.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -121,20 +121,15 @@ static const TAB_VBR_QUAL_FACTOR tableVbrQualFactor[] = { {QCDATA_BR_MODE_VBR_1, - FL2FXCONST_DBL(0.160f)}, /* Approx. 32 - 48 (AC-LC), 32 - 56 - (AAC-LD/ELD) kbps/channel */ + FL2FXCONST_DBL(0.150f)}, /* Approx. 32 kbps mono AAC-LC + SBR + PS */ {QCDATA_BR_MODE_VBR_2, - FL2FXCONST_DBL(0.148f)}, /* Approx. 40 - 56 (AC-LC), 40 - 64 - (AAC-LD/ELD) kbps/channel */ + FL2FXCONST_DBL(0.162f)}, /* Approx. 64 kbps stereo AAC-LC + SBR */ {QCDATA_BR_MODE_VBR_3, - FL2FXCONST_DBL(0.135f)}, /* Approx. 48 - 64 (AC-LC), 48 - 72 - (AAC-LD/ELD) kbps/channel */ + FL2FXCONST_DBL(0.176f)}, /* Approx. 96 kbps stereo AAC-LC */ {QCDATA_BR_MODE_VBR_4, - FL2FXCONST_DBL(0.111f)}, /* Approx. 64 - 80 (AC-LC), 64 - 88 - (AAC-LD/ELD) kbps/channel */ + FL2FXCONST_DBL(0.120f)}, /* Approx. 128 kbps stereo AAC-LC */ {QCDATA_BR_MODE_VBR_5, - FL2FXCONST_DBL(0.070f)} /* Approx. 96 - 120 (AC-LC), 112 - 144 - (AAC-LD/ELD) kbps/channel */ + FL2FXCONST_DBL(0.070f)} /* Approx. 192 kbps stereo AAC-LC */ }; static INT isConstantBitrateMode(const QCDATA_BR_MODE bitrateMode) { @@ -378,13 +373,8 @@ hQC->invQuant = init->invQuant; hQC->maxIterations = init->maxIterations; - if (isConstantBitrateMode(hQC->bitrateMode)) { - /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir - */ - hQC->bitResMode = init->bitResMode; - } else { - hQC->bitResMode = AACENC_BR_MODE_FULL; /* full bitreservoir */ - } + /* 0: full bitreservoir, 1: reduced bitreservoir, 2: disabled bitreservoir */ + hQC->bitResMode = init->bitResMode; hQC->padding.paddingRest = init->padding.paddingRest; @@ -805,10 +795,15 @@ INT avgTotalDynBits = 0; /* maximal allowed dynamic bits for all frames */ INT totalAvailableBits = 0; INT nSubFrames = 1; + const INT isCBRAdjustment = (isConstantBitrateMode(hQC->bitrateMode) || + (hQC->bitResMode != AACENC_BR_MODE_FULL)) + ? 1 + : 0; /*-------------------------------------------- */ /* redistribute total bitreservoir to elements */ - ErrorStatus = FDKaacEnc_BitResRedistribution(hQC, cm, avgTotalBits); + ErrorStatus = FDKaacEnc_BitResRedistribution( + hQC, cm, (isCBRAdjustment == 0) ? hQC->maxBitsPerFrame : avgTotalBits); if (ErrorStatus != AAC_ENC_OK) { return ErrorStatus; } @@ -836,33 +831,22 @@ /*-------------------------------------------- */ /*-------------------------------------------- */ - if (isConstantBitrateMode(hQC->bitrateMode)) { - /* calc granted dynamic bits for sub frame and - distribute it to each element */ - ErrorStatus = FDKaacEnc_prepareBitDistribution( - hQC, psyOut, qcOut, cm, qcElement, avgTotalBits, &totalAvailableBits, - &avgTotalDynBits); + /* calc granted dynamic bits for sub frame and + distribute it to each element */ + ErrorStatus = FDKaacEnc_prepareBitDistribution( + hQC, psyOut, qcOut, cm, qcElement, + (isCBRAdjustment == 0) ? hQC->maxBitsPerFrame : avgTotalBits, + &totalAvailableBits, &avgTotalDynBits); - if (ErrorStatus != AAC_ENC_OK) { - return ErrorStatus; - } - } else { - qcOut[0]->grantedDynBits = - ((hQC->maxBitsPerFrame - (hQC->globHdrBits)) & ~7) - - (qcOut[0]->globalExtBits + qcOut[0]->staticBits + - qcOut[0]->elementExtBits); - qcOut[0]->maxDynBits = qcOut[0]->grantedDynBits; - - totalAvailableBits = hQC->maxBitsPerFrame; - avgTotalDynBits = 0; + if (ErrorStatus != AAC_ENC_OK) { + return ErrorStatus; } /* for ( all sub frames ) ... */ for (c = 0; c < nSubFrames; c++) { /* for CBR and VBR mode */ FDKaacEnc_AdjustThresholds(hQC->hAdjThr, qcElement[c], qcOut[c], - psyOut[c]->psyOutElement, - isConstantBitrateMode(hQC->bitrateMode), cm); + psyOut[c]->psyOutElement, isCBRAdjustment, cm); } /* -end- sub frame counter */ diff -Nru fdk-aac-2.0.1/libDRCdec/include/FDK_drcDecLib.h fdk-aac-2.0.2/libDRCdec/include/FDK_drcDecLib.h --- fdk-aac-2.0.1/libDRCdec/include/FDK_drcDecLib.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/include/FDK_drcDecLib.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -114,6 +114,8 @@ extern "C" { #endif +#define DRC_DEC_LOUDNESS_NOT_PRESENT (LONG)0x7FFFFFFE + typedef struct s_drc_decoder* HANDLE_DRC_DECODER; typedef struct s_uni_drc_interface* HANDLE_UNI_DRC_INTERFACE; typedef struct s_selection_process_output* HANDLE_SEL_PROC_OUTPUT; @@ -134,6 +136,7 @@ DRC_DEC_EFFECT_TYPE, DRC_DEC_EFFECT_TYPE_FALLBACK_CODE, DRC_DEC_LOUDNESS_MEASUREMENT_METHOD, + DRC_DEC_ALBUM_MODE, /* set only system (not user) parameters */ DRC_DEC_DOWNMIX_ID, DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED, /**< number of output channels @@ -141,15 +144,20 @@ choosing an appropriate downmixInstruction */ DRC_DEC_BASE_CHANNEL_COUNT, + DRC_DEC_FRAME_SIZE, + DRC_DEC_SAMPLE_RATE, /* get only system parameters */ DRC_DEC_IS_MULTIBAND_DRC_1, DRC_DEC_IS_MULTIBAND_DRC_2, DRC_DEC_IS_ACTIVE, /**< MPEG-D DRC payload is present and at least one of Dynamic Range Control (DRC) or Loudness Normalization (LN) is activated */ - DRC_DEC_TARGET_CHANNEL_COUNT_SELECTED /**< number of output channels if - appropriate downmixInstruction exists - */ + DRC_DEC_TARGET_CHANNEL_COUNT_SELECTED, /**< number of output channels if + appropriate downmixInstruction + exists */ + DRC_DEC_OUTPUT_LOUDNESS /**< output loudness in dB, with exponent e = 7, or + DRC_DEC_LOUDNESS_NOT_PRESENT if no loudness is + contained in the bitstream */ } DRC_DEC_USERPARAM; typedef enum { diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcDec_gainDecoder.cpp fdk-aac-2.0.2/libDRCdec/src/drcDec_gainDecoder.cpp --- fdk-aac-2.0.1/libDRCdec/src/drcDec_gainDecoder.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcDec_gainDecoder.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -170,11 +170,10 @@ } DRC_ERROR -drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate) { +drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec) { DRC_ERROR err = DE_OK; - err = initGainDec(hGainDec, frameSize, sampleRate); + err = initGainDec(hGainDec); if (err) return err; initDrcGainBuffers(hGainDec->frameSize, &hGainDec->drcGainBuffers); @@ -183,6 +182,25 @@ } DRC_ERROR +drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec, + const GAIN_DEC_PARAM paramType, + const int paramValue) { + switch (paramType) { + case GAIN_DEC_FRAME_SIZE: + if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE; + hGainDec->frameSize = paramValue; + break; + case GAIN_DEC_SAMPLE_RATE: + if (paramValue < 0) return DE_PARAM_OUT_OF_RANGE; + hGainDec->deltaTminDefault = getDeltaTmin(paramValue); + break; + default: + return DE_PARAM_INVALID; + } + return DE_OK; +} + +DRC_ERROR drcDec_GainDecoder_SetCodecDependentParameters( HANDLE_DRC_GAIN_DECODER hGainDec, const DELAY_MODE delayMode, const int timeDomainSupported, @@ -279,9 +297,11 @@ int seq, gainSequenceCount; DRC_COEFFICIENTS_UNI_DRC* pCoef = selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED); - if (pCoef == NULL) return DE_OK; - - gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12); + if (pCoef && pCoef->gainSequenceCount) { + gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12); + } else { + gainSequenceCount = 1; + } for (seq = 0; seq < gainSequenceCount; seq++) { int lastNodeIndex = 0; diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcDec_gainDecoder.h fdk-aac-2.0.2/libDRCdec/src/drcDec_gainDecoder.h --- fdk-aac-2.0.1/libDRCdec/src/drcDec_gainDecoder.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcDec_gainDecoder.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -134,6 +134,8 @@ GAIN_DEC_DRC2_DRC3 } GAIN_DEC_LOCATION; +typedef enum { GAIN_DEC_FRAME_SIZE, GAIN_DEC_SAMPLE_RATE } GAIN_DEC_PARAM; + typedef struct { FIXP_DBL gainLin; /* e = 7 */ SHORT time; @@ -195,8 +197,12 @@ drcDec_GainDecoder_Open(HANDLE_DRC_GAIN_DECODER* phGainDec); DRC_ERROR -drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate); +drcDec_GainDecoder_Init(HANDLE_DRC_GAIN_DECODER hGainDec); + +DRC_ERROR +drcDec_GainDecoder_SetParam(HANDLE_DRC_GAIN_DECODER hGainDec, + const GAIN_DEC_PARAM paramType, + const int paramValue); DRC_ERROR drcDec_GainDecoder_SetCodecDependentParameters( diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcDec_reader.cpp fdk-aac-2.0.2/libDRCdec/src/drcDec_reader.cpp --- fdk-aac-2.0.1/libDRCdec/src/drcDec_reader.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcDec_reader.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -185,17 +185,22 @@ uniDrcConfigPresent = FDKreadBits(hBs, 1); if (uniDrcConfigPresent) { err = drcDec_readUniDrcConfig(hBs, hUniDrcConfig); - if (err) return err; + if (err) { + /* clear config, if parsing error occured */ + FDKmemclear(hUniDrcConfig, sizeof(UNI_DRC_CONFIG)); + hUniDrcConfig->diff = 1; + } } err = drcDec_readLoudnessInfoSet(hBs, hLoudnessInfoSet); - if (err) return err; + if (err) { + /* clear config, if parsing error occured */ + FDKmemclear(hLoudnessInfoSet, sizeof(LOUDNESS_INFO_SET)); + hLoudnessInfoSet->diff = 1; + } } - if (hUniDrcGain != NULL) { - err = drcDec_readUniDrcGain(hBs, hUniDrcConfig, frameSize, deltaTminDefault, - hUniDrcGain); - if (err) return err; - } + err = drcDec_readUniDrcGain(hBs, hUniDrcConfig, frameSize, deltaTminDefault, + hUniDrcGain); return err; } @@ -479,10 +484,13 @@ int seq, gainSequenceCount; DRC_COEFFICIENTS_UNI_DRC* pCoef = selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED); - if (pCoef == NULL) return DE_OK; - if (hUniDrcGain == NULL) return DE_OK; /* hUniDrcGain not initialized yet */ - - gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12); + if (hUniDrcGain == NULL) return DE_NOT_OK; + hUniDrcGain->status = 0; + if (pCoef) { + gainSequenceCount = fMin(pCoef->gainSequenceCount, (UCHAR)12); + } else { + gainSequenceCount = 0; + } for (seq = 0; seq < gainSequenceCount; seq++) { UCHAR index = pCoef->gainSetIndexForGainSequence[seq]; @@ -510,6 +518,9 @@ if (err) return err; } + if (err == DE_OK && gainSequenceCount > 0) { + hUniDrcGain->status = 1; + } return err; } @@ -903,7 +914,7 @@ firFilterOrder; int uniqueEqSubbandGainsCount, eqSubbandGainRepresentation, eqSubbandGainCount; - EQ_SUBBAND_GAIN_FORMAT eqSubbandGainFormat; + int eqSubbandGainFormat; eqDelayMaxPresent = FDKreadBits(hBs, 1); if (eqDelayMaxPresent) { @@ -944,7 +955,7 @@ uniqueEqSubbandGainsCount = FDKreadBits(hBs, 6); if (uniqueEqSubbandGainsCount > 0) { eqSubbandGainRepresentation = FDKreadBits(hBs, 1); - eqSubbandGainFormat = (EQ_SUBBAND_GAIN_FORMAT)FDKreadBits(hBs, 4); + eqSubbandGainFormat = FDKreadBits(hBs, 4); switch (eqSubbandGainFormat) { case GF_QMF32: eqSubbandGainCount = 32; @@ -1010,6 +1021,7 @@ int additionalDrcSetIdPresent, additionalDrcSetIdCount; int dependsOnEqSetPresent, eqChannelGroupCount, tdFilterCascadePresent, subbandGainsPresent, eqTransitionDurationPresent; + UCHAR eqChannelGroupForChannel[8]; FDKpushFor(hBs, 6); /* eqSetId */ FDKpushFor(hBs, 4); /* eqSetComplexityLevel */ @@ -1059,7 +1071,6 @@ eqChannelGroupCount = 0; for (c = 0; c < channelCount; c++) { - UCHAR eqChannelGroupForChannel[8]; int newGroup = 1; if (c >= 8) return DE_MEMORY_ERROR; eqChannelGroupForChannel[c] = FDKreadBits(hBs, 7); @@ -1130,7 +1141,7 @@ drcCharacteristicLeftPresent = FDKreadBits(hBs, 1); if (drcCharacteristicLeftPresent) { pCoef->characteristicLeftCount = FDKreadBits(hBs, 4); - if ((pCoef->characteristicLeftCount + 1) > 8) return DE_MEMORY_ERROR; + if ((pCoef->characteristicLeftCount + 1) > 16) return DE_MEMORY_ERROR; for (i = 0; i < pCoef->characteristicLeftCount; i++) { err = _readCustomDrcCharacteristic( hBs, CS_LEFT, &(pCoef->characteristicLeftFormat[i + 1]), @@ -1141,7 +1152,7 @@ drcCharacteristicRightPresent = FDKreadBits(hBs, 1); if (drcCharacteristicRightPresent) { pCoef->characteristicRightCount = FDKreadBits(hBs, 4); - if ((pCoef->characteristicRightCount + 1) > 8) return DE_MEMORY_ERROR; + if ((pCoef->characteristicRightCount + 1) > 16) return DE_MEMORY_ERROR; for (i = 0; i < pCoef->characteristicRightCount; i++) { err = _readCustomDrcCharacteristic( hBs, CS_RIGHT, &(pCoef->characteristicRightFormat[i + 1]), diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcDec_selectionProcess.cpp fdk-aac-2.0.2/libDRCdec/src/drcDec_selectionProcess.cpp --- fdk-aac-2.0.1/libDRCdec/src/drcDec_selectionProcess.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcDec_selectionProcess.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -103,8 +103,6 @@ #include "drcDec_selectionProcess.h" #include "drcDec_tools.h" -#define UNDEFINED_LOUDNESS_VALUE (FIXP_DBL) MAXVAL_DBL - typedef enum { DETR_NONE = 0, DETR_NIGHT = 1, @@ -555,6 +553,11 @@ diff |= _compAssign(&pSelProcInput->loudnessMeasurementMethod, requestValueInt); break; + case SEL_PROC_ALBUM_MODE: + if ((requestValueInt < 0) || (requestValueInt > 1)) + return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE; + diff |= _compAssign(&pSelProcInput->albumMode, requestValueInt); + break; case SEL_PROC_DOWNMIX_ID: diff |= _compAssign(&pSelProcInput->targetConfigRequestType, TCRT_DOWNMIX_ID); @@ -598,14 +601,21 @@ if ((requestValue < (FIXP_DBL)0) || (requestValue > FL2FXCONST_DBL(1.0f / (float)(1 << 1)))) return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE; - diff |= _compAssign(&pSelProcInput->boost, FX_DBL2FX_SGL(requestValue)); + diff |= _compAssign( + &pSelProcInput->boost, + FX_DBL2FX_SGL( + requestValue + + (FIXP_DBL)(1 << 15))); /* convert to FIXP_SGL with rounding */ break; case SEL_PROC_COMPRESS: if ((requestValue < (FIXP_DBL)0) || (requestValue > FL2FXCONST_DBL(1.0f / (float)(1 << 1)))) return DRCDEC_SELECTION_PROCESS_PARAM_OUT_OF_RANGE; - diff |= - _compAssign(&pSelProcInput->compress, FX_DBL2FX_SGL(requestValue)); + diff |= _compAssign( + &pSelProcInput->compress, + FX_DBL2FX_SGL( + requestValue + + (FIXP_DBL)(1 << 15))); /* convert to FIXP_SGL with rounding */ break; default: return DRCDEC_SELECTION_PROCESS_INVALID_PARAM; @@ -741,8 +751,8 @@ hSelProcInput->loudnessNormalizationOn = 1; hSelProcInput->targetLoudness = FL2FXCONST_DBL(-24.0f / (float)(1 << 7)); hSelProcInput->loudnessDeviationMax = DEFAULT_LOUDNESS_DEVIATION_MAX; - hSelProcInput->loudnessMeasurementMethod = MDR_DEFAULT; - hSelProcInput->loudnessMeasurementSystem = MSR_DEFAULT; + hSelProcInput->loudnessMeasurementMethod = MDR_ANCHOR_LOUDNESS; + hSelProcInput->loudnessMeasurementSystem = MSR_EXPERT_PANEL; hSelProcInput->loudnessMeasurementPreProc = LPR_DEFAULT; hSelProcInput->deviceCutOffFrequency = 500; hSelProcInput->loudnessNormalizationGainDbMax = @@ -944,17 +954,31 @@ return DRCDEC_SELECTION_PROCESS_NO_ERROR; } -/* #5: The number of DRC bands is supported. */ +/* #5: The number of DRC bands is supported. Moreover, gainSetIndex and + * gainSequenceIndex are within the allowed range. */ static DRCDEC_SELECTION_PROCESS_RETURN _preSelectionRequirement5( DRC_INSTRUCTIONS_UNI_DRC* pDrcInstructionUniDrc, DRC_COEFFICIENTS_UNI_DRC* pCoef, int* pMatchFound) { - int i; + int b, i; *pMatchFound = 1; + if (pDrcInstructionUniDrc->drcSetId < 0) /* virtual DRC sets are okay */ + { + return DRCDEC_SELECTION_PROCESS_NO_ERROR; + } + if (pCoef == NULL) /* check for parametricDRC */ { - *pMatchFound = 1; + *pMatchFound = 0; /* parametricDRC not supported */ + return DRCDEC_SELECTION_PROCESS_NO_ERROR; + } + + if (pCoef->drcLocation != + pDrcInstructionUniDrc + ->drcLocation) /* drcLocation must be LOCATION_SELECTED */ + { + *pMatchFound = 0; return DRCDEC_SELECTION_PROCESS_NO_ERROR; } @@ -962,10 +986,14 @@ int indexDrcCoeff = pDrcInstructionUniDrc->gainSetIndexForChannelGroup[i]; int bandCount = 0; + if (indexDrcCoeff >= 12) { + *pMatchFound = 0; + return DRCDEC_SELECTION_PROCESS_NO_ERROR; + } + if (indexDrcCoeff > pCoef->gainSetCount - 1) /* check for parametricDRC */ { - *pMatchFound = 1; - return DRCDEC_SELECTION_PROCESS_NO_ERROR; + continue; } GAIN_SET* gainSet = &(pCoef->gainSet[indexDrcCoeff]); @@ -974,6 +1002,14 @@ if (bandCount > 4) { *pMatchFound = 0; } + + for (b = 0; b < bandCount; b++) { + if ((gainSet->gainSequenceIndex[b] >= 12) || + (gainSet->gainSequenceIndex[b] >= pCoef->gainSequenceCount)) { + *pMatchFound = 0; + return DRCDEC_SELECTION_PROCESS_NO_ERROR; + } + } } return DRCDEC_SELECTION_PROCESS_NO_ERROR; @@ -1066,6 +1102,19 @@ return retVal; } +static int _drcSetIsUsable(HANDLE_UNI_DRC_CONFIG hUniDrcConfig, + DRC_INSTRUCTIONS_UNI_DRC* pInst) { + int usable = 0; + DRC_COEFFICIENTS_UNI_DRC* pCoef = + selectDrcCoefficients(hUniDrcConfig, LOCATION_SELECTED); + + /* check if ID is unique */ + if (selectDrcInstructions(hUniDrcConfig, pInst->drcSetId) != pInst) return 0; + /* sanity check on drcInstructions */ + _preSelectionRequirement5(pInst, pCoef, &usable); + return usable; +} + /* #8: The range of the target loudness specified for a DRC set has to include * the requested decoder target loudness. */ static DRCDEC_SELECTION_PROCESS_RETURN _preSelectionRequirement8( @@ -1085,9 +1134,8 @@ FIXP_DBL loudnessDeviationMax = ((FIXP_DBL)hSelProcInput->loudnessDeviationMax) << (DFRACT_BITS - 1 - 7); - ; - if (hSelProcInput->loudnessNormalizationOn) { + { retVal = _getLoudness(hLoudnessInfoSet, hSelProcInput->albumMode, hSelProcInput->loudnessMeasurementMethod, hSelProcInput->loudnessMeasurementSystem, @@ -1096,9 +1144,10 @@ hSelProcInput->downmixIdRequested[downmixIdIndex], &loudnessNormalizationGainDb, &loudness); if (retVal) return (retVal); - } else { + } + + if (!hSelProcInput->loudnessNormalizationOn) { loudnessNormalizationGainDb = (FIXP_DBL)0; - loudness = UNDEFINED_LOUDNESS_VALUE; } retVal = _getSignalPeakLevel( @@ -2019,6 +2068,7 @@ pSelectionData->loudnessNormalizationGainDbAdjusted + hSelProcInput->loudnessNormalizationGainModificationDb; hSelProcOutput->outputPeakLevelDb = pSelectionData->outputPeakLevel; + hSelProcOutput->outputLoudness = pSelectionData->outputLoudness; hSelProcOutput->boost = boost; hSelProcOutput->compress = compress; @@ -2039,8 +2089,11 @@ int dependsOnDrcSetID = pSelectionData->pInst->dependsOnDrcSet; for (i = 0; i < hUniDrcConfig->drcInstructionsCountInclVirtual; i++) { - if (hUniDrcConfig->drcInstructionsUniDrc[i].drcSetId == - dependsOnDrcSetID) { + DRC_INSTRUCTIONS_UNI_DRC* pInst = + &(hUniDrcConfig->drcInstructionsUniDrc[i]); + if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue; + + if (pInst->drcSetId == dependsOnDrcSetID) { hSelProcOutput->selectedDrcSetIds[hSelProcOutput->numSelectedDrcSets] = hUniDrcConfig->drcInstructionsUniDrc[i].drcSetId; hSelProcOutput->selectedDownmixIds[hSelProcOutput->numSelectedDrcSets] = @@ -2059,6 +2112,7 @@ for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) { DRC_INSTRUCTIONS_UNI_DRC* pInst = &(hUniDrcConfig->drcInstructionsUniDrc[i]); + if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue; if (pInst->drcSetEffect & EB_FADE) { if (pInst->downmixId[0] == DOWNMIX_ID_ANY_DOWNMIX) { @@ -2086,6 +2140,7 @@ for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) { DRC_INSTRUCTIONS_UNI_DRC* pInst = &(hUniDrcConfig->drcInstructionsUniDrc[i]); + if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue; if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) { for (j = 0; j < pInst->downmixIdCount; j++) { @@ -2112,6 +2167,7 @@ for (i = 0; i < hUniDrcConfig->drcInstructionsUniDrcCount; i++) { DRC_INSTRUCTIONS_UNI_DRC* pInst = &(hUniDrcConfig->drcInstructionsUniDrc[i]); + if (!_drcSetIsUsable(hUniDrcConfig, pInst)) continue; if (pInst->drcSetEffect & (EB_DUCK_OTHER | EB_DUCK_SELF)) { for (j = 0; j < pInst->downmixIdCount; j++) { @@ -2173,6 +2229,9 @@ if (hSelProcOutput->activeDownmixId != 0) { for (i = 0; i < hUniDrcConfig->downmixInstructionsCount; i++) { DOWNMIX_INSTRUCTIONS* pDown = &(hUniDrcConfig->downmixInstructions[i]); + if (pDown->targetChannelCount > 8) { + continue; + } if (hSelProcOutput->activeDownmixId == pDown->downmixId) { hSelProcOutput->targetChannelCount = pDown->targetChannelCount; @@ -2216,6 +2275,11 @@ for (j = 0; j < hUniDrcConfig->drcInstructionsCountInclVirtual; j++) { DRC_INSTRUCTIONS_UNI_DRC* pDrcInstruction = &(hUniDrcConfig->drcInstructionsUniDrc[j]); + /* check if ID is unique */ + if (selectDrcInstructions(hUniDrcConfig, pDrcInstruction->drcSetId) != + pDrcInstruction) + continue; + retVal = _drcSetPreSelectionSingleInstruction( hSelProcInput, i, hUniDrcConfig, hLoudnessInfoSet, pDrcInstruction, *ppCandidatesPotential, *ppCandidatesSelected, codecMode); @@ -2825,6 +2889,8 @@ for (i = 0; i < hUniDrcConfig->downmixInstructionsCount; i++) { if (hUniDrcConfig->downmixInstructions[i].downmixId == downmixId) { if (hUniDrcConfig->downmixInstructions[i].downmixCoefficientsPresent) { + if (hUniDrcConfig->downmixInstructions[i].targetChannelCount > 8) + return 0; *pIndex = i; return 1; } diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcDec_selectionProcess.h fdk-aac-2.0.2/libDRCdec/src/drcDec_selectionProcess.h --- fdk-aac-2.0.1/libDRCdec/src/drcDec_selectionProcess.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcDec_selectionProcess.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -111,6 +111,8 @@ typedef struct s_drcdec_selection_process* HANDLE_DRC_SELECTION_PROCESS; +#define UNDEFINED_LOUDNESS_VALUE (FIXP_DBL)(MAXVAL_DBL - 1) + typedef enum { DRCDEC_SELECTION_PROCESS_NO_ERROR = 0, @@ -146,6 +148,7 @@ SEL_PROC_EFFECT_TYPE, SEL_PROC_EFFECT_TYPE_FALLBACK_CODE, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, + SEL_PROC_ALBUM_MODE, SEL_PROC_DOWNMIX_ID, SEL_PROC_TARGET_LAYOUT, SEL_PROC_TARGET_CHANNEL_COUNT, diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcDec_types.h fdk-aac-2.0.2/libDRCdec/src/drcDec_types.h --- fdk-aac-2.0.1/libDRCdec/src/drcDec_types.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcDec_types.h 2021-04-28 12:34:15.000000000 +0000 @@ -130,6 +130,9 @@ UCHAR uniDrcGainExtPresent; UNI_DRC_GAIN_EXTENSION uniDrcGainExtension; + + /* derived data */ + UCHAR status; } UNI_DRC_GAIN, *HANDLE_UNI_DRC_GAIN; /****************/ @@ -249,11 +252,11 @@ UCHAR drcFrameSizePresent; USHORT drcFrameSize; UCHAR characteristicLeftCount; - UCHAR characteristicLeftFormat[8]; - CUSTOM_DRC_CHAR customCharacteristicLeft[8]; + UCHAR characteristicLeftFormat[16]; + CUSTOM_DRC_CHAR customCharacteristicLeft[16]; UCHAR characteristicRightCount; - UCHAR characteristicRightFormat[8]; - CUSTOM_DRC_CHAR customCharacteristicRight[8]; + UCHAR characteristicRightFormat[16]; + CUSTOM_DRC_CHAR customCharacteristicRight[16]; UCHAR gainSequenceCount; /* unsaturated value, i.e. as provided in bitstream */ UCHAR gainSetCount; /* saturated to 12 */ diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcGainDec_init.cpp fdk-aac-2.0.2/libDRCdec/src/drcGainDec_init.cpp --- fdk-aac-2.0.1/libDRCdec/src/drcGainDec_init.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcGainDec_init.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -184,24 +184,11 @@ } DRC_ERROR -initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate) { +initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec) { int i, j, k; - if (frameSize < 1) { - return DE_NOT_OK; - } - - hGainDec->frameSize = frameSize; - - if (hGainDec->frameSize * 1000 < sampleRate) { - return DE_NOT_OK; - } - - hGainDec->deltaTminDefault = getDeltaTmin(sampleRate); - if (hGainDec->deltaTminDefault > hGainDec->frameSize) { - return DE_NOT_OK; - } + /* sanity check */ + if (hGainDec->deltaTminDefault > hGainDec->frameSize) return DE_NOT_OK; for (i = 0; i < MAX_ACTIVE_DRCS; i++) { for (j = 0; j < 8; j++) { @@ -336,9 +323,11 @@ for (a = 0; a < hGainDec->nActiveDrcs; a++) { hGainDec->activeDrc[a].activeDrcOffset = accGainElementCount; accGainElementCount += hGainDec->activeDrc[a].gainElementCount; + if (accGainElementCount > 12) { + hGainDec->nActiveDrcs = a; + return DE_NOT_OK; + } } - if (accGainElementCount > 12) return DE_NOT_OK; - return DE_OK; } diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcGainDec_init.h fdk-aac-2.0.2/libDRCdec/src/drcGainDec_init.h --- fdk-aac-2.0.1/libDRCdec/src/drcGainDec_init.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcGainDec_init.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -104,8 +104,7 @@ #define DRCGAINDEC_INIT_H DRC_ERROR -initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec, const int frameSize, - const int sampleRate); +initGainDec(HANDLE_DRC_GAIN_DECODER hGainDec); void initDrcGainBuffers(const int frameSize, DRC_GAIN_BUFFERS* drcGainBuffers); diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcGainDec_preprocess.cpp fdk-aac-2.0.2/libDRCdec/src/drcGainDec_preprocess.cpp --- fdk-aac-2.0.1/libDRCdec/src/drcGainDec_preprocess.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcGainDec_preprocess.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -285,6 +285,9 @@ &e_tmp2); invExp = fDivNorm(FL2FXCONST_DBL(1.0f / (float)(1 << 1)), exp, &e_invExp); e_invExp += 1 - 5; + if (tmp2 < (FIXP_DBL)0) { + return DE_NOT_OK; + } denom = fPow(tmp2, e_tmp2, invExp, e_invExp, &e_denom); *out = fDivNormSigned(tmp, denom, &e_out); e_out += 7 - e_denom; @@ -676,7 +679,6 @@ nDrcBands = pActiveDrc->bandCountForChannelGroup[g]; for (b = 0; b < nDrcBands; b++) { DRC_ERROR err = DE_OK; - if (gainSetIndex >= 12) return DE_PARAM_OUT_OF_RANGE; GAIN_SET* pGainSet = &(pCoef->gainSet[gainSetIndex]); int seq = pGainSet->gainSequenceIndex[b]; DRC_CHARACTERISTIC* pDChar = &(pGainSet->drcCharacteristic[b]); @@ -695,7 +697,6 @@ err = _prepareDrcCharacteristic(pDChar, pCoef, b, &nodeMod); if (err) return err; - if (seq >= 12) return DE_PARAM_OUT_OF_RANGE; /* copy a node buffer and convert from dB to linear */ pLnb->nNodes[lnbp] = fMin((int)hUniDrcGain->nNodes[seq], 16); for (i = 0; i < pLnb->nNodes[lnbp]; i++) { diff -Nru fdk-aac-2.0.1/libDRCdec/src/drcGainDec_process.cpp fdk-aac-2.0.2/libDRCdec/src/drcGainDec_process.cpp --- fdk-aac-2.0.1/libDRCdec/src/drcGainDec_process.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/drcGainDec_process.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -308,8 +308,6 @@ pLinearNodeBuffer[pActiveDrc->lnbIndexForChannel[c][lnbIx] + b]); else pLnbPrevious = pDummyLnb; - if (pLnbPrevious->nNodes[lnbIx] <= 0 || pLnbPrevious->nNodes[lnbIx] > 16) - return DE_NOT_OK; nodePrevious = pLnbPrevious->linearNode[lnbIx][pLnbPrevious->nNodes[lnbIx] - 1]; nodePrevious.time -= hGainDec->frameSize; diff -Nru fdk-aac-2.0.1/libDRCdec/src/FDK_drcDecLib.cpp fdk-aac-2.0.2/libDRCdec/src/FDK_drcDecLib.cpp --- fdk-aac-2.0.1/libDRCdec/src/FDK_drcDecLib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libDRCdec/src/FDK_drcDecLib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -112,7 +112,7 @@ #define DRCDEC_LIB_VL1 1 #define DRCDEC_LIB_VL2 0 #define DRCDEC_LIB_TITLE "MPEG-D DRC Decoder Lib" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define DRCDEC_LIB_BUILD_DATE "" #define DRCDEC_LIB_BUILD_TIME "" #else @@ -145,6 +145,10 @@ SEL_PROC_OUTPUT selProcOutput; } DRC_DECODER; +static int _getGainStatus(HANDLE_UNI_DRC_GAIN hUniDrcGain) { + return hUniDrcGain->status; +} + static int isResetNeeded(HANDLE_DRC_DECODER hDrcDec, const SEL_PROC_OUTPUT oldSelProcOutput) { int i, resetNeeded = 0; @@ -173,13 +177,11 @@ return resetNeeded; } -static DRC_DEC_ERROR startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { - DRC_ERROR dErr = DE_OK; - DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR; +static void startSelectionProcess(HANDLE_DRC_DECODER hDrcDec) { int uniDrcConfigHasChanged = 0; SEL_PROC_OUTPUT oldSelProcOutput = hDrcDec->selProcOutput; - if (!hDrcDec->status) return DRC_DEC_NOT_READY; + if (!hDrcDec->status) return; if (hDrcDec->functionalRange & DRC_DEC_SELECTION) { uniDrcConfigHasChanged = hDrcDec->uniDrcConfig.diff; @@ -189,10 +191,9 @@ */ hDrcDec->selProcOutput.numSelectedDrcSets = 0; - sErr = drcDec_SelectionProcess_Process( + drcDec_SelectionProcess_Process( hDrcDec->hSelectionProc, &(hDrcDec->uniDrcConfig), &(hDrcDec->loudnessInfoSet), &(hDrcDec->selProcOutput)); - if (sErr) return DRC_DEC_OK; hDrcDec->selProcInputDiff = 0; hDrcDec->uniDrcConfig.diff = 0; @@ -202,15 +203,12 @@ if (hDrcDec->functionalRange & DRC_DEC_GAIN) { if (isResetNeeded(hDrcDec, oldSelProcOutput) || uniDrcConfigHasChanged) { - dErr = - drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig), - hDrcDec->selProcOutput.numSelectedDrcSets, - hDrcDec->selProcOutput.selectedDrcSetIds, - hDrcDec->selProcOutput.selectedDownmixIds); - if (dErr) return DRC_DEC_OK; + drcDec_GainDecoder_Config(hDrcDec->hGainDec, &(hDrcDec->uniDrcConfig), + hDrcDec->selProcOutput.numSelectedDrcSets, + hDrcDec->selProcOutput.selectedDrcSetIds, + hDrcDec->selProcOutput.selectedDownmixIds); } } - return DRC_DEC_OK; } DRC_DEC_ERROR @@ -342,7 +340,13 @@ } if (hDrcDec->functionalRange & DRC_DEC_GAIN) { - dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec, frameSize, sampleRate); + dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, + frameSize); + if (dErr) return DRC_DEC_NOT_OK; + dErr = drcDec_GainDecoder_SetParam(hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, + sampleRate); + if (dErr) return DRC_DEC_NOT_OK; + dErr = drcDec_GainDecoder_Init(hDrcDec->hGainDec); if (dErr) return DRC_DEC_NOT_OK; } @@ -383,73 +387,99 @@ FDK_drcDec_SetParam(HANDLE_DRC_DECODER hDrcDec, const DRC_DEC_USERPARAM requestType, const FIXP_DBL requestValue) { + DRC_ERROR dErr = DE_OK; DRCDEC_SELECTION_PROCESS_RETURN sErr = DRCDEC_SELECTION_PROCESS_NO_ERROR; + int invalidParameter = 0; if (hDrcDec == NULL) return DRC_DEC_NOT_OPENED; - if (hDrcDec->functionalRange == DRC_DEC_GAIN) - return DRC_DEC_NOT_OK; /* not supported for DRC_DEC_GAIN. All parameters are - handed over to selection process lib. */ + if (hDrcDec->functionalRange & DRC_DEC_GAIN) { + switch (requestType) { + case DRC_DEC_SAMPLE_RATE: + dErr = drcDec_GainDecoder_SetParam( + hDrcDec->hGainDec, GAIN_DEC_SAMPLE_RATE, (int)requestValue); + if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_FRAME_SIZE: + dErr = drcDec_GainDecoder_SetParam( + hDrcDec->hGainDec, GAIN_DEC_FRAME_SIZE, (int)requestValue); + if (dErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + default: + invalidParameter |= DRC_DEC_GAIN; + } + } - switch (requestType) { - case DRC_DEC_BOOST: - sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, - SEL_PROC_BOOST, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_COMPRESS: - sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, - SEL_PROC_COMPRESS, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_LOUDNESS_NORMALIZATION_ON: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON, - requestValue, &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_TARGET_LOUDNESS: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_EFFECT_TYPE: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_DOWNMIX_ID: - sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, - SEL_PROC_DOWNMIX_ID, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - case DRC_DEC_BASE_CHANNEL_COUNT: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue, - &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_NOT_OK; - break; - case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD: - sErr = drcDec_SelectionProcess_SetParam( - hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, - requestValue, &(hDrcDec->selProcInputDiff)); - if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; - break; - default: - return DRC_DEC_INVALID_PARAM; + if (hDrcDec->functionalRange & DRC_DEC_SELECTION) { + switch (requestType) { + case DRC_DEC_BOOST: + sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, + SEL_PROC_BOOST, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_COMPRESS: + sErr = drcDec_SelectionProcess_SetParam(hDrcDec->hSelectionProc, + SEL_PROC_COMPRESS, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_LOUDNESS_NORMALIZATION_ON: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_NORMALIZATION_ON, + requestValue, &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_TARGET_LOUDNESS: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_TARGET_LOUDNESS, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_EFFECT_TYPE: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_EFFECT_TYPE, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_DOWNMIX_ID: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_DOWNMIX_ID, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_TARGET_CHANNEL_COUNT_REQUESTED: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_TARGET_CHANNEL_COUNT, + requestValue, &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_BASE_CHANNEL_COUNT: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_BASE_CHANNEL_COUNT, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_NOT_OK; + break; + case DRC_DEC_LOUDNESS_MEASUREMENT_METHOD: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_LOUDNESS_MEASUREMENT_METHOD, + requestValue, &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + case DRC_DEC_ALBUM_MODE: + sErr = drcDec_SelectionProcess_SetParam( + hDrcDec->hSelectionProc, SEL_PROC_ALBUM_MODE, requestValue, + &(hDrcDec->selProcInputDiff)); + if (sErr) return DRC_DEC_PARAM_OUT_OF_RANGE; + break; + default: + invalidParameter |= DRC_DEC_SELECTION; + } } + if (invalidParameter == hDrcDec->functionalRange) + return DRC_DEC_INVALID_PARAM; + /* All parameters need a new start of the selection process */ startSelectionProcess(hDrcDec); @@ -489,6 +519,8 @@ } case DRC_DEC_TARGET_CHANNEL_COUNT_SELECTED: return (LONG)hDrcDec->selProcOutput.targetChannelCount; + case DRC_DEC_OUTPUT_LOUDNESS: + return (LONG)hDrcDec->selProcOutput.outputLoudness; default: return 0; } @@ -703,7 +735,9 @@ &(hDrcDec->uniDrcGain)); if (dErr) return DRC_DEC_NOT_OK; - hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD; + if (_getGainStatus(&(hDrcDec->uniDrcGain))) { + hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD; + } return DRC_DEC_OK; } @@ -721,11 +755,13 @@ drcDec_GainDecoder_GetFrameSize(hDrcDec->hGainDec), drcDec_GainDecoder_GetDeltaTminDefault(hDrcDec->hGainDec), &(hDrcDec->uniDrcGain)); - if (dErr) return DRC_DEC_NOT_OK; startSelectionProcess(hDrcDec); + if (dErr) return DRC_DEC_NOT_OK; - hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD; + if (_getGainStatus(&(hDrcDec->uniDrcGain))) { + hDrcDec->status = DRC_DEC_NEW_GAIN_PAYLOAD; + } return DRC_DEC_OK; } diff -Nru fdk-aac-2.0.1/libFDK/include/FDK_qmf_domain.h fdk-aac-2.0.2/libFDK/include/FDK_qmf_domain.h --- fdk-aac-2.0.1/libFDK/include/FDK_qmf_domain.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/FDK_qmf_domain.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -123,11 +123,10 @@ #define QMF_WB_SECTION_SIZE (1024 * 2) H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore1, FIXP_DBL) -H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore2, FIXP_DBL) H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore3, FIXP_DBL) H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore4, FIXP_DBL) -H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore5, FIXP_DBL) H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore6, FIXP_DBL) +H_ALLOC_MEM_OVERLAY(QmfWorkBufferCore7, FIXP_DBL) #define QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS (64) #define QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS (QMF_MAX_SYNTHESIS_BANDS) @@ -145,15 +144,15 @@ #define QMF_DOMAIN_OV_TIMESLOTS_16 (3) #define QMF_DOMAIN_OV_TIMESLOTS_32 (6) -H_ALLOC_MEM(AnaQmfStates, FIXP_QAS) +H_ALLOC_MEM(AnaQmfStates, FIXP_DBL) H_ALLOC_MEM(SynQmfStates, FIXP_QSS) H_ALLOC_MEM(QmfSlotsReal, FIXP_DBL *) H_ALLOC_MEM(QmfSlotsImag, FIXP_DBL *) H_ALLOC_MEM(QmfOverlapBuffer, FIXP_DBL) -H_ALLOC_MEM(AnaQmfStates16, FIXP_QAS) -H_ALLOC_MEM(AnaQmfStates24, FIXP_QAS) -H_ALLOC_MEM(AnaQmfStates32, FIXP_QAS) +H_ALLOC_MEM(AnaQmfStates16, FIXP_DBL) +H_ALLOC_MEM(AnaQmfStates24, FIXP_DBL) +H_ALLOC_MEM(AnaQmfStates32, FIXP_DBL) H_ALLOC_MEM(QmfSlotsReal16, FIXP_DBL *) H_ALLOC_MEM(QmfSlotsReal32, FIXP_DBL *) H_ALLOC_MEM(QmfSlotsImag16, FIXP_DBL *) @@ -161,8 +160,6 @@ H_ALLOC_MEM(QmfOverlapBuffer16, FIXP_DBL) H_ALLOC_MEM(QmfOverlapBuffer32, FIXP_DBL) -#define QDOM_PCM INT_PCM - /** * Structure to hold the configuration data which is global whithin a QMF domain * instance. @@ -182,9 +179,6 @@ park a channel if only one processing channel is available. */ UCHAR parkChannel_requested; - QDOM_PCM - *TDinput; /*!< Pointer to time domain data used as input for the QMF - analysis. */ FIXP_DBL * pWorkBuffer[QMF_MAX_WB_SECTIONS]; /*!< Pointerarray to volatile memory. */ UINT flags; /*!< Flags to be set on all QMF analysis/synthesis filter @@ -244,7 +238,7 @@ (workBuf_nTimeSlots * workBuf_nBands * CMPLX_MOD). */ USHORT workBufferOffset; /*!< Offset within work buffer. */ USHORT workBufferSectSize; /*!< Size of work buffer section. */ - FIXP_QAS * + FIXP_DBL * pAnaQmfStates; /*!< Pointer to QMF analysis states (persistent memory). */ FIXP_DBL *pOverlapBuffer; /*!< Pointer to QMF overlap/delay memory (persistent diff -Nru fdk-aac-2.0.1/libFDK/include/fixpoint_math.h fdk-aac-2.0.2/libFDK/include/fixpoint_math.h --- fdk-aac-2.0.1/libFDK/include/fixpoint_math.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/fixpoint_math.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -171,6 +171,19 @@ * \return non-zero if (a_m*2^a_e) < (b_m*2^b_e), 0 otherwise */ FDK_INLINE INT fIsLessThan(FIXP_DBL a_m, INT a_e, FIXP_DBL b_m, INT b_e) { + INT n; + + n = fixnorm_D(a_m); + a_m <<= n; + a_e -= n; + + n = fixnorm_D(b_m); + b_m <<= n; + b_e -= n; + + if (a_m == (FIXP_DBL)0) a_e = b_e; + if (b_m == (FIXP_DBL)0) b_e = a_e; + if (a_e > b_e) { return ((b_m >> fMin(a_e - b_e, DFRACT_BITS - 1)) > a_m); } else { @@ -179,6 +192,19 @@ } FDK_INLINE INT fIsLessThan(FIXP_SGL a_m, INT a_e, FIXP_SGL b_m, INT b_e) { + INT n; + + n = fixnorm_S(a_m); + a_m <<= n; + a_e -= n; + + n = fixnorm_S(b_m); + b_m <<= n; + b_e -= n; + + if (a_m == (FIXP_SGL)0) a_e = b_e; + if (b_m == (FIXP_SGL)0) b_e = a_e; + if (a_e > b_e) { return ((b_m >> fMin(a_e - b_e, FRACT_BITS - 1)) > a_m); } else { @@ -545,15 +571,20 @@ m = fMultNorm(a, (FIXP_DBL)b, &m_e); if (m_e < (INT)0) { - if (m_e > (INT)-DFRACT_BITS) { + if (m_e > (INT) - (DFRACT_BITS - 1)) { mi = (m >> (-m_e)); if ((LONG)m & ((1 << (-m_e)) - 1)) { mi = mi + (FIXP_DBL)1; } } else { - mi = (FIXP_DBL)1; - if (m < (FIXP_DBL)0) { - mi = (FIXP_DBL)0; + if (m > (FIXP_DBL)0) { + mi = (FIXP_DBL)1; + } else { + if ((m_e == -(DFRACT_BITS - 1)) && (m == (FIXP_DBL)MINVAL_DBL)) { + mi = (FIXP_DBL)-1; + } else { + mi = (FIXP_DBL)0; + } } } } else { @@ -744,7 +775,7 @@ /** * \brief return (base_m * 2^base_e) ^ N - * \param base_m mantissa of the base + * \param base_m mantissa of the base. Must not be negative. * \param base_e exponent of the base * \param N power to be calculated of the base * \param result_e pointer to a INT where the exponent of the result will be diff -Nru fdk-aac-2.0.1/libFDK/include/mdct.h fdk-aac-2.0.2/libFDK/include/mdct.h --- fdk-aac-2.0.1/libFDK/include/mdct.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/mdct.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -106,18 +106,16 @@ #include "common_fix.h" #define MDCT_OUT_HEADROOM 2 /* Output additional headroom */ -#define PCM_OUT_BITS SAMPLE_BITS + +#define PCM_OUT_BITS DFRACT_BITS #define PCM_OUT_HEADROOM 8 /* Must have the same values as DMXH_HEADROOM */ -#define MDCT_OUTPUT_SCALE (-MDCT_OUT_HEADROOM + (DFRACT_BITS - SAMPLE_BITS)) +#define MDCT_OUTPUT_SCALE (-MDCT_OUT_HEADROOM + (DFRACT_BITS - PCM_OUT_BITS)) /* Refer to "Output word length" in ISO/IEC 14496-3:2008(E) 23.2.3.6 */ #define MDCT_OUTPUT_GAIN 16 -#if (MDCT_OUTPUT_SCALE >= 0) -#define IMDCT_SCALE(x) SATURATE_RIGHT_SHIFT(x, MDCT_OUTPUT_SCALE, PCM_OUT_BITS) -#else -#define IMDCT_SCALE(x) SATURATE_LEFT_SHIFT(x, -MDCT_OUTPUT_SCALE, PCM_OUT_BITS) -#endif +#define IMDCT_SCALE(x, s) \ + SATURATE_RIGHT_SHIFT((x), ((s) + MDCT_OUTPUT_SCALE), PCM_OUT_BITS) #define IMDCT_SCALE_DBL(x) (FIXP_DBL)(x) #define IMDCT_SCALE_DBL_LSH1(x) SATURATE_LEFT_SHIFT_ALT((x), 1, DFRACT_BITS) diff -Nru fdk-aac-2.0.1/libFDK/include/mips/abs_mips.h fdk-aac-2.0.2/libFDK/include/mips/abs_mips.h --- fdk-aac-2.0.1/libFDK/include/mips/abs_mips.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/mips/abs_mips.h 2021-04-28 12:34:15.000000000 +0000 @@ -107,7 +107,7 @@ #if defined(__GNUC__) && defined(__mips__) -#if defined(__mips_dsp) +#if defined(__mips_dsp) && !defined(__mips16) #define FUNCTION_fixabs_D #define FUNCTION_fixabs_I #define FUNCTION_fixabs_S diff -Nru fdk-aac-2.0.1/libFDK/include/mips/scale_mips.h fdk-aac-2.0.2/libFDK/include/mips/scale_mips.h --- fdk-aac-2.0.1/libFDK/include/mips/scale_mips.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/mips/scale_mips.h 2021-04-28 12:34:15.000000000 +0000 @@ -103,7 +103,7 @@ #ifndef SCALE_MIPS_H #define SCALE_MIPS_H -#if defined(__mips_dsp) +#if defined(__mips_dsp) && !defined(__mips16) /*! * diff -Nru fdk-aac-2.0.1/libFDK/include/qmf.h fdk-aac-2.0.2/libFDK/include/qmf.h --- fdk-aac-2.0.1/libFDK/include/qmf.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/qmf.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -116,6 +116,7 @@ #define FIXP_QAS FIXP_PCM #define QAS_BITS SAMPLE_BITS +#define INT_PCM_QMFIN INT_PCM #define FIXP_QSS FIXP_DBL #define QSS_BITS DFRACT_BITS @@ -201,66 +202,70 @@ typedef struct QMF_FILTER_BANK *HANDLE_QMF_FILTER_BANK; +int qmfInitAnalysisFilterBank( + HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */ + FIXP_QAS *pFilterStates, /*!< Pointer to filter state buffer */ + int noCols, /*!< Number of time slots */ + int lsb, /*!< Number of lower bands */ + int usb, /*!< Number of upper bands */ + int no_channels, /*!< Number of critically sampled bands */ + int flags); /*!< Flags */ +#if SAMPLE_BITS == 16 + +int qmfInitAnalysisFilterBank( + HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */ + FIXP_DBL *pFilterStates, /*!< Pointer to filter state buffer */ + int noCols, /*!< Number of time slots */ + int lsb, /*!< Number of lower bands */ + int usb, /*!< Number of upper bands */ + int no_channels, /*!< Number of critically sampled bands */ + int flags); /*!< Flags */ +#endif + void qmfAnalysisFiltering( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */ FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */ QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ - const LONG *timeIn, /*!< Time signal */ + const INT_PCM *timeIn, /*!< Time signal */ const int timeIn_e, /*!< Exponent of audio data */ const int stride, /*!< Stride factor of audio data */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ ); +#if SAMPLE_BITS == 16 void qmfAnalysisFiltering( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */ FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */ QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ - const INT_PCM *timeIn, /*!< Time signal */ + const LONG *timeIn, /*!< Time signal */ const int timeIn_e, /*!< Exponent of audio data */ const int stride, /*!< Stride factor of audio data */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ -); - -void qmfSynthesisFiltering( - HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ - FIXP_DBL **QmfBufferReal, /*!< Pointer to real subband slots */ - FIXP_DBL **QmfBufferImag, /*!< Pointer to imag subband slots */ - const QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ - const int ov_len, /*!< Length of band overlap */ - INT_PCM *timeOut, /*!< Time signal */ - const INT stride, /*!< Stride factor of audio data */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer. It must be - aligned */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */ ); - -int qmfInitAnalysisFilterBank( - HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */ - FIXP_QAS *pFilterStates, /*!< Pointer to filter state buffer */ - int noCols, /*!< Number of time slots */ - int lsb, /*!< Number of lower bands */ - int usb, /*!< Number of upper bands */ - int no_channels, /*!< Number of critically sampled bands */ - int flags); /*!< Flags */ +#endif void qmfAnalysisFilteringSlot( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_DBL *qmfReal, /*!< Low and High band, real */ FIXP_DBL *qmfImag, /*!< Low and High band, imag */ - const LONG *timeIn, /*!< Pointer to input */ + const INT_PCM *timeIn, /*!< Pointer to input */ const int stride, /*!< stride factor of input */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ ); +#if SAMPLE_BITS == 16 void qmfAnalysisFilteringSlot( HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ FIXP_DBL *qmfReal, /*!< Low and High band, real */ FIXP_DBL *qmfImag, /*!< Low and High band, imag */ - const INT_PCM *timeIn, /*!< Pointer to input */ + const LONG *timeIn, /*!< Pointer to input */ const int stride, /*!< stride factor of input */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */ ); +#endif + int qmfInitSynthesisFilterBank( HANDLE_QMF_FILTER_BANK h_Qmf, /*!< QMF Handle */ FIXP_QSS *pFilterStates, /*!< Pointer to filter state buffer */ @@ -270,12 +275,46 @@ int no_channels, /*!< Number of critically sampled bands */ int flags); /*!< Flags */ +void qmfSynthesisFiltering( + HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ + FIXP_DBL **QmfBufferReal, /*!< Pointer to real subband slots */ + FIXP_DBL **QmfBufferImag, /*!< Pointer to imag subband slots */ + const QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ + const int ov_len, /*!< Length of band overlap */ + INT_PCM *timeOut, /*!< Time signal */ + const INT stride, /*!< Stride factor of audio data */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer. It must be + aligned */ +); +#if SAMPLE_BITS == 16 + +void qmfSynthesisFiltering( + HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ + FIXP_DBL **QmfBufferReal, /*!< Pointer to real subband slots */ + FIXP_DBL **QmfBufferImag, /*!< Pointer to imag subband slots */ + const QMF_SCALE_FACTOR *scaleFactor, /*!< Scale factors of QMF data */ + const int ov_len, /*!< Length of band overlap */ + LONG *timeOut, /*!< Time signal */ + const int timeOut_e, /*!< Target exponent for timeOut */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporary working buffer */ +); +#endif + void qmfSynthesisFilteringSlot(HANDLE_QMF_FILTER_BANK synQmf, const FIXP_DBL *realSlot, const FIXP_DBL *imagSlot, const int scaleFactorLowBand, const int scaleFactorHighBand, INT_PCM *timeOut, const int timeOut_e, FIXP_DBL *pWorkBuffer); +#if SAMPLE_BITS == 16 + +void qmfSynthesisFilteringSlot(HANDLE_QMF_FILTER_BANK synQmf, + const FIXP_DBL *realSlot, + const FIXP_DBL *imagSlot, + const int scaleFactorLowBand, + const int scaleFactorHighBand, LONG *timeOut, + const int timeOut_e, FIXP_DBL *pWorkBuffer); +#endif void qmfChangeOutScalefactor( HANDLE_QMF_FILTER_BANK synQmf, /*!< Handle of Qmf Synthesis Bank */ @@ -291,11 +330,5 @@ FIXP_DBL outputGain, /*!< New gain for output data (mantissa) */ int outputGainScale /*!< New gain for output data (exponent) */ ); -void qmfSynPrototypeFirSlot( - HANDLE_QMF_FILTER_BANK qmf, - FIXP_DBL *RESTRICT realSlot, /*!< Input: Pointer to real Slot */ - FIXP_DBL *RESTRICT imagSlot, /*!< Input: Pointer to imag Slot */ - INT_PCM *RESTRICT timeOut, /*!< Time domain data */ - const int timeOut_e); #endif /*ifndef QMF_H */ diff -Nru fdk-aac-2.0.1/libFDK/include/qmf_pcm.h fdk-aac-2.0.2/libFDK/include/qmf_pcm.h --- fdk-aac-2.0.1/libFDK/include/qmf_pcm.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/qmf_pcm.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -402,4 +402,220 @@ timeOut + (i * L * stride), stride, pWorkBuffer); } /* no_col loop i */ } + +/*! + * + * \brief Create QMF filter bank instance + * + * + * \return 0 if successful + * + */ +int qmfInitAnalysisFilterBank( + HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */ + FIXP_QAS *pFilterStates, /*!< Handle to filter states */ + int noCols, /*!< Number of timeslots per frame */ + int lsb, /*!< lower end of QMF */ + int usb, /*!< upper end of QMF */ + int no_channels, /*!< Number of channels (bands) */ + int flags) /*!< Low Power flag */ +{ + int err = qmfInitFilterBank(h_Qmf, pFilterStates, noCols, lsb, usb, + no_channels, flags, 0); + if (!(flags & QMF_FLAG_KEEP_STATES) && (h_Qmf->FilterStates != NULL)) { + FDKmemclear(h_Qmf->FilterStates, + (2 * QMF_NO_POLY - 1) * h_Qmf->no_channels * sizeof(FIXP_QAS)); + } + + FDK_ASSERT(h_Qmf->no_channels >= h_Qmf->lsb); + + return err; +} + +#ifndef FUNCTION_qmfAnaPrototypeFirSlot +/*! + \brief Perform Analysis Prototype Filtering on a single slot of input data. +*/ +static void qmfAnaPrototypeFirSlot( + FIXP_DBL *analysisBuffer, + INT no_channels, /*!< Number channels of analysis filter */ + const FIXP_PFT *p_filter, INT p_stride, /*!< Stride of analysis filter */ + FIXP_QAS *RESTRICT pFilterStates) { + INT k; + + FIXP_DBL accu; + const FIXP_PFT *RESTRICT p_flt = p_filter; + FIXP_DBL *RESTRICT pData_0 = analysisBuffer + 2 * no_channels - 1; + FIXP_DBL *RESTRICT pData_1 = analysisBuffer; + + FIXP_QAS *RESTRICT sta_0 = (FIXP_QAS *)pFilterStates; + FIXP_QAS *RESTRICT sta_1 = + (FIXP_QAS *)pFilterStates + (2 * QMF_NO_POLY * no_channels) - 1; + INT pfltStep = QMF_NO_POLY * (p_stride); + INT staStep1 = no_channels << 1; + INT staStep2 = (no_channels << 3) - 1; /* Rewind one less */ + + /* FIR filters 127..64 0..63 */ + for (k = 0; k < no_channels; k++) { + accu = fMultDiv2(p_flt[0], *sta_1); + sta_1 -= staStep1; + accu += fMultDiv2(p_flt[1], *sta_1); + sta_1 -= staStep1; + accu += fMultDiv2(p_flt[2], *sta_1); + sta_1 -= staStep1; + accu += fMultDiv2(p_flt[3], *sta_1); + sta_1 -= staStep1; + accu += fMultDiv2(p_flt[4], *sta_1); + *pData_1++ = (accu << 1); + sta_1 += staStep2; + + p_flt += pfltStep; + accu = fMultDiv2(p_flt[0], *sta_0); + sta_0 += staStep1; + accu += fMultDiv2(p_flt[1], *sta_0); + sta_0 += staStep1; + accu += fMultDiv2(p_flt[2], *sta_0); + sta_0 += staStep1; + accu += fMultDiv2(p_flt[3], *sta_0); + sta_0 += staStep1; + accu += fMultDiv2(p_flt[4], *sta_0); + *pData_0-- = (accu << 1); + sta_0 -= staStep2; + } +} +#endif /* !defined(FUNCTION_qmfAnaPrototypeFirSlot) */ + +#ifndef FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric +/*! + \brief Perform Analysis Prototype Filtering on a single slot of input data. +*/ +static void qmfAnaPrototypeFirSlot_NonSymmetric( + FIXP_DBL *analysisBuffer, + int no_channels, /*!< Number channels of analysis filter */ + const FIXP_PFT *p_filter, int p_stride, /*!< Stride of analysis filter */ + FIXP_QAS *RESTRICT pFilterStates) { + const FIXP_PFT *RESTRICT p_flt = p_filter; + int p, k; + + for (k = 0; k < 2 * no_channels; k++) { + FIXP_DBL accu = (FIXP_DBL)0; + + p_flt += QMF_NO_POLY * (p_stride - 1); + + /* + Perform FIR-Filter + */ + for (p = 0; p < QMF_NO_POLY; p++) { + accu += fMultDiv2(*p_flt++, pFilterStates[2 * no_channels * p]); + } + analysisBuffer[2 * no_channels - 1 - k] = (accu << 1); + pFilterStates++; + } +} +#endif /* FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric */ + +/* + * \brief Perform one QMF slot analysis of the time domain data of timeIn + * with specified stride and stores the real part of the subband + * samples in rSubband, and the imaginary part in iSubband + * + * Note: anaQmf->lsb can be greater than anaQmf->no_channels in case + * of implicit resampling (USAC with reduced 3/4 core frame length). + */ +void qmfAnalysisFilteringSlot( + HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ + FIXP_DBL *qmfReal, /*!< Low and High band, real */ + FIXP_DBL *qmfImag, /*!< Low and High band, imag */ + const INT_PCM_QMFIN *RESTRICT timeIn, /*!< Pointer to input */ + const int stride, /*!< stride factor of input */ + FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ +) { + int offset = anaQmf->no_channels * (QMF_NO_POLY * 2 - 1); + /* + Feed time signal into oldest anaQmf->no_channels states + */ + { + FIXP_QAS *FilterStatesAnaTmp = ((FIXP_QAS *)anaQmf->FilterStates) + offset; + + /* Feed and scale actual time in slot */ + for (int i = anaQmf->no_channels >> 1; i != 0; i--) { + /* Place INT_PCM value left aligned in scaledTimeIn */ + *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; + timeIn += stride; + *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; + timeIn += stride; + } + } + + if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) { + qmfAnaPrototypeFirSlot_NonSymmetric(pWorkBuffer, anaQmf->no_channels, + anaQmf->p_filter, anaQmf->p_stride, + (FIXP_QAS *)anaQmf->FilterStates); + } else { + qmfAnaPrototypeFirSlot(pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter, + anaQmf->p_stride, (FIXP_QAS *)anaQmf->FilterStates); + } + + if (anaQmf->flags & QMF_FLAG_LP) { + if (anaQmf->flags & QMF_FLAG_CLDFB) + qmfForwardModulationLP_odd(anaQmf, pWorkBuffer, qmfReal); + else + qmfForwardModulationLP_even(anaQmf, pWorkBuffer, qmfReal); + + } else { + qmfForwardModulationHQ(anaQmf, pWorkBuffer, qmfReal, qmfImag); + } + /* + Shift filter states + + Should be realized with modulo addressing on a DSP instead of a true buffer + shift + */ + FDKmemmove(anaQmf->FilterStates, + (FIXP_QAS *)anaQmf->FilterStates + anaQmf->no_channels, + offset * sizeof(FIXP_QAS)); +} + +/*! + * + * \brief Perform complex-valued subband filtering of the time domain + * data of timeIn and stores the real part of the subband + * samples in rAnalysis, and the imaginary part in iAnalysis + * The qmf coefficient table is symmetric. The symmetry is expoited by + * shrinking the coefficient table to half the size. The addressing mode + * takes care of the symmetries. + * + * + * \sa PolyphaseFiltering + */ +void qmfAnalysisFiltering( + HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ + FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */ + FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */ + QMF_SCALE_FACTOR *scaleFactor, + const INT_PCM_QMFIN *timeIn, /*!< Time signal */ + const int timeIn_e, const int stride, + FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ +) { + int i; + int no_channels = anaQmf->no_channels; + + scaleFactor->lb_scale = + -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - timeIn_e; + scaleFactor->lb_scale -= anaQmf->filterScale; + + for (i = 0; i < anaQmf->no_col; i++) { + FIXP_DBL *qmfImagSlot = NULL; + + if (!(anaQmf->flags & QMF_FLAG_LP)) { + qmfImagSlot = qmfImag[i]; + } + + qmfAnalysisFilteringSlot(anaQmf, qmfReal[i], qmfImagSlot, timeIn, stride, + pWorkBuffer); + + timeIn += no_channels * stride; + + } /* no_col loop i */ +} #endif /* QMF_PCM_H */ diff -Nru fdk-aac-2.0.1/libFDK/include/scale.h fdk-aac-2.0.2/libFDK/include/scale.h --- fdk-aac-2.0.1/libFDK/include/scale.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/scale.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -123,21 +123,19 @@ #if (SAMPLE_BITS == 16) void scaleValues(FIXP_PCM *dst, const FIXP_DBL *src, INT len, INT scalefactor); #endif -void scaleValues(FIXP_PCM *dst, const FIXP_SGL *src, INT len, INT scalefactor); +void scaleValues(FIXP_SGL *dst, const FIXP_SGL *src, INT len, INT scalefactor); void scaleCplxValues(FIXP_DBL *r_dst, FIXP_DBL *i_dst, const FIXP_DBL *r_src, const FIXP_DBL *i_src, INT len, INT scalefactor); void scaleValuesWithFactor(FIXP_DBL *vector, FIXP_DBL factor, INT len, INT scalefactor); void scaleValuesSaturate(FIXP_DBL *vector, INT len, INT scalefactor); -void scaleValuesSaturate(FIXP_DBL *dst, FIXP_DBL *src, INT len, +void scaleValuesSaturate(FIXP_DBL *dst, const FIXP_DBL *src, INT len, INT scalefactor); -void scaleValuesSaturate(FIXP_SGL *dst, FIXP_DBL *src, INT len, +void scaleValuesSaturate(FIXP_SGL *dst, const FIXP_DBL *src, INT len, INT scalefactor); -void scaleValuesSaturate(INT_PCM *dst, FIXP_DBL *src, INT len, INT scalefactor); void scaleValuesSaturate(FIXP_SGL *vector, INT len, INT scalefactor); -void scaleValuesSaturate(FIXP_SGL *dst, FIXP_SGL *src, INT len, +void scaleValuesSaturate(FIXP_SGL *dst, const FIXP_SGL *src, INT len, INT scalefactor); -void scaleValuesSaturate(INT_PCM *dst, INT_PCM *src, INT len, INT scalefactor); INT getScalefactorShort(const SHORT *vector, INT len); INT getScalefactorPCM(const INT_PCM *vector, INT len, INT stride); INT getScalefactor(const FIXP_DBL *vector, INT len); diff -Nru fdk-aac-2.0.1/libFDK/include/scramble.h fdk-aac-2.0.2/libFDK/include/scramble.h --- fdk-aac-2.0.1/libFDK/include/scramble.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/include/scramble.h 2021-04-28 12:34:15.000000000 +0000 @@ -108,7 +108,7 @@ #if defined(__arm__) #include "arm/scramble_arm.h" -#elif defined(__mips__) && defined(__mips_dsp) +#elif defined(__mips__) && defined(__mips_dsp) && !defined(__mips16) #include "mips/scramble_mips.h" #endif diff -Nru fdk-aac-2.0.1/libFDK/src/dct.cpp fdk-aac-2.0.2/libFDK/src/dct.cpp --- fdk-aac-2.0.1/libFDK/src/dct.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/dct.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -489,18 +489,18 @@ for (i = 0; i < M - 1; i += 2, pDat_0 += 2, pDat_1 -= 2) { FIXP_DBL accu1, accu2, accu3, accu4; - accu1 = pDat_1[1]; - accu2 = -pDat_0[0]; - accu3 = pDat_0[1]; - accu4 = -pDat_1[0]; + accu1 = pDat_1[1] >> 1; + accu2 = -(pDat_0[0] >> 1); + accu3 = pDat_0[1] >> 1; + accu4 = -(pDat_1[0] >> 1); cplxMultDiv2(&accu1, &accu2, accu1, accu2, twiddle[i]); cplxMultDiv2(&accu3, &accu4, accu4, accu3, twiddle[i + 1]); - pDat_0[0] = accu2 >> 1; - pDat_0[1] = accu1 >> 1; - pDat_1[0] = accu4 >> 1; - pDat_1[1] = -(accu3 >> 1); + pDat_0[0] = accu2; + pDat_0[1] = accu1; + pDat_1[0] = accu4; + pDat_1[1] = -accu3; } if (M & 1) { FIXP_DBL accu1, accu2; diff -Nru fdk-aac-2.0.1/libFDK/src/FDK_bitbuffer.cpp fdk-aac-2.0.2/libFDK/src/FDK_bitbuffer.cpp --- fdk-aac-2.0.1/libFDK/src/FDK_bitbuffer.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/FDK_bitbuffer.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -368,7 +368,10 @@ UINT bTotal = 0; - UINT bToRead = (hBitBuf->bufBits - hBitBuf->ValidBits) >> 3; + UINT bToRead = + fMin(hBitBuf->bufBits, + (UINT)fMax(0, ((INT)hBitBuf->bufBits - (INT)hBitBuf->ValidBits))) >> + 3; UINT noOfBytes = fMin(bToRead, *bytesValid); //(bToRead < *bytesValid) ? bToRead : *bytesValid ; @@ -384,7 +387,7 @@ bToRead * sizeof(UCHAR)); /* add noOfBits to number of valid bits in buffer */ - hBitBuf->ValidBits += bToRead << 3; + hBitBuf->ValidBits = (UINT)((INT)hBitBuf->ValidBits + (INT)(bToRead << 3)); bTotal += bToRead; inputBuffer += bToRead; diff -Nru fdk-aac-2.0.1/libFDK/src/FDK_core.cpp fdk-aac-2.0.2/libFDK/src/FDK_core.cpp --- fdk-aac-2.0.1/libFDK/src/FDK_core.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/FDK_core.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -104,10 +104,10 @@ /* FDK tools library info */ #define FDK_TOOLS_LIB_VL0 3 -#define FDK_TOOLS_LIB_VL1 0 +#define FDK_TOOLS_LIB_VL1 1 #define FDK_TOOLS_LIB_VL2 0 #define FDK_TOOLS_LIB_TITLE "FDK Tools" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define FDK_TOOLS_LIB_BUILD_DATE "" #define FDK_TOOLS_LIB_BUILD_TIME "" #else diff -Nru fdk-aac-2.0.1/libFDK/src/FDK_decorrelate.cpp fdk-aac-2.0.2/libFDK/src/FDK_decorrelate.cpp --- fdk-aac-2.0.1/libFDK/src/FDK_decorrelate.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/FDK_decorrelate.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -227,7 +227,7 @@ } #define DUCKER_MAX_NRG_SCALE (24) -#define DUCKER_HEADROOM_BITS (3) +#define DUCKER_HEADROOM_BITS (2) #define FILTER_SF (2) @@ -606,10 +606,6 @@ dataImagIn += start; dataRealOut += start; dataImagOut += start; -#ifdef FUNCTION_DecorrFilterApplyPASS_func1 - DecorrFilterApplyPASS_func1(i, dataRealIn, dataImagIn, dataRealOut, - dataImagOut, pDelayBuffer, offset); -#else do { FIXP_DBL delay_re, delay_im, real, imag; @@ -623,7 +619,6 @@ *dataImagOut++ = delay_im; pDelayBuffer += offset; } while (--i != 0); -#endif } } @@ -1061,24 +1056,15 @@ FIXP_DBL maxVal = FL2FXCONST_DBL(-1.0f); if (maxVal == FL2FXCONST_DBL(-1.0f)) { -#ifdef FUNCTION_DuckerCalcEnergy_func2 - maxVal = DuckerCalcEnergy_func2(inputReal, inputImag, startHybBand, - maxHybBand, maxHybridBand); -#else - FIXP_DBL localMaxVal = FL2FXCONST_DBL(0.0f); - for (qs = startHybBand; qs <= maxHybBand; qs++) { - localMaxVal |= fAbs(inputReal[qs]); - localMaxVal |= fAbs(inputImag[qs]); - } - for (; qs <= maxHybridBand; qs++) { - localMaxVal |= fAbs(inputReal[qs]); - } - maxVal = localMaxVal; -#endif + clz = fMin(getScalefactor(&inputReal[startHybBand], + fMax(0, maxHybridBand - startHybBand + 1)), + getScalefactor(&inputImag[startHybBand], + fMax(0, maxHybBand - startHybBand + 1))); + } else { + clz = CntLeadingZeros(maxVal) - 1; } - clz = fixMax(0, CntLeadingZeros(maxVal) - DUCKER_HEADROOM_BITS); - clz = fixMin(clz, DUCKER_MAX_NRG_SCALE); + clz = fMin(fMax(0, clz - DUCKER_HEADROOM_BITS), DUCKER_MAX_NRG_SCALE); *nrgScale = (SCHAR)clz << 1; /* Initialize pb since it would stay uninitialized for the case startHybBand @@ -1086,9 +1072,10 @@ pb = SpatialDecGetProcessingBand(maxHybBand, self->mapHybBands2ProcBands); for (qs = startHybBand; qs <= maxHybBand; qs++) { pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands); - energy[pb] = - fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) + - fPow2Div2(inputImag[qs] << clz)); + energy[pb] = SATURATE_LEFT_SHIFT( + (energy[pb] >> 1) + (fPow2Div2(inputReal[qs] << clz) >> 1) + + (fPow2Div2(inputImag[qs] << clz) >> 1), + 1, DFRACT_BITS); } pb++; @@ -1112,43 +1099,29 @@ maxVal = inputMaxVal; if (maxVal == FL2FXCONST_DBL(-1.0f)) { -#ifdef FUNCTION_DuckerCalcEnergy_func2 - maxVal = DuckerCalcEnergy_func2(inputReal, inputImag, startHybBand, - maxHybBand, maxHybridBand); -#else - FIXP_DBL localMaxVal = FL2FXCONST_DBL(0.0f); - for (qs = startHybBand; qs <= maxHybBand; qs++) { - localMaxVal |= fAbs(inputReal[qs]); - localMaxVal |= fAbs(inputImag[qs]); - } - for (; qs <= maxHybridBand; qs++) { - localMaxVal |= fAbs(inputReal[qs]); - } - maxVal = localMaxVal; -#endif + clz = fMin(getScalefactor(&inputReal[startHybBand], + fMax(0, maxHybridBand - startHybBand + 1)), + getScalefactor(&inputImag[startHybBand], + fMax(0, maxHybBand - startHybBand + 1))); + } else { + clz = CntLeadingZeros(maxVal) - 1; } - clz = fixMax(0, CntLeadingZeros(maxVal) - DUCKER_HEADROOM_BITS); - clz = fixMin(clz, DUCKER_MAX_NRG_SCALE); + clz = fMin(fMax(0, clz - DUCKER_HEADROOM_BITS), DUCKER_MAX_NRG_SCALE); *nrgScale = (SCHAR)clz << 1; -#ifdef FUNCTION_DuckerCalcEnergy_func4 - DuckerCalcEnergy_func4(inputReal, inputImag, energy, - self->mapHybBands2ProcBands, clz, startHybBand, - maxHybBand, maxHybridBand); -#else for (qs = startHybBand; qs <= maxHybBand; qs++) { int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands); - energy[pb] = - fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz) + - fPow2Div2(inputImag[qs] << clz)); + energy[pb] = SATURATE_LEFT_SHIFT( + (energy[pb] >> 1) + (fPow2Div2(inputReal[qs] << clz) >> 1) + + (fPow2Div2(inputImag[qs] << clz) >> 1), + 1, DFRACT_BITS); } for (; qs <= maxHybridBand; qs++) { int pb = SpatialDecGetProcessingBand(qs, self->mapHybBands2ProcBands); energy[pb] = fAddSaturate(energy[pb], fPow2Div2(inputReal[qs] << clz)); } -#endif /* FUNCTION_DuckerCalcEnergy_func4 */ } { @@ -1295,10 +1268,6 @@ } } -#ifdef FUNCTION_DuckerApply_func1 - qs = DuckerApply_func1(qs, hybBands, qs_next, outputReal, outputImag, - duckGain); -#else /* general gain*output section */ if (qs < hybBands) { /* true for about 39% */ for (; qs < qs_next; qs++) { /* runs about 2 times */ @@ -1310,7 +1279,6 @@ outputReal[qs] = fMultDiv2(outputReal[qs], duckGain) << 2; } } -#endif } /* pb */ self->headroomSmoothDirRevNrg = diff -Nru fdk-aac-2.0.1/libFDK/src/FDK_hybrid.cpp fdk-aac-2.0.2/libFDK/src/FDK_hybrid.cpp --- fdk-aac-2.0.1/libFDK/src/FDK_hybrid.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/FDK_hybrid.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -142,11 +142,12 @@ } /* How to arrange the packed values. */ struct FDK_HYBRID_SETUP { - UCHAR nrQmfBands; /*!< Number of QMF bands to be converted to hybrid. */ - UCHAR nHybBands[3]; /*!< Number of Hybrid bands generated by nrQmfBands. */ - SCHAR kHybrid[3]; /*!< Filter configuration of each QMF band. */ - UCHAR protoLen; /*!< Prototype filter length. */ - UCHAR filterDelay; /*!< Delay caused by hybrid filter. */ + UCHAR nrQmfBands; /*!< Number of QMF bands to be converted to hybrid. */ + UCHAR nHybBands[3]; /*!< Number of Hybrid bands generated by nrQmfBands. */ + UCHAR synHybScale[3]; /*!< Headroom needed in hybrid synthesis filterbank. */ + SCHAR kHybrid[3]; /*!< Filter configuration of each QMF band. */ + UCHAR protoLen; /*!< Prototype filter length. */ + UCHAR filterDelay; /*!< Delay caused by hybrid filter. */ const INT *pReadIdxTable; /*!< Helper table to access input data ringbuffer. */ }; @@ -156,12 +157,12 @@ 9, 10, 11, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; -static const FDK_HYBRID_SETUP setup_3_16 = {3, {8, 4, 4}, {8, 4, 4}, - 13, (13 - 1) / 2, ringbuffIdxTab}; -static const FDK_HYBRID_SETUP setup_3_12 = {3, {8, 2, 2}, {8, 2, 2}, - 13, (13 - 1) / 2, ringbuffIdxTab}; -static const FDK_HYBRID_SETUP setup_3_10 = {3, {6, 2, 2}, {-8, -2, 2}, - 13, (13 - 1) / 2, ringbuffIdxTab}; +static const FDK_HYBRID_SETUP setup_3_16 = { + 3, {8, 4, 4}, {4, 3, 3}, {8, 4, 4}, 13, (13 - 1) / 2, ringbuffIdxTab}; +static const FDK_HYBRID_SETUP setup_3_12 = { + 3, {8, 2, 2}, {4, 2, 2}, {8, 2, 2}, 13, (13 - 1) / 2, ringbuffIdxTab}; +static const FDK_HYBRID_SETUP setup_3_10 = { + 3, {6, 2, 2}, {3, 2, 2}, {-8, -2, 2}, 13, (13 - 1) / 2, ringbuffIdxTab}; static const FIXP_HTP HybFilterCoef8[] = { HTCP(0x10000000, 0x00000000), HTCP(0x0df26407, 0xfa391882), @@ -477,17 +478,18 @@ */ for (k = 0; k < nrQmfBandsLF; k++) { const int nHybBands = hSynthesisHybFilter->pSetup->nHybBands[k]; + const int scale = hSynthesisHybFilter->pSetup->synHybScale[k]; FIXP_DBL accu1 = FL2FXCONST_DBL(0.f); FIXP_DBL accu2 = FL2FXCONST_DBL(0.f); /* Perform hybrid filtering. */ for (n = 0; n < nHybBands; n++) { - accu1 += pHybridReal[hybOffset + n]; - accu2 += pHybridImag[hybOffset + n]; + accu1 += pHybridReal[hybOffset + n] >> scale; + accu2 += pHybridImag[hybOffset + n] >> scale; } - pQmfReal[k] = accu1; - pQmfImag[k] = accu2; + pQmfReal[k] = SATURATE_LEFT_SHIFT(accu1, scale, DFRACT_BITS); + pQmfImag[k] = SATURATE_LEFT_SHIFT(accu2, scale, DFRACT_BITS); hybOffset += nHybBands; } diff -Nru fdk-aac-2.0.1/libFDK/src/FDK_qmf_domain.cpp fdk-aac-2.0.2/libFDK/src/FDK_qmf_domain.cpp --- fdk-aac-2.0.1/libFDK/src/FDK_qmf_domain.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/FDK_qmf_domain.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -106,35 +106,31 @@ #include "common_fix.h" #define WORKBUFFER1_TAG 0 -#define WORKBUFFER2_TAG 1 - #define WORKBUFFER3_TAG 4 #define WORKBUFFER4_TAG 5 -#define WORKBUFFER5_TAG 6 #define WORKBUFFER6_TAG 7 +#define WORKBUFFER7_TAG 8 C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore1, FIXP_DBL, QMF_WB_SECTION_SIZE, SECT_DATA_L1, WORKBUFFER1_TAG) -C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore2, FIXP_DBL, QMF_WB_SECTION_SIZE, - SECT_DATA_L2, WORKBUFFER2_TAG) C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore3, FIXP_DBL, QMF_WB_SECTION_SIZE, SECT_DATA_L2, WORKBUFFER3_TAG) C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore4, FIXP_DBL, QMF_WB_SECTION_SIZE, SECT_DATA_L2, WORKBUFFER4_TAG) -C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore5, FIXP_DBL, QMF_WB_SECTION_SIZE, - SECT_DATA_L2, WORKBUFFER5_TAG) C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore6, FIXP_DBL, QMF_WB_SECTION_SIZE, SECT_DATA_L2, WORKBUFFER6_TAG) +C_ALLOC_MEM_OVERLAY(QmfWorkBufferCore7, FIXP_DBL, QMF_WB_SECTION_SIZE, + SECT_DATA_L2, WORKBUFFER7_TAG) /*! Analysis states buffer.
Dimension: #((8) + (1)) */ -C_ALLOC_MEM2(AnaQmfStates, FIXP_QAS, 10 * QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS, - ((8) + (1))) +C_AALLOC_MEM2(AnaQmfStates, FIXP_DBL, 10 * QMF_DOMAIN_MAX_ANALYSIS_QMF_BANDS, + ((8) + (1))) /*! Synthesis states buffer.
Dimension: #((8) + (1)) */ -C_ALLOC_MEM2(SynQmfStates, FIXP_QSS, 9 * QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS, - ((8) + (1))) +C_AALLOC_MEM2(SynQmfStates, FIXP_QSS, 9 * QMF_DOMAIN_MAX_SYNTHESIS_QMF_BANDS, + ((8) + (1))) /*! Pointer to real qmf data for each time slot.
Dimension: #((8) + (1)) */ @@ -156,18 +152,17 @@ /*! Analysis states buffer.
Dimension: #((8) + (1)) */ -C_ALLOC_MEM2(AnaQmfStates16, FIXP_QAS, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_16, - ((8) + (1))) - +C_AALLOC_MEM2(AnaQmfStates16, FIXP_DBL, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_16, + ((8) + (1))) /*! Analysis states buffer.
Dimension: #((8) + (1)) */ -C_ALLOC_MEM2(AnaQmfStates24, FIXP_QAS, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_24, - ((8) + (1))) +C_AALLOC_MEM2(AnaQmfStates24, FIXP_DBL, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_24, + ((8) + (1))) /*! Analysis states buffer.
Dimension: #((8) + (1)) */ -C_ALLOC_MEM2(AnaQmfStates32, FIXP_QAS, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_32, - ((8) + (1))) +C_AALLOC_MEM2(AnaQmfStates32, FIXP_DBL, 10 * QMF_DOMAIN_ANALYSIS_QMF_BANDS_32, + ((8) + (1))) /*! Pointer to real qmf data for each time slot.
Dimension: #((8) + (1)) */ @@ -642,10 +637,10 @@ if (pQmfOutImag == NULL) { for (; b < fMin(lsb, stop_band); b++) { - pQmfOutReal[b] = scaleValue(real[b], lb_sf); + pQmfOutReal[b] = scaleValueSaturate(real[b], lb_sf); } for (; b < fMin(usb, stop_band); b++) { - pQmfOutReal[b] = scaleValue(real[b], hb_sf); + pQmfOutReal[b] = scaleValueSaturate(real[b], hb_sf); } for (; b < stop_band; b++) { pQmfOutReal[b] = (FIXP_DBL)0; @@ -653,12 +648,12 @@ } else { FDK_ASSERT(imag != NULL); for (; b < fMin(lsb, stop_band); b++) { - pQmfOutReal[b] = scaleValue(real[b], lb_sf); - pQmfOutImag[b] = scaleValue(imag[b], lb_sf); + pQmfOutReal[b] = scaleValueSaturate(real[b], lb_sf); + pQmfOutImag[b] = scaleValueSaturate(imag[b], lb_sf); } for (; b < fMin(usb, stop_band); b++) { - pQmfOutReal[b] = scaleValue(real[b], hb_sf); - pQmfOutImag[b] = scaleValue(imag[b], hb_sf); + pQmfOutReal[b] = scaleValueSaturate(real[b], hb_sf); + pQmfOutImag[b] = scaleValueSaturate(imag[b], hb_sf); } for (; b < stop_band; b++) { pQmfOutReal[b] = (FIXP_DBL)0; @@ -950,7 +945,7 @@ if ((size > 4 * QMF_WB_SECTION_SIZE) && (pWorkBuffer[4] == NULL)) { /* get work buffer of size QMF_WB_SECTION_SIZE */ - pWorkBuffer[4] = GetQmfWorkBufferCore5(); + pWorkBuffer[4] = GetQmfWorkBufferCore7(); } /* 8. distribute workbuffer over processing channels */ @@ -996,7 +991,7 @@ if (pWorkBuffer[1]) FreeQmfWorkBufferCore1(&pWorkBuffer[1]); if (pWorkBuffer[2]) FreeQmfWorkBufferCore3(&pWorkBuffer[2]); if (pWorkBuffer[3]) FreeQmfWorkBufferCore4(&pWorkBuffer[3]); - if (pWorkBuffer[4]) FreeQmfWorkBufferCore5(&pWorkBuffer[4]); + if (pWorkBuffer[4]) FreeQmfWorkBufferCore7(&pWorkBuffer[4]); } void FDK_QmfDomain_FreeMem(HANDLE_FDK_QMF_DOMAIN hqd) { diff -Nru fdk-aac-2.0.1/libFDK/src/fft_rad2.cpp fdk-aac-2.0.2/libFDK/src/fft_rad2.cpp --- fdk-aac-2.0.1/libFDK/src/fft_rad2.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/fft_rad2.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -109,7 +109,7 @@ #if defined(__arm__) #include "arm/fft_rad2_arm.cpp" -#elif defined(__GNUC__) && defined(__mips__) && defined(__mips_dsp) +#elif defined(__GNUC__) && defined(__mips__) && defined(__mips_dsp) && !defined(__mips16) #include "mips/fft_rad2_mips.cpp" #endif diff -Nru fdk-aac-2.0.1/libFDK/src/fixpoint_math.cpp fdk-aac-2.0.2/libFDK/src/fixpoint_math.cpp --- fdk-aac-2.0.1/libFDK/src/fixpoint_math.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/fixpoint_math.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -650,6 +650,12 @@ INT ans_lg2_e, baselg2_e; FIXP_DBL base_lg2, ans_lg2, result; + if (base_m <= (FIXP_DBL)0) { + result = (FIXP_DBL)0; + *result_e = 0; + return result; + } + /* Calc log2 of base */ base_lg2 = fLog2(base_m, base_e, &baselg2_e); diff -Nru fdk-aac-2.0.1/libFDK/src/mdct.cpp fdk-aac-2.0.2/libFDK/src/mdct.cpp --- fdk-aac-2.0.1/libFDK/src/mdct.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/mdct.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -569,7 +569,7 @@ */ for (i = 0; i < hMdct->prev_nr; i++) { FIXP_DBL x = -(*pOvl--); - *pOut0 = IMDCT_SCALE_DBL(x + hMdct->pFacZir[i]); + *pOut0 = fAddSaturate(x, IMDCT_SCALE_DBL(hMdct->pFacZir[i])); pOut0++; } hMdct->pFacZir = NULL; @@ -678,7 +678,7 @@ FIXP_DBL *pOut = pOut0 - fl / 2; FDK_ASSERT(fl / 2 <= 128); for (i = 0; i < fl / 2; i++) { - pOut[i] += IMDCT_SCALE_DBL(hMdct->pFacZir[i]); + pOut[i] = fAddSaturate(pOut[i], IMDCT_SCALE_DBL(hMdct->pFacZir[i])); } hMdct->pFacZir = NULL; } diff -Nru fdk-aac-2.0.1/libFDK/src/mips/scale_mips.cpp fdk-aac-2.0.2/libFDK/src/mips/scale_mips.cpp --- fdk-aac-2.0.1/libFDK/src/mips/scale_mips.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/mips/scale_mips.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -100,7 +100,7 @@ *******************************************************************************/ -#if defined(__mips_dsp) +#if defined(__mips_dsp) && !defined(__mips16) #ifndef FUNCTION_getScalefactor_DBL #define FUNCTION_getScalefactor_DBL diff -Nru fdk-aac-2.0.1/libFDK/src/nlc_dec.cpp fdk-aac-2.0.2/libFDK/src/nlc_dec.cpp --- fdk-aac-2.0.1/libFDK/src/nlc_dec.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/nlc_dec.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -568,7 +568,7 @@ static ERROR_t huff_decode(HANDLE_FDK_BITSTREAM strm, SCHAR* out_data_1, SCHAR* out_data_2, DATA_TYPE data_type, DIFF_TYPE diff_type_1, DIFF_TYPE diff_type_2, - int num_val, CODING_SCHEME* cdg_scheme, int ldMode) { + int num_val, int* cdg_scheme, int ldMode) { ERROR_t err = HUFFDEC_OK; DIFF_TYPE diff_type; @@ -597,14 +597,14 @@ /* Coding scheme */ data = FDKreadBits(strm, 1); - *cdg_scheme = (CODING_SCHEME)(data << PAIR_SHIFT); + *cdg_scheme = (data << PAIR_SHIFT); if (*cdg_scheme >> PAIR_SHIFT == HUFF_2D) { if ((out_data_1 != NULL) && (out_data_2 != NULL) && (ldMode == 0)) { data = FDKreadBits(strm, 1); - *cdg_scheme = (CODING_SCHEME)(*cdg_scheme | data); + *cdg_scheme = (*cdg_scheme | data); } else { - *cdg_scheme = (CODING_SCHEME)(*cdg_scheme | FREQ_PAIR); + *cdg_scheme = (*cdg_scheme | FREQ_PAIR); } } @@ -843,7 +843,7 @@ SCHAR* pDataVec[2] = {NULL, NULL}; DIFF_TYPE diff_type[2] = {DIFF_FREQ, DIFF_FREQ}; - CODING_SCHEME cdg_scheme = HUFF_1D; + int cdg_scheme = HUFF_1D; DIRECTION direction = BACKWARDS; switch (data_type) { diff -Nru fdk-aac-2.0.1/libFDK/src/qmf.cpp fdk-aac-2.0.2/libFDK/src/qmf.cpp --- fdk-aac-2.0.1/libFDK/src/qmf.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/qmf.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -147,88 +147,6 @@ /* moved to qmf_pcm.h: -> qmfSynPrototypeFirSlot_NonSymmetric */ /* moved to qmf_pcm.h: -> qmfSynthesisFilteringSlot */ -#ifndef FUNCTION_qmfAnaPrototypeFirSlot -/*! - \brief Perform Analysis Prototype Filtering on a single slot of input data. -*/ -static void qmfAnaPrototypeFirSlot( - FIXP_DBL *analysisBuffer, - INT no_channels, /*!< Number channels of analysis filter */ - const FIXP_PFT *p_filter, INT p_stride, /*!< Stride of analysis filter */ - FIXP_QAS *RESTRICT pFilterStates) { - INT k; - - FIXP_DBL accu; - const FIXP_PFT *RESTRICT p_flt = p_filter; - FIXP_DBL *RESTRICT pData_0 = analysisBuffer + 2 * no_channels - 1; - FIXP_DBL *RESTRICT pData_1 = analysisBuffer; - - FIXP_QAS *RESTRICT sta_0 = (FIXP_QAS *)pFilterStates; - FIXP_QAS *RESTRICT sta_1 = - (FIXP_QAS *)pFilterStates + (2 * QMF_NO_POLY * no_channels) - 1; - INT pfltStep = QMF_NO_POLY * (p_stride); - INT staStep1 = no_channels << 1; - INT staStep2 = (no_channels << 3) - 1; /* Rewind one less */ - - /* FIR filters 127..64 0..63 */ - for (k = 0; k < no_channels; k++) { - accu = fMultDiv2(p_flt[0], *sta_1); - sta_1 -= staStep1; - accu += fMultDiv2(p_flt[1], *sta_1); - sta_1 -= staStep1; - accu += fMultDiv2(p_flt[2], *sta_1); - sta_1 -= staStep1; - accu += fMultDiv2(p_flt[3], *sta_1); - sta_1 -= staStep1; - accu += fMultDiv2(p_flt[4], *sta_1); - *pData_1++ = (accu << 1); - sta_1 += staStep2; - - p_flt += pfltStep; - accu = fMultDiv2(p_flt[0], *sta_0); - sta_0 += staStep1; - accu += fMultDiv2(p_flt[1], *sta_0); - sta_0 += staStep1; - accu += fMultDiv2(p_flt[2], *sta_0); - sta_0 += staStep1; - accu += fMultDiv2(p_flt[3], *sta_0); - sta_0 += staStep1; - accu += fMultDiv2(p_flt[4], *sta_0); - *pData_0-- = (accu << 1); - sta_0 -= staStep2; - } -} -#endif /* !defined(FUNCTION_qmfAnaPrototypeFirSlot) */ - -#ifndef FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric -/*! - \brief Perform Analysis Prototype Filtering on a single slot of input data. -*/ -static void qmfAnaPrototypeFirSlot_NonSymmetric( - FIXP_DBL *analysisBuffer, - int no_channels, /*!< Number channels of analysis filter */ - const FIXP_PFT *p_filter, int p_stride, /*!< Stride of analysis filter */ - FIXP_QAS *RESTRICT pFilterStates) { - const FIXP_PFT *RESTRICT p_flt = p_filter; - int p, k; - - for (k = 0; k < 2 * no_channels; k++) { - FIXP_DBL accu = (FIXP_DBL)0; - - p_flt += QMF_NO_POLY * (p_stride - 1); - - /* - Perform FIR-Filter - */ - for (p = 0; p < QMF_NO_POLY; p++) { - accu += fMultDiv2(*p_flt++, pFilterStates[2 * no_channels * p]); - } - analysisBuffer[2 * no_channels - 1 - k] = (accu << 1); - pFilterStates++; - } -} -#endif /* FUNCTION_qmfAnaPrototypeFirSlot_NonSymmetric */ - /*! * * \brief Perform real-valued forward modulation of the time domain @@ -244,7 +162,7 @@ int i; int L = anaQmf->no_channels; int M = L >> 1; - int scale; + int scale = 0; FIXP_DBL accu; const FIXP_DBL *timeInTmp1 = (FIXP_DBL *)&timeIn[3 * M]; @@ -381,211 +299,6 @@ } #endif /* FUNCTION_qmfForwardModulationHQ */ -/* - * \brief Perform one QMF slot analysis of the time domain data of timeIn - * with specified stride and stores the real part of the subband - * samples in rSubband, and the imaginary part in iSubband - * - * Note: anaQmf->lsb can be greater than anaQmf->no_channels in case - * of implicit resampling (USAC with reduced 3/4 core frame length). - */ -#if (SAMPLE_BITS != DFRACT_BITS) && (QAS_BITS == DFRACT_BITS) -void qmfAnalysisFilteringSlot( - HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ - FIXP_DBL *qmfReal, /*!< Low and High band, real */ - FIXP_DBL *qmfImag, /*!< Low and High band, imag */ - const LONG *RESTRICT timeIn, /*!< Pointer to input */ - const int stride, /*!< stride factor of input */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ -) { - int offset = anaQmf->no_channels * (QMF_NO_POLY * 2 - 1); - /* - Feed time signal into oldest anaQmf->no_channels states - */ - { - FIXP_DBL *FilterStatesAnaTmp = ((FIXP_DBL *)anaQmf->FilterStates) + offset; - - /* Feed and scale actual time in slot */ - for (int i = anaQmf->no_channels >> 1; i != 0; i--) { - /* Place INT_PCM value left aligned in scaledTimeIn */ - - *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; - timeIn += stride; - *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; - timeIn += stride; - } - } - - if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) { - qmfAnaPrototypeFirSlot_NonSymmetric(pWorkBuffer, anaQmf->no_channels, - anaQmf->p_filter, anaQmf->p_stride, - (FIXP_QAS *)anaQmf->FilterStates); - } else { - qmfAnaPrototypeFirSlot(pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter, - anaQmf->p_stride, (FIXP_QAS *)anaQmf->FilterStates); - } - - if (anaQmf->flags & QMF_FLAG_LP) { - if (anaQmf->flags & QMF_FLAG_CLDFB) - qmfForwardModulationLP_odd(anaQmf, pWorkBuffer, qmfReal); - else - qmfForwardModulationLP_even(anaQmf, pWorkBuffer, qmfReal); - - } else { - qmfForwardModulationHQ(anaQmf, pWorkBuffer, qmfReal, qmfImag); - } - /* - Shift filter states - - Should be realized with modulo adressing on a DSP instead of a true buffer - shift - */ - FDKmemmove(anaQmf->FilterStates, - (FIXP_QAS *)anaQmf->FilterStates + anaQmf->no_channels, - offset * sizeof(FIXP_QAS)); -} -#endif - -void qmfAnalysisFilteringSlot( - HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Synthesis Bank */ - FIXP_DBL *qmfReal, /*!< Low and High band, real */ - FIXP_DBL *qmfImag, /*!< Low and High band, imag */ - const INT_PCM *RESTRICT timeIn, /*!< Pointer to input */ - const int stride, /*!< stride factor of input */ - FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ -) { - int offset = anaQmf->no_channels * (QMF_NO_POLY * 2 - 1); - /* - Feed time signal into oldest anaQmf->no_channels states - */ - { - FIXP_QAS *FilterStatesAnaTmp = ((FIXP_QAS *)anaQmf->FilterStates) + offset; - - /* Feed and scale actual time in slot */ - for (int i = anaQmf->no_channels >> 1; i != 0; i--) { - /* Place INT_PCM value left aligned in scaledTimeIn */ -#if (QAS_BITS == SAMPLE_BITS) - *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; - timeIn += stride; - *FilterStatesAnaTmp++ = (FIXP_QAS)*timeIn; - timeIn += stride; -#elif (QAS_BITS > SAMPLE_BITS) - *FilterStatesAnaTmp++ = ((FIXP_QAS)*timeIn) << (QAS_BITS - SAMPLE_BITS); - timeIn += stride; - *FilterStatesAnaTmp++ = ((FIXP_QAS)*timeIn) << (QAS_BITS - SAMPLE_BITS); - timeIn += stride; -#else - *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn) >> (SAMPLE_BITS - QAS_BITS)); - timeIn += stride; - *FilterStatesAnaTmp++ = (FIXP_QAS)((*timeIn) >> (SAMPLE_BITS - QAS_BITS)); - timeIn += stride; -#endif - } - } - - if (anaQmf->flags & QMF_FLAG_NONSYMMETRIC) { - qmfAnaPrototypeFirSlot_NonSymmetric(pWorkBuffer, anaQmf->no_channels, - anaQmf->p_filter, anaQmf->p_stride, - (FIXP_QAS *)anaQmf->FilterStates); - } else { - qmfAnaPrototypeFirSlot(pWorkBuffer, anaQmf->no_channels, anaQmf->p_filter, - anaQmf->p_stride, (FIXP_QAS *)anaQmf->FilterStates); - } - - if (anaQmf->flags & QMF_FLAG_LP) { - if (anaQmf->flags & QMF_FLAG_CLDFB) - qmfForwardModulationLP_odd(anaQmf, pWorkBuffer, qmfReal); - else - qmfForwardModulationLP_even(anaQmf, pWorkBuffer, qmfReal); - - } else { - qmfForwardModulationHQ(anaQmf, pWorkBuffer, qmfReal, qmfImag); - } - /* - Shift filter states - - Should be realized with modulo adressing on a DSP instead of a true buffer - shift - */ - FDKmemmove(anaQmf->FilterStates, - (FIXP_QAS *)anaQmf->FilterStates + anaQmf->no_channels, - offset * sizeof(FIXP_QAS)); -} - -/*! - * - * \brief Perform complex-valued subband filtering of the time domain - * data of timeIn and stores the real part of the subband - * samples in rAnalysis, and the imaginary part in iAnalysis - * The qmf coefficient table is symmetric. The symmetry is expoited by - * shrinking the coefficient table to half the size. The addressing mode - * takes care of the symmetries. - * - * - * \sa PolyphaseFiltering - */ -#if (SAMPLE_BITS != DFRACT_BITS) && (QAS_BITS == DFRACT_BITS) -void qmfAnalysisFiltering( - HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ - FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */ - FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */ - QMF_SCALE_FACTOR *scaleFactor, const LONG *timeIn, /*!< Time signal */ - const int timeIn_e, const int stride, - FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ -) { - int i; - int no_channels = anaQmf->no_channels; - - scaleFactor->lb_scale = - -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - timeIn_e; - scaleFactor->lb_scale -= anaQmf->filterScale; - - for (i = 0; i < anaQmf->no_col; i++) { - FIXP_DBL *qmfImagSlot = NULL; - - if (!(anaQmf->flags & QMF_FLAG_LP)) { - qmfImagSlot = qmfImag[i]; - } - - qmfAnalysisFilteringSlot(anaQmf, qmfReal[i], qmfImagSlot, timeIn, stride, - pWorkBuffer); - - timeIn += no_channels * stride; - - } /* no_col loop i */ -} -#endif - -void qmfAnalysisFiltering( - HANDLE_QMF_FILTER_BANK anaQmf, /*!< Handle of Qmf Analysis Bank */ - FIXP_DBL **qmfReal, /*!< Pointer to real subband slots */ - FIXP_DBL **qmfImag, /*!< Pointer to imag subband slots */ - QMF_SCALE_FACTOR *scaleFactor, const INT_PCM *timeIn, /*!< Time signal */ - const int timeIn_e, const int stride, - FIXP_DBL *pWorkBuffer /*!< pointer to temporal working buffer */ -) { - int i; - int no_channels = anaQmf->no_channels; - - scaleFactor->lb_scale = - -ALGORITHMIC_SCALING_IN_ANALYSIS_FILTERBANK - timeIn_e; - scaleFactor->lb_scale -= anaQmf->filterScale; - - for (i = 0; i < anaQmf->no_col; i++) { - FIXP_DBL *qmfImagSlot = NULL; - - if (!(anaQmf->flags & QMF_FLAG_LP)) { - qmfImagSlot = qmfImag[i]; - } - - qmfAnalysisFilteringSlot(anaQmf, qmfReal[i], qmfImagSlot, timeIn, stride, - pWorkBuffer); - - timeIn += no_channels * stride; - - } /* no_col loop i */ -} - /*! * * \brief Perform low power inverse modulation of the subband @@ -603,15 +316,15 @@ int i; int L = synQmf->no_channels; int M = L >> 1; - int scale; + int scale = 0; FIXP_DBL tmp; FIXP_DBL *RESTRICT tReal = pTimeOut; FIXP_DBL *RESTRICT tImag = pTimeOut + L; /* Move input to output vector with offset */ - scaleValues(&tReal[0], &qmfReal[0], synQmf->lsb, (int)scaleFactorLowBand); - scaleValues(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb], - synQmf->usb - synQmf->lsb, (int)scaleFactorHighBand); + scaleValuesSaturate(&tReal[0], &qmfReal[0], synQmf->lsb, scaleFactorLowBand); + scaleValuesSaturate(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb], + synQmf->usb - synQmf->lsb, scaleFactorHighBand); FDKmemclear(&tReal[0 + synQmf->usb], (L - synQmf->usb) * sizeof(FIXP_DBL)); /* Dct type-2 transform */ @@ -662,9 +375,9 @@ int shift = 0; /* Move input to output vector with offset */ - scaleValues(pTimeOut + M, qmfReal, synQmf->lsb, scaleFactorLowBand); - scaleValues(pTimeOut + M + synQmf->lsb, qmfReal + synQmf->lsb, - synQmf->usb - synQmf->lsb, scaleFactorHighBand); + scaleValuesSaturate(pTimeOut + M, qmfReal, synQmf->lsb, scaleFactorLowBand); + scaleValuesSaturate(pTimeOut + M + synQmf->lsb, qmfReal + synQmf->lsb, + synQmf->usb - synQmf->lsb, scaleFactorHighBand); FDKmemclear(pTimeOut + M + synQmf->usb, (L - synQmf->usb) * sizeof(FIXP_DBL)); dct_IV(pTimeOut + M, L, &shift); @@ -698,26 +411,27 @@ FIXP_DBL *RESTRICT tImag = pWorkBuffer + L; if (synQmf->flags & QMF_FLAG_CLDFB) { - for (i = 0; i < synQmf->lsb; i++) { - cplxMult(&tImag[i], &tReal[i], scaleValue(qmfImag[i], scaleFactorLowBand), - scaleValue(qmfReal[i], scaleFactorLowBand), synQmf->t_cos[i], - synQmf->t_sin[i]); - } - for (; i < synQmf->usb; i++) { - cplxMult(&tImag[i], &tReal[i], - scaleValue(qmfImag[i], scaleFactorHighBand), - scaleValue(qmfReal[i], scaleFactorHighBand), synQmf->t_cos[i], - synQmf->t_sin[i]); - } + for (i = 0; i < synQmf->usb; i++) { + cplxMultDiv2(&tImag[i], &tReal[i], qmfImag[i], qmfReal[i], + synQmf->t_cos[i], synQmf->t_sin[i]); + } + scaleValuesSaturate(&tReal[0], synQmf->lsb, scaleFactorLowBand + 1); + scaleValuesSaturate(&tReal[0 + synQmf->lsb], synQmf->usb - synQmf->lsb, + scaleFactorHighBand + 1); + scaleValuesSaturate(&tImag[0], synQmf->lsb, scaleFactorLowBand + 1); + scaleValuesSaturate(&tImag[0 + synQmf->lsb], synQmf->usb - synQmf->lsb, + scaleFactorHighBand + 1); } if ((synQmf->flags & QMF_FLAG_CLDFB) == 0) { - scaleValues(&tReal[0], &qmfReal[0], synQmf->lsb, (int)scaleFactorLowBand); - scaleValues(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb], - synQmf->usb - synQmf->lsb, (int)scaleFactorHighBand); - scaleValues(&tImag[0], &qmfImag[0], synQmf->lsb, (int)scaleFactorLowBand); - scaleValues(&tImag[0 + synQmf->lsb], &qmfImag[0 + synQmf->lsb], - synQmf->usb - synQmf->lsb, (int)scaleFactorHighBand); + scaleValuesSaturate(&tReal[0], &qmfReal[0], synQmf->lsb, + scaleFactorLowBand); + scaleValuesSaturate(&tReal[0 + synQmf->lsb], &qmfReal[0 + synQmf->lsb], + synQmf->usb - synQmf->lsb, scaleFactorHighBand); + scaleValuesSaturate(&tImag[0], &qmfImag[0], synQmf->lsb, + scaleFactorLowBand); + scaleValuesSaturate(&tImag[0 + synQmf->lsb], &qmfImag[0 + synQmf->lsb], + synQmf->usb - synQmf->lsb, scaleFactorHighBand); } FDKmemclear(&tReal[synQmf->usb], @@ -1004,35 +718,6 @@ * \return 0 if succesful * */ -int qmfInitAnalysisFilterBank( - HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */ - FIXP_QAS *pFilterStates, /*!< Handle to filter states */ - int noCols, /*!< Number of timeslots per frame */ - int lsb, /*!< lower end of QMF */ - int usb, /*!< upper end of QMF */ - int no_channels, /*!< Number of channels (bands) */ - int flags) /*!< Low Power flag */ -{ - int err = qmfInitFilterBank(h_Qmf, pFilterStates, noCols, lsb, usb, - no_channels, flags, 0); - if (!(flags & QMF_FLAG_KEEP_STATES) && (h_Qmf->FilterStates != NULL)) { - FDKmemclear(h_Qmf->FilterStates, - (2 * QMF_NO_POLY - 1) * h_Qmf->no_channels * sizeof(FIXP_QAS)); - } - - FDK_ASSERT(h_Qmf->no_channels >= h_Qmf->lsb); - - return err; -} - -/*! - * - * \brief Create QMF filter bank instance - * - * - * \return 0 if succesful - * - */ int qmfInitSynthesisFilterBank( HANDLE_QMF_FILTER_BANK h_Qmf, /*!< Returns handle */ FIXP_QSS *pFilterStates, /*!< Handle to filter states */ @@ -1128,8 +813,21 @@ synQmf->outGain_e = outputGainScale; } -/* When QMF_16IN_32OUT is set, synthesis functions for 16 and 32 bit parallel - * output is compiled */ #define INT_PCM_QMFOUT INT_PCM #define SAMPLE_BITS_QMFOUT SAMPLE_BITS #include "qmf_pcm.h" +#if SAMPLE_BITS == 16 + /* also create a 32 bit output version */ +#undef INT_PCM_QMFOUT +#undef SAMPLE_BITS_QMFOUT +#undef QMF_PCM_H +#undef FIXP_QAS +#undef QAS_BITS +#undef INT_PCM_QMFIN +#define INT_PCM_QMFOUT LONG +#define SAMPLE_BITS_QMFOUT 32 +#define FIXP_QAS FIXP_DBL +#define QAS_BITS 32 +#define INT_PCM_QMFIN LONG +#include "qmf_pcm.h" +#endif diff -Nru fdk-aac-2.0.1/libFDK/src/scale.cpp fdk-aac-2.0.2/libFDK/src/scale.cpp --- fdk-aac-2.0.1/libFDK/src/scale.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libFDK/src/scale.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -250,10 +250,10 @@ */ #define FUNCTION_scaleValuesSaturate_DBL_DBL SCALE_INLINE -void scaleValuesSaturate(FIXP_DBL *dst, /*!< Output */ - FIXP_DBL *src, /*!< Input */ - INT len, /*!< Length */ - INT scalefactor /*!< Scalefactor */ +void scaleValuesSaturate(FIXP_DBL *dst, /*!< Output */ + const FIXP_DBL *src, /*!< Input */ + INT len, /*!< Length */ + INT scalefactor /*!< Scalefactor */ ) { INT i; @@ -285,10 +285,10 @@ */ #define FUNCTION_scaleValuesSaturate_SGL_DBL SCALE_INLINE -void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */ - FIXP_DBL *src, /*!< Input */ - INT len, /*!< Length */ - INT scalefactor) /*!< Scalefactor */ +void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */ + const FIXP_DBL *src, /*!< Input */ + INT len, /*!< Length */ + INT scalefactor) /*!< Scalefactor */ { INT i; scalefactor = fixmax_I(fixmin_I(scalefactor, (INT)DFRACT_BITS - 1), @@ -345,10 +345,10 @@ */ #define FUNCTION_scaleValuesSaturate_SGL_SGL SCALE_INLINE -void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */ - FIXP_SGL *src, /*!< Input */ - INT len, /*!< Length */ - INT scalefactor /*!< Scalefactor */ +void scaleValuesSaturate(FIXP_SGL *dst, /*!< Output */ + const FIXP_SGL *src, /*!< Input */ + INT len, /*!< Length */ + INT scalefactor /*!< Scalefactor */ ) { INT i; diff -Nru fdk-aac-2.0.1/libMpegTPDec/src/tpdec_adts.cpp fdk-aac-2.0.2/libMpegTPDec/src/tpdec_adts.cpp --- fdk-aac-2.0.1/libMpegTPDec/src/tpdec_adts.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libMpegTPDec/src/tpdec_adts.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -213,8 +213,8 @@ goto bail; } + FDKcrcReset(&pAdts->crcInfo); if (!bs.protection_absent) { - FDKcrcReset(&pAdts->crcInfo); FDKpushBack(hBs, 56); /* complete fixed and variable header! */ crcReg = FDKcrcStartReg(&pAdts->crcInfo, hBs, 0); FDKpushFor(hBs, 56); @@ -314,15 +314,55 @@ if (bs.channel_config == 0) { int pceBits = 0; UINT alignAnchor = FDKgetValidBits(hBs); + CProgramConfig tmpPce; if (FDKreadBits(hBs, 3) == ID_PCE) { /* Got luck! Parse the PCE */ crcReg = adtsRead_CrcStartReg(pAdts, hBs, 0); - CProgramConfig_Read(&pAsc->m_progrConfigElement, hBs, alignAnchor); + CProgramConfig_Init(&tmpPce); + CProgramConfig_Read(&tmpPce, hBs, alignAnchor); + + if (CProgramConfig_IsValid(&tmpPce)) { + if (CProgramConfig_IsValid(&oldPce)) { + /* Compare the new and the old PCE (tags ignored) */ + switch (CProgramConfig_Compare(&tmpPce, &oldPce)) { + case 0: /* Nothing to do because PCE matches the old one exactly. */ + case 1: /* Channel configuration not changed. Just new metadata. */ + FDKmemcpy(&pAsc->m_progrConfigElement, &tmpPce, + sizeof(CProgramConfig)); + break; + case 2: /* The number of channels are identical but not the config + */ + case -1: /* The channel configuration is completely different */ + default: + FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce, + sizeof(CProgramConfig)); + FDKpushBack(hBs, adtsHeaderLength); + return TRANSPORTDEC_PARSE_ERROR; + } + } else { + FDKmemcpy(&pAsc->m_progrConfigElement, &tmpPce, + sizeof(CProgramConfig)); + } + } else { + if (CProgramConfig_IsValid(&oldPce)) { + FDKmemcpy(&pAsc->m_progrConfigElement, &oldPce, + sizeof(CProgramConfig)); + } else { + FDKpushBack(hBs, adtsHeaderLength); + return TRANSPORTDEC_PARSE_ERROR; + } + } adtsRead_CrcEndReg(pAdts, hBs, crcReg); - pceBits = alignAnchor - FDKgetValidBits(hBs); + pceBits = (INT)alignAnchor - (INT)FDKgetValidBits(hBs); + adtsHeaderLength += pceBits; + + if (pceBits > (INT)alignAnchor) { + goto bail; + } + /* store the number of PCE bits */ bs.num_pce_bits = pceBits; } else { diff -Nru fdk-aac-2.0.1/libMpegTPDec/src/tpdec_asc.cpp fdk-aac-2.0.2/libMpegTPDec/src/tpdec_asc.cpp --- fdk-aac-2.0.1/libMpegTPDec/src/tpdec_asc.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libMpegTPDec/src/tpdec_asc.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -1325,9 +1325,9 @@ CSTpCallBacks *cb) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; CSEldSpecificConfig *esc = &asc->m_sc.m_eldSpecificConfig; - ASC_ELD_EXT_TYPE eldExtType; + UINT eldExtType; int eldExtLen, len, cnt, ldSbrLen = 0, eldExtLenSum, numSbrHeader = 0, - sbrIndex; + sbrIndex, eldExtCnt = 0; unsigned char downscale_fill_nibble; @@ -1394,9 +1394,8 @@ eldExtLenSum = FDKgetValidBits(hBs); esc->m_downscaledSamplingFrequency = asc->m_samplingFrequency; /* parse ExtTypeConfigData */ - while ( - ((eldExtType = (ASC_ELD_EXT_TYPE)FDKreadBits(hBs, 4)) != ELDEXT_TERM) && - ((INT)FDKgetValidBits(hBs) >= 0)) { + while (((eldExtType = FDKreadBits(hBs, 4)) != ELDEXT_TERM) && + ((INT)FDKgetValidBits(hBs) >= 0) && (eldExtCnt++ < 15)) { eldExtLen = len = FDKreadBits(hBs, 4); if (len == 0xf) { len = FDKreadBits(hBs, 8); @@ -1440,7 +1439,8 @@ UCHAR tmpDownscaleFreqIdx; esc->m_downscaledSamplingFrequency = getSampleRate(hBs, &tmpDownscaleFreqIdx, 4); - if (esc->m_downscaledSamplingFrequency == 0) { + if (esc->m_downscaledSamplingFrequency == 0 || + esc->m_downscaledSamplingFrequency > 96000) { return TRANSPORTDEC_PARSE_ERROR; } downscale_fill_nibble = FDKreadBits(hBs, 4); @@ -1454,6 +1454,9 @@ break; } } + if (eldExtType != ELDEXT_TERM) { + return TRANSPORTDEC_PARSE_ERROR; + } if ((INT)FDKgetValidBits(hBs) < 0) { return TRANSPORTDEC_PARSE_ERROR; @@ -1546,8 +1549,7 @@ const AUDIO_OBJECT_TYPE aot) { TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; - USAC_EXT_ELEMENT_TYPE usacExtElementType = - (USAC_EXT_ELEMENT_TYPE)escapedValue(hBs, 4, 8, 16); + int usacExtElementType = escapedValue(hBs, 4, 8, 16); /* recurve extension elements which are invalid for USAC */ if (aot == AOT_USAC) { @@ -1564,7 +1566,7 @@ } } - extElement->usacExtElementType = usacExtElementType; + extElement->usacExtElementType = (USAC_EXT_ELEMENT_TYPE)usacExtElementType; int usacExtElementConfigLength = escapedValue(hBs, 4, 8, 16); extElement->usacExtElementConfigLength = (USHORT)usacExtElementConfigLength; INT bsAnchor; @@ -1628,14 +1630,14 @@ TRANSPORTDEC_ERROR ErrorStatus = TRANSPORTDEC_OK; int numConfigExtensions; - CONFIG_EXT_ID usacConfigExtType; + int usacConfigExtType; int usacConfigExtLength; numConfigExtensions = (int)escapedValue(hBs, 2, 4, 8) + 1; for (int confExtIdx = 0; confExtIdx < numConfigExtensions; confExtIdx++) { INT nbits; int loudnessInfoSetConfigExtensionPosition = FDKgetValidBits(hBs); - usacConfigExtType = (CONFIG_EXT_ID)escapedValue(hBs, 4, 8, 16); + usacConfigExtType = escapedValue(hBs, 4, 8, 16); usacConfigExtLength = (int)escapedValue(hBs, 4, 8, 16); /* Start bit position of config extension */ @@ -1948,6 +1950,9 @@ INT nbits = (INT)FDKgetValidBits(hBs); usacSamplingFrequency = getSampleRate(hBs, &asc->m_samplingFrequencyIndex, 5); + if (usacSamplingFrequency == 0 || usacSamplingFrequency > 96000) { + return TRANSPORTDEC_PARSE_ERROR; + } asc->m_samplingFrequency = (UINT)usacSamplingFrequency; coreSbrFrameLengthIndex = FDKreadBits(hBs, 3); @@ -2027,7 +2032,8 @@ self->m_extensionSamplingFrequency = getSampleRate( bs, &self->m_extensionSamplingFrequencyIndex, 4); - if ((INT)self->m_extensionSamplingFrequency <= 0) { + if (self->m_extensionSamplingFrequency == 0 || + self->m_extensionSamplingFrequency > 96000) { return TRANSPORTDEC_PARSE_ERROR; } } @@ -2139,6 +2145,24 @@ self->m_channelConfiguration = FDKreadBits(bs, 4); + /* MPEG-04 standard ISO/IEC 14496-3: channelConfiguration == 0 is reserved + in er_raw_data_block (table 4.19) and er_raw_data_block_eld (table 4.75) + MPEG-04 conformance ISO/IEC 14496-4: channelConfiguration == 0 is not + permitted for AOT_ER_AAC_LC, AOT_ER_AAC_LTP, AOT_ER_AAC_LD, + AOT_ER_AAC_SCAL (chapter 6.6.4.1.2.1.1) */ + if ((self->m_channelConfiguration == 0) && + ((self->m_aot == AOT_ER_AAC_LC) || (self->m_aot == AOT_ER_AAC_LTP) || + (self->m_aot == AOT_ER_AAC_LD) || (self->m_aot == AOT_ER_AAC_SCAL) || + (self->m_aot == AOT_ER_AAC_ELD))) { + return TRANSPORTDEC_UNSUPPORTED_FORMAT; + } + /* MPEG-04 conformance ISO/IEC 14496-4: channelConfiguration > 2 is not + * permitted for AOT_AAC_SCAL and AOT_ER_AAC_SCAL (chapter 6.6.4.1.2.1.1) */ + if ((self->m_channelConfiguration > 2) && + ((self->m_aot == AOT_AAC_SCAL) || (self->m_aot == AOT_ER_AAC_SCAL))) { + return TRANSPORTDEC_UNSUPPORTED_FORMAT; + } + /* SBR extension ( explicit non-backwards compatible mode ) */ self->m_sbrPresentFlag = 0; self->m_psPresentFlag = 0; @@ -2153,6 +2177,10 @@ self->m_extensionSamplingFrequency = getSampleRate(bs, &self->m_extensionSamplingFrequencyIndex, 4); + if (self->m_extensionSamplingFrequency == 0 || + self->m_extensionSamplingFrequency > 96000) { + return TRANSPORTDEC_PARSE_ERROR; + } self->m_aot = getAOT(bs); switch (self->m_aot) { diff -Nru fdk-aac-2.0.1/libMpegTPDec/src/tpdec_latm.cpp fdk-aac-2.0.2/libMpegTPDec/src/tpdec_latm.cpp --- fdk-aac-2.0.1/libMpegTPDec/src/tpdec_latm.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libMpegTPDec/src/tpdec_latm.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -367,10 +367,10 @@ } if (pLatmDemux->m_AudioMuxVersion == 1) { FDK_BITSTREAM tmpBs; - UINT ascLen = 0; + INT ascLen = 0; ascLen = CLatmDemux_GetValue(bs); /* The ascLen could be wrong, so check if validBits<=bufBits*/ - if (ascLen > FDKgetValidBits(bs)) { + if (ascLen < 0 || ascLen > (INT)FDKgetValidBits(bs)) { ErrorStatus = TRANSPORTDEC_PARSE_ERROR; goto bail; } diff -Nru fdk-aac-2.0.1/libMpegTPDec/src/tpdec_lib.cpp fdk-aac-2.0.2/libMpegTPDec/src/tpdec_lib.cpp --- fdk-aac-2.0.1/libMpegTPDec/src/tpdec_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libMpegTPDec/src/tpdec_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -274,7 +274,7 @@ UCHAR configChanged = 0; UCHAR configMode = AC_CM_DET_CFG_CHANGE; - UCHAR tmpConf[1024]; + UCHAR tmpConf[1024] = {0}; if (length > 1024) { return TRANSPORTDEC_UNSUPPORTED_FORMAT; } @@ -482,7 +482,8 @@ for (int i = 0; i < 2; i++) { if (i > 0) { - FDKpushBack(hBs, newConfigLength * 8 - FDKgetValidBits(hBs)); + FDKpushBack(hBs, + (INT)newConfigLength * 8 - (INT)FDKgetValidBits(hBs)); configMode = AC_CM_ALLOC_MEM; } /* config transport decoder */ @@ -663,10 +664,14 @@ if (*pBytesValid == 0) { /* nothing to do */ return TRANSPORTDEC_OK; - } - - if (hTp->numberOfRawDataBlocks <= 0) { + } else { + const int bytesValid = *pBytesValid; FDKfeedBuffer(hBs, pBuffer, bufferSize, pBytesValid); + + if (hTp->numberOfRawDataBlocks > 0) { + hTp->globalFramePos += (bytesValid - *pBytesValid) * 8; + hTp->accessUnitAnchor[layer] = FDKgetValidBits(hBs); + } } } @@ -924,6 +929,11 @@ } } } + /* if an error is detected terminate config parsing to avoid that an + * invalid config is accepted in the second pass */ + if (err != TRANSPORTDEC_OK) { + break; + } } } else { /* Reset CRC because the next bits are the beginning of a @@ -976,6 +986,9 @@ CLatmDemux_GetNrOfSubFrames(&hTp->parser.latm); if (hTp->transportFmt == TT_MP4_LOAS) { syncLayerFrameBits -= startPos - (INT)FDKgetValidBits(hBs) - (13); + if (syncLayerFrameBits <= 0) { + err = TRANSPORTDEC_SYNC_ERROR; + } } } } else { @@ -1151,6 +1164,11 @@ &rawDataBlockLength, &fTraverseMoreFrames, &syncLayerFrameBits, &fConfigFound, &headerBits); + if (headerBits > bitsAvail) { + err = (headerBits < (INT)hBs->hBitBuf.bufBits) + ? TRANSPORTDEC_NOT_ENOUGH_BITS + : TRANSPORTDEC_SYNC_ERROR; + } if (TPDEC_IS_FATAL_ERROR(err)) { /* Rewind - TPDEC_SYNCSKIP, in order to look for a synch one bit ahead * next time. Ensure that the bit amount lands at a multiple of @@ -1181,8 +1199,6 @@ } if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { - /* Enforce reading of new data */ - hTp->numberOfRawDataBlocks = 0; break; } @@ -1263,8 +1279,9 @@ if (!(hTp->flags & (TPDEC_LOST_FRAMES_PENDING | TPDEC_IGNORE_BUFFERFULLNESS | TPDEC_SYNCOK)) && err == TRANSPORTDEC_OK) { - err = additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), - FDKgetValidBits(hBs) - syncLayerFrameBits); + err = + additionalHoldOffNeeded(hTp, transportDec_GetBufferFullness(hTp), + (INT)FDKgetValidBits(hBs) - syncLayerFrameBits); if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { hTp->holdOffFrames++; } @@ -1273,7 +1290,9 @@ /* Rewind for retry because of not enough bits */ if (err == TRANSPORTDEC_NOT_ENOUGH_BITS) { FDKpushBack(hBs, headerBits); + hTp->numberOfRawDataBlocks = numRawDataBlocksPrevious; headerBits = 0; + rawDataBlockLength = rawDataBlockLengthPrevious; } else { /* reset hold off frame counter */ hTp->holdOffFrames = 0; @@ -1460,7 +1479,7 @@ for (i = 0; i < 2; i++) { if (i > 0) { - FDKpushBack(hBs, bsStart - FDKgetValidBits(hBs)); + FDKpushBack(hBs, bsStart - (INT)FDKgetValidBits(hBs)); configMode = AC_CM_ALLOC_MEM; } @@ -1750,7 +1769,7 @@ info += i; info->module_id = FDK_TPDEC; -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO info->build_date = ""; info->build_time = ""; #else diff -Nru fdk-aac-2.0.1/libMpegTPEnc/src/tpenc_lib.cpp fdk-aac-2.0.2/libMpegTPEnc/src/tpenc_lib.cpp --- fdk-aac-2.0.1/libMpegTPEnc/src/tpenc_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libMpegTPEnc/src/tpenc_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -647,7 +647,7 @@ info->module_id = FDK_TPENC; info->version = LIB_VERSION(TP_LIB_VL0, TP_LIB_VL1, TP_LIB_VL2); LIB_VERSION_STRING(info); -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO info->build_date = ""; info->build_time = ""; #else diff -Nru fdk-aac-2.0.1/libPCMutils/include/limiter.h fdk-aac-2.0.2/libPCMutils/include/limiter.h --- fdk-aac-2.0.1/libPCMutils/include/limiter.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libPCMutils/include/limiter.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -109,8 +109,6 @@ #define TDL_ATTACK_DEFAULT_MS (15) /* default attack time in ms */ #define TDL_RELEASE_DEFAULT_MS (50) /* default release time in ms */ -#define TDL_GAIN_SCALING (15) /* scaling of gain value. */ - #ifdef __cplusplus extern "C" { #endif @@ -128,10 +126,7 @@ unsigned int maxBufIdx, delayBufIdx; FIXP_DBL smoothState0; FIXP_DBL minGain; - - FIXP_DBL additionalGainPrev; - FIXP_DBL additionalGainFilterState; - FIXP_DBL additionalGainFilterState1; + INT scaling; }; typedef enum { @@ -255,27 +250,16 @@ /****************************************************************************** * pcmLimiter_Apply * - * limiter: limiter handle * - * pGain : pointer to gains to be applied to the signal before limiting, * - * which are downscaled by TDL_GAIN_SCALING bit. * - * These gains are delayed by gain_delay, and smoothed. * - * Smoothing is done by a butterworth lowpass filter with a cutoff * - * frequency which is fixed with respect to the sampling rate. * - * It is a substitute for the smoothing due to windowing and * - * overlap/add, if a gain is applied in frequency domain. * - * gain_scale: pointer to scaling exponents to be applied to the signal before * - * limiting, without delay and without smoothing * - * gain_size: number of elements in pGain, currently restricted to 1 * - * gain_delay: delay [samples] with which the gains in pGain shall be applied * - * gain_delay <= nSamples * - * samples: input/output buffer containing interleaved samples * - * precision of output will be DFRACT_BITS-TDL_GAIN_SCALING bits * - * nSamples: number of samples per channel * + * limiter: limiter handle * + * samplesIn: pointer to input buffer containing interleaved samples * + * samplesOut: pointer to output buffer containing interleaved samples * + * pGainPerSample: pointer to gains for each sample * + * scaling: scaling of output samples * + * nSamples: number of samples per channel * * returns: error code * ******************************************************************************/ TDLIMITER_ERROR pcmLimiter_Apply(TDLimiterPtr limiter, PCM_LIM* samplesIn, - INT_PCM* samplesOut, FIXP_DBL* pGain, - const INT* gain_scale, const UINT gain_size, - const UINT gain_delay, const UINT nSamples); + INT_PCM* samplesOut, FIXP_DBL* pGainPerSample, + const INT scaling, const UINT nSamples); #endif /* #ifndef LIMITER_H */ diff -Nru fdk-aac-2.0.1/libPCMutils/src/limiter.cpp fdk-aac-2.0.2/libPCMutils/src/limiter.cpp --- fdk-aac-2.0.1/libPCMutils/src/limiter.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libPCMutils/src/limiter.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -152,7 +152,7 @@ limiter->attack = attack; limiter->attackConst = attackConst; limiter->releaseConst = releaseConst; - limiter->threshold = threshold >> TDL_GAIN_SCALING; + limiter->threshold = threshold; limiter->channels = maxChannels; limiter->maxChannels = maxChannels; limiter->sampleRate = maxSampleRate; @@ -165,18 +165,13 @@ /* apply limiter */ TDLIMITER_ERROR pcmLimiter_Apply(TDLimiterPtr limiter, PCM_LIM* samplesIn, - INT_PCM* samplesOut, FIXP_DBL* RESTRICT pGain, - const INT* RESTRICT gain_scale, - const UINT gain_size, const UINT gain_delay, - const UINT nSamples) { + INT_PCM* samplesOut, FIXP_DBL* pGainPerSample, + const INT scaling, const UINT nSamples) { unsigned int i, j; - FIXP_DBL tmp1; FIXP_DBL tmp2; - FIXP_DBL tmp, old, gain, additionalGain = 0, additionalGainUnfiltered; + FIXP_DBL tmp, old, gain, additionalGain = 0; FIXP_DBL minGain = FL2FXCONST_DBL(1.0f / (1 << 1)); - - FDK_ASSERT(gain_size == 1); - FDK_ASSERT(gain_delay <= nSamples); + UINT additionalGainAvailable = 1; if (limiter == NULL) return TDLIMIT_INVALID_HANDLE; @@ -185,7 +180,7 @@ unsigned int attack = limiter->attack; FIXP_DBL attackConst = limiter->attackConst; FIXP_DBL releaseConst = limiter->releaseConst; - FIXP_DBL threshold = limiter->threshold; + FIXP_DBL threshold = limiter->threshold >> scaling; FIXP_DBL max = limiter->max; FIXP_DBL* maxBuf = limiter->maxBuf; @@ -195,55 +190,34 @@ unsigned int delayBufIdx = limiter->delayBufIdx; FIXP_DBL smoothState0 = limiter->smoothState0; - FIXP_DBL additionalGainSmoothState = limiter->additionalGainFilterState; - FIXP_DBL additionalGainSmoothState1 = limiter->additionalGainFilterState1; - if (!gain_delay) { - additionalGain = pGain[0]; - if (gain_scale[0] > 0) { - additionalGain <<= gain_scale[0]; - } else { - additionalGain >>= -gain_scale[0]; - } + if (limiter->scaling != scaling) { + scaleValuesSaturate(delayBuf, attack * channels, + limiter->scaling - scaling); + scaleValuesSaturate(maxBuf, attack + 1, limiter->scaling - scaling); + max = scaleValueSaturate(max, limiter->scaling - scaling); + limiter->scaling = scaling; } - for (i = 0; i < nSamples; i++) { - if (gain_delay) { - if (i < gain_delay) { - additionalGainUnfiltered = limiter->additionalGainPrev; - } else { - additionalGainUnfiltered = pGain[0]; - } + if (pGainPerSample == NULL) { + additionalGainAvailable = 0; + } - /* Smooth additionalGain */ - /* [b,a] = butter(1, 0.01) */ - static const FIXP_SGL b[] = {FL2FXCONST_SGL(0.015466 * 2.0), - FL2FXCONST_SGL(0.015466 * 2.0)}; - static const FIXP_SGL a[] = {(FIXP_SGL)MAXVAL_SGL, - FL2FXCONST_SGL(-0.96907)}; - additionalGain = -fMult(additionalGainSmoothState, a[1]) + - fMultDiv2(additionalGainUnfiltered, b[0]) + - fMultDiv2(additionalGainSmoothState1, b[1]); - additionalGainSmoothState1 = additionalGainUnfiltered; - additionalGainSmoothState = additionalGain; - - /* Apply the additional scaling that has no delay and no smoothing */ - if (gain_scale[0] > 0) { - additionalGain <<= gain_scale[0]; - } else { - additionalGain >>= -gain_scale[0]; - } - } + for (i = 0; i < nSamples; i++) { /* get maximum absolute sample value of all channels, including the * additional gain. */ - tmp1 = (FIXP_DBL)0; + tmp = (FIXP_DBL)0; for (j = 0; j < channels; j++) { tmp2 = PCM_LIM2FIXP_DBL(samplesIn[j]); - tmp2 = fAbs(tmp2); - tmp2 = FIXP_DBL(INT(tmp2) ^ INT((tmp2 >> (SAMPLE_BITS_LIM - 1)))); - tmp1 = fMax(tmp1, tmp2); + tmp2 = + (tmp2 == (FIXP_DBL)MINVAL_DBL) ? (FIXP_DBL)MAXVAL_DBL : fAbs(tmp2); + tmp = fMax(tmp, tmp2); + } + + if (additionalGainAvailable) { + additionalGain = pGainPerSample[i]; + tmp = fMult(tmp, additionalGain); } - tmp = fMult(tmp1, additionalGain); /* set threshold as lower border to save calculations in running maximum * algorithm */ @@ -314,22 +288,42 @@ /* lookahead delay, apply gain */ for (j = 0; j < channels; j++) { tmp = p_delayBuf[j]; - p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain); + + if (additionalGainAvailable) { + p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain); + } else { + p_delayBuf[j] = PCM_LIM2FIXP_DBL(samplesIn[j]); + } /* Apply gain to delayed signal */ tmp = fMultDiv2(tmp, gain); - +#if (SAMPLE_BITS == DFRACT_BITS) + samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM( + (FIXP_DBL)SATURATE_LEFT_SHIFT(tmp, scaling + 1, DFRACT_BITS)); +#else samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM((FIXP_DBL)SATURATE_LEFT_SHIFT( - tmp, TDL_GAIN_SCALING + 1, DFRACT_BITS)); + tmp + ((FIXP_DBL)0x8000 >> (scaling + 1)), scaling + 1, + DFRACT_BITS)); +#endif } gain >>= 1; } else { /* lookahead delay, apply gain=1.0f */ for (j = 0; j < channels; j++) { tmp = p_delayBuf[j]; - p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain); + if (additionalGainAvailable) { + p_delayBuf[j] = fMult((FIXP_PCM_LIM)samplesIn[j], additionalGain); + } else { + p_delayBuf[j] = PCM_LIM2FIXP_DBL(samplesIn[j]); + } + +#if (SAMPLE_BITS == DFRACT_BITS) + samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM( + (FIXP_DBL)SATURATE_LEFT_SHIFT(tmp, scaling, DFRACT_BITS)); +#else samplesOut[j] = (INT_PCM)FX_DBL2FX_PCM((FIXP_DBL)SATURATE_LEFT_SHIFT( - tmp, TDL_GAIN_SCALING, DFRACT_BITS)); + tmp + ((FIXP_DBL)0x8000 >> scaling), scaling, DFRACT_BITS)); +#endif } } @@ -354,13 +348,9 @@ limiter->delayBufIdx = delayBufIdx; limiter->smoothState0 = smoothState0; - limiter->additionalGainFilterState = additionalGainSmoothState; - limiter->additionalGainFilterState1 = additionalGainSmoothState1; limiter->minGain = minGain; - limiter->additionalGainPrev = pGain[0]; - return TDLIMIT_OK; } } @@ -370,7 +360,7 @@ FIXP_DBL threshold) { if (limiter == NULL) return TDLIMIT_INVALID_HANDLE; - limiter->threshold = threshold >> TDL_GAIN_SCALING; + limiter->threshold = threshold; return TDLIMIT_OK; } @@ -384,13 +374,7 @@ limiter->cor = FL2FXCONST_DBL(1.0f / (1 << 1)); limiter->smoothState0 = FL2FXCONST_DBL(1.0f / (1 << 1)); limiter->minGain = FL2FXCONST_DBL(1.0f / (1 << 1)); - - limiter->additionalGainPrev = - FL2FXCONST_DBL(1.0f / (1 << TDL_GAIN_SCALING)); - limiter->additionalGainFilterState = - FL2FXCONST_DBL(1.0f / (1 << TDL_GAIN_SCALING)); - limiter->additionalGainFilterState1 = - FL2FXCONST_DBL(1.0f / (1 << TDL_GAIN_SCALING)); + limiter->scaling = 0; FDKmemset(limiter->maxBuf, 0, (limiter->attack + 1) * sizeof(FIXP_DBL)); FDKmemset(limiter->delayBuf, 0, diff -Nru fdk-aac-2.0.1/libPCMutils/src/pcmdmx_lib.cpp fdk-aac-2.0.2/libPCMutils/src/pcmdmx_lib.cpp --- fdk-aac-2.0.1/libPCMutils/src/pcmdmx_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libPCMutils/src/pcmdmx_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -585,7 +585,6 @@ if (channelIndices[ch] >= numCh[channelType[ch] >> 4][chGrp]) return PCMDMX_INVALID_CH_CONFIG; - spkrPos[ch] = getSpeakerPos(channelType[ch], channelIndices[ch], numCh[channelType[ch] >> 4][chGrp]); diff -Nru fdk-aac-2.0.1/libPCMutils/src/version.h fdk-aac-2.0.2/libPCMutils/src/version.h --- fdk-aac-2.0.1/libPCMutils/src/version.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libPCMutils/src/version.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -105,10 +105,10 @@ /* library info */ #define PCMUTIL_LIB_VL0 3 -#define PCMUTIL_LIB_VL1 0 +#define PCMUTIL_LIB_VL1 1 #define PCMUTIL_LIB_VL2 0 #define PCMUTIL_LIB_TITLE "PCM Utility Lib" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define PCMUTIL_LIB_BUILD_DATE "" #define PCMUTIL_LIB_BUILD_TIME "" #else diff -Nru fdk-aac-2.0.1/libSACdec/include/sac_dec_lib.h fdk-aac-2.0.2/libSACdec/include/sac_dec_lib.h --- fdk-aac-2.0.1/libSACdec/include/sac_dec_lib.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/include/sac_dec_lib.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -252,7 +252,7 @@ scenario. Default parameter value is 3 frames. */ } SACDEC_PARAM; -#define PCM_MPS INT_PCM +#define PCM_MPS LONG /** * \brief MPEG Surround decoder handle. @@ -401,17 +401,22 @@ * for each output audio channel is stored into. * \param mapDescr Channep map descriptor for output channel mapping * to be used (From MPEG PCE ordering to whatever is required). + * \param inDataHeadroom Headroom of SAC input time signal to prevent + * clipping. + * \param outDataHeadroom Pointer to headroom of SAC output time signal to + * prevent clipping. * * \return Error code. */ int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, - INT_PCM *input, PCM_MPS *pTimeData, + PCM_MPS *input, PCM_MPS *pTimeData, const int timeDataSize, int timeDataFrameSize, int *nChannels, int *frameSize, int sampleRate, AUDIO_OBJECT_TYPE coreCodec, AUDIO_CHANNEL_TYPE channelType[], UCHAR channelIndices[], - const FDK_channelMapDescr *const mapDescr); + const FDK_channelMapDescr *const mapDescr, + const INT inDataHeadroom, INT *outDataHeadroom); /** * \brief Deallocate a MPEG Surround decoder instance. diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_bitdec.cpp fdk-aac-2.0.2/libSACdec/src/sac_bitdec.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_bitdec.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_bitdec.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -448,6 +448,7 @@ int bsFreqRes, b3DaudioMode = 0; int numHeaderBits; int cfgStartPos, bitsAvailable; + int treeConfig; FDKmemclear(pSpatialSpecificConfig, sizeof(SPATIAL_SPECIFIC_CONFIG)); @@ -488,13 +489,13 @@ pSpatialSpecificConfig->freqRes = (SPATIALDEC_FREQ_RES)freqResTable_LD[bsFreqRes]; - pSpatialSpecificConfig->treeConfig = - (SPATIALDEC_TREE_CONFIG)FDKreadBits(bitstream, 4); + treeConfig = FDKreadBits(bitstream, 4); - if (pSpatialSpecificConfig->treeConfig != SPATIALDEC_MODE_RSVD7) { + if (treeConfig != SPATIALDEC_MODE_RSVD7) { err = MPS_UNSUPPORTED_CONFIG; goto bail; } + pSpatialSpecificConfig->treeConfig = (SPATIALDEC_TREE_CONFIG) treeConfig; { pSpatialSpecificConfig->nOttBoxes = @@ -1457,7 +1458,7 @@ FIXP_DBL (*pOttVsTotDb1)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS], FIXP_DBL (*pOttVsTotDb2)[MAX_PARAMETER_SETS][MAX_PARAMETER_BANDS]) { int aParamSlots[MAX_PARAMETER_SETS]; - int aInterpolate[MAX_PARAMETER_SETS]; + int aInterpolate[MAX_PARAMETER_SETS] = {0}; int dataSets; int aMap[MAX_PARAMETER_BANDS + 1]; @@ -1554,21 +1555,20 @@ /* Interpolate */ i1 = 0; for (i = 0; i < numParameterSets; i++) { - int xi, i2, x1, x2; - if (aInterpolate[i] != 1) { i1 = i; - } - i2 = i; - while (aInterpolate[i2] == 1) { - i2++; - } - x1 = paramSlot[i1]; - xi = paramSlot[i]; - x2 = paramSlot[i2]; + } else { + int xi, i2, x1, x2; - if (aInterpolate[i] == 1) { + for (i2 = i; i2 < numParameterSets; i2++) { + if (aInterpolate[i2] != 1) break; + } if (i2 >= numParameterSets) return MPS_WRONG_PARAMETERSETS; + + x1 = paramSlot[i1]; + xi = paramSlot[i]; + x2 = paramSlot[i2]; + for (band = startBand; band < stopBand; band++) { int yi, y1, y2; y1 = outputIdxData[xttIdx][i1][band]; @@ -1587,9 +1587,9 @@ for (ps = 0; ps < numParameterSets; ps++) { if (quantMode && (paramType == t_CLD)) { if (pOttVsTotDbIn == 0) return MPS_WRONG_OTT; - if ((pOttVsTotDb1 == 0) && (ottVsTotDbMode == ottVsTotDb1Activ)) + if ((pOttVsTotDb1 == 0) && (ottVsTotDbMode & ottVsTotDb1Activ)) return MPS_WRONG_OTT; - if ((pOttVsTotDb2 == 0) && (ottVsTotDbMode == ottVsTotDb2Activ)) + if ((pOttVsTotDb2 == 0) && (ottVsTotDbMode & ottVsTotDb2Activ)) return MPS_WRONG_OTT; for (pb = startBand; pb < stopBand; pb++) { @@ -1611,6 +1611,10 @@ } /* for( i = 0 ; i < numParameterSets; i++ ) */ if (extendFrame) { + if (paramType == t_IPD) { + llData->bsQuantCoarseXXX[numParameterSets] = + llData->bsQuantCoarseXXX[numParameterSets - 1]; + } for (band = startBand; band < stopBand; band++) { outputDataIdx[xttIdx][numParameterSets][band] = outputDataIdx[xttIdx][numParameterSets - 1][band]; diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_calcM1andM2.cpp fdk-aac-2.0.2/libSACdec/src/sac_calcM1andM2.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_calcM1andM2.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_calcM1andM2.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -474,80 +474,6 @@ FL2FXCONST_DBL(0.888178419700125), }; -static FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK_Function(INT ipdIdx, - INT cldIdx, - INT iccIdx) { - FIXP_DBL cld; - SpatialDequantGetCLD2Values(cldIdx, &cld); - - /*const FIXP_DBL one_m = (FIXP_DBL)MAXVAL_DBL; - const int one_e = 0;*/ - const FIXP_DBL one_m = FL2FXCONST_DBL(0.5f); - const int one_e = 1; - /* iidLin = sqrt(cld); */ - FIXP_DBL iidLin_m = sqrt_CLD_m[cldIdx]; - int iidLin_e = sqrt_CLD_e[cldIdx]; - /* iidLin2 = cld; */ - FIXP_DBL iidLin2_m = CLD_m[cldIdx]; - int iidLin2_e = sqrt_CLD_e[cldIdx] << 1; - /* iidLin21 = iidLin2 + 1.0f; */ - int iidLin21_e; - FIXP_DBL iidLin21_m = - fAddNorm(iidLin2_m, iidLin2_e, one_m, one_e, &iidLin21_e); - /* iidIcc2 = iidLin * icc * 2.0f; */ - FIXP_CFG icc = dequantICC__FDK[iccIdx]; - FIXP_DBL temp1_m, temp1c_m; - int temp1_e, temp1c_e; - temp1_m = fMult(iidLin_m, icc); - temp1_e = iidLin_e + 1; - - FIXP_DBL cosIpd, sinIpd; - cosIpd = COS_IPD(ipdIdx); - sinIpd = SIN_IPD(ipdIdx); - - temp1c_m = fMult(temp1_m, cosIpd); - temp1c_e = temp1_e; //+cosIpd_e; - - int temp2_e, temp3_e, inv_temp3_e, ratio_e; - FIXP_DBL temp2_m = - fAddNorm(iidLin21_m, iidLin21_e, temp1c_m, temp1c_e, &temp2_e); - FIXP_DBL temp3_m = - fAddNorm(iidLin21_m, iidLin21_e, temp1_m, temp1_e, &temp3_e); - /* calculate 1/temp3 needed later */ - inv_temp3_e = temp3_e; - FIXP_DBL inv_temp3_m = invFixp(temp3_m, &inv_temp3_e); - FIXP_DBL ratio_m = - fAddNorm(fMult(inv_temp3_m, temp2_m), (inv_temp3_e + temp2_e), - FL2FXCONST_DBL(1e-9f), 0, &ratio_e); - - int weight2_e, tempb_atan2_e; - FIXP_DBL weight2_m = - fPow(ratio_m, ratio_e, FL2FXCONST_DBL(0.5f), -1, &weight2_e); - /* atan2(w2*sinIpd, w1*iidLin + w2*cosIpd) = atan2(w2*sinIpd, (2 - w2)*iidLin - * + w2*cosIpd) = atan2(w2*sinIpd, 2*iidLin + w2*(cosIpd - iidLin)); */ - /* tmpa_atan2 = w2*sinIpd; tmpb_atan2 = 2*iidLin + w2*(cosIpd - iidLin); */ - FIXP_DBL tempb_atan2_m = iidLin_m; - tempb_atan2_e = iidLin_e + 1; - int add_tmp1_e = 0; - FIXP_DBL add_tmp1_m = fAddNorm(cosIpd, 0, -iidLin_m, iidLin_e, &add_tmp1_e); - FIXP_DBL add_tmp2_m = fMult(add_tmp1_m, weight2_m); - int add_tmp2_e = add_tmp1_e + weight2_e; - tempb_atan2_m = fAddNorm(tempb_atan2_m, tempb_atan2_e, add_tmp2_m, add_tmp2_e, - &tempb_atan2_e); - - FIXP_DBL tempa_atan2_m = fMult(weight2_m, sinIpd); - int tempa_atan2_e = weight2_e; // + sinIpd_e; - - if (tempa_atan2_e > tempb_atan2_e) { - tempb_atan2_m = (tempb_atan2_m >> (tempa_atan2_e - tempb_atan2_e)); - tempb_atan2_e = tempa_atan2_e; - } else if (tempb_atan2_e > tempa_atan2_e) { - tempa_atan2_m = (tempa_atan2_m >> (tempb_atan2_e - tempa_atan2_e)); - } - - return fixp_atan2(tempa_atan2_m, tempb_atan2_m); -} - static void calculateOpd(spatialDec* self, INT ottBoxIndx, INT parameterSetIndx, FIXP_DBL opd[MAX_PARAMETER_BANDS]) { INT band; @@ -563,12 +489,12 @@ SpatialDequantGetCLD2Values(idxCld, &cld); /* ipd(idxIpd==8) == PI */ - if ((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) { + if (((cld == FL2FXCONST_DBL(0.0f)) && (idxIpd == 8)) || (idxIpd == 0)) { opd[2 * band] = FL2FXCONST_DBL(0.0f); } else { - opd[2 * band] = (dequantIPD_CLD_ICC_splitAngle__FDK_Function( - idxIpd, idxCld, idxIcc) >> - (IPD_SCALE - AT2O_SF)); + FDK_ASSERT(idxIpd > 0); + opd[2 * band] = + dequantIPD_CLD_ICC_splitAngle__FDK[idxIpd - 1][idxCld][idxIcc]; } opd[2 * band + 1] = opd[2 * band] - ipd; } diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_calcM1andM2.h fdk-aac-2.0.2/libSACdec/src/sac_calcM1andM2.h --- fdk-aac-2.0.1/libSACdec/src/sac_calcM1andM2.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_calcM1andM2.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -117,6 +117,9 @@ /* Scaling of spectral data after applying M2 matrix, but only for binaural upmix type Scaling is compensated later in synthesis qmf filterbank */ #define SCALE_DATA_APPLY_M2 (1) +/* Applying M2 parameter in combination with phase coding needs 2 bits headroom + * because up to a maximum of 4 spectral values can be added for USAC */ +#define SCALE_DATA_APPLY_M2_PC (2) SACDEC_ERROR initM1andM2(spatialDec* self, int initStatesFlag, int configChanged); diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_dec.cpp fdk-aac-2.0.2/libSACdec/src/sac_dec.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_dec.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_dec.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -200,6 +200,7 @@ /* parameter smoothing tool set to off */ bsFrame->bsSmoothMode[0] = 0; + initParameterSmoothing(self); /* reset residual data */ { @@ -765,7 +766,7 @@ /* output scaling */ for (nCh = 0; nCh < self->numOutputChannelsAT; nCh++) { - int outputScale = 0, outputGain_e = 0, scale = 0; + int outputScale = 0, outputGain_e = 0, scale = -(8) + (1); FIXP_DBL outputGain_m = getChGain(self, nCh, &outputGain_e); if (!isTwoChMode(self->upmixType) && !bypassMode) { @@ -774,7 +775,7 @@ synthesis qmf */ } - scale = outputScale; + scale += outputScale; qmfChangeOutScalefactor(&self->pQmfDomain->QmfDomainOut[nCh].fb, scale); qmfChangeOutGain(&self->pQmfDomain->QmfDomainOut[nCh].fb, outputGain_m, @@ -1222,18 +1223,24 @@ !(self->stereoConfigIndex == 3)) { for (i = 0; i < self->qmfBands; i++) { self_qmfResidualReal__FDK_0_0[i] = - fMult(self_qmfResidualReal__FDK_0_0[i] << 1, + fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i], + 1 + self->sacInDataHeadroom - (1)), self->clipProtectGain__FDK); self_qmfResidualImag__FDK_0_0[i] = - fMult(self_qmfResidualImag__FDK_0_0[i] << 1, + fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i], + 1 + self->sacInDataHeadroom - (1)), self->clipProtectGain__FDK); } } else { for (i = 0; i < self->qmfBands; i++) { - self_qmfResidualReal__FDK_0_0[i] = fMult( - self_qmfResidualReal__FDK_0_0[i], self->clipProtectGain__FDK); - self_qmfResidualImag__FDK_0_0[i] = fMult( - self_qmfResidualImag__FDK_0_0[i], self->clipProtectGain__FDK); + self_qmfResidualReal__FDK_0_0[i] = + fMult(scaleValueSaturate(self_qmfResidualReal__FDK_0_0[i], + self->sacInDataHeadroom - (1)), + self->clipProtectGain__FDK); + self_qmfResidualImag__FDK_0_0[i] = + fMult(scaleValueSaturate(self_qmfResidualImag__FDK_0_0[i], + self->sacInDataHeadroom - (1)), + self->clipProtectGain__FDK); } } } @@ -1316,10 +1323,12 @@ if ((self->tempShapeConfig == 1) && (!isTwoChMode(self->upmixType))) { for (ch = 0; ch < self->numOutputChannels; ch++) { for (hyb = 0; hyb < self->tp_hybBandBorder; hyb++) { - self->hybOutputRealDry__FDK[ch][hyb] += - self->hybOutputRealWet__FDK[ch][hyb]; - self->hybOutputImagDry__FDK[ch][hyb] += - self->hybOutputImagWet__FDK[ch][hyb]; + self->hybOutputRealDry__FDK[ch][hyb] = + fAddSaturate(self->hybOutputRealDry__FDK[ch][hyb], + self->hybOutputRealWet__FDK[ch][hyb]); + self->hybOutputImagDry__FDK[ch][hyb] = + fAddSaturate(self->hybOutputImagDry__FDK[ch][hyb], + self->hybOutputImagWet__FDK[ch][hyb]); } /* loop hyb */ } /* loop ch */ err = subbandTPApply( @@ -1340,11 +1349,11 @@ FIXP_DBL *RESTRICT pRealWet = self->hybOutputRealWet__FDK[ch]; FIXP_DBL *RESTRICT pImagWet = self->hybOutputImagWet__FDK[ch]; for (hyb = 0; hyb < nHybBands; hyb++) { - pRealDry[hyb] += pRealWet[hyb]; - pImagDry[hyb] += pImagWet[hyb]; + pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]); + pImagDry[hyb] = fAddSaturate(pImagDry[hyb], pImagWet[hyb]); } /* loop hyb */ for (; hyb < self->hybridBands; hyb++) { - pRealDry[hyb] += pRealWet[hyb]; + pRealDry[hyb] = fAddSaturate(pRealDry[hyb], pRealWet[hyb]); } /* loop hyb */ } /* loop ch */ } /* ( self->tempShapeConfig == 1 ) || ( self->tempShapeConfig == 2 ) */ @@ -1413,6 +1422,7 @@ FDK_ASSERT(self != NULL); FDK_ASSERT(pControlFlags != NULL); FDK_ASSERT(pcmOutBuf != NULL); + FDK_ASSERT(self->sacInDataHeadroom >= (1)); self->errInt = err; /* Init internal error */ diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_dec.h fdk-aac-2.0.2/libSACdec/src/sac_dec.h --- fdk-aac-2.0.1/libSACdec/src/sac_dec.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_dec.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -523,6 +523,9 @@ new frame after SSC change (aka decodeAfterConfigHasChangedFlag). */ SpatialDecConcealmentInfo concealInfo; + + INT sacInDataHeadroom; /* Headroom of the SAC input time signal to prevent + clipping */ }; #define SACDEC_SYNTAX_MPS 1 diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_dec_interface.h fdk-aac-2.0.2/libSACdec/src/sac_dec_interface.h --- fdk-aac-2.0.1/libSACdec/src/sac_dec_interface.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_dec_interface.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -249,10 +249,10 @@ } MEM_REQUIREMENTS; -#define PCM_MPS INT_PCM -#define PCM_MPSF FIXP_PCM +#define PCM_MPS LONG +#define PCM_MPSF FIXP_DBL -#define FIXP_DBL2PCM_MPS(x) ((INT_PCM)FX_DBL2FX_PCM(x)) +#define FIXP_DBL2PCM_MPS(x) ((LONG)(x)) /* exposed functions (library interface) */ diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_dec_lib.cpp fdk-aac-2.0.2/libSACdec/src/sac_dec_lib.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_dec_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_dec_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -1507,15 +1507,17 @@ } int mpegSurroundDecoder_Apply(CMpegSurroundDecoder *pMpegSurroundDecoder, - INT_PCM *input, PCM_MPS *pTimeData, + PCM_MPS *input, PCM_MPS *pTimeData, const int timeDataSize, int timeDataFrameSize, int *nChannels, int *frameSize, int sampleRate, AUDIO_OBJECT_TYPE coreCodec, AUDIO_CHANNEL_TYPE channelType[], UCHAR channelIndices[], - const FDK_channelMapDescr *const mapDescr) { + const FDK_channelMapDescr *const mapDescr, + const INT inDataHeadroom, INT *outDataHeadroom) { SACDEC_ERROR err = MPS_OK; PCM_MPS *pTimeOut = pTimeData; + PCM_MPS *TDinput = NULL; UINT initControlFlags = 0, controlFlags = 0; int timeDataRequiredSize = 0; int newData; @@ -1534,6 +1536,9 @@ return MPS_NOTOK; } + pMpegSurroundDecoder->pSpatialDec->sacInDataHeadroom = inDataHeadroom; + *outDataHeadroom = (INT)(8); + pMpegSurroundDecoder->pSpatialDec->pConfigCurrent = &pMpegSurroundDecoder ->spatialSpecificConfig[pMpegSurroundDecoder->bsFrameDecode]; @@ -1682,8 +1687,7 @@ (timeDataFrameSize * pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsSynthesis) / pMpegSurroundDecoder->pQmfDomain->globalConf.nBandsAnalysis; - pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput = - pTimeData + timeDataFrameSizeOut - timeDataFrameSize; + TDinput = pTimeData + timeDataFrameSizeOut - timeDataFrameSize; for (int i = *nChannels - 1; i >= 0; i--) { FDKmemmove(pTimeData + (i + 1) * timeDataFrameSizeOut - timeDataFrameSize, pTimeData + timeDataFrameSize * i, @@ -1694,8 +1698,8 @@ } else { if (pMpegSurroundDecoder->mpegSurroundUseTimeInterface) { FDKmemcpy(input, pTimeData, - sizeof(INT_PCM) * (*nChannels) * (*frameSize)); - pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput = input; + sizeof(PCM_MPS) * (*nChannels) * (*frameSize)); + TDinput = input; } } @@ -1707,8 +1711,8 @@ &pMpegSurroundDecoder->bsFrames[pMpegSurroundDecoder->bsFrameDecode], pMpegSurroundDecoder->mpegSurroundUseTimeInterface ? INPUTMODE_TIME : INPUTMODE_QMF_SBR, - pMpegSurroundDecoder->pQmfDomain->globalConf.TDinput, NULL, NULL, - pTimeOut, *frameSize, &controlFlags, *nChannels, mapDescr); + TDinput, NULL, NULL, pTimeOut, *frameSize, &controlFlags, *nChannels, + mapDescr); *nChannels = pMpegSurroundDecoder->pSpatialDec->numOutputChannelsAT; if (err != @@ -1781,7 +1785,7 @@ } #define SACDEC_VL0 2 -#define SACDEC_VL1 0 +#define SACDEC_VL1 1 #define SACDEC_VL2 0 int mpegSurroundDecoder_GetLibInfo(LIB_INFO *info) { @@ -1800,7 +1804,7 @@ info += i; info->module_id = FDK_MPSDEC; -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO info->build_date = ""; info->build_time = ""; #else diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_process.cpp fdk-aac-2.0.2/libSACdec/src/sac_process.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_process.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_process.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -113,6 +113,8 @@ #include "FDK_trigFcts.h" #include "FDK_decorrelate.h" +#define SAC_DEC_APPLY_M2_SCALE(spec, s) ((spec) >> (-(s))) + /** * \brief Linear interpolation between two parameter values. * a*alpha + b*(1-alpha) @@ -185,8 +187,12 @@ if (!isTwoChMode(self->upmixType) && !bypassMode) { int i; for (i = 0; i < self->qmfBands; i++) { - qmfReal[ch][i] = fMult(qmfReal[ch][i], self->clipProtectGain__FDK); - qmfImag[ch][i] = fMult(qmfImag[ch][i], self->clipProtectGain__FDK); + qmfReal[ch][i] = fMult( + scaleValueSaturate(qmfReal[ch][i], self->sacInDataHeadroom - (1)), + self->clipProtectGain__FDK); + qmfImag[ch][i] = fMult( + scaleValueSaturate(qmfImag[ch][i], self->sacInDataHeadroom - (1)), + self->clipProtectGain__FDK); } } } @@ -214,16 +220,17 @@ /* Write Input data to pQmfRealAnalysis. */ if (self->bShareDelayWithSBR) { - FDK_QmfDomain_GetSlot( - &self->pQmfDomain->QmfDomainIn[ch], ts + HYBRID_FILTER_DELAY, 0, - MAX_QMF_BANDS_TO_HYBRID, pQmfRealAnalysis, pQmfImagAnalysis, 15); + FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], + ts + HYBRID_FILTER_DELAY, 0, + MAX_QMF_BANDS_TO_HYBRID, pQmfRealAnalysis, + pQmfImagAnalysis, 15 + (1)); FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], ts, MAX_QMF_BANDS_TO_HYBRID, self->qmfBands, - pQmfRealAnalysis, pQmfImagAnalysis, 15); + pQmfRealAnalysis, pQmfImagAnalysis, 15 + (1)); } else { FDK_QmfDomain_GetSlot(&self->pQmfDomain->QmfDomainIn[ch], ts, 0, self->qmfBands, pQmfRealAnalysis, - pQmfImagAnalysis, 15); + pQmfImagAnalysis, 15 + (1)); } if (ts == self->pQmfDomain->globalConf.nQmfTimeSlots - 1) { /* Is currently also needed in case we dont have any overlap. We need to @@ -499,8 +506,8 @@ for (pb = 0, qs = 3; pb < 2; pb++) { INT s; FIXP_DBL maxVal; - FIXP_SGL mReal1; - FIXP_SGL mReal0, mImag0; + FIXP_DBL mReal1; + FIXP_DBL mReal0, mImag0; FIXP_DBL iReal0, iImag0, iReal1; iReal0 = interpolateParameter(alpha, MReal0[pb], MRealPrev0[pb]); @@ -513,9 +520,9 @@ s = fMax(CntLeadingZeros(maxVal) - 1, 0); s = fMin(s, scale_param_m2); - mReal0 = FX_DBL2FX_SGL(iReal0 << s); - mImag0 = FX_DBL2FX_SGL(iImag0 << s); - mReal1 = FX_DBL2FX_SGL(iReal1 << s); + mReal0 = iReal0 << s; + mImag0 = iImag0 << s; + mReal1 = iReal1 << s; s = scale_param_m2 - s; @@ -634,8 +641,7 @@ } if (self->phaseCoding == 3) { - /* + SCALE_DATA_APPLY_M2 to compensate for Div2 below ?! */ - scale_param_m2 = SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2; + scale_param_m2 = -(SCALE_DATA_APPLY_M2_PC - 1); } for (row = 0; row < self->numM2rows; row++) { @@ -686,10 +692,10 @@ } else { /* isBinauralMode(self->upmixType) */ for (qs = 0; qs < complexHybBands; qs++) { - pHybOutRealDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) - << (scale_param_m2); - pHybOutImagDry[qs] += fMultDiv2(pWImag[qs], pKernel[qs]) - << (scale_param_m2); + pHybOutRealDry[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2); + pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2); } M2ParamToKernelMult(pKernel, self->M2Imag__FDK[row][col], @@ -697,27 +703,27 @@ self->kernels_width, alpha, complexParBands); /* direct signals sign is -1 for qs = 0,2 */ - pHybOutRealDry[0] += fMultDiv2(pWImag[0], pKernel[0]) - << (scale_param_m2); - pHybOutImagDry[0] -= fMultDiv2(pWReal[0], pKernel[0]) - << (scale_param_m2); - - pHybOutRealDry[2] += fMultDiv2(pWImag[2], pKernel[2]) - << (scale_param_m2); - pHybOutImagDry[2] -= fMultDiv2(pWReal[2], pKernel[2]) - << (scale_param_m2); + pHybOutRealDry[0] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[0], pKernel[0]), scale_param_m2); + pHybOutImagDry[0] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[0], pKernel[0]), scale_param_m2); + + pHybOutRealDry[2] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[2], pKernel[2]), scale_param_m2); + pHybOutImagDry[2] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[2], pKernel[2]), scale_param_m2); /* direct signals sign is +1 for qs = 1,3,4,5,...,complexHybBands */ - pHybOutRealDry[1] -= fMultDiv2(pWImag[1], pKernel[1]) - << (scale_param_m2); - pHybOutImagDry[1] += fMultDiv2(pWReal[1], pKernel[1]) - << (scale_param_m2); + pHybOutRealDry[1] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[1], pKernel[1]), scale_param_m2); + pHybOutImagDry[1] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[1], pKernel[1]), scale_param_m2); for (qs = 3; qs < complexHybBands; qs++) { - pHybOutRealDry[qs] -= fMultDiv2(pWImag[qs], pKernel[qs]) - << (scale_param_m2); - pHybOutImagDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) - << (scale_param_m2); + pHybOutRealDry[qs] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2); + pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2); } } /* self->upmixType */ } /* if (activParamBands) */ @@ -770,17 +776,17 @@ FIXP_DBL *RESTRICT pHybOutImag; for (qs = 0; qs < resHybIndex; qs++) { - pHybOutRealDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) - << (scale_param_m2); - pHybOutImagDry[qs] += fMultDiv2(pWImag[qs], pKernel[qs]) - << (scale_param_m2); + pHybOutRealDry[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2); + pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2); } /* decor signals */ for (; qs < complexHybBands; qs++) { - pHybOutRealWet[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) - << (scale_param_m2); - pHybOutImagWet[qs] += fMultDiv2(pWImag[qs], pKernel[qs]) - << (scale_param_m2); + pHybOutRealWet[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2); + pHybOutImagWet[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2); } M2ParamToKernelMult(pKernel, self->M2Imag__FDK[row][col], @@ -790,20 +796,20 @@ /* direct signals sign is -1 for qs = 0,2 */ /* direct signals sign is +1 for qs = 1,3.. */ if (toolsDisabled) { - pHybOutRealDry[0] += fMultDiv2(pWImag[0], pKernel[0]) - << (scale_param_m2); - pHybOutImagDry[0] -= fMultDiv2(pWReal[0], pKernel[0]) - << (scale_param_m2); - - pHybOutRealDry[1] -= fMultDiv2(pWImag[1], pKernel[1]) - << (scale_param_m2); - pHybOutImagDry[1] += fMultDiv2(pWReal[1], pKernel[1]) - << (scale_param_m2); - - pHybOutRealDry[2] += fMultDiv2(pWImag[2], pKernel[2]) - << (scale_param_m2); - pHybOutImagDry[2] -= fMultDiv2(pWReal[2], pKernel[2]) - << (scale_param_m2); + pHybOutRealDry[0] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[0], pKernel[0]), scale_param_m2); + pHybOutImagDry[0] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[0], pKernel[0]), scale_param_m2); + + pHybOutRealDry[1] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[1], pKernel[1]), scale_param_m2); + pHybOutImagDry[1] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[1], pKernel[1]), scale_param_m2); + + pHybOutRealDry[2] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[2], pKernel[2]), scale_param_m2); + pHybOutImagDry[2] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[2], pKernel[2]), scale_param_m2); } else { pHybOutReal = &pHybOutRealDry[0]; pHybOutImag = &pHybOutImagDry[0]; @@ -811,46 +817,60 @@ pHybOutReal = &pHybOutRealWet[0]; pHybOutImag = &pHybOutImagWet[0]; } - pHybOutReal[0] += fMultDiv2(pWImag[0], pKernel[0]) - << (scale_param_m2); - pHybOutImag[0] -= fMultDiv2(pWReal[0], pKernel[0]) - << (scale_param_m2); + pHybOutReal[0] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[0], pKernel[0]), scale_param_m2); + pHybOutImag[0] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[0], pKernel[0]), scale_param_m2); if (1 == resHybIndex) { pHybOutReal = &pHybOutRealWet[0]; pHybOutImag = &pHybOutImagWet[0]; } - pHybOutReal[1] -= fMultDiv2(pWImag[1], pKernel[1]) - << (scale_param_m2); - pHybOutImag[1] += fMultDiv2(pWReal[1], pKernel[1]) - << (scale_param_m2); + pHybOutReal[1] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[1], pKernel[1]), scale_param_m2); + pHybOutImag[1] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[1], pKernel[1]), scale_param_m2); if (2 == resHybIndex) { pHybOutReal = &pHybOutRealWet[0]; pHybOutImag = &pHybOutImagWet[0]; } - pHybOutReal[2] += fMultDiv2(pWImag[2], pKernel[2]) - << (scale_param_m2); - pHybOutImag[2] -= fMultDiv2(pWReal[2], pKernel[2]) - << (scale_param_m2); + pHybOutReal[2] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[2], pKernel[2]), scale_param_m2); + pHybOutImag[2] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[2], pKernel[2]), scale_param_m2); } for (qs = 3; qs < resHybIndex; qs++) { - pHybOutRealDry[qs] -= fMultDiv2(pWImag[qs], pKernel[qs]) - << (scale_param_m2); - pHybOutImagDry[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) - << (scale_param_m2); + pHybOutRealDry[qs] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2); + pHybOutImagDry[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2); } /* decor signals */ for (; qs < complexHybBands; qs++) { - pHybOutRealWet[qs] -= fMultDiv2(pWImag[qs], pKernel[qs]) - << (scale_param_m2); - pHybOutImagWet[qs] += fMultDiv2(pWReal[qs], pKernel[qs]) - << (scale_param_m2); + pHybOutRealWet[qs] -= SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWImag[qs], pKernel[qs]), scale_param_m2); + pHybOutImagWet[qs] += SAC_DEC_APPLY_M2_SCALE( + fMultDiv2(pWReal[qs], pKernel[qs]), scale_param_m2); } } /* self->upmixType */ } /* if (activParamBands) { */ } /* self->numVChannels */ + + if (self->phaseCoding == 3) { + scaleValuesSaturate(pHybOutRealDry, complexHybBands, + SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC); + scaleValuesSaturate(pHybOutImagDry, complexHybBands, + SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC); + + if (!toolsDisabled) { + scaleValuesSaturate(pHybOutRealWet, complexHybBands, + SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC); + scaleValuesSaturate(pHybOutImagWet, complexHybBands, + SCALE_PARAM_M2_212_PRED + SCALE_DATA_APPLY_M2_PC); + } + } } C_ALLOC_SCRATCH_END(pKernel, FIXP_SGL, MAX_HYBRID_BANDS); @@ -919,6 +939,7 @@ self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale -= self->clipProtectGainSF__FDK; + self->pQmfDomain->QmfDomainIn[outCh].scaling.lb_scale -= (1); } else { /* Call the QMF synthesis for dry. */ err = CalculateSpaceSynthesisQmf(&self->pQmfDomain->QmfDomainOut[outCh], diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_qmf.cpp fdk-aac-2.0.2/libSACdec/src/sac_qmf.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_qmf.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_qmf.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -110,7 +110,7 @@ SACDEC_ERROR CalculateSpaceSynthesisQmf( const HANDLE_FDK_QMF_DOMAIN_OUT hQmfDomainOutCh, const FIXP_DBL *Sr, - const FIXP_DBL *Si, const INT stride, INT_PCM *timeSig) { + const FIXP_DBL *Si, const INT stride, PCM_MPS *timeSig) { SACDEC_ERROR err = MPS_OK; if (hQmfDomainOutCh == NULL) { diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_qmf.h fdk-aac-2.0.2/libSACdec/src/sac_qmf.h --- fdk-aac-2.0.1/libSACdec/src/sac_qmf.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_qmf.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -124,7 +124,7 @@ */ SACDEC_ERROR CalculateSpaceSynthesisQmf( const HANDLE_FDK_QMF_DOMAIN_OUT hQmfDomainOutCh, const FIXP_DBL *Sr, - const FIXP_DBL *Si, const INT stride, INT_PCM *timeSig); + const FIXP_DBL *Si, const INT stride, PCM_MPS *timeSig); /** * \brief Convert audio input data to qmf representation. diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_reshapeBBEnv.cpp fdk-aac-2.0.2/libSACdec/src/sac_reshapeBBEnv.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_reshapeBBEnv.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_reshapeBBEnv.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -162,75 +162,59 @@ FIXP_DBL nrg; /* qs = 12, 13, 14 */ - slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + slotNrg[0] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[1] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[2] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 15 */ - slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + slotNrg[3] = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 16, 17 */ - nrg = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[4] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[4] = + nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 18, 19, 20 */ - nrg = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - nrg += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[5] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[5] = + nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 21, 22 */ - nrg = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[6] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[6] = + nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 23, 24 */ if (hybBands > 23) { - slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[6] += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 25, 26, 29, 28, 29 */ - nrg = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - nrg += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - nrg += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - nrg += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); - slotNrg[7] = nrg + ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); + slotNrg[7] = + nrg + ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); /* qs = 30 ... min(41,hybBands-1) */ - nrg = ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + nrg = ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); for (qs = 31; qs < hybBands; qs++) { - nrg += ((fPow2Div2((*pReal++) << maxValSF) + - fPow2Div2((*pImag++) << maxValSF)) >> - (SF_FACTOR_SLOT - 1)); + nrg += ((fPow2Div2((*pReal++) << maxValSF) >> (SF_FACTOR_SLOT - 1)) + + (fPow2Div2((*pImag++) << maxValSF) >> (SF_FACTOR_SLOT - 1))); } slotNrg[8] = nrg; } else { @@ -239,49 +223,22 @@ } } -static inline INT getMaxValDmx(FIXP_DBL *RESTRICT pReal, - FIXP_DBL *RESTRICT pImag, INT cplxBands, - INT hybBands) { - INT qs, clz; - FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); - - for (qs = 12; qs < cplxBands; qs++) { - maxVal |= fAbs(pReal[qs]); - maxVal |= fAbs(pImag[qs]); - } - for (; qs < hybBands; qs++) { - maxVal |= fAbs(pReal[qs]); - } - - clz = fixMax(0, CntLeadingZeros(maxVal) - 1); - - return (clz); -} - -static inline INT getMaxValDryWet(FIXP_DBL *RESTRICT pReal, - FIXP_DBL *RESTRICT pImag, - FIXP_DBL *RESTRICT pHybOutputRealDry, - FIXP_DBL *RESTRICT pHybOutputImagDry, - FIXP_DBL *RESTRICT pHybOutputRealWet, - FIXP_DBL *RESTRICT pHybOutputImagWet, - INT cplxBands, INT hybBands) { - INT qs, clz; - FIXP_DBL maxVal = FL2FXCONST_DBL(0.0f); +static inline void combineDryWet(FIXP_DBL *RESTRICT pReal, + FIXP_DBL *RESTRICT pImag, + FIXP_DBL *RESTRICT pHybOutputRealDry, + FIXP_DBL *RESTRICT pHybOutputImagDry, + FIXP_DBL *RESTRICT pHybOutputRealWet, + FIXP_DBL *RESTRICT pHybOutputImagWet, + INT cplxBands, INT hybBands) { + INT qs; for (qs = 12; qs < cplxBands; qs++) { - pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs]; - maxVal |= fAbs(pReal[qs]); - pImag[qs] = pHybOutputImagDry[qs] + pHybOutputImagWet[qs]; - maxVal |= fAbs(pImag[qs]); + pReal[qs] = (pHybOutputRealDry[qs] >> 1) + (pHybOutputRealWet[qs] >> 1); + pImag[qs] = (pHybOutputImagDry[qs] >> 1) + (pHybOutputImagWet[qs] >> 1); } for (; qs < hybBands; qs++) { - pReal[qs] = pHybOutputRealDry[qs] + pHybOutputRealWet[qs]; - maxVal |= fAbs(pReal[qs]); + pReal[qs] = (pHybOutputRealDry[qs] >> 1) + (pHybOutputRealWet[qs] >> 1); } - - clz = fixMax(0, CntLeadingZeros(maxVal) - 1); - - return (clz); } static inline void slotAmp(FIXP_DBL *RESTRICT slotAmp_dry, @@ -296,17 +253,17 @@ dry = wet = FL2FXCONST_DBL(0.0f); for (qs = 0; qs < cplxBands; qs++) { - dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs]) + - fPow2Div2(pHybOutputImagDry[qs])); - wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs]) + - fPow2Div2(pHybOutputImagWet[qs])); + dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs] << (1)) + + fPow2Div2(pHybOutputImagDry[qs] << (1))); + wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs] << (1)) + + fPow2Div2(pHybOutputImagWet[qs] << (1))); } for (; qs < hybBands; qs++) { - dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs])); - wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs])); + dry = fAddSaturate(dry, fPow2Div2(pHybOutputRealDry[qs] << (1))); + wet = fAddSaturate(wet, fPow2Div2(pHybOutputRealWet[qs] << (1))); } - *slotAmp_dry = dry; - *slotAmp_wet = wet; + *slotAmp_dry = dry >> (2 * (1)); + *slotAmp_wet = wet >> (2 * (1)); } #if defined(__aarch64__) @@ -327,11 +284,14 @@ } } else { for (qs = 0; qs < cplxBands; qs++) { - pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale; - pHybOutputImagDry[qs] = fMultDiv2(pHybOutputImagDry[qs], dryFac) << scale; + pHybOutputRealDry[qs] = SATURATE_LEFT_SHIFT( + fMultDiv2(pHybOutputRealDry[qs], dryFac), scale, DFRACT_BITS); + pHybOutputImagDry[qs] = SATURATE_LEFT_SHIFT( + fMultDiv2(pHybOutputImagDry[qs], dryFac), scale, DFRACT_BITS); } for (; qs < hybBands; qs++) { - pHybOutputRealDry[qs] = fMultDiv2(pHybOutputRealDry[qs], dryFac) << scale; + pHybOutputRealDry[qs] = SATURATE_LEFT_SHIFT( + fMultDiv2(pHybOutputRealDry[qs], dryFac), scale, DFRACT_BITS); } } } @@ -367,7 +327,7 @@ INT shapeActiv = 1; INT hybBands = fixMin(42, self->hybridBands); - INT staticScale = self->staticDecScale; + INT staticScale = self->staticDecScale + (1); INT cplxBands; cplxBands = fixMin(42, self->hybridBands); @@ -386,15 +346,18 @@ prevChOffs = ch; pReal = pScratchBuffer; pImag = pScratchBuffer + 42; - clz = getMaxValDryWet( - pReal, pImag, self->hybOutputRealDry__FDK[ch], - self->hybOutputImagDry__FDK[ch], self->hybOutputRealWet__FDK[ch], - self->hybOutputImagWet__FDK[ch], cplxBands, hybBands); + combineDryWet(pReal, pImag, self->hybOutputRealDry__FDK[ch], + self->hybOutputImagDry__FDK[ch], + self->hybOutputRealWet__FDK[ch], + self->hybOutputImagWet__FDK[ch], cplxBands, hybBands); + clz = fMin(getScalefactor(&pReal[12], fMax(0, hybBands - 12)), + getScalefactor(&pImag[12], fMax(0, cplxBands - 12))); } else { prevChOffs = ch + self->numOutputChannels; pReal = self->hybInputReal__FDK[ch]; pImag = self->hybInputImag__FDK[ch]; - clz = getMaxValDmx(pReal, pImag, cplxBands, hybBands); + clz = fMin(getScalefactor(&pReal[12], fMax(0, hybBands - 12)), + getScalefactor(&pImag[12], fMax(0, cplxBands - 12))); } partNrg = partNrgPrev = pBBEnvState->partNrgPrev__FDK[prevChOffs]; @@ -411,8 +374,10 @@ SF_FACTOR_SLOT */ } - slotNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT; - frameNrgSF = 2 * (staticScale - clz) + SF_FACTOR_SLOT; + slotNrgSF = 2 * (staticScale - clz + ((inp == INP_DRY_WET) ? 1 : 0)) + + SF_FACTOR_SLOT; + frameNrgSF = 2 * (staticScale - clz + ((inp == INP_DRY_WET) ? 1 : 0)) + + SF_FACTOR_SLOT; partNrgSF = fixMax(slotNrgSF - SF_ALPHA1 + 1, pPartNrgPrevSF[0] - pPartNrgPrev2SF[0] + 1); @@ -652,14 +617,16 @@ fixMax(3, fixMax(dryFacSF, slotAmpSF)); /* scale is at least with 3 bits to avoid overflows when calculating dryFac */ - dryFac = dryFac >> (scale - dryFacSF); - slotAmp_ratio = slotAmp_ratio >> (scale - slotAmpSF); + dryFac = dryFac >> fixMin(scale - dryFacSF, DFRACT_BITS - 1); + slotAmp_ratio = + slotAmp_ratio >> fixMin(scale - slotAmpSF, DFRACT_BITS - 1); /* limit dryFac */ dryFac = fixMax( FL2FXCONST_DBL(0.25f) >> (INT)fixMin(2 * scale, DFRACT_BITS - 1), - fMult(dryFac, slotAmp_ratio) - (slotAmp_ratio >> scale) + - (dryFac >> scale)); + fMult(dryFac, slotAmp_ratio) - + (slotAmp_ratio >> fixMin(scale, DFRACT_BITS - 1)) + + (dryFac >> fixMin(scale, DFRACT_BITS - 1))); dryFac = fixMin( FL2FXCONST_DBL(0.50f) >> (INT)fixMin(2 * scale - 3, DFRACT_BITS - 1), dryFac); /* reduce shift bits by 3, because upper @@ -673,8 +640,8 @@ /* shaping */ shapeBBEnv(&self->hybOutputRealDry__FDK[ch][6], - &self->hybOutputImagDry__FDK[ch][6], dryFac, scale, cplxBands, - hybBands); + &self->hybOutputImagDry__FDK[ch][6], dryFac, + fixMin(scale, DFRACT_BITS - 1), cplxBands, hybBands); } } } diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_rom.cpp fdk-aac-2.0.2/libSACdec/src/sac_rom.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_rom.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_rom.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -163,7 +163,7 @@ SCALE_IPD(4.71238898038469f), SCALE_IPD(5.105088062f), SCALE_IPD(5.49778714378214f), SCALE_IPD(5.890486225f)}; -#define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_CFG(a / (float)(1 << IPD_SCALE))) +#define SCALE_SPLIT_ANGLE(a) (FL2FXCONST_DBL(a / (float)(1 << IPD_SCALE))) /* Generate table dequantIPD_CLD_ICC_splitAngle__FDK[16][31][8]: @@ -200,6 +200,3758 @@ atan2(w2 * sinIpd, w1 * iidLin + w2 * cosIpd); } */ +const FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK[15][31][8] = { + { + {SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.39269909262657)}, + {SCALE_SPLIT_ANGLE(0.39055734872818), + SCALE_SPLIT_ANGLE(0.39055740833282), + SCALE_SPLIT_ANGLE(0.39055749773979), + SCALE_SPLIT_ANGLE(0.39055770635605), + SCALE_SPLIT_ANGLE(0.39055791497231), + SCALE_SPLIT_ANGLE(0.39055824279785), + SCALE_SPLIT_ANGLE(0.39055877923965), + SCALE_SPLIT_ANGLE(0.39055916666985)}, + {SCALE_SPLIT_ANGLE(0.38890451192856), + SCALE_SPLIT_ANGLE(0.38890469074249), + SCALE_SPLIT_ANGLE(0.38890495896339), + SCALE_SPLIT_ANGLE(0.38890564441681), + SCALE_SPLIT_ANGLE(0.38890630006790), + SCALE_SPLIT_ANGLE(0.38890734314919), + SCALE_SPLIT_ANGLE(0.38890904188156), + SCALE_SPLIT_ANGLE(0.38891020417213)}, + {SCALE_SPLIT_ANGLE(0.38599541783333), + SCALE_SPLIT_ANGLE(0.38599592447281), + SCALE_SPLIT_ANGLE(0.38599672913551), + SCALE_SPLIT_ANGLE(0.38599878549576), + SCALE_SPLIT_ANGLE(0.38600078225136), + SCALE_SPLIT_ANGLE(0.38600403070450), + SCALE_SPLIT_ANGLE(0.38600939512253), + SCALE_SPLIT_ANGLE(0.38601315021515)}, + {SCALE_SPLIT_ANGLE(0.38091576099396), + SCALE_SPLIT_ANGLE(0.38091731071472), + SCALE_SPLIT_ANGLE(0.38091966509819), + SCALE_SPLIT_ANGLE(0.38092571496964), + SCALE_SPLIT_ANGLE(0.38093179464340), + SCALE_SPLIT_ANGLE(0.38094165921211), + SCALE_SPLIT_ANGLE(0.38095843791962), + SCALE_SPLIT_ANGLE(0.38097056746483)}, + {SCALE_SPLIT_ANGLE(0.37216997146606), + SCALE_SPLIT_ANGLE(0.37217426300049), + SCALE_SPLIT_ANGLE(0.37218090891838), + SCALE_SPLIT_ANGLE(0.37219807505608), + SCALE_SPLIT_ANGLE(0.37221556901932), + SCALE_SPLIT_ANGLE(0.37224492430687), + SCALE_SPLIT_ANGLE(0.37229704856873), + SCALE_SPLIT_ANGLE(0.37233674526215)}, + {SCALE_SPLIT_ANGLE(0.36424967646599), + SCALE_SPLIT_ANGLE(0.36425727605820), + SCALE_SPLIT_ANGLE(0.36426907777786), + SCALE_SPLIT_ANGLE(0.36430004239082), + SCALE_SPLIT_ANGLE(0.36433213949203), + SCALE_SPLIT_ANGLE(0.36438730359077), + SCALE_SPLIT_ANGLE(0.36448970437050), + SCALE_SPLIT_ANGLE(0.36457163095474)}, + {SCALE_SPLIT_ANGLE(0.35356888175011), + SCALE_SPLIT_ANGLE(0.35358175635338), + SCALE_SPLIT_ANGLE(0.35360190272331), + SCALE_SPLIT_ANGLE(0.35365560650826), + SCALE_SPLIT_ANGLE(0.35371258854866), + SCALE_SPLIT_ANGLE(0.35381385684013), + SCALE_SPLIT_ANGLE(0.35401365160942), + SCALE_SPLIT_ANGLE(0.35418578982353)}, + {SCALE_SPLIT_ANGLE(0.33942583203316), + SCALE_SPLIT_ANGLE(0.33944645524025), + SCALE_SPLIT_ANGLE(0.33947896957397), + SCALE_SPLIT_ANGLE(0.33956742286682), + SCALE_SPLIT_ANGLE(0.33966416120529), + SCALE_SPLIT_ANGLE(0.33984372019768), + SCALE_SPLIT_ANGLE(0.34023007750511), + SCALE_SPLIT_ANGLE(0.34060221910477)}, + {SCALE_SPLIT_ANGLE(0.32115450501442), + SCALE_SPLIT_ANGLE(0.32118520140648), + SCALE_SPLIT_ANGLE(0.32123416662216), + SCALE_SPLIT_ANGLE(0.32137048244476), + SCALE_SPLIT_ANGLE(0.32152509689331), + SCALE_SPLIT_ANGLE(0.32182863354683), + SCALE_SPLIT_ANGLE(0.32256561517715), + SCALE_SPLIT_ANGLE(0.32340893149376)}, + {SCALE_SPLIT_ANGLE(0.29830521345139), + SCALE_SPLIT_ANGLE(0.29834723472595), + SCALE_SPLIT_ANGLE(0.29841500520706), + SCALE_SPLIT_ANGLE(0.29860860109329), + SCALE_SPLIT_ANGLE(0.29883742332458), + SCALE_SPLIT_ANGLE(0.29931786656380), + SCALE_SPLIT_ANGLE(0.30069106817245), + SCALE_SPLIT_ANGLE(0.30275771021843)}, + {SCALE_SPLIT_ANGLE(0.28050789237022), + SCALE_SPLIT_ANGLE(0.28055712580681), + SCALE_SPLIT_ANGLE(0.28063708543777), + SCALE_SPLIT_ANGLE(0.28086942434311), + SCALE_SPLIT_ANGLE(0.28115189075470), + SCALE_SPLIT_ANGLE(0.28177404403687), + SCALE_SPLIT_ANGLE(0.28380545973778), + SCALE_SPLIT_ANGLE(0.28782638907433)}, + {SCALE_SPLIT_ANGLE(0.26083287596703), + SCALE_SPLIT_ANGLE(0.26088824868202), + SCALE_SPLIT_ANGLE(0.26097872853279), + SCALE_SPLIT_ANGLE(0.26124578714371), + SCALE_SPLIT_ANGLE(0.26157897710800), + SCALE_SPLIT_ANGLE(0.26234793663025), + SCALE_SPLIT_ANGLE(0.26525345444679), + SCALE_SPLIT_ANGLE(0.27373576164246)}, + {SCALE_SPLIT_ANGLE(0.23960022628307), + SCALE_SPLIT_ANGLE(0.23966011404991), + SCALE_SPLIT_ANGLE(0.23975846171379), + SCALE_SPLIT_ANGLE(0.24005253612995), + SCALE_SPLIT_ANGLE(0.24042735993862), + SCALE_SPLIT_ANGLE(0.24132782220840), + SCALE_SPLIT_ANGLE(0.24525125324726), + SCALE_SPLIT_ANGLE(0.26534587144852)}, + {SCALE_SPLIT_ANGLE(0.21727463603020), + SCALE_SPLIT_ANGLE(0.21733720600605), + SCALE_SPLIT_ANGLE(0.21744030714035), + SCALE_SPLIT_ANGLE(0.21775111556053), + SCALE_SPLIT_ANGLE(0.21815299987793), + SCALE_SPLIT_ANGLE(0.21914559602737), + SCALE_SPLIT_ANGLE(0.22397418320179), + SCALE_SPLIT_ANGLE(0.27997341752052)}, + {SCALE_SPLIT_ANGLE(0.19442924857140), + SCALE_SPLIT_ANGLE(0.19449260830879), + SCALE_SPLIT_ANGLE(0.19459712505341), + SCALE_SPLIT_ANGLE(0.19491320848465), + SCALE_SPLIT_ANGLE(0.19532410800457), + SCALE_SPLIT_ANGLE(0.19634956121445), + SCALE_SPLIT_ANGLE(0.20156545937061), + SCALE_SPLIT_ANGLE(0.33650875091553)}, + {SCALE_SPLIT_ANGLE(0.17168679833412), + SCALE_SPLIT_ANGLE(0.17174908518791), + SCALE_SPLIT_ANGLE(0.17185173928738), + SCALE_SPLIT_ANGLE(0.17216140031815), + SCALE_SPLIT_ANGLE(0.17256212234497), + SCALE_SPLIT_ANGLE(0.17355351150036), + SCALE_SPLIT_ANGLE(0.17841057479382), + SCALE_SPLIT_ANGLE(0.23922468721867)}, + {SCALE_SPLIT_ANGLE(0.14965108036995), + SCALE_SPLIT_ANGLE(0.14971046149731), + SCALE_SPLIT_ANGLE(0.14980803430080), + SCALE_SPLIT_ANGLE(0.15010002255440), + SCALE_SPLIT_ANGLE(0.15047283470631), + SCALE_SPLIT_ANGLE(0.15137128531933), + SCALE_SPLIT_ANGLE(0.15533345937729), + SCALE_SPLIT_ANGLE(0.17691856622696)}, + {SCALE_SPLIT_ANGLE(0.12884500622749), + SCALE_SPLIT_ANGLE(0.12889973819256), + SCALE_SPLIT_ANGLE(0.12898921966553), + SCALE_SPLIT_ANGLE(0.12925371527672), + SCALE_SPLIT_ANGLE(0.12958450615406), + SCALE_SPLIT_ANGLE(0.13035117089748), + SCALE_SPLIT_ANGLE(0.13329000771046), + SCALE_SPLIT_ANGLE(0.14226883649826)}, + {SCALE_SPLIT_ANGLE(0.10966771841049), + SCALE_SPLIT_ANGLE(0.10971628874540), + SCALE_SPLIT_ANGLE(0.10979522019625), + SCALE_SPLIT_ANGLE(0.11002497375011), + SCALE_SPLIT_ANGLE(0.11030506342649), + SCALE_SPLIT_ANGLE(0.11092507839203), + SCALE_SPLIT_ANGLE(0.11297956109047), + SCALE_SPLIT_ANGLE(0.11718676239252)}, + {SCALE_SPLIT_ANGLE(0.09237616509199), + SCALE_SPLIT_ANGLE(0.09241759032011), + SCALE_SPLIT_ANGLE(0.09248441457748), + SCALE_SPLIT_ANGLE(0.09267570823431), + SCALE_SPLIT_ANGLE(0.09290253371000), + SCALE_SPLIT_ANGLE(0.09338124841452), + SCALE_SPLIT_ANGLE(0.09476862102747), + SCALE_SPLIT_ANGLE(0.09691140055656)}, + {SCALE_SPLIT_ANGLE(0.07020132243633), + SCALE_SPLIT_ANGLE(0.07023159414530), + SCALE_SPLIT_ANGLE(0.07027988880873), + SCALE_SPLIT_ANGLE(0.07041462510824), + SCALE_SPLIT_ANGLE(0.07056795060635), + SCALE_SPLIT_ANGLE(0.07087047398090), + SCALE_SPLIT_ANGLE(0.07161350548267), + SCALE_SPLIT_ANGLE(0.07247893512249)}, + {SCALE_SPLIT_ANGLE(0.05244029685855), + SCALE_SPLIT_ANGLE(0.05246063694358), + SCALE_SPLIT_ANGLE(0.05249277502298), + SCALE_SPLIT_ANGLE(0.05258031934500), + SCALE_SPLIT_ANGLE(0.05267634987831), + SCALE_SPLIT_ANGLE(0.05285539478064), + SCALE_SPLIT_ANGLE(0.05324416980147), + SCALE_SPLIT_ANGLE(0.05362326279283)}, + {SCALE_SPLIT_ANGLE(0.03864165768027), + SCALE_SPLIT_ANGLE(0.03865439072251), + SCALE_SPLIT_ANGLE(0.03867433592677), + SCALE_SPLIT_ANGLE(0.03872758522630), + SCALE_SPLIT_ANGLE(0.03878424316645), + SCALE_SPLIT_ANGLE(0.03888526186347), + SCALE_SPLIT_ANGLE(0.03908598423004), + SCALE_SPLIT_ANGLE(0.03926040604711)}, + {SCALE_SPLIT_ANGLE(0.02817477472126), + SCALE_SPLIT_ANGLE(0.02818230912089), + SCALE_SPLIT_ANGLE(0.02819401398301), + SCALE_SPLIT_ANGLE(0.02822477556765), + SCALE_SPLIT_ANGLE(0.02825673110783), + SCALE_SPLIT_ANGLE(0.02831180393696), + SCALE_SPLIT_ANGLE(0.02841453813016), + SCALE_SPLIT_ANGLE(0.02849725075066)}, + {SCALE_SPLIT_ANGLE(0.02037953026593), + SCALE_SPLIT_ANGLE(0.02038379199803), + SCALE_SPLIT_ANGLE(0.02039037831128), + SCALE_SPLIT_ANGLE(0.02040746994317), + SCALE_SPLIT_ANGLE(0.02042490243912), + SCALE_SPLIT_ANGLE(0.02045420184731), + SCALE_SPLIT_ANGLE(0.02050646767020), + SCALE_SPLIT_ANGLE(0.02054644003510)}, + {SCALE_SPLIT_ANGLE(0.01173160225153), + SCALE_SPLIT_ANGLE(0.01173313986510), + SCALE_SPLIT_ANGLE(0.01173550263047), + SCALE_SPLIT_ANGLE(0.01174154505134), + SCALE_SPLIT_ANGLE(0.01174758374691), + SCALE_SPLIT_ANGLE(0.01175745483488), + SCALE_SPLIT_ANGLE(0.01177425310016), + SCALE_SPLIT_ANGLE(0.01178644131869)}, + {SCALE_SPLIT_ANGLE(0.00668647512794), + SCALE_SPLIT_ANGLE(0.00668699946254), + SCALE_SPLIT_ANGLE(0.00668780272827), + SCALE_SPLIT_ANGLE(0.00668983906507), + SCALE_SPLIT_ANGLE(0.00669185025617), + SCALE_SPLIT_ANGLE(0.00669508520514), + SCALE_SPLIT_ANGLE(0.00670044543222), + SCALE_SPLIT_ANGLE(0.00670422753319)}, + {SCALE_SPLIT_ANGLE(0.00378898042254), + SCALE_SPLIT_ANGLE(0.00378915388137), + SCALE_SPLIT_ANGLE(0.00378941884264), + SCALE_SPLIT_ANGLE(0.00379008660093), + SCALE_SPLIT_ANGLE(0.00379074062221), + SCALE_SPLIT_ANGLE(0.00379178463481), + SCALE_SPLIT_ANGLE(0.00379348872229), + SCALE_SPLIT_ANGLE(0.00379467196763)}, + {SCALE_SPLIT_ANGLE(0.00213995971717), + SCALE_SPLIT_ANGLE(0.00214001606219), + SCALE_SPLIT_ANGLE(0.00214010174386), + SCALE_SPLIT_ANGLE(0.00214031711221), + SCALE_SPLIT_ANGLE(0.00214052735828), + SCALE_SPLIT_ANGLE(0.00214086147025), + SCALE_SPLIT_ANGLE(0.00214140163735), + SCALE_SPLIT_ANGLE(0.00214177416638)}, + {SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151)}, + }, + { + {SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850), + SCALE_SPLIT_ANGLE(0.78539812564850)}, + {SCALE_SPLIT_ANGLE(0.78143113851547), + SCALE_SPLIT_ANGLE(0.78143155574799), + SCALE_SPLIT_ANGLE(0.78143215179443), + SCALE_SPLIT_ANGLE(0.78143370151520), + SCALE_SPLIT_ANGLE(0.78143519163132), + SCALE_SPLIT_ANGLE(0.78143757581711), + SCALE_SPLIT_ANGLE(0.78144145011902), + SCALE_SPLIT_ANGLE(0.78144407272339)}, + {SCALE_SPLIT_ANGLE(0.77835679054260), + SCALE_SPLIT_ANGLE(0.77835804224014), + SCALE_SPLIT_ANGLE(0.77835988998413), + SCALE_SPLIT_ANGLE(0.77836471796036), + SCALE_SPLIT_ANGLE(0.77836942672729), + SCALE_SPLIT_ANGLE(0.77837687730789), + SCALE_SPLIT_ANGLE(0.77838897705078), + SCALE_SPLIT_ANGLE(0.77839738130569)}, + {SCALE_SPLIT_ANGLE(0.77291858196259), + SCALE_SPLIT_ANGLE(0.77292239665985), + SCALE_SPLIT_ANGLE(0.77292817831039), + SCALE_SPLIT_ANGLE(0.77294290065765), + SCALE_SPLIT_ANGLE(0.77295738458633), + SCALE_SPLIT_ANGLE(0.77298063039780), + SCALE_SPLIT_ANGLE(0.77301889657974), + SCALE_SPLIT_ANGLE(0.77304571866989)}, + {SCALE_SPLIT_ANGLE(0.76334190368652), + SCALE_SPLIT_ANGLE(0.76335322856903), + SCALE_SPLIT_ANGLE(0.76337057352066), + SCALE_SPLIT_ANGLE(0.76341474056244), + SCALE_SPLIT_ANGLE(0.76345866918564), + SCALE_SPLIT_ANGLE(0.76353001594543), + SCALE_SPLIT_ANGLE(0.76365023851395), + SCALE_SPLIT_ANGLE(0.76373648643494)}, + {SCALE_SPLIT_ANGLE(0.74662178754807), + SCALE_SPLIT_ANGLE(0.74665385484695), + SCALE_SPLIT_ANGLE(0.74670320749283), + SCALE_SPLIT_ANGLE(0.74683058261871), + SCALE_SPLIT_ANGLE(0.74695950746536), + SCALE_SPLIT_ANGLE(0.74717390537262), + SCALE_SPLIT_ANGLE(0.74754953384399), + SCALE_SPLIT_ANGLE(0.74783092737198)}, + {SCALE_SPLIT_ANGLE(0.73124057054520), + SCALE_SPLIT_ANGLE(0.73129826784134), + SCALE_SPLIT_ANGLE(0.73138761520386), + SCALE_SPLIT_ANGLE(0.73162078857422), + SCALE_SPLIT_ANGLE(0.73186045885086), + SCALE_SPLIT_ANGLE(0.73226773738861), + SCALE_SPLIT_ANGLE(0.73300832509995), + SCALE_SPLIT_ANGLE(0.73358738422394)}, + {SCALE_SPLIT_ANGLE(0.71016556024551), + SCALE_SPLIT_ANGLE(0.71026545763016), + SCALE_SPLIT_ANGLE(0.71042120456696), + SCALE_SPLIT_ANGLE(0.71083343029022), + SCALE_SPLIT_ANGLE(0.71126621961594), + SCALE_SPLIT_ANGLE(0.71202337741852), + SCALE_SPLIT_ANGLE(0.71347540616989), + SCALE_SPLIT_ANGLE(0.71468448638916)}, + {SCALE_SPLIT_ANGLE(0.68173062801361), + SCALE_SPLIT_ANGLE(0.68189471960068), + SCALE_SPLIT_ANGLE(0.68215268850327), + SCALE_SPLIT_ANGLE(0.68284785747528), + SCALE_SPLIT_ANGLE(0.68359774351120), + SCALE_SPLIT_ANGLE(0.68496215343475), + SCALE_SPLIT_ANGLE(0.68778359889984), + SCALE_SPLIT_ANGLE(0.69036644697189)}, + {SCALE_SPLIT_ANGLE(0.64424294233322), + SCALE_SPLIT_ANGLE(0.64449471235275), + SCALE_SPLIT_ANGLE(0.64489430189133), + SCALE_SPLIT_ANGLE(0.64599478244781), + SCALE_SPLIT_ANGLE(0.64722269773483), + SCALE_SPLIT_ANGLE(0.64957273006439), + SCALE_SPLIT_ANGLE(0.65497380495071), + SCALE_SPLIT_ANGLE(0.66069257259369)}, + {SCALE_SPLIT_ANGLE(0.59645885229111), + SCALE_SPLIT_ANGLE(0.59681373834610), + SCALE_SPLIT_ANGLE(0.59738290309906), + SCALE_SPLIT_ANGLE(0.59898978471756), + SCALE_SPLIT_ANGLE(0.60085380077362), + SCALE_SPLIT_ANGLE(0.60464859008789), + SCALE_SPLIT_ANGLE(0.61471658945084), + SCALE_SPLIT_ANGLE(0.62811440229416)}, + {SCALE_SPLIT_ANGLE(0.55878311395645), + SCALE_SPLIT_ANGLE(0.55920600891113), + SCALE_SPLIT_ANGLE(0.55988913774490), + SCALE_SPLIT_ANGLE(0.56185030937195), + SCALE_SPLIT_ANGLE(0.56418746709824), + SCALE_SPLIT_ANGLE(0.56916546821594), + SCALE_SPLIT_ANGLE(0.58402228355408), + SCALE_SPLIT_ANGLE(0.60877442359924)}, + {SCALE_SPLIT_ANGLE(0.51690864562988), + SCALE_SPLIT_ANGLE(0.51739054918289), + SCALE_SPLIT_ANGLE(0.51817405223846), + SCALE_SPLIT_ANGLE(0.52045875787735), + SCALE_SPLIT_ANGLE(0.52325224876404), + SCALE_SPLIT_ANGLE(0.52947413921356), + SCALE_SPLIT_ANGLE(0.55062562227249), + SCALE_SPLIT_ANGLE(0.59875661134720)}, + {SCALE_SPLIT_ANGLE(0.47171193361282), + SCALE_SPLIT_ANGLE(0.47223743796349), + SCALE_SPLIT_ANGLE(0.47309640049934), + SCALE_SPLIT_ANGLE(0.47563400864601), + SCALE_SPLIT_ANGLE(0.47880488634109), + SCALE_SPLIT_ANGLE(0.48615166544914), + SCALE_SPLIT_ANGLE(0.51456981897354), + SCALE_SPLIT_ANGLE(0.61478358507156)}, + {SCALE_SPLIT_ANGLE(0.42445337772369), + SCALE_SPLIT_ANGLE(0.42500329017639), + SCALE_SPLIT_ANGLE(0.42590543627739), + SCALE_SPLIT_ANGLE(0.42859473824501), + SCALE_SPLIT_ANGLE(0.43200695514679), + SCALE_SPLIT_ANGLE(0.44014197587967), + SCALE_SPLIT_ANGLE(0.47505444288254), + SCALE_SPLIT_ANGLE(0.70435541868210)}, + {SCALE_SPLIT_ANGLE(0.37662339210510), + SCALE_SPLIT_ANGLE(0.37717753648758), + SCALE_SPLIT_ANGLE(0.37808802723885), + SCALE_SPLIT_ANGLE(0.38081303238869), + SCALE_SPLIT_ANGLE(0.38429373502731), + SCALE_SPLIT_ANGLE(0.39269909262657), + SCALE_SPLIT_ANGLE(0.43061128258705), + SCALE_SPLIT_ANGLE(0.89949643611908)}, + {SCALE_SPLIT_ANGLE(0.32972764968872), + SCALE_SPLIT_ANGLE(0.33026659488678), + SCALE_SPLIT_ANGLE(0.33115157485008), + SCALE_SPLIT_ANGLE(0.33379590511322), + SCALE_SPLIT_ANGLE(0.33716440200806), + SCALE_SPLIT_ANGLE(0.34525617957115), + SCALE_SPLIT_ANGLE(0.38098797202110), + SCALE_SPLIT_ANGLE(0.66312330961227)}, + {SCALE_SPLIT_ANGLE(0.28508263826370), + SCALE_SPLIT_ANGLE(0.28558859229088), + SCALE_SPLIT_ANGLE(0.28641715645790), + SCALE_SPLIT_ANGLE(0.28887593746185), + SCALE_SPLIT_ANGLE(0.29197177290916), + SCALE_SPLIT_ANGLE(0.29924646019936), + SCALE_SPLIT_ANGLE(0.32879719138145), + SCALE_SPLIT_ANGLE(0.45467028021812)}, + {SCALE_SPLIT_ANGLE(0.24368345737457), + SCALE_SPLIT_ANGLE(0.24414120614529), + SCALE_SPLIT_ANGLE(0.24488738179207), + SCALE_SPLIT_ANGLE(0.24707712233067), + SCALE_SPLIT_ANGLE(0.24978286027908), + SCALE_SPLIT_ANGLE(0.25592401623726), + SCALE_SPLIT_ANGLE(0.27806487679482), + SCALE_SPLIT_ANGLE(0.33706206083298)}, + {SCALE_SPLIT_ANGLE(0.20616286993027), + SCALE_SPLIT_ANGLE(0.20656119287014), + SCALE_SPLIT_ANGLE(0.20720668137074), + SCALE_SPLIT_ANGLE(0.20907410979271), + SCALE_SPLIT_ANGLE(0.21132774651051), + SCALE_SPLIT_ANGLE(0.21623271703720), + SCALE_SPLIT_ANGLE(0.23177997767925), + SCALE_SPLIT_ANGLE(0.26115790009499)}, + {SCALE_SPLIT_ANGLE(0.17282110452652), + SCALE_SPLIT_ANGLE(0.17315416038036), + SCALE_SPLIT_ANGLE(0.17369024455547), + SCALE_SPLIT_ANGLE(0.17521673440933), + SCALE_SPLIT_ANGLE(0.17701178789139), + SCALE_SPLIT_ANGLE(0.18074953556061), + SCALE_SPLIT_ANGLE(0.19124270975590), + SCALE_SPLIT_ANGLE(0.20666223764420)}, + {SCALE_SPLIT_ANGLE(0.13066084682941), + SCALE_SPLIT_ANGLE(0.13089758157730), + SCALE_SPLIT_ANGLE(0.13127475976944), + SCALE_SPLIT_ANGLE(0.13232271373272), + SCALE_SPLIT_ANGLE(0.13350808620453), + SCALE_SPLIT_ANGLE(0.13582544028759), + SCALE_SPLIT_ANGLE(0.14140741527081), + SCALE_SPLIT_ANGLE(0.14774028956890)}, + {SCALE_SPLIT_ANGLE(0.09729286283255), + SCALE_SPLIT_ANGLE(0.09744835644960), + SCALE_SPLIT_ANGLE(0.09769364446402), + SCALE_SPLIT_ANGLE(0.09835994243622), + SCALE_SPLIT_ANGLE(0.09908767789602), + SCALE_SPLIT_ANGLE(0.10043603181839), + SCALE_SPLIT_ANGLE(0.10332850366831), + SCALE_SPLIT_ANGLE(0.10610697418451)}, + {SCALE_SPLIT_ANGLE(0.07155895978212), + SCALE_SPLIT_ANGLE(0.07165451347828), + SCALE_SPLIT_ANGLE(0.07180397957563), + SCALE_SPLIT_ANGLE(0.07220225036144), + SCALE_SPLIT_ANGLE(0.07262472063303), + SCALE_SPLIT_ANGLE(0.07337479293346), + SCALE_SPLIT_ANGLE(0.07485356926918), + SCALE_SPLIT_ANGLE(0.07612708956003)}, + {SCALE_SPLIT_ANGLE(0.05212157219648), + SCALE_SPLIT_ANGLE(0.05217727646232), + SCALE_SPLIT_ANGLE(0.05226379260421), + SCALE_SPLIT_ANGLE(0.05249078199267), + SCALE_SPLIT_ANGLE(0.05272606015205), + SCALE_SPLIT_ANGLE(0.05313042178750), + SCALE_SPLIT_ANGLE(0.05388085916638), + SCALE_SPLIT_ANGLE(0.05448162183166)}, + {SCALE_SPLIT_ANGLE(0.03767965734005), + SCALE_SPLIT_ANGLE(0.03771083429456), + SCALE_SPLIT_ANGLE(0.03775899112225), + SCALE_SPLIT_ANGLE(0.03788382932544), + SCALE_SPLIT_ANGLE(0.03801096230745), + SCALE_SPLIT_ANGLE(0.03822423517704), + SCALE_SPLIT_ANGLE(0.03860339149833), + SCALE_SPLIT_ANGLE(0.03889226913452)}, + {SCALE_SPLIT_ANGLE(0.02168158628047), + SCALE_SPLIT_ANGLE(0.02169270813465), + SCALE_SPLIT_ANGLE(0.02170977368951), + SCALE_SPLIT_ANGLE(0.02175341546535), + SCALE_SPLIT_ANGLE(0.02179697528481), + SCALE_SPLIT_ANGLE(0.02186812832952), + SCALE_SPLIT_ANGLE(0.02198898419738), + SCALE_SPLIT_ANGLE(0.02207652665675)}, + {SCALE_SPLIT_ANGLE(0.01235581003129), + SCALE_SPLIT_ANGLE(0.01235957816243), + SCALE_SPLIT_ANGLE(0.01236534118652), + SCALE_SPLIT_ANGLE(0.01237995270640), + SCALE_SPLIT_ANGLE(0.01239436585456), + SCALE_SPLIT_ANGLE(0.01241754554212), + SCALE_SPLIT_ANGLE(0.01245592255145), + SCALE_SPLIT_ANGLE(0.01248296815902)}, + {SCALE_SPLIT_ANGLE(0.00700127054006), + SCALE_SPLIT_ANGLE(0.00700251059607), + SCALE_SPLIT_ANGLE(0.00700440211222), + SCALE_SPLIT_ANGLE(0.00700917327777), + SCALE_SPLIT_ANGLE(0.00701385037974), + SCALE_SPLIT_ANGLE(0.00702130328864), + SCALE_SPLIT_ANGLE(0.00703346775845), + SCALE_SPLIT_ANGLE(0.00704190973192)}, + {SCALE_SPLIT_ANGLE(0.00395415630192), + SCALE_SPLIT_ANGLE(0.00395455770195), + SCALE_SPLIT_ANGLE(0.00395516818389), + SCALE_SPLIT_ANGLE(0.00395670533180), + SCALE_SPLIT_ANGLE(0.00395820522681), + SCALE_SPLIT_ANGLE(0.00396058429033), + SCALE_SPLIT_ANGLE(0.00396443530917), + SCALE_SPLIT_ANGLE(0.00396708538756)}, + {SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.17809724807739)}, + {SCALE_SPLIT_ANGLE(1.17289519309998), + SCALE_SPLIT_ANGLE(1.17289638519287), + SCALE_SPLIT_ANGLE(1.17289805412292), + SCALE_SPLIT_ANGLE(1.17290234565735), + SCALE_SPLIT_ANGLE(1.17290651798248), + SCALE_SPLIT_ANGLE(1.17291307449341), + SCALE_SPLIT_ANGLE(1.17292368412018), + SCALE_SPLIT_ANGLE(1.17293095588684)}, + {SCALE_SPLIT_ANGLE(1.16883802413940), + SCALE_SPLIT_ANGLE(1.16884148120880), + SCALE_SPLIT_ANGLE(1.16884684562683), + SCALE_SPLIT_ANGLE(1.16886019706726), + SCALE_SPLIT_ANGLE(1.16887319087982), + SCALE_SPLIT_ANGLE(1.16889393329620), + SCALE_SPLIT_ANGLE(1.16892755031586), + SCALE_SPLIT_ANGLE(1.16895067691803)}, + {SCALE_SPLIT_ANGLE(1.16160655021667), + SCALE_SPLIT_ANGLE(1.16161727905273), + SCALE_SPLIT_ANGLE(1.16163372993469), + SCALE_SPLIT_ANGLE(1.16167509555817), + SCALE_SPLIT_ANGLE(1.16171574592590), + SCALE_SPLIT_ANGLE(1.16178059577942), + SCALE_SPLIT_ANGLE(1.16188669204712), + SCALE_SPLIT_ANGLE(1.16196048259735)}, + {SCALE_SPLIT_ANGLE(1.14870405197144), + SCALE_SPLIT_ANGLE(1.14873659610748), + SCALE_SPLIT_ANGLE(1.14878630638123), + SCALE_SPLIT_ANGLE(1.14891266822815), + SCALE_SPLIT_ANGLE(1.14903748035431), + SCALE_SPLIT_ANGLE(1.14923894405365), + SCALE_SPLIT_ANGLE(1.14957404136658), + SCALE_SPLIT_ANGLE(1.14981138706207)}, + {SCALE_SPLIT_ANGLE(1.12567496299744), + SCALE_SPLIT_ANGLE(1.12576997280121), + SCALE_SPLIT_ANGLE(1.12591612339020), + SCALE_SPLIT_ANGLE(1.12629067897797), + SCALE_SPLIT_ANGLE(1.12666594982147), + SCALE_SPLIT_ANGLE(1.12728190422058), + SCALE_SPLIT_ANGLE(1.12833762168884), + SCALE_SPLIT_ANGLE(1.12910997867584)}, + {SCALE_SPLIT_ANGLE(1.10394382476807), + SCALE_SPLIT_ANGLE(1.10412001609802), + SCALE_SPLIT_ANGLE(1.10439181327820), + SCALE_SPLIT_ANGLE(1.10509443283081), + SCALE_SPLIT_ANGLE(1.10580694675446), + SCALE_SPLIT_ANGLE(1.10699594020844), + SCALE_SPLIT_ANGLE(1.10909199714661), + SCALE_SPLIT_ANGLE(1.11067581176758)}, + {SCALE_SPLIT_ANGLE(1.07335853576660), + SCALE_SPLIT_ANGLE(1.07367515563965), + SCALE_SPLIT_ANGLE(1.07416594028473), + SCALE_SPLIT_ANGLE(1.07544887065887), + SCALE_SPLIT_ANGLE(1.07677161693573), + SCALE_SPLIT_ANGLE(1.07902932167053), + SCALE_SPLIT_ANGLE(1.08317446708679), + SCALE_SPLIT_ANGLE(1.08645892143250)}, + {SCALE_SPLIT_ANGLE(1.03070926666260), + SCALE_SPLIT_ANGLE(1.03125381469727), + SCALE_SPLIT_ANGLE(1.03210365772247), + SCALE_SPLIT_ANGLE(1.03435742855072), + SCALE_SPLIT_ANGLE(1.03673219680786), + SCALE_SPLIT_ANGLE(1.04091238975525), + SCALE_SPLIT_ANGLE(1.04904520511627), + SCALE_SPLIT_ANGLE(1.05597066879272)}, + {SCALE_SPLIT_ANGLE(0.97233027219772), + SCALE_SPLIT_ANGLE(0.97321176528931), + SCALE_SPLIT_ANGLE(0.97459858655930), + SCALE_SPLIT_ANGLE(0.97834444046021), + SCALE_SPLIT_ANGLE(0.98240250349045), + SCALE_SPLIT_ANGLE(0.98984360694885), + SCALE_SPLIT_ANGLE(1.00556409358978), + SCALE_SPLIT_ANGLE(1.02053046226501)}, + {SCALE_SPLIT_ANGLE(0.89506644010544), + SCALE_SPLIT_ANGLE(0.89638090133667), + SCALE_SPLIT_ANGLE(0.89846849441528), + SCALE_SPLIT_ANGLE(0.90423041582108), + SCALE_SPLIT_ANGLE(0.91068577766418), + SCALE_SPLIT_ANGLE(0.92315071821213), + SCALE_SPLIT_ANGLE(0.95268243551254), + SCALE_SPLIT_ANGLE(0.98626506328583)}, + {SCALE_SPLIT_ANGLE(0.83257329463959), + SCALE_SPLIT_ANGLE(0.83419400453568), + SCALE_SPLIT_ANGLE(0.83678525686264), + SCALE_SPLIT_ANGLE(0.84404885768890), + SCALE_SPLIT_ANGLE(0.85238879919052), + SCALE_SPLIT_ANGLE(0.86914122104645), + SCALE_SPLIT_ANGLE(0.91285765171051), + SCALE_SPLIT_ANGLE(0.97222852706909)}, + {SCALE_SPLIT_ANGLE(0.76227337121964), + SCALE_SPLIT_ANGLE(0.76417022943497), + SCALE_SPLIT_ANGLE(0.76722234487534), + SCALE_SPLIT_ANGLE(0.77590966224670), + SCALE_SPLIT_ANGLE(0.78613227605820), + SCALE_SPLIT_ANGLE(0.80752640962601), + SCALE_SPLIT_ANGLE(0.86987829208374), + SCALE_SPLIT_ANGLE(0.97863066196442)}, + {SCALE_SPLIT_ANGLE(0.68631619215012), + SCALE_SPLIT_ANGLE(0.68841683864594), + SCALE_SPLIT_ANGLE(0.69181632995605), + SCALE_SPLIT_ANGLE(0.70162522792816), + SCALE_SPLIT_ANGLE(0.71342813968658), + SCALE_SPLIT_ANGLE(0.73910331726074), + SCALE_SPLIT_ANGLE(0.82307606935501), + SCALE_SPLIT_ANGLE(1.03223013877869)}, + {SCALE_SPLIT_ANGLE(0.60781323909760), + SCALE_SPLIT_ANGLE(0.61001545190811), + SCALE_SPLIT_ANGLE(0.61359488964081), + SCALE_SPLIT_ANGLE(0.62403196096420), + SCALE_SPLIT_ANGLE(0.63681113719940), + SCALE_SPLIT_ANGLE(0.66548818349838), + SCALE_SPLIT_ANGLE(0.76931142807007), + SCALE_SPLIT_ANGLE(1.19638144969940)}, + {SCALE_SPLIT_ANGLE(0.53021633625031), + SCALE_SPLIT_ANGLE(0.53240889310837), + SCALE_SPLIT_ANGLE(0.53598147630692), + SCALE_SPLIT_ANGLE(0.54646170139313), + SCALE_SPLIT_ANGLE(0.55942362546921), + SCALE_SPLIT_ANGLE(0.58904862403870), + SCALE_SPLIT_ANGLE(0.70326197147369), + SCALE_SPLIT_ANGLE(1.46822571754456)}, + {SCALE_SPLIT_ANGLE(0.45655798912048), + SCALE_SPLIT_ANGLE(0.45864027738571), + SCALE_SPLIT_ANGLE(0.46203431487083), + SCALE_SPLIT_ANGLE(0.47199890017509), + SCALE_SPLIT_ANGLE(0.48433950543404), + SCALE_SPLIT_ANGLE(0.51260900497437), + SCALE_SPLIT_ANGLE(0.62212866544724), + SCALE_SPLIT_ANGLE(1.20720028877258)}, + {SCALE_SPLIT_ANGLE(0.38893291354179), + SCALE_SPLIT_ANGLE(0.39082619547844), + SCALE_SPLIT_ANGLE(0.39390671253204), + SCALE_SPLIT_ANGLE(0.40291145443916), + SCALE_SPLIT_ANGLE(0.41398161649704), + SCALE_SPLIT_ANGLE(0.43899387121201), + SCALE_SPLIT_ANGLE(0.53091615438461), + SCALE_SPLIT_ANGLE(0.85221332311630)}, + {SCALE_SPLIT_ANGLE(0.32840186357498), + SCALE_SPLIT_ANGLE(0.33005380630493), + SCALE_SPLIT_ANGLE(0.33273181319237), + SCALE_SPLIT_ANGLE(0.34049156308174), + SCALE_SPLIT_ANGLE(0.34989202022552), + SCALE_SPLIT_ANGLE(0.37057083845139), + SCALE_SPLIT_ANGLE(0.43990376591682), + SCALE_SPLIT_ANGLE(0.60593068599701)}, + {SCALE_SPLIT_ANGLE(0.27521029114723), + SCALE_SPLIT_ANGLE(0.27659532427788), + SCALE_SPLIT_ANGLE(0.27882957458496), + SCALE_SPLIT_ANGLE(0.28522574901581), + SCALE_SPLIT_ANGLE(0.29282194375992), + SCALE_SPLIT_ANGLE(0.30895602703094), + SCALE_SPLIT_ANGLE(0.35752716660500), + SCALE_SPLIT_ANGLE(0.44366976618767)}, + {SCALE_SPLIT_ANGLE(0.22909799218178), + SCALE_SPLIT_ANGLE(0.23021572828293), + SCALE_SPLIT_ANGLE(0.23200811445713), + SCALE_SPLIT_ANGLE(0.23706816136837), + SCALE_SPLIT_ANGLE(0.24294251203537), + SCALE_SPLIT_ANGLE(0.25494652986526), + SCALE_SPLIT_ANGLE(0.28743273019791), + SCALE_SPLIT_ANGLE(0.33326253294945)}, + {SCALE_SPLIT_ANGLE(0.17204397916794), + SCALE_SPLIT_ANGLE(0.17280195653439), + SCALE_SPLIT_ANGLE(0.17400608956814), + SCALE_SPLIT_ANGLE(0.17733128368855), + SCALE_SPLIT_ANGLE(0.18105845153332), + SCALE_SPLIT_ANGLE(0.18825364112854), + SCALE_SPLIT_ANGLE(0.20519739389420), + SCALE_SPLIT_ANGLE(0.22397252917290)}, + {SCALE_SPLIT_ANGLE(0.12763081490994), + SCALE_SPLIT_ANGLE(0.12810991704464), + SCALE_SPLIT_ANGLE(0.12886413931847), + SCALE_SPLIT_ANGLE(0.13090407848358), + SCALE_SPLIT_ANGLE(0.13311788439751), + SCALE_SPLIT_ANGLE(0.13718488812447), + SCALE_SPLIT_ANGLE(0.14578336477280), + SCALE_SPLIT_ANGLE(0.15392093360424)}, + {SCALE_SPLIT_ANGLE(0.09368771314621), + SCALE_SPLIT_ANGLE(0.09397350251675), + SCALE_SPLIT_ANGLE(0.09441984444857), + SCALE_SPLIT_ANGLE(0.09560553729534), + SCALE_SPLIT_ANGLE(0.09685769677162), + SCALE_SPLIT_ANGLE(0.09906788915396), + SCALE_SPLIT_ANGLE(0.10338338464499), + SCALE_SPLIT_ANGLE(0.10706327855587)}, + {SCALE_SPLIT_ANGLE(0.06817039847374), + SCALE_SPLIT_ANGLE(0.06833326816559), + SCALE_SPLIT_ANGLE(0.06858598440886), + SCALE_SPLIT_ANGLE(0.06924756616354), + SCALE_SPLIT_ANGLE(0.06993119418621), + SCALE_SPLIT_ANGLE(0.07110133767128), + SCALE_SPLIT_ANGLE(0.07325870543718), + SCALE_SPLIT_ANGLE(0.07497421652079)}, + {SCALE_SPLIT_ANGLE(0.04925633221865), + SCALE_SPLIT_ANGLE(0.04934597760439), + SCALE_SPLIT_ANGLE(0.04948436096311), + SCALE_SPLIT_ANGLE(0.04984252527356), + SCALE_SPLIT_ANGLE(0.05020647495985), + SCALE_SPLIT_ANGLE(0.05081529542804), + SCALE_SPLIT_ANGLE(0.05189275369048), + SCALE_SPLIT_ANGLE(0.05270983651280)}, + {SCALE_SPLIT_ANGLE(0.02833298407495), + SCALE_SPLIT_ANGLE(0.02836437709630), + SCALE_SPLIT_ANGLE(0.02841254509985), + SCALE_SPLIT_ANGLE(0.02853557839990), + SCALE_SPLIT_ANGLE(0.02865825034678), + SCALE_SPLIT_ANGLE(0.02885829657316), + SCALE_SPLIT_ANGLE(0.02919724024832), + SCALE_SPLIT_ANGLE(0.02944211289287)}, + {SCALE_SPLIT_ANGLE(0.01614447496831), + SCALE_SPLIT_ANGLE(0.01615499891341), + SCALE_SPLIT_ANGLE(0.01617109030485), + SCALE_SPLIT_ANGLE(0.01621186546981), + SCALE_SPLIT_ANGLE(0.01625206694007), + SCALE_SPLIT_ANGLE(0.01631666347384), + SCALE_SPLIT_ANGLE(0.01642346009612), + SCALE_SPLIT_ANGLE(0.01649860665202)}, + {SCALE_SPLIT_ANGLE(0.00914775021374), + SCALE_SPLIT_ANGLE(0.00915119145066), + SCALE_SPLIT_ANGLE(0.00915644038469), + SCALE_SPLIT_ANGLE(0.00916968286037), + SCALE_SPLIT_ANGLE(0.00918265152723), + SCALE_SPLIT_ANGLE(0.00920331478119), + SCALE_SPLIT_ANGLE(0.00923701003194), + SCALE_SPLIT_ANGLE(0.00926037877798)}, + {SCALE_SPLIT_ANGLE(0.00516638066620), + SCALE_SPLIT_ANGLE(0.00516748987138), + SCALE_SPLIT_ANGLE(0.00516917929053), + SCALE_SPLIT_ANGLE(0.00517342984676), + SCALE_SPLIT_ANGLE(0.00517757656053), + SCALE_SPLIT_ANGLE(0.00518415356055), + SCALE_SPLIT_ANGLE(0.00519479578361), + SCALE_SPLIT_ANGLE(0.00520211551338)}, + {SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564)}, + }, + { + {SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629), + SCALE_SPLIT_ANGLE(1.57079637050629)}, + {SCALE_SPLIT_ANGLE(1.56514155864716), + SCALE_SPLIT_ANGLE(1.56514346599579), + SCALE_SPLIT_ANGLE(1.56514656543732), + SCALE_SPLIT_ANGLE(1.56515407562256), + SCALE_SPLIT_ANGLE(1.56516146659851), + SCALE_SPLIT_ANGLE(1.56517302989960), + SCALE_SPLIT_ANGLE(1.56519174575806), + SCALE_SPLIT_ANGLE(1.56520450115204)}, + {SCALE_SPLIT_ANGLE(1.56069743633270), + SCALE_SPLIT_ANGLE(1.56070363521576), + SCALE_SPLIT_ANGLE(1.56071317195892), + SCALE_SPLIT_ANGLE(1.56073689460754), + SCALE_SPLIT_ANGLE(1.56076002120972), + SCALE_SPLIT_ANGLE(1.56079673767090), + SCALE_SPLIT_ANGLE(1.56085586547852), + SCALE_SPLIT_ANGLE(1.56089639663696)}, + {SCALE_SPLIT_ANGLE(1.55270349979401), + SCALE_SPLIT_ANGLE(1.55272293090820), + SCALE_SPLIT_ANGLE(1.55275249481201), + SCALE_SPLIT_ANGLE(1.55282700061798), + SCALE_SPLIT_ANGLE(1.55289983749390), + SCALE_SPLIT_ANGLE(1.55301547050476), + SCALE_SPLIT_ANGLE(1.55320310592651), + SCALE_SPLIT_ANGLE(1.55333256721497)}, + {SCALE_SPLIT_ANGLE(1.53820896148682), + SCALE_SPLIT_ANGLE(1.53826904296875), + SCALE_SPLIT_ANGLE(1.53836083412170), + SCALE_SPLIT_ANGLE(1.53859281539917), + SCALE_SPLIT_ANGLE(1.53882038593292), + SCALE_SPLIT_ANGLE(1.53918409347534), + SCALE_SPLIT_ANGLE(1.53978037834167), + SCALE_SPLIT_ANGLE(1.54019629955292)}, + {SCALE_SPLIT_ANGLE(1.51160359382629), + SCALE_SPLIT_ANGLE(1.51178681850433), + SCALE_SPLIT_ANGLE(1.51206707954407), + SCALE_SPLIT_ANGLE(1.51277923583984), + SCALE_SPLIT_ANGLE(1.51348364353180), + SCALE_SPLIT_ANGLE(1.51462137699127), + SCALE_SPLIT_ANGLE(1.51652014255524), + SCALE_SPLIT_ANGLE(1.51787149906158)}, + {SCALE_SPLIT_ANGLE(1.48564028739929), + SCALE_SPLIT_ANGLE(1.48599278926849), + SCALE_SPLIT_ANGLE(1.48653328418732), + SCALE_SPLIT_ANGLE(1.48791313171387), + SCALE_SPLIT_ANGLE(1.48928797245026), + SCALE_SPLIT_ANGLE(1.49152994155884), + SCALE_SPLIT_ANGLE(1.49533641338348), + SCALE_SPLIT_ANGLE(1.49810016155243)}, + {SCALE_SPLIT_ANGLE(1.44770443439484), + SCALE_SPLIT_ANGLE(1.44837117195129), + SCALE_SPLIT_ANGLE(1.44939684867859), + SCALE_SPLIT_ANGLE(1.45203149318695), + SCALE_SPLIT_ANGLE(1.45468175411224), + SCALE_SPLIT_ANGLE(1.45906186103821), + SCALE_SPLIT_ANGLE(1.46668362617493), + SCALE_SPLIT_ANGLE(1.47238755226135)}, + {SCALE_SPLIT_ANGLE(1.39214622974396), + SCALE_SPLIT_ANGLE(1.39337480068207), + SCALE_SPLIT_ANGLE(1.39527153968811), + SCALE_SPLIT_ANGLE(1.40018463134766), + SCALE_SPLIT_ANGLE(1.40518975257874), + SCALE_SPLIT_ANGLE(1.41361439228058), + SCALE_SPLIT_ANGLE(1.42880713939667), + SCALE_SPLIT_ANGLE(1.44072246551514)}, + {SCALE_SPLIT_ANGLE(1.31133699417114), + SCALE_SPLIT_ANGLE(1.31350564956665), + SCALE_SPLIT_ANGLE(1.31686961650848), + SCALE_SPLIT_ANGLE(1.32567906379700), + SCALE_SPLIT_ANGLE(1.33480501174927), + SCALE_SPLIT_ANGLE(1.35055577754974), + SCALE_SPLIT_ANGLE(1.38048458099365), + SCALE_SPLIT_ANGLE(1.40579915046692)}, + {SCALE_SPLIT_ANGLE(1.19695901870728), + SCALE_SPLIT_ANGLE(1.20052528381348), + SCALE_SPLIT_ANGLE(1.20609176158905), + SCALE_SPLIT_ANGLE(1.22087836265564), + SCALE_SPLIT_ANGLE(1.23654139041901), + SCALE_SPLIT_ANGLE(1.26451897621155), + SCALE_SPLIT_ANGLE(1.32194638252258), + SCALE_SPLIT_ANGLE(1.37709856033325)}, + {SCALE_SPLIT_ANGLE(1.09969496726990), + SCALE_SPLIT_ANGLE(1.10437381267548), + SCALE_SPLIT_ANGLE(1.11171460151672), + SCALE_SPLIT_ANGLE(1.13144767284393), + SCALE_SPLIT_ANGLE(1.15274536609650), + SCALE_SPLIT_ANGLE(1.19192278385162), + SCALE_SPLIT_ANGLE(1.27820122241974), + SCALE_SPLIT_ANGLE(1.37287366390228)}, + {SCALE_SPLIT_ANGLE(0.98739641904831), + SCALE_SPLIT_ANGLE(0.99314504861832), + SCALE_SPLIT_ANGLE(1.00221848487854), + SCALE_SPLIT_ANGLE(1.02694928646088), + SCALE_SPLIT_ANGLE(1.05423069000244), + SCALE_SPLIT_ANGLE(1.10619938373566), + SCALE_SPLIT_ANGLE(1.23116791248322), + SCALE_SPLIT_ANGLE(1.39771795272827)}, + {SCALE_SPLIT_ANGLE(0.86566168069839), + SCALE_SPLIT_ANGLE(0.87219274044037), + SCALE_SPLIT_ANGLE(0.88256764411926), + SCALE_SPLIT_ANGLE(0.91127204895020), + SCALE_SPLIT_ANGLE(0.94370108842850), + SCALE_SPLIT_ANGLE(1.00792455673218), + SCALE_SPLIT_ANGLE(1.17914211750031), + SCALE_SPLIT_ANGLE(1.48121190071106)}, + {SCALE_SPLIT_ANGLE(0.74293035268784), + SCALE_SPLIT_ANGLE(0.74975663423538), + SCALE_SPLIT_ANGLE(0.76066619157791), + SCALE_SPLIT_ANGLE(0.79128372669220), + SCALE_SPLIT_ANGLE(0.82667875289917), + SCALE_SPLIT_ANGLE(0.89952337741852), + SCALE_SPLIT_ANGLE(1.11571300029755), + SCALE_SPLIT_ANGLE(1.67431199550629)}, + {SCALE_SPLIT_ANGLE(0.62761706113815), + SCALE_SPLIT_ANGLE(0.63421267271042), + SCALE_SPLIT_ANGLE(0.64480352401733), + SCALE_SPLIT_ANGLE(0.67486244440079), + SCALE_SPLIT_ANGLE(0.71025311946869), + SCALE_SPLIT_ANGLE(0.78539818525314), + SCALE_SPLIT_ANGLE(1.02937340736389), + SCALE_SPLIT_ANGLE(1.92301487922668)}, + {SCALE_SPLIT_ANGLE(0.52522456645966), + SCALE_SPLIT_ANGLE(0.53118568658829), + SCALE_SPLIT_ANGLE(0.54078328609467), + SCALE_SPLIT_ANGLE(0.56819748878479), + SCALE_SPLIT_ANGLE(0.60080903768539), + SCALE_SPLIT_ANGLE(0.67127299308777), + SCALE_SPLIT_ANGLE(0.91114157438278), + SCALE_SPLIT_ANGLE(1.73398244380951)}, + {SCALE_SPLIT_ANGLE(0.43751955032349), + SCALE_SPLIT_ANGLE(0.44262495636940), + SCALE_SPLIT_ANGLE(0.45084837079048), + SCALE_SPLIT_ANGLE(0.47435709834099), + SCALE_SPLIT_ANGLE(0.50235128402710), + SCALE_SPLIT_ANGLE(0.56287181377411), + SCALE_SPLIT_ANGLE(0.76705121994019), + SCALE_SPLIT_ANGLE(1.34888231754303)}, + {SCALE_SPLIT_ANGLE(0.36364197731018), + SCALE_SPLIT_ANGLE(0.36782836914063), + SCALE_SPLIT_ANGLE(0.37456014752388), + SCALE_SPLIT_ANGLE(0.39372295141220), + SCALE_SPLIT_ANGLE(0.41636970639229), + SCALE_SPLIT_ANGLE(0.46459695696831), + SCALE_SPLIT_ANGLE(0.61803084611893), + SCALE_SPLIT_ANGLE(0.96275907754898)}, + {SCALE_SPLIT_ANGLE(0.30166232585907), + SCALE_SPLIT_ANGLE(0.30497136712074), + SCALE_SPLIT_ANGLE(0.31027451157570), + SCALE_SPLIT_ANGLE(0.32524627447128), + SCALE_SPLIT_ANGLE(0.34269109368324), + SCALE_SPLIT_ANGLE(0.37887358665466), + SCALE_SPLIT_ANGLE(0.48432540893555), + SCALE_SPLIT_ANGLE(0.66878592967987)}, + {SCALE_SPLIT_ANGLE(0.24960109591484), + SCALE_SPLIT_ANGLE(0.25213342905045), + SCALE_SPLIT_ANGLE(0.25617361068726), + SCALE_SPLIT_ANGLE(0.26745575666428), + SCALE_SPLIT_ANGLE(0.28036275506020), + SCALE_SPLIT_ANGLE(0.30627736449242), + SCALE_SPLIT_ANGLE(0.37490701675415), + SCALE_SPLIT_ANGLE(0.47145301103592)}, + {SCALE_SPLIT_ANGLE(0.18661488592625), + SCALE_SPLIT_ANGLE(0.18822197616100), + SCALE_SPLIT_ANGLE(0.19076596200466), + SCALE_SPLIT_ANGLE(0.19773863255978), + SCALE_SPLIT_ANGLE(0.20547652244568), + SCALE_SPLIT_ANGLE(0.22024063766003), + SCALE_SPLIT_ANGLE(0.25452125072479), + SCALE_SPLIT_ANGLE(0.29236793518066)}, + {SCALE_SPLIT_ANGLE(0.13821771740913), + SCALE_SPLIT_ANGLE(0.13918289542198), + SCALE_SPLIT_ANGLE(0.14069861173630), + SCALE_SPLIT_ANGLE(0.14477686583996), + SCALE_SPLIT_ANGLE(0.14917233586311), + SCALE_SPLIT_ANGLE(0.15718193352222), + SCALE_SPLIT_ANGLE(0.17394064366817), + SCALE_SPLIT_ANGLE(0.18971265852451)}, + {SCALE_SPLIT_ANGLE(0.10140904784203), + SCALE_SPLIT_ANGLE(0.10196315497160), + SCALE_SPLIT_ANGLE(0.10282710194588), + SCALE_SPLIT_ANGLE(0.10511382669210), + SCALE_SPLIT_ANGLE(0.10751703381538), + SCALE_SPLIT_ANGLE(0.11173453181982), + SCALE_SPLIT_ANGLE(0.11990433931351), + SCALE_SPLIT_ANGLE(0.12683042883873)}, + {SCALE_SPLIT_ANGLE(0.07378087192774), + SCALE_SPLIT_ANGLE(0.07408788800240), + SCALE_SPLIT_ANGLE(0.07456368207932), + SCALE_SPLIT_ANGLE(0.07580613344908), + SCALE_SPLIT_ANGLE(0.07708553224802), + SCALE_SPLIT_ANGLE(0.07926639169455), + SCALE_SPLIT_ANGLE(0.08326309919357), + SCALE_SPLIT_ANGLE(0.08642497658730)}, + {SCALE_SPLIT_ANGLE(0.05331044271588), + SCALE_SPLIT_ANGLE(0.05347600579262), + SCALE_SPLIT_ANGLE(0.05373133346438), + SCALE_SPLIT_ANGLE(0.05439101532102), + SCALE_SPLIT_ANGLE(0.05505970120430), + SCALE_SPLIT_ANGLE(0.05617496743798), + SCALE_SPLIT_ANGLE(0.05813983827829), + SCALE_SPLIT_ANGLE(0.05962376296520)}, + {SCALE_SPLIT_ANGLE(0.03066622652113), + SCALE_SPLIT_ANGLE(0.03072291985154), + SCALE_SPLIT_ANGLE(0.03080986253917), + SCALE_SPLIT_ANGLE(0.03103173524141), + SCALE_SPLIT_ANGLE(0.03125262632966), + SCALE_SPLIT_ANGLE(0.03161224350333), + SCALE_SPLIT_ANGLE(0.03221991285682), + SCALE_SPLIT_ANGLE(0.03265778720379)}, + {SCALE_SPLIT_ANGLE(0.01747439615428), + SCALE_SPLIT_ANGLE(0.01749316416681), + SCALE_SPLIT_ANGLE(0.01752184517682), + SCALE_SPLIT_ANGLE(0.01759449020028), + SCALE_SPLIT_ANGLE(0.01766604930162), + SCALE_SPLIT_ANGLE(0.01778092049062), + SCALE_SPLIT_ANGLE(0.01797054335475), + SCALE_SPLIT_ANGLE(0.01810375973582)}, + {SCALE_SPLIT_ANGLE(0.00990140344948), + SCALE_SPLIT_ANGLE(0.00990749336779), + SCALE_SPLIT_ANGLE(0.00991678331047), + SCALE_SPLIT_ANGLE(0.00994021166116), + SCALE_SPLIT_ANGLE(0.00996314454824), + SCALE_SPLIT_ANGLE(0.00999966636300), + SCALE_SPLIT_ANGLE(0.01005917042494), + SCALE_SPLIT_ANGLE(0.01010039448738)}, + {SCALE_SPLIT_ANGLE(0.00559204118326), + SCALE_SPLIT_ANGLE(0.00559399509802), + SCALE_SPLIT_ANGLE(0.00559697346762), + SCALE_SPLIT_ANGLE(0.00560446362942), + SCALE_SPLIT_ANGLE(0.00561177125201), + SCALE_SPLIT_ANGLE(0.00562335411087), + SCALE_SPLIT_ANGLE(0.00564208766446), + SCALE_SPLIT_ANGLE(0.00565496599302)}, + {SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278), + SCALE_SPLIT_ANGLE(0.00000003162278)}, + }, + { + {SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589), + SCALE_SPLIT_ANGLE(1.96349537372589)}, + {SCALE_SPLIT_ANGLE(1.95824837684631), + SCALE_SPLIT_ANGLE(1.95825088024139), + SCALE_SPLIT_ANGLE(1.95825481414795), + SCALE_SPLIT_ANGLE(1.95826447010040), + SCALE_SPLIT_ANGLE(1.95827388763428), + SCALE_SPLIT_ANGLE(1.95828890800476), + SCALE_SPLIT_ANGLE(1.95831274986267), + SCALE_SPLIT_ANGLE(1.95832908153534)}, + {SCALE_SPLIT_ANGLE(1.95409297943115), + SCALE_SPLIT_ANGLE(1.95410108566284), + SCALE_SPLIT_ANGLE(1.95411336421967), + SCALE_SPLIT_ANGLE(1.95414412021637), + SCALE_SPLIT_ANGLE(1.95417404174805), + SCALE_SPLIT_ANGLE(1.95422136783600), + SCALE_SPLIT_ANGLE(1.95429730415344), + SCALE_SPLIT_ANGLE(1.95434916019440)}, + {SCALE_SPLIT_ANGLE(1.94654774665833), + SCALE_SPLIT_ANGLE(1.94657325744629), + SCALE_SPLIT_ANGLE(1.94661211967468), + SCALE_SPLIT_ANGLE(1.94670987129211), + SCALE_SPLIT_ANGLE(1.94680488109589), + SCALE_SPLIT_ANGLE(1.94695508480072), + SCALE_SPLIT_ANGLE(1.94719684123993), + SCALE_SPLIT_ANGLE(1.94736230373383)}, + {SCALE_SPLIT_ANGLE(1.93263375759125), + SCALE_SPLIT_ANGLE(1.93271493911743), + SCALE_SPLIT_ANGLE(1.93283843994141), + SCALE_SPLIT_ANGLE(1.93314898014069), + SCALE_SPLIT_ANGLE(1.93345153331757), + SCALE_SPLIT_ANGLE(1.93393051624298), + SCALE_SPLIT_ANGLE(1.93470382690430), + SCALE_SPLIT_ANGLE(1.93523514270782)}, + {SCALE_SPLIT_ANGLE(1.90630435943604), + SCALE_SPLIT_ANGLE(1.90656292438507), + SCALE_SPLIT_ANGLE(1.90695691108704), + SCALE_SPLIT_ANGLE(1.90794765949249), + SCALE_SPLIT_ANGLE(1.90891444683075), + SCALE_SPLIT_ANGLE(1.91044902801514), + SCALE_SPLIT_ANGLE(1.91294109821320), + SCALE_SPLIT_ANGLE(1.91466653347015)}, + {SCALE_SPLIT_ANGLE(1.87960743904114), + SCALE_SPLIT_ANGLE(1.88012742996216), + SCALE_SPLIT_ANGLE(1.88091933727264), + SCALE_SPLIT_ANGLE(1.88291192054749), + SCALE_SPLIT_ANGLE(1.88485777378082), + SCALE_SPLIT_ANGLE(1.88795232772827), + SCALE_SPLIT_ANGLE(1.89300394058228), + SCALE_SPLIT_ANGLE(1.89652991294861)}, + {SCALE_SPLIT_ANGLE(1.83877396583557), + SCALE_SPLIT_ANGLE(1.83982229232788), + SCALE_SPLIT_ANGLE(1.84141862392426), + SCALE_SPLIT_ANGLE(1.84543347358704), + SCALE_SPLIT_ANGLE(1.84935534000397), + SCALE_SPLIT_ANGLE(1.85560429096222), + SCALE_SPLIT_ANGLE(1.86587727069855), + SCALE_SPLIT_ANGLE(1.87314081192017)}, + {SCALE_SPLIT_ANGLE(1.77493417263031), + SCALE_SPLIT_ANGLE(1.77705264091492), + SCALE_SPLIT_ANGLE(1.78027474880219), + SCALE_SPLIT_ANGLE(1.78836548328400), + SCALE_SPLIT_ANGLE(1.79626095294952), + SCALE_SPLIT_ANGLE(1.80886054039001), + SCALE_SPLIT_ANGLE(1.82978034019470), + SCALE_SPLIT_ANGLE(1.84489548206329)}, + {SCALE_SPLIT_ANGLE(1.67321813106537), + SCALE_SPLIT_ANGLE(1.67747652530670), + SCALE_SPLIT_ANGLE(1.68394017219543), + SCALE_SPLIT_ANGLE(1.70011746883392), + SCALE_SPLIT_ANGLE(1.71586501598358), + SCALE_SPLIT_ANGLE(1.74102878570557), + SCALE_SPLIT_ANGLE(1.78345441818237), + SCALE_SPLIT_ANGLE(1.81531298160553)}, + {SCALE_SPLIT_ANGLE(1.51132118701935), + SCALE_SPLIT_ANGLE(1.51959395408630), + SCALE_SPLIT_ANGLE(1.53212559223175), + SCALE_SPLIT_ANGLE(1.56339788436890), + SCALE_SPLIT_ANGLE(1.59380054473877), + SCALE_SPLIT_ANGLE(1.64260375499725), + SCALE_SPLIT_ANGLE(1.72719120979309), + SCALE_SPLIT_ANGLE(1.79549276828766)}, + {SCALE_SPLIT_ANGLE(1.35904061794281), + SCALE_SPLIT_ANGLE(1.37121617794037), + SCALE_SPLIT_ANGLE(1.38967239856720), + SCALE_SPLIT_ANGLE(1.43583393096924), + SCALE_SPLIT_ANGLE(1.48093688488007), + SCALE_SPLIT_ANGLE(1.55410325527191), + SCALE_SPLIT_ANGLE(1.68521773815155), + SCALE_SPLIT_ANGLE(1.80024886131287)}, + {SCALE_SPLIT_ANGLE(1.17258906364441), + SCALE_SPLIT_ANGLE(1.18893885612488), + SCALE_SPLIT_ANGLE(1.21383893489838), + SCALE_SPLIT_ANGLE(1.27678310871124), + SCALE_SPLIT_ANGLE(1.33930420875549), + SCALE_SPLIT_ANGLE(1.44322526454926), + SCALE_SPLIT_ANGLE(1.64006817340851), + SCALE_SPLIT_ANGLE(1.83627605438232)}, + {SCALE_SPLIT_ANGLE(0.96933782100677), + SCALE_SPLIT_ANGLE(0.98854482173920), + SCALE_SPLIT_ANGLE(1.01807177066803), + SCALE_SPLIT_ANGLE(1.09429967403412), + SCALE_SPLIT_ANGLE(1.17245352268219), + SCALE_SPLIT_ANGLE(1.30826878547668), + SCALE_SPLIT_ANGLE(1.58911180496216), + SCALE_SPLIT_ANGLE(1.92719435691834)}, + {SCALE_SPLIT_ANGLE(0.77729862928391), + SCALE_SPLIT_ANGLE(0.79675698280334), + SCALE_SPLIT_ANGLE(0.82701611518860), + SCALE_SPLIT_ANGLE(0.90724968910217), + SCALE_SPLIT_ANGLE(0.99302649497986), + SCALE_SPLIT_ANGLE(1.15163993835449), + SCALE_SPLIT_ANGLE(1.52265202999115), + SCALE_SPLIT_ANGLE(2.09869623184204)}, + {SCALE_SPLIT_ANGLE(0.61765128374100), + SCALE_SPLIT_ANGLE(0.63503885269165), + SCALE_SPLIT_ANGLE(0.66235077381134), + SCALE_SPLIT_ANGLE(0.73653638362885), + SCALE_SPLIT_ANGLE(0.81904613971710), + SCALE_SPLIT_ANGLE(0.98174768686295), + SCALE_SPLIT_ANGLE(1.42110538482666), + SCALE_SPLIT_ANGLE(2.28386068344116)}, + {SCALE_SPLIT_ANGLE(0.49486333131790), + SCALE_SPLIT_ANGLE(0.50909578800201), + SCALE_SPLIT_ANGLE(0.53160983324051), + SCALE_SPLIT_ANGLE(0.59379214048386), + SCALE_SPLIT_ANGLE(0.66487491130829), + SCALE_SPLIT_ANGLE(0.81185549497604), + SCALE_SPLIT_ANGLE(1.26233386993408), + SCALE_SPLIT_ANGLE(2.16925764083862)}, + {SCALE_SPLIT_ANGLE(0.40230560302734), + SCALE_SPLIT_ANGLE(0.41332274675369), + SCALE_SPLIT_ANGLE(0.43082228302956), + SCALE_SPLIT_ANGLE(0.47957953810692), + SCALE_SPLIT_ANGLE(0.53603589534760), + SCALE_SPLIT_ANGLE(0.65522658824921), + SCALE_SPLIT_ANGLE(1.04503858089447), + SCALE_SPLIT_ANGLE(1.87041807174683)}, + {SCALE_SPLIT_ANGLE(0.33104607462883), + SCALE_SPLIT_ANGLE(0.33927726745605), + SCALE_SPLIT_ANGLE(0.35237133502960), + SCALE_SPLIT_ANGLE(0.38892474770546), + SCALE_SPLIT_ANGLE(0.43126159906387), + SCALE_SPLIT_ANGLE(0.52027010917664), + SCALE_SPLIT_ANGLE(0.80654186010361), + SCALE_SPLIT_ANGLE(1.41960310935974)}, + {SCALE_SPLIT_ANGLE(0.27415537834167), + SCALE_SPLIT_ANGLE(0.28015670180321), + SCALE_SPLIT_ANGLE(0.28969678282738), + SCALE_SPLIT_ANGLE(0.31623730063438), + SCALE_SPLIT_ANGLE(0.34670370817184), + SCALE_SPLIT_ANGLE(0.40939208865166), + SCALE_SPLIT_ANGLE(0.59604310989380), + SCALE_SPLIT_ANGLE(0.94309806823730)}, + {SCALE_SPLIT_ANGLE(0.22730343043804), + SCALE_SPLIT_ANGLE(0.23159568011761), + SCALE_SPLIT_ANGLE(0.23840220272541), + SCALE_SPLIT_ANGLE(0.25720024108887), + SCALE_SPLIT_ANGLE(0.27846288681030), + SCALE_SPLIT_ANGLE(0.32089167833328), + SCALE_SPLIT_ANGLE(0.43515858054161), + SCALE_SPLIT_ANGLE(0.60621982812881)}, + {SCALE_SPLIT_ANGLE(0.17074465751648), + SCALE_SPLIT_ANGLE(0.17326098680496), + SCALE_SPLIT_ANGLE(0.17722852528095), + SCALE_SPLIT_ANGLE(0.18802370131016), + SCALE_SPLIT_ANGLE(0.19990929961205), + SCALE_SPLIT_ANGLE(0.22246663272381), + SCALE_SPLIT_ANGLE(0.27514943480492), + SCALE_SPLIT_ANGLE(0.33505329489708)}, + {SCALE_SPLIT_ANGLE(0.12695817649364), + SCALE_SPLIT_ANGLE(0.12838459014893), + SCALE_SPLIT_ANGLE(0.13061878085136), + SCALE_SPLIT_ANGLE(0.13660037517548), + SCALE_SPLIT_ANGLE(0.14301040768623), + SCALE_SPLIT_ANGLE(0.15463486313820), + SCALE_SPLIT_ANGLE(0.17893929779530), + SCALE_SPLIT_ANGLE(0.20203559100628)}, + {SCALE_SPLIT_ANGLE(0.09338590502739), + SCALE_SPLIT_ANGLE(0.09417138993740), + SCALE_SPLIT_ANGLE(0.09539390355349), + SCALE_SPLIT_ANGLE(0.09861853718758), + SCALE_SPLIT_ANGLE(0.10199318081141), + SCALE_SPLIT_ANGLE(0.10789106786251), + SCALE_SPLIT_ANGLE(0.11927830427885), + SCALE_SPLIT_ANGLE(0.12894381582737)}, + {SCALE_SPLIT_ANGLE(0.06804535537958), + SCALE_SPLIT_ANGLE(0.06846775114536), + SCALE_SPLIT_ANGLE(0.06912153959274), + SCALE_SPLIT_ANGLE(0.07082461565733), + SCALE_SPLIT_ANGLE(0.07257289439440), + SCALE_SPLIT_ANGLE(0.07554303854704), + SCALE_SPLIT_ANGLE(0.08096561580896), + SCALE_SPLIT_ANGLE(0.08524779230356)}, + {SCALE_SPLIT_ANGLE(0.04920704290271), + SCALE_SPLIT_ANGLE(0.04942999407649), + SCALE_SPLIT_ANGLE(0.04977354034781), + SCALE_SPLIT_ANGLE(0.05065960064530), + SCALE_SPLIT_ANGLE(0.05155571550131), + SCALE_SPLIT_ANGLE(0.05304637551308), + SCALE_SPLIT_ANGLE(0.05566369369626), + SCALE_SPLIT_ANGLE(0.05763531476259)}, + {SCALE_SPLIT_ANGLE(0.02832321822643), + SCALE_SPLIT_ANGLE(0.02839783765376), + SCALE_SPLIT_ANGLE(0.02851220779121), + SCALE_SPLIT_ANGLE(0.02880378998816), + SCALE_SPLIT_ANGLE(0.02909369394183), + SCALE_SPLIT_ANGLE(0.02956490404904), + SCALE_SPLIT_ANGLE(0.03035926818848), + SCALE_SPLIT_ANGLE(0.03093044832349)}, + {SCALE_SPLIT_ANGLE(0.01614263281226), + SCALE_SPLIT_ANGLE(0.01616701297462), + SCALE_SPLIT_ANGLE(0.01620426215231), + SCALE_SPLIT_ANGLE(0.01629856042564), + SCALE_SPLIT_ANGLE(0.01639137230814), + SCALE_SPLIT_ANGLE(0.01654022186995), + SCALE_SPLIT_ANGLE(0.01678557507694), + SCALE_SPLIT_ANGLE(0.01695770025253)}, + {SCALE_SPLIT_ANGLE(0.00914741214365), + SCALE_SPLIT_ANGLE(0.00915526598692), + SCALE_SPLIT_ANGLE(0.00916724558920), + SCALE_SPLIT_ANGLE(0.00919744372368), + SCALE_SPLIT_ANGLE(0.00922699086368), + SCALE_SPLIT_ANGLE(0.00927402079105), + SCALE_SPLIT_ANGLE(0.00935057550669), + SCALE_SPLIT_ANGLE(0.00940357148647)}, + {SCALE_SPLIT_ANGLE(0.00516631966457), + SCALE_SPLIT_ANGLE(0.00516883004457), + SCALE_SPLIT_ANGLE(0.00517265405506), + SCALE_SPLIT_ANGLE(0.00518227089196), + SCALE_SPLIT_ANGLE(0.00519165024161), + SCALE_SPLIT_ANGLE(0.00520651414990), + SCALE_SPLIT_ANGLE(0.00523054087535), + SCALE_SPLIT_ANGLE(0.00524705136195)}, + {SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564), + SCALE_SPLIT_ANGLE(0.00000002921564)}, + }, + { + {SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479), + SCALE_SPLIT_ANGLE(2.35619449615479)}, + {SCALE_SPLIT_ANGLE(2.35216379165649), + SCALE_SPLIT_ANGLE(2.35216617584229), + SCALE_SPLIT_ANGLE(2.35216999053955), + SCALE_SPLIT_ANGLE(2.35217905044556), + SCALE_SPLIT_ANGLE(2.35218811035156), + SCALE_SPLIT_ANGLE(2.35220217704773), + SCALE_SPLIT_ANGLE(2.35222482681274), + SCALE_SPLIT_ANGLE(2.35224032402039)}, + {SCALE_SPLIT_ANGLE(2.34895062446594), + SCALE_SPLIT_ANGLE(2.34895825386047), + SCALE_SPLIT_ANGLE(2.34897017478943), + SCALE_SPLIT_ANGLE(2.34899950027466), + SCALE_SPLIT_ANGLE(2.34902811050415), + SCALE_SPLIT_ANGLE(2.34907317161560), + SCALE_SPLIT_ANGLE(2.34914517402649), + SCALE_SPLIT_ANGLE(2.34919428825378)}, + {SCALE_SPLIT_ANGLE(2.34306812286377), + SCALE_SPLIT_ANGLE(2.34309291839600), + SCALE_SPLIT_ANGLE(2.34313082695007), + SCALE_SPLIT_ANGLE(2.34322524070740), + SCALE_SPLIT_ANGLE(2.34331679344177), + SCALE_SPLIT_ANGLE(2.34346079826355), + SCALE_SPLIT_ANGLE(2.34369087219238), + SCALE_SPLIT_ANGLE(2.34384727478027)}, + {SCALE_SPLIT_ANGLE(2.33205723762512), + SCALE_SPLIT_ANGLE(2.33213782310486), + SCALE_SPLIT_ANGLE(2.33226013183594), + SCALE_SPLIT_ANGLE(2.33256578445435), + SCALE_SPLIT_ANGLE(2.33286166191101), + SCALE_SPLIT_ANGLE(2.33332633972168), + SCALE_SPLIT_ANGLE(2.33406686782837), + SCALE_SPLIT_ANGLE(2.33456921577454)}, + {SCALE_SPLIT_ANGLE(2.31062912940979), + SCALE_SPLIT_ANGLE(2.31089663505554), + SCALE_SPLIT_ANGLE(2.31130218505859), + SCALE_SPLIT_ANGLE(2.31231284141541), + SCALE_SPLIT_ANGLE(2.31328654289246), + SCALE_SPLIT_ANGLE(2.31480789184570), + SCALE_SPLIT_ANGLE(2.31722092628479), + SCALE_SPLIT_ANGLE(2.31885290145874)}, + {SCALE_SPLIT_ANGLE(2.28808355331421), + SCALE_SPLIT_ANGLE(2.28864479064941), + SCALE_SPLIT_ANGLE(2.28949403762817), + SCALE_SPLIT_ANGLE(2.29160070419312), + SCALE_SPLIT_ANGLE(2.29361891746521), + SCALE_SPLIT_ANGLE(2.29675459861755), + SCALE_SPLIT_ANGLE(2.30169844627380), + SCALE_SPLIT_ANGLE(2.30503511428833)}, + {SCALE_SPLIT_ANGLE(2.25191521644592), + SCALE_SPLIT_ANGLE(2.25312566757202), + SCALE_SPLIT_ANGLE(2.25494909286499), + SCALE_SPLIT_ANGLE(2.25943517684937), + SCALE_SPLIT_ANGLE(2.26368880271912), + SCALE_SPLIT_ANGLE(2.27023100852966), + SCALE_SPLIT_ANGLE(2.28044486045837), + SCALE_SPLIT_ANGLE(2.28732299804688)}, + {SCALE_SPLIT_ANGLE(2.19093585014343), + SCALE_SPLIT_ANGLE(2.19366121292114), + SCALE_SPLIT_ANGLE(2.19773292541504), + SCALE_SPLIT_ANGLE(2.20759749412537), + SCALE_SPLIT_ANGLE(2.21677780151367), + SCALE_SPLIT_ANGLE(2.23064494132996), + SCALE_SPLIT_ANGLE(2.25193929672241), + SCALE_SPLIT_ANGLE(2.26625943183899)}, + {SCALE_SPLIT_ANGLE(2.08102917671204), + SCALE_SPLIT_ANGLE(2.08757281303406), + SCALE_SPLIT_ANGLE(2.09720706939697), + SCALE_SPLIT_ANGLE(2.11991167068481), + SCALE_SPLIT_ANGLE(2.14035654067993), + SCALE_SPLIT_ANGLE(2.17029213905334), + SCALE_SPLIT_ANGLE(2.21503138542175), + SCALE_SPLIT_ANGLE(2.24518108367920)}, + {SCALE_SPLIT_ANGLE(1.86738610267639), + SCALE_SPLIT_ANGLE(1.88426077365875), + SCALE_SPLIT_ANGLE(1.90853273868561), + SCALE_SPLIT_ANGLE(1.96333324909210), + SCALE_SPLIT_ANGLE(2.01024460792542), + SCALE_SPLIT_ANGLE(2.07577633857727), + SCALE_SPLIT_ANGLE(2.16986608505249), + SCALE_SPLIT_ANGLE(2.23406052589417)}, + {SCALE_SPLIT_ANGLE(1.61812174320221), + SCALE_SPLIT_ANGLE(1.64943754673004), + SCALE_SPLIT_ANGLE(1.69389235973358), + SCALE_SPLIT_ANGLE(1.79176020622253), + SCALE_SPLIT_ANGLE(1.87292492389679), + SCALE_SPLIT_ANGLE(1.98277986049652), + SCALE_SPLIT_ANGLE(2.13605809211731), + SCALE_SPLIT_ANGLE(2.24282979965210)}, + {SCALE_SPLIT_ANGLE(1.26556181907654), + SCALE_SPLIT_ANGLE(1.31512010097504), + SCALE_SPLIT_ANGLE(1.38608694076538), + SCALE_SPLIT_ANGLE(1.54419934749603), + SCALE_SPLIT_ANGLE(1.67621040344238), + SCALE_SPLIT_ANGLE(1.85417342185974), + SCALE_SPLIT_ANGLE(2.09956336021423), + SCALE_SPLIT_ANGLE(2.27729439735413)}, + {SCALE_SPLIT_ANGLE(0.88984864950180), + SCALE_SPLIT_ANGLE(0.94673132896423), + SCALE_SPLIT_ANGLE(1.03102219104767), + SCALE_SPLIT_ANGLE(1.23219704627991), + SCALE_SPLIT_ANGLE(1.41468584537506), + SCALE_SPLIT_ANGLE(1.67807435989380), + SCALE_SPLIT_ANGLE(2.05749273300171), + SCALE_SPLIT_ANGLE(2.35138511657715)}, + {SCALE_SPLIT_ANGLE(0.60630625486374), + SCALE_SPLIT_ANGLE(0.65551131963730), + SCALE_SPLIT_ANGLE(0.73032128810883), + SCALE_SPLIT_ANGLE(0.92225730419159), + SCALE_SPLIT_ANGLE(1.11866605281830), + SCALE_SPLIT_ANGLE(1.44806647300720), + SCALE_SPLIT_ANGLE(1.99872636795044), + SCALE_SPLIT_ANGLE(2.47302055358887)}, + {SCALE_SPLIT_ANGLE(0.43393731117249), + SCALE_SPLIT_ANGLE(0.47099208831787), + SCALE_SPLIT_ANGLE(0.52780759334564), + SCALE_SPLIT_ANGLE(0.67895972728729), + SCALE_SPLIT_ANGLE(0.84712409973145), + SCALE_SPLIT_ANGLE(1.17809724807739), + SCALE_SPLIT_ANGLE(1.89703977108002), + SCALE_SPLIT_ANGLE(2.59155654907227)}, + {SCALE_SPLIT_ANGLE(0.33522719144821), + SCALE_SPLIT_ANGLE(0.36133098602295), + SCALE_SPLIT_ANGLE(0.40159517526627), + SCALE_SPLIT_ANGLE(0.51039946079254), + SCALE_SPLIT_ANGLE(0.63590413331985), + SCALE_SPLIT_ANGLE(0.90812796354294), + SCALE_SPLIT_ANGLE(1.70793557167053), + SCALE_SPLIT_ANGLE(2.52852439880371)}, + {SCALE_SPLIT_ANGLE(0.27478924393654), + SCALE_SPLIT_ANGLE(0.29251149296761), + SCALE_SPLIT_ANGLE(0.32007756829262), + SCALE_SPLIT_ANGLE(0.39531299471855), + SCALE_SPLIT_ANGLE(0.48291319608688), + SCALE_SPLIT_ANGLE(0.67812001705170), + SCALE_SPLIT_ANGLE(1.39007341861725), + SCALE_SPLIT_ANGLE(2.34402561187744)}, + {SCALE_SPLIT_ANGLE(0.23185738921165), + SCALE_SPLIT_ANGLE(0.24370795488358), + SCALE_SPLIT_ANGLE(0.26227980852127), + SCALE_SPLIT_ANGLE(0.31327381730080), + SCALE_SPLIT_ANGLE(0.37241828441620), + SCALE_SPLIT_ANGLE(0.50202107429504), + SCALE_SPLIT_ANGLE(0.99085599184036), + SCALE_SPLIT_ANGLE(1.96553468704224)}, + {SCALE_SPLIT_ANGLE(0.19698308408260), + SCALE_SPLIT_ANGLE(0.20488271117210), + SCALE_SPLIT_ANGLE(0.21731524169445), + SCALE_SPLIT_ANGLE(0.25148212909698), + SCALE_SPLIT_ANGLE(0.29065516591072), + SCALE_SPLIT_ANGLE(0.37341466546059), + SCALE_SPLIT_ANGLE(0.65295964479446), + SCALE_SPLIT_ANGLE(1.28865826129913)}, + {SCALE_SPLIT_ANGLE(0.16667704284191), + SCALE_SPLIT_ANGLE(0.17194211483002), + SCALE_SPLIT_ANGLE(0.18023577332497), + SCALE_SPLIT_ANGLE(0.20293866097927), + SCALE_SPLIT_ANGLE(0.22855134308338), + SCALE_SPLIT_ANGLE(0.28041818737984), + SCALE_SPLIT_ANGLE(0.43142420053482), + SCALE_SPLIT_ANGLE(0.70030152797699)}, + {SCALE_SPLIT_ANGLE(0.12773877382278), + SCALE_SPLIT_ANGLE(0.13059370219707), + SCALE_SPLIT_ANGLE(0.13507819175720), + SCALE_SPLIT_ANGLE(0.14721076190472), + SCALE_SPLIT_ANGLE(0.16052412986755), + SCALE_SPLIT_ANGLE(0.18590225279331), + SCALE_SPLIT_ANGLE(0.24703904986382), + SCALE_SPLIT_ANGLE(0.32153329253197)}, + {SCALE_SPLIT_ANGLE(0.09603263437748), + SCALE_SPLIT_ANGLE(0.09756572544575), + SCALE_SPLIT_ANGLE(0.09996145218611), + SCALE_SPLIT_ANGLE(0.10635073482990), + SCALE_SPLIT_ANGLE(0.11317526549101), + SCALE_SPLIT_ANGLE(0.12554961442947), + SCALE_SPLIT_ANGLE(0.15168419480324), + SCALE_SPLIT_ANGLE(0.17713627219200)}, + {SCALE_SPLIT_ANGLE(0.07104731351137), + SCALE_SPLIT_ANGLE(0.07186015695333), + SCALE_SPLIT_ANGLE(0.07312334328890), + SCALE_SPLIT_ANGLE(0.07644616067410), + SCALE_SPLIT_ANGLE(0.07991369813681), + SCALE_SPLIT_ANGLE(0.08596338331699), + SCALE_SPLIT_ANGLE(0.09766443818808), + SCALE_SPLIT_ANGLE(0.10767273604870)}, + {SCALE_SPLIT_ANGLE(0.05192205682397), + SCALE_SPLIT_ANGLE(0.05234766751528), + SCALE_SPLIT_ANGLE(0.05300576984882), + SCALE_SPLIT_ANGLE(0.05471667647362), + SCALE_SPLIT_ANGLE(0.05646898597479), + SCALE_SPLIT_ANGLE(0.05943991243839), + SCALE_SPLIT_ANGLE(0.06485754251480), + SCALE_SPLIT_ANGLE(0.06914159655571)}, + {SCALE_SPLIT_ANGLE(0.03760399296880), + SCALE_SPLIT_ANGLE(0.03782445564866), + SCALE_SPLIT_ANGLE(0.03816393017769), + SCALE_SPLIT_ANGLE(0.03903824463487), + SCALE_SPLIT_ANGLE(0.03992090374231), + SCALE_SPLIT_ANGLE(0.04138650372624), + SCALE_SPLIT_ANGLE(0.04395476728678), + SCALE_SPLIT_ANGLE(0.04588782787323)}, + {SCALE_SPLIT_ANGLE(0.02166714705527), + SCALE_SPLIT_ANGLE(0.02173948101699), + SCALE_SPLIT_ANGLE(0.02185030654073), + SCALE_SPLIT_ANGLE(0.02213260531425), + SCALE_SPLIT_ANGLE(0.02241298183799), + SCALE_SPLIT_ANGLE(0.02286812849343), + SCALE_SPLIT_ANGLE(0.02363408915699), + SCALE_SPLIT_ANGLE(0.02418405190110)}, + {SCALE_SPLIT_ANGLE(0.01235313806683), + SCALE_SPLIT_ANGLE(0.01237650960684), + SCALE_SPLIT_ANGLE(0.01241220813245), + SCALE_SPLIT_ANGLE(0.01250253710896), + SCALE_SPLIT_ANGLE(0.01259138900787), + SCALE_SPLIT_ANGLE(0.01273377332836), + SCALE_SPLIT_ANGLE(0.01296819839627), + SCALE_SPLIT_ANGLE(0.01313247997314)}, + {SCALE_SPLIT_ANGLE(0.00700078532100), + SCALE_SPLIT_ANGLE(0.00700826756656), + SCALE_SPLIT_ANGLE(0.00701967673376), + SCALE_SPLIT_ANGLE(0.00704843224958), + SCALE_SPLIT_ANGLE(0.00707655772567), + SCALE_SPLIT_ANGLE(0.00712130358443), + SCALE_SPLIT_ANGLE(0.00719408970326), + SCALE_SPLIT_ANGLE(0.00724443979561)}, + {SCALE_SPLIT_ANGLE(0.00395406875759), + SCALE_SPLIT_ANGLE(0.00395645201206), + SCALE_SPLIT_ANGLE(0.00396008137614), + SCALE_SPLIT_ANGLE(0.00396920880303), + SCALE_SPLIT_ANGLE(0.00397810759023), + SCALE_SPLIT_ANGLE(0.00399220688269), + SCALE_SPLIT_ANGLE(0.00401498842984), + SCALE_SPLIT_ANGLE(0.00403063697740)}, + {SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068), + SCALE_SPLIT_ANGLE(0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439), + SCALE_SPLIT_ANGLE(2.74889349937439)}, + {SCALE_SPLIT_ANGLE(2.74670672416687), + SCALE_SPLIT_ANGLE(2.74670815467834), + SCALE_SPLIT_ANGLE(2.74671053886414), + SCALE_SPLIT_ANGLE(2.74671602249146), + SCALE_SPLIT_ANGLE(2.74672174453735), + SCALE_SPLIT_ANGLE(2.74673032760620), + SCALE_SPLIT_ANGLE(2.74674415588379), + SCALE_SPLIT_ANGLE(2.74675345420837)}, + {SCALE_SPLIT_ANGLE(2.74495577812195), + SCALE_SPLIT_ANGLE(2.74496054649353), + SCALE_SPLIT_ANGLE(2.74496769905090), + SCALE_SPLIT_ANGLE(2.74498581886292), + SCALE_SPLIT_ANGLE(2.74500346183777), + SCALE_SPLIT_ANGLE(2.74503111839294), + SCALE_SPLIT_ANGLE(2.74507498741150), + SCALE_SPLIT_ANGLE(2.74510502815247)}, + {SCALE_SPLIT_ANGLE(2.74173212051392), + SCALE_SPLIT_ANGLE(2.74174761772156), + SCALE_SPLIT_ANGLE(2.74177098274231), + SCALE_SPLIT_ANGLE(2.74182939529419), + SCALE_SPLIT_ANGLE(2.74188613891602), + SCALE_SPLIT_ANGLE(2.74197483062744), + SCALE_SPLIT_ANGLE(2.74211573600769), + SCALE_SPLIT_ANGLE(2.74221110343933)}, + {SCALE_SPLIT_ANGLE(2.73563575744629), + SCALE_SPLIT_ANGLE(2.73568630218506), + SCALE_SPLIT_ANGLE(2.73576331138611), + SCALE_SPLIT_ANGLE(2.73595523834229), + SCALE_SPLIT_ANGLE(2.73614001274109), + SCALE_SPLIT_ANGLE(2.73642849922180), + SCALE_SPLIT_ANGLE(2.73688435554504), + SCALE_SPLIT_ANGLE(2.73719072341919)}, + {SCALE_SPLIT_ANGLE(2.72353148460388), + SCALE_SPLIT_ANGLE(2.72370529174805), + SCALE_SPLIT_ANGLE(2.72396802902222), + SCALE_SPLIT_ANGLE(2.72461819648743), + SCALE_SPLIT_ANGLE(2.72523880004883), + SCALE_SPLIT_ANGLE(2.72619819641113), + SCALE_SPLIT_ANGLE(2.72769498825073), + SCALE_SPLIT_ANGLE(2.72869181632996)}, + {SCALE_SPLIT_ANGLE(2.71044087409973), + SCALE_SPLIT_ANGLE(2.71081781387329), + SCALE_SPLIT_ANGLE(2.71138477325439), + SCALE_SPLIT_ANGLE(2.71277689933777), + SCALE_SPLIT_ANGLE(2.71409153938293), + SCALE_SPLIT_ANGLE(2.71610021591187), + SCALE_SPLIT_ANGLE(2.71919155120850), + SCALE_SPLIT_ANGLE(2.72123122215271)}, + {SCALE_SPLIT_ANGLE(2.68862843513489), + SCALE_SPLIT_ANGLE(2.68948626518250), + SCALE_SPLIT_ANGLE(2.69076681137085), + SCALE_SPLIT_ANGLE(2.69386243820190), + SCALE_SPLIT_ANGLE(2.69673037528992), + SCALE_SPLIT_ANGLE(2.70102667808533), + SCALE_SPLIT_ANGLE(2.70749115943909), + SCALE_SPLIT_ANGLE(2.71170210838318)}, + {SCALE_SPLIT_ANGLE(2.64932370185852), + SCALE_SPLIT_ANGLE(2.65145039558411), + SCALE_SPLIT_ANGLE(2.65457701683044), + SCALE_SPLIT_ANGLE(2.66191530227661), + SCALE_SPLIT_ANGLE(2.66847491264343), + SCALE_SPLIT_ANGLE(2.67795729637146), + SCALE_SPLIT_ANGLE(2.69169545173645), + SCALE_SPLIT_ANGLE(2.70048093795776)}, + {SCALE_SPLIT_ANGLE(2.56864428520203), + SCALE_SPLIT_ANGLE(2.57483482360840), + SCALE_SPLIT_ANGLE(2.58364057540894), + SCALE_SPLIT_ANGLE(2.60311055183411), + SCALE_SPLIT_ANGLE(2.61933612823486), + SCALE_SPLIT_ANGLE(2.64129805564880), + SCALE_SPLIT_ANGLE(2.67107844352722), + SCALE_SPLIT_ANGLE(2.68960857391357)}, + {SCALE_SPLIT_ANGLE(2.35773015022278), + SCALE_SPLIT_ANGLE(2.38251185417175), + SCALE_SPLIT_ANGLE(2.41520094871521), + SCALE_SPLIT_ANGLE(2.47876882553101), + SCALE_SPLIT_ANGLE(2.52468156814575), + SCALE_SPLIT_ANGLE(2.57956743240356), + SCALE_SPLIT_ANGLE(2.64563941955566), + SCALE_SPLIT_ANGLE(2.68501615524292)}, + {SCALE_SPLIT_ANGLE(1.95455360412598), + SCALE_SPLIT_ANGLE(2.03550028800964), + SCALE_SPLIT_ANGLE(2.13431143760681), + SCALE_SPLIT_ANGLE(2.30167627334595), + SCALE_SPLIT_ANGLE(2.40472936630249), + SCALE_SPLIT_ANGLE(2.51241874694824), + SCALE_SPLIT_ANGLE(2.62649774551392), + SCALE_SPLIT_ANGLE(2.69151234626770)}, + {SCALE_SPLIT_ANGLE(1.08639848232269), + SCALE_SPLIT_ANGLE(1.25607907772064), + SCALE_SPLIT_ANGLE(1.49360668659210), + SCALE_SPLIT_ANGLE(1.93062829971313), + SCALE_SPLIT_ANGLE(2.18087863922119), + SCALE_SPLIT_ANGLE(2.40583086013794), + SCALE_SPLIT_ANGLE(2.60574340820313), + SCALE_SPLIT_ANGLE(2.71224212646484)}, + {SCALE_SPLIT_ANGLE(0.46298864483833), + SCALE_SPLIT_ANGLE(0.57069420814514), + SCALE_SPLIT_ANGLE(0.74941867589951), + SCALE_SPLIT_ANGLE(1.27059137821198), + SCALE_SPLIT_ANGLE(1.74987781047821), + SCALE_SPLIT_ANGLE(2.22410750389099), + SCALE_SPLIT_ANGLE(2.58140015602112), + SCALE_SPLIT_ANGLE(2.75301027297974)}, + {SCALE_SPLIT_ANGLE(0.23063218593597), + SCALE_SPLIT_ANGLE(0.29689303040504), + SCALE_SPLIT_ANGLE(0.39820966124535), + SCALE_SPLIT_ANGLE(0.70773023366928), + SCALE_SPLIT_ANGLE(1.13546586036682), + SCALE_SPLIT_ANGLE(1.89722001552582), + SCALE_SPLIT_ANGLE(2.54544758796692), + SCALE_SPLIT_ANGLE(2.81490159034729)}, + {SCALE_SPLIT_ANGLE(0.14590546488762), + SCALE_SPLIT_ANGLE(0.19153353571892), + SCALE_SPLIT_ANGLE(0.25519019365311), + SCALE_SPLIT_ANGLE(0.43163710832596), + SCALE_SPLIT_ANGLE(0.67776858806610), + SCALE_SPLIT_ANGLE(1.37444674968719), + SCALE_SPLIT_ANGLE(2.47591257095337), + SCALE_SPLIT_ANGLE(2.87223863601685)}, + {SCALE_SPLIT_ANGLE(0.12191537022591), + SCALE_SPLIT_ANGLE(0.15053890645504), + SCALE_SPLIT_ANGLE(0.19072309136391), + SCALE_SPLIT_ANGLE(0.29725375771523), + SCALE_SPLIT_ANGLE(0.43550044298172), + SCALE_SPLIT_ANGLE(0.85167354345322), + SCALE_SPLIT_ANGLE(2.31663155555725), + SCALE_SPLIT_ANGLE(2.84442567825317)}, + {SCALE_SPLIT_ANGLE(0.11467454582453), + SCALE_SPLIT_ANGLE(0.13146138191223), + SCALE_SPLIT_ANGLE(0.15621000528336), + SCALE_SPLIT_ANGLE(0.22212918102741), + SCALE_SPLIT_ANGLE(0.30330246686935), + SCALE_SPLIT_ANGLE(0.52478593587875), + SCALE_SPLIT_ANGLE(1.91173267364502), + SCALE_SPLIT_ANGLE(2.75908088684082)}, + {SCALE_SPLIT_ANGLE(0.10720870643854), + SCALE_SPLIT_ANGLE(0.11720535159111), + SCALE_SPLIT_ANGLE(0.13246683776379), + SCALE_SPLIT_ANGLE(0.17369449138641), + SCALE_SPLIT_ANGLE(0.22279064357281), + SCALE_SPLIT_ANGLE(0.34306266903877), + SCALE_SPLIT_ANGLE(1.11311781406403), + SCALE_SPLIT_ANGLE(2.55312228202820)}, + {SCALE_SPLIT_ANGLE(0.09705757349730), + SCALE_SPLIT_ANGLE(0.10320189595222), + SCALE_SPLIT_ANGLE(0.11274837702513), + SCALE_SPLIT_ANGLE(0.13873106241226), + SCALE_SPLIT_ANGLE(0.16888953745365), + SCALE_SPLIT_ANGLE(0.23647473752499), + SCALE_SPLIT_ANGLE(0.53898406028748), + SCALE_SPLIT_ANGLE(1.80699026584625)}, + {SCALE_SPLIT_ANGLE(0.08528346568346), + SCALE_SPLIT_ANGLE(0.08915080130100), + SCALE_SPLIT_ANGLE(0.09520188719034), + SCALE_SPLIT_ANGLE(0.11166745424271), + SCALE_SPLIT_ANGLE(0.13034184277058), + SCALE_SPLIT_ANGLE(0.16932605206966), + SCALE_SPLIT_ANGLE(0.29887470602989), + SCALE_SPLIT_ANGLE(0.63077676296234)}, + {SCALE_SPLIT_ANGLE(0.06733843684196), + SCALE_SPLIT_ANGLE(0.06931617110968), + SCALE_SPLIT_ANGLE(0.07241340726614), + SCALE_SPLIT_ANGLE(0.08076417446136), + SCALE_SPLIT_ANGLE(0.08993341028690), + SCALE_SPLIT_ANGLE(0.10759533941746), + SCALE_SPLIT_ANGLE(0.15204638242722), + SCALE_SPLIT_ANGLE(0.21143139898777)}, + {SCALE_SPLIT_ANGLE(0.05132640898228), + SCALE_SPLIT_ANGLE(0.05234802886844), + SCALE_SPLIT_ANGLE(0.05394187942147), + SCALE_SPLIT_ANGLE(0.05818277224898), + SCALE_SPLIT_ANGLE(0.06270807981491), + SCALE_SPLIT_ANGLE(0.07093632966280), + SCALE_SPLIT_ANGLE(0.08856786042452), + SCALE_SPLIT_ANGLE(0.10623694956303)}, + {SCALE_SPLIT_ANGLE(0.03821930661798), + SCALE_SPLIT_ANGLE(0.03874678537250), + SCALE_SPLIT_ANGLE(0.03956566005945), + SCALE_SPLIT_ANGLE(0.04171610623598), + SCALE_SPLIT_ANGLE(0.04395710676908), + SCALE_SPLIT_ANGLE(0.04786692932248), + SCALE_SPLIT_ANGLE(0.05546034500003), + SCALE_SPLIT_ANGLE(0.06201593577862)}, + {SCALE_SPLIT_ANGLE(0.02801758050919), + SCALE_SPLIT_ANGLE(0.02828873321414), + SCALE_SPLIT_ANGLE(0.02870770171285), + SCALE_SPLIT_ANGLE(0.02979558333755), + SCALE_SPLIT_ANGLE(0.03090834617615), + SCALE_SPLIT_ANGLE(0.03279331326485), + SCALE_SPLIT_ANGLE(0.03623208031058), + SCALE_SPLIT_ANGLE(0.03895835205913)}, + {SCALE_SPLIT_ANGLE(0.02032180689275), + SCALE_SPLIT_ANGLE(0.02046046219766), + SCALE_SPLIT_ANGLE(0.02067386545241), + SCALE_SPLIT_ANGLE(0.02122297696769), + SCALE_SPLIT_ANGLE(0.02177673391998), + SCALE_SPLIT_ANGLE(0.02269527874887), + SCALE_SPLIT_ANGLE(0.02430364489555), + SCALE_SPLIT_ANGLE(0.02551441825926)}, + {SCALE_SPLIT_ANGLE(0.01172095164657), + SCALE_SPLIT_ANGLE(0.01176583208144), + SCALE_SPLIT_ANGLE(0.01183457672596), + SCALE_SPLIT_ANGLE(0.01200959738344), + SCALE_SPLIT_ANGLE(0.01218330394477), + SCALE_SPLIT_ANGLE(0.01246506255120), + SCALE_SPLIT_ANGLE(0.01293875463307), + SCALE_SPLIT_ANGLE(0.01327861472964)}, + {SCALE_SPLIT_ANGLE(0.00668454170227), + SCALE_SPLIT_ANGLE(0.00669893343002), + SCALE_SPLIT_ANGLE(0.00672091403976), + SCALE_SPLIT_ANGLE(0.00677651492879), + SCALE_SPLIT_ANGLE(0.00683118170127), + SCALE_SPLIT_ANGLE(0.00691874232143), + SCALE_SPLIT_ANGLE(0.00706279883161), + SCALE_SPLIT_ANGLE(0.00716368528083)}, + {SCALE_SPLIT_ANGLE(0.00378863257356), + SCALE_SPLIT_ANGLE(0.00379322143272), + SCALE_SPLIT_ANGLE(0.00380021659657), + SCALE_SPLIT_ANGLE(0.00381784536876), + SCALE_SPLIT_ANGLE(0.00383508414961), + SCALE_SPLIT_ANGLE(0.00386250065640), + SCALE_SPLIT_ANGLE(0.00390707794577), + SCALE_SPLIT_ANGLE(0.00393790053204)}, + {SCALE_SPLIT_ANGLE(0.00213989755139), + SCALE_SPLIT_ANGLE(0.00214135553688), + SCALE_SPLIT_ANGLE(0.00214357557707), + SCALE_SPLIT_ANGLE(0.00214915862307), + SCALE_SPLIT_ANGLE(0.00215460127220), + SCALE_SPLIT_ANGLE(0.00216322275810), + SCALE_SPLIT_ANGLE(0.00217714952305), + SCALE_SPLIT_ANGLE(0.00218671280891)}, + {SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210151), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152), + SCALE_SPLIT_ANGLE(0.00000001210152)}, + }, + { + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000036774148), + SCALE_SPLIT_ANGLE(-0.00000066993488), + SCALE_SPLIT_ANGLE(-0.00001151842844), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000008554968), + SCALE_SPLIT_ANGLE(-0.00000012210570), + SCALE_SPLIT_ANGLE(-0.00000019699247), + SCALE_SPLIT_ANGLE(-0.00000110842382), + SCALE_SPLIT_ANGLE(-3.14159202575684), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000003016602), + SCALE_SPLIT_ANGLE(-0.00000005321843), + SCALE_SPLIT_ANGLE(-0.00000008440014), + SCALE_SPLIT_ANGLE(-0.00000020468090), + SCALE_SPLIT_ANGLE(-0.00000071846705), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000000024720), + SCALE_SPLIT_ANGLE(-0.00000003226497), + SCALE_SPLIT_ANGLE(-0.00000005171609), + SCALE_SPLIT_ANGLE(-0.00000010526998), + SCALE_SPLIT_ANGLE(-0.00000020551137), + SCALE_SPLIT_ANGLE(-1.57079637050629), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000001688349), + SCALE_SPLIT_ANGLE(-0.00000002741881), + SCALE_SPLIT_ANGLE(-0.00000003926384), + SCALE_SPLIT_ANGLE(-0.00000006928260), + SCALE_SPLIT_ANGLE(-0.00000011240582), + SCALE_SPLIT_ANGLE(-0.00000033763689), + SCALE_SPLIT_ANGLE(-3.14159250259399), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000002143362), + SCALE_SPLIT_ANGLE(-0.00000002640935), + SCALE_SPLIT_ANGLE(-0.00000003328325), + SCALE_SPLIT_ANGLE(-0.00000005112437), + SCALE_SPLIT_ANGLE(-0.00000007399619), + SCALE_SPLIT_ANGLE(-0.00000014946792), + SCALE_SPLIT_ANGLE(-3.14159226417542), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000002225921), + SCALE_SPLIT_ANGLE(-0.00000002497380), + SCALE_SPLIT_ANGLE(-0.00000002903169), + SCALE_SPLIT_ANGLE(-0.00000003987020), + SCALE_SPLIT_ANGLE(-0.00000005300816), + SCALE_SPLIT_ANGLE(-0.00000008783893), + SCALE_SPLIT_ANGLE(-0.00000093762065), + SCALE_SPLIT_ANGLE(-3.14159250259399)}, + {SCALE_SPLIT_ANGLE(-0.00000002109218), + SCALE_SPLIT_ANGLE(-0.00000002269230), + SCALE_SPLIT_ANGLE(-0.00000002515904), + SCALE_SPLIT_ANGLE(-0.00000003183984), + SCALE_SPLIT_ANGLE(-0.00000003965878), + SCALE_SPLIT_ANGLE(-0.00000005782364), + SCALE_SPLIT_ANGLE(-0.00000016152633), + SCALE_SPLIT_ANGLE(-3.14159226417542)}, + {SCALE_SPLIT_ANGLE(-0.00000001895314), + SCALE_SPLIT_ANGLE(-0.00000001993623), + SCALE_SPLIT_ANGLE(-0.00000002146927), + SCALE_SPLIT_ANGLE(-0.00000002563087), + SCALE_SPLIT_ANGLE(-0.00000003036888), + SCALE_SPLIT_ANGLE(-0.00000004043087), + SCALE_SPLIT_ANGLE(-0.00000007667983), + SCALE_SPLIT_ANGLE(-0.00000021028936)}, + {SCALE_SPLIT_ANGLE(-0.00000001519980), + SCALE_SPLIT_ANGLE(-0.00000001569144), + SCALE_SPLIT_ANGLE(-0.00000001646043), + SCALE_SPLIT_ANGLE(-0.00000001853141), + SCALE_SPLIT_ANGLE(-0.00000002080756), + SCALE_SPLIT_ANGLE(-0.00000002521688), + SCALE_SPLIT_ANGLE(-0.00000003656274), + SCALE_SPLIT_ANGLE(-0.00000005247700)}, + {SCALE_SPLIT_ANGLE(-0.00000001166148), + SCALE_SPLIT_ANGLE(-0.00000001191188), + SCALE_SPLIT_ANGLE(-0.00000001230229), + SCALE_SPLIT_ANGLE(-0.00000001334031), + SCALE_SPLIT_ANGLE(-0.00000001444787), + SCALE_SPLIT_ANGLE(-0.00000001646512), + SCALE_SPLIT_ANGLE(-0.00000002081803), + SCALE_SPLIT_ANGLE(-0.00000002523831)}, + {SCALE_SPLIT_ANGLE(-0.00000000870876), + SCALE_SPLIT_ANGLE(-0.00000000883681), + SCALE_SPLIT_ANGLE(-0.00000000903554), + SCALE_SPLIT_ANGLE(-0.00000000955712), + SCALE_SPLIT_ANGLE(-0.00000001010047), + SCALE_SPLIT_ANGLE(-0.00000001104868), + SCALE_SPLIT_ANGLE(-0.00000001289412), + SCALE_SPLIT_ANGLE(-0.00000001449405)}, + {SCALE_SPLIT_ANGLE(-0.00000000639270), + SCALE_SPLIT_ANGLE(-0.00000000645810), + SCALE_SPLIT_ANGLE(-0.00000000655912), + SCALE_SPLIT_ANGLE(-0.00000000682132), + SCALE_SPLIT_ANGLE(-0.00000000708940), + SCALE_SPLIT_ANGLE(-0.00000000754343), + SCALE_SPLIT_ANGLE(-0.00000000837207), + SCALE_SPLIT_ANGLE(-0.00000000902983)}, + {SCALE_SPLIT_ANGLE(-0.00000000463970), + SCALE_SPLIT_ANGLE(-0.00000000467299), + SCALE_SPLIT_ANGLE(-0.00000000472421), + SCALE_SPLIT_ANGLE(-0.00000000485598), + SCALE_SPLIT_ANGLE(-0.00000000498881), + SCALE_SPLIT_ANGLE(-0.00000000520907), + SCALE_SPLIT_ANGLE(-0.00000000559469), + SCALE_SPLIT_ANGLE(-0.00000000588504)}, + {SCALE_SPLIT_ANGLE(-0.00000000267713), + SCALE_SPLIT_ANGLE(-0.00000000268785), + SCALE_SPLIT_ANGLE(-0.00000000270428), + SCALE_SPLIT_ANGLE(-0.00000000274608), + SCALE_SPLIT_ANGLE(-0.00000000278756), + SCALE_SPLIT_ANGLE(-0.00000000285483), + SCALE_SPLIT_ANGLE(-0.00000000296788), + SCALE_SPLIT_ANGLE(-0.00000000304897)}, + {SCALE_SPLIT_ANGLE(-0.00000000152698), + SCALE_SPLIT_ANGLE(-0.00000000153041), + SCALE_SPLIT_ANGLE(-0.00000000153564), + SCALE_SPLIT_ANGLE(-0.00000000154889), + SCALE_SPLIT_ANGLE(-0.00000000156191), + SCALE_SPLIT_ANGLE(-0.00000000158277), + SCALE_SPLIT_ANGLE(-0.00000000161707), + SCALE_SPLIT_ANGLE(-0.00000000164109)}, + {SCALE_SPLIT_ANGLE(-0.00000000086549), + SCALE_SPLIT_ANGLE(-0.00000000086658), + SCALE_SPLIT_ANGLE(-0.00000000086824), + SCALE_SPLIT_ANGLE(-0.00000000087244), + SCALE_SPLIT_ANGLE(-0.00000000087654), + SCALE_SPLIT_ANGLE(-0.00000000088306), + SCALE_SPLIT_ANGLE(-0.00000000089366), + SCALE_SPLIT_ANGLE(-0.00000000090099)}, + {SCALE_SPLIT_ANGLE(-0.00000000048885), + SCALE_SPLIT_ANGLE(-0.00000000048920), + SCALE_SPLIT_ANGLE(-0.00000000048972), + SCALE_SPLIT_ANGLE(-0.00000000049105), + SCALE_SPLIT_ANGLE(-0.00000000049235), + SCALE_SPLIT_ANGLE(-0.00000000049439), + SCALE_SPLIT_ANGLE(-0.00000000049770), + SCALE_SPLIT_ANGLE(-0.00000000049998)}, + {SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000), + SCALE_SPLIT_ANGLE(-0.00000000000000)}, + }, + { + {SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439), + SCALE_SPLIT_ANGLE(-2.74889349937439)}, + {SCALE_SPLIT_ANGLE(-2.74670672416687), + SCALE_SPLIT_ANGLE(-2.74670815467834), + SCALE_SPLIT_ANGLE(-2.74671053886414), + SCALE_SPLIT_ANGLE(-2.74671626091003), + SCALE_SPLIT_ANGLE(-2.74672174453735), + SCALE_SPLIT_ANGLE(-2.74673032760620), + SCALE_SPLIT_ANGLE(-2.74674415588379), + SCALE_SPLIT_ANGLE(-2.74675369262695)}, + {SCALE_SPLIT_ANGLE(-2.74495577812195), + SCALE_SPLIT_ANGLE(-2.74496054649353), + SCALE_SPLIT_ANGLE(-2.74496769905090), + SCALE_SPLIT_ANGLE(-2.74498581886292), + SCALE_SPLIT_ANGLE(-2.74500346183777), + SCALE_SPLIT_ANGLE(-2.74503111839294), + SCALE_SPLIT_ANGLE(-2.74507522583008), + SCALE_SPLIT_ANGLE(-2.74510502815247)}, + {SCALE_SPLIT_ANGLE(-2.74173235893250), + SCALE_SPLIT_ANGLE(-2.74174761772156), + SCALE_SPLIT_ANGLE(-2.74177098274231), + SCALE_SPLIT_ANGLE(-2.74182963371277), + SCALE_SPLIT_ANGLE(-2.74188613891602), + SCALE_SPLIT_ANGLE(-2.74197483062744), + SCALE_SPLIT_ANGLE(-2.74211597442627), + SCALE_SPLIT_ANGLE(-2.74221134185791)}, + {SCALE_SPLIT_ANGLE(-2.73563575744629), + SCALE_SPLIT_ANGLE(-2.73568654060364), + SCALE_SPLIT_ANGLE(-2.73576331138611), + SCALE_SPLIT_ANGLE(-2.73595523834229), + SCALE_SPLIT_ANGLE(-2.73614001274109), + SCALE_SPLIT_ANGLE(-2.73642849922180), + SCALE_SPLIT_ANGLE(-2.73688435554504), + SCALE_SPLIT_ANGLE(-2.73719096183777)}, + {SCALE_SPLIT_ANGLE(-2.72353172302246), + SCALE_SPLIT_ANGLE(-2.72370529174805), + SCALE_SPLIT_ANGLE(-2.72396802902222), + SCALE_SPLIT_ANGLE(-2.72461819648743), + SCALE_SPLIT_ANGLE(-2.72523903846741), + SCALE_SPLIT_ANGLE(-2.72619819641113), + SCALE_SPLIT_ANGLE(-2.72769522666931), + SCALE_SPLIT_ANGLE(-2.72869181632996)}, + {SCALE_SPLIT_ANGLE(-2.71044111251831), + SCALE_SPLIT_ANGLE(-2.71081781387329), + SCALE_SPLIT_ANGLE(-2.71138477325439), + SCALE_SPLIT_ANGLE(-2.71277689933777), + SCALE_SPLIT_ANGLE(-2.71409153938293), + SCALE_SPLIT_ANGLE(-2.71610021591187), + SCALE_SPLIT_ANGLE(-2.71919155120850), + SCALE_SPLIT_ANGLE(-2.72123122215271)}, + {SCALE_SPLIT_ANGLE(-2.68862843513489), + SCALE_SPLIT_ANGLE(-2.68948626518250), + SCALE_SPLIT_ANGLE(-2.69076681137085), + SCALE_SPLIT_ANGLE(-2.69386243820190), + SCALE_SPLIT_ANGLE(-2.69673061370850), + SCALE_SPLIT_ANGLE(-2.70102667808533), + SCALE_SPLIT_ANGLE(-2.70749115943909), + SCALE_SPLIT_ANGLE(-2.71170234680176)}, + {SCALE_SPLIT_ANGLE(-2.64932370185852), + SCALE_SPLIT_ANGLE(-2.65145063400269), + SCALE_SPLIT_ANGLE(-2.65457701683044), + SCALE_SPLIT_ANGLE(-2.66191530227661), + SCALE_SPLIT_ANGLE(-2.66847491264343), + SCALE_SPLIT_ANGLE(-2.67795729637146), + SCALE_SPLIT_ANGLE(-2.69169569015503), + SCALE_SPLIT_ANGLE(-2.70048117637634)}, + {SCALE_SPLIT_ANGLE(-2.56864428520203), + SCALE_SPLIT_ANGLE(-2.57483482360840), + SCALE_SPLIT_ANGLE(-2.58364057540894), + SCALE_SPLIT_ANGLE(-2.60311055183411), + SCALE_SPLIT_ANGLE(-2.61933612823486), + SCALE_SPLIT_ANGLE(-2.64129829406738), + SCALE_SPLIT_ANGLE(-2.67107868194580), + SCALE_SPLIT_ANGLE(-2.68960881233215)}, + {SCALE_SPLIT_ANGLE(-2.35773015022278), + SCALE_SPLIT_ANGLE(-2.38251185417175), + SCALE_SPLIT_ANGLE(-2.41520094871521), + SCALE_SPLIT_ANGLE(-2.47876906394959), + SCALE_SPLIT_ANGLE(-2.52468156814575), + SCALE_SPLIT_ANGLE(-2.57956743240356), + SCALE_SPLIT_ANGLE(-2.64563965797424), + SCALE_SPLIT_ANGLE(-2.68501615524292)}, + {SCALE_SPLIT_ANGLE(-1.95455360412598), + SCALE_SPLIT_ANGLE(-2.03550028800964), + SCALE_SPLIT_ANGLE(-2.13431143760681), + SCALE_SPLIT_ANGLE(-2.30167627334595), + SCALE_SPLIT_ANGLE(-2.40472936630249), + SCALE_SPLIT_ANGLE(-2.51241874694824), + SCALE_SPLIT_ANGLE(-2.62649774551392), + SCALE_SPLIT_ANGLE(-2.69151234626770)}, + {SCALE_SPLIT_ANGLE(-1.08639836311340), + SCALE_SPLIT_ANGLE(-1.25607907772064), + SCALE_SPLIT_ANGLE(-1.49360668659210), + SCALE_SPLIT_ANGLE(-1.93062829971313), + SCALE_SPLIT_ANGLE(-2.18087887763977), + SCALE_SPLIT_ANGLE(-2.40583086013794), + SCALE_SPLIT_ANGLE(-2.60574340820313), + SCALE_SPLIT_ANGLE(-2.71224212646484)}, + {SCALE_SPLIT_ANGLE(-0.46298858523369), + SCALE_SPLIT_ANGLE(-0.57069414854050), + SCALE_SPLIT_ANGLE(-0.74941855669022), + SCALE_SPLIT_ANGLE(-1.27059125900269), + SCALE_SPLIT_ANGLE(-1.74987781047821), + SCALE_SPLIT_ANGLE(-2.22410750389099), + SCALE_SPLIT_ANGLE(-2.58140015602112), + SCALE_SPLIT_ANGLE(-2.75301027297974)}, + {SCALE_SPLIT_ANGLE(-0.23063215613365), + SCALE_SPLIT_ANGLE(-0.29689297080040), + SCALE_SPLIT_ANGLE(-0.39820960164070), + SCALE_SPLIT_ANGLE(-0.70773017406464), + SCALE_SPLIT_ANGLE(-1.13546574115753), + SCALE_SPLIT_ANGLE(-1.89722001552582), + SCALE_SPLIT_ANGLE(-2.54544782638550), + SCALE_SPLIT_ANGLE(-2.81490182876587)}, + {SCALE_SPLIT_ANGLE(-0.14590544998646), + SCALE_SPLIT_ANGLE(-0.19153350591660), + SCALE_SPLIT_ANGLE(-0.25519016385078), + SCALE_SPLIT_ANGLE(-0.43163704872131), + SCALE_SPLIT_ANGLE(-0.67776852846146), + SCALE_SPLIT_ANGLE(-1.37444674968719), + SCALE_SPLIT_ANGLE(-2.47591280937195), + SCALE_SPLIT_ANGLE(-2.87223863601685)}, + {SCALE_SPLIT_ANGLE(-0.12191534787416), + SCALE_SPLIT_ANGLE(-0.15053887665272), + SCALE_SPLIT_ANGLE(-0.19072306156158), + SCALE_SPLIT_ANGLE(-0.29725372791290), + SCALE_SPLIT_ANGLE(-0.43550038337708), + SCALE_SPLIT_ANGLE(-0.85167348384857), + SCALE_SPLIT_ANGLE(-2.31663155555725), + SCALE_SPLIT_ANGLE(-2.84442567825317)}, + {SCALE_SPLIT_ANGLE(-0.11467452347279), + SCALE_SPLIT_ANGLE(-0.13146135210991), + SCALE_SPLIT_ANGLE(-0.15620997548103), + SCALE_SPLIT_ANGLE(-0.22212913632393), + SCALE_SPLIT_ANGLE(-0.30330240726471), + SCALE_SPLIT_ANGLE(-0.52478587627411), + SCALE_SPLIT_ANGLE(-1.91173267364502), + SCALE_SPLIT_ANGLE(-2.75908088684082)}, + {SCALE_SPLIT_ANGLE(-0.10720869153738), + SCALE_SPLIT_ANGLE(-0.11720532923937), + SCALE_SPLIT_ANGLE(-0.13246680796146), + SCALE_SPLIT_ANGLE(-0.17369446158409), + SCALE_SPLIT_ANGLE(-0.22279061377048), + SCALE_SPLIT_ANGLE(-0.34306260943413), + SCALE_SPLIT_ANGLE(-1.11311769485474), + SCALE_SPLIT_ANGLE(-2.55312228202820)}, + {SCALE_SPLIT_ANGLE(-0.09705755859613), + SCALE_SPLIT_ANGLE(-0.10320188105106), + SCALE_SPLIT_ANGLE(-0.11274836212397), + SCALE_SPLIT_ANGLE(-0.13873104751110), + SCALE_SPLIT_ANGLE(-0.16888950765133), + SCALE_SPLIT_ANGLE(-0.23647469282150), + SCALE_SPLIT_ANGLE(-0.53898400068283), + SCALE_SPLIT_ANGLE(-1.80699026584625)}, + {SCALE_SPLIT_ANGLE(-0.08528345078230), + SCALE_SPLIT_ANGLE(-0.08915078639984), + SCALE_SPLIT_ANGLE(-0.09520187228918), + SCALE_SPLIT_ANGLE(-0.11166743934155), + SCALE_SPLIT_ANGLE(-0.13034182786942), + SCALE_SPLIT_ANGLE(-0.16932602226734), + SCALE_SPLIT_ANGLE(-0.29887464642525), + SCALE_SPLIT_ANGLE(-0.63077670335770)}, + {SCALE_SPLIT_ANGLE(-0.06733842939138), + SCALE_SPLIT_ANGLE(-0.06931615620852), + SCALE_SPLIT_ANGLE(-0.07241339236498), + SCALE_SPLIT_ANGLE(-0.08076415956020), + SCALE_SPLIT_ANGLE(-0.08993339538574), + SCALE_SPLIT_ANGLE(-0.10759532451630), + SCALE_SPLIT_ANGLE(-0.15204635262489), + SCALE_SPLIT_ANGLE(-0.21143136918545)}, + {SCALE_SPLIT_ANGLE(-0.05132640153170), + SCALE_SPLIT_ANGLE(-0.05234802141786), + SCALE_SPLIT_ANGLE(-0.05394186824560), + SCALE_SPLIT_ANGLE(-0.05818276479840), + SCALE_SPLIT_ANGLE(-0.06270807236433), + SCALE_SPLIT_ANGLE(-0.07093632221222), + SCALE_SPLIT_ANGLE(-0.08856784552336), + SCALE_SPLIT_ANGLE(-0.10623692721128)}, + {SCALE_SPLIT_ANGLE(-0.03821930289268), + SCALE_SPLIT_ANGLE(-0.03874678164721), + SCALE_SPLIT_ANGLE(-0.03956565260887), + SCALE_SPLIT_ANGLE(-0.04171609878540), + SCALE_SPLIT_ANGLE(-0.04395709931850), + SCALE_SPLIT_ANGLE(-0.04786692187190), + SCALE_SPLIT_ANGLE(-0.05546033382416), + SCALE_SPLIT_ANGLE(-0.06201592460275)}, + {SCALE_SPLIT_ANGLE(-0.02801757678390), + SCALE_SPLIT_ANGLE(-0.02828872948885), + SCALE_SPLIT_ANGLE(-0.02870769798756), + SCALE_SPLIT_ANGLE(-0.02979557774961), + SCALE_SPLIT_ANGLE(-0.03090834245086), + SCALE_SPLIT_ANGLE(-0.03279330953956), + SCALE_SPLIT_ANGLE(-0.03623207286000), + SCALE_SPLIT_ANGLE(-0.03895834833384)}, + {SCALE_SPLIT_ANGLE(-0.02032180316746), + SCALE_SPLIT_ANGLE(-0.02046045847237), + SCALE_SPLIT_ANGLE(-0.02067386172712), + SCALE_SPLIT_ANGLE(-0.02122297324240), + SCALE_SPLIT_ANGLE(-0.02177673205733), + SCALE_SPLIT_ANGLE(-0.02269527502358), + SCALE_SPLIT_ANGLE(-0.02430364117026), + SCALE_SPLIT_ANGLE(-0.02551441267133)}, + {SCALE_SPLIT_ANGLE(-0.01172094978392), + SCALE_SPLIT_ANGLE(-0.01176583021879), + SCALE_SPLIT_ANGLE(-0.01183457486331), + SCALE_SPLIT_ANGLE(-0.01200959552079), + SCALE_SPLIT_ANGLE(-0.01218330208212), + SCALE_SPLIT_ANGLE(-0.01246506068856), + SCALE_SPLIT_ANGLE(-0.01293875277042), + SCALE_SPLIT_ANGLE(-0.01327861286700)}, + {SCALE_SPLIT_ANGLE(-0.00668454030529), + SCALE_SPLIT_ANGLE(-0.00669893249869), + SCALE_SPLIT_ANGLE(-0.00672091310844), + SCALE_SPLIT_ANGLE(-0.00677651399747), + SCALE_SPLIT_ANGLE(-0.00683118030429), + SCALE_SPLIT_ANGLE(-0.00691874139011), + SCALE_SPLIT_ANGLE(-0.00706279790029), + SCALE_SPLIT_ANGLE(-0.00716368434951)}, + {SCALE_SPLIT_ANGLE(-0.00378863210790), + SCALE_SPLIT_ANGLE(-0.00379322096705), + SCALE_SPLIT_ANGLE(-0.00380021613091), + SCALE_SPLIT_ANGLE(-0.00381784490310), + SCALE_SPLIT_ANGLE(-0.00383508345112), + SCALE_SPLIT_ANGLE(-0.00386250019073), + SCALE_SPLIT_ANGLE(-0.00390707701445), + SCALE_SPLIT_ANGLE(-0.00393790006638)}, + {SCALE_SPLIT_ANGLE(-0.00213989731856), + SCALE_SPLIT_ANGLE(-0.00214135507122), + SCALE_SPLIT_ANGLE(-0.00214357534423), + SCALE_SPLIT_ANGLE(-0.00214915839024), + SCALE_SPLIT_ANGLE(-0.00215460080653), + SCALE_SPLIT_ANGLE(-0.00216322229244), + SCALE_SPLIT_ANGLE(-0.00217714929022), + SCALE_SPLIT_ANGLE(-0.00218671257608)}, + {SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151)}, + }, + { + {SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479), + SCALE_SPLIT_ANGLE(-2.35619449615479)}, + {SCALE_SPLIT_ANGLE(-2.35216379165649), + SCALE_SPLIT_ANGLE(-2.35216617584229), + SCALE_SPLIT_ANGLE(-2.35216999053955), + SCALE_SPLIT_ANGLE(-2.35217928886414), + SCALE_SPLIT_ANGLE(-2.35218811035156), + SCALE_SPLIT_ANGLE(-2.35220241546631), + SCALE_SPLIT_ANGLE(-2.35222506523132), + SCALE_SPLIT_ANGLE(-2.35224032402039)}, + {SCALE_SPLIT_ANGLE(-2.34895062446594), + SCALE_SPLIT_ANGLE(-2.34895849227905), + SCALE_SPLIT_ANGLE(-2.34897017478943), + SCALE_SPLIT_ANGLE(-2.34899973869324), + SCALE_SPLIT_ANGLE(-2.34902834892273), + SCALE_SPLIT_ANGLE(-2.34907317161560), + SCALE_SPLIT_ANGLE(-2.34914541244507), + SCALE_SPLIT_ANGLE(-2.34919428825378)}, + {SCALE_SPLIT_ANGLE(-2.34306836128235), + SCALE_SPLIT_ANGLE(-2.34309315681458), + SCALE_SPLIT_ANGLE(-2.34313082695007), + SCALE_SPLIT_ANGLE(-2.34322524070740), + SCALE_SPLIT_ANGLE(-2.34331679344177), + SCALE_SPLIT_ANGLE(-2.34346079826355), + SCALE_SPLIT_ANGLE(-2.34369087219238), + SCALE_SPLIT_ANGLE(-2.34384727478027)}, + {SCALE_SPLIT_ANGLE(-2.33205747604370), + SCALE_SPLIT_ANGLE(-2.33213782310486), + SCALE_SPLIT_ANGLE(-2.33226013183594), + SCALE_SPLIT_ANGLE(-2.33256602287292), + SCALE_SPLIT_ANGLE(-2.33286190032959), + SCALE_SPLIT_ANGLE(-2.33332633972168), + SCALE_SPLIT_ANGLE(-2.33406710624695), + SCALE_SPLIT_ANGLE(-2.33456921577454)}, + {SCALE_SPLIT_ANGLE(-2.31062936782837), + SCALE_SPLIT_ANGLE(-2.31089687347412), + SCALE_SPLIT_ANGLE(-2.31130218505859), + SCALE_SPLIT_ANGLE(-2.31231284141541), + SCALE_SPLIT_ANGLE(-2.31328654289246), + SCALE_SPLIT_ANGLE(-2.31480813026428), + SCALE_SPLIT_ANGLE(-2.31722092628479), + SCALE_SPLIT_ANGLE(-2.31885290145874)}, + {SCALE_SPLIT_ANGLE(-2.28808355331421), + SCALE_SPLIT_ANGLE(-2.28864479064941), + SCALE_SPLIT_ANGLE(-2.28949403762817), + SCALE_SPLIT_ANGLE(-2.29160070419312), + SCALE_SPLIT_ANGLE(-2.29361891746521), + SCALE_SPLIT_ANGLE(-2.29675459861755), + SCALE_SPLIT_ANGLE(-2.30169844627380), + SCALE_SPLIT_ANGLE(-2.30503511428833)}, + {SCALE_SPLIT_ANGLE(-2.25191521644592), + SCALE_SPLIT_ANGLE(-2.25312590599060), + SCALE_SPLIT_ANGLE(-2.25494933128357), + SCALE_SPLIT_ANGLE(-2.25943517684937), + SCALE_SPLIT_ANGLE(-2.26368904113770), + SCALE_SPLIT_ANGLE(-2.27023124694824), + SCALE_SPLIT_ANGLE(-2.28044486045837), + SCALE_SPLIT_ANGLE(-2.28732323646545)}, + {SCALE_SPLIT_ANGLE(-2.19093608856201), + SCALE_SPLIT_ANGLE(-2.19366121292114), + SCALE_SPLIT_ANGLE(-2.19773292541504), + SCALE_SPLIT_ANGLE(-2.20759749412537), + SCALE_SPLIT_ANGLE(-2.21677803993225), + SCALE_SPLIT_ANGLE(-2.23064494132996), + SCALE_SPLIT_ANGLE(-2.25193929672241), + SCALE_SPLIT_ANGLE(-2.26625943183899)}, + {SCALE_SPLIT_ANGLE(-2.08102917671204), + SCALE_SPLIT_ANGLE(-2.08757305145264), + SCALE_SPLIT_ANGLE(-2.09720730781555), + SCALE_SPLIT_ANGLE(-2.11991167068481), + SCALE_SPLIT_ANGLE(-2.14035677909851), + SCALE_SPLIT_ANGLE(-2.17029237747192), + SCALE_SPLIT_ANGLE(-2.21503162384033), + SCALE_SPLIT_ANGLE(-2.24518132209778)}, + {SCALE_SPLIT_ANGLE(-1.86738622188568), + SCALE_SPLIT_ANGLE(-1.88426077365875), + SCALE_SPLIT_ANGLE(-1.90853285789490), + SCALE_SPLIT_ANGLE(-1.96333336830139), + SCALE_SPLIT_ANGLE(-2.01024460792542), + SCALE_SPLIT_ANGLE(-2.07577633857727), + SCALE_SPLIT_ANGLE(-2.16986608505249), + SCALE_SPLIT_ANGLE(-2.23406052589417)}, + {SCALE_SPLIT_ANGLE(-1.61812186241150), + SCALE_SPLIT_ANGLE(-1.64943766593933), + SCALE_SPLIT_ANGLE(-1.69389247894287), + SCALE_SPLIT_ANGLE(-1.79176032543182), + SCALE_SPLIT_ANGLE(-1.87292504310608), + SCALE_SPLIT_ANGLE(-1.98277997970581), + SCALE_SPLIT_ANGLE(-2.13605833053589), + SCALE_SPLIT_ANGLE(-2.24282979965210)}, + {SCALE_SPLIT_ANGLE(-1.26556181907654), + SCALE_SPLIT_ANGLE(-1.31512010097504), + SCALE_SPLIT_ANGLE(-1.38608694076538), + SCALE_SPLIT_ANGLE(-1.54419946670532), + SCALE_SPLIT_ANGLE(-1.67621028423309), + SCALE_SPLIT_ANGLE(-1.85417354106903), + SCALE_SPLIT_ANGLE(-2.09956336021423), + SCALE_SPLIT_ANGLE(-2.27729439735413)}, + {SCALE_SPLIT_ANGLE(-0.88984858989716), + SCALE_SPLIT_ANGLE(-0.94673115015030), + SCALE_SPLIT_ANGLE(-1.03102219104767), + SCALE_SPLIT_ANGLE(-1.23219704627991), + SCALE_SPLIT_ANGLE(-1.41468596458435), + SCALE_SPLIT_ANGLE(-1.67807447910309), + SCALE_SPLIT_ANGLE(-2.05749273300171), + SCALE_SPLIT_ANGLE(-2.35138511657715)}, + {SCALE_SPLIT_ANGLE(-0.60630625486374), + SCALE_SPLIT_ANGLE(-0.65551131963730), + SCALE_SPLIT_ANGLE(-0.73032110929489), + SCALE_SPLIT_ANGLE(-0.92225730419159), + SCALE_SPLIT_ANGLE(-1.11866605281830), + SCALE_SPLIT_ANGLE(-1.44806659221649), + SCALE_SPLIT_ANGLE(-1.99872648715973), + SCALE_SPLIT_ANGLE(-2.47302079200745)}, + {SCALE_SPLIT_ANGLE(-0.43393719196320), + SCALE_SPLIT_ANGLE(-0.47099208831787), + SCALE_SPLIT_ANGLE(-0.52780753374100), + SCALE_SPLIT_ANGLE(-0.67895972728729), + SCALE_SPLIT_ANGLE(-0.84712409973145), + SCALE_SPLIT_ANGLE(-1.17809724807739), + SCALE_SPLIT_ANGLE(-1.89703977108002), + SCALE_SPLIT_ANGLE(-2.59155678749084)}, + {SCALE_SPLIT_ANGLE(-0.33522716164589), + SCALE_SPLIT_ANGLE(-0.36133098602295), + SCALE_SPLIT_ANGLE(-0.40159514546394), + SCALE_SPLIT_ANGLE(-0.51039946079254), + SCALE_SPLIT_ANGLE(-0.63590413331985), + SCALE_SPLIT_ANGLE(-0.90812796354294), + SCALE_SPLIT_ANGLE(-1.70793569087982), + SCALE_SPLIT_ANGLE(-2.52852439880371)}, + {SCALE_SPLIT_ANGLE(-0.27478921413422), + SCALE_SPLIT_ANGLE(-0.29251146316528), + SCALE_SPLIT_ANGLE(-0.32007753849030), + SCALE_SPLIT_ANGLE(-0.39531296491623), + SCALE_SPLIT_ANGLE(-0.48291319608688), + SCALE_SPLIT_ANGLE(-0.67812001705170), + SCALE_SPLIT_ANGLE(-1.39007341861725), + SCALE_SPLIT_ANGLE(-2.34402585029602)}, + {SCALE_SPLIT_ANGLE(-0.23185737431049), + SCALE_SPLIT_ANGLE(-0.24370788037777), + SCALE_SPLIT_ANGLE(-0.26227977871895), + SCALE_SPLIT_ANGLE(-0.31327378749847), + SCALE_SPLIT_ANGLE(-0.37241828441620), + SCALE_SPLIT_ANGLE(-0.50202107429504), + SCALE_SPLIT_ANGLE(-0.99085599184036), + SCALE_SPLIT_ANGLE(-1.96553480625153)}, + {SCALE_SPLIT_ANGLE(-0.19698302447796), + SCALE_SPLIT_ANGLE(-0.20488265156746), + SCALE_SPLIT_ANGLE(-0.21731522679329), + SCALE_SPLIT_ANGLE(-0.25148209929466), + SCALE_SPLIT_ANGLE(-0.29065513610840), + SCALE_SPLIT_ANGLE(-0.37341463565826), + SCALE_SPLIT_ANGLE(-0.65295964479446), + SCALE_SPLIT_ANGLE(-1.28865838050842)}, + {SCALE_SPLIT_ANGLE(-0.16667704284191), + SCALE_SPLIT_ANGLE(-0.17194209992886), + SCALE_SPLIT_ANGLE(-0.18023575842381), + SCALE_SPLIT_ANGLE(-0.20293866097927), + SCALE_SPLIT_ANGLE(-0.22855132818222), + SCALE_SPLIT_ANGLE(-0.28041815757751), + SCALE_SPLIT_ANGLE(-0.43142417073250), + SCALE_SPLIT_ANGLE(-0.70030152797699)}, + {SCALE_SPLIT_ANGLE(-0.12773875892162), + SCALE_SPLIT_ANGLE(-0.13059368729591), + SCALE_SPLIT_ANGLE(-0.13507817685604), + SCALE_SPLIT_ANGLE(-0.14721076190472), + SCALE_SPLIT_ANGLE(-0.16052411496639), + SCALE_SPLIT_ANGLE(-0.18590225279331), + SCALE_SPLIT_ANGLE(-0.24703903496265), + SCALE_SPLIT_ANGLE(-0.32153329253197)}, + {SCALE_SPLIT_ANGLE(-0.09603262692690), + SCALE_SPLIT_ANGLE(-0.09756571799517), + SCALE_SPLIT_ANGLE(-0.09996144473553), + SCALE_SPLIT_ANGLE(-0.10635072737932), + SCALE_SPLIT_ANGLE(-0.11317525804043), + SCALE_SPLIT_ANGLE(-0.12554959952831), + SCALE_SPLIT_ANGLE(-0.15168417990208), + SCALE_SPLIT_ANGLE(-0.17713625729084)}, + {SCALE_SPLIT_ANGLE(-0.07104730606079), + SCALE_SPLIT_ANGLE(-0.07186015695333), + SCALE_SPLIT_ANGLE(-0.07312334328890), + SCALE_SPLIT_ANGLE(-0.07644615322351), + SCALE_SPLIT_ANGLE(-0.07991369068623), + SCALE_SPLIT_ANGLE(-0.08596337586641), + SCALE_SPLIT_ANGLE(-0.09766443073750), + SCALE_SPLIT_ANGLE(-0.10767272859812)}, + {SCALE_SPLIT_ANGLE(-0.05192205309868), + SCALE_SPLIT_ANGLE(-0.05234766378999), + SCALE_SPLIT_ANGLE(-0.05300575867295), + SCALE_SPLIT_ANGLE(-0.05471667274833), + SCALE_SPLIT_ANGLE(-0.05646898224950), + SCALE_SPLIT_ANGLE(-0.05943990871310), + SCALE_SPLIT_ANGLE(-0.06485753506422), + SCALE_SPLIT_ANGLE(-0.06914159655571)}, + {SCALE_SPLIT_ANGLE(-0.03760398924351), + SCALE_SPLIT_ANGLE(-0.03782445192337), + SCALE_SPLIT_ANGLE(-0.03816392645240), + SCALE_SPLIT_ANGLE(-0.03903824090958), + SCALE_SPLIT_ANGLE(-0.03992090001702), + SCALE_SPLIT_ANGLE(-0.04138650000095), + SCALE_SPLIT_ANGLE(-0.04395476356149), + SCALE_SPLIT_ANGLE(-0.04588782414794)}, + {SCALE_SPLIT_ANGLE(-0.02166714519262), + SCALE_SPLIT_ANGLE(-0.02173947915435), + SCALE_SPLIT_ANGLE(-0.02185030654073), + SCALE_SPLIT_ANGLE(-0.02213260345161), + SCALE_SPLIT_ANGLE(-0.02241297997534), + SCALE_SPLIT_ANGLE(-0.02286812663078), + SCALE_SPLIT_ANGLE(-0.02363408729434), + SCALE_SPLIT_ANGLE(-0.02418405003846)}, + {SCALE_SPLIT_ANGLE(-0.01235313713551), + SCALE_SPLIT_ANGLE(-0.01237650867552), + SCALE_SPLIT_ANGLE(-0.01241220720112), + SCALE_SPLIT_ANGLE(-0.01250253617764), + SCALE_SPLIT_ANGLE(-0.01259138714522), + SCALE_SPLIT_ANGLE(-0.01273377239704), + SCALE_SPLIT_ANGLE(-0.01296819653362), + SCALE_SPLIT_ANGLE(-0.01313247904181)}, + {SCALE_SPLIT_ANGLE(-0.00700078438967), + SCALE_SPLIT_ANGLE(-0.00700826710090), + SCALE_SPLIT_ANGLE(-0.00701967626810), + SCALE_SPLIT_ANGLE(-0.00704843178391), + SCALE_SPLIT_ANGLE(-0.00707655726001), + SCALE_SPLIT_ANGLE(-0.00712130265310), + SCALE_SPLIT_ANGLE(-0.00719408923760), + SCALE_SPLIT_ANGLE(-0.00724443932995)}, + {SCALE_SPLIT_ANGLE(-0.00395406875759), + SCALE_SPLIT_ANGLE(-0.00395645154640), + SCALE_SPLIT_ANGLE(-0.00396008091047), + SCALE_SPLIT_ANGLE(-0.00396920833737), + SCALE_SPLIT_ANGLE(-0.00397810759023), + SCALE_SPLIT_ANGLE(-0.00399220641702), + SCALE_SPLIT_ANGLE(-0.00401498842984), + SCALE_SPLIT_ANGLE(-0.00403063651174)}, + {SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518), + SCALE_SPLIT_ANGLE(-1.96349549293518)}, + {SCALE_SPLIT_ANGLE(-1.95824849605560), + SCALE_SPLIT_ANGLE(-1.95825111865997), + SCALE_SPLIT_ANGLE(-1.95825493335724), + SCALE_SPLIT_ANGLE(-1.95826470851898), + SCALE_SPLIT_ANGLE(-1.95827412605286), + SCALE_SPLIT_ANGLE(-1.95828902721405), + SCALE_SPLIT_ANGLE(-1.95831298828125), + SCALE_SPLIT_ANGLE(-1.95832931995392)}, + {SCALE_SPLIT_ANGLE(-1.95409321784973), + SCALE_SPLIT_ANGLE(-1.95410120487213), + SCALE_SPLIT_ANGLE(-1.95411348342896), + SCALE_SPLIT_ANGLE(-1.95414435863495), + SCALE_SPLIT_ANGLE(-1.95417428016663), + SCALE_SPLIT_ANGLE(-1.95422148704529), + SCALE_SPLIT_ANGLE(-1.95429742336273), + SCALE_SPLIT_ANGLE(-1.95434927940369)}, + {SCALE_SPLIT_ANGLE(-1.94654786586761), + SCALE_SPLIT_ANGLE(-1.94657349586487), + SCALE_SPLIT_ANGLE(-1.94661235809326), + SCALE_SPLIT_ANGLE(-1.94671010971069), + SCALE_SPLIT_ANGLE(-1.94680511951447), + SCALE_SPLIT_ANGLE(-1.94695532321930), + SCALE_SPLIT_ANGLE(-1.94719707965851), + SCALE_SPLIT_ANGLE(-1.94736242294312)}, + {SCALE_SPLIT_ANGLE(-1.93263387680054), + SCALE_SPLIT_ANGLE(-1.93271505832672), + SCALE_SPLIT_ANGLE(-1.93283867835999), + SCALE_SPLIT_ANGLE(-1.93314921855927), + SCALE_SPLIT_ANGLE(-1.93345177173615), + SCALE_SPLIT_ANGLE(-1.93393063545227), + SCALE_SPLIT_ANGLE(-1.93470406532288), + SCALE_SPLIT_ANGLE(-1.93523526191711)}, + {SCALE_SPLIT_ANGLE(-1.90630447864532), + SCALE_SPLIT_ANGLE(-1.90656316280365), + SCALE_SPLIT_ANGLE(-1.90695703029633), + SCALE_SPLIT_ANGLE(-1.90794789791107), + SCALE_SPLIT_ANGLE(-1.90891468524933), + SCALE_SPLIT_ANGLE(-1.91044914722443), + SCALE_SPLIT_ANGLE(-1.91294133663177), + SCALE_SPLIT_ANGLE(-1.91466677188873)}, + {SCALE_SPLIT_ANGLE(-1.87960767745972), + SCALE_SPLIT_ANGLE(-1.88012754917145), + SCALE_SPLIT_ANGLE(-1.88091945648193), + SCALE_SPLIT_ANGLE(-1.88291203975677), + SCALE_SPLIT_ANGLE(-1.88485789299011), + SCALE_SPLIT_ANGLE(-1.88795256614685), + SCALE_SPLIT_ANGLE(-1.89300417900085), + SCALE_SPLIT_ANGLE(-1.89653015136719)}, + {SCALE_SPLIT_ANGLE(-1.83877408504486), + SCALE_SPLIT_ANGLE(-1.83982253074646), + SCALE_SPLIT_ANGLE(-1.84141874313354), + SCALE_SPLIT_ANGLE(-1.84543371200562), + SCALE_SPLIT_ANGLE(-1.84935557842255), + SCALE_SPLIT_ANGLE(-1.85560452938080), + SCALE_SPLIT_ANGLE(-1.86587750911713), + SCALE_SPLIT_ANGLE(-1.87314093112946)}, + {SCALE_SPLIT_ANGLE(-1.77493441104889), + SCALE_SPLIT_ANGLE(-1.77705287933350), + SCALE_SPLIT_ANGLE(-1.78027486801147), + SCALE_SPLIT_ANGLE(-1.78836560249329), + SCALE_SPLIT_ANGLE(-1.79626119136810), + SCALE_SPLIT_ANGLE(-1.80886065959930), + SCALE_SPLIT_ANGLE(-1.82978057861328), + SCALE_SPLIT_ANGLE(-1.84489572048187)}, + {SCALE_SPLIT_ANGLE(-1.67321836948395), + SCALE_SPLIT_ANGLE(-1.67747676372528), + SCALE_SPLIT_ANGLE(-1.68394041061401), + SCALE_SPLIT_ANGLE(-1.70011758804321), + SCALE_SPLIT_ANGLE(-1.71586525440216), + SCALE_SPLIT_ANGLE(-1.74102890491486), + SCALE_SPLIT_ANGLE(-1.78345453739166), + SCALE_SPLIT_ANGLE(-1.81531310081482)}, + {SCALE_SPLIT_ANGLE(-1.51132130622864), + SCALE_SPLIT_ANGLE(-1.51959407329559), + SCALE_SPLIT_ANGLE(-1.53212583065033), + SCALE_SPLIT_ANGLE(-1.56339812278748), + SCALE_SPLIT_ANGLE(-1.59380078315735), + SCALE_SPLIT_ANGLE(-1.64260387420654), + SCALE_SPLIT_ANGLE(-1.72719144821167), + SCALE_SPLIT_ANGLE(-1.79549288749695)}, + {SCALE_SPLIT_ANGLE(-1.35904073715210), + SCALE_SPLIT_ANGLE(-1.37121629714966), + SCALE_SPLIT_ANGLE(-1.38967263698578), + SCALE_SPLIT_ANGLE(-1.43583405017853), + SCALE_SPLIT_ANGLE(-1.48093712329865), + SCALE_SPLIT_ANGLE(-1.55410349369049), + SCALE_SPLIT_ANGLE(-1.68521809577942), + SCALE_SPLIT_ANGLE(-1.80024909973145)}, + {SCALE_SPLIT_ANGLE(-1.17258918285370), + SCALE_SPLIT_ANGLE(-1.18893885612488), + SCALE_SPLIT_ANGLE(-1.21383893489838), + SCALE_SPLIT_ANGLE(-1.27678334712982), + SCALE_SPLIT_ANGLE(-1.33930444717407), + SCALE_SPLIT_ANGLE(-1.44322550296783), + SCALE_SPLIT_ANGLE(-1.64006841182709), + SCALE_SPLIT_ANGLE(-1.83627629280090)}, + {SCALE_SPLIT_ANGLE(-0.96933782100677), + SCALE_SPLIT_ANGLE(-0.98854482173920), + SCALE_SPLIT_ANGLE(-1.01807177066803), + SCALE_SPLIT_ANGLE(-1.09429979324341), + SCALE_SPLIT_ANGLE(-1.17245376110077), + SCALE_SPLIT_ANGLE(-1.30826890468597), + SCALE_SPLIT_ANGLE(-1.58911192417145), + SCALE_SPLIT_ANGLE(-1.92719459533691)}, + {SCALE_SPLIT_ANGLE(-0.77729856967926), + SCALE_SPLIT_ANGLE(-0.79675692319870), + SCALE_SPLIT_ANGLE(-0.82701623439789), + SCALE_SPLIT_ANGLE(-0.90724974870682), + SCALE_SPLIT_ANGLE(-0.99302661418915), + SCALE_SPLIT_ANGLE(-1.15164005756378), + SCALE_SPLIT_ANGLE(-1.52265238761902), + SCALE_SPLIT_ANGLE(-2.09869647026062)}, + {SCALE_SPLIT_ANGLE(-0.61765122413635), + SCALE_SPLIT_ANGLE(-0.63503879308701), + SCALE_SPLIT_ANGLE(-0.66235071420670), + SCALE_SPLIT_ANGLE(-0.73653644323349), + SCALE_SPLIT_ANGLE(-0.81904625892639), + SCALE_SPLIT_ANGLE(-0.98174780607224), + SCALE_SPLIT_ANGLE(-1.42110574245453), + SCALE_SPLIT_ANGLE(-2.28386068344116)}, + {SCALE_SPLIT_ANGLE(-0.49486327171326), + SCALE_SPLIT_ANGLE(-0.50909572839737), + SCALE_SPLIT_ANGLE(-0.53160977363586), + SCALE_SPLIT_ANGLE(-0.59379214048386), + SCALE_SPLIT_ANGLE(-0.66487479209900), + SCALE_SPLIT_ANGLE(-0.81185555458069), + SCALE_SPLIT_ANGLE(-1.26233398914337), + SCALE_SPLIT_ANGLE(-2.16925764083862)}, + {SCALE_SPLIT_ANGLE(-0.40230554342270), + SCALE_SPLIT_ANGLE(-0.41332268714905), + SCALE_SPLIT_ANGLE(-0.43082219362259), + SCALE_SPLIT_ANGLE(-0.47957947850227), + SCALE_SPLIT_ANGLE(-0.53603595495224), + SCALE_SPLIT_ANGLE(-0.65522664785385), + SCALE_SPLIT_ANGLE(-1.04503870010376), + SCALE_SPLIT_ANGLE(-1.87041819095612)}, + {SCALE_SPLIT_ANGLE(-0.33104604482651), + SCALE_SPLIT_ANGLE(-0.33927723765373), + SCALE_SPLIT_ANGLE(-0.35237133502960), + SCALE_SPLIT_ANGLE(-0.38892474770546), + SCALE_SPLIT_ANGLE(-0.43126162886620), + SCALE_SPLIT_ANGLE(-0.52027010917664), + SCALE_SPLIT_ANGLE(-0.80654197931290), + SCALE_SPLIT_ANGLE(-1.41960346698761)}, + {SCALE_SPLIT_ANGLE(-0.27415531873703), + SCALE_SPLIT_ANGLE(-0.28015667200089), + SCALE_SPLIT_ANGLE(-0.28969678282738), + SCALE_SPLIT_ANGLE(-0.31623727083206), + SCALE_SPLIT_ANGLE(-0.34670370817184), + SCALE_SPLIT_ANGLE(-0.40939208865166), + SCALE_SPLIT_ANGLE(-0.59604328870773), + SCALE_SPLIT_ANGLE(-0.94309812784195)}, + {SCALE_SPLIT_ANGLE(-0.22730343043804), + SCALE_SPLIT_ANGLE(-0.23159568011761), + SCALE_SPLIT_ANGLE(-0.23840220272541), + SCALE_SPLIT_ANGLE(-0.25720024108887), + SCALE_SPLIT_ANGLE(-0.27846288681030), + SCALE_SPLIT_ANGLE(-0.32089167833328), + SCALE_SPLIT_ANGLE(-0.43515858054161), + SCALE_SPLIT_ANGLE(-0.60622000694275)}, + {SCALE_SPLIT_ANGLE(-0.17074464261532), + SCALE_SPLIT_ANGLE(-0.17326098680496), + SCALE_SPLIT_ANGLE(-0.17722851037979), + SCALE_SPLIT_ANGLE(-0.18802368640900), + SCALE_SPLIT_ANGLE(-0.19990929961205), + SCALE_SPLIT_ANGLE(-0.22246663272381), + SCALE_SPLIT_ANGLE(-0.27514943480492), + SCALE_SPLIT_ANGLE(-0.33505329489708)}, + {SCALE_SPLIT_ANGLE(-0.12695816159248), + SCALE_SPLIT_ANGLE(-0.12838459014893), + SCALE_SPLIT_ANGLE(-0.13061878085136), + SCALE_SPLIT_ANGLE(-0.13660037517548), + SCALE_SPLIT_ANGLE(-0.14301039278507), + SCALE_SPLIT_ANGLE(-0.15463486313820), + SCALE_SPLIT_ANGLE(-0.17893928289413), + SCALE_SPLIT_ANGLE(-0.20203559100628)}, + {SCALE_SPLIT_ANGLE(-0.09338590502739), + SCALE_SPLIT_ANGLE(-0.09417138248682), + SCALE_SPLIT_ANGLE(-0.09539389610291), + SCALE_SPLIT_ANGLE(-0.09861853718758), + SCALE_SPLIT_ANGLE(-0.10199318081141), + SCALE_SPLIT_ANGLE(-0.10789106041193), + SCALE_SPLIT_ANGLE(-0.11927829682827), + SCALE_SPLIT_ANGLE(-0.12894384562969)}, + {SCALE_SPLIT_ANGLE(-0.06804534792900), + SCALE_SPLIT_ANGLE(-0.06846774369478), + SCALE_SPLIT_ANGLE(-0.06912153959274), + SCALE_SPLIT_ANGLE(-0.07082460820675), + SCALE_SPLIT_ANGLE(-0.07257289439440), + SCALE_SPLIT_ANGLE(-0.07554303109646), + SCALE_SPLIT_ANGLE(-0.08096560835838), + SCALE_SPLIT_ANGLE(-0.08524779230356)}, + {SCALE_SPLIT_ANGLE(-0.04920703917742), + SCALE_SPLIT_ANGLE(-0.04942998290062), + SCALE_SPLIT_ANGLE(-0.04977353662252), + SCALE_SPLIT_ANGLE(-0.05065960064530), + SCALE_SPLIT_ANGLE(-0.05155571177602), + SCALE_SPLIT_ANGLE(-0.05304637178779), + SCALE_SPLIT_ANGLE(-0.05566369369626), + SCALE_SPLIT_ANGLE(-0.05763531103730)}, + {SCALE_SPLIT_ANGLE(-0.02832321636379), + SCALE_SPLIT_ANGLE(-0.02839783579111), + SCALE_SPLIT_ANGLE(-0.02851220592856), + SCALE_SPLIT_ANGLE(-0.02880378812551), + SCALE_SPLIT_ANGLE(-0.02909369207919), + SCALE_SPLIT_ANGLE(-0.02956490218639), + SCALE_SPLIT_ANGLE(-0.03035926632583), + SCALE_SPLIT_ANGLE(-0.03093044646084)}, + {SCALE_SPLIT_ANGLE(-0.01614263094962), + SCALE_SPLIT_ANGLE(-0.01616701111197), + SCALE_SPLIT_ANGLE(-0.01620426028967), + SCALE_SPLIT_ANGLE(-0.01629855856299), + SCALE_SPLIT_ANGLE(-0.01639137044549), + SCALE_SPLIT_ANGLE(-0.01654022000730), + SCALE_SPLIT_ANGLE(-0.01678557321429), + SCALE_SPLIT_ANGLE(-0.01695770025253)}, + {SCALE_SPLIT_ANGLE(-0.00914741121233), + SCALE_SPLIT_ANGLE(-0.00915526598692), + SCALE_SPLIT_ANGLE(-0.00916724465787), + SCALE_SPLIT_ANGLE(-0.00919744279236), + SCALE_SPLIT_ANGLE(-0.00922699086368), + SCALE_SPLIT_ANGLE(-0.00927401985973), + SCALE_SPLIT_ANGLE(-0.00935057457536), + SCALE_SPLIT_ANGLE(-0.00940357148647)}, + {SCALE_SPLIT_ANGLE(-0.00516631966457), + SCALE_SPLIT_ANGLE(-0.00516883004457), + SCALE_SPLIT_ANGLE(-0.00517265358940), + SCALE_SPLIT_ANGLE(-0.00518227042630), + SCALE_SPLIT_ANGLE(-0.00519164977595), + SCALE_SPLIT_ANGLE(-0.00520651368424), + SCALE_SPLIT_ANGLE(-0.00523054040968), + SCALE_SPLIT_ANGLE(-0.00524705089629)}, + {SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564), + SCALE_SPLIT_ANGLE(-0.00000002921564)}, + }, + { + {SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700), + SCALE_SPLIT_ANGLE(-1.57079625129700)}, + {SCALE_SPLIT_ANGLE(-1.56514143943787), + SCALE_SPLIT_ANGLE(-1.56514346599579), + SCALE_SPLIT_ANGLE(-1.56514644622803), + SCALE_SPLIT_ANGLE(-1.56515395641327), + SCALE_SPLIT_ANGLE(-1.56516134738922), + SCALE_SPLIT_ANGLE(-1.56517291069031), + SCALE_SPLIT_ANGLE(-1.56519162654877), + SCALE_SPLIT_ANGLE(-1.56520438194275)}, + {SCALE_SPLIT_ANGLE(-1.56069743633270), + SCALE_SPLIT_ANGLE(-1.56070363521576), + SCALE_SPLIT_ANGLE(-1.56071305274963), + SCALE_SPLIT_ANGLE(-1.56073689460754), + SCALE_SPLIT_ANGLE(-1.56076002120972), + SCALE_SPLIT_ANGLE(-1.56079661846161), + SCALE_SPLIT_ANGLE(-1.56085574626923), + SCALE_SPLIT_ANGLE(-1.56089639663696)}, + {SCALE_SPLIT_ANGLE(-1.55270349979401), + SCALE_SPLIT_ANGLE(-1.55272293090820), + SCALE_SPLIT_ANGLE(-1.55275249481201), + SCALE_SPLIT_ANGLE(-1.55282700061798), + SCALE_SPLIT_ANGLE(-1.55289971828461), + SCALE_SPLIT_ANGLE(-1.55301535129547), + SCALE_SPLIT_ANGLE(-1.55320298671722), + SCALE_SPLIT_ANGLE(-1.55333244800568)}, + {SCALE_SPLIT_ANGLE(-1.53820896148682), + SCALE_SPLIT_ANGLE(-1.53826904296875), + SCALE_SPLIT_ANGLE(-1.53836083412170), + SCALE_SPLIT_ANGLE(-1.53859269618988), + SCALE_SPLIT_ANGLE(-1.53882038593292), + SCALE_SPLIT_ANGLE(-1.53918409347534), + SCALE_SPLIT_ANGLE(-1.53978025913239), + SCALE_SPLIT_ANGLE(-1.54019618034363)}, + {SCALE_SPLIT_ANGLE(-1.51160359382629), + SCALE_SPLIT_ANGLE(-1.51178681850433), + SCALE_SPLIT_ANGLE(-1.51206707954407), + SCALE_SPLIT_ANGLE(-1.51277911663055), + SCALE_SPLIT_ANGLE(-1.51348364353180), + SCALE_SPLIT_ANGLE(-1.51462137699127), + SCALE_SPLIT_ANGLE(-1.51652014255524), + SCALE_SPLIT_ANGLE(-1.51787149906158)}, + {SCALE_SPLIT_ANGLE(-1.48564028739929), + SCALE_SPLIT_ANGLE(-1.48599267005920), + SCALE_SPLIT_ANGLE(-1.48653328418732), + SCALE_SPLIT_ANGLE(-1.48791313171387), + SCALE_SPLIT_ANGLE(-1.48928785324097), + SCALE_SPLIT_ANGLE(-1.49152994155884), + SCALE_SPLIT_ANGLE(-1.49533629417419), + SCALE_SPLIT_ANGLE(-1.49810016155243)}, + {SCALE_SPLIT_ANGLE(-1.44770431518555), + SCALE_SPLIT_ANGLE(-1.44837117195129), + SCALE_SPLIT_ANGLE(-1.44939672946930), + SCALE_SPLIT_ANGLE(-1.45203149318695), + SCALE_SPLIT_ANGLE(-1.45468175411224), + SCALE_SPLIT_ANGLE(-1.45906174182892), + SCALE_SPLIT_ANGLE(-1.46668362617493), + SCALE_SPLIT_ANGLE(-1.47238755226135)}, + {SCALE_SPLIT_ANGLE(-1.39214622974396), + SCALE_SPLIT_ANGLE(-1.39337480068207), + SCALE_SPLIT_ANGLE(-1.39527142047882), + SCALE_SPLIT_ANGLE(-1.40018463134766), + SCALE_SPLIT_ANGLE(-1.40518975257874), + SCALE_SPLIT_ANGLE(-1.41361439228058), + SCALE_SPLIT_ANGLE(-1.42880713939667), + SCALE_SPLIT_ANGLE(-1.44072234630585)}, + {SCALE_SPLIT_ANGLE(-1.31133687496185), + SCALE_SPLIT_ANGLE(-1.31350564956665), + SCALE_SPLIT_ANGLE(-1.31686961650848), + SCALE_SPLIT_ANGLE(-1.32567894458771), + SCALE_SPLIT_ANGLE(-1.33480489253998), + SCALE_SPLIT_ANGLE(-1.35055565834045), + SCALE_SPLIT_ANGLE(-1.38048458099365), + SCALE_SPLIT_ANGLE(-1.40579903125763)}, + {SCALE_SPLIT_ANGLE(-1.19695889949799), + SCALE_SPLIT_ANGLE(-1.20052516460419), + SCALE_SPLIT_ANGLE(-1.20609176158905), + SCALE_SPLIT_ANGLE(-1.22087824344635), + SCALE_SPLIT_ANGLE(-1.23654139041901), + SCALE_SPLIT_ANGLE(-1.26451897621155), + SCALE_SPLIT_ANGLE(-1.32194638252258), + SCALE_SPLIT_ANGLE(-1.37709844112396)}, + {SCALE_SPLIT_ANGLE(-1.09969496726990), + SCALE_SPLIT_ANGLE(-1.10437369346619), + SCALE_SPLIT_ANGLE(-1.11171460151672), + SCALE_SPLIT_ANGLE(-1.13144767284393), + SCALE_SPLIT_ANGLE(-1.15274536609650), + SCALE_SPLIT_ANGLE(-1.19192278385162), + SCALE_SPLIT_ANGLE(-1.27820122241974), + SCALE_SPLIT_ANGLE(-1.37287354469299)}, + {SCALE_SPLIT_ANGLE(-0.98739635944366), + SCALE_SPLIT_ANGLE(-0.99314498901367), + SCALE_SPLIT_ANGLE(-1.00221848487854), + SCALE_SPLIT_ANGLE(-1.02694928646088), + SCALE_SPLIT_ANGLE(-1.05423069000244), + SCALE_SPLIT_ANGLE(-1.10619938373566), + SCALE_SPLIT_ANGLE(-1.23116791248322), + SCALE_SPLIT_ANGLE(-1.39771783351898)}, + {SCALE_SPLIT_ANGLE(-0.86566168069839), + SCALE_SPLIT_ANGLE(-0.87219274044037), + SCALE_SPLIT_ANGLE(-0.88256770372391), + SCALE_SPLIT_ANGLE(-0.91127198934555), + SCALE_SPLIT_ANGLE(-0.94370102882385), + SCALE_SPLIT_ANGLE(-1.00792455673218), + SCALE_SPLIT_ANGLE(-1.17914199829102), + SCALE_SPLIT_ANGLE(-1.48121190071106)}, + {SCALE_SPLIT_ANGLE(-0.74293029308319), + SCALE_SPLIT_ANGLE(-0.74975663423538), + SCALE_SPLIT_ANGLE(-0.76066619157791), + SCALE_SPLIT_ANGLE(-0.79128366708755), + SCALE_SPLIT_ANGLE(-0.82667875289917), + SCALE_SPLIT_ANGLE(-0.89952337741852), + SCALE_SPLIT_ANGLE(-1.11571288108826), + SCALE_SPLIT_ANGLE(-1.67431199550629)}, + {SCALE_SPLIT_ANGLE(-0.62761706113815), + SCALE_SPLIT_ANGLE(-0.63421267271042), + SCALE_SPLIT_ANGLE(-0.64480352401733), + SCALE_SPLIT_ANGLE(-0.67486244440079), + SCALE_SPLIT_ANGLE(-0.71025305986404), + SCALE_SPLIT_ANGLE(-0.78539818525314), + SCALE_SPLIT_ANGLE(-1.02937340736389), + SCALE_SPLIT_ANGLE(-1.92301476001740)}, + {SCALE_SPLIT_ANGLE(-0.52522456645966), + SCALE_SPLIT_ANGLE(-0.53118568658829), + SCALE_SPLIT_ANGLE(-0.54078328609467), + SCALE_SPLIT_ANGLE(-0.56819742918015), + SCALE_SPLIT_ANGLE(-0.60080897808075), + SCALE_SPLIT_ANGLE(-0.67127293348312), + SCALE_SPLIT_ANGLE(-0.91114157438278), + SCALE_SPLIT_ANGLE(-1.73398244380951)}, + {SCALE_SPLIT_ANGLE(-0.43751952052116), + SCALE_SPLIT_ANGLE(-0.44262495636940), + SCALE_SPLIT_ANGLE(-0.45084837079048), + SCALE_SPLIT_ANGLE(-0.47435706853867), + SCALE_SPLIT_ANGLE(-0.50235128402710), + SCALE_SPLIT_ANGLE(-0.56287175416946), + SCALE_SPLIT_ANGLE(-0.76705116033554), + SCALE_SPLIT_ANGLE(-1.34888231754303)}, + {SCALE_SPLIT_ANGLE(-0.36364197731018), + SCALE_SPLIT_ANGLE(-0.36782836914063), + SCALE_SPLIT_ANGLE(-0.37456014752388), + SCALE_SPLIT_ANGLE(-0.39372298121452), + SCALE_SPLIT_ANGLE(-0.41636970639229), + SCALE_SPLIT_ANGLE(-0.46459695696831), + SCALE_SPLIT_ANGLE(-0.61803078651428), + SCALE_SPLIT_ANGLE(-0.96275907754898)}, + {SCALE_SPLIT_ANGLE(-0.30166232585907), + SCALE_SPLIT_ANGLE(-0.30497136712074), + SCALE_SPLIT_ANGLE(-0.31027451157570), + SCALE_SPLIT_ANGLE(-0.32524627447128), + SCALE_SPLIT_ANGLE(-0.34269106388092), + SCALE_SPLIT_ANGLE(-0.37887355685234), + SCALE_SPLIT_ANGLE(-0.48432540893555), + SCALE_SPLIT_ANGLE(-0.66878592967987)}, + {SCALE_SPLIT_ANGLE(-0.24960109591484), + SCALE_SPLIT_ANGLE(-0.25213342905045), + SCALE_SPLIT_ANGLE(-0.25617361068726), + SCALE_SPLIT_ANGLE(-0.26745575666428), + SCALE_SPLIT_ANGLE(-0.28036275506020), + SCALE_SPLIT_ANGLE(-0.30627736449242), + SCALE_SPLIT_ANGLE(-0.37490698695183), + SCALE_SPLIT_ANGLE(-0.47145301103592)}, + {SCALE_SPLIT_ANGLE(-0.18661488592625), + SCALE_SPLIT_ANGLE(-0.18822199106216), + SCALE_SPLIT_ANGLE(-0.19076594710350), + SCALE_SPLIT_ANGLE(-0.19773861765862), + SCALE_SPLIT_ANGLE(-0.20547652244568), + SCALE_SPLIT_ANGLE(-0.22024063766003), + SCALE_SPLIT_ANGLE(-0.25452125072479), + SCALE_SPLIT_ANGLE(-0.29236793518066)}, + {SCALE_SPLIT_ANGLE(-0.13821771740913), + SCALE_SPLIT_ANGLE(-0.13918289542198), + SCALE_SPLIT_ANGLE(-0.14069861173630), + SCALE_SPLIT_ANGLE(-0.14477686583996), + SCALE_SPLIT_ANGLE(-0.14917232096195), + SCALE_SPLIT_ANGLE(-0.15718193352222), + SCALE_SPLIT_ANGLE(-0.17394064366817), + SCALE_SPLIT_ANGLE(-0.18971265852451)}, + {SCALE_SPLIT_ANGLE(-0.10140904784203), + SCALE_SPLIT_ANGLE(-0.10196315497160), + SCALE_SPLIT_ANGLE(-0.10282710194588), + SCALE_SPLIT_ANGLE(-0.10511382669210), + SCALE_SPLIT_ANGLE(-0.10751703381538), + SCALE_SPLIT_ANGLE(-0.11173453181982), + SCALE_SPLIT_ANGLE(-0.11990433931351), + SCALE_SPLIT_ANGLE(-0.12683042883873)}, + {SCALE_SPLIT_ANGLE(-0.07378087192774), + SCALE_SPLIT_ANGLE(-0.07408788800240), + SCALE_SPLIT_ANGLE(-0.07456368207932), + SCALE_SPLIT_ANGLE(-0.07580613344908), + SCALE_SPLIT_ANGLE(-0.07708552479744), + SCALE_SPLIT_ANGLE(-0.07926639169455), + SCALE_SPLIT_ANGLE(-0.08326309919357), + SCALE_SPLIT_ANGLE(-0.08642497658730)}, + {SCALE_SPLIT_ANGLE(-0.05331044271588), + SCALE_SPLIT_ANGLE(-0.05347600579262), + SCALE_SPLIT_ANGLE(-0.05373133346438), + SCALE_SPLIT_ANGLE(-0.05439101532102), + SCALE_SPLIT_ANGLE(-0.05505971238017), + SCALE_SPLIT_ANGLE(-0.05617496743798), + SCALE_SPLIT_ANGLE(-0.05813983827829), + SCALE_SPLIT_ANGLE(-0.05962376296520)}, + {SCALE_SPLIT_ANGLE(-0.03066622652113), + SCALE_SPLIT_ANGLE(-0.03072291985154), + SCALE_SPLIT_ANGLE(-0.03080986253917), + SCALE_SPLIT_ANGLE(-0.03103173524141), + SCALE_SPLIT_ANGLE(-0.03125262632966), + SCALE_SPLIT_ANGLE(-0.03161224350333), + SCALE_SPLIT_ANGLE(-0.03221990913153), + SCALE_SPLIT_ANGLE(-0.03265778720379)}, + {SCALE_SPLIT_ANGLE(-0.01747439615428), + SCALE_SPLIT_ANGLE(-0.01749316416681), + SCALE_SPLIT_ANGLE(-0.01752184517682), + SCALE_SPLIT_ANGLE(-0.01759449020028), + SCALE_SPLIT_ANGLE(-0.01766604930162), + SCALE_SPLIT_ANGLE(-0.01778092049062), + SCALE_SPLIT_ANGLE(-0.01797054335475), + SCALE_SPLIT_ANGLE(-0.01810375973582)}, + {SCALE_SPLIT_ANGLE(-0.00990140344948), + SCALE_SPLIT_ANGLE(-0.00990749336779), + SCALE_SPLIT_ANGLE(-0.00991678331047), + SCALE_SPLIT_ANGLE(-0.00994021166116), + SCALE_SPLIT_ANGLE(-0.00996314454824), + SCALE_SPLIT_ANGLE(-0.00999966636300), + SCALE_SPLIT_ANGLE(-0.01005917042494), + SCALE_SPLIT_ANGLE(-0.01010039448738)}, + {SCALE_SPLIT_ANGLE(-0.00559204118326), + SCALE_SPLIT_ANGLE(-0.00559399509802), + SCALE_SPLIT_ANGLE(-0.00559697346762), + SCALE_SPLIT_ANGLE(-0.00560446362942), + SCALE_SPLIT_ANGLE(-0.00561177125201), + SCALE_SPLIT_ANGLE(-0.00562335411087), + SCALE_SPLIT_ANGLE(-0.00564208766446), + SCALE_SPLIT_ANGLE(-0.00565496599302)}, + {SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278), + SCALE_SPLIT_ANGLE(-0.00000003162278)}, + }, + { + {SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881), + SCALE_SPLIT_ANGLE(-1.17809700965881)}, + {SCALE_SPLIT_ANGLE(-1.17289507389069), + SCALE_SPLIT_ANGLE(-1.17289614677429), + SCALE_SPLIT_ANGLE(-1.17289793491364), + SCALE_SPLIT_ANGLE(-1.17290210723877), + SCALE_SPLIT_ANGLE(-1.17290627956390), + SCALE_SPLIT_ANGLE(-1.17291295528412), + SCALE_SPLIT_ANGLE(-1.17292356491089), + SCALE_SPLIT_ANGLE(-1.17293083667755)}, + {SCALE_SPLIT_ANGLE(-1.16883778572083), + SCALE_SPLIT_ANGLE(-1.16884136199951), + SCALE_SPLIT_ANGLE(-1.16884660720825), + SCALE_SPLIT_ANGLE(-1.16885995864868), + SCALE_SPLIT_ANGLE(-1.16887307167053), + SCALE_SPLIT_ANGLE(-1.16889369487762), + SCALE_SPLIT_ANGLE(-1.16892731189728), + SCALE_SPLIT_ANGLE(-1.16895043849945)}, + {SCALE_SPLIT_ANGLE(-1.16160643100739), + SCALE_SPLIT_ANGLE(-1.16161715984344), + SCALE_SPLIT_ANGLE(-1.16163349151611), + SCALE_SPLIT_ANGLE(-1.16167497634888), + SCALE_SPLIT_ANGLE(-1.16171550750732), + SCALE_SPLIT_ANGLE(-1.16178035736084), + SCALE_SPLIT_ANGLE(-1.16188645362854), + SCALE_SPLIT_ANGLE(-1.16196036338806)}, + {SCALE_SPLIT_ANGLE(-1.14870381355286), + SCALE_SPLIT_ANGLE(-1.14873635768890), + SCALE_SPLIT_ANGLE(-1.14878606796265), + SCALE_SPLIT_ANGLE(-1.14891242980957), + SCALE_SPLIT_ANGLE(-1.14903736114502), + SCALE_SPLIT_ANGLE(-1.14923870563507), + SCALE_SPLIT_ANGLE(-1.14957380294800), + SCALE_SPLIT_ANGLE(-1.14981114864349)}, + {SCALE_SPLIT_ANGLE(-1.12567472457886), + SCALE_SPLIT_ANGLE(-1.12576985359192), + SCALE_SPLIT_ANGLE(-1.12591588497162), + SCALE_SPLIT_ANGLE(-1.12629044055939), + SCALE_SPLIT_ANGLE(-1.12666571140289), + SCALE_SPLIT_ANGLE(-1.12728178501129), + SCALE_SPLIT_ANGLE(-1.12833738327026), + SCALE_SPLIT_ANGLE(-1.12910985946655)}, + {SCALE_SPLIT_ANGLE(-1.10394370555878), + SCALE_SPLIT_ANGLE(-1.10411989688873), + SCALE_SPLIT_ANGLE(-1.10439169406891), + SCALE_SPLIT_ANGLE(-1.10509419441223), + SCALE_SPLIT_ANGLE(-1.10580670833588), + SCALE_SPLIT_ANGLE(-1.10699570178986), + SCALE_SPLIT_ANGLE(-1.10909187793732), + SCALE_SPLIT_ANGLE(-1.11067557334900)}, + {SCALE_SPLIT_ANGLE(-1.07335841655731), + SCALE_SPLIT_ANGLE(-1.07367491722107), + SCALE_SPLIT_ANGLE(-1.07416582107544), + SCALE_SPLIT_ANGLE(-1.07544875144959), + SCALE_SPLIT_ANGLE(-1.07677149772644), + SCALE_SPLIT_ANGLE(-1.07902920246124), + SCALE_SPLIT_ANGLE(-1.08317422866821), + SCALE_SPLIT_ANGLE(-1.08645880222321)}, + {SCALE_SPLIT_ANGLE(-1.03070914745331), + SCALE_SPLIT_ANGLE(-1.03125369548798), + SCALE_SPLIT_ANGLE(-1.03210353851318), + SCALE_SPLIT_ANGLE(-1.03435730934143), + SCALE_SPLIT_ANGLE(-1.03673195838928), + SCALE_SPLIT_ANGLE(-1.04091215133667), + SCALE_SPLIT_ANGLE(-1.04904508590698), + SCALE_SPLIT_ANGLE(-1.05597043037415)}, + {SCALE_SPLIT_ANGLE(-0.97233015298843), + SCALE_SPLIT_ANGLE(-0.97321158647537), + SCALE_SPLIT_ANGLE(-0.97459846735001), + SCALE_SPLIT_ANGLE(-0.97834426164627), + SCALE_SPLIT_ANGLE(-0.98240232467651), + SCALE_SPLIT_ANGLE(-0.98984342813492), + SCALE_SPLIT_ANGLE(-1.00556397438049), + SCALE_SPLIT_ANGLE(-1.02053022384644)}, + {SCALE_SPLIT_ANGLE(-0.89506632089615), + SCALE_SPLIT_ANGLE(-0.89638078212738), + SCALE_SPLIT_ANGLE(-0.89846837520599), + SCALE_SPLIT_ANGLE(-0.90423023700714), + SCALE_SPLIT_ANGLE(-0.91068559885025), + SCALE_SPLIT_ANGLE(-0.92315053939819), + SCALE_SPLIT_ANGLE(-0.95268231630325), + SCALE_SPLIT_ANGLE(-0.98626488447189)}, + {SCALE_SPLIT_ANGLE(-0.83257317543030), + SCALE_SPLIT_ANGLE(-0.83419388532639), + SCALE_SPLIT_ANGLE(-0.83678513765335), + SCALE_SPLIT_ANGLE(-0.84404873847961), + SCALE_SPLIT_ANGLE(-0.85238862037659), + SCALE_SPLIT_ANGLE(-0.86914104223251), + SCALE_SPLIT_ANGLE(-0.91285753250122), + SCALE_SPLIT_ANGLE(-0.97222834825516)}, + {SCALE_SPLIT_ANGLE(-0.76227325201035), + SCALE_SPLIT_ANGLE(-0.76417011022568), + SCALE_SPLIT_ANGLE(-0.76722222566605), + SCALE_SPLIT_ANGLE(-0.77590954303741), + SCALE_SPLIT_ANGLE(-0.78613209724426), + SCALE_SPLIT_ANGLE(-0.80752629041672), + SCALE_SPLIT_ANGLE(-0.86987817287445), + SCALE_SPLIT_ANGLE(-0.97863042354584)}, + {SCALE_SPLIT_ANGLE(-0.68631613254547), + SCALE_SPLIT_ANGLE(-0.68841677904129), + SCALE_SPLIT_ANGLE(-0.69181627035141), + SCALE_SPLIT_ANGLE(-0.70162516832352), + SCALE_SPLIT_ANGLE(-0.71342802047729), + SCALE_SPLIT_ANGLE(-0.73910319805145), + SCALE_SPLIT_ANGLE(-0.82307589054108), + SCALE_SPLIT_ANGLE(-1.03222990036011)}, + {SCALE_SPLIT_ANGLE(-0.60781323909760), + SCALE_SPLIT_ANGLE(-0.61001539230347), + SCALE_SPLIT_ANGLE(-0.61359477043152), + SCALE_SPLIT_ANGLE(-0.62403184175491), + SCALE_SPLIT_ANGLE(-0.63681107759476), + SCALE_SPLIT_ANGLE(-0.66548812389374), + SCALE_SPLIT_ANGLE(-0.76931124925613), + SCALE_SPLIT_ANGLE(-1.19638121128082)}, + {SCALE_SPLIT_ANGLE(-0.53021627664566), + SCALE_SPLIT_ANGLE(-0.53240883350372), + SCALE_SPLIT_ANGLE(-0.53598141670227), + SCALE_SPLIT_ANGLE(-0.54646164178848), + SCALE_SPLIT_ANGLE(-0.55942356586456), + SCALE_SPLIT_ANGLE(-0.58904850482941), + SCALE_SPLIT_ANGLE(-0.70326185226440), + SCALE_SPLIT_ANGLE(-1.46822547912598)}, + {SCALE_SPLIT_ANGLE(-0.45655792951584), + SCALE_SPLIT_ANGLE(-0.45864021778107), + SCALE_SPLIT_ANGLE(-0.46203425526619), + SCALE_SPLIT_ANGLE(-0.47199884057045), + SCALE_SPLIT_ANGLE(-0.48433950543404), + SCALE_SPLIT_ANGLE(-0.51260894536972), + SCALE_SPLIT_ANGLE(-0.62212854623795), + SCALE_SPLIT_ANGLE(-1.20720005035400)}, + {SCALE_SPLIT_ANGLE(-0.38893285393715), + SCALE_SPLIT_ANGLE(-0.39082619547844), + SCALE_SPLIT_ANGLE(-0.39390665292740), + SCALE_SPLIT_ANGLE(-0.40291139483452), + SCALE_SPLIT_ANGLE(-0.41398155689240), + SCALE_SPLIT_ANGLE(-0.43899381160736), + SCALE_SPLIT_ANGLE(-0.53091597557068), + SCALE_SPLIT_ANGLE(-0.85221308469772)}, + {SCALE_SPLIT_ANGLE(-0.32840180397034), + SCALE_SPLIT_ANGLE(-0.33005377650261), + SCALE_SPLIT_ANGLE(-0.33273178339005), + SCALE_SPLIT_ANGLE(-0.34049153327942), + SCALE_SPLIT_ANGLE(-0.34989196062088), + SCALE_SPLIT_ANGLE(-0.37057077884674), + SCALE_SPLIT_ANGLE(-0.43990370631218), + SCALE_SPLIT_ANGLE(-0.60593050718307)}, + {SCALE_SPLIT_ANGLE(-0.27521026134491), + SCALE_SPLIT_ANGLE(-0.27659529447556), + SCALE_SPLIT_ANGLE(-0.27882954478264), + SCALE_SPLIT_ANGLE(-0.28522571921349), + SCALE_SPLIT_ANGLE(-0.29282191395760), + SCALE_SPLIT_ANGLE(-0.30895599722862), + SCALE_SPLIT_ANGLE(-0.35752710700035), + SCALE_SPLIT_ANGLE(-0.44366964697838)}, + {SCALE_SPLIT_ANGLE(-0.22909800708294), + SCALE_SPLIT_ANGLE(-0.23021571338177), + SCALE_SPLIT_ANGLE(-0.23200808465481), + SCALE_SPLIT_ANGLE(-0.23706813156605), + SCALE_SPLIT_ANGLE(-0.24294249713421), + SCALE_SPLIT_ANGLE(-0.25494650006294), + SCALE_SPLIT_ANGLE(-0.28743270039558), + SCALE_SPLIT_ANGLE(-0.33326250314713)}, + {SCALE_SPLIT_ANGLE(-0.17204396426678), + SCALE_SPLIT_ANGLE(-0.17280194163322), + SCALE_SPLIT_ANGLE(-0.17400610446930), + SCALE_SPLIT_ANGLE(-0.17733126878738), + SCALE_SPLIT_ANGLE(-0.18105843663216), + SCALE_SPLIT_ANGLE(-0.18825362622738), + SCALE_SPLIT_ANGLE(-0.20519737899303), + SCALE_SPLIT_ANGLE(-0.22397245466709)}, + {SCALE_SPLIT_ANGLE(-0.12763081490994), + SCALE_SPLIT_ANGLE(-0.12810991704464), + SCALE_SPLIT_ANGLE(-0.12886415421963), + SCALE_SPLIT_ANGLE(-0.13090406358242), + SCALE_SPLIT_ANGLE(-0.13311786949635), + SCALE_SPLIT_ANGLE(-0.13718487322330), + SCALE_SPLIT_ANGLE(-0.14578334987164), + SCALE_SPLIT_ANGLE(-0.15392091870308)}, + {SCALE_SPLIT_ANGLE(-0.09368772059679), + SCALE_SPLIT_ANGLE(-0.09397349506617), + SCALE_SPLIT_ANGLE(-0.09441984444857), + SCALE_SPLIT_ANGLE(-0.09560552984476), + SCALE_SPLIT_ANGLE(-0.09685768932104), + SCALE_SPLIT_ANGLE(-0.09906788170338), + SCALE_SPLIT_ANGLE(-0.10338337719440), + SCALE_SPLIT_ANGLE(-0.10706327110529)}, + {SCALE_SPLIT_ANGLE(-0.06817039847374), + SCALE_SPLIT_ANGLE(-0.06833326816559), + SCALE_SPLIT_ANGLE(-0.06858597695827), + SCALE_SPLIT_ANGLE(-0.06924756616354), + SCALE_SPLIT_ANGLE(-0.06993118673563), + SCALE_SPLIT_ANGLE(-0.07110133022070), + SCALE_SPLIT_ANGLE(-0.07325870543718), + SCALE_SPLIT_ANGLE(-0.07497420907021)}, + {SCALE_SPLIT_ANGLE(-0.04925632849336), + SCALE_SPLIT_ANGLE(-0.04934597387910), + SCALE_SPLIT_ANGLE(-0.04948435723782), + SCALE_SPLIT_ANGLE(-0.04984252154827), + SCALE_SPLIT_ANGLE(-0.05020647123456), + SCALE_SPLIT_ANGLE(-0.05081529170275), + SCALE_SPLIT_ANGLE(-0.05189274996519), + SCALE_SPLIT_ANGLE(-0.05270983278751)}, + {SCALE_SPLIT_ANGLE(-0.02833298221231), + SCALE_SPLIT_ANGLE(-0.02836437523365), + SCALE_SPLIT_ANGLE(-0.02841254323721), + SCALE_SPLIT_ANGLE(-0.02853557653725), + SCALE_SPLIT_ANGLE(-0.02865824848413), + SCALE_SPLIT_ANGLE(-0.02885829471052), + SCALE_SPLIT_ANGLE(-0.02919723838568), + SCALE_SPLIT_ANGLE(-0.02944211103022)}, + {SCALE_SPLIT_ANGLE(-0.01614447496831), + SCALE_SPLIT_ANGLE(-0.01615499891341), + SCALE_SPLIT_ANGLE(-0.01617108844221), + SCALE_SPLIT_ANGLE(-0.01621186546981), + SCALE_SPLIT_ANGLE(-0.01625206507742), + SCALE_SPLIT_ANGLE(-0.01631666161120), + SCALE_SPLIT_ANGLE(-0.01642346009612), + SCALE_SPLIT_ANGLE(-0.01649860478938)}, + {SCALE_SPLIT_ANGLE(-0.00914774928242), + SCALE_SPLIT_ANGLE(-0.00915119051933), + SCALE_SPLIT_ANGLE(-0.00915643945336), + SCALE_SPLIT_ANGLE(-0.00916968192905), + SCALE_SPLIT_ANGLE(-0.00918265059590), + SCALE_SPLIT_ANGLE(-0.00920331384987), + SCALE_SPLIT_ANGLE(-0.00923701003194), + SCALE_SPLIT_ANGLE(-0.00926037784666)}, + {SCALE_SPLIT_ANGLE(-0.00516638066620), + SCALE_SPLIT_ANGLE(-0.00516748940572), + SCALE_SPLIT_ANGLE(-0.00516917882487), + SCALE_SPLIT_ANGLE(-0.00517342938110), + SCALE_SPLIT_ANGLE(-0.00517757609487), + SCALE_SPLIT_ANGLE(-0.00518415309489), + SCALE_SPLIT_ANGLE(-0.00519479531795), + SCALE_SPLIT_ANGLE(-0.00520211551338)}, + {SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563), + SCALE_SPLIT_ANGLE(-0.00000002921563)}, + }, + { + {SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243), + SCALE_SPLIT_ANGLE(-0.78539830446243)}, + {SCALE_SPLIT_ANGLE(-0.78143131732941), + SCALE_SPLIT_ANGLE(-0.78143173456192), + SCALE_SPLIT_ANGLE(-0.78143233060837), + SCALE_SPLIT_ANGLE(-0.78143388032913), + SCALE_SPLIT_ANGLE(-0.78143537044525), + SCALE_SPLIT_ANGLE(-0.78143775463104), + SCALE_SPLIT_ANGLE(-0.78144156932831), + SCALE_SPLIT_ANGLE(-0.78144425153732)}, + {SCALE_SPLIT_ANGLE(-0.77835690975189), + SCALE_SPLIT_ANGLE(-0.77835816144943), + SCALE_SPLIT_ANGLE(-0.77836006879807), + SCALE_SPLIT_ANGLE(-0.77836489677429), + SCALE_SPLIT_ANGLE(-0.77836954593658), + SCALE_SPLIT_ANGLE(-0.77837705612183), + SCALE_SPLIT_ANGLE(-0.77838915586472), + SCALE_SPLIT_ANGLE(-0.77839756011963)}, + {SCALE_SPLIT_ANGLE(-0.77291876077652), + SCALE_SPLIT_ANGLE(-0.77292257547379), + SCALE_SPLIT_ANGLE(-0.77292835712433), + SCALE_SPLIT_ANGLE(-0.77294307947159), + SCALE_SPLIT_ANGLE(-0.77295756340027), + SCALE_SPLIT_ANGLE(-0.77298080921173), + SCALE_SPLIT_ANGLE(-0.77301901578903), + SCALE_SPLIT_ANGLE(-0.77304589748383)}, + {SCALE_SPLIT_ANGLE(-0.76334208250046), + SCALE_SPLIT_ANGLE(-0.76335340738297), + SCALE_SPLIT_ANGLE(-0.76337069272995), + SCALE_SPLIT_ANGLE(-0.76341491937637), + SCALE_SPLIT_ANGLE(-0.76345884799957), + SCALE_SPLIT_ANGLE(-0.76353019475937), + SCALE_SPLIT_ANGLE(-0.76365041732788), + SCALE_SPLIT_ANGLE(-0.76373666524887)}, + {SCALE_SPLIT_ANGLE(-0.74662196636200), + SCALE_SPLIT_ANGLE(-0.74665397405624), + SCALE_SPLIT_ANGLE(-0.74670332670212), + SCALE_SPLIT_ANGLE(-0.74683076143265), + SCALE_SPLIT_ANGLE(-0.74695968627930), + SCALE_SPLIT_ANGLE(-0.74717408418655), + SCALE_SPLIT_ANGLE(-0.74754965305328), + SCALE_SPLIT_ANGLE(-0.74783110618591)}, + {SCALE_SPLIT_ANGLE(-0.73124068975449), + SCALE_SPLIT_ANGLE(-0.73129838705063), + SCALE_SPLIT_ANGLE(-0.73138779401779), + SCALE_SPLIT_ANGLE(-0.73162090778351), + SCALE_SPLIT_ANGLE(-0.73186063766479), + SCALE_SPLIT_ANGLE(-0.73226791620255), + SCALE_SPLIT_ANGLE(-0.73300850391388), + SCALE_SPLIT_ANGLE(-0.73358756303787)}, + {SCALE_SPLIT_ANGLE(-0.71016567945480), + SCALE_SPLIT_ANGLE(-0.71026563644409), + SCALE_SPLIT_ANGLE(-0.71042138338089), + SCALE_SPLIT_ANGLE(-0.71083360910416), + SCALE_SPLIT_ANGLE(-0.71126639842987), + SCALE_SPLIT_ANGLE(-0.71202349662781), + SCALE_SPLIT_ANGLE(-0.71347558498383), + SCALE_SPLIT_ANGLE(-0.71468466520309)}, + {SCALE_SPLIT_ANGLE(-0.68173074722290), + SCALE_SPLIT_ANGLE(-0.68189489841461), + SCALE_SPLIT_ANGLE(-0.68215286731720), + SCALE_SPLIT_ANGLE(-0.68284797668457), + SCALE_SPLIT_ANGLE(-0.68359792232513), + SCALE_SPLIT_ANGLE(-0.68496227264404), + SCALE_SPLIT_ANGLE(-0.68778377771378), + SCALE_SPLIT_ANGLE(-0.69036662578583)}, + {SCALE_SPLIT_ANGLE(-0.64424312114716), + SCALE_SPLIT_ANGLE(-0.64449483156204), + SCALE_SPLIT_ANGLE(-0.64489442110062), + SCALE_SPLIT_ANGLE(-0.64599496126175), + SCALE_SPLIT_ANGLE(-0.64722281694412), + SCALE_SPLIT_ANGLE(-0.64957284927368), + SCALE_SPLIT_ANGLE(-0.65497392416000), + SCALE_SPLIT_ANGLE(-0.66069275140762)}, + {SCALE_SPLIT_ANGLE(-0.59645897150040), + SCALE_SPLIT_ANGLE(-0.59681385755539), + SCALE_SPLIT_ANGLE(-0.59738302230835), + SCALE_SPLIT_ANGLE(-0.59898990392685), + SCALE_SPLIT_ANGLE(-0.60085391998291), + SCALE_SPLIT_ANGLE(-0.60464876890182), + SCALE_SPLIT_ANGLE(-0.61471670866013), + SCALE_SPLIT_ANGLE(-0.62811452150345)}, + {SCALE_SPLIT_ANGLE(-0.55878317356110), + SCALE_SPLIT_ANGLE(-0.55920612812042), + SCALE_SPLIT_ANGLE(-0.55988919734955), + SCALE_SPLIT_ANGLE(-0.56185036897659), + SCALE_SPLIT_ANGLE(-0.56418758630753), + SCALE_SPLIT_ANGLE(-0.56916558742523), + SCALE_SPLIT_ANGLE(-0.58402240276337), + SCALE_SPLIT_ANGLE(-0.60877454280853)}, + {SCALE_SPLIT_ANGLE(-0.51690876483917), + SCALE_SPLIT_ANGLE(-0.51739066839218), + SCALE_SPLIT_ANGLE(-0.51817417144775), + SCALE_SPLIT_ANGLE(-0.52045887708664), + SCALE_SPLIT_ANGLE(-0.52325236797333), + SCALE_SPLIT_ANGLE(-0.52947425842285), + SCALE_SPLIT_ANGLE(-0.55062580108643), + SCALE_SPLIT_ANGLE(-0.59875679016113)}, + {SCALE_SPLIT_ANGLE(-0.47171202301979), + SCALE_SPLIT_ANGLE(-0.47223755717278), + SCALE_SPLIT_ANGLE(-0.47309651970863), + SCALE_SPLIT_ANGLE(-0.47563409805298), + SCALE_SPLIT_ANGLE(-0.47880497574806), + SCALE_SPLIT_ANGLE(-0.48615178465843), + SCALE_SPLIT_ANGLE(-0.51456993818283), + SCALE_SPLIT_ANGLE(-0.61478376388550)}, + {SCALE_SPLIT_ANGLE(-0.42445346713066), + SCALE_SPLIT_ANGLE(-0.42500337958336), + SCALE_SPLIT_ANGLE(-0.42590552568436), + SCALE_SPLIT_ANGLE(-0.42859482765198), + SCALE_SPLIT_ANGLE(-0.43200704455376), + SCALE_SPLIT_ANGLE(-0.44014206528664), + SCALE_SPLIT_ANGLE(-0.47505456209183), + SCALE_SPLIT_ANGLE(-0.70435559749603)}, + {SCALE_SPLIT_ANGLE(-0.37662348151207), + SCALE_SPLIT_ANGLE(-0.37717759609222), + SCALE_SPLIT_ANGLE(-0.37808811664581), + SCALE_SPLIT_ANGLE(-0.38081312179565), + SCALE_SPLIT_ANGLE(-0.38429382443428), + SCALE_SPLIT_ANGLE(-0.39269915223122), + SCALE_SPLIT_ANGLE(-0.43061137199402), + SCALE_SPLIT_ANGLE(-0.89949661493301)}, + {SCALE_SPLIT_ANGLE(-0.32972770929337), + SCALE_SPLIT_ANGLE(-0.33026665449142), + SCALE_SPLIT_ANGLE(-0.33115166425705), + SCALE_SPLIT_ANGLE(-0.33379596471786), + SCALE_SPLIT_ANGLE(-0.33716449141502), + SCALE_SPLIT_ANGLE(-0.34525626897812), + SCALE_SPLIT_ANGLE(-0.38098806142807), + SCALE_SPLIT_ANGLE(-0.66312354803085)}, + {SCALE_SPLIT_ANGLE(-0.28508266806602), + SCALE_SPLIT_ANGLE(-0.28558865189552), + SCALE_SPLIT_ANGLE(-0.28641721606255), + SCALE_SPLIT_ANGLE(-0.28887599706650), + SCALE_SPLIT_ANGLE(-0.29197183251381), + SCALE_SPLIT_ANGLE(-0.29924651980400), + SCALE_SPLIT_ANGLE(-0.32879725098610), + SCALE_SPLIT_ANGLE(-0.45467042922974)}, + {SCALE_SPLIT_ANGLE(-0.24368351697922), + SCALE_SPLIT_ANGLE(-0.24414126574993), + SCALE_SPLIT_ANGLE(-0.24488742649555), + SCALE_SPLIT_ANGLE(-0.24707718193531), + SCALE_SPLIT_ANGLE(-0.24978290498257), + SCALE_SPLIT_ANGLE(-0.25592407584190), + SCALE_SPLIT_ANGLE(-0.27806493639946), + SCALE_SPLIT_ANGLE(-0.33706212043762)}, + {SCALE_SPLIT_ANGLE(-0.20616291463375), + SCALE_SPLIT_ANGLE(-0.20656123757362), + SCALE_SPLIT_ANGLE(-0.20720669627190), + SCALE_SPLIT_ANGLE(-0.20907410979271), + SCALE_SPLIT_ANGLE(-0.21132779121399), + SCALE_SPLIT_ANGLE(-0.21623276174068), + SCALE_SPLIT_ANGLE(-0.23178002238274), + SCALE_SPLIT_ANGLE(-0.26115795969963)}, + {SCALE_SPLIT_ANGLE(-0.17282113432884), + SCALE_SPLIT_ANGLE(-0.17315419018269), + SCALE_SPLIT_ANGLE(-0.17369027435780), + SCALE_SPLIT_ANGLE(-0.17521676421165), + SCALE_SPLIT_ANGLE(-0.17701183259487), + SCALE_SPLIT_ANGLE(-0.18074958026409), + SCALE_SPLIT_ANGLE(-0.19124273955822), + SCALE_SPLIT_ANGLE(-0.20666226744652)}, + {SCALE_SPLIT_ANGLE(-0.13066087663174), + SCALE_SPLIT_ANGLE(-0.13089761137962), + SCALE_SPLIT_ANGLE(-0.13127478957176), + SCALE_SPLIT_ANGLE(-0.13232274353504), + SCALE_SPLIT_ANGLE(-0.13350811600685), + SCALE_SPLIT_ANGLE(-0.13582547008991), + SCALE_SPLIT_ANGLE(-0.14140743017197), + SCALE_SPLIT_ANGLE(-0.14774034917355)}, + {SCALE_SPLIT_ANGLE(-0.09729288518429), + SCALE_SPLIT_ANGLE(-0.09744837880135), + SCALE_SPLIT_ANGLE(-0.09769365936518), + SCALE_SPLIT_ANGLE(-0.09835996478796), + SCALE_SPLIT_ANGLE(-0.09908770024776), + SCALE_SPLIT_ANGLE(-0.10043605417013), + SCALE_SPLIT_ANGLE(-0.10332851856947), + SCALE_SPLIT_ANGLE(-0.10610698908567)}, + {SCALE_SPLIT_ANGLE(-0.07155896723270), + SCALE_SPLIT_ANGLE(-0.07165452837944), + SCALE_SPLIT_ANGLE(-0.07180399447680), + SCALE_SPLIT_ANGLE(-0.07220225781202), + SCALE_SPLIT_ANGLE(-0.07262473553419), + SCALE_SPLIT_ANGLE(-0.07337480783463), + SCALE_SPLIT_ANGLE(-0.07485358417034), + SCALE_SPLIT_ANGLE(-0.07612710446119)}, + {SCALE_SPLIT_ANGLE(-0.05212157964706), + SCALE_SPLIT_ANGLE(-0.05217728391290), + SCALE_SPLIT_ANGLE(-0.05226380378008), + SCALE_SPLIT_ANGLE(-0.05249079316854), + SCALE_SPLIT_ANGLE(-0.05272606760263), + SCALE_SPLIT_ANGLE(-0.05313043296337), + SCALE_SPLIT_ANGLE(-0.05388086661696), + SCALE_SPLIT_ANGLE(-0.05448163300753)}, + {SCALE_SPLIT_ANGLE(-0.03767966106534), + SCALE_SPLIT_ANGLE(-0.03771083801985), + SCALE_SPLIT_ANGLE(-0.03775899857283), + SCALE_SPLIT_ANGLE(-0.03788383677602), + SCALE_SPLIT_ANGLE(-0.03801096975803), + SCALE_SPLIT_ANGLE(-0.03822424262762), + SCALE_SPLIT_ANGLE(-0.03860339894891), + SCALE_SPLIT_ANGLE(-0.03889227285981)}, + {SCALE_SPLIT_ANGLE(-0.02168159000576), + SCALE_SPLIT_ANGLE(-0.02169271185994), + SCALE_SPLIT_ANGLE(-0.02170977741480), + SCALE_SPLIT_ANGLE(-0.02175341919065), + SCALE_SPLIT_ANGLE(-0.02179697901011), + SCALE_SPLIT_ANGLE(-0.02186813205481), + SCALE_SPLIT_ANGLE(-0.02198898792267), + SCALE_SPLIT_ANGLE(-0.02207653038204)}, + {SCALE_SPLIT_ANGLE(-0.01235581189394), + SCALE_SPLIT_ANGLE(-0.01235958002508), + SCALE_SPLIT_ANGLE(-0.01236534304917), + SCALE_SPLIT_ANGLE(-0.01237995456904), + SCALE_SPLIT_ANGLE(-0.01239436771721), + SCALE_SPLIT_ANGLE(-0.01241754833609), + SCALE_SPLIT_ANGLE(-0.01245592441410), + SCALE_SPLIT_ANGLE(-0.01248297002167)}, + {SCALE_SPLIT_ANGLE(-0.00700127193704), + SCALE_SPLIT_ANGLE(-0.00700251199305), + SCALE_SPLIT_ANGLE(-0.00700440304354), + SCALE_SPLIT_ANGLE(-0.00700917467475), + SCALE_SPLIT_ANGLE(-0.00701385131106), + SCALE_SPLIT_ANGLE(-0.00702130468562), + SCALE_SPLIT_ANGLE(-0.00703346915543), + SCALE_SPLIT_ANGLE(-0.00704191112891)}, + {SCALE_SPLIT_ANGLE(-0.00395415676758), + SCALE_SPLIT_ANGLE(-0.00395455863327), + SCALE_SPLIT_ANGLE(-0.00395516911522), + SCALE_SPLIT_ANGLE(-0.00395670579746), + SCALE_SPLIT_ANGLE(-0.00395820569247), + SCALE_SPLIT_ANGLE(-0.00396058475599), + SCALE_SPLIT_ANGLE(-0.00396443624049), + SCALE_SPLIT_ANGLE(-0.00396708631888)}, + {SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068), + SCALE_SPLIT_ANGLE(-0.00000002236068)}, + }, + { + {SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425), + SCALE_SPLIT_ANGLE(-0.39269906282425)}, + {SCALE_SPLIT_ANGLE(-0.39055728912354), + SCALE_SPLIT_ANGLE(-0.39055734872818), + SCALE_SPLIT_ANGLE(-0.39055743813515), + SCALE_SPLIT_ANGLE(-0.39055764675140), + SCALE_SPLIT_ANGLE(-0.39055785536766), + SCALE_SPLIT_ANGLE(-0.39055821299553), + SCALE_SPLIT_ANGLE(-0.39055874943733), + SCALE_SPLIT_ANGLE(-0.39055910706520)}, + {SCALE_SPLIT_ANGLE(-0.38890448212624), + SCALE_SPLIT_ANGLE(-0.38890466094017), + SCALE_SPLIT_ANGLE(-0.38890489935875), + SCALE_SPLIT_ANGLE(-0.38890558481216), + SCALE_SPLIT_ANGLE(-0.38890624046326), + SCALE_SPLIT_ANGLE(-0.38890728354454), + SCALE_SPLIT_ANGLE(-0.38890898227692), + SCALE_SPLIT_ANGLE(-0.38891017436981)}, + {SCALE_SPLIT_ANGLE(-0.38599535822868), + SCALE_SPLIT_ANGLE(-0.38599589467049), + SCALE_SPLIT_ANGLE(-0.38599669933319), + SCALE_SPLIT_ANGLE(-0.38599872589111), + SCALE_SPLIT_ANGLE(-0.38600075244904), + SCALE_SPLIT_ANGLE(-0.38600397109985), + SCALE_SPLIT_ANGLE(-0.38600933551788), + SCALE_SPLIT_ANGLE(-0.38601312041283)}, + {SCALE_SPLIT_ANGLE(-0.38091570138931), + SCALE_SPLIT_ANGLE(-0.38091725111008), + SCALE_SPLIT_ANGLE(-0.38091960549355), + SCALE_SPLIT_ANGLE(-0.38092568516731), + SCALE_SPLIT_ANGLE(-0.38093173503876), + SCALE_SPLIT_ANGLE(-0.38094159960747), + SCALE_SPLIT_ANGLE(-0.38095837831497), + SCALE_SPLIT_ANGLE(-0.38097053766251)}, + {SCALE_SPLIT_ANGLE(-0.37216994166374), + SCALE_SPLIT_ANGLE(-0.37217423319817), + SCALE_SPLIT_ANGLE(-0.37218084931374), + SCALE_SPLIT_ANGLE(-0.37219804525375), + SCALE_SPLIT_ANGLE(-0.37221553921700), + SCALE_SPLIT_ANGLE(-0.37224486470222), + SCALE_SPLIT_ANGLE(-0.37229701876640), + SCALE_SPLIT_ANGLE(-0.37233671545982)}, + {SCALE_SPLIT_ANGLE(-0.36424961686134), + SCALE_SPLIT_ANGLE(-0.36425721645355), + SCALE_SPLIT_ANGLE(-0.36426901817322), + SCALE_SPLIT_ANGLE(-0.36429998278618), + SCALE_SPLIT_ANGLE(-0.36433207988739), + SCALE_SPLIT_ANGLE(-0.36438727378845), + SCALE_SPLIT_ANGLE(-0.36448964476585), + SCALE_SPLIT_ANGLE(-0.36457160115242)}, + {SCALE_SPLIT_ANGLE(-0.35356882214546), + SCALE_SPLIT_ANGLE(-0.35358169674873), + SCALE_SPLIT_ANGLE(-0.35360184311867), + SCALE_SPLIT_ANGLE(-0.35365554690361), + SCALE_SPLIT_ANGLE(-0.35371255874634), + SCALE_SPLIT_ANGLE(-0.35381379723549), + SCALE_SPLIT_ANGLE(-0.35401359200478), + SCALE_SPLIT_ANGLE(-0.35418573021889)}, + {SCALE_SPLIT_ANGLE(-0.33942580223083), + SCALE_SPLIT_ANGLE(-0.33944639563560), + SCALE_SPLIT_ANGLE(-0.33947893977165), + SCALE_SPLIT_ANGLE(-0.33956736326218), + SCALE_SPLIT_ANGLE(-0.33966410160065), + SCALE_SPLIT_ANGLE(-0.33984366059303), + SCALE_SPLIT_ANGLE(-0.34023004770279), + SCALE_SPLIT_ANGLE(-0.34060218930244)}, + {SCALE_SPLIT_ANGLE(-0.32115444540977), + SCALE_SPLIT_ANGLE(-0.32118517160416), + SCALE_SPLIT_ANGLE(-0.32123413681984), + SCALE_SPLIT_ANGLE(-0.32137045264244), + SCALE_SPLIT_ANGLE(-0.32152506709099), + SCALE_SPLIT_ANGLE(-0.32182860374451), + SCALE_SPLIT_ANGLE(-0.32256555557251), + SCALE_SPLIT_ANGLE(-0.32340887188911)}, + {SCALE_SPLIT_ANGLE(-0.29830518364906), + SCALE_SPLIT_ANGLE(-0.29834720492363), + SCALE_SPLIT_ANGLE(-0.29841497540474), + SCALE_SPLIT_ANGLE(-0.29860857129097), + SCALE_SPLIT_ANGLE(-0.29883739352226), + SCALE_SPLIT_ANGLE(-0.29931783676147), + SCALE_SPLIT_ANGLE(-0.30069103837013), + SCALE_SPLIT_ANGLE(-0.30275768041611)}, + {SCALE_SPLIT_ANGLE(-0.28050783276558), + SCALE_SPLIT_ANGLE(-0.28055709600449), + SCALE_SPLIT_ANGLE(-0.28063705563545), + SCALE_SPLIT_ANGLE(-0.28086939454079), + SCALE_SPLIT_ANGLE(-0.28115186095238), + SCALE_SPLIT_ANGLE(-0.28177401423454), + SCALE_SPLIT_ANGLE(-0.28380542993546), + SCALE_SPLIT_ANGLE(-0.28782635927200)}, + {SCALE_SPLIT_ANGLE(-0.26083284616470), + SCALE_SPLIT_ANGLE(-0.26088821887970), + SCALE_SPLIT_ANGLE(-0.26097869873047), + SCALE_SPLIT_ANGLE(-0.26124575734138), + SCALE_SPLIT_ANGLE(-0.26157894730568), + SCALE_SPLIT_ANGLE(-0.26234790682793), + SCALE_SPLIT_ANGLE(-0.26525342464447), + SCALE_SPLIT_ANGLE(-0.27373573184013)}, + {SCALE_SPLIT_ANGLE(-0.23960019648075), + SCALE_SPLIT_ANGLE(-0.23966008424759), + SCALE_SPLIT_ANGLE(-0.23975844681263), + SCALE_SPLIT_ANGLE(-0.24005250632763), + SCALE_SPLIT_ANGLE(-0.24042734503746), + SCALE_SPLIT_ANGLE(-0.24132779240608), + SCALE_SPLIT_ANGLE(-0.24525122344494), + SCALE_SPLIT_ANGLE(-0.26534584164619)}, + {SCALE_SPLIT_ANGLE(-0.21727462112904), + SCALE_SPLIT_ANGLE(-0.21733717620373), + SCALE_SPLIT_ANGLE(-0.21744027733803), + SCALE_SPLIT_ANGLE(-0.21775110065937), + SCALE_SPLIT_ANGLE(-0.21815298497677), + SCALE_SPLIT_ANGLE(-0.21914556622505), + SCALE_SPLIT_ANGLE(-0.22397416830063), + SCALE_SPLIT_ANGLE(-0.27997338771820)}, + {SCALE_SPLIT_ANGLE(-0.19442924857140), + SCALE_SPLIT_ANGLE(-0.19449259340763), + SCALE_SPLIT_ANGLE(-0.19459711015224), + SCALE_SPLIT_ANGLE(-0.19491319358349), + SCALE_SPLIT_ANGLE(-0.19532407820225), + SCALE_SPLIT_ANGLE(-0.19634953141212), + SCALE_SPLIT_ANGLE(-0.20156541466713), + SCALE_SPLIT_ANGLE(-0.33650863170624)}, + {SCALE_SPLIT_ANGLE(-0.17168678343296), + SCALE_SPLIT_ANGLE(-0.17174907028675), + SCALE_SPLIT_ANGLE(-0.17185172438622), + SCALE_SPLIT_ANGLE(-0.17216137051582), + SCALE_SPLIT_ANGLE(-0.17256210744381), + SCALE_SPLIT_ANGLE(-0.17355349659920), + SCALE_SPLIT_ANGLE(-0.17841055989265), + SCALE_SPLIT_ANGLE(-0.23922458291054)}, + {SCALE_SPLIT_ANGLE(-0.14965106546879), + SCALE_SPLIT_ANGLE(-0.14971044659615), + SCALE_SPLIT_ANGLE(-0.14980801939964), + SCALE_SPLIT_ANGLE(-0.15010000765324), + SCALE_SPLIT_ANGLE(-0.15047281980515), + SCALE_SPLIT_ANGLE(-0.15137127041817), + SCALE_SPLIT_ANGLE(-0.15533344447613), + SCALE_SPLIT_ANGLE(-0.17691853642464)}, + {SCALE_SPLIT_ANGLE(-0.12884500622749), + SCALE_SPLIT_ANGLE(-0.12889972329140), + SCALE_SPLIT_ANGLE(-0.12898920476437), + SCALE_SPLIT_ANGLE(-0.12925371527672), + SCALE_SPLIT_ANGLE(-0.12958449125290), + SCALE_SPLIT_ANGLE(-0.13035115599632), + SCALE_SPLIT_ANGLE(-0.13329000771046), + SCALE_SPLIT_ANGLE(-0.14226882159710)}, + {SCALE_SPLIT_ANGLE(-0.10966771095991), + SCALE_SPLIT_ANGLE(-0.10971628129482), + SCALE_SPLIT_ANGLE(-0.10979521274567), + SCALE_SPLIT_ANGLE(-0.11002496629953), + SCALE_SPLIT_ANGLE(-0.11030505597591), + SCALE_SPLIT_ANGLE(-0.11092507094145), + SCALE_SPLIT_ANGLE(-0.11297955363989), + SCALE_SPLIT_ANGLE(-0.11718675494194)}, + {SCALE_SPLIT_ANGLE(-0.09237615764141), + SCALE_SPLIT_ANGLE(-0.09241757541895), + SCALE_SPLIT_ANGLE(-0.09248440712690), + SCALE_SPLIT_ANGLE(-0.09267570078373), + SCALE_SPLIT_ANGLE(-0.09290252625942), + SCALE_SPLIT_ANGLE(-0.09338124096394), + SCALE_SPLIT_ANGLE(-0.09476861357689), + SCALE_SPLIT_ANGLE(-0.09691139310598)}, + {SCALE_SPLIT_ANGLE(-0.07020132243633), + SCALE_SPLIT_ANGLE(-0.07023159414530), + SCALE_SPLIT_ANGLE(-0.07027988135815), + SCALE_SPLIT_ANGLE(-0.07041461765766), + SCALE_SPLIT_ANGLE(-0.07056794315577), + SCALE_SPLIT_ANGLE(-0.07087046653032), + SCALE_SPLIT_ANGLE(-0.07161350548267), + SCALE_SPLIT_ANGLE(-0.07247892767191)}, + {SCALE_SPLIT_ANGLE(-0.05244029313326), + SCALE_SPLIT_ANGLE(-0.05246063694358), + SCALE_SPLIT_ANGLE(-0.05249277129769), + SCALE_SPLIT_ANGLE(-0.05258031189442), + SCALE_SPLIT_ANGLE(-0.05267634615302), + SCALE_SPLIT_ANGLE(-0.05285539105535), + SCALE_SPLIT_ANGLE(-0.05324416607618), + SCALE_SPLIT_ANGLE(-0.05362325906754)}, + {SCALE_SPLIT_ANGLE(-0.03864165395498), + SCALE_SPLIT_ANGLE(-0.03865438699722), + SCALE_SPLIT_ANGLE(-0.03867433220148), + SCALE_SPLIT_ANGLE(-0.03872758150101), + SCALE_SPLIT_ANGLE(-0.03878423944116), + SCALE_SPLIT_ANGLE(-0.03888526186347), + SCALE_SPLIT_ANGLE(-0.03908598423004), + SCALE_SPLIT_ANGLE(-0.03926040232182)}, + {SCALE_SPLIT_ANGLE(-0.02817477099597), + SCALE_SPLIT_ANGLE(-0.02818230539560), + SCALE_SPLIT_ANGLE(-0.02819401212037), + SCALE_SPLIT_ANGLE(-0.02822477370501), + SCALE_SPLIT_ANGLE(-0.02825672924519), + SCALE_SPLIT_ANGLE(-0.02831180207431), + SCALE_SPLIT_ANGLE(-0.02841453626752), + SCALE_SPLIT_ANGLE(-0.02849724888802)}, + {SCALE_SPLIT_ANGLE(-0.02037952840328), + SCALE_SPLIT_ANGLE(-0.02038379199803), + SCALE_SPLIT_ANGLE(-0.02039037644863), + SCALE_SPLIT_ANGLE(-0.02040746808052), + SCALE_SPLIT_ANGLE(-0.02042490057647), + SCALE_SPLIT_ANGLE(-0.02045419998467), + SCALE_SPLIT_ANGLE(-0.02050646580756), + SCALE_SPLIT_ANGLE(-0.02054643817246)}, + {SCALE_SPLIT_ANGLE(-0.01173160132021), + SCALE_SPLIT_ANGLE(-0.01173313893378), + SCALE_SPLIT_ANGLE(-0.01173550169915), + SCALE_SPLIT_ANGLE(-0.01174154412001), + SCALE_SPLIT_ANGLE(-0.01174758281559), + SCALE_SPLIT_ANGLE(-0.01175745390356), + SCALE_SPLIT_ANGLE(-0.01177425216883), + SCALE_SPLIT_ANGLE(-0.01178644038737)}, + {SCALE_SPLIT_ANGLE(-0.00668647419661), + SCALE_SPLIT_ANGLE(-0.00668699899688), + SCALE_SPLIT_ANGLE(-0.00668780226260), + SCALE_SPLIT_ANGLE(-0.00668983859941), + SCALE_SPLIT_ANGLE(-0.00669184979051), + SCALE_SPLIT_ANGLE(-0.00669508427382), + SCALE_SPLIT_ANGLE(-0.00670044496655), + SCALE_SPLIT_ANGLE(-0.00670422706753)}, + {SCALE_SPLIT_ANGLE(-0.00378898018971), + SCALE_SPLIT_ANGLE(-0.00378915364854), + SCALE_SPLIT_ANGLE(-0.00378941860981), + SCALE_SPLIT_ANGLE(-0.00379008613527), + SCALE_SPLIT_ANGLE(-0.00379074038938), + SCALE_SPLIT_ANGLE(-0.00379178440198), + SCALE_SPLIT_ANGLE(-0.00379348848946), + SCALE_SPLIT_ANGLE(-0.00379467150196)}, + {SCALE_SPLIT_ANGLE(-0.00213995948434), + SCALE_SPLIT_ANGLE(-0.00214001582935), + SCALE_SPLIT_ANGLE(-0.00214010151103), + SCALE_SPLIT_ANGLE(-0.00214031687938), + SCALE_SPLIT_ANGLE(-0.00214052735828), + SCALE_SPLIT_ANGLE(-0.00214086123742), + SCALE_SPLIT_ANGLE(-0.00214140163735), + SCALE_SPLIT_ANGLE(-0.00214177393354)}, + {SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151), + SCALE_SPLIT_ANGLE(-0.00000001210151)}, + }, +}; #define SCALE_CLD(a) (FL2FXCONST_CFG(a)) diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_rom.h fdk-aac-2.0.2/libSACdec/src/sac_rom.h --- fdk-aac-2.0.1/libSACdec/src/sac_rom.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_rom.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -111,21 +111,12 @@ #include "machine_type.h" /* Global ROM table data type: */ -#ifndef ARCH_PREFER_MULT_32x32 -#define FIXP_CFG FIXP_SGL -#define FX_CFG2FX_DBL FX_SGL2FX_DBL -#define FX_CFG2FX_SGL -#define CFG(a) (FX_DBL2FXCONST_SGL(a)) -#define FL2FXCONST_CFG FL2FXCONST_SGL -#define FX_DBL2FX_CFG(x) FX_DBL2FX_SGL((FIXP_DBL)(x)) -#else #define FIXP_CFG FIXP_DBL #define FX_CFG2FX_DBL #define FX_CFG2FX_SGL FX_DBL2FX_SGL #define CFG(a) FIXP_DBL(a) #define FL2FXCONST_CFG FL2FXCONST_DBL #define FX_DBL2FX_CFG(x) ((FIXP_DBL)(x)) -#endif /* others */ #define SCALE_INV_ICC (2) @@ -133,21 +124,15 @@ #define QCC_SCALE 1 #define M1M2_DATA FIXP_DBL -#ifndef ARCH_PREFER_MULT_32x32 -#define M1M2_CDATA FIXP_SGL -#define M1M2_CDATA2FX_DBL(a) FX_SGL2FX_DBL(a) -#define FX_DBL2M1M2_CDATA(a) FX_DBL2FX_SGL(a) -#else #define M1M2_CDATA FIXP_DBL #define M1M2_CDATA2FX_DBL(a) (a) #define FX_DBL2M1M2_CDATA(a) (a) -#endif #define CLIP_PROTECT_GAIN_0(x) FL2FXCONST_CFG(((x) / (float)(1 << 0))) #define CLIP_PROTECT_GAIN_1(x) FL2FXCONST_CFG(((x) / (float)(1 << 1))) #define CLIP_PROTECT_GAIN_2(x) FL2FXCONST_CFG(((x) / (float)(1 << 2))) -#define SF_CLD_C1C2 (8) +#define SF_CLD_C1C2 (9) extern const FIXP_CFG dequantCPC__FDK[]; extern const FIXP_CFG dequantICC__FDK[8]; @@ -160,6 +145,7 @@ (FL2FXCONST_DBL(3.1415926535897932f / (float)(1 << (IPD_SCALE - 1)))) extern const FIXP_CFG dequantIPD__FDK[16]; +extern const FIXP_DBL dequantIPD_CLD_ICC_splitAngle__FDK[15][31][8]; extern const FIXP_CFG H11_nc[31][8]; extern const FIXP_CFG H12_nc[31][8]; diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_stp.cpp fdk-aac-2.0.2/libSACdec/src/sac_stp.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_stp.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_stp.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -106,6 +106,8 @@ #include "FDK_matrixCalloc.h" #include "sac_rom.h" +#define SF_FREQ_DOMAIN_HEADROOM (2 * (1)) + #define BP_GF_START 6 #define BP_GF_SIZE 25 #define HP_SIZE 9 @@ -114,6 +116,16 @@ #define SF_WET 5 #define SF_DRY \ 3 /* SF_DRY == 2 would produce good conformance test results as well */ +#define SF_DRY_NRG \ + (4 - 1) /* 8.495f = sum(BP_GF__FDK[i]) \ + i=0,..,(sizeof(BP_GF__FDK)/sizeof(FIXP_CFG)-1) => energy \ + calculation needs 4 bits headroom, headroom can be reduced by 1 \ + bit due to fPow2Div2() usage */ +#define SF_WET_NRG \ + (4 - 1) /* 8.495f = sum(BP_GF__FDK[i]) \ + i=0,..,(sizeof(BP_GF__FDK)/sizeof(FIXP_CFG)-1) => energy \ + calculation needs 4 bits headroom, headroom can be reduced by 1 \ + bit due to fPow2Div2() usage */ #define SF_PRODUCT_BP_GF 13 #define SF_PRODUCT_BP_GF_GF 26 #define SF_SCALE 2 @@ -172,18 +184,6 @@ STP_SCALE_LIMIT_LO_LD64 = LD64(STP_SCALE_LIMIT_LO*STP_SCALE_LIMIT_LO) */ -#define DRY_ENER_WEIGHT(DryEner) DryEner = DryEner >> dry_scale_dmx - -#define WET_ENER_WEIGHT(WetEner) WetEner = WetEner << wet_scale_dmx - -#define DRY_ENER_SUM_REAL(DryEner, dmxReal, n) \ - DryEner += \ - fMultDiv2(fPow2Div2(dmxReal << SF_DRY), pBP[n]) >> ((2 * SF_DRY) - 2) - -#define DRY_ENER_SUM_CPLX(DryEner, dmxReal, dmxImag, n) \ - DryEner += fMultDiv2( \ - fPow2Div2(dmxReal << SF_DRY) + fPow2Div2(dmxImag << SF_DRY), pBP[n]) - #define CALC_WET_SCALE(dryIdx, wetIdx) \ if ((DryEnerLD64[dryIdx] - STP_SCALE_LIMIT_HI_LD64) > WetEnerLD64[wetIdx]) { \ scale[wetIdx] = STP_SCALE_LIMIT_HI; \ @@ -206,29 +206,6 @@ int update_old_ener; }; -inline void combineSignalReal(FIXP_DBL *hybOutputRealDry, - FIXP_DBL *hybOutputRealWet, int bands) { - int n; - - for (n = bands - 1; n >= 0; n--) { - *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet; - hybOutputRealDry++, hybOutputRealWet++; - } -} - -inline void combineSignalRealScale1(FIXP_DBL *hybOutputRealDry, - FIXP_DBL *hybOutputRealWet, FIXP_DBL scaleX, - int bands) { - int n; - - for (n = bands - 1; n >= 0; n--) { - *hybOutputRealDry = - *hybOutputRealDry + - (fMultDiv2(*hybOutputRealWet, scaleX) << (SF_SCALE + 1)); - hybOutputRealDry++, hybOutputRealWet++; - } -} - inline void combineSignalCplx(FIXP_DBL *hybOutputRealDry, FIXP_DBL *hybOutputImagDry, FIXP_DBL *hybOutputRealWet, @@ -236,8 +213,8 @@ int n; for (n = bands - 1; n >= 0; n--) { - *hybOutputRealDry = *hybOutputRealDry + *hybOutputRealWet; - *hybOutputImagDry = *hybOutputImagDry + *hybOutputImagWet; + *hybOutputRealDry = fAddSaturate(*hybOutputRealDry, *hybOutputRealWet); + *hybOutputImagDry = fAddSaturate(*hybOutputImagDry, *hybOutputImagWet); hybOutputRealDry++, hybOutputRealWet++; hybOutputImagDry++, hybOutputImagWet++; } @@ -253,12 +230,14 @@ FIXP_DBL scaleY; for (n = bands - 1; n >= 0; n--) { scaleY = fMultDiv2(scaleX, *pBP); - *hybOutputRealDry = - *hybOutputRealDry + - (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 2)); - *hybOutputImagDry = - *hybOutputImagDry + - (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 2)); + *hybOutputRealDry = SATURATE_LEFT_SHIFT( + (*hybOutputRealDry >> 1) + + (fMultDiv2(*hybOutputRealWet, scaleY) << (SF_SCALE + 1)), + 1, DFRACT_BITS); + *hybOutputImagDry = SATURATE_LEFT_SHIFT( + (*hybOutputImagDry >> 1) + + (fMultDiv2(*hybOutputImagWet, scaleY) << (SF_SCALE + 1)), + 1, DFRACT_BITS); hybOutputRealDry++, hybOutputRealWet++; hybOutputImagDry++, hybOutputImagWet++; pBP++; @@ -305,12 +284,10 @@ for (ch = 0; ch < MAX_OUTPUT_CHANNELS; ch++) { self->prev_tp_scale[ch] = FL2FXCONST_DBL(1.0f / (1 << SF_SCALE)); - self->oldWetEnerLD64[ch] = - FL2FXCONST_DBL(0.34375f); /* 32768.0*32768.0/2^(44-26-10) */ + self->oldWetEnerLD64[ch] = FL2FXCONST_DBL(0.0); } for (ch = 0; ch < MAX_INPUT_CHANNELS; ch++) { - self->oldDryEnerLD64[ch] = - FL2FXCONST_DBL(0.1875f); /* 32768.0*32768.0/2^(44-26) */ + self->oldDryEnerLD64[ch] = FL2FXCONST_DBL(0.0); } self->BP = BP__FDK; @@ -364,7 +341,12 @@ { cplxBands = BP_GF_SIZE; cplxHybBands = self->hybridBands; - dry_scale_dmx = (2 * SF_DRY) - 2; + if (self->treeConfig == TREE_212) { + dry_scale_dmx = 2; /* 2 bits to compensate fMultDiv2() and fPow2Div2() + used in energy calculation */ + } else { + dry_scale_dmx = (2 * SF_DRY) - 2; + } wet_scale_dmx = 2; } @@ -390,8 +372,12 @@ CalcLdData(hStpDec->runDryEner[ch] + ABS_THR__FDK); } for (ch = 0; ch < self->numOutputChannels; ch++) { - hStpDec->oldWetEnerLD64[ch] = - CalcLdData(hStpDec->runWetEner[ch] + ABS_THR2__FDK); + if (self->treeConfig == TREE_212) + hStpDec->oldWetEnerLD64[ch] = + CalcLdData(hStpDec->runWetEner[ch] + ABS_THR__FDK); + else + hStpDec->oldWetEnerLD64[ch] = + CalcLdData(hStpDec->runWetEner[ch] + ABS_THR2__FDK); } } else { hStpDec->update_old_ener++; @@ -411,12 +397,33 @@ pBP = hStpDec->BP_GF - BP_GF_START; switch (self->treeConfig) { case TREE_212: + INT sMin, sNorm, sReal, sImag; + + sReal = fMin(getScalefactor(&qmfOutputRealDry[i_LF][BP_GF_START], + cplxBands - BP_GF_START), + getScalefactor(&qmfOutputRealDry[i_RF][BP_GF_START], + cplxBands - BP_GF_START)); + sImag = fMin(getScalefactor(&qmfOutputImagDry[i_LF][BP_GF_START], + cplxBands - BP_GF_START), + getScalefactor(&qmfOutputImagDry[i_RF][BP_GF_START], + cplxBands - BP_GF_START)); + sMin = fMin(sReal, sImag) - 1; + for (n = BP_GF_START; n < cplxBands; n++) { - dmxReal0 = qmfOutputRealDry[i_LF][n] + qmfOutputRealDry[i_RF][n]; - dmxImag0 = qmfOutputImagDry[i_LF][n] + qmfOutputImagDry[i_RF][n]; - DRY_ENER_SUM_CPLX(DryEner0, dmxReal0, dmxImag0, n); + dmxReal0 = scaleValue(qmfOutputRealDry[i_LF][n], sMin) + + scaleValue(qmfOutputRealDry[i_RF][n], sMin); + dmxImag0 = scaleValue(qmfOutputImagDry[i_LF][n], sMin) + + scaleValue(qmfOutputImagDry[i_RF][n], sMin); + + DryEner0 += (fMultDiv2(fPow2Div2(dmxReal0), pBP[n]) + + fMultDiv2(fPow2Div2(dmxImag0), pBP[n])) >> + SF_DRY_NRG; } - DRY_ENER_WEIGHT(DryEner0); + + sNorm = SF_FREQ_DOMAIN_HEADROOM + SF_DRY_NRG + dry_scale_dmx - + (2 * sMin) + nrgScale; + DryEner0 = scaleValueSaturate( + DryEner0, fMax(fMin(sNorm, DFRACT_BITS - 1), -(DFRACT_BITS - 1))); break; default:; } @@ -424,7 +431,7 @@ /* normalise the 'direct' signals */ for (ch = 0; ch < self->numInputChannels; ch++) { - DryEner[ch] = DryEner[ch] << (nrgScale); + if (self->treeConfig != TREE_212) DryEner[ch] = DryEner[ch] << nrgScale; hStpDec->runDryEner[ch] = fMult(STP_LPF_COEFF1__FDK, hStpDec->runDryEner[ch]) + fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, DryEner[ch]); @@ -436,10 +443,8 @@ DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); } } - if (self->treeConfig == TREE_212) { - for (; ch < MAX_INPUT_CHANNELS; ch++) { - DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); - } + for (; ch < MAX_INPUT_CHANNELS; ch++) { + DryEnerLD64[ch] = FL2FXCONST_DBL(-0.484375f); } /* normalise the 'diffuse' signals */ @@ -450,14 +455,30 @@ } WetEnerX = FL2FXCONST_DBL(0.0f); - for (n = BP_GF_START; n < cplxBands; n++) { - tmp = fPow2Div2(qmfOutputRealWet[ch][n] << SF_WET); - tmp += fPow2Div2(qmfOutputImagWet[ch][n] << SF_WET); - WetEnerX += fMultDiv2(tmp, pBP[n]); - } - WET_ENER_WEIGHT(WetEnerX); - WetEnerX = WetEnerX << (nrgScale); + if (self->treeConfig == TREE_212) { + INT sMin, sNorm; + + sMin = fMin(getScalefactor(&qmfOutputRealWet[ch][BP_GF_START], + cplxBands - BP_GF_START), + getScalefactor(&qmfOutputImagWet[ch][BP_GF_START], + cplxBands - BP_GF_START)); + + for (n = BP_GF_START; n < cplxBands; n++) { + WetEnerX += + (fMultDiv2(fPow2Div2(scaleValue(qmfOutputRealWet[ch][n], sMin)), + pBP[n]) + + fMultDiv2(fPow2Div2(scaleValue(qmfOutputImagWet[ch][n], sMin)), + pBP[n])) >> + SF_WET_NRG; + } + sNorm = SF_FREQ_DOMAIN_HEADROOM + SF_WET_NRG + wet_scale_dmx - + (2 * sMin) + nrgScale; + WetEnerX = scaleValueSaturate( + WetEnerX, fMax(fMin(sNorm, DFRACT_BITS - 1), -(DFRACT_BITS - 1))); + } else + FDK_ASSERT(self->treeConfig == TREE_212); + hStpDec->runWetEner[ch] = fMult(STP_LPF_COEFF1__FDK, hStpDec->runWetEner[ch]) + fMult(ONE_MINUS_STP_LPF_COEFF1__FDK, WetEnerX); diff -Nru fdk-aac-2.0.1/libSACdec/src/sac_tsd.cpp fdk-aac-2.0.2/libSACdec/src/sac_tsd.cpp --- fdk-aac-2.0.1/libSACdec/src/sac_tsd.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACdec/src/sac_tsd.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -123,12 +123,15 @@ RAM_ALIGN LNK_SECTION_CONSTDATA -static const FIXP_STP phiTsd[8] = { - STCP(0x7fffffff, 0x00000000), STCP(0x5a82799a, 0x5a82799a), - STCP(0x00000000, 0x7fffffff), STCP(0xa57d8666, 0x5a82799a), - STCP(0x80000000, 0x00000000), STCP(0xa57d8666, 0xa57d8666), - STCP(0x00000000, 0x80000000), STCP(0x5a82799a, 0xa57d8666), -}; +static const FIXP_DPK phiTsd[8] = { + {{(FIXP_DBL)0x7fffffff, (FIXP_DBL)0x00000000}}, + {{(FIXP_DBL)0x5a82799a, (FIXP_DBL)0x5a82799a}}, + {{(FIXP_DBL)0x00000000, (FIXP_DBL)0x7fffffff}}, + {{(FIXP_DBL)0xa57d8666, (FIXP_DBL)0x5a82799a}}, + {{(FIXP_DBL)0x80000000, (FIXP_DBL)0x00000000}}, + {{(FIXP_DBL)0xa57d8666, (FIXP_DBL)0xa57d8666}}, + {{(FIXP_DBL)0x00000000, (FIXP_DBL)0x80000000}}, + {{(FIXP_DBL)0x5a82799a, (FIXP_DBL)0xa57d8666}}}; /*** Static Functions ***/ static void longmult1(USHORT a[], USHORT b, USHORT d[], int len) { @@ -333,16 +336,19 @@ if (isTrSlot(pTsdData, ts)) { int k; - const FIXP_STP *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]]; + const FIXP_DPK *phi = &phiTsd[pTsdData->bsTsdTrPhaseData[ts]]; FDK_ASSERT((pTsdData->bsTsdTrPhaseData[ts] >= 0) && (pTsdData->bsTsdTrPhaseData[ts] < 8)); /* d = d_nonTr + v_direct * exp(j * bsTsdTrPhaseData[ts]/4 * pi ) */ for (k = TSD_START_BAND; k < numHybridBands; k++) { FIXP_DBL tempReal, tempImag; - cplxMult(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k], *phi); - pDnonTrReal[k] += tempReal; - pDnonTrImag[k] += tempImag; + cplxMultDiv2(&tempReal, &tempImag, pVdirectReal[k], pVdirectImag[k], + *phi); + pDnonTrReal[k] = SATURATE_LEFT_SHIFT( + (pDnonTrReal[k] >> 2) + (tempReal >> 1), 2, DFRACT_BITS); + pDnonTrImag[k] = SATURATE_LEFT_SHIFT( + (pDnonTrImag[k] >> 2) + (tempImag >> 1), 2, DFRACT_BITS); } } diff -Nru fdk-aac-2.0.1/libSACenc/src/sacenc_lib.cpp fdk-aac-2.0.2/libSACenc/src/sacenc_lib.cpp --- fdk-aac-2.0.1/libSACenc/src/sacenc_lib.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSACenc/src/sacenc_lib.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -130,7 +130,7 @@ #define SACENC_LIB_VL1 0 #define SACENC_LIB_VL2 0 #define SACENC_LIB_TITLE "MPEG Surround Encoder" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define SACENC_LIB_BUILD_DATE "" #define SACENC_LIB_BUILD_TIME "" #else diff -Nru fdk-aac-2.0.1/libSBRdec/include/sbrdecoder.h fdk-aac-2.0.2/libSBRdec/include/sbrdecoder.h --- fdk-aac-2.0.1/libSBRdec/include/sbrdecoder.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/include/sbrdecoder.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -361,15 +361,20 @@ * error (0: core decoder found errors, 1: no errors). * \param psDecoded Pointer to a buffer holding a flag. Input: PS is * possible, Output: PS has been rendered. + * \param inDataHeadroom Headroom of the SBR input time signal to prevent + * clipping. + * \param outDataHeadroom Pointer to headroom of the SBR output time signal to + * prevent clipping. * * \return Error code. */ -SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, - INT_PCM *timeData, const int timeDataSize, - int *numChannels, int *sampleRate, +SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, LONG *input, LONG *timeData, + const int timeDataSize, int *numChannels, + int *sampleRate, const FDK_channelMapDescr *const mapDescr, const int mapIdx, const int coreDecodedOk, - UCHAR *psDecoded); + UCHAR *psDecoded, const INT inDataHeadroom, + INT *outDataHeadroom); /** * \brief Close SBR decoder instance and free memory. diff -Nru fdk-aac-2.0.1/libSBRdec/src/env_calc.cpp fdk-aac-2.0.2/libSBRdec/src/env_calc.cpp --- fdk-aac-2.0.1/libSBRdec/src/env_calc.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/env_calc.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -151,6 +151,9 @@ #include "genericStds.h" /* need FDKpow() for debug outputs */ +#define MAX_SFB_NRG_HEADROOM (1) +#define MAX_VAL_NRG_HEADROOM ((((FIXP_DBL)MAXVAL_DBL) >> MAX_SFB_NRG_HEADROOM)) + typedef struct { FIXP_DBL nrgRef[MAX_FREQ_COEFFS]; FIXP_DBL nrgEst[MAX_FREQ_COEFFS]; @@ -493,7 +496,7 @@ } } -#define INTER_TES_SF_CHANGE 3 +#define INTER_TES_SF_CHANGE 4 typedef struct { FIXP_DBL subsample_power_low[(((1024) / (32) * (4) / 2) + (3 * (4)))]; @@ -699,20 +702,11 @@ gain_sf[i] += gamma_sf + 1; /* +1 because of fMultDiv2() */ /* set gain to at least 0.2f */ - FIXP_DBL point_two = FL2FXCONST_DBL(0.8f); /* scaled up by 2 */ - int point_two_sf = -2; - - FIXP_DBL tmp = gain[i]; - if (point_two_sf < gain_sf[i]) { - point_two >>= gain_sf[i] - point_two_sf; - } else { - tmp >>= point_two_sf - gain_sf[i]; - } - /* limit and calculate gain[i]^2 too */ FIXP_DBL gain_pow2; int gain_pow2_sf; - if (tmp < point_two) { + + if (fIsLessThan(gain[i], gain_sf[i], FL2FXCONST_DBL(0.2f), 0)) { gain[i] = FL2FXCONST_DBL(0.8f); gain_sf[i] = -2; gain_pow2 = FL2FXCONST_DBL(0.64f); @@ -739,7 +733,8 @@ fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_after_sf); total_power_high_after_sf = new_summand_sf; } else if (new_summand_sf < total_power_high_after_sf) { - subsample_power_high[i] >>= total_power_high_after_sf - new_summand_sf; + subsample_power_high[i] >>= + fMin(DFRACT_BITS - 1, total_power_high_after_sf - new_summand_sf); } total_power_high_after += subsample_power_high[i] >> preShift2; } @@ -985,7 +980,8 @@ */ if (!useLP) adj_e = h_sbr_cal_env->filtBufferNoise_e - - getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands); + getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands) + + (INT)MAX_SFB_NRG_HEADROOM; /* Scan for maximum reference energy to be able @@ -1005,7 +1001,7 @@ - Smoothing can smear high gains of the previous envelope into the current */ - maxSfbNrg_e += 6; + maxSfbNrg_e += (6 + MAX_SFB_NRG_HEADROOM); adj_e = maxSfbNrg_e; // final_e should not exist for PVC fixfix framing @@ -1031,7 +1027,7 @@ - Smoothing can smear high gains of the previous envelope into the current */ - maxSfbNrg_e += 6; + maxSfbNrg_e += (6 + MAX_SFB_NRG_HEADROOM); if (borders[i] < hHeaderData->numberTimeSlots) /* This envelope affects timeslots that belong to the output frame */ @@ -1477,7 +1473,7 @@ for (k = 0; k < noSubbands; k++) { int sc = scale_change - pNrgs->nrgGain_e[k] + (sc_change - 1); - pNrgs->nrgGain[k] >>= sc; + pNrgs->nrgGain[k] >>= fixMin(sc, DFRACT_BITS - 1); pNrgs->nrgGain_e[k] += sc; } @@ -1485,7 +1481,7 @@ for (k = 0; k < noSubbands; k++) { int sc = scale_change - h_sbr_cal_env->filtBuffer_e[k] + (sc_change - 1); - h_sbr_cal_env->filtBuffer[k] >>= sc; + h_sbr_cal_env->filtBuffer[k] >>= fixMin(sc, DFRACT_BITS - 1); } } @@ -1576,12 +1572,13 @@ FDK_ASSERT(!iTES_enable); /* not supported */ if (flags & SBRDEC_ELD_GRID) { /* FDKmemset(analysBufferReal[j], 0, 64 * sizeof(FIXP_DBL)); */ - adjustTimeSlot_EldGrid(&analysBufferReal[j][lowSubband], pNrgs, - &h_sbr_cal_env->harmIndex, lowSubband, - noSubbands, - fMin(scale_change, DFRACT_BITS - 1), - noNoiseFlag, &h_sbr_cal_env->phaseIndex, - EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale); + adjustTimeSlot_EldGrid( + &analysBufferReal[j][lowSubband], pNrgs, + &h_sbr_cal_env->harmIndex, lowSubband, noSubbands, + fMin(scale_change, DFRACT_BITS - 1), noNoiseFlag, + &h_sbr_cal_env->phaseIndex, + fMax(EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale, + -(DFRACT_BITS - 1))); } else { adjustTimeSlotLC(&analysBufferReal[j][lowSubband], pNrgs, &h_sbr_cal_env->harmIndex, lowSubband, noSubbands, @@ -1830,7 +1827,8 @@ diff = (int)(nrgGain_e[band] - filtBuffer_e[band]); if (diff > 0) { filtBuffer[band] >>= - diff; /* Compensate for the scale change by shifting the mantissa. */ + fMin(diff, DFRACT_BITS - 1); /* Compensate for the scale change by + shifting the mantissa. */ filtBuffer_e[band] += diff; /* New gain is bigger, use its exponent */ } else if (diff < 0) { /* The buffered gains seem to be larger, but maybe there @@ -1850,8 +1848,8 @@ filtBuffer_e[band] -= reserve; /* Compensate in the exponent: */ /* For the remaining difference, change the new gain value */ - diff = fixMin(-(reserve + diff), DFRACT_BITS - 1); - nrgGain[band] >>= diff; + diff = -(reserve + diff); + nrgGain[band] >>= fMin(diff, DFRACT_BITS - 1); nrgGain_e[band] += diff; } } @@ -2325,7 +2323,15 @@ } /* gain = nrgRef / B */ - FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgGain, ptrNrgGain_e); + INT result_exp = 0; + *ptrNrgGain = fDivNorm(nrgRef, b, &result_exp); + *ptrNrgGain_e = (SCHAR)result_exp + (nrgRef_e - b_e); + + /* There could be a one bit diffs. This is important to compensate, + because later in the code values are compared by exponent only. */ + int headroom = CountLeadingBits(*ptrNrgGain); + *ptrNrgGain <<= headroom; + *ptrNrgGain_e -= headroom; } } @@ -2415,6 +2421,9 @@ const FIXP_DBL *p_harmonicPhaseX = &harmonicPhaseX[harmIndex][0]; const INT *p_harmonicPhase = &harmonicPhase[harmIndex][0]; + const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change; + const FIXP_DBL min_val = -max_val; + *(ptrReal - 1) = fAddSaturate( *(ptrReal - 1), SATURATE_SHIFT(fMultDiv2(p_harmonicPhaseX[lowSubband & 1], pSineLevel[0]), @@ -2427,12 +2436,12 @@ FIXP_DBL sineLevel_curr = *pSineLevel++; phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1); - signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); + signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val) + << scale_change; sbNoise = *pNoiseLevel++; if (((INT)sineLevel_curr | noNoiseFlag) == 0) { signalReal += - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise) - << 4); + fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise); } signalReal += sineLevel_curr * p_harmonicPhase[0]; signalReal = @@ -2462,12 +2471,12 @@ FIXP_DBL sineLevel_curr = *pSineLevel++; phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1); - signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); + signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val) + << scale_change; sbNoise = *pNoiseLevel++; if (((INT)sineLevel_curr | noNoiseFlag) == 0) { signalReal += - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise) - << 4); + fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise); } signalReal += sineLevel_curr * p_harmonicPhase[0]; *ptrReal++ = signalReal; @@ -2503,6 +2512,8 @@ FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev; int tone_count = 0; int sineSign = 1; + const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change; + const FIXP_DBL min_val = -max_val; #define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.00815f)) #define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.16773f)) @@ -2518,7 +2529,8 @@ of the signal and should be carried out with full accuracy (supplying #FRACT_BITS valid bits). */ - signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); + signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val) + << scale_change; sineLevel = *pSineLevel++; sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f); @@ -2527,8 +2539,7 @@ else if (!noNoiseFlag) /* Add noisefloor to the amplified signal */ signalReal += - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]) - << 4); + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]); { if (!(harmIndex & 0x1)) { @@ -2547,10 +2558,10 @@ /* save switch and compare operations and reduce to XOR statement */ if (((harmIndex >> 1) & 0x1) ^ freqInvFlag) { - *(ptrReal - 1) += tmp1; + *(ptrReal - 1) = fAddSaturate(*(ptrReal - 1), tmp1); signalReal -= tmp2; } else { - *(ptrReal - 1) -= tmp1; + *(ptrReal - 1) = fAddSaturate(*(ptrReal - 1), -tmp1); signalReal += tmp2; } *ptrReal++ = signalReal; @@ -2575,14 +2586,15 @@ !noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], - pNoiseLevel[0]) - << 4); + signalReal += + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]); } /* The next multiplication constitutes the actual envelope adjustment of * the signal. */ - signalReal += fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); + signalReal += + fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val) + << scale_change; pNoiseLevel++; *ptrReal++ = signalReal; @@ -2595,16 +2607,16 @@ index++; /* The next multiplication constitutes the actual envelope adjustment of * the signal. */ - signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change); + signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain++), max_val), min_val) + << scale_change; if (*pSineLevel++ != FL2FXCONST_DBL(0.0f)) tone_count++; else if (!noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], - pNoiseLevel[0]) - << 4); + signalReal += + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]); } pNoiseLevel++; @@ -2624,7 +2636,8 @@ index++; /* The next multiplication constitutes the actual envelope adjustment of the * signal. */ - signalReal = fMultDiv2(*ptrReal, *pGain) << ((int)scale_change); + signalReal = fMax(fMin(fMultDiv2(*ptrReal, *pGain), max_val), min_val) + << scale_change; sineLevelPrev = fMultDiv2(pSineLevel[-1], FL2FX_SGL(0.0163f)); sineLevel = pSineLevel[0]; @@ -2633,10 +2646,8 @@ else if (!noNoiseFlag) { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - signalReal = - signalReal + - (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]) - << 4); + signalReal = signalReal + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], + pNoiseLevel[0]); } if (!(harmIndex & 0x1)) { @@ -2695,6 +2706,9 @@ /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio; int index = *ptrPhaseIndex; int shift; + FIXP_DBL max_val_noise = 0, min_val_noise = 0; + const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change; + const FIXP_DBL min_val = -max_val; *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1); @@ -2704,6 +2718,8 @@ shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift); } else { shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift); + max_val_noise = MAX_VAL_NRG_HEADROOM >> shift; + min_val_noise = -max_val_noise; } if (smooth_ratio > FL2FXCONST_SGL(0.0f)) { @@ -2719,8 +2735,10 @@ smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) + fMult(direct_ratio, noiseLevel[k]); } else { - smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) + - fMult(direct_ratio, noiseLevel[k]); + smoothedNoise = fMultDiv2(smooth_ratio, filtBufferNoise[k]); + smoothedNoise = + (fMax(fMin(smoothedNoise, max_val_noise), min_val_noise) << shift) + + fMult(direct_ratio, noiseLevel[k]); } /* @@ -2728,8 +2746,12 @@ of the signal and should be carried out with full accuracy (supplying #DFRACT_BITS valid bits). */ - signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change); - signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change); + signalReal = + fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val) + << scale_change; + signalImag = + fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val) + << scale_change; index++; @@ -2741,11 +2763,9 @@ /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); noiseReal = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); noiseImag = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); *ptrReal++ = (signalReal + noiseReal); *ptrImag++ = (signalImag + noiseImag); } @@ -2753,8 +2773,12 @@ } else { for (k = 0; k < noSubbands; k++) { smoothedGain = gain[k]; - signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change; - signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change; + signalReal = + fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val) + << scale_change; + signalImag = + fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val) + << scale_change; index++; @@ -2763,13 +2787,12 @@ smoothedNoise = noiseLevel[k]; index &= (SBR_NF_NO_RANDOM_VAL - 1); noiseReal = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); noiseImag = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); - /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ - signalReal += noiseReal << 4; - signalImag += noiseImag << 4; + signalReal += noiseReal; + signalImag += noiseImag; } *ptrReal++ = signalReal; *ptrImag++ = signalImag; @@ -2861,6 +2884,9 @@ int freqInvFlag = (lowSubband & 1); FIXP_DBL sineLevel; int shift; + FIXP_DBL max_val_noise = 0, min_val_noise = 0; + const FIXP_DBL max_val = MAX_VAL_NRG_HEADROOM >> scale_change; + const FIXP_DBL min_val = -max_val; *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1); *ptrHarmIndex = (harmIndex + 1) & 3; @@ -2876,10 +2902,13 @@ filtBufferNoiseShift += 1; /* due to later use of fMultDiv2 instead of fMult */ - if (filtBufferNoiseShift < 0) + if (filtBufferNoiseShift < 0) { shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift); - else + } else { shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift); + max_val_noise = MAX_VAL_NRG_HEADROOM >> shift; + min_val_noise = -max_val_noise; + } if (smooth_ratio > FL2FXCONST_SGL(0.0f)) { for (k = 0; k < noSubbands; k++) { @@ -2895,8 +2924,10 @@ smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) + fMult(direct_ratio, noiseLevel[k]); } else { - smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) + - fMult(direct_ratio, noiseLevel[k]); + smoothedNoise = fMultDiv2(smooth_ratio, filtBufferNoise[k]); + smoothedNoise = + (fMax(fMin(smoothedNoise, max_val_noise), min_val_noise) << shift) + + fMult(direct_ratio, noiseLevel[k]); } /* @@ -2904,8 +2935,12 @@ of the signal and should be carried out with full accuracy (supplying #DFRACT_BITS valid bits). */ - signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change); - signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change); + signalReal = + fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val) + << scale_change; + signalImag = + fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val) + << scale_change; index++; @@ -2944,13 +2979,10 @@ } else { /* Add noisefloor to the amplified signal */ index &= (SBR_NF_NO_RANDOM_VAL - 1); - /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ noiseReal = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); noiseImag = - fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise) - << 4; + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); *ptrReal++ = (signalReal + noiseReal); *ptrImag++ = (signalImag + noiseImag); } @@ -2961,8 +2993,12 @@ } else { for (k = 0; k < noSubbands; k++) { smoothedGain = gain[k]; - signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change; - signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change; + signalReal = + fMax(fMin(fMultDiv2(*ptrReal, smoothedGain), max_val), min_val) + << scale_change; + signalImag = + fMax(fMin(fMultDiv2(*ptrImag, smoothedGain), max_val), min_val) + << scale_change; index++; @@ -2992,14 +3028,13 @@ /* Add noisefloor to the amplified signal */ smoothedNoise = noiseLevel[k]; index &= (SBR_NF_NO_RANDOM_VAL - 1); - noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], - smoothedNoise); - noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], - smoothedNoise); - - /* FDK_sbrDecoder_sbr_randomPhase is downscaled by 2^3 */ - signalReal += noiseReal << 4; - signalImag += noiseImag << 4; + noiseReal = + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); + noiseImag = + fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); + + signalReal += noiseReal; + signalImag += noiseImag; } } *ptrReal++ = signalReal; @@ -3147,6 +3182,11 @@ return SBRDEC_UNSUPPORTED_CONFIG; } + /* Restrict maximum value of limiter band table */ + if (workLimiterBandTable[tempNoLim] > highSubband) { + return SBRDEC_UNSUPPORTED_CONFIG; + } + /* Copy limiterbands from working buffer into final destination */ for (k = 0; k <= nBands; k++) { limiterBandTable[k] = workLimiterBandTable[k]; diff -Nru fdk-aac-2.0.1/libSBRdec/src/env_extr.cpp fdk-aac-2.0.2/libSBRdec/src/env_extr.cpp --- fdk-aac-2.0.1/libSBRdec/src/env_extr.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/env_extr.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1152,6 +1152,10 @@ int nEnv, i, tranIdx; const int *pTable; + if (tranPosInternal >= numberTimeSlots) { + return 0; + } + switch (numberTimeSlots) { case 8: pTable = FDK_sbrDecoder_envelopeTable_8[tranPosInternal]; diff -Nru fdk-aac-2.0.1/libSBRdec/src/hbe.cpp fdk-aac-2.0.2/libSBRdec/src/hbe.cpp --- fdk-aac-2.0.1/libSBRdec/src/hbe.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/hbe.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -957,7 +957,7 @@ hQmfTran->qmfOutBufSize = 2 * (hQmfTran->noCols / 2 + QMF_WIN_LEN - 1); hQmfTran->inBuf_F = - (INT_PCM*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(INT_PCM)); + (LONG*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(LONG)); /* buffered time signal needs to be delayed by synthesis_size; max * synthesis_size = 20; */ if (hQmfTran->inBuf_F == NULL) { @@ -1339,7 +1339,7 @@ g_r_m = fMultDiv2(tmp_r, factor_m) << shift; g_i_m = fMultDiv2(tmp_i, factor_m) << shift; g_e = scale_factor_hbe - (g_e + factor_e + gammaCenter_e + add); - fMax((INT)0, g_e); + g_e = fMax((INT)0, g_e); *qmfHBEBufReal_F += g_r_m >> g_e; *qmfHBEBufImag_F += g_i_m >> g_e; } diff -Nru fdk-aac-2.0.1/libSBRdec/src/hbe.h fdk-aac-2.0.2/libSBRdec/src/hbe.h --- fdk-aac-2.0.1/libSBRdec/src/hbe.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/hbe.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -132,6 +132,9 @@ } KEEP_STATES_SYNCED_MODE; struct hbeTransposer { + FIXP_DBL anaQmfStates[HBE_QMF_FILTER_STATE_ANA_SIZE]; + FIXP_QSS synQmfStates[HBE_QMF_FILTER_STATE_SYN_SIZE]; + int xOverQmf[MAX_NUM_PATCHES_HBE]; int maxStretch; @@ -144,7 +147,7 @@ int stopBand; int bSbr41; - INT_PCM *inBuf_F; + LONG *inBuf_F; FIXP_DBL **qmfInBufReal_F; FIXP_DBL **qmfInBufImag_F; @@ -156,9 +159,6 @@ FIXP_DBL const *synthesisQmfPreModCos_F; FIXP_DBL const *synthesisQmfPreModSin_F; - FIXP_QAS anaQmfStates[HBE_QMF_FILTER_STATE_ANA_SIZE]; - FIXP_QSS synQmfStates[HBE_QMF_FILTER_STATE_SYN_SIZE]; - FIXP_DBL **qmfHBEBufReal_F; FIXP_DBL **qmfHBEBufImag_F; diff -Nru fdk-aac-2.0.1/libSBRdec/src/HFgen_preFlat.cpp fdk-aac-2.0.2/libSBRdec/src/HFgen_preFlat.cpp --- fdk-aac-2.0.1/libSBRdec/src/HFgen_preFlat.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/HFgen_preFlat.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -897,30 +897,31 @@ for (i = startSample; i < stopSample; i++) { maxVal |= (FIXP_DBL)((LONG)(sourceBufferReal[i][loBand]) ^ - ((LONG)sourceBufferReal[i][loBand] >> (SAMPLE_BITS - 1))); + ((LONG)sourceBufferReal[i][loBand] >> (DFRACT_BITS - 1))); maxVal |= (FIXP_DBL)((LONG)(sourceBufferImag[i][loBand]) ^ - ((LONG)sourceBufferImag[i][loBand] >> (SAMPLE_BITS - 1))); + ((LONG)sourceBufferImag[i][loBand] >> (DFRACT_BITS - 1))); } if (maxVal != FL2FX_DBL(0.0f)) { - reserve = fixMax(0, CntLeadingZeros(maxVal) - 2); + reserve = CntLeadingZeros(maxVal) - 2; } nrg_ov = nrg = (FIXP_DBL)0; if (scale_nrg_ov > -31) { for (i = startSample; i < overlap; i++) { - nrg_ov += (fPow2Div2(sourceBufferReal[i][loBand] << reserve) + - fPow2Div2(sourceBufferImag[i][loBand] << reserve)) >> - sum_scale_ov; + nrg_ov += + (fPow2Div2(scaleValue(sourceBufferReal[i][loBand], reserve)) + + fPow2Div2(scaleValue(sourceBufferImag[i][loBand], reserve))) >> + sum_scale_ov; } } else { scale_nrg_ov = 0; } if (scale_nrg > -31) { for (i = overlap; i < stopSample; i++) { - nrg += (fPow2Div2(sourceBufferReal[i][loBand] << reserve) + - fPow2Div2(sourceBufferImag[i][loBand] << reserve)) >> + nrg += (fPow2Div2(scaleValue(sourceBufferReal[i][loBand], reserve)) + + fPow2Div2(scaleValue(sourceBufferImag[i][loBand], reserve))) >> sum_scale; } } else { diff -Nru fdk-aac-2.0.1/libSBRdec/src/lpp_tran.cpp fdk-aac-2.0.2/libSBRdec/src/lpp_tran.cpp --- fdk-aac-2.0.1/libSBRdec/src/lpp_tran.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/lpp_tran.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -446,8 +446,26 @@ pSettings->nCols) + lowBandShift); } - dynamicScale = fixMax( - 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */ + + if (dynamicScale == 0) { + /* In this special case the available headroom bits as well as + ovLowBandShift and lowBandShift are zero. The spectrum is limited to + prevent -1.0, so negative values for dynamicScale can be avoided. */ + for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols); + i++) { + lowBandReal[i] = fixMax(lowBandReal[i], (FIXP_DBL)0x80000001); + } + if (!useLP) { + for (i = 0; i < (LPC_ORDER + pSettings->overlap + pSettings->nCols); + i++) { + lowBandImag[i] = fixMax(lowBandImag[i], (FIXP_DBL)0x80000001); + } + } + } else { + dynamicScale = + fixMax(0, dynamicScale - + 1); /* one additional bit headroom to prevent -1.0 */ + } /* Scale temporal QMF buffer. @@ -996,8 +1014,8 @@ pSettings->nCols) + lowBandShift); - dynamicScale = fixMax( - 0, dynamicScale - 1); /* one additional bit headroom to prevent -1.0 */ + dynamicScale = + dynamicScale - 1; /* one additional bit headroom to prevent -1.0 */ /* Scale temporal QMF buffer. @@ -1176,6 +1194,9 @@ } else { /* bw <= 0 */ int descale = fixMin(DFRACT_BITS - 1, (LPC_SCALE_FACTOR + dynamicScale)); + dynamicScale += + 1; /* prevent negativ scale factor due to 'one additional bit + headroom' */ for (i = startSample; i < stopSample; i++) { FIXP_DBL accu1, accu2; @@ -1192,9 +1213,9 @@ dynamicScale; qmfBufferReal[i][loBand] = - (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << 1); + (lowBandReal[LPC_ORDER + i] >> descale) + (accu1 << (1 + 1)); qmfBufferImag[i][loBand] = - (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << 1); + (lowBandImag[LPC_ORDER + i] >> descale) + (accu2 << (1 + 1)); } } /* bw <= 0 */ diff -Nru fdk-aac-2.0.1/libSBRdec/src/psdec.cpp fdk-aac-2.0.2/libSBRdec/src/psdec.cpp --- fdk-aac-2.0.1/libSBRdec/src/psdec.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/psdec.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -325,11 +325,11 @@ int env, int usb) { INT group = 0; INT bin = 0; - INT noIidSteps, noFactors; + INT noIidSteps; FIXP_SGL invL; FIXP_DBL ScaleL, ScaleR; - FIXP_DBL Alpha, Beta, AlphasValue; + FIXP_DBL Alpha, Beta; FIXP_DBL h11r, h12r, h21r, h22r; const FIXP_DBL *PScaleFactors; @@ -337,11 +337,9 @@ if (h_ps_d->bsData[h_ps_d->processSlot].mpeg.bFineIidQ) { PScaleFactors = ScaleFactorsFine; /* values are shiftet right by one */ noIidSteps = NO_IID_STEPS_FINE; - noFactors = NO_IID_LEVELS_FINE; } else { PScaleFactors = ScaleFactors; /* values are shiftet right by one */ noIidSteps = NO_IID_STEPS; - noFactors = NO_IID_LEVELS; } /* dequantize and decode */ @@ -360,23 +358,17 @@ /* ScaleR and ScaleL are scaled by 1 shift right */ - ScaleL = ScaleR = 0; - if (noIidSteps + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] >= 0 && noIidSteps + h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] < noFactors) - ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.pCoef - ->aaIidIndexMapped[env][bin]]; - if (noIidSteps - h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] >= 0 && noIidSteps - h_ps_d->specificTo.mpeg.pCoef->aaIidIndexMapped[env][bin] < noFactors) - ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.pCoef - ->aaIidIndexMapped[env][bin]]; - - AlphasValue = 0; - if (h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin] >= 0) - AlphasValue = Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]]; + ScaleR = PScaleFactors[noIidSteps + h_ps_d->specificTo.mpeg.pCoef + ->aaIidIndexMapped[env][bin]]; + ScaleL = PScaleFactors[noIidSteps - h_ps_d->specificTo.mpeg.pCoef + ->aaIidIndexMapped[env][bin]]; + Beta = fMult( - fMult(AlphasValue, + fMult(Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]], (ScaleR - ScaleL)), FIXP_SQRT05); Alpha = - AlphasValue >> 1; + Alphas[h_ps_d->specificTo.mpeg.pCoef->aaIccIndexMapped[env][bin]] >> 1; /* Alpha and Beta are now both scaled by 2 shifts right */ diff -Nru fdk-aac-2.0.1/libSBRdec/src/pvc_dec.cpp fdk-aac-2.0.2/libSBRdec/src/pvc_dec.cpp --- fdk-aac-2.0.1/libSBRdec/src/pvc_dec.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/pvc_dec.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -534,7 +534,8 @@ for (ksg = ksg_start; ksg < PVC_NBLOW; ksg++) { for (band = sg_borders[ksg]; band < sg_borders[ksg + 1]; band++) { /* The division by 8 == (RATE*lbw) is required algorithmically */ - E[ksg] += (fPow2Div2(qmfR[band]) + fPow2Div2(qmfI[band])) >> 2; + E[ksg] += + ((fPow2Div2(qmfR[band]) >> 1) + (fPow2Div2(qmfI[band]) >> 1)) >> 3; } } } @@ -542,7 +543,7 @@ if (E[ksg] > (FIXP_DBL)0) { /* 10/log2(10) = 0.752574989159953 * 2^2 */ int exp_log; - FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent, &exp_log); + FIXP_DBL nrg = CalcLog2(E[ksg], 2 * qmfExponent + 2, &exp_log); nrg = fMult(nrg, FL2FXCONST_SGL(LOG10FAC)); nrg = scaleValue(nrg, exp_log - PVC_ESG_EXP + 2); pEsg[ksg] = fMax(nrg, FL2FXCONST_DBL(-10.0 / (1 << PVC_ESG_EXP))); @@ -603,22 +604,22 @@ E_high_exp[ksg] = 0; /* residual part */ - accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP + + accu = ((LONG)(SCHAR)*pTab2++) << (DFRACT_BITS - 8 - PVC_ESG_EXP - 2 + pPvcDynamicData->pScalingCoef[3]); /* linear combination of lower grouped energies part */ for (kb = 0; kb < PVC_NBLOW; kb++) { predCoeff = (FIXP_SGL)( (SHORT)(SCHAR)pTab1[kb * pPvcDynamicData->nbHigh + ksg] << 8); - predCoeff_exp = pPvcDynamicData->pScalingCoef[kb] + - 1; /* +1 to compensate for Div2 */ - accu += fMultDiv2(E[kb], predCoeff) << predCoeff_exp; + predCoeff_exp = -(pPvcDynamicData->pScalingCoef[kb] + 1 - + 2); /* +1 to compensate for Div2; -2 for accu */ + accu += fMultDiv2(E[kb], predCoeff) >> predCoeff_exp; } /* convert back to linear domain */ accu = fMult(accu, FL2FXCONST_SGL(LOG10FAC_INV)); - accu = f2Pow( - accu, PVC_ESG_EXP - 1, - &predCoeff_exp); /* -1 compensates for exponent of LOG10FAC_INV */ + accu = f2Pow(accu, PVC_ESG_EXP - 1 + 2, + &predCoeff_exp); /* -1 compensates for exponent of + LOG10FAC_INV; +2 for accu */ predictedEsgSlot[ksg] = accu; E_high_exp[ksg] = predCoeff_exp; if (predCoeff_exp > E_high_exp_max) { @@ -628,8 +629,8 @@ /* rescale output vector according to largest exponent */ for (ksg = 0; ksg < pPvcDynamicData->nbHigh; ksg++) { - int scale = E_high_exp[ksg] - E_high_exp_max; - predictedEsgSlot[ksg] = scaleValue(predictedEsgSlot[ksg], scale); + int scale = fMin(E_high_exp_max - E_high_exp[ksg], DFRACT_BITS - 1); + predictedEsgSlot[ksg] = predictedEsgSlot[ksg] >> scale; } *predictedEsg_exp = E_high_exp_max; } diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_crc.cpp fdk-aac-2.0.2/libSBRdec/src/sbr_crc.cpp --- fdk-aac-2.0.1/libSBRdec/src/sbr_crc.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_crc.cpp 1970-01-01 00:00:00.000000000 +0000 @@ -1,192 +0,0 @@ -/* ----------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten -Forschung e.V. All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software -that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding -scheme for digital audio. This FDK AAC Codec software is intended to be used on -a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient -general perceptual audio codecs. AAC-ELD is considered the best-performing -full-bandwidth communications codec by independent studies and is widely -deployed. AAC has been standardized by ISO and IEC as part of the MPEG -specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including -those of Fraunhofer) may be obtained through Via Licensing -(www.vialicensing.com) or through the respective patent owners individually for -the purpose of encoding or decoding bit streams in products that are compliant -with the ISO/IEC MPEG audio standards. Please note that most manufacturers of -Android devices already license these patent claims through Via Licensing or -directly from the patent owners, and therefore FDK AAC Codec software may -already be covered under those patent licenses when it is used for those -licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions -with enhanced sound quality, are also available from Fraunhofer. Users are -encouraged to check the Fraunhofer website for additional applications -information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, -are permitted without payment of copyright license fees provided that you -satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of -the FDK AAC Codec or your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation -and/or other materials provided with redistributions of the FDK AAC Codec or -your modifications thereto in binary form. You must make available free of -charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived -from this library without prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute -the FDK AAC Codec software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating -that you changed the software and the date of any change. For modified versions -of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" -must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK -AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without -limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. -Fraunhofer provides no warranty of patent non-infringement with respect to this -software. - -You may use this FDK AAC Codec software or modifications thereto only for -purposes that are authorized by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright -holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, -including but not limited to the implied warranties of merchantability and -fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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), arising in any way out of the use of -this software, even if advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------ */ - -/**************************** SBR decoder library ****************************** - - Author(s): - - Description: - -*******************************************************************************/ - -/*! - \file - \brief CRC check coutines -*/ - -#include "sbr_crc.h" - -#include "FDK_bitstream.h" -#include "transcendent.h" - -#define MAXCRCSTEP 16 -#define MAXCRCSTEP_LD 4 - -/*! - \brief crc calculation -*/ -static ULONG calcCRC(HANDLE_CRC hCrcBuf, ULONG bValue, int nBits) { - int i; - ULONG bMask = (1UL << (nBits - 1)); - - for (i = 0; i < nBits; i++, bMask >>= 1) { - USHORT flag = (hCrcBuf->crcState & hCrcBuf->crcMask) ? 1 : 0; - USHORT flag1 = (bMask & bValue) ? 1 : 0; - - flag ^= flag1; - hCrcBuf->crcState <<= 1; - if (flag) hCrcBuf->crcState ^= hCrcBuf->crcPoly; - } - - return (hCrcBuf->crcState); -} - -/*! - \brief crc -*/ -static int getCrc(HANDLE_FDK_BITSTREAM hBs, ULONG NrBits) { - int i; - CRC_BUFFER CrcBuf; - - CrcBuf.crcState = SBR_CRC_START; - CrcBuf.crcPoly = SBR_CRC_POLY; - CrcBuf.crcMask = SBR_CRC_MASK; - - int CrcStep = NrBits >> MAXCRCSTEP_LD; - - int CrcNrBitsRest = (NrBits - CrcStep * MAXCRCSTEP); - ULONG bValue; - - for (i = 0; i < CrcStep; i++) { - bValue = FDKreadBits(hBs, MAXCRCSTEP); - calcCRC(&CrcBuf, bValue, MAXCRCSTEP); - } - - bValue = FDKreadBits(hBs, CrcNrBitsRest); - calcCRC(&CrcBuf, bValue, CrcNrBitsRest); - - return (CrcBuf.crcState & SBR_CRC_RANGE); -} - -/*! - \brief crc interface - \return 1: CRC OK, 0: CRC check failure -*/ -int SbrCrcCheck(HANDLE_FDK_BITSTREAM hBs, /*!< handle to bit-buffer */ - LONG NrBits) /*!< max. CRC length */ -{ - int crcResult = 1; - ULONG NrCrcBits; - ULONG crcCheckResult; - LONG NrBitsAvailable; - ULONG crcCheckSum; - - crcCheckSum = FDKreadBits(hBs, 10); - - NrBitsAvailable = FDKgetValidBits(hBs); - if (NrBitsAvailable <= 0) { - return 0; - } - - NrCrcBits = fixMin((INT)NrBits, (INT)NrBitsAvailable); - - crcCheckResult = getCrc(hBs, NrCrcBits); - FDKpushBack(hBs, (NrBitsAvailable - FDKgetValidBits(hBs))); - - if (crcCheckResult != crcCheckSum) { - crcResult = 0; - } - - return (crcResult); -} diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_crc.h fdk-aac-2.0.2/libSBRdec/src/sbr_crc.h --- fdk-aac-2.0.1/libSBRdec/src/sbr_crc.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_crc.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,138 +0,0 @@ -/* ----------------------------------------------------------------------------- -Software License for The Fraunhofer FDK AAC Codec Library for Android - -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten -Forschung e.V. All rights reserved. - - 1. INTRODUCTION -The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software -that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding -scheme for digital audio. This FDK AAC Codec software is intended to be used on -a wide variety of Android devices. - -AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient -general perceptual audio codecs. AAC-ELD is considered the best-performing -full-bandwidth communications codec by independent studies and is widely -deployed. AAC has been standardized by ISO and IEC as part of the MPEG -specifications. - -Patent licenses for necessary patent claims for the FDK AAC Codec (including -those of Fraunhofer) may be obtained through Via Licensing -(www.vialicensing.com) or through the respective patent owners individually for -the purpose of encoding or decoding bit streams in products that are compliant -with the ISO/IEC MPEG audio standards. Please note that most manufacturers of -Android devices already license these patent claims through Via Licensing or -directly from the patent owners, and therefore FDK AAC Codec software may -already be covered under those patent licenses when it is used for those -licensed purposes only. - -Commercially-licensed AAC software libraries, including floating-point versions -with enhanced sound quality, are also available from Fraunhofer. Users are -encouraged to check the Fraunhofer website for additional applications -information and documentation. - -2. COPYRIGHT LICENSE - -Redistribution and use in source and binary forms, with or without modification, -are permitted without payment of copyright license fees provided that you -satisfy the following conditions: - -You must retain the complete text of this software license in redistributions of -the FDK AAC Codec or your modifications thereto in source code form. - -You must retain the complete text of this software license in the documentation -and/or other materials provided with redistributions of the FDK AAC Codec or -your modifications thereto in binary form. You must make available free of -charge copies of the complete source code of the FDK AAC Codec and your -modifications thereto to recipients of copies in binary form. - -The name of Fraunhofer may not be used to endorse or promote products derived -from this library without prior written permission. - -You may not charge copyright license fees for anyone to use, copy or distribute -the FDK AAC Codec software or your modifications thereto. - -Your modified versions of the FDK AAC Codec must carry prominent notices stating -that you changed the software and the date of any change. For modified versions -of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" -must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK -AAC Codec Library for Android." - -3. NO PATENT LICENSE - -NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without -limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. -Fraunhofer provides no warranty of patent non-infringement with respect to this -software. - -You may use this FDK AAC Codec software or modifications thereto only for -purposes that are authorized by appropriate patent licenses. - -4. DISCLAIMER - -This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright -holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, -including but not limited to the implied warranties of merchantability and -fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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), arising in any way out of the use of -this software, even if advised of the possibility of such damage. - -5. CONTACT INFORMATION - -Fraunhofer Institute for Integrated Circuits IIS -Attention: Audio and Multimedia Departments - FDK AAC LL -Am Wolfsmantel 33 -91058 Erlangen, Germany - -www.iis.fraunhofer.de/amm -amm-info@iis.fraunhofer.de ------------------------------------------------------------------------------ */ - -/**************************** SBR decoder library ****************************** - - Author(s): - - Description: - -*******************************************************************************/ - -/*! - \file - \brief CRC checking routines -*/ -#ifndef SBR_CRC_H -#define SBR_CRC_H - -#include "sbrdecoder.h" - -#include "FDK_bitstream.h" - -/* some useful crc polynoms: - -crc5: x^5+x^4+x^2+x^1+1 -crc6: x^6+x^5+x^3+x^2+x+1 -crc7: x^7+x^6+x^2+1 -crc8: x^8+x^2+x+x+1 -*/ - -/* default SBR CRC */ /* G(x) = x^10 + x^9 + x^5 + x^4 + x + 1 */ -#define SBR_CRC_POLY 0x0233 -#define SBR_CRC_MASK 0x0200 -#define SBR_CRC_START 0x0000 -#define SBR_CRC_RANGE 0x03FF - -typedef struct { - USHORT crcState; - USHORT crcMask; - USHORT crcPoly; -} CRC_BUFFER; - -typedef CRC_BUFFER *HANDLE_CRC; - -int SbrCrcCheck(HANDLE_FDK_BITSTREAM hBitBuf, LONG NrCrcBits); - -#endif diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_dec.cpp fdk-aac-2.0.2/libSBRdec/src/sbr_dec.cpp --- fdk-aac-2.0.1/libSBRdec/src/sbr_dec.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_dec.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -259,17 +259,18 @@ void sbr_dec( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ - INT_PCM *timeIn, /*!< pointer to input time signal */ - INT_PCM *timeOut, /*!< pointer to output time signal */ + LONG *timeIn, /*!< pointer to input time signal */ + LONG *timeOut, /*!< pointer to output time signal */ HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ - INT_PCM *timeOutRight, /*!< pointer to output time signal */ + LONG *timeOutRight, /*!< pointer to output time signal */ const int strideOut, /*!< Time data traversal strideOut */ HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, /*!< Some control data of last frame */ const int applyProcessing, /*!< Flag for SBR operation */ - HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize) { + HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize, + const INT sbrInDataHeadroom) { int i, slot, reserve; int saveLbScale; int lastSlotOffs; @@ -278,7 +279,7 @@ /* temporary pointer / variable for QMF; required as we want to use temporary buffer creating one frame delay for HBE in LP mode */ - INT_PCM *pTimeInQmf = timeIn; + LONG *pTimeInQmf = timeIn; /* Number of QMF timeslots in the overlap buffer: */ int ov_len = hSbrDec->LppTrans.pSettings->overlap; @@ -341,8 +342,8 @@ } else { C_AALLOC_SCRATCH_START(qmfTemp, FIXP_DBL, 2 * (64)); qmfAnalysisFiltering(&hSbrDec->qmfDomainInCh->fb, pReal, pImag, - &hSbrDec->qmfDomainInCh->scaling, pTimeInQmf, 0, 1, - qmfTemp); + &hSbrDec->qmfDomainInCh->scaling, pTimeInQmf, + 0 + sbrInDataHeadroom, 1, qmfTemp); C_AALLOC_SCRATCH_END(qmfTemp, FIXP_DBL, 2 * (64)); } @@ -658,7 +659,7 @@ if (!(flags & SBRDEC_PS_DECODED)) { if (!(flags & SBRDEC_SKIP_QMF_SYN)) { - int outScalefactor = 0; + int outScalefactor = -(8); if (h_ps_d != NULL) { h_ps_d->procFrameBased = 1; /* we here do frame based processing */ @@ -743,6 +744,7 @@ */ FDK_ASSERT(hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis <= QMF_MAX_SYNTHESIS_BANDS); + qmfChangeOutScalefactor(synQmfRight, -(8)); FDKmemcpy(synQmfRight->FilterStates, synQmf->FilterStates, 9 * hSbrDec->qmfDomainInCh->pGlobalConf->nBandsSynthesis * sizeof(FIXP_QSS)); @@ -814,7 +816,8 @@ : scaleFactorLowBand_no_ov, scaleFactorHighBand, synQmf->lsb, synQmf->usb); - outScalefactorL = outScalefactorR = 1; /* psDiffScale! (MPEG-PS) */ + outScalefactorL = outScalefactorR = + 1 + sbrInDataHeadroom; /* psDiffScale! (MPEG-PS) */ } sbrDecoder_drcApplySlot(/* right channel */ @@ -831,6 +834,9 @@ outScalefactorL += maxShift; if (!(flags & SBRDEC_SKIP_QMF_SYN)) { + qmfChangeOutScalefactor(synQmf, -(8)); + qmfChangeOutScalefactor(synQmfRight, -(8)); + qmfSynthesisFilteringSlot( synQmfRight, rQmfReal, /* QMF real buffer */ rQmfImag, /* QMF imag buffer */ diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbrdec_freq_sca.cpp fdk-aac-2.0.2/libSBRdec/src/sbrdec_freq_sca.cpp --- fdk-aac-2.0.1/libSBRdec/src/sbrdec_freq_sca.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbrdec_freq_sca.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -230,6 +230,8 @@ } } + stopMin = fMin(stopMin, 64); + /* Choose a stop band between k1 and 64 depending on stopFreq (0..13), based on a logarithmic scale. @@ -523,7 +525,8 @@ step = FL2FXCONST_DBL(0.0f); } } - return FX_DBL2FX_SGL(bandfactor << 1); + return (bandfactor >= FL2FXCONST_DBL(0.5)) ? (FIXP_SGL)MAXVAL_SGL + : FX_DBL2FX_SGL(bandfactor << 1); } /*! diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_dec.h fdk-aac-2.0.2/libSBRdec/src/sbr_dec.h --- fdk-aac-2.0.1/libSBRdec/src/sbr_dec.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_dec.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -176,17 +176,18 @@ void sbr_dec( HANDLE_SBR_DEC hSbrDec, /*!< handle to Decoder channel */ - INT_PCM *timeIn, /*!< pointer to input time signal */ - INT_PCM *timeOut, /*!< pointer to output time signal */ + LONG *timeIn, /*!< pointer to input time signal */ + LONG *timeOut, /*!< pointer to output time signal */ HANDLE_SBR_DEC hSbrDecRight, /*!< handle to Decoder channel right */ - INT_PCM *timeOutRight, /*!< pointer to output time signal */ + LONG *timeOutRight, /*!< pointer to output time signal */ INT strideOut, /*!< Time data traversal strideOut */ HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ HANDLE_SBR_PREV_FRAME_DATA hPrevFrameData, /*!< Some control data of last frame */ const int applyProcessing, /*!< Flag for SBR operation */ - HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize); + HANDLE_PS_DEC h_ps_d, const UINT flags, const int codecFrameSize, + const INT sbrInDataHeadroom); SBR_ERROR createSbrDec(SBR_CHANNEL *hSbrChannel, HANDLE_SBR_HEADER_DATA hHeaderData, diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbrdecoder.cpp fdk-aac-2.0.2/libSBRdec/src/sbrdecoder.cpp --- fdk-aac-2.0.1/libSBRdec/src/sbrdecoder.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbrdecoder.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2020 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -143,24 +143,22 @@ #include "env_extr.h" #include "sbr_dec.h" #include "env_dec.h" -#include "sbr_crc.h" +#include "FDK_crc.h" #include "sbr_ram.h" #include "sbr_rom.h" #include "lpp_tran.h" #include "transcendent.h" -#include "FDK_crc.h" - #include "sbrdec_drc.h" #include "psbitdec.h" /* Decoder library info */ #define SBRDECODER_LIB_VL0 3 -#define SBRDECODER_LIB_VL1 0 +#define SBRDECODER_LIB_VL1 1 #define SBRDECODER_LIB_VL2 0 #define SBRDECODER_LIB_TITLE "SBR Decoder" -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO #define SBRDECODER_LIB_BUILD_DATE "" #define SBRDECODER_LIB_BUILD_TIME "" #else @@ -619,10 +617,6 @@ self->numSbrChannels -= self->pSbrElement[elementIndex]->nChannels; } - /* Save element ID for sanity checks and to have a fallback for concealment. - */ - self->pSbrElement[elementIndex]->elementID = elementID; - /* Determine amount of channels for this element */ switch (elementID) { case ID_NONE: @@ -655,12 +649,16 @@ } /* Sanity check to avoid memory leaks */ - if (elChannels < self->pSbrElement[elementIndex]->nChannels) { + if (elChannels < self->pSbrElement[elementIndex]->nChannels || + (self->numSbrChannels + elChannels) > (8) + (1)) { self->numSbrChannels += self->pSbrElement[elementIndex]->nChannels; sbrError = SBRDEC_PARSE_ERROR; goto bail; } + /* Save element ID for sanity checks and to have a fallback for concealment. + */ + self->pSbrElement[elementIndex]->elementID = elementID; self->pSbrElement[elementIndex]->nChannels = elChannels; for (ch = 0; ch < elChannels; ch++) { @@ -871,11 +869,10 @@ if (sbrError == SBRDEC_OK) { hSbrHeader->syncState = SBR_HEADER; hSbrHeader->status |= SBRDEC_HDR_STAT_UPDATE; + } else { + hSbrHeader->syncState = SBR_NOT_INITIALIZED; + hSbrHeader->status = HEADER_ERROR; } - /* else { - Since we already have overwritten the old SBR header the only way out - is UPSAMPLING! This will be prepared in the next step. - } */ } } } @@ -1135,18 +1132,22 @@ SBR_HEADER_STATUS headerStatus = HEADER_NOT_PRESENT; INT startPos = FDKgetValidBits(hBs); - INT CRCLen = 0; + FDK_CRCINFO crcInfo; + INT crcReg = 0; + USHORT sbrCrc = 0; + UINT crcPoly; + UINT crcStartValue = 0; + UINT crcLen; + HANDLE_FDK_BITSTREAM hBsOriginal = hBs; FDK_BITSTREAM bsBwd; - FDK_CRCINFO crcInfo; - INT crcReg = 0; - USHORT drmSbrCrc = 0; const int fGlobalIndependencyFlag = acFlags & AC_INDEP; const int bs_pvc = acElFlags[elementIndex] & AC_EL_USAC_PVC; const int bs_interTes = acElFlags[elementIndex] & AC_EL_USAC_ITES; int stereo; int fDoDecodeSbrData = 1; + int alignBits = 0; int lastSlot, lastHdrSlot = 0, thisHdrSlot = 0; @@ -1278,27 +1279,23 @@ if (fDoDecodeSbrData) { if (crcFlag) { switch (self->coreCodec) { - case AOT_ER_AAC_ELD: - FDKpushFor(hBs, 10); - /* check sbrcrc later: we don't know the payload length now */ - break; case AOT_DRM_AAC: case AOT_DRM_SURROUND: - drmSbrCrc = (USHORT)FDKreadBits(hBs, 8); - /* Setup CRC decoder */ - FDKcrcInit(&crcInfo, 0x001d, 0xFFFF, 8); - /* Start CRC region */ - crcReg = FDKcrcStartReg(&crcInfo, hBs, 0); + crcPoly = 0x001d; + crcLen = 8; + crcStartValue = 0x000000ff; break; default: - CRCLen = bsPayLen - 10; /* change: 0 => i */ - if (CRCLen < 0) { - fDoDecodeSbrData = 0; - } else { - fDoDecodeSbrData = SbrCrcCheck(hBs, CRCLen); - } + crcPoly = 0x0633; + crcLen = 10; + crcStartValue = 0x00000000; break; } + sbrCrc = (USHORT)FDKreadBits(hBs, crcLen); + /* Setup CRC decoder */ + FDKcrcInit(&crcInfo, crcPoly, crcStartValue, crcLen); + /* Start CRC region */ + crcReg = FDKcrcStartReg(&crcInfo, hBs, 0); } } /* if (fDoDecodeSbrData) */ @@ -1451,35 +1448,6 @@ valBits = (INT)FDKgetValidBits(hBs); } - if (crcFlag) { - switch (self->coreCodec) { - case AOT_ER_AAC_ELD: { - /* late crc check for eld */ - INT payloadbits = - (INT)startPos - (INT)FDKgetValidBits(hBs) - startPos; - INT crcLen = payloadbits - 10; - FDKpushBack(hBs, payloadbits); - fDoDecodeSbrData = SbrCrcCheck(hBs, crcLen); - FDKpushFor(hBs, crcLen); - } break; - case AOT_DRM_AAC: - case AOT_DRM_SURROUND: - /* End CRC region */ - FDKcrcEndReg(&crcInfo, hBs, crcReg); - /* Check CRC */ - if ((FDKcrcGetCRC(&crcInfo) ^ 0xFF) != drmSbrCrc) { - fDoDecodeSbrData = 0; - if (headerStatus != HEADER_NOT_PRESENT) { - headerStatus = HEADER_ERROR; - hSbrHeader->syncState = SBR_NOT_INITIALIZED; - } - } - break; - default: - break; - } - } - /* sanity check of remaining bits */ if (valBits < 0) { fDoDecodeSbrData = 0; @@ -1490,7 +1458,7 @@ case AOT_AAC_LC: { /* This sanity check is only meaningful with General Audio * bitstreams */ - int alignBits = valBits & 0x7; + alignBits = valBits & 0x7; if (valBits > alignBits) { fDoDecodeSbrData = 0; @@ -1509,6 +1477,20 @@ errorStatus = SBRDEC_PARSE_ERROR; } + if (crcFlag && (hSbrHeader->syncState >= SBR_HEADER) && fDoDecodeSbrData) { + FDKpushFor(hBs, alignBits); + FDKcrcEndReg(&crcInfo, hBs, crcReg); /* End CRC region */ + FDKpushBack(hBs, alignBits); + /* Check CRC */ + if ((FDKcrcGetCRC(&crcInfo) ^ crcStartValue) != sbrCrc) { + fDoDecodeSbrData = 0; + if (headerStatus != HEADER_NOT_PRESENT) { + headerStatus = HEADER_ERROR; + hSbrHeader->syncState = SBR_NOT_INITIALIZED; + } + } + } + if (!fDoDecodeSbrData) { /* Set error flag for this slot to trigger concealment */ setFrameErrorFlag(self->pSbrElement[elementIndex], FRAME_ERROR); @@ -1588,10 +1570,10 @@ * \return SBRDEC_OK if successfull, else error code */ static SBR_ERROR sbrDecoder_DecodeElement( - HANDLE_SBRDECODER self, QDOM_PCM *input, INT_PCM *timeData, - const int timeDataSize, const FDK_channelMapDescr *const mapDescr, - const int mapIdx, int channelIndex, const int elementIndex, - const int numInChannels, int *numOutChannels, const int psPossible) { + HANDLE_SBRDECODER self, LONG *input, LONG *timeData, const int timeDataSize, + const FDK_channelMapDescr *const mapDescr, const int mapIdx, + int channelIndex, const int elementIndex, const int numInChannels, + int *numOutChannels, const int psPossible) { SBR_DECODER_ELEMENT *hSbrElement = self->pSbrElement[elementIndex]; HANDLE_SBR_CHANNEL *pSbrChannel = self->pSbrElement[elementIndex]->pSbrChannel; @@ -1761,7 +1743,7 @@ timeData + offset1, strideOut, hSbrHeader, hFrameDataLeft, &pSbrChannel[0]->prevFrameData, (hSbrHeader->syncState == SBR_ACTIVE), h_ps_d, self->flags, - codecFrameSize); + codecFrameSize, self->sbrInDataHeadroom); if (stereo) { /* Process right channel */ @@ -1769,7 +1751,7 @@ timeData + offset1, NULL, NULL, strideOut, hSbrHeader, hFrameDataRight, &pSbrChannel[1]->prevFrameData, (hSbrHeader->syncState == SBR_ACTIVE), NULL, self->flags, - codecFrameSize); + codecFrameSize, self->sbrInDataHeadroom); } C_ALLOC_SCRATCH_END(pPsScratch, struct PS_DEC_COEFFICIENTS, 1) @@ -1789,14 +1771,14 @@ int copyFrameSize = codecFrameSize * self->pQmfDomain->QmfDomainOut->fb.no_channels; copyFrameSize /= self->pQmfDomain->QmfDomainIn->fb.no_channels; - INT_PCM *ptr; + LONG *ptr; INT i; FDK_ASSERT(strideOut == 2); ptr = timeData; for (i = copyFrameSize >> 1; i--;) { - INT_PCM tmp; /* This temporal variable is required because some - compilers can't do *ptr++ = *ptr++ correctly. */ + LONG tmp; /* This temporal variable is required because some compilers + can't do *ptr++ = *ptr++ correctly. */ tmp = *ptr++; *ptr++ = tmp; tmp = *ptr++; @@ -1809,12 +1791,13 @@ return errorStatus; } -SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, INT_PCM *input, - INT_PCM *timeData, const int timeDataSize, - int *numChannels, int *sampleRate, +SBR_ERROR sbrDecoder_Apply(HANDLE_SBRDECODER self, LONG *input, LONG *timeData, + const int timeDataSize, int *numChannels, + int *sampleRate, const FDK_channelMapDescr *const mapDescr, const int mapIdx, const int coreDecodedOk, - UCHAR *psDecoded) { + UCHAR *psDecoded, const INT inDataHeadroom, + INT *outDataHeadroom) { SBR_ERROR errorStatus = SBRDEC_OK; int psPossible; @@ -1851,6 +1834,9 @@ psPossible = 0; } + self->sbrInDataHeadroom = inDataHeadroom; + *outDataHeadroom = (INT)(8); + /* Make sure that even if no SBR data was found/parsed *psDecoded is returned * 1 if psPossible was 0. */ if (psPossible == 0) { diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_ram.cpp fdk-aac-2.0.2/libSBRdec/src/sbr_ram.cpp --- fdk-aac-2.0.1/libSBRdec/src/sbr_ram.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_ram.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -109,9 +109,6 @@ #include "sbr_ram.h" -#define WORKBUFFER1_TAG 2 -#define WORKBUFFER2_TAG 3 - /*! \name StaticSbrData diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_ram.h fdk-aac-2.0.2/libSBRdec/src/sbr_ram.h --- fdk-aac-2.0.1/libSBRdec/src/sbr_ram.h 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_ram.h 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -170,6 +170,9 @@ flushed consecutively. */ UINT flags; + + INT sbrInDataHeadroom; /* Headroom of the SBR input time signal to prevent + clipping */ }; H_ALLOC_MEM(Ram_SbrDecElement, SBR_DECODER_ELEMENT) diff -Nru fdk-aac-2.0.1/libSBRdec/src/sbr_rom.cpp fdk-aac-2.0.2/libSBRdec/src/sbr_rom.cpp --- fdk-aac-2.0.1/libSBRdec/src/sbr_rom.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRdec/src/sbr_rom.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -1,7 +1,7 @@ /* ----------------------------------------------------------------------------- Software License for The Fraunhofer FDK AAC Codec Library for Android -© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten +© Copyright 1995 - 2019 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. All rights reserved. 1. INTRODUCTION @@ -241,1030 +241,518 @@ random numbers. */ const FIXP_SGL FDK_sbrDecoder_sbr_randomPhase[SBR_NF_NO_RANDOM_VAL][2] = { - {FL2FXCONST_SGL(-0.99948153278296f / 8.0), - FL2FXCONST_SGL(-0.59483417516607f / 8.0)}, - {FL2FXCONST_SGL(0.97113454393991f / 8.0), - FL2FXCONST_SGL(-0.67528515225647f / 8.0)}, - {FL2FXCONST_SGL(0.14130051758487f / 8.0), - FL2FXCONST_SGL(-0.95090983575689f / 8.0)}, - {FL2FXCONST_SGL(-0.47005496701697f / 8.0), - FL2FXCONST_SGL(-0.37340549728647f / 8.0)}, - {FL2FXCONST_SGL(0.80705063769351f / 8.0), - FL2FXCONST_SGL(0.29653668284408f / 8.0)}, - {FL2FXCONST_SGL(-0.38981478896926f / 8.0), - FL2FXCONST_SGL(0.89572605717087f / 8.0)}, - {FL2FXCONST_SGL(-0.01053049862020f / 8.0), - FL2FXCONST_SGL(-0.66959058036166f / 8.0)}, - {FL2FXCONST_SGL(-0.91266367957293f / 8.0), - FL2FXCONST_SGL(-0.11522938140034f / 8.0)}, - {FL2FXCONST_SGL(0.54840422910309f / 8.0), - FL2FXCONST_SGL(0.75221367176302f / 8.0)}, - {FL2FXCONST_SGL(0.40009252867955f / 8.0), - FL2FXCONST_SGL(-0.98929400334421f / 8.0)}, - {FL2FXCONST_SGL(-0.99867974711855f / 8.0), - FL2FXCONST_SGL(-0.88147068645358f / 8.0)}, - {FL2FXCONST_SGL(-0.95531076805040f / 8.0), - FL2FXCONST_SGL(0.90908757154593f / 8.0)}, - {FL2FXCONST_SGL(-0.45725933317144f / 8.0), - FL2FXCONST_SGL(-0.56716323646760f / 8.0)}, - {FL2FXCONST_SGL(-0.72929675029275f / 8.0), - FL2FXCONST_SGL(-0.98008272727324f / 8.0)}, - {FL2FXCONST_SGL(0.75622801399036f / 8.0), - FL2FXCONST_SGL(0.20950329995549f / 8.0)}, - {FL2FXCONST_SGL(0.07069442601050f / 8.0), - FL2FXCONST_SGL(-0.78247898470706f / 8.0)}, - {FL2FXCONST_SGL(0.74496252926055f / 8.0), - FL2FXCONST_SGL(-0.91169004445807f / 8.0)}, - {FL2FXCONST_SGL(-0.96440182703856f / 8.0), - FL2FXCONST_SGL(-0.94739918296622f / 8.0)}, - {FL2FXCONST_SGL(0.30424629369539f / 8.0), - FL2FXCONST_SGL(-0.49438267012479f / 8.0)}, - {FL2FXCONST_SGL(0.66565033746925f / 8.0), - FL2FXCONST_SGL(0.64652935542491f / 8.0)}, - {FL2FXCONST_SGL(0.91697008020594f / 8.0), - FL2FXCONST_SGL(0.17514097332009f / 8.0)}, - {FL2FXCONST_SGL(-0.70774918760427f / 8.0), - FL2FXCONST_SGL(0.52548653416543f / 8.0)}, - {FL2FXCONST_SGL(-0.70051415345560f / 8.0), - FL2FXCONST_SGL(-0.45340028808763f / 8.0)}, - {FL2FXCONST_SGL(-0.99496513054797f / 8.0), - FL2FXCONST_SGL(-0.90071908066973f / 8.0)}, - {FL2FXCONST_SGL(0.98164490790123f / 8.0), - FL2FXCONST_SGL(-0.77463155528697f / 8.0)}, - {FL2FXCONST_SGL(-0.54671580548181f / 8.0), - FL2FXCONST_SGL(-0.02570928536004f / 8.0)}, - {FL2FXCONST_SGL(-0.01689629065389f / 8.0), - FL2FXCONST_SGL(0.00287506445732f / 8.0)}, - {FL2FXCONST_SGL(-0.86110349531986f / 8.0), - FL2FXCONST_SGL(0.42548583726477f / 8.0)}, - {FL2FXCONST_SGL(-0.98892980586032f / 8.0), - FL2FXCONST_SGL(-0.87881132267556f / 8.0)}, - {FL2FXCONST_SGL(0.51756627678691f / 8.0), - FL2FXCONST_SGL(0.66926784710139f / 8.0)}, - {FL2FXCONST_SGL(-0.99635026409640f / 8.0), - FL2FXCONST_SGL(-0.58107730574765f / 8.0)}, - {FL2FXCONST_SGL(-0.99969370862163f / 8.0), - FL2FXCONST_SGL(0.98369989360250f / 8.0)}, - {FL2FXCONST_SGL(0.55266258627194f / 8.0), - FL2FXCONST_SGL(0.59449057465591f / 8.0)}, - {FL2FXCONST_SGL(0.34581177741673f / 8.0), - FL2FXCONST_SGL(0.94879421061866f / 8.0)}, - {FL2FXCONST_SGL(0.62664209577999f / 8.0), - FL2FXCONST_SGL(-0.74402970906471f / 8.0)}, - {FL2FXCONST_SGL(-0.77149701404973f / 8.0), - FL2FXCONST_SGL(-0.33883658042801f / 8.0)}, - {FL2FXCONST_SGL(-0.91592244254432f / 8.0), - FL2FXCONST_SGL(0.03687901376713f / 8.0)}, - {FL2FXCONST_SGL(-0.76285492357887f / 8.0), - FL2FXCONST_SGL(-0.91371867919124f / 8.0)}, - {FL2FXCONST_SGL(0.79788337195331f / 8.0), - FL2FXCONST_SGL(-0.93180971199849f / 8.0)}, - {FL2FXCONST_SGL(0.54473080610200f / 8.0), - FL2FXCONST_SGL(-0.11919206037186f / 8.0)}, - {FL2FXCONST_SGL(-0.85639281671058f / 8.0), - FL2FXCONST_SGL(0.42429854760451f / 8.0)}, - {FL2FXCONST_SGL(-0.92882402971423f / 8.0), - FL2FXCONST_SGL(0.27871809078609f / 8.0)}, - {FL2FXCONST_SGL(-0.11708371046774f / 8.0), - FL2FXCONST_SGL(-0.99800843444966f / 8.0)}, - {FL2FXCONST_SGL(0.21356749817493f / 8.0), - FL2FXCONST_SGL(-0.90716295627033f / 8.0)}, - {FL2FXCONST_SGL(-0.76191692573909f / 8.0), - FL2FXCONST_SGL(0.99768118356265f / 8.0)}, - {FL2FXCONST_SGL(0.98111043100884f / 8.0), - FL2FXCONST_SGL(-0.95854459734407f / 8.0)}, - {FL2FXCONST_SGL(-0.85913269895572f / 8.0), - FL2FXCONST_SGL(0.95766566168880f / 8.0)}, - {FL2FXCONST_SGL(-0.93307242253692f / 8.0), - FL2FXCONST_SGL(0.49431757696466f / 8.0)}, - {FL2FXCONST_SGL(0.30485754879632f / 8.0), - FL2FXCONST_SGL(-0.70540034357529f / 8.0)}, - {FL2FXCONST_SGL(0.85289650925190f / 8.0), - FL2FXCONST_SGL(0.46766131791044f / 8.0)}, - {FL2FXCONST_SGL(0.91328082618125f / 8.0), - FL2FXCONST_SGL(-0.99839597361769f / 8.0)}, - {FL2FXCONST_SGL(-0.05890199924154f / 8.0), - FL2FXCONST_SGL(0.70741827819497f / 8.0)}, - {FL2FXCONST_SGL(0.28398686150148f / 8.0), - FL2FXCONST_SGL(0.34633555702188f / 8.0)}, - {FL2FXCONST_SGL(0.95258164539612f / 8.0), - FL2FXCONST_SGL(-0.54893416026939f / 8.0)}, - {FL2FXCONST_SGL(-0.78566324168507f / 8.0), - FL2FXCONST_SGL(-0.75568541079691f / 8.0)}, - {FL2FXCONST_SGL(-0.95789495447877f / 8.0), - FL2FXCONST_SGL(-0.20423194696966f / 8.0)}, - {FL2FXCONST_SGL(0.82411158711197f / 8.0), - FL2FXCONST_SGL(0.96654618432562f / 8.0)}, - {FL2FXCONST_SGL(-0.65185446735885f / 8.0), - FL2FXCONST_SGL(-0.88734990773289f / 8.0)}, - {FL2FXCONST_SGL(-0.93643603134666f / 8.0), - FL2FXCONST_SGL(0.99870790442385f / 8.0)}, - {FL2FXCONST_SGL(0.91427159529618f / 8.0), - FL2FXCONST_SGL(-0.98290505544444f / 8.0)}, - {FL2FXCONST_SGL(-0.70395684036886f / 8.0), - FL2FXCONST_SGL(0.58796798221039f / 8.0)}, - {FL2FXCONST_SGL(0.00563771969365f / 8.0), - FL2FXCONST_SGL(0.61768196727244f / 8.0)}, - {FL2FXCONST_SGL(0.89065051931895f / 8.0), - FL2FXCONST_SGL(0.52783352697585f / 8.0)}, - {FL2FXCONST_SGL(-0.68683707712762f / 8.0), - FL2FXCONST_SGL(0.80806944710339f / 8.0)}, - {FL2FXCONST_SGL(0.72165342518718f / 8.0), - FL2FXCONST_SGL(-0.69259857349564f / 8.0)}, - {FL2FXCONST_SGL(-0.62928247730667f / 8.0), - FL2FXCONST_SGL(0.13627037407335f / 8.0)}, - {FL2FXCONST_SGL(0.29938434065514f / 8.0), - FL2FXCONST_SGL(-0.46051329682246f / 8.0)}, - {FL2FXCONST_SGL(-0.91781958879280f / 8.0), - FL2FXCONST_SGL(-0.74012716684186f / 8.0)}, - {FL2FXCONST_SGL(0.99298717043688f / 8.0), - FL2FXCONST_SGL(0.40816610075661f / 8.0)}, - {FL2FXCONST_SGL(0.82368298622748f / 8.0), - FL2FXCONST_SGL(-0.74036047190173f / 8.0)}, - {FL2FXCONST_SGL(-0.98512833386833f / 8.0), - FL2FXCONST_SGL(-0.99972330709594f / 8.0)}, - {FL2FXCONST_SGL(-0.95915368242257f / 8.0), - FL2FXCONST_SGL(-0.99237800466040f / 8.0)}, - {FL2FXCONST_SGL(-0.21411126572790f / 8.0), - FL2FXCONST_SGL(-0.93424819052545f / 8.0)}, - {FL2FXCONST_SGL(-0.68821476106884f / 8.0), - FL2FXCONST_SGL(-0.26892306315457f / 8.0)}, - {FL2FXCONST_SGL(0.91851997982317f / 8.0), - FL2FXCONST_SGL(0.09358228901785f / 8.0)}, - {FL2FXCONST_SGL(-0.96062769559127f / 8.0), - FL2FXCONST_SGL(0.36099095133739f / 8.0)}, - {FL2FXCONST_SGL(0.51646184922287f / 8.0), - FL2FXCONST_SGL(-0.71373332873917f / 8.0)}, - {FL2FXCONST_SGL(0.61130721139669f / 8.0), - FL2FXCONST_SGL(0.46950141175917f / 8.0)}, - {FL2FXCONST_SGL(0.47336129371299f / 8.0), - FL2FXCONST_SGL(-0.27333178296162f / 8.0)}, - {FL2FXCONST_SGL(0.90998308703519f / 8.0), - FL2FXCONST_SGL(0.96715662938132f / 8.0)}, - {FL2FXCONST_SGL(0.44844799194357f / 8.0), - FL2FXCONST_SGL(0.99211574628306f / 8.0)}, - {FL2FXCONST_SGL(0.66614891079092f / 8.0), - FL2FXCONST_SGL(0.96590176169121f / 8.0)}, - {FL2FXCONST_SGL(0.74922239129237f / 8.0), - FL2FXCONST_SGL(-0.89879858826087f / 8.0)}, - {FL2FXCONST_SGL(-0.99571588506485f / 8.0), - FL2FXCONST_SGL(0.52785521494349f / 8.0)}, - {FL2FXCONST_SGL(0.97401082477563f / 8.0), - FL2FXCONST_SGL(-0.16855870075190f / 8.0)}, - {FL2FXCONST_SGL(0.72683747733879f / 8.0), - FL2FXCONST_SGL(-0.48060774432251f / 8.0)}, - {FL2FXCONST_SGL(0.95432193457128f / 8.0), - FL2FXCONST_SGL(0.68849603408441f / 8.0)}, - {FL2FXCONST_SGL(-0.72962208425191f / 8.0), - FL2FXCONST_SGL(-0.76608443420917f / 8.0)}, - {FL2FXCONST_SGL(-0.85359479233537f / 8.0), - FL2FXCONST_SGL(0.88738125901579f / 8.0)}, - {FL2FXCONST_SGL(-0.81412430338535f / 8.0), - FL2FXCONST_SGL(-0.97480768049637f / 8.0)}, - {FL2FXCONST_SGL(-0.87930772356786f / 8.0), - FL2FXCONST_SGL(0.74748307690436f / 8.0)}, - {FL2FXCONST_SGL(-0.71573331064977f / 8.0), - FL2FXCONST_SGL(-0.98570608178923f / 8.0)}, - {FL2FXCONST_SGL(0.83524300028228f / 8.0), - FL2FXCONST_SGL(0.83702537075163f / 8.0)}, - {FL2FXCONST_SGL(-0.48086065601423f / 8.0), - FL2FXCONST_SGL(-0.98848504923531f / 8.0)}, - {FL2FXCONST_SGL(0.97139128574778f / 8.0), - FL2FXCONST_SGL(0.80093621198236f / 8.0)}, - {FL2FXCONST_SGL(0.51992825347895f / 8.0), - FL2FXCONST_SGL(0.80247631400510f / 8.0)}, - {FL2FXCONST_SGL(-0.00848591195325f / 8.0), - FL2FXCONST_SGL(-0.76670128000486f / 8.0)}, - {FL2FXCONST_SGL(-0.70294374303036f / 8.0), - FL2FXCONST_SGL(0.55359910445577f / 8.0)}, - {FL2FXCONST_SGL(-0.95894428168140f / 8.0), - FL2FXCONST_SGL(-0.43265504344783f / 8.0)}, - {FL2FXCONST_SGL(0.97079252950321f / 8.0), - FL2FXCONST_SGL(0.09325857238682f / 8.0)}, - {FL2FXCONST_SGL(-0.92404293670797f / 8.0), - FL2FXCONST_SGL(0.85507704027855f / 8.0)}, - {FL2FXCONST_SGL(-0.69506469500450f / 8.0), - FL2FXCONST_SGL(0.98633412625459f / 8.0)}, - {FL2FXCONST_SGL(0.26559203620024f / 8.0), - FL2FXCONST_SGL(0.73314307966524f / 8.0)}, - {FL2FXCONST_SGL(0.28038443336943f / 8.0), - FL2FXCONST_SGL(0.14537913654427f / 8.0)}, - {FL2FXCONST_SGL(-0.74138124825523f / 8.0), - FL2FXCONST_SGL(0.99310339807762f / 8.0)}, - {FL2FXCONST_SGL(-0.01752795995444f / 8.0), - FL2FXCONST_SGL(-0.82616635284178f / 8.0)}, - {FL2FXCONST_SGL(-0.55126773094930f / 8.0), - FL2FXCONST_SGL(-0.98898543862153f / 8.0)}, - {FL2FXCONST_SGL(0.97960898850996f / 8.0), - FL2FXCONST_SGL(-0.94021446752851f / 8.0)}, - {FL2FXCONST_SGL(-0.99196309146936f / 8.0), - FL2FXCONST_SGL(0.67019017358456f / 8.0)}, - {FL2FXCONST_SGL(-0.67684928085260f / 8.0), - FL2FXCONST_SGL(0.12631491649378f / 8.0)}, - {FL2FXCONST_SGL(0.09140039465500f / 8.0), - FL2FXCONST_SGL(-0.20537731453108f / 8.0)}, - {FL2FXCONST_SGL(-0.71658965751996f / 8.0), - FL2FXCONST_SGL(-0.97788200391224f / 8.0)}, - {FL2FXCONST_SGL(0.81014640078925f / 8.0), - FL2FXCONST_SGL(0.53722648362443f / 8.0)}, - {FL2FXCONST_SGL(0.40616991671205f / 8.0), - FL2FXCONST_SGL(-0.26469008598449f / 8.0)}, - {FL2FXCONST_SGL(-0.67680188682972f / 8.0), - FL2FXCONST_SGL(0.94502052337695f / 8.0)}, - {FL2FXCONST_SGL(0.86849774348749f / 8.0), - FL2FXCONST_SGL(-0.18333598647899f / 8.0)}, - {FL2FXCONST_SGL(-0.99500381284851f / 8.0), - FL2FXCONST_SGL(-0.02634122068550f / 8.0)}, - {FL2FXCONST_SGL(0.84329189340667f / 8.0), - FL2FXCONST_SGL(0.10406957462213f / 8.0)}, - {FL2FXCONST_SGL(-0.09215968531446f / 8.0), - FL2FXCONST_SGL(0.69540012101253f / 8.0)}, - {FL2FXCONST_SGL(0.99956173327206f / 8.0), - FL2FXCONST_SGL(-0.12358542001404f / 8.0)}, - {FL2FXCONST_SGL(-0.79732779473535f / 8.0), - FL2FXCONST_SGL(-0.91582524736159f / 8.0)}, - {FL2FXCONST_SGL(0.96349973642406f / 8.0), - FL2FXCONST_SGL(0.96640458041000f / 8.0)}, - {FL2FXCONST_SGL(-0.79942778496547f / 8.0), - FL2FXCONST_SGL(0.64323902822857f / 8.0)}, - {FL2FXCONST_SGL(-0.11566039853896f / 8.0), - FL2FXCONST_SGL(0.28587846253726f / 8.0)}, - {FL2FXCONST_SGL(-0.39922954514662f / 8.0), - FL2FXCONST_SGL(0.94129601616966f / 8.0)}, - {FL2FXCONST_SGL(0.99089197565987f / 8.0), - FL2FXCONST_SGL(-0.92062625581587f / 8.0)}, - {FL2FXCONST_SGL(0.28631285179909f / 8.0), - FL2FXCONST_SGL(-0.91035047143603f / 8.0)}, - {FL2FXCONST_SGL(-0.83302725605608f / 8.0), - FL2FXCONST_SGL(-0.67330410892084f / 8.0)}, - {FL2FXCONST_SGL(0.95404443402072f / 8.0), - FL2FXCONST_SGL(0.49162765398743f / 8.0)}, - {FL2FXCONST_SGL(-0.06449863579434f / 8.0), - FL2FXCONST_SGL(0.03250560813135f / 8.0)}, - {FL2FXCONST_SGL(-0.99575054486311f / 8.0), - FL2FXCONST_SGL(0.42389784469507f / 8.0)}, - {FL2FXCONST_SGL(-0.65501142790847f / 8.0), - FL2FXCONST_SGL(0.82546114655624f / 8.0)}, - {FL2FXCONST_SGL(-0.81254441908887f / 8.0), - FL2FXCONST_SGL(-0.51627234660629f / 8.0)}, - {FL2FXCONST_SGL(-0.99646369485481f / 8.0), - FL2FXCONST_SGL(0.84490533520752f / 8.0)}, - {FL2FXCONST_SGL(0.00287840603348f / 8.0), - FL2FXCONST_SGL(0.64768261158166f / 8.0)}, - {FL2FXCONST_SGL(0.70176989408455f / 8.0), - FL2FXCONST_SGL(-0.20453028573322f / 8.0)}, - {FL2FXCONST_SGL(0.96361882270190f / 8.0), - FL2FXCONST_SGL(0.40706967140989f / 8.0)}, - {FL2FXCONST_SGL(-0.68883758192426f / 8.0), - FL2FXCONST_SGL(0.91338958840772f / 8.0)}, - {FL2FXCONST_SGL(-0.34875585502238f / 8.0), - FL2FXCONST_SGL(0.71472290693300f / 8.0)}, - {FL2FXCONST_SGL(0.91980081243087f / 8.0), - FL2FXCONST_SGL(0.66507455644919f / 8.0)}, - {FL2FXCONST_SGL(-0.99009048343881f / 8.0), - FL2FXCONST_SGL(0.85868021604848f / 8.0)}, - {FL2FXCONST_SGL(0.68865791458395f / 8.0), - FL2FXCONST_SGL(0.55660316809678f / 8.0)}, - {FL2FXCONST_SGL(-0.99484402129368f / 8.0), - FL2FXCONST_SGL(-0.20052559254934f / 8.0)}, - {FL2FXCONST_SGL(0.94214511408023f / 8.0), - FL2FXCONST_SGL(-0.99696425367461f / 8.0)}, - {FL2FXCONST_SGL(-0.67414626793544f / 8.0), - FL2FXCONST_SGL(0.49548221180078f / 8.0)}, - {FL2FXCONST_SGL(-0.47339353684664f / 8.0), - FL2FXCONST_SGL(-0.85904328834047f / 8.0)}, - {FL2FXCONST_SGL(0.14323651387360f / 8.0), - FL2FXCONST_SGL(-0.94145598222488f / 8.0)}, - {FL2FXCONST_SGL(-0.29268293575672f / 8.0), - FL2FXCONST_SGL(0.05759224927952f / 8.0)}, - {FL2FXCONST_SGL(0.43793861458754f / 8.0), - FL2FXCONST_SGL(-0.78904969892724f / 8.0)}, - {FL2FXCONST_SGL(-0.36345126374441f / 8.0), - FL2FXCONST_SGL(0.64874435357162f / 8.0)}, - {FL2FXCONST_SGL(-0.08750604656825f / 8.0), - FL2FXCONST_SGL(0.97686944362527f / 8.0)}, - {FL2FXCONST_SGL(-0.96495267812511f / 8.0), - FL2FXCONST_SGL(-0.53960305946511f / 8.0)}, - {FL2FXCONST_SGL(0.55526940659947f / 8.0), - FL2FXCONST_SGL(0.78891523734774f / 8.0)}, - {FL2FXCONST_SGL(0.73538215752630f / 8.0), - FL2FXCONST_SGL(0.96452072373404f / 8.0)}, - {FL2FXCONST_SGL(-0.30889773919437f / 8.0), - FL2FXCONST_SGL(-0.80664389776860f / 8.0)}, - {FL2FXCONST_SGL(0.03574995626194f / 8.0), - FL2FXCONST_SGL(-0.97325616900959f / 8.0)}, - {FL2FXCONST_SGL(0.98720684660488f / 8.0), - FL2FXCONST_SGL(0.48409133691962f / 8.0)}, - {FL2FXCONST_SGL(-0.81689296271203f / 8.0), - FL2FXCONST_SGL(-0.90827703628298f / 8.0)}, - {FL2FXCONST_SGL(0.67866860118215f / 8.0), - FL2FXCONST_SGL(0.81284503870856f / 8.0)}, - {FL2FXCONST_SGL(-0.15808569732583f / 8.0), - FL2FXCONST_SGL(0.85279555024382f / 8.0)}, - {FL2FXCONST_SGL(0.80723395114371f / 8.0), - FL2FXCONST_SGL(-0.24717418514605f / 8.0)}, - {FL2FXCONST_SGL(0.47788757329038f / 8.0), - FL2FXCONST_SGL(-0.46333147839295f / 8.0)}, - {FL2FXCONST_SGL(0.96367554763201f / 8.0), - FL2FXCONST_SGL(0.38486749303242f / 8.0)}, - {FL2FXCONST_SGL(-0.99143875716818f / 8.0), - FL2FXCONST_SGL(-0.24945277239809f / 8.0)}, - {FL2FXCONST_SGL(0.83081876925833f / 8.0), - FL2FXCONST_SGL(-0.94780851414763f / 8.0)}, - {FL2FXCONST_SGL(-0.58753191905341f / 8.0), - FL2FXCONST_SGL(0.01290772389163f / 8.0)}, - {FL2FXCONST_SGL(0.95538108220960f / 8.0), - FL2FXCONST_SGL(-0.85557052096538f / 8.0)}, - {FL2FXCONST_SGL(-0.96490920476211f / 8.0), - FL2FXCONST_SGL(-0.64020970923102f / 8.0)}, - {FL2FXCONST_SGL(-0.97327101028521f / 8.0), - FL2FXCONST_SGL(0.12378128133110f / 8.0)}, - {FL2FXCONST_SGL(0.91400366022124f / 8.0), - FL2FXCONST_SGL(0.57972471346930f / 8.0)}, - {FL2FXCONST_SGL(-0.99925837363824f / 8.0), - FL2FXCONST_SGL(0.71084847864067f / 8.0)}, - {FL2FXCONST_SGL(-0.86875903507313f / 8.0), - FL2FXCONST_SGL(-0.20291699203564f / 8.0)}, - {FL2FXCONST_SGL(-0.26240034795124f / 8.0), - FL2FXCONST_SGL(-0.68264554369108f / 8.0)}, - {FL2FXCONST_SGL(-0.24664412953388f / 8.0), - FL2FXCONST_SGL(-0.87642273115183f / 8.0)}, - {FL2FXCONST_SGL(0.02416275806869f / 8.0), - FL2FXCONST_SGL(0.27192914288905f / 8.0)}, - {FL2FXCONST_SGL(0.82068619590515f / 8.0), - FL2FXCONST_SGL(-0.85087787994476f / 8.0)}, - {FL2FXCONST_SGL(0.88547373760759f / 8.0), - FL2FXCONST_SGL(-0.89636802901469f / 8.0)}, - {FL2FXCONST_SGL(-0.18173078152226f / 8.0), - FL2FXCONST_SGL(-0.26152145156800f / 8.0)}, - {FL2FXCONST_SGL(0.09355476558534f / 8.0), - FL2FXCONST_SGL(0.54845123045604f / 8.0)}, - {FL2FXCONST_SGL(-0.54668414224090f / 8.0), - FL2FXCONST_SGL(0.95980774020221f / 8.0)}, - {FL2FXCONST_SGL(0.37050990604091f / 8.0), - FL2FXCONST_SGL(-0.59910140383171f / 8.0)}, - {FL2FXCONST_SGL(-0.70373594262891f / 8.0), - FL2FXCONST_SGL(0.91227665827081f / 8.0)}, - {FL2FXCONST_SGL(-0.34600785879594f / 8.0), - FL2FXCONST_SGL(-0.99441426144200f / 8.0)}, - {FL2FXCONST_SGL(-0.68774481731008f / 8.0), - FL2FXCONST_SGL(-0.30238837956299f / 8.0)}, - {FL2FXCONST_SGL(-0.26843291251234f / 8.0), - FL2FXCONST_SGL(0.83115668004362f / 8.0)}, - {FL2FXCONST_SGL(0.49072334613242f / 8.0), - FL2FXCONST_SGL(-0.45359708737775f / 8.0)}, - {FL2FXCONST_SGL(0.38975993093975f / 8.0), - FL2FXCONST_SGL(0.95515358099121f / 8.0)}, - {FL2FXCONST_SGL(-0.97757125224150f / 8.0), - FL2FXCONST_SGL(0.05305894580606f / 8.0)}, - {FL2FXCONST_SGL(-0.17325552859616f / 8.0), - FL2FXCONST_SGL(-0.92770672250494f / 8.0)}, - {FL2FXCONST_SGL(0.99948035025744f / 8.0), - FL2FXCONST_SGL(0.58285545563426f / 8.0)}, - {FL2FXCONST_SGL(-0.64946246527458f / 8.0), - FL2FXCONST_SGL(0.68645507104960f / 8.0)}, - {FL2FXCONST_SGL(-0.12016920576437f / 8.0), - FL2FXCONST_SGL(-0.57147322153312f / 8.0)}, - {FL2FXCONST_SGL(-0.58947456517751f / 8.0), - FL2FXCONST_SGL(-0.34847132454388f / 8.0)}, - {FL2FXCONST_SGL(-0.41815140454465f / 8.0), - FL2FXCONST_SGL(0.16276422358861f / 8.0)}, - {FL2FXCONST_SGL(0.99885650204884f / 8.0), - FL2FXCONST_SGL(0.11136095490444f / 8.0)}, - {FL2FXCONST_SGL(-0.56649614128386f / 8.0), - FL2FXCONST_SGL(-0.90494866361587f / 8.0)}, - {FL2FXCONST_SGL(0.94138021032330f / 8.0), - FL2FXCONST_SGL(0.35281916733018f / 8.0)}, - {FL2FXCONST_SGL(-0.75725076534641f / 8.0), - FL2FXCONST_SGL(0.53650549640587f / 8.0)}, - {FL2FXCONST_SGL(0.20541973692630f / 8.0), - FL2FXCONST_SGL(-0.94435144369918f / 8.0)}, - {FL2FXCONST_SGL(0.99980371023351f / 8.0), - FL2FXCONST_SGL(0.79835913565599f / 8.0)}, - {FL2FXCONST_SGL(0.29078277605775f / 8.0), - FL2FXCONST_SGL(0.35393777921520f / 8.0)}, - {FL2FXCONST_SGL(-0.62858772103030f / 8.0), - FL2FXCONST_SGL(0.38765693387102f / 8.0)}, - {FL2FXCONST_SGL(0.43440904467688f / 8.0), - FL2FXCONST_SGL(-0.98546330463232f / 8.0)}, - {FL2FXCONST_SGL(-0.98298583762390f / 8.0), - FL2FXCONST_SGL(0.21021524625209f / 8.0)}, - {FL2FXCONST_SGL(0.19513029146934f / 8.0), - FL2FXCONST_SGL(-0.94239832251867f / 8.0)}, - {FL2FXCONST_SGL(-0.95476662400101f / 8.0), - FL2FXCONST_SGL(0.98364554179143f / 8.0)}, - {FL2FXCONST_SGL(0.93379635304810f / 8.0), - FL2FXCONST_SGL(-0.70881994583682f / 8.0)}, - {FL2FXCONST_SGL(-0.85235410573336f / 8.0), - FL2FXCONST_SGL(-0.08342347966410f / 8.0)}, - {FL2FXCONST_SGL(-0.86425093011245f / 8.0), - FL2FXCONST_SGL(-0.45795025029466f / 8.0)}, - {FL2FXCONST_SGL(0.38879779059045f / 8.0), - FL2FXCONST_SGL(0.97274429344593f / 8.0)}, - {FL2FXCONST_SGL(0.92045124735495f / 8.0), - FL2FXCONST_SGL(-0.62433652524220f / 8.0)}, - {FL2FXCONST_SGL(0.89162532251878f / 8.0), - FL2FXCONST_SGL(0.54950955570563f / 8.0)}, - {FL2FXCONST_SGL(-0.36834336949252f / 8.0), - FL2FXCONST_SGL(0.96458298020975f / 8.0)}, - {FL2FXCONST_SGL(0.93891760988045f / 8.0), - FL2FXCONST_SGL(-0.89968353740388f / 8.0)}, - {FL2FXCONST_SGL(0.99267657565094f / 8.0), - FL2FXCONST_SGL(-0.03757034316958f / 8.0)}, - {FL2FXCONST_SGL(-0.94063471614176f / 8.0), - FL2FXCONST_SGL(0.41332338538963f / 8.0)}, - {FL2FXCONST_SGL(0.99740224117019f / 8.0), - FL2FXCONST_SGL(-0.16830494996370f / 8.0)}, - {FL2FXCONST_SGL(-0.35899413170555f / 8.0), - FL2FXCONST_SGL(-0.46633226649613f / 8.0)}, - {FL2FXCONST_SGL(0.05237237274947f / 8.0), - FL2FXCONST_SGL(-0.25640361602661f / 8.0)}, - {FL2FXCONST_SGL(0.36703583957424f / 8.0), - FL2FXCONST_SGL(-0.38653265641875f / 8.0)}, - {FL2FXCONST_SGL(0.91653180367913f / 8.0), - FL2FXCONST_SGL(-0.30587628726597f / 8.0)}, - {FL2FXCONST_SGL(0.69000803499316f / 8.0), - FL2FXCONST_SGL(0.90952171386132f / 8.0)}, - {FL2FXCONST_SGL(-0.38658751133527f / 8.0), - FL2FXCONST_SGL(0.99501571208985f / 8.0)}, - {FL2FXCONST_SGL(-0.29250814029851f / 8.0), - FL2FXCONST_SGL(0.37444994344615f / 8.0)}, - {FL2FXCONST_SGL(-0.60182204677608f / 8.0), - FL2FXCONST_SGL(0.86779651036123f / 8.0)}, - {FL2FXCONST_SGL(-0.97418588163217f / 8.0), - FL2FXCONST_SGL(0.96468523666475f / 8.0)}, - {FL2FXCONST_SGL(0.88461574003963f / 8.0), - FL2FXCONST_SGL(0.57508405276414f / 8.0)}, - {FL2FXCONST_SGL(0.05198933055162f / 8.0), - FL2FXCONST_SGL(0.21269661669964f / 8.0)}, - {FL2FXCONST_SGL(-0.53499621979720f / 8.0), - FL2FXCONST_SGL(0.97241553731237f / 8.0)}, - {FL2FXCONST_SGL(-0.49429560226497f / 8.0), - FL2FXCONST_SGL(0.98183865291903f / 8.0)}, - {FL2FXCONST_SGL(-0.98935142339139f / 8.0), - FL2FXCONST_SGL(-0.40249159006933f / 8.0)}, - {FL2FXCONST_SGL(-0.98081380091130f / 8.0), - FL2FXCONST_SGL(-0.72856895534041f / 8.0)}, - {FL2FXCONST_SGL(-0.27338148835532f / 8.0), - FL2FXCONST_SGL(0.99950922447209f / 8.0)}, - {FL2FXCONST_SGL(0.06310802338302f / 8.0), - FL2FXCONST_SGL(-0.54539587529618f / 8.0)}, - {FL2FXCONST_SGL(-0.20461677199539f / 8.0), - FL2FXCONST_SGL(-0.14209977628489f / 8.0)}, - {FL2FXCONST_SGL(0.66223843141647f / 8.0), - FL2FXCONST_SGL(0.72528579940326f / 8.0)}, - {FL2FXCONST_SGL(-0.84764345483665f / 8.0), - FL2FXCONST_SGL(0.02372316801261f / 8.0)}, - {FL2FXCONST_SGL(-0.89039863483811f / 8.0), - FL2FXCONST_SGL(0.88866581484602f / 8.0)}, - {FL2FXCONST_SGL(0.95903308477986f / 8.0), - FL2FXCONST_SGL(0.76744927173873f / 8.0)}, - {FL2FXCONST_SGL(0.73504123909879f / 8.0), - FL2FXCONST_SGL(-0.03747203173192f / 8.0)}, - {FL2FXCONST_SGL(-0.31744434966056f / 8.0), - FL2FXCONST_SGL(-0.36834111883652f / 8.0)}, - {FL2FXCONST_SGL(-0.34110827591623f / 8.0), - FL2FXCONST_SGL(0.40211222807691f / 8.0)}, - {FL2FXCONST_SGL(0.47803883714199f / 8.0), - FL2FXCONST_SGL(-0.39423219786288f / 8.0)}, - {FL2FXCONST_SGL(0.98299195879514f / 8.0), - FL2FXCONST_SGL(0.01989791390047f / 8.0)}, - {FL2FXCONST_SGL(-0.30963073129751f / 8.0), - FL2FXCONST_SGL(-0.18076720599336f / 8.0)}, - {FL2FXCONST_SGL(0.99992588229018f / 8.0), - FL2FXCONST_SGL(-0.26281872094289f / 8.0)}, - {FL2FXCONST_SGL(-0.93149731080767f / 8.0), - FL2FXCONST_SGL(-0.98313162570490f / 8.0)}, - {FL2FXCONST_SGL(0.99923472302773f / 8.0), - FL2FXCONST_SGL(-0.80142993767554f / 8.0)}, - {FL2FXCONST_SGL(-0.26024169633417f / 8.0), - FL2FXCONST_SGL(-0.75999759855752f / 8.0)}, - {FL2FXCONST_SGL(-0.35712514743563f / 8.0), - FL2FXCONST_SGL(0.19298963768574f / 8.0)}, - {FL2FXCONST_SGL(-0.99899084509530f / 8.0), - FL2FXCONST_SGL(0.74645156992493f / 8.0)}, - {FL2FXCONST_SGL(0.86557171579452f / 8.0), - FL2FXCONST_SGL(0.55593866696299f / 8.0)}, - {FL2FXCONST_SGL(0.33408042438752f / 8.0), - FL2FXCONST_SGL(0.86185953874709f / 8.0)}, - {FL2FXCONST_SGL(0.99010736374716f / 8.0), - FL2FXCONST_SGL(0.04602397576623f / 8.0)}, - {FL2FXCONST_SGL(-0.66694269691195f / 8.0), - FL2FXCONST_SGL(-0.91643611810148f / 8.0)}, - {FL2FXCONST_SGL(0.64016792079480f / 8.0), - FL2FXCONST_SGL(0.15649530836856f / 8.0)}, - {FL2FXCONST_SGL(0.99570534804836f / 8.0), - FL2FXCONST_SGL(0.45844586038111f / 8.0)}, - {FL2FXCONST_SGL(-0.63431466947340f / 8.0), - FL2FXCONST_SGL(0.21079116459234f / 8.0)}, - {FL2FXCONST_SGL(-0.07706847005931f / 8.0), - FL2FXCONST_SGL(-0.89581437101329f / 8.0)}, - {FL2FXCONST_SGL(0.98590090577724f / 8.0), - FL2FXCONST_SGL(0.88241721133981f / 8.0)}, - {FL2FXCONST_SGL(0.80099335254678f / 8.0), - FL2FXCONST_SGL(-0.36851896710853f / 8.0)}, - {FL2FXCONST_SGL(0.78368131392666f / 8.0), - FL2FXCONST_SGL(0.45506999802597f / 8.0)}, - {FL2FXCONST_SGL(0.08707806671691f / 8.0), - FL2FXCONST_SGL(0.80938994918745f / 8.0)}, - {FL2FXCONST_SGL(-0.86811883080712f / 8.0), - FL2FXCONST_SGL(0.39347308654705f / 8.0)}, - {FL2FXCONST_SGL(-0.39466529740375f / 8.0), - FL2FXCONST_SGL(-0.66809432114456f / 8.0)}, - {FL2FXCONST_SGL(0.97875325649683f / 8.0), - FL2FXCONST_SGL(-0.72467840967746f / 8.0)}, - {FL2FXCONST_SGL(-0.95038560288864f / 8.0), - FL2FXCONST_SGL(0.89563219587625f / 8.0)}, - {FL2FXCONST_SGL(0.17005239424212f / 8.0), - FL2FXCONST_SGL(0.54683053962658f / 8.0)}, - {FL2FXCONST_SGL(-0.76910792026848f / 8.0), - FL2FXCONST_SGL(-0.96226617549298f / 8.0)}, - {FL2FXCONST_SGL(0.99743281016846f / 8.0), - FL2FXCONST_SGL(0.42697157037567f / 8.0)}, - {FL2FXCONST_SGL(0.95437383549973f / 8.0), - FL2FXCONST_SGL(0.97002324109952f / 8.0)}, - {FL2FXCONST_SGL(0.99578905365569f / 8.0), - FL2FXCONST_SGL(-0.54106826257356f / 8.0)}, - {FL2FXCONST_SGL(0.28058259829990f / 8.0), - FL2FXCONST_SGL(-0.85361420634036f / 8.0)}, - {FL2FXCONST_SGL(0.85256524470573f / 8.0), - FL2FXCONST_SGL(-0.64567607735589f / 8.0)}, - {FL2FXCONST_SGL(-0.50608540105128f / 8.0), - FL2FXCONST_SGL(-0.65846015480300f / 8.0)}, - {FL2FXCONST_SGL(-0.97210735183243f / 8.0), - FL2FXCONST_SGL(-0.23095213067791f / 8.0)}, - {FL2FXCONST_SGL(0.95424048234441f / 8.0), - FL2FXCONST_SGL(-0.99240147091219f / 8.0)}, - {FL2FXCONST_SGL(-0.96926570524023f / 8.0), - FL2FXCONST_SGL(0.73775654896574f / 8.0)}, - {FL2FXCONST_SGL(0.30872163214726f / 8.0), - FL2FXCONST_SGL(0.41514960556126f / 8.0)}, - {FL2FXCONST_SGL(-0.24523839572639f / 8.0), - FL2FXCONST_SGL(0.63206633394807f / 8.0)}, - {FL2FXCONST_SGL(-0.33813265086024f / 8.0), - FL2FXCONST_SGL(-0.38661779441897f / 8.0)}, - {FL2FXCONST_SGL(-0.05826828420146f / 8.0), - FL2FXCONST_SGL(-0.06940774188029f / 8.0)}, - {FL2FXCONST_SGL(-0.22898461455054f / 8.0), - FL2FXCONST_SGL(0.97054853316316f / 8.0)}, - {FL2FXCONST_SGL(-0.18509915019881f / 8.0), - FL2FXCONST_SGL(0.47565762892084f / 8.0)}, - {FL2FXCONST_SGL(-0.10488238045009f / 8.0), - FL2FXCONST_SGL(-0.87769947402394f / 8.0)}, - {FL2FXCONST_SGL(-0.71886586182037f / 8.0), - FL2FXCONST_SGL(0.78030982480538f / 8.0)}, - {FL2FXCONST_SGL(0.99793873738654f / 8.0), - FL2FXCONST_SGL(0.90041310491497f / 8.0)}, - {FL2FXCONST_SGL(0.57563307626120f / 8.0), - FL2FXCONST_SGL(-0.91034337352097f / 8.0)}, - {FL2FXCONST_SGL(0.28909646383717f / 8.0), - FL2FXCONST_SGL(0.96307783970534f / 8.0)}, - {FL2FXCONST_SGL(0.42188998312520f / 8.0), - FL2FXCONST_SGL(0.48148651230437f / 8.0)}, - {FL2FXCONST_SGL(0.93335049681047f / 8.0), - FL2FXCONST_SGL(-0.43537023883588f / 8.0)}, - {FL2FXCONST_SGL(-0.97087374418267f / 8.0), - FL2FXCONST_SGL(0.86636445711364f / 8.0)}, - {FL2FXCONST_SGL(0.36722871286923f / 8.0), - FL2FXCONST_SGL(0.65291654172961f / 8.0)}, - {FL2FXCONST_SGL(-0.81093025665696f / 8.0), - FL2FXCONST_SGL(0.08778370229363f / 8.0)}, - {FL2FXCONST_SGL(-0.26240603062237f / 8.0), - FL2FXCONST_SGL(-0.92774095379098f / 8.0)}, - {FL2FXCONST_SGL(0.83996497984604f / 8.0), - FL2FXCONST_SGL(0.55839849139647f / 8.0)}, - {FL2FXCONST_SGL(-0.99909615720225f / 8.0), - FL2FXCONST_SGL(-0.96024605713970f / 8.0)}, - {FL2FXCONST_SGL(0.74649464155061f / 8.0), - FL2FXCONST_SGL(0.12144893606462f / 8.0)}, - {FL2FXCONST_SGL(-0.74774595569805f / 8.0), - FL2FXCONST_SGL(-0.26898062008959f / 8.0)}, - {FL2FXCONST_SGL(0.95781667469567f / 8.0), - FL2FXCONST_SGL(-0.79047927052628f / 8.0)}, - {FL2FXCONST_SGL(0.95472308713099f / 8.0), - FL2FXCONST_SGL(-0.08588776019550f / 8.0)}, - {FL2FXCONST_SGL(0.48708332746299f / 8.0), - FL2FXCONST_SGL(0.99999041579432f / 8.0)}, - {FL2FXCONST_SGL(0.46332038247497f / 8.0), - FL2FXCONST_SGL(0.10964126185063f / 8.0)}, - {FL2FXCONST_SGL(-0.76497004940162f / 8.0), - FL2FXCONST_SGL(0.89210929242238f / 8.0)}, - {FL2FXCONST_SGL(0.57397389364339f / 8.0), - FL2FXCONST_SGL(0.35289703373760f / 8.0)}, - {FL2FXCONST_SGL(0.75374316974495f / 8.0), - FL2FXCONST_SGL(0.96705214651335f / 8.0)}, - {FL2FXCONST_SGL(-0.59174397685714f / 8.0), - FL2FXCONST_SGL(-0.89405370422752f / 8.0)}, - {FL2FXCONST_SGL(0.75087906691890f / 8.0), - FL2FXCONST_SGL(-0.29612672982396f / 8.0)}, - {FL2FXCONST_SGL(-0.98607857336230f / 8.0), - FL2FXCONST_SGL(0.25034911730023f / 8.0)}, - {FL2FXCONST_SGL(-0.40761056640505f / 8.0), - FL2FXCONST_SGL(-0.90045573444695f / 8.0)}, - {FL2FXCONST_SGL(0.66929266740477f / 8.0), - FL2FXCONST_SGL(0.98629493401748f / 8.0)}, - {FL2FXCONST_SGL(-0.97463695257310f / 8.0), - FL2FXCONST_SGL(-0.00190223301301f / 8.0)}, - {FL2FXCONST_SGL(0.90145509409859f / 8.0), - FL2FXCONST_SGL(0.99781390365446f / 8.0)}, - {FL2FXCONST_SGL(-0.87259289048043f / 8.0), - FL2FXCONST_SGL(0.99233587353666f / 8.0)}, - {FL2FXCONST_SGL(-0.91529461447692f / 8.0), - FL2FXCONST_SGL(-0.15698707534206f / 8.0)}, - {FL2FXCONST_SGL(-0.03305738840705f / 8.0), - FL2FXCONST_SGL(-0.37205262859764f / 8.0)}, - {FL2FXCONST_SGL(0.07223051368337f / 8.0), - FL2FXCONST_SGL(-0.88805001733626f / 8.0)}, - {FL2FXCONST_SGL(0.99498012188353f / 8.0), - FL2FXCONST_SGL(0.97094358113387f / 8.0)}, - {FL2FXCONST_SGL(-0.74904939500519f / 8.0), - FL2FXCONST_SGL(0.99985483641521f / 8.0)}, - {FL2FXCONST_SGL(0.04585228574211f / 8.0), - FL2FXCONST_SGL(0.99812337444082f / 8.0)}, - {FL2FXCONST_SGL(-0.89054954257993f / 8.0), - FL2FXCONST_SGL(-0.31791913188064f / 8.0)}, - {FL2FXCONST_SGL(-0.83782144651251f / 8.0), - FL2FXCONST_SGL(0.97637632547466f / 8.0)}, - {FL2FXCONST_SGL(0.33454804933804f / 8.0), - FL2FXCONST_SGL(-0.86231516800408f / 8.0)}, - {FL2FXCONST_SGL(-0.99707579362824f / 8.0), - FL2FXCONST_SGL(0.93237990079441f / 8.0)}, - {FL2FXCONST_SGL(-0.22827527843994f / 8.0), - FL2FXCONST_SGL(0.18874759397997f / 8.0)}, - {FL2FXCONST_SGL(0.67248046289143f / 8.0), - FL2FXCONST_SGL(-0.03646211390569f / 8.0)}, - {FL2FXCONST_SGL(-0.05146538187944f / 8.0), - FL2FXCONST_SGL(-0.92599700120679f / 8.0)}, - {FL2FXCONST_SGL(0.99947295749905f / 8.0), - FL2FXCONST_SGL(0.93625229707912f / 8.0)}, - {FL2FXCONST_SGL(0.66951124390363f / 8.0), - FL2FXCONST_SGL(0.98905825623893f / 8.0)}, - {FL2FXCONST_SGL(-0.99602956559179f / 8.0), - FL2FXCONST_SGL(-0.44654715757688f / 8.0)}, - {FL2FXCONST_SGL(0.82104905483590f / 8.0), - FL2FXCONST_SGL(0.99540741724928f / 8.0)}, - {FL2FXCONST_SGL(0.99186510988782f / 8.0), - FL2FXCONST_SGL(0.72023001312947f / 8.0)}, - {FL2FXCONST_SGL(-0.65284592392918f / 8.0), - FL2FXCONST_SGL(0.52186723253637f / 8.0)}, - {FL2FXCONST_SGL(0.93885443798188f / 8.0), - FL2FXCONST_SGL(-0.74895312615259f / 8.0)}, - {FL2FXCONST_SGL(0.96735248738388f / 8.0), - FL2FXCONST_SGL(0.90891816978629f / 8.0)}, - {FL2FXCONST_SGL(-0.22225968841114f / 8.0), - FL2FXCONST_SGL(0.57124029781228f / 8.0)}, - {FL2FXCONST_SGL(-0.44132783753414f / 8.0), - FL2FXCONST_SGL(-0.92688840659280f / 8.0)}, - {FL2FXCONST_SGL(-0.85694974219574f / 8.0), - FL2FXCONST_SGL(0.88844532719844f / 8.0)}, - {FL2FXCONST_SGL(0.91783042091762f / 8.0), - FL2FXCONST_SGL(-0.46356892383970f / 8.0)}, - {FL2FXCONST_SGL(0.72556974415690f / 8.0), - FL2FXCONST_SGL(-0.99899555770747f / 8.0)}, - {FL2FXCONST_SGL(-0.99711581834508f / 8.0), - FL2FXCONST_SGL(0.58211560180426f / 8.0)}, - {FL2FXCONST_SGL(0.77638976371966f / 8.0), - FL2FXCONST_SGL(0.94321834873819f / 8.0)}, - {FL2FXCONST_SGL(0.07717324253925f / 8.0), - FL2FXCONST_SGL(0.58638399856595f / 8.0)}, - {FL2FXCONST_SGL(-0.56049829194163f / 8.0), - FL2FXCONST_SGL(0.82522301569036f / 8.0)}, - {FL2FXCONST_SGL(0.98398893639988f / 8.0), - FL2FXCONST_SGL(0.39467440420569f / 8.0)}, - {FL2FXCONST_SGL(0.47546946844938f / 8.0), - FL2FXCONST_SGL(0.68613044836811f / 8.0)}, - {FL2FXCONST_SGL(0.65675089314631f / 8.0), - FL2FXCONST_SGL(0.18331637134880f / 8.0)}, - {FL2FXCONST_SGL(0.03273375457980f / 8.0), - FL2FXCONST_SGL(-0.74933109564108f / 8.0)}, - {FL2FXCONST_SGL(-0.38684144784738f / 8.0), - FL2FXCONST_SGL(0.51337349030406f / 8.0)}, - {FL2FXCONST_SGL(-0.97346267944545f / 8.0), - FL2FXCONST_SGL(-0.96549364384098f / 8.0)}, - {FL2FXCONST_SGL(-0.53282156061942f / 8.0), - FL2FXCONST_SGL(-0.91423265091354f / 8.0)}, - {FL2FXCONST_SGL(0.99817310731176f / 8.0), - FL2FXCONST_SGL(0.61133572482148f / 8.0)}, - {FL2FXCONST_SGL(-0.50254500772635f / 8.0), - FL2FXCONST_SGL(-0.88829338134294f / 8.0)}, - {FL2FXCONST_SGL(0.01995873238855f / 8.0), - FL2FXCONST_SGL(0.85223515096765f / 8.0)}, - {FL2FXCONST_SGL(0.99930381973804f / 8.0), - FL2FXCONST_SGL(0.94578896296649f / 8.0)}, - {FL2FXCONST_SGL(0.82907767600783f / 8.0), - FL2FXCONST_SGL(-0.06323442598128f / 8.0)}, - {FL2FXCONST_SGL(-0.58660709669728f / 8.0), - FL2FXCONST_SGL(0.96840773806582f / 8.0)}, - {FL2FXCONST_SGL(-0.17573736667267f / 8.0), - FL2FXCONST_SGL(-0.48166920859485f / 8.0)}, - {FL2FXCONST_SGL(0.83434292401346f / 8.0), - FL2FXCONST_SGL(-0.13023450646997f / 8.0)}, - {FL2FXCONST_SGL(0.05946491307025f / 8.0), - FL2FXCONST_SGL(0.20511047074866f / 8.0)}, - {FL2FXCONST_SGL(0.81505484574602f / 8.0), - FL2FXCONST_SGL(-0.94685947861369f / 8.0)}, - {FL2FXCONST_SGL(-0.44976380954860f / 8.0), - FL2FXCONST_SGL(0.40894572671545f / 8.0)}, - {FL2FXCONST_SGL(-0.89746474625671f / 8.0), - FL2FXCONST_SGL(0.99846578838537f / 8.0)}, - {FL2FXCONST_SGL(0.39677256130792f / 8.0), - FL2FXCONST_SGL(-0.74854668609359f / 8.0)}, - {FL2FXCONST_SGL(-0.07588948563079f / 8.0), - FL2FXCONST_SGL(0.74096214084170f / 8.0)}, - {FL2FXCONST_SGL(0.76343198951445f / 8.0), - FL2FXCONST_SGL(0.41746629422634f / 8.0)}, - {FL2FXCONST_SGL(-0.74490104699626f / 8.0), - FL2FXCONST_SGL(0.94725911744610f / 8.0)}, - {FL2FXCONST_SGL(0.64880119792759f / 8.0), - FL2FXCONST_SGL(0.41336660830571f / 8.0)}, - {FL2FXCONST_SGL(0.62319537462542f / 8.0), - FL2FXCONST_SGL(-0.93098313552599f / 8.0)}, - {FL2FXCONST_SGL(0.42215817594807f / 8.0), - FL2FXCONST_SGL(-0.07712787385208f / 8.0)}, - {FL2FXCONST_SGL(0.02704554141885f / 8.0), - FL2FXCONST_SGL(-0.05417518053666f / 8.0)}, - {FL2FXCONST_SGL(0.80001773566818f / 8.0), - FL2FXCONST_SGL(0.91542195141039f / 8.0)}, - {FL2FXCONST_SGL(-0.79351832348816f / 8.0), - FL2FXCONST_SGL(-0.36208897989136f / 8.0)}, - {FL2FXCONST_SGL(0.63872359151636f / 8.0), - FL2FXCONST_SGL(0.08128252493444f / 8.0)}, - {FL2FXCONST_SGL(0.52890520960295f / 8.0), - FL2FXCONST_SGL(0.60048872455592f / 8.0)}, - {FL2FXCONST_SGL(0.74238552914587f / 8.0), - FL2FXCONST_SGL(0.04491915291044f / 8.0)}, - {FL2FXCONST_SGL(0.99096131449250f / 8.0), - FL2FXCONST_SGL(-0.19451182854402f / 8.0)}, - {FL2FXCONST_SGL(-0.80412329643109f / 8.0), - FL2FXCONST_SGL(-0.88513818199457f / 8.0)}, - {FL2FXCONST_SGL(-0.64612616129736f / 8.0), - FL2FXCONST_SGL(0.72198674804544f / 8.0)}, - {FL2FXCONST_SGL(0.11657770663191f / 8.0), - FL2FXCONST_SGL(-0.83662833815041f / 8.0)}, - {FL2FXCONST_SGL(-0.95053182488101f / 8.0), - FL2FXCONST_SGL(-0.96939905138082f / 8.0)}, - {FL2FXCONST_SGL(-0.62228872928622f / 8.0), - FL2FXCONST_SGL(0.82767262846661f / 8.0)}, - {FL2FXCONST_SGL(0.03004475787316f / 8.0), - FL2FXCONST_SGL(-0.99738896333384f / 8.0)}, - {FL2FXCONST_SGL(-0.97987214341034f / 8.0), - FL2FXCONST_SGL(0.36526129686425f / 8.0)}, - {FL2FXCONST_SGL(-0.99986980746200f / 8.0), - FL2FXCONST_SGL(-0.36021610299715f / 8.0)}, - {FL2FXCONST_SGL(0.89110648599879f / 8.0), - FL2FXCONST_SGL(-0.97894250343044f / 8.0)}, - {FL2FXCONST_SGL(0.10407960510582f / 8.0), - FL2FXCONST_SGL(0.77357793811619f / 8.0)}, - {FL2FXCONST_SGL(0.95964737821728f / 8.0), - FL2FXCONST_SGL(-0.35435818285502f / 8.0)}, - {FL2FXCONST_SGL(0.50843233159162f / 8.0), - FL2FXCONST_SGL(0.96107691266205f / 8.0)}, - {FL2FXCONST_SGL(0.17006334670615f / 8.0), - FL2FXCONST_SGL(-0.76854025314829f / 8.0)}, - {FL2FXCONST_SGL(0.25872675063360f / 8.0), - FL2FXCONST_SGL(0.99893303933816f / 8.0)}, - {FL2FXCONST_SGL(-0.01115998681937f / 8.0), - FL2FXCONST_SGL(0.98496019742444f / 8.0)}, - {FL2FXCONST_SGL(-0.79598702973261f / 8.0), - FL2FXCONST_SGL(0.97138411318894f / 8.0)}, - {FL2FXCONST_SGL(-0.99264708948101f / 8.0), - FL2FXCONST_SGL(-0.99542822402536f / 8.0)}, - {FL2FXCONST_SGL(-0.99829663752818f / 8.0), - FL2FXCONST_SGL(0.01877138824311f / 8.0)}, - {FL2FXCONST_SGL(-0.70801016548184f / 8.0), - FL2FXCONST_SGL(0.33680685948117f / 8.0)}, - {FL2FXCONST_SGL(-0.70467057786826f / 8.0), - FL2FXCONST_SGL(0.93272777501857f / 8.0)}, - {FL2FXCONST_SGL(0.99846021905254f / 8.0), - FL2FXCONST_SGL(-0.98725746254433f / 8.0)}, - {FL2FXCONST_SGL(-0.63364968534650f / 8.0), - FL2FXCONST_SGL(-0.16473594423746f / 8.0)}, - {FL2FXCONST_SGL(-0.16258217500792f / 8.0), - FL2FXCONST_SGL(-0.95939125400802f / 8.0)}, - {FL2FXCONST_SGL(-0.43645594360633f / 8.0), - FL2FXCONST_SGL(-0.94805030113284f / 8.0)}, - {FL2FXCONST_SGL(-0.99848471702976f / 8.0), - FL2FXCONST_SGL(0.96245166923809f / 8.0)}, - {FL2FXCONST_SGL(-0.16796458968998f / 8.0), - FL2FXCONST_SGL(-0.98987511890470f / 8.0)}, - {FL2FXCONST_SGL(-0.87979225745213f / 8.0), - FL2FXCONST_SGL(-0.71725725041680f / 8.0)}, - {FL2FXCONST_SGL(0.44183099021786f / 8.0), - FL2FXCONST_SGL(-0.93568974498761f / 8.0)}, - {FL2FXCONST_SGL(0.93310180125532f / 8.0), - FL2FXCONST_SGL(-0.99913308068246f / 8.0)}, - {FL2FXCONST_SGL(-0.93941931782002f / 8.0), - FL2FXCONST_SGL(-0.56409379640356f / 8.0)}, - {FL2FXCONST_SGL(-0.88590003188677f / 8.0), - FL2FXCONST_SGL(0.47624600491382f / 8.0)}, - {FL2FXCONST_SGL(0.99971463703691f / 8.0), - FL2FXCONST_SGL(-0.83889954253462f / 8.0)}, - {FL2FXCONST_SGL(-0.75376385639978f / 8.0), - FL2FXCONST_SGL(0.00814643438625f / 8.0)}, - {FL2FXCONST_SGL(0.93887685615875f / 8.0), - FL2FXCONST_SGL(-0.11284528204636f / 8.0)}, - {FL2FXCONST_SGL(0.85126435782309f / 8.0), - FL2FXCONST_SGL(0.52349251543547f / 8.0)}, - {FL2FXCONST_SGL(0.39701421446381f / 8.0), - FL2FXCONST_SGL(0.81779634174316f / 8.0)}, - {FL2FXCONST_SGL(-0.37024464187437f / 8.0), - FL2FXCONST_SGL(-0.87071656222959f / 8.0)}, - {FL2FXCONST_SGL(-0.36024828242896f / 8.0), - FL2FXCONST_SGL(0.34655735648287f / 8.0)}, - {FL2FXCONST_SGL(-0.93388812549209f / 8.0), - FL2FXCONST_SGL(-0.84476541096429f / 8.0)}, - {FL2FXCONST_SGL(-0.65298804552119f / 8.0), - FL2FXCONST_SGL(-0.18439575450921f / 8.0)}, - {FL2FXCONST_SGL(0.11960319006843f / 8.0), - FL2FXCONST_SGL(0.99899346780168f / 8.0)}, - {FL2FXCONST_SGL(0.94292565553160f / 8.0), - FL2FXCONST_SGL(0.83163906518293f / 8.0)}, - {FL2FXCONST_SGL(0.75081145286948f / 8.0), - FL2FXCONST_SGL(-0.35533223142265f / 8.0)}, - {FL2FXCONST_SGL(0.56721979748394f / 8.0), - FL2FXCONST_SGL(-0.24076836414499f / 8.0)}, - {FL2FXCONST_SGL(0.46857766746029f / 8.0), - FL2FXCONST_SGL(-0.30140233457198f / 8.0)}, - {FL2FXCONST_SGL(0.97312313923635f / 8.0), - FL2FXCONST_SGL(-0.99548191630031f / 8.0)}, - {FL2FXCONST_SGL(-0.38299976567017f / 8.0), - FL2FXCONST_SGL(0.98516909715427f / 8.0)}, - {FL2FXCONST_SGL(0.41025800019463f / 8.0), - FL2FXCONST_SGL(0.02116736935734f / 8.0)}, - {FL2FXCONST_SGL(0.09638062008048f / 8.0), - FL2FXCONST_SGL(0.04411984381457f / 8.0)}, - {FL2FXCONST_SGL(-0.85283249275397f / 8.0), - FL2FXCONST_SGL(0.91475563922421f / 8.0)}, - {FL2FXCONST_SGL(0.88866808958124f / 8.0), - FL2FXCONST_SGL(-0.99735267083226f / 8.0)}, - {FL2FXCONST_SGL(-0.48202429536989f / 8.0), - FL2FXCONST_SGL(-0.96805608884164f / 8.0)}, - {FL2FXCONST_SGL(0.27572582416567f / 8.0), - FL2FXCONST_SGL(0.58634753335832f / 8.0)}, - {FL2FXCONST_SGL(-0.65889129659168f / 8.0), - FL2FXCONST_SGL(0.58835634138583f / 8.0)}, - {FL2FXCONST_SGL(0.98838086953732f / 8.0), - FL2FXCONST_SGL(0.99994349600236f / 8.0)}, - {FL2FXCONST_SGL(-0.20651349620689f / 8.0), - FL2FXCONST_SGL(0.54593044066355f / 8.0)}, - {FL2FXCONST_SGL(-0.62126416356920f / 8.0), - FL2FXCONST_SGL(-0.59893681700392f / 8.0)}, - {FL2FXCONST_SGL(0.20320105410437f / 8.0), - FL2FXCONST_SGL(-0.86879180355289f / 8.0)}, - {FL2FXCONST_SGL(-0.97790548600584f / 8.0), - FL2FXCONST_SGL(0.96290806999242f / 8.0)}, - {FL2FXCONST_SGL(0.11112534735126f / 8.0), - FL2FXCONST_SGL(0.21484763313301f / 8.0)}, - {FL2FXCONST_SGL(-0.41368337314182f / 8.0), - FL2FXCONST_SGL(0.28216837680365f / 8.0)}, - {FL2FXCONST_SGL(0.24133038992960f / 8.0), - FL2FXCONST_SGL(0.51294362630238f / 8.0)}, - {FL2FXCONST_SGL(-0.66393410674885f / 8.0), - FL2FXCONST_SGL(-0.08249679629081f / 8.0)}, - {FL2FXCONST_SGL(-0.53697829178752f / 8.0), - FL2FXCONST_SGL(-0.97649903936228f / 8.0)}, - {FL2FXCONST_SGL(-0.97224737889348f / 8.0), - FL2FXCONST_SGL(0.22081333579837f / 8.0)}, - {FL2FXCONST_SGL(0.87392477144549f / 8.0), - FL2FXCONST_SGL(-0.12796173740361f / 8.0)}, - {FL2FXCONST_SGL(0.19050361015753f / 8.0), - FL2FXCONST_SGL(0.01602615387195f / 8.0)}, - {FL2FXCONST_SGL(-0.46353441212724f / 8.0), - FL2FXCONST_SGL(-0.95249041539006f / 8.0)}, - {FL2FXCONST_SGL(-0.07064096339021f / 8.0), - FL2FXCONST_SGL(-0.94479803205886f / 8.0)}, - {FL2FXCONST_SGL(-0.92444085484466f / 8.0), - FL2FXCONST_SGL(-0.10457590187436f / 8.0)}, - {FL2FXCONST_SGL(-0.83822593578728f / 8.0), - FL2FXCONST_SGL(-0.01695043208885f / 8.0)}, - {FL2FXCONST_SGL(0.75214681811150f / 8.0), - FL2FXCONST_SGL(-0.99955681042665f / 8.0)}, - {FL2FXCONST_SGL(-0.42102998829339f / 8.0), - FL2FXCONST_SGL(0.99720941999394f / 8.0)}, - {FL2FXCONST_SGL(-0.72094786237696f / 8.0), - FL2FXCONST_SGL(-0.35008961934255f / 8.0)}, - {FL2FXCONST_SGL(0.78843311019251f / 8.0), - FL2FXCONST_SGL(0.52851398958271f / 8.0)}, - {FL2FXCONST_SGL(0.97394027897442f / 8.0), - FL2FXCONST_SGL(-0.26695944086561f / 8.0)}, - {FL2FXCONST_SGL(0.99206463477946f / 8.0), - FL2FXCONST_SGL(-0.57010120849429f / 8.0)}, - {FL2FXCONST_SGL(0.76789609461795f / 8.0), - FL2FXCONST_SGL(-0.76519356730966f / 8.0)}, - {FL2FXCONST_SGL(-0.82002421836409f / 8.0), - FL2FXCONST_SGL(-0.73530179553767f / 8.0)}, - {FL2FXCONST_SGL(0.81924990025724f / 8.0), - FL2FXCONST_SGL(0.99698425250579f / 8.0)}, - {FL2FXCONST_SGL(-0.26719850873357f / 8.0), - FL2FXCONST_SGL(0.68903369776193f / 8.0)}, - {FL2FXCONST_SGL(-0.43311260380975f / 8.0), - FL2FXCONST_SGL(0.85321815947490f / 8.0)}, - {FL2FXCONST_SGL(0.99194979673836f / 8.0), - FL2FXCONST_SGL(0.91876249766422f / 8.0)}, - {FL2FXCONST_SGL(-0.80692001248487f / 8.0), - FL2FXCONST_SGL(-0.32627540663214f / 8.0)}, - {FL2FXCONST_SGL(0.43080003649976f / 8.0), - FL2FXCONST_SGL(-0.21919095636638f / 8.0)}, - {FL2FXCONST_SGL(0.67709491937357f / 8.0), - FL2FXCONST_SGL(-0.95478075822906f / 8.0)}, - {FL2FXCONST_SGL(0.56151770568316f / 8.0), - FL2FXCONST_SGL(-0.70693811747778f / 8.0)}, - {FL2FXCONST_SGL(0.10831862810749f / 8.0), - FL2FXCONST_SGL(-0.08628837174592f / 8.0)}, - {FL2FXCONST_SGL(0.91229417540436f / 8.0), - FL2FXCONST_SGL(-0.65987351408410f / 8.0)}, - {FL2FXCONST_SGL(-0.48972893932274f / 8.0), - FL2FXCONST_SGL(0.56289246362686f / 8.0)}, - {FL2FXCONST_SGL(-0.89033658689697f / 8.0), - FL2FXCONST_SGL(-0.71656563987082f / 8.0)}, - {FL2FXCONST_SGL(0.65269447475094f / 8.0), - FL2FXCONST_SGL(0.65916004833932f / 8.0)}, - {FL2FXCONST_SGL(0.67439478141121f / 8.0), - FL2FXCONST_SGL(-0.81684380846796f / 8.0)}, - {FL2FXCONST_SGL(-0.47770832416973f / 8.0), - FL2FXCONST_SGL(-0.16789556203025f / 8.0)}, - {FL2FXCONST_SGL(-0.99715979260878f / 8.0), - FL2FXCONST_SGL(-0.93565784007648f / 8.0)}, - {FL2FXCONST_SGL(-0.90889593602546f / 8.0), - FL2FXCONST_SGL(0.62034397054380f / 8.0)}, - {FL2FXCONST_SGL(-0.06618622548177f / 8.0), - FL2FXCONST_SGL(-0.23812217221359f / 8.0)}, - {FL2FXCONST_SGL(0.99430266919728f / 8.0), - FL2FXCONST_SGL(0.18812555317553f / 8.0)}, - {FL2FXCONST_SGL(0.97686402381843f / 8.0), - FL2FXCONST_SGL(-0.28664534366620f / 8.0)}, - {FL2FXCONST_SGL(0.94813650221268f / 8.0), - FL2FXCONST_SGL(-0.97506640027128f / 8.0)}, - {FL2FXCONST_SGL(-0.95434497492853f / 8.0), - FL2FXCONST_SGL(-0.79607978501983f / 8.0)}, - {FL2FXCONST_SGL(-0.49104783137150f / 8.0), - FL2FXCONST_SGL(0.32895214359663f / 8.0)}, - {FL2FXCONST_SGL(0.99881175120751f / 8.0), - FL2FXCONST_SGL(0.88993983831354f / 8.0)}, - {FL2FXCONST_SGL(0.50449166760303f / 8.0), - FL2FXCONST_SGL(-0.85995072408434f / 8.0)}, - {FL2FXCONST_SGL(0.47162891065108f / 8.0), - FL2FXCONST_SGL(-0.18680204049569f / 8.0)}, - {FL2FXCONST_SGL(-0.62081581361840f / 8.0), - FL2FXCONST_SGL(0.75000676218956f / 8.0)}, - {FL2FXCONST_SGL(-0.43867015250812f / 8.0), - FL2FXCONST_SGL(0.99998069244322f / 8.0)}, - {FL2FXCONST_SGL(0.98630563232075f / 8.0), - FL2FXCONST_SGL(-0.53578899600662f / 8.0)}, - {FL2FXCONST_SGL(-0.61510362277374f / 8.0), - FL2FXCONST_SGL(-0.89515019899997f / 8.0)}, - {FL2FXCONST_SGL(-0.03841517601843f / 8.0), - FL2FXCONST_SGL(-0.69888815681179f / 8.0)}, - {FL2FXCONST_SGL(-0.30102157304644f / 8.0), - FL2FXCONST_SGL(-0.07667808922205f / 8.0)}, - {FL2FXCONST_SGL(0.41881284182683f / 8.0), - FL2FXCONST_SGL(0.02188098922282f / 8.0)}, - {FL2FXCONST_SGL(-0.86135454941237f / 8.0), - FL2FXCONST_SGL(0.98947480909359f / 8.0)}, - {FL2FXCONST_SGL(0.67226861393788f / 8.0), - FL2FXCONST_SGL(-0.13494389011014f / 8.0)}, - {FL2FXCONST_SGL(-0.70737398842068f / 8.0), - FL2FXCONST_SGL(-0.76547349325992f / 8.0)}, - {FL2FXCONST_SGL(0.94044946687963f / 8.0), - FL2FXCONST_SGL(0.09026201157416f / 8.0)}, - {FL2FXCONST_SGL(-0.82386352534327f / 8.0), - FL2FXCONST_SGL(0.08924768823676f / 8.0)}, - {FL2FXCONST_SGL(-0.32070666698656f / 8.0), - FL2FXCONST_SGL(0.50143421908753f / 8.0)}, - {FL2FXCONST_SGL(0.57593163224487f / 8.0), - FL2FXCONST_SGL(-0.98966422921509f / 8.0)}, - {FL2FXCONST_SGL(-0.36326018419965f / 8.0), - FL2FXCONST_SGL(0.07440243123228f / 8.0)}, - {FL2FXCONST_SGL(0.99979044674350f / 8.0), - FL2FXCONST_SGL(-0.14130287347405f / 8.0)}, - {FL2FXCONST_SGL(-0.92366023326932f / 8.0), - FL2FXCONST_SGL(-0.97979298068180f / 8.0)}, - {FL2FXCONST_SGL(-0.44607178518598f / 8.0), - FL2FXCONST_SGL(-0.54233252016394f / 8.0)}, - {FL2FXCONST_SGL(0.44226800932956f / 8.0), - FL2FXCONST_SGL(0.71326756742752f / 8.0)}, - {FL2FXCONST_SGL(0.03671907158312f / 8.0), - FL2FXCONST_SGL(0.63606389366675f / 8.0)}, - {FL2FXCONST_SGL(0.52175424682195f / 8.0), - FL2FXCONST_SGL(-0.85396826735705f / 8.0)}, - {FL2FXCONST_SGL(-0.94701139690956f / 8.0), - FL2FXCONST_SGL(-0.01826348194255f / 8.0)}, - {FL2FXCONST_SGL(-0.98759606946049f / 8.0), - FL2FXCONST_SGL(0.82288714303073f / 8.0)}, - {FL2FXCONST_SGL(0.87434794743625f / 8.0), - FL2FXCONST_SGL(0.89399495655433f / 8.0)}, - {FL2FXCONST_SGL(-0.93412041758744f / 8.0), - FL2FXCONST_SGL(0.41374052024363f / 8.0)}, - {FL2FXCONST_SGL(0.96063943315511f / 8.0), - FL2FXCONST_SGL(0.93116709541280f / 8.0)}, - {FL2FXCONST_SGL(0.97534253457837f / 8.0), - FL2FXCONST_SGL(0.86150930812689f / 8.0)}, - {FL2FXCONST_SGL(0.99642466504163f / 8.0), - FL2FXCONST_SGL(0.70190043427512f / 8.0)}, - {FL2FXCONST_SGL(-0.94705089665984f / 8.0), - FL2FXCONST_SGL(-0.29580042814306f / 8.0)}, - {FL2FXCONST_SGL(0.91599807087376f / 8.0), - FL2FXCONST_SGL(-0.98147830385781f / 8.0)}}; + {FL2FXCONST_SGL(-0.99948153278296f), FL2FXCONST_SGL(-0.59483417516607f)}, + {FL2FXCONST_SGL(0.97113454393991f), FL2FXCONST_SGL(-0.67528515225647f)}, + {FL2FXCONST_SGL(0.14130051758487f), FL2FXCONST_SGL(-0.95090983575689f)}, + {FL2FXCONST_SGL(-0.47005496701697f), FL2FXCONST_SGL(-0.37340549728647f)}, + {FL2FXCONST_SGL(0.80705063769351f), FL2FXCONST_SGL(0.29653668284408f)}, + {FL2FXCONST_SGL(-0.38981478896926f), FL2FXCONST_SGL(0.89572605717087f)}, + {FL2FXCONST_SGL(-0.01053049862020f), FL2FXCONST_SGL(-0.66959058036166f)}, + {FL2FXCONST_SGL(-0.91266367957293f), FL2FXCONST_SGL(-0.11522938140034f)}, + {FL2FXCONST_SGL(0.54840422910309f), FL2FXCONST_SGL(0.75221367176302f)}, + {FL2FXCONST_SGL(0.40009252867955f), FL2FXCONST_SGL(-0.98929400334421f)}, + {FL2FXCONST_SGL(-0.99867974711855f), FL2FXCONST_SGL(-0.88147068645358f)}, + {FL2FXCONST_SGL(-0.95531076805040f), FL2FXCONST_SGL(0.90908757154593f)}, + {FL2FXCONST_SGL(-0.45725933317144f), FL2FXCONST_SGL(-0.56716323646760f)}, + {FL2FXCONST_SGL(-0.72929675029275f), FL2FXCONST_SGL(-0.98008272727324f)}, + {FL2FXCONST_SGL(0.75622801399036f), FL2FXCONST_SGL(0.20950329995549f)}, + {FL2FXCONST_SGL(0.07069442601050f), FL2FXCONST_SGL(-0.78247898470706f)}, + {FL2FXCONST_SGL(0.74496252926055f), FL2FXCONST_SGL(-0.91169004445807f)}, + {FL2FXCONST_SGL(-0.96440182703856f), FL2FXCONST_SGL(-0.94739918296622f)}, + {FL2FXCONST_SGL(0.30424629369539f), FL2FXCONST_SGL(-0.49438267012479f)}, + {FL2FXCONST_SGL(0.66565033746925f), FL2FXCONST_SGL(0.64652935542491f)}, + {FL2FXCONST_SGL(0.91697008020594f), FL2FXCONST_SGL(0.17514097332009f)}, + {FL2FXCONST_SGL(-0.70774918760427f), FL2FXCONST_SGL(0.52548653416543f)}, + {FL2FXCONST_SGL(-0.70051415345560f), FL2FXCONST_SGL(-0.45340028808763f)}, + {FL2FXCONST_SGL(-0.99496513054797f), FL2FXCONST_SGL(-0.90071908066973f)}, + {FL2FXCONST_SGL(0.98164490790123f), FL2FXCONST_SGL(-0.77463155528697f)}, + {FL2FXCONST_SGL(-0.54671580548181f), FL2FXCONST_SGL(-0.02570928536004f)}, + {FL2FXCONST_SGL(-0.01689629065389f), FL2FXCONST_SGL(0.00287506445732f)}, + {FL2FXCONST_SGL(-0.86110349531986f), FL2FXCONST_SGL(0.42548583726477f)}, + {FL2FXCONST_SGL(-0.98892980586032f), FL2FXCONST_SGL(-0.87881132267556f)}, + {FL2FXCONST_SGL(0.51756627678691f), FL2FXCONST_SGL(0.66926784710139f)}, + {FL2FXCONST_SGL(-0.99635026409640f), FL2FXCONST_SGL(-0.58107730574765f)}, + {FL2FXCONST_SGL(-0.99969370862163f), FL2FXCONST_SGL(0.98369989360250f)}, + {FL2FXCONST_SGL(0.55266258627194f), FL2FXCONST_SGL(0.59449057465591f)}, + {FL2FXCONST_SGL(0.34581177741673f), FL2FXCONST_SGL(0.94879421061866f)}, + {FL2FXCONST_SGL(0.62664209577999f), FL2FXCONST_SGL(-0.74402970906471f)}, + {FL2FXCONST_SGL(-0.77149701404973f), FL2FXCONST_SGL(-0.33883658042801f)}, + {FL2FXCONST_SGL(-0.91592244254432f), FL2FXCONST_SGL(0.03687901376713f)}, + {FL2FXCONST_SGL(-0.76285492357887f), FL2FXCONST_SGL(-0.91371867919124f)}, + {FL2FXCONST_SGL(0.79788337195331f), FL2FXCONST_SGL(-0.93180971199849f)}, + {FL2FXCONST_SGL(0.54473080610200f), FL2FXCONST_SGL(-0.11919206037186f)}, + {FL2FXCONST_SGL(-0.85639281671058f), FL2FXCONST_SGL(0.42429854760451f)}, + {FL2FXCONST_SGL(-0.92882402971423f), FL2FXCONST_SGL(0.27871809078609f)}, + {FL2FXCONST_SGL(-0.11708371046774f), FL2FXCONST_SGL(-0.99800843444966f)}, + {FL2FXCONST_SGL(0.21356749817493f), FL2FXCONST_SGL(-0.90716295627033f)}, + {FL2FXCONST_SGL(-0.76191692573909f), FL2FXCONST_SGL(0.99768118356265f)}, + {FL2FXCONST_SGL(0.98111043100884f), FL2FXCONST_SGL(-0.95854459734407f)}, + {FL2FXCONST_SGL(-0.85913269895572f), FL2FXCONST_SGL(0.95766566168880f)}, + {FL2FXCONST_SGL(-0.93307242253692f), FL2FXCONST_SGL(0.49431757696466f)}, + {FL2FXCONST_SGL(0.30485754879632f), FL2FXCONST_SGL(-0.70540034357529f)}, + {FL2FXCONST_SGL(0.85289650925190f), FL2FXCONST_SGL(0.46766131791044f)}, + {FL2FXCONST_SGL(0.91328082618125f), FL2FXCONST_SGL(-0.99839597361769f)}, + {FL2FXCONST_SGL(-0.05890199924154f), FL2FXCONST_SGL(0.70741827819497f)}, + {FL2FXCONST_SGL(0.28398686150148f), FL2FXCONST_SGL(0.34633555702188f)}, + {FL2FXCONST_SGL(0.95258164539612f), FL2FXCONST_SGL(-0.54893416026939f)}, + {FL2FXCONST_SGL(-0.78566324168507f), FL2FXCONST_SGL(-0.75568541079691f)}, + {FL2FXCONST_SGL(-0.95789495447877f), FL2FXCONST_SGL(-0.20423194696966f)}, + {FL2FXCONST_SGL(0.82411158711197f), FL2FXCONST_SGL(0.96654618432562f)}, + {FL2FXCONST_SGL(-0.65185446735885f), FL2FXCONST_SGL(-0.88734990773289f)}, + {FL2FXCONST_SGL(-0.93643603134666f), FL2FXCONST_SGL(0.99870790442385f)}, + {FL2FXCONST_SGL(0.91427159529618f), FL2FXCONST_SGL(-0.98290505544444f)}, + {FL2FXCONST_SGL(-0.70395684036886f), FL2FXCONST_SGL(0.58796798221039f)}, + {FL2FXCONST_SGL(0.00563771969365f), FL2FXCONST_SGL(0.61768196727244f)}, + {FL2FXCONST_SGL(0.89065051931895f), FL2FXCONST_SGL(0.52783352697585f)}, + {FL2FXCONST_SGL(-0.68683707712762f), FL2FXCONST_SGL(0.80806944710339f)}, + {FL2FXCONST_SGL(0.72165342518718f), FL2FXCONST_SGL(-0.69259857349564f)}, + {FL2FXCONST_SGL(-0.62928247730667f), FL2FXCONST_SGL(0.13627037407335f)}, + {FL2FXCONST_SGL(0.29938434065514f), FL2FXCONST_SGL(-0.46051329682246f)}, + {FL2FXCONST_SGL(-0.91781958879280f), FL2FXCONST_SGL(-0.74012716684186f)}, + {FL2FXCONST_SGL(0.99298717043688f), FL2FXCONST_SGL(0.40816610075661f)}, + {FL2FXCONST_SGL(0.82368298622748f), FL2FXCONST_SGL(-0.74036047190173f)}, + {FL2FXCONST_SGL(-0.98512833386833f), FL2FXCONST_SGL(-0.99972330709594f)}, + {FL2FXCONST_SGL(-0.95915368242257f), FL2FXCONST_SGL(-0.99237800466040f)}, + {FL2FXCONST_SGL(-0.21411126572790f), FL2FXCONST_SGL(-0.93424819052545f)}, + {FL2FXCONST_SGL(-0.68821476106884f), FL2FXCONST_SGL(-0.26892306315457f)}, + {FL2FXCONST_SGL(0.91851997982317f), FL2FXCONST_SGL(0.09358228901785f)}, + {FL2FXCONST_SGL(-0.96062769559127f), FL2FXCONST_SGL(0.36099095133739f)}, + {FL2FXCONST_SGL(0.51646184922287f), FL2FXCONST_SGL(-0.71373332873917f)}, + {FL2FXCONST_SGL(0.61130721139669f), FL2FXCONST_SGL(0.46950141175917f)}, + {FL2FXCONST_SGL(0.47336129371299f), FL2FXCONST_SGL(-0.27333178296162f)}, + {FL2FXCONST_SGL(0.90998308703519f), FL2FXCONST_SGL(0.96715662938132f)}, + {FL2FXCONST_SGL(0.44844799194357f), FL2FXCONST_SGL(0.99211574628306f)}, + {FL2FXCONST_SGL(0.66614891079092f), FL2FXCONST_SGL(0.96590176169121f)}, + {FL2FXCONST_SGL(0.74922239129237f), FL2FXCONST_SGL(-0.89879858826087f)}, + {FL2FXCONST_SGL(-0.99571588506485f), FL2FXCONST_SGL(0.52785521494349f)}, + {FL2FXCONST_SGL(0.97401082477563f), FL2FXCONST_SGL(-0.16855870075190f)}, + {FL2FXCONST_SGL(0.72683747733879f), FL2FXCONST_SGL(-0.48060774432251f)}, + {FL2FXCONST_SGL(0.95432193457128f), FL2FXCONST_SGL(0.68849603408441f)}, + {FL2FXCONST_SGL(-0.72962208425191f), FL2FXCONST_SGL(-0.76608443420917f)}, + {FL2FXCONST_SGL(-0.85359479233537f), FL2FXCONST_SGL(0.88738125901579f)}, + {FL2FXCONST_SGL(-0.81412430338535f), FL2FXCONST_SGL(-0.97480768049637f)}, + {FL2FXCONST_SGL(-0.87930772356786f), FL2FXCONST_SGL(0.74748307690436f)}, + {FL2FXCONST_SGL(-0.71573331064977f), FL2FXCONST_SGL(-0.98570608178923f)}, + {FL2FXCONST_SGL(0.83524300028228f), FL2FXCONST_SGL(0.83702537075163f)}, + {FL2FXCONST_SGL(-0.48086065601423f), FL2FXCONST_SGL(-0.98848504923531f)}, + {FL2FXCONST_SGL(0.97139128574778f), FL2FXCONST_SGL(0.80093621198236f)}, + {FL2FXCONST_SGL(0.51992825347895f), FL2FXCONST_SGL(0.80247631400510f)}, + {FL2FXCONST_SGL(-0.00848591195325f), FL2FXCONST_SGL(-0.76670128000486f)}, + {FL2FXCONST_SGL(-0.70294374303036f), FL2FXCONST_SGL(0.55359910445577f)}, + {FL2FXCONST_SGL(-0.95894428168140f), FL2FXCONST_SGL(-0.43265504344783f)}, + {FL2FXCONST_SGL(0.97079252950321f), FL2FXCONST_SGL(0.09325857238682f)}, + {FL2FXCONST_SGL(-0.92404293670797f), FL2FXCONST_SGL(0.85507704027855f)}, + {FL2FXCONST_SGL(-0.69506469500450f), FL2FXCONST_SGL(0.98633412625459f)}, + {FL2FXCONST_SGL(0.26559203620024f), FL2FXCONST_SGL(0.73314307966524f)}, + {FL2FXCONST_SGL(0.28038443336943f), FL2FXCONST_SGL(0.14537913654427f)}, + {FL2FXCONST_SGL(-0.74138124825523f), FL2FXCONST_SGL(0.99310339807762f)}, + {FL2FXCONST_SGL(-0.01752795995444f), FL2FXCONST_SGL(-0.82616635284178f)}, + {FL2FXCONST_SGL(-0.55126773094930f), FL2FXCONST_SGL(-0.98898543862153f)}, + {FL2FXCONST_SGL(0.97960898850996f), FL2FXCONST_SGL(-0.94021446752851f)}, + {FL2FXCONST_SGL(-0.99196309146936f), FL2FXCONST_SGL(0.67019017358456f)}, + {FL2FXCONST_SGL(-0.67684928085260f), FL2FXCONST_SGL(0.12631491649378f)}, + {FL2FXCONST_SGL(0.09140039465500f), FL2FXCONST_SGL(-0.20537731453108f)}, + {FL2FXCONST_SGL(-0.71658965751996f), FL2FXCONST_SGL(-0.97788200391224f)}, + {FL2FXCONST_SGL(0.81014640078925f), FL2FXCONST_SGL(0.53722648362443f)}, + {FL2FXCONST_SGL(0.40616991671205f), FL2FXCONST_SGL(-0.26469008598449f)}, + {FL2FXCONST_SGL(-0.67680188682972f), FL2FXCONST_SGL(0.94502052337695f)}, + {FL2FXCONST_SGL(0.86849774348749f), FL2FXCONST_SGL(-0.18333598647899f)}, + {FL2FXCONST_SGL(-0.99500381284851f), FL2FXCONST_SGL(-0.02634122068550f)}, + {FL2FXCONST_SGL(0.84329189340667f), FL2FXCONST_SGL(0.10406957462213f)}, + {FL2FXCONST_SGL(-0.09215968531446f), FL2FXCONST_SGL(0.69540012101253f)}, + {FL2FXCONST_SGL(0.99956173327206f), FL2FXCONST_SGL(-0.12358542001404f)}, + {FL2FXCONST_SGL(-0.79732779473535f), FL2FXCONST_SGL(-0.91582524736159f)}, + {FL2FXCONST_SGL(0.96349973642406f), FL2FXCONST_SGL(0.96640458041000f)}, + {FL2FXCONST_SGL(-0.79942778496547f), FL2FXCONST_SGL(0.64323902822857f)}, + {FL2FXCONST_SGL(-0.11566039853896f), FL2FXCONST_SGL(0.28587846253726f)}, + {FL2FXCONST_SGL(-0.39922954514662f), FL2FXCONST_SGL(0.94129601616966f)}, + {FL2FXCONST_SGL(0.99089197565987f), FL2FXCONST_SGL(-0.92062625581587f)}, + {FL2FXCONST_SGL(0.28631285179909f), FL2FXCONST_SGL(-0.91035047143603f)}, + {FL2FXCONST_SGL(-0.83302725605608f), FL2FXCONST_SGL(-0.67330410892084f)}, + {FL2FXCONST_SGL(0.95404443402072f), FL2FXCONST_SGL(0.49162765398743f)}, + {FL2FXCONST_SGL(-0.06449863579434f), FL2FXCONST_SGL(0.03250560813135f)}, + {FL2FXCONST_SGL(-0.99575054486311f), FL2FXCONST_SGL(0.42389784469507f)}, + {FL2FXCONST_SGL(-0.65501142790847f), FL2FXCONST_SGL(0.82546114655624f)}, + {FL2FXCONST_SGL(-0.81254441908887f), FL2FXCONST_SGL(-0.51627234660629f)}, + {FL2FXCONST_SGL(-0.99646369485481f), FL2FXCONST_SGL(0.84490533520752f)}, + {FL2FXCONST_SGL(0.00287840603348f), FL2FXCONST_SGL(0.64768261158166f)}, + {FL2FXCONST_SGL(0.70176989408455f), FL2FXCONST_SGL(-0.20453028573322f)}, + {FL2FXCONST_SGL(0.96361882270190f), FL2FXCONST_SGL(0.40706967140989f)}, + {FL2FXCONST_SGL(-0.68883758192426f), FL2FXCONST_SGL(0.91338958840772f)}, + {FL2FXCONST_SGL(-0.34875585502238f), FL2FXCONST_SGL(0.71472290693300f)}, + {FL2FXCONST_SGL(0.91980081243087f), FL2FXCONST_SGL(0.66507455644919f)}, + {FL2FXCONST_SGL(-0.99009048343881f), FL2FXCONST_SGL(0.85868021604848f)}, + {FL2FXCONST_SGL(0.68865791458395f), FL2FXCONST_SGL(0.55660316809678f)}, + {FL2FXCONST_SGL(-0.99484402129368f), FL2FXCONST_SGL(-0.20052559254934f)}, + {FL2FXCONST_SGL(0.94214511408023f), FL2FXCONST_SGL(-0.99696425367461f)}, + {FL2FXCONST_SGL(-0.67414626793544f), FL2FXCONST_SGL(0.49548221180078f)}, + {FL2FXCONST_SGL(-0.47339353684664f), FL2FXCONST_SGL(-0.85904328834047f)}, + {FL2FXCONST_SGL(0.14323651387360f), FL2FXCONST_SGL(-0.94145598222488f)}, + {FL2FXCONST_SGL(-0.29268293575672f), FL2FXCONST_SGL(0.05759224927952f)}, + {FL2FXCONST_SGL(0.43793861458754f), FL2FXCONST_SGL(-0.78904969892724f)}, + {FL2FXCONST_SGL(-0.36345126374441f), FL2FXCONST_SGL(0.64874435357162f)}, + {FL2FXCONST_SGL(-0.08750604656825f), FL2FXCONST_SGL(0.97686944362527f)}, + {FL2FXCONST_SGL(-0.96495267812511f), FL2FXCONST_SGL(-0.53960305946511f)}, + {FL2FXCONST_SGL(0.55526940659947f), FL2FXCONST_SGL(0.78891523734774f)}, + {FL2FXCONST_SGL(0.73538215752630f), FL2FXCONST_SGL(0.96452072373404f)}, + {FL2FXCONST_SGL(-0.30889773919437f), FL2FXCONST_SGL(-0.80664389776860f)}, + {FL2FXCONST_SGL(0.03574995626194f), FL2FXCONST_SGL(-0.97325616900959f)}, + {FL2FXCONST_SGL(0.98720684660488f), FL2FXCONST_SGL(0.48409133691962f)}, + {FL2FXCONST_SGL(-0.81689296271203f), FL2FXCONST_SGL(-0.90827703628298f)}, + {FL2FXCONST_SGL(0.67866860118215f), FL2FXCONST_SGL(0.81284503870856f)}, + {FL2FXCONST_SGL(-0.15808569732583f), FL2FXCONST_SGL(0.85279555024382f)}, + {FL2FXCONST_SGL(0.80723395114371f), FL2FXCONST_SGL(-0.24717418514605f)}, + {FL2FXCONST_SGL(0.47788757329038f), FL2FXCONST_SGL(-0.46333147839295f)}, + {FL2FXCONST_SGL(0.96367554763201f), FL2FXCONST_SGL(0.38486749303242f)}, + {FL2FXCONST_SGL(-0.99143875716818f), FL2FXCONST_SGL(-0.24945277239809f)}, + {FL2FXCONST_SGL(0.83081876925833f), FL2FXCONST_SGL(-0.94780851414763f)}, + {FL2FXCONST_SGL(-0.58753191905341f), FL2FXCONST_SGL(0.01290772389163f)}, + {FL2FXCONST_SGL(0.95538108220960f), FL2FXCONST_SGL(-0.85557052096538f)}, + {FL2FXCONST_SGL(-0.96490920476211f), FL2FXCONST_SGL(-0.64020970923102f)}, + {FL2FXCONST_SGL(-0.97327101028521f), FL2FXCONST_SGL(0.12378128133110f)}, + {FL2FXCONST_SGL(0.91400366022124f), FL2FXCONST_SGL(0.57972471346930f)}, + {FL2FXCONST_SGL(-0.99925837363824f), FL2FXCONST_SGL(0.71084847864067f)}, + {FL2FXCONST_SGL(-0.86875903507313f), FL2FXCONST_SGL(-0.20291699203564f)}, + {FL2FXCONST_SGL(-0.26240034795124f), FL2FXCONST_SGL(-0.68264554369108f)}, + {FL2FXCONST_SGL(-0.24664412953388f), FL2FXCONST_SGL(-0.87642273115183f)}, + {FL2FXCONST_SGL(0.02416275806869f), FL2FXCONST_SGL(0.27192914288905f)}, + {FL2FXCONST_SGL(0.82068619590515f), FL2FXCONST_SGL(-0.85087787994476f)}, + {FL2FXCONST_SGL(0.88547373760759f), FL2FXCONST_SGL(-0.89636802901469f)}, + {FL2FXCONST_SGL(-0.18173078152226f), FL2FXCONST_SGL(-0.26152145156800f)}, + {FL2FXCONST_SGL(0.09355476558534f), FL2FXCONST_SGL(0.54845123045604f)}, + {FL2FXCONST_SGL(-0.54668414224090f), FL2FXCONST_SGL(0.95980774020221f)}, + {FL2FXCONST_SGL(0.37050990604091f), FL2FXCONST_SGL(-0.59910140383171f)}, + {FL2FXCONST_SGL(-0.70373594262891f), FL2FXCONST_SGL(0.91227665827081f)}, + {FL2FXCONST_SGL(-0.34600785879594f), FL2FXCONST_SGL(-0.99441426144200f)}, + {FL2FXCONST_SGL(-0.68774481731008f), FL2FXCONST_SGL(-0.30238837956299f)}, + {FL2FXCONST_SGL(-0.26843291251234f), FL2FXCONST_SGL(0.83115668004362f)}, + {FL2FXCONST_SGL(0.49072334613242f), FL2FXCONST_SGL(-0.45359708737775f)}, + {FL2FXCONST_SGL(0.38975993093975f), FL2FXCONST_SGL(0.95515358099121f)}, + {FL2FXCONST_SGL(-0.97757125224150f), FL2FXCONST_SGL(0.05305894580606f)}, + {FL2FXCONST_SGL(-0.17325552859616f), FL2FXCONST_SGL(-0.92770672250494f)}, + {FL2FXCONST_SGL(0.99948035025744f), FL2FXCONST_SGL(0.58285545563426f)}, + {FL2FXCONST_SGL(-0.64946246527458f), FL2FXCONST_SGL(0.68645507104960f)}, + {FL2FXCONST_SGL(-0.12016920576437f), FL2FXCONST_SGL(-0.57147322153312f)}, + {FL2FXCONST_SGL(-0.58947456517751f), FL2FXCONST_SGL(-0.34847132454388f)}, + {FL2FXCONST_SGL(-0.41815140454465f), FL2FXCONST_SGL(0.16276422358861f)}, + {FL2FXCONST_SGL(0.99885650204884f), FL2FXCONST_SGL(0.11136095490444f)}, + {FL2FXCONST_SGL(-0.56649614128386f), FL2FXCONST_SGL(-0.90494866361587f)}, + {FL2FXCONST_SGL(0.94138021032330f), FL2FXCONST_SGL(0.35281916733018f)}, + {FL2FXCONST_SGL(-0.75725076534641f), FL2FXCONST_SGL(0.53650549640587f)}, + {FL2FXCONST_SGL(0.20541973692630f), FL2FXCONST_SGL(-0.94435144369918f)}, + {FL2FXCONST_SGL(0.99980371023351f), FL2FXCONST_SGL(0.79835913565599f)}, + {FL2FXCONST_SGL(0.29078277605775f), FL2FXCONST_SGL(0.35393777921520f)}, + {FL2FXCONST_SGL(-0.62858772103030f), FL2FXCONST_SGL(0.38765693387102f)}, + {FL2FXCONST_SGL(0.43440904467688f), FL2FXCONST_SGL(-0.98546330463232f)}, + {FL2FXCONST_SGL(-0.98298583762390f), FL2FXCONST_SGL(0.21021524625209f)}, + {FL2FXCONST_SGL(0.19513029146934f), FL2FXCONST_SGL(-0.94239832251867f)}, + {FL2FXCONST_SGL(-0.95476662400101f), FL2FXCONST_SGL(0.98364554179143f)}, + {FL2FXCONST_SGL(0.93379635304810f), FL2FXCONST_SGL(-0.70881994583682f)}, + {FL2FXCONST_SGL(-0.85235410573336f), FL2FXCONST_SGL(-0.08342347966410f)}, + {FL2FXCONST_SGL(-0.86425093011245f), FL2FXCONST_SGL(-0.45795025029466f)}, + {FL2FXCONST_SGL(0.38879779059045f), FL2FXCONST_SGL(0.97274429344593f)}, + {FL2FXCONST_SGL(0.92045124735495f), FL2FXCONST_SGL(-0.62433652524220f)}, + {FL2FXCONST_SGL(0.89162532251878f), FL2FXCONST_SGL(0.54950955570563f)}, + {FL2FXCONST_SGL(-0.36834336949252f), FL2FXCONST_SGL(0.96458298020975f)}, + {FL2FXCONST_SGL(0.93891760988045f), FL2FXCONST_SGL(-0.89968353740388f)}, + {FL2FXCONST_SGL(0.99267657565094f), FL2FXCONST_SGL(-0.03757034316958f)}, + {FL2FXCONST_SGL(-0.94063471614176f), FL2FXCONST_SGL(0.41332338538963f)}, + {FL2FXCONST_SGL(0.99740224117019f), FL2FXCONST_SGL(-0.16830494996370f)}, + {FL2FXCONST_SGL(-0.35899413170555f), FL2FXCONST_SGL(-0.46633226649613f)}, + {FL2FXCONST_SGL(0.05237237274947f), FL2FXCONST_SGL(-0.25640361602661f)}, + {FL2FXCONST_SGL(0.36703583957424f), FL2FXCONST_SGL(-0.38653265641875f)}, + {FL2FXCONST_SGL(0.91653180367913f), FL2FXCONST_SGL(-0.30587628726597f)}, + {FL2FXCONST_SGL(0.69000803499316f), FL2FXCONST_SGL(0.90952171386132f)}, + {FL2FXCONST_SGL(-0.38658751133527f), FL2FXCONST_SGL(0.99501571208985f)}, + {FL2FXCONST_SGL(-0.29250814029851f), FL2FXCONST_SGL(0.37444994344615f)}, + {FL2FXCONST_SGL(-0.60182204677608f), FL2FXCONST_SGL(0.86779651036123f)}, + {FL2FXCONST_SGL(-0.97418588163217f), FL2FXCONST_SGL(0.96468523666475f)}, + {FL2FXCONST_SGL(0.88461574003963f), FL2FXCONST_SGL(0.57508405276414f)}, + {FL2FXCONST_SGL(0.05198933055162f), FL2FXCONST_SGL(0.21269661669964f)}, + {FL2FXCONST_SGL(-0.53499621979720f), FL2FXCONST_SGL(0.97241553731237f)}, + {FL2FXCONST_SGL(-0.49429560226497f), FL2FXCONST_SGL(0.98183865291903f)}, + {FL2FXCONST_SGL(-0.98935142339139f), FL2FXCONST_SGL(-0.40249159006933f)}, + {FL2FXCONST_SGL(-0.98081380091130f), FL2FXCONST_SGL(-0.72856895534041f)}, + {FL2FXCONST_SGL(-0.27338148835532f), FL2FXCONST_SGL(0.99950922447209f)}, + {FL2FXCONST_SGL(0.06310802338302f), FL2FXCONST_SGL(-0.54539587529618f)}, + {FL2FXCONST_SGL(-0.20461677199539f), FL2FXCONST_SGL(-0.14209977628489f)}, + {FL2FXCONST_SGL(0.66223843141647f), FL2FXCONST_SGL(0.72528579940326f)}, + {FL2FXCONST_SGL(-0.84764345483665f), FL2FXCONST_SGL(0.02372316801261f)}, + {FL2FXCONST_SGL(-0.89039863483811f), FL2FXCONST_SGL(0.88866581484602f)}, + {FL2FXCONST_SGL(0.95903308477986f), FL2FXCONST_SGL(0.76744927173873f)}, + {FL2FXCONST_SGL(0.73504123909879f), FL2FXCONST_SGL(-0.03747203173192f)}, + {FL2FXCONST_SGL(-0.31744434966056f), FL2FXCONST_SGL(-0.36834111883652f)}, + {FL2FXCONST_SGL(-0.34110827591623f), FL2FXCONST_SGL(0.40211222807691f)}, + {FL2FXCONST_SGL(0.47803883714199f), FL2FXCONST_SGL(-0.39423219786288f)}, + {FL2FXCONST_SGL(0.98299195879514f), FL2FXCONST_SGL(0.01989791390047f)}, + {FL2FXCONST_SGL(-0.30963073129751f), FL2FXCONST_SGL(-0.18076720599336f)}, + {FL2FXCONST_SGL(0.99992588229018f), FL2FXCONST_SGL(-0.26281872094289f)}, + {FL2FXCONST_SGL(-0.93149731080767f), FL2FXCONST_SGL(-0.98313162570490f)}, + {FL2FXCONST_SGL(0.99923472302773f), FL2FXCONST_SGL(-0.80142993767554f)}, + {FL2FXCONST_SGL(-0.26024169633417f), FL2FXCONST_SGL(-0.75999759855752f)}, + {FL2FXCONST_SGL(-0.35712514743563f), FL2FXCONST_SGL(0.19298963768574f)}, + {FL2FXCONST_SGL(-0.99899084509530f), FL2FXCONST_SGL(0.74645156992493f)}, + {FL2FXCONST_SGL(0.86557171579452f), FL2FXCONST_SGL(0.55593866696299f)}, + {FL2FXCONST_SGL(0.33408042438752f), FL2FXCONST_SGL(0.86185953874709f)}, + {FL2FXCONST_SGL(0.99010736374716f), FL2FXCONST_SGL(0.04602397576623f)}, + {FL2FXCONST_SGL(-0.66694269691195f), FL2FXCONST_SGL(-0.91643611810148f)}, + {FL2FXCONST_SGL(0.64016792079480f), FL2FXCONST_SGL(0.15649530836856f)}, + {FL2FXCONST_SGL(0.99570534804836f), FL2FXCONST_SGL(0.45844586038111f)}, + {FL2FXCONST_SGL(-0.63431466947340f), FL2FXCONST_SGL(0.21079116459234f)}, + {FL2FXCONST_SGL(-0.07706847005931f), FL2FXCONST_SGL(-0.89581437101329f)}, + {FL2FXCONST_SGL(0.98590090577724f), FL2FXCONST_SGL(0.88241721133981f)}, + {FL2FXCONST_SGL(0.80099335254678f), FL2FXCONST_SGL(-0.36851896710853f)}, + {FL2FXCONST_SGL(0.78368131392666f), FL2FXCONST_SGL(0.45506999802597f)}, + {FL2FXCONST_SGL(0.08707806671691f), FL2FXCONST_SGL(0.80938994918745f)}, + {FL2FXCONST_SGL(-0.86811883080712f), FL2FXCONST_SGL(0.39347308654705f)}, + {FL2FXCONST_SGL(-0.39466529740375f), FL2FXCONST_SGL(-0.66809432114456f)}, + {FL2FXCONST_SGL(0.97875325649683f), FL2FXCONST_SGL(-0.72467840967746f)}, + {FL2FXCONST_SGL(-0.95038560288864f), FL2FXCONST_SGL(0.89563219587625f)}, + {FL2FXCONST_SGL(0.17005239424212f), FL2FXCONST_SGL(0.54683053962658f)}, + {FL2FXCONST_SGL(-0.76910792026848f), FL2FXCONST_SGL(-0.96226617549298f)}, + {FL2FXCONST_SGL(0.99743281016846f), FL2FXCONST_SGL(0.42697157037567f)}, + {FL2FXCONST_SGL(0.95437383549973f), FL2FXCONST_SGL(0.97002324109952f)}, + {FL2FXCONST_SGL(0.99578905365569f), FL2FXCONST_SGL(-0.54106826257356f)}, + {FL2FXCONST_SGL(0.28058259829990f), FL2FXCONST_SGL(-0.85361420634036f)}, + {FL2FXCONST_SGL(0.85256524470573f), FL2FXCONST_SGL(-0.64567607735589f)}, + {FL2FXCONST_SGL(-0.50608540105128f), FL2FXCONST_SGL(-0.65846015480300f)}, + {FL2FXCONST_SGL(-0.97210735183243f), FL2FXCONST_SGL(-0.23095213067791f)}, + {FL2FXCONST_SGL(0.95424048234441f), FL2FXCONST_SGL(-0.99240147091219f)}, + {FL2FXCONST_SGL(-0.96926570524023f), FL2FXCONST_SGL(0.73775654896574f)}, + {FL2FXCONST_SGL(0.30872163214726f), FL2FXCONST_SGL(0.41514960556126f)}, + {FL2FXCONST_SGL(-0.24523839572639f), FL2FXCONST_SGL(0.63206633394807f)}, + {FL2FXCONST_SGL(-0.33813265086024f), FL2FXCONST_SGL(-0.38661779441897f)}, + {FL2FXCONST_SGL(-0.05826828420146f), FL2FXCONST_SGL(-0.06940774188029f)}, + {FL2FXCONST_SGL(-0.22898461455054f), FL2FXCONST_SGL(0.97054853316316f)}, + {FL2FXCONST_SGL(-0.18509915019881f), FL2FXCONST_SGL(0.47565762892084f)}, + {FL2FXCONST_SGL(-0.10488238045009f), FL2FXCONST_SGL(-0.87769947402394f)}, + {FL2FXCONST_SGL(-0.71886586182037f), FL2FXCONST_SGL(0.78030982480538f)}, + {FL2FXCONST_SGL(0.99793873738654f), FL2FXCONST_SGL(0.90041310491497f)}, + {FL2FXCONST_SGL(0.57563307626120f), FL2FXCONST_SGL(-0.91034337352097f)}, + {FL2FXCONST_SGL(0.28909646383717f), FL2FXCONST_SGL(0.96307783970534f)}, + {FL2FXCONST_SGL(0.42188998312520f), FL2FXCONST_SGL(0.48148651230437f)}, + {FL2FXCONST_SGL(0.93335049681047f), FL2FXCONST_SGL(-0.43537023883588f)}, + {FL2FXCONST_SGL(-0.97087374418267f), FL2FXCONST_SGL(0.86636445711364f)}, + {FL2FXCONST_SGL(0.36722871286923f), FL2FXCONST_SGL(0.65291654172961f)}, + {FL2FXCONST_SGL(-0.81093025665696f), FL2FXCONST_SGL(0.08778370229363f)}, + {FL2FXCONST_SGL(-0.26240603062237f), FL2FXCONST_SGL(-0.92774095379098f)}, + {FL2FXCONST_SGL(0.83996497984604f), FL2FXCONST_SGL(0.55839849139647f)}, + {FL2FXCONST_SGL(-0.99909615720225f), FL2FXCONST_SGL(-0.96024605713970f)}, + {FL2FXCONST_SGL(0.74649464155061f), FL2FXCONST_SGL(0.12144893606462f)}, + {FL2FXCONST_SGL(-0.74774595569805f), FL2FXCONST_SGL(-0.26898062008959f)}, + {FL2FXCONST_SGL(0.95781667469567f), FL2FXCONST_SGL(-0.79047927052628f)}, + {FL2FXCONST_SGL(0.95472308713099f), FL2FXCONST_SGL(-0.08588776019550f)}, + {FL2FXCONST_SGL(0.48708332746299f), MAXVAL_SGL}, + {FL2FXCONST_SGL(0.46332038247497f), FL2FXCONST_SGL(0.10964126185063f)}, + {FL2FXCONST_SGL(-0.76497004940162f), FL2FXCONST_SGL(0.89210929242238f)}, + {FL2FXCONST_SGL(0.57397389364339f), FL2FXCONST_SGL(0.35289703373760f)}, + {FL2FXCONST_SGL(0.75374316974495f), FL2FXCONST_SGL(0.96705214651335f)}, + {FL2FXCONST_SGL(-0.59174397685714f), FL2FXCONST_SGL(-0.89405370422752f)}, + {FL2FXCONST_SGL(0.75087906691890f), FL2FXCONST_SGL(-0.29612672982396f)}, + {FL2FXCONST_SGL(-0.98607857336230f), FL2FXCONST_SGL(0.25034911730023f)}, + {FL2FXCONST_SGL(-0.40761056640505f), FL2FXCONST_SGL(-0.90045573444695f)}, + {FL2FXCONST_SGL(0.66929266740477f), FL2FXCONST_SGL(0.98629493401748f)}, + {FL2FXCONST_SGL(-0.97463695257310f), FL2FXCONST_SGL(-0.00190223301301f)}, + {FL2FXCONST_SGL(0.90145509409859f), FL2FXCONST_SGL(0.99781390365446f)}, + {FL2FXCONST_SGL(-0.87259289048043f), FL2FXCONST_SGL(0.99233587353666f)}, + {FL2FXCONST_SGL(-0.91529461447692f), FL2FXCONST_SGL(-0.15698707534206f)}, + {FL2FXCONST_SGL(-0.03305738840705f), FL2FXCONST_SGL(-0.37205262859764f)}, + {FL2FXCONST_SGL(0.07223051368337f), FL2FXCONST_SGL(-0.88805001733626f)}, + {FL2FXCONST_SGL(0.99498012188353f), FL2FXCONST_SGL(0.97094358113387f)}, + {FL2FXCONST_SGL(-0.74904939500519f), FL2FXCONST_SGL(0.99985483641521f)}, + {FL2FXCONST_SGL(0.04585228574211f), FL2FXCONST_SGL(0.99812337444082f)}, + {FL2FXCONST_SGL(-0.89054954257993f), FL2FXCONST_SGL(-0.31791913188064f)}, + {FL2FXCONST_SGL(-0.83782144651251f), FL2FXCONST_SGL(0.97637632547466f)}, + {FL2FXCONST_SGL(0.33454804933804f), FL2FXCONST_SGL(-0.86231516800408f)}, + {FL2FXCONST_SGL(-0.99707579362824f), FL2FXCONST_SGL(0.93237990079441f)}, + {FL2FXCONST_SGL(-0.22827527843994f), FL2FXCONST_SGL(0.18874759397997f)}, + {FL2FXCONST_SGL(0.67248046289143f), FL2FXCONST_SGL(-0.03646211390569f)}, + {FL2FXCONST_SGL(-0.05146538187944f), FL2FXCONST_SGL(-0.92599700120679f)}, + {FL2FXCONST_SGL(0.99947295749905f), FL2FXCONST_SGL(0.93625229707912f)}, + {FL2FXCONST_SGL(0.66951124390363f), FL2FXCONST_SGL(0.98905825623893f)}, + {FL2FXCONST_SGL(-0.99602956559179f), FL2FXCONST_SGL(-0.44654715757688f)}, + {FL2FXCONST_SGL(0.82104905483590f), FL2FXCONST_SGL(0.99540741724928f)}, + {FL2FXCONST_SGL(0.99186510988782f), FL2FXCONST_SGL(0.72023001312947f)}, + {FL2FXCONST_SGL(-0.65284592392918f), FL2FXCONST_SGL(0.52186723253637f)}, + {FL2FXCONST_SGL(0.93885443798188f), FL2FXCONST_SGL(-0.74895312615259f)}, + {FL2FXCONST_SGL(0.96735248738388f), FL2FXCONST_SGL(0.90891816978629f)}, + {FL2FXCONST_SGL(-0.22225968841114f), FL2FXCONST_SGL(0.57124029781228f)}, + {FL2FXCONST_SGL(-0.44132783753414f), FL2FXCONST_SGL(-0.92688840659280f)}, + {FL2FXCONST_SGL(-0.85694974219574f), FL2FXCONST_SGL(0.88844532719844f)}, + {FL2FXCONST_SGL(0.91783042091762f), FL2FXCONST_SGL(-0.46356892383970f)}, + {FL2FXCONST_SGL(0.72556974415690f), FL2FXCONST_SGL(-0.99899555770747f)}, + {FL2FXCONST_SGL(-0.99711581834508f), FL2FXCONST_SGL(0.58211560180426f)}, + {FL2FXCONST_SGL(0.77638976371966f), FL2FXCONST_SGL(0.94321834873819f)}, + {FL2FXCONST_SGL(0.07717324253925f), FL2FXCONST_SGL(0.58638399856595f)}, + {FL2FXCONST_SGL(-0.56049829194163f), FL2FXCONST_SGL(0.82522301569036f)}, + {FL2FXCONST_SGL(0.98398893639988f), FL2FXCONST_SGL(0.39467440420569f)}, + {FL2FXCONST_SGL(0.47546946844938f), FL2FXCONST_SGL(0.68613044836811f)}, + {FL2FXCONST_SGL(0.65675089314631f), FL2FXCONST_SGL(0.18331637134880f)}, + {FL2FXCONST_SGL(0.03273375457980f), FL2FXCONST_SGL(-0.74933109564108f)}, + {FL2FXCONST_SGL(-0.38684144784738f), FL2FXCONST_SGL(0.51337349030406f)}, + {FL2FXCONST_SGL(-0.97346267944545f), FL2FXCONST_SGL(-0.96549364384098f)}, + {FL2FXCONST_SGL(-0.53282156061942f), FL2FXCONST_SGL(-0.91423265091354f)}, + {FL2FXCONST_SGL(0.99817310731176f), FL2FXCONST_SGL(0.61133572482148f)}, + {FL2FXCONST_SGL(-0.50254500772635f), FL2FXCONST_SGL(-0.88829338134294f)}, + {FL2FXCONST_SGL(0.01995873238855f), FL2FXCONST_SGL(0.85223515096765f)}, + {FL2FXCONST_SGL(0.99930381973804f), FL2FXCONST_SGL(0.94578896296649f)}, + {FL2FXCONST_SGL(0.82907767600783f), FL2FXCONST_SGL(-0.06323442598128f)}, + {FL2FXCONST_SGL(-0.58660709669728f), FL2FXCONST_SGL(0.96840773806582f)}, + {FL2FXCONST_SGL(-0.17573736667267f), FL2FXCONST_SGL(-0.48166920859485f)}, + {FL2FXCONST_SGL(0.83434292401346f), FL2FXCONST_SGL(-0.13023450646997f)}, + {FL2FXCONST_SGL(0.05946491307025f), FL2FXCONST_SGL(0.20511047074866f)}, + {FL2FXCONST_SGL(0.81505484574602f), FL2FXCONST_SGL(-0.94685947861369f)}, + {FL2FXCONST_SGL(-0.44976380954860f), FL2FXCONST_SGL(0.40894572671545f)}, + {FL2FXCONST_SGL(-0.89746474625671f), FL2FXCONST_SGL(0.99846578838537f)}, + {FL2FXCONST_SGL(0.39677256130792f), FL2FXCONST_SGL(-0.74854668609359f)}, + {FL2FXCONST_SGL(-0.07588948563079f), FL2FXCONST_SGL(0.74096214084170f)}, + {FL2FXCONST_SGL(0.76343198951445f), FL2FXCONST_SGL(0.41746629422634f)}, + {FL2FXCONST_SGL(-0.74490104699626f), FL2FXCONST_SGL(0.94725911744610f)}, + {FL2FXCONST_SGL(0.64880119792759f), FL2FXCONST_SGL(0.41336660830571f)}, + {FL2FXCONST_SGL(0.62319537462542f), FL2FXCONST_SGL(-0.93098313552599f)}, + {FL2FXCONST_SGL(0.42215817594807f), FL2FXCONST_SGL(-0.07712787385208f)}, + {FL2FXCONST_SGL(0.02704554141885f), FL2FXCONST_SGL(-0.05417518053666f)}, + {FL2FXCONST_SGL(0.80001773566818f), FL2FXCONST_SGL(0.91542195141039f)}, + {FL2FXCONST_SGL(-0.79351832348816f), FL2FXCONST_SGL(-0.36208897989136f)}, + {FL2FXCONST_SGL(0.63872359151636f), FL2FXCONST_SGL(0.08128252493444f)}, + {FL2FXCONST_SGL(0.52890520960295f), FL2FXCONST_SGL(0.60048872455592f)}, + {FL2FXCONST_SGL(0.74238552914587f), FL2FXCONST_SGL(0.04491915291044f)}, + {FL2FXCONST_SGL(0.99096131449250f), FL2FXCONST_SGL(-0.19451182854402f)}, + {FL2FXCONST_SGL(-0.80412329643109f), FL2FXCONST_SGL(-0.88513818199457f)}, + {FL2FXCONST_SGL(-0.64612616129736f), FL2FXCONST_SGL(0.72198674804544f)}, + {FL2FXCONST_SGL(0.11657770663191f), FL2FXCONST_SGL(-0.83662833815041f)}, + {FL2FXCONST_SGL(-0.95053182488101f), FL2FXCONST_SGL(-0.96939905138082f)}, + {FL2FXCONST_SGL(-0.62228872928622f), FL2FXCONST_SGL(0.82767262846661f)}, + {FL2FXCONST_SGL(0.03004475787316f), FL2FXCONST_SGL(-0.99738896333384f)}, + {FL2FXCONST_SGL(-0.97987214341034f), FL2FXCONST_SGL(0.36526129686425f)}, + {FL2FXCONST_SGL(-0.99986980746200f), FL2FXCONST_SGL(-0.36021610299715f)}, + {FL2FXCONST_SGL(0.89110648599879f), FL2FXCONST_SGL(-0.97894250343044f)}, + {FL2FXCONST_SGL(0.10407960510582f), FL2FXCONST_SGL(0.77357793811619f)}, + {FL2FXCONST_SGL(0.95964737821728f), FL2FXCONST_SGL(-0.35435818285502f)}, + {FL2FXCONST_SGL(0.50843233159162f), FL2FXCONST_SGL(0.96107691266205f)}, + {FL2FXCONST_SGL(0.17006334670615f), FL2FXCONST_SGL(-0.76854025314829f)}, + {FL2FXCONST_SGL(0.25872675063360f), FL2FXCONST_SGL(0.99893303933816f)}, + {FL2FXCONST_SGL(-0.01115998681937f), FL2FXCONST_SGL(0.98496019742444f)}, + {FL2FXCONST_SGL(-0.79598702973261f), FL2FXCONST_SGL(0.97138411318894f)}, + {FL2FXCONST_SGL(-0.99264708948101f), FL2FXCONST_SGL(-0.99542822402536f)}, + {FL2FXCONST_SGL(-0.99829663752818f), FL2FXCONST_SGL(0.01877138824311f)}, + {FL2FXCONST_SGL(-0.70801016548184f), FL2FXCONST_SGL(0.33680685948117f)}, + {FL2FXCONST_SGL(-0.70467057786826f), FL2FXCONST_SGL(0.93272777501857f)}, + {FL2FXCONST_SGL(0.99846021905254f), FL2FXCONST_SGL(-0.98725746254433f)}, + {FL2FXCONST_SGL(-0.63364968534650f), FL2FXCONST_SGL(-0.16473594423746f)}, + {FL2FXCONST_SGL(-0.16258217500792f), FL2FXCONST_SGL(-0.95939125400802f)}, + {FL2FXCONST_SGL(-0.43645594360633f), FL2FXCONST_SGL(-0.94805030113284f)}, + {FL2FXCONST_SGL(-0.99848471702976f), FL2FXCONST_SGL(0.96245166923809f)}, + {FL2FXCONST_SGL(-0.16796458968998f), FL2FXCONST_SGL(-0.98987511890470f)}, + {FL2FXCONST_SGL(-0.87979225745213f), FL2FXCONST_SGL(-0.71725725041680f)}, + {FL2FXCONST_SGL(0.44183099021786f), FL2FXCONST_SGL(-0.93568974498761f)}, + {FL2FXCONST_SGL(0.93310180125532f), FL2FXCONST_SGL(-0.99913308068246f)}, + {FL2FXCONST_SGL(-0.93941931782002f), FL2FXCONST_SGL(-0.56409379640356f)}, + {FL2FXCONST_SGL(-0.88590003188677f), FL2FXCONST_SGL(0.47624600491382f)}, + {FL2FXCONST_SGL(0.99971463703691f), FL2FXCONST_SGL(-0.83889954253462f)}, + {FL2FXCONST_SGL(-0.75376385639978f), FL2FXCONST_SGL(0.00814643438625f)}, + {FL2FXCONST_SGL(0.93887685615875f), FL2FXCONST_SGL(-0.11284528204636f)}, + {FL2FXCONST_SGL(0.85126435782309f), FL2FXCONST_SGL(0.52349251543547f)}, + {FL2FXCONST_SGL(0.39701421446381f), FL2FXCONST_SGL(0.81779634174316f)}, + {FL2FXCONST_SGL(-0.37024464187437f), FL2FXCONST_SGL(-0.87071656222959f)}, + {FL2FXCONST_SGL(-0.36024828242896f), FL2FXCONST_SGL(0.34655735648287f)}, + {FL2FXCONST_SGL(-0.93388812549209f), FL2FXCONST_SGL(-0.84476541096429f)}, + {FL2FXCONST_SGL(-0.65298804552119f), FL2FXCONST_SGL(-0.18439575450921f)}, + {FL2FXCONST_SGL(0.11960319006843f), FL2FXCONST_SGL(0.99899346780168f)}, + {FL2FXCONST_SGL(0.94292565553160f), FL2FXCONST_SGL(0.83163906518293f)}, + {FL2FXCONST_SGL(0.75081145286948f), FL2FXCONST_SGL(-0.35533223142265f)}, + {FL2FXCONST_SGL(0.56721979748394f), FL2FXCONST_SGL(-0.24076836414499f)}, + {FL2FXCONST_SGL(0.46857766746029f), FL2FXCONST_SGL(-0.30140233457198f)}, + {FL2FXCONST_SGL(0.97312313923635f), FL2FXCONST_SGL(-0.99548191630031f)}, + {FL2FXCONST_SGL(-0.38299976567017f), FL2FXCONST_SGL(0.98516909715427f)}, + {FL2FXCONST_SGL(0.41025800019463f), FL2FXCONST_SGL(0.02116736935734f)}, + {FL2FXCONST_SGL(0.09638062008048f), FL2FXCONST_SGL(0.04411984381457f)}, + {FL2FXCONST_SGL(-0.85283249275397f), FL2FXCONST_SGL(0.91475563922421f)}, + {FL2FXCONST_SGL(0.88866808958124f), FL2FXCONST_SGL(-0.99735267083226f)}, + {FL2FXCONST_SGL(-0.48202429536989f), FL2FXCONST_SGL(-0.96805608884164f)}, + {FL2FXCONST_SGL(0.27572582416567f), FL2FXCONST_SGL(0.58634753335832f)}, + {FL2FXCONST_SGL(-0.65889129659168f), FL2FXCONST_SGL(0.58835634138583f)}, + {FL2FXCONST_SGL(0.98838086953732f), FL2FXCONST_SGL(0.99994349600236f)}, + {FL2FXCONST_SGL(-0.20651349620689f), FL2FXCONST_SGL(0.54593044066355f)}, + {FL2FXCONST_SGL(-0.62126416356920f), FL2FXCONST_SGL(-0.59893681700392f)}, + {FL2FXCONST_SGL(0.20320105410437f), FL2FXCONST_SGL(-0.86879180355289f)}, + {FL2FXCONST_SGL(-0.97790548600584f), FL2FXCONST_SGL(0.96290806999242f)}, + {FL2FXCONST_SGL(0.11112534735126f), FL2FXCONST_SGL(0.21484763313301f)}, + {FL2FXCONST_SGL(-0.41368337314182f), FL2FXCONST_SGL(0.28216837680365f)}, + {FL2FXCONST_SGL(0.24133038992960f), FL2FXCONST_SGL(0.51294362630238f)}, + {FL2FXCONST_SGL(-0.66393410674885f), FL2FXCONST_SGL(-0.08249679629081f)}, + {FL2FXCONST_SGL(-0.53697829178752f), FL2FXCONST_SGL(-0.97649903936228f)}, + {FL2FXCONST_SGL(-0.97224737889348f), FL2FXCONST_SGL(0.22081333579837f)}, + {FL2FXCONST_SGL(0.87392477144549f), FL2FXCONST_SGL(-0.12796173740361f)}, + {FL2FXCONST_SGL(0.19050361015753f), FL2FXCONST_SGL(0.01602615387195f)}, + {FL2FXCONST_SGL(-0.46353441212724f), FL2FXCONST_SGL(-0.95249041539006f)}, + {FL2FXCONST_SGL(-0.07064096339021f), FL2FXCONST_SGL(-0.94479803205886f)}, + {FL2FXCONST_SGL(-0.92444085484466f), FL2FXCONST_SGL(-0.10457590187436f)}, + {FL2FXCONST_SGL(-0.83822593578728f), FL2FXCONST_SGL(-0.01695043208885f)}, + {FL2FXCONST_SGL(0.75214681811150f), FL2FXCONST_SGL(-0.99955681042665f)}, + {FL2FXCONST_SGL(-0.42102998829339f), FL2FXCONST_SGL(0.99720941999394f)}, + {FL2FXCONST_SGL(-0.72094786237696f), FL2FXCONST_SGL(-0.35008961934255f)}, + {FL2FXCONST_SGL(0.78843311019251f), FL2FXCONST_SGL(0.52851398958271f)}, + {FL2FXCONST_SGL(0.97394027897442f), FL2FXCONST_SGL(-0.26695944086561f)}, + {FL2FXCONST_SGL(0.99206463477946f), FL2FXCONST_SGL(-0.57010120849429f)}, + {FL2FXCONST_SGL(0.76789609461795f), FL2FXCONST_SGL(-0.76519356730966f)}, + {FL2FXCONST_SGL(-0.82002421836409f), FL2FXCONST_SGL(-0.73530179553767f)}, + {FL2FXCONST_SGL(0.81924990025724f), FL2FXCONST_SGL(0.99698425250579f)}, + {FL2FXCONST_SGL(-0.26719850873357f), FL2FXCONST_SGL(0.68903369776193f)}, + {FL2FXCONST_SGL(-0.43311260380975f), FL2FXCONST_SGL(0.85321815947490f)}, + {FL2FXCONST_SGL(0.99194979673836f), FL2FXCONST_SGL(0.91876249766422f)}, + {FL2FXCONST_SGL(-0.80692001248487f), FL2FXCONST_SGL(-0.32627540663214f)}, + {FL2FXCONST_SGL(0.43080003649976f), FL2FXCONST_SGL(-0.21919095636638f)}, + {FL2FXCONST_SGL(0.67709491937357f), FL2FXCONST_SGL(-0.95478075822906f)}, + {FL2FXCONST_SGL(0.56151770568316f), FL2FXCONST_SGL(-0.70693811747778f)}, + {FL2FXCONST_SGL(0.10831862810749f), FL2FXCONST_SGL(-0.08628837174592f)}, + {FL2FXCONST_SGL(0.91229417540436f), FL2FXCONST_SGL(-0.65987351408410f)}, + {FL2FXCONST_SGL(-0.48972893932274f), FL2FXCONST_SGL(0.56289246362686f)}, + {FL2FXCONST_SGL(-0.89033658689697f), FL2FXCONST_SGL(-0.71656563987082f)}, + {FL2FXCONST_SGL(0.65269447475094f), FL2FXCONST_SGL(0.65916004833932f)}, + {FL2FXCONST_SGL(0.67439478141121f), FL2FXCONST_SGL(-0.81684380846796f)}, + {FL2FXCONST_SGL(-0.47770832416973f), FL2FXCONST_SGL(-0.16789556203025f)}, + {FL2FXCONST_SGL(-0.99715979260878f), FL2FXCONST_SGL(-0.93565784007648f)}, + {FL2FXCONST_SGL(-0.90889593602546f), FL2FXCONST_SGL(0.62034397054380f)}, + {FL2FXCONST_SGL(-0.06618622548177f), FL2FXCONST_SGL(-0.23812217221359f)}, + {FL2FXCONST_SGL(0.99430266919728f), FL2FXCONST_SGL(0.18812555317553f)}, + {FL2FXCONST_SGL(0.97686402381843f), FL2FXCONST_SGL(-0.28664534366620f)}, + {FL2FXCONST_SGL(0.94813650221268f), FL2FXCONST_SGL(-0.97506640027128f)}, + {FL2FXCONST_SGL(-0.95434497492853f), FL2FXCONST_SGL(-0.79607978501983f)}, + {FL2FXCONST_SGL(-0.49104783137150f), FL2FXCONST_SGL(0.32895214359663f)}, + {FL2FXCONST_SGL(0.99881175120751f), FL2FXCONST_SGL(0.88993983831354f)}, + {FL2FXCONST_SGL(0.50449166760303f), FL2FXCONST_SGL(-0.85995072408434f)}, + {FL2FXCONST_SGL(0.47162891065108f), FL2FXCONST_SGL(-0.18680204049569f)}, + {FL2FXCONST_SGL(-0.62081581361840f), FL2FXCONST_SGL(0.75000676218956f)}, + {FL2FXCONST_SGL(-0.43867015250812f), FL2FXCONST_SGL(0.99998069244322f)}, + {FL2FXCONST_SGL(0.98630563232075f), FL2FXCONST_SGL(-0.53578899600662f)}, + {FL2FXCONST_SGL(-0.61510362277374f), FL2FXCONST_SGL(-0.89515019899997f)}, + {FL2FXCONST_SGL(-0.03841517601843f), FL2FXCONST_SGL(-0.69888815681179f)}, + {FL2FXCONST_SGL(-0.30102157304644f), FL2FXCONST_SGL(-0.07667808922205f)}, + {FL2FXCONST_SGL(0.41881284182683f), FL2FXCONST_SGL(0.02188098922282f)}, + {FL2FXCONST_SGL(-0.86135454941237f), FL2FXCONST_SGL(0.98947480909359f)}, + {FL2FXCONST_SGL(0.67226861393788f), FL2FXCONST_SGL(-0.13494389011014f)}, + {FL2FXCONST_SGL(-0.70737398842068f), FL2FXCONST_SGL(-0.76547349325992f)}, + {FL2FXCONST_SGL(0.94044946687963f), FL2FXCONST_SGL(0.09026201157416f)}, + {FL2FXCONST_SGL(-0.82386352534327f), FL2FXCONST_SGL(0.08924768823676f)}, + {FL2FXCONST_SGL(-0.32070666698656f), FL2FXCONST_SGL(0.50143421908753f)}, + {FL2FXCONST_SGL(0.57593163224487f), FL2FXCONST_SGL(-0.98966422921509f)}, + {FL2FXCONST_SGL(-0.36326018419965f), FL2FXCONST_SGL(0.07440243123228f)}, + {FL2FXCONST_SGL(0.99979044674350f), FL2FXCONST_SGL(-0.14130287347405f)}, + {FL2FXCONST_SGL(-0.92366023326932f), FL2FXCONST_SGL(-0.97979298068180f)}, + {FL2FXCONST_SGL(-0.44607178518598f), FL2FXCONST_SGL(-0.54233252016394f)}, + {FL2FXCONST_SGL(0.44226800932956f), FL2FXCONST_SGL(0.71326756742752f)}, + {FL2FXCONST_SGL(0.03671907158312f), FL2FXCONST_SGL(0.63606389366675f)}, + {FL2FXCONST_SGL(0.52175424682195f), FL2FXCONST_SGL(-0.85396826735705f)}, + {FL2FXCONST_SGL(-0.94701139690956f), FL2FXCONST_SGL(-0.01826348194255f)}, + {FL2FXCONST_SGL(-0.98759606946049f), FL2FXCONST_SGL(0.82288714303073f)}, + {FL2FXCONST_SGL(0.87434794743625f), FL2FXCONST_SGL(0.89399495655433f)}, + {FL2FXCONST_SGL(-0.93412041758744f), FL2FXCONST_SGL(0.41374052024363f)}, + {FL2FXCONST_SGL(0.96063943315511f), FL2FXCONST_SGL(0.93116709541280f)}, + {FL2FXCONST_SGL(0.97534253457837f), FL2FXCONST_SGL(0.86150930812689f)}, + {FL2FXCONST_SGL(0.99642466504163f), FL2FXCONST_SGL(0.70190043427512f)}, + {FL2FXCONST_SGL(-0.94705089665984f), FL2FXCONST_SGL(-0.29580042814306f)}, + {FL2FXCONST_SGL(0.91599807087376f), FL2FXCONST_SGL(-0.98147830385781f)}}; //@} /* diff -Nru fdk-aac-2.0.1/libSBRenc/src/sbr_encoder.cpp fdk-aac-2.0.2/libSBRenc/src/sbr_encoder.cpp --- fdk-aac-2.0.1/libSBRenc/src/sbr_encoder.cpp 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/libSBRenc/src/sbr_encoder.cpp 2021-04-28 12:34:15.000000000 +0000 @@ -2560,7 +2560,7 @@ info->version = LIB_VERSION(SBRENCODER_LIB_VL0, SBRENCODER_LIB_VL1, SBRENCODER_LIB_VL2); LIB_VERSION_STRING(info); -#ifdef __ANDROID__ +#ifdef SUPPRESS_BUILD_DATE_INFO info->build_date = ""; info->build_time = ""; #else diff -Nru fdk-aac-2.0.1/Makefile.am fdk-aac-2.0.2/Makefile.am --- fdk-aac-2.0.1/Makefile.am 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/Makefile.am 2021-04-28 12:34:15.000000000 +0000 @@ -210,7 +210,6 @@ libSBRdec/src/psdec_drm.cpp \ libSBRdec/src/psdecrom_drm.cpp \ libSBRdec/src/pvc_dec.cpp \ - libSBRdec/src/sbr_crc.cpp \ libSBRdec/src/sbr_deb.cpp \ libSBRdec/src/sbr_dec.cpp \ libSBRdec/src/sbr_ram.cpp \ @@ -254,15 +253,18 @@ $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) EXTRA_DIST = \ + $(top_srcdir)/CMakeLists.txt \ $(top_srcdir)/.clang-format \ $(top_srcdir)/autogen.sh \ $(top_srcdir)/MODULE_LICENSE_FRAUNHOFER \ $(top_srcdir)/NOTICE \ $(top_srcdir)/OWNERS \ $(top_srcdir)/Android.bp \ + $(top_srcdir)/fdk-aac.def \ $(top_srcdir)/fdk-aac.sym \ - $(top_srcdir)/Makefile.vc \ + $(top_srcdir)/fdk-aac-config.cmake.in \ $(top_srcdir)/documentation/*.pdf \ + $(top_srcdir)/fuzzer/* \ $(top_srcdir)/libAACdec/src/*.h \ $(top_srcdir)/libAACdec/src/arm/*.cpp \ $(top_srcdir)/libAACenc/src/*.h \ @@ -292,5 +294,7 @@ $(top_srcdir)/libFDK/include/x86/*.h \ $(top_srcdir)/libFDK/src/arm/*.cpp \ $(top_srcdir)/libFDK/src/mips/*.cpp \ + $(top_srcdir)/METADATA \ + $(top_srcdir)/PREUPLOAD.cfg \ $(top_srcdir)/win32/*.h diff -Nru fdk-aac-2.0.1/Makefile.vc fdk-aac-2.0.2/Makefile.vc --- fdk-aac-2.0.1/Makefile.vc 2019-10-08 11:30:16.000000000 +0000 +++ fdk-aac-2.0.2/Makefile.vc 1970-01-01 00:00:00.000000000 +0000 @@ -1,321 +0,0 @@ -# -# Options: -# prefix=\path\to\install -# -# Compiling: nmake -f Makefile.vc -# Installing: nmake -f Makefile.vc prefix=\path\to\x install -# - -# Linker and librarian commands -LD = link -AR = lib - -!IFDEF HOME -# In case we are using a cross compiler shell. -MKDIR_FLAGS = -p -!ENDIF - -AM_CPPFLAGS = \ - -Iwin32 \ - -IlibAACdec/include \ - -IlibAACenc/include \ - -IlibArithCoding/include \ - -IlibDRCdec/include \ - -IlibSACdec/include \ - -IlibSACenc/include \ - -IlibSBRdec/include \ - -IlibSBRenc/include \ - -IlibMpegTPDec/include \ - -IlibMpegTPEnc/include \ - -IlibSYS/include \ - -IlibFDK/include \ - -IlibPCMutils/include - -AACDEC_SRC = \ - libAACdec/src/FDK_delay.cpp \ - libAACdec/src/aac_ram.cpp \ - libAACdec/src/aac_rom.cpp \ - libAACdec/src/aacdec_drc.cpp \ - libAACdec/src/aacdec_hcr.cpp \ - libAACdec/src/aacdec_hcr_bit.cpp \ - libAACdec/src/aacdec_hcrs.cpp \ - libAACdec/src/aacdec_pns.cpp \ - libAACdec/src/aacdec_tns.cpp \ - libAACdec/src/aacdecoder.cpp \ - libAACdec/src/aacdecoder_lib.cpp \ - libAACdec/src/block.cpp \ - libAACdec/src/channel.cpp \ - libAACdec/src/channelinfo.cpp \ - libAACdec/src/conceal.cpp \ - libAACdec/src/ldfiltbank.cpp \ - libAACdec/src/pulsedata.cpp \ - libAACdec/src/rvlc.cpp \ - libAACdec/src/rvlcbit.cpp \ - libAACdec/src/rvlcconceal.cpp \ - libAACdec/src/stereo.cpp \ - libAACdec/src/usacdec_ace_d4t64.cpp \ - libAACdec/src/usacdec_ace_ltp.cpp \ - libAACdec/src/usacdec_acelp.cpp \ - libAACdec/src/usacdec_fac.cpp \ - libAACdec/src/usacdec_lpc.cpp \ - libAACdec/src/usacdec_lpd.cpp \ - libAACdec/src/usacdec_rom.cpp - -AACENC_SRC = \ - libAACenc/src/aacEnc_ram.cpp \ - libAACenc/src/aacEnc_rom.cpp \ - libAACenc/src/aacenc.cpp \ - libAACenc/src/aacenc_lib.cpp \ - libAACenc/src/aacenc_pns.cpp \ - libAACenc/src/aacenc_tns.cpp \ - libAACenc/src/adj_thr.cpp \ - libAACenc/src/band_nrg.cpp \ - libAACenc/src/bandwidth.cpp \ - libAACenc/src/bit_cnt.cpp \ - libAACenc/src/bitenc.cpp \ - libAACenc/src/block_switch.cpp \ - libAACenc/src/channel_map.cpp \ - libAACenc/src/chaosmeasure.cpp \ - libAACenc/src/dyn_bits.cpp \ - libAACenc/src/grp_data.cpp \ - libAACenc/src/intensity.cpp \ - libAACenc/src/line_pe.cpp \ - libAACenc/src/metadata_compressor.cpp \ - libAACenc/src/metadata_main.cpp \ - libAACenc/src/mps_main.cpp \ - libAACenc/src/ms_stereo.cpp \ - libAACenc/src/noisedet.cpp \ - libAACenc/src/pnsparam.cpp \ - libAACenc/src/pre_echo_control.cpp \ - libAACenc/src/psy_configuration.cpp \ - libAACenc/src/psy_main.cpp \ - libAACenc/src/qc_main.cpp \ - libAACenc/src/quantize.cpp \ - libAACenc/src/sf_estim.cpp \ - libAACenc/src/spreading.cpp \ - libAACenc/src/tonality.cpp \ - libAACenc/src/transform.cpp - -ARITHCODING_SRC = \ - libArithCoding/src/ac_arith_coder.cpp - -DRCDEC_SRC = \ - libDRCdec/src/FDK_drcDecLib.cpp \ - libDRCdec/src/drcDec_gainDecoder.cpp \ - libDRCdec/src/drcDec_reader.cpp \ - libDRCdec/src/drcDec_rom.cpp \ - libDRCdec/src/drcDec_selectionProcess.cpp \ - libDRCdec/src/drcDec_tools.cpp \ - libDRCdec/src/drcGainDec_init.cpp \ - libDRCdec/src/drcGainDec_preprocess.cpp \ - libDRCdec/src/drcGainDec_process.cpp - -FDK_SRC = \ - libFDK/src/FDK_bitbuffer.cpp \ - libFDK/src/FDK_core.cpp \ - libFDK/src/FDK_crc.cpp \ - libFDK/src/FDK_decorrelate.cpp \ - libFDK/src/FDK_hybrid.cpp \ - libFDK/src/FDK_lpc.cpp \ - libFDK/src/FDK_matrixCalloc.cpp \ - libFDK/src/FDK_qmf_domain.cpp \ - libFDK/src/FDK_tools_rom.cpp \ - libFDK/src/FDK_trigFcts.cpp \ - libFDK/src/autocorr2nd.cpp \ - libFDK/src/dct.cpp \ - libFDK/src/fft.cpp \ - libFDK/src/fft_rad2.cpp \ - libFDK/src/fixpoint_math.cpp \ - libFDK/src/huff_nodes.cpp \ - libFDK/src/mdct.cpp \ - libFDK/src/nlc_dec.cpp \ - libFDK/src/qmf.cpp \ - libFDK/src/scale.cpp - -MPEGTPDEC_SRC = \ - libMpegTPDec/src/tpdec_adif.cpp \ - libMpegTPDec/src/tpdec_adts.cpp \ - libMpegTPDec/src/tpdec_asc.cpp \ - libMpegTPDec/src/tpdec_drm.cpp \ - libMpegTPDec/src/tpdec_latm.cpp \ - libMpegTPDec/src/tpdec_lib.cpp - -MPEGTPENC_SRC = \ - libMpegTPEnc/src/tpenc_adif.cpp \ - libMpegTPEnc/src/tpenc_adts.cpp \ - libMpegTPEnc/src/tpenc_asc.cpp \ - libMpegTPEnc/src/tpenc_latm.cpp \ - libMpegTPEnc/src/tpenc_lib.cpp - -PCMUTILS_SRC = \ - libPCMutils/src/limiter.cpp \ - libPCMutils/src/pcm_utils.cpp \ - libPCMutils/src/pcmdmx_lib.cpp - -SACDEC_SRC = \ - libSACdec/src/sac_bitdec.cpp \ - libSACdec/src/sac_calcM1andM2.cpp \ - libSACdec/src/sac_dec.cpp \ - libSACdec/src/sac_dec_conceal.cpp \ - libSACdec/src/sac_dec_lib.cpp \ - libSACdec/src/sac_process.cpp \ - libSACdec/src/sac_qmf.cpp \ - libSACdec/src/sac_reshapeBBEnv.cpp \ - libSACdec/src/sac_rom.cpp \ - libSACdec/src/sac_smoothing.cpp \ - libSACdec/src/sac_stp.cpp \ - libSACdec/src/sac_tsd.cpp - -SACENC_SRC = \ - libSACenc/src/sacenc_bitstream.cpp \ - libSACenc/src/sacenc_delay.cpp \ - libSACenc/src/sacenc_dmx_tdom_enh.cpp \ - libSACenc/src/sacenc_filter.cpp \ - libSACenc/src/sacenc_framewindowing.cpp \ - libSACenc/src/sacenc_huff_tab.cpp \ - libSACenc/src/sacenc_lib.cpp \ - libSACenc/src/sacenc_nlc_enc.cpp \ - libSACenc/src/sacenc_onsetdetect.cpp \ - libSACenc/src/sacenc_paramextract.cpp \ - libSACenc/src/sacenc_staticgain.cpp \ - libSACenc/src/sacenc_tree.cpp \ - libSACenc/src/sacenc_vectorfunctions.cpp - -SBRDEC_SRC = \ - libSBRdec/src/HFgen_preFlat.cpp \ - libSBRdec/src/env_calc.cpp \ - libSBRdec/src/env_dec.cpp \ - libSBRdec/src/env_extr.cpp \ - libSBRdec/src/hbe.cpp \ - libSBRdec/src/huff_dec.cpp \ - libSBRdec/src/lpp_tran.cpp \ - libSBRdec/src/psbitdec.cpp \ - libSBRdec/src/psdec.cpp \ - libSBRdec/src/psdec_drm.cpp \ - libSBRdec/src/psdecrom_drm.cpp \ - libSBRdec/src/pvc_dec.cpp \ - libSBRdec/src/sbr_crc.cpp \ - libSBRdec/src/sbr_deb.cpp \ - libSBRdec/src/sbr_dec.cpp \ - libSBRdec/src/sbr_ram.cpp \ - libSBRdec/src/sbr_rom.cpp \ - libSBRdec/src/sbrdec_drc.cpp \ - libSBRdec/src/sbrdec_freq_sca.cpp \ - libSBRdec/src/sbrdecoder.cpp - -SBRENC_SRC = \ - libSBRenc/src/bit_sbr.cpp \ - libSBRenc/src/code_env.cpp \ - libSBRenc/src/env_bit.cpp \ - libSBRenc/src/env_est.cpp \ - libSBRenc/src/fram_gen.cpp \ - libSBRenc/src/invf_est.cpp \ - libSBRenc/src/mh_det.cpp \ - libSBRenc/src/nf_est.cpp \ - libSBRenc/src/ps_bitenc.cpp \ - libSBRenc/src/ps_encode.cpp \ - libSBRenc/src/ps_main.cpp \ - libSBRenc/src/resampler.cpp \ - libSBRenc/src/sbr_encoder.cpp \ - libSBRenc/src/sbr_misc.cpp \ - libSBRenc/src/sbrenc_freq_sca.cpp \ - libSBRenc/src/sbrenc_ram.cpp \ - libSBRenc/src/sbrenc_rom.cpp \ - libSBRenc/src/ton_corr.cpp \ - libSBRenc/src/tran_det.cpp - -SYS_SRC = \ - libSYS/src/genericStds.cpp \ - libSYS/src/syslib_channelMapDescr.cpp - -libfdk_aac_SOURCES = \ - $(AACDEC_SRC) $(AACENC_SRC) \ - $(ARITHCODING_SRC) \ - $(DRCDEC_SRC) \ - $(MPEGTPDEC_SRC) $(MPEGTPENC_SRC) \ - $(SACDEC_SRC) $(SACENC_SRC) \ - $(SBRDEC_SRC) $(SBRENC_SRC) \ - $(PCMUTILS_SRC) $(FDK_SRC) $(SYS_SRC) - - -aac_enc_SOURCES = aac-enc.c wavreader.c - -prefix = \usr\local -prefix_win = $(prefix:/=\) # In case we are using MSYS or MinGW. - -CFLAGS = /nologo /W3 /Ox /MT /EHsc /Dinline=__inline $(TARGET_FLAGS) $(AM_CPPFLAGS) $(XCFLAGS) -CXXFLAGS = $(CFLAGS) -CPPFLAGS = $(CFLAGS) -LDFLAGS = -nologo $(XLDFLAGS) -ARFLAGS = -nologo - -incdir = $(prefix_win)\include\fdk-aac -bindir = $(prefix_win)\bin -libdir = $(prefix_win)\lib - -INST_DIRS = $(bindir) $(incdir) $(libdir) - -LIB_DEF = fdk-aac.def -STATIC_LIB = fdk-aac.lib -SHARED_LIB = fdk-aac-1.dll -IMP_LIB = fdk-aac.dll.lib - -AAC_ENC_OBJS = $(aac_enc_SOURCES:.c=.obj) -FDK_OBJS = $(libfdk_aac_SOURCES:.cpp=.obj) - -PROGS = aac-enc.exe - - - -all: $(LIB_DEF) $(STATIC_LIB) $(SHARED_LIB) $(IMP_LIB) $(PROGS) - -clean: - del /f $(LIB_DEF) $(STATIC_LIB) $(SHARED_LIB) $(IMP_LIB) $(PROGS) libfdk-aac.pc 2>NUL - del /f *.obj *.exp 2>NUL - del /f libAACdec\src\*.obj 2>NUL - del /f libAACenc\src\*.obj 2>NUL - del /f libArithCoding\src\*.obj 2>NUL - del /f libDRCdec\src\*.obj 2>NUL - del /f libFDK\src\*.obj 2>NUL - del /f libMpegTPDec\src\*.obj 2>NUL - del /f libMpegTPEnc\src\*.obj 2>NUL - del /f libPCMutils\src\*.obj 2>NUL - del /f libSACdec\src\*.obj 2>NUL - del /f libSACenc\src\*.obj 2>NUL - del /f libSBRdec\src\*.obj 2>NUL - del /f libSBRenc\src\*.obj 2>NUL - del /f libSYS\src\*.obj 2>NUL - -install: $(INST_DIRS) - copy libAACdec\include\aacdecoder_lib.h $(incdir) - copy libAACenc\include\aacenc_lib.h $(incdir) - copy libSYS\include\FDK_audio.h $(incdir) - copy libSYS\include\genericStds.h $(incdir) - copy libSYS\include\machine_type.h $(incdir) - copy libSYS\include\syslib_channelMapDescr.h $(incdir) - copy $(STATIC_LIB) $(libdir) - copy $(IMP_LIB) $(libdir) - copy $(SHARED_LIB) $(bindir) - copy $(PROGS) $(bindir) - copy $(LIB_DEF) $(libdir) - -$(INST_DIRS): - @mkdir $(MKDIR_FLAGS) $@ - -$(STATIC_LIB): $(FDK_OBJS) - $(AR) $(ARFLAGS) -out:$@ $(FDK_OBJS) - -$(IMP_LIB): $(SHARED_LIB) - -$(SHARED_LIB): $(FDK_OBJS) - $(LD) $(LDFLAGS) -OUT:$@ -DEF:$(LIB_DEF) -implib:$(IMP_LIB) -DLL $(FDK_OBJS) - -$(PROGS): $(AAC_ENC_OBJS) - $(LD) $(LDFLAGS) -out:$@ $(AAC_ENC_OBJS) $(STATIC_LIB) - -.cpp.obj: - $(CXX) $(CXXFLAGS) -c -Fo$@ $< - -$(LIB_DEF): - @echo EXPORTS > $(LIB_DEF) - @type fdk-aac.sym >> $(LIB_DEF) diff -Nru fdk-aac-2.0.1/METADATA fdk-aac-2.0.2/METADATA --- fdk-aac-2.0.1/METADATA 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/METADATA 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,3 @@ +third_party { + license_type: BY_EXCEPTION_ONLY +} diff -Nru fdk-aac-2.0.1/PREUPLOAD.cfg fdk-aac-2.0.2/PREUPLOAD.cfg --- fdk-aac-2.0.1/PREUPLOAD.cfg 1970-01-01 00:00:00.000000000 +0000 +++ fdk-aac-2.0.2/PREUPLOAD.cfg 2021-04-28 12:34:15.000000000 +0000 @@ -0,0 +1,2 @@ +[Hook Scripts] +mainline_hook = ${REPO_ROOT}/frameworks/av/tools/mainline_hook_project.sh